suite3270-3.6/c3270/c3270_files.mk0000664000076500007650000000020613221577163014201 0ustar pdmpdm# c3270-specific object files C3270_OBJECTS = c3270.o ft_gui.o help.o icmd.o keymap.o keypad.o menubar.o \ screen.o ssl_passwd_gui.o suite3270-3.6/c3270/c3270.man0000664000076500007650000015154013221600610013153 0ustar pdmpdm'\" t .TH c3270 1 "29 December 2017" .SH "NAME" c3270 \- curses-based \s-1IBM\s+1 host access tool .SH "SYNOPSIS" \fBc3270\fP [\fIoptions\fP] [\fIhost\fP] .br \fBc3270\fP [\fIoptions\fP] \fIsession-file\fP.c3270 .SH "DESCRIPTION" \fBc3270\fP opens a telnet connection to an \s-1IBM\s+1 host in a console window. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. If the console is capable of displaying colors, then \fBc3270\fP emulates an \s-1IBM\s+1 3279. Otherwise, it emulates a 3278. The full syntax for \fIhost\fP is: .RS [\fIprefix\fP:]...[\fILUname\fP@]\fIhostname\fP[:\fIport\fP][=\fIaccept\fP] .RE .LP Prepending a \fBP:\fP onto \fIhostname\fP causes the connection to go through the \fItelnet-passthru\fP service rather than directly to the host. See \s-1PASSTHRU\s+1 below. .LP Prepending an \fBS:\fP onto \fIhostname\fP removes the "extended data stream" option reported to the host. See \fB\-tn\fP below for further information. .LP Prepending an \fBN:\fP onto \fIhostname\fP turns off TN3270E support for the session. .LP Prepending an \fBL:\fP onto \fIhostname\fP causes \fBc3270\fP to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if \fBc3270\fP was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the \fBL:\fP prefix should not be used. .LP Prepending a \fBY:\fP onto \fIhostname\fP causes \fBc3270\fP to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. .LP Prepending an \fBA:\fP onto \fIhostname\fP is equivalent to setting the \fB\-nvt\fP option; it forces an NVT-mode session instead of a 3270-mode session. .LP A specific Logical Unit (LU) name to use may be specified by prepending it to the \fIhostname\fP with an `\fB@\fP'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) .LP The \fIhostname\fP may optionally be placed inside square-bracket characters `\fB[\fP' and `\fB]\fP'. This will prevent any colon `\fB:\fP' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. .LP On systems that support the \fIforkpty\fP library call, the \fIhostname\fP may be replaced with \fB\-e\fP and a command string. This will cause \fBc3270\fP to connect to a local child process, such as a shell. .LP The port to connect to defaults to \fBtelnet\fP. This can be overridden with the \fB\-port\fP option, or by appending a \fIport\fP to the \fIhostname\fP with a colon `\fB:\fP'. (For compatability with previous versions of \fBc3270\fP and with \fItn3270\fP(1), the \fIport\fP may also be specified as a second, separate argument.) .LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`\fB=\fP'). The accept name can also be specified with the \fB\-accepthostname\fP option. .SH "OPTIONS" \fBc3270\fP understands the following options: .TP \fB\-accepthostname\fP \fIname\fP Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. .TP \fB\-allbold\fP Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays. .TP \fB\-altscreen \fIrows\fP\fBx\fP\fIcols\fP\fB=\fP\fIinit_string\fP\fP Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See \s-1SCREEN SIZE SWITCHING\s+1, below. .TP \fB\-cadir\fP \fIdirectory\fP Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) .TP \fB\-cafile\fP \fIfilename\fP Specifies a \s-1PEM\s+1-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) .TP \fB\-cbreak\fP Causes \fBc3270\fP to operate in \fIcbreak\fP mode, instead of \fIraw\fP mode. In \fIcbreak\fP mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for \fBinterrupt\fP, \fBquit\fP, and \fBlnext\fP (usually ^C, ^\\ and ^V respectively) will be seen by \fBc3270\fP only if preceded by the \fBlnext\fP character. The \fBsusp\fP character (usually ^Z) cannot be seen by \fBc3270\fP at all. .TP \fB\-certfile\fP \fIfilename\fP Specifies a file containing a client certificate to provide to the host. The default file type is \s-1PEM\s+1. .TP \fB\-clientcert\fP \fIname\fP Specifies the name of a client certificate to provide to the host. (MacOS only) .TP \fB\-certfiletype\fP \fItype\fP Specifies the type of the certificate file specified by \fB\-certfile\fP. \fIType\fP can be \fBpem\fP or \fBasn1\fP. (OpenSSL only) .TP \fB\-chainfile \fIfilename\fP\fP Specifies a certificate chain file in \s-1PEM\s+1 format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If \fB\-chainfile\fP is specified, it overrides \fB\-certfile\fP. (OpenSSL only) .TP \fB\-charset\fP \fIname\fP Specifies an \s-1EBCDIC\s+1 host character set. .TP \fB\-clear\fP \fItoggle\fP Sets the initial value of \fItoggle\fP to \fBfalse\fP. .TP \fB\-connecttimeout\fP \fIseconds\fP Specifies the time that c3270 will wait for a host connection to complete. .TP \fB\-defaultfgbg\fP Causes c3270 to use the terminal's default foreground color instead of the curses color \fBblack\fP, and the terminal's default background color instead of the curses color \fBwhite\fP. This is helpful for emulators such as \fIgnome-terminal\fP whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable \fBCOLORTERM\fP is set to \fBgnome-terminal\fP. It is available only if c3270 was compiled with a version of \fIncurses\fP that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability. .TP \fB\-defscreen \fIrows\fP\fBx\fP\fIcols\fP\fB=\fP\fIinit_string\fP\fP Defines the dimensions and escape sequence for the default (80-column) screen mode. See \s-1SCREEN SIZE SWITCHING\s+1, below. .TP \fB\-devname\fP \fIname\fP Specifies a device name (workstation ID) for RFC 4777 support. .TP \fB\-hostsfile\fP \fIfile\fP Uses \fIfile\fP as the hosts file, which allows aliases for host names and scripts to be executed at login. See \fIibm_hosts\fP(1) for details. .TP \fB\-httpd\fP \fB[\fP\fIaddr\fP\fB:]\fP\fIport\fP Specifies a port and optional address to listen on for HTTP connections. \fIAddr\fP can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. .IP Note that this option is mutually-exclusive with the \-scriptport option . .TP \fB\-keyfile\fP \fIfilename\fP Specifies a file containing the private key for the certificate file (specified via \fB\-certfile\fP or \fB\-chainfile\fP). The default file type is \s-1PEM\s+1. (OpenSSL only) .TP \fB\-keyfiletype\fP \fItype\fP Specifies the type of the private key file specified by \fB\-keyfile\fP. \fIType\fP can be \fBpem\fP or \fBasn1\fP. (OpenSSL only) .TP \fB\-keypasswd\fP \fItype\fP:\fIvalue\fP Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be \fBfile\fP:\fIfilename\fP, specifying that the password is in a file, or \fBstring\fP:\fIstring\fP, specifying the password on the command-line directly. If the private key file is encrypted and no \fB\-keypasswd\fP option is given, the password will be prompted for interactively. .TP \fB\-keymap\fP \fIname\fP Specifies a keyboard map to be found in the resource \fBc3270.keymap.\fP\fIname\fP or the file \fIname\fP. See \s-1KEYMAPS\s+1 below for details. .TP \fB\-km\fP \fIname\fP Specifies the local encoding method for multi-byte text. \fIname\fP is an encoding name recognized by the ICU library. (Supported only when c3270 is compiled with DBCS support, and necessary only when c3270 cannot figure it out from the locale.) .TP \fB\-loginmacro\fP \fIAction(arg...) ...\fP Specifies a macro to run at login time. .TP \fB\-model\fP \fIname\fP The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: .IP The first part is the \fBbase model\fP, which is either \fB3278\fP or \fB3279\fP. \fB3278\fP specifies a monochrome (green on black) 3270 display; \fB3279\fP specifies a color 3270 display. .IP The second part is the \fBmodel number\fP, which specifies the number of rows and columns. Model 4 is the default. .PP .TS center; c c c . T{ .na .nh Model Number T} T{ .na .nh Columns T} T{ .na .nh Rows T} _ T{ .na .nh 2 T} T{ .na .nh 80 T} T{ .na .nh 24 T} T{ .na .nh 3 T} T{ .na .nh 80 T} T{ .na .nh 32 T} T{ .na .nh 4 T} T{ .na .nh 80 T} T{ .na .nh 43 T} T{ .na .nh 5 T} T{ .na .nh 132 T} T{ .na .nh 27 T} .TE .IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. .IP The default model for a color display is \fB3279\-4\fP. For a monochrome display, it is \fB3278\-4\fP. .TP \fB\-mono\fP Prevents \fBc3270\fP from using color, ignoring any color capabilities reported by the terminal. .TP \fB\-noprompt\fP An alias for \-secure. .TP \fB\-noverifycert\fP For SSL/TLS connections, do not verify the host certificate. .TP \fB\-nvt\fP Start in NVT mode instead of waiting for the host to send data, and make the default terminal type \fBxterm\fP. .TP \fB\-oversize\fP \fIcols\fP\fBx\fP\fIrows\fP Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "c3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. .IP It can also be specified as \fBauto\fP, which causes \fBc3270\fP to fill the entire terminal or console window. .TP \fB\-port\fP \fIn\fP Specifies a different \s-1TCP\s+1 port to connect to. \fIn\fP can be a name from \fB/etc/services\fP like \fBtelnet\fP, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) .TP \fB\-proxy \fItype\fP:\fIhost\fP[:\fIport\fP]\fP Causes \fBc3270\fP to connect via the specified proxy, instead of using a direct connection. The \fIhost\fP can be an IP address or hostname. The optional \fIport\fP can be a number or a service name. For a list of supported proxy \fItypes\fP, see \s-1PROXY\s+1 below. .TP \fB\-printerlu \fIluname\fP\fP Causes \fBc3270\fP to automatically start a \fIpr3287\fP printer session. If \fIluname\fP is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. .TP \fB\-reconnect\fP Causes \fBc3270\fP to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line. .TP \fB\-rv\fP Switches c3270 from a white-on-black display to a black-on-white display. .TP \fB\-sl\fP \fIn\fP Specifies that \fIn\fP lines should be saved for scrolling back. The default is 4096. .TP \fB\-scriptport\fP \fB[\fP\fIaddr\fP\fB:]\fP\fIport\fP Specifies a port and optional address to listen on for scripting connections. \fIAddr\fP can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. .IP Note that this option is mutually-exclusive with the \-httpd option . .TP \fB\-scriptportonce\fP Allows c3270 to accept only one script connection. When that connection is broken, c3270 will exit. .TP \fB\-secure\fP Disables the interactive \fBc3270>\fP prompt. When used, a hostname must be provided on the command line. .TP \fB\-set\fP \fItoggle\fP Sets the initial value of \fItoggle\fP to \fBtrue\fP. .TP \fB\-socket\fP Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named \fB/tmp/x3sck.\fP\fIpid\fP. The \fB\-p\fP option of \fIx3270if\fP causes it to use this socket, instead of pipes specified by environment variables. .TP \fB\-tn\fP \fIname\fP Specifies the terminal name to be transmitted over the telnet connection. The default name is \fBIBM\-\fP\fImodel_name\fP\fB\-E\fP, for example, \fBIBM\-3279\-4\-E\fP for a color display, or \fBIBM\-3278\-4\-E\fP for a monochrome display. .IP Some hosts are confused by the \fB\-E\fP suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an \fBs:\fP on the hostname, or setting the "c3270.extended" resource to "false", removes the \fB\-E\fP from the terminal name when connecting to such hosts. .IP The name can also be specified with the "c3270.termName" resource. .TP \fB\-trace\fP Turns on data stream and event tracing at startup. The default trace file name is \fB/tmp/x3trc\fP. .TP \fB\-tracefile\fP \fIfile\fP Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file. .TP \fB\-tracefilesize\fP \fIsize\fP Places a limit on the size of a trace file. If this option is not specified, or is specified as \fB0\fP or \fBnone\fP, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of \fIsize\fP can have a \fBK\fP or \fBM\fP suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started. .TP \fB\-user\fP \fIname\fP Specifies the user name for RFC 4777 support. .TP \fB\-utf8\fP Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. .TP \fB\-v\fP Display the version and build options for \fBc3270\fP and exit. .TP \fB\-verifycert\fP For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a \fBy:\fP prepended to the hostname when connecting. .TP \fB\-xrm\fP "c3270.\fIresource\fP: \fIvalue\fP" Sets the value of the named \fIresource\fP to \fIvalue\fP. Resources control less common \fBc3270\fP options, and are defined under \s-1RESOURCES\s+1 below. .SH "STATUS LINE" If the terminal that \fBc3270\fP is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), \fBc3270\fP will display a status line. The \fBc3270\fP status line contains a variety of information. From left to right, the fields are: .TP \fBcomm status\fP The first symbol is always a \fB4\fP. If \fBc3270\fP is in TN3270E mode, the second symbol is a \fBB\fP; otherwise it is an \fBA\fP. If \fBc3270\fP is in SSCP-LU mode, the third symbol is an \fBS\fP. Otherwise it is blank. .TP \fBkeyboard lock\fP If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock. .TP \fBtypeahead\fP The letter "T" indicates that one or more keystrokes are in the typeahead buffer. .TP \fBtemporary keymap\fP The letter "K" indicates that a temporary keymap is in effect. .TP \fBreverse\fP The letter "R" indicates that the keyboard is in reverse field entry mode. .TP \fBinsert mode\fP The letter "I" indicates that the keyboard is in insert mode. .TP \fBprinter session\fP The letter "P" indicates that a \fIpr3287\fP session is active. .TP \fBsecure connection\fP A green letter "S" indicates that the connection is secured via SSL/TLS. .TP \fBLU name\fP The LU name associated with the session, if there is one. .TP \fBcursor position\fP The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0. .SH "ACTIONS" Here is a complete list of basic c3270 actions. Script-specific actions are described on the \fIx3270-script\fP(1) manual page. ).PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. .PP .TS center; lw(3i) lw(3i). T{ .na .nh .in +2 .ti -2 *Attn T} T{ .na .nh attention key T} T{ .na .nh .in +2 .ti -2 BackSpace T} T{ .na .nh move cursor left (or send \s-1ASCII BS\s+1) T} T{ .na .nh .in +2 .ti -2 BackTab T} T{ .na .nh tab to start of previous input field T} T{ .na .nh .in +2 .ti -2 CircumNot T} T{ .na .nh input "^" in \s-1NVT\s+1 mode, or "notsign" in 3270 mode T} T{ .na .nh .in +2 .ti -2 *Clear T} T{ .na .nh clear screen T} T{ .na .nh .in +2 .ti -2 Compose T} T{ .na .nh next two keys form a special symbol T} T{ .na .nh .in +2 .ti -2 *Connect(\fIhost\fP) T} T{ .na .nh connect to \fIhost\fP T} T{ .na .nh .in +2 .ti -2 *CursorSelect T} T{ .na .nh Cursor Select \s-1AID\s+1 T} T{ .na .nh .in +2 .ti -2 Delete T} T{ .na .nh delete character under cursor (or send \s-1ASCII DEL\s+1) T} T{ .na .nh .in +2 .ti -2 DeleteField T} T{ .na .nh delete the entire field T} T{ .na .nh .in +2 .ti -2 DeleteWord T} T{ .na .nh delete the current or previous word T} T{ .na .nh .in +2 .ti -2 *Disconnect T} T{ .na .nh disconnect from host T} T{ .na .nh .in +2 .ti -2 Down T} T{ .na .nh move cursor down T} T{ .na .nh .in +2 .ti -2 Dup T} T{ .na .nh duplicate field T} T{ .na .nh .in +2 .ti -2 *Enter T} T{ .na .nh Enter \s-1AID\s+1 (or send \s-1ASCII CR\s+1) T} T{ .na .nh .in +2 .ti -2 Erase T} T{ .na .nh erase previous character (or send \s-1ASCII BS\s+1) T} T{ .na .nh .in +2 .ti -2 EraseEOF T} T{ .na .nh erase to end of current field T} T{ .na .nh .in +2 .ti -2 EraseInput T} T{ .na .nh erase all input fields T} T{ .na .nh .in +2 .ti -2 Escape T} T{ .na .nh escape to \fBc3270>\fP prompt T} T{ .na .nh .in +2 .ti -2 Execute(\fIcmd\fP) T} T{ .na .nh execute a command in a shell T} T{ .na .nh .in +2 .ti -2 FieldEnd T} T{ .na .nh move cursor to end of field T} T{ .na .nh .in +2 .ti -2 FieldMark T} T{ .na .nh mark field T} T{ .na .nh .in +2 .ti -2 HexString(\fIhex_digits\fP) T} T{ .na .nh insert control-character string T} T{ .na .nh .in +2 .ti -2 Home T} T{ .na .nh move cursor to first input field T} T{ .na .nh .in +2 .ti -2 Insert T} T{ .na .nh set insert mode T} T{ .na .nh .in +2 .ti -2 *Interrupt T} T{ .na .nh send \s-1TELNET IP\s+1 to host T} T{ .na .nh .in +2 .ti -2 Keypad T} T{ .na .nh Display pop-up keypad T} T{ .na .nh .in +2 .ti -2 Key(\fIkeysym\fP) T} T{ .na .nh insert key \fIkeysym\fP T} T{ .na .nh .in +2 .ti -2 Key(0x\fIxx\fP) T} T{ .na .nh insert key with character code \fIxx\fP T} T{ .na .nh .in +2 .ti -2 Left T} T{ .na .nh move cursor left T} T{ .na .nh .in +2 .ti -2 Left2 T} T{ .na .nh move cursor left 2 positions T} T{ .na .nh .in +2 .ti -2 Menu T} T{ .na .nh Display menu bar T} T{ .na .nh .in +2 .ti -2 MonoCase T} T{ .na .nh toggle uppercase-only mode T} T{ .na .nh .in +2 .ti -2 MoveCursor(\fIrow\fP, \fIcol\fP) T} T{ .na .nh move cursor to zero-origin (\fIrow\fP,\fIcol\fP) T} T{ .na .nh .in +2 .ti -2 Newline T} T{ .na .nh move cursor to first field on next line (or send \s-1ASCII LF\s+1) T} T{ .na .nh .in +2 .ti -2 NextWord T} T{ .na .nh move cursor to next word T} T{ .na .nh .in +2 .ti -2 *PA(\fIn\fP) T} T{ .na .nh Program Attention \s-1AID\s+1 (\fIn\fP from 1 to 3) T} T{ .na .nh .in +2 .ti -2 *PF(\fIn\fP) T} T{ .na .nh Program Function \s-1AID\s+1 (\fIn\fP from 1 to 24) T} T{ .na .nh .in +2 .ti -2 PreviousWord T} T{ .na .nh move cursor to previous word T} T{ .na .nh .in +2 .ti -2 Printer(Start[,\fIlu\fP]|Stop) T} T{ .na .nh start or stop printer session T} T{ .na .nh .in +2 .ti -2 PrintText(\fIcommand\fP) T} T{ .na .nh print screen text on printer T} T{ .na .nh .in +2 .ti -2 Quit T} T{ .na .nh exit \fBc3270\fP T} T{ .na .nh .in +2 .ti -2 Redraw T} T{ .na .nh redraw window T} T{ .na .nh .in +2 .ti -2 Reset T} T{ .na .nh reset locked keyboard T} T{ .na .nh .in +2 .ti -2 Right T} T{ .na .nh move cursor right T} T{ .na .nh .in +2 .ti -2 Right2 T} T{ .na .nh move cursor right 2 positions T} T{ .na .nh .in +2 .ti -2 *Script(\fIcommand\fP[,\fIarg\fP...]) T} T{ .na .nh run a script T} T{ .na .nh .in +2 .ti -2 Scroll(Forward|Backward) T} T{ .na .nh scroll screen T} T{ .na .nh .in +2 .ti -2 *String(\fIstring\fP) T} T{ .na .nh insert string (simple macro facility) T} T{ .na .nh .in +2 .ti -2 Tab T} T{ .na .nh move cursor to next input field T} T{ .na .nh .in +2 .ti -2 Toggle(\fIoption\fP[,\fIset|clear\fP]) T} T{ .na .nh toggle an option T} T{ .na .nh .in +2 .ti -2 ToggleInsert T} T{ .na .nh toggle insert mode T} T{ .na .nh .in +2 .ti -2 ToggleReverse T} T{ .na .nh toggle reverse-input mode T} T{ .na .nh .in +2 .ti -2 *Transfer(\fIoption\fP=\fIvalue\fP...') T} T{ .na .nh file transfer T} T{ .na .nh .in +2 .ti -2 Up T} T{ .na .nh move cursor up T} T{ .na .nh .in +2 .ti -2 ignore T} T{ .na .nh do nothing T} .TE .LP Any of the above actions may be entered at the \fBc3270>\fP prompt; these commands are also available for use in keymaps (see \s-1KEYMAPS\s+1). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.: .RS PF(1) .RE or with spaces, e.g.: .RS PF 1 .RE Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used. .LP \fBc3270\fP also supports the following interactive commands: .TP \fBHelp\fP Displays a list of available commands. .TP \fBScreenTrace\fP Turns screen tracing (saving screen images to a file) on or off. The command \fBscreentrace on\fP enables screen tracing; the command \fBscreentrace off\fP disables it. After \fBon\fP, a filename may be specified to override the default trace file name of \fB/tmp/x3scr.\fP\fIpid\fP. The keyaord \fBon\fP can also be followed by the keyword \fBprinter\fP and an optional print command to direct screen traces directly to the printer. .TP \fBShow\fP Displays statistics and settings. .TP \fBTrace\fP Turns tracing on or off. The command \fBtrace on\fP enables data stream and keyboard event tracing; the command \fBtrace off\fP disables it. The qualifier \fBdata\fP or \fBkeyboard\fP can be specified before \fBon\fP or \fBoff\fP to enable or disable a particular trace. After \fBon\fP, a filename may be specified to override the default trace file name of \fB/tmp/x3trc.\fP\fIpid\fP. .LP Note that certain parameters to c3270 actions (such as the names of files and keymaps) are subject to \fIsubstitutions\fP: .LP The character \fB~\fP at the beginning of a string is replaced with the user's home directory. A \fB~\fP character followed by a username is replaced with that user's home directory. .LP Environment variables are substituted using the Unix shell convention of $\fIname\fP or ${\fIname\fP}. .LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. .SH "KEYMAPS" The \fB\-keymap\fP option or the \fBc3270.keymap\fP resource allow a custom keymap to be specified. If the option \fB\-keymap\fP \fIxxx\fP is given (or the \fBc3270.keymap\fP resource has the value \fIxxx\fP), \fBc3270\fP will look for a resource named \fBc3270.keymap.\fP\fIxxx\fP. If no resource definition is found, it will look for a file named \fIxxx\fP. .LP Multiple keymaps may be specified be separating their names with commas. Definitions in later keymaps supercede those in earlier keymaps. .LP In addition, separate keymaps may be defined that apply only in 3270 mode or \s-1NVT\s+1 mode. For example, the resource definition \fBc3270.keymap.\fP\fIxxx\fP\fB.nvt\fP or the file \fIxxx\fP\fB.nvt\fP will augment the definition of keymap \fIxxx\fP in \s-1NVT\s+1 mode. Similarly, the resource definition \fBc3270.keymap.\fP\fIxxx\fP\fB.3270\fP or the file \fIxxx\fP\fB.3270\fP will augment the definition of keymap \fIxxx\fP in 3270 mode. .LP Temporary keymaps can also be added or removed while c3270 is running with the \fBKeymap\fP action. See \fIx3270-script\fP(1) for details. .LP Each line (rule) in a keymap specifies actions to perform when a particular key or sequence of keys is pressed. Keymap rules have the following syntax: .LP .RS [\fBMeta\fP][\fBCtrl\fP]\fB\fP\fIkey\fP...: \fIaction\fP[(\fIparam\fP[,...])] ... .RE .LP Here is a sample keymap definition from a file: .LP .RS ! Lines beginning with ! are ignored and can .br ! occur anywhere. .br ! Definition of keymap xxx .br ! \ When Alt-c is pressed, clear the screen. .br Altc: Clear() .br ! \ When PageUp is pressed, send PF7 to the host. .br PPAGE: PF(7) .br ! \ When Ctrl-a is pressed, then F1, send PF13 .br ! \ to the host. .br Ctrla F1: PF(13) .RE .LP Here is the same definition as a resource: .LP .RS ! Lines beginning with ! are ignored, but NOT .br ! within a definition. .br ! Note that the \\ is required at the end of the .br ! first line, and \\n\\ is .br ! required at the end of every other line except .br ! the last. .br ! Definition of keymap xxx .br c3270.keymap.xxx: \\ .br \ Altc: Clear() \\n\\ .br \ PPAGE: PF(7) \\n\\ .br \ CtrlA F1: PF(13) .RE .LP The optional \fBAlt\fP or \fBCtrl\fP modifiers specify that the \fBAlt\fP and \fBCtrl\fP keys are pressed along with the specified \fIkey\fP, respectively. \fIKey\fP is either an \s-1ISO\s+1 8859-1 symbol name, such as \fBequal\fP for `=' and \fBa\fP for `a', or a symbolic \fBncurses\fP key name, such as \fBUP\fP. More than one \fIkey\fP can be specified, indicating that a sequence of keys must be pressed in order for the rule to be matched. The \fIaction\fP is an action from the \s-1ACTIONS\s+1 list above. More than one \fIaction\fP may be specified; they will be executed in order. .LP Keymap entries are case-sensitive and modifier-specific. This means that a keymap for the \fBb\fP key will match only a lowercase \fBb\fP. Actions for uppercase \fBB\fP, or for \fBAlt-B\fP, must be specified separately. .LP The base keymap is: .LP .TS l l. T{ .na .nh Key T} T{ .na .nh Action T} _ T{ .na .nh Ctrl] T} T{ .na .nh Escape T} T{ .na .nh Ctrla Ctrla T} T{ .na .nh Key(0x01) T} T{ .na .nh Ctrla Ctrl] T} T{ .na .nh Key(0x1d) T} T{ .na .nh Ctrla Tab T} T{ .na .nh BackTab T} T{ .na .nh Ctrla c T} T{ .na .nh Clear T} T{ .na .nh Ctrla e T} T{ .na .nh Escape T} T{ .na .nh Ctrla r T} T{ .na .nh Reset T} T{ .na .nh Ctrla k T} T{ .na .nh Keypad T} T{ .na .nh Ctrla l T} T{ .na .nh Redraw T} T{ .na .nh Ctrla m T} T{ .na .nh Compose T} T{ .na .nh Ctrla n T} T{ .na .nh Menu T} T{ .na .nh Ctrla p T} T{ .na .nh PrintText T} T{ .na .nh Ctrla ^ T} T{ .na .nh Key(notsign) T} T{ .na .nh Ctrlk T} T{ .na .nh Keypad T} T{ .na .nh Ctrln T} T{ .na .nh Menu T} T{ .na .nh UP T} T{ .na .nh Up T} T{ .na .nh DOWN T} T{ .na .nh Down T} T{ .na .nh LEFT T} T{ .na .nh Left T} T{ .na .nh RIGHT T} T{ .na .nh Right T} T{ .na .nh F(\fIn\fP) T} T{ .na .nh PF(\fIn\fP) T} T{ .na .nh Ctrla F(\fIn\fP) T} T{ .na .nh PF(\fIn\fP+12) T} T{ .na .nh Ctrla 1 T} T{ .na .nh PA(1) T} T{ .na .nh Ctrla 2 T} T{ .na .nh PA(2) T} T{ .na .nh Ctrla 3 T} T{ .na .nh PA(3) T} T{ .na .nh PPAGE T} T{ .na .nh Scroll(Backward) T} T{ .na .nh NPAGE T} T{ .na .nh Scroll(Forward) T} .TE .LP The base 3270-mode keymap adds: .LP .TS l l. T{ .na .nh Key T} T{ .na .nh Action T} _ T{ .na .nh Ctrlc T} T{ .na .nh Clear T} T{ .na .nh Ctrld T} T{ .na .nh Dup T} T{ .na .nh Ctrlf T} T{ .na .nh FieldMark T} T{ .na .nh Ctrli T} T{ .na .nh Tab T} T{ .na .nh Ctrll T} T{ .na .nh Redraw T} T{ .na .nh Ctrlr T} T{ .na .nh Reset T} T{ .na .nh Ctrlu T} T{ .na .nh DeleteField T} T{ .na .nh BackSpace T} T{ .na .nh BackSpace T} T{ .na .nh Return T} T{ .na .nh Enter T} T{ .na .nh Tab T} T{ .na .nh Tab T} T{ .na .nh Linefeed T} T{ .na .nh Newline T} T{ .na .nh BACKSPACE T} T{ .na .nh BackSpace T} T{ .na .nh DC T} T{ .na .nh Delete T} T{ .na .nh HOME T} T{ .na .nh Home T} T{ .na .nh IC T} T{ .na .nh ToggleInsert T} .TE .SH "THE META OR ALT KEY" Some keyboards do not have a \fBMeta\fP key. Instead, they have an \fBAlt\fP key. Sometimes this key acts as a proper \fBMeta\fP key, that is, it is a modifier key that sets the high-order bit (0x80) in the code that is transmitted for each key. Other keyboards send a two-character sequence when the \fBAlt\fP key is pressed with another key: the Escape character (0x1b), followed by the code for the other key. .LP The resource \fBc3270.metaEscape\fP and the termcap \fBkm\fP attribute control how \fBc3270\fP will interpret these sequences. When \fBc3270.metaEscape\fP is set to \fBtrue\fP, or when \fBc3270.metaEscape\fP is set to \fBauto\fP and the termcap \fBkm\fP attribute is set, the keyboard is assumed to have a separate \fBMeta\fP key. The Escape key can be used as an ordinary data key and has no special meaning. .LP When \fBc3270.metaEscape\fP is set to \fBtrue\fP, or when \fBc3270.metaEscape\fP is set to \fBauto\fP and the termcap \fBkm\fP attribute is not set, the keyboard is assumed to use the Escape character as a prefix to indicate that the following character is supposed to have the high-order bit set. When \fBc3270\fP sees an Escape character from the keyboard, it sets a short timeout. If another character arrives before the timeout expires, then \fBc3270\fP will combine the two characters, setting the high-order bit of the second. In an event trace file, the combined character is listed as \fIderived\fP. In a keymap, only the combined character or the \fBMeta\fP prefix may be used. The Escape key can still be used by itself, but only if there is a short pause before pressing another key. .LP The default value for \fBc3270.metaEscape\fP is \fBauto\fP. .SH "FILE TRANSFER" The \fBTransfer\fP action implements \fBIND$FILE\fP file transfer. This action requires that the \fBIND$FILE\fP program be installed on the \s-1IBM\s+1 host, and that the 3270 cursor be located in a field that will accept a \s-1TSO\s+1 or \s-1VM/CMS\s+1 command. .LP The \fBTransfer\fP action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. .LP Because of the complexity and number of options for file transfer, the parameters to the \fBTransfer\fP action take the unique form of \fIoption\fP=\fIvalue\fP, and can appear in any order. Note that if the \fIvalue\fP contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: .LP .TS l c l l. T{ .na .nh Option T} T{ .na .nh Required? T} T{ .na .nh Default T} T{ .na .nh Other Values T} _ T{ .na .nh Direction T} T{ .na .nh No T} T{ .na .nh receive T} T{ .na .nh send T} T{ .na .nh HostFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh LocalFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Host T} T{ .na .nh No T} T{ .na .nh tso T} T{ .na .nh vm, cics T} T{ .na .nh Mode T} T{ .na .nh No T} T{ .na .nh ascii T} T{ .na .nh binary T} T{ .na .nh Cr T} T{ .na .nh No T} T{ .na .nh remove T} T{ .na .nh add, keep T} T{ .na .nh Remap T} T{ .na .nh No T} T{ .na .nh yes T} T{ .na .nh no T} T{ .na .nh Exist T} T{ .na .nh No T} T{ .na .nh keep T} T{ .na .nh replace, append T} T{ .na .nh Recfm T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh fixed, variable, undefined T} T{ .na .nh Lrecl T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Blksize T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Allocation T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh tracks, cylinders, avblock T} T{ .na .nh PrimarySpace T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh SecondarySpace T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Avblock T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh BufferSize T} T{ .na .nh No T} T{ .na .nh 4096 T} T{ .na .nh \ T} .TE .LP The option details are as follows. .TP \fBDirection\fP \fBsend\fP to send a file to the host, \fBreceive\fP to receive a file from the host. .TP \fBHostFile\fP The name of the file on the host. .TP \fBLocalFile\fP The name of the file on the local workstation. .TP \fBHost\fP The type of host (which dictates the form of the \fBIND$FILE\fP command): \fBtso\fP (the default), \fBvm\fP or \fBcics\fP. .TP \fBMode\fP Use \fBascii\fP (the default) for a text file, which will be translated between \s-1EBCDIC\s+1 and \s-1ASCII\s+1 as necessary. Use \fBbinary\fP for non-text files. .TP \fBCr\fP Controls how \fBNewline\fP characters are handled when transferring \fBMode=ascii\fP files. \fBremove\fP (the default) strips \fBNewline\fP characters in local files before transferring them to the host. \fBadd\fP adds \fBNewline\fP characters to each host file record before transferring it to the local workstation. \fBkeep\fP preserves \fBNewline\fP characters when transferring a local file to the host. .TP \fBRemap\fP Controls text translation for \fBMode=ascii\fP files. The value \fByes\fP (the default) causes c3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's \s-1EBCDIC\s+1 code page. The value \fBno\fP causes c3270 to pass the text to or from the host as-is, leaving all translation to the \fBIND$FILE\fP program on the host. .TP \fBExist\fP Controls what happens when the destination file already exists. \fBkeep\fP (the default) preserves the file, causing the \fBTransfer\fP action to fail. \fBreplace\fP overwrites the destination file with the source file. \fBappend\fP appends the source file to the destination file. .TP \fBRecfm\fP Controls the record format of files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) \fBfixed\fP creates a file with fixed-length records. \fBvariable\fP creates a file with variable-length records. \fBundefined\fP creates a file with undefined-length records (\s-1TSO\s+1 hosts only). The \fBLrecl\fP option controls the record length or maximum record length for \fBRecfm=fixed\fP and \fBRecfm=variable\fP files, respectively. .TP \fBLrecl\fP Specifies the record length (or maximum record length) for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBBlksize\fP Specifies the block size for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBAllocation\fP Specifies the units for the \fBPrimarySpace\fP and \fBSecondarySpace\fP options: \fBtracks\fP, \fBcylinders\fP or \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBPrimarySpace\fP Primary allocation for a file. The units are given by the \fBAllocation\fP option. Required when the \fBAllocation\fP is specified as something other than \fBdefault\fP. (\s-1TSO\s+1 hosts only.) .TP \fBSecondarySpace\fP Secondary allocation for a file. The units are given by the \fBAllocation\fP option. (\s-1TSO\s+1 hosts only.) .TP \fBAvblock\fP Average block size, required when \fBAllocation\fP specifies \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBBufferSize\fP Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. .LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the \fBTransfer\fP keywords, but with \fBft\fP prepended. E.g., the default for the \fBMode\fP keyword is the \fBc3270.ftMode\fP resource. .SH "THE PRINTTEXT ACTION" The \fBPrintText\fP produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., \fBlpr\fP. .LP Multiple arguments can include keywords to control the output of \fBPrintText\fP: .TP \fBfile\fP \fIfilename\fP Save the output in a file. .TP \fBhtml\fP Save the output as HTML. This option implies \fBfile\fP. .TP \fBrtf\fP Save the output as RichText. This option implies \fBfile\fP. The font defaults to \fBCourier New\fP and the point size defaults to 8. These can be overridden by the \fBprintTextFont\fP and \fBprintTextSize\fP resources, respectively. .TP \fBstring\fP Return the output as a string. This can only be used from scripts. .TP \fBmodi\fP Render modified fields in italics. .TP \fBcaption\fP \fItext\fP Add the specified \fItext\fP as a caption above the output. Within \fItext\fP, the special sequence \fB%T%\fP will be replaced with a timestamp. .TP \fBcommand\fP \fIcommand\fP Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. .SH "SCRIPTS" There are several types of script functions available. .TP \fBThe String Action\fP The simplest method for scripting is provided via the \fBString\fP action. The arguments to \fBString\fP are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the \s-1AID\s+1 code to the host, \fBc3270\fP will wait for the host to unlock the keyboard before further processing the string.) .TS l l. T{ .na .nh \eb T} T{ .na .nh Left T} T{ .na .nh \ee\fIxxxx\fP T} T{ .na .nh EBCDIC character in hex T} T{ .na .nh \ef T} T{ .na .nh Clear* T} T{ .na .nh \en T} T{ .na .nh Enter* T} T{ .na .nh \epa\fIn\fP T} T{ .na .nh PA(\fIn\fP)* T} T{ .na .nh \epf\fInn\fP T} T{ .na .nh PF(\fInn\fP)* T} T{ .na .nh \er T} T{ .na .nh Newline T} T{ .na .nh \et T} T{ .na .nh Tab T} T{ .na .nh \eT T} T{ .na .nh BackTab T} T{ .na .nh \eu\fIxxxx\fP T} T{ .na .nh Unicode character in hex T} T{ .na .nh \ex\fIxxxx\fP T} T{ .na .nh Unicode character in hex T} .TE .IP Note that the numeric values for the \ee, \eu and \ex sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if c3270 is built with DBCS support and the host allows DBCS input in the current field. .IP An example keymap entry would be: .RS Metap: String("probs clearrdr\en") .RE .IP \fBNote:\fP The strings are in \s-1ASCII\s+1 and converted to \s-1EBCDIC\s+1, so beware of inserting control codes. .IP There is also an alternate form of the \fBString\fP action, \fBHexString\fP, which is used to enter non-printing data. The argument to \fBHexString\fP is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent \s-1EBCDIC\s+1 characters, which are entered into the current field. In \s-1NVT\s+1 mode, the hexadecimal data represent \s-1ASCII\s+1 characters, which are sent directly to the host. .TP \fBThe Script Action\fP This action causes \fBc3270\fP to start a child process which can execute \fBc3270\fP actions. Standard input and output from the child process are piped back to \fBc3270\fP. The \fBScript\fP action is fully documented in \fIx3270-script\fP(1). .SH "COMPOSITE CHARACTERS" \fBc3270\fP allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A C on the status line indicates a pending composite character. .PP The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "c3270.composeMap" resource; it gives the name of the map to use. The maps themselves are named "c3270.composeMap.\fIname\fP". The default is "latin1", which gives mappings for most of the symbols in the \s-1ISO\s+1 8859-1 Latin-1 character set that are not in the 7-bit \s-1ASCII\s+1 character set. .PP \fBNote:\fP The default keymap defines Metam as the "Compose" key. You may set up your own "Compose" key with a keymap that maps some other keysym onto the \fBCompose\fP action. .SH "PRINTER SESSION SUPPORT" c3270 supports associated printer sessions via the \fIpr3287\fP(1) program. The \fBPrinter\fP action is used to start or stop a \fIpr3287\fP session. .LP The action \fBPrinter Start\fP starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) .LP The action \fBPrinter Start\fP \fIlu\fP starts a printer session, associated with a specific \fIlu\fP. .LP The action \fBPrinter Stop\fP stops a printer session. .LP The resource \fBc3270.printer.options\fP specifies extra options, such as \fB-trace\fP to pass to \fIpr3287\fP. .LP See \fIpr3287\fP(1) for further details. .LP The resource \fBc3270.printerLu\fP controls automatic printer session start-up. If it is set to `\fB.\fP', then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. .SH "PASSTHRU" \fBc3270\fP supports the Sun \fItelnet-passthru\fP service provided by the \fIin.telnet-gw\fP server. This allows outbound telnet connections through a firewall machine. When a \fBp:\fP is prepended to a hostname, \fBc3270\fP acts much like the \fIitelnet\fP(1) command. It contacts the machine named \fBinternet-gateway\fP at the port defined in \fB/etc/services\fP as \fBtelnet-passthru\fP (which defaults to 3514). It then passes the requested hostname and port to the \fBin.telnet-gw\fP server. .SH "PROXY" The \fB\-proxy\fP option or the \fBc3270.proxy\fP resource causes c3270 to use a proxy server to connect to the host. The syntax of the option or resource is: .RS \fItype\fP:\fIhost\fP[:\fIport\fP] .RE The supported values for \fItype\fP are: .TS center; c l c . T{ .na .nh Proxy Type T} T{ .na .nh Protocol T} T{ .na .nh Default Port T} _ T{ .na .nh http T} T{ .na .nh RFC 2817 HTTP tunnel (squid) T} T{ .na .nh 3128 T} T{ .na .nh passthru T} T{ .na .nh Sun in.telnet-gw T} T{ .na .nh none T} T{ .na .nh socks4 T} T{ .na .nh SOCKS version 4 T} T{ .na .nh 1080 T} T{ .na .nh socks5 T} T{ .na .nh SOCKS version 5 (RFC 1928) T} T{ .na .nh 1080 T} T{ .na .nh telnet T} T{ .na .nh No protocol (just send \fBconnect\fP \fIhost port\fP) T} T{ .na .nh none T} .TE .LP The special types \fBsocks4a\fP and \fBsocks5d\fP can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. .SH "SCREEN SIZE SWITCHING" When running as a 3270 Model 5, \fBc3270\fP can take advantage of terminals that can switch between 80 and 132 column modes. .LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to \fBc3270\fP. These are specified with the \fB\-altscreen\fP and \fB\-defscreen\fP command-line options, or the \fBaltScreen\fP and \fBdefScreen\fP resources. \fB\-altscreen\fP or \fBaltScreen\fP defines the alternate (132-column) mode; \fB\-defscreen\fP or \fBdefScreen\fP defines the default (80-column) mode. .LP The syntax for the options and resources is \fIrows\fP\fBx\fP\fIcols\fP\fB=\fP\fIinit_string\fP, where \fIrows\fP and \fIcols\fP give the screen dimensions, and \fIinit_string\fP is the escape sequence to transmit to the terminal to enter that mode. For \fBdefscreen\fP, the minimum dimensions are 24 rows and 80 columns. For \fBaltscreen\fP, the minimum dimensions are 27 rows and 132 columns. Within \fIinit_string\fP, the usual escape sequences are supported (\\E for escape, \\r, \\b, etc.). For example, the init string for a 132-column xterm is: .IP \\E[?40h\\E[?3h .LP Note: When \fBdefscreen\fP and \fBaltscreen\fP are specified, the model number is always set to 5. .SH "RESOURCES" Certain \fBc3270\fP options can be configured via resources. Resources are defined in the file \fB.c3270pro\fP in the user's home directory, and by \fB\-xrm\fP options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in \fBc3270\fP are: .LP .TS l l l l. T{ .na .nh Resource T} T{ .na .nh Default T} T{ .na .nh Option T} T{ .na .nh Purpose T} _ T{ .na .nh allBold T} T{ .na .nh Auto T} T{ .na .nh \-allbold T} T{ .na .nh Display all characters bold T} T{ .na .nh altScreen T} T{ .na .nh \ T} T{ .na .nh \-altscreen T} T{ .na .nh 132-col screen definition T} T{ .na .nh blankFill T} T{ .na .nh False T} T{ .na .nh \-set blankFill T} T{ .na .nh Blank Fill mode T} T{ .na .nh charset T} T{ .na .nh bracket T} T{ .na .nh \-charset T} T{ .na .nh \s-1EBCDIC\s+1 character set T} T{ .na .nh composeMap T} T{ .na .nh latin1 T} T{ .na .nh \ T} T{ .na .nh Name of composed-character map T} T{ .na .nh cursesColor\%ForHostColor\fIn\fP T} T{ .na .nh (note 6) T} T{ .na .nh \ T} T{ .na .nh Color mapping T} T{ .na .nh cursesColor\%ForDefault T} T{ .na .nh green T} T{ .na .nh \ T} T{ .na .nh Default color mapping T} T{ .na .nh cursesColor\%ForIntensified T} T{ .na .nh red T} T{ .na .nh \ T} T{ .na .nh Default color mapping T} T{ .na .nh cursesColor\%ForProtected T} T{ .na .nh blue T} T{ .na .nh \ T} T{ .na .nh Default color mapping T} T{ .na .nh cursesColor\%ForProtectedIntensified T} T{ .na .nh white T} T{ .na .nh \ T} T{ .na .nh Default color mapping T} T{ .na .nh cursesKeymap T} T{ .na .nh True T} T{ .na .nh \ T} T{ .na .nh Set curses keymap option T} T{ .na .nh defScreen T} T{ .na .nh \ T} T{ .na .nh \-defscreen T} T{ .na .nh 80-col screen definition T} T{ .na .nh dbcsCgcsgid T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Override DBCS CGCSGID T} T{ .na .nh dsTrace T} T{ .na .nh False T} T{ .na .nh \-trace T} T{ .na .nh Data stream tracing T} T{ .na .nh eof T} T{ .na .nh ^D T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode \s-1EOF\s+1 character T} T{ .na .nh erase T} T{ .na .nh ^H T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode erase character T} T{ .na .nh extended T} T{ .na .nh True T} T{ .na .nh \ T} T{ .na .nh Use 3270 extended data stream T} T{ .na .nh eventTrace T} T{ .na .nh False T} T{ .na .nh \-trace T} T{ .na .nh Event tracing T} T{ .na .nh hostsFile T} T{ .na .nh \ T} T{ .na .nh \-hostsfile T} T{ .na .nh Host alias/macro file T} T{ .na .nh icrnl T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Map \s-1CR\s+1 to \s-1NL\s+1 on \s-1NVT\s+1-mode input T} T{ .na .nh inlcr T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Map \s-1NL\s+1 to \s-1CR\s+1 in \s-1NVT\s+1-mode input T} T{ .na .nh intr T} T{ .na .nh ^C T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode interrupt character T} T{ .na .nh keymap T} T{ .na .nh \ T} T{ .na .nh \-keymap T} T{ .na .nh Keyboard map name T} T{ .na .nh keymap.\fIfoo\fP T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Definition of keymap \fIfoo\fP T} T{ .na .nh kill T} T{ .na .nh ^U T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode kill character T} T{ .na .nh lineWrap T} T{ .na .nh False T} T{ .na .nh \-set lineWrap T} T{ .na .nh \s-1NVT\s+1 line wrap mode T} T{ .na .nh lnext T} T{ .na .nh ^V T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode lnext character T} T{ .na .nh m3279 T} T{ .na .nh (note 1) T} T{ .na .nh \-model T} T{ .na .nh 3279 (color) emulation T} T{ .na .nh metaEscape T} T{ .na .nh Auto T} T{ .na .nh \ T} T{ .na .nh Interpret ESC-x as Meta-x T} T{ .na .nh mono T} T{ .na .nh (note 5) T} T{ .na .nh \-mono T} T{ .na .nh Ignore terminal color capabilities T} T{ .na .nh monoCase T} T{ .na .nh False T} T{ .na .nh \-set monoCase T} T{ .na .nh Mono-case mode T} T{ .na .nh noPrompt T} T{ .na .nh False T} T{ .na .nh \-noprompt T} T{ .na .nh Disable command-prompt mode T} T{ .na .nh numericLock T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Lock keyboard for numeric field error T} T{ .na .nh oerrLock T} T{ .na .nh True T} T{ .na .nh \ T} T{ .na .nh Lock keyboard for input error T} T{ .na .nh oversize T} T{ .na .nh \ T} T{ .na .nh \-oversize T} T{ .na .nh Oversize screen dimensions T} T{ .na .nh port T} T{ .na .nh telnet T} T{ .na .nh \-port T} T{ .na .nh Non-default TCP port T} T{ .na .nh printer.* T} T{ .na .nh (note 4) T} T{ .na .nh \ T} T{ .na .nh Printer session config T} T{ .na .nh printerLu T} T{ .na .nh (note 4) T} T{ .na .nh \ T} T{ .na .nh Printer session config T} T{ .na .nh quit T} T{ .na .nh ^\e T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode quit character T} T{ .na .nh reconnect T} T{ .na .nh False T} T{ .na .nh \-reconnect T} T{ .na .nh Automatically reconnect to host T} T{ .na .nh rprnt T} T{ .na .nh ^R T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode reprint character T} T{ .na .nh sbcsCgcsgid T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Override SBCS CGCSGID T} T{ .na .nh secure T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Disable "dangerous" options T} T{ .na .nh termName T} T{ .na .nh (note 2) T} T{ .na .nh \-tn T} T{ .na .nh \s-1TELNET\s+1 terminal type string T} T{ .na .nh traceDir T} T{ .na .nh /tmp T} T{ .na .nh \ T} T{ .na .nh Directory for trace files T} T{ .na .nh traceFile T} T{ .na .nh (note 3) T} T{ .na .nh \-tracefile T} T{ .na .nh File for trace output T} T{ .na .nh typeahead T} T{ .na .nh True T} T{ .na .nh \ T} T{ .na .nh Allow typeahead T} T{ .na .nh werase T} T{ .na .nh ^W T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode word-erase character T} .TE .LP .RS \fINote 1\fP: \fBm3279\fP defaults to \fBTrue\fP if the terminal supports color, \fBFalse\fP otherwise. It can be forced to \fBFalse\fP with the proper \fB\-model\fP option. .LP \fINote 2\fP: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as \fBIBM-3279-2-E\fP. Note also that when \s-1TN3270E\s+1 mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. .LP \fINote 3\fP: The default trace file is \fBx3trc.\fP\fIpid\fP in the directory specified by the \fBtraceDir\fP resource. .LP \fINote 4\fP: See \s-1PRINTER SUPPORT\s+1 for details. .LP \fINote 5\fP: \fBmono\fP defaults to \fBfalse\fP if the terminal supports at least 8 colors and to \fBtrue\fP otherwise. .LP \fINote 6\fP: The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white. .RE .LP In \fB.c3270pro\fP, lines are continued with a backslash character. .LP \fB\-xrm\fP options override definitions found in \fB.c3270pro\fP. If more than one \fB\-xrm\fP option is given for the same resource, the last one on the command line is used. .SH "FILES" /usr/local/lib/x3270/ibm_hosts .br $HOME/.c3270pro .SH "SEE ALSO" pr3287(1), s3270(1), x3270-script(1), x3270(1), tcl3270(1), telnet(1), tn3270(1) .br Data Stream Programmer's Reference, IBM GA23-0059 .br Character Set Reference, IBM GA27-3831 .br RFC 1576, TN3270 Current Practices .br RFC 1646, TN3270 Extensions for LUname and Printer Selection .br RFC 2355, TN3270 Enhancements .SH "COPYRIGHTS" Copyright 1993-2017, Paul Mattes. .br Copyright 2004-2005, Don Russell. .br Copyright 2004, Dick Altenbern. .br Copyright 1990, Jeff Sparkes. .br Copyright 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. .br All rights reserved. .LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: .TP * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. .TP * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. .TP * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. .LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .SH "VERSION" c3270 3.6ga4 suite3270-3.6/c3270/conf.h.in0000664000076500007650000000473513221577163013446 0ustar pdmpdm/* * Copyright (c) 2000-2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. * Automatically generated from conf.h.in by configure. */ /* Libraries. */ #undef HAVE_LIBNCURSESW #undef HAVE_LIBNCURSES #undef HAVE_LIBCURSES #undef HAVE_LIBREADLINE /* Header files. */ #undef HAVE_NCURSESW_NCURSES_H #undef HAVE_NCURSES_NCURSES_H #undef HAVE_NCURSES_H #undef HAVE_CURSES_H #undef HAVE_NCURSESW_TERM_H #undef HAVE_NCURSES_TERM_H #undef HAVE_TERM_H #undef HAVE_SYS_SELECT_H #undef HAVE_READLINE_HISTORY_H #undef HAVE_PTY_H #undef HAVE_LIBUTIL_H #undef HAVE_UTIL_H #undef HAVE_GETOPT_H /* Uncommon functions. */ #undef HAVE_VASPRINTF #undef HAVE_FSEEKO #undef HAVE_FORKPTY #undef HAVE_USE_DEFAULT_COLORS /* Default pager. */ #define LESSPATH "" #define MOREPATH "" /* Wide curses. */ #undef CURSES_WIDE /* Configuration options. */ /* Broken stuff. */ #undef BROKEN_NEWTERM /* Optional parts. */ #undef X3270_DBCS #undef X3270_LOCAL_PROCESS #undef X3270_IPV6 suite3270-3.6/c3270/configure0000775000076500007650000060416213221577163013652 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for c3270 3.x. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c3270' PACKAGE_TARNAME='c3270' PACKAGE_VERSION='3.x' PACKAGE_STRING='c3270 3.x' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS DBCS LIBX3270DIR MOREPATH LESSPATH CURSES_WIDE EGREP GREP CPP CCOPTIONS BROKEN_NEWTERM host_os host_vendor host_cpu host build_os build_vendor build_cpu build OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_readline enable_dbcs enable_local_process enable_ipv6 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures c3270 3.x to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/c3270] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of c3270 3.x:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dbcs leave out DBCS support --disable-local-process leave out local process support --disable-ipv6 leave out IPv6 support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-readline Don't use the readline library Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF c3270 configure 3.x generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by c3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers conf.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ansi="-std=c99 -pedantic" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case "$host_os" in *cygwin*) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ansi="" ;; hpux) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ;; solaris2*) CPPFLAGS="-D__EXTENSIONS__ -D_XOPEN_SOURCE_EXTENDED" ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ;; linux*) CPPFLAGS="-D_POSIX_SOURCE -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE" ;; aix*) BROKEN_NEWTERM=1 ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SELECT_H 1 _ACEOF fi done if test "$with_readline" != no; then for ac_header in readline/history.h do : ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" if test "x$ac_cv_header_readline_history_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_READLINE_HISTORY_H 1 _ACEOF fi done fi for ac_header in pty.h do : ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTY_H 1 _ACEOF fi done for ac_header in libutil.h do : ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBUTIL_H 1 _ACEOF fi done for ac_header in util.h do : ac_fn_c_check_header_mongrel "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTIL_H 1 _ACEOF fi done for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF fi done for ac_header in ncursesw/ncurses.h do : ac_fn_c_check_header_mongrel "$LINENO" "ncursesw/ncurses.h" "ac_cv_header_ncursesw_ncurses_h" "$ac_includes_default" if test "x$ac_cv_header_ncursesw_ncurses_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NCURSESW_NCURSES_H 1 _ACEOF else for ac_header in ncurses/ncurses.h do : ac_fn_c_check_header_mongrel "$LINENO" "ncurses/ncurses.h" "ac_cv_header_ncurses_ncurses_h" "$ac_includes_default" if test "x$ac_cv_header_ncurses_ncurses_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NCURSES_NCURSES_H 1 _ACEOF else for ac_header in ncurses.h do : ac_fn_c_check_header_mongrel "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" "$ac_includes_default" if test "x$ac_cv_header_ncurses_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NCURSES_H 1 _ACEOF else for ac_header in curses.h do : ac_fn_c_check_header_mongrel "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default" if test "x$ac_cv_header_curses_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CURSES_H 1 _ACEOF else as_fn_error $? "No curses header file" "$LINENO" 5 fi done fi done fi done fi done for ac_header in ncursesw/term.h do : ac_fn_c_check_header_mongrel "$LINENO" "ncursesw/term.h" "ac_cv_header_ncursesw_term_h" "$ac_includes_default" if test "x$ac_cv_header_ncursesw_term_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NCURSESW_TERM_H 1 _ACEOF else for ac_header in ncurses/term.h do : ac_fn_c_check_header_mongrel "$LINENO" "ncurses/term.h" "ac_cv_header_ncurses_term_h" "$ac_includes_default" if test "x$ac_cv_header_ncurses_term_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NCURSES_TERM_H 1 _ACEOF else for ac_header in term.h do : ac_fn_c_check_header_mongrel "$LINENO" "term.h" "ac_cv_header_term_h" "$ac_includes_default" if test "x$ac_cv_header_term_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TERM_H 1 _ACEOF fi done fi done fi done # Check whether --with-readline was given. if test "${with_readline+set}" = set; then : withval=$with_readline; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing forkpty" >&5 $as_echo_n "checking for library containing forkpty... " >&6; } if ${ac_cv_search_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char forkpty (); int main () { return forkpty (); ; return 0; } _ACEOF for ac_lib in '' util; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_forkpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_forkpty+:} false; then : break fi done if ${ac_cv_search_forkpty+:} false; then : else ac_cv_search_forkpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_forkpty" >&5 $as_echo "$ac_cv_search_forkpty" >&6; } ac_res=$ac_cv_search_forkpty if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" if test "x$ac_cv_func_forkpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for newterm in -lncursesw" >&5 $as_echo_n "checking for newterm in -lncursesw... " >&6; } if ${ac_cv_lib_ncursesw_newterm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncursesw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char newterm (); int main () { return newterm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncursesw_newterm=yes else ac_cv_lib_ncursesw_newterm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_newterm" >&5 $as_echo "$ac_cv_lib_ncursesw_newterm" >&6; } if test "x$ac_cv_lib_ncursesw_newterm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNCURSESW 1 _ACEOF LIBS="-lncursesw $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for newterm in -lncurses" >&5 $as_echo_n "checking for newterm in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_newterm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char newterm (); int main () { return newterm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_newterm=yes else ac_cv_lib_ncurses_newterm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_newterm" >&5 $as_echo "$ac_cv_lib_ncurses_newterm" >&6; } if test "x$ac_cv_lib_ncurses_newterm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNCURSES 1 _ACEOF LIBS="-lncurses $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for newterm in -lcurses" >&5 $as_echo_n "checking for newterm in -lcurses... " >&6; } if ${ac_cv_lib_curses_newterm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char newterm (); int main () { return newterm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curses_newterm=yes else ac_cv_lib_curses_newterm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_newterm" >&5 $as_echo "$ac_cv_lib_curses_newterm" >&6; } if test "x$ac_cv_lib_curses_newterm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCURSES 1 _ACEOF LIBS="-lcurses $LIBS" else as_fn_error $? "Can't find libncurses or new-enough libcurses" "$LINENO" 5 fi fi fi if test "$with_readline" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_initialize in -lreadline" >&5 $as_echo_n "checking for rl_initialize in -lreadline... " >&6; } if ${ac_cv_lib_readline_rl_initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rl_initialize (); int main () { return rl_initialize (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_rl_initialize=yes else ac_cv_lib_readline_rl_initialize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_initialize" >&5 $as_echo "$ac_cv_lib_readline_rl_initialize" >&6; } if test "x$ac_cv_lib_readline_rl_initialize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBREADLINE 1 _ACEOF LIBS="-lreadline $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test -n "$BROKEN_NEWTERM" then if test "$ac_cv_lib_ncurses_newterm" = yes then : else $as_echo "#define BROKEN_NEWTERM 1" >>confdefs.h fi fi for ac_func in use_default_colors do : ac_fn_c_check_func "$LINENO" "use_default_colors" "ac_cv_func_use_default_colors" if test "x$ac_cv_func_use_default_colors" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_USE_DEFAULT_COLORS 1 _ACEOF fi done for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi if test "$ac_cv_lib_ncursesw_newterm" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wadd_wch in -lncursesw" >&5 $as_echo_n "checking for wadd_wch in -lncursesw... " >&6; } if ${ac_cv_lib_ncursesw_wadd_wch+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncursesw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char wadd_wch (); int main () { return wadd_wch (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncursesw_wadd_wch=yes else ac_cv_lib_ncursesw_wadd_wch=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_wadd_wch" >&5 $as_echo "$ac_cv_lib_ncursesw_wadd_wch" >&6; } if test "x$ac_cv_lib_ncursesw_wadd_wch" = xyes; then : $as_echo "#define CURSES_WIDE 1" >>confdefs.h Cw=1 fi elif test "$ac_cv_lib_ncurses_newterm" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wadd_wch in -lncurses" >&5 $as_echo_n "checking for wadd_wch in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_wadd_wch+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char wadd_wch (); int main () { return wadd_wch (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_wadd_wch=yes else ac_cv_lib_ncurses_wadd_wch=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_wadd_wch" >&5 $as_echo "$ac_cv_lib_ncurses_wadd_wch" >&6; } if test "x$ac_cv_lib_ncurses_wadd_wch" = xyes; then : $as_echo "#define CURSES_WIDE 1" >>confdefs.h Cw=1 fi elif test "$ac_cv_lib_curses_newterm" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wadd_wch in -lcurses" >&5 $as_echo_n "checking for wadd_wch in -lcurses... " >&6; } if ${ac_cv_lib_curses_wadd_wch+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char wadd_wch (); int main () { return wadd_wch (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curses_wadd_wch=yes else ac_cv_lib_curses_wadd_wch=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_wadd_wch" >&5 $as_echo "$ac_cv_lib_curses_wadd_wch" >&6; } if test "x$ac_cv_lib_curses_wadd_wch" = xyes; then : $as_echo "#define CURSES_WIDE 1" >>confdefs.h Cw=1 fi else echo "What??? " fi if test "$Cw" != "1" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Wide curses not found -- c3270 will not be able to support multi-byte character encodings" >&5 $as_echo "$as_me: WARNING: Wide curses not found -- c3270 will not be able to support multi-byte character encodings" >&2;} fi # Extract the first word of "less", so it can be a program name with args. set dummy less; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LESSPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $LESSPATH in [\\/]* | ?:[\\/]*) ac_cv_path_LESSPATH="$LESSPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LESSPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LESSPATH=$ac_cv_path_LESSPATH if test -n "$LESSPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LESSPATH" >&5 $as_echo "$LESSPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat >>confdefs.h <<_ACEOF #define LESSPATH "$LESSPATH" _ACEOF # Extract the first word of "more", so it can be a program name with args. set dummy more; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MOREPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $MOREPATH in [\\/]* | ?:[\\/]*) ac_cv_path_MOREPATH="$MOREPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MOREPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MOREPATH=$ac_cv_path_MOREPATH if test -n "$MOREPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOREPATH" >&5 $as_echo "$MOREPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat >>confdefs.h <<_ACEOF #define MOREPATH "$MOREPATH" _ACEOF LIBX3270DIR='${sysconfdir}/x3270' # Check whether --enable-dbcs was given. if test "${enable_dbcs+set}" = set; then : enableval=$enable_dbcs; fi case "$enable_dbcs" in no) ;; *) $as_echo "#define X3270_DBCS 1" >>confdefs.h DBCS=-DX3270_DBCS=1 ;; esac # Check whether --enable-local_process was given. if test "${enable_local_process+set}" = set; then : enableval=$enable_local_process; fi case "$enable_local_process" in ""|yes) $as_echo "#define X3270_LOCAL_PROCESS 1" >>confdefs.h ;; esac # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi case "$enable_ipv6" in ""|yes) $as_echo "#define X3270_IPV6 1" >>confdefs.h ;; esac ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by c3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ c3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ac_config_files="$ac_config_files Makefile.obj" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by c3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ c3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile.obj") CONFIG_FILES="$CONFIG_FILES Makefile.obj" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/c3270/configure.in0000664000076500007650000001354613221577163014254 0ustar pdmpdmdnl Copyright (c) 2000-2017, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl Process this file with autoconf to produce a configure script. AC_INIT(c3270,3.x) AC_PREREQ(2.50) AC_CONFIG_HEADER(conf.h) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_CC dnl Figure out what sort of host this is. dnl If it's hpux, then pass the -D_XOPEN_SOURCE_EXTENDED flag to cc, so that dnl all of the curses KEY_XXX definitions are visible. dnl If it's solaris2, then pass the -D__EXTENSIONS__ flas to cc, so that all dnl of the usual Unix functions are visible. ansi="-std=c99 -pedantic" AC_CANONICAL_HOST case "$host_os" in *cygwin*) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED dnl On Cygwin, gcc -ansi or -std=xxx hides POSIX declarations, dnl and there is no macro you can set to get them back. ansi="" ;; hpux) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ;; solaris2*) CPPFLAGS="-D__EXTENSIONS__ -D_XOPEN_SOURCE_EXTENDED" ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ;; linux*) CPPFLAGS="-D_POSIX_SOURCE -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE" ;; aix*) BROKEN_NEWTERM=1 ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi AC_SUBST(host) AC_SUBST(BROKEN_NEWTERM) AC_SUBST(CCOPTIONS) dnl Checks for header files. AC_CHECK_HEADERS(sys/select.h) if test "$with_readline" != no; then AC_CHECK_HEADERS(readline/history.h) fi AC_CHECK_HEADERS(pty.h) AC_CHECK_HEADERS(libutil.h) AC_CHECK_HEADERS(util.h) AC_CHECK_HEADERS(getopt.h) dnl Find the best curses header file and hope it's consistent with the library dnl we found. AC_CHECK_HEADERS(ncursesw/ncurses.h, , [AC_CHECK_HEADERS(ncurses/ncurses.h, , [AC_CHECK_HEADERS(ncurses.h, , [AC_CHECK_HEADERS(curses.h, , [AC_MSG_ERROR(No curses header file)])])])]) AC_CHECK_HEADERS(ncursesw/term.h, , [AC_CHECK_HEADERS(ncurses/term.h, , [AC_CHECK_HEADERS(term.h)])]) dnl Check for --without-readline AC_ARG_WITH(readline, [ --without-readline Don't use the readline library]) dnl Check for libraries. dnl Note that the order here is important. The last libraries should appear dnl first, so that objects in them can be used by subsequent libraries. AC_SEARCH_LIBS(forkpty, util) AC_CHECK_FUNCS(forkpty) AC_CHECK_LIB(ncursesw, newterm, , [AC_CHECK_LIB(ncurses, newterm, , [AC_CHECK_LIB(curses, newterm, , [AC_MSG_ERROR(Can't find libncurses or new-enough libcurses)])])]) if test "$with_readline" != no; then AC_CHECK_LIB(readline, rl_initialize) fi AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket) dnl If we're on AIX and have ncurses, cancel BROKEN_NEWTERM. if test -n "$BROKEN_NEWTERM" then if test "$ac_cv_lib_ncurses_newterm" = yes then : else AC_DEFINE(BROKEN_NEWTERM,1) fi fi dnl Check for the ncurses default-color extensions. AC_CHECK_FUNCS(use_default_colors) dnl Checks for library functions. AC_CHECK_FUNCS(vasprintf) AC_FUNC_FSEEKO dnl Check for curses wide character support. if test "$ac_cv_lib_ncursesw_newterm" = yes then AC_CHECK_LIB(ncursesw, wadd_wch, [AC_DEFINE(CURSES_WIDE,1) Cw=1]) elif test "$ac_cv_lib_ncurses_newterm" = yes then AC_CHECK_LIB(ncurses, wadd_wch, [AC_DEFINE(CURSES_WIDE,1) Cw=1]) elif test "$ac_cv_lib_curses_newterm" = yes then AC_CHECK_LIB(curses, wadd_wch, [AC_DEFINE(CURSES_WIDE,1) Cw=1]) else echo "What??? " fi if test "$Cw" != "1" then AC_MSG_WARN(Wide curses not found -- c3270 will not be able to support multi-byte character encodings) fi AC_SUBST(CURSES_WIDE) dnl Check for default pager AC_PATH_PROG(LESSPATH, less) AC_DEFINE_UNQUOTED(LESSPATH,"$LESSPATH") AC_PATH_PROG(MOREPATH, more) AC_DEFINE_UNQUOTED(MOREPATH,"$MOREPATH") dnl Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' AC_SUBST(LIBX3270DIR) dnl Check for unwanted parts. AC_ARG_ENABLE(dbcs,[ --disable-dbcs leave out DBCS support]) case "$enable_dbcs" in no) ;; *) AC_DEFINE(X3270_DBCS,1) DBCS=-DX3270_DBCS=1 ;; esac AC_SUBST(DBCS) AC_ARG_ENABLE(local_process,[ --disable-local-process leave out local process support]) case "$enable_local_process" in ""|yes) AC_DEFINE(X3270_LOCAL_PROCESS,1) ;; esac AC_ARG_ENABLE(ipv6,[ --disable-ipv6 leave out IPv6 support]) case "$enable_ipv6" in ""|yes) AC_DEFINE(X3270_IPV6,1) ;; esac dnl Generate the Makefile. AC_OUTPUT(Makefile) AC_OUTPUT(Makefile.obj) suite3270-3.6/c3270/documentation-ssl-body.html0000664000076500007650000002056613221577163017234 0ustar pdmpdm

x3270 and TLS

x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

TLS on Unix (except MacOS)

On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

A Note on PEM Format

PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

  -----BEGIN CERTIFICATE-----

A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

Options and Resources

TLS is controlled by a number of different command-line options and resources.

Specifying the Server's Root Certificate

If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

Updating the Root Certificate Database

To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

Specifying a Certificate for the Client (the Emulator)

If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

Specifying the Private Key for the Client Certificate

The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

Controlling Host Certificate Verification

By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

TLS on MacOS

On MacOS, x3270 uses Secure Transport for TLS.

Options and Resources

TLS is controlled by a number of different command-line options and resources.

Specifying a Certificate for the Client (the Emulator)

The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

Specifying a Password for the Client Certificate File

If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

Controlling Host Certificate Verification

By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

TLS on Windows

wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

Options and Resources

TLS is controlled by a number of different command-line options and resources.

Specifying a Certificate for the Client (the Emulator)

The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

Controlling Host Certificate Verification

By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/c3270/ft.inc0000664000076500007650000001355013221577163013042 0ustar pdmpdmXX_SH(File Transfer) The XX_FB(Transfer) XX_action implements XX_FB(IND$FILE) file transfer. This XX_action requires that the XX_FB(IND$FILE) program be installed on the XX_SM(IBM) host, and that the 3270 cursor be located in a field that will accept a XX_SM(TSO) or XX_SM(VM/CMS) command. XX_LP ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`The XX_FB(Transfer) XX_action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. ')dnl XX_LP Because of the complexity and number of options for file transfer, the parameters to the XX_FB(Transfer) XX_action take the unique form of XX_FI(option)=XX_FI(value), and can appear in any order. Note that if the XX_FI(value) contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: XX_LP XX_TS(4,l c l l.) XX_TR(XX_TD(Option) XX_TD(Required?) XX_TD(Default) XX_TD(Other Values)) XX_T_() XX_TR(XX_TD(Direction) XX_TD(No) XX_TD(receive) XX_TD(send)) XX_TR(XX_TD(HostFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(LocalFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Host) XX_TD(No) XX_TD(tso) `XX_TD(`vm, cics')') XX_TR(XX_TD(Mode) XX_TD(No) XX_TD(ascii) XX_TD(binary)) XX_TR(XX_TD(Cr) XX_TD(No) XX_TD(remove) `XX_TD(`add, keep')') XX_TR(XX_TD(Remap) XX_TD(No) XX_TD(yes) XX_TD(no)) XX_TR(XX_TD(Exist) XX_TD(No) XX_TD(keep) `XX_TD(`replace, append')') XX_TR(XX_TD(Recfm) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`fixed, variable, undefined')') XX_TR(XX_TD(Lrecl) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Blksize) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Allocation) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`tracks, cylinders, avblock')') XX_TR(XX_TD(PrimarySpace) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(SecondarySpace) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Avblock) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(BufferSize) XX_TD(No) XX_TD(4096) XX_TD(XX_NBSP)) XX_TE() XX_LP The option details are as follows. XX_TPS()dnl XX_TP(XX_FB(Direction)) XX_FB(send) to send a file to the host, XX_FB(receive) to receive a file from the host. XX_TP(XX_FB(HostFile)) The name of the file on the host. XX_TP(XX_FB(LocalFile)) The name of the file on the local workstation. XX_TP(XX_FB(Host)) The type of host (which dictates the form of the XX_FB(IND$FILE) command): XX_FB(tso) (the default), XX_FB(vm) or XX_FB(cics). XX_TP(XX_FB(Mode)) Use XX_FB(ascii) (the default) for a text file, which will be translated between XX_SM(EBCDIC) and XX_SM(ASCII) as necessary. Use XX_FB(binary) for non-text files. XX_TP(XX_FB(Cr)) Controls how XX_FB(Newline) characters are handled when transferring XX_FB(Mode=ascii) files. XX_FB(remove) (the default) strips XX_FB(Newline) characters in local files before transferring them to the host. XX_FB(add) adds XX_FB(Newline) characters to each host file record before transferring it to the local workstation. XX_FB(keep) preserves XX_FB(Newline) characters when transferring a local file to the host. XX_TP(XX_FB(Remap)) Controls text translation for XX_FB(Mode=ascii) files. The value XX_FB(yes) (the default) causes XX_PRODUCT to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's XX_SM(EBCDIC) code page. The value XX_FB(no) causes XX_PRODUCT to pass the text to or from the host as-is, leaving all translation to the XX_FB(IND$FILE) program on the host. XX_TP(XX_FB(Exist)) Controls what happens when the destination file already exists. XX_FB(keep) (the default) preserves the file, causing the XX_FB(Transfer) XX_action to fail. XX_FB(replace) overwrites the destination file with the source file. XX_FB(append) appends the source file to the destination file. XX_TP(XX_FB(Recfm)) Controls the record format of files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_FB(fixed) creates a file with fixed-length records. XX_FB(variable) creates a file with variable-length records. XX_FB(undefined) creates a file with undefined-length records (XX_SM(TSO) hosts only). The XX_FB(Lrecl) option controls the record length or maximum record length for XX_FB(Recfm=fixed) and XX_FB(Recfm=variable) files, respectively. XX_TP(XX_FB(Lrecl)) Specifies the record length (or maximum record length) for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Blksize)) Specifies the block size for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Allocation)) Specifies the units for the XX_FB(PrimarySpace) and XX_FB(SecondarySpace) options: XX_FB(tracks), XX_FB(cylinders) or XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(PrimarySpace)) Primary allocation for a file. The units are given by the XX_FB(Allocation) option. Required when the XX_FB(Allocation) is specified as something other than XX_FB(default). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(SecondarySpace)) Secondary allocation for a file. The units are given by the XX_FB(Allocation) option. (XX_SM(TSO) hosts only.) XX_TP(XX_FB(Avblock)) Average block size, required when XX_FB(Allocation) specifies XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(BufferSize)) Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(WindowsCodePage)) Overrides the workstation code page used for XX_SM(ASCII) file transfers. By default, the system XX_SM(ANSI) code page is used. ')dnl XX_TPE()dnl XX_LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the XX_FB(Transfer) keywords, but with XX_FB(ft) prepended. E.g., the default for the XX_FB(Mode) keyword is the XX_FB(XX_PRODUCT.ftMode) resource. suite3270-3.6/c3270/hostname.inc0000664000076500007650000000600213221577163014241 0ustar pdmpdmThe full syntax for XX_FI(host) is: XX_RS([XX_FI(prefix):]...[XX_FI(LUname)@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)]) ifelse(XX_PRODUCT,wc3270,,`XX_LP Prepending a XX_FB(P:) onto XX_FI(hostname) causes the connection to go through the XX_FI(telnet-passthru) service rather than directly to the host. See XX_LINK(#Passthru,XX_SM(PASSTHRU)) below. ')dnl XX_LP Prepending an XX_FB(S:) onto XX_FI(hostname) removes the "extended data stream" option reported to the host. See XX_LINK(#tn,XX_FB(XX_DASHED(tn))) below for further information. XX_LP Prepending an XX_FB(N:) onto XX_FI(hostname) turns off TN3270E support for the session. XX_LP Prepending an XX_FB(L:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if XX_FB(XX_PRODUCT) was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the XX_FB(L:) prefix should not be used. XX_LP Prepending a XX_FB(Y:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. XX_LP Prepending an XX_FB(A:) onto XX_FI(hostname) is equivalent to setting the XX_FB(XX_DASHED(nvt)) option; it forces an NVT-mode session instead of a 3270-mode session. XX_LP A specific Logical Unit (LU) name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) XX_LP The XX_FI(hostname) may optionally be placed inside square-bracket characters XX_DQUOTED(XX_FB([)) and XX_DQUOTED(XX_FB(])). This will prevent any colon XX_DQUOTED(XX_FB(:)) characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. ifelse(XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_LP On systems that support the XX_FI(forkpty) library call, the XX_FI(hostname) may be replaced with XX_FB(XX_DASHED(e)) and a command string. This will cause XX_FB(XX_PRODUCT) to connect to a local child process, such as a shell. ')dnl XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden with the XX_FB(XX_DASHED(port)) option, or by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). (For compatability with previous versions of XX_FB(XX_PRODUCT) and with XX_FI(tn3270)(1), the XX_FI(port) may also be specified as a second, separate argument.) XX_LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (XX_DQUOTED(XX_FB(=))). The accept name can also be specified with the XX_FB(XX_DASHED(accepthostname)) option. suite3270-3.6/c3270/html/Bugs.html0000664000076500007650000000075213221577163014470 0ustar pdmpdm Known Bugs in c3270 3.3

Known Bugs in c3270 3.3.6

(none)

If you discover any other problems in c3270, please contact Paul Mattes.

suite3270-3.6/c3270/html/c3270-man.html0000664000076500007650000021454013221600611015062 0ustar pdmpdm c3270 Manual Page

c3270 Manual Page

Contents

Name
Synopsis
Description
Options
Modes
Character Sets
Menu Bar and Keypad
Hosts Database
NVT Mode
Toggles
Status Line
Actions
Keymaps
The Meta or Alt Key
File Transfer
The PrintText Action
Scripts
Composite Characters
Printer Session Support
Passthru
Proxy
Screen Size Switching
Resources
Files
See Also
Copyrights
Version

Name

c3270 - curses-based IBM host access tool

Synopsis

c3270 [options] [host]
c3270 [options] session-file.c3270

Description

c3270 opens a telnet connection to an IBM host in a console window. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. If the console is capable of displaying colors, then c3270 emulates an IBM 3279. Otherwise, it emulates a 3278. The full syntax for host is:
[prefix:]...[LUname@]hostname[:port][=accept]

Prepending a P: onto hostname causes the connection to go through the telnet-passthru service rather than directly to the host. See PASSTHRU below.

Prepending an S: onto hostname removes the "extended data stream" option reported to the host. See -tn below for further information.

Prepending an N: onto hostname turns off TN3270E support for the session.

Prepending an L: onto hostname causes c3270 to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if c3270 was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the L: prefix should not be used.

Prepending a Y: onto hostname causes c3270 to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options.

Prepending an A: onto hostname is equivalent to setting the -nvt option; it forces an NVT-mode session instead of a 3270-mode session.

A specific Logical Unit (LU) name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.)

The hostname may optionally be placed inside square-bracket characters `[' and `]'. This will prevent any colon `:' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames.

On systems that support the forkpty library call, the hostname may be replaced with -e and a command string. This will cause c3270 to connect to a local child process, such as a shell.

The port to connect to defaults to telnet. This can be overridden with the -port option, or by appending a port to the hostname with a colon `:'. (For compatability with previous versions of c3270 and with tn3270(1), the port may also be specified as a second, separate argument.)

An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`='). The accept name can also be specified with the -accepthostname option.

Options

c3270 understands the following options:
-accepthostname name
Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
-allbold
Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays.
-altscreen rowsxcols=init_string
Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See SCREEN SIZE SWITCHING, below.
-cadir directory
Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
-cafile filename
Specifies a PEM-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
-cbreak
Causes c3270 to operate in cbreak mode, instead of raw mode. In cbreak mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for interrupt, quit, and lnext (usually ^C, ^\ and ^V respectively) will be seen by c3270 only if preceded by the lnext character. The susp character (usually ^Z) cannot be seen by c3270 at all.
-certfile filename
Specifies a file containing a client certificate to provide to the host. The default file type is PEM.
-clientcert name
Specifies the name of a client certificate to provide to the host. (MacOS only)
-certfiletype type
Specifies the type of the certificate file specified by -certfile. Type can be pem or asn1. (OpenSSL only)
-chainfile filename
Specifies a certificate chain file in PEM format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If -chainfile is specified, it overrides -certfile. (OpenSSL only)
-charset name
Specifies an EBCDIC host character set. See CHARACTER SETS below.
-clear toggle
Sets the initial value of toggle to false. The list of toggle names is under TOGGLES below.
-connecttimeout seconds
Specifies the time that c3270 will wait for a host connection to complete.
-defaultfgbg
Causes c3270 to use the terminal's default foreground color instead of the curses color black, and the terminal's default background color instead of the curses color white. This is helpful for emulators such as gnome-terminal whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable COLORTERM is set to gnome-terminal. It is available only if c3270 was compiled with a version of ncurses that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability.
-defscreen rowsxcols=init_string
Defines the dimensions and escape sequence for the default (80-column) screen mode. See SCREEN SIZE SWITCHING, below.
-devname name
Specifies a device name (workstation ID) for RFC 4777 support.
-hostsfile file
Uses file as the hosts file, which allows aliases for host names and scripts to be executed at login. See ibm_hosts(1) for details.
-httpd [addr:]port
Specifies a port and optional address to listen on for HTTP connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080.

Note that this option is mutually-exclusive with the -scriptport option .

-keyfile filename
Specifies a file containing the private key for the certificate file (specified via -certfile or -chainfile). The default file type is PEM. (OpenSSL only)
-keyfiletype type
Specifies the type of the private key file specified by -keyfile. Type can be pem or asn1. (OpenSSL only)
-keypasswd type:value
Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be file:filename, specifying that the password is in a file, or string:string, specifying the password on the command-line directly. If the private key file is encrypted and no -keypasswd option is given, the password will be prompted for interactively.
-keymap name
Specifies a keyboard map to be found in the resource c3270.keymap.name or the file name. See KEYMAPS below for details.
-km name
Specifies the local encoding method for multi-byte text. name is an encoding name recognized by the ICU library. (Supported only when c3270 is compiled with DBCS support, and necessary only when c3270 cannot figure it out from the locale.)
-loginmacro Action(arg...) ...
Specifies a macro to run at login time.
-model name
The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted:

The first part is the base model, which is either 3278 or 3279. 3278 specifies a monochrome (green on black) 3270 display; 3279 specifies a color 3270 display.

The second part is the model number, which specifies the number of rows and columns. Model 4 is the default.

Model Number
Columns
Rows
2
80
24
3
80
32
4
80
43
5
132
27

Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway.

The default model for a color display is 3279-4. For a monochrome display, it is 3278-4.

-mono
Prevents c3270 from using color, ignoring any color capabilities reported by the terminal.
-noprompt
An alias for -secure.
-noverifycert
For SSL/TLS connections, do not verify the host certificate.
-nvt
Start in NVT mode instead of waiting for the host to send data, and make the default terminal type xterm.
-oversize colsxrows
Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "c3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing.

It can also be specified as auto, which causes c3270 to fill the entire terminal or console window.

-port n
Specifies a different TCP port to connect to. n can be a name from /etc/services like telnet, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.)
-proxy type:host[:port]
Causes c3270 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
-printerlu luname
Causes c3270 to automatically start a pr3287 printer session. If luname is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session.
-reconnect
Causes c3270 to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line.
-rv
Switches c3270 from a white-on-black display to a black-on-white display.
-sl n
Specifies that n lines should be saved for scrolling back. The default is 4096.
-scriptport [addr:]port
Specifies a port and optional address to listen on for scripting connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081.

Note that this option is mutually-exclusive with the -httpd option .

-scriptportonce
Allows c3270 to accept only one script connection. When that connection is broken, c3270 will exit.
-secure
Disables the interactive c3270> prompt. When used, a hostname must be provided on the command line.
-set toggle
Sets the initial value of toggle to true. The list of toggle names is under TOGGLES below.
-socket
Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named /tmp/x3sck.pid. The -p option of x3270if causes it to use this socket, instead of pipes specified by environment variables.
-tn name
Specifies the terminal name to be transmitted over the telnet connection. The default name is IBM-model_name-E, for example, IBM-3279-4-E for a color display, or IBM-3278-4-E for a monochrome display.

Some hosts are confused by the -E suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an s: on the hostname, or setting the "c3270.extended" resource to "false", removes the -E from the terminal name when connecting to such hosts.

The name can also be specified with the "c3270.termName" resource.

-trace
Turns on data stream and event tracing at startup. The default trace file name is /tmp/x3trc.
-tracefile file
Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file.
-tracefilesize size
Places a limit on the size of a trace file. If this option is not specified, or is specified as 0 or none, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of size can have a K or M suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started.
-user name
Specifies the user name for RFC 4777 support.
-utf8
Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage.
-v
Display the version and build options for c3270 and exit.
-verifycert
For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a y: prepended to the hostname when connecting.
-xrm "c3270.resource: value"
Sets the value of the named resource to value. Resources control less common c3270 options, and are defined under RESOURCES below.

Modes

c3270 has two basic modes: command-prompt and session.

Command-prompt mode is where the c3270> prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit c3270, etc. The complete list of interactive commands is listed under ACTIONS.

Session mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host.

To switch from display mode to command-prompt mode, press Ctrl-]. To switch from command-prompt mode to display mode, press Enter (without entering a command) at the c3270> prompt.

Character Sets

The -charset option or the "c3270.charset" resource controls the EBCDIC host character set used by c3270. Available sets include:

Charset Name
Host Code Page
Display Character Set
belgian
500
iso8859-1
belgian-euro
1148
iso8859-15
bracket
037
iso8859-1
brazilian
275
iso8859-1
chinese-gb18030
1388
iso8859-1 + iso10646-1
cp1047
1047
iso8859-1
cp870
870
iso8859-2
finnish
278
iso8859-1
finnish-euro
1143
iso8859-15
french
297
iso8859-1
french-euro
1147
iso8859-15
german
273
iso8859-1
german-euro
1141
iso8859-15
greek
423
iso8859-7
hebrew
424
iso8859-8
icelandic
871
iso8859-1
icelandic-euro
1149
iso8859-15
italian
280
iso8859-1
italian-euro
1144
iso8859-15
japanese-kana
930
jisx0201.1976-0 + jisx0208.1983-0
japanese-latin
939
jisx0201.1976-0 + jisx0208.1983-0
norwegian
277
iso8859-1
norwegian-euro
1142
iso8859-15
russian
880
koi8-r
simplified-chinese
935
iso8859-1 + gb2312.1980-0
slovenian
870
iso8859-2
spanish
284
iso8859-1
spanish-euro
1145
iso8859-15
swedish
278
iso8859-1
swedish-euro
1143
iso8859-15
thai
1160
iso8859-11 tis620.2529-0
traditional-chinese
937
iso8859-1 + Big5-0
turkish
1026
iso8859-9
uk
285
iso8859-1
uk-euro
1146
iso8859-15
us-euro
1140
iso8859-15
us-intl
037
iso8859-1

The default character set is bracket, which is useful for common U.S. IBM hosts which use EBCDIC codes AD and BD for the `[' and `]' characters, respectively.

Note that any of the host code pages listed above can be specified by adding cp to the host code page, e.g., cp037 for host code page 037. Also note that the code pages available for a given version of c3270 are displayed by the -v command-line option.

Menu Bar and Keypad

c3270 supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the c3270> prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen.

The on-screen menu title bar can be turned off via the "c3270.menuBar" resource.

The pop-up keypad allows the 3270-specific keys (PF keys, PA keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the c3270> prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option.

Hosts Database

c3270 uses the ibm_hosts database to define aliases for host names, and to specify macros to be executed when a connection is first made. See ibm_hosts(5) for details.

You may specify a different ibm_hosts database with the "c3270.hostsFile" resource.

NVT Mode

Some hosts use an ASCII front-end to do initial login negotiation, then later switch to 3270 mode. c3270 will emulate an ANSI X3.64 terminal until the host places it in 3270 mode (telnet BINARY and SEND EOR modes, or TN3270E mode negotiation).

If the host later negotiates to stop functioning in 3270 mode, c3270 will return to NVT emulation.

In NVT mode, c3270 supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources:

Mode/Character Resource Default
Translate CR to NL c3270.icrnl true
Translate NL to CR c3270.inlcr false
Erase previous character c3270.erase ^?
Erase entire line c3270.kill ^U
Erase previous word c3270.werase ^W
Redisplay line c3270.rprnt ^R
Ignore special meaning of next character c3270.lnext ^V
Interrupt c3270.intr ^C
Quit c3270.quit ^\
End of file c3270.eof ^D

Separate keymaps can be defined for use only when c3270 is in 3270 mode or NVT mode. See KEYMAPS for details.

Toggles

c3270 has a number of configurable modes which may be selected by the -set and -clear options. These names can also be used as the first parameter to the Toggle action, and are the names of resources that can be used to set or clear the value of each toggle at start-up.
aidWait
Changes the behavior of actions that send an AID to the host (Enter, Clear, PA and PF). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the Wait(Unlock) action to wait for the unlock.
altCursor
If set, the cursor will be an underline. If clear, it will be a solid block.
blankFill
If set, c3270 modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying `lock-up' that often occurs when inserting into an field with (apparent) space at the end.
crosshair
When set, c3270 will display a crosshair to help locate the cursor on the screen.
lineWrap
If set, the NVT terminal emulator automatically assumes a NEWLINE character when it reaches the end of a line.
monoCase
If set, c3270 operates in uppercase-only mode.
screenTrace
Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file .
showTiming
If set, the time taken by the host to process an AID is displayed on the status line.
trace
Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file . The directory for the trace file can be changed with the "c3270.traceDir" resource. Script commands are also traced.
underscore
If set, c3270 will display underlined fields by substituting underscore `_' characters for blanks or nulls in the field. Otherwise, these fields will be displayed using the terminal's native underlining mode, if one is defined.
visibleControl
If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes `<', SI becomes `>'. Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in reverse-video yellow. Field attribute mappings are part of the c3270 Resources documentation for the visibleControl resource.

Status Line

If the terminal that c3270 is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), c3270 will display a status line. The c3270 status line contains a variety of information. From left to right, the fields are:
comm status
The first symbol is always a 4. If c3270 is in TN3270E mode, the second symbol is a B; otherwise it is an A. If c3270 is in SSCP-LU mode, the third symbol is an S. Otherwise it is blank.
keyboard lock
If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock.
typeahead
The letter "T" indicates that one or more keystrokes are in the typeahead buffer.
temporary keymap
The letter "K" indicates that a temporary keymap is in effect.
reverse
The letter "R" indicates that the keyboard is in reverse field entry mode.
insert mode
The letter "I" indicates that the keyboard is in insert mode.
printer session
The letter "P" indicates that a pr3287 session is active.
secure connection
A green letter "S" indicates that the connection is secured via SSL/TLS.
LU name
The LU name associated with the session, if there is one.
cursor position
The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0.

Actions

Here is a complete list of basic c3270 actions. Script-specific actions are described on the x3270-script(1) manual page. )

Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response.

*Attn attention key
BackSpace move cursor left (or send ASCII BS)
BackTab tab to start of previous input field
CircumNot input "^" in NVT mode, or "¬" in 3270 mode
*Clear clear screen
Compose next two keys form a special symbol
*Connect(host) connect to host
*CursorSelect Cursor Select AID
Delete delete character under cursor (or send ASCII DEL)
DeleteField delete the entire field
DeleteWord delete the current or previous word
*Disconnect disconnect from host
Down move cursor down
Dup duplicate field
*Enter Enter AID (or send ASCII CR)
Erase erase previous character (or send ASCII BS)
EraseEOF erase to end of current field
EraseInput erase all input fields
Escape escape to c3270> prompt
Execute(cmd) execute a command in a shell
FieldEnd move cursor to end of field
FieldMark mark field
HexString(hex_digits) insert control-character string
Home move cursor to first input field
Insert set insert mode
*Interrupt send TELNET IP to host
Keypad Display pop-up keypad
Key(keysym) insert key keysym
Key(0xxx) insert key with character code xx
Left move cursor left
Left2 move cursor left 2 positions
Menu Display menu bar
MonoCase toggle uppercase-only mode
MoveCursor(row, col) move cursor to zero-origin (row,col)
Newline move cursor to first field on next line (or send ASCII LF)
NextWord move cursor to next word
*PA(n) Program Attention AID (n from 1 to 3)
*PF(n) Program Function AID (n from 1 to 24)
PreviousWord move cursor to previous word
Printer(Start[,lu]|Stop) start or stop printer session
PrintText(command) print screen text on printer
Quit exit c3270
Redraw redraw window
Reset reset locked keyboard
Right move cursor right
Right2 move cursor right 2 positions
*Script(command[,arg...]) run a script
Scroll(Forward|Backward) scroll screen
*String(string) insert string (simple macro facility)
Tab move cursor to next input field
Toggle(option[,set|clear]) toggle an option
ToggleInsert toggle insert mode
ToggleReverse toggle reverse-input mode
*Transfer(option=value...') file transfer
Up move cursor up
ignore do nothing

Any of the above actions may be entered at the c3270> prompt; these commands are also available for use in keymaps (see KEYMAPS). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.:

PF(1)
or with spaces, e.g.:
PF 1
Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used.

c3270 also supports the following interactive commands:

Help
Displays a list of available commands.
ScreenTrace
Turns screen tracing (saving screen images to a file) on or off. The command screentrace on enables screen tracing; the command screentrace off disables it. After on, a filename may be specified to override the default trace file name of /tmp/x3scr.pid. The keyaord on can also be followed by the keyword printer and an optional print command to direct screen traces directly to the printer.
Show
Displays statistics and settings.
Trace
Turns tracing on or off. The command trace on enables data stream and keyboard event tracing; the command trace off disables it. The qualifier data or keyboard can be specified before on or off to enable or disable a particular trace. After on, a filename may be specified to override the default trace file name of /tmp/x3trc.pid.

Note that certain parameters to c3270 actions (such as the names of files and keymaps) are subject to substitutions:

The character ~ at the beginning of a string is replaced with the user's home directory. A ~ character followed by a username is replaced with that user's home directory.

Environment variables are substituted using the Unix shell convention of $name or ${name}.

Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names.

Keymaps

The -keymap option or the c3270.keymap resource allow a custom keymap to be specified. If the option -keymap xxx is given (or the c3270.keymap resource has the value xxx), c3270 will look for a resource named c3270.keymap.xxx. If no resource definition is found, it will look for a file named xxx.

Multiple keymaps may be specified be separating their names with commas. Definitions in later keymaps supercede those in earlier keymaps.

In addition, separate keymaps may be defined that apply only in 3270 mode or NVT mode. For example, the resource definition c3270.keymap.xxx.nvt or the file xxx.nvt will augment the definition of keymap xxx in NVT mode. Similarly, the resource definition c3270.keymap.xxx.3270 or the file xxx.3270 will augment the definition of keymap xxx in 3270 mode.

Temporary keymaps can also be added or removed while c3270 is running with the Keymap action. See x3270-script(1) for details.

Each line (rule) in a keymap specifies actions to perform when a particular key or sequence of keys is pressed. Keymap rules have the following syntax:

[Meta][Ctrl]<Key>key...: action[(param[,...])] ...

Here is a sample keymap definition from a file:

! Lines beginning with ! are ignored and can
! occur anywhere.
! Definition of keymap xxx
!  When Alt-c is pressed, clear the screen.
Alt<Key>c: Clear()
!  When PageUp is pressed, send PF7 to the host.
<Key>PPAGE: PF(7)
!  When Ctrl-a is pressed, then F1, send PF13
!  to the host.
Ctrl<Key>a <Key>F1: PF(13)

Here is the same definition as a resource:

! Lines beginning with ! are ignored, but NOT
! within a definition.
! Note that the \ is required at the end of the
! first line, and \n\ is
! required at the end of every other line except
! the last.
! Definition of keymap xxx
c3270.keymap.xxx: \
 Alt<Key>c: Clear() \n\
 <Key>PPAGE: PF(7) \n\
 Ctrl<Key>A <Key>F1: PF(13)

The optional Alt or Ctrl modifiers specify that the Alt and Ctrl keys are pressed along with the specified key, respectively. Key is either an ISO 8859-1 symbol name, such as equal for `=' and a for `a', or a symbolic ncurses key name, such as UP. More than one key can be specified, indicating that a sequence of keys must be pressed in order for the rule to be matched. The action is an action from the ACTIONS list above. More than one action may be specified; they will be executed in order.

Keymap entries are case-sensitive and modifier-specific. This means that a keymap for the b key will match only a lowercase b. Actions for uppercase B, or for Alt-B, must be specified separately.

The base keymap is:

Key Action
Ctrl<Key>] Escape
Ctrl<Key>a Ctrl<Key>a Key(0x01)
Ctrl<Key>a Ctrl<Key>] Key(0x1d)
Ctrl<Key>a <Key>Tab BackTab
Ctrl<Key>a <Key>c Clear
Ctrl<Key>a <Key>e Escape
Ctrl<Key>a <Key>r Reset
Ctrl<Key>a <Key>k Keypad
Ctrl<Key>a <Key>l Redraw
Ctrl<Key>a <Key>m Compose
Ctrl<Key>a <Key>n Menu
Ctrl<Key>a <Key>p PrintText
Ctrl<Key>a <Key>^ Key(notsign)
Ctrl<Key>k Keypad
Ctrl<Key>n Menu
<Key>UP Up
<Key>DOWN Down
<Key>LEFT Left
<Key>RIGHT Right
<Key>F(n) PF(n)
Ctrl<Key>a <Key>F(n) PF(n+12)
Ctrl<Key>a <Key>1 PA(1)
Ctrl<Key>a <Key>2 PA(2)
Ctrl<Key>a <Key>3 PA(3)
<Key>PPAGE Scroll(Backward)
<Key>NPAGE Scroll(Forward)

The base 3270-mode keymap adds:

Key Action
Ctrl<Key>c Clear
Ctrl<Key>d Dup
Ctrl<Key>f FieldMark
Ctrl<Key>i Tab
Ctrl<Key>l Redraw
Ctrl<Key>r Reset
Ctrl<Key>u DeleteField
<Key>BackSpace BackSpace
<Key>Return Enter
<Key>Tab Tab
<Key>Linefeed Newline
<Key>BACKSPACE BackSpace
<Key>DC Delete
<Key>HOME Home
<Key>IC ToggleInsert

The Meta or Alt Key

Some keyboards do not have a Meta key. Instead, they have an Alt key. Sometimes this key acts as a proper Meta key, that is, it is a modifier key that sets the high-order bit (0x80) in the code that is transmitted for each key. Other keyboards send a two-character sequence when the Alt key is pressed with another key: the Escape character (0x1b), followed by the code for the other key.

The resource c3270.metaEscape and the termcap km attribute control how c3270 will interpret these sequences. When c3270.metaEscape is set to true, or when c3270.metaEscape is set to auto and the termcap km attribute is set, the keyboard is assumed to have a separate Meta key. The Escape key can be used as an ordinary data key and has no special meaning.

When c3270.metaEscape is set to true, or when c3270.metaEscape is set to auto and the termcap km attribute is not set, the keyboard is assumed to use the Escape character as a prefix to indicate that the following character is supposed to have the high-order bit set. When c3270 sees an Escape character from the keyboard, it sets a short timeout. If another character arrives before the timeout expires, then c3270 will combine the two characters, setting the high-order bit of the second. In an event trace file, the combined character is listed as derived. In a keymap, only the combined character or the Meta prefix may be used. The Escape key can still be used by itself, but only if there is a short pause before pressing another key.

The default value for c3270.metaEscape is auto.

File Transfer

The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

The Transfer action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer.

Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

Option Required? Default Other Values
Direction No receive send
HostFile Yes    
LocalFile Yes    
Host No tso vm, cics
Mode No ascii binary
Cr No remove add, keep
Remap No yes no
Exist No keep replace, append
Recfm No   fixed, variable, undefined
Lrecl No    
Blksize No    
Allocation No   tracks, cylinders, avblock
PrimarySpace Sometimes    
SecondarySpace No    
Avblock Sometimes    
BufferSize No 4096  

The option details are as follows.

Direction
send to send a file to the host, receive to receive a file from the host.
HostFile
The name of the file on the host.
LocalFile
The name of the file on the local workstation.
Host
The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
Mode
Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
Cr
Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
Remap
Controls text translation for Mode=ascii files. The value yes (the default) causes c3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes c3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
Exist
Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
Recfm
Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
Lrecl
Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
Blksize
Specifies the block size for files created on the host. (TSO and VM hosts only.)
Allocation
Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
PrimarySpace
Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
SecondarySpace
Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
Avblock
Average block size, required when Allocation specifies avblock. (TSO hosts only.)
BufferSize
Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.

There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the c3270.ftMode resource.

The PrintText Action

The PrintText produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., lpr.

Multiple arguments can include keywords to control the output of PrintText:

file filename
Save the output in a file.
html
Save the output as HTML. This option implies file.
rtf
Save the output as RichText. This option implies file. The font defaults to Courier New and the point size defaults to 8. These can be overridden by the printTextFont and printTextSize resources, respectively.
string
Return the output as a string. This can only be used from scripts.
modi
Render modified fields in italics.
caption text
Add the specified text as a caption above the output. Within text, the special sequence %T% will be replaced with a timestamp.
command command
Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer.

Scripts

There are several types of script functions available.
The String Action
The simplest method for scripting is provided via the String action. The arguments to String are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the AID code to the host, c3270 will wait for the host to unlock the keyboard before further processing the string.)
\b Left
\exxxx EBCDIC character in hex
\f Clear*
\n Enter*
\pan PA(n)*
\pfnn PF(nn)*
\r Newline
\t Tab
\T BackTab
\uxxxx Unicode character in hex
\xxxxx Unicode character in hex

Note that the numeric values for the \e, \u and \x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if c3270 is built with DBCS support and the host allows DBCS input in the current field.

An example keymap entry would be:

Meta<Key>p: String("probs clearrdr\n")

Note: The strings are in ASCII and converted to EBCDIC, so beware of inserting control codes.

There is also an alternate form of the String action, HexString, which is used to enter non-printing data. The argument to HexString is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent EBCDIC characters, which are entered into the current field. In NVT mode, the hexadecimal data represent ASCII characters, which are sent directly to the host.

The Script Action
This action causes c3270 to start a child process which can execute c3270 actions. Standard input and output from the child process are piped back to c3270. The Script action is fully documented in x3270-script(1).

Composite Characters

c3270 allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A C on the status line indicates a pending composite character.

The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "c3270.composeMap" resource; it gives the name of the map to use. The maps themselves are named "c3270.composeMap.name". The default is "latin1", which gives mappings for most of the symbols in the ISO 8859-1 Latin-1 character set that are not in the 7-bit ASCII character set.

Note: The default keymap defines Meta<Key>m as the "Compose" key. You may set up your own "Compose" key with a keymap that maps some other keysym onto the Compose action.

Printer Session Support

c3270 supports associated printer sessions via the pr3287(1) program. The Printer action is used to start or stop a pr3287 session.

The action Printer Start starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.)

The action Printer Start lu starts a printer session, associated with a specific lu.

The action Printer Stop stops a printer session.

The resource c3270.printer.options specifies extra options, such as -trace to pass to pr3287.

See pr3287(1) for further details.

The resource c3270.printerLu controls automatic printer session start-up. If it is set to `.', then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU.

Passthru

c3270 supports the Sun telnet-passthru service provided by the in.telnet-gw server. This allows outbound telnet connections through a firewall machine. When a p: is prepended to a hostname, c3270 acts much like the itelnet(1) command. It contacts the machine named internet-gateway at the port defined in /etc/services as telnet-passthru (which defaults to 3514). It then passes the requested hostname and port to the in.telnet-gw server.

Proxy

The -proxy option or the c3270.proxy resource causes c3270 to use a proxy server to connect to the host. The syntax of the option or resource is:
type:host[:port]
The supported values for type are:
Proxy Type
Protocol
Default Port
http
RFC 2817 HTTP tunnel (squid)
3128
passthru
Sun in.telnet-gw
none
socks4
SOCKS version 4
1080
socks5
SOCKS version 5 (RFC 1928)
1080
telnet
No protocol (just send connect host port)
none

The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

Screen Size Switching

When running as a 3270 Model 5, c3270 can take advantage of terminals that can switch between 80 and 132 column modes.

Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to c3270. These are specified with the -altscreen and -defscreen command-line options, or the altScreen and defScreen resources. -altscreen or altScreen defines the alternate (132-column) mode; -defscreen or defScreen defines the default (80-column) mode.

The syntax for the options and resources is rowsxcols=init_string, where rows and cols give the screen dimensions, and init_string is the escape sequence to transmit to the terminal to enter that mode. For defscreen, the minimum dimensions are 24 rows and 80 columns. For altscreen, the minimum dimensions are 27 rows and 132 columns. Within init_string, the usual escape sequences are supported (\E for escape, \r, \b, etc.). For example, the init string for a 132-column xterm is:

\E[?40h\E[?3h

Note: When defscreen and altscreen are specified, the model number is always set to 5.

Resources

Certain c3270 options can be configured via resources. Resources are defined in the file .c3270pro in the user's home directory, and by -xrm options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in c3270 are:

Resource Default Option Purpose
allBold Auto -allbold Display all characters bold
altScreen   -altscreen 132-col screen definition
blankFill False -set blankFill Blank Fill mode
charset bracket -charset EBCDIC character set
composeMap latin1   Name of composed-character map
cursesColorForHostColorn (note 6)   Color mapping
cursesColorForDefault green   Default color mapping
cursesColorForIntensified red   Default color mapping
cursesColorForProtected blue   Default color mapping
cursesColorForProtectedIntensified white   Default color mapping
cursesKeymap True   Set curses keymap option
defScreen   -defscreen 80-col screen definition
dbcsCgcsgid     Override DBCS CGCSGID
dsTrace False -trace Data stream tracing
eof ^D   NVT-mode EOF character
erase ^H   NVT-mode erase character
extended True   Use 3270 extended data stream
eventTrace False -trace Event tracing
hostsFile   -hostsfile Host alias/macro file
icrnl False   Map CR to NL on NVT-mode input
inlcr False   Map NL to CR in NVT-mode input
intr ^C   NVT-mode interrupt character
keymap   -keymap Keyboard map name
keymap.foo     Definition of keymap foo
kill ^U   NVT-mode kill character
lineWrap False -set lineWrap NVT line wrap mode
lnext ^V   NVT-mode lnext character
m3279 (note 1) -model 3279 (color) emulation
metaEscape Auto   Interpret ESC-x as Meta-x
mono (note 5) -mono Ignore terminal color capabilities
monoCase False -set monoCase Mono-case mode
noPrompt False -noprompt Disable command-prompt mode
numericLock False   Lock keyboard for numeric field error
oerrLock True   Lock keyboard for input error
oversize   -oversize Oversize screen dimensions
port telnet -port Non-default TCP port
printer.* (note 4)   Printer session config
printerLu (note 4)   Printer session config
quit ^\   NVT-mode quit character
reconnect False -reconnect Automatically reconnect to host
rprnt ^R   NVT-mode reprint character
sbcsCgcsgid     Override SBCS CGCSGID
secure False   Disable "dangerous" options
termName (note 2) -tn TELNET terminal type string
traceDir /tmp   Directory for trace files
traceFile (note 3) -tracefile File for trace output
typeahead True   Allow typeahead
werase ^W   NVT-mode word-erase character

Note 1: m3279 defaults to True if the terminal supports color, False otherwise. It can be forced to False with the proper -model option.

Note 2: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as IBM-3279-2-E. Note also that when TN3270E mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities.

Note 3: The default trace file is x3trc.pid in the directory specified by the traceDir resource.

Note 4: See PRINTER SUPPORT for details.

Note 5: mono defaults to false if the terminal supports at least 8 colors and to true otherwise.

Note 6: The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.

In .c3270pro, lines are continued with a backslash character.

-xrm options override definitions found in .c3270pro. If more than one -xrm option is given for the same resource, the last one on the command line is used.

Files

/usr/local/lib/x3270/ibm_hosts
$HOME/.c3270pro

See Also

pr3287(1), s3270(1), x3270-script(1), x3270(1), tcl3270(1), telnet(1), tn3270(1)
Data Stream Programmer's Reference, IBM GA23-0059
Character Set Reference, IBM GA27-3831
RFC 1576, TN3270 Current Practices
RFC 1646, TN3270 Extensions for LUname and Printer Selection
RFC 2355, TN3270 Enhancements

Copyrights

Copyright © 1993-2017, Paul Mattes.
Copyright © 2004-2005, Don Russell.
Copyright © 2004, Dick Altenbern.
Copyright © 1990, Jeff Sparkes.
Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

*
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
*
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
*
Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Version

c3270 3.6ga4
This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
Last modified 29 December 2017.
suite3270-3.6/c3270/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021235 0ustar pdmpdm

Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

Linux

  • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

Windows

  • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

MacOS

  • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

3.6 is the current development line for the x3270 suite.

Changes in version 3.6ga3, 29. December 2017

  • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
  • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
  • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

Changes in version 3.6beta2, 3. December 2017

  • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
  • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
  • [all] Added support for some missing xterm escape sequences.
  • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
  • [c3270, wc3270] Turn off the cursor when scrolled back.
  • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

Changes in version 3.6alpha1, 8. March 2017

  • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
  • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
  • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
  • The -disable-ssl configure option now applies to Windows.
  • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
  • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
  • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
  • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
  • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
  • [all] Added support for the Y: host modifier to disable host certificate checking.
  • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
  • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
  • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
  • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
  • [all Windows] Removed SSL configurations from the Visual Studio project.
  • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

Changes in version 3.5ga12, 10. September 2017

  • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

Changes in version 3.5ga11, 26. June 2017

  • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
  • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

Changes in version 3.5ga10, 16. January 2017

  • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
  • [s3270, ws3270] Restored oerrLock as the default.
  • [all] Fixed the CloseScript action.

Changes in version 3.5ga9, 26. December 2016

  • [c3270, wc3270] Fixed display of default attributes in NVT mode.
  • [all] Corrected Hebrew and Greek character set defintions.
  • [all] Corrected echoing of multi-byte characters in NVT line mode.
  • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
  • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
  • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
  • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
  • [all] Allow Wait(n,Second) to work when disconnected.
  • [x3270>] Fixed an issue with missed timeouts.

Changes in version 3.5ga8, 9. May 2016

  • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
  • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
  • [x3270] Put the dryrun script in the object directory.
  • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
  • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
  • [all] Fixed an issue with the Abort action called from scripts.
  • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
  • [all] Validate the parameters to the Transfer() action better.
  • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

Changes in version 3.5beta7, 8. March 2016

  • [wc3270] Fixed a crash in the Session Wizard.

Changes in version 3.5beta6, 25. February 2016

  • [wc3270, ws3270] Fixed a problem that broke SSL.
  • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
  • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

Changes in version 3.5beta5, 15. February 2016

  • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
  • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
  • [all Windows] Simplified the installer, removing the option of doing a per-user install.
  • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
  • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

Changes in version 3.5alpha4, 15. January 2016

  • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
  • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
  • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
    There are also now 32-bit and 64-bit versions of the no-install ZIP file.
  • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
  • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
  • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

Changes in version 3.5alpha3, 11. January 2016

  • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
  • [wc3270] Added a selection indicator to the window title.

Changes in version 3.5alpha2, 1. January 2016

  • [all] Fixed Visual Studio 2013 build issues.

Changes in version 3.5alpha2, 1. January 2016

  • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
  • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
  • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
  • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
  • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
  • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
  • [all] Allow scripts to issue multiple commands per line.
  • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
  • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

Changes in version 3.5alpha1, 10. July 2015

  • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
  • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
  • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
  • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
  • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/c3270/html/FAQ.html0000664000076500007650000000674313221577163014205 0ustar pdmpdm c3270 Frequently Asked Questions

    c3270 Frequently Asked Questions

    If you have a problem building, installing, or running c3270, please browse through this file first.

    General Questions

    Am I allowed to use it?

    Yes. Full copyright information is in the Lineage file, but the gist is that anyone is free to use the code, and anyone is free to sell copies of the code.

    You are also free to modify it and to redistribute it, provided you preserve the existing copyright notices.

    Why are notsign characters (and other accented characters) displayed as blanks or strings of garbage?

    The most common cause of this is a problem with locales, in particular, the codeset (LC_CTYPE) in use. There could be a mismatch between the locale that the c3270 process is using and the locale supported by the terminal hardware or terminal emulation software that c3270 is running on. For example, c3270 may be running in a locale that uses UTF-8 encoding (e.g., en_US.UTF-8), while the terminal it is running on does not support UTF-8. Or it may be running on a terminal emulator (xterm, gnome-terminal that is running in a non-UTF-8 locale, such as en_US.ISO8859-1.

    Use the show stats command at the c3270< prompt to display the locale codeset that the c3270 process is using.

    Note that the locale conflict can easily arise when c3270 is run on a remote host, e.g., in an ssh session. The remote host (where the output is being generated) and the local host (where the output is being interpreted and displayed) can often have different default locales.

    It is also possible that c3270 was built without UTF-8 support. In order to support UTF-8, c3270 must be built with an ncurses or curses library that supports wide characters. The show stats command will also indicate whether or not c3270 supports UTF-8.

    Getting Help

    If you are still having a problem with c3270, feel free to send e-mail to Paul Mattes, Paul.Mattes@usa.net No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. It will also get you on an x3270 mailing list, which also includes information on c3270, and where you can find out about new releases and bug fixes.

    When you send a question about c3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of c3270 you are using, including all patches, e.g., "3.3.6p1".
    2. What kind of machine you are running on, e.g., "Sun SPARC-10".
    3. What operating system you are running, and what version, e.g., "SunOS 4.1.3_U1" or "Irix 5.2". The "uname -a" command will usually provide this information.
    Complaints, suggestions, requests for enhancements, and porting experiences are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) under the x3270 license. suite3270-3.6/c3270/html/Intro.html0000664000076500007650000000166213221577163014664 0ustar pdmpdm c3270 Introduction

    c3270 Introduction

    c3270 is a curses-based IBM 3270 terminal emulator. It can be used to communicate with any IBM host that supports 3270-style connections over TELNET. It can also communicate with hosts that use line-by-line ASCII mode to do initial login negotiation before switching to full-screen 3270 mode.

    c3270 emulates one of four models of an IBM 3278 or 3279 terminal. The difference between the various models is the screen size. The emulation is not quite complete; c3270 understands extended field orders but does not implement some of the extended attributes (outlining, extended validation, etc.). suite3270-3.6/c3270/html/Lineage.html0000664000076500007650000000447613221577163015143 0ustar pdmpdm c3270 Lineage

    c3270 Lineage

    Here is the official copyright notice for c3270 3.3. It is a standard 3-element BSD license.

    Copyright © 1993-2015, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    suite3270-3.6/c3270/html.m40000664000076500007650000000642213221577163013144 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/c3270/html/README.html0000664000076500007650000000430413221577163014522 0ustar pdmpdm c3270 3.5 General Release

    c3270 3.5 General Release

    c3270 is a curses-based IBM 3278/3279 terminal emulator.

    Documentation is in the html directory. The files are:

    Intro
    What c3270 is
    Lineage
    Where c3270 came from (copyright stuff)
    Build
    How to build and install c3270
    FAQ
    Frequently Asked Questions (what to do when something goes wrong)
    ReleaseNotes
    What's new in this release
    Resources
    A complete list of c3270 resources (configuration items)
    Bugs
    What's broken in this release
    SSL
    How to use c3270 with the Secure Sockets Layer (SSL)
    Wishlist
    What isn't in this release
    There is also a hypertext version of the c3270 man page, and of the man pages for x3270-script and x3270if. Please read Build before going ahead and building the program. Also, if you have a problem, scan through FAQ; there are lots of interesting answers there.

    Updates to c3270, as well as the current status of development and bugs, are available from the x3270 Web Page.

    Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit.

    There is also an x3270 mailing list, which also includes information about c3270, and which receives news about new releases. You can subscribe to this list here. suite3270-3.6/c3270/html/ReleaseNotes.html0000664000076500007650000032733313221600611016151 0ustar pdmpdm c3270 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/c3270/html/Resources.html0000664000076500007650000026677513221600611015546 0ustar pdmpdm c3270 Resources

    c3270 Resources

    Resources are used to configure c3270. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into c3270.
    • If a session file foo.c3270 is specified on the command line, its contents are applied. Otherwise, if the c3270 profile (~/.c3270pro) exists, it is read and its contents are applied. These definitions override resource values defined by compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example c3270.bsdTm can be set by the following command-line option:
         -xrm "c3270.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file (profile or session file) has the following syntax.
    • Each definition consists of:
          c3270.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          c3270.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        

    Alphabetical Resource List

    Name: c3270.acceptHostname
    Type: String
    Command Line: -accepthostname
    Description:

    Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.)

    Name: c3270.acs
    Type: Boolean
    Default: true
    Description:

    When true, c3270 will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, c3270 will use Unicode box-drawing characters.

    Name: c3270.aidWait
    Type: Boolean
    Default: false
    Command Line: -set aidWait , -clear aidWait
    Description:

    When true, c3270 will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll c3270's status until it shows that the keyboard is no longer unlocked.

    Name: c3270.allBold
    Type: String
    Default: auto
    Command Line: -allbold
    Description:

    When true, c3270 will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation.

    Name: c3270.altScreen
    Type: String
    Command Line: -altscreen
    Description:

    Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When c3270.model is 5, and this and c3270.defScreen are defined, c3270 will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen.

    Name: c3270.asciiBoxDraw
    Type: Boolean
    Default: false
    Description:

    When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width.

    Name: c3270.bindLimit
    Type: Boolean
    Default: true
    Description:

    When true, c3270 will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not.

    Name: c3270.bindUnlock
    Type: Boolean
    Default: false
    Description:

    When true, c3270 will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing c3270 to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op.

    Name: c3270.blankFill
    Type: Boolean
    Default: false
    Command Line: -set blankFill , -clear blankFill
    Description:

    When true, in 3270 mode c3270 will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals.

    Name: c3270.bsdTm
    Type: Boolean
    Default: false
    Description:

    Defines c3270's response to the TELNET DO TIMING MARK option. When set to false, c3270 will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, c3270 will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of c3270. In either case, c3270 will never respond to a DONT TIMING MARK option.

    Name: c3270.caDir
    Type: String
    Command Line: -cadir
    Description:

    Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: c3270.caFile
    Type: String
    Command Line: -cafile
    Description:

    Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: c3270.cbreak
    Type: Boolean
    Default: false
    Command Line: -cbreak
    Description:

    If true, c3270 will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters.

    Name: c3270.certFile
    Type: String
    Command Line: -certfile
    Description:

    Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by c3270.certFileType. The private key for the certificate is specified by c3270.keyFile. If c3270.chainFile is specified, it overrides c3270.certFile.

    On the Mac, the file must be in PKCS12 format.

    Name: c3270.certFileType
    Type: String
    Default: pem
    Command Line: -certfiletype
    Description:

    Gives the type of the certificate file specified by c3270.certFile. The value can be pem or asn1. (OpenSSL only)

    Name: c3270.chainFile
    Type: String
    Command Line: -chainfile
    Description:

    Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by c3270.keyFile. If c3270.chainFile is specified, it overrides c3270.certFile. (OpenSSL only)

    Name: c3270.charset
    Type: String
    Default: bracket
    Command Line: -charset
    Description:

    This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by c3270, use the -v command-line option.

    Name: c3270.clientCert
    Type: String
    Command Line: -clientcert
    Description:

    Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only)

    Name: c3270.color8
    Type: Boolean
    Default: false
    Description:

    If true, c3270 will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported.

    This setting will also cause c3270 to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen.

    Name: c3270.composeMap
    Type: String
    Default: latin1
    Description:

    Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource c3270.composeMap.foo.

    Name: c3270.composeMap.foo
    Type: String
    Description:

    An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive.

    Name: c3270.confDir
    Type: String
    Default: /usr/local/etc/x3270
    Description:

    Defines the c3270 configuration directory, where c3270 will search for the ibm_hosts file by default. (See c3270.hostsFile.)

    Name: c3270.connectTimeout
    Type: Integer
    Command Line: -connecttimeout
    Description:

    Specifies a timeout, in seconds, that c3270 will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that c3270 will wait for the lesser of the two times (the specified timeout and the system-defined timeout).

    Name: c3270.crosshair
    Type: Boolean
    Default: false
    Command Line: -set crosshair , -clear crosshair
    Description:

    When true, causes c3270 to display a crosshair over the cursor: lines extending with height and width of the screen.

    Name: c3270.crosshairColor
    Type: String
    Default: purple
    Description:

    Defines the color used for the crosshair cursor (see c3270.crosshair). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15

    Name: c3270.cursesColorForDefault
    Name: c3270.cursesColorForIntensified
    Name: c3270.cursesColorForProtected
    Name: c3270.cursesColorForProtectedIntensified
    Type: String
    Description:

    Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    c3270 Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)

    Name: c3270.cursesColorForHostColor0
    Name: c3270.cursesColorForHostColorNeutralBlack
    Name: c3270.cursesColorForHostColor1
    Name: c3270.cursesColorForHostColorBlue
    Name: c3270.cursesColorForHostColor2
    Name: c3270.cursesColorForHostColorRed
    Name: c3270.cursesColorForHostColor3
    Name: c3270.cursesColorForHostColorPink
    Name: c3270.cursesColorForHostColor4
    Name: c3270.cursesColorForHostColorGreen
    Name: c3270.cursesColorForHostColor5
    Name: c3270.cursesColorForHostColorTurquoise
    Name: c3270.cursesColorForHostColor6
    Name: c3270.cursesColorForHostColorYellow
    Name: c3270.cursesColorForHostColor7
    Name: c3270.cursesColorForHostColorNeutralWhite
    Name: c3270.cursesColorForHostColor8
    Name: c3270.cursesColorForHostColorBlack
    Name: c3270.cursesColorForHostColor9
    Name: c3270.cursesColorForHostColorDeepBlue
    Name: c3270.cursesColorForHostColor10
    Name: c3270.cursesColorForHostColorOrange
    Name: c3270.cursesColorForHostColor12
    Name: c3270.cursesColorForHostColorPurple
    Name: c3270.cursesColorForHostColor13
    Name: c3270.cursesColorForHostColorPaleGreen
    Name: c3270.cursesColorForHostColor14
    Name: c3270.cursesColorForHostColorPaleTurquoise
    Name: c3270.cursesColorForHostColor15
    Name: c3270.cursesColorForHostColorGrey
    Name: c3270.cursesColorForHostColor16
    Name: c3270.cursesColorForHostColorWhite
    Type: String
    Description:

    Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource c3270.cursesColorForHostColorGreen or the resource c3270.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, c3270 only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, c3270 maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with c3270.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See c3270.cursesColorForDefault for the definitions of curses colors.

    Name: c3270.cursesKeypad
    Type: Boolean
    Default: false
    Description:

    When true, c3270 will set up the terminal in curses keypad mode.

    Name: c3270.cursorPos
    Type: Boolean
    Default: true
    Command Line: -set cursorPos , -clear cursorPos
    Description:

    When true, causes c3270 to display the cursor location in the OIA (the status line).

    Name: c3270.dbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use c3270.sbcsCgcsgid for the single-byte (SBCS) character set.

    Name: c3270.defaultFgBg
    Type: Boolean
    Default: false
    Command Line: -defaultfgbg
    Description:

    If true, c3270 will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that c3270's screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if c3270 has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9).

    Name: c3270.defScreen
    Type: String
    Command Line: -defscreen
    Description:

    Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When c3270.model is 5, and this and c3270.altScreen are defined, c3270 will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen.

    Name: c3270.dftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Deprecated resource -- replaced by c3270.ftBufferSize

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: c3270.devName
    Type: String
    Command Line: -devname
    Description:

    Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: c3270.dsTrace
    Type: Boolean
    Default: false
    Command Line: -trace , -set dsTrace , -clear dsTrace
    Description:

    Deprecated resource -- replaced by c3270.trace

    When true, c3270 writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. The directory where the file is written is defined by c3270.traceDir. If c3270.traceFile is defined, it gives the entire pathname and c3270.traceDir is ignored.

    Name: c3270.eof
    Type: String
    Default: ^D
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when c3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    Name: c3270.erase
    Type: String
    Default: ^?
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (c3270 gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause c3270 to discard the last character on the input line.

    When connected in character-at-a-time mode (c3270 sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action.

    Name: c3270.eventTrace
    Type: Boolean
    Default: false
    Command Line: -set eventTrace , -clear eventTrace
    Description:

    Deprecated resource -- replaced by c3270.trace

    When true, c3270 traces information about keyboard and mouse events into a file. The default file name is x3trc.pid. The directory where the file is written is defined by c3270.traceDir. If c3270.traceFile is defined, it gives the entire pathname and c3270.traceDir is ignored.

    Name: c3270.extended
    Type: Boolean
    Default: false
    Command Line: -extended
    Description:

    Deprecated resource -- replaced by c3270.model syntax

    Indicates support for the 3270 Extended Data Stream.

    Name: c3270.ftAllocation
    Type: String
    Default: default
    Description:

    Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock.

    Name: c3270.ftAvblock
    Type: Integer
    Description:

    Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers.

    Name: c3270.ftBlksize
    Type: Integer
    Description:

    Defines the default block size for files sent to TSO hosts by IND$FILE file transfers.

    Name: c3270.ftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: c3270.ftCr
    Type: String
    Default: auto
    Description:

    Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done.

    Name: c3270.ftDirection
    Type: String
    Default: receive
    Description:

    Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation).

    Name: c3270.ftExist
    Type: String
    Default: keep
    Description:

    Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be aborted, replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file.

    Name: c3270.ftHost
    Type: String
    Default: tso
    Description:

    Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics.

    Name: c3270.ftHostFile
    Type: String
    Description:

    Defines the default host file name for IND$FILE file transfers.

    Name: c3270.ftLocalFile
    Type: String
    Description:

    Defines the default local file name for IND$FILE file transfers.

    Name: c3270.ftLrecl
    Type: Integer
    Description:

    Defines the default logical record length for files sent to the host via IND$FILE.

    Name: c3270.ftMode
    Type: String
    Default: ascii
    Description:

    Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation).

    Name: c3270.ftPrimarySpace
    Type: Integer
    Description:

    Defines the default primary space allocation for files sent to TSO hosts via IND$FILE.

    Name: c3270.ftRecfm
    Type: String
    Default: default
    Description:

    Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format.

    Name: c3270.ftRemap
    Type: String
    Default: yes
    Description:

    Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by c3270 to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37.

    Name: c3270.ftSecondarySpace
    Type: Integer
    Description:

    Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE.

    Name: c3270.hostname
    Type: String
    Description:

    Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over c3270.hostname.

    The most common use of c3270.hostname is in session files, where a file is used to pass all of the options to establish a c3270 session.

    Name: c3270.hostsFile
    Type: String
    Default: /usr/local/etc/x3270/ibm_hosts
    Description:

    The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by c3270.confDir.

    Name: c3270.httpd
    Type: String
    Command Line: -httpd
    Description:

    Defines the TCP port and optional address to listen on for HTTP connections. (c3270 implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: c3270.icrnl
    Type: Boolean
    Default: true
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines.

    Name: c3270.idleCommand
    Type: String
    Description:

    When c3270.idleCommand is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The c3270.idleCommand can be an arbitrary sequence of c3270 actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). c3270.idleCommandEnabled must be true in order for the c3270.idleCommand to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) c3270.idleTimeout specifies the inactivity interval.

    Name: c3270.idleCommandEnabled
    Type: Boolean
    Default: false
    Description:

    Controls whether c3270.idleCommand has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.)

    Name: c3270.idleTimeout
    Type: String
    Default: ~7m
    Description:

    The timeout value for c3270.idleCommand. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified.

    Name: c3270.inlcr
    Type: Boolean
    Default: false
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns.

    Name: c3270.intr
    Type: String
    Default: ^C
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host.

    Name: c3270.keyFile
    Type: String
    Command Line: -keyfile
    Description:

    Gives the name of a file containg the private key for the certificate specified by c3270.certFile or c3270.chainFile. The default file type is PEM; it can be overridden by c3270.keyFileType. If the private key is encrypted, the password is specified by c3270.keyPasswd. (OpenSSL only)

    Name: c3270.keyFileType
    Type: String
    Default: pem
    Command Line: -keyfileType
    Description:

    Gives the type of the private key file specified by c3270.keyFile. The value can be pem or asn1. (OpenSSL only)

    Name: c3270.keymap
    Type: String
    Command Line: -keymap
    Description:

    The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a c3270.keymap value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270.

    c3270.keymap is only the name; the actual keymap for name foo can be defined either by the resource c3270.keymap.foo, or by a keymap file. The keymap file is not searched for in any particular location, nor does it have a special suffix, so c3270.keymap can specify the full pathname of the keymap file.

    Name: c3270.keymap.foo
    Type: String
    Description:

    The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax.

    Name: c3270.keyPasswd
    Type: String
    Command Line: -keypasswd
    Description:

    On OpenSSL, gives the password for the private key file specified by c3270.keyFile, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the c3270.certfile certifiate file.

    Name: c3270.kill
    Type: String
    Default: ^U
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when c3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when c3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action.

    Name: c3270.lineWrap
    Type: Boolean
    Default: true
    Command Line: -set lineWrap , -clear lineWrap
    Description:

    This setting is used only in NVT mode. When true, c3270 will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence.

    Name: c3270.loginMacro
    Type: String
    Command Line: -loginmacro
    Description:

    Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a c3270.hostsFile is in use and a matching entry is found, the login macro from that entry will be used in preference to the c3270.loginMacro.

    Name: c3270.lnext
    Type: String
    Default: ^V
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when c3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered.

    Name: c3270.m3279
    Type: Boolean
    Default: true
    Command Line: -color
    Description:

    Deprecated resource -- replaced by c3270.model syntax

    Indicates support for color (a 3279 terminal).

    Name: c3270.menuBar
    Type: Boolean
    Default: true
    Description:

    If false, the menu bar will not be displayed at the top of the c3270 display, even if the terminal supports a mouse.

    Name: c3270.metaEscape
    Type: Boolean
    Default: true
    Description:

    When true, c3270 will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus c3270 will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character.

    Name: c3270.model
    Type: String
    Default: 3279-4-E
    Command Line: -model
    Description:

    The terminal model that c3270 is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display.
      3279 specifies a color 3270 display.
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is the largest model that will fit on the console or terminal emulator window where c3270 is running. Displaying the OIA (status line) requires one more row than what is listed above.
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.

    Name: c3270.mono
    Type: Boolean
    Default: false
    Command Line: -mono
    Description:

    If true, c3270 will emulate a 3278, and will not use any of the terminal's color attributes.

    Name: c3270.monoCase
    Type: Boolean
    Default: false
    Command Line: -set monoCase , -clear monoCase
    Description:

    When true, causes c3270 to run in uppercase-only mode.

    Name: c3270.mouse
    Type: Boolean
    Default: true
    Description:

    If true, enables c3270 to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled.

    Name: c3270.newEnviron
    Type: Boolean
    Default: true
    Description:

    If true, c3270 will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not.

    Name: c3270.noPrompt
    Type: Boolean
    Default: false
    Description:

    If true, the interactive c3270> prompt will be disabled. In particular, this means that when c3270 is not connected to a host, a keymap or an external script is the only way to start a new host connection.

    Name: c3270.nopSeconds
    Type: Integer
    Description:

    If nonzero, c3270 will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity.

    Name: c3270.numericLock
    Type: Boolean
    Default: false
    Description:

    When true, causes c3270 to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute.

    Name: c3270.nvtMode
    Type: Boolean
    Default: false
    Command Line: -nvt
    Description:

    When true, causes c3270 to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname.

    Name: c3270.onlcr
    Type: Boolean
    Default: true
    Description:

    Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences.

    Name: c3270.oerrLock
    Type: Boolean
    Default: true
    Description:

    If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message.

    Name: c3270.once
    Type: Boolean
    Default: false
    Command Line: -once
    Description:

    When true, c3270 will exit as soon as a host disconnects. The default is false if no hostname is specified on the command line or in a session file, true otherwise.

    Name: c3270.oversize
    Type: String
    Command Line: -oversize
    Description:

    Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. It can also be the string auto, which will cause c3270 to use the entire screen area of the terminal. It is used only if the c3270.model includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with c3270 in this mode.

    Name: c3270.port
    Type: String
    Default: telnet
    Command Line: -port
    Description:

    The name of the default TCP port for c3270 to connect to. This can be either a symbolic name from /etc/services, or an integer.

    Name: c3270.proxy
    Type: String
    Command Line: -proxy
    Description:

    Defines a proxy server that c3270 will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the c3270 manual page.

    Name: c3270.printerLu
    Type: String
    Command Line: -printerlu
    Description:

    If a value is set, c3270 will automatically start a pr3287 printer session when a host connection is established. If the value is ".", the pr3287 session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session.

    Name: c3270.printer.assocCommandLine
    Type: String
    Default: pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H%
    Description:

    Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use c3270.printer.options.

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when c3270.printerLU is "."). Within the string, the following substitutions are made:

    • %C% is replaced with the c3270.printer.command
    • %H% is replaced with the current host name
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of c3270.printer.options
    • %P% is replaced with the current session's proxy option (c3270.proxy)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options

    Name: c3270.printer.command
    Type: String
    Default: lpr
    Description:

    The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in c3270.printer.assocCommandLine and c3270.printer.luCommandLine resources.

    Name: c3270.printer.luCommandLine
    Type: String
    Default: pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H%
    Description:

    Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use c3270.printer.options.

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

    • %C% is replaced with c3270.printer.command
    • %H% is replaced with the current host name
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of c3270.printer.options
    • %P% is replaced with current session's proxy option (c3270.proxy)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options

    Name: c3270.printer.options
    Type: String
    Description:

    Defines extra parameters to substutute for the %O% token in the printer command line.

    Name: c3270.printTextCommand
    Type: String
    Default: lpr
    Description:

    The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command.

    Name: c3270.printTextScreensPerPage
    Type: Integer
    Default: 1
    Description:

    The number of screens to display on a page when tracing screens to the printer.

    Name: c3270.qrBgColor
    Type: Boolean
    Default: false
    Description:

    When true, c3270 will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash.

    Name: c3270.quit
    Type: String
    Default: ^\
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when c3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host.

    Name: c3270.reconnect
    Type: Boolean
    Default: false
    Description:

    When true, c3270 will automatically reconnect to a host after it disconnects.

    Name: c3270.reverseVideo
    Type: Boolean
    Default: false
    Description:

    When true, c3270 will use a white background instead of a black one.

    Name: c3270.rprnt
    Type: String
    Default: ^R
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when c3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed.

    Name: c3270.saveLines
    Type: Integer
    Default: 4096
    Command Line: -sl
    Description:

    The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved.

    Name: c3270.sbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use c3270.dbcsCgcsgid for the double-byte (DBCS) character set.

    Name: c3270.screenTrace
    Type: Boolean
    Default: false
    Command Line: -set screenTrace , -clear screenTrace
    Description:

    When true, c3270 will save an ASCII version of the screen image in a file every time it changes. The file name defaults to x3scr.pid. The directory where the file is written is defined by c3270.traceDir. If c3270.screenTraceFile is defined, it defines the file name and c3270.traceDir is ignored.

    Name: c3270.screenTraceFile
    Type: String
    Description:

    If defined, gives the name of the file that screen traces will be written into.

    Name: c3270.scriptPort
    Type: Integer
    Command Line: -scriptport
    Description:

    If defined, c3270 will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: c3270.scriptPortOnce
    Type: Boolean
    Default: false
    Command Line: -scriptportonce
    Description:

    If defined, c3270 will accept only one script connection. When that connection is broken, it will exit.

    Name: c3270.socket
    Type: Boolean
    Default: false
    Command Line: -socket
    Description:

    When true, c3270 will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket.

    Name: c3270.startTls
    Type: Boolean
    Default: true
    Description:

    If true, c3270 will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them.

    Name: c3270.suppressActions
    Type: String
    Description:

    A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options.

    Name: c3270.termName
    Type: String
    Command Line: -tn
    Description:

    An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of c3270.model.

    Name: c3270.trace
    Type: Boolean
    Default: false
    Command Line: -trace , -set trace , -clear trace
    Description:

    When true, c3270 writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. The directory where the file is written is defined by c3270.traceDir. If c3270.traceFile is defined, it gives the entire pathname and c3270.traceDir is ignored.

    Name: c3270.traceDir
    Type: String
    Default: /tmp
    Description:

    Defines the directory that trace files are written into.

    Name: c3270.traceFile
    Type: String
    Command Line: -tracefile
    Description:

    If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file.

    Name: c3270.traceFileSize
    Type: String
    Command Line: -tracefilesize
    Description:

    If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started.

    Name: c3270.typeahead
    Type: Boolean
    Default: true
    Description:

    When true, c3270 will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped.

    Name: c3270.underscore
    Type: Boolean
    Default: false
    Command Line: -set underscore , -clear underscore
    Description:

    When true, c3270 will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed on terminals that are unable to display real underlined text.

    Name: c3270.unlockDelay
    Type: Boolean
    Default: true
    Description:

    When c3270 sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, c3270 implements a hack to briefly delay actually unlocking the keyboard. When c3270.unlockDelay is true (the default), the keyboard unlock will be delayed for c3270.unlockDelayMs milliseconds. Setting it to false removes this delay.

    Name: c3270.unlockDelayMs
    Type: Integer
    Default: 350
    Description:

    Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and c3270 actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros.

    Name: c3270.user
    Type: String
    Command Line: -user
    Description:

    Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: c3270.verifyHostCert
    Type: Boolean
    Default: true
    Command Line: -noverifycert , -verifycert
    Description:

    If true (the default), c3270 will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, c3270 will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking.

    Name: c3270.visibleControl
    Type: Boolean
    Default: false
    Command Line: -set visibleControl , -clear visibleControl
    Description:

    If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, displayed with underlines, are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, displayed in yellow with underlines, are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified

    Name: c3270.werase
    Type: String
    Default: ^W
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when c3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when c3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action.

    Index of All Resources

    acceptHostname acs aidWait allBold
    altScreen asciiBoxDraw bindLimit bindUnlock
    blankFill bsdTm caDir caFile
    cbreak certFile certFileType chainFile
    charset clientCert color8 composeMap
    composeMap.foo confDir connectTimeout crosshair
    crosshairColor cursesColorForDefault cursesColorForIntensified cursesColorForProtected
    cursesColorForProtectedIntensified cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1
    cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3
    cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5
    cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7
    cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9
    cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12
    cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14
    cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16
    cursesColorForHostColorWhite cursesKeypad cursorPos dbcsCgcsgid
    defaultFgBg defScreen dftBufferSize devName
    dsTrace eof erase eventTrace
    extended ftAllocation ftAvblock ftBlksize
    ftBufferSize ftCr ftDirection ftExist
    ftHost ftHostFile ftLocalFile ftLrecl
    ftMode ftPrimarySpace ftRecfm ftRemap
    ftSecondarySpace hostname hostsFile httpd
    icrnl idleCommand idleCommandEnabled idleTimeout
    inlcr intr keyFile keyFileType
    keymap keymap.foo keyPasswd kill
    lineWrap loginMacro lnext m3279
    menuBar metaEscape model mono
    monoCase mouse newEnviron noPrompt
    nopSeconds numericLock nvtMode onlcr
    oerrLock once oversize port
    proxy printerLu printer.assocCommandLine printer.command
    printer.luCommandLine printer.options printTextCommand printTextScreensPerPage
    qrBgColor quit reconnect reverseVideo
    rprnt saveLines sbcsCgcsgid screenTrace
    screenTraceFile scriptPort scriptPortOnce socket
    startTls suppressActions termName trace
    traceDir traceFile traceFileSize typeahead
    underscore unlockDelay unlockDelayMs user
    verifyHostCert visibleControl werase

    Basic Configuration Resources

    charset connectTimeout hostname keymap
    model port proxy printerLu

    Appearance Resources

    allBold crosshair crosshairColor cursesColorForDefault
    cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified cursesColorForHostColor0
    cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2
    cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4
    cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6
    cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8
    cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10
    cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13
    cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15
    cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite cursorPos
    defaultFgBg menuBar reverseVideo underscore

    NVT-Mode Resources

    eof erase icrnl inlcr
    intr kill lineWrap lnext
    onlcr quit rprnt werase

    Protocol Resources

    bindLimit bindUnlock bsdTm color8
    dbcsCgcsgid dftBufferSize devName ftBufferSize
    sbcsCgcsgid termName user

    Terminal Interaction Resources

    blankFill ftAllocation ftAvblock ftBlksize
    ftCr ftDirection ftExist ftHost
    ftHostFile ftLocalFile ftLrecl ftMode
    ftPrimarySpace ftRecfm ftRemap ftSecondarySpace
    idleCommand idleCommandEnabled idleTimeout mouse
    nopSeconds numericLock nvtMode oerrLock

    Security Resources

    acceptHostname caDir caFile certFile
    certFileType chainFile clientCert keyFile
    keyFileType keyPasswd noPrompt startTls
    suppressActions verifyHostCert

    Tracing Resources

    dsTrace eventTrace screenTrace screenTraceFile
    trace traceDir traceFile traceFileSize

    Other Resources

    acs aidWait altScreen asciiBoxDraw
    cbreak composeMap composeMap.foo confDir
    cursesKeypad defScreen hostsFile httpd
    keymap.foo loginMacro metaEscape mono
    monoCase newEnviron once oversize
    printer.assocCommandLine printer.command printer.luCommandLine printer.options
    printTextCommand printTextScreensPerPage qrBgColor reconnect
    saveLines scriptPort scriptPortOnce socket
    typeahead unlockDelay unlockDelayMs visibleControl

    Deprecated Resources

    extended m3279

    c3270 version 3.6ga4 Fri Dec 29 21:01:29 CST 2017 suite3270-3.6/c3270/html/SSL.html0000664000076500007650000002103713221600611014211 0ustar pdmpdm c3270 and TLS

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/c3270/html/Wishlist.html0000664000076500007650000000122213221577163015367 0ustar pdmpdm The c3270 Wish List

    The c3270 Wish List

    Here is a list of some of the more interesting suggestions and requests made for c3270. You may also take this as a list of functions that are definitely not in this version of c3270.

    There is no guarantee that anyone is actively working on these, but feel free to yourself...

    • (nothing yet)
    suite3270-3.6/c3270/html/x3270-script.html0000664000076500007650000010106213221600611015632 0ustar pdmpdm x3270-script Manual Page

    x3270-script Manual Page

    Contents

    Name
    Synopsis
    Description
    Status Format
    Differences
    Basic Programming Strategies
    Script-Specific Actions
    File Transfer
    See Also
    Version

    Name

    Scripting Facilities for x3270, c3270 and s3270

    Synopsis

    x3270 -script [ x3270-options ]
    x3270 -socket [ x3270-options ]
    x3270 -scriptport port [ x3270-options ]
    c3270 -socket [ c3270-options ]
    c3270 -scriptport port [ s3270-options ]
    s3270 [ s3270-options ]
    Script ( command [ ,arg... ] )

    Description

    The x3270 scripting facilities allow the interactive 3270 emulators x3270 and c3270 to be operated under the control of another program, and forms the basis for the script-only emulator s3270.

    There are four basic scripting methods. The first is the peer script facility, invoked by the x3270 -script switch, and the default mode for s3270. This runs the emulator as a child of another process. Typically this would be a script using expect(1), perl(1), or the co-process facility of the Korn Shell ksh(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output.

    The second method is the child script facility, invoked by the emulator's Script action. This runs a script as a child process of the emulator. The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT.

    The third method uses a TCP socket. The -scrpiptport command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection.

    The fourth method uses a Unix-domain socket. The -socket command-line option causes the emulator to create a Unix-domain stream socket named /tmp/x3sck.pid. The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection.

    It is possible to nest the methods. For example, a peer or TCP socket script can invoke the Script action. The calling script will be resumed when the nested script completes.

    Commands are emulator actions; the syntax is the same as for the right-hand side of an x3270 or c3270 keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with # or ! is treaded as a comment and will be ignored.

    Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script.

    Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error".

    Status Format

    The status message consists of 12 blank-separated fields:
    1 Keyboard State
    If the keyboard is unlocked, the letter U. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter L. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter E.
    2 Screen Formatting
    If the screen is formatted, the letter F. If unformatted or in NVT mode, the letter U.
    3 Field Protection
    If the field containing the cursor is protected, the letter P. If unprotected or unformatted, the letter U.
    4 Connection State
    If connected to a host, the string C(hostname). Otherwise, the letter N.
    5 Emulator Mode
    If connected in 3270 mode, the letter I. If connected in NVT line mode, the letter L. If connected in NVT character mode, the letter C. If connected in unnegotiated mode (no BIND active from the host), the letter P. If not connected, the letter N.
    6 Model Number (2-5)
    7 Number of Rows
    The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model.
    8 Number of Columns
    The current number of columns defined on the screen, subject to the same difference for rows, above.
    9 Cursor Row
    The current cursor row (zero-origin).
    10 Cursor Column
    The current cursor column (zero-origin).
    11 Window ID
    The X window identifier for the main x3270 window, in hexadecimal preceded by 0x. For s3270 and c3270, this is zero.
    12 Command Execution Time
    The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash.

    Differences

    When an action is initiated by a script, the emulators behave in several different ways:

    If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output.

    If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the CloseScript action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the Script action to complete.

    The Quit action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.)

    Normally, the AID actions (Clear, Enter, PF, and PA) will not complete until the host unlocks the keyboard. If the parameter to a String action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding.

    The AidWait toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The Wait(Output) action can then be used to delay a script until the host changes something on the screen, and the Wait(Unlock) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the AidWait toggle.

    Note that the Script action does not complete until end-of-file is detected on the pipe or the CloseScript action is called by the child process. This behavior is not affected by the state of the AidWait toggle.

    Basic Programming Strategies

    3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete.

    Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the Snap action. The Snap(Save) action saves a snapshot of the screen in a special buffer. Then the script can use Snap variants of the Ascii and Ebcdic actions (Snap(Ascii) and Snap(Ebcdic)) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, Snap(Wait Output) blocks the script until the host modifies the screen, specifically since the last call to Snap(Save). Thus a script can poll the screen efficiently by writing a loop that begins with Snap(Save) and ends with Snap(Wait Output).

    Script-Specific Actions

    The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, row and col coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]).
    AnsiText
    Outputs whatever data that has been output by the host in NVT mode since the last time that AnsiText was called. The data is preceded by the string "data: ", and has had all control characters expanded into C backslash sequences.

    This is a convenient way to capture NVT mode output in a synchronous manner without trying to decode the screen contents.

    Ascii(row,col,rows,cols)
    Ascii(row,col,length)
    Ascii(length)
    Ascii
    Outputs an ASCII text representation of the screen contents. Each line is preceded by the string "data: ", and there are no control characters.

    If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.)

    If three parameters are given, length characters are output, starting at the specified zero-origin row and column.

    If only the length parameter is given, that many characters are output, starting at the cursor position.

    If no parameters are given, the entire screen is output.

    The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the -charset option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f.

    AsciiField
    Outputs an ASCII text representation of the field containing the cursor. The text is preceded by the string "data: ".
    Connect(hostname)
    Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails.
    CloseScript(status)
    Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the Script action, the optional status is used as the return status of Script; if nonzero, Script will complete with an error, and if this script was invoked as part of login through the ibm_hosts file, the connection will be broken.
    ContinueScript([param])
    Allows a script that is waiting in a PauseScript action, below, to continue. The optional param string is output by the PauseScript action.
    Disconnect
    Disconnects from the host.
    Ebcdic(row,col,rows,cols)
    Ebcdic(row,col,length)
    Ebcdic(length)
    Ebcdic
    The same function as Ascii above, except that rather than generating ASCII text, each character is output as a 2-digit or 4-digit hexadecimal EBCDIC code.
    EbcdicField
    The same function as AsciiField above, except that it generates hexadecimal EBCDIC codes.
    Info(message)
    In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270.
    Expect(text[,timeout])
    Pauses the script until the specified text appears in the data stream from the host, or the specified timeout (in seconds) expires. If no timeout is specified, the default is 30 seconds. Text can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. Expect is valid only in NVT mode.
    Keymap([keymap])
    Adds or removes a temporary keymap. If the keymap parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed.
    MoveCursor(row,col)
    Moves the cursor to the specified zero-origin coordinates.
    PauseScript
    Stops a script until the ContinueScript action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to ContinueScript, if one is given.
    PrintText([command,]filter)
    Pipes an ASCII representation of the current screen image through the named filter, e.g., lpr.
    PrintText([html,][append,][replace,]file,filename)
    Saves the current screen contents in a file. With the html option, saves it as HTML, otherwise saves it as plain ASCII. The append option (the default) causes the data to be appended to the file if it already exists. The replace option causes the file to be overwritten instead.
    PrintText(html,string)
    Returns the current screen contents as HTML.
    Query(keyword)
    Returns state information. Keywords are:

    Keyword Output
    BindPluName BIND PLU returned by the host
    ConnectionState TN3270/TN3270E mode and submode
    CodePage Host code page
    Cursor Cursor position (row col)
    Formatted 3270 format state (formatted or unformatted)
    Host Host name and port
    LocalEncoding Local character encoding
    LuName Host name LU name
    Model 3270 model name (IBM-327x-n)
    ScreenCurSize Current screen size (rows cols)
    ScreenMaxSize Maximum screen size (rows cols)
    Ssl SSL state (secure or not-secure) and host validation state (host-verified or host-unverified)

    Without a keyword, Query returns each of the defined attributes, one per line, labeled by its name.

    ReadBuffer(Ascii)
    Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as SF(aa=nn[,...]), where aa is a field attribute type and nn is its value.

    Attribute
    Values
    c0 basic 3270
    20 protected
    10 numeric
    04 detectable
    08 intensified
    0c non-display
    01 modified
    41 highlighting
    f1 blink
    f2 reverse
    f4 underscore
    f8 intensify
    42 foreground
    f0 neutral black
    f1 blue
    f2 red
    f3 pink
    f4 green
    f5 turquoise
    f6 yellow
    f7 neutral white
    f8 black
    f9 deep blue
    fa orange
    fb purple
    fc pale green
    fd pale turquoise
    fe grey
    ff white
    43 character set
    f0 default
    f1 APL
    f8 DBCS

    Extended attributes (which do not take up display positions) are output as SA(aa=nn), with aa and nn having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute).

    In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks.

    ReadBuffer(Ebcdic)
    Equivalent to ReadBuffer(Ascii), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as GE(xx).
    Script(path[,arg...])
    Runs a child script, passing it optional command-line arguments. path must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the Source action.
    Snap
    Equivalent to Snap(Save) (see below).
    Snap(Ascii,...)
    Performs the Ascii action on the saved screen image.
    Snap(Cols)
    Returns the number of columns in the saved screen image.
    Snap(Ebcdic,...)
    Performs the Ebcdic action on the saved screen image.
    Snap(ReadBuffer)
    Performs the ReadBuffer action on the saved screen image.
    Snap(Rows)
    Returns the number of rows in the saved screen image.
    Snap(Save)
    Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other Snap actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically.
    Snap(Status)
    Returns the status line from when the screen was last saved.
    Snap(Wait[,timeout],Output)
    Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an Enter, PF or PA action), but has not finished updating the screen. This action is usually invoked in a loop that uses the Snap(Ascii) or Snap(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Snap action. The default is to wait indefinitely.

    Source(file)
    Read and execute commands from file. Any output from those commands will become the output from Source. If any of the commands fails, the Source command will not abort; it will continue reading commands until EOF.
    Title(text)
    Changes the x3270 window title to text.
    Transfer(keyword=value,...)
    Invokes IND$FILE file transfer. See FILE TRANSFER below.
    Wait([timeout,] 3270Mode)
    Used when communicating with a host that switches between NVT mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(3270) is equivalent to Wait(3270Mode)

    Wait([timeout,] Disconnect)
    Pauses the script until the host disconnects. Often used to after sending a logoff command to a VM/CMS host, to ensure that the session is not unintentionally set to disconnected state.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] InputField)
    A useful utility for use at the beginning of scripts and after the Connect action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In NVT mode, waits until the host sends at least one byte of data.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait is equivalent to Wait(InputField).

    Wait([timeout,] NVTMode)
    Used when communicating with a host that switches between 3270 mode and NVT mode. Pauses the script or macro until the host negotiates NVT mode, then waits for a byte from the host as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(ansi) is equivalent to Wait(NVTMode).

    Wait([timeout,] Output)
    Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a Clear, Enter, PF or PA action), but has not finished updating the screen. Also used in non-blocking AID mode (see DIFFERENCES for details). This action is usually invoked in a loop that uses the Ascii or Ebcdic action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] Unlock)
    Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (toggle AidWait clear), to wait for a host command to complete. See DIFFERENCES for details).

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait(timeout, Seconds)
    Delays the script timeout seconds. Unlike the other forms of Wait, the timeout is not optional.
    WindowState(mode)
    If mode is Iconic, changes the x3270 window into an icon. If mode is Normal, changes the x3270 window from an icon to a normal window.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    The Transfer action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes c3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes c3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the c3270.ftMode resource.

    See Also

    expect(1)
    perl(1)
    ksh(1)
    x3270(1)
    x3270if(1)
    c3270(1)
    s3270(1)

    Version

    Version 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/c3270/ibm_hosts0000664000076500007650000000205213221577163013643 0ustar pdmpdm# Sample x3270 ibm_hosts file. # # The format of each entry is: # # name type [prefix]hostname[:port] [actions] # # where # # name is a name you wish to give to the host. This name # can be used on the x3270 command line, and is the # name that will appear on the x3270 "Connect" menu. # # type is one of two keywords. The value "primary" means # the entry will appear on the "Connect" menu. The # value "alias" means it will not. # # hostname is the hostname or Internet address of the host to # to connect to. It can be preceded by a prefix such # as "s:" or "p:" or an LU name (see the x3270 man # page), and it can be followed by a "/" or ":" and a # port number to indicate a TCP port other than the # x3270 default (usually "telnet"). # # actions is an x3270 action or actions to execute once the # connection is made and a data-entry field is defined. # If the text looks like x3270 actions, e.g., PF(1), # it is unmodified; otherwise the text is used as a # parameter to the String() action. # #localhost primary 127.0.0.1 suite3270-3.6/c3270/ibm_hosts.man0000664000076500007650000000571113221600611014403 0ustar pdmpdm'\" t .TH IBM_HOSTS 5 "29 December 2017" .SH "NAME" ibm_hosts \- host database for x3270 and c3270 .SH "SYNOPSIS" /usr/lib/X11/x3270/ibm_hosts .SH "DESCRIPTION" The \fBibm_hosts\fP file contains information regarding IBM hosts on the network. An \fIIBM host\fP is a host which can communicate with a 3270 terminal emulator such as \fBx3270\fP or \fBc3270\fP. Each line defines a name in the following format (optional fields are shown in brackets): .LP \fIname\fP \fItype\fP [\fIopt\fP:]...[\fIluname\fP@]\fIhostname\fP[:\fIport\fP] [\fIactions\fP] .LP Items are separated by any number of blanks and/or TAB characters. A line beginning with # is taken as a comment (note that # anywhere else on a line does \fInot\fP indicate a comment). .LP The \fIname\fP field is a mnemonic used to identify the host. .LP The \fItype\fP field is a keyword that indicates the type of entry. The value \fBprimary\fP means that the \fIname\fP will be included in host-selection menus that may be displayed by a 3270 emulator. The value \fBalias\fP means that the \fIname\fP will not be included in menus, but will still be accepted as valid input when a host name is required. .LP The \fIhostname\fP field is the Internet hostname or dot-notation Internet address of the host. .LP The \fIhostname\fP can include `s:' or `p:' prefixes, e.g., \fBs:finicky\fP (see the \fIx3270\fP(1) or \fIc3270\fP(1) man page sfor details). It can also include an LU name, separated by an `@' character, e.g., \fBoddlu@bluehost\fP. Finally, it can include a non-default \fIport\fP number, appended to the \fIhostname\fP with a colon `:' character, e.g., \fBbluehost:97\fP. (For compatability with earlier versions of \fIx3270\fP, the \fIport\fP can also be separated by a slash `/' character.) .LP The optional \fIactions\fP field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., \fBPF(1)\fP, it is unmodified; otherwise it is taken as the parameter to the \fBString()\fP action. The \fIactions\fP are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. .SH "EXAMPLE" Given the following \fBibm_hosts\fP file: .LP .RS mvs primary mvs-host .br tso alias mvs-host .br mvs2 primary mvs-host:4012 .br vm primary vtam Tab() String(3) Enter() .RE A 3270 emulator will display four names (\fBmvs\fP, \fBmvs2\fP, \fBafhost\fP and \fBvm\fP) on its hosts menu. The names \fBmvs\fP and \fBtso\fP will cause connections to the host \fBmvs-host\fP. The name \fBmvs2\fP will also cause a connection to \fBmvs-host\fP, but to port 4012 rather than the emulator's default port (usually 23). The name \fBvm\fP will cause the 3270 emulator to connect to the host \fBvtam\fP (presumably some sort of host-selection front-end), enter the string `3' on the second data-entry field on the screen, and send the Enter \s-1AID\s+1 sequence. .SH "FILES" /usr/lib/X11/x3270/ibm_hosts .SH "SEE ALSO" x3270(1), c3270(1) suite3270-3.6/c3270/ibm_hosts.man.m40000664000076500007650000001122513221577163014736 0ustar pdmpdmdnl Copyright (c) 1994-2009, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(IBM_HOSTS,5,XX_DATE) XX_SH(Name) ibm_hosts XX_DASHED() host database for x3270 and c3270 XX_SH(Synopsis) /usr/lib/X11/x3270/ibm_hosts XX_SH(Description) The XX_FB(ibm_hosts) file contains information regarding IBM hosts on the network. An XX_FI(IBM host) is a host which can communicate with a 3270 terminal emulator such as XX_FB(x3270) or XX_FB(c3270). Each line defines a name in the following format (optional fields are shown in brackets): XX_LP XX_FI(name) XX_FI(type) [XX_FI(opt):]...[XX_FI(luname)@]XX_FI(hostname)[:XX_FI(port)] [XX_FI(actions)] XX_LP Items are separated by any number of blanks and/or TAB characters. A line beginning with `#' is taken as a comment (note that `#' anywhere else on a line does XX_FI(not) indicate a comment). XX_LP The XX_FI(name) field is a mnemonic used to identify the host. XX_LP The XX_FI(type) field is a keyword that indicates the type of entry. The value XX_FB(primary) means that the XX_FI(name) will be included in host-selection menus that may be displayed by a 3270 emulator. The value XX_FB(alias) means that the XX_FI(name) will not be included in menus, but will still be accepted as valid input when a host name is required. XX_LP The XX_FI(hostname) field is the Internet hostname or dot-notation Internet address of the host. XX_LP The XX_FI(hostname) can `include' ``s:'' or ``p:'' prefixes, e.g., XX_FB(s:finicky) (see the XX_LINK(x3270-man.html,XX_FI(x3270)(1)) or XX_LINK(c3270-man.html,XX_FI(c3270)(1)) man page sfor details). It can also include an LU name, separated by an ``@'' character, e.g., XX_FB(oddlu@bluehost). Finally, it can include a non-default XX_FI(port) number, appended to the XX_FI(hostname) with a colon ``:'' character, e.g., XX_FB(bluehost:97). (For compatability with earlier versions of XX_FI(x3270), the XX_FI(port) can also be separated by a slash ``/'' character.) XX_LP The optional XX_FI(actions) field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., XX_FB(PF(1)), it is unmodified; otherwise it is taken as the parameter to the XX_FB(String()) action. The XX_FI(actions) are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. XX_SH(Example) Given the following XX_FB(ibm_hosts) file: XX_LP XX_RS(`mvs primary mvs-host XX_BR tso alias mvs-host XX_BR mvs2 primary mvs-host:4012 XX_BR vm primary vtam Tab() String(3) Enter() ') A 3270 emulator will display four names (XX_FB(mvs), XX_FB(mvs2), XX_FB(afhost) and XX_FB(vm)) on its hosts menu. The names XX_FB(mvs) and XX_FB(tso) will cause connections to the host XX_FB(mvs-host). The name XX_FB(mvs2) will also cause a connection to XX_FB(mvs-host), but to port 4012 rather than the emulator's default port (usually 23). The name XX_FB(vm) will cause the 3270 emulator to connect to the host XX_FB(vtam) (presumably some sort of host-selection front-end), enter the string ``3'' on the second data-entry field on the screen, and send the Enter XX_SM(AID) sequence. XX_SH(Files) /usr/lib/X11/x3270/ibm_hosts XX_SH(See Also) XX_LINK(x3270-man.html,x3270(1)), XX_LINK(c3270-man.html,c3270(1)) suite3270-3.6/c3270/keymap.h0000664000076500007650000000343613221577163013377 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* c3270 version of keymap.h */ #define KM_CTRL 0x0001 #define KM_ALT 0x0002 void keymap_register(void); void keymap_init(void); char *lookup_key(int k, ucs4_t ucs4, int modifiers); void keymap_dump(void); const char *decode_key(int k, ucs4_t ucs4, int hint, char *buf); suite3270-3.6/c3270/keymaps.inc0000664000076500007650000002777013221577163014113 0ustar pdmpdmXX_SH(Keymaps) The XX_FB(XX_DASHED(keymap)) option or the XX_FB(XX_PRODUCT`'.keymap) resource allow a custom keymap to be specified. If the option XX_FB(XX_DASHED(keymap)) XX_FI(xxx) is given (or the XX_FB(XX_PRODUCT`'.keymap) resource has the value XX_FI(xxx)), XX_FB(XX_PRODUCT) will look for a resource named XX_FB(XX_PRODUCT.keymap.)`'XX_FI(xxx). If no resource definition is found, it will look for a file named ifelse(XX_PRODUCT,c3270,`XX_FI(xxx)',XX_PRODUCT,wc3270,`XX_FI(xxx)XX_FB(.wc3270km)'). XX_LP Multiple keymaps may be specified be separating their names with commas. Definitions in later keymaps supercede those in earlier keymaps. XX_LP In addition, separate keymaps may be defined that apply only in 3270 mode or XX_SM(NVT) mode. For example, the resource definition XX_FB(XX_PRODUCT.keymap.)`'XX_FI(xxx)`'XX_FB(.nvt) or the file ifelse(XX_PRODUCT,c3270,`'XX_FI(xxx)`'XX_FB(.nvt), XX_PRODUCT,wc3270,`XX_FI(xxx)XX_FB(.nvt.wc3270km)') will augment the definition of keymap XX_FI(xxx) in XX_SM(NVT) mode. Similarly, the resource definition XX_FB(XX_PRODUCT.keymap.)`'XX_FI(xxx)`'XX_FB(.3270) or the file ifelse(XX_PRODUCT,c3270,`'XX_FI(xxx)`'XX_FB(.3270), XX_PRODUCT,wc3270,`XX_FI(xxx)XX_FB(.3270.wc3270km)') will augment the definition of keymap XX_FI(xxx) in 3270 mode. XX_LP Temporary keymaps can also be added or removed while XX_PRODUCT is running with the XX_FB(Keymap) action. See XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) for details. XX_LP Each line (rule) in a keymap specifies actions to perform when a particular key or sequence of keys is pressed. Keymap rules have the following syntax: XX_LP ifelse(XX_PRODUCT,c3270, `XX_RS(`[XX_FB(Meta)][XX_FB(Ctrl)]XX_FB(XX_KEY())`'XX_FI(key)...: XX_FI(action)[(XX_FI(param)[,...])] ...') ', `XX_RS(`[XX_FI(modifier)...]XX_FB(XX_KEY())`'XX_FI(key)...: XX_FI(action)[(XX_FI(param)[,...])] ...') ')dnl XX_LP Here is a sample keymap definition from a file: XX_LP XX_RS(`! Lines beginning with ! are ignored and can XX_BR() ! occur anywhere. XX_BR() ifelse(XX_PRODUCT,wc3270,`! The line below will be displayed XX_BR() ! by the New Session Wizard. XX_BR !description: An example. XX_BR ')dnl ! Definition of keymap xxx XX_BR() ! XX_NBSP()When Alt-c is pressed, clear the screen. XX_BR() XX_KEY(Alt,c): Clear() XX_BR() ! XX_NBSP()When PageUp is pressed, send PF7 to the host. XX_BR() ifelse(XX_PRODUCT,c3270,`XX_KEY(,PPAGE): PF(7)', `XX_KEY(,PRIOR): PF(7)') XX_BR() ! XX_NBSP()When Ctrl-a is pressed, then F1, send PF13 XX_BR() ! XX_NBSP()to the host. XX_BR() XX_KEY(Ctrl,a) XX_KEY(,F1): PF(13)') XX_LP Here is the same definition as a resource: XX_LP XX_RS(`! Lines beginning with ! are ignored, but NOT XX_BR() ! within a definition. XX_BR() ! Note that the XX_BACKSLASH() is required at the end of the XX_BR() ! first line, and XX_BACKSLASH(n)`'XX_BACKSLASH() is XX_BR() ! required at the end of every other line except XX_BR() ! the last. XX_BR() ! Definition of keymap xxx XX_BR() XX_PRODUCT.keymap.xxx: XX_BACKSLASH() XX_BR() XX_NBSP()XX_KEY(Alt,c): Clear() XX_BACKSLASH(n)`'XX_BACKSLASH() XX_BR() XX_NBSP()ifelse(XX_PRODUCT,c3270,`XX_KEY(,PPAGE): PF(7) XX_BACKSLASH(n)`'XX_BACKSLASH()', `XX_KEY(,PRIOR): PF(7) \n\') XX_BR() XX_NBSP()XX_KEY(Ctrl,A) XX_KEY(,F1): PF(13)') XX_LP The optional ifelse(XX_PRODUCT,wc3270,`XX_FB(Shift), ')dnl XX_FB(Alt) or XX_FB(Ctrl) modifiers specify that the ifelse(XX_PRODUCT,wc3270,`XX_FB(Shift), ')dnl XX_FB(Alt) and XX_FB(Ctrl) keys are pressed along with the specified XX_FI(key), respectively. ifelse(XX_PRODUCT,wc3270, `The XX_FB(LeftCtrl), XX_FB(RightCtrl), XX_FB(LeftAlt), and XX_FB(RightAlt) modifiers specifify a particular XX_FB(Ctrl) or XX_FB(Alt) key. ')dnl ifelse(XX_PRODUCT,wc3270,`The XX_FB(Enhanced) modifier is also available; XX_FB(Enhanced XX_LT()Key>ENTER) is the keypad XX_FB(Enter) key. ')dnl XX_FI(Key) is either an XX_SM(ISO) 8859-1 symbol name, such as XX_FB(equal) for XX_DQUOTED(=) and XX_FB(a) for XX_DQUOTED(a), or a symbolic ifelse(XX_PRODUCT,c3270,`XX_FB(ncurses)',XX_PRODUCT,wc3270,`Windows') key name, such as XX_FB(UP). More than one XX_FI(key) can be specified, indicating that a sequence of keys must be pressed in order for the rule to be matched. The XX_FI(action) is an action from the XX_LINK(#Actions,XX_SM(ACTIONS)) list above. More than one XX_FI(action) may be specified; they will be executed in order. XX_LP Keymap entries are case-sensitive and modifier-specific. This means that a keymap for the XX_FB(b) key will match only a lowercase XX_FB(b). Actions for uppercase XX_FB(B), or for XX_FB(Alt-B), must be specified separately. ifelse(XX_PRODUCT,wc3270, `XX_LP Available symbolic key names are: XX_FB(ADD), XX_FB(ALT), XX_FB(APPS), XX_FB(BACK) (BackSpace), XX_FB(BackSpace) (alias for BACK), XX_FB(CLEAR), XX_FB(CTRL), XX_FB(DECIMAL), XX_FB(DELETE), XX_FB(DIVIDE), XX_FB(DOWN), XX_FB(END), XX_FB(Enter) (alias for RETURN), XX_FB(ESCAPE), XX_FB(Esc) (alias for ESCAPE), XX_FB(EXECUTE), XX_FB(F1), XX_FB(F2), XX_FB(F3), XX_FB(F4), XX_FB(F5), XX_FB(F6), XX_FB(F7), XX_FB(F8), XX_FB(F9), XX_FB(F10), XX_FB(F11), XX_FB(F12), XX_FB(F13), XX_FB(F14), XX_FB(F15), XX_FB(F16), XX_FB(F17), XX_FB(F18), XX_FB(F19), XX_FB(F20), XX_FB(F21), XX_FB(F22), XX_FB(F23), XX_FB(F24), XX_FB(HELP), XX_FB(HOME), XX_FB(INSERT), XX_FB(LEFT), XX_FB(LMENU), XX_FB(LWIN) (Left Windows key), XX_FB(MULTIPLY), XX_FB(NEXT) (Page Down), XX_FB(NUMLOCK), XX_FB(NUMPAD0), XX_FB(NUMPAD1), XX_FB(NUMPAD2), XX_FB(NUMPAD3), XX_FB(NUMPAD4), XX_FB(NUMPAD5), XX_FB(NUMPAD6), XX_FB(NUMPAD7), XX_FB(NUMPAD8), XX_FB(NUMPAD9), XX_FB(PageUp) (alias for PRIOR), XX_FB(PageDown) (alias for Next), XX_FB(PAUSE), XX_FB(PRINT), XX_FB(PRIOR) (Page Up), XX_FB(RETURN) (Enter), XX_FB(RIGHT), XX_FB(RMENU), XX_FB(RWIN) (Right Windows key), XX_FB(SCROLL), XX_FB(SELECT), XX_FB(SEPARATOR), XX_FB(SHIFT), XX_FB(SLEEP), XX_FB(SNAPSHOT), XX_FB(SUBTRACT), XX_FB(TAB) and XX_FB(UP). In addition, any Windows VKey code can be specified in hexadecimal with the syntax XX_FB(VKEY-0x)XX_FI(nn). ')dnl XX_LP The base keymap is: XX_LP XX_TS(2,l l.) XX_TR(XX_TD(Key) XX_TD(Action)) XX_T_() ifelse(XX_PRODUCT,c3270, `XX_TR(XX_TD(XX_KEY(Ctrl,`]')) XX_TD(Escape)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(Ctrl,a)) XX_TD(`Key(0x01)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(Ctrl,`]')) XX_TD(`Key(0x1d)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,Tab)) XX_TD(BackTab)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,c)) XX_TD(Clear)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,e)) XX_TD(Escape)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,k)) XX_TD(Keypad)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,m)) XX_TD(Compose)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,n)) XX_TD(Menu)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,p)) XX_TD(PrintText)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,^)) XX_TD(Key(notsign))) XX_TR(XX_TD(XX_KEY(Ctrl,k)) XX_TD(Keypad)) XX_TR(XX_TD(XX_KEY(Ctrl,n)) XX_TD(Menu)) XX_TR(XX_TD(XX_KEY(,UP)) XX_TD(Up)) XX_TR(XX_TD(XX_KEY(,DOWN)) XX_TD(Down)) XX_TR(XX_TD(XX_KEY(,LEFT)) XX_TD(Left)) XX_TR(XX_TD(XX_KEY(,RIGHT)) XX_TD(Right)) XX_TR(XX_TD(XX_KEY(,`F(XX_FI(n))')) XX_TD(`PF(XX_FI(n))')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,`F(XX_FI(n))')) XX_TD(`PF(XX_FI(n)+12)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,1)) XX_TD(`PA(1)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,2)) XX_TD(`PA(2)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,3)) XX_TD(`PA(3)')) XX_TR(XX_TD(XX_KEY(,PPAGE)) XX_TD(`Scroll(Backward)')) XX_TR(XX_TD(XX_KEY(,NPAGE)) XX_TD(`Scroll(Forward)'))', XX_PRODUCT,wc3270, `XX_TR(XX_TD(XX_KEY(Alt,1)) XX_TD(`PA(1)')) XX_TR(XX_TD(XX_KEY(Alt,2)) XX_TD(`PA(2)')) XX_TR(XX_TD(XX_KEY(Alt,3)) XX_TD(`PA(3)')) XX_TR(XX_TD(XX_KEY(Alt Ctrl,`]')) XX_TD(`Key(0x1d)')) XX_TR(XX_TD(XX_KEY(Ctrl,`]')) XX_TD(Escape)) XX_TR(XX_TD(XX_KEY(Alt,^)) XX_TD(Key(notsign))) XX_TR(XX_TD(XX_KEY(Ctrl,c)) XX_TD(Copy)) XX_TR(XX_TD(XX_KEY(Alt,k)) XX_TD(Keymap)) XX_TR(XX_TD(XX_KEY(Alt,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Alt,m)) XX_TD(Compose)) XX_TR(XX_TD(XX_KEY(Alt,n)) XX_TD(Menu)) XX_TR(XX_TD(XX_KEY(Ctrl,p)) XX_TD(Paste)) XX_TR(XX_TD(XX_KEY(Alt,p)) XX_TD(PrintText)) XX_TR(XX_TD(XX_KEY(Ctrl,x)) XX_TD(Cut)) XX_TR(XX_TD(XX_KEY(,PRIOR)) XX_TD(`Scroll(Backward)')) XX_TR(XX_TD(XX_KEY(,NEXT)) XX_TD(`Scroll(Forward)')) XX_TR(XX_TD(XX_KEY(Shift,`F`'XX_FI(n)')) XX_TD(`PF(XX_FI(n)+12)'))') XX_TE() XX_LP The base 3270-mode keymap adds: XX_LP XX_TS(2,l l.) XX_TR(XX_TD(Key) XX_TD(Action)) XX_T_() ifelse(XX_PRODUCT,c3270, `XX_TR(XX_TD(XX_KEY(Ctrl,c)) XX_TD(Clear)) XX_TR(XX_TD(XX_KEY(Ctrl,d)) XX_TD(Dup)) XX_TR(XX_TD(XX_KEY(Ctrl,f)) XX_TD(FieldMark)) XX_TR(XX_TD(XX_KEY(Ctrl,i)) XX_TD(Tab)) XX_TR(XX_TD(XX_KEY(Ctrl,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Ctrl,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Ctrl,u)) XX_TD(DeleteField)) XX_TR(XX_TD(XX_KEY(,BackSpace)) XX_TD(BackSpace)) XX_TR(XX_TD(XX_KEY(,Return)) XX_TD(Enter)) XX_TR(XX_TD(XX_KEY(,Tab)) XX_TD(Tab)) XX_TR(XX_TD(XX_KEY(,Linefeed)) XX_TD(Newline)) XX_TR(XX_TD(XX_KEY(,BACKSPACE)) XX_TD(BackSpace)) XX_TR(XX_TD(XX_KEY(,DC)) XX_TD(Delete)) XX_TR(XX_TD(XX_KEY(,HOME)) XX_TD(Home)) XX_TR(XX_TD(XX_KEY(,IC)) XX_TD(ToggleInsert))', XX_PRODUCT,wc3270, `XX_TR(XX_TD(XX_KEY(Ctrl,a)) XX_TD(Attn)) XX_TR(XX_TD(XX_KEY(Alt,a)) XX_TD(Attn)) XX_TR(XX_TD(XX_KEY(Alt,c)) XX_TD(Clear)) XX_TR(XX_TD(XX_KEY(Ctrl,d)) XX_TD(Dup)) XX_TR(XX_TD(XX_KEY(Alt,d)) XX_TD(Dup)) XX_TR(XX_TD(XX_KEY(Ctrl,f)) XX_TD(FieldMark)) XX_TR(XX_TD(XX_KEY(Alt,f)) XX_TD(FieldMark)) XX_TR(XX_TD(XX_KEY(Ctrl,h)) XX_TD(Erase)) XX_TR(XX_TD(XX_KEY(Alt,i)) XX_TD(Insert)) XX_TR(XX_TD(XX_KEY(Shift Ctrl,i)) XX_TD(BackTab)) XX_TR(XX_TD(XX_KEY(Ctrl,i)) XX_TD(Tab)) XX_TR(XX_TD(XX_KEY(Ctrl,j)) XX_TD(Newline)) XX_TR(XX_TD(XX_KEY(Ctrl,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Ctrl,m)) XX_TD(Enter)) XX_TR(XX_TD(XX_KEY(Ctrl,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Alt,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Ctrl,u)) XX_TD(DeleteField)) XX_TR(XX_TD(XX_KEY(,INSERT)) XX_TD(ToggleInsert)) XX_TR(XX_TD(XX_KEY(Shift,TAB)) XX_TD(BackTab)) XX_TR(XX_TD(XX_KEY(,BACK)) XX_TD(Erase)) XX_TR(XX_TD(XX_KEY(Shift,END)) XX_TD(EraseEOF)) XX_TR(XX_TD(XX_KEY(,END)) XX_TD(FieldEnd)) XX_TR(XX_TD(XX_KEY(Ctrl,LEFT)) XX_TD(PreviousWord)) XX_TR(XX_TD(XX_KEY(Ctrl,RIGHT)) XX_TD(NextWord)) XX_TR(XX_TD(XX_KEY(Shift,LEFT)) XX_TD(SelectLeft)) XX_TR(XX_TD(XX_KEY(Shift,RIGHT)) XX_TD(SelectRight)) XX_TR(XX_TD(XX_KEY(Shift,UP)) XX_TD(SelectUp)) XX_TR(XX_TD(XX_KEY(Shift,DOWN)) XX_TD(SelectDown)) XX_TR(XX_TD(XX_KEY(,PRIOR)) XX_TD(`PF(7)')) XX_TR(XX_TD(XX_KEY(,NEXT)) XX_TD(`PF(8)'))') XX_TE() ifelse(XX_PRODUCT,c3270, `XX_SH(The Meta or Alt Key) Some keyboards do not have a XX_FB(Meta) key. Instead, they have an XX_FB(Alt) key. Sometimes this key acts as a proper XX_FB(Meta) key, that is, it is a modifier key that sets the high-order bit (0x80) in the code that is transmitted for each key. Other keyboards send a two-character sequence when the XX_FB(Alt) key is pressed with another key: the Escape character (0x1b), followed by the code for the other key. XX_LP The resource XX_FB(XX_PRODUCT.metaEscape) and the termcap XX_FB(km) attribute control how XX_FB(XX_PRODUCT) will interpret these sequences. When XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(true), or when XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(auto) and the termcap XX_FB(km) attribute is set, the keyboard is assumed to have a separate XX_FB(Meta) key. The Escape key can be used as an ordinary data key and has no special meaning. XX_LP When XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(true), or when XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(auto) and the termcap XX_FB(km) attribute is not set, the keyboard is assumed to use the Escape character as a prefix to indicate that the following character is supposed to have the high-order bit set. When XX_FB(XX_PRODUCT) sees an Escape character from the keyboard, it sets a short timeout. If another character arrives before the timeout expires, then XX_FB(XX_PRODUCT) will combine the two characters, setting the high-order bit of the second. In an event trace file, the combined character is listed as XX_FI(derived). In a keymap, only the combined character or the XX_FB(Meta) prefix may be used. The Escape key can still be used by itself, but only if there is a short pause before pressing another key. XX_LP The default value for XX_FB(XX_PRODUCT.metaEscape) is XX_FB(auto).')dnl suite3270-3.6/c3270/LICENSE0000664000076500007650000000342613221577163012744 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/c3270/m4man0000775000076500007650000000342013221577163012673 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/c3270/Makefile.aux0000664000076500007650000000653513221577163014177 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015, 2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for c3270 PRODUCT = c3270 all: @echo "Must pick a specific make target." DOCS = $(PRODUCT).man html/$(PRODUCT)-man.html html/ReleaseNotes.html \ html/Resources.html html/SSL.html html/x3270-script.html \ ibm_hosts.man x3270-script.man # Rule for building the source tarball: run autoconf and build the # documentation. src.tgz: prepare $(DOCS) Makefile.aux # Rule for preparing a freshly-pulled working copy: run autoconf. prepare: configure configure: configure.in autoconf MANDEP = man.m4 html.m4 m4man Makefile.aux version.txt MKMAN = ./m4man -t man -p $(PRODUCT) MKHTML = ./m4man -t html -p $(PRODUCT) # Rule for building the documentation. man: $(DOCS) # Rules for building man pages and derived HTML documentation. $(PRODUCT).man: x3270.man.m4 ft.inc resources.inc keymaps.inc hostname.inc $(MANDEP) $(MKMAN) -n $(PRODUCT) -o $@ x3270.man.m4 html/$(PRODUCT)-man.html: x3270.man.m4 ft.inc resources.inc keymaps.inc hostname.inc $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ x3270.man.m4 ibm_hosts.man: ibm_hosts.man.m4 $(MANDEP) $(MKMAN) -n ibm_hosts -o $@ ibm_hosts.man.m4 html/ibm_hosts.html: ibm_hosts.man.m4 ft.inc $(MANDEP) $(MKHTML) -n ibm_hosts -o $@ ibm_hosts.man.m4 x3270-script.man: x3270-script.man.m4 ft.inc $(MANDEP) $(MKMAN) -n x3270-script -o $@ x3270-script.man.m4 html/x3270-script.html: x3270-script.man.m4 ft.inc $(MANDEP) $(MKHTML) -n x3270-script -o $@ x3270-script.man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ html/Resources.html: resource-body make-resource-doc.pl version.txt ./make-resource-doc.pl -o $@ $(PRODUCT) $(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) FALLBACKS = fb-common fb-printSession fb-messages fb-composeMap fb-c3270 fallbacks.c: mkfb $(FALLBACKS) $(RM) $@ ./mkfb -c -o $@ $(filter-out mkfb,$^) mkfb: mkfb.c $(CC) $(CFLAGS) -o $@ $(filter %.c,$^) keypad.o: compiled_keypad.h compiled_keypad.h: keypad.full keypad.labels keypad.map keypad.outline keypad.callbacks mkkeypad ./mkkeypad -I$(TOP)/Common/c3270 >$@ c3270: $(OBJS1) $(DEP3270) $(DEP3270I) $(DEP32XX) $(DEP3270STUBS) $(DEP32XX) $(CC) -o $@ $(OBJS1) $(LDFLAGS) $(LD3270) $(LD3270I) $(LD32XX) $(LD3270STUBS) $(LIBS) man:: c3270.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi man:: x3270-script.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi man:: ibm_hosts.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi install:: c3270 [ -d $(DESTDIR)$(BINDIR) ] || \ mkdir -p $(DESTDIR)$(BINDIR) $(INSTALL_PROGRAM) c3270 $(DESTDIR)$(BINDIR)/c3270 install:: ibm_hosts [ -d $(DESTDIR)$(LIBX3270DIR) ] || \ mkdir -p $(DESTDIR)$(LIBX3270DIR) [ -r $(DESTDIR)$(LIBX3270DIR)/ibm_hosts ] || \ $(INSTALL_DATA) $< $(DESTDIR)$(LIBX3270DIR)/ibm_hosts install.man: man [ -d $(DESTDIR)$(MANDIR)/man1 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man1 [ -d $(DESTDIR)$(MANDIR)/man5 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man5 $(INSTALL_DATA) c3270.man $(DESTDIR)$(MANDIR)/man1/c3270.1 $(INSTALL_DATA) x3270-script.man $(DESTDIR)$(MANDIR)/man1/x3270-script.1 $(INSTALL_DATA) ibm_hosts.man $(DESTDIR)$(MANDIR)/man5/ibm_hosts.5 clean: $(RM) *.o mkfb fallbacks.c compiled_keypad.h clobber: clean $(RM) c3270 *.d *.man # Include auto-generated dependencies. -include $(OBJS:.o=.d) mkfb.d suite3270-3.6/c3270/make-resource-doc.pl0000775000076500007650000001752213221577163015606 0ustar pdmpdm#!/usr/bin/env perl use strict; my $outfile; if ($ARGV[0] eq "-o") { die "Missing filename after -o.\n" unless ($#ARGV >= 1); shift; $outfile = $ARGV[0]; shift; } die "Must specify product.\n" unless ($#ARGV >= 0); my $product = $ARGV[0]; # Figure out the version name. my $version; open VERSION, ") { chomp; if (/^version="(.*)"/) { $version=$1 } } close VERSION; # Sort out the product, and %approd. my %approd; $approd{'a'} = 1; if ($product eq "x3270") { $approd{'u'} = 1; } elsif ($product eq "c3270") { $approd{'C'} = 1; $approd{'u'} = 1; } elsif ($product eq "s3270") { $approd{'S'} = 1; $approd{'u'} = 1; } elsif ($product eq "tcl3270") { $approd{'u'} = 1; } elsif ($product eq "wc3270") { $approd{'C'} = 1; $approd{'w'} = 1; } elsif ($product eq "ws3270") { $approd{'S'} = 1; $approd{'w'} = 1; } else { die "Unknown product '$product'.\n"; } my $prefix = $product; $prefix =~ s/3270//; $approd{$prefix} = 1; # Dump out %approd. #foreach my $k (keys %approd) { # print STDERR "$k: $approd{$k}\n" #} my %types = ( i => 'Integer', b => 'Boolean', s => 'String' ); # Set up output file. my $out; my $tmpfile; if ($outfile) { $tmpfile = "/tmp/mkr" . $$; unlink $tmpfile; open TMPFILE, ">", $tmpfile or die "Can't open $tmpfile.\n"; $out = *TMPFILE; } else { $out = *STDOUT; } # From here on out, unlink the tempfile if we bail. END { unlink $tmpfile if ($tmpfile); } # Unlink the tempfile if we get a termination signal. sub sighandler { unlink $tmpfile if ($tmpfile); exit(0); } $SIG{'INT'} = \&sighandler; $SIG{'QUIT'} = \&sighandler; $SIG{'HUP'} = \&sighandler; $SIG{'TERM'} = \&sighandler; # Remove HTML attributes from a resource name. sub nix { my $txt = shift(@_); $txt =~ s/<\/?[\w.]+>//g; return $txt; } # The indices. my @index; # overall index my @c_index; # configuration index my @a_index; # appearance index my @n_index; # NVT-mode index my @p_index; # protocol index my @i_index; # interaction index my @s_index; # security index my @t_index; # tracing index my @o_index; # other index my @d_index; # deprecated index my @indices = ( \@c_index, \@a_index, \@n_index, \@p_index, \@i_index, \@s_index, \@t_index, \@o_index, \@d_index ); my @index_name = ( "Basic Configuration", "Appearance", "NVT-Mode", "Protocol", "Terminal Interaction", "Security", "Tracing", "Other", "Deprecated" ); # The elements of an entry. my $name; my @names; my $applies; my $type; my $default; my @switch; my @option; my $description; my $groups; sub dump { if ($name && $applies) { # The minimum set of required attributes are type and description. die "$name missing type\n" if (!$type); die "$name missing description\n" if (!$description); foreach my $n (@names) { # Add this name to the general index. push @index, $n; # Add this name to the specified indices... if (defined($groups)) { foreach (split /\s+/, $groups) { if ($_ eq "c") { push @c_index, $n; } elsif ($_ eq "a") { push @a_index, $n; } elsif ($_ eq "n") { push @n_index, $n; } elsif ($_ eq "p") { push @p_index, $n; } elsif ($_ eq "i") { push @i_index, $n; } elsif ($_ eq "s") { push @s_index, $n; } elsif ($_ eq "t") { push @t_index, $n; } elsif ($_ eq "d") { push @d_index, $n; } else { die "Unknown group '$_'\n"; } } } else { # ... or to the 'other' index. push @o_index, $n; } my $tgt = nix($n); print $out "\nName: $product.$n
    \n"; } print $out "Type: $type
    \n"; if ($default) { print $out "Default: $default
    \n"; } if (@switch) { my $comma; print $out "Command Line:"; foreach my $s (@switch) { print $out "$comma $s\n"; $comma = ","; } print $out "
    \n"; } if ($product eq "x3270") { foreach my $o (@option) { print $out "Option: $o
    \n"; } } $description =~ s/%p%/$product/g; while ($description =~ /%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $description =~ s/%-[\w.<>\/*]+%/$product.$full<\/a>/; } #$description =~ s/%-([\w.]+)%/$product.\1<\/tt><\/a>/g; print $out "Description:
    \n"; print $out "

    $description

    \n"; } undef $name; undef @names; undef $applies; undef $type; undef $default; undef @switch; undef @option; undef $description; undef $groups; } print $out <<"EOS"; $product Resources

    $product Resources

    EOS my $on = 1; my $in_desc; my $in_intro; my @ifstack; while () { chomp; # Skip blank lines. next if (/^\s*$/); # Handle if/endif. if (/^if\s+(.*)/) { push @ifstack, $on; my $desc_applies; foreach (split /\s+/, $1) { $desc_applies = 1 if ($approd{$_}); } $on = $desc_applies if ($ifstack[$#ifstack]); next; } elsif (/^else/) { die "dangling else\n" if ($#ifstack < 0); $on = !$on if ($ifstack[$#ifstack]); next; } elsif (/^endif/) { die "dangling endif\n" if ($#ifstack < 0); $on = pop(@ifstack); next; } next unless $on; # Handle desc. if ($in_desc) { if (/^\./) { undef $in_desc; } else { $description .= $_ . "\n"; } next; } # Handle intro. if (/^intro/) { $in_intro = 1; next; } elsif ($in_intro) { if (/^\./) { undef $in_intro; print $out "

    Alphabetical Resource List

    \n"; } else { s/%p%/$product/g; while (/%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $_ =~ s/%-[\w.<>\/*]+%/
    $product.$full<\/a>/; } print $out "$_\n"; } next; } # Handle normal keywords. if (/name\s(.*)/) { &dump; @names = split /\s+/, $1; $name = $names[0]; next; } if (/applies\s(.*)/) { undef $applies; foreach (split /\s+/, $1) { $applies = 1 if ($approd{$_}); } next; } if (/groups\s(.*)/) { $groups = $1; next; } if (/type\s([^\s]*)/) { $type = $types{$1}; next; } if (/default\s(.*)/) { $default = $1; next; } if (/switch\s(.*)/) { push @switch, $1; next; } if (/option\s(.*)/) { push @option, $1; next; } if (/^desc/) { $in_desc = 1; next; } last if (/^EOF$/); die "Unknown keyword '$_'.\n"; } &dump; print $out <Index of All Resources EOT my $ix = 0; foreach my $i (@index) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; my $q = 0; foreach my $j (@indices) { my @arr = @$j; if ($#arr >= 0) { print $out "

    $index_name[$q] Resources

    \n"; print $out "\n"; my $ix = 0; foreach my $i (@arr) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; } $q = $q + 1; } print $out "

    $product version $version ", `date`, "\n"; print $out "\n"; # Wrap up the outfile. if ($outfile) { close TMPFILE; system("mv $tmpfile $outfile") == 0 or die "Can't rename $tmpfile to $outfile.\n"; } suite3270-3.6/c3270/man.m40000664000076500007650000000513013221577163012746 0ustar pdmpdmdnl Copyright (c) 2000-2012, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces output for nroff -man changecom()dnl changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl define(XX_SH,.SH `"translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)"')dnl define(XX_TH,.TH $1 $2 "$3")dnl define(XX_SM,\s-1$1\s+1)dnl define(XX_LP,.LP)dnl define(XX_IP,.IP)dnl define(XX_BR,.br)dnl define(XX_RS,.RS $1 .RE)dnl define(XX_TS,.TS $2)dnl define(XX_TR,$1)dnl define(XX_TD,T{ .na .nh $1 T})dnl define(XX_TDH,T{ .na .nh .in +2 .ti -2 $1 T})dnl define(XX_T_,_)dnl define(XX_TC,$1)dnl define(XX_TE,.TE)dnl define(XX_TPS)dnl define(XX_TP,.TP $1)dnl define(XX_TPE)dnl define(XX_PP,.PP)dnl define(XX_RI2,.RI $1 $2)dnl define(XX_DASH,\-)dnl define(XX_DASHED,\-$1)dnl define(XX_FI,\fI$1\fP)dnl define(XX_FB,\fB$1\fP)dnl define(XX_NBSP,`\ ')dnl define(XX_LT,<)dnl define(XX_BS,\e)dnl define(XX_TARGET)dnl define(XX_LINK,$2)dnl define(XX_COPY,` ')dnl define(XX_NOT,notsign)dnl define(XX_BACKSLASH,\\$1)dnl define(XX_HO)dnl define(XX_HY,$1\%$2)dnl dnl Make sure it gets run through tbl first. '\" t suite3270-3.6/c3270/mkstand.bash0000775000076500007650000000100313221577163014227 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/c3270/mkversion.sh0000775000076500007650000000466413221577163014320 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <Resources are used to configure %p%. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into %p%.
    • if x
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The %p% app-defaults file (only if %p% is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
      endif
    • If a session file foo.%p% is specified on the command line, its contents are applied. if x c Otherwise, if the %p% profile (~/.%p%pro) exists, it is read and its contents are applied. endif These definitions override resource values defined by if x X11 methods and endif compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example %-bsdTm% can be set by the following command-line option:
         -xrm "%p%.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file if x (app-defaults file, profile or session file) else if c (profile or session file) else (session file) endif endif has the following syntax.
    • Each definition consists of:
          %p%.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • if x C
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          %p%.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        
    • endif
    . name acceptHostname applies a type s groups s switch -accepthostname description Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.) . name acs applies c type b default true desc When true, %p% will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, %p% will use Unicode box-drawing characters. . name activeIcon applies x groups a type b default false switch -activeicon description When true, %p%'s icon becomes a live miniature of the screen display. . name aidWait applies x c s tcl type b default false switch -set aidWait switch -clear aidWait desc When true, %p% will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll %p%'s status until it shows that the keyboard is no longer unlocked. . name allBold applies c groups a type s default auto switch -allbold desc When true, %p% will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation. . name allowResize applies x type b default true description When true, the %p% window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it. . name altCursor applies x wc groups a type b default false switch -set altCursor switch -clear altCursor option Options -> Toggles -> Underline Cursor option Options -> Toggles -> Block Cursor description When true, this causes %p% to use the alternate (underscore) cursor. When false, it will use a block cursor. . name altScreen applies c type s switch -altscreen desc Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-defScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name aplCircledAlpha applies x groups a type b default false description When set to true, allows %p% to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with %p%.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point. . name aplMode applies x type b default false switch -apl desc Enables %p% APL mode. APL mode appends apl to the list of names in %-keymap% (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets %-composeMap% to apl (allowing Compose key sequences to construct complex APL symbols), and sets %-charset% to apl (allowing the display of APL symbols using several of the 3270 fonts). . name asciiBoxDraw applies C type b default false desc When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width. . name autoShortcut applies wc type b default false switch -S switch +S desc When true, %p% will run in auto-shortcut mode. In auto-shortcut mode, %p% automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x. . name background applies x groups a type s default white switch -bg switch -rv description The background color for menus, buttons, and on monochrome X11 displays, the emulator window. . name bellMode applies wc type s groups i description Controls how %p% responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the %p% window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides %-visualBell%. . name bellVolume applies x type i default 0 description Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by %-visualBell%, which if true, will replace the bell with a flash of the screen. . name bindLimit applies a groups p type b default true description When true, %p% will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not. . name bindUnlock applies a type b groups p default false description When true, %p% will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing %p% to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op. . name blankFill applies a groups i type b default false option Options -> Toggles -> Blank Fill switch -set blankFill switch -clear blankFill description When true, in 3270 mode %p% will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals. . name boldColor applies x groups a default green type s description This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan. . name bsdTm applies a groups p type b default false description Defines %p%'s response to the TELNET DO TIMING MARK option. When set to false, %p% will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, %p% will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of %p%. In either case, %p% will never respond to a DONT TIMING MARK option. . name caDir applies u type s groups s switch -cadir description Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name caFile applies u type s groups s switch -cafile description Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name cbreak applies c type b default false switch -cbreak desc If true, %p% will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters. . name certFile applies u groups s type s switch -certfile desc Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by %-certFileType%. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%.

    On the Mac, the file must be in PKCS12 format. . name certFileType applies u groups s type s default pem switch -certfiletype desc Gives the type of the certificate file specified by %-certFile%. The value can be pem or asn1. (OpenSSL only) . name chainFile applies u groups s type s switch -chainfile desc Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%. (OpenSSL only) . name charClass applies x type s desc Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name. . name charset applies a groups c type s default bracket switch -charset option Options -> Character Set description This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by %p%, use the -v command-line option. if wc

    Note that %p% DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language. endif . name clientCert applies w groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store. . name clientCert applies u groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only) . name color8 applies a groups p type b default false description If true, %p% will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported. if c

    This setting will also cause %p% to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen. endif . name colorBackground applies x groups a type s default black description The background color for the emulator window. This resource is used only on color X11 displays when %-model% specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by %-colorScheme%. . name colorScheme applies x groups a type s default default option Options -> Color Scheme description Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when %-model% specifies a 3279 display. %-colorScheme% is just the name of the color scheme. The actual color scheme definition for color scheme foo is %-colorScheme.foo%. . name colorScheme.foo applies x groups a type s description An individual color scheme definition. I.e., to define color scheme foo, a resource named %p%.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer. . name commandTimeout applies tcl type i description Defines the number of seconds to wait for a command to complete before failing it with a timeout error. . name composeMap applies x C type s default latin1 description Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource %-composeMap.foo%. . name composeMap.foo applies x C type s description An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive. . name confDir applies a type s if u default /usr/local/etc/x3270 else default . endif desc Defines the %p% configuration directory, where %p% will search for the ibm_hosts file by default. (See %-hostsFile%.) if w

    The default is to search the directory where %p% was started, which usually its installation directory. endif . name connectFileName applies x type s default ~/.x3270connect description Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of %p% that run under the same username. . name connectTimeout applies a type i groups c switch -connecttimeout description Specifies a timeout, in seconds, that %p% will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that %p% will wait for the lesser of the two times (the specified timeout and the system-defined timeout). . name consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite applies wc groups a type i desc Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource %p%.consoleColorForHostColorGreen or the resource %p%.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the %p% Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with %p%.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         %p%.consoleColorForHostColorNeutralBlack: 15
         %p%.consoleColorForHostColorNeutralWhite: 0
        
    . name crosshair applies x C groups a type b default false option Options -> Toggles -> Crosshair Cursor switch -set crosshair switch -clear crosshair description When true, causes %p% to display a crosshair over the cursor: lines extending with height and width of the screen. . name crosshairColor applies x C groups a type s default purple description Defines the color used for the crosshair cursor (see %-crosshair%). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15
    . name cursesColorForDefault cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified applies c groups a type s desc Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    %p% Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)
    . name cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite applies c groups a type s desc Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource %p%.cursesColorForHostColorGreen or the resource %p%.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, %p% only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with %p%.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See %-cursesColorForDefault% for the definitions of curses colors. . name cursesKeypad applies c type b default false desc When true, %p% will set up the terminal in curses keypad mode. . name cursorBlink applies x groups a type b default false option Options -> Toggles -> Blinking Cursor switch -set cursorBlink switch -clear cursorBlink description When true, causes %p% to use a blinking cursor. . name cursorColor applies x groups a type s default red description On color X11 displays, this is the color of the text cursor. This resource is used only if %-useCursorColor% is true. . name cursorPos applies x C groups a type b default true switch -set cursorPos switch -clear cursorPos option Options -> Toggles -> Track Cursor description When true, causes %p% to display the cursor location in the OIA (the status line). . name dbcsCgcsgid applies a groups p type s description Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use %-sbcsCgcsgid% for the single-byte (SBCS) character set. . name debugTracing applies x groups t s type b default true description If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed. . name defaultFgBg applies c type b groups a default false switch -defaultfgbg description If true, %p% will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that %p%'s screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if %p% has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9). . name defScreen applies c type s switch -defscreen desc Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-altScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name dftBufferSize applies a groups p type i default 4096 description Deprecated resource -- replaced by %-ftBufferSize%

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name devName applies a type s switch -devname groups p description Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name disconnectClear applies x type b default false description If true, %p% will clear the screen when a host disconnects. . name doConfirms applies x type b default true description When true, %p% will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed. . name dsTrace applies a groups t type b default false switch -trace switch -set dsTrace switch -clear dsTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name emulatorFont type s applies x groups a default 3270 switch -efont option Options -> Font description The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (%-charset%). However, the special OIA (status line) symbols are only available with the 3270 fonts. . name eof type s applies a groups n default ^D description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    . name erase type s applies a groups n default ^? description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (%p% gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause %p% to discard the last character on the input line.

    When connected in character-at-a-time mode (%p% sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action. . name eventTrace groups t type b applies a default false switch -set eventTrace switch -clear eventTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% traces information about keyboard and mouse events into a file. The default file name is if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name extended type b applies a default false groups d switch -extended description Deprecated resource -- replaced by %-model% syntax

    Indicates support for the 3270 Extended Data Stream. . name fixedSize type s applies x groups a description Specifies a fixed size for the %p% display window. If set, %p% will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary. . name foreground type s applies x groups a default black switch -fg switch -rv description The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display. . name ftAllocation type s applies a groups i default default description Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock. . name ftAvblock type i applies a groups i description Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers. . name ftBlksize type i applies a groups i description Defines the default block size for files sent to TSO hosts by IND$FILE file transfers. . name ftBufferSize applies a groups p type i default 4096 description Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCodePage type i applies w groups i description Deprecated resource -- replaced by %-ftWindowsCodePage%

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCr type s applies a groups i default auto description Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done. . name ftDirection type s applies a groups i default receive description Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation). . name ftExist type s applies a groups i default keep description Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be if x aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), else aborted, endif replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file. . name ftHost type s applies a groups i default tso description Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics. . name ftHostFile type s applies a groups i description Defines the default host file name for IND$FILE file transfers. . name ftLocalFile type s applies a groups i description Defines the default local file name for IND$FILE file transfers. . name ftLrecl type i applies a groups i description Defines the default logical record length for files sent to the host via IND$FILE. . name ftMode type s applies a groups i default ascii description Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation). . name ftPrimarySpace type i applies a groups i description Defines the default primary space allocation for files sent to TSO hosts via IND$FILE. . name ftRecfm type s applies a groups i default default description Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format. . name ftRemap type s applies a groups i default yes description Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by %p% to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37. . name ftSecondarySpace type i applies a groups i description Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE. . name ftWindowsCodePage type i applies w groups i description The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name highlightBold type b applies x groups a default false description If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font. . name hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified applies wc groups a type s desc Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See %-consoleColorForHostColor0% for the definitions of host colors.

    The default values are:
    %p% Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite
    . name hostname type s applies a groups c desc Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over %-hostname%.

    The most common use of %-hostname% is in session files, where a file is used to pass all of the options to establish a %p% session. . name hostsFile type s applies x default /usr/local/etc/x3270/ibm_hosts description The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by %-confDir%. . name hostsFile type s applies C S tcl if u default /usr/local/etc/x3270/ibm_hosts else default ibm_hosts endif description The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. if u The default pathname is actually ibm_hosts in the directory defined by %-confDir%. endif . name httpd type s applies C S x switch -httpd description Defines the TCP port and optional address to listen on for HTTP connections. (%p% implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name iconFont type s applies x groups a default nil2 description The font used to paint the text inside the active icon (see %-activeIcon%). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image. . name iconLabelFont type s applies x groups a default 8x13 description When %-activeIcon% and %-labelIcon% are true, this is the name of the font used to paint the icon label. . name icrnl type b applies a groups n default true description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines. . name idleCommand applies x C S groups i type s description When %-idleCommand% is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The %-idleCommand% can be an arbitrary sequence of %p% actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). %-idleCommandEnabled% must be true in order for the %-idleCommand% to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) %-idleTimeout% specifies the inactivity interval. . name idleCommandEnabled applies x C S groups i type b default false description Controls whether %-idleCommand% has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.) . name idleTimeout applies x C S groups i type s default ~7m description The timeout value for %-idleCommand%. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified. . name inlcr applies a groups n type b default false description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns. . name inputColor applies x groups a type s default green description This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan.

    If the resource %-modifiedSel% is true, modified fields are also displayed using %-inputColor%. . name inputMethod applies x type s switch -im description Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale. . name intr applies a groups n type s default ^C description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host. . name invertKeypadShift applies x type b default false description When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed. . name keyFile applies u groups s type s switch -keyfile desc Gives the name of a file containg the private key for the certificate specified by %-certFile% or %-chainFile%. The default file type is PEM; it can be overridden by %-keyFileType%. If the private key is encrypted, the password is specified by %-keyPasswd%. (OpenSSL only) . name keyFileType applies u groups s type s default pem switch -keyfileType desc Gives the type of the private key file specified by %-keyFile%. The value can be pem or asn1. (OpenSSL only) . name keyHeight applies x groups a type i default 24 desc Defines the height of the keys on the pop-up keypad. . name keymap applies x C groups c type s switch -keymap description The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a %-keymap% value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270. if x

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six. endif

    if x If no %-keymap% is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. %-keymap% is only the name; the keymap definition for name foo is the resource %-keymap.foo%. endif if C %-keymap% is only the name; the actual keymap for name foo can be defined either by the resource %-keymap.foo%, or by a keymap file. if c The keymap file is not searched for in any particular location, nor does it have a special suffix, so %-keymap% can specify the full pathname of the keymap file. else Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km. endif endif . name keymap.foo applies x C type s description The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax. . name keypad applies x groups a type s default right description. This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main %p% window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main %p% window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar
    . name keypad.keyHeight applies x groups a type i default 24 description The height in pixels of all of the buttons on the keypad. . name keyPasswd applies u groups s type s switch -keypasswd desc On OpenSSL, gives the password for the private key file specified by %-keyFile%, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the %-certfile% certifiate file. . name keyWidth applies x groups a type i default 48 description The width in pixels of the lower tier of buttons on a horizontal keypad. . name keypad.largeKeyWidth applies x groups a type i default 56 description The width in pixels of the lower tier of buttons on a vertical keypad. . name keypad.paWidth applies x groups a type i default 36 description The width in pixels of PA and cursor keys on the keypad. . name keypad.pfWidth applies x groups a type i default 32 description The width in pixels of PF keys on the keypad. . name keypadBackground applies x groups a type s default grey70 description On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap. . name keypadOn applies x type b groups a default false description If true, the keypad will automatically appear when %p% is started. . name kill applies a groups n type s default ^U description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action. . name labelIcon applies x groups a type b default false description When %-activeIcon% is true, the twm window manager will not put a label on %p%'s icon. Setting %-labelIcon% to true causes %p% to supply its own label for the icon.

    The icon label is drawn using the font specified by %-iconLabelFont%. . name largeKeyWidth applies x groups a type i default 56 desc Defines the width of the "large" keys in the lower section of the pop-up keypad. . name lightPenPrimary applies wc groups i type b default false description Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste. . name lineWrap applies a groups n type b default true switch -set lineWrap switch -clear lineWrap option Options -> Toggles -> Wraparound description This setting is used only in NVT mode. When true, %p% will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence. . name loginMacro applies a type s switch -loginmacro desc Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a %-hostsFile% is in use and a matching entry is found, the login macro from that entry will be used in preference to the %-loginMacro%. . name lnext applies a groups n type s default ^V description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered. . name localCp applies ws type i desc Forces %p% to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files. . name lockedCursor applies x groups a type s default X_cursor description The name of the mouse cursor displayed with %p% is not connected to a host. . name m3279 applies a type b default true groups d switch -color description Deprecated resource -- replaced by %-model% syntax

    Indicates support for color (a 3279 terminal). . name macros applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    %-macros% defines a set of macros for all hosts. To specify a set of macros for host foo, use %-macros.foo%. . name macros.foo applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of %-macros%. See %-macros% for details on its syntax. . name marginedPaste applies x wc groups i type b default false switch -set marginedPaste switch -clear marginedPaste option Options -> Toggles -> Paste With Left Margin description When true, %p% will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon. . name maxRecent applies x groups i type i default 5 description The maximum number of entries in the Connect menu's recent host list. . name menuBar applies x wc groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% main window. if x The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons. endif . name menuBar applies c groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% display, even if the terminal supports a mouse. . name metaEscape applies c type b default true desc When true, %p% will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus %p% will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character. . name minVersion applies S type s switch -minversion description Defines a minimum required version for %p%. If the version of %p% is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal. . name model applies a groups c type s default 3279-4-E switch -model option Options -> Screen Size description The terminal model that %p% is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. if x If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays. endif
      3279 specifies a color 3270 display. if x This is the default for color X11 displays. endif
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is if C the largest model that will fit on the console or terminal emulator window where %p% is running. Displaying the OIA (status line) requires one more row than what is listed above. else 4. endif
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.
    . name modifiedSel applies x groups a type b default false description When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by %-inputColor%. In 3279 mode, this is the color whose index is defined by %-modifiedSelColor%. When %-modifiedSel% is false, modified fields are displayed in the same colors as unmodified fields. . name modifiedSelColor applies x groups a type i default 10 description In 3279 mode, when %-modifiedSel% is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See %-colorSchemes% for the host color index definitions.) . name mono applies x c type b default false switch -mono description if x If true, %p% will operate as if it were running on a monochrome X11 display. else If true, %p% will emulate a 3278, and will not use any of the terminal's color attributes. endif . name monoCase applies a type b default false switch -set monoCase switch -clear monoCase option Options -> Toggles -> Monocase description When true, causes %p% to run in uppercase-only mode. . name mouse applies c groups i type b default true description If true, enables %p% to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled. . name newEnviron applies a type b default true description If true, %p% will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not. . name noOther applies x groups s type b default false description If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus. . name noPrompt applies C groups s type b default false desc If true, the interactive %p%> prompt will be disabled. In particular, this means that when %p% is not connected to a host, a keymap or an external script is the only way to start a new host connection. . name normalCursor applies x type s groups a default top_left_arrow desc Defines the mouse cursor that %p% uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked. . name nopSeconds applies a type i groups i default 0 desc If nonzero, %p% will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity. . name normalColor applies x groups a type s default green desc On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color. . name numericLock applies a groups i type b default false desc When true, causes %p% to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute. . name nvtMode applies a groups i type b default false switch -nvt desc When true, causes %p% to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname. . name onlcr applies a groups n type b default true desc Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences. . name oerrLock applies a groups i type b default true desc If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message. . name once applies a type b default false switch -once desc When true, %p% will exit as soon as a host disconnects. The default is false if no hostname is specified on the command if x C line or in a session file, else line, endif true otherwise. . name overlayPaste applies wc x groups i type b default false switch -set overlayPaste switch -clear overlayPaste option Options -> Toggles -> Overlay Paste desc When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause %p% to act as if the %-marginedPaste% toggle were also set. . name oversize applies a type s switch -oversize desc Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. if C It can also be the string auto, which will cause %p% to use the entire screen area of the endif if c terminal. endif if wc console window it is running in. endif It is used only if the %-model% includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with %p% in this mode. . name paWidth applies x groups a type i default 36 desc Defines the width of the PA keys in the lower section of the pop-up keypad. . name pfWidth applies x groups a type i default 32 desc Defines the width of the PF keys on the pop-up keypad. . name port applies a groups c type s default telnet switch -port desc The name of the default TCP port for %p% to connect to. This can be either a symbolic name from /etc/services, or an integer. . name proxy applies a groups c type s switch -proxy desc Defines a proxy server that %p% will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the %p% manual page. . name preeditType applies x type s default OverTheSpot+1 switch -pt desc The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. . name printerLu type s applies x C groups c switch -printerlu desc If a value is set, %p% will automatically start a if u pr3287 else wpr3287 endif printer session when a host connection is established. If the value is ".", the if u pr3287 else wpr3287 endif session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session. . name printer.assocCommandLine applies x C type s if x c default pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H% else default wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when %-printerLU% is "."). Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with the %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with the current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.codepage applies wc type i desc The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage. . name printer.command applies x c type s default lpr desc The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in %-printer.assocCommandLine% and %-printer.luCommandLine% resources. . name printer.luCommandLine applies x C type s if x c default pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H% else default wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.name applies wc type s desc Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer. . name printer.options applies x C type s desc Defines extra parameters to substutute for the %O% token in the printer command line. . name printTextCommand applies x c type s default lpr desc The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. if x If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear. endif . name printTextFont applies wc type s default Courier New desc The font used by the PrintText action. . name printTextHorizontalMargin applies wc type i default 0.5 desc The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printTextOrientation applies wc type i desc The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is. . name printTextScreensPerPage applies wc c x type i default 1 desc The number of screens to display on a page when tracing screens to the printer. . name printTextSize applies wc type i default auto (GDI), 8 (WordPad) desc The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points. . name printTextVerticalMargin applies wc type i default 0.5 desc The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printWindowCommand applies x type s default xwd -id %d | xpr | lpr desc The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear. . name qrBgColor applies C s tcl type b default false desc When true, %p% will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash. . name quit applies a groups n type s default ^\ desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host. . name reconnect applies x C type b default false desc When true, %p% will automatically reconnect to a host after it disconnects. . name rectangleSelect applies x groups i type b default false switch -set rectangleSelect switch -clear rectangleSelect option Options -> Toggles -> Select by Rectangles desc When true, %p% will always select rectangular areas of the screen. When false, %p% will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm. . name reverseVideo applies c type b groups a default false option -rv desc When true, %p% will use a white background instead of a black one. . name rprnt applies a groups n type s default ^R desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed. . name saveLines applies x C type i default 4096 switch -sl desc The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved. . name sbcsCgcsgid applies a groups p type s desc Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use %-dbcsCgcsgid% for the double-byte (DBCS) character set. . name schemeList applies x type s desc Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme. . name screenTrace applies a groups t type b default false switch -set screenTrace switch -clear screenTrace option File -> Save Screen(s) in File desc When true, %p% will save an ASCII version of the screen image in a file every time it changes. The file name defaults to if u x3scr.pid. else x3scr.pid.txt. endif The directory where the file is written is defined by %-traceDir%. If %-screenTraceFile% is defined, it defines the file name and %-traceDir% is ignored. if w file name. endif . name screenTraceFile applies a groups t type s desc If defined, gives the name of the file that screen traces will be written into. . name scripted applies x type b default false switch -script desc When true, %p% will read commands from standard input. The rules for these commands are documented in the x3270-script manual page. . name scriptPort applies a type i switch -scriptport desc If defined, %p% will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name scriptPortOnce applies a type b default false switch -scriptportonce desc If defined, %p% will accept only one script connection. When that connection is broken, it will exit. . name scrollBar applies x type b default false switch -sb switch +sb switch -set scrollBar switch -clear scrollBar desc When true, %p% will display a scroll bar to the right of the emulator window. . name secure applies x groups s type b default false desc When true, %p% will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and %-disconnectClear% is true. See %-noOther% and %-suppressActions% for additional security options. . name selectBackground applies x groups a type s default dimGrey desc On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video. . name showTiming applies x groups a type b default false switch -set showTiming switch -clear showTiming option Options -> Toggles -> Show Timing desc When true, %p% will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent. . name socket applies u type b default false switch -socket desc When true, %p% will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket. . name startTls applies a type b groups s default true description If true, %p% will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them. . name *suppress applies x groups s type b desc When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress . name suppressActions applies a groups s type s desc A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options. . name suppressFontMenu applies x type b default false desc If true, the Options -> Font menu will not be displayed. . name suppressHost applies x type b default false desc If true, %p% will omit the hostname from the File -> About %p% -> Connection Status pop-up. . name termName applies a groups p type s switch -tn desc An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of %-model%. . name title applies x wc groups a type s switch -title desc Sets the title for the %p% window, overriding the default of constructing the name from the host that is connected to. . name trace applies a groups t type b default false switch -trace switch -set trace switch -clear trace option File -> Trace Data and Events description When true, %p% writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name traceCommand applies x type s default tail -f desc Defines the command that runs in the trace window. . name traceDir applies a groups t type s if u default /tmp endif if wc default current user's Desktop endif if ws default current directory endif desc Defines the directory that trace files are written into. . name traceFile applies a groups t type s switch -tracefile desc If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. if x If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created. endif . name traceFileSize applies a groups t type s switch -tracefilesize desc If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started. . name traceMonitor applies x wc groups t type b default true desc When true, %p% will create a window to monitor data stream and event traces. When false, no monitor window will be if x created (and the value of none for %-traceFile% will be considered invalid). else created. endif . name typeahead applies w C type b default true desc When true, %p% will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped. . name underscore applies C groups a type b if c default false else default true endif switch -set underscore switch -clear underscore desc When true, %p% will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed if c on terminals that else to overcome the fact that Windows consoles endif are unable to display real underlined text. . name unlockDelay applies x c wc type b default true desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% implements a hack to briefly delay actually unlocking the keyboard. When %-unlockDelay% is true (the default), the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. Setting it to false removes this delay. . name unlockDelay applies s ws tcl type b default false desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. . name unlockDelayMs applies a type i default 350 desc Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and %p% actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros. . name useCursorColor applies x groups a type b default false desc If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by %-cursorColor%. . name user applies a type s switch -user groups p description Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name utf8 applies S type b switch -utf8 description Forces local I/O to use UTF-8 encoding, regardless of the local codepage. . name verifyHostCert applies a type b groups s switch -noverifycert switch -verifycert default true description If true (the default), %p% will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, %p% will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking. . name visibleControl applies x C type b default false switch -set visibleControl switch -clear visibleControl option Options -> Toggles -> Visible Control Characters desc If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, if x c displayed with underlines, endif are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, if x c displayed in yellow with underlines, endif if wc displayed in reverse-video yellow, endif are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified
    . name visualBell applies x groups i type b default false desc When true, %p% will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell. . name visualBell applies wc groups i type b default false desc Deprecated resource -- replaced by %-bellMode%

    When true, %p% will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, %p% will beep the console and flash the screen.

    Note that this resource is overridden by %-bellMode%. %-bellMode% is the preferred method of controlling the console bell behavior. . name visualSelect applies x groups a type b default false desc This resource controls how %p% displays light pen selectable fields that do not have a color explicitly set by the host. When true, %p% will display these fields using the color defined by %-visualSelectColor%. When false, %p% will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode. . name visualSelectColor applies x groups a type i default 6 desc The host color index of the color to use to display light pen selectable fields. This resource is used only if %-visualSelect% is true. The default is 6 (yellow). . name waitCursor applies x groups a type s default watch desc The name of the mouse cursor displayed when %p% is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>. . name werase applies a groups n type s default ^W desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action. . EOF suite3270-3.6/c3270/resources.inc0000664000076500007650000003113613221577163014443 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ifelse(XX_PRODUCT,c3270,`XX_SH(Screen Size Switching) When running as a 3270 Model 5, XX_FB(c3270) can take advantage of terminals that can switch between 80 and 132 column modes. XX_LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to XX_FB(c3270). These are specified with the XX_FB(XX_DASHED(altscreen)) and XX_FB(XX_DASHED(defscreen)) command-line options, or the XX_FB(altScreen) and XX_FB(defScreen) resources. XX_FB(XX_DASHED(altscreen)) or XX_FB(altScreen) defines the alternate (132-column) mode; XX_FB(XX_DASHED(defscreen)) or XX_FB(defScreen) defines the default (80-column) mode. XX_LP The syntax for the options and resources is XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string), where XX_FI(rows) and XX_FI(cols) give the screen dimensions, and XX_FI(init_string) is the escape sequence to transmit to the terminal to enter that mode. For XX_FB(defscreen), the minimum dimensions are 24 rows and 80 columns. For XX_FB(altscreen), the minimum dimensions are 27 rows and 132 columns. Within XX_FI(init_string), the usual escape sequences are supported (XX_BACKSLASH(E) for escape, XX_BACKSLASH(r), XX_BACKSLASH(b), etc.). For example, the init string for a 132-column xterm is: XX_IP XX_BACKSLASH(E)[?40h`'XX_BACKSLASH(E)[?3h XX_LP Note: When XX_FB(defscreen) and XX_FB(altscreen) are specified, the model number is always set to 5. ')dnl XX_SH(Resources) Certain XX_FB(XX_PRODUCT) options can be configured via resources. Resources are defined ifelse(XX_PRODUCT,c3270,`in the file XX_FB(.c3270pro) in the XX_POSESSIVE(user) home directory, and ')dnl ifelse(XX_PRODUCT,wc3270,`in the session file, or ')dnl by XX_FB(XX_DASHED(xrm)) options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in XX_FB(XX_PRODUCT) are: XX_LP XX_TS(4, l l l l.) XX_TR(XX_TD(Resource) XX_TD(Default) XX_TD(Option) XX_TD(Purpose)) XX_T_() ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(allBold) XX_TD(Auto) XX_TD(XX_DASHED(allbold)) XX_TD(Display all characters bold)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(altScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(altscreen)) XX_TD(132-col screen definition)) ')dnl XX_TR(XX_TD(blankFill) XX_TD(False) XX_TD(XX_DASHED(set) blankFill) XX_TD(Blank Fill mode)) XX_TR(XX_TD(charset) XX_TD(bracket) XX_TD(XX_DASHED(charset)) XX_TD(XX_SM(EBCDIC) character set)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(composeMap) XX_TD(latin1) XX_TD(XX_NBSP) XX_TD(Name of composed-character map)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(consoleColorForHostColor`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForHostColor)`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForDefault)) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForIntensified)) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtected)) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtectedIntensified)) XX_TD(white) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(cursesKeymap) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Set curses keymap option)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(defScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(defscreen)) XX_TD(80-col screen definition)) ')dnl XX_TR(XX_TD(dbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override DBCS CGCSGID)) XX_TR(XX_TD(dsTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Data stream tracing)) XX_TR(XX_TD(eof) XX_TD(^D) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode XX_SM(EOF) character)) XX_TR(XX_TD(erase) XX_TD(^H) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode erase character)) XX_TR(XX_TD(extended) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Use 3270 extended data stream)) XX_TR(XX_TD(eventTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Event tracing)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForDefault) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForIntensified) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtected) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtectedIntensified) XX_TD(neutralWhite) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(hostsFile) XX_TD(XX_NBSP) XX_TD(XX_DASHED(hostsfile)) XX_TD(Host alias/macro file)) ')dnl XX_TR(XX_TD(icrnl) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(CR) to XX_SM(NL) on XX_SM(NVT)-mode input)) XX_TR(XX_TD(inlcr) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(NL) to XX_SM(CR) in XX_SM(NVT)-mode input)) XX_TR(XX_TD(intr) XX_TD(^C) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode interrupt character)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(keymap) XX_TD(XX_NBSP) XX_TD(XX_DASHED(keymap)) XX_TD(Keyboard map name)) XX_TR(XX_TD(keymap.XX_FI(foo)) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Definition of keymap XX_FI(foo))) ')dnl XX_TR(XX_TD(kill) XX_TD(^U) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode kill character)) XX_TR(XX_TD(lineWrap) XX_TD(False) XX_TD(XX_DASHED(set) lineWrap) XX_TD(XX_SM(NVT) line wrap mode)) XX_TR(XX_TD(lnext) XX_TD(^V) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode lnext character)) ifelse(XX_PRODUCT,ws3270,`XX_TR(XX_TD(localCp) XX_TD((system ANSI code page)) XX_TD(XX_DASHED(localcp)) XX_TD(Windows code page for local I/O)) ')dnl XX_TR(XX_TD(m3279) XX_TD(XX_LINK(#rn1,`(note 1)')) XX_TD(XX_DASHED(model)) XX_TD(3279 (color) emulation)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(metaEscape) XX_TD(Auto) XX_TD(XX_NBSP) XX_TD(Interpret ESC-x as Meta-x)) ')dnl ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(marginedPaste) XX_TD(False) XX_TD(XX_DASHED(set) marginedPaste) XX_TD(Keep left margin when pasting)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(mono) XX_TD(XX_LINK(#rn5, `(note 5)')) XX_TD(XX_DASHED(mono)) XX_TD(Ignore terminal color capabilities)) ')dnl XX_TR(XX_TD(monoCase) XX_TD(False) XX_TD(XX_DASHED(set) monoCase) XX_TD(Mono-case mode)) ifelse(XX_MODE,console,`XX_TR(XX_TD(noPrompt) XX_TD(False) XX_TD(XX_DASHED(noprompt)) XX_TD(Disable command-prompt mode)) ')dnl XX_TR(XX_TD(numericLock) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Lock keyboard for numeric field error)) XX_TR(XX_TD(oerrLock) XX_TD(ifelse(XX_PRODUCT,c3270,True,False)) XX_TD(XX_NBSP) XX_TD(Lock keyboard for input error)) ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(overlayPaste) XX_TD(False) XX_TD(XX_DASHED(set) overlayPaste) XX_TD(Overlay protected fields when pasting)) ')dnl XX_TR(XX_TD(oversize) XX_TD(XX_NBSP) XX_TD(XX_DASHED(oversize)) XX_TD(Oversize screen dimensions)) XX_TR(XX_TD(port) XX_TD(telnet) XX_TD(XX_DASHED(port)) XX_TD(Non-default TCP port)) ifelse(XX_MODE,console,`XX_TR(XX_TD(printer.*) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) XX_TR(XX_TD(printerLu) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(printTextFont) XX_TD(Courier New) XX_TD(XX_NBSP) XX_TD(PrintText font name)) XX_TR(XX_TD(printTextSize) XX_TD(8) XX_TD(XX_NBSP) XX_TD(PrintText font size)) ')dnl XX_TR(XX_TD(quit) XX_TD(^XX_BS) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode quit character)) ifelse(XX_MODE,console,`XX_TR(XX_TD(reconnect) XX_TD(False) XX_TD(XX_DASHED(reconnect)) XX_TD(Automatically reconnect to host)) ')dnl XX_TR(XX_TD(rprnt) XX_TD(^R) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode reprint character)) XX_TR(XX_TD(sbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override SBCS CGCSGID)) XX_TR(XX_TD(secure) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable "dangerous" options)) XX_TR(XX_TD(termName) XX_TD(XX_LINK(#rn2,`(note 2)')) XX_TD(XX_DASHED(tn)) XX_TD(XX_SM(TELNET) terminal type string)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(title) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Console window title)) ')dnl ifelse(XX_PLATFORM,windows,,`XX_TR(XX_TD(traceDir) XX_TD(/tmp) XX_TD(XX_NBSP) XX_TD(Directory for trace files)) ')dnl XX_TR(XX_TD(traceFile) XX_TD(XX_LINK(#rn3,`(note 3)')) XX_TD(XX_DASHED(tracefile)) XX_TD(File for trace output)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(typeahead) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Allow typeahead)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(visualBell) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable bell sound)) ')dnl XX_TR(XX_TD(werase) XX_TD(^W) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode word-erase character)) XX_TE() XX_LP XX_RS(`XX_TARGET(rn1)XX_FI(Note 1): XX_FB(m3279) defaults to ifelse(XX_PRODUCT,c3270,`XX_FB(True) if the terminal supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,wc3270,`XX_FB(True). It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,x3270,`XX_FB(True) if the display supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', `XX_FB(False). It can be forced to XX_FB(True) with the proper XX_FB(XX_DASHED(model)) option.') XX_LP XX_TARGET(rn2)XX_FI(Note 2): The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as XX_FB(IBM-3279-2-E). Note also that when XX_SM(TN3270E) mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. XX_LP XX_TARGET(rn3)XX_FI(Note 3): The default trace file is ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(x3trc.)`'XX_FI(pid) in the directory specified by the XX_FB(traceDir) resource'). ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.')' ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn5)XX_FI(Note 5): XX_FB(mono) defaults to XX_FB(false) if the terminal supports at least 8 colors and to XX_FB(true) otherwise.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.' ')dnl ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.' ')) XX_LP ifelse(XX_PRODUCT,c3270,`In XX_FB(.c3270pro), lines are continued with a backslash character. XX_LP XX_FB(XX_DASHED(xrm)) options override definitions found in XX_FB(.c3270pro). ')dnl If more than one XX_FB(XX_DASHED(xrm)) option is given for the same resource, the last one on the command line is used. suite3270-3.6/c3270/screen.c0000664000076500007650000017222313221577163013364 0ustar pdmpdm/* * Copyright (c) 2000-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen.c * A curses-based 3270 Terminal Emulator * Screen drawing */ #include "globals.h" #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "ctlr.h" #include "toggles.h" #include "actions.h" #include "charset.h" #include "ctlrc.h" #include "cmenubar.h" #include "cstatus.h" #include "glue.h" #include "host.h" #include "keymap.h" #include "kybd.h" #include "macros.h" #include "popups.h" #include "screen.h" #include "see.h" #include "status.h" #include "telnet.h" #include "trace.h" #include "unicodec.h" #include "utf8.h" #include "utils.h" #include "xio.h" #include "xscroll.h" /* * The usual x3270 COLS variable (current number of columns in the 3270 * display) is called cCOLS in c3270, to avoid a conflict with curses COLS (the * number of columns on the physical termal). For c3270, globals.h #defines * COLS as cCOLS, so common code can use COLS transparently -- everywhere but * here. In this module, we #undef COLS, after #including globals.h but before * #including curses.h, and we use (curses) COLS and (c3270) cCOLS explicitly. */ #undef COLS #if defined(HAVE_NCURSESW_NCURSES_H) /*[*/ # include #elif defined(HAVE_NCURSES_NCURSES_H) /*][*/ # include #elif defined(HAVE_NCURSES_H) /*][*/ # include #else /*][*/ # include #endif /*]*/ #if defined(HAVE_NCURSESW_TERM_H) /*[*/ # include #elif defined(HAVE_NCURSES_TERM_H) /*][*/ # include #elif defined(HAVE_TERM_H) /*][*/ # include #endif /*]*/ /* Curses' 'COLS' becomes cursesCOLS, to remove any ambiguity. */ #define cursesCOLS COLS #define cursesLINES LINES #define STATUS_SCROLL_START_MS 1500 #define STATUS_SCROLL_MS 100 #define STATUS_PUSH_MS 5000 #define CM (60*10) /* csec per minute */ static int cp[16][16][2]; static int cmap8[16] = { COLOR_BLACK, /* neutral black */ COLOR_BLUE, /* blue */ COLOR_RED, /* red */ COLOR_MAGENTA, /* pink */ COLOR_GREEN, /* green */ COLOR_CYAN, /* turquoise */ COLOR_YELLOW, /* yellow */ COLOR_WHITE, /* neutral white */ COLOR_BLACK, /* black */ /* alas, this may be gray */ COLOR_BLUE, /* deep blue */ COLOR_YELLOW, /* orange */ COLOR_MAGENTA, /* purple */ COLOR_GREEN, /* pale green */ COLOR_CYAN, /* pale turquoise */ COLOR_BLACK, /* gray */ COLOR_WHITE /* white */ }; static int cmap16[16] = { COLOR_BLACK, /* neutral black */ 8 + COLOR_BLUE, /* blue */ COLOR_RED, /* red */ 8 + COLOR_MAGENTA, /* pink */ 8 + COLOR_GREEN, /* green */ 8 + COLOR_CYAN, /* turquoise */ 8 + COLOR_YELLOW, /* yellow */ 8 + COLOR_WHITE, /* neutral white */ COLOR_BLACK, /* black */ /* alas, this may be gray */ COLOR_BLUE, /* deep blue */ 8 + COLOR_RED, /* orange */ COLOR_MAGENTA, /* purple */ COLOR_GREEN, /* pale green */ COLOR_CYAN, /* pale turquoise */ COLOR_WHITE, /* gray */ 8 + COLOR_WHITE /* white */ }; static int *cmap = cmap8; static int defcolor_offset = 0; static int field_colors8[4] = { COLOR_GREEN, /* default */ COLOR_RED, /* intensified */ COLOR_BLUE, /* protected */ COLOR_WHITE /* protected, intensified */ }; static int field_colors16[4] = { 8 + COLOR_GREEN,/* default */ COLOR_RED, /* intensified */ 8 + COLOR_BLUE, /* protected */ 8 + COLOR_WHITE /* protected, intensified */ }; static int *field_colors = field_colors8; static int bg_color = COLOR_BLACK; static int defattr = A_NORMAL; static int xhattr = A_NORMAL; static unsigned long input_id; static int rmargin; bool escaped = true; bool initscr_done = false; enum ts { TS_AUTO, TS_ON, TS_OFF }; enum ts me_mode = TS_AUTO; enum ts ab_mode = TS_AUTO; #if defined(C3270_80_132) /*[*/ struct screen_spec { int rows, cols; char *mode_switch; } screen_spec; struct screen_spec altscreen_spec, defscreen_spec; static SCREEN *def_screen = NULL, *alt_screen = NULL; static SCREEN *cur_screen = NULL; static void parse_screen_spec(const char *str, struct screen_spec *spec); #endif /*]*/ static struct { char *name; int index; } cc_name[] = { { "black", COLOR_BLACK }, { "red", COLOR_RED }, { "green", COLOR_GREEN }, { "yellow", COLOR_YELLOW }, { "blue", COLOR_BLUE }, { "magenta", COLOR_MAGENTA }, { "cyan", COLOR_CYAN }, { "white", COLOR_WHITE }, { NULL, 0 } }; static int status_row = 0; /* Row to display the status line on */ static int status_skip = 0; /* Row to blank above the status line */ static int screen_yoffset = 0; /* Vertical offset to top of screen. If 0, there is no menu bar. If nonzero (2, actually), menu bar is at the top of the display. */ static int crosshair_color = HOST_COLOR_PURPLE; static bool curses_alt = false; #if defined(HAVE_USE_DEFAULT_COLORS) /*[*/ static bool default_colors = false; #endif /*]*/ static bool screen_initted = false; static void kybd_input(iosrc_t fd, ioid_t id); static void kybd_input2(int k, ucs4_t ucs4, int alt); static void draw_oia(void); static void screen_connect(bool connected); static void status_half_connect(bool ignored); static void status_connect(bool ignored); static void status_3270_mode(bool ignored); static void status_printer(bool on); static int get_color_pair(int fg, int bg); static int color_from_fa(unsigned char); static void set_status_row(int screen_rows, int emulator_rows); static bool ts_value(const char *s, enum ts *tsp); static void display_linedraw(unsigned char ebc); static void display_ge(unsigned char ebc); static void init_user_colors(void); static void init_user_attribute_colors(void); static void screen_init2(void); static action_t Redraw_action; /* * Crosshair color init. */ static void crosshair_color_init(void) { int c; if (appres.interactive.crosshair_color != NULL) { c = decode_host_color(appres.interactive.crosshair_color); if (c >= 0) { crosshair_color = c; return; } else { xs_warning("Invalid %s: %s", ResCrosshairColor, appres.interactive.crosshair_color); } } crosshair_color = HOST_COLOR_PURPLE; } /* Initialize the screen. */ void screen_init(void) { menu_init(); #if defined(C3270_80_132) /*[*/ /* Parse altscreen/defscreen. */ if ((appres.c3270.altscreen != NULL) ^ (appres.c3270.defscreen != NULL)) { (void) fprintf(stderr, "Must specify both altscreen and defscreen\n"); exit(1); } if (appres.c3270.altscreen != NULL) { parse_screen_spec(appres.c3270.altscreen, &altscreen_spec); if (altscreen_spec.rows < 27 || altscreen_spec.cols < 132) { (void) fprintf(stderr, "Rows and/or cols too small on " "alternate screen (mininum 27x132)\n"); exit(1); } parse_screen_spec(appres.c3270.defscreen, &defscreen_spec); if (defscreen_spec.rows < 24 || defscreen_spec.cols < 80) { (void) fprintf(stderr, "Rows and/or cols too small on " "default screen (mininum 24x80)\n"); exit(1); } } #endif /*]*/ /* * See about keyboard Meta-key behavior. * * Note: Formerly, "auto" meant to use the terminfo 'km' capability (if * set, then disable metaEscape). But popular terminals like the * Linux console and xterms are actually configurable, though they have * fixed terminfo capabilities. It is harmless to enable metaEscape * when the terminal supports it, so the default is now 'on'. * * Setting the high bit for the Meta key is a pretty achaic idea, IMO, * so we no loger support it. */ if (!ts_value(appres.c3270.meta_escape, &me_mode)) popup_an_error("Invalid %s value: '%s', " "assuming 'auto'\n", ResMetaEscape, appres.c3270.meta_escape); if (me_mode == TS_AUTO) me_mode = TS_ON; /* See about all-bold behavior. */ if (appres.c3270.all_bold_on) ab_mode = TS_ON; else if (!ts_value(appres.c3270.all_bold, &ab_mode)) popup_an_error("Invalid %s value: '%s', " "assuming 'auto'\n", ResAllBold, appres.c3270.all_bold); if (ab_mode == TS_AUTO) ab_mode = (appres.m3279 && (appres.color8 || COLORS < 16))? TS_ON: TS_OFF; if (ab_mode == TS_ON) defattr |= A_BOLD; /* * If they don't want ACS and they're not in a UTF-8 locale, switch * to ASCII-art mode for box drawing. */ if ( #if defined(CURSES_WIDE) /*[*/ !appres.c3270.acs && #endif /*]*/ !is_utf8) { appres.c3270.ascii_box_draw = true; } /* Pull in the user's color mappings. */ init_user_colors(); init_user_attribute_colors(); crosshair_color_init(); /* Initialize the controller. */ ctlr_init(ALL_CHANGE); } /* * Finish screen initialization, when a host connects or when we go into * 'zombie' mode (no prompt, no connection). */ static void finish_screen_init(void) { int want_ov_rows = ov_rows; int want_ov_cols = ov_cols; bool oversize = false; char *cl; if (screen_initted) { return; } screen_initted = true; /* Clear the (original) screen first. */ #if defined(C3270_80_132) /*[*/ if (appres.c3270.defscreen != NULL) { putenv(xs_buffer("COLUMNS=%d", defscreen_spec.cols)); putenv(xs_buffer("LINES=%d", defscreen_spec.rows)); } #endif /*]*/ (void) setupterm(NULL, fileno(stdout), NULL); if ((cl = tigetstr("clear")) != NULL) { putp(cl); } #if !defined(C3270_80_132) /*[*/ /* Initialize curses. */ if (initscr() == NULL) { (void) fprintf(stderr, "Can't initialize terminal.\n"); exit(1); } initscr_done = true; #else /*][*/ /* Set up ncurses, and see if it's within bounds. */ if (appres.c3270.defscreen != NULL) { putenv(xs_buffer("COLUMNS=%d", defscreen_spec.cols)); putenv(xs_buffer("LINES=%d", defscreen_spec.rows)); def_screen = newterm(NULL, stdout, stdin); initscr_done = true; if (def_screen == NULL) { (void) fprintf(stderr, "Can't initialize %dx%d defscreen terminal.\n", defscreen_spec.rows, defscreen_spec.cols); exit(1); } if (write(1, defscreen_spec.mode_switch, strlen(defscreen_spec.mode_switch)) < 0) { endwin(); exit(1); } } if (appres.c3270.altscreen) { putenv(xs_buffer("COLUMNS=%d", altscreen_spec.cols)); putenv(xs_buffer("LINES=%d", altscreen_spec.rows)); } alt_screen = newterm(NULL, stdout, stdin); if (alt_screen == NULL) { popup_an_error("Can't initialize terminal.\n"); exit(1); } initscr_done = true; if (def_screen == NULL) { def_screen = alt_screen; cur_screen = def_screen; } if (appres.c3270.altscreen) { set_term(alt_screen); cur_screen = alt_screen; } /* If they want 80/132 switching, then they want a model 5. */ if (def_screen != alt_screen && model_num != 5) { set_rows_cols(5, 0, 0); } #endif /*]*/ while (cursesLINES < maxROWS || cursesCOLS < maxCOLS) { /* * First, cancel any oversize. This will get us to the correct * model number, if there is any. */ if ((ov_cols && ov_cols > cursesCOLS) || (ov_rows && ov_rows > cursesLINES)) { ov_cols = 0; ov_rows = 0; oversize = true; continue; } /* If we're at the smallest screen now, give up. */ if (model_num == 2) { popup_an_error("Emulator won't fit on a %dx%d display.\n", cursesLINES, cursesCOLS); exit(1); } /* Try a smaller model. */ set_rows_cols(model_num - 1, 0, 0); } /* * Now, if they wanted an oversize, but didn't get it, try applying it * again. */ if (oversize) { if (want_ov_rows > cursesLINES - 2) { want_ov_rows = cursesLINES - 2; } if (want_ov_rows < maxROWS) { want_ov_rows = maxROWS; } if (want_ov_cols > cursesCOLS) { want_ov_cols = cursesCOLS; } set_rows_cols(model_num, want_ov_cols, want_ov_rows); } /* * Finally, if they want automatic oversize, see if that's possible. */ if (ov_auto && (maxROWS < cursesLINES - 3 || maxCOLS < cursesCOLS)) { set_rows_cols(model_num, cursesCOLS, cursesLINES - 3); } #if defined(NCURSES_MOUSE_VERSION) /*[*/ if (appres.c3270.mouse && mousemask(BUTTON1_RELEASED, NULL) == 0) { appres.c3270.mouse = false; } #endif /*]*/ /* Figure out where the status line goes, if it fits. */ #if defined(C3270_80_132) /*[*/ if (def_screen != alt_screen) { /* Start out in defscreen mode. */ set_status_row(defscreen_spec.rows, MODEL_2_ROWS); } else #endif /*]*/ { /* Start out in altscreen mode. */ set_status_row(cursesLINES, maxROWS); } /* Implement reverse video. */ if (appres.c3270.reverse_video) { int c; bg_color = COLOR_WHITE; c = cmap8[HOST_COLOR_NEUTRAL_BLACK]; cmap8[HOST_COLOR_NEUTRAL_BLACK] = cmap8[HOST_COLOR_NEUTRAL_WHITE]; cmap8[HOST_COLOR_NEUTRAL_WHITE] = c; c = cmap16[HOST_COLOR_NEUTRAL_BLACK]; cmap16[HOST_COLOR_NEUTRAL_BLACK] = cmap16[HOST_COLOR_NEUTRAL_WHITE]; cmap16[HOST_COLOR_NEUTRAL_WHITE] = c; } /* Play with curses color. */ if (!appres.interactive.mono) { #if defined(HAVE_USE_DEFAULT_COLORS) /*[*/ char *colorterm; #endif /*]*/ start_color(); #if defined(HAVE_USE_DEFAULT_COLORS) /*[*/ if ((appres.c3270.default_fgbg || (((colorterm = getenv("COLORTERM")) != NULL && !strcmp(colorterm, "gnome-terminal")) || getenv("VTE_VERSION") != NULL)) && use_default_colors() != ERR) { default_colors = true; } #endif /*]*/ if (has_colors() && COLORS >= 8) { if (!appres.color8 && COLORS >= 16) { cmap = cmap16; field_colors = field_colors16; defcolor_offset = 8; if (appres.c3270.reverse_video) { bg_color += defcolor_offset; } } if (appres.m3279) { defattr = get_color_pair(defcolor_offset + COLOR_BLUE, bg_color); xhattr = get_color_pair(defcolor_offset + cmap[crosshair_color], bg_color); } else { defattr = get_color_pair(defcolor_offset + COLOR_GREEN, bg_color); xhattr = get_color_pair(defcolor_offset + COLOR_GREEN, bg_color); } if (COLORS < 16) { appres.color8 = true; } #if defined(C3270_80_132) && defined(NCURSES_VERSION) /*[*/ if (def_screen != alt_screen) { SCREEN *s = cur_screen; /* Initialize the colors for the other screen. */ if (s == def_screen) { set_term(alt_screen); } else { set_term(def_screen); } start_color(); curses_alt = !curses_alt; (void) get_color_pair(field_colors[2], bg_color); curses_alt = !curses_alt; set_term(s); } #endif /*]*/ } else { appres.interactive.mono = true; appres.m3279 = false; /* Get the terminal name right. */ set_rows_cols(model_num, want_ov_cols, want_ov_rows); } } /* Set up the scrollbar. */ scroll_buf_init(); screen_init2(); } /* When the host connects, really initialize the screen. */ static void screen_connect(bool connected) { if (connected && !screen_initted) finish_screen_init(); } /* Configure the TTY settings for a curses screen. */ static void setup_tty(void) { extern void pause_for_errors(void); if (appres.c3270.cbreak_mode) { cbreak(); } else { raw(); } noecho(); nonl(); intrflush(stdscr,FALSE); if (appres.c3270.curses_keypad) { keypad(stdscr, TRUE); } meta(stdscr, TRUE); nodelay(stdscr, TRUE); refresh(); } #if defined(C3270_80_132) /*[*/ static void swap_screens(SCREEN *new_screen) { set_term(new_screen); cur_screen = new_screen; } #endif /*]*/ /* Secondary screen initialization. */ static void screen_init2(void) { escaped = false; /* * Finish initializing ncurses. This should be the first time that it * will send anything to the terminal. */ /* Set up the keyboard. */ #if defined(C3270_80_132) /*[*/ swap_screens(alt_screen); #endif /*]*/ setup_tty(); scrollok(stdscr, FALSE); #if defined(C3270_80_132) /*[*/ if (def_screen != alt_screen) { /* * The first setup_tty() set up altscreen. * Set up defscreen now, and leave it as the * current curses screen. */ swap_screens(def_screen); setup_tty(); scrollok(stdscr, FALSE); #if defined(NCURSES_MOUSE_VERSION) /*[*/ if (appres.c3270.mouse) { mousemask(BUTTON1_RELEASED, NULL); } #endif /*]*/ } #endif /*]*/ /* Subscribe to input events. */ input_id = AddInput(0, kybd_input); /* Ignore SIGINT and SIGTSTP. */ signal(SIGINT, SIG_IGN); signal(SIGTSTP, SIG_IGN); #if defined(C3270_80_132) /*[*/ /* Ignore SIGWINCH -- it might happen when we do 80/132 changes. */ if (def_screen != alt_screen) { signal(SIGWINCH, SIG_IGN); } #endif /*]*/ } /* Calculate where the status line goes now. */ static void set_status_row(int screen_rows, int emulator_rows) { /* Check for OIA room first. */ if (screen_rows < emulator_rows + 1) { status_row = status_skip = 0; } else if (screen_rows == emulator_rows + 1) { status_skip = 0; status_row = emulator_rows; } else { status_skip = screen_rows - 2; status_row = screen_rows - 1; } /* Then check for menubar room. Use 2 rows, 1 in a pinch. */ if (appres.interactive.menubar && appres.c3270.mouse) { if (screen_rows >= emulator_rows + (status_row != 0) + 2) { screen_yoffset = 2; } else if (screen_rows >= emulator_rows + (status_row != 0) + 1) { screen_yoffset = 1; } else { screen_yoffset = 0; } } } /* * Parse a tri-state resource value. * Returns true for success, false for failure. */ static bool ts_value(const char *s, enum ts *tsp) { *tsp = TS_AUTO; if (s != NULL && s[0]) { int sl = strlen(s); if (!strncasecmp(s, "true", sl)) *tsp = TS_ON; else if (!strncasecmp(s, "false", sl)) *tsp = TS_OFF; else if (strncasecmp(s, "auto", sl)) return false; } return true; } /* Allocate a color pair. */ static int get_color_pair(int fg, int bg) { static int next_pair[2] = { 1, 1 }; int pair; #if defined(C3270_80_132) && defined(NCURSES_VERSION) /*[*/ /* ncurses allocates colors for each screen. */ int pair_index = !!curses_alt; #else /*][*/ /* curses allocates colors globally. */ const int pair_index = 0; #endif /*]*/ int bg_arg = bg; int fg_arg = fg; if ((pair = cp[fg][bg][pair_index])) return COLOR_PAIR(pair); if (next_pair[pair_index] >= COLOR_PAIRS) return 0; #if defined(HAVE_USE_DEFAULT_COLORS) /*[*/ /* * Assume that by default, the terminal displays some sort of 'white' * against some sort of 'black', and that looks better than the * explicit curses COLOR_WHITE over COLOR_BLACK. */ if (default_colors) { if (bg == COLOR_BLACK) bg_arg = -1; /* use the default background, not black */ if (fg == COLOR_WHITE) fg_arg = -1; /* use the default foreground, not white */ } #endif /*]*/ if (init_pair(next_pair[pair_index], fg_arg, bg_arg) != OK) return 0; pair = cp[fg][bg][pair_index] = next_pair[pair_index]++; return COLOR_PAIR(pair); } /* * Initialize the user-specified attribute color mappings. */ static void init_user_attribute_color(int *a, const char *resname) { char *r; unsigned long l; char *ptr; int i; if ((r = get_resource(resname)) == NULL) return; for (i = 0; cc_name[i].name != NULL; i++) { if (!strcasecmp(r, cc_name[i].name)) { *a = cc_name[i].index; return; } } l = strtoul(r, &ptr, 0); if (ptr == r || *ptr != '\0' || (int)l >= COLORS) { xs_warning("Invalid %s value: %s", resname, r); return; } *a = (int)l; } static void init_user_attribute_colors(void) { init_user_attribute_color(&field_colors[0], ResCursesColorForDefault); init_user_attribute_color(&field_colors[1], ResCursesColorForIntensified); init_user_attribute_color(&field_colors[2], ResCursesColorForProtected); init_user_attribute_color(&field_colors[3], ResCursesColorForProtectedIntensified); } /* * Map a field attribute to a curses color index. * Applies only to m3279 mode -- does not work for mono. */ static int default_color_from_fa(unsigned char fa) { # define DEFCOLOR_MAP(f) \ ((((f) & FA_PROTECT) >> 4) | (((f) & FA_INT_HIGH_SEL) >> 3)) return field_colors[DEFCOLOR_MAP(fa)]; } static int color_from_fa(unsigned char fa) { if (appres.m3279) { int fg; fg = default_color_from_fa(fa); return get_color_pair(fg, bg_color) | (((ab_mode == TS_ON) || FA_IS_HIGH(fa))? A_BOLD: A_NORMAL); } else if (!appres.interactive.mono) { return get_color_pair(defcolor_offset + COLOR_GREEN, bg_color) | (((ab_mode == TS_ON) || FA_IS_HIGH(fa))? A_BOLD: A_NORMAL); } else { /* No color at all. */ return ((ab_mode == TS_ON) || FA_IS_HIGH(fa))? A_BOLD: A_NORMAL; } } /* * Set up the user-specified color mappings. */ /*static*/ void init_user_color(const char *name, int ix) { char *r; int i; unsigned long l; char *ptr; r = get_fresource("%s%s", ResCursesColorForHostColor, name); if (r == NULL) r = get_fresource("%s%d", ResCursesColorForHostColor, ix); if (r == NULL) return; for (i = 0; cc_name[i].name != NULL; i++) { if (!strcasecmp(r, cc_name[i].name)) { cmap[ix] = cc_name[i].index; return; } } l = strtoul(r, &ptr, 0); if (ptr != r && *ptr == '\0' && (int)l < COLORS) { cmap[ix] = (int)l; return; } xs_warning("Invalid %s value '%s'", ResCursesColorForHostColor, r); } static void init_user_colors(void) { int i; for (i = 0; host_color[i].name != NULL; i++) { init_user_color(host_color[i].name, host_color[i].index); } } /* * Find the display attributes for a baddr, fa_addr and fa. */ static int calc_attrs(int baddr, int fa_addr, int fa) { int fg, bg, gr, a; if (FA_IS_ZERO(fa)) { return color_from_fa(fa); } /* Compute the color. */ /* * Monochrome is easy, and so is color if nothing is * specified. */ if (!appres.m3279 || (!ea_buf[baddr].fg && !ea_buf[fa_addr].fg && !ea_buf[baddr].bg && !ea_buf[fa_addr].bg)) { a = color_from_fa(fa); } else { /* The current location or the fa specifies the fg or bg. */ if (ea_buf[baddr].fg) fg = cmap[ea_buf[baddr].fg & 0x0f]; else if (ea_buf[fa_addr].fg) fg = cmap[ea_buf[fa_addr].fg & 0x0f]; else fg = default_color_from_fa(fa); if (ea_buf[baddr].bg) bg = cmap[ea_buf[baddr].bg & 0x0f]; else if (ea_buf[fa_addr].bg) bg = cmap[ea_buf[fa_addr].bg & 0x0f]; else bg = cmap[HOST_COLOR_NEUTRAL_BLACK]; a = get_color_pair(fg, bg); } /* Compute the display attributes. */ if (ea_buf[baddr].gr) gr = ea_buf[baddr].gr; else if (ea_buf[fa_addr].gr) gr = ea_buf[fa_addr].gr; else gr = 0; if (gr & GR_BLINK) a |= A_BLINK; if (gr & GR_REVERSE) a |= A_REVERSE; if (gr & GR_UNDERLINE) a |= A_UNDERLINE; if ((gr & GR_INTENSIFY) || (ab_mode == TS_ON) || FA_IS_HIGH(fa)) a |= A_BOLD; return a; } /* * Return a visible control character for a field attribute. */ static unsigned char visible_fa(unsigned char fa) { static unsigned char varr[32] = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; unsigned ix; /* * This code knows that: * FA_PROTECT is 0b100000, and we map it to 0b010000 * FA_NUMERIC is 0b010000, and we map it to 0b001000 * FA_INTENSITY is 0b001100, and we map it to 0b000110 * FA_MODIFY is 0b000001, and we copy to 0b000001 */ ix = ((fa & (FA_PROTECT | FA_NUMERIC | FA_INTENSITY)) >> 1) | (fa & FA_MODIFY); return varr[ix]; } /** * Return a space or a line-drawing character, depending on whether the * given buffer address has a crosshair cursor on it. * * @param[in] baddr Buffer address * @param[out] acs Returned true if the returned character is a * curses ACS code * * @return Blank if not a crosshair region, possibly an ACS code (if acs * returned true), possibly an ASCII-art character (if asciiBoxDraw is * set), possibly a Unicode line-drawing character. */ static ucs4_t crosshair_blank(int baddr, unsigned char *acs) { ucs4_t u = ' '; *acs = 0; if (toggled(CROSSHAIR)) { bool same_row = ((baddr / cCOLS) == (cursor_addr / cCOLS)); bool same_col = ((baddr % cCOLS) == (cursor_addr % cCOLS)); if (same_row && same_col) { map_acs('n', &u, acs); /* cross */ } else if (same_row) { map_acs('q', &u, acs); /* horizontal */ } else if (same_col) { map_acs('x', &u, acs); /* vertical */ } } return u; } /** * Draw a crosshair line-drawing character returned by crosshair_blank(). * * @param[in] u Line-drawing character * @param[in] acs true if u is a curses ACS code */ static void draw_crosshair(ucs4_t u, bool acs) { char mb[16]; (void) attrset(xhattr); #if defined(CURSES_WIDE) /*[*/ if (u < 0x100 || acs) { addch(u); } else if (unicode_to_multibyte(u, mb, sizeof(mb))) { addstr(mb); } else { addch(' '); } #else /*][*/ addch(u); #endif /*]*/ } /* Display what's in the buffer. */ void screen_disp(bool erasing _is_unused) { int row, col; int field_attrs; unsigned char fa; struct screen_spec *cur_spec; enum dbcs_state d; int fa_addr; char mb[16]; /* This may be called when it isn't time. */ if (escaped) { return; } #if defined(C3270_80_132) /*[*/ /* See if they've switched screens on us. */ if (def_screen != alt_screen && screen_alt != curses_alt) { if (screen_alt) { if (write(1, altscreen_spec.mode_switch, strlen(altscreen_spec.mode_switch)) < 0) { exit(1); } vtrace("Switching to alt (%dx%d) screen.\n", altscreen_spec.rows, altscreen_spec.cols); swap_screens(alt_screen); cur_spec = &altscreen_spec; } else { if (write(1, defscreen_spec.mode_switch, strlen(defscreen_spec.mode_switch)) < 0) { exit(1); } vtrace("Switching to default (%dx%d) screen.\n", defscreen_spec.rows, defscreen_spec.cols); swap_screens(def_screen); cur_spec = &defscreen_spec; } /* Figure out where the status line goes now, if it fits. */ set_status_row(cur_spec->rows, ROWS); curses_alt = screen_alt; /* Tell curses to forget what may be on the screen already. */ clear(); } #endif /*]*/ /* If the menubar is separate, draw it first. */ if (screen_yoffset) { ucs4_t u = 0; bool highlight; unsigned char acs; int norm, high; if (menu_is_up) { if (appres.m3279) { norm = get_color_pair(COLOR_WHITE, COLOR_BLACK); high = get_color_pair(COLOR_BLACK, COLOR_WHITE); } else { norm = defattr & ~A_BOLD; high = defattr | A_BOLD; } } else { if (appres.m3279) { norm = get_color_pair(COLOR_WHITE, COLOR_BLACK); high = get_color_pair(COLOR_WHITE, COLOR_BLACK); } else { norm = defattr & ~A_BOLD; high = defattr & ~A_BOLD; } } for (row = 0; row < screen_yoffset; row++) { move(row, 0); for (col = 0; col < cCOLS; col++) { if (menu_char(row, col, true, &u, &highlight, &acs)) { (void) attrset(highlight? high: norm); #if defined(CURSES_WIDE) /*[*/ if (u < 0x100 || acs) { addch(u); } else if (unicode_to_multibyte(u, mb, sizeof(mb))) { addstr(mb); } else { addch(' '); } #else /*][*/ addch(u); #endif /*]*/ } else { (void) attrset(norm); addch(' '); } } } } fa = get_field_attribute(0); fa_addr = find_field_attribute(0); field_attrs = calc_attrs(fa_addr, fa_addr, fa); for (row = 0; row < ROWS; row++) { int baddr; if (!flipped) { move(row + screen_yoffset, 0); } for (col = 0; col < cCOLS; col++) { bool underlined = false; int attr_mask = toggled(UNDERSCORE)? (int)~A_UNDERLINE: -1; bool is_menu = false; ucs4_t u = 0; bool highlight = false; unsigned char acs = 0; if (flipped) { move(row + screen_yoffset, cCOLS-1 - col); } is_menu = menu_char(row + screen_yoffset, flipped? (cCOLS-1 - col): col, false, &u, &highlight, &acs); if (is_menu) { if (!u) { abort(); } if (appres.m3279) { if (highlight) { (void) attrset(get_color_pair(HOST_COLOR_NEUTRAL_BLACK, HOST_COLOR_NEUTRAL_WHITE)); } else { (void) attrset(get_color_pair(HOST_COLOR_NEUTRAL_WHITE, HOST_COLOR_NEUTRAL_BLACK)); } } else { if (highlight) { (void) attrset(defattr | A_BOLD); } else { (void) attrset(defattr); } } #if defined(CURSES_WIDE) /*[*/ if (u < 0x100 || acs) { addch(u); } else if (unicode_to_multibyte(u, mb, sizeof(mb))) { addstr(mb); } else { addch(' '); } #else /*][*/ addch(u); #endif /*]*/ } baddr = row*cCOLS+col; if (ea_buf[baddr].fa) { fa_addr = baddr; fa = ea_buf[baddr].fa; field_attrs = calc_attrs(baddr, baddr, fa); if (!is_menu) { if (toggled(VISIBLE_CONTROL)) { (void) attrset(get_color_pair(COLOR_YELLOW, COLOR_BLACK) | A_BOLD | A_UNDERLINE); addch(visible_fa(fa)); } else { u = crosshair_blank(baddr, &acs); if (u == ' ') { attrset(defattr); addch(' '); } else { draw_crosshair(u, acs); } } } } else if (FA_IS_ZERO(fa)) { if (!is_menu) { u = crosshair_blank(baddr, &acs); if (u == ' ') { (void) attrset(field_attrs & attr_mask); addch(' '); } else { draw_crosshair(u, acs); } if (field_attrs & A_UNDERLINE) { underlined = true; } } } else { char mb[16]; int len; int attrs; if (is_menu) { continue; } if (!(ea_buf[baddr].gr || ea_buf[baddr].fg || ea_buf[baddr].bg)) { attrs = field_attrs & attr_mask; (void) attrset(attrs); if (field_attrs & A_UNDERLINE) { underlined = true; } } else { int buf_attrs; buf_attrs = calc_attrs(baddr, fa_addr, fa); attrs = buf_attrs & attr_mask; (void) attrset(attrs); if (buf_attrs & A_UNDERLINE) { underlined = true; } } d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { int xaddr = baddr; INC_BA(xaddr); if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_null && ea_buf[xaddr].cc == EBC_null) { (void) attrset(attrs | A_UNDERLINE); addstr(".."); } else { len = ebcdic_to_multibyte( (ea_buf[baddr].cc << 8) | ea_buf[xaddr].cc, mb, sizeof(mb)); addstr(mb); } } else if (!IS_RIGHT(d)) { if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_null) { (void) attrset(attrs | A_UNDERLINE); addstr("."); } else if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_so) { (void) attrset(attrs | A_UNDERLINE); addstr("<"); } else if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_si) { (void) attrset(attrs | A_UNDERLINE); addstr(">"); } else if (ea_buf[baddr].cs == CS_LINEDRAW) { display_linedraw(ea_buf[baddr].cc); } else if (ea_buf[baddr].cs == CS_APL || (ea_buf[baddr].cs & CS_GE)) { display_ge(ea_buf[baddr].cc); } else { bool done_sbcs = false; len = ebcdic_to_multibyte_x( ea_buf[baddr].cc, CS_BASE, mb, sizeof(mb), EUO_BLANK_UNDEF | (appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0), NULL); if (len > 0) { len--; } if ((len == 1) && (mb[0] == ' ')) { u = crosshair_blank(baddr, &acs); if (u != ' ') { draw_crosshair(u, acs); done_sbcs = true; } } if (!done_sbcs) { if (toggled(UNDERSCORE) && underlined && (len == 1) && mb[0] == ' ') { mb[0] = '_'; } if (toggled(MONOCASE) && (len == 1) && !(mb[0] & 0x80) && islower((unsigned char)mb[0])) { mb[0] = toupper((unsigned char)mb[0]); } #if defined(CURSES_WIDE) /*[*/ addstr(mb); #else /*][*/ if (len > 1) { addch(' '); } else { addch(mb[0] & 0xff); } #endif /*]*/ } } } } } } if (status_row) { draw_oia(); } (void) attrset(defattr); if (menu_is_up) { menu_cursor(&row, &col); move(row, col); } else { if (flipped) { move((cursor_addr / cCOLS + screen_yoffset), cCOLS-1 - (cursor_addr % cCOLS)); } else { move((cursor_addr / cCOLS) + screen_yoffset, cursor_addr % cCOLS); } } refresh(); } /* ESC processing. */ static unsigned long eto = 0L; static bool meta_escape = false; static void escape_timeout(ioid_t id _is_unused) { vtrace("Timeout waiting for key following Escape, processing " "separately\n"); eto = 0L; meta_escape = false; kybd_input2(0, 0x1b, 0); } /* Keyboard input. */ static void kybd_input(iosrc_t fd _is_unused, ioid_t id _is_unused) { int k = 0; /* KEY_XXX, or 0 */ ucs4_t ucs4 = 0; /* input character, or 0 */ bool first = true; static bool failed_first = false; for (;;) { volatile int alt = 0; char dbuf[128]; #if defined(CURSES_WIDE) /*[*/ wint_t wch; size_t sz; #endif /*]*/ if (isendwin()) return; ucs4 = 0; #if defined(CURSES_WIDE) /*[*/ k = wget_wch(stdscr, &wch); #else /*][*/ k = wgetch(stdscr); #endif /*]*/ vtrace("k=%d " # if defined(CURSES_WIDE) /*[*/ "wch=%lu " # endif /*]*/ "\n", k # if defined(CURSES_WIDE) /*[*/ , (unsigned long)wch # endif /*]*/ ); if (k == ERR) { if (first) { if (failed_first) { vtrace("End of File, exiting.\n"); x3270_exit(1); } failed_first = true; } vtrace("k == ERR, return\n"); return; } else { failed_first = false; } #if !defined(CURSES_WIDE) /*[*/ /* Differentiate between KEY_XXX and regular input. */ if (!(k & ~0xff)) { char mb[2]; int consumed; enum me_fail error; /* Convert from local multi-byte to Unicode. */ mb[0] = k; mb[1] = '\0'; ucs4 = multibyte_to_unicode(mb, 1, &consumed, &error); if (ucs4 == 0) { vtrace("Invalid input char 0x%x\n", k); return; } k = 0; } #endif /*]*/ #if defined(CURSES_WIDE) /*[*/ if (k == KEY_CODE_YES) k = (int)wch; /* KEY_XXX */ else { char mbs[16]; wchar_t wcs[2]; k = 0; wcs[0] = wch; wcs[1] = 0; sz = wcstombs(mbs, wcs, sizeof(mbs)); if (sz == (size_t)-1) { vtrace("Invalid input wchar 0x%lx\n", (unsigned long)wch); return; } if (sz == 1) { ucs4 = mbs[0] & 0xff; } else { int consumed; enum me_fail error; ucs4 = multibyte_to_unicode(mbs, sz, &consumed, &error); if (ucs4 == 0) { vtrace("Unsupported input " "wchar 0x%lx\n", (unsigned long)wch); return; } } } #endif /*]*/ #if defined(NCURSES_MOUSE_VERSION) /*[*/ if (k == KEY_MOUSE) { MEVENT m; if (menu_is_up) { menu_key(MK_MOUSE, 0); return; } if (getmouse(&m) != OK) return; if ((m.bstate & BUTTON1_RELEASED)) { vtrace("Mouse BUTTON1_RELEASED " "(x=%d,y=%d)\n", m.x, m.y); if (screen_yoffset != 0 && m.y == 0) { popup_menu(m.x, (screen_yoffset != 0)); screen_disp(false); } else if (status_row && m.x == rmargin - 28 && m.y == status_row) { run_action("Show", IA_DEFAULT, "Stats", NULL); } else if (m.x < cCOLS && m.y - screen_yoffset >= 0 && m.y - screen_yoffset < ROWS) { if (flipped) cursor_move(((m.y - screen_yoffset) * cCOLS) + (cCOLS - m.x)); else cursor_move(((m.y - screen_yoffset) * cCOLS) + m.x); move(m.y + screen_yoffset, m.x); refresh(); } } return; } #endif /*]*/ /* Handle Meta-Escapes. */ if (meta_escape) { if (eto != 0L) { RemoveTimeOut(eto); eto = 0L; } meta_escape = false; alt = KM_ALT; } else if (me_mode == TS_ON && ucs4 == 0x1b) { vtrace("Key '%s' (curses key 0x%x, char code 0x%x)\n", decode_key(k, ucs4, alt, dbuf), k, ucs4); eto = AddTimeOut(100L, escape_timeout); vtrace(" waiting to see if Escape is followed by" " another key\n"); meta_escape = true; continue; } vtrace("Key '%s' (curses key 0x%x, char code 0x%x)\n", decode_key(k, ucs4, alt, dbuf), k, ucs4); kybd_input2(k, ucs4, alt); first = false; } } /* Translate a curses key to a menubar abstract key. */ static menu_key_t key_to_mkey(int k) { switch (k) { #if defined(NCURSES_MOUSE_VERSION) /*[*/ case KEY_MOUSE: return MK_MOUSE; #endif /*]*/ case KEY_UP: return MK_UP; case KEY_DOWN: return MK_DOWN; case KEY_LEFT: return MK_LEFT; case KEY_RIGHT: return MK_RIGHT; case KEY_HOME: return MK_HOME; case KEY_END: return MK_END; case KEY_ENTER: return MK_ENTER; case 0: return MK_NONE; default: return MK_OTHER; } } static void kybd_input2(int k, ucs4_t ucs4, int alt) { char buf[16]; char *action; int i; if (menu_is_up) { menu_key(key_to_mkey(k), ucs4); screen_disp(false); return; } action = lookup_key(k, ucs4, alt); if (action != NULL) { if (strcmp(action, "[ignore]")) push_keymap_action(action); return; } ia_cause = IA_DEFAULT; /* These first cases apply to both 3270 and NVT modes. */ switch (k) { case KEY_UP: run_action("Up", IA_DEFAULT, NULL, NULL); return; case KEY_DOWN: run_action("Down", IA_DEFAULT, NULL, NULL); return; case KEY_LEFT: run_action("Left", IA_DEFAULT, NULL, NULL); return; case KEY_RIGHT: run_action("Right", IA_DEFAULT, NULL, NULL); return; case KEY_HOME: run_action("Right", IA_DEFAULT, NULL, NULL); return; default: break; } switch (ucs4) { case 0x1d: run_action("Escape", IA_DEFAULT, NULL, NULL); return; } /* Then look for 3270-only cases. */ if (IN_3270) { switch(k) { case KEY_DC: run_action("Delete", IA_DEFAULT, NULL, NULL); return; case KEY_BACKSPACE: run_action("BackSpace", IA_DEFAULT, NULL, NULL); return; case KEY_HOME: run_action("Home", IA_DEFAULT, NULL, NULL); return; default: break; } switch(ucs4) { case 0x03: run_action("Clear", IA_DEFAULT, NULL, NULL); return; case 0x12: run_action("Reset", IA_DEFAULT, NULL, NULL); return; case 'L' & 0x1f: run_action("Redraw", IA_DEFAULT, NULL, NULL); return; case '\t': run_action("Tab", IA_DEFAULT, NULL, NULL); return; case 0177: run_action("Delete", IA_DEFAULT, NULL, NULL); return; case '\b': run_action("BackSpace", IA_DEFAULT, NULL, NULL); return; case '\r': run_action("Enter", IA_DEFAULT, NULL, NULL); return; case '\n': run_action("Newline", IA_DEFAULT, NULL, NULL); return; default: break; } } /* Do some NVT-only translations. */ if (IN_NVT) switch (k) { case KEY_DC: ucs4 = 0x7f; k = 0; break; case KEY_BACKSPACE: ucs4 = '\b'; k = 0; break; } /* Catch PF keys. */ for (i = 1; i <= 24; i++) { if (k == KEY_F(i)) { (void) sprintf(buf, "%d", i); run_action("PF", IA_DEFAULT, buf, NULL); return; } } /* Then any other 8-bit ASCII character. */ if (ucs4) { char ks[16]; sprintf(ks, "U+%04x", ucs4); run_action("Key", IA_DEFAULT, ks, NULL); return; } vtrace(" dropped (no default)\n"); } bool screen_suspend(void) { static bool need_to_scroll = false; bool needed = false; if (!initscr_done) { return false; } if (!isendwin()) { #if defined(C3270_80_132) /*[*/ if (def_screen != alt_screen) { /* * Call endwin() for the last-defined screen * (altscreen) first. Note that this will leave * the curses screen set to defscreen when this * function exits; if the 3270 is really in altscreen * mode, we will have to switch it back when we resume * the screen, below. */ if (!curses_alt) swap_screens(alt_screen); endwin(); swap_screens(def_screen); endwin(); } else { endwin(); } #else /*][*/ endwin(); #endif /*]*/ needed = true; } if (!escaped) { escaped = true; if (need_to_scroll) printf("\n"); else need_to_scroll = true; #if defined(C3270_80_132) /*[*/ if (curses_alt && def_screen != alt_screen) { if (write(1, defscreen_spec.mode_switch, strlen(defscreen_spec.mode_switch)) < 0) x3270_exit(1); } #endif /*]*/ RemoveInput(input_id); } return needed; } void screen_resume(void) { char *cl; escaped = false; /* * Clear the screen first, if possible, so future command output * starts at the bottom of the screen. */ if ((cl = tigetstr("clear")) != NULL) putp(cl); /* Finish screen initialization. */ if (!screen_initted) finish_screen_init(); #if defined(C3270_80_132) /*[*/ if (def_screen != alt_screen && curses_alt) { /* * When we suspended the screen, we switched to defscreen so * that endwin() got called in the right order. Switch back. */ swap_screens(alt_screen); if (write(1, altscreen_spec.mode_switch, strlen(altscreen_spec.mode_switch)) < 0) x3270_exit(1); } #endif /*]*/ screen_disp(false); refresh(); input_id = AddInput(0, kybd_input); } void cursor_move(int baddr) { cursor_addr = baddr; } static void toggle_monocase(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_disp(false); } static void toggle_underscore(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_disp(false); } static void toggle_visibleControl(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_disp(false); } /** * Toggle timing display. */ static void toggle_showTiming(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { if (!toggled(SHOW_TIMING)) { status_untiming(); } } /** * Toggle crosshair cursor. */ static void toggle_crosshair(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_disp(false); } /* Status line stuff. */ static bool status_ta = false; static bool status_rm = false; static bool status_im = false; static enum { SS_INSECURE, SS_UNVERIFIED, SS_SECURE } status_secure = SS_INSECURE; static bool oia_boxsolid = false; static bool oia_undera = true; static bool oia_compose = false; static bool oia_printer = false; static unsigned char oia_compose_char = 0; static enum keytype oia_compose_keytype = KT_STD; #define LUCNT 8 static char oia_lu[LUCNT+1]; static char oia_timing[6]; /* :ss.s*/ static char oia_screentrace = ' '; static char *status_msg = "X Not Connected"; static char *saved_status_msg = NULL; static ioid_t saved_status_timeout = NULL_IOID; static ioid_t oia_scroll_timeout = NULL_IOID; static void cancel_status_push(void) { saved_status_msg = NULL; if (saved_status_timeout != NULL_IOID) { RemoveTimeOut(saved_status_timeout); saved_status_timeout = NULL_IOID; } if (oia_scroll_timeout != NULL_IOID) { RemoveTimeOut(oia_scroll_timeout); oia_scroll_timeout = NULL_IOID; } } void status_ctlr_done(void) { oia_undera = true; } void status_insert_mode(bool on) { status_im = on; } static void status_pop(ioid_t id _is_unused) { status_msg = saved_status_msg; saved_status_msg = NULL; saved_status_timeout = NULL_IOID; } static void oia_scroll(ioid_t id _is_unused) { status_msg++; if (strlen(status_msg) > 35) oia_scroll_timeout = AddTimeOut(STATUS_SCROLL_MS, oia_scroll); else { saved_status_timeout = AddTimeOut(STATUS_PUSH_MS, status_pop); oia_scroll_timeout = NULL_IOID; } } void status_push(char *msg) { if (saved_status_msg != NULL) { /* Already showing something. */ RemoveTimeOut(saved_status_timeout); saved_status_timeout = NULL_IOID; } else { saved_status_msg = status_msg; } status_msg = msg; if (strlen(msg) > 35) oia_scroll_timeout = AddTimeOut(STATUS_SCROLL_START_MS, oia_scroll); else saved_status_timeout = AddTimeOut(STATUS_PUSH_MS, status_pop); } void status_minus(void) { cancel_status_push(); status_msg = "X -f"; } void status_oerr(int error_type) { cancel_status_push(); switch (error_type) { case KL_OERR_PROTECTED: status_msg = "X Protected"; break; case KL_OERR_NUMERIC: status_msg = "X Numeric"; break; case KL_OERR_OVERFLOW: status_msg = "X Overflow"; break; } } void status_reset(void) { cancel_status_push(); if (!CONNECTED) status_msg = "X Not Connected"; else if (kybdlock & KL_ENTER_INHIBIT) status_msg = "X Inhibit"; else if (kybdlock & KL_DEFERRED_UNLOCK) status_msg = "X"; else status_msg = ""; } void status_reverse_mode(bool on) { status_rm = on; } void status_syswait(void) { cancel_status_push(); status_msg = "X SYSTEM"; } void status_twait(void) { cancel_status_push(); oia_undera = false; status_msg = "X Wait"; } void status_typeahead(bool on) { status_ta = on; } void status_compose(bool on, unsigned char c, enum keytype keytype) { oia_compose = on; oia_compose_char = c; oia_compose_keytype = keytype; } void status_lu(const char *lu) { if (lu != NULL) { (void) strncpy(oia_lu, lu, LUCNT); oia_lu[LUCNT] = '\0'; } else (void) memset(oia_lu, '\0', sizeof(oia_lu)); } static void status_half_connect(bool half_connected) { if (half_connected) { /* Push the 'Connecting' status under whatever is popped up. */ if (saved_status_msg != NULL) saved_status_msg = "X Connecting"; else status_msg = "X Connecting"; oia_boxsolid = false; status_secure = SS_INSECURE; } } static void status_connect(bool connected) { cancel_status_push(); if (connected) { oia_boxsolid = IN_3270 && !IN_SSCP; if (kybdlock & KL_AWAITING_FIRST) status_msg = "X"; else status_msg = ""; if (net_secure_connection()) { if (net_secure_unverified()) status_secure = SS_UNVERIFIED; else status_secure = SS_SECURE; } else status_secure = SS_INSECURE; } else { oia_boxsolid = false; status_msg = "X Not Connected"; status_secure = SS_INSECURE; } } static void status_3270_mode(bool ignored _is_unused) { oia_boxsolid = IN_3270 && !IN_SSCP; if (oia_boxsolid) oia_undera = true; } static void status_printer(bool on) { oia_printer = on; } void status_timing(struct timeval *t0, struct timeval *t1) { static char no_time[] = ":??.?"; if (t1->tv_sec - t0->tv_sec > (99*60)) { strcpy(oia_timing, no_time); } else { unsigned long cs; /* centiseconds */ cs = (t1->tv_sec - t0->tv_sec) * 10 + (t1->tv_usec - t0->tv_usec + 50000) / 100000; if (cs < CM) (void) sprintf(oia_timing, ":%02ld.%ld", cs / 10, cs % 10); else (void) sprintf(oia_timing, "%02ld:%02ld", cs / CM, (cs % CM) / 10); } } void status_untiming(void) { oia_timing[0] = '\0'; } void status_scrolled(int n) { static char ssbuf[128]; cancel_status_push(); if (n) { snprintf(ssbuf, sizeof(ssbuf), "X Scrolled %d", n); status_msg = ssbuf; } else { status_msg = ""; } } void status_screentrace(int n) { if (n < 0) { oia_screentrace = ' '; } else if (n < 9) { oia_screentrace = "123456789"[n]; } else { oia_screentrace = '+'; } } void status_script(bool on _is_unused) { /* for now, nothing */ } static void draw_oia(void) { static bool filled_extra[2] = { false, false }; int i, j; int cursor_row = cursor_addr / cCOLS; int cursor_col = cursor_addr % cCOLS; int fl_cursor_col = flipped? (cursesCOLS - 1 - cursor_col): cursor_col; static struct { ucs4_t u; unsigned char acs; } vbar, hbar; static bool bars_done = false; /* Prepare the line-drawing characters for the crosshair. */ if (toggled(CROSSHAIR) && !bars_done) { map_acs('x', &vbar.u, &vbar.acs); map_acs('q', &hbar.u, &hbar.acs); bars_done = true; } #if defined(C3270_80_132) /*[*/ if (def_screen != alt_screen) { if (curses_alt) { rmargin = altscreen_spec.cols - 1; } else { rmargin = defscreen_spec.cols - 1; } } else #endif /*]*/ { rmargin = maxCOLS - 1; } /* Black out the parts of the screen we aren't using. */ if (!appres.interactive.mono && !filled_extra[!!curses_alt]) { int r, c; (void) attrset(defattr); for (r = 0; r <= status_row; r++) { int c0; if (r >= maxROWS && r != status_row) { c0 = 0; } else { c0 = maxCOLS; } move(r + screen_yoffset, c0); for (c = c0; c < cursesCOLS; c++) { printw(" "); } } } /* Make sure the status line region is filled in properly. */ if (!appres.interactive.mono) { int i; (void) attrset(defattr); if (status_skip) { move(status_skip + screen_yoffset, 0); for (i = 0; i < rmargin; i++) { printw(" "); } } move(status_row + screen_yoffset, 0); for (i = 0; i < rmargin; i++) { printw(" "); } } /* Draw or undraw the crosshair cursor outside the primary display. */ attrset(xhattr); /* Draw the crosshair over the menubar line. */ if (screen_yoffset && toggled(CROSSHAIR) && !menu_is_up && (mvinch(0, fl_cursor_col) & A_CHARTEXT) == ' ') { draw_crosshair(vbar.u, vbar.acs); } /* Draw the crosshair between the menubar and display. */ if (!menu_is_up && screen_yoffset > 1) { for (j = 0; j < cursesCOLS; j++) { move(1, j); if (toggled(CROSSHAIR) && j == fl_cursor_col) { draw_crosshair(vbar.u, vbar.acs); } else { addch(' '); } } } /* Draw the crosshair to the right of the display. */ for (i = 0; i < ROWS; i++) { for (j = cCOLS; j < cursesCOLS; j++) { move(i + screen_yoffset, j); if (toggled(CROSSHAIR) && i == cursor_row) { draw_crosshair(hbar.u, hbar.acs); } else { addch(' '); } } } /* * Draw the crosshair between the bottom of the display and the * OIA. */ for (i = screen_yoffset + ROWS; i < status_row; i++) { for (j = 0; j < cursesCOLS; j++) { move(i, j); if (toggled(CROSSHAIR) && j == fl_cursor_col) { draw_crosshair(vbar.u, vbar.acs); } else { addch(' '); } } } /* The OIA looks like (in Model 2/3/4 mode): 1 2 3 4 5 6 7 01234567890123456789012345678901234567890123456789012345678901234567890123456789 4AN Status-Message--------------------- Cn TRIPS LU-Name- :ss.s 000/000 7 6 5 4 3 2 1 98765432109876543210987654321098765432109876543210987654321098765432109876543210 On wider displays, there is a bigger gap between TRIPS and LU-Name. */ /* * If there is at least one black line between the 3270 display and the * OIA, draw a row of underlined blanks above the OIA. This is * something c3270 can do that wc3270 cannot, since Windows consoles * can't do underlining. */ if (status_row > screen_yoffset + maxROWS) { int i; (void) attrset(A_UNDERLINE | defattr); move(status_row - 1, 0); for (i = 0; i < rmargin; i++) { if (toggled(CROSSHAIR) && i == fl_cursor_col) { move(status_row - 1, i + 1); } else { printw(" "); } } } /* Clean up the OIA first, from a possible previous crosshair cursor. */ { int i; move(status_row, 0); (void) attrset(defattr); for (i = 0; i < cursesCOLS - 1; i++) { printw(" "); } } (void) attrset(A_REVERSE | defattr); mvprintw(status_row, 0, "4"); (void) attrset(A_UNDERLINE | defattr); if (oia_undera) { printw("%c", IN_E? 'B': 'A'); } else { printw(" "); } (void) attrset(A_REVERSE | defattr); if (IN_NVT) { printw("N"); } else if (oia_boxsolid) { printw(" "); } else if (IN_SSCP) { printw("S"); } else { printw("?"); } (void) attrset(defattr); mvprintw(status_row, 8, "%-35.35s", status_msg); mvprintw(status_row, rmargin-35, "%c%c %c%c%c%c", oia_compose? 'C': ' ', oia_compose? oia_compose_char: ' ', status_ta? 'T': ' ', status_rm? 'R': ' ', status_im? 'I': ' ', oia_printer? 'P': ' '); if (status_secure != SS_INSECURE) { if (appres.m3279) { (void) attrset(get_color_pair(defcolor_offset + ((status_secure == SS_SECURE)? COLOR_GREEN: COLOR_YELLOW), bg_color) | A_BOLD); } else { (void) attrset(A_BOLD); } printw("S"); (void) attrset(defattr); } else { printw(" "); } printw("%c", oia_screentrace); mvprintw(status_row, rmargin-25, "%s", oia_lu); if (toggled(SHOW_TIMING)) { mvprintw(status_row, rmargin-14, "%s", oia_timing); } if (toggled(CURSOR_POS)) { mvprintw(status_row, rmargin-7, "%03d/%03d ", cursor_addr/cCOLS + 1, cursor_addr%cCOLS + 1); } /* Draw the crosshair in the OIA. */ if (toggled(CROSSHAIR) && cursor_col > 2 && (mvinch(status_row, fl_cursor_col) & A_CHARTEXT) == ' ') { draw_crosshair(vbar.u, vbar.acs); } } bool Redraw_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Redraw", ia, argc, argv); if (check_argc("Redraw", argc, 0, 0) < 0) { return false; } if (!escaped) { endwin(); refresh(); } return true; } void ring_bell(void) { beep(); } void screen_flip(void) { flipped = !flipped; screen_disp(false); } #if defined(C3270_80_132) /*[*/ /* Alt/default screen spec parsing. */ static void parse_screen_spec(const char *str, struct screen_spec *spec) { char msbuf[3]; char *s, *t, c; bool escaped = false; if (sscanf(str, "%dx%d=%2s", &spec->rows, &spec->cols, msbuf) != 3) { (void) fprintf(stderr, "Invalid screen screen spec '%s', must " "be 'x='\n", str); exit(1); } s = strchr(str, '=') + 1; spec->mode_switch = Malloc(strlen(s) + 1); t = spec->mode_switch; while ((c = *s++)) { if (escaped) { switch (c) { case 'E': *t++ = 0x1b; break; case 'n': *t++ = '\n'; break; case 'r': *t++ = '\r'; break; case 'b': *t++ = '\b'; break; case 't': *t++ = '\t'; break; case '\\': *t++ = '\\'; break; default: *t++ = c; break; } escaped = false; } else if (c == '\\') escaped = true; else *t++ = c; } *t = '\0'; } #endif /*]*/ void screen_132(void) { #if defined(C3270_80_132) /*[*/ if (cur_screen != alt_screen) { swap_screens(alt_screen); if (write(1, altscreen_spec.mode_switch, strlen(altscreen_spec.mode_switch)) < 0) x3270_exit(1); ctlr_erase(true); screen_disp(true); } #endif /*]*/ } void screen_80(void) { #if defined(C3270_80_132) /*[*/ if (cur_screen != def_screen) { swap_screens(def_screen); if (write(1, defscreen_spec.mode_switch, strlen(defscreen_spec.mode_switch)) < 0) x3270_exit(1); ctlr_erase(false); screen_disp(true); } #endif /*]*/ } /* * Translate an x3270 font line-drawing character (the first two rows of a * standard X11 fixed-width font) to a curses ACS character. * * Returns -1 if there is no translation. */ static int linedraw_to_acs(unsigned char c) { switch (c) { #if defined(ACS_BLOCK) /*[*/ case 0x0: return ACS_BLOCK; #endif /*]*/ #if defined(ACS_DIAMOND) /*[*/ case 0x1: return ACS_DIAMOND; #endif /*]*/ #if defined(ACS_CKBOARD) /*[*/ case 0x2: return ACS_CKBOARD; #endif /*]*/ #if defined(ACS_DEGREE) /*[*/ case 0x7: return ACS_DEGREE; #endif /*]*/ #if defined(ACS_PLMINUS) /*[*/ case 0x8: return ACS_PLMINUS; #endif /*]*/ #if defined(ACS_BOARD) /*[*/ case 0x9: return ACS_BOARD; #endif /*]*/ #if defined(ACS_LANTERN) /*[*/ case 0xa: return ACS_LANTERN; #endif /*]*/ #if defined(ACS_LRCORNER) /*[*/ case 0xb: return ACS_LRCORNER; #endif /*]*/ #if defined(ACS_URCORNER) /*[*/ case 0xc: return ACS_URCORNER; #endif /*]*/ #if defined(ACS_ULCORNER) /*[*/ case 0xd: return ACS_ULCORNER; #endif /*]*/ #if defined(ACS_LLCORNER) /*[*/ case 0xe: return ACS_LLCORNER; #endif /*]*/ #if defined(ACS_PLUS) /*[*/ case 0xf: return ACS_PLUS; #endif /*]*/ #if defined(ACS_S1) /*[*/ case 0x10: return ACS_S1; #endif /*]*/ #if defined(ACS_S3) /*[*/ case 0x11: return ACS_S3; #endif /*]*/ #if defined(ACS_HLINE) /*[*/ case 0x12: return ACS_HLINE; #endif /*]*/ #if defined(ACS_S7) /*[*/ case 0x13: return ACS_S7; #endif /*]*/ #if defined(ACS_S9) /*[*/ case 0x14: return ACS_S9; #endif /*]*/ #if defined(ACS_LTEE) /*[*/ case 0x15: return ACS_LTEE; #endif /*]*/ #if defined(ACS_RTEE) /*[*/ case 0x16: return ACS_RTEE; #endif /*]*/ #if defined(ACS_BTEE) /*[*/ case 0x17: return ACS_BTEE; #endif /*]*/ #if defined(ACS_TTEE) /*[*/ case 0x18: return ACS_TTEE; #endif /*]*/ #if defined(ACS_VLINE) /*[*/ case 0x19: return ACS_VLINE; #endif /*]*/ #if defined(ACS_LEQUAL) /*[*/ case 0x1a: return ACS_LEQUAL; #endif /*]*/ #if defined(ACS_GEQUAL) /*[*/ case 0x1b: return ACS_GEQUAL; #endif /*]*/ #if defined(ACS_PI) /*[*/ case 0x1c: return ACS_PI; #endif /*]*/ #if defined(ACS_NEQUAL) /*[*/ case 0x1d: return ACS_NEQUAL; #endif /*]*/ #if defined(ACS_STERLING) /*[*/ case 0x1e: return ACS_STERLING; #endif /*]*/ #if defined(ACS_BULLET) /*[*/ case 0x1f: return ACS_BULLET; #endif /*]*/ default: return -1; } } static void display_linedraw(unsigned char ebc) { int c; char mb[16]; int len; #if defined(CURSES_WIDE) /*[*/ if (appres.c3270.acs) #endif /*]*/ { /* Try UCS first. */ c = linedraw_to_acs(ebc); if (c != -1) { addch(c); return; } } /* Then try Unicode. */ len = ebcdic_to_multibyte_x(ebc, CS_LINEDRAW, mb, sizeof(mb), EUO_BLANK_UNDEF | (appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0), NULL); if (len > 0) { len--; } #if defined(CURSES_WIDE) /*[*/ addstr(mb); #else /*][*/ if (len > 1) { addch(mb[0] & 0xff); } else { addch(' '); } #endif /*]*/ } static int apl_to_acs(unsigned char c) { switch (c) { #if defined(ACS_DEGREE) /*[*/ case 0xaf: /* CG 0xd1 */ return ACS_DEGREE; #endif /*]*/ #if defined(ACS_LRCORNER) /*[*/ case 0xd4: /* CG 0xac */ return ACS_LRCORNER; #endif /*]*/ #if defined(ACS_URCORNER) /*[*/ case 0xd5: /* CG 0xad */ return ACS_URCORNER; #endif /*]*/ #if defined(ACS_ULCORNER) /*[*/ case 0xc5: /* CG 0xa4 */ return ACS_ULCORNER; #endif /*]*/ #if defined(ACS_LLCORNER) /*[*/ case 0xc4: /* CG 0xa3 */ return ACS_LLCORNER; #endif /*]*/ #if defined(ACS_PLUS) /*[*/ case 0xd3: /* CG 0xab */ return ACS_PLUS; #endif /*]*/ #if defined(ACS_HLINE) /*[*/ case 0xa2: /* CG 0x92 */ return ACS_HLINE; #endif /*]*/ #if defined(ACS_LTEE) /*[*/ case 0xc6: /* CG 0xa5 */ return ACS_LTEE; #endif /*]*/ #if defined(ACS_RTEE) /*[*/ case 0xd6: /* CG 0xae */ return ACS_RTEE; #endif /*]*/ #if defined(ACS_BTEE) /*[*/ case 0xc7: /* CG 0xa6 */ return ACS_BTEE; #endif /*]*/ #if defined(ACS_TTEE) /*[*/ case 0xd7: /* CG 0xaf */ return ACS_TTEE; #endif /*]*/ #if defined(ACS_VLINE) /*[*/ case 0x85: /* CG 0xa84? */ return ACS_VLINE; #endif /*]*/ #if defined(ACS_LEQUAL) /*[*/ case 0x8c: /* CG 0xf7 */ return ACS_LEQUAL; #endif /*]*/ #if defined(ACS_GEQUAL) /*[*/ case 0xae: /* CG 0xd9 */ return ACS_GEQUAL; #endif /*]*/ #if defined(ACS_NEQUAL) /*[*/ case 0xbe: /* CG 0x3e */ return ACS_NEQUAL; #endif /*]*/ #if defined(ACS_BULLET) /*[*/ case 0xa3: /* CG 0x93 */ return ACS_BULLET; #endif /*]*/ case 0xad: return '['; case 0xbd: return ']'; default: return -1; } } static void display_ge(unsigned char ebc) { int c; char mb[16]; int len; #if defined(CURSES_WIDE) /*[*/ if (appres.c3270.acs) #endif /*]*/ { /* Try UCS first. */ c = apl_to_acs(ebc); if (c != -1) { addch(c); return; } } /* Then try Unicode. */ len = ebcdic_to_multibyte_x(ebc, CS_GE, mb, sizeof(mb), EUO_BLANK_UNDEF | (appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0), NULL); if (len > 0) { len--; } #if defined(CURSES_WIDE) /*[*/ addstr(mb); #else /*][*/ if (len > 1) { addch(mb[0] & 0xff); } else { addch(' '); } #endif /*]*/ } void screen_final() { char *cl; if ((cl = tigetstr("clear")) != NULL) { putp(cl); } } /** * Check if an area of the screen is selected. * This is implemented by wc3270, but not c3270, so it is a stub here. * * @param[in] baddr Buffer address. */ bool screen_selected(int baddr _is_unused) { return false; } /** * Stub for scrollbar function. * * @param[in] top Where the top of the scrollbar should be (percentage) * @param[in] shown How much of the scrollbar to show (percentage) */ void screen_set_thumb(float top _is_unused, float shown _is_unused) { } /** * Enable or disable the cursor when scrolling. * * @param[in] on Enable (true) or disable (false) the cursor display. */ void enable_cursor(bool on) { curs_set(on? 1: 0); } /** * Screen module registration. */ void screen_register(void) { static toggle_register_t toggles[] = { { MONOCASE, toggle_monocase, 0 }, { SHOW_TIMING, toggle_showTiming, 0 }, { UNDERSCORE, toggle_underscore, 0 }, { VISIBLE_CONTROL, toggle_visibleControl, 0 }, { CROSSHAIR, toggle_crosshair, 0 } }; static action_table_t screen_actions[] = { { "Redraw", Redraw_action, ACTION_KE } }; /* Register the toggles. */ register_toggles(toggles, array_count(toggles)); /* Register for state changes. */ register_schange(ST_CONNECT, screen_connect); register_schange(ST_HALF_CONNECT, status_half_connect); register_schange(ST_CONNECT, status_connect); register_schange(ST_3270_MODE, status_3270_mode); register_schange(ST_PRINTER, status_printer); /* Register the actions. */ register_actions(screen_actions, array_count(screen_actions)); } suite3270-3.6/c3270/version.txt0000775000076500007650000000006013221577443014160 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/c3270/x3270_glue.expect0000664000076500007650000002102713221577163014745 0ustar pdmpdm# Copyright (c) 2000-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Glue functions between 'expect' and x3270 # Usage: source x3270_glue.expect namespace eval x3270 { variable verbose 0 variable pid 0 # Start function: Start ?-nohup? ?program? ?options? # # Sets up the 'expect' environment correctly and spawns a 3270 # interface process. # # The 'program' and 'options' can be: # "x3270 -script" to drive an x3270 session # "s3270" to drive a displayless 3270 session # "x3270if -i" to run as a child script of x3270 (via the Script() # action) # # If "args" is empty, or starts with an option besides '-nohup', # guesses which process to start. # It will only guess "x3270if -i" or "s3270"; if you want to start # x3270, you need to specify it explicitly. # # Returns the process ID of the spawned process. proc Start {args} { global stty_init timeout spawn_id env variable verbose variable pid if {$pid != 0} {return -code error "Already started."} # If the first argument is "-nohup", remember that as an # argument to 'spawn'. if {[lindex $args 0] == "-nohup"} { set nohup {-ignore HUP} set args [lrange $args 1 end] } { set nohup {} } # If there are no arguments, or the first argument is an # option, guess what to start. # If X3270INPUT is defined in the environment, this must be a # child script; start x3270if. Otherwise, this must be a peer # script; start s3270. if {$args == {} || [string index [lindex $args 0] 0] == "-"} { if {[info exists env(X3270INPUT)]} { set args [concat x3270if -i $args] } { if {$::tcl_platform(platform) == "windows"} { set args [concat ws3270 $args] } { set args [concat s3270 $args] } } } # Set up the pty initialization default. set stty_init -echo # Spawn the process. if {$verbose} { set pid [eval [concat spawn $nohup $args]] } { set pid [eval [concat spawn -noecho $nohup $args]] log_user 0 } # Set the 'expect' timeout. set timeout -1 return $pid } # Basic interface command. Used internally by the action functions # below. proc cmd {cmd} { variable verbose variable pid if {$pid==0} { return -code error "Not started yet." } if {$verbose} {puts "+$cmd"} send "$cmd\r" expect { -re "data: (.*)\r?\n.*\r?\nok\r?\n$" { set r $expect_out(buffer) } -re ".*ok\r?\n" { return {} } -re "(.*)\r?\n.*?\r?\nerror\r?\n" { return -code error "$expect_out(1,string)" } -re ".*error\r?\n" { return -code error \ "$cmd failed: $expect_out(buffer)" } eof { set pid 0; error "process died" } } # Convert result to a list. set ret {} set iter 0 while {1} { if {! [regexp "data: (.*?)\r?\n" $r dummy elt]} {break} if {$iter==1} {set ret [list $ret]} set r [string range $r [expr [string length $elt]+7] \ end] if {$iter > 0} { set ret [linsert $ret end $elt] } { set ret $elt } set iter [expr $iter + 1] } if {$verbose} {puts "ret $iter"} return $ret } # Convert an argument list to a comma-separated list that x3270 will # accept. proc commafy {alist} { set i 0 set a "" while {$i < [llength $alist]} { if {$i > 0} { set a "$a,[lindex $alist $i]" } { set a [lindex $alist $i] } incr i } return $a } # Quote a text string into x3270-acceptable format. proc stringify {text} { set a "\"" set i 0 while {$i < [string len $text]} { set c [string range $text $i $i] switch -- $c { "\n" { set a "$a\\n" } "\r" { set a "$a\\r" } " " { set a "$a\\ " } "\"" { set a "$a\\\"" } default { set a "$a$c" } } incr i } set a "$a\"" return $a } # User-accessible actions. # Some of these apply only to x3270 and x3270if, and not to s3270. proc AltCursor {} { return [cmd "AltCursor"] } proc Ascii {args} { return [cmd "Ascii([commafy $args])"] } proc AsciiField {} { return [cmd "AsciiField"] } proc Attn {} { return [cmd "Attn"] } proc BackSpace {} { return [cmd "BackSpace"] } proc BackTab {} { return [cmd "BackTab"] } proc CircumNot {} { return [cmd "CircumNot"] } proc Clear {} { return [cmd "Clear"] } proc CloseScript {} { return [cmd "CloseScript"] } proc Cols {} { return [lindex [Status] 7] } proc Compose {} { return [cmd "Compose"] } proc Connect {host} { return [cmd "Connect($host)"] } proc CursorSelect {} { return [cmd "CursorSelect"] } proc Delete {} { return [cmd "Delete"] } proc DeleteField {} { return [cmd "DeleteField"] } proc DeleteWord {} { return [cmd "DeleteWord"] } proc Disconnect {} { return [cmd "Disconnect"] } proc Down {} { return [cmd "Down"] } proc Dup {} { return [cmd "Dup"] } proc Ebcdic {args} { return [cmd "Ebcdic([commafy $args])"] } proc EbcdicField {} { return [cmd "EbcdicField"] } proc Enter {} { return [cmd "Enter"] } proc Erase {} { return [cmd "Erase"] } proc EraseEOF {} { return [cmd "EraseEOF"] } proc EraseInput {} { return [cmd "EraseInput"] } proc FieldEnd {} { return [cmd "FieldEnd"] } proc FieldMark {} { return [cmd "FieldMark"] } proc FieldExit {} { return [cmd "FieldExit"] } proc Flip {} { return [cmd "Flip"] } proc HexString {x} { return [cmd "HexString($x)"] } proc Home {} { return [cmd "Home"] } proc Info {text} { return [cmd "Info([stringify $text])"] } proc Insert {} { return [cmd "Insert"] } proc Interrupt {} { return [cmd "Interrupt"] } proc Key {k} { return [cmd "Key($k)"] } proc Keymap {k} { return [cmd "Keymap($k)"] } proc Left {} { return [cmd "Left"] } proc Left2 {} { return [cmd "Left2"] } proc MonoCase {} { return [cmd "MonoCase"] } proc MoveCursor {r c} { return [cmd "MoveCursor($r,$c)"] } proc Newline {} { return [cmd "Newline"] } proc NextWord {} { return [cmd "NextWord"] } proc PA {n} { return [cmd "PA($n)"] } proc PF {n} { return [cmd "PF($n)"] } proc PreviousWord {} { return [cmd "PreviousWord"] } proc Quit {} { exit } proc Reset {} { return [cmd "Reset"] } proc Right {} { return [cmd "Right"] } proc Right2 {} { return [cmd "Right2"] } proc Rows {} { return [lindex [Status] 6] } proc SetFont {font} { return [cmd "SetFont($font)"] } proc Snap {args} { return [cmd "Snap([commafy $args])"] } proc Status {} { variable verbose variable pid if {$pid==0} { return -code error "Not started yet." } if {$verbose} {puts "+(nothing)"} send "\r" expect { -re ".*ok\r?\n" { set r $expect_out(buffer) } eof { set pid 0; error "process died" } } return [string range $r 0 [expr [string length $r]-7]] } proc String {text} { return [cmd "String([stringify $text])"] } proc SysReq {} { return [cmd "SysReq"] } proc Tab {} { return [cmd "Tab"] } proc ToggleInsert {} { return [cmd "ToggleInsert"] } proc ToggleReverse {} { return [cmd "ToggleReverse"] } proc TemporaryKeymap {args} { return [cmd "TemporaryKeymap($args)"] } proc Transfer {args} { return [cmd "Transfer([commafy $args])"] } proc Up {} { return [cmd "Up"] } proc Wait {args} { return [cmd "Wait([commafy $args])"] } # Extra function to toggle verbosity on the fly. proc Setverbose {level} { variable verbose set verbose $level return } # Export all the user-visible functions. namespace export \[A-Z\]* } # Import all of the exported functions. namespace import x3270::* suite3270-3.6/c3270/x3270.man.m40000664000076500007650000023655313221577163013547 0ustar pdmpdmdnl Copyright (c) 1993-2017, Paul Mattes. dnl Copyright (c) 1990, Jeff Sparkes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their dnl contributors may be used to endorse or promote products derived from dnl this software without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR dnl ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER dnl CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH dnl DAMAGE. define(XX_KEY,$1`'XX_LT()Key>$2)dnl define(XX_BTN,$1`'XX_LT()Btn$2>)dnl define(XX_action,`ifelse(XX_PRODUCT,tcl3270,command,action)')dnl define(XX_Action,`ifelse(XX_PRODUCT,tcl3270,Command,Action)')dnl XX_TH(XX_PRODUCT,1,XX_DATE) XX_SH(Name) XX_PRODUCT XX_DASH ifelse(XX_PRODUCT,c3270,`curses-based ')dnl XX_SM(IBM) host access tool XX_SH(Synopsis) XX_FB(XX_PRODUCT) ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')dnl [XX_FI(options)] [XX_FI(host)] ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_BR XX_FB(XX_PRODUCT) [XX_FI(options)] ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')XX_FI(session-file).XX_PRODUCT ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_SH(Description) XX_FB(XX_PRODUCT) opens a telnet connection to an XX_SM(IBM) ifelse(XX_PRODUCT,x3270,`host in an X window.', XX_PRODUCT,s3270,`host, then allows a script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_PRODUCT,ws3270,`host, then allows a script to control the host login session.', XX_PRODUCT,tcl3270,`host, then allows a tcl script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_MODE,console,`host in a console window.') It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. ifelse(XX_PRODUCT,x3270, `The window created by XX_FB(XX_PRODUCT) can use its own font for displaying characters, so it is a fairly accurate representation of an XX_SM(IBM) 3278 or 3279. It is similar to XX_FI(tn3270)(1) except that it is X-based, not curses-based. ')dnl ifelse(XX_PRODUCT,c3270, `If the console is capable of displaying colors, then XX_FB(c3270) emulates an XX_SM(IBM) 3279. Otherwise, it emulates a 3278. ')dnl include(hostname.inc) XX_SH(Options) ifelse(XX_PRODUCT,x3270,`XX_FB(x3270) is a toolkit based program, so it understands standard Xt options and resources. It also understands',` XX_FB(XX_PRODUCT) understands') the following options:XX_TPS() ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ', `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(activeicon))) Specifies that the icon should be a miniature version of the screen image. See XX_LINK(#Icons,XX_SM(ICONS)) below. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed using the XX_DQUOTED(bold) colors (colors 8 through 15, rather than colors 0 through 7). This helps with PC console windows in which colors 0 through 7 are unreadably dim. All-bold mode is the default for color (3279) emulation, but not for monochrome (3278) emulation. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays. XX_TP(XX_FB(XX_DASHED(altscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(apl))) Sets up XX_SM(APL) mode. ifelse(XX_PRODUCT,x3270,`This is actually an abbreviation for several options. ')dnl See XX_LINK(#APL-Support,XX_SM(APL SUPPORT)) below. ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(cadir)) XX_FI(directory)) Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) XX_TP(XX_FB(XX_DASHED(cafile)) XX_FI(filename)) Specifies a XX_SM(PEM)-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(cbreak))) Causes XX_FB(c3270) to operate in XX_FI(cbreak) mode, instead of XX_FI(raw) mode. In XX_FI(cbreak) mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for XX_FB(interrupt), XX_FB(quit), and XX_FB(lnext) (usually ^C, ^XX_BACKSLASH and ^V respectively) will be seen by XX_FB(c3270) only if preceded by the XX_FB(lnext) character. The XX_FB(susp) character (usually ^Z) cannot be seen by XX_FB(c3270) at all. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(cc)) XX_FI(range):XX_FI(value)[`,'...]) Sets character classes. XX_HO(`See XX_LINK(#Character-Classes,XX_SM(CHARACTER CLASSES)), below. ')dnl ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfile)) XX_FI(filename)) Specifies a file containing a client certificate to provide to the host. The default file type is XX_SM(PEM). ')dnl XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. ifelse(XX_PLATFORM,unix,`(MacOS only) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfiletype)) XX_FI(type)) Specifies the type of the certificate file specified by XX_FB(XX_DASHED(certfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(chainfile) XX_FI(filename))) Specifies a certificate chain file in XX_SM(PEM) format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If XX_FB(XX_DASHED(chainfile)) is specified, it overrides XX_FB(XX_DASHED(certfile)). (OpenSSL only) ')dnl XX_TP(XX_FB(XX_DASHED(charset)) XX_FI(name)) Specifies an XX_SM(EBCDIC) host character set. XX_HO(`See XX_LINK(#Character-Sets,XX_SM(CHARACTER SETS)) below. ')dnl XX_TP(XX_FB(XX_DASHED(clear)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(false). define(XX_TOGGLEREF,`ifelse(XX_PRODUCT,x3270,Menus,Toggles)')dnl define(XX_TOGGLEREFNM,`ifelse(XX_PRODUCT,x3270,MENUS,TOGGLES)')dnl XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl XX_TP(XX_FB(XX_DASHED(connecttimeout)) XX_FI(seconds)) Specifies the time that XX_PRODUCT will wait for a host connection to complete. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defaultfgbg))) Causes XX_PRODUCT to use the XX_POSESSIVE(terminal) default foreground color instead of the curses color XX_FB(black), and the XX_POSESSIVE(terminal) default background color instead of the curses color XX_FB(white). This is helpful for emulators such as XX_FI(gnome-terminal) whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable XX_FB(COLORTERM) is set to XX_FB(gnome-terminal). It is available only if XX_PRODUCT was compiled with a version of XX_FI(ncurses) that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the default (80-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl XX_TP(XX_FB(XX_DASHED(devname)) XX_FI(name)) Specifies a device name (workstation ID) for RFC 4777 support. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(efont)) XX_FI(name)) Specifies a font for the emulator window. XX_HO(`See XX_LINK(#Fonts,XX_SM(FONTS)) below. ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(hostsfile)) XX_FI(file)) Uses XX_FI(file) as the hosts file, which allows aliases for host names and scripts to be executed at login. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(1)) for details. ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(XX_DASHED(httpd)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for HTTP connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(scriptport) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(iconname)) XX_FI(name)) Specifies an alternate title for the program icon. XX_TP(XX_FB(XX_DASHED(iconx)) XX_FI(x)) Specifies the initial x coordinate for the program icon. XX_TP(XX_FB(XX_DASHED(icony)) XX_FI(y)) Specifies the initial y coordinate for the program icon. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(im)) XX_FI(method)) Specifies the name of the input method to use for multi-byte input. (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(keyfile)) XX_FI(filename)) Specifies a file containing the private key for the certificate file (specified via XX_FB(XX_DASHED(certfile)) or XX_FB(XX_DASHED(chainfile))). The default file type is XX_SM(PEM). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keyfiletype)) XX_FI(type)) Specifies the type of the private key file specified by XX_FB(XX_DASHED(keyfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keypasswd)) XX_FI(type):XX_FI(value)) Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be XX_FB(file):XX_FI(filename), specifying that the password is in a file, or XX_FB(string):XX_FI(string), specifying the password on the command-line directly. If the private key file is encrypted and no XX_FB(XX_DASHED(keypasswd)) option is given, ifelse(XX_INTERACTIVE,yes,`the password will be prompted for interactively.', `secure connections will not be allowed.') ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keymap name and optional modifiers. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keyboard map to be found in the resource XX_FB(c3270.keymap.)`'XX_FI(name) or the file XX_FI(name). See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below for details. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keypad))) Turns on the keypad as soon as XX_FB(XX_PRODUCT) starts. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(km)) XX_FI(name)) Specifies the local encoding method for multi-byte text. XX_FI(name) is an encoding name recognized by the ICU library. (Supported only when XX_PRODUCT is compiled with DBCS support, and necessary only when XX_PRODUCT cannot figure it out from the locale.) ')dnl XX_TP(XX_FB(XX_DASHED(loginmacro)) XX_FI(Action(arg...) ...)) Specifies a macro to run at login time. ifelse(XX_PRODUCT,ws3270,`XX_TP(XX_FB(XX_DASHED(localcp) XX_FI(codepage))) Specifies the Windows code page to use for local I/O. The default is to use the XX_POSESSIVE(system) ANSI code page. ')dnl ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(minversion)) XX_FI(version)) The minimum required version of XX_FB(XX_PRODUCT), e.g., XX_VERSION_NUMBER. If the running version is less than the specified version, XX_FB(XX_PRODUCT) will abort. The format of a version is XX_FI(major)`'XX_FB(.)`'XX_FI(minor)`'XX_FB(type)`'XX_FI(iteration). XX_FB(type) is ignored, and XX_FI(minor) and XX_FI(iteration) can be omitted. ')dnl XX_TP(XX_FB(XX_DASHED(model)) XX_FI(name)) The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: XX_IP The first part is the XX_FB(base model), which is either XX_FB(3278) or XX_FB(3279). XX_FB(3278) specifies a monochrome (green on black) 3270 display; XX_FB(3279) specifies a color 3270 display. XX_IP The second part is the XX_FB(model number), which specifies the number of rows and columns. Model 4 is the default. XX_PP XX_TS(3,`center; c c c .') XX_TR(XX_TD(XX_TC(Model Number)) XX_TD(XX_TC(Columns)) XX_TD(XX_TC(Rows))) XX_T_ XX_TR(XX_TD(XX_TC(2)) XX_TD(XX_TC(80)) XX_TD(XX_TC(24))) XX_TR(XX_TD(XX_TC(3)) XX_TD(XX_TC(80)) XX_TD(XX_TC(32))) XX_TR(XX_TD(XX_TC(4)) XX_TD(XX_TC(80)) XX_TD(XX_TC(43))) XX_TR(XX_TD(XX_TC(5)) XX_TD(XX_TC(132)) XX_TD(XX_TC(27))) XX_TE() XX_IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. XX_IP The default model ifelse(XX_PRODUCT,x3270,`for a color X display is XX_FB(`3279'XX_DASHED(4)). For a monochrome X display, it is XX_FB(`3278'XX_DASHED(4)).', XX_PRODUCT,c3270,`for a color display is XX_FB(`3279'XX_DASHED(4)). For a monochrome display, it is XX_FB(`3278'XX_DASHED(4)).', `is XX_FB(`3279'XX_DASHED(4)).') ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(mono))) Forces XX_FB(XX_PRODUCT) to believe it is running on a monochrome X display. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(mono))) Prevents XX_FB(XX_PRODUCT) from using color, ignoring any color capabilities reported by the terminal. XX_TP(XX_FB(XX_DASHED(noprompt))) An alias for XX_DASHED(secure). ')dnl XX_TP(XX_FB(XX_DASHED(noverifycert))) For SSL/TLS connections, do not verify the host certificate. XX_TP(XX_FB(XX_DASHED(nvt))) Start in NVT mode instead of waiting for the host to send data, and make the default terminal type XX_FB(xterm). ifelse(XX_PRODUCT,x3270, XX_TP(XX_FB(XX_DASHED(once))) Causes XX_FB(XX_PRODUCT) to exit after a host disconnects. This option has effect only if a hostname is specified on the command line. )dnl XX_TP(XX_FB(XX_DASHED(oversize)) XX_FI(cols)`'XX_FB(x)`'XX_FI(rows)) Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "XX_PRODUCT.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. ifelse(XX_MODE,console,`XX_IP It can also be specified as XX_FB(auto), which causes XX_FB(XX_PRODUCT) to fill the entire terminal or console window. ')dnl XX_TP(XX_FB(XX_DASHED(port)) XX_FI(n)) Specifies a different XX_SM(TCP) port to connect to. XX_FI(n) can be a name from XX_FB(/etc/services) like XX_FB(telnet), or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(pt)) XX_FI(type)) Specifies the preedit type for the multi-byte input method. Valid values are XX_FB(OverTheSpot), XX_FB(OffTheSpot), XX_FB(Root) and XX_FB(OnTheSpot). The value for XX_FB(OverTheSpot) can `include' an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. XX_FB(OverTheSpot+1) or XX_FB(OverTheSpot-2). The default value is XX_FB(OverTheSpot+1). (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FB(XX_PRODUCT) to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(rv))) Switches XX_PRODUCT from a white-on-black display to a black-on-white display. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(sb))) Turns on the scrollbar. XX_TP(XX_FB(+sb)) Turns the scrollbar off. XX_TP(XX_FB(XX_DASHED(scheme)) XX_FI(name)) Specifes a color scheme to use in 3279 mode. This option has effect only in combination with 3279 emulation. XX_HO(`See XX_LINK(#Color-Schemes,XX_SM(COLOR SCHEMES)) below. ')dnl XX_TP(XX_FB(XX_DASHED(script))) Causes XX_FB(XX_PRODUCT) to read commands from standard input, with the results written to standard output. The protocol for these commands is documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(sl)) XX_FI(n)) Specifies that XX_FI(n) lines should be saved for scrolling back. The default is 4096. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(S))) Runs XX_PRODUCT in auto-shortcut mode. XX_PRODUCT will create a temporary shorcut (.LNK file) that matches the parameters in the session file (model number, characterset, etc.) and re-run itself from the shortcut. XX_TP(XX_FB(+S)) Disables auto-shortcut mode. It is generally a good idea to put this option on the command lines of all shortcuts, to avoid infinite looping. ')dnl ifelse(XX_PRODUCT,tcl3270,, `XX_TP(XX_FB(XX_DASHED(scriptport)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for scripting connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(httpd) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) XX_TP(XX_FB(XX_DASHED(scriptportonce))) Allows XX_PRODUCT to accept only one script connection. When that connection is broken, XX_PRODUCT will exit. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables the interactive XX_FB(c3270>) prompt. When used, a hostname must be provided on the command line. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables run-time features that could compromise system security (user-specified file names and commands, etc.). ')dnl XX_TP(XX_FB(XX_DASHED(set)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(true). XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_TP(XX_FB(XX_DASHED(socket))) Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named XX_FB(/tmp/x3sck.)`'XX_FI(pid). ')dnl The XX_FB(XX_DASHED(p)) option of XX_FI(x3270if) causes it to use this socket, instead of pipes specified by environment variables. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(title)) XX_FI(text)) Sets the console window title to XX_FI(text), overriding the automatic setting of the hostname and the string XX_FB(wc3270). ')dnl XX_TP(XX_TARGET(tn)XX_FB(XX_DASHED(tn)) XX_FI(name)) Specifies the terminal name to be transmitted over the telnet connection. The default name is XX_FB(`IBM'XX_DASH)`'XX_FI(model_name)`'XX_FB(XX_DASHED(E)), for example, ifelse(XX_PRODUCT,x3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', XX_PRODUCT,c3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', `XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)).') XX_IP Some hosts are confused by the XX_FB(XX_DASHED(E)) suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an XX_FB(s:) on the hostname, or setting the "XX_PRODUCT.extended" resource to "false", removes the XX_FB(XX_DASHED(E)) from the terminal name when connecting to such hosts. XX_IP The name can also be specified with the "XX_PRODUCT.termName" resource. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream ifelse(XX_PRODUCT,x3270,,`and event ')tracing at startup. ifelse(XX_PRODUCT,x3270,`Unlike turning it on from a menu option, there is no pop-up to confirm the file name, which defaults to', `The default trace file name is') ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) on the current XX_POSESSIVE(user) Desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3trc)'). XX_TP(XX_FB(XX_DASHED(tracefile)) XX_FI(file)) Specifies a file to save data stream and event traces into. If the name starts with XX_DQUOTED(>>), data will be appended to the file. ifelse(XX_PRODUCT,x3270,`If the value XX_FB(stdout) is given, then traces will be written to standard output. If the value XX_FB(none) is given, then traces will be piped directly to the monitor window, and no file will be created. ')dnl XX_TP(XX_FB(XX_DASHED(tracefilesize)) XX_FI(size)) Places a limit on the size of a trace file. If this option is not specified, or is specified as XX_FB(0) or XX_FB(none), the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of XX_FI(size) can have a XX_FB(K) or XX_FB(M) suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a XX_DQUOTED(-) appended and a new file started. XX_TP(XX_FB(XX_DASHED(user)) XX_FI(name)) Specifies the user name for RFC 4777 support. ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl XX_TP(XX_FB(XX_DASHED(v))) Display the version and build options for XX_FB(XX_PRODUCT) and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a XX_FB(y:) prepended to the hostname when connecting. ifelse(XX_PRODUCT,x3270,, `XX_TP(XX_FB(XX_DASHED(xrm)) "XX_PRODUCT.XX_FI(resource): XX_FI(value)") Sets the value of the named XX_FI(resource) to XX_FI(value). Resources control less common XX_FB(XX_PRODUCT) options, and are defined under XX_LINK(#Resources,XX_SM(RESOURCES)) below. ')dnl ifelse(XX_PRODUCT,tcl3270, `XX_TP(XX_FB(XX_DASHED()XX_DASHED())) Terminates the list of XX_FB(tcl3270) options. Whatever follows will be available to the script in the XX_FB($argv) tcl variable. ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,x3270,`XX_LP After reading resource definitions from the X server and any standandard X11 resource definition files (XX_FB($HOME/.Xdefaults), etc.), XX_FB(XX_PRODUCT) will read definitions from the file XX_FB($HOME/.x3270pro). This file contains local customizations and is also used to save changed options by the XX_FB(Save Changed Options in File) menu option. XX_LP Note that XX_FB(XX_DASHED(xrm)) options override any definitions in the XX_FB(.x3270pro) file. ')dnl XX_HO(`ifelse(XX_PRODUCT,x3270,`XX_SH(Fonts) XX_FB(XX_PRODUCT) does not use the "*font" resource for its main window. Instead, it uses a custom 14-point font called XX_FB(3270), which is a close approximation of a real 3270 display and allows XX_FB(XX_PRODUCT) to display the XX_SM(ISO) `8859'XX_DASHED(1) (`Latin'XX_DASH()1) character set and special status-line symbols. A more compact font, XX_FB(`3270'XX_DASHED(12)), is also supported, as are the various sized fonts XX_FB(3270gt8), XX_FB(3270gt12), XX_FB(3270gt16), XX_FB(3270-20), XX_FB(3270gt24), and XX_FB(3270gt32). The fonts XX_FB(3270h) and XX_FB(3270gr) are also included to allow display of Hebrew and Greek text, respectively. XX_LP The font may be specified with the XX_FB(XX_DASHED(efont)) option or the "XX_PRODUCT.emulatorFont" resource. XX_LP XX_FB(XX_PRODUCT) can also use any X11 font that implements the display character set required by the host XX_SM(EBCDIC) character set. XX_PP An additional font, XX_FB(3270d), is supplied. This font is identical to the default XX_FB(3270) font, except that it has bitmaps defined for field attribute characters. This means that field attributes, which are normally displayed as blanks, are now visible on the screen. The characters displayed are hexadecimal codes, which can be translated using a document provided with the XX_FB(XX_PRODUCT) sources. XX_LP The font can be changed at any time through a menu option. It can also be implicitly changed by changing the size of the XX_FB(XX_PRODUCT) window with the mouse: if the window is made larger, XX_PRODUCT will try to change to a larger font, and vice-versa. ')dnl ifelse(XX_MODE,console,`XX_SH(Modes) XX_FB(XX_PRODUCT) has two basic modes: XX_FI(command-prompt) and XX_FI(session). XX_PP XX_FI(Command-prompt) mode is where the XX_FB(XX_PRODUCT`'>) prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit XX_FB(XX_PRODUCT), etc. The complete list of interactive commands is listed under XX_LINK(#Actions,XX_SM(ACTIONS)). XX_PP XX_FI(Session) mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host. XX_PP To switch from display mode to command-prompt mode, press ifelse(XX_PRODUCT,c3270,`Ctrl-]',`the Escape key'). To switch from command-prompt mode to display mode, press XX_FB(Enter) (without entering a command) at the XX_FB(XX_PRODUCT`'>) prompt. ')dnl XX_SH(Character Sets) The XX_FB(XX_DASHED(charset)) option or the "XX_PRODUCT.charset" resource controls the XX_SM(EBCDIC) host character set used by XX_FB(XX_PRODUCT). Available sets `include': XX_PP define(XX_CG1A,ifelse(XX_PRODUCT,x3270,3270cg-1a))dnl define(XX_CG1,ifelse(XX_PRODUCT,x3270,3270cg-1))dnl define(XX_CG7,ifelse(XX_PRODUCT,x3270,3270cg-7))dnl define(XX_CG8,ifelse(XX_PRODUCT,x3270,3270cg-8))dnl define(XX_CG9,ifelse(XX_PRODUCT,x3270,3270cg-9))dnl define(XX_CG11,ifelse(XX_PRODUCT,x3270,3270cg-11))dnl define(XX_CG15A,ifelse(XX_PRODUCT,x3270,3270cg-15a))dnl define(XX_CG15,ifelse(XX_PRODUCT,x3270,3270cg-15))dnl define(XX_88591,ifelse(XX_PLATFORM,windows,`',iso8859-1))dnl define(XX_88592,ifelse(XX_PLATFORM,windows,`',iso8859-2))dnl define(XX_88597,ifelse(XX_PLATFORM,windows,`',iso8859-7))dnl define(XX_88598,ifelse(XX_PLATFORM,windows,`',iso8859-8))dnl define(XX_88599,ifelse(XX_PLATFORM,windows,`',iso8859-9))dnl define(XX_885911,ifelse(XX_PLATFORM,windows,`',iso8859-11))dnl define(XX_885915,ifelse(XX_PLATFORM,windows,`',iso8859-15))dnl define(XX_KOI8R,ifelse(XX_PLATFORM,windows,`',koi8-r))dnl define(XX_TIS,ifelse(XX_PLATFORM,windows,`',tis620.2529-0))dnl define(XX_GB,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + gb2312.1980-0))dnl define(XX_GBX,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + iso10646-1))dnl define(XX_BIG5,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + Big5-0))dnl define(XX_JIS,ifelse(XX_PLATFORM,windows,`',jisx0201.1976-0 + jisx0208.1983-0))dnl XX_TS(3,`center; l l l lfB l l.') XX_TR(XX_TD(XX_TC(Charset Name)) XX_TD(XX_TC(Host Code Page)) XX_TD(XX_TC(ifelse(XX_PRODUCT,x3270,Display Character Sets,XX_PRODUCT,c3270,Display Character Set,XX_PLATFORM,windows,`',Character Set)))) XX_T_() ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TD(XX_TC(apl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A))) ')dnl XX_TR(XX_TD(XX_TC(belgian)) XX_TD(XX_TC(500)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(belgian-euro)) XX_TD(XX_TC(1148)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(bracket)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(brazilian)) XX_TD(XX_TC(275)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(chinese-gb18030)) XX_TD(XX_TC(1388)) XX_TD(XX_TC(XX_GBX))) XX_TR(XX_TD(XX_TC(cp1047)) XX_TD(XX_TC(1047)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(cp870)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88592))) XX_TR(XX_TD(XX_TC(finnish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(finnish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(french)) XX_TD(XX_TC(297)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(french-euro)) XX_TD(XX_TC(1147)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(german)) XX_TD(XX_TC(273)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(german-euro)) XX_TD(XX_TC(1141)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(greek)) XX_TD(XX_TC(423)) XX_TD(XX_TC(XX_CG7 XX_88597))) XX_TR(XX_TD(XX_TC(hebrew)) XX_TD(XX_TC(424)) XX_TD(XX_TC(XX_CG8 XX_88598))) XX_TR(XX_TD(XX_TC(icelandic)) XX_TD(XX_TC(871)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(icelandic-euro)) XX_TD(XX_TC(1149)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(italian)) XX_TD(XX_TC(280)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(italian-euro)) XX_TD(XX_TC(1144)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(japanese-kana)) XX_TD(XX_TC(930)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(japanese-latin)) XX_TD(XX_TC(939)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(norwegian)) XX_TD(XX_TC(277)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(norwegian-euro)) XX_TD(XX_TC(1142)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(russian)) XX_TD(XX_TC(880)) XX_TD(XX_TC(XX_KOI8R))) XX_TR(XX_TD(XX_TC(simplified-chinese)) XX_TD(XX_TC(935)) XX_TD(XX_TC(XX_GB))) XX_TR(XX_TD(XX_TC(slovenian)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_88592))) XX_TR(XX_TD(XX_TC(spanish)) XX_TD(XX_TC(284)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(spanish-euro)) XX_TD(XX_TC(1145)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(swedish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(swedish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(thai)) XX_TD(XX_TC(1160)) XX_TD(XX_TC(XX_885911 XX_TIS))) XX_TR(XX_TD(XX_TC(traditional-chinese)) XX_TD(XX_TC(937)) XX_TD(XX_TC(XX_BIG5))) XX_TR(XX_TD(XX_TC(turkish)) XX_TD(XX_TC(1026)) XX_TD(XX_TC(XX_88599))) XX_TR(XX_TD(XX_TC(uk)) XX_TD(XX_TC(285)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(uk-euro)) XX_TD(XX_TC(1146)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-euro)) XX_TD(XX_TC(1140)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-intl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TE() XX_PP The default character set is XX_FB(bracket), which is useful for common U.S. XX_SM(IBM) hosts which use XX_SM(EBCDIC) codes AD and BD for the XX_DQUOTED([) and XX_DQUOTED(]) characters, respectively. XX_PP Note that any of the host code pages listed above can be specified by adding XX_FB(cp) to the host code page, e.g., XX_FB(cp037) for host code page 037. Also note that the code pages available for a given version of XX_FB(XX_PRODUCT) are displayed by the XX_FB(XX_DASHED(v)) command-line option. ifelse(XX_PRODUCT,wc3270,`XX_PP Note that DBCS character sets (Chinese, Japanese) display properly only on 32-bit Windows XP. Work is proceeding on other platforms. ')dnl ifelse(XX_PRODUCT,x3270, `XX_PP Most 3270 fonts implement the 3270cg-1 display character set, which is a reordered version of the XX_SM(ISO) `8859'XX_DASHED(1) character set. Some implement the 3270cg-1a display character set, which is a superset of 3270cg-1 that includes APL2 characters. 3270h and 3270gr implement special character sets for Hebrew and Greek, respectively. XX_PP You can also specify national-language translations for your keyboard; see XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Character Classes) XX_FB(XX_PRODUCT) supports character classes (groupings of characters chosen with a double mouse click) in the same manner as XX_FI(xterm)(1). The "XX_PRODUCT.charClass" resource or the XX_FB(XX_DASHED(cc)) option can be used to alter the character class table. The default table is the same as XX_POSESSIVE(XX_FI(xterm)); It groups letters together, and puts most punctuation characters in individual classes. To put all non-whitespace characters together in the same class (and duplicate the behavior of some early versions of XX_FB(XX_PRODUCT), use the following value: XX_PP XX_RS(`33-127:48,161-255:48') XX_PP See XX_FI(xterm)(1) for further syntax details. XX_SH(Keypad) A keypad may optionally be displayed, with a mouse-clickable button for each 3270 function key (these functions are also available from the keyboard). The keypad can be turned on and off by clicking on the "keypad" button in the upper-right-hand corner of the window. The "XX_PRODUCT.keypad" resource controls where it is displayed. Options are: XX_PP XX_TS(2,center; l l.) XX_TR(`XX_TD(left) XX_TD(`in a separate window, to the left of the screen')') XX_TR(`XX_TD(right) XX_TD(`in a separate window, to the right of the screen')') XX_TR(`XX_TD(bottom) XX_TD(`in a separate window, below the screen')') XX_TR(`XX_TD(integral) XX_TD(`in the same window as the screen, below it')') XX_TE() XX_PP The default is XX_FB(right). XX_PP If the "XX_PRODUCT.keypadOn" resource is set to XX_FB(true), the keypad will be displayed at startup. ')dnl ifelse(XX_MODE,console,`XX_SH(Menu Bar and Keypad) XX_FB(XX_PRODUCT) supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the XX_FB(XX_PRODUCT>) prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen. XX_LP The on-screen menu title bar can be turned off via the "XX_PRODUCT.menuBar" resource. XX_LP The pop-up keypad allows the 3270-specific keys (XX_SM(PF) keys, XX_SM(PA) keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the XX_FB(XX_PRODUCT>) prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option. ')dnl ifelse(XX_MODE,script,,XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_SH(Hosts Database) XX_FB(XX_PRODUCT) uses the XX_FI(ibm_hosts) database to ifelse(XX_PRODUCT,x3270,`construct a pull-down menu of hosts to connect to. It also allows host name aliases to be defined, as well as specifying ',XX_PRODUCT,c3270,``define' aliases for host names, and to specify ')dnl macros to be executed when a connection is first made. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(5)) for details. XX_LP You may specify a different XX_FI(ibm_hosts) database with the "XX_PRODUCT.hostsFile" resource. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Color Schemes) When emulating a 3279 display, the X colors used to draw the display are selected by two resources: the "XX_PRODUCT.colorScheme" resource, which gives the name of the color scheme to use, and the individual "XX_PRODUCT.colorScheme.XX_FI(xxx)" resources, which give the actual definitions. The color scheme resources are documented in the XX_FB(Resources) file with the XX_FB(XX_PRODUCT) source. XX_LP The color scheme may also be changed while XX_FB(XX_PRODUCT) is running with a selection from the XX_FB(Options) menu. ')dnl XX_SH(NVT Mode) Some hosts use an XX_SM(ASCII) front-end to do initial login negotiation, then later switch to 3270 mode. XX_FB(XX_PRODUCT) will emulate an XX_SM(ANSI) X3.64 terminal until the host places it in 3270 mode (telnet XX_SM(BINARY) and XX_SM(SEND EOR) modes, or XX_SM(TN3270E) mode negotiation). ifelse(XX_PRODUCT,x3270,`The emulation is fairly complete; however, it is not intended to make XX_FB(XX_PRODUCT) a replacement for XX_FI(xterm)(1). ')dnl XX_PP If the host later negotiates to stop functioning in 3270 mode, XX_FB(XX_PRODUCT) will return to XX_SM(NVT) emulation. XX_PP In XX_SM(NVT) mode, XX_FB(XX_PRODUCT) supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources: XX_PP XX_TS(3,center; l c c.) XX_TR(XX_TD(Mode/Character) XX_TD(Resource) XX_TD(Default)) XX_T_() XX_TR(XX_TD(Translate CR to NL) XX_TD(XX_PRODUCT.icrnl) XX_TD(true)) XX_TR(XX_TD(Translate NL to CR) XX_TD(XX_PRODUCT.inlcr) XX_TD(false)) XX_TR(XX_TD(Erase previous character) XX_TD(XX_PRODUCT.erase) XX_TD(^?)) XX_TR(XX_TD(Erase entire line) XX_TD(XX_PRODUCT.kill) XX_TD(^U)) XX_TR(XX_TD(Erase previous word) XX_TD(XX_PRODUCT.werase) XX_TD(^W)) XX_TR(XX_TD(Redisplay line) XX_TD(XX_PRODUCT.rprnt) XX_TD(^R)) XX_TR(XX_TD(Ignore special meaning of next character) XX_TD(XX_PRODUCT.lnext) XX_TD(^V)) XX_TR(XX_TD(Interrupt) XX_TD(XX_PRODUCT.intr) XX_TD(^C)) XX_TR(XX_TD(Quit) XX_TD(XX_PRODUCT.quit) XX_TD(^XX_BS())) XX_TR(XX_TD(End of file) XX_TD(XX_PRODUCT.eof) XX_TD(^D)) XX_TE() ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_LP Separate keymaps can be defined for use only when XX_FB(XX_PRODUCT) is in 3270 mode or XX_SM(NVT) mode. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) for details. ')dnl ifelse(XX_PRODUCT,x3270,`include(menus.inc)',`XX_SH(Toggles) XX_FB(XX_PRODUCT) has a number of configurable modes which may be selected by the XX_FB(XX_DASHED(set)) and XX_FB(XX_DASHED(clear)) options. These names can also be used as the first parameter to the XX_FB(Toggle) action, and are the names of resources that can be used to set or clear the value of each toggle at start-up. XX_TPS()dnl XX_TP(XX_FB(aidWait)) Changes the behavior of actions that send an XX_SM(AID) to the host (XX_FB(Enter), XX_FB(Clear), XX_FB(PA) and XX_FB(PF)). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the XX_FB(Wait(Unlock)) action to wait for the unlock. ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(altCursor)) If set, the cursor will be an underline. If clear, it will be a solid block. ')dnl XX_TP(XX_FB(blankFill)) If set, XX_FB(XX_PRODUCT) modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying XX_DQUOTED(lock-up) that often occurs when inserting into an field with (apparent) space at the end. ifelse(XX_MODE,console,`XX_TP(XX_FB(crosshair)) When set, XX_PRODUCT will display a crosshair to help locate the cursor on the screen. ')dnl XX_TP(XX_FB(lineWrap)) If set, the XX_SM(NVT) terminal emulator automatically assumes a XX_SM(NEWLINE) character when it reaches the end of a line. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(marginedPaste)) If set, pasting multi-line input via the XX_FB(Paste) action will maintain a left margin (it will not move the cursor further left than where the paste begins). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(monoCase)) If set, XX_FB(XX_PRODUCT) operates in uppercase-only mode. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(overlayPaste)) If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the XX_FB(marginedPaste) toggle. ')dnl XX_TP(XX_FB(screenTrace)) Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). ifelse(XX_MODE,console,`XX_TP(XX_FB(showTiming)) If set, the time taken by the host to process an XX_SM(AID) is displayed on the status line. ')dnl XX_TP(XX_FB(trace)) Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the wc3270 AppData directory',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). The directory for the trace file can be changed with the "XX_PRODUCT.traceDir" resource. Script commands are also traced. ifelse(XX_MODE,console,`XX_TP(XX_FB(underscore)) If set, XX_PRODUCT will display underlined fields by substituting underscore XX_DQUOTED(_) characters for blanks or nulls in the field. Otherwise, these fields will be displayed ifelse(XX_PRODUCT,c3270,`using the XX_POSESSIVE(terminal) native underlining mode, if one is defined. ',`with a highlighted background. Note that setting XX_FB(underscore) also disables the highlighted background for blinking fields. XX_FB(underscore) is set by default. ')dnl ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(visibleControl)) If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes XX_DQUOTED(XX_LT()), SI becomes XX_DQUOTED(>). Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in ifelse(c3270,`underlined',wc3270,`reverse-video') yellow. Field attribute mappings are part of the XX_FB(XX_PRODUCT) Resources documentation for the XX_FB(visibleControl) resource. ')dnl XX_TPE()dnl XX_LP ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_SH(Status Line) ifelse(XX_PRODUCT,c3270,`If the terminal that XX_FB(XX_PRODUCT) is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), XX_FB(XX_PRODUCT) will display a status line. ')dnl The XX_FB(XX_PRODUCT) status line contains a variety of information. From left to right, the fields are: XX_TPS()dnl XX_TP(XX_FB(comm status)) The first symbol is always a XX_FB(4). If XX_FB(XX_PRODUCT) is in TN3270E mode, the second symbol is a XX_FB(B); otherwise it is an XX_FB(A). ifelse(XX_PRODUCT,x3270,`If XX_FB(x3270) is disconnected, the third symbol is a question mark. Otherwise, if ',`If ') XX_FB(XX_PRODUCT) is in SSCP-LU mode, the third symbol is an XX_FB(S). Otherwise it is blank. XX_TP(XX_FB(keyboard lock)) If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock. ifelse(XX_PRODUCT,x3270,`XX_TP(`XX_FB(`shift')') Three characters indicate the keyboard modifier status. "M" indicates the Meta key, "A" the Alt key, and an up-arrow or "^" indicates the Shift key. XX_TP(XX_FB(compose)) The letter "C" indicates that a composite character is in progress. If another symbol follows the "C", it is the first character of the composite. ')dnl XX_TP(XX_FB(typeahead)) The letter "T" indicates that one or more keystrokes are in the typeahead buffer. XX_TP(XX_FB(temporary keymap)) The letter "K" indicates that a temporary keymap is in effect. XX_TP(XX_FB(reverse)) The letter "R" indicates that the keyboard is in reverse field entry mode. XX_TP(XX_FB(insert mode)) ifelse(XX_PRODUCT,x3270,`A thick caret "^" or the ', `The ') letter "I" indicates that the keyboard is in insert mode. XX_TP(XX_FB(printer session)) The letter "P" indicates that a XX_FI(pr3287) session is active. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(script)) The letter "S" indicates that a script is active. ')dnl ifelse(XX_PRODUCT,x3270,,`XX_TP(XX_FB(secure connection)) A green letter "S" indicates that the connection is secured via SSL/TLS. ')dnl XX_TP(XX_FB(LU name)) The LU name associated with the session, if there is one. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(timing)) A clock symbol and a time in seconds indicate the time it took to process the last XX_SM(AID) or the time to connect to a host. This display is optional. ')dnl XX_TP(XX_FB(cursor position)) The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0. XX_TPE()dnl ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Icons) If the XX_FB(XX_DASHED(activeicon)) option is given (or the "XX_PRODUCT.activeIcon" resource is set to XX_FB(true)`)', XX_FB(XX_PRODUCT) will attempt to make its icon a miniature version of the current screen image. This function is highly dependent on your window manager: XX_TPS()dnl XX_TP(XX_FB(mwm)) The size of the icon is limited by the "Mwm.iconImageMaximum" resource, which defaults to XX_FB(50x50). The image will be clipped at the bottom and right. The icon cannot accept keyboard input. XX_TP(XX_FB(olwm)) The full screen image of all 3270 models can be displayed on the icon. However, the icon cannot be resized, so if the model is later changed with an XX_FB(XX_PRODUCT) menu option, the icon image will be corrupted. The icon cannot accept keyboard input. XX_TP(XX_FB(twm) and XX_FB(tvtwm)) The full screen image of all 3270 models can be displayed on the icon, and the icon can be resized. The icon can accept keyboard input. XX_IP However, XX_FB(twm) does not put labels on application-supplied icon windows. You can have XX_FB(XX_PRODUCT) add its own label to the icon by setting the "XX_PRODUCT.labelIcon" resource to XX_FB(true). The default font for icon labels is XX_FB(8x13); you may change it with the "XX_PRODUCT.iconLabelFont" resource. XX_TPE()dnl include(xkeymaps.inc)') define(XX_LPAREN,`ifelse(XX_PRODUCT,tcl3270,` ',`(')')dnl define(XX_RPAREN,`ifelse(XX_PRODUCT,tcl3270,,`)')')dnl define(XX_COMMA,`ifelse(XX_PRODUCT,tcl3270,` ',`, ')')dnl define(XX_SPACE,`ifelse(XX_PRODUCT,tcl3270,` ',`')')dnl define(XX_WAIT,`ifelse(XX_PRODUCT,tcl3270,`Wait [XX_FI(timeout)] $1', `Wait$1(XX_FI(timeout))')')dnl XX_TARGET(actions)dnl ifelse(XX_PRODUCT,x3270,, XX_PRODUCT,tcl3270, `XX_SH(Commands) XX_FB(XX_PRODUCT) supports the following additional tcl commands: ', `XX_SH(Actions) Here is a complete list of basic XX_PRODUCT actions. Script-specific actions are described on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. ')dnl define(XX_BLOCK,*))dnl XX_PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. XX_PP XX_TS(2,center; lw(3i) lw(3i).) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ascii'`') XX_TD(return entire screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region as text)) XX_TR(XX_TDH(`AsciiField') XX_TD(return current field as text)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Attn') XX_TD(attention key)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(AltCursor) XX_TD(switch between block and underscore cursor)) ')dnl XX_TR(XX_TDH(`BackSpace') XX_TD(move cursor left (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`BackTab') XX_TD(tab to start of previous input field)) XX_TR(`XX_TDH(CircumNot) XX_TD(`input "^" in XX_SM(NVT) mode, or "XX_NOT" in 3270 mode'')) XX_TR(XX_TDH(XX_BLOCK()`Clear') XX_TD(clear screen)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Cols') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Compose) XX_TD(next two keys form a special symbol)) ')dnl XX_TR(XX_TDH(XX_BLOCK()Connect`'XX_LPAREN`'XX_FI(host)`'XX_RPAREN) XX_TD(connect to XX_FI(host))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Copy') XX_TD(copy highlighted area to clipboard)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`CursorSelect') XX_TD(Cursor Select XX_SM(AID))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Cut) XX_TD(copy highlighted area to clipboard and erase)) XX_TR(XX_TDH(Default) XX_TD(enter key literally)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Cut') XX_TD(copy highlighted area to clipboard and erase)) ')dnl XX_TR(XX_TDH(`Delete') XX_TD(delete character under cursor (or send XX_SM(ASCII DEL)))) XX_TR(XX_TDH(`DeleteField') XX_TD(delete the entire field)) XX_TR(XX_TDH(`DeleteWord') XX_TD(delete the current or previous word)) XX_TR(XX_TDH(XX_BLOCK()`Disconnect') XX_TD(disconnect from host)) XX_TR(XX_TDH(`Down') XX_TD(move cursor down)) XX_TR(XX_TDH(`Dup') XX_TD(duplicate field)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ebcdic'`') XX_TD(return entire screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region in XX_SM(EBCDIC))) XX_TR(XX_TDH(`EbcdicField') XX_TD(return current field in XX_SM(EBCDIC))) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Enter') XX_TD(Enter XX_SM(AID) (or send XX_SM(ASCII CR)))) XX_TR(XX_TDH(`Erase') XX_TD(erase previous character (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`EraseEOF') XX_TD(erase to end of current field)) XX_TR(XX_TDH(`EraseInput') XX_TD(erase all input fields)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(Escape) XX_TD(escape to XX_FB(c3270>) prompt)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Execute(XX_FI(cmd))) XX_TD(execute a command in a shell)) ')dnl XX_TR(XX_TDH(`FieldEnd') XX_TD(move cursor to end of field)) XX_TR(XX_TDH(`FieldMark') XX_TD(mark field)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(HandleMenu(XX_FI(name))) XX_TD(pop up a menu)) ')dnl XX_TR(XX_TDH(`HexString'`'XX_LPAREN`'XX_FI(hex_digits)`'XX_RPAREN) XX_TD(insert control-character string)) XX_TR(XX_TDH(`Home') XX_TD(move cursor to first input field)) XX_TR(XX_TDH(`Insert') XX_TD(set insert mode)) XX_TR(XX_TDH(XX_BLOCK()`Interrupt') XX_TD(send XX_SM(TELNET IP) to host)) ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Keypad') XX_TD(Display pop-up keypad)) ')dnl XX_TR(XX_TDH(Key`'XX_LPAREN`'XX_FI(keysym)`'XX_RPAREN) XX_TD(insert key XX_FI(keysym))) XX_TR(XX_TDH(Key`'XX_LPAREN`'0x`'XX_FI(xx)`'XX_RPAREN) XX_TD(insert key with character code XX_FI(xx))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Keymap(XX_FI(keymap))) XX_TD(toggle alternate XX_FI(keymap) (or remove with XX_FB(None)))) XX_TR(XX_TDH(KybdSelect(XX_FI(direction) [,XX_FI(atom)...])) XX_TD(Extend selection by one row or column)) ')dnl XX_TR(XX_TDH(`Left') XX_TD(move cursor left)) XX_TR(XX_TDH(`Left2') XX_TD(move cursor left 2 positions)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Macro(XX_FI(macro))) XX_TD(run a macro)) ')dnl ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Menu') XX_TD(Display menu bar)) ')dnl XX_TR(XX_TDH(`MonoCase') XX_TD(toggle uppercase-only mode)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(MoveCursor) XX_TD(move cursor to mouse position)) ')dnl XX_TR(XX_TDH(MoveCursor`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_RPAREN) XX_TD(move cursor to zero-origin (XX_FI(row),XX_FI(col)))) ifelse(XX_PRODUCT,x3270,`XX_TR(`XX_TDH(XX_BLOCK()MoveCursorSelect) XX_TD(`move cursor to mouse position, light pen selection'')) ')dnl XX_TR(XX_TDH(`Newline') XX_TD(move cursor to first field on next line (or send XX_SM(ASCII LF)))) XX_TR(XX_TDH(`NextWord') XX_TD(move cursor to next word)) XX_TR(XX_TDH(XX_BLOCK()PA`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Attention XX_SM(AID) (XX_FI(n) from 1 to 3))) XX_TR(XX_TDH(XX_BLOCK()PF`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Function XX_SM(AID) (XX_FI(n) from 1 to 24))) XX_TR(XX_TDH(`PreviousWord') XX_TD(move cursor to previous word)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Paste') XX_TD(insert clipboard contents))')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(Printer(Start[,XX_FI(lu)]|Stop)) XX_TD(start or stop printer session)) ')dnl ifelse(XX_PLATFORM,windows,`XX_TR(XX_TDH(PrintText([gdi|wordpad,][dialog|nodialog,]XX_FI([printer-name]))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(PrintText(XX_FI(command))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(PrintWindow(XX_FI(command))) XX_TD(print screen image (bitmap) on printer)) ')dnl XX_TR(XX_TDH(Quit) XX_TD(exit XX_FB(XX_PRODUCT))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Reconnect) XX_TD(reconnect to previous host)) ')dnl XX_TR(XX_TDH(`Redraw') XX_TD(redraw window)) XX_TR(XX_TDH(`Reset') XX_TD(reset locked keyboard)) XX_TR(XX_TDH(`Right') XX_TD(move cursor right)) XX_TR(XX_TDH(`Right2') XX_TD(move cursor right 2 positions)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ascii`') XX_TD(dump screen buffer as text)) XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ebcdic`') XX_TD(dump screen buffer in EBCDIC)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Rows') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Script(XX_FI(command)[,XX_FI(arg)...])) XX_TD(run a script)) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TR(XX_TDH(Scroll(Forward|Backward)) XX_TD(scroll screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SelectAll(XX_FI(atom))) XX_TD(select entire screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SetFont(XX_FI(font))) XX_TD(change emulator font)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `ifelse(XX_PRODUCT,tcl3270,`XX_TR(XX_TDH(Snap) XX_TD(same as XX_FB(Snap Save))) ')dnl XX_TR(XX_TDH(Snap`'XX_SPACE`'Ascii`') XX_TD(report saved screen data (see XX_FB(Ascii)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Cols`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Ebcdic`') XX_TD(report saved screen data (see XX_FB(Ebcdic)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'ReadBuffer`') XX_TD(report saved screen data (see XX_FB(ReadBuffer)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Rows`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Save`') XX_TD(save screen image)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Status`') XX_TD(report saved connection status)) XX_TR(XX_TDH(`ifelse(XX_PRODUCT,tcl3270,`XX_BLOCK()Snap Wait [XX_FI(timeout)] Output', `XX_BLOCK()SnapWaitOuput(XX_FI(timeout))')') XX_TD(wait for host output and save screen image)) ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Source(XX_FI(file))) XX_TD(read commands from XX_FI(file))) ')dnl XX_TR(XX_TDH(Status`') XX_TD(report connection status)) ')dnl XX_TR(XX_TDH(XX_BLOCK()String`'XX_LPAREN`'XX_FI(string)`'XX_RPAREN) XX_TD(insert string (simple macro facility))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(XX_BLOCK()`SelectDown') XX_TD(Extend selection down)) XX_TR(XX_TDH(SelectLeft) XX_TD(Extend selection left)) XX_TR(XX_TDH(SelectUp) XX_TD(Extend selection up)) XX_TR(XX_TDH(SelectDown) XX_TD(Extend selection down)) XX_TR(XX_TDH(SysReq) XX_TD(System Request XX_SM(AID))) ')dnl XX_TR(XX_TDH(`Tab') XX_TD(move cursor to next input field)) XX_TR(XX_TDH(`Toggle'XX_LPAREN`'XX_FI(option)[,XX_FI(set|clear)]XX_RPAREN) XX_TD(toggle an option)) XX_TR(XX_TDH(`ToggleInsert') XX_TD(toggle insert mode)) XX_TR(XX_TDH(`ToggleReverse') XX_TD(toggle reverse-input mode)) XX_TR(XX_TDH(XX_BLOCK()Transfer`'XX_LPAREN`'XX_FI(option)=XX_FI(value)...'`'XX_RPAREN) XX_TD(file transfer)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Unselect) XX_TD(release selection)) ')dnl XX_TR(XX_TDH(`Up') XX_TD(move cursor up)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(ignore) XX_TD(do nothing)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(3270mode)) XX_TD(wait for 3270 mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Disconnect)) XX_TD(wait for host to disconnect)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(InputField)) XX_TD(wait for valid input field)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(NVTMode)) XX_TD(wait for NVT mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Output)) XX_TD(wait for more host output)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_T_() XX_TR(XX_TDH((the following are similar to xterm),COLSPAN="2")) XX_T_() XX_TR(XX_TDH(ignore) XX_TD(do nothing)) XX_TR(`XX_TDH(insert-selection([XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(``paste' selection')') XX_TR(XX_TDH(move-select) XX_TD(a combination of XX_FB(MoveCursor) and XX_FB(select-start))) XX_TR(XX_TDH(select-end(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(complete selection and assign to atom(s))) XX_TR(XX_TDH(select-extend) XX_TD(move the end of a selection)) XX_TR(XX_TDH(select-start) XX_TD(mark the beginning of a selection)) XX_TR(XX_TDH(set-select(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(assign existing selection to atom(s))) XX_TR(XX_TDH(start-extend) XX_TD(begin marking the end of a selection)) ')dnl XX_TE() ifelse(XX_MODE,console,`XX_LP Any of the above actions may be entered at the XX_FB(XX_PRODUCT>) prompt; these commands are also available for use in keymaps (see XX_LINK(#Keymaps,XX_SM(KEYMAPS))). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.: XX_RS(PF(1)) or with spaces, e.g.: XX_RS(PF 1) Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used. XX_LP XX_FB(XX_PRODUCT) also supports the following interactive commands: XX_TPS()dnl XX_TP(XX_FB(Help)) Displays a list of available commands. XX_TP(XX_FB(ScreenTrace)) Turns screen tracing (saving screen images to a file) on or off. The command XX_FB(screentrace on) enables screen tracing; the command XX_FB(screentrace off) disables it. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). The keyaord XX_FB(on) can also be followed by the keyword XX_FB(printer) and an optional ifelse(XX_PRODUCT,wc3270,printer name,print command) to direct screen traces directly to the printer. XX_TP(XX_FB(Show)) Displays statistics and settings. XX_TP(XX_FB(Trace)) Turns tracing on or off. The command XX_FB(trace on) enables data stream and keyboard event tracing; the command XX_FB(trace off) disables it. The qualifier XX_FB(data) or XX_FB(keyboard) can be specified before XX_FB(on) or XX_FB(off) to enable or disable a particular trace. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). XX_TPE()dnl ')dnl XX_LP Note that certain parameters to XX_PRODUCT actions (such as the names of files and keymaps) are subject to XX_FI(substitutions): XX_LP The character XX_FB(~) at the beginning of a string is replaced with the user's home directory. ifelse(XX_PLATFORM,unix,`A XX_FB(~) character followed by a username is replaced with that XX_POSESSIVE(user) home directory. ')dnl XX_LP Environment variables are substituted using the Unix shell convention of $XX_FI(name) or ${XX_FI(name)}. XX_LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. ifelse(XX_PRODUCT,c3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,wc3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,x3270,,`include(ft.inc) ')dnl XX_SH(The PrintText Action) The XX_FB(PrintText) produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is ifelse(XX_PLATFORM,windows,`the name of the printer to use', `the command to use to print, e.g., XX_FB(lpr)'). ifelse(XX_PLATFORM,windows,`The font defaults to XX_FB(Courier New) and the point size defaults to XX_FI(auto) (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. Unless the XX_FB(wordpad) keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. XX_FB(printTextHorizontalMargin) defines the left- and right-hand margins. XX_FB(printTextVerticalMargin) defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with XX_FB(mm) or XX_FB(cm). XX_FB(printTextOrientation) defines the page orientation as XX_FB(portrait) or XX_FB(landscape). ')dnl XX_LP Multiple arguments can include keywords to control the output of XX_FB(PrintText): XX_TPS()dnl ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(gdi)) Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default). XX_TP(XX_FB(wordpad)) Create an RTF file and run WordPad to print it. (This was the former default). XX_TP(XX_FB(dialog)) In GDI mode, pop up the Windows print dialog. ifelse(XX_PRODUCT,wc3270,`(This is the default.) ')dnl XX_TP(XX_FB(nodialog)) In GDI mode, skip the usual Windows print dialog. ifelse(XX_PRODUCT,ws3270,`(This is the default.) ')dnl ')dnl XX_TP(XX_FB(file) XX_FI(filename)) Save the output in a file. XX_TP(XX_FB(html)) Save the output as HTML. This option implies XX_FB(file). XX_TP(XX_FB(rtf)) Save the output as RichText. This option implies XX_FB(file). The font defaults to XX_FB(Courier New) and the point size defaults to 8. These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(string)) Return the output as a string. This can only be used from scripts. ')dnl XX_TP(XX_FB(modi)) Render modified fields in italics. XX_TP(XX_FB(caption) XX_FI(text)) Add the specified XX_FI(text) as a caption above the output. Within XX_FI(text), the special sequence XX_FB(%T%) will be replaced with a timestamp. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(secure)) Disables the pop-up dialog. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(command) XX_FI(command)) Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. ')dnl XX_TPE() define(XX_SCRIPTS,`ifelse(XX_PRODUCT,x3270,Macros and Scripts, XX_PRODUCT,c3270,Scripts, Nested Scripts)')dnl XX_SH(XX_SCRIPTS) ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`There are several types of ifelse(XX_PRODUCT,x3270,`macros and ', XX_PRODUCT,x3270,,XX_PRODUCT,c3270,, `nested ')dnl script functions available. ')dnl XX_TPS()dnl XX_TP(XX_FB(The String XX_Action)) The simplest method for ifelse(XX_PRODUCT,x3270,`macros ', XX_PRODUCT,c3270,`scripting ', `nested scripts ')dnl is provided via the XX_FB(String) XX_action`'ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,tcl3270,,`, which can be bound to any key in a keymap'). The arguments to XX_FB(String) are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the XX_SM(AID) code to the host, XX_FB(XX_PRODUCT) will wait for the host to unlock the keyboard before further processing the string.) XX_TS(2,l l.) XX_TR(XX_TD(XX_BS()b) XX_TD(Left)) XX_TR(XX_TD(XX_BS()`e'XX_FI(xxxx)) XX_TD(EBCDIC character in hex)) XX_TR(XX_TD(XX_BS()f) XX_TD(Clear*)) XX_TR(XX_TD(XX_BS()n) XX_TD(Enter*)) XX_TR(XX_TD(XX_BS()`pa'XX_FI(n)) XX_TD(PA(XX_FI(n))*)) XX_TR(XX_TD(XX_BS()`pf'XX_FI(nn)) XX_TD(PF(XX_FI(nn))*)) XX_TR(XX_TD(XX_BS()r) XX_TD(Newline)) XX_TR(XX_TD(XX_BS()t) XX_TD(Tab)) XX_TR(XX_TD(XX_BS()T) XX_TD(BackTab)) XX_TR(XX_TD(XX_BS()`u'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TR(XX_TD(XX_BS()`x'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TE() XX_IP Note that the numeric values for the XX_BS()e, XX_BS()u and XX_BS()x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if XX_PRODUCT is built with DBCS support and the host allows DBCS input in the current field. ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270, `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Alt,p): String("probs clearrdr`'XX_BS()n")) ', `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Meta,p): String("probs clearrdr`'XX_BS()n")) ')dnl XX_IP XX_FB(Note:) The strings are in XX_SM(ASCII) and converted to XX_SM(EBCDIC), so beware of inserting control codes. ifelse(XX_PRODUCT,x3270,`Also, a backslash before a XX_FB(p) may need to be doubled so it will not be removed when a resource file is read. ')dnl XX_IP There is also an alternate form of the XX_FB(String) XX_action, XX_FB(HexString), which is used to enter non-printing data. The argument to XX_FB(HexString) is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent XX_SM(EBCDIC) characters, which are entered into the current field. In XX_SM(NVT) mode, the hexadecimal data represent XX_SM(ASCII) characters, which are sent directly to the host. ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(The Script Action)) This action causes XX_FB(XX_PRODUCT) to start a child process which can execute XX_FB(XX_PRODUCT) actions. ifelse(XX_PLATFORM,windows, `XX_FB(XX_PRODUCT) listens for connections from the child process on a dynamically-generated TCP port. ', `Standard input and output from the child process are piped back to XX_FB(XX_PRODUCT). ')dnl The XX_FB(Script) action is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(The macros Resource)) An alternate method of defining macros is the "XX_PRODUCT.macros" resource. This resource is similar to a keymap, but instead of defining keyboard mappings, it associates a list of X actions with a name. These names are displayed on a Macros menu that appears when XX_FB(XX_PRODUCT) is connected to a host. Selecting one of the names on the menu executes the X actions associated with it. Typically the actions are XX_FB(String) calls, but any action may be specified. Here is a sample macros resource definition, which would result in a four-entry Macros menu: XX_RS(XX_PRODUCT.macros: XX_BS() XX_BR log off: String("logout`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR vtam: String("dial vtam`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR pa1: PA(1)XX_BS()n`'XX_BS() XX_BR alt printer: PrintText("lpr -Plw2")) XX_IP You can also define a different set of macros for each host. If there is a resource named XX_DQUOTED(XX_PRODUCT.XX_FI(macros).XX_FI(somehost)), it defines the macros menu for when XX_FB(XX_PRODUCT) is connected to XX_FI(somehost). XX_TP(XX_FB(The XX_DASHED(script) Option)) This facility allows XX_FB(XX_PRODUCT) to operate under the complete control of a script. XX_FB(XX_PRODUCT) accepts actions from standard input, and prints results on standard output. The XX_FB(XX_DASHED(script)) option is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`XX_SH(Composite Characters) XX_FB(XX_PRODUCT) allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A `C' on the status line indicates a pending composite character. XX_PP The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "XX_PRODUCT.composeMap" resource; it gives the name of the map to use. The maps themselves are named "XX_PRODUCT.composeMap.XX_FI(name)". The default is "latin1", which gives mappings for most of the symbols in the XX_SM(ISO) 8859-1 Latin-1 character set that are not in the 7-bit XX_SM(ASCII) character set. XX_PP XX_FB(Note:) The default keymap defines ifelse(XX_PRODUCT,x3270,`the "Multi_key" keysym',`XX_KEY(Meta,m)') as the "Compose" key. ifelse(XX_PRODUCT,x3270,`If your keyboard lacks such a key, you',`You') may set up your own "Compose" key with a keymap that maps some other keysym onto the XX_FB(Compose) action. ')dnl ifelse(XX_PRODUCT,x3270,`include(apl.inc)')dnl ifelse(XX_PRODUCT,c3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(pr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(pr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(c3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(pr3287). XX_LP See XX_FI(pr3287)(1) for further details. XX_LP The resource XX_FB(c3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(wpr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(wpr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(wc3270.printer.name) specifies the Windows printer used to print each job. It defaults to the value of the XX_FB($PRINTER) environment variable, if set. Otherwise the default system printer is used. This resource also controls the printer used by the XX_FB(PrintText) action. XX_LP The resource XX_FB(wc3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(wpr3287). XX_LP See XX_FI(wpr3287)(1) for further details. XX_LP The resource XX_FB(wc3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Screen Printing) Screen printing is handled through options on the XX_FB(File) menu or by the XX_FB(PrintText) and XX_FB(PrintWindow) actions. Each results in a pop-up to confirm the print command. XX_PP The XX_FB(PrintText) action (usually assigned to the key XX_LT()Meta>p) sends the current screen image to the printer as XX_SM(ASCII) characters. The default command used to print the data is controlled by the "XX_PRODUCT.printTextCommand" resource; the default is XX_FB(lpr). You may also use a keymap definition to pass a print command the XX_FB(PrintText) action itself. The command receives the screen text as its standard input. For example, the following keymap will save the screen text in a file: XX_IP XX_RS(XX_KEY(Meta,f): PrintText("cat >screen.image")) XX_PP Note: XX_FB(HardPrint) is an alias for XX_FB(PrintText). XX_PP The XX_FB(PrintWindow) action (usually assigned to the key XX_LT()Meta>b) sends the current screen image to the printer as a bitmap. The default command used to print the data is controlled by the "XX_PRODUCT.printWindowCommand" resource; the default is XX_IP XX_RS(XX_FB(xwd XX_DASHED(id) %d | xpr | lpr).) XX_PP You may also use a keymap definition to pass a print command to the XX_FB(PrintWindow) action itself. If the command contains the text "%d", the window ID of XX_FB(XX_PRODUCT) will be substituted before it is run. For example, the following keymap will pop up a duplicate of the current screen image: XX_IP XX_RS(XX_KEY(Meta,g): PrintWindow("xwd XX_DASHED(id) %d | xwud &")) XX_LP If the command for PrintWindow or PrintText begins with an "@" character, the initial pop-up menu to confirm the print command is not displayed and the command cannot be edited. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Bugs) Cursor highlighting will not work with if you use the XX_FB(NoTitleFocus) option in your .twmrc file. ')dnl ifelse(XX_PRODUCT,wc3270,,` XX_SH(Passthru) XX_FB(XX_PRODUCT) supports the Sun XX_FI(telnet-passthru) service provided by the XX_FI(in.telnet-gw) server. This allows outbound telnet connections through a firewall machine. When a XX_FB(p:) is prepended to a hostname, XX_FB(XX_PRODUCT) acts much like the XX_FI(itelnet)(1) command. It contacts the machine named XX_FB(internet-gateway) at the port defined in XX_FB(/etc/services) as XX_FB(telnet-passthru) (which defaults to 3514). It then passes the requested hostname and port to the XX_FB(in.telnet-gw) server. ')dnl XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option or the XX_FB(XX_PRODUCT.proxy) resource causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option or resource is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. ifelse(XX_PRODUCT,x3270,,`include(resources.inc)')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_SH(Files) ifelse(XX_PRODUCT,x3270,/usr/lib/X11,/usr/local/lib)/x3270/ibm_hosts XX_BR ifelse(XX_PRODUCT,x3270,`$HOME/.x3270pro ',XX_PRODUCT,c3270,`$HOME/.c3270pro ') ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Environment Variables) XX_FB(3270PRO) Path of profile file, containing resource definitions. Merged after the system resource database, but before XX_FB(X3270RDB). Defaults to $HOME/.x3270pro. XX_BR XX_FB(NOX3270PRO) If set, do not read the profile. XX_BR XX_FB(X3270RDB) Additional resource definitions, merged after the profile file but before the command-line options. XX_BR XX_FB(KEYMAP) Keymap name. XX_BR XX_FB(KEYBD) Keymap name. ')dnl XX_SH(See Also) ifelse(XX_INTERACTIVE,yes,XX_LINK(XX_PR3287-man.html,XX_PR3287`'(1))`, ')dnl ifelse(XX_PRODUCT,XX_S3270,,XX_LINK(XX_S3270-man.html,XX_S3270`'(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(XX_X3270-script.html,`XX_X3270-script`'(1)), ')dnl ifelse(XX_PLATFORM,unix,`ifelse(XX_PRODUCT,x3270,,XX_LINK(x3270-man.html,x3270(1))`, ')dnl ifelse(XX_PRODUCT,c3270,,XX_LINK(c3270-man.html,c3270(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(tcl3270-man.html,tcl3270(1))`, ')dnl ')dnl telnet(1), tn3270(1)dnl ifelse(XX_PRODUCT,x3270,`, XX_LINK(ibm_hosts.html,ibm_hosts(5)) XX_BR X Toolkit Intrinsics ',` ')dnl XX_BR Data Stream XX_POSESSIVE(Programmer) Reference, IBM GA23-0059 XX_BR Character Set Reference, IBM GA27-3831 XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()2004-2005, Don Russell. XX_BR Copyright`'XX_COPY()2004, Dick Altenbern. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/c3270/x3270-script.man0000664000076500007650000007177213221600611014513 0ustar pdmpdm'\" t .TH X3270-SCRIPT 1 "29 December 2017" .SH "NAME" Scripting Facilities for x3270, c3270 and s3270 .SH "SYNOPSIS" \fBx3270\fP \fB\-script\fP [ \fIx3270-options\fP ] .br \fBx3270\fP \fB\-socket\fP [ \fIx3270-options\fP ] .br \fBx3270\fP \fB\-scriptport \fIport\fP\fP [ \fIx3270-options\fP ] .br \fBc3270\fP \fB\-socket\fP [ \fIc3270-options\fP ] .br \fBc3270\fP \fB\-scriptport\fP \fIport\fP [ \fIs3270-options\fP ] .br \fBs3270\fP [ \fIs3270-options\fP ] .br \fBScript\fP ( \fIcommand\fP [ ,\fIarg\fP... ] ) .SH "DESCRIPTION" The \fBx3270\fP scripting facilities allow the interactive 3270 emulators \fBx3270\fP and \fBc3270\fP to be operated under the control of another program, and forms the basis for the script-only emulator \fBs3270\fP. .PP There are four basic scripting methods. The first is the \fBpeer script\fP facility, invoked by the \fBx3270\fP \fB\-script\fP switch, and the default mode for \fBs3270\fP. This runs the emulator as a child of another process. Typically this would be a script using \fIexpect\fP(1), \fIperl\fP(1), or the co-process facility of the Korn Shell \fIksh\fP(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. .PP The second method is the \fBchild script\fP facility, invoked by the emulator's \fBScript\fP action. This runs a script as a child process of the emulator. The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. .PP The third method uses a TCP socket. The \fB\-scrpiptport\fP command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. .PP The fourth method uses a Unix-domain socket. The \fB\-socket\fP command-line option causes the emulator to create a Unix-domain stream socket named \fB/tmp/x3sck.\fP\fIpid\fP. The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. .PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the \fBScript\fP action. The calling script will be resumed when the nested script completes. .PP Commands are emulator \fIactions\fP; the syntax is the same as for the right-hand side of an \fBx3270\fP or \fBc3270\fP keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with \fB#\fP or \fB!\fP is treaded as a comment and will be ignored. .PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. .PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". .SH "STATUS FORMAT" The status message consists of 12 blank-separated fields: .TP 1 Keyboard State If the keyboard is unlocked, the letter \fBU\fP. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter \fBL\fP. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter \fBE\fP. .TP 2 Screen Formatting If the screen is formatted, the letter \fBF\fP. If unformatted or in \s-1NVT\s+1 mode, the letter \fBU\fP. .TP 3 Field Protection If the field containing the cursor is protected, the letter \fBP\fP. If unprotected or unformatted, the letter \fBU\fP. .TP 4 Connection State If connected to a host, the string \fBC(\fP\fIhostname\fP\fB)\fP. Otherwise, the letter \fBN\fP. .TP 5 Emulator Mode If connected in 3270 mode, the letter \fBI\fP. If connected in \s-1NVT\s+1 line mode, the letter \fBL\fP. If connected in \s-1NVT\s+1 character mode, the letter \fBC\fP. If connected in unnegotiated mode (no BIND active from the host), the letter \fBP\fP. If not connected, the letter \fBN\fP. .TP 6 Model Number (2-5) .TP 7 Number of Rows The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. .TP 8 Number of Columns The current number of columns defined on the screen, subject to the same difference for rows, above. .TP 9 Cursor Row The current cursor row (zero-origin). .TP 10 Cursor Column The current cursor column (zero-origin). .TP 11 Window ID The X window identifier for the main \fBx3270\fP window, in hexadecimal preceded by \fB0x\fP. For \fBs3270\fP and \fBc3270\fP, this is zero. .TP 12 Command Execution Time The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. .SH "DIFFERENCES" When an action is initiated by a script, the emulators behave in several different ways: .PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. .PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the \fBCloseScript\fP action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the \fBScript\fP action to complete. .PP The \fBQuit\fP action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) .PP Normally, the AID actions (\fBClear\fP, \fBEnter\fP, \fBPF\fP, and \fBPA\fP) will not complete until the host unlocks the keyboard. If the parameter to a \fBString\fP action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. .PP The \fBAidWait\fP toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The \fBWait(Output)\fP action can then be used to delay a script until the host changes something on the screen, and the \fBWait(Unlock)\fP action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the \fBAidWait\fP toggle. .PP Note that the \fBScript\fP action does not complete until end-of-file is detected on the pipe or the \fBCloseScript\fP action is called by the child process. This behavior is not affected by the state of the \fBAidWait\fP toggle. .SH "BASIC PROGRAMMING STRATEGIES" 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. .LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the \fBSnap\fP action. The \fBSnap(Save)\fP action saves a snapshot of the screen in a special buffer. Then the script can use \fBSnap\fP variants of the \fBAscii\fP and \fBEbcdic\fP actions (\fBSnap(Ascii)\fP and \fBSnap(Ebcdic)\fP) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, \fBSnap(Wait Output)\fP blocks the script until the host modifies the screen, specifically since the last call to \fBSnap(Save)\fP. Thus a script can poll the screen efficiently by writing a loop that begins with \fBSnap(Save)\fP and ends with \fBSnap(Wait Output)\fP. .SH "SCRIPT-SPECIFIC ACTIONS" The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, \fIrow\fP and \fIcol\fP coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). .TP \fBAnsiText\fP Outputs whatever data that has been output by the host in \s-1NVT\s+1 mode since the last time that \fBAnsiText\fP was called. The data is preceded by the string "data:\ ", and has had all control characters expanded into C backslash sequences. .IP This is a convenient way to capture \s-1NVT\s+1 mode output in a synchronous manner without trying to decode the screen contents. .TP \fBAscii\fP(\fIrow\fP,\fIcol\fP,\fIrows\fP,\fIcols\fP) .TP \fBAscii\fP(\fIrow\fP,\fIcol\fP,\fIlength\fP) .TP \fBAscii\fP(\fIlength\fP) .TP \fBAscii\fP Outputs an \s-1ASCII\s+1 text representation of the screen contents. Each line is preceded by the string "data:\ ", and there are no control characters. .IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) .IP If three parameters are given, \fIlength\fP characters are output, starting at the specified zero-origin row and column. .IP If only the \fIlength\fP parameter is given, that many characters are output, starting at the cursor position. .IP If no parameters are given, the entire screen is output. .IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the \fB\-charset\fP option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. .TP \fBAsciiField\fP Outputs an \s-1ASCII\s+1 text representation of the field containing the cursor. The text is preceded by the string "data:\ ". .TP \fBConnect\fP(\fIhostname\fP) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. .TP \fBCloseScript\fP(\fIstatus\fP) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the \fBScript\fP action, the optional \fIstatus\fP is used as the return status of \fBScript\fP; if nonzero, \fBScript\fP will complete with an error, and if this script was invoked as part of login through the \fBibm_hosts\fP file, the connection will be broken. .TP \fBContinueScript\fP([\fIparam\fP]) Allows a script that is waiting in a \fBPauseScript\fP action, below, to continue. The optional \fIparam\fP string is output by the \fBPauseScript\fP action. .TP \fBDisconnect\fP Disconnects from the host. .TP \fBEbcdic\fP(\fIrow\fP,\fIcol\fP,\fIrows\fP,\fIcols\fP) .TP \fBEbcdic\fP(\fIrow\fP,\fIcol\fP,\fIlength\fP) .TP \fBEbcdic\fP(\fIlength\fP) .TP \fBEbcdic\fP The same function as \fBAscii\fP above, except that rather than generating \s-1ASCII\s+1 text, each character is output as a 2-digit or 4-digit hexadecimal \s-1EBCDIC\s+1 code. .TP \fBEbcdicField\fP The same function as \fBAsciiField\fP above, except that it generates hexadecimal \s-1EBCDIC\s+1 codes. .TP \fBInfo\fP(\fImessage\fP) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. .TP \fBExpect\fP(\fItext\fP[,\fItimeout\fP]) Pauses the script until the specified \fItext\fP appears in the data stream from the host, or the specified \fItimeout\fP (in seconds) expires. If no \fItimeout\fP is specified, the default is 30 seconds. \fIText\fP can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. \fBExpect\fP is valid only in \s-1NVT\s+1 mode. .TP \fBKeymap([\fIkeymap\fP])\fP Adds or removes a temporary keymap. If the \fIkeymap\fP parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed. .TP \fBMoveCursor\fP(\fIrow\fP,\fIcol\fP) Moves the cursor to the specified zero-origin coordinates. .TP \fBPauseScript\fP Stops a script until the \fBContinueScript\fP action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to \fBContinueScript\fP, if one is given. .TP \fBPrintText\fP([\fBcommand\fP,]\fIfilter\fP) Pipes an ASCII representation of the current screen image through the named \fIfilter\fP, e.g., \fBlpr\fP. .TP \fBPrintText\fP([\fBhtml\fP,][\fBappend\fP,][\fBreplace\fP,]\fBfile\fP,\fIfilename\fP) Saves the current screen contents in a file. With the \fBhtml\fP option, saves it as HTML, otherwise saves it as plain ASCII. The \fBappend\fP option (the default) causes the data to be appended to the file if it already exists. The \fBreplace\fP option causes the file to be overwritten instead. .TP \fBPrintText\fP(\fBhtml,string\fP) Returns the current screen contents as HTML. .TP \fBQuery\fP(\fIkeyword\fP) Returns state information. Keywords are: .PP .TS center; l l . T{ .na .nh Keyword T} T{ .na .nh Output T} _ T{ .na .nh BindPluName T} T{ .na .nh BIND PLU returned by the host T} T{ .na .nh ConnectionState T} T{ .na .nh TN3270/TN3270E mode and submode T} T{ .na .nh CodePage T} T{ .na .nh Host code page T} T{ .na .nh Cursor T} T{ .na .nh Cursor position (row col) T} T{ .na .nh Formatted T} T{ .na .nh 3270 format state (formatted or unformatted) T} T{ .na .nh Host T} T{ .na .nh Host name and port T} T{ .na .nh LocalEncoding T} T{ .na .nh Local character encoding T} T{ .na .nh LuName T} T{ .na .nh Host name LU name T} T{ .na .nh Model T} T{ .na .nh 3270 model name (IBM-327x-n) T} T{ .na .nh ScreenCurSize T} T{ .na .nh Current screen size (rows cols) T} T{ .na .nh ScreenMaxSize T} T{ .na .nh Maximum screen size (rows cols) T} T{ .na .nh Ssl T} T{ .na .nh SSL state (secure or not-secure) and host validation state (host-verified or host-unverified) T} .TE .IP Without a \fIkeyword\fP, \fBQuery\fP returns each of the defined attributes, one per line, labeled by its name. .TP \fBReadBuffer\fP(\fBAscii\fP) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as \fBSF(aa=nn[,...])\fP, where \fIaa\fP is a field attribute type and \fInn\fP is its value. .PP .TS center; l l . T{ .na .nh Attribute T} T{ .na .nh Values T} _ T{ .na .nh c0 basic 3270 T} T{ .na .nh 20 protected T} T{ .na .nh T} T{ .na .nh 10 numeric T} T{ .na .nh T} T{ .na .nh 04 detectable T} T{ .na .nh T} T{ .na .nh 08 intensified T} T{ .na .nh T} T{ .na .nh 0c non-display T} T{ .na .nh T} T{ .na .nh 01 modified T} T{ .na .nh 41 highlighting T} T{ .na .nh f1 blink T} T{ .na .nh T} T{ .na .nh f2 reverse T} T{ .na .nh T} T{ .na .nh f4 underscore T} T{ .na .nh T} T{ .na .nh f8 intensify T} T{ .na .nh 42 foreground T} T{ .na .nh f0 neutral black T} T{ .na .nh T} T{ .na .nh f1 blue T} T{ .na .nh T} T{ .na .nh f2 red T} T{ .na .nh T} T{ .na .nh f3 pink T} T{ .na .nh T} T{ .na .nh f4 green T} T{ .na .nh T} T{ .na .nh f5 turquoise T} T{ .na .nh T} T{ .na .nh f6 yellow T} T{ .na .nh T} T{ .na .nh f7 neutral white T} T{ .na .nh T} T{ .na .nh f8 black T} T{ .na .nh T} T{ .na .nh f9 deep blue T} T{ .na .nh T} T{ .na .nh fa orange T} T{ .na .nh T} T{ .na .nh fb purple T} T{ .na .nh T} T{ .na .nh fc pale green T} T{ .na .nh T} T{ .na .nh fd pale turquoise T} T{ .na .nh T} T{ .na .nh fe grey T} T{ .na .nh T} T{ .na .nh ff white T} T{ .na .nh 43 character set T} T{ .na .nh f0 default T} T{ .na .nh T} T{ .na .nh f1 APL T} T{ .na .nh T} T{ .na .nh f8 DBCS T} .TE .IP Extended attributes (which do not take up display positions) are output as \fBSA(aa=nn)\fP, with \fIaa\fP and \fInn\fP having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). .IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. .TP \fBReadBuffer\fP(\fBEbcdic\fP) Equivalent to \fBReadBuffer\fP(\fBAscii\fP), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as \fBGE(\fIxx\fP)\fP. .TP \fBScript\fP(\fIpath\fP[,arg...]) Runs a child script, passing it optional command-line arguments. \fIpath\fP must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the \fBSource\fP action. .TP \fBSnap\fP Equivalent to \fBSnap\fP(\fBSave\fP) (see below). .TP \fBSnap\fP(\fBAscii\fP,...) Performs the \fBAscii\fP action on the saved screen image. .TP \fBSnap\fP(\fBCols\fP) Returns the number of columns in the saved screen image. .TP \fBSnap\fP(\fBEbcdic\fP,...) Performs the \fBEbcdic\fP action on the saved screen image. .TP \fBSnap\fP(\fBReadBuffer\fP) Performs the \fBReadBuffer\fP action on the saved screen image. .TP \fBSnap(\fBRows\fP)\fP Returns the number of rows in the saved screen image. .TP \fBSnap\fP(\fBSave\fP) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other \fBSnap\fP actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. .TP \fBSnap\fP(\fBStatus\fP) Returns the status line from when the screen was last saved. .TP \fBSnap\fP(\fBWait\fP[,\fItimeout\fP],\fBOutput\fP) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an \fBEnter\fP, \fBPF\fP or \fBPA\fP action), but has not finished updating the screen. This action is usually invoked in a loop that uses the \fBSnap\fP(\fBAscii\fP) or \fBSnap\fP(\fBEbcdic\fP) action to scan the screen for some pattern that indicates that the host has fully processed the last command. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBSnap\fP action. The default is to wait indefinitely. .TP \fBSource\fP(\fIfile\fP) Read and execute commands from \fIfile\fP. Any output from those commands will become the output from \fBSource\fP. If any of the commands fails, the \fBSource\fP command will \fInot\fP abort; it will continue reading commands until EOF. .TP \fBTitle\fP(\fItext\fP) Changes the x3270 window title to \fItext\fP. .TP \fBTransfer\fP(\fIkeyword\fP=\fIvalue\fP,...) Invokes IND$FILE file transfer. See \s-1FILE TRANSFER\s+1 below. .TP \fBWait\fP([\fItimeout\fP,] \fB3270Mode\fP) Used when communicating with a host that switches between \s-1NVT\s+1 mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .IP For backwards compatibility, \fBWait(3270)\fP is equivalent to \fBWait\fP(\fB3270Mode\fP) .TP \fBWait\fP([\fItimeout\fP,] \fBDisconnect\fP) Pauses the script until the host disconnects. Often used to after sending a \fIlogoff\fP command to a \s-1VM/CMS\s+1 host, to ensure that the session is not unintentionally set to \fBdisconnected\fP state. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .TP \fBWait\fP([\fItimeout\fP,] \fBInputField\fP) A useful utility for use at the beginning of scripts and after the \fBConnect\fP action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In \s-1NVT\s+1 mode, waits until the host sends at least one byte of data. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .IP For backwards compatibility, \fBWait\fP is equivalent to \fBWait\fP(\fBInputField\fP). .TP \fBWait\fP([\fItimeout\fP,] \fBNVTMode\fP) Used when communicating with a host that switches between 3270 mode and \s-1NVT\s+1 mode. Pauses the script or macro until the host negotiates \s-1NVT\s+1 mode, then waits for a byte from the host as above. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .IP For backwards compatibility, \fBWait\fP(\fBansi\fP) is equivalent to \fBWait\fP(\fBNVTMode\fP). .TP \fBWait\fP([\fItimeout\fP,] \fBOutput\fP) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a \fBClear\fP, \fBEnter\fP, \fBPF\fP or \fBPA\fP action), but has not finished updating the screen. Also used in non-blocking AID mode (see \s-1DIFFERENCES\s+1 for details). This action is usually invoked in a loop that uses the \fBAscii\fP or \fBEbcdic\fP action to scan the screen for some pattern that indicates that the host has fully processed the last command. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .TP \fBWait\fP([\fItimeout\fP,] \fBUnlock\fP) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (\fBtoggle AidWait clear\fP), to wait for a host command to complete. See \s-1DIFFERENCES\s+1 for details). .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .TP \fBWait\fP(\fItimeout\fP, \fBSeconds\fP) Delays the script \fItimeout\fP seconds. Unlike the other forms of \fBWait\fP, the timeout is not optional. .TP \fBWindowState\fP(\fImode\fP) If \fImode\fP is \fBIconic\fP, changes the x3270 window into an icon. If \fImode\fP is \fBNormal\fP, changes the x3270 window from an icon to a normal window. .SH "FILE TRANSFER" The \fBTransfer\fP action implements \fBIND$FILE\fP file transfer. This action requires that the \fBIND$FILE\fP program be installed on the \s-1IBM\s+1 host, and that the 3270 cursor be located in a field that will accept a \s-1TSO\s+1 or \s-1VM/CMS\s+1 command. .LP The \fBTransfer\fP action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. .LP Because of the complexity and number of options for file transfer, the parameters to the \fBTransfer\fP action take the unique form of \fIoption\fP=\fIvalue\fP, and can appear in any order. Note that if the \fIvalue\fP contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: .LP .TS l c l l. T{ .na .nh Option T} T{ .na .nh Required? T} T{ .na .nh Default T} T{ .na .nh Other Values T} _ T{ .na .nh Direction T} T{ .na .nh No T} T{ .na .nh receive T} T{ .na .nh send T} T{ .na .nh HostFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh LocalFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Host T} T{ .na .nh No T} T{ .na .nh tso T} T{ .na .nh vm, cics T} T{ .na .nh Mode T} T{ .na .nh No T} T{ .na .nh ascii T} T{ .na .nh binary T} T{ .na .nh Cr T} T{ .na .nh No T} T{ .na .nh remove T} T{ .na .nh add, keep T} T{ .na .nh Remap T} T{ .na .nh No T} T{ .na .nh yes T} T{ .na .nh no T} T{ .na .nh Exist T} T{ .na .nh No T} T{ .na .nh keep T} T{ .na .nh replace, append T} T{ .na .nh Recfm T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh fixed, variable, undefined T} T{ .na .nh Lrecl T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Blksize T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Allocation T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh tracks, cylinders, avblock T} T{ .na .nh PrimarySpace T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh SecondarySpace T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Avblock T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh BufferSize T} T{ .na .nh No T} T{ .na .nh 4096 T} T{ .na .nh \ T} .TE .LP The option details are as follows. .TP \fBDirection\fP \fBsend\fP to send a file to the host, \fBreceive\fP to receive a file from the host. .TP \fBHostFile\fP The name of the file on the host. .TP \fBLocalFile\fP The name of the file on the local workstation. .TP \fBHost\fP The type of host (which dictates the form of the \fBIND$FILE\fP command): \fBtso\fP (the default), \fBvm\fP or \fBcics\fP. .TP \fBMode\fP Use \fBascii\fP (the default) for a text file, which will be translated between \s-1EBCDIC\s+1 and \s-1ASCII\s+1 as necessary. Use \fBbinary\fP for non-text files. .TP \fBCr\fP Controls how \fBNewline\fP characters are handled when transferring \fBMode=ascii\fP files. \fBremove\fP (the default) strips \fBNewline\fP characters in local files before transferring them to the host. \fBadd\fP adds \fBNewline\fP characters to each host file record before transferring it to the local workstation. \fBkeep\fP preserves \fBNewline\fP characters when transferring a local file to the host. .TP \fBRemap\fP Controls text translation for \fBMode=ascii\fP files. The value \fByes\fP (the default) causes c3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's \s-1EBCDIC\s+1 code page. The value \fBno\fP causes c3270 to pass the text to or from the host as-is, leaving all translation to the \fBIND$FILE\fP program on the host. .TP \fBExist\fP Controls what happens when the destination file already exists. \fBkeep\fP (the default) preserves the file, causing the \fBTransfer\fP action to fail. \fBreplace\fP overwrites the destination file with the source file. \fBappend\fP appends the source file to the destination file. .TP \fBRecfm\fP Controls the record format of files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) \fBfixed\fP creates a file with fixed-length records. \fBvariable\fP creates a file with variable-length records. \fBundefined\fP creates a file with undefined-length records (\s-1TSO\s+1 hosts only). The \fBLrecl\fP option controls the record length or maximum record length for \fBRecfm=fixed\fP and \fBRecfm=variable\fP files, respectively. .TP \fBLrecl\fP Specifies the record length (or maximum record length) for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBBlksize\fP Specifies the block size for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBAllocation\fP Specifies the units for the \fBPrimarySpace\fP and \fBSecondarySpace\fP options: \fBtracks\fP, \fBcylinders\fP or \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBPrimarySpace\fP Primary allocation for a file. The units are given by the \fBAllocation\fP option. Required when the \fBAllocation\fP is specified as something other than \fBdefault\fP. (\s-1TSO\s+1 hosts only.) .TP \fBSecondarySpace\fP Secondary allocation for a file. The units are given by the \fBAllocation\fP option. (\s-1TSO\s+1 hosts only.) .TP \fBAvblock\fP Average block size, required when \fBAllocation\fP specifies \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBBufferSize\fP Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. .LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the \fBTransfer\fP keywords, but with \fBft\fP prepended. E.g., the default for the \fBMode\fP keyword is the \fBc3270.ftMode\fP resource. .SH "SEE ALSO" expect(1) .br perl(1) .br ksh(1) .br x3270(1) .br x3270if(1) .br c3270(1) .br s3270(1) .SH "VERSION" Version 3.6ga4 suite3270-3.6/c3270/x3270-script.man.m40000664000076500007650000006544613221577163015052 0ustar pdmpdmdnl Copyright (c) 2000-2014, 2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270-SCRIPT,1,XX_DATE) XX_SH(Name) Scripting Facilities for ifelse(XX_PLATFORM,unix,`x3270,') XX_C3270 and XX_S3270 XX_SH(Synopsis) ifelse(XX_PLATFORM,unix,`XX_FB(x3270) XX_FB(XX_DASHED(script)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(socket)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(scriptport) XX_FI(port)) [ XX_FI(x3270-options) ] XX_BR ')dnl ifelse(XX_PLATFORM,unix,`XX_FB(XX_C3270) XX_FB(XX_DASHED(socket)) [ XX_FI(XX_C3270-options) ] XX_BR ')dnl XX_FB(XX_C3270) XX_FB(XX_DASHED(scriptport)) XX_FI(port) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(XX_S3270) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(`Script') ( XX_FI(command) [ `,'XX_FI(arg)... ] ) XX_SH(Description) The XX_FB(x3270) scripting facilities allow the interactive 3270 ifelse(XX_PLATFORM,unix,`emulators XX_FB(x3270) and XX_FB(c3270)', `emulator XX_FB(wc3270)') to be operated under the control of another program, and forms the basis for the script-only emulator XX_FB(XX_S3270). XX_PP There are ifelse(XX_PLATFORM,unix,four,three) basic scripting methods. The first is the XX_FB(peer script) facility, ifelse(XX_PLATFORM,unix,`invoked by the XX_FB(x3270) XX_FB(XX_DASHED(script)) switch, and ')dnl the default mode for XX_FB(XX_S3270). This runs the emulator as a child of another process. Typically this would be a script using XX_FI(expect)(1), XX_FI(perl)(1), or the co-process facility of the Korn Shell XX_FI(ksh)(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. XX_PP The second method is the XX_FB(child script) facility, invoked by the emulator's XX_FB(Script) action. This runs a script as a child process of the emulator. ifelse(XX_PLATFORM,unix,`The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. ',`The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196). ')dnl XX_PP The third method uses a TCP socket. The XX_FB(XX_DASHED(scrpiptport)) command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. ifelse(XX_PLATFORM,windows,`(Note that if the XX_FB(Script) action is used with XX_FB(XX_DASHED(scriptport)), it will pass the scriptport port number to child scripts, rather than creating a new socket.) ')dnl ifelse(XX_PLATFORM,unix,`XX_PP The fourth method uses a Unix-domain socket. The XX_FB(XX_DASHED(socket)) command-line option causes the emulator to create a Unix-domain stream socket named XX_FB(/tmp/x3sck.)`'XX_FI(pid). The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. ')dnl XX_PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the XX_FB(Script) action. The calling script will be resumed when the nested script completes. XX_PP Commands are emulator XX_FI(actions); the syntax is the same as for the right-hand side of ifelse(XX_PLATFORM,unix,`an XX_FB(x3270) or',`a') XX_FB(XX_C3270) keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with XX_FB(#) or XX_FB(!) is treaded as a comment and will be ignored. XX_PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. XX_PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". XX_SH(Status Format) The status message consists of 12 blank-separated fields: XX_TPS()dnl XX_TP(1 Keyboard State) If the keyboard is unlocked, the letter XX_FB(U). If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter XX_FB(L). If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter XX_FB(E). XX_TP(2 Screen Formatting) If the screen is formatted, the letter XX_FB(F). If unformatted or in XX_SM(NVT) mode, the letter XX_FB(U). XX_TP(3 Field Protection) If the field containing the cursor is protected, the letter XX_FB(P). If unprotected or unformatted, the letter XX_FB(U). XX_TP(4 Connection State) If connected to a host, the string XX_FB(`C(')`'XX_FI(hostname)`'XX_FB(`)'). Otherwise, the letter XX_FB(N). XX_TP(5 Emulator Mode) If connected in 3270 mode, the letter XX_FB(I). If connected in XX_SM(NVT) line mode, the letter XX_FB(L). If connected in XX_SM(NVT) character mode, the letter XX_FB(C). If connected in unnegotiated mode (no BIND active from the host), the letter XX_FB(P). If not connected, the letter XX_FB(N). XX_TP(6 Model Number (2-5)) XX_TP(7 Number of Rows) The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. XX_TP(8 Number of Columns) The current number of columns defined on the screen, subject to the same difference for rows, above. XX_TP(9 Cursor Row) The current cursor row (zero-origin). XX_TP(10 Cursor Column) The current cursor column (zero-origin). XX_TP(11 Window ID) The X window identifier for the main XX_FB(x3270) window, in hexadecimal preceded by XX_FB(0x). For XX_FB(XX_S3270) and XX_FB(XX_C3270), this is zero. XX_TP(12 Command Execution Time) The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. XX_TPE()dnl XX_SH(Differences) When an action is initiated by a script, the emulators behave in several different ways: XX_PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. XX_PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the XX_FB(CloseScript) action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the XX_FB(Script) action to complete. XX_PP The XX_FB(Quit) action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) XX_PP Normally, the AID actions (XX_FB(Clear), XX_FB(Enter), XX_FB(PF), and XX_FB(PA)) will not complete until the host unlocks the keyboard. If the parameter to a XX_FB(String) action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. XX_PP The XX_FB(AidWait) toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The XX_FB(Wait(Output)) action can then be used to delay a script until the host changes something on the screen, and the XX_FB(Wait(Unlock)) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the XX_FB(AidWait) toggle. XX_PP Note that the XX_FB(Script) action does not complete until ifelse(XX_PLATFORM,unix,`end-of-file is detected on the pipe or ')dnl the XX_FB(CloseScript) action is called by the child process. This behavior is not affected by the state of the XX_FB(AidWait) toggle. XX_SH(Basic Programming Strategies) 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. XX_LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the XX_FB(Snap) action. The XX_FB(Snap(Save)) action saves a snapshot of the screen in a special buffer. Then the script can use XX_FB(Snap) variants of the XX_FB(Ascii) and XX_FB(Ebcdic) actions (XX_FB(Snap(Ascii)) and XX_FB(Snap(Ebcdic))) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, XX_FB(Snap(Wait Output)) blocks the script until the host modifies the screen, specifically since the last call to XX_FB(Snap(Save)). Thus a script can poll the screen efficiently by writing a loop that begins with XX_FB(Snap(Save)) and ends with XX_FB(Snap(Wait Output)). XX_SH(Script-Specific Actions) The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, XX_FI(row) and XX_FI(col) coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). XX_TPS()dnl XX_TP(XX_FB(AnsiText)) Outputs whatever data that has been output by the host in XX_SM(NVT) mode since the last time that XX_FB(AnsiText) was called. The data is preceded by the string "data:XX_NBSP", and has had all control characters expanded into C backslash sequences. XX_IP This is a convenient way to capture XX_SM(NVT) mode output in a synchronous manner without trying to decode the screen contents. XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ascii)(XX_FI(length))) XX_TP(XX_FB(Ascii)) Outputs an XX_SM(ASCII) text representation of the screen contents. Each line is preceded by the string "data:XX_NBSP", and there are no control characters. XX_IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) XX_IP If three parameters are given, XX_FI(length) characters are output, starting at the specified zero-origin row and column. XX_IP If only the XX_FI(length) parameter is given, that many characters are output, starting at the cursor position. XX_IP If no parameters are given, the entire screen is output. XX_IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the XX_FB(XX_DASHED(charset)) option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. XX_TP(XX_FB(AsciiField)) Outputs an XX_SM(ASCII) text representation of the field containing the cursor. The text is preceded by the string "data:XX_NBSP". XX_TP(XX_FB(Connect)(XX_FI(hostname))) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. XX_TP(XX_FB(CloseScript)(XX_FI(status))) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the XX_FB(Script) action, the optional XX_FI(status) is used as the return status of XX_FB(Script); if nonzero, XX_FB(Script) will complete with an error, and if this script was invoked as part of login through the XX_FB(ibm_hosts) file, the connection will be broken. XX_TP(XX_FB(ContinueScript)([XX_FI(param)])) Allows a script that is waiting in a XX_FB(PauseScript) action, below, to continue. The optional XX_FI(param) string is output by the XX_FB(PauseScript) action. XX_TP(XX_FB(Disconnect)) Disconnects from the host. XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ebcdic)(XX_FI(length))) XX_TP(XX_FB(Ebcdic)) The same function as XX_FB(Ascii) above, except that rather than generating XX_SM(ASCII) text, each character is output as a 2-digit or 4-digit hexadecimal XX_SM(EBCDIC) code. XX_TP(XX_FB(EbcdicField)) The same function as XX_FB(AsciiField) above, except that it generates hexadecimal XX_SM(EBCDIC) codes. XX_TP(XX_FB(Info)(XX_FI(message))) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. XX_TP(XX_FB(Expect)(XX_FI(text)[,XX_FI(timeout)])) Pauses the script until the specified XX_FI(text) appears in the data stream from the host, or the specified XX_FI(timeout) (in seconds) expires. If no XX_FI(timeout) is specified, the default is 30 seconds. XX_FI(Text) can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. XX_FB(Expect) is valid only in XX_SM(NVT) mode. ifelse(XX_MODE,console,`XX_TP(XX_FB(Keymap([XX_FI(keymap)]))) Adds or removes a temporary keymap. If the XX_FI(keymap) parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed. ')dnl XX_TP(XX_FB(MoveCursor)(XX_FI(row),XX_FI(col))) Moves the cursor to the specified zero-origin coordinates. XX_TP(XX_FB(PauseScript)) Stops a script until the XX_FB(ContinueScript) action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to XX_FB(ContinueScript), if one is given. XX_TP(XX_FB(PrintText)([XX_FB(command),]XX_FI(filter))) Pipes an ASCII representation of the current screen image through the named XX_FI(filter), e.g., XX_FB(lpr). XX_TP(XX_FB(PrintText)([XX_FB(html),][XX_FB(append),][XX_FB(replace),]XX_FB(file),XX_FI(filename))) Saves the current screen contents in a file. With the XX_FB(html) option, saves it as HTML, otherwise saves it as plain ASCII. The XX_FB(append) option (the default) causes the data to be appended to the file if it already exists. The XX_FB(replace) option causes the file to be overwritten instead. XX_TP(XX_FB(PrintText)(XX_FB(`html,string'))) Returns the current screen contents as HTML. XX_TP(XX_FB(Query)(XX_FI(keyword))) Returns state information. Keywords are: XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(Keyword) XX_TD(Output)) XX_T_ XX_TR(XX_TD(BindPluName) XX_TD(BIND PLU returned by the host)) XX_TR(XX_TD(ConnectionState) XX_TD(TN3270/TN3270E mode and submode)) XX_TR(XX_TD(CodePage) XX_TD(Host code page)) XX_TR(XX_TD(Cursor) XX_TD(Cursor position (row col), zero-origin)) XX_TR(XX_TD(Formatted) XX_TD(3270 format state (formatted or unformatted))) XX_TR(XX_TD(Host) XX_TD(Host name and port)) XX_TR(XX_TD(LocalEncoding) XX_TD(Local character encoding)) XX_TR(XX_TD(LuName) XX_TD(Host name LU name)) XX_TR(XX_TD(Model) XX_TD(3270 model name (IBM-327x-n))) XX_TR(XX_TD(ScreenCurSize) XX_TD(Current screen size (rows cols))) XX_TR(XX_TD(ScreenMaxSize) XX_TD(Maximum screen size (rows cols))) XX_TR(XX_TD(Ssl) XX_TD(SSL state (secure or not-secure) and host validation state (host-verified or host-unverified))) XX_TE XX_IP Without a XX_FI(keyword), XX_FB(Query) returns each of the defined attributes, one per line, labeled by its name. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ascii))) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as XX_FB(SF`(aa=nn[,...])'), where XX_FI(aa) is a field attribute type and XX_FI(nn) is its value. XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(XX_TC(Attribute)) XX_TD(XX_TC(Values))) XX_T_ XX_TR(XX_TD(XX_TC(c0 basic 3270)) XX_TD(XX_TC(20 protected))) XX_TR(XX_TD() XX_TD(XX_TC(10 numeric))) XX_TR(XX_TD() XX_TD(XX_TC(04 detectable))) XX_TR(XX_TD() XX_TD(XX_TC(08 intensified))) XX_TR(XX_TD() XX_TD(XX_TC(0c non-display))) XX_TR(XX_TD() XX_TD(XX_TC(01 modified))) XX_TR(XX_TD(XX_TC(41 highlighting)) XX_TD(XX_TC(f1 blink))) XX_TR(XX_TD() XX_TD(XX_TC(f2 reverse))) XX_TR(XX_TD() XX_TD(XX_TC(f4 underscore))) XX_TR(XX_TD() XX_TD(XX_TC(f8 intensify))) XX_TR(XX_TD(XX_TC(42 foreground)) XX_TD(XX_TC(f0 neutral black))) XX_TR(XX_TD() XX_TD(XX_TC(f1 blue))) XX_TR(XX_TD() XX_TD(XX_TC(f2 red))) XX_TR(XX_TD() XX_TD(XX_TC(f3 pink))) XX_TR(XX_TD() XX_TD(XX_TC(f4 green))) XX_TR(XX_TD() XX_TD(XX_TC(f5 turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(f6 yellow))) XX_TR(XX_TD() XX_TD(XX_TC(f7 neutral white))) XX_TR(XX_TD() XX_TD(XX_TC(f8 black))) XX_TR(XX_TD() XX_TD(XX_TC(f9 deep blue))) XX_TR(XX_TD() XX_TD(XX_TC(fa orange))) XX_TR(XX_TD() XX_TD(XX_TC(fb purple))) XX_TR(XX_TD() XX_TD(XX_TC(fc pale green))) XX_TR(XX_TD() XX_TD(XX_TC(fd pale turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(fe grey))) XX_TR(XX_TD() XX_TD(XX_TC(ff white))) XX_TR(XX_TD(XX_TC(43 character set)) XX_TD(XX_TC(f0 default))) XX_TR(XX_TD() XX_TD(XX_TC(f1 APL))) XX_TR(XX_TD() XX_TD(XX_TC(f8 DBCS))) XX_TE() XX_IP Extended attributes (which do not take up display positions) are output as XX_FB(SA`('aa=nn`)'), with XX_FI(aa) and XX_FI(nn) having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). XX_IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ebcdic))) Equivalent to XX_FB(ReadBuffer)(XX_FB(Ascii)), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as XX_FB(GE`('XX_FI(xx)`)'). XX_TP(XX_FB(Script)(XX_FI(path)[,arg...])) Runs a child script, passing it optional command-line arguments. XX_FI(path) must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the XX_FB(Source) action. XX_TP(XX_FB(Snap)) Equivalent to XX_FB(Snap)(XX_FB(Save)) (see XX_LINK(#save,below)). XX_TP(XX_FB(Snap)(XX_FB(Ascii),...)) Performs the XX_FB(Ascii) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(Cols))) Returns the number of columns in the saved screen image. XX_TP(XX_FB(Snap)(`XX_FB(Ebcdic),...')) Performs the XX_FB(Ebcdic) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(ReadBuffer))) Performs the XX_FB(ReadBuffer) action on the saved screen image. XX_TP(XX_FB(Snap(XX_FB(Rows)))) Returns the number of rows in the saved screen image. XX_TARGET(save)dnl XX_TP(XX_FB(Snap)(XX_FB(Save))) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other XX_FB(Snap) actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. XX_TP(XX_FB(Snap)(XX_FB(Status))) Returns the status line from when the screen was last saved. XX_TP(XX_FB(Snap)(XX_FB(Wait)[`,'XX_FI(timeout)]`,'XX_FB(Output))) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. This action is usually invoked in a loop that uses the XX_FB(Snap)(XX_FB(Ascii)) or XX_FB(Snap)(XX_FB(Ebcdic)) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Snap) action. The default is to wait indefinitely. XX_TP(XX_FB(Source)(XX_FI(file))) Read and execute commands from XX_FI(file). Any output from those commands will become the output from XX_FB(Source). If any of the commands fails, the XX_FB(Source) command will XX_FI(not) abort; it will continue reading commands until EOF. XX_TP(XX_FB(Title)(XX_FI(text))) Changes the ifelse(XX_PLATFORM,unix,x3270,wc3270) window title to XX_FI(text). XX_TP(XX_FB(Transfer)(XX_FI(keyword)=XX_FI(value),...)) Invokes IND$FILE file transfer. See XX_LINK(#File-Transfer,XX_SM(FILE TRANSFER)) below. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(3270Mode))) Used when communicating with a host that switches between XX_SM(NVT) mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait(3270)) is equivalent to XX_FB(Wait)(XX_FB(3270Mode)) XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Disconnect))) Pauses the script until the host disconnects. Often used to after sending a XX_FI(logoff) command to a XX_SM(VM/CMS) host, to ensure that the session is not unintentionally set to XX_FB(disconnected) state. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(InputField))) A useful utility for use at the beginning of scripts and after the XX_FB(Connect) action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In XX_SM(NVT) mode, waits until the host sends at least one byte of data. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait) is equivalent to XX_FB(Wait)(XX_FB(InputField)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(NVTMode))) Used when communicating with a host that switches between 3270 mode and XX_SM(NVT) mode. Pauses the script or macro until the host negotiates XX_SM(NVT) mode, then waits for a byte from the host as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait)(XX_FB(ansi)) is equivalent to XX_FB(Wait)(XX_FB(NVTMode)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Output))) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a XX_FB(Clear), XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. Also used in non-blocking AID mode (see XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). This action is usually invoked in a loop that uses the XX_FB(Ascii) or XX_FB(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Unlock))) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (XX_FB(toggle AidWait clear)), to wait for a host command to complete. See XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)(XX_FI(timeout)`,' XX_FB(Seconds))) Delays the script XX_FI(timeout) seconds. Unlike the other forms of XX_FB(Wait), the timeout is not optional. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(WindowState)(XX_FI(mode))) If XX_FI(mode) is XX_FB(Iconic), changes the x3270 window into an icon. If XX_FI(mode) is XX_FB(Normal), changes the x3270 window from an icon to a normal window. ')dnl XX_TPE()dnl define(XX_action,action)dnl include(ft.inc)dnl XX_SH(See Also) expect(1) XX_BR perl(1) XX_BR ksh(1) ifelse(XX_PLATFORM,unix,`XX_BR XX_LINK(x3270-man.html,x3270(1)) ')dnl XX_BR ifelse(XX_PLATFORM,unix,`XX_LINK(Unix-x3270if.html,x3270if(1))',`XX_LINK(Windows-x3270if.html,x3270if(1))') XX_BR XX_LINK(XX_C3270-man.html,XX_C3270`(1)') XX_BR XX_LINK(XX_S3270-man.html,XX_S3270`(1)') XX_SH(Version) Version XX_VERSION_NUMBER suite3270-3.6/Common/actions.c0000664000076500007650000001715013221577163014234 0ustar pdmpdm/* * Copyright (c) 1993-2016 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * actions.c * The actions table and action debugging code. */ #include "globals.h" #include "appres.h" #include "actions.h" #include "lazya.h" #include "macros.h" #include "popups.h" #include "resources.h" #include "trace.h" #include "utils.h" llist_t actions_list = LLIST_INIT(actions_list); unsigned actions_list_count; enum iaction ia_cause; const char *ia_name[] = { "String", "Paste", "Screen redraw", "Keypad", "Default", "Key", "Macro", "Script", "Peek", "Typeahead", "File transfer", "Command", "Keymap", "Idle" }; typedef struct { llist_t list; char *name; } suppress_t; static llist_t suppressed = LLIST_INIT(suppressed); static bool suppressed_initted = false; /* Initialize the list of suppressed actions. */ static void init_suppressed(const char *actions) { char *a; char *action; suppress_t *s; if (actions == NULL) { return; } a = lazya(NewString(actions)); while ((action = strtok(a, " \t\r\n")) != NULL) { size_t sl = strlen(action); action_elt_t *e; bool found = false; /* Prime for the next strtok() call. */ a = NULL; /* Chop off any trailing parentheses. */ if (sl > 2 && !strcmp(action + sl - 2, "()")) { sl -= 2; *(action + sl) = '\0'; } /* Make sure the action they are suppressing is real. */ FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strcasecmp(e->t.name, action)) { found = true; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (!found) { vtrace("Warning: action '%s' in %s not found\n", action, ResSuppressActions); continue; } /* Add it to the list. */ s = (suppress_t *)Malloc(sizeof(suppress_t) + sl + 1); s->name = (char *)(s + 1); strcpy(s->name, action); llist_init(&s->list); llist_insert_before(&s->list, &suppressed); } } /* Look up an action name in the suppressed actions resource. */ static bool action_suppressed(const char *name) { suppress_t *s; if (!suppressed_initted) { init_suppressed(appres.suppress_actions); suppressed_initted = true; } if (llist_isempty(&suppressed)) { return false; } FOREACH_LLIST(&suppressed, s, suppress_t *) { if (!strcasecmp(name, s->name)) { return true; } } FOREACH_LLIST_END(&suppressed, s, suppress_t *); return false; } /* * Check the number of argument to an action, and possibly pop up a usage * message. * * Returns 0 if the argument count is correct, -1 otherwise. */ int check_argc(const char *aname, unsigned nargs, unsigned nargs_min, unsigned nargs_max) { if (nargs >= nargs_min && nargs <= nargs_max) { return 0; } if (nargs_min == nargs_max) { popup_an_error("%s requires %d argument%s", aname, nargs_min, nargs_min == 1 ? "" : "s"); } else { popup_an_error("%s requires %d or %d arguments", aname, nargs_min, nargs_max); } cancel_if_idle_command(); return -1; } /* * Trace the execution of an emulator action. */ void action_debug(const char *aname, ia_t ia, unsigned argc, const char **argv) { unsigned i; char pbuf[1024]; if (!toggled(TRACING)) { return; } vtrace("%s -> %s(", ia_name[(int)ia], aname); for (i = 0; i < argc; i++) { vtrace("%s\"%s\"", i? ", ": "", scatv(argv[i], pbuf, sizeof(pbuf))); } vtrace(")\n"); trace_rollover_check(); } /* * Run an emulator action by name, given 0, 1 or 2 parameters. */ bool run_action(const char *name, enum iaction cause, const char *parm1, const char *parm2) { action_elt_t *e; action_t *action = NULL; unsigned count = 0; const char *parms[2]; FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strcasecmp(e->t.name, name)) { action = e->t.action; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (action == NULL) { return false; /* XXX: And do something? */ } if (parm1 != NULL) { parms[0] = parm1; count++; if (parm2 != NULL) { parms[1] = parm2; count++; } } return run_action_entry(e, cause, count, parms); } /* * Run an emulator action by name, given an array of parameters. */ bool run_action_a(const char *name, enum iaction cause, unsigned count, const char **parms) { action_elt_t *e; action_t *action = NULL; FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strcasecmp(e->t.name, name)) { action = e->t.action; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (action == NULL) { return false; /* XXX: And do something? */ } return run_action_entry(e, cause, count, parms); } /* * Run an action by entry. * This is where action suppression happens. */ bool run_action_entry(action_elt_t *e, enum iaction cause, unsigned count, const char **parms) { if (action_suppressed(e->t.name)) { vtrace("%s() [suppressed]\n", e->t.name); return false; } ia_cause = cause; return (*e->t.action)(cause, count, parms); } /* * Register a group of actions. * * Duplicate actions will override older ones. * The memory for the table is not kept, but the memory for the strings * referenced by the table will be re-used. */ void register_actions(action_table_t *new_actions, unsigned count) { unsigned i; for (i = 0; i < count; i++) { action_elt_t *e; action_elt_t *before; before = NULL; FOREACH_LLIST(&actions_list, e, action_elt_t *) { int cmp; cmp = strcasecmp(e->t.name, new_actions[i].name); if (cmp == 0) { /* Replace. */ e->t = new_actions[i]; /* struct copy */ return; } else if (cmp < 0) { /* Goes ahead of this one. */ before = e; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); e = Malloc(sizeof(action_elt_t)); e->t = new_actions[i]; /* struct copy */ llist_init(&e->list); if (before) { /* Insert before found element. */ llist_insert_before(&e->list, &before->list); } else { /* Insert before head (at the end of the list). */ llist_insert_before(&e->list, actions_list.next); } actions_list_count++; } } suite3270-3.6/Common/apl.c0000664000076500007650000001716613221577163013357 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * apl.c * This module handles APL-specific actions. */ #include "globals.h" #include "latin1.h" #include "apl.h" /* * APL key translation. * * This code looks a little odd because of how an APL font is implemented. * An APL font has APL graphics in place of the various accented letters and * special symbols in a regular font. APL key translation consists of * taking the key name for an APL symbol (these names are meaningful only to * x3270) and translating it into the key for the regular symbol that the * desired APL symbol _replaces_. * * For example, an APL font has the APL "jot" symbol where a regular font has * the "registered" symbol. So we take the key name "jot" and translate it * into the key latin1_reg. When the latin1_reg symbol is displayed * with an APL font, it appears as a "jot". * * The specification of which APL symbols replace which regular symbols is in * IBM GA27-3831, 3174 Establishment Controller Character Set Reference. * * In addition, several standard characters have different names for APL, * for example, "period" becomes "dot". These are included in the table as * well. */ static struct { const char *name; latin1_symbol_t key; int is_ge; } axl[] = { { "Aunderbar", latin1_nbsp, 1 }, { "Bunderbar", latin1_acirc, 1 }, { "Cunderbar", latin1_auml, 1 }, { "Dunderbar", latin1_agrave, 1 }, { "Eunderbar", latin1_aacute, 1 }, { "Funderbar", latin1_atilde, 1 }, { "Gunderbar", latin1_aring, 1 }, { "Hunderbar", latin1_ccedil, 1 }, { "Iunderbar", latin1_ntilde, 1 }, { "Junderbar", latin1_eacute, 1 }, { "Kunderbar", latin1_ecirc, 1 }, { "Lunderbar", latin1_euml, 1 }, { "Munderbar", latin1_egrave, 1 }, { "Nunderbar", latin1_iacute, 1 }, { "Ounderbar", latin1_icirc, 1 }, { "Punderbar", latin1_iuml, 1 }, { "Qunderbar", latin1_igrave, 1 }, { "Runderbar", latin1_szlig, 1 }, { "Sunderbar", latin1_Acirc, 1 }, { "Tunderbar", latin1_Auml, 1 }, { "Uunderbar", latin1_Agrave, 1 }, { "Vunderbar", latin1_Aacute, 1 }, { "Wunderbar", latin1_Atilde, 1 }, { "Xunderbar", latin1_Aring, 1 }, { "Yunderbar", latin1_Ccedil, 1 }, { "Zunderbar", latin1_Ntilde, 1 }, { "alpha", latin1_circ, 1 }, { "bar", latin1_minus, 0 }, { "braceleft", latin1_lcub, 1 }, { "braceright", latin1_rcub, 1 }, { "bracketleft", latin1_Yacute, 1 }, { "bracketright", latin1_uml, 1 }, { "circle", latin1_cedil, 1 }, { "circlebar", latin1_Ograve, 1 }, { "circleslope", latin1_otilde, 1 }, { "circlestar", latin1_Ugrave, 1 }, { "circlestile", latin1_ograve, 1 }, { "colon", latin1_colon, 0 }, { "comma", latin1_comma, 0 }, { "commabar", latin1_W, 1 }, /* soliton */ { "del", latin1_lsqb, 1 }, { "delstile", latin1_uuml, 1 }, { "delta", latin1_rsqb, 1 }, { "deltastile", latin1_ugrave, 1 }, { "deltaunderbar", latin1_Uuml, 1 }, { "deltilde", latin1_Ucirc, 1 }, { "diaeresis", latin1_Ecirc, 1 }, { "diaeresiscircle", latin1_V, 1 }, /* soliton */ { "diaeresisdot", latin1_Ouml, 1 }, { "diaeresisjot", latin1_U, 1 }, /* soliton */ { "diamond", latin1_oslash, 1 }, { "dieresis", latin1_Ecirc, 1 }, { "dieresisdot", latin1_Ouml, 1 }, { "divide", latin1_frac12, 1 }, { "dot", latin1_period, 0 }, { "downarrow", latin1_raquo, 1 }, { "downcaret", latin1_Igrave, 1 }, { "downcarettilde", latin1_ocirc, 1 }, { "downshoe", latin1_iquest, 1 }, { "downstile", latin1_thorn, 1 }, { "downtack", latin1_ETH, 1 }, { "downtackjot", latin1_Uacute, 1 }, { "downtackup", latin1_sup1, 1 }, { "downtackuptack", latin1_sup1, 1 }, { "epsilon", latin1_pound, 1 }, { "epsilonunderbar", latin1_Iacute, 1 }, { "equal", latin1_equals, 0 }, { "equalunderbar", latin1_bsol, 1 }, { "euro", latin1_X, 1 }, /* soliton */ { "greater", latin1_gt, 0 }, { "iota", latin1_yen, 1 }, { "iotaunderbar", latin1_Egrave, 1 }, { "jot", latin1_reg, 1 }, { "leftarrow", latin1_curren, 1 }, { "leftbracket", latin1_Yacute, 1 }, { "leftparen", latin1_lpar, 0 }, { "leftshoe", latin1_ordm, 1 }, { "lefttack", latin1_Icirc, 1 }, { "less", latin1_lt, 0 }, { "multiply", latin1_para, 1 }, { "notequal", latin1_acute, 1 }, { "notgreater", latin1_eth, 1 }, { "notless", latin1_THORN, 1 }, { "omega", latin1_copy, 1 }, { "overbar", latin1_micro, 1 }, { "plus", latin1_plus, 0 }, { "plusminus", latin1_AElig, 1 }, { "quad", latin1_deg, 1 }, { "quaddivide", latin1_Oacute, 1 }, { "quadjot", latin1_Euml, 1 }, { "quadquote", latin1_uacute, 1 }, { "quadslope", latin1_oacute, 1 }, { "query", latin1_quest, 0 }, { "quote", latin1_apos, 0 }, { "quotedot", latin1_ucirc, 1 }, { "rho", latin1_middot, 1 }, { "rightarrow", latin1_plusmn, 1 }, { "rightbracket", latin1_uml, 1 }, { "rightparen", latin1_rpar, 0 }, { "rightshoe", latin1_ordf, 1 }, { "righttack", latin1_Iuml, 1 }, { "semicolon", latin1_semi, 0 }, { "slash", latin1_sol, 0 }, { "slashbar", latin1_sup2, 1 }, { "slope", latin1_frac14, 1 }, { "slopebar", latin1_Ocirc, 1 }, { "slopequad", latin1_oacute, 1 }, { "splat", latin1_aelig, 1 }, { "squad", latin1_ouml, 1 }, { "star", latin1_ast, 0 }, { "stile", latin1_times, 1 }, { "tilde", latin1_Oslash, 1 }, { "times", latin1_para, 1 }, { "underbar", latin1_lowbar, 0 }, { "uparrow", latin1_laquo, 1 }, { "upcaret", latin1_Eacute, 1 }, { "upcarettilde", latin1_shy, 1 }, { "upshoe", latin1_iexcl, 1 }, { "upshoejot", latin1_yuml, 1 }, { "upstile", latin1_yacute, 1 }, { "uptack", latin1_macr, 1 }, { "uptackjot", latin1_Otilde, 1 }, { 0, 0 } }; /* * Translation from APL key names to indirect APL keys. */ ks_t apl_string_to_key(const char *s, int *is_gep) { int i; if (strncmp(s, "apl_", 4)) { return KS_NONE; } s += 4; for (i = 0; axl[i].name; i++) if (!strcmp(axl[i].name, s)) { *is_gep = axl[i].is_ge; return axl[i].key; } return KS_NONE; } /* * Translation from latin1 symbol to APL character name. */ const char * key_to_apl_string(ks_t k) { int i; for (i = 0; axl[i].name; i++) { if (axl[i].key == k) { return axl[i].name; } } return NULL; } suite3270-3.6/Common/asprintf.c0000664000076500007650000000576013221577163014426 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * asprintf.c * Implementations of vcsprintf, asprintf and vasprintf for * platforms that are missing them. */ #include "globals.h" #include "asprintf.h" #if !defined(_WIN32) /*[*/ /** * Linux implementation of the Windows vcsprintf() function. * Returns the number of bytes needed to represent a formatted string. * * @param[in] fmt printf format * @param[in] ap arguments * * @return number of bytes needed */ int vscprintf(const char *fmt, va_list ap) { return vsnprintf(NULL, 0, fmt, ap); } #endif /*]*/ #if !defined(HAVE_VASPRINTF) /*[*/ /** * vasprintf: print a string into an automatically malloc'd buffer, varargs * version * * @param[out] bufp returned buffer * @param[in] fmt printf format * @param[in] ap arguments * * @return length, not including NUL */ int my_vasprintf(char **bufp, const char *fmt, va_list ap) { va_list ap_copy; int buflen; char *buf; va_copy(ap_copy, ap); buflen = vscprintf(fmt, ap_copy); va_end(ap_copy); buf = malloc(buflen + 1); vsnprintf(buf, buflen + 1, fmt, ap); *bufp = buf; return buflen; } /** * asprintf: print a string into an automatically malloc'd buffer * * @param[out] bufp returned buffer * @param[in] fmt printf format * * @return length, not including NUL */ int my_asprintf(char **bufp, const char *fmt, ...) { va_list ap; int len; va_start(ap, fmt); len = my_vasprintf(bufp, fmt, ap); va_end(ap); return len; } #endif /*]*/ suite3270-3.6/Common/b8.c0000664000076500007650000000561513221577163013110 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * b8.c * 256-bit bitmap manipulation functions. */ #include "globals.h" #include #include "b8.h" /* Zero a bitmap. */ void b8_zero(b8_t *b) { int i; for (i = 0; i < NU8; i++) { b->u[i] = 0; } } /* 1's complement a bitmap. */ void b8_not(b8_t *b) { int i; for (i = 0; i < NU8; i++) { b->u[i] = ~b->u[i]; } } /* AND two objects. */ void b8_and(b8_t *r, b8_t *a, b8_t *b) { int i; for (i = 0; i < NU8; i++) { r->u[i] = a->u[i] & b->u[i]; } } /* Set a bit in a bitmap. */ void b8_set_bit(b8_t *b, unsigned bit) { if (bit < MX8) { b->u[bit / NB8] |= (uint64_t)1 << (bit % NB8); } } /* Test a bit in a bitmap. */ bool b8_bit_is_set(b8_t *b, unsigned bit) { if (bit < MX8) { return (b->u[bit / NB8] & ((uint64_t)1 << (bit % NB8))) != 0; } else { return false; } } /* Test a bitmap for all zeroes. */ bool b8_is_zero(b8_t *b) { int i; for (i = 0; i < NU8; i++) { if (b->u[i]) { return false; } } return true; } /* Copy one bitmap to another. */ void b8_copy(b8_t *to, b8_t *from) { *to = *from; /* struct copy */ } /* Check for bits added to a bitmap. */ bool b8_none_added(b8_t *want, b8_t *got) { b8_t t; /* * The basic arithmetic is: * !(got & ~want) */ b8_copy(&t, want); b8_not(&t); b8_and(&t, got, &t); return b8_is_zero(&t); } suite3270-3.6/Common/bind-opt.c0000664000076500007650000001105713221577163014310 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * bind-opt.c * Option parsing for -scriptport and -httpd. */ #include "globals.h" #include #include #if !defined(_WIN32) /*[*/ # include #endif /*]*/ #include "resolver.h" #include "bind-opt.h" typedef union { struct sockaddr_in v4; #if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 v6; #endif /*]*/ } sau_t; /** * Parse a bind option for -httpd or -scriptport. * * Syntax: * or : * implies 127.0.0.1 * : * *: * implies 0.0.0.0 * []: * * So, to bind to INADDR_ANY, port 4080, specify: * *:4080 * or * 0.0.0.0:4080 * To bind to the same thing in IPv6, specify: * [::]:4080 * To bind to the IPv6 loopback address, specify: * [::1]:4080 * * It does not understand symbolic port names like 'telnet', and it does not * understand symbolic host names. * * @param[in] spec string to parse * @param[out] addr returned address * @param[out] addrlen returned length of address * * @return true if address parsed successfully, false otherwise */ bool parse_bind_opt(const char *spec, struct sockaddr **addr, socklen_t *addrlen) { size_t hlen; char *host_str; char *port_str; unsigned short port; rhp_t rv; /* Start with nothing. */ *addr = NULL; *addrlen = 0; if (spec == NULL || *spec == '\0') { return false; } /* Tease apart the syntax. */ if (spec[0] == '[') { char *rbrack = strchr(spec, ']'); /* We appear to have a hostname in square brackets. */ if (rbrack == NULL || rbrack == spec + 1 || *(rbrack + 1) != ':' || !*(rbrack + 2)) { return false; } hlen = rbrack - spec - 1; host_str = Malloc(hlen + 1); strncpy(host_str, spec + 1, hlen); host_str[hlen] = '\0'; port_str = Malloc(strlen(rbrack + 2) + 1); strcpy(port_str, rbrack + 2); } else { char *colon; /* No square brackets. Use the colon to split the address and port. */ colon = strchr(spec, ':'); if (colon == NULL) { /* Just a port. */ host_str = NewString("127.0.0.1"); port_str = NewString(spec); } else if (colon == spec) { /* Just a colon and a port. */ if (!*(colon + 1)) { return false; } host_str = NewString("127.0.0.1"); port_str = NewString(spec + 1); } else { /*

    :. */ if (colon == NULL || colon == spec || !*(colon + 1)) { return false; } hlen = colon - spec; host_str = Malloc(hlen + 1); strncpy(host_str, spec, hlen); host_str[hlen] = '\0'; port_str = Malloc(strlen(colon + 1) + 1); strcpy(port_str, colon + 1); } } /* Translate '*'. */ if (!strcmp(host_str, "*")) { Free(host_str); host_str = NewString("0.0.0.0"); } /* Use the resolver to resolve the components we've split apart. */ *addr = Malloc(sizeof(sau_t)); rv = resolve_host_and_port(host_str, port_str, 0, &port, *addr, addrlen, NULL, NULL); Free(host_str); Free(port_str); if (RHP_IS_ERROR(rv)) { Free(*addr); *addr = NULL; return false; } return true; } suite3270-3.6/Common/c3270/c3270.c0000664000076500007650000013777013221577163014103 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * c3270.c * A curses-based 3270 Terminal Emulator * A Windows console 3270 Terminal Emulator * Main proceudre. */ #include "globals.h" #if !defined(_WIN32) /*[*/ #include #endif /*]*/ #include #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "actions.h" #include "bind-opt.h" #include "charset.h" #include "ckeypad.h" #include "cscreen.h" #include "cstatus.h" #include "ctlrc.h" #include "cmenubar.h" #include "unicodec.h" #include "ft.h" #include "glue.h" #include "glue_gui.h" #include "help.h" #include "host.h" #include "httpd-core.h" #include "httpd-nodes.h" #include "httpd-io.h" #include "icmdc.h" #include "idle.h" #include "keymap.h" #include "kybd.h" #include "lazya.h" #include "linemode.h" #include "macros.h" #include "nvt.h" #include "opts.h" #include "popups.h" #include "pr3287_session.h" #include "print_screen.h" #include "product.h" #include "screen.h" #include "selectc.h" #include "sio.h" #include "split_host.h" #include "status.h" #include "telnet.h" #include "telnet_gui.h" #include "toggles.h" #include "trace.h" #include "utf8.h" #include "utils.h" #include "xio.h" #include "xscroll.h" #if defined(HAVE_LIBREADLINE) /*[*/ #include #if defined(HAVE_READLINE_HISTORY_H) /*[*/ #include #endif /*]*/ #endif /*]*/ #if defined(_WIN32) /*[*/ #include "relinkc.h" #include "w3misc.h" #include "wc3270.h" #include "windirs.h" #include "winvers.h" #endif /*]*/ #if defined(_WIN32) /*[*/ # define DELENV "WC3DEL" #endif /*]*/ #if defined(_WIN32) /*[*/ # define PR3287_NAME "wpr3287" #else /*][*/ # define PR3287_NAME "pr3287" #endif /*]*/ static void interact(void); static void stop_pager(void); #if !defined(_WIN32) /*[*/ static bool merge_profile(void); #endif /*]*/ #if defined(HAVE_LIBREADLINE) /*[*/ static char **attempted_completion(); static char *completion_entry(const char *, int); #endif /*]*/ /* Pager state. */ #if !defined(_WIN32) /*[*/ static FILE *pager = NULL; #else /*][*/ static int pager_rowcnt = 0; static bool pager_q = false; static int pager_rows = 25; static int pager_cols = 80; #endif /*]*/ bool escape_pending = false; bool stop_pending = false; bool dont_return = false; #if defined(_WIN32) /*[*/ char *instdir = NULL; char *mydesktop = NULL; char *mydocs3270 = NULL; char *commondocs3270 = NULL; unsigned windirs_flags; static void start_auto_shortcut(void); #endif /*]*/ static void c3270_register(void); void usage(const char *msg) { if (msg != NULL) { fprintf(stderr, "%s\n", msg); } fprintf(stderr, "Usage: %s [options] [ps:][LUname@]hostname[:port]\n", programname); fprintf(stderr, "Options:\n"); cmdline_help(false); exit(1); } /* Callback for connection state changes. */ static void c3270_connect(bool ignored) { if (CONNECTED || appres.disconnect_clear) { #if defined(C3270_80_132) /*[*/ if (appres.c3270.altscreen != NULL) { ctlr_erase(false); } else #endif /*]*/ { ctlr_erase(true); } } } /* Callback for application exit. */ static void main_exiting(bool ignored) { if (escaped) { stop_pager(); } else { if (screen_suspend()) { screen_final(); } } } /* Make sure error messages are seen. */ static void pause_for_errors(void) { char s[10]; if (any_error_output) { screen_suspend(); printf("[Press ] "); fflush(stdout); if (fgets(s, sizeof(s), stdin) == NULL) { x3270_exit(1); } any_error_output = false; } } #if !defined(_WIN32) /*[*/ /* Empty SIGCHLD handler, ensuring that we can collect child exit status. */ static void sigchld_handler(int ignored) { #if !defined(_AIX) /*[*/ (void) signal(SIGCHLD, sigchld_handler); #endif /*]*/ } #endif /*]*/ #if defined(_WIN32) /*[*/ /* * wc3270 version of Error, that makes sure the user has a chance to see the * error message before we close the window. */ static void c3270_Error(const char *s) { /* Dump the error on the console. */ fprintf(stderr, "Error: %s\n", s); fflush(stderr); /* Wait for the key, and then exit. */ x3270_exit(1); } /* Pause before exiting. */ static void exit_pause(bool mode _is_unused) { if (x3270_exit_code) { char buf[2]; printf("\n[Press ] "); fflush(stdout); (void) fgets(buf, sizeof(buf), stdin); } } #endif /*]*/ int main(int argc, char *argv[]) { const char *cl_hostname = NULL; #if !defined(_WIN32) /*[*/ pid_t pid; int status; #else /*][*/ char *delenv; #endif /*]*/ bool once = false; #if defined(_WIN32) /*[*/ /* Redirect Error() so we pause. */ Error_redirect = c3270_Error; /* Register a final exit function, so we pause. */ register_schange_ordered(ST_EXITING, exit_pause, ORDER_LAST); /* Get Windows version and directories. */ (void) get_version_info(); if (!get_dirs("wc3270", &instdir, &mydesktop, NULL, NULL, NULL, NULL, NULL, &mydocs3270, &commondocs3270, &windirs_flags)) { x3270_exit(1); } /* Start Winsock. */ if (sockstart()) { x3270_exit(1); } #endif /*]*/ #if !defined(_WIN32) && !defined(CURSES_WIDE) /*[*/ /* Explicitly turn off DBCS if wide curses is not supported. */ dbcs_allowed = false; #endif /*]*/ /* * Call the module registration functions, to build up the tables of * actions, options and callbacks. */ c3270_register(); ctlr_register(); ft_register(); help_register(); host_register(); icmd_register(); idle_register(); keymap_register(); keypad_register(); kybd_register(); macros_register(); menubar_register(); nvt_register(); pr3287_session_register(); print_screen_register(); #if defined(_WIN32) /*[*/ select_register(); #endif /*]*/ screen_register(); scroll_register(); toggles_register(); trace_register(); xio_register(); sio_register(); #if !defined(_WIN32) /*[*/ register_merge_profile(merge_profile); #endif /*]*/ argc = parse_command_line(argc, (const char **)argv, &cl_hostname); printf("%s\n\n" "Copyright 1989-%s by Paul Mattes, GTRC and others.\n" "Type 'show copyright' for full copyright information.\n" "Type 'help' for help information.\n\n", build, cyear); #if defined(_WIN32) /*[*/ /* Delete the link file, if we've been told do. */ delenv = getenv(DELENV); if (delenv != NULL) { unlink(delenv); putenv(DELENV "="); } /* Check for auto-shortcut mode. */ if (appres.c3270.auto_shortcut) { start_auto_shortcut(); exit(0); } #endif /*]*/ if (charset_init(appres.charset) != CS_OKAY) { xs_warning("Cannot find charset \"%s\"", appres.charset); (void) charset_init(NULL); } model_init(); #if defined(HAVE_LIBREADLINE) /*[*/ /* Set up readline. */ rl_readline_name = "c3270"; rl_initialize(); rl_attempted_completion_function = attempted_completion; #if defined(RL_READLINE_VERSION) && (RL_READLINE_VERSION > 0x0402) /*[*/ rl_completion_entry_function = completion_entry; #else /*][*/ rl_completion_entry_function = (Function *)completion_entry; #endif /*]*/ #endif /*]*/ /* Get the screen set up as early as possible. */ screen_init(); idle_init(); keymap_init(); hostfile_init(); if (appres.httpd_port) { struct sockaddr *sa; socklen_t sa_len; if (!parse_bind_opt(appres.httpd_port, &sa, &sa_len)) { xs_warning("Invalid -httpd port \"%s\"", appres.httpd_port); } else { httpd_objects_init(); hio_init(sa, sa_len); } } ft_init(); #if !defined(_WIN32) /*[*/ /* Make sure we don't fall over any SIGPIPEs. */ (void) signal(SIGPIPE, SIG_IGN); /* Make sure we can collect child exit status. */ (void) signal(SIGCHLD, sigchld_handler); #endif /*]*/ /* Handle initial toggle settings. */ initialize_toggles(); if (cl_hostname != NULL) { pause_for_errors(); /* Connect to the host. */ once = true; if (!host_connect(cl_hostname)) { x3270_exit(1); } /* Wait for negotiations to complete or fail. */ while (!IN_NVT && !IN_3270) { (void) process_events(true); if (!PCONNECTED) { x3270_exit(1); } } pause_for_errors(); screen_disp(false); } else { /* Drop to the prompt. */ if (!appres.secure) { interact(); screen_disp(false); } else { pause_for_errors(); screen_resume(); } } peer_script_init(); /* Process events forever. */ while (1) { if (!escaped || ft_state != FT_NONE) { (void) process_events(true); } if ( #if !defined(_WIN32) /*[*/ appres.c3270.cbreak_mode && #endif /*]*/ escape_pending) { escape_pending = false; screen_suspend(); } if (!appres.secure && !CONNECTED && !appres.interactive.reconnect) { screen_suspend(); (void) printf("Disconnected.\n"); if (once) { x3270_exit(0); } interact(); screen_resume(); } else if (escaped && ft_state == FT_NONE) { interact(); vtrace("Done interacting.\n"); screen_resume(); } else if (!CONNECTED && !appres.interactive.reconnect && cl_hostname != NULL) { screen_suspend(); x3270_exit(0); } #if !defined(_WIN32) /*[*/ if (children && (pid = waitpid(-1, &status, WNOHANG)) > 0) { pr3287_session_check(pid, status); --children; } #else /*][*/ pr3287_session_check(); #endif /*]*/ screen_disp(false); } } #if !defined(_WIN32) /*[*/ /* * SIGTSTP handler for use while a command is running. Sets a flag so that * c3270 will stop before the next prompt is printed. */ static void running_sigtstp_handler(int ignored _is_unused) { signal(SIGTSTP, SIG_IGN); stop_pending = true; } /* * SIGTSTP haandler for use while the prompt is being displayed. * Acts immediately by setting SIGTSTP to the default and sending it to * ourselves, but also sets a flag so that the user gets one free empty line * of input before resuming the connection. */ static void prompt_sigtstp_handler(int ignored _is_unused) { if (CONNECTED) { dont_return = true; } signal(SIGTSTP, SIG_DFL); kill(getpid(), SIGTSTP); } #endif /*]*/ /*static*/ void interact(void) { #if defined(HAVE_LIBREADLINE) /*[*/ static char *prompt_string = NULL; #endif /*]*/ /* In case we got here because a command output, stop the pager. */ stop_pager(); /* Stop any pending scripts. */ abort_script(); vtrace("Interacting.\n"); if (appres.secure) { char s[10]; printf("[Press ] "); fflush(stdout); if (fgets(s, sizeof(s), stdin) == NULL) { x3270_exit(1); } return; } #if !defined(_WIN32) /*[*/ /* Handle SIGTSTP differently at the prompt. */ signal(SIGTSTP, SIG_DFL); #endif /*]*/ /* * Ignore SIGINT at the prompt. * I'm sure there's more we could do. */ signal(SIGINT, SIG_IGN); for (;;) { size_t sl; char *s; #if defined(HAVE_LIBREADLINE) /*[*/ char *rl_s; #else /*][*/ char buf[1024]; #endif /*]*/ dont_return = false; /* Process a pending stop now. */ if (stop_pending) { stop_pending = false; #if !defined(_WIN32) /*[*/ signal(SIGTSTP, SIG_DFL); kill(getpid(), SIGTSTP); #endif /*]*/ continue; } #if !defined(_WIN32) /*[*/ /* Process SIGTSTPs immediately. */ signal(SIGTSTP, prompt_sigtstp_handler); #endif /*]*/ /* Display the prompt. */ if (CONNECTED) { (void) printf("Press to resume session.\n"); } #if defined(HAVE_LIBREADLINE) /*[*/ if (prompt_string == NULL) { prompt_string = xs_buffer("%s> ", app); } s = rl_s = readline(prompt_string); if (s == NULL) { printf("\n"); exit(0); } #else /*][*/ (void) printf("%s>", app); (void) fflush(stdout); /* Get the command, and trim white space. */ if (fgets(buf, sizeof(buf), stdin) == NULL) { printf("\n"); # if defined(_WIN32) /*[*/ continue; # else /*][*/ x3270_exit(0); # endif /*]*/ } s = buf; #endif /*]*/ #if !defined(_WIN32) /*[*/ /* Defer SIGTSTP until the next prompt display. */ signal(SIGTSTP, running_sigtstp_handler); #endif /*]*/ #if defined(_WIN32) /*[*/ /* Get the current console size. */ get_console_size(&pager_rows, &pager_cols); #endif /*]*/ while (isspace((unsigned char)*s)) { s++; } sl = strlen(s); while (sl && isspace((unsigned char)s[sl-1])) { s[--sl] = '\0'; } /* A null command means go back. */ if (!sl) { if (CONNECTED && !dont_return) { break; } else { continue; } } #if defined(HAVE_LIBREADLINE) /*[*/ /* Save this command in the history buffer. */ add_history(s); #endif /*]*/ /* "?" is an alias for "Help". */ if (!strcmp(s, "?")) { s = "Help"; } /* * Process the command like a macro, and spin until it * completes. */ push_command(s); while (sms_active()) { (void) process_events(true); } /* Close the pager. */ stop_pager(); #if defined(HAVE_LIBREADLINE) /*[*/ /* Give back readline's buffer. */ free(rl_s); #endif /*]*/ /* If it succeeded, return to the session. */ if (!macro_output && CONNECTED) { break; } } /* Ignore SIGTSTP again. */ stop_pending = false; #if !defined(_WIN32) /*[*/ signal(SIGTSTP, SIG_IGN); #endif /*]*/ #if defined(_WIN32) /*[*/ signal(SIGINT, SIG_DFL); #endif /*]*/ } /* A command is about to produce output. Start the pager. */ FILE * start_pager(void) { #if !defined(_WIN32) /*[*/ static char *lesspath = LESSPATH; static char *lesscmd = LESSPATH " -EX"; static char *morepath = MOREPATH; static char *or_cat = " || cat"; char *pager_env; char *pager_cmd = NULL; if (pager != NULL) { return pager; } if ((pager_env = getenv("PAGER")) != NULL) { pager_cmd = pager_env; } else if (strlen(lesspath)) { pager_cmd = lesscmd; } else if (strlen(morepath)) { pager_cmd = morepath; } if (pager_cmd != NULL) { char *s; s = Malloc(strlen(pager_cmd) + strlen(or_cat) + 1); (void) sprintf(s, "%s%s", pager_cmd, or_cat); pager = popen(s, "w"); Free(s); if (pager == NULL) { (void) perror(pager_cmd); } } if (pager == NULL) { pager = stdout; } return pager; #else /*][*/ return stdout; #endif /*]*/ } /* Stop the pager. */ static void stop_pager(void) { #if !defined(_WIN32) /*[*/ if (pager != NULL) { if (pager != stdout) { pclose(pager); } pager = NULL; } #else /*][*/ pager_rowcnt = 0; pager_q = false; #endif /*]*/ } #if defined(_WIN32) /*[*/ void pager_output(const char *s) { if (pager_q) { return; } do { char *nl; size_t sl; int nw; /* Pause for a screenful. */ if (pager_rowcnt >= (pager_rows - 1)) { nw = printf("Press any key to continue . . . "); fflush(stdout); pager_q = screen_wait_for_key(NULL); printf("\r%*s\r", (nw > 0)? nw: 79, ""); pager_rowcnt = 0; get_console_size(&pager_rows, &pager_cols); if (pager_q) { return; } } /* * Look for an embedded newline. If one is found, just print * up to it, so we can count the newline and possibly pause * partway through the string. */ nl = strchr(s, '\n'); if (nl != NULL) { sl = nl - s; printf("%.*s\n", (int)sl, s); s = nl + 1; } else { printf("%s\n", s); sl = strlen(s); s = NULL; } /* Account for the newline. */ pager_rowcnt++; /* Account (conservatively) for any line wrap. */ pager_rowcnt += (int)(sl / pager_cols); } while (s != NULL); } #endif /*]*/ #if defined(HAVE_LIBREADLINE) /*[*/ static char **matches = NULL; static char **next_match; /* Generate a match list. */ static char ** attempted_completion(const char *text, int start, int end) { char *s; unsigned i, j; int match_count; action_elt_t *e; /* If this is not the first word, fail. */ s = rl_line_buffer; while (*s && isspace(*s)) { s++; } if (s - rl_line_buffer < start) { char *t = s; struct host *h; /* * If the first word is 'Connect' or 'Open', and the * completion is on the second word, expand from the * hostname list. */ /* See if we're in the second word. */ while (*t && !isspace(*t)) { t++; } while (*t && isspace(*t)) { t++; } if (t - rl_line_buffer < start) { return NULL; } /* * See if the first word is 'Open' or 'Connect'. In future, * we might do other expansions, and this code would need to * be generalized. */ if (!((!strncasecmp(s, "Open", 4) && isspace(*(s + 4))) || (!strncasecmp(s, "Connect", 7) && isspace(*(s + 7))))) { return NULL; } /* Look for any matches. Note that these are case-sensitive. */ for (h = hosts, match_count = 0; h; h = h->next) { if (!strncmp(h->name, t, strlen(t))) { match_count++; } } if (!match_count) { return NULL; } /* Allocate the return array. */ next_match = matches = Malloc((match_count + 1) * sizeof(char **)); /* Scan again for matches to fill in the array. */ for (h = hosts, j = 0; h; h = h->next) { int skip = 0; if (strncmp(h->name, t, strlen(t))) { continue; } /* * Skip hostsfile entries that are duplicates of * RECENT entries we've already recorded. */ if (h->entry_type != RECENT) { for (i = 0; i < j; i++) { if (!strcmp(matches[i], h->name)) { skip = 1; break; } } } if (skip) { continue; } /* * If the string contains spaces, put it in double * quotes. Otherwise, just copy it. (Yes, this code * is fairly stupid, and can be fooled by other * whitespace and embedded double quotes.) */ if (strchr(h->name, ' ') != NULL) { matches[j] = Malloc(strlen(h->name) + 3); (void) sprintf(matches[j], "\"%s\"", h->name); j++; } else { matches[j++] = NewString(h->name); } } matches[j] = NULL; return NULL; } /* Search for matches. */ match_count = 0; FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strncasecmp(e->t.name, s, strlen(s))) { match_count++; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (!match_count) { return NULL; } /* Return what we got. */ next_match = matches = Malloc((match_count + 1) * sizeof(char **)); j = 0; FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strncasecmp(e->t.name, s, strlen(s))) { matches[j++] = NewString(e->t.name); } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); matches[j] = NULL; return NULL; } /* Return the match list. */ static char * completion_entry(const char *text, int state) { char *r; if (next_match == NULL) { return NULL; } if ((r = *next_match++) == NULL) { Free(matches); next_match = matches = NULL; return NULL; } else { return r; } } #endif /*]*/ /* c3270-specific actions. */ /* Return a time difference in English */ static char * hms(time_t ts) { time_t t, td; long hr, mn, sc; (void) time(&t); td = t - ts; hr = (long)(td / 3600); mn = (td % 3600) / 60; sc = td % 60; if (hr > 0) { return lazyaf("%ld %s %ld %s %ld %s", hr, (hr == 1) ? get_message("hour") : get_message("hours"), mn, (mn == 1) ? get_message("minute") : get_message("minutes"), sc, (sc == 1) ? get_message("second") : get_message("seconds")); } else if (mn > 0) { return lazyaf("%ld %s %ld %s", mn, (mn == 1) ? get_message("minute") : get_message("minutes"), sc, (sc == 1) ? get_message("second") : get_message("seconds")); } else { return lazyaf("%ld %s", sc, (sc == 1) ? get_message("second") : get_message("seconds")); } } static void indent_dump(const char *s) { const char *newline; while ((newline = strchr(s, '\n')) != NULL) { action_output(" %.*s", (int)(newline - s), s); s = newline + 1; } action_output(" %s", s); } static void status_dump(void) { const char *emode, *ftype, *ts; const char *clu; const char *eopts; const char *bplu; const char *ptype; action_output("%s", build); action_output("%s %s: %d %s x %d %s, %s, %s", get_message("model"), model_name, maxCOLS, get_message("columns"), maxROWS, get_message("rows"), appres.m3279? get_message("fullColor"): get_message("mono"), (appres.extended && !HOST_FLAG(STD_DS_HOST))? get_message("extendedDs"): get_message("standardDs")); action_output("%s %s", get_message("terminalName"), termtype); clu = net_query_lu_name(); if (clu != NULL && clu[0]) { action_output("%s %s", get_message("luName"), clu); } bplu = net_query_bind_plu_name(); if (bplu != NULL && bplu[0]) { action_output("%s %s", get_message("bindPluName"), bplu); } action_output("%s %s (%s)", get_message("characterSet"), get_charset_name(), dbcs? "DBCS": "SBCS"); action_output("%s %s", get_message("hostCodePage"), get_host_codepage()); action_output("%s GCSGID %u, CPGID %u", get_message("sbcsCgcsgid"), (unsigned short)((cgcsgid >> 16) & 0xffff), (unsigned short)(cgcsgid & 0xffff)); if (dbcs) { action_output("%s GCSGID %u, CPGID %u", get_message("dbcsCgcsgid"), (unsigned short)((cgcsgid_dbcs >> 16) & 0xffff), (unsigned short)(cgcsgid_dbcs & 0xffff)); } #if !defined(_WIN32) /*[*/ action_output("%s %s", get_message("localeCodeset"), locale_codeset); action_output("%s DBCS %s, wide curses %s", get_message("buildOpts"), # if defined(X3270_DBCS) /*[*/ get_message("buildEnabled"), # else /*][*/ get_message("buildDisabled"), # endif /*]*/ # if defined(CURSES_WIDE) /*[*/ get_message("buildEnabled") # else /*][*/ get_message("buildDisabled") # endif /*]*/ ); #else /*][*/ action_output("%s OEM %d ANSI %d", get_message("windowsCodePage"), windows_cp, GetACP()); #endif /*]*/ if (appres.interactive.key_map) { action_output("%s %s", get_message("keyboardMap"), appres.interactive.key_map); } if (CONNECTED) { action_output("%s %s", get_message("connectedTo"), #if defined(LOCAL_PROCESS) /*[*/ (local_process && !strlen(current_host))? "(shell)": #endif /*]*/ current_host); #if defined(LOCAL_PROCESS) /*[*/ if (!local_process) #endif /*]*/ { action_output(" %s %d", get_message("port"), current_port); } if (net_secure_connection()) { const char *session, *cert; action_output(" %s%s%s", get_message("secure"), net_secure_unverified()? ", ": "", net_secure_unverified()? get_message("unverified"): ""); action_output(" %s %s", get_message("provider"), net_sio_provider()); if ((session = net_session_info()) != NULL) { action_output(" %s", get_message("sessionInfo")); indent_dump(session); } if ((cert = net_server_cert_info()) != NULL) { action_output(" %s", get_message("serverCert")); indent_dump(cert); } } ptype = net_proxy_type(); if (ptype) { action_output(" %s %s %s %s %s %s", get_message("proxyType"), ptype, get_message("server"), net_proxy_host(), get_message("port"), net_proxy_port()); } ts = hms(ns_time); if (IN_E) { emode = "TN3270E "; } else { emode = ""; } if (IN_NVT) { if (linemode) { ftype = get_message("lineMode"); } else { ftype = get_message("charMode"); } action_output(" %s%s, %s", emode, ftype, ts); } else if (IN_SSCP) { action_output(" %s%s, %s", emode, get_message("sscpMode"), ts); } else if (IN_3270) { action_output(" %s%s, %s", emode, get_message("dsMode"), ts); } else if (cstate == CONNECTED_UNBOUND) { action_output(" %s%s, %s", emode, get_message("unboundMode"), ts); } else { action_output(" %s, %s", get_message("unnegotiated"), ts); } eopts = tn3270e_current_opts(); if (eopts != NULL) { action_output(" %s %s", get_message("tn3270eOpts"), eopts); } else if (IN_E) { action_output(" %s", get_message("tn3270eNoOpts")); } if (IN_3270) { action_output("%s %d %s, %d %s\n%s %d %s, %d %s", get_message("sent"), ns_bsent, (ns_bsent == 1)? get_message("byte") : get_message("bytes"), ns_rsent, (ns_rsent == 1)? get_message("record") : get_message("records"), get_message("Received"), ns_brcvd, (ns_brcvd == 1)? get_message("byte"): get_message("bytes"), ns_rrcvd, (ns_rrcvd == 1)? get_message("record"): get_message("records")); } else { action_output("%s %d %s, %s %d %s", get_message("sent"), ns_bsent, (ns_bsent == 1)? get_message("byte"): get_message("bytes"), get_message("received"), ns_brcvd, (ns_brcvd == 1)? get_message("byte"): get_message("bytes")); } if (IN_NVT) { struct ctl_char *c = linemode_chars(); int i; char buf[128]; char *s = buf; action_output("%s", get_message("specialCharacters")); for (i = 0; c[i].name; i++) { if (i && !(i % 4)) { *s = '\0'; action_output("%s", buf); s = buf; } s += sprintf(s, " %s %s", c[i].name, c[i].value); } if (s != buf) { *s = '\0'; action_output("%s", buf); } } } else if (HALF_CONNECTED) { action_output("%s %s", get_message("connectionPending"), current_host); } else { action_output("%s", get_message("notConnected")); } } static void copyright_dump(void) { action_output(" "); action_output("%s", build); action_output(" "); action_output("Copyright (c) 1993-%s, Paul Mattes.", cyear); action_output("Copyright (c) 1990, Jeff Sparkes."); action_output("Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA"); action_output(" 30332."); action_output("All rights reserved."); action_output(" "); action_output("Redistribution and use in source and binary forms, with or without"); action_output("modification, are permitted provided that the following conditions are met:"); action_output(" * Redistributions of source code must retain the above copyright"); action_output(" notice, this list of conditions and the following disclaimer."); action_output(" * Redistributions in binary form must reproduce the above copyright"); action_output(" notice, this list of conditions and the following disclaimer in the"); action_output(" documentation and/or other materials provided with the distribution."); action_output(" * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of"); action_output(" their contributors may be used to endorse or promote products derived"); action_output(" from this software without specific prior written permission."); action_output(" "); action_output("THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC \"AS IS\" AND"); action_output("ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"); action_output("IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"); action_output("ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE"); action_output("LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR"); action_output("CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF"); action_output("SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"); action_output("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN"); action_output("CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"); action_output("ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE"); action_output("POSSIBILITY OF SUCH DAMAGE."); action_output(" "); } static bool Show_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Show", ia, argc, argv); if (check_argc("Show", argc, 0, 1) < 0) { return false; } if (argc == 0) { action_output(" Show copyright copyright information"); action_output(" Show stats connection statistics"); action_output(" Show status same as 'Show stats'"); action_output(" Show keymap current keymap"); return true; } if (!strncasecmp(argv[0], "stats", strlen(argv[0])) || !strncasecmp(argv[0], "status", strlen(argv[0]))) { status_dump(); } else if (!strncasecmp(argv[0], "keymap", strlen(argv[0]))) { keymap_dump(); } else if (!strncasecmp(argv[0], "copyright", strlen(argv[0]))) { copyright_dump(); } else { popup_an_error("Unknown 'Show' keyword"); return false; } return true; } /* Trace([data|keyboard][on [filename]|off]) */ static bool Trace_action(ia_t ia, unsigned argc, const char **argv) { bool on = false; unsigned arg0 = 0; action_debug("Trace", ia, argc, argv); if (argc == 0) { if (toggled(TRACING) && tracefile_name != NULL) { action_output("Trace file is %s.", tracefile_name); } else { action_output("Tracing is %sabled.", toggled(TRACING)? "en": "dis"); } return true; } if (!strcasecmp(argv[0], "Data") || !strcasecmp(argv[0], "Keyboard")) { /* Skip. */ arg0++; } if (!strcasecmp(argv[arg0], "Off")) { on = false; arg0++; if (argc > arg0) { popup_an_error("Trace: Too many arguments for 'Off'"); return false; } if (!toggled(TRACING)) { return true; } } else if (!strcasecmp(argv[arg0], "On")) { on = true; arg0++; if (argc == arg0) { /* Nothing else to do. */ } else if (argc == arg0 + 1) { if (toggled(TRACING)) { popup_an_error("Trace: filename argument ignored."); } else { trace_set_trace_file(argv[arg0]); } } else { popup_an_error("Trace: Too many arguments for 'On'"); return false; } } else { popup_an_error("Trace: Parameter must be On or Off"); return false; } if ((on && !toggled(TRACING)) || (!on && toggled(TRACING))) { do_toggle(TRACING); if (!on) { action_output("Tracing stopped."); } } if (tracefile_name != NULL) { if (ia_cause == IA_COMMAND) { action_output("Trace file is %s.", tracefile_name); } else { popup_an_info("Trace file is %s.", tracefile_name); } } return true; } /* * ScreenTrace(On) * ScreenTrace(On,filename) backwards-compatible * ScreenTrace(On,File,filename) preferred * ScreenTrace(On,Printer) * ScreenTrace(On,Printer,"print command") Unix * ScreenTrace(On,Printer[,Gdi|WordPad],printername) Windows * ScreenTrace(Off) */ static bool ScreenTrace_action(ia_t ia, unsigned argc, const char **argv) { bool on = false; #if defined(_WIN32) /*[*/ bool is_file = false; #endif /*]*/ tss_t how = TSS_FILE; ptype_t ptype = P_TEXT; const char *name = NULL; unsigned px; action_debug("ScreenTrace", ia, argc, argv); if (argc == 0) { how = trace_get_screentrace_how(); if (toggled(SCREEN_TRACE)) { action_output("Screen tracing is enabled, %s \"%s\".", (how == TSS_FILE)? "file": #if !defined(_WIN32) /*[*/ "with print command", #else /*]*/ "to printer", #endif /*]*/ trace_get_screentrace_name()); } else { action_output("Screen tracing is disabled."); } return true; } if (!strcasecmp(argv[0], "Off")) { if (!toggled(SCREEN_TRACE)) { popup_an_error("Screen tracing is already disabled."); return false; } on = false; if (argc > 1) { popup_an_error("ScreenTrace(): Too many arguments for 'Off'"); return false; } goto toggle_it; } if (strcasecmp(argv[0], "On")) { popup_an_error("ScreenTrace(): Must be 'On' or 'Off'"); return false; } /* Process 'On'. */ if (toggled(SCREEN_TRACE)) { popup_an_error("Screen tracing is already enabled."); return true; } on = true; px = 1; if (px >= argc) { /* * No more parameters. Trace to a file, and generate the name. */ goto toggle_it; } if (!strcasecmp(argv[px], "File")) { px++; #if defined(_WIN32) /*[*/ is_file = true; #endif /*]*/ } else if (!strcasecmp(argv[px], "Printer")) { px++; how = TSS_PRINTER; #if defined(WIN32) /*[*/ ptype = P_GDI; #endif /*]*/ } #if defined(_WIN32) /*[*/ if (px < argc && !strcasecmp(argv[px], "Gdi")) { if (is_file) { popup_an_error("ScreenTrace(): Cannot specify 'File' and 'Gdi'."); return false; } px++; how = TSS_PRINTER; ptype = P_GDI; } else if (px < argc && !strcasecmp(argv[px], "WordPad")) { if (is_file) { popup_an_error("ScreenTrace(): Cannot specify 'File' and " "'WordPad'."); return false; } px++; how = TSS_PRINTER; ptype = P_RTF; } #endif /*]*/ if (px < argc) { name = argv[px]; px++; } if (px < argc) { popup_an_error("ScreenTrace(): Too many arguments."); return false; } if (how == TSS_PRINTER && name == NULL) { #if !defined(_WIN32) /*[*/ name = get_resource(ResPrintTextCommand); #else /*][*/ name = get_resource(ResPrinterName); #endif /*]*/ } toggle_it: if ((on && !toggled(SCREEN_TRACE)) || (!on && toggled(SCREEN_TRACE))) { if (on) { trace_set_screentrace_file(how, ptype, name); } do_toggle(SCREEN_TRACE); } if (on && !toggled(SCREEN_TRACE)) { return true; } name = trace_get_screentrace_name(); if (name != NULL) { if (on) { if (how == TSS_FILE) { if (ia_cause == IA_COMMAND) { action_output("Trace file is %s.", name); } else { popup_an_info("Trace file is %s.", name); } } else { if (ia_cause == IA_COMMAND) { action_output("Tracing to printer."); } else { popup_an_info("Tracing to printer."); } } } else { if (trace_get_screentrace_last_how() == TSS_FILE) { if (ia_cause == IA_COMMAND) { action_output("Tracing complete. Trace file is %s.", name); } else { popup_an_info("Tracing complete. Trace file is %s.", name); } } else { if (ia_cause == IA_COMMAND) { action_output("Tracing to printer complete."); } else { popup_an_info("Tracing to printer complete."); } } } } return true; } /* Break to the command prompt. */ static bool Escape_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Escape", ia, argc, argv); if (check_argc("Escape", argc, 0, 0) < 0) { return false; } if (!appres.secure) { host_cancel_reconnect(); screen_suspend(); #if 0 /* this fix is in there for something, but I don't know what */ abort_script(); #endif } return true; } /* Popup an informational message. */ void popup_an_info(const char *fmt, ...) { va_list args; static char vmsgbuf[4096]; size_t sl; /* Expand it. */ va_start(args, fmt); (void) vsprintf(vmsgbuf, fmt, args); va_end(args); /* Remove trailing newlines. */ sl = strlen(vmsgbuf); while (sl && vmsgbuf[sl - 1] == '\n') { vmsgbuf[--sl] = '\0'; } /* Push it out. */ if (sl) { if (escaped) { printf("%s\n", vmsgbuf); fflush(stdout); } else { char *s; while ((s = strchr(vmsgbuf, '\n')) != NULL) { *s = ' '; } status_push(vmsgbuf); } } } static bool Info_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Info", ia, argc, argv); if (!argc) { return true; } popup_an_info("%s", argv[0]); return true; } static bool ignore_action(ia_t ia, unsigned argc, const char **argv) { action_debug("ignore", ia, argc, argv); return true; } #if !defined(_WIN32) /*[*/ /* Support for c3270 profiles. */ #define PROFILE_ENV "C3270PRO" #define NO_PROFILE_ENV "NOC3270PRO" #define DEFAULT_PROFILE "~/.c3270pro" /* Read in the .c3270pro file. */ static bool merge_profile(void) { const char *fname; char *profile_name; bool did_read = false; /* Check for the no-profile environment variable. */ if (getenv(NO_PROFILE_ENV) != NULL) { return did_read; } /* Read the file. */ fname = getenv(PROFILE_ENV); if (fname == NULL || *fname == '\0') { fname = DEFAULT_PROFILE; } profile_name = do_subst(fname, DS_VARS | DS_TILDE); did_read = read_resource_file(profile_name, false); Free(profile_name); return did_read; } #endif /*]*/ #if defined(_WIN32) /*[*/ /* Start a auto-shortcut-mode copy of wc3270.exe. */ static void start_auto_shortcut(void) { char *tempdir; FILE *f; session_t s; HRESULT hres; char exepath[MAX_PATH]; char linkpath[MAX_PATH]; char sesspath[MAX_PATH]; char delenv[32 + MAX_PATH]; char args[1024]; HINSTANCE h; char *cwd; /* Make sure there is a session file. */ if (profile_path == NULL) { fprintf(stderr, "Can't use auto-shortcut mode without a " "session file\n"); fflush(stderr); return; } #if defined(AS_DEBUG) /*[*/ printf("Running auto-shortcut\n"); fflush(stdout); #endif /*]*/ /* Read the session file into 's'. */ f = fopen(profile_path, "r"); if (f == NULL) { fprintf(stderr, "%s: %s\n", profile_path, strerror(errno)); x3270_exit(1); } memset(&s, '\0', sizeof(session_t)); if (read_session(f, &s, NULL) == 0) { fprintf(stderr, "%s: invalid format\n", profile_path); x3270_exit(1); } #if defined(AS_DEBUG) /*[*/ printf("Reading session file '%s'\n", profile_path); fflush(stdout); #endif /*]*/ /* Create the shortcut. */ tempdir = getenv("TEMP"); if (tempdir == NULL) { fprintf(stderr, "No %%TEMP%%?\n"); x3270_exit(1); } sprintf(linkpath, "%s\\wcsa%u.lnk", tempdir, getpid()); sprintf(exepath, "%s%s", instdir, "wc3270.exe"); #if defined(AS_DEBUG) /*[*/ printf("Executable path is '%s'\n", exepath); fflush(stdout); #endif /*]*/ if (GetFullPathName(profile_path, MAX_PATH, sesspath, NULL) == 0) { fprintf(stderr, "%s: Error %ld\n", profile_path, GetLastError()); x3270_exit(1); } sprintf(args, "+S \"%s\"", sesspath); cwd = getcwd(NULL, 0); hres = create_shortcut(&s, /* session */ exepath, /* .exe */ linkpath, /* .lnk */ args, /* args */ cwd /* cwd */); if (!SUCCEEDED(hres)) { fprintf(stderr, "Cannot create ShellLink '%s'\n", linkpath); x3270_exit(1); } #if defined(AS_DEBUG) /*[*/ printf("Created ShellLink '%s'\n", linkpath); fflush(stdout); #endif /*]*/ /* Execute it. */ sprintf(delenv, "%s=%s", DELENV, linkpath); putenv(delenv); h = ShellExecute(NULL, "open", linkpath, "", tempdir, SW_SHOW); if ((uintptr_t)h <= 32) { fprintf(stderr, "ShellExecute failed, error %d\n", (int)(uintptr_t)h); x3270_exit(1); } #if defined(AS_DEBUG) /*[*/ printf("Started ShellLink\n"); fflush(stdout); #endif /*]*/ exit(0); } /* Start a browser window to display wc3270 help. */ void start_html_help(void) { system(lazyaf("start \"wc3270 Help\" \"%shtml\\README.html\"", instdir)); /* Get back mouse events */ screen_system_fixup(); } /* Start a copy of the Session Wizard. */ void start_wizard(const char *session) { char *cmd; if (session != NULL) { cmd = xs_buffer("start \"wc3270 Session Wizard\" \"%swc3270wiz.exe\" " "-e \"%s\"", instdir, session); } else { cmd = xs_buffer("start \"wc3270 Session Wizard\" \"%swc3270wiz.exe\"", instdir); } system(cmd); Free(cmd); /* Get back mouse events */ screen_system_fixup(); } #endif /*]*/ /* * Product information functions. */ bool product_has_display(void) { return true; } /** * Build options. * * @return Product-specific build options string, beginning with a space. */ const char * product_specific_build_options(void) { return #if defined(HAVE_LIBREADLINE) /*[*/ " --with-readline" #else /*][*/ " --without-readline" #endif /*]*/ #if !defined(_WIN32) /*[*/ # if defined(CURSES_WIDE) /*[*/ " --with-curses-wide" # else /*][*/ " --without-curses-wide" # endif /*]*/ #endif /*]*/ ; } bool product_auto_oversize(void) { return true; } /** * Set appres defaults that are specific to this product. */ void product_set_appres_defaults(void) { appres.oerr_lock = true; appres.interactive.compose_map = "latin1"; appres.interactive.do_confirms = true; appres.interactive.menubar = true; appres.interactive.save_lines = 4096; #if defined(_WIN32) /*[*/ appres.trace_monitor = true; set_toggle(UNDERSCORE, true); #else /*][*/ appres.c3270.meta_escape = "auto"; appres.c3270.curses_keypad = true; appres.c3270.mouse = true; #endif /*]*/ #if !defined(_WIN32) /*[*/ # if defined(CURSES_WIDE) /*[*/ appres.c3270.acs = true; # else /*][*/ appres.c3270.ascii_box_draw = true; # endif /*]*/ #endif /*]*/ } /* * Telnet GUI. */ void telnet_gui_connecting(const char *hostname, const char *portname) { popup_an_info("Trying %s, port %s...", hostname, portname); } /** * GUI function for action_output. */ bool glue_gui_output(const char *s) { screen_suspend(); #if !defined(_WIN32) /*[*/ (void) fprintf(start_pager(), "%s\n", s); #else /*][*/ pager_output(s); #endif /*]*/ return true; } /** * c3270 main module registration. */ static void c3270_register(void) { static action_table_t actions[] = { { "Escape", Escape_action, ACTION_KE }, { "ignore", ignore_action, ACTION_KE }, { "Info", Info_action, ACTION_KE }, { "ScreenTrace", ScreenTrace_action, ACTION_KE }, { "Show", Show_action, ACTION_KE }, { "Trace", Trace_action, ACTION_KE }, }; static opt_t c3270_opts[] = { { OptAllBold, OPT_BOOLEAN, true, ResAllBold, aoffset(c3270.all_bold_on), NULL, "Display all text in bold" }, { OptKeymap, OPT_STRING, false, ResKeymap, aoffset(interactive.key_map), "[,...]", "Keyboard map name(s)" }, { OptNoPrompt, OPT_BOOLEAN, true, ResNoPrompt, aoffset(secure), NULL, "Alias for -secure" }, { OptPrinterLu,OPT_STRING, false, ResPrinterLu, aoffset(interactive.printer_lu), "", "Automatically start a "PR3287_NAME" printer session to " }, { OptReconnect,OPT_BOOLEAN, true, ResReconnect, aoffset(interactive.reconnect), NULL, "Reconnect to host as soon as it disconnects" }, { OptSaveLines, OPT_INT, false, ResSaveLines, aoffset(interactive.save_lines), "", "Number of lines to save for scrolling" }, { OptSecure, OPT_BOOLEAN, true, ResSecure, aoffset(secure), NULL, "Restrict potentially-destructive user actions" }, { OptUtf8, OPT_BOOLEAN, true, ResUtf8, aoffset(utf8), NULL, "Force local codeset to be UTF-8" }, #if defined(C3270_80_132) /*[*/ { OptAltScreen,OPT_STRING, false, ResAltScreen, aoffset(c3270.altscreen), "", "String to switch terminal from 80-column mode to 132-column mode" }, { OptDefScreen,OPT_STRING, false, ResDefScreen, aoffset(c3270.defscreen), "", "String to switch terminal from 132-column mode to 80-column mode" }, #endif /*]*/ #if defined(HAVE_USE_DEFAULT_COLORS) /*[*/ { OptDefaultFgBg,OPT_BOOLEAN,true, ResDefaultFgBg, aoffset(c3270.default_fgbg), NULL, "Use terminal's default foreground and background colors" }, #endif /*]*/ #if !defined(_WIN32) /*[*/ { OptCbreak, OPT_BOOLEAN, true, ResCbreak, aoffset(c3270.cbreak_mode), NULL, "Force terminal CBREAK mode" }, { OptMono, OPT_BOOLEAN, true, ResMono, aoffset(interactive.mono), NULL, "Do not use terminal color capabilities" }, { OptReverseVideo,OPT_BOOLEAN,true,ResReverseVideo, aoffset(c3270.reverse_video), NULL, "Switch to black-on-white mode" }, #endif /*]*/ #if defined(_WIN32) /*[*/ { OptAutoShortcut,OPT_BOOLEAN, true, ResAutoShortcut, aoffset(c3270.auto_shortcut), NULL, "Run in auto-shortcut mode" }, { OptNoAutoShortcut,OPT_BOOLEAN,false,ResAutoShortcut, aoffset(c3270.auto_shortcut), NULL, "Do not run in auto-shortcut mode" }, { OptTitle, OPT_STRING, false, ResTitle, aoffset(c3270.title), "", "Set window title to " }, #endif /*]*/ }; static res_t c3270_resources[] = { { ResAllBold, aoffset(c3270.all_bold_on), XRM_STRING }, { ResAsciiBoxDraw,aoffset(c3270.ascii_box_draw),XRM_BOOLEAN }, { ResIdleCommand,aoffset(idle_command), XRM_STRING }, { ResIdleCommandEnabled,aoffset(idle_command_enabled),XRM_BOOLEAN }, { ResIdleTimeout,aoffset(idle_timeout), XRM_STRING }, { ResKeymap, aoffset(interactive.key_map), XRM_STRING }, { ResMenuBar, aoffset(interactive.menubar), XRM_BOOLEAN }, { ResNoPrompt, aoffset(secure), XRM_BOOLEAN }, { ResPrinterLu, aoffset(interactive.printer_lu),XRM_STRING }, { ResPrinterOptions,aoffset(interactive.printer_opts),XRM_STRING }, { ResReconnect, aoffset(interactive.reconnect),XRM_BOOLEAN }, { ResSaveLines, aoffset(interactive.save_lines),XRM_INT }, #if !defined(_WIN32) /*[*/ { ResCbreak, aoffset(c3270.cbreak_mode), XRM_BOOLEAN }, { ResCursesKeypad,aoffset(c3270.curses_keypad), XRM_BOOLEAN }, { ResMetaEscape,aoffset(c3270.meta_escape), XRM_STRING }, { ResMono, aoffset(interactive.mono), XRM_BOOLEAN }, { ResMouse, aoffset(c3270.mouse), XRM_BOOLEAN }, { ResReverseVideo,aoffset(c3270.reverse_video),XRM_BOOLEAN }, #endif /*]*/ #if defined(C3270_80_132) /*[*/ { ResAltScreen, aoffset(c3270.altscreen), XRM_STRING }, { ResDefScreen, aoffset(c3270.defscreen), XRM_STRING }, #endif /*]*/ #if defined(CURSES_WIDE) /*[*/ { ResAcs, aoffset(c3270.acs), XRM_BOOLEAN }, #endif /*]*/ #if defined(HAVE_USE_DEFAULT_COLORS) /*[*/ { ResDefaultFgBg,aoffset(c3270.default_fgbg), XRM_BOOLEAN }, # endif /*]*/ #if defined(_WIN32) /*[*/ { ResAutoShortcut,aoffset(c3270.auto_shortcut), XRM_BOOLEAN }, { ResBellMode, aoffset(c3270.bell_mode), XRM_STRING }, { ResLightPenPrimary,aoffset(c3270.lightpen_primary),XRM_BOOLEAN }, { ResTitle, aoffset(c3270.title), XRM_STRING }, { ResVisualBell,aoffset(interactive.visual_bell),XRM_BOOLEAN }, #endif /*]*/ }; static xres_t c3270_xresources[] = { { ResKeymap, V_WILD }, { ResAssocCommand, V_FLAT }, { ResLuCommandLine, V_FLAT }, { ResPrintTextScreensPerPage, V_FLAT }, { ResMessage, V_WILD }, #if defined(_WIN32) /*[*/ { ResPrinterCodepage, V_FLAT }, { ResPrinterCommand, V_FLAT }, { ResPrinterName, V_FLAT }, { ResPrintTextFont, V_FLAT }, { ResPrintTextHorizontalMargin, V_FLAT }, { ResPrintTextOrientation, V_FLAT }, { ResPrintTextSize, V_FLAT }, { ResPrintTextVerticalMargin, V_FLAT }, { ResHostColorForDefault, V_FLAT }, { ResHostColorForIntensified, V_FLAT }, { ResHostColorForProtected, V_FLAT }, { ResHostColorForProtectedIntensified,V_FLAT }, { ResConsoleColorForHostColor, V_COLOR }, #else /*][*/ { ResPrinterCommand, V_FLAT }, { ResPrintTextCommand, V_FLAT }, { ResCursesColorForDefault, V_FLAT }, { ResCursesColorForIntensified, V_FLAT }, { ResCursesColorForProtected, V_FLAT }, { ResCursesColorForProtectedIntensified,V_FLAT }, { ResCursesColorForHostColor, V_COLOR }, #endif /*]*/ }; /* Register for state changes. */ register_schange(ST_CONNECT, c3270_connect); register_schange(ST_3270_MODE, c3270_connect); register_schange(ST_EXITING, main_exiting); /* Register our actions. */ register_actions(actions, array_count(actions)); /* Register our options. */ register_opts(c3270_opts, array_count(c3270_opts)); /* Register our resources. */ register_resources(c3270_resources, array_count(c3270_resources)); register_xresources(c3270_xresources, array_count(c3270_xresources)); } suite3270-3.6/Common/c3270/cmenubar.h0000664000076500007650000000473613221577163015141 0ustar pdmpdm/* * Copyright (c) 1995-2010, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * cmenubar.h * Global declarations for c3270 menubar.c. */ typedef enum { MK_MOUSE = 1, /* ncurses mouse event */ MK_UP, /* cursor up */ MK_DOWN, /* cursor down */ MK_LEFT, /* cursor left */ MK_RIGHT, /* cursor right */ MK_HOME, /* home */ MK_END, /* end */ MK_ENTER, /* enter or return */ MK_NONE, /* no symbolic key code */ MK_OTHER /* anything else */ } menu_key_t; /* c3270 externs. */ # define MENU_IS_UP 0x1 # define KEYPAD_IS_UP 0x2 extern unsigned menu_is_up; extern void menu_init(void); bool menu_char(int row, int col, bool persistent, ucs4_t *u, bool *highlighted, unsigned char *acs); void menu_key(menu_key_t k, ucs4_t u); # if defined(_WIN32) /*[*/ void menu_click(int x, int y); # endif /*]*/ void popup_menu(int x, int click); void menu_cursor(int *row, int *col); void menubar_retoggle(toggle_index_t ix); void map_acs(unsigned char c, ucs4_t *u, unsigned char *acs); void menubar_register(void); suite3270-3.6/Common/c3270/cscreen.h0000664000076500007650000000414513221577163014761 0ustar pdmpdm/* * Copyright (c) 1999-2010, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * cscreen.h * c3270/wc3270 screen declarations. */ extern bool escaped; #if defined(WC3270) /*[*/ extern int windows_cp; extern HWND console_window; #endif /*]*/ void screen_init(void); void screen_resume(void); FILE *start_pager(void); void screen_register(void); void screen_final(void); void screen_system_fixup(void); #if defined(WC3270) /*[*/ void pager_output(const char *s); bool screen_wait_for_key(char *c); void screen_title(const char *text); typedef void (*ctrlc_fn_t)(void); void screen_set_ctrlc_fn(ctrlc_fn_t fn); void get_console_size(int *rows, int *cols); #endif /*]*/ suite3270-3.6/Common/c3270/cstatus.h0000664000076500007650000000315113221577163015021 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * cstatus.h * Extra global declarations for c3270 status.c. */ void status_push(char *msg); suite3270-3.6/Common/c3270/ft_gui.c0000664000076500007650000001261413221577163014607 0ustar pdmpdm/* * Copyright (c) 1996-2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_gui.c * IND$FILE file transfer dialogs (c3270 version). */ #include "globals.h" #include #include "appres.h" #include "cscreen.h" #include "unicodec.h" #include "ft.h" #include "ft_private.h" #include "icmdc.h" #include "macros.h" #include "popups.h" #include "screen.h" #include "utils.h" #include "ft_gui.h" /* Macros. */ /* Globals. */ /* Statics. */ static bool ft_sigint_aborting = false; static ioid_t ft_poll_id = NULL_IOID; /* Entry points called from the common FT logic. */ /* Pop down the transfer-in-progress pop-up. */ void ft_gui_progress_popdown(void) { } /* Massage a file transfer error message so it will fit in the pop-up. */ void ft_gui_errmsg_prepare(char *msg _is_unused) { } /* Clear out the progress display. */ void ft_gui_clear_progress(void) { if (ftc->is_interactive || escaped) { printf("\r%79s\r", ""); fflush(stdout); } else { popup_an_info(" "); } } /* Pop up a successful completion message. */ void ft_gui_complete_popup(const char *msg) { #if !defined(_WIN32) /*[*/ signal(SIGINT, SIG_IGN); #else /*][*/ screen_set_ctrlc_fn(NULL); #endif /*]*/ if (ftc->is_interactive) { /* * We call sms_info here instead of plain printf, so that * macro_output is set and the user will stay at the c3270> prompt. */ sms_info("%s\n", msg); } else if (escaped) { printf("%s\n", msg); fflush(stdout); } } /* Update the bytes-transferred count on the progress pop-up. */ void ft_gui_update_length(size_t length) { if (ftc->is_interactive || escaped) { if (ft_sigint_aborting) { ft_sigint_aborting = false; if (!ft_do_cancel()) { printf("Aborting... waiting for host acknowledgment... "); } } else { printf("\r%79s\rTransferred %lu bytes ", "", (unsigned long)length); } fflush(stdout); } else { /* Not interactive, put it in the OIA. */ popup_an_info("Transferred %lu bytes", (unsigned long)length); } } /* Replace the 'waiting' pop-up with the 'in-progress' pop-up. */ void ft_gui_running(size_t length _is_unused) { if (ftc->is_interactive) { RemoveTimeOut(ft_poll_id); ft_poll_id = NULL_IOID; } ft_update_length(); } /* Process a protocol-generated abort. */ void ft_gui_aborting(void) { #if !defined(_WIN32) /*[*/ signal(SIGINT, SIG_IGN); #else /*][*/ screen_set_ctrlc_fn(NULL); #endif /*]*/ } /* Check for interactive mode. */ ft_gui_interact_t ft_gui_interact(ft_conf_t *p) { if (!escaped) { return FGI_NOP; } if (interactive_transfer(p) < 0) { printf("\n"); fflush(stdout); action_output("Aborted"); return FGI_ABORT; } p->is_interactive = true; return FGI_SUCCESS; } #if !defined(_WIN32) /*[*/ static void ft_sigint(int ignored _is_unused) { signal(SIGINT, SIG_IGN); ft_sigint_aborting = true; } #else /*][*/ static void ft_ctrlc_fn(void) { screen_set_ctrlc_fn(NULL); ft_sigint_aborting = true; } #endif /*]*/ static void ft_poll_abort(ioid_t id _is_unused) { if (ft_sigint_aborting) { ft_sigint_aborting = false; if (!ft_do_cancel()) { printf("Aborting... waiting for host acknowledgment... "); fflush(stdout); } } else { /* Poll again. */ ft_poll_id = AddTimeOut(500, ft_poll_abort); } } /* Display an "Awaiting start of transfer" message. */ void ft_gui_awaiting(void) { if (ftc->is_interactive) { printf("Press ^C to abort\n"); printf("Awaiting start of transfer... "); fflush(stdout); /* Set up a SIGINT handler. */ ft_sigint_aborting = false; #if !defined(_WIN32) /*[*/ signal(SIGINT, ft_sigint); #else /*][*/ screen_set_ctrlc_fn(ft_ctrlc_fn); #endif /*]*/ /* Start polling for ^C. */ ft_poll_id = AddTimeOut(500, ft_poll_abort); fflush(stdout); } else if (escaped) { printf("Awaiting start of transfer... "); fflush(stdout); } else { popup_an_info("Awaiting start of transfer"); } } suite3270-3.6/Common/c3270/help.c0000664000076500007650000003424513221577163014266 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Help.c * Help information for c3270. */ #include "globals.h" #include "appres.h" #include "resources.h" #include "actions.h" #include "glue.h" #include "help.h" #include "icmdc.h" #include "popups.h" #include "screen.h" #include "utils.h" #if defined(_WIN32) /*[*/ # include "wc3270.h" #endif /*]*/ #define P_3270 0x0001 /* 3270 actions */ #define P_SCRIPTING 0x0002 /* scripting actions */ #define P_INTERACTIVE 0x0004 /* interactive (command-prompt) actions */ #define P_OPTIONS 0x0008 /* command-line options */ #define P_TRANSFER 0x0010 /* file transfer options */ #define P_HTML 0x0020 /* HTML help */ #if defined(WC3270) /*[*/ #define HELP_W "w" #else /*][*/ #define HELP_W "" #endif /*]*/ static struct { const char *name; const char *args; int purpose; const char *help; } cmd_help[] = { { "Abort", NULL, P_SCRIPTING, "Abort pending scripts and macros" }, { "AnsiText", NULL, P_SCRIPTING, "Dump pending NVT text" }, { "Ascii", NULL, P_SCRIPTING, "Screen contents in ASCII" }, { "Ascii", "", P_SCRIPTING, " bytes of screen contents from cursor, in ASCII" }, { "Ascii", " ", P_SCRIPTING, " bytes of screen contents from ,, in ASCII" }, { "Ascii", " ", P_SCRIPTING, "x of screen contents from ,, in ASCII" }, { "AsciiField", NULL, P_SCRIPTING, "Contents of current field, in ASCII" }, { "Attn", NULL, P_3270, "Send 3270 ATTN sequence (TELNET IP)" }, { "BackSpace", NULL, P_3270, "Move cursor left" }, { "BackTab", NULL, P_3270, "Move to previous field" }, { "Bell", NULL, P_SCRIPTING, "Ring the terminal bell" }, { "CircumNot", NULL, P_3270, "Send ~ in NVT mode, notsign (X'5F', U+00AC) in 3270 mode" }, { "Clear", NULL, P_3270, "Send CLEAR AID (clear screen)" }, { "Close", NULL, P_INTERACTIVE, "Alias for 'Disconnect'" }, { "CloseScript", NULL, P_SCRIPTING, "Exit peer script" }, { "Compose", NULL, P_INTERACTIVE, "Interpret next two keystrokes according to the compose map" }, { "Connect", "[L:][Y:][A:][@][:][=]", P_INTERACTIVE, "Open connection to " }, #if defined(LOCAL_PROCESS) /*[*/ { "Connect", "-e [ [...]]", P_INTERACTIVE, "Open connection to a local shell or command" }, #endif /*]*/ { "ContinueScript", "", P_SCRIPTING, "Resume paused script" }, #if defined(WC3270) /*[*/ { "Copy", NULL, P_3270, "Copy selected text to Windows clipboard" }, #endif /*]*/ { "CursorSelect", NULL, P_3270, "Light pen select at cursor location" }, #if defined(WC3270) /*[*/ { "Cut", NULL, P_3270, "Copy selected text to Windows clipboard, then erase" }, #endif /*]*/ { "Delete", NULL, P_3270, "Delete character at cursor" }, { "DeleteField", NULL, P_3270, "Erase field at cursor location (^U)" }, { "DeleteWord", NULL, P_3270, "Erase word before cursor location (^W)" }, { "Disconnect", NULL, P_INTERACTIVE, "Close connection to host" }, { "Down", NULL, P_3270, "Move cursor down" }, { "Dup", NULL, P_3270, "3270 DUP key (X'1C')" }, { "Ebcdic", NULL, P_SCRIPTING, "Screen contents in EBCDIC" }, { "Ebcdic", "", P_SCRIPTING, " bytes of screen contents from cursor, in EBCDIC" }, { "Ebcdic", " ", P_SCRIPTING, " bytes of screen contents from ,, in EBCDIC" }, { "Ebcdic", " ", P_SCRIPTING, "x of screen contents from ,, in EBCDIC" }, { "EbcdicField", NULL, P_SCRIPTING, "Contents of current field, in EBCDIC" }, { "Enter", NULL, P_3270, "Send ENTER AID" }, { "Erase", NULL, P_3270, "Destructive backspace" }, { "EraseEOF", NULL, P_3270, "Erase from cursor to end of field" }, { "EraseInput", NULL, P_3270, "Erase all input fields" }, { "Escape", NULL, P_INTERACTIVE, "Escape to '" HELP_W "c3270>' prompt" }, { "Execute", "", P_SCRIPTING, "Execute a shell command" }, { "Exit", NULL, P_INTERACTIVE, "Exit " HELP_W "c3270" }, { "Expect", "", P_SCRIPTING, "Wait for NVT output" }, { "FieldEnd", NULL, P_3270, "Move to end of field" }, { "FieldMark", NULL, P_3270, "3270 FIELD MARK key (X'1E')" }, { "Flip", NULL, P_3270, "Flip display left-to-right" }, { "Help", "all|interactive|3270|scripting|transfer|", P_INTERACTIVE, "Get help" }, { "HexString", "", P_3270|P_SCRIPTING, "Input field data in hex" }, { "Home", NULL, P_3270, "Move cursor to first field" }, { "ignore", NULL, P_3270, "Do nothing" }, { "Info", "", P_SCRIPTING|P_INTERACTIVE, "Display text in OIA" }, { "Insert", NULL, P_3270, "Set 3270 insert mode" }, { "Interrupt", NULL, P_3270, "In NVT mode, send IAC IP" }, { "Key", "|0x", P_3270, "Input one character" }, { "Keymap", "[]", P_SCRIPTING|P_INTERACTIVE, "Push temporary keymap, or pop if none specified" }, { "Keypad", NULL, P_INTERACTIVE, "Pop up the 3270 keypad" }, { "Left", NULL, P_3270, "Move cursr left" }, { "Left2", NULL, P_3270, "Move cursor left 2 columns" }, { "Macro", "", P_SCRIPTING, "Execute a predefined macro" }, { "Menu", NULL, P_INTERACTIVE, "Pop up the command menu" }, { "MonoCase", NULL, P_3270, "Toggle monocase mode" }, { "MoveCursor", " ", P_3270|P_SCRIPTING, "Move cursor to specific location" }, { "Newline", NULL, P_3270, "Move cursor to first field in next row" }, { "NextWord", NULL, P_3270, "Move cursor to next word" }, { "Open", NULL, P_INTERACTIVE, "Alias for 'Connect'" }, { "PA", "", P_3270, "Send 3270 Program Attention" }, #if defined(WC3270) /*[*/ { "Paste", NULL, P_3270, "Paste clipboard contents" }, #endif /*]*/ { "PauseScript", NULL, P_SCRIPTING, "Pause script until ContinueScript" }, { "PF", "", P_3270, "Send 3270 PF AID" }, { "PreviousWord", NULL, P_3270, "Move cursor to previous word" }, { "Printer", "Start[,lu]|Stop", P_3270|P_SCRIPTING|P_INTERACTIVE, "Start or stop " HELP_W "pr3287 printer session" }, { "PrintText", "[Html] [Rtf] [Modi] [Caption ] [Replace|Append] File ", P_INTERACTIVE|P_SCRIPTING, "Save screen image in a file" }, { "PrintText", "[Modi] [Caption ] " #if defined(WC3270) /*[*/ "[Gdi|Wordpad] [NoDialog] []", #else /*][*/ "[]", #endif /*]*/ P_INTERACTIVE|P_SCRIPTING, "Print screen image" }, { "Query", "", P_SCRIPTING|P_INTERACTIVE, "Query operational parameters" }, { "Quit", NULL, P_INTERACTIVE, "Exit " HELP_W "3270" }, { "ReadBuffer", "Ascii|Ebcdic", P_SCRIPTING, "Dump display buffer" }, { "Reconnect", NULL, P_INTERACTIVE, "Reconnect to previous host" }, { "Redraw", NULL, P_INTERACTIVE|P_3270, "Redraw screen" }, { "Reset", NULL, P_3270, "Clear keyboard lock" }, { "Right", NULL, P_3270, "Move cursor right" }, { "Right2", NULL, P_3270, "Move cursor right 2 columns" }, { "ScreenTrace", "On [[File] ]", P_INTERACTIVE, "Save screen images to file" }, { "ScreenTrace", # if defined(_WIN32) /*[*/ "On Printer [Gdi|WordPad] []", # else /*][*/ "On Printer []", # endif /*]*/ P_INTERACTIVE, "Save screen images to printer" }, { "ScreenTrace", "Off", P_INTERACTIVE, "Stop saving screen images" }, { "Script", " [...]", P_SCRIPTING, "Run a child script" }, { "Scroll", "Forward|Backward", P_INTERACTIVE, "Scroll screen" }, { "Show", "Copyright|Stats|Keymap", P_INTERACTIVE, "Display status and settings" }, { "Snap", "", P_SCRIPTING, "Screen snapshot manipulation" }, { "Source", "", P_SCRIPTING|P_INTERACTIVE, "Read actions from file" }, { "String", "", P_3270|P_SCRIPTING, "Input a string" }, { "SysReq", NULL, P_3270, "Send 3270 Attention (TELNET ABORT or SYSREQ AID)" }, { "Tab", NULL, P_3270, "Move cursor to next field" }, { "TemporaryKeymap", "[]", P_SCRIPTING|P_INTERACTIVE, "Alias for Keymap" }, #if defined(WC3270) /*[*/ { "Title", "", P_SCRIPTING|P_INTERACTIVE, "Change window title" }, #endif /*]*/ { "Toggle", " [Set|Clear]", P_INTERACTIVE|P_SCRIPTING, "Change a toggle" }, { "ToggleInsert", NULL, P_3270, "Set or clear 3270 insert mode" }, { "ToggleReverse", NULL, P_3270, "Set or clear reverse-input mode" }, { "Trace", "On []|Off", P_INTERACTIVE, "Configure tracing" }, { "Transfer", "[]", P_INTERACTIVE, "IND$FILE file transfer (see 'help file-transfer')" }, { "Up", NULL, P_3270, "Move cursor up" }, { "Wait", "", P_SCRIPTING, "Wait for host events" }, { NULL, NULL, 0, NULL } }; #if defined(WC3270) /*[*/ static void html_help(bool); #endif /*]*/ static struct { const char *name; int flag; const char *text; const char **block; void (*fn)(bool); } help_subcommand[] = { { "all", -1, NULL, NULL, NULL }, { "3270", P_3270, NULL, NULL, NULL }, { "interactive", P_INTERACTIVE, NULL, NULL, NULL }, { "options", P_OPTIONS, NULL, NULL, &cmdline_help }, { "scripting", P_SCRIPTING, NULL, NULL, NULL }, { "file-transfer", P_TRANSFER, NULL, NULL, ft_help }, #if defined(WC3270) /*[*/ { "html", P_HTML, NULL, NULL, html_help }, #endif /*]*/ { NULL, 0, NULL } }; /* c3270-specific actions. */ static bool Help_action(ia_t ia, unsigned argc, const char **argv) { int i; int overall = -1; int match = 0; bool any = false; action_debug("Help", ia, argc, argv); if (check_argc("Help", argc, 0, 1) < 0) { return false; } if (argc != 1) { action_output( " help all all commands\n" " help 3270 3270 commands\n" " help interactive interactive (command-prompt) commands\n" " help help for one \n" " help options command-line options\n" " help scripting scripting commands\n" " help file-transfer file transfer options\n" #if defined(WC3270) /*[*/ " help html display HTML help file\n" #endif /*]*/ ); return true; } /* The (hidden) verify option verifies the integrity of the help list. */ if (!strcmp(argv[0], "verify")) { action_elt_t *e; bool any = false; for (i = 0; cmd_help[i].name; i++) { bool found = false; FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strcasecmp(cmd_help[i].name, e->t.name)) { found = true; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (!found) { action_output("Help for nonexistent action: %s", cmd_help[i].name); any = true; } } if (!any) { action_output("No orphaned help messages."); } any = false; FOREACH_LLIST(&actions_list, e, action_elt_t *) { bool found = false; for (i = 0; cmd_help[i].name; i++) { if (!strcasecmp(cmd_help[i].name, e->t.name)) { found = true; break; } } if (!found) { action_output("No Help for %s", e->t.name); any = true; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (!any) { printf("No orphaned actions.\n"); } return true; } /* Do a substring match on all of the actions. */ for (i = 0; cmd_help[i].name != NULL; i++) { if (!strncasecmp(cmd_help[i].name, argv[0], strlen(argv[0]))) { action_output(" %s %s\n %s", cmd_help[i].name, cmd_help[i].args? cmd_help[i].args: "", cmd_help[i].help? cmd_help[i].help: ""); any = true; } } if (any) { return true; } /* Check for an exact match on one of the topics. */ for (i = 0; help_subcommand[i].name != NULL; i++) { if (!strncasecmp(help_subcommand[i].name, argv[0], strlen(argv[0]))) { match = help_subcommand[i].flag; overall = i; break; } } if (!match) { action_output("No such command: %s", argv[0]); return false; } /* Matched on a topic. */ if (help_subcommand[overall].text != NULL) { /* One-line topic. */ action_output("%s", help_subcommand[overall].text); return true; } if (help_subcommand[overall].block != NULL) { int j; /* Multi-line topic. */ for (j = 0; help_subcommand[overall].block[j] != NULL; j++) { action_output("%s", help_subcommand[overall].block[j]); } return true; } if (help_subcommand[overall].fn != NULL) { /* Indirect output for topic. */ (*help_subcommand[overall].fn)(true); return true; } /* Category. */ for (i = 0; cmd_help[i].name != NULL; i++) { if (cmd_help[i].purpose & match) { action_output(" %s %s\n %s", cmd_help[i].name, cmd_help[i].args? cmd_help[i].args: "", cmd_help[i].help? cmd_help[i].help: ""); } } return true; } #if defined(WC3270) /*[*/ static void html_help(bool ignored _is_unused) { start_html_help(); } #endif /*]*/ /** * Help module registration. */ void help_register(void) { static action_table_t help_actions[] = { { "Help", Help_action, ACTION_KE } }; /* Register the actions. */ register_actions(help_actions, array_count(help_actions)); } suite3270-3.6/Common/c3270/help.h0000664000076500007650000000313613221577163014266 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * help.h * Header file for help.c */ extern void help_register(void); suite3270-3.6/Common/c3270/icmd.c0000664000076500007650000004724113221577163014252 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * icmd.c * A curses-based 3270 Terminal Emulator * Interactive commands */ #include "globals.h" #include "appres.h" #include "charset.h" #include "ft_dft.h" #include "ft_private.h" #include "icmdc.h" #include "lazya.h" #include "popups.h" #include "split_host.h" #include "utf8.h" #include "utils.h" /* Support functions for interactive commands. */ /** * Interactive command module registration. */ void icmd_register(void) { } /* * Get a buffer full of input. * Trims white space in the result. * Returns NULL if there is an input error or if the input is 'quit'. */ static char * get_input(char *buf, int size) { size_t sl; char *s; fflush(stdout); /* Get the raw input. */ if (fgets(buf, size, stdin) == NULL) { return NULL; } /* Trim trailing white space. */ sl = strlen(buf); while (sl && isspace((unsigned char)buf[sl - 1])) { buf[--sl] = '\0'; } /* Trim leading white space. */ s = buf; while (*s && isspace((unsigned char)*s)) { s++; sl--; } if (s != buf) { memmove(buf, s, sl + 1); } /* Check for 'quit'. */ if (!strcasecmp(buf, "quit")) { return NULL; } return buf; } /* Get a yes, no or quit. Returns 0 for no, 1 for yes, -1 for quit or error. */ static int getyn(int defval) { char buf[64]; for (;;) { if (get_input(buf, sizeof(buf)) == NULL) return -1; if (!buf[0]) return defval; if (!strncasecmp(buf, "yes", strlen(buf))) return 1; else if (!strncasecmp(buf, "no", strlen(buf))) return 0; else { printf("Please answer 'yes', 'no' or 'quit': "); } } } /* * Get a numeric value. Returns the number for good input, -1 for quit or * error. */ static int getnum(int defval) { char buf[64]; unsigned long u; char *ptr; for (;;) { if (get_input(buf, sizeof(buf)) == NULL) return -1; if (!buf[0]) return defval; u = strtoul(buf, &ptr, 10); if (*ptr == '\0') return (int)u; printf("Please enter a number or 'quit': "); } } /* Format a text string to fit on an 80-column display. */ static void fmt80(const char *s) { char *nl; size_t nc; printf("\n"); while (*s) { nl = strchr(s, '\n'); if (nl == NULL) { nc = strlen(s); } else { nc = nl - s; } if (nc > 78) { const char *t = s + 78; while (t > s && *t != ' ') { t--; } if (t != s) { nc = t - s; } } printf(" %.*s\n", (int)nc, s); s += nc; if (*s == '\n' || *s == ' ') { s++; } } } /* * Interactive file transfer command. * Called from Transfer_action. Returns an updated ft_private. * Returns 0 for success, -1 for failure. */ int interactive_transfer(ft_conf_t *p) { #define KW_SIZE 1024 char inbuf[KW_SIZE]; int n; enum { CR_REMOVE, CR_ADD, CR_KEEP } cr_mode = CR_REMOVE; char *default_cr; enum { FE_KEEP, FE_REPLACE, FE_APPEND } fe_mode = FE_KEEP; char *default_fe; printf("\n\ File Transfer\n\ \n\ Type 'quit' at any prompt to abort this dialog.\n\ \n\ Note: In order to initiate a file transfer, the 3270 cursor must be\n\ positioned on an input field that can accept the IND$FILE command, e.g.,\n\ at the VM/CMS or TSO command prompt.\n"); printf("\nContinue? (y/n) [y] "); if (getyn(1) <= 0) { return -1; } printf("\n\ 'send' means copy a file from this workstation to the host.\n\ 'receive' means copy a file from the host to this workstation.\n"); for (;;) { printf("Direction: (send/receive) [%s] ", p->receive_flag? "receive": "send"); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (!strncasecmp(inbuf, "receive", strlen(inbuf))) { p->receive_flag = true; break; } if (!strncasecmp(inbuf, "send", strlen(inbuf))) { p->receive_flag = false; break; } } printf("\n"); for (;;) { printf("Name of source file on %s: ", p->receive_flag? "the host": "this workstation"); if (p->receive_flag && p->host_filename) { printf("[%s] ", p->host_filename); } else if (!p->receive_flag && p->local_filename) { printf("[%s] ", p->local_filename); } if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { if ((p->receive_flag && p->host_filename) || (!p->receive_flag && p->local_filename)) { break; } else { continue; } } if (p->receive_flag) { Replace(p->host_filename, NewString(inbuf)); } else { Replace(p->local_filename, NewString(inbuf)); } break; } for (;;) { printf("Name of destination file on %s: ", p->receive_flag? "this workstation": "the host"); if (!p->receive_flag && p->host_filename) { printf("[%s] ", p->host_filename); } else if (p->receive_flag && p->local_filename) { printf("[%s] ", p->local_filename); } if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { if ((!p->receive_flag && p->host_filename) || (p->receive_flag && p->local_filename)) { break; } else { continue; } } if (!p->receive_flag) { Replace(p->host_filename, NewString(inbuf)); } else { Replace(p->local_filename, NewString(inbuf)); } break; } printf("\n"); for (;;) { printf("Host type: (tso/vm/cics) [%s] ", ft_decode_host_type(p->host_type)); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (ft_encode_host_type(inbuf, &p->host_type)) { break; } } printf("\n\ An 'ascii' transfer does automatic translation between EBCDIC on the host and\n\ ASCII on the workstation.\n\ A 'binary' transfer does no data translation.\n"); for (;;) { printf("Transfer mode: (ascii/binary) [%s] ", p->ascii_flag? "ascii": "binary"); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (!strncasecmp(inbuf, "ascii", strlen(inbuf))) { p->ascii_flag = true; break; } if (!strncasecmp(inbuf, "binary", strlen(inbuf))) { p->ascii_flag = false; break; } } if (p->ascii_flag) { printf("\n\ For ASCII transfers, carriage return (CR) characters can be handled specially.\n"); if (p->receive_flag) { printf("\ 'add' means that CRs will be added to each record during the transfer.\n"); } else { printf("\ 'remove' means that CRs will be removed during the transfer.\n"); } printf("\ 'keep' means that no special action is taken with CRs.\n"); default_cr = p->cr_flag? (p->receive_flag? "add": "remove"): "keep"; for (;;) { printf("CR handling: (%s/keep) [%s] ", p->receive_flag? "add": "remove", default_cr); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { cr_mode = p->cr_flag? (p->receive_flag? CR_ADD: CR_REMOVE): CR_KEEP; break; } if (!strncasecmp(inbuf, "remove", strlen(inbuf))) { p->cr_flag = true; cr_mode = CR_REMOVE; break; } if (!strncasecmp(inbuf, "add", strlen(inbuf))) { p->cr_flag = true; cr_mode = CR_ADD; break; } if (!strncasecmp(inbuf, "keep", strlen(inbuf))) { p->cr_flag = false; cr_mode = CR_KEEP; break; } } fmt80(lazyaf("For ASCII transfers, " #if defined(WC3270) /*[*/ "w" #endif /*]*/ "c3270 can either remap the text to ensure as " "accurate a translation between " #if defined(WC3270) /*[*/ "the Windows code page" #else /*][*/ "%s" #endif /*]*/ " and EBCDIC code page %s as possible, or it can transfer text as-is and " "leave all translation to the IND$FILE program on the host.\n\ 'yes' means that text will be translated.\n\ 'no' means that text will be transferred as-is.", #if !defined(WC3270) /*[*/ locale_codeset, #endif /*]*/ get_host_codepage())); for (;;) { printf("Re-map character set? (yes/no) [%s] ", p->remap_flag? "yes": "no"); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (!strncasecmp(inbuf, "yes", strlen(inbuf))) { p->remap_flag = true; break; } if (!strncasecmp(inbuf, "no", strlen(inbuf))) { p->remap_flag = false; break; } } #if defined(_WIN32) /*[*/ if (p->remap_flag) { for (;;) { int cp; printf("Windows code page for re-mapping: [%d] ", p->windows_codepage); cp = getnum(p->windows_codepage); if (cp < 0) { return -1; } if (cp > 0) { p->windows_codepage = cp; break; } } } #endif /*]*/ } if (p->receive_flag) { printf("\n\ If the destination file exists, you can choose to keep it (and abort the\n\ transfer), replace it, or append the source file to it.\n"); if (p->allow_overwrite) { default_fe = "replace"; } else if (p->append_flag) { default_fe = "append"; } else { default_fe = "keep"; } printf("\n"); for (;;) { printf("Action if destination file exists: " "(keep/replace/append) [%s] ", default_fe); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { fe_mode = p->allow_overwrite? FE_REPLACE: (p->append_flag? FE_APPEND: FE_KEEP); break; } if (!strncasecmp(inbuf, "keep", strlen(inbuf))) { p->append_flag = false; p->allow_overwrite = false; fe_mode = FE_KEEP; break; } if (!strncasecmp(inbuf, "replace", strlen(inbuf))) { p->append_flag = false; p->allow_overwrite = true; fe_mode = FE_REPLACE; break; } if (!strncasecmp(inbuf, "append", strlen(inbuf))) { p->append_flag = true; p->allow_overwrite = false; fe_mode = FE_APPEND; break; } } } if (!p->receive_flag) { if (p->host_type != HT_CICS) { printf("\n"); for (;;) { printf("[optional] Destination file record " "format:\n (default/fixed/variable/undefined) [%s] ", ft_decode_recfm(p->recfm)); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (ft_encode_recfm(inbuf, &p->recfm)) { break; } } printf("\n"); printf("[optional] Destination file logical record length: "); if (p->lrecl) { printf("[%d] ", p->lrecl); } n = getnum(p->lrecl); if (n < 0) { return -1; } p->lrecl = n; } if (p->host_type == HT_TSO) { printf("[optional] Destination file block size: "); if (p->blksize) { printf("[%d] ", p->blksize); } n = getnum(p->blksize); if (n < 0) { return -1; } p->blksize = n; printf("\n"); for (;;) { printf("[optional] Destination file " "allocation type:\n" " (default/tracks/cylinders/avblock) "); if (p->units) { printf("[%s] ", ft_decode_units(p->units)); } if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (ft_encode_units(inbuf, &p->units)) { break; } } if (p->units != DEFAULT_UNITS) { printf("\n"); for (;;) { printf("Destination file primary space: "); if (p->primary_space) { printf("[%d] ", p->primary_space); } n = getnum(p->primary_space); if (n < 0) { return -1; } if (n > 0) { p->primary_space = n; break; } } printf("[optional] Destination file secondary space: "); if (p->secondary_space) { printf("[%d] ", p->secondary_space); } n = getnum(p->secondary_space); if (n < 0) { return -1; } p->secondary_space = n; if (p->units == AVBLOCK) { for (;;) { printf("Destination file avblock size: "); if (p->avblock) { printf("[%d] ", p->avblock); } n = getnum(p->avblock); if (n < 0) { return -1; } if (n > 0) { p->avblock = n; break; } } } } } } if (!HOST_FLAG(STD_DS_HOST)) { printf("\n"); for (;;) { int nsize; printf("DFT buffer size: [%d] ", p->dft_buffersize); if (p->avblock) { printf("[%d] ", p->avblock); } n = getnum(p->dft_buffersize); if (n < 0) { return -1; } nsize = set_dft_buffersize(n); if (nsize != n) { printf("Size changed to %d.\n", nsize); } p->dft_buffersize = nsize; break; } } printf("\nFile Transfer Summary:\n"); if (p->receive_flag) { printf(" Source file on Host: %s\n", p->host_filename); printf(" Destination file on Workstation: %s\n", p->local_filename); } else { printf(" Source file on workstation: %s\n", p->local_filename); printf(" Destination file on Host: %s\n", p->host_filename); } printf(" Host type: "); switch (p->host_type) { case HT_TSO: printf("TSO"); break; case HT_VM: printf("VM/CMS"); break; case HT_CICS: printf("CICS"); break; } printf(" \n Transfer mode: %s", p->ascii_flag? "ASCII": "Binary"); if (p->ascii_flag) { switch (cr_mode) { case CR_REMOVE: printf(", remove CRs"); break; case CR_ADD: printf(", add CRs"); break; case CR_KEEP: break; } if (p->remap_flag) { printf(", remap text"); } else { printf(", don't remap text"); } #if defined(_WIN32) /*[*/ if (p->remap_flag) { printf(", Windows code page %d", p->windows_codepage); } #endif /*]*/ printf("\n"); } else { printf("\n"); } if (p->receive_flag) { printf(" If destination file exists, "); switch (fe_mode) { case FE_KEEP: printf("abort the transfer\n"); break; case FE_REPLACE: printf("replace it\n"); break; case FE_APPEND: printf("append to it\n"); break; } } if (!p->receive_flag && (p->recfm != DEFAULT_RECFM || p->lrecl || p->primary_space || p->secondary_space)) { printf(" Destination file:\n"); switch (p->recfm) { case DEFAULT_RECFM: break; case RECFM_FIXED: printf(" Record format: fixed\n"); break; case RECFM_VARIABLE: printf(" Record format: variable\n"); break; case RECFM_UNDEFINED: printf(" Record format: undefined\n"); break; } if (p->lrecl) { printf(" Logical record length: %d\n", p->lrecl); } if (p->blksize) { printf(" Block size: %d\n", p->blksize); } if (p->primary_space || p->secondary_space) { printf(" Allocation:"); if (p->primary_space) { printf(" primary %d", p->primary_space); } if (p->secondary_space) { printf(" secondary %d", p->secondary_space); } switch (p->units) { case DEFAULT_UNITS: break; case TRACKS: printf(" tracks"); break; case CYLINDERS: printf(" cylinders"); break; case AVBLOCK: printf(" avblock %d", p->avblock); break; } printf("\n"); } } if (!HOST_FLAG(STD_DS_HOST)) { printf(" DFT buffer size: %d\n", p->dft_buffersize); } printf("\nContinue? (y/n) [y] "); if (getyn(1) <= 0) { return -1; } /* Let it go. */ return 0; } /* Help for the interactive Transfer action. */ void ft_help(bool as_action _is_unused) { ft_conf_t conf; char *s; memset(&conf, 0, sizeof(ft_conf_t)); ft_init_conf(&conf); action_output( "Syntax:\n\ To be prompted interactively for parameters:\n\ Transfer\n\ To specify parameters on the command line:\n\ Transfer =...\n\ Keywords:"); action_output( " Direction=send|receive default '%s'", conf.receive_flag? "send": "receive"); if ((conf.receive_flag && conf.host_filename) || (!conf.receive_flag && conf.local_filename)) { s = lazyaf("default '%s'", conf.receive_flag? conf.host_filename: conf.local_filename); } else { s = "(required)"; } action_output( " HostFile= %s", s); if ((!conf.receive_flag && conf.host_filename) || (conf.receive_flag && conf.local_filename)) { s = lazyaf("default '%s'", conf.receive_flag? conf.local_filename: conf.host_filename); } else { s = "(required)"; } action_output( " LocalFile= %s", s); action_output( " Host=tso|vm default '%s'", ft_decode_host_type(conf.host_type)); action_output( " Mode=ascii|binary default '%s'", conf.ascii_flag? "ascii": "binary"); action_output( " Cr=remove|add|keep default '%s'", conf.cr_flag? (conf.receive_flag? "add": "remove"): "keep"); action_output( " Remap=yes|no default '%s'", conf.remap_flag? "yes": "no"); #if defined(_WIN32) /*[*/ action_output( " WindowsCodePage= default %d", conf.windows_codepage); #endif /*]*/ action_output( " Exist=keep|replace|append default '%s'", conf.allow_overwrite? "replace": (conf.append_flag? "append": "keep")); action_output( " Recfm=fixed|variable|undefined for Direction=send"); if (conf.recfm != DEFAULT_RECFM) { action_output( " default '%s'", ft_decode_recfm(conf.recfm)); } action_output( " Lrecl= for Direction=send"); if (conf.lrecl) { action_output( " default %d", conf.lrecl); } action_output( " Blksize= for Direction=send Host=tso"); if (conf.blksize) { action_output( " default %d", conf.blksize); } action_output( " Allocation=tracks|cylinders|avblock for Direction=send Host=tso"); if (conf.units != DEFAULT_UNITS) { action_output( " default '%s'", ft_decode_units(conf.units)); } action_output( " PrimarySpace= for Direction=send Host=tso"); if (conf.primary_space) { action_output( " default %d", conf.primary_space); } action_output( " SecondarySpace= for Direction=send Host=tso"); if (conf.secondary_space) { action_output( " default %d", conf.secondary_space); } action_output( " Avblock= for Direction=send Host=tso Allocation=avblock"); if (conf.avblock) { action_output( " default %d", conf.avblock); } action_output( "Note that to embed a space in a value, you must quote the keyword, e.g.:\n\ Transfer Direction=send LocalFile=/tmp/foo \"HostFile=foo text a\" Host=vm"); if (conf.local_filename) { Free(conf.local_filename); } if (conf.host_filename) { Free(conf.host_filename); } } suite3270-3.6/Common/c3270/icmdc.h0000664000076500007650000000337113221577163014416 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * icmdc.h * A curses-based 3270 Terminal Emulator * Declarations for icmd.c. */ void icmd_register(void); void ft_help(bool as_action); #if defined(__FT_PRIVATE_H) /*[*/ int interactive_transfer(ft_conf_t *p); #endif /*]*/ suite3270-3.6/Common/c3270/keymap.c0000664000076500007650000006376213221577163014632 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * keymap.c * A curses-based 3270 Terminal Emulator * Keyboard mapping */ #include "globals.h" #include #include "appres.h" #include "resources.h" #include "actions.h" #include "glue.h" #include "host.h" #include "keymap.h" #include "macros.h" #include "popups.h" #include "screen.h" #include "status.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #if defined(HAVE_NCURSESW_NCURSES_H) /*[*/ #include #elif defined(HAVE_NCURSES_NCURSES_H) /*][*/ #include #elif defined(HAVE_NCURSES_H) /*][*/ #include #else /*][*/ #include #endif /*]*/ #define KM_3270_ONLY 0x0010 /* used in 3270 mode only */ #define KM_NVT_ONLY 0x0020 /* used in NVT mode only */ #define KM_INACTIVE 0x0040 /* wrong NVT/3270 mode, or overridden */ #define KM_KEYMAP 0x8000 #define KM_HINTS (KM_CTRL|KM_ALT) typedef struct { int key; /* KEY_XXX or 0 */ int modifiers; /* KM_ALT */ ucs4_t ucs4; /* character value */ } k_t; struct keymap { struct keymap *next; struct keymap *successor; int ncodes; /* number of key codes */ k_t *codes; /* key codes */ int *hints; /* hints (flags) */ char *name; /* keymap name */ char *file; /* file path or resource name */ int line; /* keymap line number */ bool temp; /* temporary keymap? */ char *action; /* actions to perform */ }; #define IS_INACTIVE(k) ((k)->hints[0] & KM_INACTIVE) static struct keymap *master_keymap = NULL; static bool last_3270 = false; static bool last_nvt = false; static int lookup_ccode(const char *s); static void keymap_3270_mode(bool); #define codecmp(k1, k2, len) \ kvcmp((k1)->codes, (k2)->codes, len) static void read_one_keymap(const char *name, const char *fn, bool temp, const char *r0, int flags); static void clear_keymap(void); static void set_inactive(void); /* * Compare two k_t's. * Returns 0 if equal, nonzero if not. */ static int kcmp(k_t *a, k_t *b) { if (a->key && b->key && (a->key == b->key)) { return 0; } if (a->ucs4 && b->ucs4 && (a->ucs4 == b->ucs4) && (a->modifiers == b->modifiers)) { return 0; } /* Special case for both a and b empty. */ if (!a->key && !b->key && !a->ucs4 && !b->ucs4) { return 0; } return 1; } /* * Compare a vector of k_t's. */ static int kvcmp(k_t *a, k_t *b, int len) { int i; for (i = 0; i < len; i++) { if (kcmp(&a[i], &b[i])) return 1; } return 0; } /* * Parse a key definition. * Returns <0 for error, 1 for key found and parsed, 0 for nothing found. * Returns the balance of the string and the character code. * Is destructive. */ static int parse_keydef(char **str, k_t *ccode, int *hint) { char *s = *str; char *t; char *ks; int flags = 0; ks_t Ks; bool matched = false; ccode->key = 0; ccode->ucs4 = 0; ccode->modifiers = 0; /* Check for nothing. */ while (isspace((unsigned char)*s)) { s++; } if (!*s) { return 0; } *str = s; s = strstr(s, ""); if (s == NULL) { return -1; } ks = s + 5; *s = '\0'; s = *str; while (*s) { while (isspace((unsigned char)*s)) { s++; } if (!*s) { break; } if (!strncmp(s, "Alt", 3)) { ccode->modifiers |= KM_ALT; s += 3; } else if (!strncmp(s, "Ctrl", 4)) { flags |= KM_CTRL; s += 4; } else { return -2; } } s = ks; while (isspace((unsigned char)*s)) { s++; } if (!*s) { return -3; } t = s; while (*t && !isspace((unsigned char)*t)) { t++; } if (*t) { *t++ = '\0'; } if (!strncasecmp(s, "U+", 2) || !strncasecmp(s, "0x", 2)) { unsigned long u; char *ptr; /* Direct specification of Unicode. */ u = strtoul(s + 2, &ptr, 16); if (u == 0 || *ptr != '\0') { return -7; } ccode->ucs4 = (ucs4_t)u; matched = true; } if (!matched) { ucs4_t u; int consumed; enum me_fail error; /* * Convert local multibyte to Unicode. If the result is 1 * character in length, use that code. */ u = multibyte_to_unicode(s, strlen(s), &consumed, &error); if (u != 0 && (size_t)consumed == strlen(s)) { ccode->ucs4 = u; matched = true; } } if (!matched) { /* Try an HTML entity name or X11 keysym. */ Ks = string_to_key(s); if (Ks != KS_NONE) { ccode->ucs4 = Ks; matched = true; } } if (!matched) { int cc; /* Try for a curses key name. */ cc = lookup_ccode(s); if (cc == -1) { return -4; } if (flags || ccode->modifiers) { return -5; /* no Alt/Ctrl with KEY_XXX */ } ccode->key = cc; matched = true; } /* Apply Ctrl. */ if (ccode->ucs4) { if (flags & KM_CTRL) { if (ccode->ucs4 > 0x20 && ccode->ucs4 < 0x80) { ccode->ucs4 &= 0x1f; } else { return -6; /* Ctrl ASCII-7 only */ } } } /* Return the remaining string, and success. */ *str = t; *hint = flags; return 1; } static char *pk_errmsg[] = { "Missing ", "Unknown modifier", "Missing keysym", "Unknown keysym", "Can't use Ctrl or Alt modifier with curses symbol", "Ctrl modifier is restricted to ASCII-7 printable characters", "Invalid Unicode syntax" }; /* * Locate a keymap resource or file. * Returns 0 for do-nothing, 1 for success, -1 for error. * On success, returns the full name of the resource or file (which must be * freed) in '*fullname'. * On success, returns a resource string (which must be closed) or NULL * (indicating a file name to open is in *fullname) in '*r'. */ static int locate_keymap(const char *name, char **fullname, char **r) { char *rs; /* resource value */ char *fnx; /* expanded file name */ int a; /* access(fnx) */ /* Return nothing, to begin with. */ *fullname = NULL; *r = NULL; /* See if it's a resource. */ rs = get_fresource(ResKeymap ".%s", name); /* If there's a plain version, return it. */ if (rs != NULL) { *fullname = NewString(name); *r = NewString(rs); return 1; } /* See if it's a file. */ fnx = do_subst(name, DS_VARS | DS_TILDE); a = access(fnx, R_OK); /* If there's a plain version, return it. */ if (a == 0) { *fullname = fnx; return 1; } /* No dice. */ Free(fnx); return -1; } /* Add a keymap entry. */ static void add_keymap_entry(int ncodes, k_t *codes, int *hints, const char *name, const char *file, int line, bool temp, const char *action, struct keymap ***nextkp) { struct keymap *k; /* Allocate a new node. */ k = Malloc(sizeof(struct keymap)); k->next = NULL; k->successor = NULL; k->ncodes = ncodes; k->codes = Malloc(ncodes * sizeof(k_t)); (void) memcpy(k->codes, codes, ncodes * sizeof(k_t)); k->hints = Malloc(ncodes * sizeof(int)); (void) memcpy(k->hints, hints, ncodes * sizeof(int)); k->name = NewString(name); k->file = NewString(file); k->line = line; k->temp = temp; k->action = NewString(action); /* Link it in. */ **nextkp = k; *nextkp = &k->next; } /* * Read a keymap from a file. * Returns true for success, false for an error. * * Keymap files look suspiciously like x3270 keymaps, but aren't. */ static bool read_keymap(const char *name, bool temp) { char *name_3270 = xs_buffer("%s.3270", name); char *name_nvt = xs_buffer("%s.nvt", name); int rc, rc_3270, rc_nvt; char *fn, *fn_3270, *fn_nvt; char *r0, *r0_3270, *r0_nvt; if (master_keymap != NULL && !strcmp(name, master_keymap->name)) { popup_an_error("Duplicate keymap: %s", name); return false; } rc = locate_keymap(name, &fn, &r0); rc_3270 = locate_keymap(name_3270, &fn_3270, &r0_3270); rc_nvt = locate_keymap(name_nvt, &fn_nvt, &r0_nvt); if (rc < 0 && rc_3270 < 0 && rc_nvt < 0) { popup_an_error("No such keymap resource or file: %s", name); Free(name_3270); Free(name_nvt); return false; } if (rc >= 0) { read_one_keymap(name, fn, temp, r0, 0); Free(fn); Free(r0); } if (rc_3270 >= 0) { read_one_keymap(name_3270, fn_3270, temp, r0_3270, KM_3270_ONLY); Free(fn_3270); Free(r0_3270); } if (rc_nvt >= 0) { read_one_keymap(name_nvt, fn_nvt, temp, r0_nvt, KM_NVT_ONLY); Free(fn_nvt); Free(r0_nvt); } Free(name_3270); Free(name_nvt); return true; } /* * Read a keymap from a file. * Accumulates the keymap onto the list pointed to by nextkp. * Returns 0 for success, -1 for an error. * * Keymap files look suspiciously like x3270 keymaps, but aren't. */ static void read_one_keymap_internal(const char *name, const char *fn, bool temp, const char *r0, int flags, struct keymap ***nextkp) { char *r = NULL; /* resource value */ char *r_copy = NULL; /* initial value of r */ FILE *f = NULL; /* resource file */ char buf[1024]; /* file read buffer */ int line = 0; /* line number */ char *left, *right; /* chunks of line */ static int ncodes = 0; static int maxcodes = 0; static k_t *codes = NULL; static int *hints = NULL; int rc = 0; /* Find the resource or file. */ if (r0 != NULL) { r = r_copy = NewString(r0); } else { f = fopen(fn, "r"); if (f == NULL) { xs_warning("Cannot open file: %s", fn); return; } } while ((r != NULL)? (rc = split_dresource(&r, &left, &right)): fgets(buf, sizeof(buf), f) != NULL) { char *s; k_t ccode; int pkr; int hint; line++; /* Skip empty lines and comments. */ if (r == NULL) { s = buf; while (isspace((unsigned char)*s)) { s++; } if (!*s || *s == '!' || *s == '#') { continue; } } /* Split. */ if (rc < 0 || (r == NULL && split_dresource(&s, &left, &right) < 0)) { popup_an_error("Keymap %s, line %d: syntax error", fn, line); goto done; } pkr = parse_keydef(&left, &ccode, &hint); if (pkr == 0) { popup_an_error("Keymap %s, line %d: Missing ", fn, line); goto done; } if (pkr < 0) { popup_an_error("Keymap %s, line %d: %s", fn, line, pk_errmsg[-1 - pkr]); goto done; } /* Accumulate keycodes. */ ncodes = 0; do { if (++ncodes > maxcodes) { maxcodes = ncodes; codes = Realloc(codes, maxcodes * sizeof(k_t)); hints = Realloc(hints, maxcodes * sizeof(int)); } codes[ncodes - 1] = ccode; /* struct copy */ hints[ncodes - 1] = hint; pkr = parse_keydef(&left, &ccode, &hint); if (pkr < 0) { popup_an_error("Keymap %s, line %d: %s", fn, line, pk_errmsg[-1 - pkr]); goto done; } } while (pkr != 0); /* Add it to the list. */ hints[0] |= flags; add_keymap_entry(ncodes, codes, hints, name, fn, line, temp, right, nextkp); } done: Free(r_copy); if (f != NULL) { fclose(f); } } /* * Read a keymap from a file. * Adds the keymap to the front of the 'master_keymap' list. * Returns 0 for success, -1 for an error. */ static void read_one_keymap(const char *name, const char *fn, bool temp, const char *r0, int flags) { struct keymap *one_master; struct keymap **one_nextk; /* Read in the keymap. */ one_master = NULL; one_nextk = &one_master; read_one_keymap_internal(name, fn, temp, r0, flags, &one_nextk); if (one_master == NULL) { /* Nothing added. */ return; } if (master_keymap == NULL) { /* Something added, nothing there before. */ master_keymap = one_master; return; } /* Insert this keymap ahead of the previous ones. */ *one_nextk = master_keymap; master_keymap = one_master; } /* Multi-key keymap support. */ static struct keymap *current_match = NULL; static int consumed = 0; static char *ignore = "[ignore]"; /* Find the shortest keymap with a longer match than k. */ static struct keymap * longer_match(struct keymap *k, int nc) { struct keymap *j; struct keymap *shortest = NULL; for (j = master_keymap; j != NULL; j = j->next) { if (IS_INACTIVE(j)) { continue; } if (j != k && j->ncodes > nc && !codecmp(j, k, nc)) { if (j->ncodes == nc+1) { return j; } if (shortest == NULL || j->ncodes < shortest->ncodes) { shortest = j; } } } return shortest; } /* * Helper function that returns a keymap action, sets the status line, and * traces the result. * * If s is NULL, then this is a failed initial lookup. * If s is 'ignore', then this is a lookup in progress (k non-NULL) or a * failed multi-key lookup (k NULL). * Otherwise, this is a successful lookup. */ static char * status_ret(char *s, struct keymap *k) { /* Set the compose indicator based on the new value of current_match. */ if (k != NULL) { status_compose(true, ' ', KT_STD); } else { status_compose(false, 0, KT_STD); } if (s != NULL && s != ignore) { vtrace(" %s:%d -> %s\n", current_match->file, current_match->line, s); } if ((current_match = k) == NULL) { consumed = 0; } return s; } /* Timeout for ambiguous keymaps. */ static struct keymap *timeout_match = NULL; static ioid_t kto = NULL_IOID; static void key_timeout(ioid_t id _is_unused) { vtrace("Timeout, using shortest keymap match\n"); kto = NULL_IOID; current_match = timeout_match; push_keymap_action(status_ret(timeout_match->action, NULL)); timeout_match = NULL; } static struct keymap * ambiguous(struct keymap *k, int nc) { struct keymap *j; if ((j = longer_match(k, nc)) != NULL) { vtrace(" ambiguous keymap match, shortest is %s:%d, setting timeout\n", j->file, j->line); timeout_match = k; kto = AddTimeOut(500L, key_timeout); } return j; } /* * Look up an key in the keymap, return the matching action if there is one. * * This code implements the mutli-key lookup, by returning dummy actions for * partial matches. * * It also handles keyboards that generate ESC for the Alt key. */ char * lookup_key(int kcode, ucs4_t ucs4, int modifiers) { struct keymap *j, *k; int n_shortest = 0; k_t code; code.key = kcode; code.ucs4 = ucs4; code.modifiers = modifiers; /* If there's a timeout pending, cancel it. */ if (kto != NULL_IOID) { RemoveTimeOut(kto); kto = NULL_IOID; timeout_match = NULL; } /* If there's no match pending, find the shortest one. */ if (current_match == NULL) { struct keymap *shortest = NULL; for (k = master_keymap; k != NULL; k = k->next) { if (IS_INACTIVE(k)) continue; if (!kcmp(&code, &k->codes[0])) { if (k->ncodes == 1) { shortest = k; break; } if (shortest == NULL || k->ncodes < shortest->ncodes) { shortest = k; n_shortest++; } } } if (shortest != NULL) { current_match = shortest; consumed = 0; } else { return NULL; } } /* See if this character matches the next one we want. */ if (!kcmp(&code, ¤t_match->codes[consumed])) { consumed++; if (consumed == current_match->ncodes) { /* Final match. */ j = ambiguous(current_match, consumed); if (j == NULL) { return status_ret(current_match->action, NULL); } else { return status_ret(ignore, j); } } else { /* Keep looking. */ vtrace(" partial keymap match in %s:%d %s\n", current_match->file, current_match->line, (n_shortest > 1)? " and other(s)": ""); return status_ret(ignore, current_match); } } /* It doesn't. Try for a better candidate. */ for (k = master_keymap; k != NULL; k = k->next) { if (IS_INACTIVE(k)) { continue; } if (k == current_match) { continue; } if (k->ncodes > consumed && !codecmp(k, current_match, consumed) && !kcmp(&k->codes[consumed], &code)) { consumed++; if (k->ncodes == consumed) { j = ambiguous(k, consumed); if (j == NULL) { current_match = k; return status_ret(k->action, NULL); } else { return status_ret(ignore, j); } } else { return status_ret(ignore, k); } } } /* Complain. */ beep(); vtrace(" keymap lookup failure after partial match\n"); return status_ret(ignore, NULL); } static struct { const char *name; int code; } ncurses_key[] = { { "BREAK", KEY_BREAK }, { "DOWN", KEY_DOWN }, { "UP", KEY_UP }, { "LEFT", KEY_LEFT }, { "RIGHT", KEY_RIGHT }, { "HOME", KEY_HOME }, { "BACKSPACE", KEY_BACKSPACE }, { "F0", KEY_F0 }, { "DL", KEY_DL }, { "IL", KEY_IL }, { "DC", KEY_DC }, { "IC", KEY_IC }, { "EIC", KEY_EIC }, { "CLEAR", KEY_CLEAR }, { "EOS", KEY_EOS }, { "EOL", KEY_EOL }, { "SF", KEY_SF }, { "SR", KEY_SR }, { "NPAGE", KEY_NPAGE }, { "PPAGE", KEY_PPAGE }, { "STAB", KEY_STAB }, { "CTAB", KEY_CTAB }, { "CATAB", KEY_CATAB }, { "ENTER", KEY_ENTER }, { "SRESET", KEY_SRESET }, { "RESET", KEY_RESET }, { "PRINT", KEY_PRINT }, { "LL", KEY_LL }, { "A1", KEY_A1 }, { "A3", KEY_A3 }, { "B2", KEY_B2 }, { "C1", KEY_C1 }, { "C3", KEY_C3 }, { "BTAB", KEY_BTAB }, { "BEG", KEY_BEG }, { "CANCEL", KEY_CANCEL }, { "CLOSE", KEY_CLOSE }, { "COMMAND", KEY_COMMAND }, { "COPY", KEY_COPY }, { "CREATE", KEY_CREATE }, { "END", KEY_END }, { "EXIT", KEY_EXIT }, { "FIND", KEY_FIND }, { "HELP", KEY_HELP }, { "MARK", KEY_MARK }, { "MESSAGE", KEY_MESSAGE }, { "MOVE", KEY_MOVE }, { "NEXT", KEY_NEXT }, { "OPEN", KEY_OPEN }, { "OPTIONS", KEY_OPTIONS }, { "PREVIOUS", KEY_PREVIOUS }, { "REDO", KEY_REDO }, { "REFERENCE", KEY_REFERENCE }, { "REFRESH", KEY_REFRESH }, { "REPLACE", KEY_REPLACE }, { "RESTART", KEY_RESTART }, { "RESUME", KEY_RESUME }, { "SAVE", KEY_SAVE }, { "SBEG", KEY_SBEG }, { "SCANCEL", KEY_SCANCEL }, { "SCOMMAND", KEY_SCOMMAND }, { "SCOPY", KEY_SCOPY }, { "SCREATE", KEY_SCREATE }, { "SDC", KEY_SDC }, { "SDL", KEY_SDL }, { "SELECT", KEY_SELECT }, { "SEND", KEY_SEND }, { "SEOL", KEY_SEOL }, { "SEXIT", KEY_SEXIT }, { "SFIND", KEY_SFIND }, { "SHELP", KEY_SHELP }, { "SHOME", KEY_SHOME }, { "SIC", KEY_SIC }, { "SLEFT", KEY_SLEFT }, { "SMESSAGE", KEY_SMESSAGE }, { "SMOVE", KEY_SMOVE }, { "SNEXT", KEY_SNEXT }, { "SOPTIONS", KEY_SOPTIONS }, { "SPREVIOUS", KEY_SPREVIOUS }, { "SPRINT", KEY_SPRINT }, { "SREDO", KEY_SREDO }, { "SREPLACE", KEY_SREPLACE }, { "SRIGHT", KEY_SRIGHT }, { "SRSUME", KEY_SRSUME }, { "SSAVE", KEY_SSAVE }, { "SSUSPEND", KEY_SSUSPEND }, { "SUNDO", KEY_SUNDO }, { "SUSPEND", KEY_SUSPEND }, { "UNDO", KEY_UNDO }, { NULL, 0 } }; /* Look up a curses symbolic key. */ static int lookup_ccode(const char *s) { int i; unsigned long f; char *ptr; for (i = 0; ncurses_key[i].name != NULL; i++) { if (!strcasecmp(s, ncurses_key[i].name)) { return ncurses_key[i].code; } } if (s[0] == 'F' && (f = strtoul(s + 1, &ptr, 10)) < 64 && ptr != s + 1 && *ptr == '\0') { return KEY_F(f); } return -1; } /* Look up a curses key code. */ static const char * lookup_cname(int ccode) { int i; for (i = 0; ncurses_key[i].name != NULL; i++) { if (ccode == ncurses_key[i].code) { return ncurses_key[i].name; } } for (i = 0; i < 64; i++) { if (ccode == KEY_F(i)) { static char buf[10]; (void) sprintf(buf, "F%d", i); return buf; } } return NULL; } /** * Free a temporary keymap entry. */ static void free_keymap(struct keymap *k) { Free(k->codes); Free(k->hints); Free(k->name); Free(k->file); Free(k->action); Free(k); } /** * Push or pop a temporary keymap. */ static bool Keymap_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Keymap", ia, argc, argv); if (check_argc("Keymap", argc, 0, 1) < 0) { return false; } if (argc > 0) { /* Push this keymap. */ if (!read_keymap(argv[0], true)) { return false; } /* Set the inactive flags. */ set_inactive(); } else { struct keymap *k; char *km_name = NULL; if (master_keymap == NULL || !master_keymap->temp) { return true; } km_name = NewString(master_keymap->name); /* Pop the top keymap. */ while ((k = master_keymap) != NULL) { if (!k->temp || strcmp(k->name, km_name)) { break; } master_keymap = k->next; free_keymap(k); } Free(km_name); /* Set the inactive flags. */ set_inactive(); } return true; } /** * Keymap module registrations. */ void keymap_register(void) { static action_table_t keymap_actions[] = { { "Keymap", Keymap_action, ACTION_KE }, { "TemporaryKeymap", Keymap_action, ACTION_KE } }; /* Register for state changes. */ register_schange(ST_3270_MODE, keymap_3270_mode); register_schange(ST_CONNECT, keymap_3270_mode); /* Register the actions. */ register_actions(keymap_actions, array_count(keymap_actions)); } /* Read each of the keymaps specified by the keymap resource. */ void keymap_init(void) { char *s0, *s; char *comma; /* In case this is a subsequent call, wipe out the current keymap. */ clear_keymap(); /* Read the base keymap. */ (void) read_keymap("base", false); /* Read the user-defined keymaps. */ if (appres.interactive.key_map != NULL) { s = s0 = NewString(appres.interactive.key_map); while ((comma = strchr(s, ',')) != NULL) { *comma = '\0'; if (*s) { (void) read_keymap(s, false); } s = comma + 1; } if (*s) { (void) read_keymap(s, false); } Free(s0); } last_3270 = IN_3270; last_nvt = IN_NVT; set_inactive(); } /* Erase the current keymap. */ static void clear_keymap(void) { struct keymap *k, *next; for (k = master_keymap; k != NULL; k = next) { next = k->next; free_keymap(k); } master_keymap = NULL; } /* Set the inactive flags for the current keymap. */ static void set_inactive(void) { struct keymap *k, *j; /* Clear the inactive flags and successors. */ for (k = master_keymap; k != NULL; k = k->next) { k->hints[0] &= ~KM_INACTIVE; k->successor = NULL; } /* Turn off elements which have the wrong mode. */ for (k = master_keymap; k != NULL; k = k->next) { /* If the mode is wrong, turn it off. */ if ((!last_3270 && (k->hints[0] & KM_3270_ONLY)) || (!last_nvt && (k->hints[0] & KM_NVT_ONLY))) { k->hints[0] |= KM_INACTIVE; } } /* Compute superceded entries. */ for (k = master_keymap; k != NULL; k = k->next) { if (k->hints[0] & KM_INACTIVE) { continue; } for (j = k->next; j != NULL; j = j->next) { if (j->hints[0] & KM_INACTIVE) { continue; } /* It may supercede other entries. */ if (j->ncodes == k->ncodes && !codecmp(j, k, k->ncodes)) { j->hints[0] |= KM_INACTIVE; j->successor = k; } } } } /* 3270/NVT mode change. */ static void keymap_3270_mode(bool ignored _is_unused) { if (last_3270 != IN_3270 || last_nvt != IN_NVT) { last_3270 = IN_3270; last_nvt = IN_NVT; set_inactive(); } } /* * Decode a key. * Accepts a hint as to which form was used to specify it, if it came from a * keymap definition. */ const char * decode_key(int k, ucs4_t ucs4, int hint, char *buf) { const char *n; int len; char mb[16]; char *s = buf; if (k) { /* Curses key. */ if ((n = lookup_cname(k)) != NULL) { (void) sprintf(buf, "%s", n); } else { (void) sprintf(buf, "[unknown curses key 0x%x]", k); } return buf; } if (hint & KM_ALT) { s += sprintf(s, "Alt"); } if (ucs4 < ' ') { /* Control key. */ char *latin1_name = key_to_string(ucs4); if (latin1_name != NULL) { strcpy(buf, latin1_name); } else { (void) sprintf(s, "Ctrl%c", (int)(ucs4 + '@') & 0xff); } return buf; } /* Special-case ':' and ' ' because of the keymap syntax. */ if (ucs4 == ':') { strcpy(s, "colon"); return buf; } if (ucs4 == ' ') { strcpy(s, "space"); return buf; } /* Convert from Unicode to local multi-byte. */ len = unicode_to_multibyte(ucs4, mb, sizeof(mb)); if (len > 0) { sprintf(s, "%s", mb); } else { sprintf(s, "U+%04x", k); } return buf; } /* Dump the current keymap. */ void keymap_dump(void) { struct keymap *k; for (k = master_keymap; k != NULL; k = k->next) { if (k->successor != NULL) { action_output("[%s:%d%s] -- superceded by %s:%d --", k->file, k->line, k->temp? " temp": "", k->successor->file, k->successor->line); } else if (!IS_INACTIVE(k)) { int i; char buf[1024]; char *s = buf; char dbuf[128]; char *t = safe_string(k->action); for (i = 0; i < k->ncodes; i++) { s += sprintf(s, " %s", decode_key(k->codes[i].key, k->codes[i].ucs4, (k->hints[i] & KM_HINTS) | KM_KEYMAP | k->codes[i].modifiers, dbuf)); } action_output("[%s:%d%s]%s: %s", k->file, k->line, k->temp? " temp": "", buf, t); Free(t); } } } suite3270-3.6/Common/c3270/keypad.c0000664000076500007650000002753713221577163014621 0ustar pdmpdm/* * Copyright (c) 2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * keypad.c * A curses-based 3270 Terminal Emulator * Pop-up keypad */ #include "globals.h" #include "actions.h" #include "macros.h" #include "3270ds.h" #include "appres.h" #include "ckeypad.h" #include "cmenubar.h" #include "ctlrc.h" #if !defined(_WIN32) /*[*/ # if defined(HAVE_NCURSESW_NCURSES_H) /*[*/ # include # elif defined(HAVE_NCURSES_NCURSES_H) /*][*/ # include # elif defined(HAVE_NCURSES_H) /*][*/ # include # else /*][*/ # include # endif /*]*/ #endif /*]*/ /* Sensitivity map: A rectangular region and a callback function. */ typedef struct { unsigned char ul_x, ul_y; /* upper left corner */ unsigned char lr_x, lr_y; /* lower right corner */ char *callback; /* callback macro string */ } sens_t; /* Keymap descriptor for one character cell. */ typedef struct { unsigned char literal; /* literal character, or 0 */ unsigned char outline; /* box-drawing character (ACS notation) */ sens_t *sens; /* sensitivity map element, for highlighting */ } keypad_desc_t; /* Pull in the compiled keypad structures (sens, keypad_desc). */ #include "compiled_keypad.h" #define KEYPAD_HEIGHT (sizeof(keypad_desc)/sizeof(keypad_desc[0])) #define NUM_SENSE (sizeof(sens)/sizeof(sens[0])) static sens_t *current_sens = NULL; #if defined(XXX_DEBUG) || defined(YYY_DEBUG) || defined(ZZZ_DEBUG) static FILE *xxx = NULL; #endif /* Return the keypad character on top of the screen. */ bool keypad_char(int row, int col, ucs4_t *u, bool *highlighted, unsigned char *acs) { keypad_desc_t *d; if ((menu_is_up & KEYPAD_IS_UP) && (unsigned)row < KEYPAD_HEIGHT && col < MODEL_2_COLS) { d = &keypad_desc[row][col]; if (d->outline && d->outline != ' ') { map_acs(d->outline, u, acs); *highlighted = (d->sens != NULL) && (d->sens == current_sens); #ifdef XXX_DEBUG fprintf(xxx, "row %d col %d outline 0x%x !highlight\n", row, col, *u); #endif return true; } if (d->literal) { *u = d->literal; *highlighted = (d->sens != NULL) && (d->sens == current_sens); #ifdef XXX_DEBUG fprintf(xxx, "row %d col %d literal '%c' d->sens %p " "%s current_sens %p %s\n", row, col, *u, (void *)d->sens, d->sens? d->sens->callback: "(null)", (void *)current_sens, current_sens->callback); #endif return true; } } *u = 0; *highlighted = false; return false; } /* Report where to land the cursor when the keypad is up. */ void keypad_cursor(int *row, int *col) { if (menu_is_up & KEYPAD_IS_UP) { *row = current_sens->ul_y; *col = current_sens->ul_x; } else { *row = 0; *col = 0; } } /* Pop up the keypad. */ void pop_up_keypad(bool up) { if (up) { menu_is_up |= KEYPAD_IS_UP; current_sens = &sens[0]; #if defined(XXX_DEBUG) || defined(YYY_DEBUG) || defined(ZZZ_DEBUG) if (xxx == NULL) { xxx = fopen("/tmp/ccc", "a"); if (xxx == NULL) { perror("/tmp/ccc"); exit(1); } } #endif } else { menu_is_up &= ~KEYPAD_IS_UP; current_sens = NULL; } screen_changed = true; } /* * Find the center of a button. We deliberately round *up* here, so that when * two centers are compared, the bias is up and to the left. * * Here's the picture: * 0 +-----+ * 1 | a | * 2 | | +------+ * 3 +-----+ | c | * 4 | b | +------+ * 5 | | * 6 +-----+ * * We want 'a' to be chosen when going left from 'c'. * We round up to make the center of 'a' 2 (not 1), and the center of 'b' 5 * (not 4). The center of 'c' is 3. * Because of the round-up, 'a' is better centered than 'b'. */ static int find_center_x(sens_t *s) { return s->ul_x + ((s->lr_x - s->ul_x + 1) / 2); } static int find_center_y(sens_t *s) { return s->ul_y + ((s->lr_y - s->ul_y + 1) / 2); } /* * Find the best adjacent button. xinc and yinc indicate the search direction: * xinc yinc direction * 0 -1 up * 0 +1 down * -1 0 left * +1 0 right */ static void find_adjacent(int xinc, int yinc) { int ul_x, lr_x, ul_y, lr_y; # define N_MATCH 4 sens_t *matches[N_MATCH]; int n_matched = 0; if (yinc) { /* Searching up or down. Spread x out. */ ul_x = current_sens->ul_x - 1; lr_x = current_sens->lr_x + 1; if (yinc < 0) { /* Up. */ ul_y = current_sens->ul_y - 1; lr_y = current_sens->ul_y - 1; } else { /* Down. */ ul_y = current_sens->lr_y + 1; lr_y = current_sens->lr_y + 1; } } else { /* Searching left or right. Spread y out. */ ul_y = current_sens->ul_y - 1; lr_y = current_sens->lr_y + 1; if (xinc < 0) { /* Left. */ ul_x = current_sens->ul_x - 1; lr_x = current_sens->ul_x - 1; } else { /* Right. */ ul_x = current_sens->lr_x + 1; lr_x = current_sens->lr_x + 1; } } #if defined(YYY_DEBUG) fprintf(xxx, "ul_y %d ul_x %d lr_y %d lr_x %d\n", ul_y, ul_x, lr_y, lr_x); fflush(xxx); #endif while (true) { int x, y; for (y = ul_y; y <= lr_y; y++) { for (x = ul_x; x <= lr_x; x++) { #if defined(YYY_DEBUG) fprintf(xxx, "searching row %d col %d\n", x, y); fflush(xxx); #endif if (keypad_desc[y][x].sens != NULL && n_matched < N_MATCH) { int i; for (i = 0; i < n_matched; i++) { if (matches[i] == keypad_desc[y][x].sens) break; } if (i >= n_matched) { matches[n_matched++] = keypad_desc[y][x].sens; } } } } if (n_matched) { int i; #if defined(ZZZ_DEBUG) fprintf(xxx, "%d matches:", n_matched); for (i = 0; i < n_matched; i++) { fprintf(xxx, " %s", matches[i]->callback); } fprintf(xxx, "\n"); fflush(xxx); #endif if (n_matched == 0) current_sens = matches[0]; else { int overlap[N_MATCH]; int center[N_MATCH]; int best_o = -1; int best_c = -1; int tie = 0; int curr_center; /* Find the best match. */ for (i = 0; i < n_matched; i++) { int j; overlap[i] = 0; if (yinc) { /* * Scanning up/down, measure X * overlap. */ for (j = matches[i]->ul_x; j <= matches[i]->lr_x; j++) { if (j >= ul_x && j <= lr_x) { overlap[i]++; } if (j >= ul_x + 1 && j <= lr_x - 1) { overlap[i]++; } } } else { /* * Scanning left/right, measure * Y overlap. */ for (j = matches[i]->ul_y; j <= matches[i]->lr_y; j++) { if (j >= ul_y && j <= lr_y) { overlap[i]++; } if (j >= ul_y + 1 && j <= lr_y - 1) { overlap[i]++; } } } } for (i = 0; i < n_matched; i++) { if (best_o < 0 || overlap[i] > overlap[best_o]) best_o = i; } for (i = 0; i < n_matched; i++) { if (i != best_o && overlap[i] == overlap[best_o]) tie++; if (yinc) center[i] = find_center_x(matches[i]); else center[i] = find_center_y(matches[i]); } #if defined(ZZZ_DEBUG) fprintf(xxx, "overlaps:"); for (i = 0; i < n_matched; i++) { fprintf(xxx, " %d", overlap[i]); if (i == best_o) fprintf(xxx, "*"); } fprintf(xxx, ", tie %d\n", tie); fflush(xxx); #endif if (tie) { /* * Pick the best-centered match. * That's the one whose center is * closest to the center of the current * button. */ if (yinc) curr_center = find_center_x(current_sens); else curr_center = find_center_y(current_sens); #if defined(ZZZ_DEBUG) fprintf(xxx, "curr_center is %d\n", curr_center); fflush(xxx); #endif for (i = 0; i < n_matched; i++) { if (overlap[i] == overlap[best_o]) { if (best_c < 0 || abs(curr_center - center[i]) < abs(curr_center - center[best_c])) { #if defined(ZZZ_DEBUG) fprintf(xxx, "center '%s' (%d) is better\n", matches[i]->callback, center[i]); fflush(xxx); #endif best_c = i; } } } current_sens = matches[best_c]; } else current_sens = matches[best_o]; } break; } /* Keep looking. */ ul_x += xinc; lr_x += xinc; ul_y += yinc; lr_y += yinc; if (ul_x < 0 || lr_x >= MODEL_2_COLS || ul_y < 0 || (size_t)lr_y >= KEYPAD_HEIGHT) break; } } #if defined(_WIN32) /*[*/ void keypad_click(int x, int y) { size_t i; if (!(menu_is_up & KEYPAD_IS_UP)) return; /* Find it. */ for (i = 0; i < NUM_SENSE; i++) { if (x >= sens[i].ul_x && y >= sens[i].ul_y && x <= sens[i].lr_x && y <= sens[i].lr_y) { push_macro(sens[i].callback, false); break; } } pop_up_keypad(false); } #endif /*]*/ /* Process a key event while the keypad is up. */ void keypad_key(int k, ucs4_t u) { if (!(menu_is_up & KEYPAD_IS_UP)) return; switch (k) { #if defined(NCURSES_MOUSE_VERSION) /*[*/ case MK_MOUSE: { MEVENT m; size_t i; if (getmouse(&m) != OK) return; if (!(m.bstate & (BUTTON1_PRESSED || BUTTON1_RELEASED))) return; /* Find it. */ for (i = 0; i < NUM_SENSE; i++) { if (m.x >= sens[i].ul_x && m.y >= sens[i].ul_y && m.x <= sens[i].lr_x && m.y <= sens[i].lr_y) { push_macro(sens[i].callback, false); break; } } pop_up_keypad(false); break; } #endif /*]*/ case MK_UP: find_adjacent(0, -1); break; case MK_DOWN: find_adjacent(0, 1); break; case MK_LEFT: find_adjacent(-1, 0); break; case MK_RIGHT: find_adjacent(1, 0); break; case MK_HOME: /* Find the first entry. */ current_sens = &sens[0]; break; case MK_END: /* Find the last entry. */ current_sens = &sens[NUM_SENSE - 1]; break; case MK_ENTER: push_macro(current_sens->callback, false); pop_up_keypad(false); break; case MK_NONE: switch (u) { case '\r': case '\n': push_macro(current_sens->callback, false); break; default: break; } pop_up_keypad(false); break; default: case MK_OTHER: pop_up_keypad(false); break; } screen_changed = true; } bool Keypad_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Keypad", ia, argc, argv); if (check_argc("Keypad", argc, 0, 0) < 0) { return false; } pop_up_keypad(true); return true; } /** * Keypad module registration. */ void keypad_register(void) { static action_table_t keypad_actions[] = { { "Keypad", Keypad_action, ACTION_KE } }; /* Register the actions. */ register_actions(keypad_actions, array_count(keypad_actions)); } suite3270-3.6/Common/c3270/keypad.callbacks0000664000076500007650000000060513221577163016301 0ustar pdmpdma PA(1) b PA(2) c Attn d PA(3) e EraseEOF f EraseInput g SysReq h Clear i Home j CursorSelect k Compose l Insert m Delete n Dup o FieldMark q Tab r Reset s BackTab t Newline u Enter v PF(13) w PF(14) x PF(15) y PF(16) z PF(17) A PF(18) B PF(19) C PF(20) D PF(21) E PF(22) F PF(23) G PF(24) H PF(1) I PF(2) J PF(3) K PF(4) L PF(5) M PF(6) N PF(7) O PF(8) P PF(9) Q PF(10) R PF(11) S PF(12) suite3270-3.6/Common/c3270/keypad.full0000664000076500007650000000215613221577163015327 0ustar pdmpdm +--+--+--+--+--+--+--+--+--+--+--+--+ +------+------+ PF-|13|14|15|16|17|18|19|20|21|22|23|24| +------+------+ | PA1 | PA2 | +--+--+--+--+--+--+--+--+--+--+--+--+ | Home | | | | | PF-| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12| | | | +------+------+ +--+--+--+--+--+--+--+--+--+--+--+--+ +------+------+ | Attn | PA3 | |Cursor|Cmpose| | | | +-------+ +-------+ |Select| | +------+------+ | -->| | | |<-- | +------+------+ |Erase |Erase | +-------+ +-------+ |Insert|Delete| | EOF |Input | | | | | | | +------+------+ | <-+ | +------+------+ | Sys |Clear | +-------+ | Dup |Field | | Req | | +-------+ +-------+ | | Mark | +------+------+ | Reset | | Enter | +------+------+ +-------+ +-------+ suite3270-3.6/Common/c3270/keypad.labels0000664000076500007650000000233613221577163015627 0ustar pdmpdm PF- 13 14 15 16 17 18 19 20 21 22 23 24 PA1 PA2 Home PF- 1 2 3 4 5 6 7 8 9 10 11 12 Attn PA3 Cursor Cmpose Select > < Erase Erase Insert Delete EOF Input < Sys Clear Dup Field Req Mark Reset Enter suite3270-3.6/Common/c3270/keypad.map0000664000076500007650000000215713221577163015143 0ustar pdmpdm vv ww xx yy zz AA BB CC DD EE FF GG aaaaaa bbbbbb iiiiii aaaaaa bbbbbb HH II JJ KK LL MM NN OO PP QQ RR SS iiiiii cccccc dddddd jjjjjj kkkkkk cccccc dddddd jjjjjj kkkkkk qqqqqqq sssssss eeeeee ffffff llllll mmmmmm eeeeee ffffff ttttttt llllll mmmmmm ttttttt gggggg hhhhhh nnnnnn oooooo gggggg hhhhhh nnnnnn oooooo rrrrrrr uuuuuuu suite3270-3.6/Common/c3270/keypad.outline0000664000076500007650000000233613221577163016044 0ustar pdmpdm sssssssssssssssss slqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqwqqks sssssssssssssssss slqqqqqqwqqqqqqkss sx x x x x x x x x x x x xs slqqqqqqwqqqqqqks sx x xs stqqnqqnqqnqqnqqnqqnqqnqqnqqnqqnqqnqqus sx xssssssxs sx x xss sx x x x x x x x x x x x xs sx xssssssxs stqqqqqqnqqqqqqus smqqvqqvqqvqqvqqvqqvqqvqqvqqvqqvqqvqqjs stqqqqqqnqqqqqqus sx x xs sssssssssssssssssssssssssssssssssssssss sx x xs sx x xs slqqqqqqqks slqqqqqqqks sx x xs stqqqqqqnqqqqqqus sx qq x xs sx x qq xs stqqqqqqnqqqqqqus sx x xs smqqqqqqqjs stqqqqqqqus sx x xs sx x xs sx x xs sx x xs stqqqqqqnqqqqqqus sx qj xs stqqqqqqnqqqqqqus sx x xs sssssssssss smqqqqqqqjs sx x xs sx x xs slqqqqqqqks slqqqqqqqks sx x xs smqqqqqqvqqqqqqjs sx xs sx xs smqqqqqqvqqqqqqjs sssssssssssssssss smqqqqqqqjs smqqqqqqqjs sssssssssssssssss sssssssssss sssssssssss suite3270-3.6/Common/c3270/localdefs.h0000664000076500007650000000374013221577163015273 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * localdefs.h * Local definitions for c3270. * * This file contains definitions for environment-specific * facilities, such as memory allocation, I/O registration, * and timers. */ /* Identify ourselves. */ #define C3270 1 #if defined(_WIN32) /*[*/ # define WC3270 1 #endif /*]*/ /* Conditional 80/132 mode switch support. */ #if defined(BROKEN_NEWTERM) || defined(_WIN32) /*[*/ #undef C3270_80_132 #else /*][*/ #define C3270_80_132 1 #endif /*]*/ suite3270-3.6/Common/c3270/menubar.c0000664000076500007650000006216413221577163014770 0ustar pdmpdm/* * Copyright (c) 2010-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * menubar.c * A curses-based 3270 Terminal Emulator * Menu system */ #include "globals.h" #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "ctlr.h" #include "actions.h" #include "charset.h" #include "ckeypad.h" #include "cmenubar.h" #include "cscreen.h" #include "ctlrc.h" #include "glue.h" #include "host.h" #include "keymap.h" #include "kybd.h" #include "macros.h" #include "menubar.h" #include "popups.h" #include "screen.h" #include "toggles.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #if defined(_WIN32) /*[*/ # include "wc3270.h" #endif /*]*/ #if !defined(_WIN32) /*[*/ # if defined(HAVE_NCURSESW_NCURSES_H) /*[*/ # include # elif defined(HAVE_NCURSES_NCURSES_H) /*][*/ # include # elif defined(HAVE_NCURSES_H) /*][*/ # include # else /*][*/ # include # endif /*]*/ #endif /*]*/ /* * The menus look like this: * * File Options Keymap * +----------+ * | Fubar | * |*Grill | * | Woohoo | * +----------+ */ #define MENU_WIDTH 10 typedef void (*menu_callback)(void *); typedef struct cmenu_item { struct cmenu_item *next; /* Next item in list. */ struct cmenu_item *prev; /* Next item in list. */ char *label; /* What to display. */ bool enabled; menu_callback action; /* What to do. */ void *param; /* Callback parameter. */ struct cmenu *cmenu; /* Backpointer to cmenu. */ } cmenu_item_t; typedef struct cmenu { struct cmenu *next; /* Next menu in list. */ struct cmenu *prev; char *title; /* Menu title. */ int offset; size_t width; menu_callback callback; void *param; cmenu_item_t *items; /* Items. */ cmenu_item_t *last; /* Last item. */ } cmenu_t; cmenu_t *menus; /* List of menus. */ cmenu_t *menu_last; /* Last menu. */ int current_offset; /* Offset to next menu. */ cmenu_t *current_menu; /* Currently displayed menu. */ cmenu_item_t*current_item; /* Currently highlighted item. */ menu_callback after_callback; void *after_param; ucs4_t menu_screen[MODEL_2_COLS * MODEL_2_ROWS]; unsigned char menu_rv[MODEL_2_COLS * MODEL_2_ROWS]; unsigned char menu_acs[MODEL_2_COLS * MODEL_2_ROWS]; ucs4_t menu_topline[MODEL_2_COLS]; unsigned menu_is_up = 0; /* Add a menu. */ cmenu_t * add_menu(char *title) { cmenu_t *c; c = (cmenu_t *)Malloc(sizeof(cmenu_t) + strlen(title) + 1); c->title = (char *)(c + 1); c->offset = current_offset; c->width = strlen(title) + 2; current_offset += MENU_WIDTH; strcpy(c->title, title); c->callback = NULL; c->param = NULL; c->items = NULL; c->last = NULL; c->prev = menu_last; c->next = NULL; if (menu_last != NULL) { menu_last->next = c; } else { menus = c; } menu_last = c; return c; } /* Add an item to a menu. */ cmenu_item_t * add_item(cmenu_t *cmenu, char *label, void (*action)(void *), void *param) { cmenu_item_t *i; i = (cmenu_item_t *)Malloc(sizeof(cmenu_item_t)); i->label = Malloc(strlen(label) + 1); strcpy(i->label, label); i->action = action; i->param = param; i->enabled = true; i->next = NULL; i->prev = cmenu->last; i->cmenu = cmenu; if (cmenu->last) { cmenu->last->next = i; } else { cmenu->items = i; } cmenu->last = i; if (strlen(label) + 2 > cmenu->width) { cmenu->width = strlen(label) + 2; } return i; } void enable_item(cmenu_item_t *i, bool enabled) { i->enabled = enabled; /* TODO: Do more here. */ } void rename_item(cmenu_item_t *i, char *name) { Replace(i->label, NewString(name)); if (strlen(name) + 2 > i->cmenu->width) { i->cmenu->width = strlen(name) + 2; } } void set_callback(cmenu_t *cmenu, void (*callback)(void *), void *param) { cmenu->callback = callback; cmenu->param = param; } void basic_menu_init(void) { memset(menu_screen, 0, sizeof(ucs4_t) * MODEL_2_COLS * MODEL_2_ROWS); memset(menu_rv, 0, sizeof(unsigned char) * MODEL_2_COLS * MODEL_2_ROWS); current_menu = NULL; current_item = NULL; menu_is_up &= ~MENU_IS_UP; pop_up_keypad(false); screen_changed = true; } /* Undraw a menu. */ void undraw_menu(cmenu_t *cmenu) { int row, col; cmenu_item_t *i; screen_changed = true; /* Unhighlight the menu title. */ for (col = cmenu->offset; col < cmenu->offset + MENU_WIDTH; col++) { menu_rv[(0 * MODEL_2_COLS) + col] = false; } if (!cmenu->items) { return; } /* Erase the top border. */ row = 1; for (col = cmenu->offset; (size_t)col < cmenu->offset + cmenu->width; col++) { menu_screen[(row * MODEL_2_COLS) + col] = 0; } /* Erase the menu items. */ row = 2; for (i = cmenu->items; i != NULL; i = i->next) { col = cmenu->offset; while ((size_t)col < cmenu->offset + cmenu->width + 2) { menu_screen[(row * MODEL_2_COLS) + col] = 0; menu_rv[(row * MODEL_2_COLS) + col] = false; col++; } row++; } /* Erase the bottom border. */ for (col = cmenu->offset; (size_t)col < cmenu->offset + cmenu->width; col++) { menu_screen[(row * MODEL_2_COLS) +col] = 0; } } /* Draw a menu. */ void draw_menu(cmenu_t *cmenu) { int row, col; cmenu_item_t *i; screen_changed = true; /* Highlight the title. */ row = 0; for (col = cmenu->offset; col < cmenu->offset + MENU_WIDTH - 1; col++) { menu_rv[(row * MODEL_2_COLS) + col] = true; } if (!cmenu->items) { return; } /* Draw the top border. */ row = 1; for (col = cmenu->offset; (size_t)col < cmenu->offset + cmenu->width; col++) { int ix = (row * MODEL_2_COLS) + col; if (col == cmenu->offset) { map_acs('l', &menu_screen[ix], &menu_acs[ix]); } else if ((size_t)col < cmenu->offset + cmenu->width - 1) { map_acs('q', &menu_screen[ix], &menu_acs[ix]); } else { map_acs('k', &menu_screen[ix], &menu_acs[ix]); } } /* Draw the items. */ row = 2; for (i = cmenu->items; i != NULL; i = i->next) { char *d; col = cmenu->offset; map_acs('x', &menu_screen[(row * MODEL_2_COLS) + col], &menu_acs[(row * MODEL_2_COLS) + col]); col++; /* start at column one */ for (d = i->label; *d; d++) { menu_screen[(row * MODEL_2_COLS) + col] = *d & 0xff; menu_rv[(row * MODEL_2_COLS) + col] = (i == current_item); col++; } while ((size_t)col < cmenu->offset + cmenu->width - 1) { menu_screen[(row * MODEL_2_COLS) + col] = ' '; menu_rv[(row * MODEL_2_COLS) + col] = (i == current_item); col++; } map_acs('x', &menu_screen[(row * MODEL_2_COLS) + col], &menu_acs[(row * MODEL_2_COLS) + col]); row++; } /* Draw the bottom border. */ for (col = cmenu->offset; (size_t)col < cmenu->offset + cmenu->width; col++) { int ix = (row * MODEL_2_COLS) + col; if (col == cmenu->offset) { map_acs('m', &menu_screen[ix], &menu_acs[ix]); } else if ((size_t)col < cmenu->offset + cmenu->width - 1) { map_acs('q', &menu_screen[ix], &menu_acs[ix]); } else { map_acs('j', &menu_screen[ix], &menu_acs[ix]); } } } /* Pop up a menu. */ void popup_menu(int x, int click) { cmenu_t *cmenu; cmenu_t *c; int row, col; int next_col; if (!appres.interactive.menubar) { return; } /* Find which menu to start with. */ for (cmenu = menus; cmenu != NULL; cmenu = cmenu->next) { if (x >= cmenu->offset && x < cmenu->offset + MENU_WIDTH) { break; } } if (cmenu == NULL) { return; } /* If it was a direct click, see if the menu has a direct callback. */ if (click && cmenu->callback != NULL) { (*cmenu->callback)(cmenu->param); if (after_callback != NULL) { (*after_callback)(after_param); after_callback = NULL; after_param = NULL; } return; } /* Start with nothing. */ basic_menu_init(); /* * Draw the menu names on the top line, with the active one highlighted. */ row = 0; col = 0; next_col = MENU_WIDTH; for (c = menus; c != NULL; c = c->next) { char *d; for (d = c->title; *d; d++) { menu_screen[(row * MODEL_2_COLS) + col] = *d & 0xff; menu_rv[(row * MODEL_2_COLS) + col] = (c == cmenu); col++; } while (col < next_col) { menu_screen[(row * MODEL_2_COLS) + col] = ' '; col++; } next_col += MENU_WIDTH; } current_menu = cmenu; /* Draw the current menu, with the active item highlighted. */ if (cmenu->items) { current_item = cmenu->items; while (current_item && !current_item->enabled) { current_item = current_item->next; } draw_menu(cmenu); } else { current_item = NULL; } /* We're up. */ menu_is_up |= MENU_IS_UP; } #if defined(NCURSES_MOUSE_VERSION) || defined(_WIN32) /*[*/ /* * Find a mouse click in the menu hierarchy and act on it. * * Returns true if the coordinates are on a menu somewhere, false otherwise. */ bool find_mouse(int x, int y) { cmenu_t *c = NULL; cmenu_item_t *i = NULL; int row; /* It's gotta be in the ballpark. */ if (x >= MODEL_2_COLS || y >= MODEL_2_ROWS || menu_screen[(y * MODEL_2_COLS) + x] == 0) { return false; } if (y == 0) { /* Menu title. */ for (c = menus; c != NULL; c = c->next) { if (x >= c->offset && x < c->offset + MENU_WIDTH) { if (c == current_menu) { return false; } if (c->items == NULL) { goto selected; } if (c == current_menu) { return true; } undraw_menu(current_menu); current_menu = c; current_item = current_menu->items; while (current_item && !current_item->enabled) { current_item = current_item->next; } draw_menu(current_menu); return true; } } return false; } if (x < current_menu->offset || (size_t)x > current_menu->offset + current_menu->width) { return false; } if (y == 1) { /* top border */ return true; } row = 2; for (i = current_menu->items; i != NULL; i = i->next) { if (y == row) { break; } row++; } if (i != NULL) { if (i->enabled) { goto selected; } else { return true; } } if (y == row + 1) { return true; } return false; selected: if (i == NULL) { if (c->callback) { (*c->callback)(c->param); } } else { (*i->action)(i->param); } basic_menu_init(); if (after_callback != NULL) { (*after_callback)(after_param); after_callback = NULL; after_param = NULL; } return true; } #endif /*]*/ #if defined(_WIN32) /*[*/ void menu_click(int x, int y) { if (menu_is_up & KEYPAD_IS_UP) { keypad_click(x, y); return; } if (!find_mouse(x, y)) { basic_menu_init(); } } #endif /*]*/ /* * Handle a key event for a menu. * With ncurses, this can include mouse events. */ void menu_key(menu_key_t k, ucs4_t u) { cmenu_item_t *i; bool selected = false; if (menu_is_up & KEYPAD_IS_UP) { keypad_key(k, u); return; } switch (k) { #if defined(NCURSES_MOUSE_VERSION) /*[*/ case MK_MOUSE: { MEVENT m; if (getmouse(&m) != OK) { return; } if (!(m.bstate & (BUTTON1_PRESSED || BUTTON1_RELEASED))) { return; } /* See if it lands somewhere we can figure out. */ if (!find_mouse(m.x, m.y)) { basic_menu_init(); } break; } #endif /*]*/ case MK_UP: i = current_item; if (current_item && current_item->prev) { current_item = current_item->prev; while (current_item && !current_item->enabled) { current_item = current_item->prev; } if (current_item == NULL) { current_item = i; } else { draw_menu(current_menu); } } break; case MK_DOWN: i = current_item; if (current_item && current_item->next) { current_item = current_item->next; while (current_item && !current_item->enabled) { current_item = current_item->next; } if (current_item == NULL) { current_item = i; } else { draw_menu(current_menu); } } break; case MK_LEFT: undraw_menu(current_menu); if (current_menu->prev) { current_menu = current_menu->prev; } else { current_menu = menus; } current_item = current_menu->items; while (current_item && !current_item->enabled) { current_item = current_item->next; } draw_menu(current_menu); break; case MK_RIGHT: undraw_menu(current_menu); if (current_menu->next) { current_menu = current_menu->next; } else { current_menu = menus; } current_item = current_menu->items; while (current_item && !current_item->enabled) { current_item = current_item->next; } draw_menu(current_menu); break; case MK_HOME: if (current_item) { current_item = current_menu->items; while (current_item && !current_item->enabled) { current_item = current_item->next; } draw_menu(current_menu); } break; case MK_END: i = current_item; while (current_item) { current_item = current_item->next; if (current_item && current_item->enabled) { i = current_item; } } current_item = i; draw_menu(current_menu); break; case MK_ENTER: selected = true; break; case MK_NONE: switch (u) { case '\r': case '\n': selected = true; break; default: basic_menu_init(); } break; default: case MK_OTHER: basic_menu_init(); break; } if (selected) { if (current_item) { (*current_item->action)(current_item->param); } else if (!current_menu->items) { (*current_menu->callback)(current_menu->param); } basic_menu_init(); if (after_callback != NULL) { (*after_callback)(after_param); after_callback = NULL; after_param = NULL; } } screen_changed = true; } /* Report a character back to the screen drawing logic. */ bool menu_char(int row, int col, bool persistent, ucs4_t *u, bool *highlighted, unsigned char *acs) { if (menu_is_up & KEYPAD_IS_UP) { return keypad_char(row, col, u, highlighted, acs); } else if (col >= MODEL_2_COLS) { return false; } else if ((menu_is_up & MENU_IS_UP) && row < MODEL_2_ROWS && col < MODEL_2_COLS && menu_screen[(row * MODEL_2_COLS) + col]) { *u = menu_screen[(row * MODEL_2_COLS) + col]; *highlighted = menu_rv[(row * MODEL_2_COLS) + col]; *acs = menu_acs[(row * MODEL_2_COLS) + col]; return true; } else if (persistent && row == 0 && menu_topline[col]) { *u = menu_topline[col]; *highlighted = 0; return true; } else { *u = 0; *highlighted = false; return false; } } /* Report where to land the cursor when a menu is up. */ void menu_cursor(int *row, int *col) { if (menu_is_up & KEYPAD_IS_UP) { keypad_cursor(row, col); return; } if (menu_is_up & MENU_IS_UP) { *row = 0; *col = current_menu->offset; } else { *row = 0; *col = 0; } } /* Functions specific to c3270. */ static void fm_copyright(void *ignored _is_unused) { push_macro("Show(copyright)", false); sms_continue(); } static void fm_status(void *ignored _is_unused) { push_macro("Show(status)", false); sms_continue(); } static void fm_prompt(void *ignored _is_unused) { push_macro("Escape", false); } static void fm_print(void *ignored _is_unused) { push_macro("PrintText", false); } static void fm_xfer(void *ignored _is_unused) { push_macro("Escape() Transfer()", false); } static void fm_trace(void *ignored _is_unused) { if (toggled(TRACING)) { push_macro("Trace(off)", false); } else { push_macro("Trace(on)", false); } } static void fm_screentrace(void *ignored _is_unused) { if (toggled(SCREEN_TRACE)) { push_macro("ScreenTrace(off)", false); } else { push_macro("ScreenTrace(on)", false); } } static void fm_screentrace_printer(void *ignored _is_unused) { if (toggled(SCREEN_TRACE)) { push_macro("ScreenTrace(off)", false); } else { push_macro("ScreenTrace(on,printer,gdi)", false); } } static void fm_keymap(void *ignored _is_unused) { push_macro("Show(keymap)", false); } #if defined(_WIN32) /*[*/ static void fm_help(void *ignored _is_unused) { start_html_help(); } static void fm_wizard(void *session) { start_wizard((char *)session); } #endif /*]*/ static void fm_disconnect(void *ignored _is_unused) { push_macro("Disconnect", false); } static void fm_quit(void *ignored _is_unused) { push_macro("Quit", false); } /* File menu. */ typedef enum { FM_COPYRIGHT, FM_STATUS, FM_PROMPT, FM_PRINT, FM_XFER, FM_TRACE, FM_SCREENTRACE, FM_SCREENTRACE_PRINTER, FM_KEYMAP, #if defined(_WIN32) /*[*/ FM_HELP, FM_WIZARD, FM_WIZARD_SESS, #endif /*]*/ FM_DISC, FM_QUIT, FM_COUNT } file_menu_enum; cmenu_item_t *file_menu_items[FM_COUNT]; char *file_menu_names[FM_COUNT] = { "Copyright", "Status", #if !defined(_WIN32) /*[*/ "c3270> Prompt", #else /*][*/ "wc3270> Prompt", #endif /*]*/ "Print Screen", "File Transfer", "Enable Tracing", "Save Screen Images in File", "Save Screen Images to Printer", "Display Keymap", #if defined(_WIN32) /*[*/ "Help", "Session Wizard", "Edit Session", #endif /*]*/ "Disconnect", "Quit" }; menu_callback file_menu_actions[FM_COUNT] = { fm_copyright, fm_status, fm_prompt, fm_print, fm_xfer, fm_trace, fm_screentrace, fm_screentrace_printer, fm_keymap, #if defined(_WIN32) /*[*/ fm_help, fm_wizard, fm_wizard, #endif /*]*/ fm_disconnect, fm_quit }; /* Options menu. */ typedef enum { OM_MONOCASE, OM_BLANKFILL, OM_TIMING, OM_CURSOR, OM_CROSSHAIR, OM_UNDERSCORE, #if defined(WC3270) /*[*/ OM_MARGINED_PASTE, OM_OVERLAY_PASTE, #endif /*]*/ OM_VISIBLE_CONTROL, OM_COUNT } options_menu_enum; cmenu_item_t *options_menu_items[OM_COUNT]; toggle_index_t option_index[OM_COUNT] = { MONOCASE, BLANK_FILL, SHOW_TIMING, CURSOR_POS, CROSSHAIR, UNDERSCORE, #if defined(WC3270) /*[*/ MARGINED_PASTE, OVERLAY_PASTE, #endif /*]*/ VISIBLE_CONTROL }; char *option_names[OM_COUNT] = { "Monocase", "Blank Fill", "Show Timing", "Track Cursor", "Crosshair Cursor", "Underscore Mode", #if defined(WC3270) /*[*/ "Margined Paste", "Overlay Paste", #endif /*]*/ "Visible Control" }; cmenu_t *file_menu; cmenu_t *options_menu; cmenu_t *keypad_menu; static void toggle_option(void *param) { int index = *(int *)param; do_toggle(index); } static void really_popup_keypad(void *ignored _is_unused) { pop_up_keypad(true); } static void popup_keypad(void *ignored _is_unused) { after_callback = really_popup_keypad; after_param = NULL; } void menu_init(void) { int j; int col, next_col; cmenu_t *c; basic_menu_init(); file_menu = add_menu("File"); for (j = 0; j < FM_COUNT; j++) { if (appres.secure && j == FM_PROMPT) { continue; } #if defined(WC3270) /*[*/ if (j == FM_WIZARD_SESS && profile_path == NULL) { continue; } if (j == FM_WIZARD_SESS) { char *text; text = xs_buffer("Edit Session %s", profile_path); file_menu_items[j] = add_item(file_menu, text, file_menu_actions[j], profile_path); } else #endif /*]*/ { file_menu_items[j] = add_item(file_menu, file_menu_names[j], file_menu_actions[j], NULL); } } options_menu = add_menu("Options"); for (j = 0; j < OM_COUNT; j++) { char *name; name = xs_buffer("%s %s", toggled(option_index[j])? "Disable": "Enable", option_names[j]); options_menu_items[j] = add_item(options_menu, name, toggle_option, &option_index[j]); Free(name); } keypad_menu = add_menu("Keypad"); set_callback(keypad_menu, popup_keypad, NULL); /* Draw the menu names on the top line. */ col = 0; next_col = MENU_WIDTH; for (c = menus; c != NULL; c = c->next) { char *d; for (d = c->title; *d; d++) { menu_topline[col] = *d & 0xff; col++; } while (col < next_col) { menu_topline[col] = ' '; col++; } next_col += MENU_WIDTH; } } void menubar_retoggle(toggle_index_t ix) { int j; char *s; if (!appres.interactive.menubar) { return; } /* Search the options menu. */ for (j = 0; j < OM_COUNT; j++) { if (option_index[j] == ix) { break; } } if (j < OM_COUNT) { s = xs_buffer("%sable %s", toggled(ix)? "Dis": "En", option_names[j]); rename_item(options_menu_items[j], s); Free(s); return; } if (ix == TRACING) { s = xs_buffer("%sable Tracing", (toggled(TRACING))? "Dis": "En"); rename_item(file_menu_items[FM_TRACE], s); Free(s); } if (ix == SCREEN_TRACE) { if (toggled(SCREEN_TRACE)) { switch (trace_get_screentrace_how()) { case TSS_FILE: rename_item(file_menu_items[FM_SCREENTRACE], "Stop Saving Screen Images"); enable_item(file_menu_items[FM_SCREENTRACE_PRINTER], false); break; case TSS_PRINTER: enable_item(file_menu_items[FM_SCREENTRACE], false); rename_item(file_menu_items[FM_SCREENTRACE_PRINTER], "Stop Saving Screen Images"); break; } } else { rename_item(file_menu_items[FM_SCREENTRACE], "Save Screen Images in File"); enable_item(file_menu_items[FM_SCREENTRACE], true); rename_item(file_menu_items[FM_SCREENTRACE_PRINTER], "Save Screen Images to Printer"); enable_item(file_menu_items[FM_SCREENTRACE_PRINTER], true); } } } /* * Utility function to map ACS codes (l, m, j, etc.) to the right kind of * line-drawing character. */ void map_acs(unsigned char c, ucs4_t *u, unsigned char *is_acs) { #if defined(CURSES_WIDE) || defined(_WIN32) /*[*/ /* * If we have wide curses thus can do ACS, or if we are on Windows, * then do ASCII art only if the user requests it. * * Otherwise (no wide curses, no Windows), ASCII art is all we can do. */ if (appres.c3270.ascii_box_draw) #endif /*]*/ { /* ASCII art. */ *is_acs = 0; switch (c) { case 'l': case 'm': case 'k': case 'j': case 't': case 'u': case 'v': case 'w': case 'n': *u = '+'; break; case 'q': *u = '-'; break; case 'x': *u = '|'; break; case 's': *u = ' '; break; default: *u = '?'; break; } return; } #if defined(CURSES_WIDE) /*[*/ else if (appres.c3270.acs) { /* ncurses ACS. */ *is_acs = 1; switch (c) { case 'l': *u = ACS_ULCORNER; break; case 'm': *u = ACS_LLCORNER; break; case 'k': *u = ACS_URCORNER; break; case 'j': *u = ACS_LRCORNER; break; case 't': *u = ACS_LTEE; break; case 'u': *u = ACS_RTEE; break; case 'v': *u = ACS_BTEE; break; case 'w': *u = ACS_TTEE; break; case 'q': *u = ACS_HLINE; break; case 'x': *u = ACS_VLINE; break; case 'n': *u = ACS_PLUS; break; case 's': *u = ' '; *is_acs = 0; break; default: *u = '?'; *is_acs = 0; break; } } #endif /*]*/ #if defined(CURSES_WIDE) || defined(_WIN32) /*[*/ else { /* Unicode. */ *is_acs = 0; switch (c) { case 'l': *u = 0x250c; break; case 'm': *u = 0x2514; break; case 'k': *u = 0x2510; break; case 'j': *u = 0x2518; break; case 't': *u = 0x251c; break; case 'u': *u = 0x2524; break; case 'v': *u = 0x2534; break; case 'w': *u = 0x252c; break; case 'q': *u = 0x2500; break; case 'x': *u = 0x2502; break; case 'n': *u = 0x253c; break; case 's': *u = ' '; break; default: *u = '?'; break; } } #endif /*]*/ } bool Menu_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Menu", ia, argc, argv); if (check_argc("Menu", argc, 0, 0) < 0) { return false; } popup_menu(0, false); return true; } void menubar_as_set(bool sensitive _is_unused) { /* Do nothing, there is no Abort Script. */ } /** * Menu bar module registration. */ void menubar_register(void) { static action_table_t menubar_actions[] = { { "Menu", Menu_action, ACTION_KE } }; /* Register our actions. */ register_actions(menubar_actions, array_count(menubar_actions)); } suite3270-3.6/Common/c3270/mkkeypad.c0000664000076500007650000001362113221577163015136 0ustar pdmpdm#include #include #include #include /* * Construct keypad data structures from a set of descriptor files. * * The files are: * keypad.labels * literal text to be drawn for the keypad * keypad.outline * outlines for the keys, ACS encoded ('l' for upper left, etc.) * keypad.map * sensitivity map for the keypad (aaaa is field 'a', etc.) * keypad.full * not used by this program, but gives the overall plan * * The result is an array of structures: * unsigned char literal; text from keypad.labels * unsigned char outline; ACS-encoded outline text * sens_t *sens; sensitivity, or NULL * * A sens_t is a structure: * unsigned char ul_x, ul_y; upper left corner * unsigned char lr_x, lr_y; lower right corner * unsigned char callback_name; 'a', 'b', etc. */ typedef struct sensmap { struct sensmap *next; unsigned char name; unsigned ul_x, ul_y, lr_x, lr_y; int index; char *callback; } sensmap_t; sensmap_t *sensmaps = NULL; sensmap_t *last_sensmap = NULL; int sensmap_count = 0; char *incdir = NULL; FILE *fopen_inc(const char *name) { FILE *f; char *path; if ((f = fopen(name, "r")) != NULL) { return f; } if (incdir == NULL) { return NULL; } path = malloc(strlen(incdir) + 1 + strlen(name) + 1); sprintf(path, "%s/%s", incdir, name); f = fopen(path, "r"); free(path); return f; } int main(int argc, char *argv[]) { FILE *callbacks; FILE *labels; FILE *outline; FILE *map; int c, d; unsigned x; unsigned y; sensmap_t *s; char buf[128]; int cbl = 0; if (argc > 1 && !strncmp(argv[1], "-I", 2)) { incdir = argv[1] + 2; } /* Open the files. */ labels = fopen_inc("keypad.labels"); if (labels == NULL) { perror("keypad.labels"); exit(1); } outline = fopen_inc("keypad.outline"); if (outline == NULL) { perror("keypad.outline"); exit(1); } map = fopen_inc("keypad.map"); if (map == NULL) { perror("keypad.map"); exit(1); } callbacks = fopen_inc("keypad.callbacks"); if (callbacks == NULL) { perror("keypad.callbacks"); exit(1); } /* Read in the map file first. */ x = 0; y = 0; while ((c = fgetc(map)) != EOF) { if (c == '\n') { y++; x = 0; continue; } if (c == ' ') { x++; continue; } for (s = sensmaps; s != NULL; s = s->next) { if (s->name == c) break; } if (s != NULL) { /* Seen it before. */ s->lr_x = x; s->lr_y = y; } else { s = (sensmap_t *)malloc(sizeof(sensmap_t)); if (s == NULL) { fprintf(stderr, "Out of memory.\n"); exit(1); } memset(s, '\0', sizeof(sensmap_t)); s->name = c; s->ul_x = s->lr_x = x; s->ul_y = s->lr_y = y; s->index = sensmap_count++; s->callback = NULL; s->next = NULL; if (last_sensmap) last_sensmap->next = s; else sensmaps = s; last_sensmap = s; last_sensmap = s; } x++; } fclose(map); /* Read in the callbacks. */ while (fgets(buf, sizeof(buf), callbacks) != NULL) { char *t; char c; size_t sl; cbl++; sl = strlen(buf); if (sl > 0 && buf[sl - 1] == '\n') buf[sl - 1] = '\0'; c = buf[0]; if (!isalnum((unsigned char)c)) { fprintf(stderr, "keypad.callbacks:%d Invalid callback character.\n", cbl); exit(1); } t = &buf[1]; while (*t && isspace((unsigned char)*t)) { t++; } if (!*t || !isalnum((unsigned char)*t)) { fprintf(stderr, "keypad.callbacks:%d Invalid callback string.\n", cbl); exit(1); } #if defined(MKK_DEBUG) /*[*/ fprintf(stderr, "line %d: name '%c', callback '%s'\n", cbl, c, t); #endif /*]*/ for (s = sensmaps; s != NULL; s = s->next) { if (s->name == c) { if (s->callback != NULL) { fprintf(stderr, "keypad.callbacks:%d Duplicate callback " "for '%c' (%s, %s).\n", cbl, c, s->callback, t); exit(1); } s->callback = malloc(strlen(t) + 1); if (s->callback == NULL) { fprintf(stderr, "Out of memory.\n"); exit(1); } strcpy(s->callback, t); break; } } if (s == NULL) { fprintf(stderr, "keypad.callbacks:%d: Callback '%c' for " "nonexistent map.\n", cbl, c); exit(1); } } fclose(callbacks); for (s = sensmaps; s != NULL; s = s->next) { if (s->callback == NULL) { fprintf(stderr, "Map '%c' has no callback.\n", s->name); exit(1); } } /* Dump out the sensmaps. */ printf("sens_t sens[%u] = {\n", sensmap_count); for (s = sensmaps; s != NULL; s = s->next) { printf(" { %2u, %2u, %2u, %2u, \"%s\" },\n", s->ul_x, s->ul_y, s->lr_x, s->lr_y, s->callback); } printf("};\n"); /* * Read in the label and outline files, and use them to dump out the * keypad_desc[]. */ labels = fopen_inc("keypad.labels"); if (labels == NULL) { perror("keypad.labels"); exit(1); } outline = fopen_inc("keypad.outline"); if (outline == NULL) { perror("keypad.outline"); exit(1); } printf("keypad_desc_t keypad_desc[%u][80] = {\n", y); printf("{ /* row 0 */\n"); x = 0; y = 0; while ((c = fgetc(labels)) != EOF) { d = fgetc(outline); if (c == '\n') { if (d != '\n') { fprintf(stderr, "labels and outline out of sync at line %d\n", y + 1); exit(1); } y++; x = 0; continue; } if (x == 0 && y != 0) printf("},\n{ /* row %u */\n", y); for (s = sensmaps; s != NULL; s = s->next) { if (x >= s->ul_x && y >= s->ul_y && x <= s->lr_x && y <= s->lr_y) { printf(" { '%c', '%c', &sens[%u] },\n", c, d, s->index); break; } } if (s == NULL) { if (c == ' ' && d == ' ') printf(" { 0, 0, NULL },\n"); else printf(" { '%c', '%c', NULL },\n", c, d); } x++; } if ((d = fgetc(outline)) != EOF) { fprintf(stderr, "labels and outline out of sync at EOF\n"); exit(1); } printf("} };\n"); fclose(labels); fclose(outline); return 0; } suite3270-3.6/Common/c3270/ssl_passwd_gui.c0000664000076500007650000000631113221577163016355 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 2004, Don Russell. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES AND * GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, * DON RUSSELL, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ssl_passwd_gui.c * SSL certificate password dialog for c3270. */ #include "globals.h" #include "appres.h" #include "screen.h" # if defined(WC3270) /*[*/ # include "cscreen.h" # endif /*]*/ # include "ssl_passwd_gui.h" /* Statics. */ static bool ssl_password_prompted; /* Prompt for a password on the console. */ static char * gets_noecho(char *buf, int size) { # if !defined(_WIN32) /*[*/ char *s; size_t sl; (void) system("stty -echo"); s = fgets(buf, size - 1, stdin); (void) system("stty echo"); if (s != NULL) { sl = strlen(buf); if (sl && buf[sl - 1] == '\n') { buf[sl - 1] = '\0'; } } return s; # else /*][*/ int cc = 0; while (true) { char c; (void) screen_wait_for_key(&c); if (c == '\r') { buf[cc] = '\0'; return buf; } else if (c == '\b' || c == 0x7f) { if (cc) { cc--; } } else if (c == 0x1b) { cc = 0; } else if ((unsigned char)c >= ' ' && cc < size - 1) { buf[cc++] = c; } } # endif /*]*/ } /* Password callback. */ ssl_passwd_ret_t ssl_passwd_gui_callback(char *buf, int size, bool again) { char *s; screen_suspend(); if (again) { fprintf(stdout, "\nPassword is incorrect."); } fprintf(stdout, "\nEnter password for Private Key: "); fflush(stdout); s = gets_noecho(buf, size); fprintf(stdout, "\n"); fflush(stdout); ssl_password_prompted = true; return (s && strlen(s))? SP_SUCCESS: SP_FAILURE; } suite3270-3.6/Common/charset.c0000664000076500007650000001770513221577163014233 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * charset.c * This module handles character sets. */ #include "globals.h" #include "3270ds.h" #include "resources.h" #include "appres.h" #include "charset.h" #include "lazya.h" #include "popups.h" #include "screen.h" #include "unicodec.h" #include "unicode_dbcs.h" #include "utf8.h" #include "utils.h" #include #if !defined(_WIN32) /*[*/ # include #endif /*]*/ #if defined(__CYGWIN__) /*[*/ # include #undef _WIN32 #endif /*]*/ #if defined(_WIN32) /*[*/ # define LOCAL_CODEPAGE appres.local_cp #else /*][*/ # define LOCAL_CODEPAGE 0 #endif /* Globals. */ bool charset_changed = false; #define DEFAULT_CGEN 0x02b90000 #define DEFAULT_CSET 0x00000025 unsigned long cgcsgid = DEFAULT_CGEN | DEFAULT_CSET; unsigned long cgcsgid_dbcs = 0L; /* Statics. */ static enum cs_result charset_init2(const char *csname, const char *realname, const char *codepage, const char *cgcsgid, bool is_dbcs); static void set_cgcsgids(const char *spec); static bool set_cgcsgid(char *spec, unsigned long *idp); static void set_host_codepage(char *codepage); static void set_charset_name(const char *csname); static char *host_codepage = NULL; static char *charset_name = NULL; /* * Change character sets. */ enum cs_result charset_init(const char *csname) { enum cs_result rc; char *codeset_name; const char *codepage; const char *cgcsgid; const char *dbcs_cgcsgid = NULL; const char *realname; bool is_dbcs; #if !defined(_WIN32) /*[*/ /* Get all of the locale stuff right. */ setlocale(LC_ALL, ""); /* Figure out the locale code set (character set encoding). */ codeset_name = nl_langinfo(CODESET); # if defined(__CYGWIN__) /*[*/ /* * Cygwin's locale support is quite limited. If the locale * indicates "US-ASCII", which appears to be the only supported * encoding, ignore it and use the Windows ANSI code page, which * observation indicates is what is actually supported. * * Hopefully at some point Cygwin will start returning something * meaningful here and this logic will stop triggering. */ if (!strcmp(codeset_name, "US-ASCII")) { codeset_name = lazyaf("CP%d", GetACP()); } # endif /*]*/ #else /*][*/ codeset_name = lazyaf("CP%d", appres.local_cp); #endif /*]*/ set_codeset(codeset_name, appres.utf8); /* Do nothing, successfully. */ if (csname == NULL || !strcasecmp(csname, "us")) { set_cgcsgids(NULL); set_host_codepage(NULL); set_charset_name(NULL); (void) screen_new_display_charsets(NULL, "us"); (void) set_uni(NULL, LOCAL_CODEPAGE, &codepage, &cgcsgid, NULL, NULL); (void) set_uni_dbcs("", NULL); return CS_OKAY; } if (!set_uni(csname, LOCAL_CODEPAGE, &codepage, &cgcsgid, &realname, &is_dbcs)) { return CS_NOTFOUND; } if (appres.sbcs_cgcsgid != NULL) { cgcsgid = appres.sbcs_cgcsgid; /* override */ } if (set_uni_dbcs(csname, &dbcs_cgcsgid)) { if (appres.dbcs_cgcsgid != NULL) { dbcs_cgcsgid = appres.dbcs_cgcsgid; /* override */ } cgcsgid = lazyaf("%s+%s", cgcsgid, dbcs_cgcsgid); } rc = charset_init2(csname, realname, codepage, cgcsgid, is_dbcs); if (rc != CS_OKAY) { return rc; } return CS_OKAY; } /* Set a CGCSGID. Return true for success, false for failure. */ static bool set_cgcsgid(char *spec, unsigned long *r) { unsigned long cp; char *ptr; if (spec != NULL && (cp = strtoul(spec, &ptr, 0)) && ptr != spec && *ptr == '\0') { if (!(cp & ~0xffffL)) { *r = DEFAULT_CGEN | cp; } else { *r = cp; } return true; } else { return false; } } /* Set the CGCSGIDs. */ static void set_cgcsgids(const char *spec) { int n_ids = 0; char *spec_copy; char *buf; char *token; if (spec != NULL) { buf = spec_copy = NewString(spec); while (n_ids >= 0 && (token = strtok(buf, "+")) != NULL) { unsigned long *idp = NULL; buf = NULL; switch (n_ids) { case 0: idp = &cgcsgid; break; case 1: idp = &cgcsgid_dbcs; break; default: popup_an_error("Extra CGCSGID(s), ignoring"); break; } if (idp == NULL) break; if (!set_cgcsgid(token, idp)) { popup_an_error("Invalid CGCSGID '%s', ignoring", token); n_ids = -1; break; } n_ids++; } Free(spec_copy); if (n_ids > 0) { return; } } if (appres.sbcs_cgcsgid != NULL) { cgcsgid = strtoul(appres.sbcs_cgcsgid, NULL, 0); } else { cgcsgid = DEFAULT_CGEN | DEFAULT_CSET; } if (appres.dbcs_cgcsgid != NULL) { cgcsgid_dbcs = strtoul(appres.dbcs_cgcsgid, NULL, 0); } else { cgcsgid_dbcs = 0L; } } /* Set the host codepage. */ static void set_host_codepage(char *codepage) { if (codepage == NULL) { Replace(host_codepage, NewString("037")); return; } if (host_codepage == NULL || strcmp(host_codepage, codepage)) { Replace(host_codepage, NewString(codepage)); } } /* Set the global charset name. */ static void set_charset_name(const char *csname) { if (csname == NULL) { Replace(charset_name, NewString("us")); charset_changed = false; return; } if ((charset_name != NULL && strcmp(charset_name, csname)) || (appres.charset != NULL && strcmp(appres.charset, csname))) { Replace(charset_name, NewString(csname)); charset_changed = true; } } /* Character set init, part 2. */ static enum cs_result charset_init2(const char *csname, const char *realname, const char *codepage, const char *cgcsgid, bool is_dbcs) { /* Can't swap DBCS modes while connected. */ if (IN_3270 && is_dbcs != dbcs) { popup_an_error("Can't change DBCS modes while connected"); return CS_ILLEGAL; } if (!screen_new_display_charsets(realname, csname)) { return CS_PREREQ; } /* Set the global DBCS mode. */ dbcs = is_dbcs; /* Set up the cgcsgids. */ set_cgcsgids(cgcsgid); /* Set up the host code page. */ set_host_codepage((char *)codepage); /* Set up the character set name. */ set_charset_name(csname); return CS_OKAY; } /* Return the current host codepage. */ const char * get_host_codepage(void) { return (host_codepage != NULL)? host_codepage: "037"; } /* Return the current character set name. */ const char * get_charset_name(void) { return (charset_name != NULL)? charset_name: ((appres.charset != NULL)? appres.charset: "us"); } suite3270-3.6/Common/child.c0000664000076500007650000001654313221577163013664 0ustar pdmpdm/* * Copyright (c) 2001-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * child.c * Child process output support. */ #include "globals.h" #include #include #include "popups.h" /* must be before cpopups.h */ #include "child_popups.h" #include "utils.h" #define CHILD_BUF 1024 static bool child_initted = false; static bool child_broken = false; static bool child_discarding = false; static int child_outpipe[2]; static int child_errpipe[2]; static struct pr3o { int fd; /* file descriptor */ ioid_t input_id; /* input ID */ ioid_t timeout_id; /* timeout ID */ int count; /* input count */ char buf[CHILD_BUF]; /* input buffer */ } child_stdout = { -1, 0L, 0L, 0 }, child_stderr = { -1, 0L, 0L, 0 }; static void child_output(iosrc_t fd, ioid_t id); static void child_error(iosrc_t fd, ioid_t id); static void child_otimeout(ioid_t id); static void child_etimeout(ioid_t id); static void child_dump(struct pr3o *p, bool is_err); static void init_child(void) { /* If initialization failed, there isn't much we can do. */ if (child_broken) { return; } /* Create pipes. */ if (pipe(child_outpipe) < 0) { popup_an_errno(errno, "pipe()"); child_broken = true; return; } if (pipe(child_errpipe) < 0) { popup_an_errno(errno, "pipe()"); close(child_outpipe[0]); close(child_outpipe[1]); child_broken = true; return; } /* Make sure their read ends are closed in child processes. */ (void) fcntl(child_outpipe[0], F_SETFD, 1); (void) fcntl(child_errpipe[0], F_SETFD, 1); /* Initialize the pop-ups. */ child_popup_init(); /* Express interest in their output. */ child_stdout.fd = child_outpipe[0]; child_stdout.input_id = AddInput(child_outpipe[0], child_output); child_stderr.fd = child_errpipe[0]; child_stderr.input_id = AddInput(child_errpipe[0], child_error); child_initted = true; } /* * Fork a child process, with its stdout/stderr connected to pop-up windows. * Returns -1 for an error, 0 for child context, pid for parent context. */ int fork_child(void) { pid_t pid; /* Do initialization, if it hasn't been done already. */ if (!child_initted) { init_child(); } /* If output was being dumped, turn it back on now. */ if (child_discarding) { child_discarding = false; } /* Fork and rearrange output. */ pid = fork(); if (pid == 0) { /* Child. */ (void) dup2(child_outpipe[1], 1); (void) close(child_outpipe[1]); (void) dup2(child_errpipe[1], 2); (void) close(child_errpipe[1]); } return pid; } /* There's data from a child. */ static void child_data(struct pr3o *p, bool is_err) { int space; int nr; static char exitmsg[] = "Printer session exited"; /* * If we're discarding output, pull it in and drop it on the floor. */ if (child_discarding) { nr = read(p->fd, p->buf, CHILD_BUF); return; } /* Read whatever there is. */ space = CHILD_BUF - p->count - 1; nr = read(p->fd, p->buf + p->count, space); /* Handle read errors and end-of-file. */ if (nr < 0) { popup_an_errno(errno, "child session pipe input"); return; } if (nr == 0) { if (child_stderr.timeout_id != 0L) { /* * Append a termination error message to whatever the * child process said, and pop it up. */ p = &child_stderr; space = CHILD_BUF - p->count - 1; if (p->count && *(p->buf + p->count - 1) != '\n') { *(p->buf + p->count) = '\n'; p->count++; space--; } (void) strncpy(p->buf + p->count, exitmsg, space); p->count += strlen(exitmsg); if (p->count >= CHILD_BUF) { p->count = CHILD_BUF - 1; } child_dump(p, true); } else { popup_an_error("%s", exitmsg); } return; } /* Add it to the buffer, and add a NULL. */ p->count += nr; p->buf[p->count] = '\0'; /* * If there's no more room in the buffer, dump it now. Otherwise, * give it a second to generate more output. */ if (p->count >= CHILD_BUF - 1) { child_dump(p, is_err); } else if (p->timeout_id == 0L) { p->timeout_id = AddTimeOut(1000, is_err? child_etimeout: child_otimeout); } } /* The child process has some output for us. */ static void child_output(iosrc_t fd _is_unused, ioid_t id _is_unused) { child_data(&child_stdout, false); } /* The child process has some error output for us. */ static void child_error(iosrc_t fd _is_unused, ioid_t id _is_unused) { child_data(&child_stderr, true); } /* Timeout from child output or error output. */ static void child_timeout(struct pr3o *p, bool is_err) { /* Forget the timeout ID. */ p->timeout_id = 0L; /* Dump the output. */ child_dump(p, is_err); } /* Timeout from child output. */ static void child_otimeout(ioid_t id _is_unused) { child_timeout(&child_stdout, false); } /* Timeout from child error output. */ static void child_etimeout(ioid_t id _is_unused) { child_timeout(&child_stderr, true); } /* * Abort button from child output. * Ignore output from the child process, so the user can abort it. */ void child_ignore_output(void) { /* Pitch pending output. */ child_stdout.count = 0; child_stderr.count = 0; /* Remove pendnig timeouts. */ if (child_stdout.timeout_id) { RemoveTimeOut(child_stdout.timeout_id); child_stdout.timeout_id = 0L; } if (child_stderr.timeout_id) { RemoveTimeOut(child_stderr.timeout_id); child_stderr.timeout_id = 0L; } /* Remember it. */ child_discarding = true; } /* Dump pending child process output. */ static void child_dump(struct pr3o *p, bool is_err) { if (p->count) { /* * Strip any trailing newline, and make sure the buffer is * NULL terminated. */ if (p->buf[p->count - 1] == '\n') { p->buf[--(p->count)] = '\0'; } else if (p->buf[p->count]) { p->buf[p->count] = '\0'; } /* Dump it and clear the buffer. */ popup_child_output(is_err, child_ignore_output, "%s", p->buf); p->count = 0; } } suite3270-3.6/Common/ckeypad.h0000664000076500007650000000357113221577163014223 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ckeypad.h * Global declarations for c3270 keypad.c. */ bool keypad_char(int row, int col, ucs4_t *u, bool *highlighted, unsigned char *acs); void keypad_cursor(int *row, int *col); void pop_up_keypad(bool up); void keypad_key(int k, ucs4_t u); # if defined(_WIN32) /*[*/ void keypad_click(int x, int y); # endif /*]*/ void keypad_register(void); suite3270-3.6/Common/ctlr.c0000664000076500007650000020642513221577163013545 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ctlr.c * This module handles interpretation of the 3270 data stream and * maintenance of the 3270 device state. It was split out from * screen.c, which handles X operations. * */ #include "globals.h" #include #include "3270ds.h" #include "appres.h" #include "ctlr.h" #include "screen.h" #include "resources.h" #include "toggles.h" #include "actions.h" #include "charset.h" #include "ctlrc.h" #include "unicodec.h" #include "ft.h" #include "ft_cut.h" #include "ft_dft.h" #include "host.h" #include "kybd.h" #include "lazya.h" #include "macros.h" #include "popups.h" #include "screen.h" #include "scroll.h" #include "see.h" #include "selectc.h" #include "sf.h" #include "status.h" #include "tables.h" #include "telnet_core.h" #include "trace.h" #include "utils.h" /* Globals */ int ROWS, COLS; int maxROWS, maxCOLS; int defROWS, defCOLS; int altROWS, altCOLS; int ov_rows, ov_cols; bool ov_auto; int model_num; int cursor_addr, buffer_addr; bool screen_alt = false; /* alternate screen? */ bool is_altbuffer = false; struct ea *ea_buf; /* 3270 device buffer */ /* ea_buf[-1] is the dummy default field attribute */ struct ea *aea_buf; /* alternate 3270 extended attribute buffer */ bool formatted = false; /* set in screen_disp */ bool screen_changed = false; int first_changed = -1; int last_changed = -1; unsigned char reply_mode = SF_SRM_FIELD; int crm_nattr = 0; unsigned char crm_attr[16]; bool dbcs = false; /* Statics */ static unsigned char *zero_buf; /* empty buffer, for area clears */ static void set_formatted(void); static void ctlr_blanks(void); static bool trace_primed = false; static unsigned char default_fg; static unsigned char default_bg; static unsigned char default_gr; static unsigned char default_cs; static unsigned char default_ic; static void ctlr_half_connect(bool ignored); static void ctlr_connect(bool ignored); static int sscp_start; static void ctlr_add_ic(int baddr, unsigned char ic); static void ticking_stop(void); /* * code_table is used to translate buffer addresses and attributes to the 3270 * datastream representation */ static unsigned char code_table[64] = { 0x40, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, }; #define IsBlank(c) ((c == EBC_null) || (c == EBC_space)) #define ALL_CHANGED { \ screen_changed = true; \ if (IN_NVT) { first_changed = 0; last_changed = ROWS*COLS; } } #define REGION_CHANGED(f, l) { \ screen_changed = true; \ if (IN_NVT) { \ if (first_changed == -1 || f < first_changed) first_changed = f; \ if (last_changed == -1 || l > last_changed) last_changed = l; } } #define ONE_CHANGED(n) REGION_CHANGED(n, n+1) #define DECODE_BADDR(c1, c2) \ ((((c1) & 0xC0) == 0x00) ? \ (((c1) & 0x3F) << 8) | (c2) : \ (((c1) & 0x3F) << 6) | ((c2) & 0x3F)) #define ENCODE_BADDR(ptr, addr) { \ if ((ROWS * COLS) > 0x1000) { \ *(ptr)++ = ((addr) >> 8) & 0x3F; \ *(ptr)++ = (addr) & 0xFF; \ } else { \ *(ptr)++ = code_table[((addr) >> 6) & 0x3F]; \ *(ptr)++ = code_table[(addr) & 0x3F]; \ } \ } /** * Controller module registration. */ void ctlr_register(void) { /* Register callback routines. */ register_schange(ST_HALF_CONNECT, ctlr_half_connect); register_schange(ST_CONNECT, ctlr_connect); register_schange(ST_3270_MODE, ctlr_connect); } /* * Initialize the emulated 3270 hardware. */ void ctlr_init(unsigned cmask) { ctlr_reinit(cmask); } /* * Reinitialize the emulated 3270 hardware. */ void ctlr_reinit(unsigned cmask) { static struct ea *real_ea_buf = NULL; static struct ea *real_aea_buf = NULL; if (cmask & MODEL_CHANGE) { /* Allocate buffers */ if (real_ea_buf) Free((char *)real_ea_buf); real_ea_buf = (struct ea *)Calloc(sizeof(struct ea), (maxROWS * maxCOLS) + 1); ea_buf = real_ea_buf + 1; if (real_aea_buf) Free((char *)real_aea_buf); real_aea_buf = (struct ea *)Calloc(sizeof(struct ea), (maxROWS * maxCOLS) + 1); aea_buf = real_aea_buf + 1; Replace(zero_buf, (unsigned char *)Calloc(sizeof(struct ea), maxROWS * maxCOLS)); cursor_addr = 0; buffer_addr = 0; ea_buf[-1].fa = FA_PRINTABLE | FA_MODIFY; aea_buf[-1].fa = FA_PRINTABLE | FA_MODIFY; } } /* * Deal with the relationships between model numbers and rows/cols. */ void set_rows_cols(int mn, int ovc, int ovr) { int defmod; if (ovc < 0 || ovr < 0) { ov_auto = true; ovc = 0; ovr = 0; } switch (mn) { case 2: maxCOLS = MODEL_2_COLS; maxROWS = MODEL_2_ROWS; model_num = 2; break; case 3: maxCOLS = MODEL_3_COLS; maxROWS = MODEL_3_ROWS; model_num = 3; break; case 4: #if defined(RESTRICT_3279) /*[*/ if (appres.m3279) { popup_an_error("No 3279 Model 4\nDefaulting to model 3"); set_rows_cols("3", ovc, ovr); return; } #endif /*]*/ maxCOLS = MODEL_4_COLS; maxROWS = MODEL_4_ROWS; model_num = 4; break; case 5: #if defined(RESTRICT_3279) /*[*/ if (appres.m3279) { popup_an_error("No 3279 Model 5\nDefaulting to model 3"); set_rows_cols(3, ovc, ovr); return; } #endif /*]*/ maxCOLS = MODEL_5_COLS; maxROWS = MODEL_5_ROWS; model_num = 5; break; default: #if defined(RESTRICT_3279) /*[*/ defmod = appres.m3279 ? 3 : 4; #else /*][*/ defmod = 4; #endif popup_an_error("Unknown model: %d\nDefaulting to %d", mn, defmod); set_rows_cols(defmod, ovc, ovr); return; } /* Apply oversize. */ ov_cols = 0; ov_rows = 0; if (ovc != 0 || ovr != 0) { if (ovc <= 0 || ovr <= 0) popup_an_error("Invalid %s %dx%d:\nNegative or zero", ResOversize, ovc, ovr); else if (ovc * ovr >= 0x4000) popup_an_error("Invalid %s %dx%d:\nExceeds protocol " "limit", ResOversize, ovc, ovr); else if (ovc > 0 && ovc < maxCOLS) popup_an_error("Invalid %s cols (%d):\nLess than " "model %d cols (%d)", ResOversize, ovc, model_num, maxCOLS); else if (ovr > 0 && ovr < maxROWS) popup_an_error("Invalid %s rows (%d):\nLess than " "model %d rows (%d)", ResOversize, ovr, model_num, maxROWS); else { ov_cols = maxCOLS = ovc; ov_rows = maxROWS = ovr; } } /* Update the model name. */ (void) sprintf(model_name, "327%c-%d%s", appres.m3279 ? '9' : '8', model_num, appres.extended ? "-E" : ""); /* Make sure that the current rows/cols are still 24x80. */ COLS = defCOLS = MODEL_2_COLS; ROWS = defROWS = MODEL_2_ROWS; screen_alt = false; /* Set the defaults for the alternate screen size. */ altROWS = maxROWS; altCOLS = maxCOLS; } /* * Set the formatted screen flag. A formatted screen is a screen that * has at least one field somewhere on it. */ static void set_formatted(void) { register int baddr; formatted = false; baddr = 0; do { if (ea_buf[baddr].fa) { formatted = true; break; } INC_BA(baddr); } while (baddr != 0); } /* * Called when a host is half connected. */ static void ctlr_half_connect(bool ignored _is_unused) { ticking_start(true); } /* * Called when a host connects, disconnects, or changes NVT/3270 modes. */ static void ctlr_connect(bool ignored _is_unused) { ticking_stop(); status_untiming(); if (!IN_3270 || (IN_SSCP && (kybdlock & KL_OIA_TWAIT))) { kybdlock_clr(KL_OIA_TWAIT, "ctlr_connect"); status_reset(); } default_fg = 0x00; default_bg = 0x00; default_gr = 0x00; default_cs = 0x00; default_ic = 0x00; reply_mode = SF_SRM_FIELD; crm_nattr = 0; /* On disconnect, reset the default and alternate dimensions. */ if (!CONNECTED) { defROWS = MODEL_2_ROWS; defCOLS = MODEL_2_COLS; altROWS = maxROWS; altCOLS = maxCOLS; ctlr_erase(false); } } /* * Find the buffer address of the field attribute for a given buffer address. * Returns -1 if the screen isn't formatted. */ int find_field_attribute_ea(int baddr, struct ea *ea) { int sbaddr; sbaddr = baddr; do { if (ea[baddr].fa) { return baddr; } DEC_BA(baddr); } while (baddr != sbaddr); return -1; } /* * Find the buffer address of the field attribute for a given buffer address. * Returns -1 if the screen isn't formatted. */ int find_field_attribute(int baddr) { if (!formatted) { return -1; } return find_field_attribute_ea(baddr, ea_buf); } /* * Find the field attribute for the given buffer address. Return its address * rather than its value. */ unsigned char get_field_attribute(register int baddr) { return ea_buf[find_field_attribute(baddr)].fa; } /* * Find the field attribute for the given buffer address, bounded by another * buffer address. Return the attribute in a parameter. * * Returns true if an attribute is found, false if boundary hit. */ bool get_bounded_field_attribute(register int baddr, register int bound, unsigned char *fa_out) { int sbaddr; if (!formatted) { *fa_out = ea_buf[-1].fa; return true; } sbaddr = baddr; do { if (ea_buf[baddr].fa) { *fa_out = ea_buf[baddr].fa; return true; } DEC_BA(baddr); } while (baddr != sbaddr && baddr != bound); /* Screen is unformatted (and 'formatted' is inaccurate). */ if (baddr == sbaddr) { *fa_out = ea_buf[-1].fa; return true; } /* Wrapped to boundary. */ return false; } /* * Given the address of a field attribute, return the address of the * extended attribute structure. */ struct ea * fa2ea(int baddr) { return &ea_buf[baddr]; } /* * Find the next unprotected field. Returns the address following the * unprotected attribute byte, or 0 if no nonzero-width unprotected field * can be found. */ int next_unprotected(int baddr0) { register int baddr, nbaddr; nbaddr = baddr0; do { baddr = nbaddr; INC_BA(nbaddr); if (ea_buf[baddr].fa && !FA_IS_PROTECTED(ea_buf[baddr].fa) && !ea_buf[nbaddr].fa) return nbaddr; } while (nbaddr != baddr0); return 0; } /* * Perform an erase command, which may include changing the (virtual) screen * size. */ void ctlr_erase(bool alt) { int newROWS, newCOLS; kybd_inhibit(false); ctlr_clear(true); /* Let a script go. */ sms_host_output(); if (alt) { newROWS = altROWS; newCOLS = altCOLS; } else { newROWS = defROWS; newCOLS = defCOLS; } if (alt == screen_alt && ROWS == newROWS && COLS == newCOLS) return; screen_disp(true); if (visible_control) { /* Blank the entire display. */ ctlr_blanks(); ROWS = maxROWS; COLS = maxCOLS; screen_disp(false); } ROWS = newROWS; COLS = newCOLS; if (visible_control) { /* Fill the active part of the screen with NULLs again. */ ctlr_clear(false); screen_disp(false); } screen_alt = alt; } /* * Interpret an incoming 3270 command. */ enum pds process_ds(unsigned char *buf, size_t buflen) { enum pds rv; if (!buflen) return PDS_OKAY_NO_OUTPUT; scroll_to_bottom(); switch (buf[0]) { /* 3270 command */ case CMD_EAU: /* erase all unprotected */ case SNA_CMD_EAU: ctlr_erase_all_unprotected(); trace_ds("< EraseAllUnprotected\n"); return PDS_OKAY_NO_OUTPUT; break; case CMD_EWA: /* erase/write alternate */ case SNA_CMD_EWA: ctlr_erase(true); trace_ds("< EraseWriteAlternate"); if ((rv = ctlr_write(buf, buflen, true)) < 0) return rv; return PDS_OKAY_NO_OUTPUT; break; case CMD_EW: /* erase/write */ case SNA_CMD_EW: ctlr_erase(false); trace_ds("< EraseWrite"); if ((rv = ctlr_write(buf, buflen, true)) < 0) return rv; return PDS_OKAY_NO_OUTPUT; break; case CMD_W: /* write */ case SNA_CMD_W: trace_ds("< Write"); if ((rv = ctlr_write(buf, buflen, false)) < 0) return rv; return PDS_OKAY_NO_OUTPUT; break; case CMD_RB: /* read buffer */ case SNA_CMD_RB: trace_ds("< ReadBuffer\n"); ctlr_read_buffer(aid); return PDS_OKAY_OUTPUT; break; case CMD_RM: /* read modifed */ case SNA_CMD_RM: trace_ds("< ReadModified\n"); ctlr_read_modified(aid, false); return PDS_OKAY_OUTPUT; break; case CMD_RMA: /* read modifed all */ case SNA_CMD_RMA: trace_ds("< ReadModifiedAll\n"); ctlr_read_modified(aid, true); return PDS_OKAY_OUTPUT; break; case CMD_WSF: /* write structured field */ case SNA_CMD_WSF: trace_ds("< WriteStructuredField"); return write_structured_field(buf, buflen); break; case CMD_NOP: /* no-op */ trace_ds("< NoOp\n"); return PDS_OKAY_NO_OUTPUT; break; default: /* unknown 3270 command */ popup_an_error("Unknown 3270 Data Stream command: 0x%X\n", buf[0]); return PDS_BAD_CMD; } } /* * Functions to insert SA attributes into the inbound data stream. */ static void insert_sa1(unsigned char attr, unsigned char value, unsigned char *currentp, bool *anyp) { if (value == *currentp) return; *currentp = value; space3270out(3); *obptr++ = ORDER_SA; *obptr++ = attr; *obptr++ = value; if (*anyp) trace_ds("'"); trace_ds(" SetAttribute(%s)", see_efa(attr, value)); *anyp = false; } /* * Translate an internal character set number to a 3270DS characte set number. */ static unsigned char host_cs(unsigned char cs) { switch (cs & CS_MASK) { case CS_APL: case CS_LINEDRAW: return 0xf0 | (cs & CS_MASK); case CS_DBCS: return 0xf8; default: return 0; } } static void insert_sa(int baddr, unsigned char *current_fgp, unsigned char *current_bgp, unsigned char *current_grp, unsigned char *current_csp, unsigned char *current_icp, bool *anyp) { if (reply_mode != SF_SRM_CHAR) return; if (memchr((char *)crm_attr, XA_FOREGROUND, crm_nattr)) insert_sa1(XA_FOREGROUND, ea_buf[baddr].fg, current_fgp, anyp); if (memchr((char *)crm_attr, XA_BACKGROUND, crm_nattr)) insert_sa1(XA_BACKGROUND, ea_buf[baddr].bg, current_bgp, anyp); if (memchr((char *)crm_attr, XA_HIGHLIGHTING, crm_nattr)) { unsigned char gr; gr = ea_buf[baddr].gr; if (gr) gr |= 0xf0; insert_sa1(XA_HIGHLIGHTING, gr, current_grp, anyp); } if (memchr((char *)crm_attr, XA_CHARSET, crm_nattr)) { insert_sa1(XA_CHARSET, host_cs(ea_buf[baddr].cs), current_csp, anyp); } } /* * Process a 3270 Read-Modified command and transmit the data back to the * host. */ void ctlr_read_modified(unsigned char aid_byte, bool all) { register int baddr, sbaddr; bool send_data = true; bool short_read = false; unsigned char current_fg = 0x00; unsigned char current_bg = 0x00; unsigned char current_gr = 0x00; unsigned char current_cs = 0x00; unsigned char current_ic = 0x00; if (IN_SSCP && aid_byte != AID_ENTER) return; if (aid_byte == AID_SF) { dft_read_modified(); return; } trace_ds("> "); obptr = obuf; switch (aid_byte) { case AID_SYSREQ: /* test request */ space3270out(4); *obptr++ = EBC_soh; *obptr++ = EBC_percent; *obptr++ = EBC_slash; *obptr++ = EBC_stx; trace_ds("SysReq"); break; case AID_PA1: /* short-read AIDs */ case AID_PA2: case AID_PA3: case AID_CLEAR: if (!all) short_read = true; /* fall through... */ case AID_SELECT: /* No data on READ MODIFIED */ if (!all) send_data = false; /* fall through... */ default: /* ordinary AID */ if (!IN_SSCP) { space3270out(3); *obptr++ = aid_byte; trace_ds("%s", see_aid(aid_byte)); if (short_read) goto rm_done; ENCODE_BADDR(obptr, cursor_addr); trace_ds("%s", rcba(cursor_addr)); } else { space3270out(1); /* just in case */ } break; } baddr = 0; if (formatted) { /* find first field attribute */ do { if (ea_buf[baddr].fa) break; INC_BA(baddr); } while (baddr != 0); sbaddr = baddr; do { if (FA_IS_MODIFIED(ea_buf[baddr].fa)) { bool any = false; INC_BA(baddr); space3270out(3); *obptr++ = ORDER_SBA; ENCODE_BADDR(obptr, baddr); trace_ds(" SetBufferAddress%s", rcba(baddr)); while (!ea_buf[baddr].fa) { if (send_data && ea_buf[baddr].cc) { insert_sa(baddr, ¤t_fg, ¤t_bg, ¤t_gr, ¤t_cs, ¤t_ic, &any); if (ea_buf[baddr].cs & CS_GE) { space3270out(1); *obptr++ = ORDER_GE; if (any) trace_ds("'"); trace_ds(" GraphicEscape"); any = false; } space3270out(1); *obptr++ = ea_buf[baddr].cc; if (ea_buf[baddr].cc <= 0x3f || ea_buf[baddr].cc == 0xff) { if (any) trace_ds("'"); trace_ds(" %s", see_ebc(ea_buf[baddr].cc)); any = false; } else { if (!any) trace_ds(" '"); trace_ds("%s", see_ebc(ea_buf[baddr].cc)); any = true; } } INC_BA(baddr); } if (any) trace_ds("'"); } else { /* not modified - skip */ do { INC_BA(baddr); } while (!ea_buf[baddr].fa); } } while (baddr != sbaddr); } else { bool any = false; int nbytes = 0; /* * If we're in SSCP-LU mode, the starting point is where the * host left the cursor. */ if (IN_SSCP) baddr = sscp_start; do { if (ea_buf[baddr].cc) { insert_sa(baddr, ¤t_fg, ¤t_bg, ¤t_gr, ¤t_cs, ¤t_ic, &any); if (ea_buf[baddr].cs & CS_GE) { space3270out(1); *obptr++ = ORDER_GE; if (any) trace_ds("' "); trace_ds(" GraphicEscape "); any = false; } space3270out(1); *obptr++ = ea_buf[baddr].cc; if (ea_buf[baddr].cc <= 0x3f || ea_buf[baddr].cc == 0xff) { if (any) trace_ds("'"); trace_ds(" %s", see_ebc(ea_buf[baddr].cc)); any = false; } else { if (!any) trace_ds(" '"); trace_ds("%s", see_ebc(ea_buf[baddr].cc)); any = true; } nbytes++; } INC_BA(baddr); /* * If we're in SSCP-LU mode, end the return value at * 255 bytes, or where the screen wraps. */ if (IN_SSCP && (nbytes >= 255 || !baddr)) break; } while (baddr != 0); if (any) trace_ds("'"); } rm_done: trace_ds("\n"); net_output(); } /* * Process a 3270 Read-Buffer command and transmit the data back to the * host. */ void ctlr_read_buffer(unsigned char aid_byte) { register int baddr; unsigned char fa; bool any = false; size_t attr_count = 0; unsigned char current_fg = 0x00; unsigned char current_bg = 0x00; unsigned char current_gr = 0x00; unsigned char current_cs = 0x00; unsigned char current_ic = 0x00; if (aid_byte == AID_SF) { dft_read_modified(); return; } trace_ds("> "); obptr = obuf; space3270out(3); *obptr++ = aid_byte; ENCODE_BADDR(obptr, cursor_addr); trace_ds("%s%s", see_aid(aid_byte), rcba(cursor_addr)); baddr = 0; do { if (ea_buf[baddr].fa) { if (reply_mode == SF_SRM_FIELD) { space3270out(2); *obptr++ = ORDER_SF; } else { space3270out(4); *obptr++ = ORDER_SFE; attr_count = obptr - obuf; *obptr++ = 1; /* for now */ *obptr++ = XA_3270; } fa = ea_buf[baddr].fa & ~FA_PRINTABLE; *obptr++ = code_table[fa]; if (any) trace_ds("'"); trace_ds(" StartField%s%s%s", (reply_mode == SF_SRM_FIELD) ? "" : "Extended", rcba(baddr), see_attr(fa)); if (reply_mode != SF_SRM_FIELD) { if (ea_buf[baddr].fg) { space3270out(2); *obptr++ = XA_FOREGROUND; *obptr++ = ea_buf[baddr].fg; trace_ds("%s", see_efa(XA_FOREGROUND, ea_buf[baddr].fg)); (*(obuf + attr_count))++; } if (ea_buf[baddr].bg) { space3270out(2); *obptr++ = XA_BACKGROUND; *obptr++ = ea_buf[baddr].bg; trace_ds("%s", see_efa(XA_BACKGROUND, ea_buf[baddr].bg)); (*(obuf + attr_count))++; } if (ea_buf[baddr].gr) { space3270out(2); *obptr++ = XA_HIGHLIGHTING; *obptr++ = ea_buf[baddr].gr | 0xf0; trace_ds("%s", see_efa(XA_HIGHLIGHTING, ea_buf[baddr].gr | 0xf0)); (*(obuf + attr_count))++; } if (ea_buf[baddr].cs & CS_MASK) { space3270out(2); *obptr++ = XA_CHARSET; *obptr++ = host_cs(ea_buf[baddr].cs); trace_ds("%s", see_efa(XA_CHARSET, host_cs(ea_buf[baddr].cs))); (*(obuf + attr_count))++; } } any = false; } else { insert_sa(baddr, ¤t_fg, ¤t_bg, ¤t_gr, ¤t_cs, ¤t_ic, &any); if (ea_buf[baddr].cs & CS_GE) { space3270out(1); *obptr++ = ORDER_GE; if (any) trace_ds("'"); trace_ds(" GraphicEscape"); any = false; } space3270out(1); *obptr++ = ea_buf[baddr].cc; if (ea_buf[baddr].cc <= 0x3f || ea_buf[baddr].cc == 0xff) { if (any) trace_ds("'"); trace_ds(" %s", see_ebc(ea_buf[baddr].cc)); any = false; } else { if (!any) trace_ds(" '"); trace_ds("%s", see_ebc(ea_buf[baddr].cc)); any = true; } } INC_BA(baddr); } while (baddr != 0); if (any) trace_ds("'"); trace_ds("\n"); net_output(); } /* * Construct a 3270 command to reproduce the current state of the display, if * formatted. */ void ctlr_snap_buffer(void) { register int baddr = 0; size_t attr_count; unsigned char current_fg = 0x00; unsigned char current_bg = 0x00; unsigned char current_gr = 0x00; unsigned char current_cs = 0x00; unsigned char current_ic = 0x00; unsigned char av; space3270out(2); *obptr++ = screen_alt ? CMD_EWA : CMD_EW; *obptr++ = code_table[0]; do { if (ea_buf[baddr].fa) { space3270out(4); *obptr++ = ORDER_SFE; attr_count = obptr - obuf; *obptr++ = 1; /* for now */ *obptr++ = XA_3270; *obptr++ = code_table[ea_buf[baddr].fa & ~FA_PRINTABLE]; if (ea_buf[baddr].fg) { space3270out(2); *obptr++ = XA_FOREGROUND; *obptr++ = ea_buf[baddr].fg; (*(obuf + attr_count))++; } if (ea_buf[baddr].bg) { space3270out(2); *obptr++ = XA_BACKGROUND; *obptr++ = ea_buf[baddr].fg; (*(obuf + attr_count))++; } if (ea_buf[baddr].gr) { space3270out(2); *obptr++ = XA_HIGHLIGHTING; *obptr++ = ea_buf[baddr].gr | 0xf0; (*(obuf + attr_count))++; } if (ea_buf[baddr].cs & CS_MASK) { space3270out(2); *obptr++ = XA_CHARSET; *obptr++ = host_cs(ea_buf[baddr].cs); (*(obuf + attr_count))++; } } else { av = ea_buf[baddr].fg; if (current_fg != av) { current_fg = av; space3270out(3); *obptr++ = ORDER_SA; *obptr++ = XA_FOREGROUND; *obptr++ = av; } av = ea_buf[baddr].bg; if (current_bg != av) { current_bg = av; space3270out(3); *obptr++ = ORDER_SA; *obptr++ = XA_BACKGROUND; *obptr++ = av; } av = ea_buf[baddr].gr; if (av) av |= 0xf0; if (current_gr != av) { current_gr = av; space3270out(3); *obptr++ = ORDER_SA; *obptr++ = XA_HIGHLIGHTING; *obptr++ = av; } av = ea_buf[baddr].cs & CS_MASK; if (av) av = host_cs(av); if (current_cs != av) { current_cs = av; space3270out(3); *obptr++ = ORDER_SA; *obptr++ = XA_CHARSET; *obptr++ = av; } av = ea_buf[baddr].ic; if (current_ic != av) { current_ic = av; space3270out(3); *obptr++ = ORDER_SA; *obptr++ = XA_INPUT_CONTROL; *obptr++ = av; } if (ea_buf[baddr].cs & CS_GE) { space3270out(1); *obptr++ = ORDER_GE; } space3270out(1); *obptr++ = ea_buf[baddr].cc; } INC_BA(baddr); } while (baddr != 0); space3270out(4); *obptr++ = ORDER_SBA; ENCODE_BADDR(obptr, cursor_addr); *obptr++ = ORDER_IC; } /* * Construct a 3270 command to reproduce the reply mode. * Returns a bool indicating if one is necessary. */ bool ctlr_snap_modes(void) { int i; if (!IN_3270 || reply_mode == SF_SRM_FIELD) return false; space3270out(6 + crm_nattr); *obptr++ = CMD_WSF; *obptr++ = 0x00; /* implicit length */ *obptr++ = 0x00; *obptr++ = SF_SET_REPLY_MODE; *obptr++ = 0x00; /* partition 0 */ *obptr++ = reply_mode; if (reply_mode == SF_SRM_CHAR) for (i = 0; i < crm_nattr; i++) *obptr++ = crm_attr[i]; return true; } /* * Construct a 3270 command to reproduce the current state of the display * in SSCP-LU mode. */ void ctlr_snap_buffer_sscp_lu(void) { register int baddr = 0; /* Write out the screen contents once. */ do { if (ea_buf[baddr].cc == 0xff) { space3270out(1); *obptr++ = 0xff; } space3270out(1); *obptr++ = ea_buf[baddr].cc; INC_BA(baddr); } while (baddr != 0); /* Write them out again, until we hit where the cursor is. */ if (cursor_addr != baddr) { do { if (ea_buf[baddr].cc == 0xff) { space3270out(1); *obptr++ = 0xff; } space3270out(1); *obptr++ = ea_buf[baddr].cc; INC_BA(baddr); } while (baddr != cursor_addr); } } /* * Process a 3270 Erase All Unprotected command. */ void ctlr_erase_all_unprotected(void) { register int baddr, sbaddr; unsigned char fa; bool f; kybd_inhibit(false); ALL_CHANGED; if (formatted) { /* find first field attribute */ baddr = 0; do { if (ea_buf[baddr].fa) break; INC_BA(baddr); } while (baddr != 0); sbaddr = baddr; f = false; do { fa = ea_buf[baddr].fa; if (!FA_IS_PROTECTED(fa)) { mdt_clear(baddr); do { INC_BA(baddr); if (!f) { cursor_move(baddr); f = true; } if (!ea_buf[baddr].fa) { ctlr_add(baddr, EBC_null, 0); } } while (!ea_buf[baddr].fa); } else { do { INC_BA(baddr); } while (!ea_buf[baddr].fa); } } while (baddr != sbaddr); if (!f) cursor_move(0); } else { ctlr_clear(true); } aid = AID_NO; do_reset(false); } /* * Process a 3270 Write command. */ enum pds ctlr_write(unsigned char buf[], size_t buflen, bool erase) { register unsigned char *cp; register int baddr; unsigned char current_fa; bool last_cmd; bool last_zpt; bool wcc_keyboard_restore, wcc_sound_alarm; bool ra_ge; int i; unsigned char na; int any_fa; unsigned char efa_fg; unsigned char efa_bg; unsigned char efa_gr; unsigned char efa_cs; unsigned char efa_ic; const char *paren = "("; enum { NONE, ORDER, SBA, TEXT, NULLCH } previous = NONE; enum pds rv = PDS_OKAY_NO_OUTPUT; int fa_addr; bool add_dbcs; unsigned char add_c1, add_c2 = 0; enum dbcs_state d; enum dbcs_why why = DBCS_FIELD; bool aborted = false; char mb[16]; #define END_TEXT0 { if (previous == TEXT) trace_ds("'"); } #define END_TEXT(cmd) { END_TEXT0; trace_ds(" %s", cmd); } /* XXX: Should there be a ctlr_add_cs call here? */ #define START_FIELD(fa) { \ current_fa = fa; \ ctlr_add_fa(buffer_addr, fa, 0); \ ctlr_add_cs(buffer_addr, 0); \ ctlr_add_fg(buffer_addr, 0); \ ctlr_add_bg(buffer_addr, 0); \ ctlr_add_gr(buffer_addr, 0); \ ctlr_add_ic(buffer_addr, 0); \ trace_ds("%s", see_attr(fa)); \ formatted = true; \ } kybd_inhibit(false); if (buflen < 2) return PDS_BAD_CMD; default_fg = 0; default_bg = 0; default_gr = 0; default_cs = 0; default_ic = 0; trace_primed = true; buffer_addr = cursor_addr; if (WCC_RESET(buf[1])) { if (erase) reply_mode = SF_SRM_FIELD; trace_ds("%sreset", paren); paren = ","; } wcc_sound_alarm = WCC_SOUND_ALARM(buf[1]); if (wcc_sound_alarm) { trace_ds("%salarm", paren); paren = ","; } wcc_keyboard_restore = WCC_KEYBOARD_RESTORE(buf[1]); if (wcc_keyboard_restore) ticking_stop(); if (wcc_keyboard_restore) { trace_ds("%srestore", paren); paren = ","; } if (WCC_RESET_MDT(buf[1])) { trace_ds("%sresetMDT", paren); paren = ","; baddr = 0; if (appres.modified_sel) ALL_CHANGED; do { if (ea_buf[baddr].fa) { mdt_clear(baddr); } INC_BA(baddr); } while (baddr != 0); } if (strcmp(paren, "(")) trace_ds(")"); last_cmd = true; last_zpt = false; current_fa = get_field_attribute(buffer_addr); #define ABORT_WRITEx { \ rv = PDS_BAD_ADDR; \ aborted = true; \ break; \ } #define ABORT_WRITE(s) { \ trace_ds(" [" s "; write aborted]\n"); \ ABORT_WRITEx; \ } \ for (cp = &buf[2]; !aborted && cp < (buf + buflen); cp++) { switch (*cp) { case ORDER_SF: /* start field */ END_TEXT("StartField"); if (previous != SBA) trace_ds("%s", rcba(buffer_addr)); previous = ORDER; cp++; /* skip field attribute */ START_FIELD(*cp); ctlr_add_fg(buffer_addr, 0); ctlr_add_bg(buffer_addr, 0); INC_BA(buffer_addr); last_cmd = true; last_zpt = false; break; case ORDER_SBA: /* set buffer address */ cp += 2; /* skip buffer address */ buffer_addr = DECODE_BADDR(*(cp-1), *cp); END_TEXT("SetBufferAddress"); previous = SBA; trace_ds("%s", rcba(buffer_addr)); if (buffer_addr >= COLS * ROWS) { trace_ds("COLS %d ROWS %d\n", COLS, ROWS); ABORT_WRITE("invalid SBA address"); } current_fa = get_field_attribute(buffer_addr); last_cmd = true; last_zpt = false; break; case ORDER_IC: /* insert cursor */ END_TEXT("InsertCursor"); if (previous != SBA) trace_ds("%s", rcba(buffer_addr)); previous = ORDER; cursor_move(buffer_addr); last_cmd = true; last_zpt = false; break; case ORDER_PT: /* program tab */ END_TEXT("ProgramTab"); previous = ORDER; /* * If the buffer address is the field attribute of * of an unprotected field, simply advance one * position. */ if (ea_buf[buffer_addr].fa && !FA_IS_PROTECTED(ea_buf[buffer_addr].fa)) { INC_BA(buffer_addr); last_zpt = false; last_cmd = true; break; } /* * Otherwise, advance to the first position of the * next unprotected field. */ baddr = next_unprotected(buffer_addr); if (baddr < buffer_addr) baddr = 0; /* * Null out the remainder of the current field -- even * if protected -- if the PT doesn't follow a command * or order, or (honestly) if the last order we saw was * a null-filling PT that left the buffer address at 0. * XXX: There's some funky DBCS rule here. */ if (!last_cmd || last_zpt) { trace_ds("(nulling)"); while ((buffer_addr != baddr) && (!ea_buf[buffer_addr].fa)) { ctlr_add(buffer_addr, EBC_null, 0); ctlr_add_cs(buffer_addr, 0); ctlr_add_fg(buffer_addr, 0); ctlr_add_bg(buffer_addr, 0); ctlr_add_gr(buffer_addr, 0); ctlr_add_ic(buffer_addr, 0); INC_BA(buffer_addr); } if (baddr == 0) last_zpt = true; } else last_zpt = false; buffer_addr = baddr; last_cmd = true; break; case ORDER_RA: /* repeat to address */ END_TEXT("RepeatToAddress"); cp += 2; /* skip buffer address */ baddr = DECODE_BADDR(*(cp-1), *cp); trace_ds("%s", rcba(baddr)); cp++; /* skip char to repeat */ add_dbcs = false; ra_ge = false; previous = ORDER; if (dbcs) { d = ctlr_lookleft_state(buffer_addr, &why); if (d == DBCS_RIGHT) { ABORT_WRITE("RA over right half of DBCS character"); } if (default_cs == CS_DBCS || d == DBCS_LEFT) { add_dbcs = true; } } if (add_dbcs) { if ((baddr - buffer_addr) % 2) { ABORT_WRITE("DBCS RA with odd length"); } add_c1 = *cp; cp++; if (cp >= buf + buflen) { ABORT_WRITE("missing second half of DBCS character"); } add_c2 = *cp; if (add_c1 == EBC_null) { switch (add_c2) { case EBC_null: case EBC_nl: case EBC_em: case EBC_ff: case EBC_cr: case EBC_dup: case EBC_fm: break; default: trace_ds(" [invalid DBCS RA control character X'%02x%02x'; write aborted]", add_c1, add_c2); ABORT_WRITEx; } } else if (add_c1 < 0x40 || add_c1 > 0xfe || add_c2 < 0x40 || add_c2 > 0xfe) { trace_ds(" [invalid DBCS RA character X'%02x%02x'; write aborted]", add_c1, add_c2); ABORT_WRITEx; } (void) ebcdic_to_multibyte( (add_c1 << 8) | add_c2, mb, sizeof(mb)); trace_ds("'%s'", mb); } else { if (*cp == ORDER_GE) { ra_ge = true; trace_ds("GraphicEscape"); cp++; } add_c1 = *cp; if (add_c1) trace_ds("'"); trace_ds("%s", see_ebc(add_c1)); if (add_c1) trace_ds("'"); } if (baddr >= COLS * ROWS) { ABORT_WRITE("invalid RA address"); } do { if (add_dbcs) { ctlr_add(buffer_addr, add_c1, default_cs); } else { if (ra_ge) ctlr_add(buffer_addr, add_c1, CS_GE); else if (default_cs) ctlr_add(buffer_addr, add_c1, default_cs); else ctlr_add(buffer_addr, add_c1, 0); } ctlr_add_fg(buffer_addr, default_fg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); if (add_dbcs) { ctlr_add(buffer_addr, add_c2, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); } } while (buffer_addr != baddr); current_fa = get_field_attribute(buffer_addr); last_cmd = true; last_zpt = false; break; case ORDER_EUA: /* erase unprotected to address */ cp += 2; /* skip buffer address */ baddr = DECODE_BADDR(*(cp-1), *cp); END_TEXT("EraseUnprotectedAll"); if (previous != SBA) trace_ds("%s", rcba(baddr)); previous = ORDER; if (baddr >= COLS * ROWS) { ABORT_WRITE("invalid EUA address"); } d = ctlr_lookleft_state(buffer_addr, &why); if (d == DBCS_RIGHT) { ABORT_WRITE("EUA overwriting right half of DBCS character"); } d = ctlr_lookleft_state(baddr, &why); if (d == DBCS_LEFT) { ABORT_WRITE("EUA overwriting left half of DBCS character"); } do { if (ea_buf[buffer_addr].fa) current_fa = ea_buf[buffer_addr].fa; else if (!FA_IS_PROTECTED(current_fa)) { ctlr_add(buffer_addr, EBC_null, CS_BASE); } INC_BA(buffer_addr); } while (buffer_addr != baddr); current_fa = get_field_attribute(buffer_addr); last_cmd = true; last_zpt = false; break; case ORDER_GE: /* graphic escape */ /* XXX: DBCS? */ END_TEXT("GraphicEscape "); cp++; /* skip char */ previous = ORDER; if (*cp) trace_ds("'"); trace_ds("%s", see_ebc(*cp)); if (*cp) trace_ds("'"); ctlr_add(buffer_addr, *cp, CS_GE); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); current_fa = get_field_attribute(buffer_addr); last_cmd = false; last_zpt = false; break; case ORDER_MF: /* modify field */ END_TEXT("ModifyField"); if (previous != SBA) trace_ds("%s", rcba(buffer_addr)); previous = ORDER; cp++; na = *cp; if (ea_buf[buffer_addr].fa) { for (i = 0; i < (int)na; i++) { cp++; if (*cp == XA_3270) { trace_ds(" 3270"); cp++; ctlr_add_fa(buffer_addr, *cp, ea_buf[buffer_addr].cs); trace_ds("%s", see_attr(*cp)); } else if (*cp == XA_FOREGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; if (appres.m3279) ctlr_add_fg(buffer_addr, *cp); } else if (*cp == XA_BACKGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; if (appres.m3279) ctlr_add_bg(buffer_addr, *cp); } else if (*cp == XA_HIGHLIGHTING) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; ctlr_add_gr(buffer_addr, *cp & 0x0f); } else if (*cp == XA_CHARSET) { int cs = 0; trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; if (*cp == 0xf1) cs = CS_APL; else if (*cp == 0xf8) cs = CS_DBCS; ctlr_add_cs(buffer_addr, cs); } else if (*cp == XA_ALL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; } else if (*cp == XA_INPUT_CONTROL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); ctlr_add_ic(buffer_addr, (*(cp + 1) == 1)); cp++; } else { trace_ds("%s[unsupported]", see_efa(*cp, *(cp + 1))); cp++; } } INC_BA(buffer_addr); } else cp += na * 2; last_cmd = true; last_zpt = false; break; case ORDER_SFE: /* start field extended */ END_TEXT("StartFieldExtended"); if (previous != SBA) trace_ds("%s", rcba(buffer_addr)); previous = ORDER; cp++; /* skip order */ na = *cp; any_fa = 0; efa_fg = 0; efa_bg = 0; efa_gr = 0; efa_cs = 0; efa_ic = 0; for (i = 0; i < (int)na; i++) { cp++; if (*cp == XA_3270) { trace_ds(" 3270"); cp++; START_FIELD(*cp); any_fa++; } else if (*cp == XA_FOREGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; if (appres.m3279) efa_fg = *cp; } else if (*cp == XA_BACKGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; if (appres.m3279) efa_bg = *cp; } else if (*cp == XA_HIGHLIGHTING) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; efa_gr = *cp & 0x07; } else if (*cp == XA_CHARSET) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; if (*cp == 0xf1) efa_cs = CS_APL; else if (dbcs && (*cp == 0xf8)) efa_cs = CS_DBCS; else efa_cs = CS_BASE; } else if (*cp == XA_ALL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; } else if (*cp == XA_INPUT_CONTROL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); if (dbcs) efa_ic = (*(cp + 1) == 1); cp++; } else { trace_ds("%s[unsupported]", see_efa(*cp, *(cp + 1))); cp++; } } if (!any_fa) START_FIELD(0); ctlr_add_cs(buffer_addr, efa_cs); ctlr_add_fg(buffer_addr, efa_fg); ctlr_add_bg(buffer_addr, efa_bg); ctlr_add_gr(buffer_addr, efa_gr); ctlr_add_ic(buffer_addr, efa_ic); INC_BA(buffer_addr); last_cmd = true; last_zpt = false; break; case ORDER_SA: /* set attribute */ END_TEXT("SetAttribute"); previous = ORDER; cp++; if (*cp == XA_FOREGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); if (appres.m3279) default_fg = *(cp + 1); } else if (*cp == XA_BACKGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); if (appres.m3279) default_bg = *(cp + 1); } else if (*cp == XA_HIGHLIGHTING) { trace_ds("%s", see_efa(*cp, *(cp + 1))); default_gr = *(cp + 1) & 0x0f; } else if (*cp == XA_ALL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); default_fg = 0; default_bg = 0; default_gr = 0; default_cs = 0; default_ic = 0; } else if (*cp == XA_CHARSET) { trace_ds("%s", see_efa(*cp, *(cp + 1))); switch (*(cp + 1)) { case 0xf1: default_cs = CS_APL; break; case 0xf8: default_cs = CS_DBCS; break; default: default_cs = CS_BASE; break; } } else if (*cp == XA_INPUT_CONTROL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); if (*(cp + 1) == 1) default_ic = 1; else default_ic = 0; } else trace_ds("%s[unsupported]", see_efa(*cp, *(cp + 1))); cp++; last_cmd = true; last_zpt = false; break; case FCORDER_SUB: /* format control orders */ case FCORDER_DUP: case FCORDER_FM: case FCORDER_FF: case FCORDER_CR: case FCORDER_NL: case FCORDER_EM: case FCORDER_LF: case FCORDER_EO: END_TEXT(see_ebc(*cp)); previous = ORDER; d = ctlr_lookleft_state(buffer_addr, &why); if (default_cs == CS_DBCS || d != DBCS_NONE) { ABORT_WRITE("invalid format control order in DBCS field"); } ctlr_add(buffer_addr, *cp, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); last_cmd = true; last_zpt = false; break; case FCORDER_SO: /* Look left for errors. */ END_TEXT(see_ebc(*cp)); d = ctlr_lookleft_state(buffer_addr, &why); if (d == DBCS_RIGHT) { ABORT_WRITE("SO overwriting right half of DBCS character"); } if (d != DBCS_NONE && why == DBCS_FIELD) { ABORT_WRITE("SO in DBCS field"); } if (d != DBCS_NONE && why == DBCS_SUBFIELD) { ABORT_WRITE("double SO"); } /* All is well. */ previous = ORDER; ctlr_add(buffer_addr, *cp, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); last_cmd = true; last_zpt = false; break; case FCORDER_SI: /* Look left for errors. */ END_TEXT(see_ebc(*cp)); d = ctlr_lookleft_state(buffer_addr, &why); if (d == DBCS_RIGHT) { ABORT_WRITE("SI overwriting right half of DBCS character"); } if (d != DBCS_NONE && why == DBCS_FIELD) { ABORT_WRITE("SI in DBCS field"); } fa_addr = find_field_attribute(buffer_addr); baddr = buffer_addr; DEC_BA(baddr); while (!aborted && ((fa_addr >= 0 && baddr != fa_addr) || (fa_addr < 0 && baddr != ROWS*COLS - 1))) { if (ea_buf[baddr].cc == FCORDER_SI) { ABORT_WRITE("double SI"); } if (ea_buf[baddr].cc == FCORDER_SO) break; DEC_BA(baddr); } if (aborted) break; if (ea_buf[baddr].cc != FCORDER_SO) { ABORT_WRITE("SI without SO"); } /* All is well. */ previous = ORDER; ctlr_add(buffer_addr, *cp, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); last_cmd = true; last_zpt = false; break; case FCORDER_NULL: /* NULL or DBCS control char */ add_dbcs = false; d = ctlr_lookleft_state(buffer_addr, &why); if (d == DBCS_RIGHT) { ABORT_WRITE("NULL overwriting right half of DBCS character"); } if (d != DBCS_NONE || default_cs == CS_DBCS) { add_c1 = EBC_null; cp++; if (cp >= buf + buflen) { ABORT_WRITE("missing second half of DBCS character"); } add_c2 = *cp; switch (add_c2) { case EBC_null: case EBC_nl: case EBC_em: case EBC_ff: case EBC_cr: case EBC_dup: case EBC_fm: /* DBCS control code */ END_TEXT(see_ebc(add_c2)); add_dbcs = true; break; case ORDER_SF: case ORDER_SFE: /* Dead position */ END_TEXT("DeadNULL"); cp--; break; default: trace_ds(" [invalid DBCS control character X'%02x%02x'; write aborted]", add_c1, add_c2); ABORT_WRITEx; break; } if (aborted) break; } else { END_TEXT("NULL"); add_c1 = *cp; } previous = NULLCH; ctlr_add(buffer_addr, add_c1, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); if (add_dbcs) { ctlr_add(buffer_addr, add_c2, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); } last_cmd = false; last_zpt = false; break; default: /* enter character */ if (*cp <= 0x3F) { END_TEXT("UnsupportedOrder"); trace_ds("(%02X)", *cp); previous = ORDER; last_cmd = true; last_zpt = false; break; } if (previous != TEXT) trace_ds(" '"); previous = TEXT; add_dbcs = false; d = ctlr_lookleft_state(buffer_addr, &why); if (d == DBCS_RIGHT) { ABORT_WRITE("overwriting right half of DBCS character"); } if (d != DBCS_NONE || default_cs == CS_DBCS) { add_c1 = *cp; cp++; if (cp >= buf + buflen) { ABORT_WRITE("missing second half of DBCS character"); } add_c2 = *cp; if (add_c1 < 0x40 || add_c1 > 0xfe || add_c2 < 0x40 || add_c2 > 0xfe) { trace_ds(" [invalid DBCS character X'%02x%02x'; write aborted]", add_c1, add_c2); ABORT_WRITEx; } add_dbcs = true; (void) ebcdic_to_multibyte( (add_c1 << 8) | add_c2, mb, sizeof(mb)); trace_ds("%s", mb); } else { add_c1 = *cp; trace_ds("%s", see_ebc(*cp)); } ctlr_add(buffer_addr, add_c1, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); if (add_dbcs) { ctlr_add(buffer_addr, add_c2, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); } last_cmd = false; last_zpt = false; break; } } set_formatted(); END_TEXT0; trace_ds("\n"); kybdlock_clr(KL_AWAITING_FIRST, "ctlr_write"); if (wcc_keyboard_restore) { aid = AID_NO; do_reset(false); } else if (kybdlock & KL_OIA_TWAIT) { kybdlock_clr(KL_OIA_TWAIT, "ctlr_write"); status_syswait(); } if (wcc_sound_alarm) ring_bell(); /* Set up the DBCS state. */ if (ctlr_dbcs_postprocess() < 0 && rv == PDS_OKAY_NO_OUTPUT) rv = PDS_BAD_ADDR; trace_primed = false; ps_process(); /* Let a script go. */ sms_host_output(); /* Tell 'em what happened. */ return rv; } #undef START_FIELDx #undef START_FIELD0 #undef START_FIELD #undef END_TEXT0 #undef END_TEXT #undef ABORT_WRITEx #undef ABORT_WRITE /* * Write SSCP-LU data, which is quite a bit dumber than regular 3270 * output. */ void ctlr_write_sscp_lu(unsigned char buf[], size_t buflen) { size_t i; unsigned char *cp = buf; int s_row; unsigned char c; int baddr; int text = false; /* * The 3174 Functionl Description says that anything but NL, NULL, FM, * or DUP is to be displayed as a graphic. However, to deal with * badly-behaved hosts, we filter out SF, IC and SBA sequences, and * we display other control codes as spaces. */ trace_ds("SSCP-LU data\n< "); for (i = 0; i < buflen; cp++, i++) { switch (*cp) { case FCORDER_NL: /* * Insert NULLs to the end of the line and advance to * the beginning of the next line. */ if (text) { trace_ds("'"); text = false; } trace_ds(" NL"); s_row = buffer_addr / COLS; while ((buffer_addr / COLS) == s_row) { ctlr_add(buffer_addr, EBC_null, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); } break; case ORDER_SF: /* Some hosts forget they're talking SSCP-LU. */ cp++; i++; if (text) { trace_ds("'"); text = false; } trace_ds(" SF%s %s [translated to space]\n", rcba(buffer_addr), see_attr(*cp)); ctlr_add(buffer_addr, EBC_space, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); break; case ORDER_IC: if (text) { trace_ds("'"); text = false; } trace_ds(" IC%s [ignored]\n", rcba(buffer_addr)); break; case ORDER_SBA: baddr = DECODE_BADDR(*(cp+1), *(cp+2)); trace_ds(" SBA%s [ignored]\n", rcba(baddr)); cp += 2; i += 2; break; case ORDER_GE: cp++; if (++i >= buflen) break; if (*cp <= 0x40) c = EBC_space; else c = *cp; if (text) { trace_ds("'"); text = false; } trace_ds(" GE '%s'", see_ebc(c)); ctlr_add(buffer_addr, c, CS_GE); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); break; default: if (!text) { trace_ds(" '"); text = true; } trace_ds("%s", see_ebc(*cp)); ctlr_add(buffer_addr, *cp, default_cs); ctlr_add_fg(buffer_addr, default_fg); ctlr_add_bg(buffer_addr, default_bg); ctlr_add_gr(buffer_addr, default_gr); ctlr_add_ic(buffer_addr, default_ic); INC_BA(buffer_addr); break; } } if (text) trace_ds("'"); trace_ds("\n"); cursor_move(buffer_addr); sscp_start = buffer_addr; /* Unlock the keyboard. */ aid = AID_NO; do_reset(false); /* Let a script go. */ sms_host_output(); } /* * Determine the DBCS state of a buffer location strictly by looking left. * Used only to validate write operations. * Returns only DBCS_LEFT, DBCS_RIGHT or DBCS_NONE. * Also returns whether the location is part of a DBCS field (SFE with the * DBCS character set), DBCS subfield (to the right of an SO within a non-DBCS * field), or DBCS attribute (has the DBCS character set extended attribute * within a non-DBCS field). * * This function should be used only to determine the legality of adding a * DBCS or SBCS character at baddr. */ enum dbcs_state ctlr_lookleft_state(int baddr, enum dbcs_why *why) { int faddr; int fdist; int xaddr; bool si = false; #define AT_END(f, b) \ (((f) < 0 && (b) == ROWS*COLS - 1) || \ ((f) >= 0 && (b) == (f))) /* If we're not in DBCS state, everything is DBCS_NONE. */ if (!dbcs) return DBCS_NONE; /* Find the field attribute, if any. */ faddr = find_field_attribute(baddr); /* * First in precedence is a DBCS field. * DBCS SA and SO/SI inside a DBCS field are errors, but are considered * defective DBCS characters. */ if (ea_buf[faddr].cs == CS_DBCS) { *why = DBCS_FIELD; fdist = (baddr + ROWS*COLS) - faddr; return (fdist % 2)? DBCS_LEFT: DBCS_RIGHT; } /* * The DBCS attribute takes precedence next. * SO and SI can appear within such a region, but they are single-byte * characters which effectively split it. */ if (ea_buf[baddr].cs == CS_DBCS) { if (ea_buf[baddr].cc == EBC_so || ea_buf[baddr].cc == EBC_si) return DBCS_NONE; xaddr = baddr; while (!AT_END(faddr, xaddr) && ea_buf[xaddr].cs == CS_DBCS && ea_buf[xaddr].cc != EBC_so && ea_buf[xaddr].cc != EBC_si) { DEC_BA(xaddr); } *why = DBCS_ATTRIBUTE; fdist = (baddr + ROWS*COLS) - xaddr; return (fdist % 2)? DBCS_LEFT: DBCS_RIGHT; } /* * Finally, look for a SO not followed by an SI. */ xaddr = baddr; DEC_BA(xaddr); while (!AT_END(faddr, xaddr)) { if (ea_buf[xaddr].cc == EBC_si) si = true; else if (ea_buf[xaddr].cc == EBC_so) { if (si) si = false; else { *why = DBCS_SUBFIELD; fdist = (baddr + ROWS*COLS) - xaddr; return (fdist % 2)? DBCS_LEFT: DBCS_RIGHT; } } DEC_BA(xaddr); } /* Nada. */ return DBCS_NONE; } static bool valid_dbcs_char(unsigned char c1, unsigned char c2) { if (c1 >= 0x40 && c1 < 0xff && c2 >= 0x40 && c2 < 0xff) return true; if (c1 != 0x00 || c2 < 0x40 || c2 >= 0xff) return false; switch (c2) { case EBC_null: case EBC_nl: case EBC_em: case EBC_ff: case EBC_cr: case EBC_dup: case EBC_fm: return true; default: return false; } } /* * Post-process DBCS state in the buffer. * This has two purposes: * * - Required post-processing validation, per the data stream spec, which can * cause the write operation to be rejected. * - Setting up the value of the all the db fields in ea_buf. * * This function is called at the end of every 3270 write operation, and also * after each batch of NVT write operations. It could also be called after * significant keyboard operations, but that might be too expensive. * * Returns 0 for success, -1 for failure. */ int ctlr_dbcs_postprocess(void) { int baddr; /* current buffer address */ int faddr0; /* address of first field attribute */ int faddr; /* address of current field attribute */ int last_baddr; /* last buffer address to search */ int pbaddr = -1; /* previous buffer address */ int dbaddr = -1; /* first data position of current DBCS (sub-) field */ bool so = false, si = false; bool dbcs_field = false; int rc = 0; /* If we're not in DBCS mode, do nothing. */ if (!dbcs) return 0; /* * Find the field attribute for location 0. If unformatted, it's the * dummy at -1. Also compute the starting and ending points for the * scan: the first location after that field attribute. */ faddr0 = find_field_attribute(0); baddr = faddr0; INC_BA(baddr); if (faddr0 < 0) last_baddr = 0; else last_baddr = faddr0; faddr = faddr0; dbcs_field = (ea_buf[faddr].cs & CS_MASK) == CS_DBCS; do { if (ea_buf[baddr].fa) { faddr = baddr; ea_buf[faddr].db = DBCS_NONE; dbcs_field = (ea_buf[faddr].cs & CS_MASK) == CS_DBCS; if (dbcs_field) { dbaddr = baddr; INC_BA(dbaddr); } else { dbaddr = -1; } /* * An SI followed by a field attribute shouldn't be * displayed with a wide cursor. */ if (pbaddr >= 0 && ea_buf[pbaddr].db == DBCS_SI) ea_buf[pbaddr].db = DBCS_NONE; } else { switch (ea_buf[baddr].cc) { case EBC_so: /* Two SO's or SO in DBCS field are invalid. */ if (so || dbcs_field) { trace_ds("DBCS postprocess: invalid SO " "found at %s\n", rcba(baddr)); rc = -1; } else { dbaddr = baddr; INC_BA(dbaddr); } ea_buf[baddr].db = DBCS_NONE; so = true; si = false; break; case EBC_si: /* Two SI's or SI in DBCS field are invalid. */ if (si || dbcs_field) { trace_ds("Postprocess: Invalid SO found " "at %s\n", rcba(baddr)); rc = -1; ea_buf[baddr].db = DBCS_NONE; } else { ea_buf[baddr].db = DBCS_SI; } dbaddr = -1; si = true; so = false; break; default: /* Non-base CS in DBCS subfield is invalid. */ if (so && ea_buf[baddr].cs != CS_BASE) { trace_ds("DBCS postprocess: invalid " "character set found at %s\n", rcba(baddr)); rc = -1; ea_buf[baddr].cs = CS_BASE; } if ((ea_buf[baddr].cs & CS_MASK) == CS_DBCS) { /* * Beginning or continuation of an SA DBCS * subfield. */ if (dbaddr < 0) { dbaddr = baddr; } } else if (!so && !dbcs_field) { /* * End of SA DBCS subfield. */ dbaddr = -1; } if (dbaddr >= 0) { /* * Turn invalid characters into spaces, * silently. */ if ((baddr + ROWS*COLS - dbaddr) % 2) { if (!valid_dbcs_char( ea_buf[pbaddr].cc, ea_buf[baddr].cc)) { ea_buf[pbaddr].cc = EBC_space; ea_buf[baddr].cc = EBC_space; } MAKE_RIGHT(baddr); } else { MAKE_LEFT(baddr); } } else ea_buf[baddr].db = DBCS_NONE; break; } } /* * Check for dead positions. * Turn them into NULLs, silently. */ if (pbaddr >= 0 && IS_LEFT(ea_buf[pbaddr].db) && !IS_RIGHT(ea_buf[baddr].db) && ea_buf[pbaddr].db != DBCS_DEAD) { if (!ea_buf[baddr].fa) { trace_ds("DBCS postprocess: dead position " "at %s\n", rcba(pbaddr)); rc = -1; } ea_buf[pbaddr].cc = EBC_null; ea_buf[pbaddr].db = DBCS_DEAD; } /* Check for SB's, which follow SIs. */ if (pbaddr >= 0 && ea_buf[pbaddr].db == DBCS_SI) ea_buf[baddr].db = DBCS_SB; /* Save this position as the previous and increment. */ pbaddr = baddr; INC_BA(baddr); } while (baddr != last_baddr); return rc; } /* * Process pending input. */ void ps_process(void) { while (run_ta()) ; sms_continue(); /* Process file transfers. */ if (ft_state != FT_NONE && /* transfer in progress */ formatted && /* screen is formatted */ !screen_alt && /* 24x80 screen */ !kybdlock && /* keyboard not locked */ /* magic field */ ea_buf[1919].fa && FA_IS_SKIP(ea_buf[1919].fa)) { ft_cut_data(); } } /* * Tell me if there is any data on the screen. */ bool ctlr_any_data(void) { register int i; if (ea_buf == NULL) return false; for (i = 0; i < ROWS*COLS; i++) { if (!IsBlank(ea_buf[i].cc)) return true; } return false; } /* * Clear the text (non-status) portion of the display. Also resets the cursor * and buffer addresses and extended attributes. */ void ctlr_clear(bool can_snap) { /* Snap any data that is about to be lost into the trace file. */ if (ctlr_any_data()) { if (can_snap && !trace_skipping && toggled(SCREEN_TRACE)) { trace_screen(true); } scroll_save(maxROWS, ever_3270 ? false : true); } trace_skipping = false; /* Clear the screen. */ (void) memset((char *)ea_buf, 0, ROWS*COLS*sizeof(struct ea)); ALL_CHANGED; cursor_move(0); buffer_addr = 0; unselect(0, ROWS*COLS); formatted = false; default_fg = 0; default_bg = 0; default_gr = 0; default_ic = 0; sscp_start = 0; } /* * Fill the screen buffer with blanks. */ static void ctlr_blanks(void) { int baddr; for (baddr = 0; baddr < maxROWS*maxCOLS; baddr++) { ea_buf[baddr].cc = EBC_space; } ALL_CHANGED; cursor_move(0); buffer_addr = 0; unselect(0, ROWS*COLS); formatted = false; } /* * Change a character in the 3270 buffer. * Removes any field attribute defined at that location. */ void ctlr_add(int baddr, unsigned char c, unsigned char cs) { unsigned char oc = 0; if (ea_buf[baddr].fa || ((oc = ea_buf[baddr].cc) != c || ea_buf[baddr].cs != cs)) { if (trace_primed && !IsBlank(oc)) { if (toggled(SCREEN_TRACE)) { trace_screen(false); } scroll_save(maxROWS, false); trace_primed = false; } if (screen_selected(baddr)) { unselect(baddr, 1); } ONE_CHANGED(baddr); ea_buf[baddr].cc = c; ea_buf[baddr].cs = cs; ea_buf[baddr].fa = 0; } } /* * Set a field attribute in the 3270 buffer. */ void ctlr_add_fa(int baddr, unsigned char fa, unsigned char cs) { /* Put a null in the display buffer. */ ctlr_add(baddr, EBC_null, cs); /* * Store the new attribute, setting the 'printable' bits so that the * value will be non-zero. */ ea_buf[baddr].fa = FA_PRINTABLE | (fa & FA_MASK); } /* * Change the character set for a field in the 3270 buffer. */ void ctlr_add_cs(int baddr, unsigned char cs) { if (ea_buf[baddr].cs != cs) { if (screen_selected(baddr)) { unselect(baddr, 1); } ONE_CHANGED(baddr); ea_buf[baddr].cs = cs; } } /* * Change the graphic rendition of a character in the 3270 buffer. */ void ctlr_add_gr(int baddr, unsigned char gr) { if (ea_buf[baddr].gr != gr) { if (screen_selected(baddr)) { unselect(baddr, 1); } ONE_CHANGED(baddr); ea_buf[baddr].gr = gr; if (gr & GR_BLINK) { blink_start(); } } } /* * Change the foreground color for a character in the 3270 buffer. */ void ctlr_add_fg(int baddr, unsigned char color) { if (!appres.m3279) { return; } if ((color & 0xf0) != 0xf0) { color = 0; } if (ea_buf[baddr].fg != color) { if (screen_selected(baddr)) { unselect(baddr, 1); } ONE_CHANGED(baddr); ea_buf[baddr].fg = color; } } /* * Change the background color for a character in the 3270 buffer. */ void ctlr_add_bg(int baddr, unsigned char color) { if (!appres.m3279) { return; } if ((color & 0xf0) != 0xf0) { color = 0; } if (ea_buf[baddr].bg != color) { if (screen_selected(baddr)) { unselect(baddr, 1); } ONE_CHANGED(baddr); ea_buf[baddr].bg = color; } } /* * Change the input control bit for a character in the 3270 buffer. */ static void ctlr_add_ic(int baddr, unsigned char ic) { ea_buf[baddr].ic = ic; } /* * Wrapping bersion of ctlr_bcopy. */ void ctlr_wrapping_memmove(int baddr_to, int baddr_from, int count) { /* * The 'to' region, the 'from' region, or both can wrap the screen, * and can overlap each other. memmove() is smart enough to deal with * overlaps, but not across a screen wrap. * * It's faster to figure out if none of this is true, then do a slow * location-at-a-time version only if it happens. */ if (baddr_from + count <= ROWS*COLS && baddr_to + count <= ROWS*COLS) { ctlr_bcopy(baddr_from, baddr_to, count, true); } else { int i, from, to; for (i = 0; i < count; i++) { if (baddr_to > baddr_from) { /* Shifting right, move left. */ to = (baddr_to + count - 1 - i) % ROWS*COLS; from = (baddr_from + count - 1 - i) % ROWS*COLS; } else { /* Shifting left, move right. */ to = (baddr_to + i) % ROWS*COLS; from = (baddr_from + i) % ROWS*COLS; } ctlr_bcopy(from, to, 1, true); } } } /* * Copy a block of characters in the 3270 buffer, optionally including all of * the extended attributes. (The character set, which is actually kept in the * extended attributes, is considered part of the characters here.) */ void ctlr_bcopy(int baddr_from, int baddr_to, int count, int move_ea) { /* Move the characters. */ if (memcmp((char *) &ea_buf[baddr_from], (char *) &ea_buf[baddr_to], count * sizeof(struct ea))) { (void) memmove(&ea_buf[baddr_to], &ea_buf[baddr_from], count * sizeof(struct ea)); REGION_CHANGED(baddr_to, baddr_to + count); /* * For the time being, if any selected text shifts around on * the screen, unhighlight it. Eventually there should be * logic for preserving the highlight if the *all* of the * selected text moves. */ if (area_is_selected(baddr_to, count)) unselect(baddr_to, count); } /* XXX: What about move_ea? */ } /* * Erase a region of the 3270 buffer, optionally clearing extended attributes * as well. */ void ctlr_aclear(int baddr, int count, int clear_ea) { if (memcmp((char *) &ea_buf[baddr], (char *) zero_buf, count * sizeof(struct ea))) { (void) memset((char *) &ea_buf[baddr], 0, count * sizeof(struct ea)); REGION_CHANGED(baddr, baddr + count); if (area_is_selected(baddr, count)) unselect(baddr, count); } /* XXX: What about clear_ea? */ } /* * Scroll the screen 1 row. * * This could be accomplished with ctlr_bcopy() and ctlr_aclear(), but this * operation is common enough to warrant a separate path. */ void ctlr_scroll(void) { int qty = (ROWS - 1) * COLS; bool obscured; /* Make sure nothing is selected. (later this can be fixed) */ unselect(0, ROWS*COLS); /* Synchronize pending changes prior to this. */ obscured = screen_obscured(); if (!obscured && screen_changed) screen_disp(false); /* Move ea_buf. */ (void) memmove(&ea_buf[0], &ea_buf[COLS], qty * sizeof(struct ea)); /* Clear the last line. */ (void) memset((char *) &ea_buf[qty], 0, COLS * sizeof(struct ea)); /* Update the screen. */ if (obscured) { ALL_CHANGED; } else { screen_scroll(); } } /* * Note that a particular region of the screen has changed. */ void ctlr_changed(int bstart, int bend) { REGION_CHANGED(bstart, bend); } /* * Swap the regular and alternate screen buffers */ void ctlr_altbuffer(bool alt) { struct ea *etmp; if (alt != is_altbuffer) { etmp = ea_buf; ea_buf = aea_buf; aea_buf = etmp; is_altbuffer = alt; ALL_CHANGED; unselect(0, ROWS*COLS); /* * There may be blinkers on the alternate screen; schedule one * iteration just in case. */ blink_start(); } } /* * Set or clear the MDT on an attribute */ void mdt_set(int baddr) { int faddr; faddr = find_field_attribute(baddr); if (faddr >= 0 && !(ea_buf[faddr].fa & FA_MODIFY)) { ea_buf[faddr].fa |= FA_MODIFY; if (appres.modified_sel) ALL_CHANGED; } } void mdt_clear(int baddr) { int faddr; faddr = find_field_attribute(baddr); if (faddr >= 0 && (ea_buf[faddr].fa & FA_MODIFY)) { ea_buf[faddr].fa &= ~FA_MODIFY; if (appres.modified_sel) ALL_CHANGED; } } /* * Support for screen-size swapping for scrolling */ void ctlr_shrink(void) { int baddr; for (baddr = 0; baddr < ROWS*COLS; baddr++) { if (!ea_buf[baddr].fa) ea_buf[baddr].cc = visible_control? EBC_space : EBC_null; } ALL_CHANGED; screen_disp(false); } /* * DBCS state query. * Returns: * DBCS_NONE: Buffer position is SBCS. * DBCS_LEFT: Buffer position is left half of a DBCS character. * DBCS_RIGHT: Buffer position is right half of a DBCS character. * DBCS_SI: Buffer position is the SI terminating a DBCS subfield (treated * as DBCS_LEFT for wide cursor tests) * DBCS_SB: Buffer position is an SBCS character after an SI (treated as * DBCS_RIGHT for wide cursor tests) * * Takes line-wrapping into account, which probably isn't done all that well. */ enum dbcs_state ctlr_dbcs_state_ea(int baddr, struct ea *ea) { return dbcs? ea[baddr].db: DBCS_NONE; } enum dbcs_state ctlr_dbcs_state(int baddr) { return ctlr_dbcs_state_ea(baddr, ea_buf); } /* * Transaction timing. The time between sending an interrupt (PF, PA, Enter, * Clear) and the host unlocking the keyboard is indicated on the status line * to an accuracy of 0.1 seconds. If we don't repaint the screen before we see * the unlock, the time should be fairly accurate. */ static struct timeval t_start; static bool ticking = false; static bool mticking = false; static ioid_t tick_id; static struct timeval t_want; /* Return the difference in milliseconds between two timevals. */ static long delta_msec(struct timeval *t1, struct timeval *t0) { return (t1->tv_sec - t0->tv_sec) * 1000 + (t1->tv_usec - t0->tv_usec + 500) / 1000; } static void keep_ticking(ioid_t id _is_unused) { struct timeval t1; long msec; do { (void) gettimeofday(&t1, (struct timezone *) 0); t_want.tv_sec++; msec = delta_msec(&t_want, &t1); } while (msec <= 0); tick_id = AddTimeOut(msec, keep_ticking); status_timing(&t_start, &t1); } void ticking_start(bool anyway) { (void) gettimeofday(&t_start, (struct timezone *) 0); mticking = true; if (!toggled(SHOW_TIMING) && !anyway) { return; } status_untiming(); if (ticking) { RemoveTimeOut(tick_id); } ticking = true; tick_id = AddTimeOut(1000, keep_ticking); t_want = t_start; } static void ticking_stop(void) { struct timeval t1; (void) gettimeofday(&t1, (struct timezone *) 0); if (mticking) { sms_accumulate_time(&t_start, &t1); mticking = false; } else { return; } if (!ticking) { return; } RemoveTimeOut(tick_id); ticking = false; status_timing(&t_start, &t1); } /* * Queries. */ const char * ctlr_query_cur_size(void) { return lazyaf("%u %u", ROWS, COLS); } const char * ctlr_query_cursor(void) { return lazyaf("%u %u", cursor_addr / COLS, cursor_addr % COLS); } const char * ctlr_query_formatted(void) { return formatted? "formatted": "unformatted"; } const char * ctlr_query_max_size(void) { return lazyaf("%u %u", maxROWS, maxCOLS); } suite3270-3.6/Common/event.c0000664000076500007650000000641513221577163013717 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * event.c * Event propagation. */ #include "globals.h" #include "utils.h" typedef struct st_callback { llist_t list; schange_callback_t *func; unsigned short order; } st_callback_t; llist_t st_callbacks[N_ST]; static bool schange_initted = false; /* Callback initialization. */ static void init_schange(void) { if (!schange_initted) { int i; for (i = 0; i < N_ST; i++) { llist_init(&st_callbacks[i]); } schange_initted = true; } } /* * Register a function with a particular order. * 'order' can be: * ORDER_DONTCARE (65534) insert anywhere (will actually queue up before * any 'last') * ORDER_LAST (65535) insert last (the order of multiple 'lasts' is * undefined) * 0 through 65533 specific ordering */ void register_schange_ordered(int tx, schange_callback_t *func, unsigned short order) { st_callback_t *st; st_callback_t *before; /* Get the lists set up. */ init_schange(); st = (struct st_callback *)Malloc(sizeof(*st)); llist_init(&st->list); st->func = func; st->order = order; FOREACH_LLIST(&st_callbacks[tx], before, st_callback_t *) { if (order < before->order) { llist_insert_before(&st->list, &before->list); return; } } FOREACH_LLIST_END(&st_callbacks[tx], before, st_callback_t *); llist_insert_before(&st->list, &st_callbacks[tx]); } /* Register a function interested in a state change. */ void register_schange(int tx, schange_callback_t *func) { register_schange_ordered(tx, func, ORDER_DONTCARE); } /* Signal a state change. */ void st_changed(int tx, bool mode) { struct st_callback *st; FOREACH_LLIST(&st_callbacks[tx], st, st_callback_t *) { (*st->func)(mode); } FOREACH_LLIST_END(&st_callbacks[tx], st, st_callback_t *); } suite3270-3.6/Common/favicon.ico0000664000076500007650000003107613221577163014554 0ustar pdmpdm@@(2(@€2•¦²­·”¥±}Ÿ…˜¥yœr‡–Yn~e}Žbz‹bz‹bz‹hi€s‰™†š§·Âʤ°º“¢­{]t„Zp“¡t‰˜oƒ’s‡–r‡–r‡–n„”ay‰[t…bzŠd|j‘i‘ay‰m…”n…”rˆ˜u‹švŒœvŒ›wsŠšz†™¦£®·™£s…“Xn~DWgCVfShxYoXn\s„Yq‚]u…^v‡ax‰bzŠhg~f~Žhj€‘n…•m…”q‡—sŠ™xŽ}’¡…™§Šž«‚–¥Šž¬¡®“¦³”¦´’¥²•¨µ–¥sŠ™r‰˜rˆ˜o†•ƒ—¤†˜¤JarF]nH_qJbsQizRj{byŠf}Že|Œhi€p†•uŠ™yŽzŸ”¢•¤€•£}’¢~“¢‚—¥‚—¥‚—¦†š©ˆª‹ž¬‹Ÿ¬Ž¢¯Šž¬„˜§Ž¢¯£±‘¤±¢°“¥³‘¤²u‹›qˆ˜vŒœvŒ›wŒœ˜¨µ¯¼Å’¤¯g}iŽk‚’mƒ“tŠ™xŽœ„™§†›¨‡›©‡›©ˆœª‹ž¬‹Ÿ¬‡›ª„™§‚—¦„˜§€•¤€•¤~”£~”£{‘ |‘ |‘ –¥”£”£„™§†š©„˜§…™¨Ž¡¯‹ž­Šž­Ž¡¯–¨µŠž«uŠš~“¢–¥€•¤|‘¡†š¨“¦²½ÈÏ´ÁÊŽ¢¯¢°Ž¢¯£±“¥³’¥²’¦²”§´’¥³¡¯‹ž­‡œª€•¤zŸvŒœxŽvŒœsŠ™u‹št‰˜wtŠ™s‡–s…“yŠ—x‰–{Œ˜y‹—s…’i|ŠWgtz‹—Šž¬…˜¦†˜¤‹›¥’¥²…™§| †š©‡›©…™¨„˜§Šž¬’¥²¨¹Ã—ª·“¦³’¥²“¦³”§´’¥³Ž¡¯žª…—£‚”¡}s‡•k€eyˆ^p}SeqJ[iQbn7EP1;D!-6*      !+4>MZ *4& VeqŠ«{Ÿ€”£Œ ­¡®‹Ÿ­¡¯Ž¢°ÃÎÕ°¾È”¦³Ž¡¯’¦³˜ª·’¥³•§´]go8@I8>G;CJ.8A%/8&0"#&&!*&0".93@J;HQHVbTbm$,4   '*3;  " !!*Tbm„™¨~“¢ˆœªŽ¡¯¡¯”§´•¨µ¾Éѯ½Ç¡®•¨µ„• ZjuNZc$.7  KZf/9C&-!+5.;G8DNBOZK[hPcq_rhz‡kŒvŠ˜„—¤ŒŸ«œ®¹ž°¼}Š“P\fXcl+4=&/ !% $qƒ‘‰¬…™§¡¯£°˜«·›­¹‘ «©¸Â“¦³fqz  ",  fu€†–¡‚•¡”¢‡š¨…™¦ƒ—¦„˜¦‚—¥‰«¡¯“¦³—ª¶™«· ±¼£´À¦·Â¬¼Æ­½Ç·ÅÌQW]#/;E&# 9DLŠªŠž¬†›©¢°’¥³•¦³K`p€“Ÿœ®¸„”ž!)2 "-'2$+1;?BŠš¥œ®»—ª¶“¦³¢°¢°£°£±•¨µ—ª·—ª·¯º ±½Ÿ±½¢²¾¦·Á®¿È±ÁÊ‚Ž– &+7A ) **4=}‘ž£°‡œ©ˆœª¡¯Œž«CVeo†–„™¦‰œ©³ÀÈ„’œ8@I %1*6"*18u…¢´Àœ®º”§³“¥²¢¯ŒŸ­ŒŸ¬Ž¡®¡®¢¯“¥±’¤±–§³¡­‘¡¬”¤¯’Ÿw…‘-9C#.71>H*7C+)!)1?Iq…“Ž¢°‰ªˆ«’ G2;C-7?$.7*4%$  3@L~’Ÿ‘¥²†›©p‚6K\d{Œc{‹e}h€t‹š—©´P[d:CL+7A%.")%             8FQu…’s„‘GXf;O_e}e|Œd|Œf~Ži€l„“s‰™u‰˜.5; *            ! $ "    *#1="0<,;AVff~Že|hi€‘hj‘lƒ“j€u‰—|œŸ¤¨=DK)1$,4$-)$/*6 .:)5*6.<"3A$5C$6D&8E&8F%7F':I"2A#4C 1A,;+:)9*9 .,&&))!0"0%4Mcsh€i€‘lƒ’i€‘j’lƒ“k‚’k‚’e}Ž`w‡ž§­o|…–¢zˆ’YlzRfvRiyE\n?Vh9Pb7N`6L^5K].DU,BS-CT.CU/EV*?P)=O$8I"5E.?*9'6-*& $ " "'+!/Ndslƒ“k‚’m„”k‚’m„”n…”lƒ“k‚’i€]u†g|‹…˜¦e}Ž[s„Um~H`rE[m>Ug8N`4J\4J\0FW+AR.CT/EV-CT)=N';L%8I"5F-=&4!/) '  ! "  " # $Mbrkƒ’m„“lƒ’lƒ“k‚’n…•m„”j’g^v‡ezŠ€•£d|ŒTl}OgyF^pBYk=Tf8Oa4K\3J[.CU,AS/DU/EV)=N%9J%8I%8I$7H1B&6 -' ! !      !Tjzkƒ’lƒ“n…•o†•lƒ“n…•lƒ“he|Œax‰aw‡}‘ `xˆKcuKbtAXj,<"/) $ &   "   "^u„n…•m„”o†–p‡—n…”p‡—m„”hg~bz‹_u†”¢_u†QgyQi{JbsG^pF^oC[m;Rd9Oa6M^4J\5L^/EV(=N&:K%:K';L#7H 3C0@(6%4 - - -,!/+!.9?N\p‡–r‰˜p‡—n…•p‡—p‡—q‡—o†–j‘hayŠwŒšˆ›¨cyˆbxˆ`wˆXp€NfwLctE\m>Uf=Se:Pb4J\3J\/DV*?P';K%9I(0@#4C4HW`u…v‹švŒœt‹šr‰™qˆ˜qˆ—o†–m„”m„”k‚’hc{Œ„—¤h}‹F[lCWh?Te>Te:O`>TdDYjLbsLbrQfwWm}^u…\r‚Wm~Xo~Wm}Zp€Uk|NeuI`q@Ug?Ug?Vg6K]7K\I`pd{Šrˆ˜wxŽt‹šsŠ™t‹šuŒ›rˆ˜lƒ“j‘mƒ“j‘i€‘e~Žz𢱼ˆ›¨” q„’n€Žqƒ‘zŒ™’Ÿˆ™¦Œž«¡­¡­¢®¡­ŽŸª‹›§ˆ™¥‰š¥‰š¦Šœ¨†™¥†™¦…˜¥€”¡xŒšm‚’Um}e{‹u‹šzŸyŸxŽxu‹št‹štŠšwt‹šlƒ“j‘l‚’j‚‘f~Žc{‹yŒ™°À̵ÄΨ¹Ä—¦°‰•u„Ž_kuY`f^di^dh]dhV]bQY`JSYDOV=GN7>D4:@29C4;D5Dª»ÇªºÅ¨¸Ã¤µÀŸ²½œ¯»š¬¸˜«·•©µ—©¶’¥³¢°Œ ®Šž¬ˆœ«‡œª‡›ª‚–¥wœ).4      "                 ?DI§¸ÃªºÄ©¹Ä¦·Á¡²¾ž°¼˜ª·˜«·–ª¶–¨µ’¥²Ž¢¯‹Ÿ­Šž¬Š¬Šž«†š©ƒ—¦zž).4      "                   CIL¥·Â«¼ÅªºÄ¦¶Á¢³¾Ÿ±¼œ®º™«·”§´•§´‘¤±¢¯ŠŸ­‹ ­Šž¬ˆœ«–¤‚—¥}’¡'+0     # -:@)             Xci¨ºÅ­½ÇªºÅ¨¹Ã£´¿ž°»Ÿ±½™«·’¥³”§´“¦³¢° ®Œ ®Šž¬…š©‚—¥€”¤xž'+0     ! + $80                ju}¨¹Ä®¾ÈªºÄ¨¹Ä¤µÁŸ²½ž°¼™¬¸“¦³•§´“¦³‘¤²£°Ž¢¯ŒŸ®‰¬‡›©“£r‰˜¸ÃÌ)17      # .:              u†¤µÁ®¾ÈªºÄ¨¹Ä¤µÀ¡³¾®º™¬¸“¦³”¦³“¥²“¦³‘¤± ®Šž­ˆœª…™¨“£vŒ›¼ÆÏ+4<        5 &              x…Ž£µÀ­½ÇªºÄ¨¸Ã£´À ±½¯»š¬¸”§´“¦³”§´”§´‘¤²¢°ˆ«†›©ƒ˜¦~”£u‹›ºÅÍ6@G                &‰™£¥¶Á­½ÈªºÅ§¸Ã¤µÀ¡²¾¯»™«·”§´”§´“¦³•¨µ”§´’¥²Œ ®ˆœªƒ—¦”£x¼ÇÏ1: PA(1)\n\ Alt 2: PA(2)\n\ Alt 3: PA(3)\n\ Alt ^: Key(notsign)\n\ Ctrl c: Copy()\n\ Alt k: Keypad()\n\ Alt K: Keypad()\n\ Alt l: Redraw()\n\ Alt L: Redraw()\n\ Alt m: Compose()\n\ Alt M: Compose()\n\ Alt n: Menu()\n\ Alt N: Menu()\n\ Alt p: PrintText()\n\ Alt P: PrintText()\n\ Ctrl v: Paste()\n\ Ctrl x: Cut()\n\ Ctrl ]: Escape()\n\ Shift F1: PF(13)\n\ Shift F2: PF(14)\n\ Shift F3: PF(15)\n\ Shift F4: PF(16)\n\ Shift F5: PF(17)\n\ Shift F6: PF(18)\n\ Shift F7: PF(19)\n\ Shift F8: PF(20)\n\ Shift F9: PF(21)\n\ Shift F10: PF(22)\n\ Shift F11: PF(23)\n\ Shift F12: PF(24)\n\ Shift ESCAPE: Key(0x1d)\n\ PRIOR: Scroll(Backward)\n\ NEXT: Scroll(Forward) keymap.base.3270: \n\ Ctrl a: Attn()\n\ Alt a: Attn()\n\ Alt A: Attn()\n\ Alt c: Clear()\n\ Alt C: Clear()\n\ Ctrl d: Dup()\n\ Alt d: Dup()\n\ Alt D: Dup()\n\ Ctrl f: FieldMark()\n\ Alt f: FieldMark()\n\ Alt F: FieldMark()\n\ Ctrl h: Erase()\n\ Alt i: Insert()\n\ Alt I: Insert()\n\ Ctrl i: Tab()\n\ Ctrl j: Newline()\n\ Ctrl l: Redraw()\n\ Ctrl m: Enter()\n\ Ctrl r: Reset()\n\ Alt r: Reset()\n\ Alt R: Reset()\n\ Ctrl u: DeleteField()\n\ Alt v: ToggleReverse()\n\ Alt x: Flip()\n\ INSERT: ToggleInsert()\n\ Shift TAB: BackTab()\n\ BACK: Erase()\n\ Shift END: EraseEOF()\n\ END: FieldEnd()\n\ Shift RIGHT: SelectRight()\n\ Ctrl RIGHT: NextWord()\n\ Shift LEFT: SelectLeft()\n\ Ctrl LEFT: PreviousWord()\n\ Shift UP: SelectUp()\n\ Shift DOWN: SelectDown() ! wc3270 keymap for more 3270-ish behavior: The Enter key is Newline and the ! Right-Ctrl key is Enter. x3270.keymap.rctrl.3270: \ RightCtrlCTRL: Enter()\n\ Return: Newline() #else x3270.keymap.base: \n\ Ctrl]: Escape()\n\ Escape: Escape()\n\ Ctrla Ctrla: Key(0x01)\n\ Ctrla Ctrl]: Key(0x1d)\n\ Ctrla c: Clear()\n\ Ctrla e: Escape()\n\ Ctrla i: Insert()\n\ Ctrla r: Reset()\n\ Ctrla k: Keypad()\n\ Ctrla l: Redraw()\n\ Ctrla m: Compose()\n\ Ctrla n: Menu()\n\ Ctrla p: PrintText()\n\ Ctrla ^: Key(notsign)\n\ DC: Delete()\n\ UP: Up()\n\ DOWN: Down()\n\ LEFT: Left()\n\ RIGHT: Right()\n\ HOME: Home()\n\ Ctrla 1: PA(1)\n\ Ctrla 2: PA(2)\n\ Ctrla 3: PA(3)\n\ F1: PF(1)\n\ Ctrla F1: PF(13)\n\ F2: PF(2)\n\ Ctrla F2: PF(14)\n\ F3: PF(3)\n\ Ctrla F3: PF(15)\n\ F4: PF(4)\n\ Ctrla F4: PF(16)\n\ F5: PF(5)\n\ Ctrla F5: PF(17)\n\ F6: PF(6)\n\ Ctrla F6: PF(18)\n\ F7: PF(7)\n\ Ctrla F7: PF(19)\n\ F8: PF(8)\n\ Ctrla F8: PF(20)\n\ F9: PF(9)\n\ Ctrla F9: PF(21)\n\ F10: PF(10)\n\ Ctrla F10: PF(22)\n\ F11: PF(11)\n\ Ctrla F11: PF(23)\n\ F12: PF(12)\n\ Ctrla F12: PF(24)\n\ PPAGE: Scroll(Backward)\n\ NPAGE: Scroll(Forward) x3270.keymap.base.3270: \n\ Ctrla a: Attn()\n\ Ctrlc: Clear()\n\ Ctrld: Dup()\n\ Ctrlf: FieldMark()\n\ Ctrlh: Erase()\n\ Ctrli: Tab()\n\ Ctrlj: Newline()\n\ Ctrlk: Keypad()\n\ Ctrll: Redraw()\n\ Ctrlm: Enter()\n\ Ctrln: Menu()\n\ Ctrlr: Reset()\n\ Ctrlu: DeleteField()\n\ Ctrla v: ToggleReverse()\n\ Ctrla f: Flip()\n\ IC: ToggleInsert()\n\ BACKSPACE: Erase()\n\ END: FieldEnd() #endif ! (_WIN32) suite3270-3.6/Common/fb-common0000664000076500007650000000451613221577163014232 0ustar pdmpdm! ! Copyright (c) 1995-2015, Paul Mattes. ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions are met: ! * Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! * Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! * Neither the names of Paul Mattes nor the names of his contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED ! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO ! EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! ! Common resource definitions ! ! Messages for file transfer x3270.message.ftComplete: Transfer complete, %i bytes transferred\n\ %sbytes/sec in %s mode x3270.message.ftUnable: Cannot begin transfer x3270.message.ftStartTimeout: Transfer did not start within 10s x3270.message.ftUserCancel: Transfer cancelled by user x3270.message.ftHostCancel: Transfer cancelled by host x3270.message.ftCutUnknownFrame: Unknown frame type from host x3270.message.ftCutUnknownControl: Unknown FT control code from host x3270.message.ftCutRetransmit: Transmission error x3270.message.ftCutConversionError: Data conversion error x3270.message.ftCutOversize: Illegal frame length x3270.message.ftDisconnected: Host disconnected, transfer cancelled x3270.message.ftNot3270: Not in 3270 mode, transfer cancelled x3270.message.ftDftUnknownOpen: Uknown DFT Open type from host suite3270-3.6/Common/fb-composeMap0000664000076500007650000001046213221577163015042 0ustar pdmpdm! ! Copyright (c) 1995-2015, Paul Mattes. ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions are met: ! * Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! * Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! * Neither the names of Paul Mattes nor the names of his contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED ! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO ! EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! Default compose-key map. ! Each line is of the form "keysym1 + keysym2 = keysym3", meaning "when the ! Compose key is pressed, followed by keysym1 and keysym2 (in either order), ! interpret it as keysym3." The definitions are case-sensitive. x3270.composeMap.latin1: \ c + bar = cent \n\ c + slash = cent \n\ L + minus = sterling \n\ Y + equal = yen \n\ S + S = section \n\ C + O = copyright \n\ a + underscore = ordfeminine \n\ less + less = guillemotleft \n\ R + O = registered \n\ plus + minus = plusminus \n\ o + underscore = masculine \n\ greater + greater = guillemotright \n\ 1 + 4 = onequarter \n\ 1 + 2 = onehalf \n\ 3 + 4 = threequarters \n\ bar + bar = brokenbar \n\ A + grave = Agrave \n\ A + apostrophe = Aacute \n\ A + asciicircum = Acircumflex \n\ A + asciitilde = Atilde \n\ A + quotedbl = Adiaeresis \n\ A + asterisk = Aring \n\ A + E = AE \n\ C + comma = Ccedilla \n\ C + apostrophe = Ccedilla \n\ E + grave = Egrave \n\ E + apostrophe = Eacute \n\ E + asciicircum = Ecircumflex \n\ E + quotedbl = Ediaeresis \n\ I + grave = Igrave \n\ I + apostrophe = Iacute \n\ I + asciicircum = Icircumflex \n\ I + quotedbl = Idiaeresis \n\ N + asciitilde = Ntilde \n\ O + grave = Ograve \n\ O + apostrophe = Oacute \n\ O + asciicircum = Ocircumflex \n\ O + asciitilde = Otilde \n\ O + quotedbl = Odiaeresis \n\ O + slash = Ooblique \n\ U + grave = Ugrave \n\ U + apostrophe = Uacute \n\ U + asciicircum = Ucircumflex \n\ U + quotedbl = Udiaeresis \n\ Y + apostrophe = Yacute \n\ s + s = ssharp \n\ a + grave = agrave \n\ a + apostrophe = aacute \n\ a + asciicircum = acircumflex \n\ a + asciitilde = atilde \n\ a + quotedbl = adiaeresis \n\ a + asterisk = aring \n\ a + e = ae \n\ c + comma = ccedilla \n\ c + apostrophe = ccedilla \n\ e + grave = egrave \n\ e + apostrophe = eacute \n\ e + asciicircum = ecircumflex \n\ e + quotedbl = ediaeresis \n\ i + grave = igrave \n\ i + apostrophe = iacute \n\ i + asciicircum = icircumflex \n\ i + quotedbl = idiaeresis \n\ n + asciitilde = ntilde \n\ o + grave = ograve \n\ o + apostrophe = oacute \n\ o + asciicircum = ocircumflex \n\ o + asciitilde = otilde \n\ o + quotedbl = odiaeresis \n\ o + slash = oslash \n\ u + grave = ugrave \n\ u + apostrophe = uacute \n\ u + asciicircum = ucircumflex \n\ u + quotedbl = udiaeresis \n\ y + apostrophe = yacute \n\ y + quotedbl = ydiaeresis \n\ apostrophe + apostrophe = apostrophe \n\ apostrophe + space = apostrophe \n\ asciicircum + asciicircum = asciicircum \n\ asciicircum + space = asciicircum \n\ asciitilde + asciitilde = asciitilde \n\ asciitilde + space = asciitilde \n\ grave + grave = grave \n\ grave + space = grave \n\ quotedbl + quotedbl = quotedbl \n\ quotedbl + space = quotedbl \n suite3270-3.6/Common/fb-messages0000664000076500007650000000645713221577163014557 0ustar pdmpdm! ! Copyright (c) 1995-2015, 2017 Paul Mattes. ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions are met: ! * Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! * Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! * Neither the names of Paul Mattes nor the names of his contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED ! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO ! EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! Common interactive messages (x3270, c3270) x3270.message.hour: hour x3270.message.hours: hours x3270.message.minute: minute x3270.message.minutes: minutes x3270.message.bindPluName: BIND PLU name: x3270.message.byte: byte x3270.message.bytes: bytes x3270.message.charMode: NVT character mode x3270.message.columns: columns x3270.message.connectedTo: Connected to: x3270.message.connectionPending: Connection pending to: x3270.message.dbcsCgcsgid: Host DBCS CGCSGID: x3270.message.defaultCharacterSet: Default (us) EBCDIC character set x3270.message.dsMode: 3270 mode x3270.message.extendedDs: extended data stream x3270.message.fullColor: color x3270.message.keyboardMap: Keyboard map: x3270.message.lineMode: NVT line mode x3270.message.localeCodeset: Locale codeset: x3270.message.luName: LU name: x3270.message.model: Model x3270.message.mono: monochrome x3270.message.notConnected: Not connected x3270.message.port: Port: x3270.message.provider: Provider: x3270.message.proxyType: Proxy type: x3270.message.Received: Received x3270.message.received: received x3270.message.record: record x3270.message.rows: rows x3270.message.sbcsCgcsgid: Host SBCS CGCSGID: x3270.message.records: records x3270.message.second: second x3270.message.seconds: seconds x3270.message.secure: via TLS/SSL x3270.message.sent: Sent x3270.message.server: Server: x3270.message.serverCert: Host certificate: x3270.message.sessionInfo: Session information: x3270.message.specialCharacters: Special characters: x3270.message.sscpMode: SSCP-LU mode x3270.message.standardDs: standard data stream x3270.message.terminalName: Terminal name: x3270.message.tn3270eNoOpts: No TN3270E options x3270.message.tn3270eOpts: TN3270E options: x3270.message.unboundMode: unbound mode x3270.message.unverified: unverified suite3270-3.6/Common/fb-printSession0000664000076500007650000000371413221577163015441 0ustar pdmpdm! ! Copyright (c) 1995-2015, Paul Mattes. ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions are met: ! * Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! * Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! * Neither the names of Paul Mattes nor the names of his contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED ! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO ! EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! Printer session commands x3270.printTextCommand: lpr ! Printer session options #ifdef _WIN32 x3270.printer.assocCommandLine: wpr3287.exe -assoc %L% %R% %P% %V% %S% %I% %O% %H% x3270.printer.luCommandLine: wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% #else x3270.printer.command: lpr x3270.printer.assocCommandLine: pr3287 -assoc %L% -command "%C%" %R% %P% %V% %S% %O% "%H%" x3270.printer.luCommandLine: pr3287 -command "%C%" %R% %P% %V% %S% %O% "%L%@%H%" #endif ! (_WIN32) suite3270-3.6/Common/fprint_screen.c0000664000076500007650000004355513221577163015445 0ustar pdmpdm/* * Copyright (c) 1994-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * fprint_screen.c * Screen printing functions. */ #include "globals.h" #include "appres.h" #include "3270ds.h" #include "ctlr.h" #include "ctlrc.h" #include "resources.h" #include "fprint_screen.h" #if defined(_WIN32) /*[*/ # include "gdi_print.h" #endif /*]*/ #include "trace.h" #include "unicodec.h" #include "utf8.h" #include "utils.h" #include "varbuf.h" /* Typedefs */ typedef struct { ptype_t ptype; /* Type P_XXX (text, html, rtf) */ unsigned opts; /* FPS_XXX options */ bool need_separator; /* Pending page indicator */ bool broken; /* If set, output has failed already. */ int spp; /* Screens per page. */ int screens; /* Screen count this page. */ FILE *file; /* Stream to write to */ char *caption; /* Caption with %T% expanded */ char *printer_name; /* Printer name (used by GDI) */ } real_fps_t; /* Globals */ /* Statics */ /* * Map default 3279 colors. This code is duplicated three times. ;-( */ static int color_from_fa(unsigned char fa) { static int field_colors[4] = { HOST_COLOR_GREEN, /* default */ HOST_COLOR_RED, /* intensified */ HOST_COLOR_BLUE, /* protected */ HOST_COLOR_WHITE /* protected, intensified */ # define DEFCOLOR_MAP(f) \ ((((f) & FA_PROTECT) >> 4) | (((f) & FA_INT_HIGH_SEL) >> 3)) }; if (appres.m3279) return field_colors[DEFCOLOR_MAP(fa)]; else return HOST_COLOR_GREEN; } /* * Map 3279 colors onto HTML colors. */ static char * html_color(int color) { static char *html_color_map[] = { "black", "deepSkyBlue", "red", "pink", "green", "turquoise", "yellow", "white", "black", "blue3", "orange", "purple", "paleGreen", "paleTurquoise2", "grey", "white" }; if (color >= HOST_COLOR_NEUTRAL_BLACK && color <= HOST_COLOR_WHITE) return html_color_map[color]; else return "black"; } /* Convert a caption string to UTF-8 RTF. */ static char * rtf_caption(const char *caption) { ucs4_t u; int consumed; enum me_fail error; char mb[16]; varbuf_t r; vb_init(&r); while (*caption) { u = multibyte_to_unicode(caption, strlen(caption), &consumed, &error); if (u == 0) { break; } if (u & ~0x7f) { vb_appendf(&r, "\\u%u?", u); } else { (void) unicode_to_multibyte(u, mb, sizeof(mb)); if (mb[0] == '\\' || mb[0] == '{' || mb[0] == '}') { vb_appendf(&r, "\\%c", mb[0]); } else if (mb[0] == '-') { vb_appends(&r, "\\_"); } else if (mb[0] == ' ') { vb_appends(&r, "\\~"); } else { vb_append(&r, &mb[0], 1); } } caption += consumed; } return vb_consume(&r); } /* Convert a caption string to UTF-8 HTML. */ static char * html_caption(const char *caption) { ucs4_t u; int consumed; enum me_fail error; char u8buf[16]; int nu8; varbuf_t r; vb_init(&r); while (*caption) { u = multibyte_to_unicode(caption, strlen(caption), &consumed, &error); if (u == 0) { break; } switch (u) { case '<': vb_appends(&r, "<"); break; case '>': vb_appends(&r, ">"); break; case '&': vb_appends(&r, "&"); break; default: nu8 = unicode_to_utf8(u, u8buf); vb_append(&r, u8buf, nu8); break; } caption += consumed; } return vb_consume(&r); } /* * Write a screen trace header to a stream. * Returns the context to use with subsequent calls. */ fps_status_t fprint_screen_start(FILE *f, ptype_t ptype, unsigned opts, const char *caption, const char *printer_name, fps_t *fps_ret) { real_fps_t *fps; int rv = FPS_STATUS_SUCCESS; char *pt_spp; /* Non-text types can always generate blank output. */ if (ptype != P_TEXT) { opts |= FPS_EVEN_IF_EMPTY; } /* Reset and save the state. */ fps = (real_fps_t *)Malloc(sizeof(real_fps_t)); fps->ptype = ptype; fps->opts = opts; fps->need_separator = false; fps->broken = false; fps->spp = 1; fps->screens = 0; fps->file = f; if (caption != NULL) { char *xcaption; char *ts = strstr(caption, "%T%"); if (ts != NULL) { time_t t = time(NULL); struct tm *tm = localtime(&t); xcaption = xs_buffer("%.*s" "%04d-%02d-%02d %02d:%02d:%02d" "%s", (int)(ts - caption), caption, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, ts + 3); } else { xcaption = NewString(caption); } fps->caption = xcaption; } else { fps->caption = NULL; } if (printer_name != NULL && printer_name[0]) { fps->printer_name = NewString(printer_name); } else { fps->printer_name = NULL; } switch (ptype) { case P_RTF: { char *pt_font = get_resource(ResPrintTextFont); char *pt_size = get_resource(ResPrintTextSize); int pt_nsize; if (pt_font == NULL) { pt_font = "Courier New"; } if (pt_size == NULL) { pt_size = "8"; } pt_nsize = atoi(pt_size); if (pt_nsize <= 0) { pt_nsize = 8; } if (fprintf(f, "{\\rtf1\\ansi\\ansicpg%u\\deff0\\deflang1033{" "\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0 %s;}}\n" "\\viewkind4\\uc1\\pard\\f0\\fs%d ", #if defined(_WIN32) /*[*/ GetACP(), #else /*][*/ 1252, /* the number doesn't matter */ #endif /*]*/ pt_font, pt_nsize * 2) < 0) { rv = FPS_STATUS_ERROR; } if (rv == FPS_STATUS_SUCCESS && fps->caption != NULL) { char *hcaption = rtf_caption(fps->caption); if (fprintf(f, "%s\\par\\par\n", hcaption) < 0) { rv = FPS_STATUS_ERROR; } Free(hcaption); } break; } case P_HTML: { char *hcaption = NULL; /* Make the caption HTML-safe. */ if (fps->caption != NULL) { hcaption = html_caption(fps->caption); } /* Print the preamble. */ if (!(opts & FPS_NO_HEADER) && fprintf(f, "\n" "\n" " \n" "\n" " \n") < 0) { rv = FPS_STATUS_ERROR; } if (rv == FPS_STATUS_SUCCESS && hcaption) { if (fprintf(f, "

    %s

    \n", hcaption) < 0) { rv = FPS_STATUS_ERROR; } Free(hcaption); } break; } case P_TEXT: if (fps->caption != NULL) { if (fprintf(f, "%s\n\n", fps->caption) < 0) { rv = FPS_STATUS_ERROR; } } break; case P_GDI: #if defined(_WIN32) /*[*/ switch (gdi_print_start(printer_name, opts)) { case GDI_STATUS_SUCCESS: break; case GDI_STATUS_ERROR: rv = FPS_STATUS_ERROR; break; case GDI_STATUS_CANCEL: rv = FPS_STATUS_CANCEL; break; } #endif /*]*/ break; } /* Set up screens-per-page. */ pt_spp = get_resource(ResPrintTextScreensPerPage); if (pt_spp != NULL) { fps->spp = atoi(pt_spp); if (fps->spp < 1 || fps->spp > 5) { fps->spp = 1; } } if (rv != FPS_STATUS_SUCCESS) { /* We've failed; there's no point in returning the context. */ Free(fps->caption); Free(fps->printer_name); Free(fps); *fps_ret = NULL; } else { *fps_ret = (fps_t)(void *)fps; } return rv; } #define FAIL do { \ rv = -1; \ goto done; \ } while(false) /* * Add a screen image to a stream. * * Returns 0 for no screen written, 1 for screen written, -1 for error. */ fps_status_t fprint_screen_body(fps_t ofps) { real_fps_t *fps = (real_fps_t *)(void *)ofps; register int i; unsigned long uc; int ns = 0; int nr = 0; bool any = false; int fa_addr = find_field_attribute(0); unsigned char fa = ea_buf[fa_addr].fa; int fa_fg, current_fg; int fa_bg, current_bg; bool fa_high, current_high; bool fa_ital, current_ital; bool mi; #if defined(_WIN32) /*[*/ gdi_header_t h; #endif /*]*/ fps_status_t rv = FPS_STATUS_SUCCESS; /* Quick short-circuit. */ if (fps == NULL || fps->broken) { return FPS_STATUS_ERROR; } mi = ((fps->opts & FPS_MODIFIED_ITALIC)) != 0; if (ea_buf[fa_addr].fg) fa_fg = ea_buf[fa_addr].fg & 0x0f; else fa_fg = color_from_fa(fa); current_fg = fa_fg; if (ea_buf[fa_addr].bg) fa_bg = ea_buf[fa_addr].bg & 0x0f; else fa_bg = HOST_COLOR_BLACK; current_bg = fa_bg; if (ea_buf[fa_addr].gr & GR_INTENSIFY) fa_high = true; else fa_high = FA_IS_HIGH(fa); current_high = fa_high; fa_ital = mi && FA_IS_MODIFIED(fa); current_ital = fa_ital; switch (fps->ptype) { case P_RTF: if (fps->need_separator) { if (fps->screens < fps->spp) { if (fprintf(fps->file, "\\par\n") < 0) { FAIL; } } else { if (fprintf(fps->file, "\n\\page\n") < 0) { FAIL; } fps->screens = 0; } } if (current_high) { if (fprintf(fps->file, "\\b ") < 0) { FAIL; } } break; case P_HTML: if (fprintf(fps->file, " " "\n" "
    " "
    ",
    			   html_color(current_fg),
    			   html_color(current_bg),
    			   current_high? "bold": "normal",
    			   current_ital? "italic": "normal") < 0)
    			FAIL;
    		break;
    	case P_TEXT:
    		if (fps->need_separator) {
    			if ((fps->opts & FPS_FF_SEP) &&
    				fps->screens >= fps->spp) {
    
    				if (fputc('\f', fps->file) < 0)
    					FAIL;
    				fps->screens = 0;
    			} else {
    			    	for (i = 0; i < COLS; i++) {
    					if (fputc('=', fps->file) < 0)
    						FAIL;
    				}
    				if (fputc('\n', fps->file) < 0)
    					FAIL;
    			}
    		}
    		break;
    #if defined(_WIN32) /*[*/
    	case P_GDI:
    		/*
    		 * Write the current screen buffer to the file.
    		 * We will read it back and print it when we are done.
    		 */
    		h.signature = GDI_SIGNATURE;
    		h.rows = ROWS;
    		h.cols = COLS;
    		if (fwrite(&h, sizeof(h), 1, fps->file) != 1) {
    			FAIL;
    		}
    		if (fwrite(ea_buf, sizeof(struct ea), ROWS * COLS, fps->file)
    			    != ROWS * COLS) {
    			FAIL;
    		}
    		fflush(fps->file);
    		goto done;
    #endif /*]*/
    	default:
    		break;
    	}
    
    	fps->need_separator = false;
    
    	for (i = 0; i < ROWS*COLS; i++) {
    		char mb[16];
    		int nmb;
    
    		uc = 0;
    
    		if (i && !(i % COLS)) {
    		    	if (fps->ptype == P_HTML) {
    			    	if (fputc('\n', fps->file) < 0)
    					FAIL;
    			} else
    				nr++;
    			ns = 0;
    		}
    		if (ea_buf[i].fa) {
    			uc = ' ';
    			fa = ea_buf[i].fa;
    			if (ea_buf[i].fg)
    				fa_fg = ea_buf[i].fg & 0x0f;
    			else
    				fa_fg = color_from_fa(fa);
    			if (ea_buf[i].bg)
    				fa_bg = ea_buf[i].bg & 0x0f;
    			else
    				fa_bg = HOST_COLOR_BLACK;
    			if (ea_buf[i].gr & GR_INTENSIFY)
    				fa_high = true;
    			else
    				fa_high = FA_IS_HIGH(fa);
    			fa_ital = mi && FA_IS_MODIFIED(fa);
    		}
    		if (FA_IS_ZERO(fa)) {
    			if (ctlr_dbcs_state(i) == DBCS_LEFT)
    			    	uc = 0x3000;
    			else
    				uc = ' ';
    		} else {
    		    	/* Convert EBCDIC to Unicode. */
    			switch (ctlr_dbcs_state(i)) {
    			case DBCS_NONE:
    			case DBCS_SB:
    			    	uc = ebcdic_to_unicode(ea_buf[i].cc,
    					ea_buf[i].cs, EUO_NONE);
    				if (uc == 0)
    				    	uc = ' ';
    				break;
    			case DBCS_LEFT:
    				uc = ebcdic_to_unicode(
    					(ea_buf[i].cc << 8) |
    					 ea_buf[i + 1].cc,
    					CS_BASE, EUO_NONE);
    				if (uc == 0)
    				    	uc = 0x3000;
    				break;
    			case DBCS_RIGHT:
    				/* skip altogether, we took care of it above */
    				continue;
    			default:
    				uc = ' ';
    				break;
    			}
    		}
    
    		/* Translate to a type-specific format and write it out. */
    		if (uc == ' ' && fps->ptype != P_HTML) {
    			ns++;
    		} else if (uc == 0x3000) {
    		    	if (fps->ptype == P_HTML) {
    			    	if (fprintf(fps->file, "  ") < 0)
    					FAIL;
    			} else
    				ns += 2;
    		} else {
    			while (nr) {
    			    	if (fps->ptype == P_RTF)
    				    	if (fprintf(fps->file, "\\par") < 0)
    						FAIL;
    				if (fputc('\n', fps->file) < 0)
    					FAIL;
    				nr--;
    			}
    			while (ns) {
    			    	if (fps->ptype == P_RTF) {
    				    	if (fprintf(fps->file, "\\~") < 0)
    						FAIL;
    				} else
    					if (fputc(' ', fps->file) < 0)
    						FAIL;
    				ns--;
    			}
    			if (fps->ptype == P_RTF) {
    				bool high;
    
    				if (ea_buf[i].gr & GR_INTENSIFY)
    					high = true;
    				else
    					high = fa_high;
    				if (high != current_high) {
    					if (high) {
    						if (fprintf(fps->file, "\\b ")
    							    < 0)
    							FAIL;
    					} else
    						if (fprintf(fps->file, "\\b0 ")
    							    < 0)
    							FAIL;
    					current_high = high;
    				}
    			}
    			if (fps->ptype == P_HTML) {
    				int fg_color, bg_color;
    				bool high;
    
    				if (ea_buf[i].fg)
    					fg_color = ea_buf[i].fg & 0x0f;
    				else
    					fg_color = fa_fg;
    				if (ea_buf[i].bg)
    					bg_color = ea_buf[i].bg & 0x0f;
    				else
    					bg_color = fa_bg;
    				if (ea_buf[i].gr & GR_REVERSE) {
    				    	int tmp;
    
    					tmp = fg_color;
    					fg_color = bg_color;
    					bg_color = tmp;
    				}
    
    				if (i == cursor_addr) {
    				    	fg_color = (bg_color == HOST_COLOR_RED)?
    							HOST_COLOR_BLACK: bg_color;
    					bg_color = HOST_COLOR_RED;
    				}
    				if (ea_buf[i].gr & GR_INTENSIFY)
    					high = true;
    				else
    					high = fa_high;
    
    				if (fg_color != current_fg ||
    				    bg_color != current_bg ||
    				    high != current_high ||
    				    fa_ital != current_ital) {
    					if (fprintf(fps->file,
    						"",
    						html_color(fg_color),
    						html_color(bg_color),
    						high? "bold": "normal",
    						fa_ital? "italic": "normal")
    						    < 0)
    					    FAIL;
    					current_fg = fg_color;
    					current_bg = bg_color;
    					current_high = high;
    					current_ital = fa_ital;
    				}
    			}
    			any = true;
    			if (fps->ptype == P_RTF) {
    				if (uc & ~0x7f) {
    					if (fprintf(fps->file, "\\u%ld?", uc)
    						    < 0)
    						FAIL;
    				} else {
    					nmb = unicode_to_multibyte(uc,
    						mb, sizeof(mb));
    					if (mb[0] == '\\' ||
    						mb[0] == '{' ||
    						mb[0] == '}') {
    						if (fprintf(fps->file, "\\%c",
    							    mb[0]) < 0)
    							FAIL;
    					} else if (mb[0] == '-') {
    						if (fprintf(fps->file, "\\_")
    							    < 0)
    							FAIL;
    					} else if (mb[0] == ' ') {
    						if (fprintf(fps->file, "\\~")
    							    < 0)
    							FAIL;
    					} else {
    						if (fputc(mb[0], fps->file) < 0)
    							FAIL;
    					}
    				}
    			} else if (fps->ptype == P_HTML) {
    				if (uc == '<') {
    					if (fprintf(fps->file, "<") < 0)
    						FAIL;
    				} else if (uc == '&') {
    				    	if (fprintf(fps->file, "&") < 0)
    						FAIL;
    				} else if (uc == '>') {
    				    	if (fprintf(fps->file, ">") < 0)
    						FAIL;
    				} else {
    					nmb = unicode_to_utf8(uc, mb);
    					{
    					    int k;
    
    					    for (k = 0; k < nmb; k++) {
    						if (fputc(mb[k], fps->file) < 0)
    							FAIL;
    					    }
    					}
    				}
    			} else {
    				nmb = unicode_to_multibyte(uc,
    					mb, sizeof(mb));
    				if (fputs(mb, fps->file) < 0)
    					FAIL;
    			}
    		}
    	}
    
    	if (fps->ptype == P_HTML) {
    	    	if (fputc('\n', fps->file) < 0)
    			FAIL;
    	} else
    		nr++;
    	if (!any && !(fps->opts & FPS_EVEN_IF_EMPTY) && fps->ptype == P_TEXT) {
    		return FPS_STATUS_SUCCESS;
    	}
    	while (nr) {
    	    	if (fps->ptype == P_RTF)
    		    	if (fprintf(fps->file, "\\par") < 0)
    				FAIL;
    		if (fps->ptype == P_TEXT)
    			if (fputc('\n', fps->file) < 0)
    				FAIL;
    		nr--;
    	}
    	if (fps->ptype == P_HTML)
    		if (fprintf(fps->file, "%s
    \n", current_high? "": "") < 0) FAIL; fps->need_separator = true; fps->screens++; rv = FPS_STATUS_SUCCESS_WRITTEN; /* wrote a screen */ done: if (FPS_IS_ERROR(rv)) { fps->broken = true; } return rv; } #undef FAIL /* * Finish writing a multi-screen image. * Returns 0 success, -1 for error. In either case, the context is freed. */ fps_status_t fprint_screen_done(fps_t *ofps) { real_fps_t *fps = (real_fps_t *)*(void **)ofps; int rv = FPS_STATUS_SUCCESS; if (fps == NULL) { return FPS_STATUS_ERROR; } if (!fps->broken) { switch (fps->ptype) { case P_RTF: if (fprintf(fps->file, "\n}\n%c", 0) < 0) { rv = FPS_STATUS_ERROR; } break; case P_HTML: if (!(fps->opts & FPS_NO_HEADER) && fprintf(fps->file, " \n\n") < 0) { rv = FPS_STATUS_ERROR; } break; #if defined(_WIN32) /*[*/ case P_GDI: vtrace("Printing to GDI printer\n"); if (gdi_print_finish(fps->file, fps->caption) < 0) { rv = FPS_STATUS_ERROR; } break; #endif /*]*/ default: break; } } /* Done with the context. */ Free(fps->caption); Free(fps->printer_name); memset(fps, '\0', sizeof(*fps)); Free(*(void **)ofps); *(void **)ofps = NULL; return rv; } /* * Write a header, screen image, and trailer to a file. */ fps_status_t fprint_screen(FILE *f, ptype_t ptype, unsigned opts, const char *caption, const char *printer_name) { fps_t fps; fps_status_t srv; fps_status_t srv_body; srv = fprint_screen_start(f, ptype, opts, caption, printer_name, &fps); if (FPS_IS_ERROR(srv)) { return srv; } srv_body = fprint_screen_body(fps); if (FPS_IS_ERROR(srv_body)) { (void) fprint_screen_done(&fps); return srv_body; } srv = fprint_screen_done(&fps); if (FPS_IS_ERROR(srv)) { return srv; } return srv_body; } suite3270-3.6/Common/ft.c0000664000076500007650000007334613221577163013216 0ustar pdmpdm/* * Copyright (c) 1996-2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft.c * Common IND$FILE file transfer logic. */ #include "globals.h" #include #include #include "appres.h" #include "actions.h" #include "ft_cut.h" #include "ft_dft.h" #include "ft_private.h" /* must precede ft_gui.h */ #include "ft_gui.h" #include "unicodec.h" #include "ft.h" #include "host.h" #include "idle.h" #include "kybd.h" #include "macros.h" #include "popups.h" #include "resources.h" #include "utils.h" #include "varbuf.h" /* Macros. */ /* Globals. */ enum ft_state ft_state = FT_NONE; /* File transfer state */ ft_conf_t *ftc; /* Current file transfer config */ /* Statics. */ static ft_conf_t transfer_ft_conf; /* FT config for Transfer() action */ static ft_conf_t gui_ft_conf; /* FT config for GUI (actually just c3270; x3270 uses its own) */ static bool gui_conf_initted = false; static struct timeval t0; /* Starting time */ /* Translation table: "ASCII" to EBCDIC, as seen by IND$FILE. */ unsigned char i_asc2ft[256] = { 0x00,0x01,0x02,0x03,0x37,0x2d,0x2e,0x2f,0x16,0x05,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0x10,0x11,0x12,0x13,0x3c,0x3d,0x32,0x26,0x18,0x19,0x3f,0x27,0x1c,0x1d,0x1e,0x1f, 0x40,0x5a,0x7f,0x7b,0x5b,0x6c,0x50,0x7d,0x4d,0x5d,0x5c,0x4e,0x6b,0x60,0x4b,0x61, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0x7a,0x5e,0x4c,0x7e,0x6e,0x6f, 0x7c,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6, 0xd7,0xd8,0xd9,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0x4a,0xe0,0x4f,0x5f,0x6d, 0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96, 0x97,0x98,0x99,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xc0,0x6a,0xd0,0xa1,0x07, 0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2a,0x2b,0x2c,0x09,0x0a,0x1b, 0x30,0x31,0x1a,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3a,0x3b,0x04,0x14,0x3e,0xe1, 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71,0x72,0x73,0x74,0x75, 0x76,0x77,0x78,0x80,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x9a,0x9b,0x9c,0x9d,0x9e, 0x9f,0xa0,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xda,0xdb, 0xdc,0xdd,0xde,0xdf,0xea,0xeb,0xec,0xed,0xee,0xef,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; /* Translation table: EBCDIC to "ASCII", as seen by IND$FILE. */ unsigned char i_ft2asc[256] = { 0x00,0x01,0x02,0x03,0x9c,0x09,0x86,0x7f,0x97,0x8d,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0x10,0x11,0x12,0x13,0x9d,0x85,0x08,0x87,0x18,0x19,0x92,0x8f,0x1c,0x1d,0x1e,0x1f, 0x80,0x81,0x82,0x83,0x84,0x00,0x17,0x1b,0x88,0x89,0x8a,0x8b,0x8c,0x05,0x06,0x07, 0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9a,0x9b,0x14,0x15,0x9e,0x1a, 0x20,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0x5b,0x2e,0x3c,0x28,0x2b,0x5d, 0x26,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0x21,0x24,0x2a,0x29,0x3b,0x5e, 0x2d,0x2f,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0x7c,0x2c,0x25,0x5f,0x3e,0x3f, 0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0xc0,0xc1,0xc2,0x60,0x3a,0x23,0x40,0x27,0x3d,0x22, 0xc3,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9, 0xca,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0xcb,0xcc,0xcd,0xce,0xcf,0xd0, 0xd1,0x7e,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, 0x7b,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0xe8,0xe9,0xea,0xeb,0xec,0xed, 0x7d,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xee,0xef,0xf0,0xf1,0xf2,0xf3, 0x5c,0x9f,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; /* Keywords for the Transfer action. */ enum ft_parm_name { PARM_DIRECTION, PARM_HOST_FILE, PARM_LOCAL_FILE, PARM_HOST, PARM_MODE, PARM_CR, PARM_REMAP, PARM_EXIST, PARM_RECFM, PARM_LRECL, PARM_BLKSIZE, PARM_ALLOCATION, PARM_PRIMARY_SPACE, PARM_SECONDARY_SPACE, PARM_BUFFER_SIZE, PARM_AVBLOCK, #if defined(_WIN32) /*[*/ PARM_WINDOWS_CODEPAGE, #endif /*]*/ N_PARMS }; static struct { const char *name; char *value; const char *keyword[4]; } tp[N_PARMS] = { { "Direction", NULL, { "receive", "send" } }, { "HostFile" }, { "LocalFile" }, { "Host", NULL, { "tso", "vm", "cics" } }, { "Mode", NULL, { "ascii", "binary" } }, { "Cr", NULL, { "auto", "remove", "add", "keep" } }, { "Remap", NULL, { "yes", "no" } }, { "Exist", NULL, { "keep", "replace", "append" } }, { "Recfm", NULL, { "default", "fixed", "variable", "undefined" } }, { "Lrecl" }, { "Blksize" }, { "Allocation", NULL, { "default", "tracks", "cylinders", "avblock" } }, { "PrimarySpace" }, { "SecondarySpace" }, { "BufferSize" }, { "Avblock" }, #if defined(_WIN32) /*[*/ { "WindowsCodePage" }, #endif /*]*/ }; ft_tstate_t fts; static ioid_t ft_start_id = NULL_IOID; static void ft_connected(bool ignored); static void ft_in3270(bool ignored); static action_t Transfer_action; /** * File transfer module registration. */ void ft_register(void) { static action_table_t ft_actions[] = { { "Transfer", Transfer_action, ACTION_KE } }; /* Register for state changes. */ register_schange(ST_CONNECT, ft_connected); register_schange(ST_3270_MODE, ft_in3270); /* Register actions. */ register_actions(ft_actions, array_count(ft_actions)); } /* Encode/decode for host type. */ bool ft_encode_host_type(const char *s, host_type_t *ht) { int k; for (k = 0; tp[PARM_HOST].keyword[k] != NULL && k < 4; k++) { if (!strncasecmp(s, tp[PARM_HOST].keyword[k], strlen(s))) { *ht = (host_type_t)k; return true; } } *ht = HT_TSO; return false; } const char * ft_decode_host_type(host_type_t ht) { if (ht < HT_TSO || ht > HT_CICS) { return "unknown"; } return tp[PARM_HOST].keyword[(int)ht]; } /* Encode/decode for recfm. */ bool ft_encode_recfm(const char *s, recfm_t *recfm) { int k; for (k = 0; tp[PARM_RECFM].keyword[k] != NULL && k < 4; k++) { if (!strncasecmp(s, tp[PARM_RECFM].keyword[k], strlen(s))) { *recfm = (recfm_t)k; return true; } } *recfm = DEFAULT_RECFM; return false; } const char * ft_decode_recfm(recfm_t recfm) { if (recfm < DEFAULT_RECFM || recfm > RECFM_UNDEFINED) { return "unknown"; } return tp[PARM_RECFM].keyword[(int)recfm]; } /* Encode/decode for units (allocation). */ bool ft_encode_units(const char *s, units_t *units) { int k; for (k = 0; tp[PARM_ALLOCATION].keyword[k] != NULL && k < 4; k++) { if (!strncasecmp(s, tp[PARM_ALLOCATION].keyword[k], strlen(s))) { *units = (units_t)k; return true; } } *units = DEFAULT_UNITS; return false; } const char * ft_decode_units(units_t units) { if (units < DEFAULT_UNITS || units > AVBLOCK) { return "unknown"; } return tp[PARM_ALLOCATION].keyword[(int)units]; } void ft_init(void) { /* * Do a dummy initialization of the Transfer action's ft_config, to catch * and display any errors in the resource defaults. */ ft_init_conf(&transfer_ft_conf); } /* * Initialize or re-initialize an ft_conf structure from the appres * defaults. */ void ft_init_conf(ft_conf_t *p) { /* Initialize the private state. */ p->receive_flag = true; p->host_type = HT_TSO; p->ascii_flag = true; p->cr_flag = p->ascii_flag; p->remap_flag = p->ascii_flag; p->allow_overwrite = false; p->append_flag = false; p->recfm = DEFAULT_RECFM; p->units = DEFAULT_UNITS; p->lrecl = 0; p->blksize = 0; p->primary_space = 0; p->secondary_space = 0; p->avblock = 0; p->dft_buffersize = set_dft_buffersize(0); #if defined(_WIN32) /*[*/ p->windows_codepage = appres.ft.codepage? appres.ft.codepage: (appres.ft.codepage_bc? appres.ft.codepage_bc: appres.local_cp); #endif /*]*/ /* Apply resources. */ if (appres.ft.blksize) { p->blksize = appres.ft.blksize; } if (appres.ft.direction) { if (!strcasecmp(appres.ft.direction, "receive")) { p->receive_flag = true; } else if (!strcasecmp(appres.ft.direction, "send")) { p->receive_flag = false; } else { xs_warning("Invalid %s '%s', ignoring", ResFtDirection, appres.ft.direction); appres.ft.direction = NULL; } } if (appres.ft.host && !ft_encode_host_type(appres.ft.host, &p->host_type)) { xs_warning("Invalid %s '%s', ignoring", ResFtHost, appres.ft.host); appres.ft.host = NULL; } if (appres.ft.host_file) { Replace(p->host_filename, NewString(appres.ft.host_file)); } else { Replace(p->host_filename, NULL); } if (appres.ft.local_file) { Replace(p->local_filename, NewString(appres.ft.local_file)); } else { Replace(p->local_filename, NULL); } if (appres.ft.mode) { if (!strcasecmp(appres.ft.mode, "ascii")) { p->ascii_flag = true; } else if (!strcasecmp(appres.ft.mode, "binary")) { p->ascii_flag = false; } else { xs_warning("Invalid %s '%s', ignoring", ResFtMode, appres.ft.mode); appres.ft.host = NULL; } } if (appres.ft.cr) { /* must come after processing "ascii" */ if (!strcasecmp(appres.ft.cr, "auto")) { p->cr_flag = p->ascii_flag; } else if (!strcasecmp(appres.ft.cr, "add") || !strcasecmp(appres.ft.cr, "remove")) { p->cr_flag = true; } else if (!strcasecmp(appres.ft.cr, "keep")) { p->cr_flag = false; } else { xs_warning("Invalid %s '%s', ignoring", ResFtCr, appres.ft.cr); appres.ft.cr = NULL; } } if (appres.ft.remap) { if (!strcasecmp(appres.ft.remap, "yes")) { p->remap_flag = true; } else if (!strcasecmp(appres.ft.remap, "no")) { p->remap_flag = false; } else { xs_warning("Invalid %s '%s', ignoring", ResFtRemap, appres.ft.remap); appres.ft.remap = NULL; } } if (appres.ft.exist) { if (!strcasecmp(appres.ft.exist, "keep")) { p->allow_overwrite = false; p->append_flag = false; } else if (!strcasecmp(appres.ft.exist, "replace")) { p->allow_overwrite = true; p->append_flag = false; } else if (!strcasecmp(appres.ft.exist, "append")) { p->allow_overwrite = false; p->append_flag = true; } else { xs_warning("Invalid %s '%s', ignoring", ResFtExist, appres.ft.exist); appres.ft.exist = NULL; } } if (appres.ft.primary_space) { p->primary_space = appres.ft.primary_space; } if (appres.ft.recfm && !ft_encode_recfm(appres.ft.recfm, &p->recfm)) { xs_warning("Invalid %s '%s', ignoring", ResFtRecfm, appres.ft.recfm); appres.ft.recfm = NULL; } if (appres.ft.secondary_space) { p->secondary_space = appres.ft.secondary_space; } if (appres.ft.lrecl) { p->lrecl = appres.ft.lrecl; } if (appres.ft.allocation && !ft_encode_units(appres.ft.allocation, &p->units)) { xs_warning("Invalid %s '%s', ignoring", ResFtAllocation, appres.ft.allocation); appres.ft.allocation = NULL; } if (appres.ft.avblock) { p->avblock = appres.ft.avblock; } p->dft_buffersize = set_dft_buffersize(0); } /* Return the right value for fopen()ing the local file. */ static const char * ft_local_fflag(ft_conf_t *p) { static char ret[3]; int nr = 0; ret[nr++] = p->receive_flag? (p->append_flag? 'a': 'w' ): 'r'; if (!p->ascii_flag) { ret[nr++] = 'b'; } ret[nr] = '\0'; return ret; } /* Timeout function for stalled transfers. */ static void ft_didnt_start(ioid_t id _is_unused) { ft_start_id = NULL_IOID; if (fts.local_file != NULL) { fclose(fts.local_file); fts.local_file = NULL; if (ftc->receive_flag && !ftc->append_flag) { unlink(ftc->local_filename); } } ft_complete(get_message("ftStartTimeout")); } /* External entry points called by ft_dft and ft_cut. */ /* Pop up a message, end the transfer. */ void ft_complete(const char *errmsg) { /* Close the local file. */ if (fts.local_file != NULL && fclose(fts.local_file) < 0) { popup_an_errno(errno, "close(%s)", ftc->local_filename); } fts.local_file = NULL; /* Clean up the state. */ ft_state = FT_NONE; if (ft_start_id != NULL_IOID) { RemoveTimeOut(ft_start_id); ft_start_id = NULL_IOID; } /* Get the idle timeout going again. */ idle_ft_complete(); /* Pop down the in-progress shell. */ ft_gui_progress_popdown(); /* Pop up the text. */ if (errmsg != NULL) { char *msg_copy = NewString(errmsg); /* Make sure the error message will fit on the pop-up. */ ft_gui_errmsg_prepare(msg_copy); /* Clear out the progress display. */ ft_gui_clear_progress(); /* Pop up the error. */ popup_an_error("%s", msg_copy); Free(msg_copy); } else { struct timeval t1; double bytes_sec; char *buf; (void) gettimeofday(&t1, NULL); bytes_sec = (double)fts.length / ((double)(t1.tv_sec - t0.tv_sec) + (double)(t1.tv_usec - t0.tv_usec) / 1.0e6); buf = xs_buffer(get_message("ftComplete"), fts.length, display_scale(bytes_sec), fts.is_cut ? "CUT" : "DFT"); ft_gui_clear_progress(); ft_gui_complete_popup(buf); Free(buf); } /* I hope I can do this unconditionally. */ sms_continue(); } /* Update the bytes-transferred count on the progress pop-up. */ void ft_update_length(void) { ft_gui_update_length(fts.length); } /* Process a transfer acknowledgement. */ void ft_running(bool is_cut) { if (ft_state == FT_AWAIT_ACK) { ft_state = FT_RUNNING; if (ft_start_id != NULL_IOID) { RemoveTimeOut(ft_start_id); ft_start_id = NULL_IOID; } } fts.is_cut = is_cut; (void) gettimeofday(&t0, NULL); fts.length = 0; ft_gui_running(fts.length); } /* Process a protocol-generated abort. */ void ft_aborting(void) { if (ft_state == FT_RUNNING || ft_state == FT_ABORT_WAIT) { ft_state = FT_ABORT_SENT; ft_gui_aborting(); } } /* Process a disconnect abort. */ static void ft_connected(bool ignored _is_unused) { if (!CONNECTED && ft_state != FT_NONE) { ft_complete(get_message("ftDisconnected")); } } /* Process an abort from no longer being in 3270 mode. */ static void ft_in3270(bool ignored _is_unused) { if (!IN_3270 && ft_state != FT_NONE) { ft_complete(get_message("ftNot3270")); } } /* * Start a file transfer, based on the contents of an ft_state structure. * * This function will fail if the file exists and the overwrite flag is not * set. * * Returns the local file pointer, or NULL if the transfer could not start. * If an error is detected, it will call popup_an_error() with an appropriate * message. */ FILE * ft_go(ft_conf_t *p) { FILE *f; varbuf_t r; unsigned flen; /* Adjust the DFT buffer size. */ p->dft_buffersize = set_dft_buffersize(p->dft_buffersize); /* See if the local file can be overwritten. */ if (p->receive_flag && !p->append_flag && !p->allow_overwrite) { f = fopen(p->local_filename, p->ascii_flag? "r": "rb"); if (f != NULL) { (void) fclose(f); popup_an_error("Transfer: File exists"); return NULL; } } /* Open the local file. */ f = fopen(p->local_filename, ft_local_fflag(p)); if (f == NULL) { popup_an_errno(errno, "Local file '%s'", p->local_filename); return NULL; } /* Build the ind$file command */ vb_init(&r); vb_appendf(&r, "IND\\e005BFILE %s %s %s", p->receive_flag? "GET": "PUT", p->host_filename, (p->host_type != HT_TSO)? "(": ""); if (p->ascii_flag) { vb_appends(&r, "ASCII"); } else if (p->host_type == HT_CICS) { vb_appends(&r, "BINARY"); } if (p->ascii_flag && p->cr_flag) { vb_appends(&r, " CRLF"); } else if (p->host_type == HT_CICS) { vb_appends(&r, " NOCRLF"); } if (p->append_flag && !p->receive_flag) { vb_appends(&r, " APPEND"); } if (!p->receive_flag) { if (p->host_type == HT_TSO) { if (p->recfm != DEFAULT_RECFM) { /* RECFM Entered, process */ vb_appends(&r, " RECFM("); switch (p->recfm) { case RECFM_FIXED: vb_appends(&r, "F"); break; case RECFM_VARIABLE: vb_appends(&r, "V"); break; case RECFM_UNDEFINED: vb_appends(&r, "U"); break; default: break; }; vb_appends(&r, ")"); if (p->lrecl) { vb_appendf(&r, " LRECL(%d)", p->lrecl); } if (p->blksize) { vb_appendf(&r, " BLKSIZE(%d)", p->blksize); } } if (p->units != DEFAULT_UNITS) { /* Space Entered, processs it */ vb_appendf(&r, " SPACE(%d", p->primary_space); if (p->secondary_space) { vb_appendf(&r, ",%d", p->secondary_space); } vb_appends(&r, ")"); switch (p->units) { case TRACKS: vb_appends(&r, " TRACKS"); break; case CYLINDERS: vb_appends(&r, " CYLINDERS"); break; case AVBLOCK: vb_appendf(&r, " AVBLOCK(%d)", p->avblock); break; default: break; } } } else if (p->host_type == HT_VM) { if (p->recfm != DEFAULT_RECFM) { vb_appends(&r, " RECFM "); switch (p->recfm) { case RECFM_FIXED: vb_appends(&r, "F"); break; case RECFM_VARIABLE: vb_appends(&r, "V"); break; default: break; }; if (p->lrecl) { vb_appendf(&r, " LRECL %d", p->lrecl); } } } } vb_appends(&r, "\\n"); /* Erase the line and enter the command. */ flen = kybd_prime(); if (!flen || flen < vb_len(&r) - 1) { vb_free(&r); if (f != NULL) { fclose(f); if (p->receive_flag && !p->append_flag) { unlink(p->local_filename); } } popup_an_error("%s", get_message("ftUnable")); return NULL; } (void) emulate_input(vb_buf(&r), vb_len(&r), false); vb_free(&r); /* Now proceed with this context. */ ftc = p; /* Finish common initialization. */ fts.last_cr = false; fts.is_cut = false; fts.last_dbcs = false; fts.dbcs_state = FT_DBCS_NONE; ft_state = FT_AWAIT_ACK; idle_ft_start(); return f; } /* * Parse the keywords for the Transfer() action. * * Returns a pointer to the filled-out ft_state structure, or NULL for * errors. */ static ft_conf_t * parse_ft_keywords(unsigned argc, const char **argv) { ft_conf_t *p = &transfer_ft_conf; int i, k; unsigned j; char *ptr; /* Unlike the GUIs, always set everything to defaults. */ ft_init_conf(p); p->is_action = true; for (i = 0; i < N_PARMS; i++) { Replace(tp[i].value, NULL); } /* The special keyword 'Defaults' means 'just use the defaults'. */ if (argc == 1 && !strcasecmp(argv[0], "Defaults")) { argc--; argv++; } /* See what they specified. */ for (j = 0; j < argc; j++) { for (i = 0; i < N_PARMS; i++) { char *eq; size_t kwlen; eq = strchr(argv[j], '='); if (eq == NULL || eq == argv[j] || !*(eq + 1)) { popup_an_error("Transfer: Invalid option syntax: '%s'", argv[j]); return NULL; } kwlen = eq - argv[j]; if (!strncasecmp(argv[j], tp[i].name, kwlen) && !tp[i].name[kwlen]) { if (tp[i].keyword[0]) { for (k = 0; tp[i].keyword[k] != NULL && k < 4; k++) { if (!strncasecmp(eq + 1, tp[i].keyword[k], strlen(eq + 1))) { break; } } if (k >= 4 || tp[i].keyword[k] == NULL) { popup_an_error("Transfer: Invalid option value: '%s'", eq + 1); return NULL; } } else switch (i) { case PARM_LRECL: case PARM_BLKSIZE: case PARM_PRIMARY_SPACE: case PARM_SECONDARY_SPACE: case PARM_BUFFER_SIZE: #if defined(_WIN32) /*[*/ case PARM_WINDOWS_CODEPAGE: #endif /*]*/ (void) strtol(eq + 1, &ptr, 10); if (ptr == eq + 1 || *ptr) { popup_an_error("Transfer: Invalid option value: " "'%s'", eq + 1); return NULL; } break; default: break; } tp[i].value = NewString(eq + 1); break; } } if (i >= N_PARMS) { popup_an_error("Transfer: Unknown option: '%s'", argv[j]); return NULL; } } /* Transfer from keywords to the ft_state. */ if (tp[PARM_DIRECTION].value) { p->receive_flag = !strcasecmp(tp[PARM_DIRECTION].value, "receive"); } if (tp[PARM_HOST_FILE].value) { p->host_filename = NewString(tp[PARM_HOST_FILE].value); } if (tp[PARM_LOCAL_FILE].value) { p->local_filename = NewString(tp[PARM_LOCAL_FILE].value); } if (tp[PARM_HOST].value) { (void) ft_encode_host_type(tp[PARM_HOST].value, &p->host_type); } if (tp[PARM_MODE].value) { p->ascii_flag = !strcasecmp(tp[PARM_MODE].value, "ascii"); } if (tp[PARM_CR].value) { if (!strcasecmp(tp[PARM_CR].value, "auto")) { p->cr_flag = p->ascii_flag; } else { if (!p->ascii_flag) { popup_an_error("Transfer: Invalid 'Cr' option for ASCII mode"); return NULL; } p->cr_flag = !strcasecmp(tp[PARM_CR].value, "remove") || !strcasecmp(tp[PARM_CR].value, "add"); } } if (p->ascii_flag && tp[PARM_REMAP].value) { p->remap_flag = !strcasecmp(tp[PARM_REMAP].value, "yes"); } if (tp[PARM_EXIST].value) { p->append_flag = !strcasecmp(tp[PARM_EXIST].value, "append"); p->allow_overwrite = !strcasecmp(tp[PARM_EXIST].value, "replace"); } if (tp[PARM_RECFM].value) { (void) ft_encode_recfm(tp[PARM_RECFM].value, &p->recfm); } if (tp[PARM_LRECL].value) { p->lrecl = atoi(tp[PARM_LRECL].value); } if (tp[PARM_BLKSIZE].value) { p->blksize = atoi(tp[PARM_BLKSIZE].value); } if (tp[PARM_ALLOCATION].value) { (void) ft_encode_units(tp[PARM_ALLOCATION].value, &p->units); } if (tp[PARM_PRIMARY_SPACE].value) { p->primary_space = atoi(tp[PARM_PRIMARY_SPACE].value); } if (tp[PARM_SECONDARY_SPACE].value) { p->secondary_space = atoi(tp[PARM_SECONDARY_SPACE].value); } if (tp[PARM_BUFFER_SIZE].value != NULL) { p->dft_buffersize = atoi(tp[PARM_BUFFER_SIZE].value); } if (tp[PARM_AVBLOCK].value) { p->avblock = atoi(tp[PARM_AVBLOCK].value); } #if defined(_WIN32) /*[*/ if (tp[PARM_WINDOWS_CODEPAGE].value != NULL) { p->windows_codepage = atoi(tp[PARM_WINDOWS_CODEPAGE].value); } #endif /*]*/ /* Check for required values. */ if (!p->host_filename) { popup_an_error("Transfer: Missing 'HostFile' option"); return NULL; } if (!p->local_filename) { popup_an_error("Transfer: Missing 'LocalFile' option"); return NULL; } if (p->host_type == HT_TSO && !p->receive_flag && p->units != DEFAULT_UNITS && p->primary_space <= 0) { popup_an_error("Transfer: Missing or invalid 'PrimarySpace'"); return NULL; } if (p->host_type == HT_TSO && !p->receive_flag && p->units == AVBLOCK && p->avblock <= 0) { popup_an_error("Transfer: Missing or invalid 'Avblock'"); return NULL; } /* Check for contradictory values. */ if (tp[PARM_CR].value && !p->ascii_flag) { popup_an_error("Transfer: 'Cr' is only for ASCII transfers"); return NULL; } if (tp[PARM_REMAP].value && !p->ascii_flag) { popup_an_error("Transfer: 'Remap' is only for ASCII transfers"); return NULL; } if (tp[PARM_RECFM].value && p->receive_flag) { popup_an_error("Transfer: 'Recfm' is only for sending files"); return NULL; } if (tp[PARM_RECFM].value && p->host_type != HT_TSO && p->host_type != HT_VM) { popup_an_error("Transfer: 'Recfm' is only for TSO and VM hosts"); return NULL; } if (tp[PARM_LRECL].value && p->receive_flag) { popup_an_error("Transfer: 'Lrecl' is only for sending files"); return NULL; } if (tp[PARM_BLKSIZE].value && p->receive_flag) { popup_an_error("Transfer: 'Blksize' is only for sending files"); return NULL; } if (tp[PARM_BLKSIZE].value && p->host_type != HT_TSO) { popup_an_error("Transfer: 'Blksize' is only for TSO hosts"); return NULL; } if (tp[PARM_ALLOCATION].value && p->receive_flag) { popup_an_error("Transfer: 'Allocation' is only for sending files"); return NULL; } if (tp[PARM_ALLOCATION].value && p->host_type != HT_TSO) { popup_an_error("Transfer: 'Allocation' is only for TSO hosts"); return NULL; } if (tp[PARM_PRIMARY_SPACE].value && p->receive_flag) { popup_an_error("Transfer: 'PrimarySpace' is only for sending files"); return NULL; } if (tp[PARM_PRIMARY_SPACE].value && p->host_type != HT_TSO) { popup_an_error("Transfer: 'PrimarySpace' is only for TSO hosts"); return NULL; } if (tp[PARM_SECONDARY_SPACE].value && p->receive_flag) { popup_an_error("Transfer: 'SecondarySpace' is only for sending files"); return NULL; } if (tp[PARM_SECONDARY_SPACE].value && p->host_type != HT_TSO) { popup_an_error("Transfer: 'SecondarySpace' is only for TSO hosts"); return NULL; } if (tp[PARM_AVBLOCK].value && p->receive_flag) { popup_an_error("Transfer: 'Avblock' is only for sending files"); return NULL; } if (tp[PARM_AVBLOCK].value && p->host_type != HT_TSO) { popup_an_error("Transfer: 'Avblock' is only for TSO hosts"); return NULL; } #if defined(_WIN32) /*[*/ if (tp[PARM_WINDOWS_CODEPAGE].value && !p->ascii_flag) { popup_an_error("Transfer: 'WindowsCodePage' is only for ASCII " "transfers"); return NULL; } #endif /*]*/ /* All set. */ return p; } /* * Script/macro action for file transfer. * Transfer(option=value[,...]) * Options are: * Direction=send|receive default receive * HostFile=name required * LocalFile=name required * Host=[tso|vm|cics] default tso * Mode=[ascii|binary] default ascii * Cr=[add|remove|keep] default add/remove * Remap=[yes|no] default yes * Exist=[keep|replace|append] default keep * Recfm=[default|fixed|variable|undefined] default default * Lrecl=n no default * Blksize=n no default * Allocation=[default|tracks|cylinders|avblock] default default * PrimarySpace=n no default * SecondarySpace=n no default * BufferSize no default * Avblock=n no default * WindowsCodePage=n no default */ static bool Transfer_action(ia_t ia, unsigned argc, const char **argv) { ft_conf_t *p = NULL; action_debug("Transfer", ia, argc, argv); /* Make sure we're connected. */ if (!IN_3270) { popup_an_error("Transfer: Not connected"); return false; } /* Check for interactive mode. */ if (argc == 0) { if (!gui_conf_initted) { ft_init_conf(&gui_ft_conf); gui_ft_conf.is_action = true; gui_conf_initted = true; } switch (ft_gui_interact(&gui_ft_conf)) { case FGI_NOP: /* Hope the defaults are enough. */ break; case FGI_SUCCESS: /* Proceed as specified in the ft_state. */ p = &gui_ft_conf; break; case FGI_ABORT: /* User said no. */ return false; } } if (p == NULL) { /* Parse the keywords into the ft_state structure. */ p = parse_ft_keywords(argc, argv); if (p == NULL) { return false; } p->is_interactive = (ia == IA_COMMAND); } /* Start the transfer. */ fts.local_file = ft_go(p); if (fts.local_file == NULL) { return false; } /* If interactive, tell the user we're waiting. */ ft_gui_awaiting(); /* Set a timeout for failed command start. */ ft_start_id = AddTimeOut(10 * 1000, ft_didnt_start); /* Success. */ return true; } /* * Cancel a file transfer. * * Returns true if the transfer if the cancellation is complete, false if it * is pending (because it must be coordinated with the host). */ bool ft_do_cancel(void) { if (ft_state == FT_RUNNING) { ft_state = FT_ABORT_WAIT; return false; } else { if (ft_state != FT_NONE) { ft_complete(get_message("ftUserCancel")); } return true; } } #if defined(_WIN32) /*[*/ /* * Windows character translation functions. * * These are wrappers around the existing functions in unicode.c, but they swap * the local codepage in and out to use the one specified for the transfer. * * On other platforms, these functions are #defined to their 'real' * counterparts. */ size_t ft_ebcdic_to_multibyte(ebc_t ebc, char mb[], size_t mb_len) { int local_cp = appres.local_cp; size_t rc; appres.local_cp = ftc->windows_codepage; rc = ebcdic_to_multibyte(ebc, mb, mb_len); appres.local_cp = local_cp; return rc; } int ft_unicode_to_multibyte(ucs4_t ucs4, char *mb, size_t mb_len) { int local_cp = appres.local_cp; int rc; appres.local_cp = ftc->windows_codepage; rc = unicode_to_multibyte(ucs4, mb, mb_len); appres.local_cp = local_cp; return rc; } ucs4_t ft_multibyte_to_unicode(const char *mb, size_t mb_len, int *consumedp, enum me_fail *errorp) { int local_cp = appres.local_cp; ucs4_t rc; appres.local_cp = ftc->windows_codepage; rc = multibyte_to_unicode(mb, mb_len, consumedp, errorp); appres.local_cp = local_cp; return rc; } #endif /*]*/ suite3270-3.6/Common/ft_cut.c0000664000076500007650000004455113221577163014065 0ustar pdmpdm/* * Copyright (c) 1996-2012, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ft_cut.c * File transfer, data movement logic, CUT version */ #include #include "globals.h" #include "ctlr.h" #include "3270ds.h" #include "actions.h" #include "ctlrc.h" #include "ft_cut.h" #include "ft_cut_ds.h" #include "ft_private.h" #include "unicodec.h" #include "ft.h" #include "tables.h" #include "trace.h" #include "utils.h" static bool cut_xfer_in_progress = false; /* Data stream conversion tables. */ #define NQ 4 /* number of quadrants */ #define NE 77 /* number of elements per quadrant */ #define OTHER_2 2 /* "OTHER 2" quadrant (includes NULL) */ #define XLATE_NULL 0xc1 /* translation of NULL */ static char alphas[NE + 1] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%&_()<+,-./:>?"; static struct { unsigned char selector; unsigned char xlate[NE]; } conv[NQ] = { { 0x5e, /* ';' */ { 0x40,0xc1,0xc2,0xc3, 0xc4,0xc5,0xc6,0xc7, 0xc8,0xc9,0xd1,0xd2, 0xd3,0xd4,0xd5,0xd6, 0xd7,0xd8,0xd9,0xe2, 0xe3,0xe4,0xe5,0xe6, 0xe7,0xe8,0xe9,0x81, 0x82,0x83,0x84,0x85, 0x86,0x87,0x88,0x89, 0x91,0x92,0x93,0x94, 0x95,0x96,0x97,0x98, 0x99,0xa2,0xa3,0xa4, 0xa5,0xa6,0xa7,0xa8, 0xa9,0xf0,0xf1,0xf2, 0xf3,0xf4,0xf5,0xf6, 0xf7,0xf8,0xf9,0x6c, 0x50,0x6d,0x4d,0x5d, 0x4c,0x4e,0x6b,0x60, 0x4b,0x61,0x7a,0x6e, 0x6f } }, { 0x7e, /* '=' */ { 0x20,0x41,0x42,0x43, 0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b, 0x4c,0x4d,0x4e,0x4f, 0x50,0x51,0x52,0x53, 0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x61, 0x62,0x63,0x64,0x65, 0x66,0x67,0x68,0x69, 0x6a,0x6b,0x6c,0x6d, 0x6e,0x6f,0x70,0x71, 0x72,0x73,0x74,0x75, 0x76,0x77,0x78,0x79, 0x7a,0x30,0x31,0x32, 0x33,0x34,0x35,0x36, 0x37,0x38,0x39,0x25, 0x26,0x27,0x28,0x29, 0x2a,0x2b,0x2c,0x2d, 0x2e,0x2f,0x3a,0x3b, 0x3f } }, { 0x5c, /* '*' */ { 0x00,0x00,0x01,0x02, 0x03,0x04,0x05,0x06, 0x07,0x08,0x09,0x0a, 0x0b,0x0c,0x0d,0x0e, 0x0f,0x10,0x11,0x12, 0x13,0x14,0x15,0x16, 0x17,0x18,0x19,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x3c,0x3d,0x3e, 0x00,0xfa,0xfb,0xfc, 0xfd,0xfe,0xff,0x7b, 0x7c,0x7d,0x7e,0x7f, 0x1a,0x1b,0x1c,0x1d, 0x1e,0x1f,0x00,0x00, 0x00 } }, { 0x7d, /* '\'' */ { 0x00,0xa0,0xa1,0xea, 0xeb,0xec,0xed,0xee, 0xef,0xe0,0xe1,0xaa, 0xab,0xac,0xad,0xae, 0xaf,0xb0,0xb1,0xb2, 0xb3,0xb4,0xb5,0xb6, 0xb7,0xb8,0xb9,0x80, 0x00,0xca,0xcb,0xcc, 0xcd,0xce,0xcf,0xc0, 0x00,0x8a,0x8b,0x8c, 0x8d,0x8e,0x8f,0x90, 0x00,0xda,0xdb,0xdc, 0xdd,0xde,0xdf,0xd0, 0x00,0x00,0x21,0x22, 0x23,0x24,0x5b,0x5c, 0x00,0x5e,0x5f,0x00, 0x9c,0x9d,0x9e,0x9f, 0xba,0xbb,0xbc,0xbd, 0xbe,0xbf,0x9a,0x9b, 0x00 } } }; static char table6[] = "abcdefghijklmnopqrstuvwxyz&-.,:+ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"; static int quadrant = -1; static unsigned long expanded_length; static char *saved_errmsg = NULL; #define XLATE_NBUF 32 static int xlate_buffered = 0; /* buffer count */ static int xlate_buf_ix = 0; /* buffer index */ static unsigned char xlate_buf[XLATE_NBUF]; /* buffer */ static bool cut_eof = false; static void cut_control_code(void); static void cut_data_request(void); static void cut_retransmit(void); static void cut_data(void); static void cut_ack(void); static void cut_abort(const char *s, unsigned short reason); static unsigned from6(unsigned char c); static int xlate_getc(void); /* * Convert a buffer for uploading (host->local). * Returns the length of the converted data. * If there is a conversion error, calls cut_abort() and returns -1. */ static int upload_convert(unsigned char *buf, int len, unsigned char *obuf, size_t obuf_len) { unsigned char *ob0 = obuf; unsigned char *ob = ob0; size_t nx; while (len-- && obuf_len) { unsigned char c = *buf++; char *ixp; size_t ix; retry: if (quadrant < 0) { /* Find the quadrant. */ for (quadrant = 0; quadrant < NQ; quadrant++) { if (c == conv[quadrant].selector) { break; } } if (quadrant >= NQ) { cut_abort(get_message("ftCutConversionError"), SC_ABORT_XMIT); return -1; } continue; } /* Make sure it's in a valid range. */ if (c < 0x40 || c > 0xf9) { cut_abort(get_message("ftCutConversionError"), SC_ABORT_XMIT); return -1; } /* Translate to a quadrant index. */ ixp = strchr(alphas, ebc2asc0[c]); if (ixp == NULL) { /* Try a different quadrant. */ quadrant = -1; goto retry; } ix = ixp - alphas; /* * See if it's mapped by that quadrant, handling NULLs * specially. */ if (quadrant != OTHER_2 && c != XLATE_NULL && !conv[quadrant].xlate[ix]) { /* Try a different quadrant. */ quadrant = -1; goto retry; } /* Map it. */ c = conv[quadrant].xlate[ix]; if (ftc->ascii_flag && ftc->cr_flag && (c == '\r' || c == 0x1a)) { continue; } if (!(ftc->ascii_flag && ftc->remap_flag)) { /* No further translation necessary. */ *ob++ = c; obuf_len--; continue; } /* * Convert to local multi-byte. * We do that by inverting the host's EBCDIC-to-ASCII map, * getting back to EBCDIC, and converting to multi-byte from * there. */ switch (fts.dbcs_state) { case FT_DBCS_NONE: if (c == EBC_so) { fts.dbcs_state = FT_DBCS_SO; continue; } /* fall through to non-DBCS case below */ break; case FT_DBCS_SO: if (c == EBC_si) { fts.dbcs_state = FT_DBCS_NONE; } else { fts.dbcs_byte1 = i_asc2ft[c]; fts.dbcs_state = FT_DBCS_LEFT; } continue; case FT_DBCS_LEFT: if (c == EBC_si) { fts.dbcs_state = FT_DBCS_NONE; continue; } nx = ft_ebcdic_to_multibyte((fts.dbcs_byte1 << 8) | i_asc2ft[c], (char *)ob, obuf_len); if (nx && (ob[nx - 1] == '\0')) { nx--; } ob += nx; obuf_len -= nx; fts.dbcs_state = FT_DBCS_SO; continue; } if (c < 0x20 || ((c >= 0x80 && c < 0xa0 && c != 0x9f))) { /* * Control code, treat it as Unicode. * * Note that IND$FILE and the VM 'TYPE' command think * that EBCDIC X'E1' is a control code; IND$FILE maps * it onto ASCII 0x9f. So we skip it explicitly and * treat it as printable here. */ nx = ft_unicode_to_multibyte(c, (char *)ob, obuf_len); } else if (c == 0xff) { nx = ft_unicode_to_multibyte(0x9f, (char *)ob, obuf_len); } else { /* Displayable character, remap. */ c = i_asc2ft[c]; nx = ft_ebcdic_to_multibyte(c, (char *)ob, obuf_len); } if (nx && (ob[nx - 1] == '\0')) { nx--; } ob += nx; obuf_len -= nx; } return (int)(ob - ob0); } /* * Store a download (local->host) character. * Returns the number of bytes stored. */ static int store_download(unsigned char c, unsigned char *ob) { unsigned char *ixp; size_t ix; int oq; /* Quadrant already defined. */ if (quadrant >= 0) { ixp = (unsigned char *)memchr(conv[quadrant].xlate, c, NE); if (ixp != NULL) { ix = ixp - conv[quadrant].xlate; *ob++ = asc2ebc0[(int)alphas[ix]]; return 1; } } /* Locate a quadrant. */ oq = quadrant; for (quadrant = 0; quadrant < NQ; quadrant++) { if (quadrant == oq) { continue; } ixp = (unsigned char *)memchr(conv[quadrant].xlate, c, NE); if (ixp == NULL) { continue; } ix = ixp - conv[quadrant].xlate; *ob++ = conv[quadrant].selector; *ob++ = asc2ebc0[(int)alphas[ix]]; return 2; } quadrant = -1; fprintf(stderr, "Oops\n"); return 0; } /* Convert a buffer for downloading (local->host). */ static size_t download_convert(unsigned const char *buf, unsigned len, unsigned char *xobuf) { unsigned char *ob0 = xobuf; unsigned char *ob = ob0; while (len) { unsigned char c = *buf; int consumed; enum me_fail error; ebc_t e; ucs4_t u; /* Handle nulls separately. */ if (!c) { if (fts.last_dbcs) { ob += store_download(EBC_si, ob); fts.last_dbcs = false; } if (quadrant != OTHER_2) { quadrant = OTHER_2; *ob++ = conv[quadrant].selector; } *ob++ = XLATE_NULL; buf++; len--; continue; } if (!(ftc->ascii_flag && ftc->remap_flag)) { ob += store_download(c, ob); buf++; len--; continue; } /* * Translate. * * The host uses a fixed EBCDIC-to-ASCII translation table, * which was derived empirically into i_ft2asc/i_asc2ft. * Invert that so that when the host applies its conversion, * it gets the right EBCDIC code. * * DBCS is a guess at this point, assuming that SO and SI * are unmodified by IND$FILE. */ u = ft_multibyte_to_unicode((const char *)buf, len, &consumed, &error); if (u < 0x20 || ((u >= 0x80 && u < 0x9f))) { e = i_asc2ft[u]; } else if (u == 0x9f) { e = 0xff; } else { e = unicode_to_ebcdic(u); } if (e & 0xff00) { if (!fts.last_dbcs) { ob += store_download(EBC_so, ob); } ob += store_download(i_ft2asc[(e >> 8) & 0xff], ob); ob += store_download(i_ft2asc[e & 0xff], ob); fts.last_dbcs = true; } else { if (fts.last_dbcs) { ob += store_download(EBC_si, ob); fts.last_dbcs = false; } if (e == 0) { ob += store_download('?', ob); } else { ob += store_download(i_ft2asc[e], ob); } } buf += consumed; len -= consumed; } return ob - ob0; } /* * Main entry point from ctlr.c. * We have received what looks like an appropriate message from the host. */ void ft_cut_data(void) { switch (ea_buf[O_FRAME_TYPE].cc) { case FT_CONTROL_CODE: cut_control_code(); break; case FT_DATA_REQUEST: cut_data_request(); break; case FT_RETRANSMIT: cut_retransmit(); break; case FT_DATA: cut_data(); break; default: trace_ds("< FT unknown 0x%02x\n", ea_buf[O_FRAME_TYPE].cc); cut_abort(get_message("ftCutUnknownFrame"), SC_ABORT_XMIT); break; } } /* * Process a control code from the host. */ static void cut_control_code(void) { unsigned short code; char *buf; char *bp; int i; trace_ds("< FT CONTROL_CODE "); code = (ea_buf[O_CC_STATUS_CODE].cc << 8) | ea_buf[O_CC_STATUS_CODE + 1].cc; switch (code) { case SC_HOST_ACK: trace_ds("HOST_ACK\n"); cut_xfer_in_progress = true; expanded_length = 0; quadrant = -1; xlate_buffered = 0; xlate_buf_ix = 0; cut_eof = false; cut_ack(); ft_running(true); break; case SC_XFER_COMPLETE: trace_ds("XFER_COMPLETE\n"); cut_ack(); cut_xfer_in_progress = false; ft_complete(NULL); break; case SC_ABORT_FILE: case SC_ABORT_XMIT: trace_ds("ABORT\n"); cut_xfer_in_progress = false; cut_ack(); if (ft_state == FT_ABORT_SENT && saved_errmsg != NULL) { buf = saved_errmsg; saved_errmsg = NULL; } else { size_t mb_len = 161; bp = buf = Malloc(mb_len); for (i = 0; i < 80; i++) { size_t xlen; xlen = ft_ebcdic_to_multibyte(ea_buf[O_CC_MESSAGE + i].cc, bp, mb_len); if (xlen) { bp += xlen - 1; mb_len -= xlen - 1; } } *bp-- = '\0'; while (bp >= buf && *bp == ' ') { *bp-- = '\0'; } if (bp >= buf && *bp == '$') { *bp-- = '\0'; } while (bp >= buf && *bp == ' ') { *bp-- = '\0'; } if (!*buf) { strcpy(buf, get_message("ftHostCancel")); } } ft_complete(buf); Free(buf); break; default: trace_ds("unknown 0x%04x\n", code); cut_abort(get_message("ftCutUnknownControl"), SC_ABORT_XMIT); break; } } /* * Process a data request from the host. */ static void cut_data_request(void) { unsigned char seq = ea_buf[O_DR_FRAME_SEQ].cc; int count; unsigned char cs; int c; int i; unsigned char attr; trace_ds("< FT DATA_REQUEST %u\n", from6(seq)); if (ft_state == FT_ABORT_WAIT) { cut_abort(get_message("ftUserCancel"), SC_ABORT_FILE); return; } /* Copy data into the screen buffer. */ count = 0; while (count < O_UP_MAX && !cut_eof) { if ((c = xlate_getc()) == EOF) { cut_eof = true; break; } ctlr_add(O_UP_DATA + count, c, 0); count++; } /* Check for errors. */ if (ferror(fts.local_file)) { int j; char *msg; /* Clean out any data we may have written. */ for (j = 0; j < count; j++) { ctlr_add(O_UP_DATA + j, 0, 0); } /* Abort the transfer. */ msg = xs_buffer("read(%s): %s", ftc->local_filename, strerror(errno)); cut_abort(msg, SC_ABORT_FILE); Free(msg); return; } /* Send special data for EOF. */ if (!count && cut_eof) { ctlr_add(O_UP_DATA, EOF_DATA1, 0); ctlr_add(O_UP_DATA+1, EOF_DATA2, 0); count = 2; } /* Compute the other fields. */ ctlr_add(O_UP_FRAME_SEQ, seq, 0); cs = 0; for (i = 0; i < count; i++) { cs ^= ea_buf[O_UP_DATA + i].cc; } ctlr_add(O_UP_CSUM, asc2ebc0[(int)table6[cs & 0x3f]], 0); ctlr_add(O_UP_LEN, asc2ebc0[(int)table6[(count >> 6) & 0x3f]], 0); ctlr_add(O_UP_LEN+1, asc2ebc0[(int)table6[count & 0x3f]], 0); /* XXX: Change the data field attribute so it doesn't display. */ attr = ea_buf[O_DR_SF].fa; attr = (attr & ~FA_INTENSITY) | FA_INT_ZERO_NSEL; ctlr_add_fa(O_DR_SF, attr, 0); /* Send it up to the host. */ trace_ds("> FT DATA %u\n", from6(seq)); ft_update_length(); expanded_length += count; run_action("Enter", IA_FT, NULL, NULL); } /* * (Improperly) process a retransmit from the host. */ static void cut_retransmit(void) { trace_ds("< FT RETRANSMIT\n"); cut_abort(get_message("ftCutRetransmit"), SC_ABORT_XMIT); } /* * Convert an encoded integer. */ static unsigned from6(unsigned char c) { char *p; c = ebc2asc0[c]; p = strchr(table6, c); if (p == NULL) { return 0; } return (unsigned)(p - table6); } /* * Process data from the host. */ static void cut_data(void) { static unsigned char cvbuf[O_RESPONSE - O_DT_DATA]; static unsigned char cvobuf[4 * (O_RESPONSE - O_DT_DATA)]; unsigned short raw_length; int conv_length; register int i; trace_ds("< FT DATA\n"); if (ft_state == FT_ABORT_WAIT) { cut_abort(get_message("ftUserCancel"), SC_ABORT_FILE); return; } /* Copy and convert the data. */ raw_length = from6(ea_buf[O_DT_LEN].cc) << 6 | from6(ea_buf[O_DT_LEN + 1].cc); if ((int)raw_length > O_RESPONSE - O_DT_DATA) { cut_abort(get_message("ftCutOversize"), SC_ABORT_XMIT); return; } for (i = 0; i < (int)raw_length; i++) { cvbuf[i] = ea_buf[O_DT_DATA + i].cc; } if (raw_length == 2 && cvbuf[0] == EOF_DATA1 && cvbuf[1] == EOF_DATA2) { trace_ds("< FT EOF\n"); cut_ack(); return; } conv_length = upload_convert(cvbuf, raw_length, cvobuf, sizeof(cvobuf)); if (conv_length < 0) { return; } /* Write it to the file. */ if (fwrite((char *)cvobuf, conv_length, 1, fts.local_file) == 0) { char *msg; msg = xs_buffer("write(%s): %s", ftc->local_filename, strerror(errno)); cut_abort(msg, SC_ABORT_FILE); Free(msg); } else { fts.length += conv_length; ft_update_length(); cut_ack(); } } /* * Acknowledge a host command. */ static void cut_ack(void) { trace_ds("> FT ACK\n"); run_action("Enter", IA_FT, NULL, NULL); } /* * Abort a transfer in progress. */ static void cut_abort(const char *s, unsigned short reason) { /* Save the error message. */ Replace(saved_errmsg, NewString(s)); /* Send the abort sequence. */ ctlr_add(RO_FRAME_TYPE, RFT_CONTROL_CODE, 0); ctlr_add(RO_FRAME_SEQ, ea_buf[O_DT_FRAME_SEQ].cc, 0); ctlr_add(RO_REASON_CODE, HIGH8(reason), 0); ctlr_add(RO_REASON_CODE+1, LOW8(reason), 0); trace_ds("> FT CONTROL_CODE ABORT\n"); run_action("PF", IA_FT, "2", NULL); /* Update the in-progress pop-up. */ ft_aborting(); } /* * Get the next translated character from the local file. * Returns the character (in EBCDIC), or EOF. */ static int xlate_getc(void) { int r; int c; unsigned char cbuf[32]; size_t nc; int consumed; enum me_fail error; char mb[16]; int mb_len = 0; /* If there is a data buffered, return it. */ if (xlate_buffered) { r = xlate_buf[xlate_buf_ix]; xlate_buf_ix++; xlate_buffered--; return r; } if (ftc->ascii_flag) { /* * Get the next (possibly multi-byte) character from the file. */ do { c = fgetc(fts.local_file); if (c == EOF) { if (fts.last_dbcs) { fts.last_dbcs = false; return EBC_si; } return c; } fts.length++; mb[mb_len++] = c; error = ME_NONE; (void) ft_multibyte_to_unicode(mb, mb_len, &consumed, &error); if (error == ME_INVALID) { mb[0] = '?'; mb_len = 1; error = ME_NONE; } } while (error == ME_SHORT); /* Expand it. */ if (ftc->ascii_flag && ftc->cr_flag && !fts.last_cr && c == '\n') { nc = download_convert((unsigned const char *)"\r", 1, cbuf); } else { nc = 0; fts.last_cr = (c == '\r'); } } else { /* Binary, just read it. */ c = fgetc(fts.local_file); if (c == EOF) return c; mb[0] = c; mb_len = 1; nc = 0; fts.length++; } /* Convert it. */ nc += download_convert((unsigned char *)mb, mb_len, &cbuf[nc]); /* Return it and buffer what's left. */ r = cbuf[0]; if (nc > 1) { size_t i; for (i = 1; i < nc; i++) { xlate_buf[xlate_buffered++] = cbuf[i]; } xlate_buf_ix = 0; } return r; } suite3270-3.6/Common/ft_dft.c0000664000076500007650000004367113221577163014051 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2016 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_dft.c * File transfer: DFT-style data processing functions */ #include "globals.h" #include "appres.h" #include "3270ds.h" #include "ft_dft_ds.h" #include "kybd.h" #include "ft_dft.h" #include "ft_private.h" #include "unicodec.h" #include "ft.h" #include "telnet_core.h" #include "trace.h" #include "utils.h" #include /* Macros. */ #define OPEN_MSG "FT:MSG" /* Open request for message */ #define END_TRANSFER "TRANS03" /* Message for xfer complete */ #define DFT_MIN_BUF 256 #define DFT_MAX_BUF 32767 #define DFT_MAX_UNGETC 32 /* Typedefs. */ struct data_buffer { char sf_length[2]; /* SF length = 0x0023 */ char sf_d0; /* 0xD0 */ char sf_request_type[2]; /* request type */ char compress_indic[2]; /* 0xc080 */ char begin_data; /* 0x61 */ char data_length[2]; /* Data Length in 3270 byte order+5 */ char data[256]; /* The actual data */ }; /* Globals. */ /* Statics. */ static bool message_flag = false; /* Open Request for msg received */ static int dft_eof; static unsigned long recnum; static char *abort_string = NULL; static unsigned char *dft_savebuf = NULL; static size_t dft_savebuf_len = 0; static size_t dft_savebuf_max = 0; static unsigned char dft_ungetc_cache[DFT_MAX_UNGETC]; static size_t dft_ungetc_count = 0; static void dft_abort(const char *s, unsigned short code); static void dft_close_request(void); static void dft_data_insert(struct data_buffer *data_bufr); static void dft_get_request(void); static void dft_insert_request(void); static void dft_open_request(unsigned short len, unsigned char *cp); static void dft_set_cur_req(void); /* Process a Transfer Data structured field from the host. */ void ft_dft_data(unsigned char *data, int length _is_unused) { struct data_buffer *data_bufr = (struct data_buffer *)data; unsigned short data_length, data_type; unsigned char *cp; if (ft_state == FT_NONE) { trace_ds(" (no transfer in progress)\n"); return; } /* Get the length. */ cp = (unsigned char *)(data_bufr->sf_length); GET16(data_length, cp); /* Get the function type. */ cp = (unsigned char *)(data_bufr->sf_request_type); GET16(data_type, cp); /* Handle the requests */ switch (data_type) { case TR_OPEN_REQ: dft_open_request(data_length, cp); break; case TR_INSERT_REQ: /* Insert Request */ dft_insert_request(); break; case TR_DATA_INSERT: dft_data_insert(data_bufr); break; case TR_SET_CUR_REQ: dft_set_cur_req(); break; case TR_GET_REQ: dft_get_request(); break; case TR_CLOSE_REQ: dft_close_request(); break; default: trace_ds(" Unsupported(0x%04x)\n", data_type); break; } } /* Process an Open request. */ static void dft_open_request(unsigned short len, unsigned char *cp) { char *name = "?"; char namebuf[8]; char *s; unsigned short recsz = 0; if (len == 0x23) { name = (char *)cp + 25; } else if (len == 0x29) { unsigned char *recszp; recszp = cp + 27; GET16(recsz, recszp); name = (char *)cp + 31; } else { dft_abort(get_message("ftDftUknownOpen"), TR_OPEN_REQ); return; } (void) memcpy(namebuf, name, 7); namebuf[7] = '\0'; s = &namebuf[6]; while (s >= namebuf && *s == ' ') { *s-- = '\0'; } if (recsz) { trace_ds(" Open('%s',recsz=%u)\n", namebuf, recsz); } else { trace_ds(" Open('%s')\n", namebuf); } if (!strcmp(namebuf, OPEN_MSG)) { message_flag = true; } else { message_flag = false; ft_running(false); } dft_eof = false; recnum = 1; dft_ungetc_count = 0; /* Acknowledge the Open. */ trace_ds("> WriteStructuredField FileTransferData OpenAck\n"); obptr = obuf; space3270out(6); *obptr++ = AID_SF; SET16(obptr, 5); *obptr++ = SF_TRANSFER_DATA; SET16(obptr, 9); net_output(); } /* Process an Insert request. */ static void dft_insert_request(void) { trace_ds(" Insert\n"); /* Doesn't currently do anything. */ } /* Send an acknowledgement frame back. */ static void dft_data_ack(void) { trace_ds("> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", recnum); obptr = obuf; space3270out(12); *obptr++ = AID_SF; SET16(obptr, 11); *obptr++ = SF_TRANSFER_DATA; SET16(obptr, TR_NORMAL_REPLY); SET16(obptr, TR_RECNUM_HDR); SET32(obptr, recnum); recnum++; net_output(); } /* Process a Data Insert request. */ static void dft_data_insert(struct data_buffer *data_bufr) { /* Received a data buffer, get the length and process it */ int my_length; unsigned char *cp; if (!message_flag && ft_state == FT_ABORT_WAIT) { dft_abort(get_message("ftUserCancel"), TR_DATA_INSERT); return; } cp = (unsigned char *) (data_bufr->data_length); /* Get the data length in native format. */ GET16(my_length, cp); /* Adjust for 5 extra count */ my_length -= 5; trace_ds(" Data(rec=%lu) %d bytes\n", recnum, my_length); /* * First, check to see if we have message data or file data. * Message data will result in a popup. */ if (message_flag) { /* Data is from a message */ unsigned char *msgp; unsigned char *dollarp; /* Ack the message. */ dft_data_ack(); /* Get storage to copy the message. */ msgp = (unsigned char *)Malloc(my_length + 1); /* Copy the message. */ memcpy(msgp, data_bufr->data, my_length); /* Null terminate the string. */ dollarp = (unsigned char *)memchr(msgp, '$', my_length); if (dollarp != NULL) { *dollarp = '\0'; } else { *(msgp + my_length) = '\0'; } /* If transfer completed ok, use our msg. */ if (memcmp(msgp, END_TRANSFER, strlen(END_TRANSFER)) == 0) { Free(msgp); ft_complete(NULL); } else if (ft_state == FT_ABORT_SENT && abort_string != NULL) { Free(msgp); ft_complete(abort_string); Replace(abort_string, NULL); } else { ft_complete((char *)msgp); Free(msgp); } return; } /* Process file data. */ if (my_length > 0) { size_t rv = 1; /* Write the data out to the file. */ if (ftc->ascii_flag && (ftc->remap_flag || ftc->cr_flag)) { size_t obuf_len = 4 * my_length; char *ob0 = Malloc(obuf_len); char *ob = ob0; unsigned char *s = (unsigned char *)data_bufr->data; unsigned len = my_length; size_t nx; /* Copy and convert data_bufr->data to ob0. */ while (len-- && obuf_len) { unsigned char c = *s++; /* Strip CR's and ^Z's. */ if (ftc->cr_flag && ((c == '\r' || c == 0x1a))) { continue; } if (!ftc->remap_flag) { *ob++ = c; obuf_len--; continue; } /* * Convert to local multi-byte. * We do that by inverting the host's * EBCDIC-to-ASCII map, getting back to * EBCDIC, and converting to multi-byte * from there. */ switch (fts.dbcs_state) { case FT_DBCS_NONE: if (c == EBC_so) { fts.dbcs_state = FT_DBCS_SO; continue; } /* * fall through to non-DBCS case below */ break; case FT_DBCS_SO: if (c == EBC_si) { fts.dbcs_state = FT_DBCS_NONE; } else { fts.dbcs_byte1 = i_asc2ft[c]; fts.dbcs_state = FT_DBCS_LEFT; } continue; case FT_DBCS_LEFT: if (c == EBC_si) { fts.dbcs_state = FT_DBCS_NONE; continue; } nx = ft_ebcdic_to_multibyte( (fts.dbcs_byte1 << 8) | i_asc2ft[c], (char *)ob, obuf_len); if (nx && (ob[nx - 1] == '\0')) { nx--; } ob += nx; obuf_len -= nx; fts.dbcs_state = FT_DBCS_SO; continue; } if (c < 0x20 || (c >= 0x80 && c < 0xa0 && c != 0x9f)) { /* * Control code, treat it as Unicode. * * Note that IND$FILE and the VM 'TYPE' * command think that EBCDIC X'E1' is * a control code; IND$FILE maps it * onto ASCII 0x9f. So we skip it * explicitly and treat it as printable * here. */ nx = ft_unicode_to_multibyte(c, ob, obuf_len); } else if (c == 0xff) { /* IND$FILE maps X'FF' to 0xff. We want U+009F. */ nx = ft_unicode_to_multibyte(0x9f, ob, obuf_len); } else { /* Displayable character, remap. */ c = i_asc2ft[c]; nx = ft_ebcdic_to_multibyte(c, (char *)ob, obuf_len); } if (nx && (ob[nx - 1] == '\0')) { nx--; } ob += nx; obuf_len -= nx; } /* Write the result to the file. */ if (ob - ob0) { rv = fwrite(ob0, ob - ob0, (size_t)1, fts.local_file); fts.length += ob - ob0; } Free(ob0); } else { /* Write the buffer to the file directly. */ rv = fwrite((char *)data_bufr->data, my_length, (size_t)1, fts.local_file); fts.length += my_length; } if (!rv) { /* write failed */ char *buf; buf = xs_buffer("write(%s): %s", ftc->local_filename, strerror(errno)); dft_abort(buf, TR_DATA_INSERT); Free(buf); } /* Add up amount transferred. */ ft_update_length(); } /* Send an acknowledgement frame back. */ dft_data_ack(); } /* Process a Set Cursor request. */ static void dft_set_cur_req(void) { trace_ds(" SetCursor\n"); /* Currently doesn't do anything. */ } /* Store a byte inthe input buffer or ungetc cache. */ static void store_inbyte(unsigned char c, unsigned char **bufptr, size_t *numbytes) { if (*numbytes) { *(*bufptr) = c; (*bufptr)++; (*numbytes)--; } else { dft_ungetc_cache[dft_ungetc_count++] = c; } } /* * Read a character from a local file in ASCII mode. * Stores the data in 'bufptr' and returns the number of bytes stored. * Returns -1 for EOF. */ static size_t dft_ascii_read(unsigned char *bufptr, size_t numbytes) { char inbuf[16]; int in_ix = 0; int c; enum me_fail error; ebc_t e; int consumed; ucs4_t u; /* Belt-n-suspenders. */ if (!numbytes) { return 0; } /* Return data from the ungetc cache first. */ if (dft_ungetc_count) { size_t nm = dft_ungetc_count; if (nm > numbytes) { nm = numbytes; } memcpy(bufptr, dft_ungetc_cache, nm); if (dft_ungetc_count > nm) { memmove(dft_ungetc_cache, &dft_ungetc_cache[nm], dft_ungetc_count - nm); } dft_ungetc_count -= nm; return nm; } if (ftc->remap_flag) { /* Read bytes until we have a legal multibyte sequence. */ do { int consumed; c = fgetc(fts.local_file); if (c == EOF) { if (fts.last_dbcs) { *bufptr = EBC_si; fts.last_dbcs = false; return 1; } return -1; } error = ME_NONE; inbuf[in_ix++] = c; (void) ft_multibyte_to_unicode(inbuf, in_ix, &consumed, &error); if (error == ME_INVALID) { inbuf[0] = '?'; in_ix = 1; error = ME_NONE; } } while (error == ME_SHORT); } else { /* Get a byte from the file. */ c = fgetc(fts.local_file); if (c == EOF) { return -1; } } /* Expand NL to CR/LF. */ if (ftc->cr_flag && !fts.last_cr && c == '\n') { if (fts.last_dbcs) { *bufptr = EBC_si; dft_ungetc_cache[0] = '\r'; dft_ungetc_cache[1] = '\n'; dft_ungetc_count = 2; fts.last_dbcs = false; return 1; } else { *bufptr = '\r'; dft_ungetc_cache[0] = '\n'; dft_ungetc_count = 1; } return 1; } fts.last_cr = (c == '\r'); /* The no-remap case is pretty simple. */ if (!ftc->remap_flag) { *bufptr = c; return 1; } /* * Translate, inverting the host's fixed EBCDIC-to-ASCII conversion * table and applying the host code page. * Control codes are treated as Unicode and mapped directly. * We also handle DBCS here. */ u = ft_multibyte_to_unicode(inbuf, in_ix, &consumed, &error); if (u < 0x20 || ((u >= 0x80 && u < 0x9f))) { e = i_asc2ft[u]; } else if (u == 0x9f) { e = 0xff; } else { e = unicode_to_ebcdic(u); } if (e & 0xff00) { unsigned char *bp0 = bufptr; if (!fts.last_dbcs) { store_inbyte(EBC_so, &bufptr, &numbytes); } store_inbyte(i_ft2asc[(e >> 8) & 0xff], &bufptr, &numbytes); store_inbyte(i_ft2asc[e & 0xff], &bufptr, &numbytes); fts.last_dbcs = true; return bufptr - bp0; } else { unsigned char nc = e? i_ft2asc[e]: '?'; if (fts.last_dbcs) { *bufptr = EBC_si; dft_ungetc_cache[0] = nc; dft_ungetc_count = 1; fts.last_dbcs = false; } else { *bufptr = nc; } return 1; } } /* Process a Get request. */ static void dft_get_request(void) { size_t numbytes; size_t numread; size_t total_read = 0; unsigned char *bufptr; trace_ds(" Get\n"); if (!message_flag && ft_state == FT_ABORT_WAIT) { dft_abort(get_message("ftUserCancel"), TR_GET_REQ); return; } /* Read a buffer's worth. */ space3270out(ftc->dft_buffersize); numbytes = ftc->dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ bufptr = obuf + 17; while (!dft_eof && numbytes) { if (ftc->ascii_flag && (ftc->remap_flag || ftc->cr_flag)) { numread = dft_ascii_read(bufptr, numbytes); if (numread == (size_t)-1) { dft_eof = true; break; } bufptr += numread; numbytes -= numread; total_read += numread; } else { /* Binary read. */ numread = fread(bufptr, 1, numbytes, fts.local_file); if (numread <= 0) { break; } bufptr += numread; numbytes -= numread; total_read += numread; if (feof(fts.local_file)) { dft_eof = true; } if (feof(fts.local_file) || ferror(fts.local_file)) { break; } } } /* Check for read error. */ if (ferror(fts.local_file)) { char *buf; buf = xs_buffer("read(%s): %s", ftc->local_filename, strerror(errno)); dft_abort(buf, TR_GET_REQ); Free(buf); return; } /* Set up SF header for Data or EOF. */ obptr = obuf; *obptr++ = AID_SF; obptr += 2; /* skip SF length for now */ *obptr++ = SF_TRANSFER_DATA; if (total_read) { trace_ds("> WriteStructuredField FileTransferData Data(rec=%lu) %d " "bytes\n", recnum, (int)total_read); SET16(obptr, TR_GET_REPLY); SET16(obptr, TR_RECNUM_HDR); SET32(obptr, recnum); recnum++; SET16(obptr, TR_NOT_COMPRESSED); *obptr++ = TR_BEGIN_DATA; SET16(obptr, total_read + 5); obptr += total_read; fts.length += total_read; } else { trace_ds("> WriteStructuredField FileTransferData EOF\n"); *obptr++ = HIGH8(TR_GET_REQ); *obptr++ = TR_ERROR_REPLY; SET16(obptr, TR_ERROR_HDR); SET16(obptr, TR_ERR_EOF); dft_eof = true; } /* Set the SF length. */ bufptr = obuf + 1; SET16(bufptr, obptr - (obuf + 1)); /* Save the data. */ dft_savebuf_len = obptr - obuf; if (dft_savebuf_len > dft_savebuf_max) { dft_savebuf_max = dft_savebuf_len; Replace(dft_savebuf, (unsigned char *)Malloc(dft_savebuf_max)); } (void) memcpy(dft_savebuf, obuf, dft_savebuf_len); aid = AID_SF; /* Write the data. */ net_output(); ft_update_length(); } /* Process a Close request. */ static void dft_close_request(void) { /* * Recieved a close request from the system. * Return a close acknowledgement. */ trace_ds(" Close\n"); trace_ds("> WriteStructuredField FileTransferData CloseAck\n"); obptr = obuf; space3270out(6); *obptr++ = AID_SF; SET16(obptr, 5); /* length */ *obptr++ = SF_TRANSFER_DATA; SET16(obptr, TR_CLOSE_REPLY); net_output(); } /* Abort a transfer. */ static void dft_abort(const char *s, unsigned short code) { Replace(abort_string, NewString(s)); trace_ds("> WriteStructuredField FileTransferData Error\n"); obptr = obuf; space3270out(10); *obptr++ = AID_SF; SET16(obptr, 9); /* length */ *obptr++ = SF_TRANSFER_DATA; *obptr++ = HIGH8(code); *obptr++ = TR_ERROR_REPLY; SET16(obptr, TR_ERROR_HDR); SET16(obptr, TR_ERR_CMDFAIL); net_output(); /* Update the pop-up and state. */ ft_aborting(); } /* Processes a Read Modified command when there is upload data pending. */ void dft_read_modified(void) { if (dft_savebuf_len) { trace_ds("> WriteStructuredField FileTransferData\n"); obptr = obuf; space3270out(dft_savebuf_len); memcpy(obptr, dft_savebuf, dft_savebuf_len); obptr += dft_savebuf_len; net_output(); } } /* Default/bound the buffersize for generating a Query Reply. */ int set_dft_buffersize(int size) { /* * Pick the default: * - New resource * - Old resource * - Hard-coded default */ if (!size && !(size = appres.ft.dft_buffer_size) && !(size = appres.ft.dft_buffer_size_bc)) { size = DFT_BUF; } /* Bound the result. */ if (size > DFT_MAX_BUF) { size = DFT_MAX_BUF; } if (size < DFT_MIN_BUF) { size = DFT_MIN_BUF; } return size; } suite3270-3.6/Common/ft_gui_stubs.c0000664000076500007650000000427513221577163015275 0ustar pdmpdm/* * Copyright (c) 1996-2015, Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_gui_stubs.c * Stubs for the file transfer GUI. */ #include "globals.h" #include "ft_private.h" #include "ft_gui.h" void ft_gui_progress_popdown(void) { } void ft_gui_errmsg_prepare(char *msg _is_unused) { } void ft_gui_clear_progress(void) { } void ft_gui_complete_popup(const char *msg _is_unused) { } void ft_gui_update_length(size_t length _is_unused) { } void ft_gui_running(size_t length _is_unused) { } void ft_gui_aborting(void) { } ft_gui_interact_t ft_gui_interact(ft_conf_t *p) { return FGI_NOP; } void ft_gui_awaiting(void) { } void ft_gui_popup_ft(void) { } suite3270-3.6/Common/glue.c0000664000076500007650000011214713221577163013532 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * glue.c * Common initialization logic, command-line parsing, reading * resources, etc. */ #include "globals.h" #if !defined(_WIN32) /*[*/ #include #endif /*]*/ #include #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "actions.h" #include "charset.h" #include "popups.h" /* must come before child_popups.h */ #include "child_popups.h" #include "ctlrc.h" #include "glue.h" #include "glue_gui.h" #include "host.h" #include "kybd.h" #include "macros.h" #include "nvt.h" #include "opts.h" #include "product.h" #include "readres.h" #include "screen.h" #include "selectc.h" #include "sio.h" #include "telnet.h" #include "toggles.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #include "xio.h" #if defined(_WIN32) /*[*/ # include "winvers.h" #endif /*]*/ #define LAST_ARG "--" /* Typedefs */ typedef const char *ccp_t; /* Statics */ static void no_minus(const char *arg); #if defined(LOCAL_PROCESS) /*[*/ static void parse_local_process(int *argcp, const char **argv, const char **cmds); #endif /*]*/ static void set_appres_defaults(void); static void parse_options(int *argcp, const char **argv); static void parse_set_clear(int *argcp, const char **argv); static int parse_model_number(char *m); static merge_profile_t *merge_profilep = NULL; static char *session_suffix; static size_t session_suffix_len; #if defined(_WIN32) /*[*/ static char *session_short_suffix; static size_t session_short_suffix_len; #endif /*]*/ static opt_t *sorted_help = NULL; unsigned sorted_help_count = 0; /* Globals */ const char *programname; char full_model_name[13] = "IBM-"; char *model_name = &full_model_name[4]; AppRes appres; int children = 0; bool exiting = false; char *command_string = NULL; char *profile_name = NULL; char *profile_path = NULL; bool any_error_output = false; /* Register a profile merge function. */ void register_merge_profile(merge_profile_t *m) { merge_profilep = m; } /* Parse the command line and read in any session file. */ int parse_command_line(int argc, const char **argv, const char **cl_hostname) { size_t cl; int i; int hn_argc; size_t sl; size_t xcmd_len = 0; char *xcmd; int xargc; const char **xargv; bool read_session_or_profile = false; /* Figure out who we are */ #if defined(_WIN32) /*[*/ programname = strrchr(argv[0], '\\'); #else /*][*/ programname = strrchr(argv[0], '/'); #endif /*]*/ if (programname) { ++programname; } else { programname = argv[0]; } /* Save the command string for tracing purposes. */ cl = strlen(programname); for (i = 0; i < argc; i++) { cl += 1 + strlen(argv[i]); } cl++; command_string = Malloc(cl); (void) strcpy(command_string, programname); for (i = 0; i < argc; i++) { (void) strcat(strcat(command_string, " "), argv[i]); } /* * Save the command-line options so they can be reapplied after * the session file or profile has been read in. */ xcmd_len = 0; for (i = 0; i < argc; i++) { xcmd_len += strlen(argv[i]) + 1; } xcmd = Malloc(xcmd_len + 1); xargv = (const char **)Malloc((argc + 1) * sizeof(char *)); xcmd_len = 0; for (i = 0; i < argc; i++) { xargv[i] = xcmd + xcmd_len; (void) strcpy(xcmd + xcmd_len, argv[i]); xcmd_len += strlen(argv[i]) + 1; } xargv[i] = NULL; *(xcmd + xcmd_len) = '\0'; xargc = argc; #if defined(LOCAL_PROCESS) /*[*/ /* Pick out the -e option. */ parse_local_process(&argc, argv, cl_hostname); #endif /*]*/ /* Set the defaults. */ set_appres_defaults(); /* Parse command-line options. */ parse_options(&argc, argv); /* Pick out the remaining -set and -clear toggle options. */ parse_set_clear(&argc, argv); /* Now figure out if there's a hostname. */ for (hn_argc = 1; hn_argc < argc; hn_argc++) { if (!strcmp(argv[hn_argc], LAST_ARG)) { break; } } /* Verify command-line syntax. */ switch (hn_argc) { case 1: break; case 2: no_minus(argv[1]); *cl_hostname = argv[1]; break; case 3: no_minus(argv[1]); no_minus(argv[2]); *cl_hostname = xs_buffer("%s:%s", argv[1], argv[2]); break; default: usage("Too many command-line arguments"); break; } /* Delete the host name and any "--". */ if (argv[hn_argc] != NULL && !strcmp(argv[hn_argc], LAST_ARG)) { hn_argc++; } if (hn_argc > 1) { for (i = 1; i < argc - hn_argc + 2; i++) { argv[i] = argv[i + hn_argc - 1]; } } /* Merge in the session. */ if (session_suffix == NULL) { session_suffix = xs_buffer(".%s", app); session_suffix_len = strlen(session_suffix); } #if defined(_WIN32) /*[*/ if (session_short_suffix == NULL) { session_short_suffix = xs_buffer(".%.3s", app); session_short_suffix_len = strlen(session_short_suffix); } #endif /*]*/ if (*cl_hostname != NULL && (((sl = strlen(*cl_hostname)) > session_suffix_len && !strcasecmp(*cl_hostname + sl - session_suffix_len, session_suffix)) #if defined(_WIN32) /*[*/ || ((sl = strlen(*cl_hostname)) > session_short_suffix_len && !strcasecmp(*cl_hostname + sl - session_short_suffix_len, session_short_suffix)) #endif /*]*/ )) { const char *pname; if (!read_resource_file(*cl_hostname, true)) { x3270_exit(1); } read_session_or_profile = true; pname = strrchr(*cl_hostname, '\\'); if (pname != NULL) { pname++; } else { pname = *cl_hostname; } profile_name = NewString(pname); Replace(profile_path, NewString(profile_name)); sl = strlen(profile_name); if (sl > session_suffix_len && !strcasecmp(profile_name + sl - session_suffix_len, session_suffix)) { profile_name[sl - session_suffix_len] = '\0'; #if defined(_WIN32) /*[*/ } else if (sl > session_short_suffix_len && !strcasecmp(profile_name + sl - session_short_suffix_len, session_short_suffix)) { profile_name[sl - session_short_suffix_len] = '\0'; #endif /*]*/ } *cl_hostname = appres.hostname; /* might be NULL */ } else { /* There is no session file. */ /* For c3270 only, read in the c3270 profile (~/.c3270pro). */ if (merge_profilep != NULL) { read_session_or_profile = (*merge_profilep)(); } /* * If there was a hostname resource defined somewhere, but not * as a positional command-line argument, pretend it was one, * so we will connect to it at start-up. */ if (*cl_hostname == NULL && appres.hostname != NULL) { *cl_hostname = appres.hostname; } } /* * Now parse the command-line arguments again, so they take * precedence over the session file or profile. */ if (read_session_or_profile) { parse_options(&xargc, xargv); parse_set_clear(&xargc, xargv); } /* Can't free xcmd, parts of it are still in use. */ Free((char *)xargv); /* * All right, we have all of the resources defined. * Sort out the contradictory and implicit settings. */ if (appres.apl_mode) { appres.charset = Apl; } if (*cl_hostname == NULL) { appres.once = false; } if (!appres.debug_tracing) { /* debug_tracing was explicitly cleared */ set_toggle(TRACING, false); } #if defined(_WIN32) /*[*/ if (appres.utf8) { /* utf8 overrides local_cp */ appres.local_cp = CP_UTF8; } #endif /*]*/ return argc; } /* * Initialize the model number and oversize. This needs to happen before the * screen is initialized. */ void model_init(void) { int model_number; int ovc, ovr; /* * Sort out model and color modes, based on the model number resource. */ model_number = parse_model_number(appres.model); if (model_number < 0) { popup_an_error("Invalid model number: %s", appres.model); model_number = 0; } if (!model_number) { #if defined(RESTRICT_3279) /*[*/ model_number = 3; #else /*][*/ model_number = 4; #endif /*]*/ } #if defined(RESTRICT_3279) /*[*/ if (appres.m3279 && model_number == 4) { model_number = 3; } #endif /*]*/ if (appres.interactive.mono) { appres.m3279 = false; } if (!appres.extended) { appres.oversize = NULL; } ovc = 0; ovr = 0; if (appres.extended && appres.oversize != NULL) { if (product_auto_oversize() && !strcasecmp(appres.oversize, "auto")) { ovc = -1; ovr = -1; } else { int x_ovc, x_ovr; char junk; if (sscanf(appres.oversize, "%dx%d%c", &x_ovc, &x_ovr, &junk) == 2) { ovc = x_ovc; ovr = x_ovr; } else { xs_warning("Invalid %s value '%s'", ResOversize, appres.oversize); } } } set_rows_cols(model_number, ovc, ovr); net_set_default_termtype(); } static void no_minus(const char *arg) { if (arg[0] == '-') { usage(xs_buffer("Unknown or incomplete option: %s", arg)); } } #if defined(LOCAL_PROCESS) /*[*/ /* * Pick out the -e option. */ static void parse_local_process(int *argcp, const char **argv, const char **cmds) { int i, j; int e_len = -1; char *cmds_buf = NULL; for (i = 1; i < *argcp; i++) { if (strcmp(argv[i], OptLocalProcess)) { continue; } /* Matched. Copy 'em. */ e_len = strlen(OptLocalProcess) + 1; for (j = i+1; j < *argcp; j++) { e_len += 1 + strlen(argv[j]); } e_len++; cmds_buf = Malloc(e_len); (void) strcpy(cmds_buf, OptLocalProcess); for (j = i+1; j < *argcp; j++) { (void) strcat(strcat(cmds_buf, " "), argv[j]); } /* Stamp out the remaining args. */ *argcp = i; argv[i] = NULL; break; } *cmds = cmds_buf; } #endif /*]*/ static void set_appres_defaults(void) { /* Set the defaults. */ appres.extended = true; appres.m3279 = true; appres.typeahead = true; appres.debug_tracing = true; appres.conf_dir = LIBX3270DIR; appres.model = "4"; appres.hostsfile = NULL; appres.port = "23"; appres.charset = "bracket"; appres.termname = NULL; appres.macros = NULL; #if !defined(_WIN32) /*[*/ appres.trace_dir = "/tmp"; #endif /*]*/ appres.oversize = NULL; appres.bind_limit = true; appres.new_environ = true; appres.max_recent = 5; appres.linemode.icrnl = true; appres.linemode.onlcr = true; appres.linemode.erase = "^H"; appres.linemode.kill = "^U"; appres.linemode.werase = "^W"; appres.linemode.rprnt = "^R"; appres.linemode.lnext = "^V"; appres.linemode.intr = "^C"; appres.linemode.quit = "^\\"; appres.linemode.eof = "^D"; appres.unlock_delay = true; appres.unlock_delay_ms = 350; set_toggle(CURSOR_POS, true); set_toggle(AID_WAIT, true); #if defined(_WIN32) /*[*/ appres.local_cp = GetACP(); #endif /*]*/ appres.ssl.verify_host_cert = true; appres.ssl.starttls = true; /* Let the product set the ones it wants. */ product_set_appres_defaults(); } #if defined(_WIN32) /*[*/ # define PR3287_NAME "wpr3287" #else /*][*/ # define PR3287_NAME "pr3287" #endif /*]*/ static opt_t base_opts[] = { { OptAplMode, OPT_BOOLEAN, true, ResAplMode, aoffset(apl_mode), NULL, "Turn on APL mode" }, { OptCharset, OPT_STRING, false, ResCharset, aoffset(charset), "", "Use host ECBDIC character set (code page) "}, { OptClear, OPT_SKIP2, false, NULL, NULL, "", "Turn on " }, { OptConnectTimeout, OPT_INT,false,ResConnectTimeout,aoffset(connect_timeout), "", "Timeout for host connect requests" }, { OptDevName, OPT_STRING, false, ResDevName, aoffset(devname), "", "Device name (workstation ID) for RFC 4777" }, #if defined(LOCAL_PROCESS) /*[*/ { OptLocalProcess,OPT_SKIP2,false, NULL, NULL, " [...]", "Run instead of making TELNET conection" }, #endif /*]*/ { OptHostsFile,OPT_STRING, false, ResHostsFile, aoffset(hostsfile), "", "Use as the ibm_hosts file" }, { OptHttpd, OPT_STRING, false, ResHttpd, aoffset(httpd_port), "[:]", "TCP port to listen on for http requests" }, #if defined(_WIN32) /*[*/ { OptLocalCp, OPT_INT, false, ResLocalCp, aoffset(local_cp), "", "Use instead of ANSI codepage for local I/O" }, #endif /*]*/ { OptLoginMacro, OPT_STRING, false, ResLoginMacro, aoffset(login_macro), "Action([arg[,arg...]]) [...]" }, { OptModel, OPT_STRING, false, ResModel, aoffset(model), "[327{8,9}-]", "Emulate a 3278 or 3279 model " }, { OptNvtMode, OPT_BOOLEAN, true, ResNvtMode, aoffset(nvt_mode), NULL, "Begin in NVT mode" }, { OptOversize, OPT_STRING, false, ResOversize, aoffset(oversize), "x", "Larger screen dimensions" }, { OptPort, OPT_STRING, false, ResPort, aoffset(port), "", "Default TELNET port" }, { OptProxy, OPT_STRING, false, ResProxy, aoffset(proxy), ":[:]", "Proxy type and server" }, { OptScriptPort,OPT_STRING, false, ResScriptPort, aoffset(script_port), "[:]", "TCP port to listen on for script commands" }, { OptScriptPortOnce,OPT_BOOLEAN,true,ResScriptPortOnce,aoffset(script_port_once), NULL, "Accept one script connection, then exit" }, { OptSet, OPT_SKIP2, false, NULL, NULL, "", "Turn on " }, { OptSocket, OPT_BOOLEAN, true, ResSocket, aoffset(socket), NULL, "Create socket for script control" }, { OptTermName, OPT_STRING, false, ResTermName, aoffset(termname), "", "Send as TELNET terminal name" }, { OptTrace, OPT_BOOLEAN, true, ResTrace, toggle_aoffset(TRACING), NULL, "Enable tracing" }, { OptTraceFile,OPT_STRING, false, ResTraceFile, aoffset(trace_file), "", "Write traces to " }, { OptTraceFileSize,OPT_STRING,false,ResTraceFileSize,aoffset(trace_file_size), "[KM]", "Limit trace file to bytes" }, { OptUser, OPT_STRING, false, ResUser, aoffset(user), "", "User name for RFC 4777" }, { OptV, OPT_V, false, NULL, NULL, NULL, "Display build options and character sets" }, { OptVersion, OPT_V, false, NULL, NULL, NULL, "Display build options and character sets" }, { "-xrm", OPT_XRM, false, NULL, NULL, "'*.: '", "Set to " }, { LAST_ARG, OPT_DONE, false, NULL, NULL, NULL, "Terminate argument list" } }; typedef struct optlist { struct optlist *next; opt_t *opts; unsigned count; } optlist_t; static optlist_t first_optlist = { NULL, base_opts, array_count(base_opts) }; static optlist_t *optlist = &first_optlist; static optlist_t **last_optlist = &first_optlist.next; /* * Register an additional set of options. */ void register_opts(opt_t *opts, unsigned num_opts) { optlist_t *o; o = Malloc(sizeof(optlist_t)); o->next = NULL; o->opts = opts; o->count = num_opts; *last_optlist = o; last_optlist = &o->next; } /* * Pick out command-line options and set up appres. */ static void parse_options(int *argcp, const char **argv) { int i; unsigned j; int argc_out = 0; const char **argv_out = (const char **) Malloc((*argcp + 1) * sizeof(char *)); optlist_t *o; opt_t *opts; /* Parse the command-line options. */ argv_out[argc_out++] = argv[0]; for (i = 1; i < *argcp; i++) { bool found = false; for (o = optlist; o != NULL && !found; o = o->next) { opts = o->opts; for (j = 0; j < o->count; j++) { if (!strcmp(argv[i], opts[j].name)) { found = true; break; } } } if (!found) { argv_out[argc_out++] = argv[i]; continue; } switch (opts[j].type) { case OPT_BOOLEAN: *(bool *)opts[j].aoff = opts[j].flag; if (opts[j].res_name != NULL) { add_resource(NewString(opts[j].name), opts[j].flag? "true": "false"); } break; case OPT_STRING: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } *(const char **)opts[j].aoff = argv[++i]; if (opts[j].res_name != NULL) { add_resource(NewString(opts[j].res_name), NewString(argv[i])); } break; case OPT_XRM: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } parse_xrm(argv[++i], "-xrm"); break; case OPT_SKIP2: argv_out[argc_out++] = argv[i++]; if (i < *argcp) { argv_out[argc_out++] = argv[i]; } break; case OPT_NOP: break; case OPT_INT: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } *(int *)opts[j].aoff = atoi(argv[++i]); if (opts[j].res_name != NULL) { add_resource(NewString(opts[j].name), NewString(argv[i])); } break; case OPT_V: dump_version(); break; case OPT_DONE: while (i < *argcp) { argv_out[argc_out++] = argv[i++]; } break; } } *argcp = argc_out; argv_out[argc_out] = NULL; (void) memcpy((char *)argv, (char *)argv_out, (argc_out + 1) * sizeof(char *)); Free((char *)argv_out); } /* Comparison function for help qsort. */ static int help_cmp(const void *p1, const void *p2) { const opt_t *s1 = (const opt_t *)p1; const opt_t *s2 = (const opt_t *)p2; const char *n1 = s1->name; const char *n2 = s2->name; /* Test for equality first. */ if (!strcmp(n1, n2)) { return 0; } /* '--' is always last. */ if (!strcmp(n1, "--")) { return 1; } if (!strcmp(n2, "--")) { return -1; } /* Skip leading dashes. */ while (*n1 == '-') { n1++; } while (*n2 == '-') { n2++; } /* Do case-instensitive string compare. */ return strcasecmp(n1, n2); } /** * Sort the list of command-line options, for display purposes. */ static void sort_help(void) { optlist_t *o; unsigned j; int oix = 0; if (sorted_help != NULL) { return; } /* Count how many slots we need. */ for (o = optlist; o != NULL; o = o->next) { sorted_help_count += o->count; } /* Fill in the array of elements. */ sorted_help = (opt_t *)Malloc(sorted_help_count * sizeof(opt_t)); for (o = optlist; o != NULL; o = o->next) { for (j = 0; j < o->count; j++) { sorted_help[oix++] = o->opts[j]; } } /* Sort it. */ qsort((void *)sorted_help, sorted_help_count, sizeof(opt_t), help_cmp); } /* Disply command-line help. */ void cmdline_help (bool as_action) { unsigned i; sort_help(); for (i = 0; i < sorted_help_count; i++) { char *h = sorted_help[i].help_opts; char *ht; char *hx = NULL; char *star; if (sorted_help[i].type == OPT_XRM && h != NULL && (star = strchr(h, '*')) != NULL) { ht = hx = xs_buffer("%.*s%s%s", (int)(star - h), h, app, star + 1); } else { ht = h; } if (as_action) { action_output(" %s%s%s", sorted_help[i].name, ht? " ": "", ht? ht: ""); action_output(" %s", sorted_help[i].help_text); } else { fprintf(stderr, " %s%s%s\n %s\n", sorted_help[i].name, ht? " ": "", ht? ht: "", sorted_help[i].help_text); } if (hx != NULL) { Free(hx); } } } /* Comparison function for toggle name qsort. */ static int name_cmp(const void *p1, const void *p2) { const char *s1 = *(char *const *)p1; const char *s2 = *(char *const *)p2; return strcmp(s1, s2); } /* * Pick out -set and -clear toggle options. */ static void parse_set_clear(int *argcp, const char **argv) { int i, j; int argc_out = 0; const char **argv_out = (const char **) Malloc((*argcp + 1) * sizeof(char *)); argv_out[argc_out++] = argv[0]; for (i = 1; i < *argcp; i++) { bool is_set = false; if (!strcmp(argv[i], OptSet)) { is_set = true; } else if (strcmp(argv[i], OptClear)) { argv_out[argc_out++] = argv[i]; continue; } if (i == *argcp - 1) { /* missing arg */ continue; } /* Delete the argument. */ i++; for (j = 0; toggle_names[j].name != NULL; j++) { if (!toggle_supported(toggle_names[j].index)) { continue; } if (!strcasecmp(argv[i], toggle_names[j].name)) { appres.toggle[toggle_names[j].index] = is_set; break; } } if (toggle_names[j].name == NULL) { ccp_t *tn; int ntn = 0; tn = (ccp_t *)Calloc(N_TOGGLES, sizeof(ccp_t)); for (j = 0; toggle_names[j].name != NULL; j++) { if (!toggle_supported(toggle_names[j].index)) { continue; } if (!toggle_names[j].is_alias) { tn[ntn++] = toggle_names[j].name; } } qsort((void *)tn, ntn, sizeof(const char *), name_cmp); fprintf(stderr, "Unknown toggle name '%s'. Toggle names are:\n", argv[i]); for (j = 0; j < ntn; j++) { fprintf(stderr, " %s", tn[j]); } fprintf(stderr, "\n"); Free((void *)tn); exit(1); } } *argcp = argc_out; argv_out[argc_out] = NULL; (void) memcpy((char *)argv, (char *)argv_out, (argc_out + 1) * sizeof(char *)); Free((char *)argv_out); } /* * Parse the model number. * Returns -1 (error), 0 (default), or the specified number. */ static int parse_model_number(char *m) { size_t sl; int n; sl = strlen(m); /* An empty model number is no good. */ if (!sl) { return 0; } if (sl > 1) { /* * If it's longer than one character, it needs to start with * '327[89]', and it sets the m3279 resource. */ if (!strncmp(m, "3278", 4)) { appres.m3279 = false; } else if (!strncmp(m, "3279", 4)) { appres.m3279 = true; } else { return -1; } m += 4; sl -= 4; /* Check more syntax. -E is allowed, but ignored. */ switch (m[0]) { case '\0': /* Use default model number. */ return 0; case '-': /* Model number specified. */ m++; sl--; break; default: return -1; } switch (sl) { case 1: /* n */ break; case 3: /* n-E */ if (strcasecmp(m + 1, "-E")) { return -1; } break; default: return -1; } } /* Check the numeric model number. */ n = atoi(m); if (n >= 2 && n <= 5) { return n; } else { return -1; } } /* * Parse '-xrm' options. * Understands only: * {c,s,tcl}3270.: value * *: value * Class names need not apply. */ static res_t base_resources[] = { { ResBindLimit, aoffset(bind_limit), XRM_BOOLEAN }, { ResBindUnlock, aoffset(bind_unlock), XRM_BOOLEAN }, { ResBsdTm, aoffset(bsd_tm), XRM_BOOLEAN }, { ResCharset, aoffset(charset), XRM_STRING }, { ResColor8, aoffset(color8), XRM_BOOLEAN }, { ResConfDir, aoffset(conf_dir), XRM_STRING }, { ResConnectTimeout,aoffset(connect_timeout),XRM_INT }, { ResCrosshairColor,aoffset(interactive.crosshair_color), XRM_STRING }, { ResDbcsCgcsgid, aoffset(dbcs_cgcsgid), XRM_STRING }, { ResDevName, aoffset(devname), XRM_STRING }, { ResDftBufferSize,aoffset(ft.dft_buffer_size_bc),XRM_INT },/* deprecated */ { ResEof, aoffset(linemode.eof), XRM_STRING }, { ResErase, aoffset(linemode.erase), XRM_STRING }, { ResExtended, aoffset(extended), XRM_BOOLEAN }, { ResFtAllocation, aoffset(ft.allocation), XRM_STRING }, { ResFtAvblock, aoffset(ft.avblock), XRM_INT }, { ResFtBlksize, aoffset(ft.blksize), XRM_INT }, { ResFtBufferSize,aoffset(ft.dft_buffer_size),XRM_INT }, #if defined(_WIN32) /*[*/ { ResFtCodePage, aoffset(ft.codepage_bc),XRM_INT }, /* deprecated */ { ResFtWindowsCodePage,aoffset(ft.codepage),XRM_INT }, #endif /*]*/ { ResFtCr, aoffset(ft.cr), XRM_STRING }, { ResFtDirection, aoffset(ft.direction), XRM_STRING }, { ResFtExist, aoffset(ft.exist), XRM_STRING }, { ResFtHost, aoffset(ft.host), XRM_STRING }, { ResFtHostFile, aoffset(ft.host_file), XRM_STRING }, { ResFtLocalFile, aoffset(ft.local_file), XRM_STRING }, { ResFtLrecl, aoffset(ft.lrecl), XRM_INT }, { ResFtMode, aoffset(ft.mode), XRM_STRING }, { ResFtPrimarySpace,aoffset(ft.primary_space),XRM_INT }, { ResFtRecfm, aoffset(ft.recfm), XRM_STRING }, { ResFtRemap, aoffset(ft.remap), XRM_STRING }, { ResFtSecondarySpace,aoffset(ft.secondary_space),XRM_INT }, { ResHostname, aoffset(hostname), XRM_STRING }, { ResHostsFile, aoffset(hostsfile), XRM_STRING }, { ResIcrnl, aoffset(linemode.icrnl), XRM_BOOLEAN }, { ResInlcr, aoffset(linemode.inlcr), XRM_BOOLEAN }, { ResOnlcr, aoffset(linemode.onlcr), XRM_BOOLEAN }, { ResIntr, aoffset(linemode.intr), XRM_STRING }, { ResKill, aoffset(linemode.kill), XRM_STRING }, { ResLnext, aoffset(linemode.lnext), XRM_STRING }, #if defined(_WIN32) /*[*/ { ResLocalCp, aoffset(local_cp), XRM_INT }, #endif /*]*/ { ResLoginMacro,aoffset(login_macro), XRM_STRING }, { ResM3279, aoffset(m3279), XRM_BOOLEAN }, { ResModel, aoffset(model), XRM_STRING }, { ResModifiedSel, aoffset(modified_sel), XRM_BOOLEAN }, { ResNewEnviron,aoffset(new_environ), XRM_BOOLEAN }, { ResNopSeconds,aoffset(nop_seconds), XRM_INT }, { ResNumericLock, aoffset(numeric_lock), XRM_BOOLEAN }, { ResOerrLock, aoffset(oerr_lock), XRM_BOOLEAN }, { ResOversize, aoffset(oversize), XRM_STRING }, { ResPort, aoffset(port), XRM_STRING }, { ResProxy, aoffset(proxy), XRM_STRING }, { ResQrBgColor, aoffset(qr_bg_color), XRM_BOOLEAN }, { ResQuit, aoffset(linemode.quit), XRM_STRING }, { ResRprnt, aoffset(linemode.rprnt), XRM_STRING }, { ResScreenTraceFile,aoffset(screentrace_file),XRM_STRING }, { ResSecure, aoffset(secure), XRM_BOOLEAN }, { ResSbcsCgcsgid, aoffset(sbcs_cgcsgid), XRM_STRING }, { ResScriptPort,aoffset(script_port), XRM_STRING }, { ResSuppressActions,aoffset(suppress_actions),XRM_STRING }, { ResTermName, aoffset(termname), XRM_STRING }, { ResTraceDir, aoffset(trace_dir), XRM_STRING }, { ResTraceFile, aoffset(trace_file), XRM_STRING }, { ResTraceFileSize,aoffset(trace_file_size), XRM_STRING }, { ResTraceMonitor,aoffset(trace_monitor), XRM_BOOLEAN }, { ResTypeahead, aoffset(typeahead), XRM_BOOLEAN }, { ResUnlockDelay,aoffset(unlock_delay), XRM_BOOLEAN }, { ResUnlockDelayMs,aoffset(unlock_delay_ms), XRM_INT }, { ResWerase, aoffset(linemode.werase),XRM_STRING } }; typedef struct reslist { struct reslist *next; res_t *resources; unsigned count; } reslist_t; static reslist_t first_reslist = { NULL, base_resources, array_count(base_resources) }; static reslist_t *reslist = &first_reslist; static reslist_t **last_reslist = &first_reslist.next; /* * Register an additional set of resources. */ void register_resources(res_t *res, unsigned num_res) { reslist_t *r; r = Malloc(sizeof(reslist_t)); r->next = NULL; r->resources = res; r->count = num_res; *last_reslist = r; last_reslist = &r->next; } /* * Compare two strings, allowing the second to differ by uppercasing the * first character of the second. */ static int strncapcmp(const char *known, const char *unknown, size_t unk_len) { if (unk_len != strlen(known)) { return -1; } if (!strncmp(known, unknown, unk_len)) { return 0; } if (unk_len > 1 && unknown[0] == toupper((unsigned char)known[0]) && !strncmp(known + 1, unknown + 1, unk_len - 1)) { return 0; } return -1; } typedef struct xreslist { struct xreslist *next; xres_t *xresources; unsigned count; } xreslist_t; static xreslist_t *xreslist = NULL; static xreslist_t **last_xreslist = &xreslist; void register_xresources(xres_t *xres, unsigned num_xres) { xreslist_t *x; x = Malloc(sizeof(xreslist_t)); x->next = NULL; x->xresources = xres; x->count = num_xres; *last_xreslist = x; last_xreslist = &x->next; } struct host_color host_color[] = { { "NeutralBlack", HOST_COLOR_NEUTRAL_BLACK }, { "Blue", HOST_COLOR_BLUE }, { "Red", HOST_COLOR_RED }, { "Pink", HOST_COLOR_PINK }, { "Green", HOST_COLOR_GREEN }, { "Turquoise", HOST_COLOR_TURQUOISE }, { "Yellow", HOST_COLOR_YELLOW }, { "NeutralWhite", HOST_COLOR_NEUTRAL_WHITE }, { "Black", HOST_COLOR_BLACK }, { "DeepBlue", HOST_COLOR_DEEP_BLUE }, { "Orange", HOST_COLOR_ORANGE }, { "Purple", HOST_COLOR_PURPLE }, { "PaleGreen", HOST_COLOR_PALE_GREEN }, { "PaleTurquoise", HOST_COLOR_PALE_TURQUOISE }, { "Grey", HOST_COLOR_GREY }, { "Gray", HOST_COLOR_GREY }, /* alias */ { "White", HOST_COLOR_WHITE }, { NULL, 0 } }; /* * Validate a resource that is fetched explicitly, rather than via appres. */ static int valid_explicit(const char *resname, size_t len) { xreslist_t *x; unsigned i; int j; for (x = xreslist; x != NULL; x = x->next) { for (i = 0; i < x->count; i++) { size_t sl = strlen(x->xresources[i].name); switch (x->xresources[i].type) { case V_FLAT: /* Exact match. */ if (len == sl && !strncmp(x->xresources[i].name, resname, sl)) { return 0; } break; case V_WILD: /* xxx.* match. */ if (len > sl + 1 && resname[sl] == '.' && !strncmp(x->xresources[i].name, resname, sl)) { return 0; } break; case V_COLOR: /* xxx or xxx match. */ for (j = 0; host_color[j].name != NULL; j++) { char *xbuf; xbuf = xs_buffer("%s%s", x->xresources[i].name, host_color[j].name); if (strlen(xbuf) == len && !strncmp(xbuf, resname, len)) { Free(xbuf); return 0; } Free(xbuf); xbuf = xs_buffer("%s%d", x->xresources[i].name, host_color[j].index); if (strlen(xbuf) == len && !strncmp(xbuf, resname, len)) { Free(xbuf); return 0; } Free(xbuf); } break; } } } return -1; } void parse_xrm(const char *arg, const char *where) { const char *name; size_t rnlen; const char *s; unsigned i; char *t; void *address = NULL; enum resource_type type = XRM_STRING; bool quoted; char c; reslist_t *r; char *hide; bool arbitrary = false; /* Validate and split. */ if (validate_and_split_resource(where, arg, &name, &rnlen, &s) < 0) { return; } /* Look up the name. */ for (r = reslist; r != NULL; r = r->next) { bool found = false; for (i = 0; i < r->count && !found; i++) { if (!strncapcmp(r->resources[i].name, name, rnlen)) { address = r->resources[i].address; type = r->resources[i].type; found = true; break; } } } if (address == NULL) { for (i = 0; toggle_names[i].name != NULL; i++) { if (!toggle_supported(toggle_names[i].index)) { continue; } if (!strncapcmp(toggle_names[i].name, name, rnlen)) { address = &appres.toggle[toggle_names[i].index]; type = XRM_BOOLEAN; break; } } } if (address == NULL && valid_explicit(name, rnlen) == 0) { /* Handle resources that are accessed only via get_resource(). */ address = &hide; type = XRM_STRING; arbitrary = true; } if (address == NULL) { xs_warning("%s: Unknown resource name: %.*s", where, (int)rnlen, name); return; } switch (type) { case XRM_BOOLEAN: if (!strcasecmp(s, "true") || !strcasecmp(s, "t") || !strcmp(s, "1")) { *(bool *)address = true; } else if (!strcasecmp(s, "false") || !strcasecmp(s, "f") || !strcmp(s, "0")) { *(bool *)address = false; } else { xs_warning("%s: Invalid bool value: %s", where, s); *(bool *)address = false; } break; case XRM_STRING: t = Malloc(strlen(s) + 1); *(char **)address = t; quoted = false; #if defined(_WIN32) /*[*/ /* * Ugly hack to allow unquoted UNC-path printer names from older * versions of the Session Wizard to continue to work, even though the * rules now require quoted backslashes in resource values. */ if (!strncapcmp(ResPrinterName, name, rnlen) && s[0] == '\\' && s[1] == '\\' && s[2] != '\\' && strchr(s + 2, '\\') != NULL) { strcpy(t, s); break; } #endif /*]*/ while ((c = *s++) != '\0') { if (quoted) { switch (c) { case 'b': *t++ = '\b'; break; case 'f': *t++ = '\f'; break; case 'n': *t++ = '\n'; break; case 'r': *t++ = '\r'; break; case 't': *t++ = '\t'; break; case '\\': /* Quote the backslash. */ *t++ = '\\'; break; default: /* Eat the backslash. */ *t++ = c; break; } quoted = false; } else if (c == '\\') { quoted = true; } else { *t++ = c; } } *t = '\0'; break; case XRM_INT: { long n; char *ptr; n = strtol(s, &ptr, 0); if (*ptr != '\0') { xs_warning("%s: Invalid Integer value: %s", where, s); } else { *(int *)address = (int)n; } break; } } /* Add a new, arbitrarily-named resource. */ if (arbitrary) { char *rsname; rsname = Malloc(rnlen + 1); (void) strncpy(rsname, name, rnlen); rsname[rnlen] = '\0'; add_resource(rsname, hide); } } /* * Clean up a string for display (undo what parse_xrm does). */ char * safe_string(const char *s) { char *t = Malloc(1); int tlen = 1; *t = '\0'; /* * Translate the string to UCS4 a character at a time. * If the result is a control code or backslash, expand it. * Otherwise, translate it back to the local encoding and * append it to the output. */ while (*s) { ucs4_t u; int consumed; enum me_fail error; u = multibyte_to_unicode(s, strlen(s), &consumed, &error); if (u == 0) { break; } if (u < ' ') { char c = 0; int inc = 0; switch (u) { case '\b': c = 'b'; inc = 2; break; case '\f': c = 'f'; inc = 2; break; case '\n': c = 'n'; inc = 2; break; case '\r': c = 'r'; inc = 2; break; case '\t': c = 't'; inc = 2; break; default: inc = 6; break; } t = Realloc(t, tlen + inc); if (inc == 2) { *(t + tlen - 1) = '\\'; *(t + tlen) = c; } else { sprintf(t, "\\u%04x", u); } tlen += inc; } else { t = Realloc(t, tlen + consumed); memcpy(t + tlen - 1, s, consumed); tlen += consumed; } s += consumed; } *(t + tlen - 1) = '\0'; return t; } /* Read resources from a file. */ bool read_resource_file(const char *filename, bool fatal) { return read_resource_filex(filename, fatal); } /* Screen globals. */ bool visible_control = false; bool flipped = false; /* Replacements for functions in popups.c. */ bool error_popup_visible = false; /* Pop up an error dialog. */ void popup_an_error(const char *fmt, ...) { va_list args; char *s; va_start(args, fmt); s = xs_vbuffer(fmt, args); va_end(args); /* Log to the trace file. */ vtrace("%s\n", s); if (sms_redirect()) { sms_error(s); } else { screen_suspend(); (void) fprintf(stderr, "%s\n", s); fflush(stderr); any_error_output = true; macro_output = true; } Free(s); } /* Pop up an error dialog, based on an error number. */ void popup_an_errno(int errn, const char *fmt, ...) { va_list args; char *s; va_start(args, fmt); s = xs_vbuffer(fmt, args); va_end(args); if (errn > 0) { popup_an_error("%s: %s", s, strerror(errn)); } else { popup_an_error("%s", s); } Free(s); } void action_output(const char *fmt, ...) { va_list args; char *s; va_start(args, fmt); s = xs_vbuffer(fmt, args); va_end(args); if (sms_redirect()) { sms_info("%s", s); } else { if (!glue_gui_output(s)) { (void) printf("%s\n", s); } any_error_output = true; macro_output = true; } Free(s); } void popup_printer_output(bool is_err _is_unused, abort_callback_t *a _is_unused, const char *fmt, ...) { va_list args; char *m; va_start(args, fmt); m = xs_vbuffer(fmt, args); va_end(args); action_output("%s", m); Free(m); } void popup_child_output(bool is_err _is_unused, abort_callback_t *a _is_unused, const char *fmt, ...) { va_list args; char *m; va_start(args, fmt); m = xs_vbuffer(fmt, args); va_end(args); action_output("%s", m); Free(m); } void child_popup_init(void) { } suite3270-3.6/Common/glue_gui_stubs.c0000664000076500007650000000331713221577163015614 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * glue_gui_stubs.c * Stubs for GUI-specific functions called from the glue logic. */ #include "globals.h" #include "glue_gui.h" bool glue_gui_output(const char *s _is_unused) { return false; } suite3270-3.6/Common/host.c0000664000076500007650000005367613221577163013566 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * host.c * This module handles the ibm_hosts file, connecting to and * disconnecting from hosts, and state changes on the host * connection. */ #include "globals.h" #include "appres.h" #include "resources.h" #include "actions.h" #include "host.h" #include "host_gui.h" #include "macros.h" #include "popups.h" #include "product.h" #include "split_host.h" #include "telnet.h" #include "telnet_core.h" #include "trace.h" #include "utils.h" #include "xio.h" #include #define RECONNECT_MS 2000 /* 2 sec before reconnecting to host */ #define RECONNECT_ERR_MS 5000 /* 5 sec before reconnecting to host */ #define MAX_RECENT 20 /* upper limit on appres.max_recent */ enum cstate cstate = NOT_CONNECTED; unsigned host_flags = 0; #define LUNAME_SIZE 1024 char luname[LUNAME_SIZE+1]; char *connected_lu = NULL; char *connected_type = NULL; bool ever_3270 = false; char *current_host = NULL; char *full_current_host = NULL; unsigned short current_port; char *reconnect_host = NULL; char *qualified_host = NULL; struct host *hosts = NULL; static struct host *last_host = NULL; static bool auto_reconnect_inprogress = false; static iosrc_t net_sock = INVALID_IOSRC; static ioid_t reconnect_id = NULL_IOID; static void save_recent(const char *); static void try_reconnect(ioid_t id); static action_t Connect_action; static action_t Disconnect_action; static action_t Reconnect_action; static char * stoken(char **s) { char *r; char *ss = *s; if (!*ss) { return NULL; } r = ss; while (*ss && *ss != ' ' && *ss != '\t') { ss++; } if (*ss) { *ss++ = '\0'; while (*ss == ' ' || *ss == '\t') { ss++; } } *s = ss; return r; } /* * Read the hosts file. */ static void read_hosts_file(void) { FILE *hf; char buf[1024]; struct host *h; char *hostfile_name; /* This only applies to emulators with displays. */ if (!product_has_display()) { return; } hostfile_name = appres.hostsfile; if (hostfile_name == NULL) { hostfile_name = xs_buffer("%s/ibm_hosts", appres.conf_dir); } else { hostfile_name = do_subst(appres.hostsfile, DS_VARS | DS_TILDE); } hf = fopen(hostfile_name, "r"); if (hf != NULL) { while (fgets(buf, sizeof(buf), hf)) { char *s = buf; char *name, *entry_type, *hostname; char *slash; if (strlen(buf) > (unsigned)1 && buf[strlen(buf) - 1] == '\n') { buf[strlen(buf) - 1] = '\0'; } while (isspace((unsigned char)*s)) { s++; } if (!*s || *s == '#') { continue; } name = stoken(&s); entry_type = stoken(&s); hostname = stoken(&s); if (!name || !entry_type || !hostname) { popup_an_error("Bad %s syntax, entry skipped", ResHostsFile); continue; } h = (struct host *)Malloc(sizeof(*h)); if (!split_hier(NewString(name), &h->name, &h->parents)) { Free(h); continue; } h->hostname = NewString(hostname); /* * Quick syntax extension to allow the hosts file to * specify a port as host/port. */ if ((slash = strchr(h->hostname, '/'))) { *slash = ':'; } if (!strcmp(entry_type, "primary")) { h->entry_type = PRIMARY; } else { h->entry_type = ALIAS; } if (*s) { h->loginstring = NewString(s); } else { h->loginstring = NULL; } h->prev = last_host; h->next = NULL; if (last_host) { last_host->next = h; } else { hosts = h; } last_host = h; } (void) fclose(hf); } else if (appres.hostsfile != NULL) { popup_an_errno(errno, "Cannot open " ResHostsFile " '%s'", appres.hostsfile); } Free(hostfile_name); /* * Read the recent-connection file, and prepend it to the hosts list. */ save_recent(NULL); } /** * State change callback for emulator exit. * * @param[in] mode Unused. */ static void host_exiting(bool mode _is_unused) { /* Disconnect from the host gracefully. */ host_disconnect(false); } /** * Hosts module registration. */ void host_register(void) { static action_table_t host_actions[] = { { "Close", Disconnect_action, ACTION_KE }, { "Connect", Connect_action, ACTION_KE }, { "Disconnect", Disconnect_action, ACTION_KE }, { "Open", Connect_action, ACTION_KE }, { "Reconnect", Reconnect_action, ACTION_KE } }; /* Register for events. */ register_schange(ST_EXITING, host_exiting); /* Register our actions. */ register_actions(host_actions, array_count(host_actions)); } /** * Read in the hosts file. */ void hostfile_init(void) { static bool hostfile_initted = false; if (hostfile_initted) { return; } read_hosts_file(); hostfile_initted = true; } /* * Look up a host in the list. Turns aliases into real hostnames, and * finds loginstrings. */ static int hostfile_lookup(const char *name, char **hostname, char **loginstring) { struct host *h; hostfile_init(); for (h = hosts; h != NULL; h = h->next) { if (h->entry_type == RECENT) { continue; } if (!strcmp(name, h->name)) { *hostname = h->hostname; if (h->loginstring != NULL) { *loginstring = h->loginstring; } else { *loginstring = appres.login_macro; } return 1; } } return 0; } #if defined(LOCAL_PROCESS) /*[*/ /* Recognize and translate "-e" options. */ static const char * parse_localprocess(const char *s) { int sl = strlen(OptLocalProcess); if (!strncmp(s, OptLocalProcess, sl)) { if (s[sl] == ' ') { return(s + sl + 1); } else if (s[sl] == '\0') { char *r; r = getenv("SHELL"); if (r != NULL) { return r; } else { return "/bin/sh"; } } } return NULL; } #endif /*]*/ /* * Strip qualifiers from a hostname. * Returns the hostname part in a newly-malloc'd string. * 'needed' is returned true if anything was actually stripped. * Returns NULL if there is a syntax error. */ static char * split_host(char *s, unsigned *flags, char *xluname, char **port, char **accept, bool *needed) { char *lu; char *host; char *error; *flags = 0; *needed = false; /* Call the sane, new version. */ if (!new_split_host(s, &lu, &host, port, accept, flags, &error)) { popup_an_error("%s", error); Free(error); return NULL; } if (lu) { strncpy(xluname, lu, LUNAME_SIZE); xluname[LUNAME_SIZE] = '\0'; } else { *xluname = '\0'; } *needed = (strcmp(s, host) != 0); return host; } /* * Network connect/disconnect operations, combined with X input operations. * * Returns true for success, false for error. * Sets 'reconnect_host', 'current_host' and 'full_current_host' as * side-effects. */ bool host_connect(const char *n) { char *nb; /* name buffer */ char *s; /* temporary */ const char *chost; /* to whom we will connect */ char *target_name; char *ps = NULL; char *port = NULL; char *accept = NULL; const char *localprocess_cmd = NULL; bool has_colons = false; net_connect_t nc; if (CONNECTED || auto_reconnect_inprogress) { return true; } /* Skip leading blanks. */ while (*n == ' ') { n++; } if (!*n) { popup_an_error("Invalid (empty) hostname"); return false; } /* Save in a modifiable buffer. */ nb = NewString(n); /* Strip trailing blanks. */ s = nb + strlen(nb) - 1; while (*s == ' ') { *s-- = '\0'; } /* Remember this hostname, as the last hostname we connected to. */ Replace(reconnect_host, NewString(nb)); /* Remember this hostname in the recent connection list and file. */ save_recent(nb); #if defined(LOCAL_PROCESS) /*[*/ if ((localprocess_cmd = parse_localprocess(nb)) != NULL) { chost = localprocess_cmd; port = appres.port; } else #endif /*]*/ { bool needed; /* Strip off and remember leading qualifiers. */ if ((s = split_host(nb, &host_flags, luname, &port, &accept, &needed)) == NULL) { goto failure; } /* Look up the name in the hosts file. */ if (!needed && hostfile_lookup(s, &target_name, &ps)) { /* * Rescan for qualifiers. * Qualifiers, LU names, ports and accept names are all * overridden by the hosts file. */ Free(s); if (!(s = split_host(target_name, &host_flags, luname, &port, &accept, &needed))) { goto failure; } } chost = s; /* Default the port. */ if (port == NULL) { port = appres.port; } } /* * Store the original name in globals, even if we fail the connect later: * current_host is the hostname part, stripped of qualifiers, luname * and port number * full_current_host is the entire string, for use in reconnecting */ if (n != full_current_host) { Replace(full_current_host, NewString(n)); } Replace(current_host, NULL); if (localprocess_cmd != NULL) { if (full_current_host[strlen(OptLocalProcess)] != '\0') { current_host = NewString(full_current_host + strlen(OptLocalProcess) + 1); } else { current_host = NewString("default shell"); } } else { current_host = s; } has_colons = (strchr(chost, ':') != NULL); Replace(qualified_host, xs_buffer("%s%s%s%s:%s%s%s", HOST_FLAG(SSL_HOST)? "L:": "", has_colons? "[": "", chost, has_colons? "]": "", port, (accept != NULL)? "=": "", (accept != NULL)? accept: "")); /* Attempt contact. */ ever_3270 = false; nc = net_connect(chost, port, accept, localprocess_cmd != NULL, &net_sock); if (nc == NC_FAILED) { if (!host_gui_connect()) { if (appres.interactive.reconnect) { auto_reconnect_inprogress = true; reconnect_id = AddTimeOut(RECONNECT_ERR_MS, try_reconnect); } } /* Redundantly signal a disconnect. */ st_changed(ST_CONNECT, false); goto failure; } /* Still thinking about it? */ if (nc == NC_RESOLVING) { cstate = RESOLVING; st_changed(ST_RESOLVING, true); goto success; } if (nc == NC_SSL_PASS) { cstate = SSL_PASS; goto success; } /* Success. */ /* Set pending string. */ if (ps == NULL) { ps = appres.login_macro; } if (ps != NULL) { login_macro(ps); } /* Prepare Xt for I/O. */ if (net_sock != INVALID_IOSRC) { x_add_input(net_sock); } /* Set state and tell the world. */ if (nc == NC_CONNECT_PENDING) { cstate = PENDING; st_changed(ST_HALF_CONNECT, true); } else { /* cstate == NC_CONNECTED */ if (appres.nvt_mode || HOST_FLAG(ANSI_HOST)) { cstate = CONNECTED_NVT; } else { cstate = CONNECTED_INITIAL; } st_changed(ST_CONNECT, true); host_gui_connect_initial(); } success: if (nb != NULL) { Free(nb); } return true; failure: if (nb != NULL) { Free(nb); } return false; } /* Process a new connection, when it happens after SSL validation. */ void host_new_connection(bool pending) { /* Set state and tell the world. */ if (pending) { cstate = PENDING; st_changed(ST_HALF_CONNECT, true); } else { if (appres.nvt_mode || HOST_FLAG(ANSI_HOST)) { cstate = CONNECTED_NVT; } else { cstate = CONNECTED_INITIAL; } st_changed(ST_CONNECT, true); host_gui_connect_initial(); } } /* * Reconnect to the last host. */ static void host_reconnect(void) { if (auto_reconnect_inprogress || current_host == NULL || CONNECTED || HALF_CONNECTED) { return; } if (host_connect(reconnect_host)) { auto_reconnect_inprogress = false; } } /* * Called from timer to attempt an automatic reconnection. */ static void try_reconnect(ioid_t id _is_unused) { auto_reconnect_inprogress = false; host_reconnect(); } /* * Cancel any pending reconnect attempt. */ void host_cancel_reconnect(void) { if (auto_reconnect_inprogress) { RemoveTimeOut(reconnect_id); auto_reconnect_inprogress = false; } } void host_disconnect(bool failed) { if (!PCONNECTED) { return; } x_remove_input(); net_disconnect(true); net_sock = INVALID_IOSRC; if (!host_gui_disconnect()) { if (appres.interactive.reconnect && !auto_reconnect_inprogress) { /* Schedule an automatic reconnection. */ auto_reconnect_inprogress = true; reconnect_id = AddTimeOut(failed? RECONNECT_ERR_MS: RECONNECT_MS, try_reconnect); } } /* * Remember a disconnect from NVT mode, to keep screen tracing * in sync. */ if (IN_NVT && toggled(SCREEN_TRACE)) { trace_nvt_disc(); } cstate = NOT_CONNECTED; /* Propagate the news to everyone else. */ st_changed(ST_CONNECT, false); } /* The host has entered 3270 or NVT mode, or switched between them. */ void host_in3270(enum cstate new_cstate) { bool now3270 = (new_cstate == CONNECTED_3270 || new_cstate == CONNECTED_SSCP || new_cstate == CONNECTED_TN3270E); bool was3270 = (cstate == CONNECTED_3270 || cstate == CONNECTED_SSCP || cstate == CONNECTED_TN3270E); bool now_nvt = (new_cstate == CONNECTED_NVT || new_cstate == CONNECTED_E_NVT); bool was_nvt = (cstate == CONNECTED_NVT || cstate == CONNECTED_E_NVT); cstate = new_cstate; ever_3270 = now3270; if (now3270 != was3270 || now_nvt != was_nvt) { st_changed(ST_3270_MODE, now3270); } } void host_connected(void) { cstate = CONNECTED_INITIAL; st_changed(ST_CONNECT, true); host_gui_connected(); } /* Swap out net_sock. */ void host_newfd(iosrc_t s) { /* Shut off the old. */ x_remove_input(); /* Turn on the new. */ net_sock = s; x_add_input(net_sock); } /* Comparison function for the qsort. */ static int host_compare(const void *e1, const void *e2) { const struct host *h1 = *(const struct host **)e1; const struct host *h2 = *(const struct host **)e2; int r; if (h1->connect_time > h2->connect_time) { r = -1; } else if (h1->connect_time < h2->connect_time) { r = 1; } else { r = 0; } #if defined(CFDEBUG) /*[*/ printf("%s %ld %d %s %ld\n", h1->name, h1->connect_time, r, h2->name, h2->connect_time); #endif /*]*/ return r; } #if defined(CFDEBUG) /*[*/ static void dump_array(const char *when, struct host **array, int nh) { int i; printf("%s\n", when); for (i = 0; i < nh; i++) { printf(" %15s %ld\n", array[i]->name, array[i]->connect_time); } } #endif /*]*/ /* Save the most recent host in the recent host list. */ static void save_recent(const char *hn) { struct host *h; int nih = 0; struct host *r_start = NULL; char *lcf_name = NULL; FILE *lcf = NULL; struct host **h_array = NULL; int nh = 0; int i; time_t t = time(NULL); int n_recent; /* Don't let the user go overboard on the recent hosts list. */ if (appres.max_recent > MAX_RECENT) { appres.max_recent = MAX_RECENT; } /* * Copy the ibm_hosts into the array, and point r_start at the first * recent-host entry. */ for (h = hosts; h != NULL; h = h->next) { if (h->entry_type == RECENT) { r_start = h; break; } h_array = (struct host **) Realloc(h_array, (nh + 1) * sizeof(struct host *)); h_array[nh++] = h; nih++; } /* * Allocate a new entry and add it to the array, just under the * ibm_hosts and before the first recent entry. */ if (hn != NULL) { h = (struct host *)Malloc(sizeof(*h)); h->name = NewString(hn); h->parents = NULL; h->hostname = NewString(hn); h->entry_type = RECENT; h->loginstring = NULL; h->connect_time = t; h_array = (struct host **) Realloc(h_array, (nh + 1) * sizeof(struct host *)); h_array[nh++] = h; } /* Append the existing recent entries to the array. */ for (h = r_start; h != NULL; h = h->next) { h_array = (struct host **) Realloc(h_array, (nh + 1) * sizeof(struct host *)); h_array[nh++] = h; } /* * Read the last-connection file, to capture the any changes made by * other instances of x3270. */ if (appres.connectfile_name != NULL && strcasecmp(appres.connectfile_name, "none")) { lcf_name = do_subst(appres.connectfile_name, DS_VARS | DS_TILDE); lcf = fopen(lcf_name, "r"); } if (lcf != NULL) { char buf[1024]; while (fgets(buf, sizeof(buf), lcf) != NULL) { size_t sl; time_t connect_time; char *ptr; /* Pick apart the entry. */ sl = strlen(buf); if (buf[sl - 1] == '\n') { buf[sl-- - 1] = '\0'; } if (!sl || buf[0] == '#' || (connect_time = strtoul(buf, &ptr, 10)) == 0L || ptr == buf || *ptr != ' ' || !*(ptr + 1)) { continue; } h = (struct host *)Malloc(sizeof(*h)); h->name = NewString(ptr + 1); h->parents = NULL; h->hostname = NewString(ptr + 1); h->entry_type = RECENT; h->loginstring = NULL; h->connect_time = connect_time; h_array = (struct host **) Realloc(h_array, (nh + 1) * sizeof(struct host *)); h_array[nh++] = h; } fclose(lcf); } /* * Sort the recent hosts, in reverse order by connect time. */ #if defined(CFDEBUG) /*[*/ dump_array("before", h_array, nh); #endif /*]*/ qsort(h_array + nih, nh - nih, sizeof(struct host *), host_compare); #if defined(CFDEBUG) /*[*/ dump_array("after", h_array, nh); #endif /*]*/ /* * Filter out duplicate names in the recent host list. * At the same time, limit the size of the recent list to MAX_RECENT. */ n_recent = 0; for (i = nih; i < nh; i++) { bool delete = false; if (n_recent >= appres.max_recent) { delete = true; } else { int j; for (j = nih; j < i; j++) { if (h_array[j] != NULL && !strcmp(h_array[i]->name, h_array[j]->name)) { delete = true; break; } } } if (delete) { Free(h_array[i]->name); Free(h_array[i]->hostname); Free(h_array[i]); h_array[i] = NULL; } else { n_recent++; } } /* Create a new host list from what's left. */ hosts = NULL; last_host = NULL; for (i = 0; i < nh; i++) { if ((h = h_array[i]) != NULL) { h->next = NULL; if (last_host != NULL) { last_host->next = h; } h->prev = last_host; last_host = h; if (hosts == NULL) { hosts = h; } } } /* No need for the array any more. */ Free(h_array); h_array = NULL; /* Rewrite the file. */ if (lcf_name != NULL) { lcf = fopen(lcf_name, "w"); if (lcf != NULL) { fprintf(lcf, "# Automatically generated %s# by %s\n\ # Do not edit!\n", ctime(&t), build); for (h = hosts; h != NULL; h = h->next) { if (h->entry_type == RECENT) { (void) fprintf(lcf, "%lu %s\n", (unsigned long)h->connect_time, h->name); } } fclose(lcf); } } if (lcf_name != NULL) { Free(lcf_name); } } /* Explicit connect/disconnect actions. */ static bool Connect_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Connect", ia, argc, argv); if (check_argc("Connect", argc, 1, 1) < 0) { return false; } if (PCONNECTED) { popup_an_error("Already connected"); return false; } (void) host_connect(argv[0]); /* * If not called from a keymap and the connection was successful (or * half-successful), pause the script until we are connected and * we have identified the host type. * * The reason for the check against keymaps is so the GUI doesn't stall * if someone puts a Connect() in a keymap. This is an imperfect check, * since someone could put a Source() in a keymap for a file that includes * a Connect(), and it would still stall here. */ if (ia != IA_KEYMAP) { sms_connect_wait(); } return true; } static bool Reconnect_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Reconnect", ia, argc, argv); if (check_argc("Reconnect", argc, 0, 0) < 0) { return false; } if (PCONNECTED) { popup_an_error("Already connected"); return false; } if (current_host == NULL) { popup_an_error("No previous host to connect to"); return false; } host_reconnect(); /* * If called from a script and the connection was successful (or * half-successful), pause the script until we are connected and * we have identified the host type. * * The reason for the check against keymaps is so the GUI doesn't stall * if someone puts a Reconnect() in a keymap. This is an imperfect check, * since someone could put a Source() in a keymap for a file that includes * a Reconnect(), and it would still stall here. */ if (ia != IA_KEYMAP) { sms_connect_wait(); } return true; } static bool Disconnect_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Disconnect", ia, argc, argv); if (check_argc("Disconnect", argc, 0, 0) < 0) { return false; } host_disconnect(false); return true; } suite3270-3.6/Common/host_gui_stubs.c0000664000076500007650000000353213221577163015634 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * host_gui_stubs.c * Stubs for GUI-specific functions called from the host * connect/disconnect logic. */ #include "globals.h" #include "host_gui.h" bool host_gui_connect(void) { return false; } void host_gui_connect_initial(void) { } bool host_gui_disconnect(void) { return false; } void host_gui_connected(void) { } suite3270-3.6/Common/httpd-core.c0000664000076500007650000014025613221577163014651 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * httpd-core.c * x3270 webserver, main protocol module */ #include "globals.h" #include #include #include "appres.h" #include "asprintf.h" #include "lazya.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #include "httpd-core.h" #include "httpd-io.h" #define DIRLIST_NLEN 14 /* Typedefs */ typedef enum { /* Print mode: */ HP_SEND, /* Send directly */ HP_BUFFER /* Buffer */ } httpd_print_t; typedef enum { /* Error type: */ ERRMODE_NON_HTTP, /* The request makes no sense at all -- it might not even be HTTP. Don't bother with an HTTP header in the response. */ ERRMODE_FATAL, /* The request appears to be HTTP, but processing cannot continue. Wrap the response in HTTP. */ ERRMODE_NONFATAL /* The request cannot be satisfied, but if this is a persistent connection, keep it open. */ } errmode_t; typedef enum { /* Supported verbs: */ VERB_GET, /* GET */ VERB_HEAD, /* HEAD */ VERB_OTHER /* anything else */ } verb_t; /* fields */ typedef struct _field { /* HTTP request fields (name: value) */ struct _field *next; /* linkage */ char *name; /* name */ char *value; /* value */ } field_t; /* Per-request state */ typedef struct { varbuf_t print_buf; /* pending output */ #define MAX_HTTPD_REQUEST (8192 - 1) char request_buf[MAX_HTTPD_REQUEST + 1]; /* request buffer */ int nr; /* length of input up through blank line */ bool saw_first; /* we have digested the first line of the request */ int rll; /* length of each request line parsed */ verb_t verb; /* parsed verb */ bool http_1_0; /* is the client speaking HTTP 1.0? */ bool persistent; /* is the client expecting a persistent connection? */ char *uri; /* start of URI */ char *query; /* query */ field_t *queries; /* list of query values */ char *fragment; /* fragment */ char *fields_start; /* start of fields */ field_t *fields; /* field values */ char *location; /* real location for 301 errors */ struct _httpd_reg *async_node; /* asynchronous event node */ size_t it_offset; /* input trace offset */ size_t ot_offset; /* output trace offset */ } request_t; /* connection state */ typedef struct { /* Global state */ void *mhandle; /* the handle from the main procedure */ bool cr; /* last character seen was a CR */ unsigned long seq; /* connection sequence number, for tracing */ /* Per-request state */ request_t request; } httpd_t; /* object registry */ typedef enum { OR_DIR, /* Directory */ OR_FIXED, /* object has fixed value */ OR_FIXED_BINARY, /* object has fixed binary value */ OR_DYN_TERM, /* object is dynamic, terminal */ OR_DYN_NONTERM /* object is dynamic, non-terminal */ } or_t; typedef struct _httpd_reg { struct _httpd_reg *next; /* linkage */ const char *path; /* full path, including leading / */ const char *desc; /* description, for directory display */ const char *alias; /* alias, for directory display */ content_t content_type; const char *content_str; unsigned flags; /* HF_xxx */ or_t type; union { const char *fixed; /* fixed html */ struct { const unsigned char *fixed; unsigned length; } fixed_binary; /* fixed binary */ reg_dyn_t *dyn; /* dynamic output */ } u; httpd_t *async_session; } httpd_reg_t; /* Globals */ /* Statics */ static httpd_reg_t *httpd_reg; static unsigned long httpd_seq = 0; /* Code */ /** * Expand an HTTP status code to a string. * * @param[in] status_code * * @return Expanded text */ static const char * status_text(int status_code) { switch (status_code) { case 200: return "OK"; case 301: return "Moved Permanently"; case 400: return "Bad Request"; case 404: return "Not Found"; case 409: return "Conflict"; case 500: return "Internal Server Error"; case 501: return "Not implemented"; default: return "Unknown"; } } /** * Trace network data. * * @param[in] direction Descriptive string for data direction * @param[in] buf Data buffer * @param[in] len Length of data * @param[in,out] doffset Display offset */ static void httpd_data_trace(httpd_t *h, const char *direction, const char *buf, size_t len, size_t *doffset) { size_t i; #define BPL 16 unsigned char linebuf[BPL]; size_t j; for (i = 0; i < len; i++) { if (!(i % BPL)) { if (i) { vtrace(" "); for (j = 0; j < BPL; j++) { vtrace("%c", iscntrl(linebuf[j])? '.': linebuf[j]); } } vtrace("%sh%s [%lu] 0x%04x", i? "\n": "", direction, h->seq, (unsigned)(*doffset + i)); } vtrace(" %02x", (unsigned char)buf[i]); linebuf[i % BPL] = buf[i]; } /* Space over the missing data bytes on the line. */ if (i % BPL) { vtrace("%*s", (int)((BPL - (i % BPL)) * 3 + 1), ""); } else { vtrace(" "); } /* Trace the last chunk of data as text. */ for (j = 0; j < ((i % BPL)? (i % BPL): BPL); j++) { vtrace("%c", iscntrl(linebuf[j])? '.': linebuf[j]); } vtrace("\n"); *doffset += len; } /** * Send data on a connection. * * @param[in] h State * @param[in] buf Data buffer * @param[in] len Data buffer length */ static void httpd_send(httpd_t *h, const char *buf, size_t len) { httpd_data_trace(h, ">", buf, len, &h->request.ot_offset); hio_send(h->mhandle, buf, len); } /** * Transfer data to the HTTPD socket or the deferred output buffer. * * @param[in,out] h State * @param[in] type How to print (send immediate or buffer) * @param[in] buf Buffer to print * @param[in] len Length of buffer */ static void httpd_print_buf(httpd_t *h, httpd_print_t type, const char *buf, size_t len) { request_t *r = &h->request; if (type == HP_SEND) { httpd_send(h, buf, len); } else { vb_append(&r->print_buf, buf, len); } } /** * Print HTTPD response text, varargs interface. * * Responsible for expanding newlines to CR/LF pairs and directing the output * to the correct socket. * * @param[in,out] h State * @param[in] type How to print (send immediate or buffer) * @param[in] format printf()-style format * @param[in] ap varargs */ static void httpd_vprint(httpd_t *h, httpd_print_t type, const char *format, va_list ap) { char *buf; size_t sl; char *sp; /* pointer through the string */ /* Expand the text. */ buf = xs_vbuffer(format, ap); sl = strlen(buf); /* Write it in chunks, doing CR/LF expansion. */ sp = buf; while (sl > 0) { char *nl; /* location of next newline */ ssize_t wlen; /* number of bytes before the newline */ bool crlf; /* true if newline found */ nl = strchr(sp, '\n'); if (nl != NULL) { wlen = nl - sp; crlf = true; } else { wlen = sl; crlf = false; } if (wlen) { /* Send the text up to (but not including) the newline. */ httpd_print_buf(h, type, sp, wlen); /* Account for the bytes written. */ sp += wlen; sl -= wlen; } if (crlf) { /* Expand the newline to CR/LF. */ httpd_print_buf(h, type, "\r\n", 2); /* Account for the newline. */ sp++; sl--; } } Free(buf); } /** * Print HTTPD response text * * Responsible for expanding newlines to CR/LF pairs and directing the output * to the correct socket. * * @param[in,out] h State * @param[in] type How to print (send immediate or buffer) * @param[in] format printf()-style format */ static void httpd_print(httpd_t *h, httpd_print_t type, const char *format, ...) { va_list ap; va_start(ap, format); httpd_vprint(h, type, format, ap); va_end(ap); } /** * Dump out a Content-Length string. * * This helps ensure that a typical response comes in just three chunks: * HTTP header (except for Content-Length) * Content-Length and the double CR+LF * Body * * @param[in] h State * @param[in] len Length */ static void httpd_content_len(httpd_t *h, size_t len) { char *cl; /* Do our own CR+LF expansion and send directly. */ cl = lazyaf("Content-Length: %u\r\n\r\n", (unsigned)len); httpd_send(h, cl, strlen(cl)); } /** * Dump the buffered http_print() data. * * @param[in,out] h State */ typedef enum { DUMP_WITH_LENGTH, DUMP_WITHOUT_LENGTH } dump_t; static void httpd_print_dump(httpd_t *h, dump_t type) { request_t *r = &h->request; if (type == DUMP_WITH_LENGTH) { httpd_content_len(h, vb_len(&r->print_buf)); } if (vb_len(&r->print_buf)) { httpd_send(h, vb_buf(&r->print_buf), vb_len(&r->print_buf)); } vb_reset(&r->print_buf); } /** * Free a collection of fields. * * @param[in,out] fp pointer to list of fields */ static void free_fields(field_t **fp) { field_t *f; while ((f = *fp) != NULL) { field_t *g = f; *fp = f->next; Free(g); } } /** * Reinitialize the HTTPD request state. * * We do this when we close a connection, and when we complete a request on * a persistent connection. * * @param[in,out] r request state */ static void httpd_reinit_request(request_t *r) { r->nr = 0; r->saw_first = false; r->rll = 0; r->http_1_0 = false; r->persistent = true; free_fields(&r->fields); r->fields_start = NULL; free_fields(&r->queries); vb_reset(&r->print_buf); r->verb = VERB_OTHER; r->it_offset = 0; r->ot_offset = 0; } /** * Initialize the HTTPD request state. * * This is done with fresh connection, so there is no previous state to * clean up. * * @param[out] r request state */ static void httpd_init_request(request_t *r) { memset(r, 0, sizeof(*r)); httpd_reinit_request(r); } /** * Free HTTPD request state. * * @param[in] r Request */ static void httpd_free_request(request_t *r) { /* Free the print buffer. */ vb_free(&r->print_buf); /* Reinitialize everthing. */ httpd_reinit_request(r); } /** * Initialize the entire HTTPD state for a connection. * * @param[in,out] h state * @param[in] mhandle main logic handle */ static void httpd_init_state(httpd_t *h, void *mhandle) { httpd_init_request(&h->request); h->cr = false; h->mhandle = mhandle; h->seq = httpd_seq++; } /** * Write the HTTP header. * * @param[in] h State * @param[in] status_code HTTP status code * @param[in] do_close true if we should send 'Connection: close' * @param[in] content_type Value for Content-Type field */ static void httpd_http_header(httpd_t *h, int status_code, bool do_close, const char *content_type) { request_t *r = &h->request; time_t t; char *a; vtrace("h> [%lu] Response: %d %s\n", h->seq, status_code, status_text(status_code)); httpd_print(h, HP_BUFFER, "HTTP/1.1 %d %s\n", status_code, status_text(status_code)); t = time(NULL); a = asctime(gmtime(&t)); httpd_print(h, HP_BUFFER, "Date: %.*s UTC\n", strlen(a) - 1, a); httpd_print(h, HP_BUFFER, "Server: %s\n", build); if (do_close) { httpd_print(h, HP_BUFFER, "Connection: close\n"); } if (status_code == 301 && r->location != NULL) { httpd_print(h, HP_BUFFER, "Location: %s\n", r->location); } httpd_print(h, HP_BUFFER, "Content-Type: %s\n", content_type); /* Now write it. */ httpd_print_dump(h, DUMP_WITHOUT_LENGTH); } /** * Write the standard trailer. * * The trailer includes the bracket. * * @param[in] h State * @param[in] type Print type (send or buffer) */ static void httpd_html_trailer(httpd_t *h, httpd_print_t type) { httpd_print(h, type, "\n"); httpd_print(h, type, "
    \n"); httpd_print(h, type, " %s -
    x3270.bgp.nu\n", build); httpd_print(h, type, " \n"); } /** * Fail an HTTP request, varargs interface * * @param[in,out] h State * @param[in] mode Error mode (how far we got before the error) * @param[in] status_code HTTP status code * @param[in] verb Request verb * @param[in] format printf format for extended error message * @param[in] ap printf args * * @return httpd_status_t */ static httpd_status_t httpd_verror(httpd_t *h, errmode_t mode, int status_code, verb_t verb, const char *format, va_list ap) { request_t *r = &h->request; /* If the request wasn't complete junk, wrap the error response in HTTP. */ if (mode != ERRMODE_NON_HTTP) { httpd_http_header(h, status_code, mode <= ERRMODE_FATAL, "text/html; charset=iso8859-1"); } else { vtrace("h> [%lu] Response: %d %s\n", h->seq, status_code, status_text(status_code)); } /* * For (apparent) HTTP connections, buffer the body of the error message * so we can send a Content-Length field. Otherwise, send it straight out. * * If we ever are in danger of sending anything larger than the output * buffer in an error message, we can used chunked encoding. */ if (mode == ERRMODE_NON_HTTP) { httpd_print(h, HP_BUFFER, "\n"); } if (verb != VERB_HEAD) { /* Generate the body. */ httpd_print(h, HP_BUFFER, "\n"); httpd_print(h, HP_BUFFER, "\n"); httpd_print(h, HP_BUFFER, " \n"); httpd_print(h, HP_BUFFER, " %d %s\n", status_code, status_text(status_code)); httpd_print(h, HP_BUFFER, " \n"); httpd_print(h, HP_BUFFER, " \n"); httpd_print(h, HP_BUFFER, "

    %d %s

    \n", status_code, status_text(status_code)); httpd_vprint(h, HP_BUFFER, format, ap); httpd_html_trailer(h, HP_BUFFER); httpd_print(h, HP_BUFFER, "\n"); /* * Dump the Content-Length (if HTTP) now and terminate the response * header. */ httpd_print_dump(h, (mode > ERRMODE_NON_HTTP)? DUMP_WITH_LENGTH: DUMP_WITHOUT_LENGTH); } /* * If this is a fatal error, or if the connection is not persistent, close * the connection. */ if (mode <= ERRMODE_FATAL || !r->persistent) { return HS_ERROR_CLOSE; } else { httpd_reinit_request(r); return HS_ERROR_OPEN; } } /** * Fail an HTTP request. * * @param[in,out] h State * @param[in] mode Error mode (how far we got before the error) * @param[in] status_code HTTP status code * @param[in] format printf format for extended error message * * @return httpd_status_t */ static httpd_status_t httpd_error(httpd_t *h, errmode_t mode, int status_code, const char *format, ...) { request_t *r = &h->request; va_list ap; httpd_status_t rv; va_start(ap, format); rv = httpd_verror(h, mode, status_code, r->verb, format, ap); va_end(ap); return rv; } /** * Parse a number inline in a string. * * @param[in] s String to parse * @param[out] nlp Returned length of number (number of bytes) * @param[out] np Returned numeric value * * @return false for no valid number present, true for success */ static bool httpd_parse_number(const char *s, size_t *nlp, unsigned long *np) { unsigned long int u; char *end; u = strtoul(s, &end, 10); if ((u == ULONG_MAX && errno == ERANGE) || end == s) { *nlp = 0; *np = 0; return false; } *nlp = end - s; *np = u; return true; } /** * Partially validate the first line of a request. * * As a side-effect, remember the verb in r->verb, and the URI in r->uri. * * The request is in r->request_buf[], NULL terminated, with the length * (not including the NULL) in r->nr. * * @param[in,out] h State * * @return httpd_status_t */ static int httpd_digest_request_line(httpd_t *h) { request_t *r = &h->request; char *verb; char *protocol; char *junk; size_t major_len, minor_len; unsigned long major, minor; errmode_t errmode; int i; char *rq; static const char *known_verbs[] = { "GET", "HEAD", "POST", "PUT", "DELETE", "CONNECT", "OPTIONS", "TRACE", NULL }; static const char *supported_verbs[] = { /* Must use same order as the http_verb enumeration. */ "GET", "HEAD", NULL }; static char http_token[] = "HTTP/"; # define HTTP_TOKEN_SIZE (sizeof(http_token) - 1) static char *whitespace = " \t\f\v"; /* Until we find HTTP/, errors are junk. */ errmode = ERRMODE_NON_HTTP; rq = r->request_buf; vtrace("h< [%lu] Request: %s\n", h->seq, rq); /* * We need to see something that looks like: * [http/n.n] */ /* White space at the beginning of the input is bad. */ if (isspace((unsigned char)rq[0])) { return httpd_error(h, errmode, 400, "

    Invalid request " "syntax.

    \n

    Whitespace at the beginning of the " "request.

    "); } /* We expect two or three tokens. */ verb = strtok(rq, whitespace); r->uri = strtok(NULL, whitespace); protocol = strtok(NULL, whitespace); if (protocol != NULL) { junk = strtok(NULL, whitespace); } else { junk = NULL; } if (verb == NULL || r->uri == NULL || junk != NULL) { return httpd_error(h, errmode, 400, "

    Invalid request " "syntax.

    \n

    Invalid number of tokens.

    "); } /* * Check the syntax of the protocol version. */ if (protocol != NULL) { if (strncasecmp(protocol, http_token, HTTP_TOKEN_SIZE) || !httpd_parse_number(protocol + HTTP_TOKEN_SIZE, &major_len, &major) || protocol[HTTP_TOKEN_SIZE + major_len] != '.' || !httpd_parse_number(protocol + HTTP_TOKEN_SIZE + major_len + 1, &minor_len, &minor)) { if (!strcmp(verb, "HEAD")) { r->verb = VERB_HEAD; } return httpd_error(h, errmode, 400, "Invalid protocol '%s'.", protocol); } r->http_1_0 = (major == 1 && minor == 0); r->persistent = !r->http_1_0; errmode = ERRMODE_FATAL; } else { /* No third token. Assume HTTP 1.0. */ r->http_1_0 = true; r->persistent = false; } /* Check the verb. */ for (i = 0; known_verbs[i] != NULL; i++) { if (!strcmp(verb, known_verbs[i])) { break; } } if (known_verbs[i] == NULL) { return httpd_error(h, errmode, 400, "Unknown verb '%s'.", verb); } for (i = 0; supported_verbs[i] != NULL; i++) { if (!strcmp(verb, supported_verbs[i])) { r->verb = i; break; } } if (supported_verbs[i] == NULL) { return httpd_error(h, errmode, 501, "Unsupported verb '%s'.", verb); } return HS_CONTINUE; } /** * Translate a hex digit to a number. * * @param[in] c Digit character * * @return Value, or -1 if not a valid digit */ static int hex_digit(char c) { static const char *xlc = "0123456789abcdef"; static const char *xuc = "0123456789ABCDEF"; char *x; x = strchr(xlc, c); if (x != NULL) { return (int)(x - xlc); } x = strchr(xuc, c); if (x != NULL) { return (int)(x - xuc); } return -1; } /** * Do percent substitution decoding on a URI element. * * @param[in] uri URI to parse * @param[in] len Length of URI * @param[in] plus Translate '+' to ' ' as well * * @return Translated, newly-allocated and NULL-terminated URI, or NULL if * there is a syntax error */ static char * percent_decode(const char *uri, size_t len, bool plus) { enum { PS_BASE, /* base state */ PS_PCT, /* saw % */ PS_HEX1 /* saw % and one hex digit */ } state = PS_BASE; int hex1 = 0, hex2; const char *s; char c; varbuf_t r; char xc; vb_init(&r); /* Walk and translate. */ s = uri; while (s < uri + len) { c = *s++; switch (state) { case PS_BASE: if (c == '%') { state = PS_PCT; } else { if (plus && c == '+') { vb_appends(&r, " "); } else { vb_append(&r, &c, 1); } } break; case PS_PCT: hex1 = hex_digit(c); if (hex1 < 0) { vb_free(&r); return NULL; } state = PS_HEX1; break; case PS_HEX1: hex2 = hex_digit(c); if (hex2 < 0) { vb_free(&r); return NULL; } xc = (hex1 << 4) | hex2; vb_append(&r, &xc, 1); state = PS_BASE; break; } } /* If we end with a partially-digested sequence, fail. */ if (state != PS_BASE) { vb_free(&r); return NULL; } /* Done. */ return vb_consume(&r); } /** * Validate a registered path. * * @param[in] path * * @return !=0 for success, 0 for failure */ static int httpd_valid_path(const char *path) { const char *s; int nsl; char c; /* Check for NULL pointer. */ if (path == NULL) { return 0; } s = path; nsl = 0; while ((c = *s) != '\0') { if (c == '/') { /* We see a slash. */ if (nsl) { /* Two slashes in a row. */ return 0; } else { /* Remember the slash we saw. */ nsl++; } } else { /* Not a slash. */ /* Path must begin with a slash. */ if (s == path) { return 0; } nsl = 0; } s++; } /* Path must not be empty. */ if (s == path) { return 0; } /* Path must not end with a slash. */ if (c == '/') { return 0; } /* Okay. */ return 1; } /** * Register a dynamic object. * * @param[in] path Path, must include leading / * @param[in] desc Description * @param[in] content_type Content type CT_xxx * @param[in] content_str Content-Type value * @param[in] flags Flags * @param[in] dyn Callback to produce output * @param[in] type Object type (terminal or nonterminal) * * @return handle for further operations */ static void * httpd_register_dyn(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, reg_dyn_t *dyn, or_t type) { httpd_reg_t *reg; if (!httpd_valid_path(path)) { return NULL; } reg = Calloc(1, sizeof(*reg)); reg->path = path; reg->desc = desc; reg->type = type; reg->content_type = content_type; reg->content_str = content_str; reg->flags = flags; reg->u.dyn = dyn; reg->next = httpd_reg; httpd_reg = reg; return reg; } /** * Reply to a successful URI lookup. * * @param[in,out] h State * @param[in] reg Registry entry * @param[in] uri URI * * @return httpd_status_t */ static httpd_status_t httpd_reply(httpd_t *h, httpd_reg_t *reg, const char *uri) { request_t *r = &h->request; const char *nonterm; /* Check for a busy object. */ if (reg->async_session != NULL) { char *q_uri; q_uri = html_quote(uri); httpd_error(h, ERRMODE_NONFATAL, 409, "

    Object is busy.

    Only one client may access '%s' at " "a time.", q_uri); Free(q_uri); return HS_ERROR_OPEN; } switch (reg->type) { case OR_DYN_TERM: case OR_DYN_NONTERM: /* Save state. */ reg->async_session = h; r->async_node = reg; /* * Call the dynamic function. * It's responsible for calling httpd_dyn_complete() or * httpd_dyn_error(). */ nonterm = uri + strlen(reg->path); if (*nonterm == '/') { nonterm++; } return (*reg->u.dyn)(nonterm, h); default: break; } httpd_http_header(h, 200, !r->persistent, reg->content_str); httpd_print(h, HP_SEND, "Cache-Control: max-age=43200\n"); switch (r->verb) { case VERB_GET: case VERB_OTHER: /* Generate the body. */ if (reg->content_type == CT_HTML) { httpd_print(h, HP_BUFFER, "\n"); httpd_print(h, HP_BUFFER, "\n"); } switch (reg->type) { case OR_FIXED: httpd_print(h, HP_BUFFER, "%s", reg->u.fixed); break; case OR_FIXED_BINARY: httpd_content_len(h, reg->u.fixed_binary.length); httpd_send(h, (char *)reg->u.fixed_binary.fixed, reg->u.fixed_binary.length); break; case OR_DYN_TERM: case OR_DYN_NONTERM: case OR_DIR: /* Can't happen. */ break; } if (reg->content_type == CT_HTML) { if (reg->flags & HF_TRAILER) { httpd_html_trailer(h, HP_BUFFER); } httpd_print(h, HP_BUFFER, "\n"); } /* Dump the Content-Length now and terminate the response header. */ if (reg->type != OR_FIXED_BINARY) { httpd_print_dump(h, DUMP_WITH_LENGTH); } break; case VERB_HEAD: httpd_print(h, HP_SEND, "\n"); break; } /* If the connection is not persistent, close the connection. */ if (!r->persistent) { return HS_SUCCESS_CLOSE; } else { httpd_reinit_request(r); return HS_SUCCESS_OPEN; } } /** * List a directory as the response. * * @param[in,out] h State * @param[in] uri URI matched * * @return httpd_status_t */ static httpd_status_t httpd_dirlist(httpd_t *h, const char *uri) { request_t *r = &h->request; char *q_uri; httpd_reg_t *reg; httpd_http_header(h, 200, !r->persistent, "text/html; charset=iso8859-1"); switch (r->verb) { case VERB_GET: case VERB_OTHER: /* Generate the body. */ q_uri = html_quote(uri); httpd_print(h, HP_BUFFER, "\n"); httpd_print(h, HP_BUFFER, "\n"); httpd_print(h, HP_BUFFER, " \n"); httpd_print(h, HP_BUFFER, " Directory of %s\n", q_uri); httpd_print(h, HP_BUFFER, " \n"); httpd_print(h, HP_BUFFER, " \n"); httpd_print(h, HP_BUFFER, "

    Directory of %s

    \n", q_uri); Free(q_uri); for (reg = httpd_reg; reg != NULL; reg = reg->next) { if (!strncmp(reg->path, uri, strlen(uri)) && strchr(reg->path + strlen(uri), '/') == NULL && !(reg->flags & HF_HIDDEN)) { size_t nlen; char *q1, *q2; nlen = strlen(reg->path + strlen(uri)); if (reg->type == OR_DIR || reg->type == OR_DYN_NONTERM) { nlen++; } if (nlen > DIRLIST_NLEN) { nlen = 2; } else { nlen = DIRLIST_NLEN + 2 - nlen; } httpd_print(h, HP_BUFFER, "

    %s%s", (q1 = html_quote(reg->alias? reg->alias: reg->path)), (reg->type == OR_DIR && !reg->alias)? "/": "", (q2 = html_quote(reg->path + strlen(uri))), (reg->type == OR_DIR || reg->type == OR_DYN_NONTERM)? "/": ""); Free(q1); Free(q2); while (nlen--) { httpd_print(h, HP_BUFFER, " "); } httpd_print(h, HP_BUFFER, "%s

    \n", reg->desc); } } httpd_html_trailer(h, HP_BUFFER); httpd_print(h, HP_BUFFER, "\n"); /* Dump the Content-Length now and terminate the response header. */ httpd_print_dump(h, DUMP_WITH_LENGTH); break; case VERB_HEAD: httpd_print(h, HP_SEND, "\n"); break; } /* If the connection is not persistent, close the connection. */ if (!r->persistent) { return HS_SUCCESS_CLOSE; } else { httpd_reinit_request(r); return HS_SUCCESS_OPEN; } } /** * Look up the value of a field. * * @param[in] name Field name * * @return Field value, or NULL */ static const char * lookup_field(const char *name, field_t *f) { while (f != NULL) { if (!strcasecmp(f->name, name)) { return f->value; } f = f->next; } return NULL; } /** * Redirect a directory name by appending a '/'. * * @param[in,out] h State * @param[in] uri URI matched * * @return httpd_status_t */ static httpd_status_t httpd_redirect(httpd_t *h, const char *uri) { request_t *r = &h->request; const char *host = lookup_field("Host", r->fields); if (host == NULL) { return httpd_error(h, ERRMODE_NONFATAL, 404, "Document not found."); } r->location = xs_buffer("http://%s%s/", host, uri); httpd_error(h, ERRMODE_NONFATAL, 301, "The document has moved " "here..", host, uri); Free(r->location); r->location = NULL; if (!r->persistent) { return HS_SUCCESS_CLOSE; } else { httpd_reinit_request(r); return HS_SUCCESS_OPEN; } } /** * URI not found * * @param[in,out] h State * @param[in] uri URI not matched * * @return httpd_status_t */ static httpd_status_t httpd_notfound(httpd_t *h, const char *uri) { request_t *r = &h->request; char *q_uri = html_quote(uri); httpd_error(h, ERRMODE_NONFATAL, 404, "The requested URL %s was not found on this server.", q_uri); Free(q_uri); if (!r->persistent) { return HS_SUCCESS_CLOSE; } else { httpd_reinit_request(r); return HS_SUCCESS_OPEN; } } /** * Look up a URI in the registry and act on it. * * @param[in,out] h State * @param[in] uri URI to look up, NULL terminated * * @return httpd_status_t */ static httpd_status_t httpd_lookup_uri(httpd_t *h, const char *uri) { httpd_reg_t *reg; if (!strcmp(uri, "/") || !strcmp(uri, "//")) { return httpd_dirlist(h, "/"); } /* Look for an exact match. */ for (reg = httpd_reg; reg != NULL; reg = reg->next) { switch (reg->type) { case OR_DIR: if (!strcmp(uri, reg->path)) { /* Directory without trailing slash. */ return httpd_redirect(h, uri); } if (uri[strlen(uri) - 1] == '/' && strlen(reg->path) == strlen(uri) - 1 && !strncmp(uri, reg->path, strlen(reg->path))) { /* Directory with a trailing slash. */ return httpd_dirlist(h, uri); } break; case OR_FIXED: case OR_FIXED_BINARY: case OR_DYN_TERM: /* Terminal object. */ if (!strcmp(uri, reg->path)) { return httpd_reply(h, reg, uri); } break; case OR_DYN_NONTERM: /* Nonterminal object. */ if (strlen(uri) >= strlen(reg->path) && !strncmp(uri, reg->path, strlen(reg->path)) && (strlen(uri) == strlen(reg->path) || uri[strlen(reg->path)] == '/')) { return httpd_reply(h, reg, uri); } break; } } /* Not found. */ return httpd_notfound(h, uri); } /** * Parse the query field for a URL. * * @param[in] h State * @param[in] query Raw query string from request */ static void parse_queries(httpd_t *h, const char *query) { const char *s = query; field_t *f; field_t *f_last = NULL; bool last = false; char *eov; /* Split the string at each '&'. */ for (s = query; !last; s = eov + 1) { char *eq; char *name; char *value; eov = strchr(s, '&'); if (!eov) { eov = strchr(s, '\0'); last = true; } eq = strchr(s, '='); if (eq == NULL || eq == s || eq > eov) { continue; } name = percent_decode(s, eq - s, false); value = percent_decode(eq + 1, eov - (eq + 1), true); f = Malloc(sizeof(*f) + strlen(name) + 1 + strlen(value) + 1); f->next = NULL; f->name = (char *)(f + 1); strcpy(f->name, name); f->value = f->name + strlen(name) + 1; strcpy(f->value, value); Free(name); Free(value); if (f_last) { f_last->next = f; } else { h->request.queries = f; } f_last = f; } } /** * Digest the entire request. * * The entire text is in r->request_buf, NULL terminated, including newline * characters. The length of the request, not including the NULL, is in * r->nr. The fields in the request are pointed to by f->fields_start. * * @param[in,out] h State * * @return httpd_status_t */ static httpd_status_t httpd_digest_request(httpd_t *h) { request_t *r = &h->request; char *s = r->fields_start; char *cand_uri; char *uri; const char *connection; httpd_status_t rv; char *query; char *fragment; /* * Parse the fields. * We ignore fields we don't understand. * We require, but actually pay no attention to, the host field. * We understand 'connection: close', but ignore other 'connection:' * values. The close state is left in r->persistent. * I'm sure this is HTTP 1.1 blasphemy. */ while (*s) { while (*s != '\n') { char *field_name = s; size_t field_name_len; char *value; size_t value_len; field_t *f; /* The field name needs to start with a non-space, non-colon. */ if (iscntrl((unsigned char)*s) || isspace((unsigned char)*s) || *s == ':') { return httpd_error(h, ERRMODE_FATAL, 400, "Malformed " "field name in request."); } /* Parse the rest of the name. */ while (*s != '\n' && *s != ':' && !isspace((unsigned char)*s)) { if (iscntrl((unsigned char)*s)) { return httpd_error(h, ERRMODE_FATAL, 400, "Malformed field name in request."); } s++; } field_name_len = s - field_name; /* Skip spaces after the name (technically illegal). */ while (*s != '\n' && isspace((unsigned char)*s)) { s++; } /* Now we need a colon. */ if (*s != ':') { return httpd_error(h, ERRMODE_FATAL, 400, "Malformed " "field (missing colon) in request."); } s++; /* Skip spaces after the colon. */ while (*s != '\n' && isspace((unsigned char)*s)) { s++; } /* What's after that whitespace is the value. */ value = s; while (*s != '\n') { s++; } value_len = s - value; /* Trim trailing spaces from the value. */ while (value_len && isspace((unsigned char)value[value_len - 1])) { value_len--; } if (value_len == 0) { return httpd_error(h, ERRMODE_FATAL, 400, "Malformed " "field (missing value) in request."); } /* Store it. */ f = Malloc(sizeof(*f) + field_name_len + 1 + value_len + 1); f->name = (char *)(f + 1); strncpy(f->name, field_name, field_name_len); f->name[field_name_len] = '\0'; f->value = f->name + field_name_len + 1; strncpy(f->value, value, value_len); f->value[value_len] = '\0'; /* Choke on duplicates. */ if (lookup_field(f->name, r->fields) != NULL) { return httpd_error(h, ERRMODE_FATAL, 400, "Duplicate " "field in request."); } /* Link it in. */ f->next = r->fields; r->fields = f; } s++; } /* For HTTP 1.1, require a 'Host:' field. */ if (!r->http_1_0 && lookup_field("Host", r->fields) == NULL) { return httpd_error(h, ERRMODE_FATAL, 400, "Missing hostname."); } /* Check for connection close request. */ if ((connection = lookup_field("Connection", r->fields)) != NULL && !strcasecmp(connection, "close")) { r->persistent = false; } /* * Split the URI at '?' or '#' before doing percent decodes. * This allows '?' and '#' to be percent-encoded in any of the elements. */ query = strchr(r->uri, '?'); fragment = strchr(r->uri, '#'); if (query && (!fragment || query < fragment)) { *query = '\0'; r->query = query + 1; if (fragment) { *fragment = '\0'; r->fragment = fragment + 1; } } if (fragment && (!query || fragment < query)) { *fragment = '\0'; r->fragment = fragment + 1; } /* Do percent substitution on the URI. */ cand_uri = percent_decode(r->uri, strlen(r->uri), false); if (cand_uri == NULL) { return httpd_error(h, ERRMODE_FATAL, 400, "Invalid URI (percent substution error)."); } /* * Parse the URI. * We understand requests that start with '/', which are relative to our * root. (After that, we expect '3270/'.) * We understand requests that start with 'http:///', and * ignore everything through . * Anything else we barf on. */ if (strlen(cand_uri) > 7 && !strncasecmp(cand_uri, "http://", 7)) { char *slash = strchr(cand_uri + 7, '/'); if (slash == NULL) { Free(cand_uri); return httpd_error(h, ERRMODE_FATAL, 400, "Invalid URI " "syntax after http://."); } else { uri = slash; } } else { uri = cand_uri; } if (uri[0] != '/') { Free(cand_uri); return httpd_error(h, ERRMODE_FATAL, 400, "Invalid URI"); } /* Pick apart the query fields. */ if (r->query) { parse_queries(h, r->query); } /* * Now we have a URI in what seems like valid form. * Search the registry for a match. */ rv = httpd_lookup_uri(h, cand_uri); Free(cand_uri); return rv; } /** * Process a byte of incoming HTTP data. * * @param[in,out] h State * @param[in] c Next input character * * @return httpd_status_t */ static int httpd_input_char(httpd_t *h, char c) { request_t *r = &h->request; /* * CRLF processing. We translate CRs into Newlines, and ignore LFs * after CRs. */ if (h->cr) { h->cr = false; /* CR followed by LF. Ignore the LF. */ if (c == '\n') { return HS_CONTINUE; } } if (c == '\r') { h->cr = true; /* Treat CRs as Newline characters. */ c = '\n'; } /* If there's no room to store the character, we're done. */ if (r->nr >= MAX_HTTPD_REQUEST) { return httpd_error(h, r->saw_first? ERRMODE_FATAL: ERRMODE_NON_HTTP, 400, "The request is too big."); } /* Store the character. */ r->request_buf[r->nr++] = c; /* Check for a newline. */ if (c == '\n') { if (r->rll == 0) { /* Empty line: digest the entire request. */ if (!r->saw_first) { return httpd_error(h, ERRMODE_FATAL, 400, "Missing request."); } r->request_buf[r->nr] = '\0'; return httpd_digest_request(h); } else { /* Beginning of new line; set the length to 0. */ r->rll = 0; /* If this is the first line, validate it. */ if (!r->saw_first) { r->request_buf[r->nr - 1] = '\0'; r->fields_start = &r->request_buf[r->nr]; r->saw_first = true; return httpd_digest_request_line(h); } } } else { /* Non-newline character: increment the line length. */ r->rll++; } /* Not done yet. */ return HS_CONTINUE; } /***************************************************************************** * Functions called by the main logic. *****************************************************************************/ /** * Register a directory (give its description) * * @param[in] path Path, must include leading / * @param[in] desc Description * * @return handle for further operations */ void * httpd_register_dir(const char *path, const char *desc) { httpd_reg_t *reg; if (!httpd_valid_path(path)) { return NULL; } reg = Calloc(1, sizeof(*reg)); reg->path = path; reg->desc = desc; reg->type = OR_DIR; reg->next = httpd_reg; httpd_reg = reg; return reg; } /** * Register a fixed-content object. * * @param[in] path Path, must include leading / * @param[in] desc Description * @param[in] content_type Content type CT_xxx * @param[in] content_str Content-Type value * @param[in] flags Flags * @param[in] fixed Fixed text to return * * @return handle for further operations */ void * httpd_register_fixed(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, const char *fixed) { httpd_reg_t *reg; if (!httpd_valid_path(path)) { return NULL; } reg = Calloc(1, sizeof(*reg)); reg->path = path; reg->desc = desc; reg->type = OR_FIXED; reg->content_type = content_type; reg->content_str = content_str; reg->flags = flags; reg->u.fixed = fixed; reg->next = httpd_reg; httpd_reg = reg; return reg; } /** * Register a fixed-content binary object. * * @param[in] path Path, must include leading / * @param[in] desc Description * @param[in] content_type Content type CT_xxx * @param[in] content_str Content-Type value * @param[in] flags Flags * @param[in] fixed Fixed text to return * @param[in] length Length of text * * @return handle for further operations */ void * httpd_register_fixed_binary(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, const unsigned char *fixed, unsigned length) { httpd_reg_t *reg; if (!httpd_valid_path(path)) { return NULL; } reg = Calloc(1, sizeof(*reg)); reg->path = path; reg->desc = desc; reg->type = OR_FIXED_BINARY; reg->content_type = content_type; reg->content_str = content_str; reg->flags = flags; reg->u.fixed_binary.fixed = fixed; reg->u.fixed_binary.length = length; reg->next = httpd_reg; httpd_reg = reg; return reg; } /** * Register a dynamic terminal object. * * @param[in] path Path, must include leading / * @param[in] desc Description * @param[in] content_type Content type CT_xxx * @param[in] content_str Content-Type value * @param[in] flags Flags * @param[in] dyn Callback to produce output * * @return handle for further operations */ void * httpd_register_dyn_term(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, reg_dyn_t *dyn) { return httpd_register_dyn(path, desc, content_type, content_str, flags, dyn, OR_DYN_TERM); } /** * Register a dynamic nonterminal object. * * @param[in] path Path, must include leading / * @param[in] desc Description * @param[in] content_type Content type CT_xxx * @param[in] content_str Content-Type value * @param[in] flags Flags * @param[in] dyn Callback to produce output * * @return handle for further operations */ void * httpd_register_dyn_nonterm(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, reg_dyn_t *dyn) { return httpd_register_dyn(path, desc, content_type, content_str, flags, dyn, OR_DYN_NONTERM); } /** * Register an alias for a node, displayed in the directory entry. * * @param[in] nhandle Node handle returned from httpd_register_xxx() * @param[in] text Alternate text to display */ void httpd_set_alias(void *nhandle, const char *text) { httpd_reg_t *reg = nhandle; if (reg) { reg->alias = text; } } /** * Initialize a new connection. * * Called when a connection is accepted. * * @param[in] mhandle Handle from main process * @param[in] client_name Client name, for debug * * @return handle for further operations */ void * httpd_new(void *mhandle, const char *client_name) { httpd_t *h; h = Malloc(sizeof(httpd_t)); memset(h, 0, sizeof(*h)); httpd_init_state(h, mhandle); vtrace("h< [%lu] New session from %s\n", h->seq, client_name); return h; } /** * Process incoming HTTP data. * * Called with data read from the HTTP socket. * * @param[in] dhandle handle returned by httpd_new * @param[in] data data buffer * @param[in] len length of data in buffer * * @return httpd_status_t */ httpd_status_t httpd_input(void *dhandle, const char *data, size_t len) { httpd_t *h = (httpd_t *)dhandle; request_t *r = &h->request; size_t i; httpd_status_t rv = HS_CONTINUE; httpd_data_trace(h, "<", data, len, &r->it_offset); /* Process a byte at a time, skipping CRs. */ for (i = 0; i < len; i++) { switch ((rv = httpd_input_char(h, data[i]))) { case HS_CONTINUE: /* Keep parsing. */ continue; case HS_SUCCESS_OPEN: httpd_reinit_request(r); return rv; case HS_ERROR_OPEN: /* Request failed, but keep the socket open. */ httpd_reinit_request(r); /* fall through */ case HS_ERROR_CLOSE: /* Request failed, close the socket. */ case HS_SUCCESS_CLOSE: /* Request succeeded, close the socket. */ case HS_PENDING: /* Request pending, hold off further input. */ return rv; } } /* Success, at least so far. */ return rv; } /** * Close the HTTPD connection. * * @param[in] dhandle Handle returned by httpd_new * @param[in] why Reason (for debug) */ void httpd_close(void *dhandle, const char *why) { httpd_t *h = dhandle; vtrace("h> [%lu] Close: %s\n", h->seq, why); /* Wipe the existing request state. */ httpd_free_request(&h->request); /* Free it. */ memset(h, 0, sizeof(*h)); Free(h); } /** * Map a dhandle (handle returned from httpd_new()) onto an mhandle (handle * passed into httpd_new()). * * This is a helper function used during async processing. * * @param[in] dhandle Daemon handle * * @return Main handle */ void * httpd_mhandle(void *dhandle) { httpd_t *h = dhandle; return h->mhandle; } /***************************************************************************** * Functions called by methods. *****************************************************************************/ /** * Successfully complete a dynamic HTTP request. * * Called from a synchronous method or an asynchronous completion function. * Writes the entire response back to the socket. * * @param[in] dhandle handle returned by httpd_new * @param[in] format printf format string * * @return httpd_status_t, suitable for return from completion function * (HS_SUCCESS_OPEN or HS_SUCCESS_CLOSE). */ httpd_status_t httpd_dyn_complete(void *dhandle, const char *format, ...) { httpd_t *h = (httpd_t *)dhandle; request_t *r = &h->request; httpd_reg_t *reg = r->async_node; va_list ap; /* Un-mark the node and session as busy. */ reg->async_session = NULL; r->async_node = NULL; /* Generate the output. */ httpd_http_header(h, 200, !r->persistent, reg->content_str); httpd_print(h, HP_SEND, "Cache-Control: no-store\n"); switch (r->verb) { case VERB_GET: case VERB_OTHER: /* Generate the body. */ if (reg->content_type == CT_HTML) { httpd_print(h, HP_BUFFER, "\n"); httpd_print(h, HP_BUFFER, "\n"); } va_start(ap, format); httpd_vprint(h, HP_BUFFER, format, ap); va_end(ap); if (reg->content_type == CT_HTML) { if (reg->flags & HF_TRAILER) { httpd_html_trailer(h, HP_BUFFER); } httpd_print(h, HP_BUFFER, "\n"); } /* Dump the Content-Length now and terminate the response header. */ httpd_print_dump(h, DUMP_WITH_LENGTH); break; case VERB_HEAD: httpd_print(h, HP_SEND, "\n"); break; } /* Return status. */ if (!r->persistent) { return HS_SUCCESS_CLOSE; } else { httpd_reinit_request(r); return HS_SUCCESS_OPEN; } } /** * Unsuccessfully complete a dynamic HTTP request. * * Called from a synchronous method or an asynchronous completion function. * Writes the entire response back to the socket. * * @param[in] dhandle Connection handle * @param[in] status_code HTTP error code * @param[in] format text to display * * @return httpd_status_t, suitable for return from completion function * (HS_ERROR_OPEN or HS_ERROR_CLOSE). */ httpd_status_t httpd_dyn_error(void *dhandle, int status_code, const char *format, ...) { httpd_t *h = dhandle; request_t *r = &h->request; va_list ap; httpd_status_t rv; /* Un-mark the node and session as busy. */ r->async_node->async_session = NULL; r->async_node = NULL; va_start(ap, format); rv = httpd_verror(h, ERRMODE_NONFATAL, status_code, r->verb, format, ap); va_end(ap); return rv; } /** * Quote text to pass transparently through to HTML. * * @param[in] text Text to expand * * @return Expanded text, needs to be freed afterward */ char * html_quote(const char *text) { varbuf_t r; char c; vb_init(&r); while ((c = *text++)) { switch (c) { case '&': vb_appends(&r, "&"); break; case '<': vb_appends(&r, "<"); break; case '>': vb_appends(&r, ">"); break; case '"': vb_appends(&r, """); break; default: vb_append(&r, &c, 1); break; } } return vb_consume(&r); } /** * Quote a URI. Uses percent encoding. * * @param[in] uri URI to quote * * @return Expanded URI, needs to be freed afterward */ char * uri_quote(const char *text) { varbuf_t r; char c; vb_init(&r); while ((c = *text++)) { if (c > ' ' && c < 0x7f && c != '%') { vb_append(&r, &c, 1); } else { vb_appendf(&r, "%%%02x", c & 0xff); } } return vb_consume(&r); } /** * Fetch a query from the current request. * * @param[in] dhandle Connection handle * @param[in] name Name of item to fetch * * @return Query value, or NULL */ const char * httpd_fetch_query(void *dhandle, const char *name) { httpd_t *h = dhandle; request_t *r = &h->request; field_t *f; for (f = r->queries; f != NULL; f = f->next) { if (!strcmp(f->name, name)) { return f->value; } } return NULL; } suite3270-3.6/Common/httpd-io.c0000664000076500007650000003257213221577163014331 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * httpd-io.c * x3270 webserver, I/O module */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include # include # include # include #endif /*]*/ #include #include #include #include #include "appres.h" #include "lazya.h" #include "macros.h" #include "popups.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #include "httpd-core.h" #include "httpd-io.h" #if defined(_WIN32) /*[*/ # include "w3misc.h" # include "winprint.h" #endif /*]*/ #define IDLE_MAX 15 #define N_SESSIONS 32 typedef struct { llist_t link; /* list linkage */ socket_t s; /* socket */ #if defined(_WIN32) /*[*/ HANDLE event; #endif /*]*/ void *dhandle; /* httpd protocol handle */ int idle; ioid_t ioid; /* AddInput ID */ ioid_t toid; /* AddTimeOut ID */ struct { /* pending command state: */ sendto_callback_t *callback; /* callback function */ content_t content_type; /* content type */ varbuf_t result; /* accumulated result data */ bool done; /* is the command done? */ } pending; } session_t; llist_t sessions = LLIST_INIT(sessions); static int n_sessions; static socket_t listen_s; #if defined(_WIN32) /*[*/ static HANDLE listen_event; #endif /*]*/ /** * Return the text for the most recent socket error. * * @return Error text */ static const char * socket_errtext(void) { #if !defined(_WIN32) /*[*/ return strerror(errno); #else /*][*/ return win32_strerror(GetLastError()); #endif /*]*/ } /** * Close the session associated with a particular socket. * Called from the HTTPD logic when a fatal error or EOF occurs. * * @param[in] session Session */ static void hio_socket_close(session_t *session) { SOCK_CLOSE(session->s); if (session->ioid != NULL_IOID) { RemoveInput(session->ioid); } if (session->toid != NULL_IOID) { RemoveTimeOut(session->toid); } #if defined(_WIN32) /*[*/ CloseHandle(session->event); #endif /*]*/ vb_free(&session->pending.result); llist_unlink(&session->link); Free(session); n_sessions--; } /** * httpd timeout. * * @param[in] id timeout ID */ static void hio_timeout(ioid_t id) { session_t *session; session = NULL; FOREACH_LLIST(&sessions, session, session_t *) { if (session->toid == id) { break; } } FOREACH_LLIST_END(&sessions, session, session_t *); if (session == NULL) { vtrace("httpd mystery timeout\n"); return; } session->toid = NULL_IOID; httpd_close(session->dhandle, "timeout"); hio_socket_close(session); } /** * New inbound data for an httpd connection. * * @param[in] fd socket file descriptor * @param[in] id I/O ID */ void hio_socket_input(iosrc_t fd, ioid_t id) { session_t *session; char buf[1024]; ssize_t nr; session = NULL; FOREACH_LLIST(&sessions, session, session_t *) { if (session->ioid == id) { break; } } FOREACH_LLIST_END(&sessions, session, session_t *); if (session == NULL) { vtrace("httpd mystery input\n"); return; } /* Move this session to the front of the list. */ llist_unlink(&session->link); llist_insert_before(&session->link, sessions.next); session->idle = 0; if (session->toid != NULL_IOID) { RemoveTimeOut(session->toid); session->toid = NULL_IOID; } nr = recv(session->s, buf, sizeof(buf), 0); if (nr <= 0) { const char *ebuf; bool harmless = false; if (nr < 0) { if (socket_errno() == SE_EWOULDBLOCK) { harmless = true; } ebuf = lazyaf("recv error: %s", socket_errtext()); vtrace("httpd %s%s\n", ebuf, harmless? " (harmless)": ""); } else { ebuf = "session EOF"; } if (!harmless) { httpd_close(session->dhandle, ebuf); hio_socket_close(session); } } else { httpd_status_t rv; rv = httpd_input(session->dhandle, buf, nr); if (rv < 0) { httpd_close(session->dhandle, "protocol error"); hio_socket_close(session); } else if (rv == HS_PENDING) { /* Stop input on this socket. */ RemoveInput(session->ioid); session->ioid = NULL_IOID; } else if (session->toid == NULL_IOID) { /* Leave input enabled and start the timeout. */ session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout); } } } /** * New inbound connection for httpd. * * @param[in] fd socket file descriptor * @param[in] id I/O ID */ void hio_connection(iosrc_t fd, ioid_t id) { socket_t t; union { struct sockaddr sa; struct sockaddr_in sin; #if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sin6; #endif /*]*/ } sa; socklen_t len; char hostbuf[128]; session_t *session; len = sizeof(sa); t = accept(listen_s, &sa.sa, &len); if (t == INVALID_SOCKET) { vtrace("httpd accept error: %s%s\n", socket_errtext(), (socket_errno() == SE_EWOULDBLOCK)? " (harmless)": ""); return; } if (n_sessions >= N_SESSIONS) { vtrace("Too many connections.\n"); SOCK_CLOSE(t); return; } session = Malloc(sizeof(session_t)); memset(session, 0, sizeof(session_t)); vb_init(&session->pending.result); session->s = t; #if defined(_WIN32) /*[*/ session->event = CreateEvent(NULL, FALSE, FALSE, NULL); if (session->event == NULL) { vtrace("httpd: can't create socket handle\n"); SOCK_CLOSE(t); Free(session); return; } if (WSAEventSelect(session->s, session->event, FD_READ | FD_CLOSE) != 0) { vtrace("httpd: Can't set socket handle events\n"); CloseHandle(session->event); SOCK_CLOSE(t); Free(session); return; } #endif /*]*/ if (sa.sa.sa_family == AF_INET) { session->dhandle = httpd_new(session, lazyaf("%s:%u", inet_ntop(AF_INET, &sa.sin.sin_addr, hostbuf, sizeof(hostbuf)), ntohs(sa.sin.sin_port))); } #if defined(X3270_IPV6) /*[*/ else if (sa.sa.sa_family == AF_INET6) { session->dhandle = httpd_new(session, lazyaf("%s:%u", inet_ntop(AF_INET6, &sa.sin6.sin6_addr, hostbuf, sizeof(hostbuf)), ntohs(sa.sin6.sin6_port))); } #endif /*]*/ else { session->dhandle = httpd_new(session, "???"); } #if !defined(_WIN32) /*[*/ session->ioid = AddInput(t, hio_socket_input); #else /*][*/ session->ioid = AddInput(session->event, hio_socket_input); #endif /*]*/ /* Set the timeout for the first line of input. */ session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout); llist_insert_before(&session->link, sessions.next); n_sessions++; } /** * Initialize the httpd socket. * * @param[in] sa address and port to listen on * @param[in] sa_len length of sa */ void hio_init(struct sockaddr *sa, socklen_t sa_len) { int on = 1; listen_s = socket(sa->sa_family, SOCK_STREAM, 0); if (listen_s == INVALID_SOCKET) { popup_an_error("httpd socket: %s", socket_errtext()); return; } if (setsockopt(listen_s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { popup_an_error("httpd setsockopt: %s", socket_errtext()); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } if (bind(listen_s, sa, sa_len) < 0) { popup_an_error("httpd bind: %s", socket_errtext()); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } if (listen(listen_s, 10) < 0) { popup_an_error("httpd listen: %s", socket_errtext()); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } #if defined(_WIN32) /*[*/ listen_event = CreateEvent(NULL, FALSE, FALSE, NULL); if (listen_event == NULL) { popup_an_error("httpd: cannot create listen handle"); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } if (WSAEventSelect(listen_s, listen_event, FD_ACCEPT) != 0) { popup_an_error("httpd: WSAEventSelect failed: %s", socket_errtext()); CloseHandle(listen_event); listen_event = INVALID_HANDLE_VALUE; SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; } (void) AddInput(listen_event, hio_connection); #else /*][*/ (void) AddInput(listen_s, hio_connection); #endif /*]*/ } /** * Send output on an http session. * * @param[in] mhandle our handle * @param[in] buf buffer to transmit * @param[in] len length of buffer */ void hio_send(void *mhandle, const char *buf, size_t len) { session_t *s = mhandle; ssize_t nw; nw = send(s->s, buf, (int)len, 0); if (nw < 0) { vtrace("http send error: %s\n", socket_errtext()); } } /** * Incremental data callback from x3270 back to httpd. * * @param[in] handle handle * @param[in] buf buffer * @param[in] len size of buffer */ static void hio_data(sms_cbh handle, const char *buf, size_t len) { session_t *s = handle; if (s->pending.content_type == CT_HTML) { size_t i; char c; /* Quote HTML in the response. */ for (i = 0; i < len; i++) { c = buf[i]; switch (c) { case '&': vb_appends(&s->pending.result, "&"); break; case '<': vb_appends(&s->pending.result, "<"); break; case '>': vb_appends(&s->pending.result, ">"); break; case '"': vb_appends(&s->pending.result, """); break; default: vb_append(&s->pending.result, &c, 1); break; } } } else { vb_append(&s->pending.result, buf, len); } vb_appends(&s->pending.result, "\n"); } /** * Completion callback from x3270 back to httpd. * * @param[in] handle handle * @param[in] success true if command succeeded * @param[in] status_buf status line buffer * @param[in] status_len size of status line buffer */ static void hio_complete(sms_cbh handle, bool success, const char *status_buf, size_t status_len) { session_t *s = handle; /* We're done. */ s->pending.done = true; /* Pass the result up to the node. */ s->pending.callback(s->dhandle, success? SC_SUCCESS: SC_USER_ERROR, vb_buf(&s->pending.result), vb_len(&s->pending.result), status_buf, status_len); /* Get ready for the next command. */ vb_reset(&s->pending.result); } /** * Send a command to x3270. * * @param[in] cmd command to send, not including the newline and * @param[in] callback callback function for completion * @param[in] handle handle to pass to completion callback function * @param[in] content_type How to handle content * * @return sendto_t */ sendto_t hio_to3270(const char *cmd, sendto_callback_t *callback, void *dhandle, content_t content_type) { static sms_cb_t httpd_cb = { "HTTPD", IA_SCRIPT, hio_data, hio_complete }; size_t sl; session_t *s = httpd_mhandle(dhandle); sl = strlen(cmd); if (sl == 0) { /* No empty commands, please. */ return SENDTO_INVALID; } /* Remove any trailing NL or CR/LF. */ if (cmd[sl - 1] == '\n') { sl--; } if (sl && cmd[sl - 1] == '\r') { sl--; } if (!sl || strchr(cmd, '\r') != NULL || strchr(cmd, '\n') != NULL) { /* No empty commands, and no embedded CRs or LFs. */ return SENDTO_INVALID; } /* Enqueue the command. */ s->pending.callback = callback; s->pending.content_type = content_type; s->pending.done = false; push_cb(cmd, sl, &httpd_cb, s); /* * It's possible for the command to have completed already. * If so, return SENDTO_COMPLETE. * Otherwise, it's just queued; return SENDTO_PENDING. */ return s->pending.done? SENDTO_COMPLETE: SENDTO_PENDING; } /** * Asynchronous completion. * * @param[in] dhandle State * @param[in] rv Completion status */ void hio_async_done(void *dhandle, httpd_status_t rv) { session_t *session = httpd_mhandle(dhandle); if (rv < 0) { hio_socket_close(session); return; } /* Allow more input. */ if (session->ioid == NULL_IOID) { #if !defined(_WIN32) /*[*/ session->ioid = AddInput(session->s, hio_socket_input); #else /*][*/ session->ioid = AddInput(session->event, hio_socket_input); #endif /*]*/ } /* * Set a timeout for that input to arrive. We didn't set this timeout * as soon as the last input arrived, because it might have taken us a * long time to proces the last request. */ if (session->toid == NULL_IOID) { session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout); } } suite3270-3.6/Common/httpd-nodes.c0000664000076500007650000003325113221577163015025 0ustar pdmpdm/* * Copyright (c) 2014-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * httpd-nodes.c * x3270 webserver, methods for HTTP objects */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include # include # include # include #endif /*]*/ #include #include #include "fprint_screen.h" #include "varbuf.h" #include "httpd-core.h" #include "httpd-io.h" #include "httpd-nodes.h" #if defined(_WIN32) /*[*/ # include "winprint.h" #endif /*]*/ extern unsigned char favicon[]; extern unsigned favicon_size; /** * Capture the screen image. * * @param[in] d Session handle * @param[out] image Image in HTML, if succeeded; must free when finished * @param[out] status Error code, if failed * * @return true for success, false for failure */ static bool hn_image(void *dhandle, varbuf_t *image, httpd_status_t *status) { httpd_status_t rv; int fd; FILE *f; char *temp_name; char buf[8192]; /* Open the temporary file. */ #if defined(_WIN32) /*[*/ fd = win_mkstemp(&temp_name, P_HTML); #else /*][*/ temp_name = NewString("/tmp/x3hXXXXXX"); fd = mkstemp(temp_name); #endif /*]*/ if (fd < 0) { rv = httpd_dyn_error(dhandle, 400, "Internal error (open)"); unlink(temp_name); Free(temp_name); *status = rv; return false; } f = fdopen(fd, "w+"); if (f == NULL) { rv = httpd_dyn_error(dhandle, 400, "Internal error (fdopen)"); close(fd); unlink(temp_name); Free(temp_name); *status = rv; return false; } /* Write the screen to it in HTML. */ switch (fprint_screen(f, P_HTML, FPS_NO_HEADER, NULL, NULL)) { case FPS_STATUS_SUCCESS: case FPS_STATUS_SUCCESS_WRITTEN: break; case FPS_STATUS_ERROR: case FPS_STATUS_CANCEL: rv = httpd_dyn_error(dhandle, 400, "Internal error (fprint_screen)"); fclose(f); unlink(temp_name); Free(temp_name); *status = rv; return false; } /* Read it back into a varbuf_t. */ fflush(f); rewind(f); vb_init(image); while (fgets(buf, sizeof(buf), f) != NULL) { vb_appends(image, buf); } /* Dispose of the file. */ fclose(f); unlink(temp_name); Free(temp_name); /* Success. */ return true; } /** * Callback for the screen image dynamic node. * * @param[in] uri URI * @param[in] dhandle Session handle * * @return httpd_status_t */ static httpd_status_t hn_screen_image(const char *uri, void *dhandle) { httpd_status_t rv; varbuf_t r; /* Get the image. */ if (hn_image(dhandle, &r, &rv)) { /* Success: Write the response. */ rv = httpd_dyn_complete(dhandle, "\n\ 3270 Screen Image\n\ \n\ \n\ %.*s\n", (int)vb_len(&r), vb_buf(&r)); vb_free(&r); } return rv; } /* The tiny HTML form on the interactive page. */ #define CMD_FORM \ "
    \n\ Action and parameters:
    \n\ \n\ \n\
    \n" /** * Completion callback for the interactive form. * * @param[in] dhandle daemon handle * @param[in] cbs completion status * @param[in] buf data buffer * @param[in] len length of data buffer * @param[in] sl_buf status-line buffer * @param[in] sl_len length of status-line buffer */ static void dyn_form_complete(void *dhandle, sendto_cbs_t cbs, const char *buf, size_t len, const char *sl_buf, size_t sl_len) { varbuf_t r; httpd_status_t rv = HS_CONTINUE; switch (cbs) { case SC_SUCCESS: if (hn_image(dhandle, &r, &rv)) { if (len) { rv = httpd_dyn_complete(dhandle, "\n\ Interactive Form\n\ \n\ \n" CMD_FORM "
    \n\ %s\n\

    Status

    \n\
    %.*s
    \n\

    Result

    \n\
    %.*s
    ", vb_buf(&r), sl_len, sl_buf, len, buf); } else { rv = httpd_dyn_complete(dhandle, "\n\ Interactive Form\n\ \n\ \n" CMD_FORM "
    \n\ %s\n\

    Status

    \n\
    %.*s
    \n\

    Result

    \n\ (none)", vb_buf(&r), sl_len, sl_buf); } vb_free(&r); } break; case SC_USER_ERROR: rv = httpd_dyn_error(dhandle, 400, "%.*s", len, buf); break; case SC_SYSTEM_ERROR: rv = httpd_dyn_error(dhandle, 500, "%.*s", len, buf); break; } hio_async_done(dhandle, rv); } /** * Callback for the interactive form dynamic node. * * @param[in] uri URI * @param[in] dhandle Session handle * * @return httpd_status_t */ static httpd_status_t hn_interact(const char *uri, void *dhandle) { const char *action; httpd_status_t rv; varbuf_t r; /* If the specified an action, execute it. */ action = httpd_fetch_query(dhandle, "action"); if (action && *action) { switch (hio_to3270(action, dyn_form_complete, dhandle, CT_TEXT)) { case SENDTO_COMPLETE: return HS_SUCCESS_OPEN; /* not strictly accurate */ case SENDTO_PENDING: return HS_PENDING; case SENDTO_INVALID: return httpd_dyn_error(dhandle, 400, "Invalid 3270 action.\n"); default: case SENDTO_FAILURE: return httpd_dyn_error(dhandle, 500, "Processing error.\n"); } } /* Otherwise, display the empty form. */ if (!hn_image(dhandle, &r, &rv)) { return rv; } rv = httpd_dyn_complete(dhandle, "\n\ Interactive Form\n\ \n\ \n" CMD_FORM "
    \n\ %s\n", vb_buf(&r)); vb_free(&r); return rv; } /** * Completion callback for the 3270 text command node (/3270/rest/text). * * @param[in] dhandle Session handle * @param[in] cbs Request status * @param[in] buf Result / explanatory text buffer * @param[in] len Result / explanatory text buffer length * @param[in] sl_buf Status line buffer (ignored) * @param[in] sl_len Status line length (ignored) */ static void rest_dyn_text_complete(void *dhandle, sendto_cbs_t cbs, const char *buf, size_t len, const char *sl_buf, size_t sl_len) { httpd_status_t rv = HS_CONTINUE; switch (cbs) { case SC_SUCCESS: rv = httpd_dyn_complete(dhandle, "%.*s", len, buf); break; case SC_USER_ERROR: rv = httpd_dyn_error(dhandle, 400, "%.*s", len, buf); break; case SC_SYSTEM_ERROR: rv = httpd_dyn_error(dhandle, 400, "%.*s", len, buf); break; } hio_async_done(dhandle, rv); } /** * Callback for the REST API plain-text nonterminal dynamic node * (/3270/rest/html). * * @param[in] url URL fragment * @param[in] dhandle daemon handle * * @return httpd_status_t */ static httpd_status_t rest_text_dyn(const char *url, void *dhandle) { if (!*url) { return httpd_dyn_error(dhandle, 400, "Missing 3270 action.\n"); } switch (hio_to3270(url, rest_dyn_text_complete, dhandle, CT_TEXT)) { case SENDTO_COMPLETE: return HS_SUCCESS_OPEN; /* not strictly accurate */ case SENDTO_PENDING: return HS_PENDING; case SENDTO_INVALID: return httpd_dyn_error(dhandle, 400, "Invalid 3270 action.\n"); default: case SENDTO_FAILURE: return httpd_dyn_error(dhandle, 500, "Processing error.\n"); } } /** * Completion callback for the 3270 text command node (/3270/rest/stext). * * @param[in] dhandle daemon handle * @param[in] cbs completion status * @param[in] buf data buffer * @param[in] len length of data buffer * @param[in] sl_buf status-line buffer * @param[in] sl_len length of status-line buffer */ static void rest_dyn_status_text_complete(void *dhandle, sendto_cbs_t cbs, const char *buf, size_t len, const char *sl_buf, size_t sl_len) { httpd_status_t rv = HS_CONTINUE; switch (cbs) { case SC_SUCCESS: rv = httpd_dyn_complete(dhandle, "%.*s\n%.*s", sl_len, sl_buf, len, buf); break; case SC_USER_ERROR: rv = httpd_dyn_error(dhandle, 400, "%.*s", len, buf); break; case SC_SYSTEM_ERROR: rv = httpd_dyn_error(dhandle, 500, "%.*s", len, buf); break; } hio_async_done(dhandle, rv); } /** * Callback for the REST API plain-text plus status nonterminal dynamic node * (/3270/rest/stext). * * @param[in] url URL fragment * @param[in] dhandle daemon handle * * @return httpd_status_t */ static httpd_status_t rest_status_text_dyn(const char *url, void *dhandle) { if (!*url) { return httpd_dyn_error(dhandle, 400, "Missing 3270 action.\n"); } switch (hio_to3270(url, rest_dyn_status_text_complete, dhandle, CT_TEXT)) { case SENDTO_COMPLETE: return HS_SUCCESS_OPEN; /* not strictly accurate */ case SENDTO_PENDING: return HS_PENDING; case SENDTO_INVALID: return httpd_dyn_error(dhandle, 400, "Invalid 3270 action.\n"); default: case SENDTO_FAILURE: return httpd_dyn_error(dhandle, 500, "Processing error.\n"); } } /** * Completion callback for the 3270 html command node (/3270/rest/html). * * @param[in] dhandle daemon handle * @param[in] cbs completion status * @param[in] buf data buffer * @param[in] len length of data buffer * @param[in] sl_buf status-line buffer * @param[in] sl_len length of status-line buffer */ static void rest_dyn_html_complete(void *dhandle, sendto_cbs_t cbs, const char *buf, size_t len, const char *sl_buf, size_t sl_len) { httpd_status_t rv = HS_CONTINUE; switch (cbs) { case SC_SUCCESS: if (len) { rv = httpd_dyn_complete(dhandle, "\n\ Success\n\ \n\ \n\

    Success

    \n\

    Status

    \n\
    %.*s
    \n\

    Result

    \n\
    %.*s
    ", sl_len, sl_buf, len, buf); } else { rv = httpd_dyn_complete(dhandle, "\n\ Success\n\ \n\ \n\

    Success

    \n\

    Status

    \n\
    %.*s
    \n\

    Result

    \n\ (none)", sl_len, sl_buf); } break; case SC_USER_ERROR: rv = httpd_dyn_error(dhandle, 400, "%.*s", len, buf); break; case SC_SYSTEM_ERROR: rv = httpd_dyn_error(dhandle, 500, "%.*s", len, buf); break; } hio_async_done(dhandle, rv); } /** * Callback for the REST API HTML nonterminal dynamic node (/3270/rest/html). * * @param[in] url URL fragment * @param[in] dhandle daemon handle * * @return httpd_status_t */ static httpd_status_t rest_html_dyn(const char *url, void *dhandle) { if (!*url) { return httpd_dyn_error(dhandle, 400, "Missing 3270 action.\n"); } switch (hio_to3270(url, rest_dyn_html_complete, dhandle, CT_HTML)) { case SENDTO_COMPLETE: return HS_SUCCESS_OPEN; /* not strictly accurate */ case SENDTO_PENDING: return HS_PENDING; case SENDTO_INVALID: return httpd_dyn_error(dhandle, 400, "Invalid 3270 action.\n"); default: case SENDTO_FAILURE: return httpd_dyn_error(dhandle, 500, "Processing error.\n"); } } /** * Callback for the REST API JSON nonterminal dynamic node (/3270/rest/json). * * @param[in] url URL fragment * @param[in] dhandle daemon handle * * @return httpd_status_t */ static httpd_status_t rest_json_dyn(const char *url, void *dhandle) { httpd_status_t rv; rv = httpd_dyn_error(dhandle, 501, "JSON support coming soon.\n"); return rv; } /** * Initialize the HTTP object hierarchy. */ void httpd_objects_init(void) { void *nhandle; (void) httpd_register_dir("/3270", "Emulator state"); (void) httpd_register_dyn_term("/3270/screen.html", "Screen image", CT_HTML, "text/html; charset=utf-8", HF_TRAILER, hn_screen_image); (void) httpd_register_dyn_term("/3270/interact.html", "Interactive form", CT_HTML, "text/html; charset=utf-8", HF_TRAILER, hn_interact); (void) httpd_register_dir("/3270/rest", "REST interface"); (void) httpd_register_fixed_binary("/favicon.ico", "Browser icon", CT_BINARY, "image/vnd.microsoft.icon", HF_HIDDEN, favicon, favicon_size); nhandle = httpd_register_dyn_nonterm("/3270/rest/text", "REST plain text interface", CT_TEXT, "text/plain; charset=utf-8", HF_NONE, rest_text_dyn); httpd_set_alias(nhandle, "text/Query()"); nhandle = httpd_register_dyn_nonterm("/3270/rest/stext", "REST plain text interface with status line", CT_TEXT, "text/plain; charset=utf-8", HF_NONE, rest_status_text_dyn); httpd_set_alias(nhandle, "stext/Query()"); nhandle = httpd_register_dyn_nonterm("/3270/rest/html", "REST HTML interface", CT_HTML, "text/html; charset=utf-8", HF_TRAILER, rest_html_dyn); httpd_set_alias(nhandle, "html/Query()"); (void) httpd_register_dyn_nonterm("/3270/rest/json", "REST JSON interface", CT_TEXT, "text/plain; charset=utf-8", HF_NONE, rest_json_dyn); } suite3270-3.6/Common/idle.c0000664000076500007650000001464213221577163013514 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * idle.c * This module handles the idle command. */ #include "globals.h" #include #include "appres.h" #if defined(_WIN32) /*[*/ # include "unicodec.h" /* needed for ft.h */ #endif /*]*/ #include "ft.h" #include "host.h" #include "idle.h" #include "macros.h" #include "popups.h" #include "resources.h" #include "trace.h" #include "utils.h" /* Macros. */ #define MSEC_PER_SEC 1000L #define IDLE_SEC 1L #define IDLE_MIN 60L #define IDLE_HR (60L * 60L) #define IDLE_MS (7L * IDLE_MIN * MSEC_PER_SEC) /* Globals. */ bool idle_changed = false; char *idle_command = NULL; char *idle_timeout_string = NULL; enum idle_enum idle_user_enabled = IDLE_DISABLED; /* Statics. */ static bool idle_enabled = false; /* validated and user-enabled */ static unsigned long idle_n = 0L; static unsigned long idle_multiplier = IDLE_SEC; static ioid_t idle_id; static unsigned long idle_ms; static bool idle_randomize = false; static bool idle_ticking = false; static void idle_in3270(bool in3270); /** * Idle module registration. */ void idle_register(void) { /* Register for state changes. */ register_schange(ST_3270_MODE, idle_in3270); register_schange(ST_CONNECT, idle_in3270); } /* Initialization. */ void idle_init(void) { char *cmd, *tmo; /* Get values from resources. */ cmd = appres.idle_command; idle_command = cmd? NewString(cmd): NULL; tmo = appres.idle_timeout; idle_timeout_string = tmo? NewString(tmo): NULL; if (appres.idle_command_enabled) { idle_user_enabled = IDLE_PERM; } else { idle_user_enabled = IDLE_DISABLED; } if (idle_user_enabled && idle_command != NULL && process_idle_timeout_value(idle_timeout_string)) { ; } /* Seed the random number generator (we seem to be the only user). */ #if defined(_WIN32) /*[*/ srand((unsigned int)time(NULL)); #else /*][*/ srandom(time(NULL)); #endif /*]*/ } /* * Process a timeout value: or ~?[0-9]+[HhMmSs] * Returns true for success, false for failure. * Sets idle_enabled, idle_ms and idle_randomize as side-effects. */ bool process_idle_timeout_value(const char *t) { const char *s = t; char *ptr; if (s == NULL || *s == '\0') { idle_ms = IDLE_MS; idle_randomize = true; idle_enabled = true; return true; } if (*s == '~') { idle_randomize = true; s++; } idle_n = strtoul(s, &ptr, 0); if (idle_n <= 0) goto bad_idle; switch (*ptr) { case 'H': case 'h': idle_multiplier = IDLE_HR; break; case 'M': case 'm': idle_multiplier = IDLE_MIN; break; case 'S': case 's': case '\0': idle_multiplier = IDLE_SEC; break; default: goto bad_idle; } idle_ms = idle_n * idle_multiplier * MSEC_PER_SEC; idle_enabled = true; return true; bad_idle: popup_an_error("Invalid idle timeout value '%s'", t); idle_ms = 0L; idle_randomize = false; return false; } /* Called when a host connects or disconnects. */ static void idle_in3270(bool in3270 _is_unused) { if (IN_3270) { reset_idle_timer(); } else { /* Not in 3270 mode any more, turn off the timeout. */ if (idle_ticking) { RemoveTimeOut(idle_id); idle_ticking = false; } /* If the user didn't want it to be permanent, disable it. */ if (idle_user_enabled != IDLE_PERM) idle_user_enabled = IDLE_DISABLED; } } /* * Idle timeout. */ static void idle_timeout(ioid_t id _is_unused) { vtrace("Idle timeout\n"); idle_ticking = false; if (ft_state != FT_NONE) { /* Should not happen, but just in case. */ vtrace("File transfer in progress, ignoring\n"); return; } else { push_idle(idle_command); } reset_idle_timer(); } /* * Reset (and re-enable) the idle timer. Called when the user presses a key or * clicks with the mouse. */ void reset_idle_timer(void) { if (idle_enabled) { unsigned long idle_ms_now; if (idle_ticking) { RemoveTimeOut(idle_id); idle_ticking = false; } idle_ms_now = idle_ms; if (idle_randomize) { idle_ms_now = idle_ms; #if defined(_WIN32) /*[*/ idle_ms_now -= rand() % (idle_ms / 10L); #else /*][*/ idle_ms_now -= random() % (idle_ms / 10L); #endif /*]*/ } #if defined(DEBUG_IDLE_TIMEOUT) /*[*/ vtrace("Setting idle timeout to %lu\n", idle_ms_now); #endif /*]*/ idle_id = AddTimeOut(idle_ms_now, idle_timeout); idle_ticking = true; } } /* * Cancel the idle timer. This is called when there is an error in * processing the idle command. */ void cancel_idle_timer(void) { if (idle_ticking) { RemoveTimeOut(idle_id); idle_ticking = false; } idle_enabled = false; } /* * Stop the idle timer when a file transfer starts. */ void idle_ft_start(void) { if (idle_ticking) { RemoveTimeOut(idle_id); idle_ticking = false; } } /* * Resume the idle timer when a file transfer completes. */ void idle_ft_complete(void) { if (idle_enabled) { reset_idle_timer(); } } char * get_idle_command(void) { return idle_command; } char * get_idle_timeout(void) { return idle_timeout_string; } suite3270-3.6/Common/idle_stubs.c0000664000076500007650000000330313221577163014724 0ustar pdmpdm/* * Copyright (c) 2002-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * idle_stubs.c * Stubs for idle.c. */ #include "globals.h" #include "idle.h" void cancel_idle_timer(void) { } void idle_init(void) { } void reset_idle_timer(void) { } suite3270-3.6/Common/indent_s.c0000664000076500007650000000375213221577163014402 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * indent_s.c * String indent function. */ #include "globals.h" #include "indent_s.h" #include "varbuf.h" /* Typedefs */ /* Statics */ /* Globals */ /* Indent a string for display. */ char * indent_s(const char *s) { varbuf_t v; char *newline; vb_init(&v); while ((newline = strchr(s, '\n')) != NULL) { vb_appendf(&v, " %.*s", (int)(newline + 1 - s), s); s = newline + 1; } vb_appendf(&v, " %s", s); return vb_consume(&v); } suite3270-3.6/Common/kybd.c0000664000076500007650000026116213221577163013531 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * kybd.c * This module handles the keyboard for the 3270 emulator. */ #include "globals.h" #include #include "3270ds.h" #include "appres.h" #include "ctlr.h" #include "resources.h" #include "screen.h" #include "actions.h" #include "apl.h" #include "charset.h" #include "ctlrc.h" #include "unicodec.h" #include "ft.h" #include "host.h" #include "idle.h" #include "kybd.h" #include "latin1.h" #include "lazya.h" #include "linemode.h" #include "macros.h" #include "nvt.h" #include "popups.h" #include "print_screen.h" #include "product.h" #include "screen.h" #include "scroll.h" #include "split_host.h" #include "status.h" #include "telnet.h" #include "toggles.h" #include "trace.h" #include "utf8.h" #include "utils.h" #include "varbuf.h" /*#define KYBDLOCK_TRACE 1*/ #define MarginedPaste() (toggled(MARGINED_PASTE) || toggled(OVERLAY_PASTE)) /* Statics */ static enum { NONE, COMPOSE, FIRST } composing = NONE; static unsigned char pf_xlate[] = { AID_PF1, AID_PF2, AID_PF3, AID_PF4, AID_PF5, AID_PF6, AID_PF7, AID_PF8, AID_PF9, AID_PF10, AID_PF11, AID_PF12, AID_PF13, AID_PF14, AID_PF15, AID_PF16, AID_PF17, AID_PF18, AID_PF19, AID_PF20, AID_PF21, AID_PF22, AID_PF23, AID_PF24 }; static unsigned char pa_xlate[] = { AID_PA1, AID_PA2, AID_PA3 }; #define PF_SZ (sizeof(pf_xlate)/sizeof(pf_xlate[0])) #define PA_SZ (sizeof(pa_xlate)/sizeof(pa_xlate[0])) static ioid_t unlock_id = NULL_IOID; static time_t unlock_delay_time; static bool key_Character(unsigned ebc, bool with_ge, bool pasting); static bool flush_ta(void); static void key_AID(unsigned char aid_code); static void kybdlock_set(unsigned int bits, const char *cause); static ks_t my_string_to_key(const char *s, enum keytype *keytypep, ucs4_t *ucs4); static bool key_WCharacter(unsigned char code[]); static bool insert = false; /* insert mode */ static bool reverse = false; /* reverse-input mode */ /* Globals */ unsigned int kybdlock = KL_NOT_CONNECTED; unsigned char aid = AID_NO; /* current attention ID */ /* Composite key mappings. */ struct akey { ks_t key; enum keytype keytype; }; static struct akey cc_first; static struct composite { struct akey k1, k2; struct akey translation; } *composites = NULL; static int n_composites = 0; #define ak_eq(k1, k2) (((k1).key == (k2).key) && \ ((k1).keytype == (k2).keytype)) typedef struct ta { struct ta *next; const char *efn_name; action_t *fn; const char *parm1; const char *parm2; } ta_t; ta_t *ta_head = (struct ta *) NULL; ta_t *ta_tail = (struct ta *) NULL; static char dxl[] = "0123456789abcdef"; #define FROM_HEX(c) (int)(strchr(dxl, tolower((unsigned char)c)) - dxl) #define KYBDLOCK_IS_OERR (kybdlock && !(kybdlock & ~KL_OERR_MASK)) /* Common kybdlock logic for actions that clear overflows */ #define OERR_CLEAR_OR_ENQ(action) do { \ if (kybdlock) { \ if (KYBDLOCK_IS_OERR) { \ kybdlock_clr(KL_OERR_MASK, action); \ status_reset(); \ } else { \ enq_ta(action, NULL, NULL); \ return true; \ } \ } \ } while(false) static action_t Attn_action; static action_t BackSpace_action; static action_t BackTab_action; static action_t Attn_action; static action_t BackSpace_action; static action_t BackTab_action; static action_t CircumNot_action; static action_t Clear_action; static action_t Compose_action; static action_t CursorSelect_action; static action_t Delete_action; static action_t DeleteField_action; static action_t DeleteWord_action; static action_t Dup_action; static action_t Enter_action; static action_t Erase_action; static action_t EraseEOF_action; static action_t EraseInput_action; static action_t FieldEnd_action; static action_t FieldMark_action; static action_t Flip_action; static action_t HexString_action; static action_t Home_action; static action_t Insert_action; static action_t Interrupt_action; static action_t Key_action; static action_t Left2_action; static action_t MonoCase_action; static action_t MoveCursor_action; static action_t Newline_action; static action_t NextWord_action; static action_t PA_action; static action_t PF_action; static action_t PreviousWord_action; static action_t Reset_action; static action_t Right2_action; static action_t String_action; static action_t SysReq_action; static action_t Tab_action; static action_t ToggleInsert_action; static action_t ToggleReverse_action; static action_table_t kybd_actions[] = { { "Attn", Attn_action, ACTION_KE }, { "BackSpace", BackSpace_action, ACTION_KE }, { "BackTab", BackTab_action, ACTION_KE }, { "CircumNot", CircumNot_action, ACTION_KE }, { "Clear", Clear_action, ACTION_KE }, { "CursorSelect", CursorSelect_action, ACTION_KE }, { "Delete", Delete_action, ACTION_KE }, { "DeleteField", DeleteField_action, ACTION_KE }, { "DeleteWord", DeleteWord_action, ACTION_KE }, { "Down", Down_action, ACTION_KE }, { "Dup", Dup_action, ACTION_KE }, { "Enter", Enter_action, ACTION_KE }, { "Erase", Erase_action, ACTION_KE }, { "EraseEOF", EraseEOF_action, ACTION_KE }, { "EraseInput", EraseInput_action, ACTION_KE }, { "FieldEnd", FieldEnd_action, ACTION_KE }, { "FieldMark", FieldMark_action, ACTION_KE }, { "Flip", Flip_action, ACTION_KE }, { "HexString", HexString_action, ACTION_KE }, { "Home", Home_action, ACTION_KE }, { "Insert", Insert_action, ACTION_KE }, { "Interrupt", Interrupt_action, ACTION_KE }, { "Key", Key_action, ACTION_KE }, { "Left2", Left2_action, ACTION_KE }, { "Left", Left_action, ACTION_KE }, { "MonoCase", MonoCase_action, ACTION_KE }, { "MoveCursor", MoveCursor_action, ACTION_KE }, { "Newline", Newline_action, ACTION_KE }, { "NextWord", NextWord_action, ACTION_KE }, { "PA", PA_action, ACTION_KE }, { "PF", PF_action, ACTION_KE }, { "PreviousWord", PreviousWord_action, ACTION_KE }, { "Reset", Reset_action, ACTION_KE }, { "Right2", Right2_action, ACTION_KE }, { "Right", Right_action, ACTION_KE }, { "String", String_action, ACTION_KE }, { "SysReq", SysReq_action, ACTION_KE }, { "Tab", Tab_action, ACTION_KE }, { "ToggleInsert", ToggleInsert_action, ACTION_KE }, { "ToggleReverse", ToggleReverse_action, ACTION_KE }, { "Up", Up_action, ACTION_KE } }; static action_table_t kybd_dactions[] = { { "Compose", Compose_action, ACTION_KE } }; /* * Put a function or action on the typeahead queue. */ static void enq_xta(const char *name, action_t *fn, const char *parm1, const char *parm2) { ta_t *ta; /* If no connection, forget it. */ if (!CONNECTED) { vtrace(" dropped (not connected)\n"); return; } /* If operator error, complain and drop it. */ if (kybdlock & KL_OERR_MASK) { ring_bell(); vtrace(" dropped (operator error)\n"); return; } /* If scroll lock, complain and drop it. */ if (kybdlock & KL_SCROLLED) { ring_bell(); vtrace(" dropped (scrolled)\n"); return; } /* If typeahead disabled, complain and drop it. */ if (!appres.typeahead) { vtrace(" dropped (no typeahead)\n"); return; } ta = (ta_t *)Malloc(sizeof(*ta)); ta->next = NULL; ta->efn_name = name; ta->fn = fn; ta->parm1 = ta->parm2 = NULL; if (parm1) { ta->parm1 = NewString(parm1); if (parm2) ta->parm2 = NewString(parm2); } if (ta_head) ta_tail->next = ta; else { ta_head = ta; status_typeahead(true); } ta_tail = ta; vtrace(" action queued (kybdlock 0x%x)\n", kybdlock); } /* * Put an action on the typeahead queue. */ static void enq_ta(const char *efn_name, const char *parm1, const char *parm2) { enq_xta(efn_name, NULL, parm1, parm2); } /* * Put a function on the typeahead queue. */ static void enq_fta(action_t *fn, const char *parm1, const char *parm2) { enq_xta(NULL, fn, parm1, parm2); } /* * Execute an action from the typeahead queue. */ bool run_ta(void) { ta_t *ta; if (kybdlock || (ta = ta_head) == NULL) { return false; } if ((ta_head = ta->next) == NULL) { ta_tail = NULL; status_typeahead(false); } if (ta->efn_name) { run_action(ta->efn_name, IA_TYPEAHEAD, ta->parm1, ta->parm2); } else { unsigned argc = 0; const char *argv[2]; if (ta->parm1) { argv[argc++] = ta->parm1; if (ta->parm2) { argv[argc++] = ta->parm2; } } (void) (*ta->fn)(IA_TYPEAHEAD, argc, argv); } Free((char *)ta->parm1); Free((char *)ta->parm2); Free(ta); return true; } /* * Flush the typeahead queue. * Returns whether or not anything was flushed. */ static bool flush_ta(void) { ta_t *ta, *next; bool any = false; for (ta = ta_head; ta != NULL; ta = next) { Free((char *)ta->parm1); Free((char *)ta->parm2); next = ta->next; Free(ta); any = true; } ta_head = ta_tail = NULL; status_typeahead(false); return any; } /* Decode keyboard lock bits. */ static char * kybdlock_decode(char *how, unsigned int bits) { static char *rs = NULL; varbuf_t r; char *space = ""; if (bits == (unsigned int)-1) { return "all"; } vb_init(&r); if (bits & KL_OERR_MASK) { vb_appendf(&r, "%sOERR(", how); switch(bits & KL_OERR_MASK) { case KL_OERR_PROTECTED: vb_appends(&r, "PROTECTED"); break; case KL_OERR_NUMERIC: vb_appends(&r, "NUMERIC"); break; case KL_OERR_OVERFLOW: vb_appends(&r, "OVERFLOW"); break; case KL_OERR_DBCS: vb_appends(&r, "DBCS"); break; default: vb_appendf(&r, "?%d", bits & KL_OERR_MASK); break; } vb_appendf(&r, ")"); space = " "; } if (bits & KL_NOT_CONNECTED) { vb_appendf(&r, "%s%sNOT_CONNECTED", space, how); space = " "; } if (bits & KL_AWAITING_FIRST) { vb_appendf(&r, "%s%sAWAITING_FIRST", space, how); space = " "; } if (bits & KL_OIA_TWAIT) { vb_appendf(&r, "%s%sOIA_TWAIT", space, how); space = " "; } if (bits & KL_OIA_LOCKED) { vb_appendf(&r, "%s%sOIA_LOCKED", space, how); space = " "; } if (bits & KL_DEFERRED_UNLOCK) { vb_appendf(&r, "%s%sDEFERRED_UNLOCK", space, how); space = " "; } if (bits & KL_ENTER_INHIBIT) { vb_appendf(&r, "%s%sENTER_INHIBIT", space, how); space = " "; } if (bits & KL_SCROLLED) { vb_appendf(&r, "%s%sSCROLLED", space, how); space = " "; } if (bits & KL_OIA_MINUS) { vb_appendf(&r, "%s%sOIA_MINUS", space, how); space = " "; } Replace(rs, vb_consume(&r)); return rs; } /* Set bits in the keyboard lock. */ static void kybdlock_set(unsigned int bits, const char *cause _is_unused) { unsigned int n; vtrace("Keyboard lock(%s) %s\n", cause, kybdlock_decode("+", bits)); n = kybdlock | bits; if (n != kybdlock) { #if defined(KYBDLOCK_TRACE) /*[*/ vtrace(" %s: kybdlock |= 0x%04x, 0x%04x -> 0x%04x\n", cause, bits, kybdlock, n); #endif /*]*/ if ((kybdlock ^ bits) & KL_DEFERRED_UNLOCK) { /* Turned on deferred unlock. */ unlock_delay_time = time(NULL); } kybdlock = n; } } /* Clear bits in the keyboard lock. */ void kybdlock_clr(unsigned int bits, const char *cause _is_unused) { unsigned int n; if (kybdlock & bits) vtrace("Keyboard unlock(%s) %s\n", cause, kybdlock_decode("-", kybdlock & bits)); n = kybdlock & ~bits; if (n != kybdlock) { #if defined(KYBDLOCK_TRACE) /*[*/ vtrace(" %s: kybdlock &= ~0x%04x, 0x%04x -> 0x%04x\n", cause, bits, kybdlock, n); #endif /*]*/ if ((kybdlock ^ n) & KL_DEFERRED_UNLOCK) { /* Turned off deferred unlock. */ unlock_delay_time = 0; } kybdlock = n; } } /* * Set or clear enter-inhibit mode. */ void kybd_inhibit(bool inhibit) { if (inhibit) { kybdlock_set(KL_ENTER_INHIBIT, "kybd_inhibit"); if (kybdlock == KL_ENTER_INHIBIT) status_reset(); } else { kybdlock_clr(KL_ENTER_INHIBIT, "kybd_inhibit"); if (!kybdlock) status_reset(); } } /* * Called when a host connects or disconnects. */ static void kybd_connect(bool connected) { if ((kybdlock & KL_DEFERRED_UNLOCK) && unlock_id) { RemoveTimeOut(unlock_id); unlock_id = NULL_IOID; } kybdlock_clr(-1, "kybd_connect"); if (connected) { if (!appres.nvt_mode && !HOST_FLAG(ANSI_HOST)) { /* Wait for any output or a WCC(restore) from the host */ kybdlock_set(KL_AWAITING_FIRST, "kybd_connect"); } } else { kybdlock_set(KL_NOT_CONNECTED, "kybd_connect"); (void) flush_ta(); } } /* * Called when we switch between 3270 and NVT modes. */ static void kybd_in3270(bool in3270 _is_unused) { if ((kybdlock & KL_DEFERRED_UNLOCK) && unlock_id != NULL_IOID) { RemoveTimeOut(unlock_id); unlock_id = NULL_IOID; } switch ((int)cstate) { case CONNECTED_UNBOUND: /* * We just processed and UNBIND from the host. We are waiting * for a BIND, or data to switch us to 3270, NVT or SSCP-LU * mode. */ kybdlock_set(KL_AWAITING_FIRST, "kybd_in3270"); break; case CONNECTED_NVT: case CONNECTED_E_NVT: case CONNECTED_SSCP: /* * We just transitioned to NVT, TN3270E NVT or TN3270E SSCP-LU * mode. Remove all lock bits. */ kybdlock_clr(-1, "kybd_in3270"); break; case CONNECTED_TN3270E: /* * We are in TN3270E 3270 mode. If so configured and we were * explicitly bound, then the keyboard must be unlocked now. * If not, we are implicitly in 3270 mode because the host did * not negotiate BIND notifications, and we should continue to * wait for a Write command before unlocking the keyboard. */ if (appres.bind_unlock && net_bound()) { kybdlock_clr(-1, "kybd_in3270"); } else { /* * Clear everything but AWAITING_FIRST and LOCKED. * The former was set by this function when we were * unbound. The latter may be a leftover from the user * initiating a host switch by sending a command with an * AID. If this is a non-bind-unlock host (bind_unlock is * clear, the default), we want to preserve that until the * host sends a Write with a Keyboard Restore in it. */ kybdlock_clr(~(KL_AWAITING_FIRST | KL_OIA_LOCKED), "kybd_in3270"); } break; default: /* * We just transitioned into or out of 3270 mode. * Remove all lock bits except AWAITING_FIRST. */ kybdlock_clr(~KL_AWAITING_FIRST, "kybd_in3270"); break; } /* There might be a macro pending. */ if (CONNECTED) ps_process(); } /* * Keyboard module registration. */ void kybd_register(void) { static toggle_register_t toggles[] = { { BLANK_FILL, NULL, 0 } }; /* Register interest in connect and disconnect events. */ register_schange_ordered(ST_CONNECT, kybd_connect, 1000); register_schange_ordered(ST_3270_MODE, kybd_in3270, 1000); /* Register the actions. */ register_actions(kybd_actions, array_count(kybd_actions)); /* Register the interactive actions. */ if (product_has_display()) { register_actions(kybd_dactions, array_count(kybd_dactions)); } /* Register the toggles. */ register_toggles(toggles, array_count(toggles)); } /* * Toggle insert mode. */ static void insert_mode(bool on) { insert = on; status_insert_mode(on); } /* * Toggle reverse mode. */ static void reverse_mode(bool on) { if (!dbcs) { reverse = on; status_reverse_mode(on); } } /* * Lock the keyboard because of an operator error. */ static void operator_error(int error_type) { if (sms_redirect()) popup_an_error("Keyboard locked"); if (appres.oerr_lock || sms_redirect()) { status_oerr(error_type); mcursor_locked(); kybdlock_set((unsigned int)error_type, "operator_error"); (void) flush_ta(); } else { ring_bell(); } } /* * Handle an AID (Attention IDentifier) key. This is the common stuff that * gets executed for all AID keys (PFs, PAs, Clear and etc). */ static void key_AID(unsigned char aid_code) { if (IN_NVT) { register unsigned i; if (aid_code == AID_ENTER) { net_sendc('\r'); return; } for (i = 0; i < PF_SZ; i++) if (aid_code == pf_xlate[i]) { nvt_send_pf(i+1); return; } for (i = 0; i < PA_SZ; i++) if (aid_code == pa_xlate[i]) { nvt_send_pa(i+1); return; } return; } if (IN_SSCP) { if (kybdlock & KL_OIA_MINUS) return; switch (aid_code) { case AID_CLEAR: /* Handled locally. */ break; case AID_ENTER: /* * Act as if the host had written our input, and * send it as a Read Modified. */ buffer_addr = cursor_addr; aid = aid_code; ctlr_read_modified(aid, false); status_ctlr_done(); break; default: /* Everything else is invalid in SSCP-LU mode. */ status_minus(); kybdlock_set(KL_OIA_MINUS, "key_AID"); return; } return; } status_twait(); mcursor_waiting(); insert_mode(false); kybdlock_set(KL_OIA_TWAIT | KL_OIA_LOCKED, "key_AID"); aid = aid_code; ctlr_read_modified(aid, false); ticking_start(false); status_ctlr_done(); } static bool PF_action(ia_t ia, unsigned argc, const char **argv) { unsigned k; action_debug("PF", ia, argc, argv); if (check_argc("PF", argc, 1, 1) < 0) { return false; } k = atoi(argv[0]); if (k < 1 || k > PF_SZ) { popup_an_error("PF: Invalid argument '%s'", argv[0]); cancel_if_idle_command(); return false; } reset_idle_timer(); if (kybdlock & KL_OIA_MINUS) { return true; } if (kybdlock) { enq_ta("PF", argv[0], NULL); } else { key_AID(pf_xlate[k-1]); } return true; } static bool PA_action(ia_t ia, unsigned argc, const char **argv) { unsigned k; action_debug("PA", ia, argc, argv); if (check_argc("PA", argc, 1, 1) < 0) { return false; } k = atoi(argv[0]); if (k < 1 || k > PA_SZ) { popup_an_error("PA: Invalid argument '%s'", argv[0]); cancel_if_idle_command(); return false; } reset_idle_timer(); if (kybdlock & KL_OIA_MINUS) { return true; } if (kybdlock) { enq_ta("PA", argv[0], NULL); } else { key_AID(pa_xlate[k-1]); } return true; } /* * ATTN key, per RFC 2355. Sends IP, regardless. */ static bool Attn_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Attn", ia, argc, argv); if (check_argc("Attn", argc, 0, 0) < 0) { return false; } if (!IN_3270) { return false; } reset_idle_timer(); if (IN_E) { if (net_bound()) { net_interrupt(); } else { status_minus(); kybdlock_set(KL_OIA_MINUS, "Attn"); } } else { net_break(); } return true; } /* * IAC IP, which works for 5250 System Request and interrupts the program * on an AS/400, even when the keyboard is locked. * * This is now the same as the Attn action. */ static bool Interrupt_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Interrupt", ia, argc, argv); if (check_argc("Interrupt", argc, 0, 0) < 0) { return false; } if (!IN_3270) { return false; } reset_idle_timer(); net_interrupt(); return true; } /* * Prepare for an insert of 'count' bytes. * Returns true if the insert is legal, false otherwise. */ static bool ins_prep(int faddr, int baddr, int count, bool *no_room) { int next_faddr; int xaddr; int need; int ntb; int tb_start = -1; int copy_len; *no_room = false; /* Find the end of the field. */ if (faddr == -1) { /* Unformatted. Use the end of the line. */ next_faddr = (((baddr / COLS) + 1) * COLS) % (ROWS*COLS); } else { next_faddr = faddr; INC_BA(next_faddr); while (next_faddr != faddr && !ea_buf[next_faddr].fa) { INC_BA(next_faddr); } } /* Are there enough NULLs or trailing blanks available? */ xaddr = baddr; need = count; ntb = 0; while (need && (xaddr != next_faddr)) { if (ea_buf[xaddr].cc == EBC_null) need--; else if (toggled(BLANK_FILL) && ((ea_buf[xaddr].cc == EBC_space) || (ea_buf[xaddr].cc == EBC_underscore))) { if (tb_start == -1) tb_start = xaddr; ntb++; } else { tb_start = -1; ntb = 0; } INC_BA(xaddr); } #if defined(_ST) /*[*/ printf("need %d at %d, tb_start at %d\n", count, baddr, tb_start); #endif /*]*/ if (need - ntb > 0) { if (!reverse) { operator_error(KL_OERR_OVERFLOW); return false; } else { *no_room = true; return true; } } /* * Shift the buffer to the right until we've consumed the available * (and needed) NULLs. */ need = count; xaddr = baddr; while (need && (xaddr != next_faddr)) { int n_nulls = 0; int first_null = -1; while (need && ((ea_buf[xaddr].cc == EBC_null) || (tb_start >= 0 && xaddr >= tb_start))) { need--; n_nulls++; if (first_null == -1) first_null = xaddr; INC_BA(xaddr); } if (n_nulls) { int to; /* Shift right n_nulls worth. */ copy_len = first_null - baddr; if (copy_len < 0) copy_len += ROWS*COLS; to = (baddr + n_nulls) % (ROWS*COLS); #if defined(_ST) /*[*/ printf("found %d NULLs at %d\n", n_nulls, first_null); printf("copying %d from %d to %d\n", copy_len, to, first_null); #endif /*]*/ if (copy_len) ctlr_wrapping_memmove(to, baddr, copy_len); } INC_BA(xaddr); } return true; } /* Flags OR'ed into an EBCDIC code when pushed into the typeahead queue. */ #define GE_WFLAG 0x10000 #define PASTE_WFLAG 0x20000 /* * Callback for enqueued typeahead. The single parameter is an EBCDIC code, * OR'd with the flags above. */ static bool key_Character_wrapper(ia_t ia _is_unused, unsigned argc _is_unused, const char **argv) { unsigned ebc; bool with_ge = false; bool pasting = false; char mb[16]; ucs4_t uc; ebc = atoi(argv[0]); if (ebc & GE_WFLAG) { with_ge = true; ebc &= ~GE_WFLAG; } if (ebc & PASTE_WFLAG) { pasting = true; ebc &= ~PASTE_WFLAG; } ebcdic_to_multibyte_x(ebc, with_ge? CS_GE: CS_BASE, mb, sizeof(mb), EUO_BLANK_UNDEF, &uc); vtrace(" %s -> Key(%s\"%s\")\n", ia_name[(int) ia_cause], with_ge ? "GE " : "", mb); (void) key_Character(ebc, with_ge, pasting); return true; } /* * Handle an ordinary displayable character key. Lots of stuff to handle * insert-mode, protected fields and etc. */ static bool key_Character(unsigned ebc, bool with_ge, bool pasting) { register int baddr, faddr, xaddr; register unsigned char fa; enum dbcs_why why = DBCS_FIELD; bool no_room = false; bool auto_skip = true; reset_idle_timer(); if (kybdlock) { char *codename; codename = lazyaf("%d", ebc | (with_ge ? GE_WFLAG : 0) | (pasting ? PASTE_WFLAG : 0)); enq_fta(key_Character_wrapper, codename, NULL); return false; } baddr = cursor_addr; faddr = find_field_attribute(baddr); fa = get_field_attribute(baddr); if (pasting && toggled(OVERLAY_PASTE)) { auto_skip = false; } if (ea_buf[baddr].fa || FA_IS_PROTECTED(fa)) { if (!auto_skip) { /* * In overlay-paste mode, protected fields cause paste buffer * data to be dropped while moving the cursor right. */ INC_BA(baddr); cursor_move(baddr); return true; } else { operator_error(KL_OERR_PROTECTED); return false; } } if (appres.numeric_lock && FA_IS_NUMERIC(fa) && !((ebc >= EBC_0 && ebc <= EBC_9) || ebc == EBC_minus || ebc == EBC_period)) { operator_error(KL_OERR_NUMERIC); return false; } /* Can't put an SBCS in a DBCS field. */ if (ea_buf[faddr].cs == CS_DBCS) { operator_error(KL_OERR_DBCS); return false; } /* If it's an SI (end of DBCS subfield), move over one position. */ if (ea_buf[baddr].cc == EBC_si) { INC_BA(baddr); if (baddr == faddr) { operator_error(KL_OERR_OVERFLOW); return false; } } /* Add the character. */ if (ea_buf[baddr].cc == EBC_so) { if (insert) { if (!ins_prep(faddr, baddr, 1, &no_room)) return false; } else { bool was_si = false; /* * Overwriting an SO (start of DBCS subfield). * If it's followed by an SI, replace the SO/SI * pair with x/space. If not, replace it and * the following DBCS character with * x/space/SO. */ xaddr = baddr; INC_BA(xaddr); was_si = (ea_buf[xaddr].cc == EBC_si); ctlr_add(xaddr, EBC_space, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_bg(xaddr, 0); if (!was_si) { INC_BA(xaddr); ctlr_add(xaddr, EBC_so, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_bg(xaddr, 0); } } } else switch (ctlr_lookleft_state(baddr, &why)) { case DBCS_RIGHT: DEC_BA(baddr); /* fall through... */ case DBCS_LEFT: if (why == DBCS_ATTRIBUTE) { if (insert) { if (!ins_prep(faddr, baddr, 1, &no_room)) return false; } else { /* * Replace single DBCS char with * x/space. */ xaddr = baddr; INC_BA(xaddr); ctlr_add(xaddr, EBC_space, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_gr(xaddr, 0); } } else { bool was_si; if (insert) { /* * Inserting SBCS into a DBCS subfield. * If this is the first position, we * can just insert one character in * front of the SO. Otherwise, we'll * need room for SI (to end subfield), * the character, and SO (to begin the * subfield again). */ xaddr = baddr; DEC_BA(xaddr); if (ea_buf[xaddr].cc == EBC_so) { DEC_BA(baddr); if (!ins_prep(faddr, baddr, 1, &no_room)) return false; } else { if (!ins_prep(faddr, baddr, 3, &no_room)) return false; xaddr = baddr; ctlr_add(xaddr, EBC_si, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_gr(xaddr, 0); INC_BA(xaddr); INC_BA(baddr); INC_BA(xaddr); ctlr_add(xaddr, EBC_so, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_gr(xaddr, 0); } } else { /* Overwriting part of a subfield. */ xaddr = baddr; ctlr_add(xaddr, EBC_si, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_gr(xaddr, 0); INC_BA(xaddr); INC_BA(baddr); INC_BA(xaddr); was_si = (ea_buf[xaddr].cc == EBC_si); ctlr_add(xaddr, EBC_space, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_gr(xaddr, 0); if (!was_si) { INC_BA(xaddr); ctlr_add(xaddr, EBC_so, CS_BASE); ctlr_add_fg(xaddr, 0); ctlr_add_gr(xaddr, 0); } } } break; default: case DBCS_NONE: if ((reverse || insert) && !ins_prep(faddr, baddr, 1, &no_room)) return false; break; } if (no_room) { do { INC_BA(baddr); } while (ea_buf[baddr].fa); } else { ctlr_add(baddr, (unsigned char)ebc, (unsigned char)(with_ge ? CS_GE : 0)); ctlr_add_fg(baddr, 0); ctlr_add_gr(baddr, 0); if (!reverse) INC_BA(baddr); } /* Replace leading nulls with blanks, if desired. */ if (formatted && toggled(BLANK_FILL)) { register int baddr_fill = baddr; DEC_BA(baddr_fill); while (baddr_fill != faddr) { /* Check for backward line wrap. */ if ((baddr_fill % COLS) == COLS - 1) { bool aborted = true; register int baddr_scan = baddr_fill; /* * Check the field within the preceeding line * for NULLs. */ while (baddr_scan != faddr) { if (ea_buf[baddr_scan].cc != EBC_null) { aborted = false; break; } if (!(baddr_scan % COLS)) break; DEC_BA(baddr_scan); } if (aborted) break; } if (ea_buf[baddr_fill].cc == EBC_null) ctlr_add(baddr_fill, EBC_space, 0); DEC_BA(baddr_fill); } } mdt_set(cursor_addr); /* * Implement auto-skip, and don't land on attribute bytes. * This happens for all pasted data (even DUP), and for all * keyboard-generated data except DUP. */ if (auto_skip && (pasting || (ebc != EBC_dup))) { while (ea_buf[baddr].fa) { if (FA_IS_SKIP(ea_buf[baddr].fa)) baddr = next_unprotected(baddr); else INC_BA(baddr); } cursor_move(baddr); } else { cursor_move(baddr); } (void) ctlr_dbcs_postprocess(); return true; } static bool key_WCharacter_wrapper(ia_t ia _is_unused, unsigned argc _is_unused, const char **argv) { unsigned ebc_wide; unsigned char ebc_pair[2]; ebc_wide = atoi(argv[0]); vtrace(" %s -> Key(X'%04x')\n", ia_name[(int) ia_cause], ebc_wide); ebc_pair[0] = (ebc_wide >> 8) & 0xff; ebc_pair[1] = ebc_wide & 0xff; (void) key_WCharacter(ebc_pair); return true; } /* * Input a DBCS character. * Returns true if a character was stored in the buffer, false otherwise. */ static bool key_WCharacter(unsigned char ebc_pair[]) { int baddr; register unsigned char fa; int faddr; enum dbcs_state d; int xaddr; bool done = false; bool no_si = false; bool no_room = false; reset_idle_timer(); if (kybdlock) { char *codename; codename = lazyaf("%d", (ebc_pair[0] << 8) | ebc_pair[1]); enq_fta(key_WCharacter_wrapper, codename, NULL); return false; } if (!dbcs) { vtrace("DBCS character received when not in DBCS mode, " "ignoring.\n"); return true; } /* In NVT mode? */ if (IN_NVT) { char mb[16]; (void) ebcdic_to_multibyte((ebc_pair[0] << 8) | ebc_pair[1], mb, sizeof(mb)); net_sends(mb); return true; } baddr = cursor_addr; fa = get_field_attribute(baddr); faddr = find_field_attribute(baddr); /* Protected? */ if (ea_buf[baddr].fa || FA_IS_PROTECTED(fa)) { operator_error(KL_OERR_PROTECTED); return false; } /* Numeric? */ if (appres.numeric_lock && FA_IS_NUMERIC(fa)) { operator_error(KL_OERR_NUMERIC); return false; } /* * Figure our what to do based on the DBCS state of the buffer. * Leaves baddr pointing to the next unmodified position. */ retry: switch (d = ctlr_dbcs_state(baddr)) { case DBCS_RIGHT: case DBCS_RIGHT_WRAP: /* Back up one position and process it as a LEFT. */ DEC_BA(baddr); /* fall through... */ case DBCS_LEFT: case DBCS_LEFT_WRAP: /* Overwrite the existing character. */ if (insert) { if (!ins_prep(faddr, baddr, 2, &no_room)) { return false; } } ctlr_add(baddr, ebc_pair[0], ea_buf[baddr].cs); INC_BA(baddr); ctlr_add(baddr, ebc_pair[1], ea_buf[baddr].cs); INC_BA(baddr); done = true; break; case DBCS_SB: /* Back up one position and process it as an SI. */ DEC_BA(baddr); /* fall through... */ case DBCS_SI: /* Extend the subfield to the right. */ if (insert) { if (!ins_prep(faddr, baddr, 2, &no_room)) { return false; } } else { /* Don't overwrite a field attribute or an SO. */ xaddr = baddr; INC_BA(xaddr); /* C1 */ if (ea_buf[xaddr].fa) break; if (ea_buf[xaddr].cc == EBC_so) no_si = true; INC_BA(xaddr); /* SI */ if (ea_buf[xaddr].fa || ea_buf[xaddr].cc == EBC_so) break; } ctlr_add(baddr, ebc_pair[0], ea_buf[baddr].cs); INC_BA(baddr); ctlr_add(baddr, ebc_pair[1], ea_buf[baddr].cs); if (!no_si) { INC_BA(baddr); ctlr_add(baddr, EBC_si, ea_buf[baddr].cs); } done = true; break; case DBCS_DEAD: break; case DBCS_NONE: if (ea_buf[faddr].ic) { bool extend_left = false; /* Is there room? */ if (insert) { if (!ins_prep(faddr, baddr, 4, &no_room)) { return false; } } else { xaddr = baddr; /* baddr, SO */ if (ea_buf[xaddr].cc == EBC_so) { /* * (baddr), where we would have put the * SO, is already an SO. Move to * (baddr+1) and try again. */ #if defined(DBCS_RIGHT_DEBUG) /*[*/ printf("SO in position 0\n"); #endif /*]*/ INC_BA(baddr); goto retry; } INC_BA(xaddr); /* baddr+1, C0 */ if (ea_buf[xaddr].fa) break; if (ea_buf[xaddr].cc == EBC_so) { enum dbcs_state e; /* * (baddr+1), where we would have put * the left side of the DBCS, is a SO. * If there's room, we can extend the * subfield to the left. If not, we're * stuck. */ DEC_BA(xaddr); DEC_BA(xaddr); e = ctlr_dbcs_state(xaddr); if (e == DBCS_NONE || e == DBCS_SB) { extend_left = true; no_si = true; #if defined(DBCS_RIGHT_DEBUG) /*[*/ printf("SO in position 1, " "extend left\n"); #endif /*]*/ } else { /* * Won't actually happen, * because this implies that * the buffer addr at baddr * is an SB. */ #if defined(DBCS_RIGHT_DEBUG) /*[*/ printf("SO in position 1, " "no room on left, " "fail\n"); #endif /*]*/ break; } } INC_BA(xaddr); /* baddr+2, C1 */ if (ea_buf[xaddr].fa) break; if (ea_buf[xaddr].cc == EBC_so) { /* * (baddr+2), where we want to put the * right half of the DBCS character, is * a SO. This is a natural extension * to the left -- just make sure we * don't write an SI. */ no_si = true; #if defined(DBCS_RIGHT_DEBUG) /*[*/ printf("SO in position 2, no SI\n"); #endif /*]*/ } /* * Check the fourth position only if we're * not doing an extend-left. */ if (!no_si) { INC_BA(xaddr); /* baddr+3, SI */ if (ea_buf[xaddr].fa) break; if (ea_buf[xaddr].cc == EBC_so) { /* * (baddr+3), where we want to * put an * SI, is an SO. Forget it. */ #if defined(DBCS_RIGHT_DEBUG) /*[*/ printf("SO in position 3, " "retry right\n"); INC_BA(baddr); goto retry; #endif /*]*/ break; } } } /* Yes, add it. */ if (extend_left) DEC_BA(baddr); ctlr_add(baddr, EBC_so, ea_buf[baddr].cs); INC_BA(baddr); ctlr_add(baddr, ebc_pair[0], ea_buf[baddr].cs); INC_BA(baddr); ctlr_add(baddr, ebc_pair[1], ea_buf[baddr].cs); if (!no_si) { INC_BA(baddr); ctlr_add(baddr, EBC_si, ea_buf[baddr].cs); } done = true; } else if (reply_mode == SF_SRM_CHAR) { /* Use the character attribute. */ if (insert) { if (!ins_prep(faddr, baddr, 2, &no_room)) { return false; } } else { xaddr = baddr; INC_BA(xaddr); if (ea_buf[xaddr].fa) break; } ctlr_add(baddr, ebc_pair[0], CS_DBCS); INC_BA(baddr); ctlr_add(baddr, ebc_pair[1], CS_DBCS); INC_BA(baddr); done = true; } break; } if (done) { /* Implement blank fill mode. */ if (toggled(BLANK_FILL)) { xaddr = faddr; INC_BA(xaddr); while (xaddr != baddr) { if (ea_buf[xaddr].cc == EBC_null) ctlr_add(xaddr, EBC_space, CS_BASE); else break; INC_BA(xaddr); } } mdt_set(cursor_addr); /* Implement auto-skip. */ while (ea_buf[baddr].fa) { if (FA_IS_SKIP(ea_buf[baddr].fa)) baddr = next_unprotected(baddr); else INC_BA(baddr); } cursor_move(baddr); (void) ctlr_dbcs_postprocess(); return true; } else { operator_error(KL_OERR_DBCS); return false; } } /* * Handle an ordinary character key, given its Unicode value. */ void key_UCharacter(ucs4_t ucs4, enum keytype keytype, enum iaction cause) { register int i; struct akey ak; reset_idle_timer(); if (kybdlock) { const char *apl_name; if (keytype == KT_STD) { enq_ta("Key", lazyaf("U+%04x", ucs4), NULL); } else { /* APL character */ apl_name = key_to_apl_string(ucs4); if (apl_name != NULL) { enq_ta("Key", lazyaf("apl_%s", apl_name), NULL); } else { vtrace(" dropped (invalid key type or name)\n"); } } return; } ak.key = ucs4; ak.keytype = keytype; switch (composing) { case NONE: break; case COMPOSE: for (i = 0; i < n_composites; i++) if (ak_eq(composites[i].k1, ak) || ak_eq(composites[i].k2, ak)) break; if (i < n_composites) { cc_first.key = ucs4; cc_first.keytype = keytype; composing = FIRST; status_compose(true, ucs4, keytype); } else { ring_bell(); composing = NONE; status_compose(false, 0, KT_STD); } return; case FIRST: composing = NONE; status_compose(false, 0, KT_STD); for (i = 0; i < n_composites; i++) if ((ak_eq(composites[i].k1, cc_first) && ak_eq(composites[i].k2, ak)) || (ak_eq(composites[i].k1, ak) && ak_eq(composites[i].k2, cc_first))) break; if (i < n_composites) { ucs4 = composites[i].translation.key; keytype = composites[i].translation.keytype; } else { ring_bell(); return; } break; } vtrace(" %s -> Key(U+%04x)\n", ia_name[(int) cause], ucs4); if (IN_3270) { ebc_t ebc; bool ge; if (ucs4 < 0x20) { vtrace(" dropped (control char)\n"); return; } ebc = unicode_to_ebcdic_ge(ucs4, &ge); if (ebc == 0) { vtrace(" dropped (no EBCDIC translation)\n"); return; } if (ebc & 0xff00) { unsigned char ebc_pair[2]; ebc_pair[0] = (ebc & 0xff00)>> 8; ebc_pair[1] = ebc & 0xff; (void) key_WCharacter(ebc_pair); } else { (void) key_Character(ebc, (keytype == KT_GE) || ge, (cause == IA_PASTE)); } } else if (IN_NVT) { char mb[16]; unicode_to_multibyte(ucs4, mb, sizeof(mb)); net_sends(mb); } else { const char *why; switch (cstate) { case NOT_CONNECTED: why = "connected"; break; case SSL_PASS: case RESOLVING: case PENDING: case NEGOTIATING: case CONNECTED_INITIAL: default: why = "negotiated"; break; case CONNECTED_UNBOUND: why = "bound"; break; } vtrace(" dropped (not %s)\n", why); } } static bool MonoCase_action(ia_t ia, unsigned argc, const char **argv) { action_debug("MonoCase", ia, argc, argv); if (check_argc("MonoCase", argc, 0, 0) < 0) { return false; } reset_idle_timer(); do_toggle(MONOCASE); return true; } /* * Flip the display left-to-right */ static bool Flip_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Flip", ia, argc, argv); if (check_argc("Flip", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (dbcs) { return false; } screen_flip(); return true; } /* * Tab forward to next field. */ static bool Tab_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Tab", ia, argc, argv); if (check_argc("Tab", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Tab"); if (IN_NVT) { net_sendc('\t'); return true; } cursor_move(next_unprotected(cursor_addr)); return true; } /* * Tab backward to previous field. */ static bool BackTab_action(ia_t ia, unsigned argc, const char **argv) { int baddr, nbaddr; int sbaddr; action_debug("BackTab", ia, argc, argv); if (check_argc("BackTab", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("BackTab"); if (!IN_3270) { return false; } baddr = cursor_addr; DEC_BA(baddr); if (ea_buf[baddr].fa) { /* at bof */ DEC_BA(baddr); } sbaddr = baddr; while (true) { nbaddr = baddr; INC_BA(nbaddr); if (ea_buf[baddr].fa && !FA_IS_PROTECTED(ea_buf[baddr].fa) && !ea_buf[nbaddr].fa) { break; } DEC_BA(baddr); if (baddr == sbaddr) { cursor_move(0); return true; } } INC_BA(baddr); cursor_move(baddr); return true; } /* * Deferred keyboard unlock. */ static void defer_unlock(ioid_t id _is_unused) { kybdlock_clr(KL_DEFERRED_UNLOCK, "defer_unlock"); status_reset(); if (CONNECTED) ps_process(); } /* * Reset keyboard lock. */ void do_reset(bool explicit) { /* * If explicit (from the keyboard) and there is typeahead or * a half-composed key, simply flush it. */ if (explicit || ft_state != FT_NONE) { bool half_reset = false; if (flush_ta()) half_reset = true; if (composing != NONE) { composing = NONE; status_compose(false, 0, KT_STD); half_reset = true; } if (half_reset) return; } /* Always clear insert mode. */ insert_mode(false); /* Always reset scrolling. */ scroll_to_bottom(); /* Otherwise, if not connect, reset is a no-op. */ if (!CONNECTED) return; /* * Remove any deferred keyboard unlock. We will either unlock the * keyboard now, or want to defer further into the future. */ if ((kybdlock & KL_DEFERRED_UNLOCK) && unlock_id != NULL_IOID) { RemoveTimeOut(unlock_id); unlock_id = NULL_IOID; } /* * If explicit (from the keyboard), unlock the keyboard now. * Otherwise (from the host), schedule a deferred keyboard unlock. */ if (explicit || ft_state != FT_NONE || !appres.unlock_delay || (unlock_delay_time != 0 && (time(NULL) - unlock_delay_time) > 1) || !appres.unlock_delay_ms) { kybdlock_clr(-1, "do_reset"); } else if (kybdlock & (KL_DEFERRED_UNLOCK | KL_OIA_TWAIT | KL_OIA_LOCKED | KL_AWAITING_FIRST)) { kybdlock_clr(~KL_DEFERRED_UNLOCK, "do_reset"); kybdlock_set(KL_DEFERRED_UNLOCK, "do_reset"); unlock_id = AddTimeOut(appres.unlock_delay_ms, defer_unlock); vtrace("Deferring keyboard unlock %dms\n", appres.unlock_delay_ms); } /* Clean up other modes. */ status_reset(); mcursor_normal(); composing = NONE; status_compose(false, 0, KT_STD); } static bool Reset_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Reset", ia, argc, argv); if (check_argc("Reset", argc, 0, 0) < 0) { return false; } reset_idle_timer(); do_reset(true); return true; } /* * Move to first unprotected field on screen. */ static bool Home_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Home", ia, argc, argv); if (check_argc("Home", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Home"); if (IN_NVT) { nvt_send_home(); return true; } if (!formatted) { cursor_move(0); return true; } cursor_move(next_unprotected(ROWS*COLS-1)); return true; } /* * Cursor left 1 position. */ static void do_left(void) { register int baddr; enum dbcs_state d; baddr = cursor_addr; DEC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_RIGHT(d)) { DEC_BA(baddr); } else if (IS_LEFT(d)) { DEC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_RIGHT(d)) DEC_BA(baddr); } cursor_move(baddr); } bool Left_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Left", ia, argc, argv); if (check_argc("Left", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Left"); if (IN_NVT) { nvt_send_left(); return true; } if (!flipped) { do_left(); } else { int baddr; baddr = cursor_addr; INC_BA(baddr); cursor_move(baddr); } return true; } /* * Delete char key. * Returns "true" if succeeds, "false" otherwise. */ static bool do_delete(void) { register int baddr, end_baddr; int xaddr; register unsigned char fa; int ndel; register int i; baddr = cursor_addr; /* Can't delete a field attribute. */ fa = get_field_attribute(baddr); if (FA_IS_PROTECTED(fa) || ea_buf[baddr].fa) { operator_error(KL_OERR_PROTECTED); return false; } if (ea_buf[baddr].cc == EBC_so || ea_buf[baddr].cc == EBC_si) { /* * Can't delete SO or SI, unless it's adjacent to its * opposite. */ xaddr = baddr; INC_BA(xaddr); if (ea_buf[xaddr].cc == SOSI(ea_buf[baddr].cc)) { ndel = 2; } else { operator_error(KL_OERR_PROTECTED); return false; } } else if (IS_DBCS(ea_buf[baddr].db)) { if (IS_RIGHT(ea_buf[baddr].db)) DEC_BA(baddr); ndel = 2; } else ndel = 1; /* find next fa */ if (formatted) { end_baddr = baddr; do { INC_BA(end_baddr); if (ea_buf[end_baddr].fa) break; } while (end_baddr != baddr); DEC_BA(end_baddr); } else { if ((baddr % COLS) == COLS - ndel) return true; end_baddr = baddr + (COLS - (baddr % COLS)) - 1; } /* Shift the remainder of the field left. */ if (end_baddr > baddr) { ctlr_bcopy(baddr + ndel, baddr, end_baddr - (baddr + ndel) + 1, 0); } else if (end_baddr != baddr) { /* XXX: Need to verify this. */ ctlr_bcopy(baddr + ndel, baddr, ((ROWS * COLS) - 1) - (baddr + ndel) + 1, 0); ctlr_bcopy(0, (ROWS * COLS) - ndel, ndel, 0); ctlr_bcopy(ndel, 0, end_baddr - ndel + 1, 0); } /* NULL fill at the end. */ for (i = 0; i < ndel; i++) ctlr_add(end_baddr - i, EBC_null, 0); /* Set the MDT for this field. */ mdt_set(cursor_addr); /* Patch up the DBCS state for display. */ (void) ctlr_dbcs_postprocess(); return true; } static bool Delete_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Delete", ia, argc, argv); if (check_argc("Delete", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("Delete", NULL, NULL); return true; } if (IN_NVT) { net_sendc('\177'); return true; } if (!do_delete()) { return true; } if (reverse) { int baddr = cursor_addr; DEC_BA(baddr); if (!ea_buf[baddr].fa) { cursor_move(baddr); } } return true; } /* * 3270-style backspace. */ static bool BackSpace_action(ia_t ia, unsigned argc, const char **argv) { action_debug("BackSpace", ia, argc, argv); if (check_argc("BackSpace", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("BackSpace", NULL, NULL); return true; } if (IN_NVT) { linemode_send_erase(); return true; } if (reverse) { (void) do_delete(); } else if (!flipped) { do_left(); } else { int baddr; baddr = cursor_addr; DEC_BA(baddr); cursor_move(baddr); } return true; } /* * Destructive backspace, like Unix "erase". */ static void do_erase(void) { int baddr, faddr; enum dbcs_state d; baddr = cursor_addr; faddr = find_field_attribute(baddr); if (faddr == baddr || FA_IS_PROTECTED(ea_buf[baddr].fa)) { operator_error(KL_OERR_PROTECTED); return; } if (baddr && faddr == baddr - 1) return; do_left(); /* * If we are now on an SI, move left again. */ if (ea_buf[cursor_addr].cc == EBC_si) { baddr = cursor_addr; DEC_BA(baddr); cursor_move(baddr); } /* * If we landed on the right-hand side of a DBCS character, move to the * left-hand side. * This ensures that if this is the end of a DBCS subfield, we will * land on the SI, instead of on the character following. */ d = ctlr_dbcs_state(cursor_addr); if (IS_RIGHT(d)) { baddr = cursor_addr; DEC_BA(baddr); cursor_move(baddr); } /* * Try to delete this character. */ if (!do_delete()) return; /* * If we've just erased the last character of a DBCS subfield, erase * the SO/SI pair as well. */ baddr = cursor_addr; DEC_BA(baddr); if (ea_buf[baddr].cc == EBC_so && ea_buf[cursor_addr].cc == EBC_si) { cursor_move(baddr); (void) do_delete(); } } static bool Erase_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Erase", ia, argc, argv); if (check_argc("Erase", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("Erase", NULL, NULL); return true; } if (IN_NVT) { linemode_send_erase(); return true; } if (reverse) { do_delete(); } else { do_erase(); } return true; } /* * Cursor right 1 position. */ bool Right_action(ia_t ia, unsigned argc, const char **argv) { int baddr; enum dbcs_state d; action_debug("Right", ia, argc, argv); if (check_argc("Right", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Right"); if (IN_NVT) { nvt_send_right(); return true; } if (!flipped) { baddr = cursor_addr; INC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_RIGHT(d)) { INC_BA(baddr); } cursor_move(baddr); } else { do_left(); } return true; } /* * Cursor left 2 positions. */ static bool Left2_action(ia_t ia, unsigned argc, const char **argv) { int baddr; enum dbcs_state d; action_debug("Left2", ia, argc, argv); if (check_argc("Left2", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Left2"); if (IN_NVT) { return false; } baddr = cursor_addr; DEC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { DEC_BA(baddr); } DEC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { DEC_BA(baddr); } cursor_move(baddr); return true; } /* * Cursor to previous word. */ static bool PreviousWord_action(ia_t ia, unsigned argc, const char **argv) { int baddr; int baddr0; unsigned char c; bool prot; action_debug("PreviousWord", ia, argc, argv); if (check_argc("PreviousWord", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("PreviousWord", NULL, NULL); return true; } if (IN_NVT || !formatted) { return false; } baddr = cursor_addr; prot = FA_IS_PROTECTED(get_field_attribute(baddr)); /* Skip to before this word, if in one now. */ if (!prot) { c = ea_buf[baddr].cc; while (!ea_buf[baddr].fa && c != EBC_space && c != EBC_null) { DEC_BA(baddr); if (baddr == cursor_addr) { return true; } c = ea_buf[baddr].cc; } } baddr0 = baddr; /* Find the end of the preceding word. */ do { c = ea_buf[baddr].cc; if (ea_buf[baddr].fa) { DEC_BA(baddr); prot = FA_IS_PROTECTED(get_field_attribute(baddr)); continue; } if (!prot && c != EBC_space && c != EBC_null) { break; } DEC_BA(baddr); } while (baddr != baddr0); if (baddr == baddr0) { return true; } /* Go it its front. */ for (;;) { DEC_BA(baddr); c = ea_buf[baddr].cc; if (ea_buf[baddr].fa || c == EBC_space || c == EBC_null) { break; } } INC_BA(baddr); cursor_move(baddr); return true; } /* * Cursor right 2 positions. */ static bool Right2_action(ia_t ia, unsigned argc, const char **argv) { int baddr; enum dbcs_state d; action_debug("Right2", ia, argc, argv); if (check_argc("Right2", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Right2"); if (IN_NVT) { return false; } baddr = cursor_addr; INC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_RIGHT(d)) { INC_BA(baddr); } INC_BA(baddr); d = ctlr_dbcs_state(baddr); if (IS_RIGHT(d)) { INC_BA(baddr); } cursor_move(baddr); return true; } /* Find the next unprotected word, or -1 */ static int nu_word(int baddr) { int baddr0 = baddr; unsigned char c; bool prot; prot = FA_IS_PROTECTED(get_field_attribute(baddr)); do { c = ea_buf[baddr].cc; if (ea_buf[baddr].fa) prot = FA_IS_PROTECTED(ea_buf[baddr].fa); else if (!prot && c != EBC_space && c != EBC_null) return baddr; INC_BA(baddr); } while (baddr != baddr0); return -1; } /* Find the next word in this field, or -1 */ static int nt_word(int baddr) { int baddr0 = baddr; unsigned char c; bool in_word = true; do { c = ea_buf[baddr].cc; if (ea_buf[baddr].fa) return -1; if (in_word) { if (c == EBC_space || c == EBC_null) in_word = false; } else { if (c != EBC_space && c != EBC_null) return baddr; } INC_BA(baddr); } while (baddr != baddr0); return -1; } /* * Cursor to next unprotected word. */ static bool NextWord_action(ia_t ia, unsigned argc, const char **argv) { int baddr; unsigned char c; action_debug("NextWord", ia, argc, argv); if (check_argc("NextWord", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("NextWord", NULL, NULL); return true; } if (IN_NVT || !formatted) { return false; } /* If not in an unprotected field, go to the next unprotected word. */ if (ea_buf[cursor_addr].fa || FA_IS_PROTECTED(get_field_attribute(cursor_addr))) { baddr = nu_word(cursor_addr); if (baddr != -1) { cursor_move(baddr); } return true; } /* If there's another word in this field, go to it. */ baddr = nt_word(cursor_addr); if (baddr != -1) { cursor_move(baddr); return true; } /* If in a word, go to just after its end. */ c = ea_buf[cursor_addr].cc; if (c != EBC_space && c != EBC_null) { baddr = cursor_addr; do { c = ea_buf[baddr].cc; if (c == EBC_space || c == EBC_null) { cursor_move(baddr); return true; } else if (ea_buf[baddr].fa) { baddr = nu_word(baddr); if (baddr != -1) { cursor_move(baddr); } return true; } INC_BA(baddr); } while (baddr != cursor_addr); } else { /* Otherwise, go to the next unprotected word. */ baddr = nu_word(cursor_addr); if (baddr != -1) { cursor_move(baddr); } } return true; } /* * Cursor up 1 position. */ bool Up_action(ia_t ia, unsigned argc, const char **argv) { register int baddr; action_debug("Up", ia, argc, argv); if (check_argc("Up", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Up"); if (IN_NVT) { nvt_send_up(); return true; } baddr = cursor_addr - COLS; if (baddr < 0) { baddr = (cursor_addr + (ROWS * COLS)) - COLS; } cursor_move(baddr); return true; } /* * Cursor down 1 position. */ bool Down_action(ia_t ia, unsigned argc, const char **argv) { int baddr; action_debug("Down", ia, argc, argv); if (check_argc("Down", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Down"); if (IN_NVT) { nvt_send_down(); return true; } baddr = (cursor_addr + COLS) % (COLS * ROWS); cursor_move(baddr); return false; } /* * Cursor to first field on next line or any lines after that. */ static bool Newline_action(ia_t ia, unsigned argc, const char **argv) { int baddr, faddr; unsigned char fa; action_debug("Newline", ia, argc, argv); if (check_argc("Newline", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("Newline", NULL, NULL); return true; } if (IN_NVT) { net_sendc('\n'); return true; } baddr = (cursor_addr + COLS) % (COLS * ROWS); /* down */ baddr = (baddr / COLS) * COLS; /* 1st col */ faddr = find_field_attribute(baddr); fa = ea_buf[faddr].fa; if (faddr != baddr && !FA_IS_PROTECTED(fa)) { cursor_move(baddr); } else { cursor_move(next_unprotected(baddr)); } return true; } /* * DUP key */ static bool Dup_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Dup", ia, argc, argv); if (check_argc("Dup", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("Dup", NULL, NULL); return true; } if (IN_NVT) { return false; } if (key_Character(EBC_dup, false, false)) { cursor_move(next_unprotected(cursor_addr)); } return true; } /* * FM key */ static bool FieldMark_action(ia_t ia, unsigned argc, const char **argv) { action_debug("FieldMark", ia, argc, argv); if (check_argc("FieldMark", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("FieldMark", NULL, NULL); return true; } if (IN_NVT) { return false; } (void) key_Character(EBC_fm, false, false); return true; } /* * Vanilla AID keys. */ static bool Enter_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Enter", ia, argc, argv); if (check_argc("Enter", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock & KL_OIA_MINUS) { return false; } else if (kybdlock) { enq_ta("Enter", NULL, NULL); } else { key_AID(AID_ENTER); } return true; } static bool SysReq_action(ia_t ia, unsigned argc, const char **argv) { action_debug("SysReq", ia, argc, argv); if (check_argc("SysReq", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (IN_NVT) { return false; } if (IN_E) { net_abort(); } else { if (kybdlock & KL_OIA_MINUS) { return false; } else if (kybdlock) { enq_ta("SysReq", NULL, NULL); } else { key_AID(AID_SYSREQ); } } return true; } /* * Clear AID key */ static bool Clear_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Clear", ia, argc, argv); if (check_argc("Clear", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock & KL_OIA_MINUS) { return false; } if (kybdlock && CONNECTED) { enq_ta("Clear", NULL, NULL); return true; } if (IN_NVT) { nvt_send_clear(); return true; } buffer_addr = 0; ctlr_clear(true); cursor_move(0); if (CONNECTED) { key_AID(AID_CLEAR); } return true; } /* * Cursor Select key (light pen simulator). */ void lightpen_select(int baddr) { int faddr; register unsigned char fa; int designator; int designator2; faddr = find_field_attribute(baddr); fa = ea_buf[faddr].fa; if (!FA_IS_SELECTABLE(fa)) { vtrace(" lightpen select on non-selectable field\n"); ring_bell(); return; } designator = faddr; INC_BA(designator); if (dbcs) { if (ea_buf[baddr].cs == CS_DBCS) { designator2 = designator; INC_BA(designator2); if ((ea_buf[designator].db != DBCS_LEFT && ea_buf[designator].db != DBCS_LEFT_WRAP) && (ea_buf[designator2].db != DBCS_RIGHT && ea_buf[designator2].db != DBCS_RIGHT_WRAP)) { ring_bell(); return; } if (ea_buf[designator].cc == 0x42 && ea_buf[designator2].cc == EBC_greater) { ctlr_add(designator2, EBC_question, CS_DBCS); mdt_clear(faddr); } else if (ea_buf[designator].cc == 0x42 && ea_buf[designator2].cc == EBC_question) { ctlr_add(designator2, EBC_greater, CS_DBCS); mdt_clear(faddr); } else if ((ea_buf[designator].cc == EBC_space && ea_buf[designator2].cc == EBC_space) || (ea_buf[designator].cc == EBC_null && ea_buf[designator2].cc == EBC_null)) { ctlr_add(designator2, EBC_greater, CS_DBCS); mdt_set(faddr); key_AID(AID_SELECT); } else if (ea_buf[designator].cc == 0x42 && ea_buf[designator2].cc == EBC_ampersand) { mdt_set(faddr); key_AID(AID_ENTER); } else { ring_bell(); } return; } } switch (ea_buf[designator].cc) { case EBC_greater: /* > */ ctlr_add(designator, EBC_question, 0); /* change to ? */ mdt_clear(faddr); break; case EBC_question: /* ? */ ctlr_add(designator, EBC_greater, 0); /* change to > */ mdt_set(faddr); break; case EBC_space: /* space */ case EBC_null: /* null */ mdt_set(faddr); key_AID(AID_SELECT); break; case EBC_ampersand: /* & */ mdt_set(faddr); key_AID(AID_ENTER); break; default: ring_bell(); break; } } /* * Cursor Select key (light pen simulator) -- at the current cursor location. */ static bool CursorSelect_action(ia_t ia, unsigned argc, const char **argv) { action_debug("CursorSelect", ia, argc, argv); if (check_argc("CursorSelect", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("CursorSelect", NULL, NULL); return true; } if (IN_NVT) { return false; } lightpen_select(cursor_addr); return true; } /* * Erase End Of Field Key. */ static bool EraseEOF_action(ia_t ia, unsigned argc, const char **argv) { int baddr; unsigned char fa; enum dbcs_state d; enum dbcs_why why = DBCS_FIELD; action_debug("EraseEOF", ia, argc, argv); if (check_argc("EraseEOF", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("EraseEOF"); if (IN_NVT) { return false; } baddr = cursor_addr; fa = get_field_attribute(baddr); if (FA_IS_PROTECTED(fa) || ea_buf[baddr].fa) { operator_error(KL_OERR_PROTECTED); return false; } if (formatted) { /* erase to next field attribute */ do { ctlr_add(baddr, EBC_null, 0); INC_BA(baddr); } while (!ea_buf[baddr].fa); mdt_set(cursor_addr); } else { /* erase to end of screen */ do { ctlr_add(baddr, EBC_null, 0); INC_BA(baddr); } while (baddr != 0); } /* If the cursor was in a DBCS subfield, re-create the SI. */ d = ctlr_lookleft_state(cursor_addr, &why); if (IS_DBCS(d) && why == DBCS_SUBFIELD) { if (d == DBCS_RIGHT) { baddr = cursor_addr; DEC_BA(baddr); ea_buf[baddr].cc = EBC_si; } else { ea_buf[cursor_addr].cc = EBC_si; } } (void) ctlr_dbcs_postprocess(); return true; } /* * Erase all Input Key. */ static bool EraseInput_action(ia_t ia, unsigned argc, const char **argv) { int baddr, sbaddr; unsigned char fa; bool f; action_debug("EraseInput", ia, argc, argv); if (check_argc("EraseInput", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("EraseInput"); if (IN_NVT) { return false; } if (formatted) { /* find first field attribute */ baddr = 0; do { if (ea_buf[baddr].fa) { break; } INC_BA(baddr); } while (baddr != 0); sbaddr = baddr; f = false; do { fa = ea_buf[baddr].fa; if (!FA_IS_PROTECTED(fa)) { mdt_clear(baddr); do { INC_BA(baddr); if (!f) { cursor_move(baddr); f = true; } if (!ea_buf[baddr].fa) { ctlr_add(baddr, EBC_null, 0); } } while (!ea_buf[baddr].fa); } else { /* skip protected */ do { INC_BA(baddr); } while (!ea_buf[baddr].fa); } } while (baddr != sbaddr); if (!f) { cursor_move(0); } } else { ctlr_clear(true); cursor_move(0); } /* Synchronize the DBCS state. */ (void) ctlr_dbcs_postprocess(); return true; } /* * Delete word key. Backspaces the cursor until it hits the front of a word, * deletes characters until it hits a blank or null, and deletes all of these * but the last. * * Which is to say, does a ^W. */ static bool DeleteWord_action(ia_t ia, unsigned argc, const char **argv) { int baddr; unsigned char fa; action_debug("DeleteWord", ia, argc, argv); if (check_argc("DeleteWord", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("DeleteWord"); if (IN_NVT) { linemode_send_werase(); return true; } if (!formatted) { return false; } baddr = cursor_addr; fa = get_field_attribute(baddr); /* Make sure we're on a modifiable field. */ if (FA_IS_PROTECTED(fa) || ea_buf[baddr].fa) { operator_error(KL_OERR_PROTECTED); return false; } /* Backspace over any spaces to the left of the cursor. */ for (;;) { baddr = cursor_addr; DEC_BA(baddr); if (ea_buf[baddr].fa) { return true; } if (ea_buf[baddr].cc == EBC_null || ea_buf[baddr].cc == EBC_space) { do_erase(); } else { break; } } /* Backspace until the character to the left of the cursor is blank. */ for (;;) { baddr = cursor_addr; DEC_BA(baddr); if (ea_buf[baddr].fa) { return true; } if (ea_buf[baddr].cc == EBC_null || ea_buf[baddr].cc == EBC_space) { break; } else { do_erase(); } } return true; } /* * Delete field key. Similar to EraseEOF, but it wipes out the entire field * rather than just to the right of the cursor, and it leaves the cursor at * the front of the field. * * Which is to say, does a ^U. */ static bool DeleteField_action(ia_t ia, unsigned argc, const char **argv) { int baddr; unsigned char fa; action_debug("DeleteField", ia, argc, argv); if (check_argc("DeleteField", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("DeleteField"); if (IN_NVT) { linemode_send_kill(); return true; } if (!formatted) { return false; } baddr = cursor_addr; fa = get_field_attribute(baddr); if (FA_IS_PROTECTED(fa) || ea_buf[baddr].fa) { operator_error(KL_OERR_PROTECTED); return false; } while (!ea_buf[baddr].fa) { DEC_BA(baddr); } INC_BA(baddr); mdt_set(cursor_addr); cursor_move(baddr); while (!ea_buf[baddr].fa) { ctlr_add(baddr, EBC_null, 0); INC_BA(baddr); } return true; } /* * Set insert mode key. */ static bool Insert_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Insert", ia, argc, argv); if (check_argc("Insert", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("Insert"); if (IN_NVT) { return false; } insert_mode(true); return true; } /* * Toggle insert mode key. */ static bool ToggleInsert_action(ia_t ia, unsigned argc, const char **argv) { action_debug("ToggleInsert", ia, argc, argv); if (check_argc("ToggleInsert", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("ToggleInsert"); if (IN_NVT) { return false; } if (insert) { insert_mode(false); } else { insert_mode(true); } return true; } /* * Toggle reverse mode key. */ static bool ToggleReverse_action(ia_t ia, unsigned argc, const char **argv) { action_debug("ToggleReverse", ia, argc, argv); if (check_argc("ToggleReverse", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("ToggleReverse", NULL, NULL); return true; } if (IN_NVT) { return false; } reverse_mode(!reverse); return true; } /* * Move the cursor to the first blank after the last nonblank in the * field, or if the field is full, to the last character in the field. */ static bool FieldEnd_action(ia_t ia, unsigned argc, const char **argv) { int baddr, faddr; unsigned char fa, c; int last_nonblank = -1; action_debug("FieldEnd", ia, argc, argv); if (check_argc("FieldEnd", argc, 0, 0) < 0) { return false; } reset_idle_timer(); OERR_CLEAR_OR_ENQ("FieldEnd"); if (IN_NVT) { return false; } if (!formatted) { return false; } baddr = cursor_addr; faddr = find_field_attribute(baddr); fa = ea_buf[faddr].fa; if (faddr == baddr || FA_IS_PROTECTED(fa)) { return true; } baddr = faddr; while (true) { INC_BA(baddr); c = ea_buf[baddr].cc; if (ea_buf[baddr].fa) { break; } if (c != EBC_null && c != EBC_space) { last_nonblank = baddr; } } if (last_nonblank == -1) { baddr = faddr; INC_BA(baddr); } else { baddr = last_nonblank; INC_BA(baddr); if (ea_buf[baddr].fa) { baddr = last_nonblank; } } cursor_move(baddr); return true; } /* * MoveCursor action. Moves to a specific location. */ static bool MoveCursor_action(ia_t ia, unsigned argc, const char **argv) { int baddr; int row, col; action_debug("MoveCursor", ia, argc, argv); if (check_argc("MoveCursor", argc, 2, 2) < 0) { return false; } reset_idle_timer(); if (kybdlock) { enq_ta("MoveCursor", argv[0], argv[1]); return true; } row = atoi(argv[0]); col = atoi(argv[1]); if (!IN_3270) { row--; col--; } if (row < 0) { row = 0; } if (col < 0) { col = 0; } baddr = ((row * COLS) + col) % (ROWS * COLS); cursor_move(baddr); return true; } /* * Key action. */ static bool Key_action(ia_t ia, unsigned argc, const char **argv) { unsigned i; ks_t k; enum keytype keytype; ucs4_t ucs4; action_debug("Key", ia, argc, argv); reset_idle_timer(); for (i = 0; i < argc; i++) { const char *s = argv[i]; k = my_string_to_key(s, &keytype, &ucs4); if (k == KS_NONE && !ucs4) { popup_an_error("Key: Nonexistent or invalid name: %s", s); cancel_if_idle_command(); continue; } if (k & ~0xff) { /* * Can't pass symbolic names that aren't in the range 0x01..0xff. */ popup_an_error("Key: Invalid name: %s", s); cancel_if_idle_command(); continue; } if (k != KS_NONE) { key_UCharacter(k, keytype, IA_KEY); } else { key_UCharacter(ucs4, keytype, IA_KEY); } } return true; } /* * String action. */ static bool String_action(ia_t ia, unsigned argc, const char **argv) { unsigned i; size_t len = 0; char *s; action_debug("String", ia, argc, argv); reset_idle_timer(); /* Determine the total length of the strings. */ for (i = 0; i < argc; i++) { len += strlen(argv[i]); } if (!len) { return true; } /* Allocate a block of memory and copy them in. */ s = Malloc(len + 1); s[0] = '\0'; for (i = 0; i < argc; i++) { strcat(s, argv[i]); } /* Set a pending string. */ ps_set(s, false); Free(s); return true; } /* * HexString action. */ static bool HexString_action(ia_t ia, unsigned argc, const char **argv) { unsigned i; size_t len = 0; char *s; const char *t; action_debug("HexString", ia, argc, argv); reset_idle_timer(); /* Determine the total length of the strings. */ for (i = 0; i < argc; i++) { t = argv[i]; if (!strncmp(t, "0x", 2) || !strncmp(t, "0X", 2)) { t += 2; } len += strlen(t); } if (!len) { return true; } /* Allocate a block of memory and copy them in. */ s = Malloc(len + 1); *s = '\0'; for (i = 0; i < argc; i++) { t = argv[i]; if (!strncmp(t, "0x", 2) || !strncmp(t, "0X", 2)) t += 2; (void) strcat(s, t); } /* Set a pending string. */ ps_set(s, true); return true; } /* * Dual-mode action for the "asciicircum" ("^") key: * If in NVT mode, pass through untranslated. * If in 3270 mode, translate to "notsign". * This action is obsoleted by the use of 3270-mode and NVT-mode keymaps, but * is still defined here for backwards compatibility with old keymaps. */ static bool CircumNot_action(ia_t ia, unsigned argc, const char **argv) { action_debug("CircumNot", ia, argc, argv); if (check_argc("CircumNot", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (IN_3270 && composing == NONE) { key_UCharacter(0xac, KT_STD, IA_KEY); } else { key_UCharacter('^', KT_STD, IA_KEY); } return true; } /* PA key action for String actions */ static void do_pa(unsigned n) { if (n < 1 || n > PA_SZ) { popup_an_error("Unknown PA key %d", n); cancel_if_idle_command(); return; } if (kybdlock) { enq_ta("PA", lazyaf("%d", n), NULL); return; } key_AID(pa_xlate[n-1]); } /* PF key action for String actions */ static void do_pf(unsigned n) { if (n < 1 || n > PF_SZ) { popup_an_error("Unknown PF key %d", n); cancel_if_idle_command(); return; } if (kybdlock) { enq_ta("PF", lazyaf("%d", n), NULL); return; } key_AID(pf_xlate[n-1]); } /* * Set or clear the keyboard scroll lock. */ void kybd_scroll_lock(bool lock) { if (!IN_3270) return; if (lock) kybdlock_set(KL_SCROLLED, "kybd_scroll_lock"); else kybdlock_clr(KL_SCROLLED, "kybd_scroll_lock"); } /* * Move the cursor back within the legal paste area. * Returns a bool indicating success. */ static bool remargin(int lmargin) { bool ever = false; int baddr, b0 = 0; int faddr; unsigned char fa; if (toggled(OVERLAY_PASTE)) { /* * If doing overlay paste as well, just drop down to the margin * column on the next line, and don't worry about protected fields. */ baddr = ROWCOL_TO_BA(BA_TO_ROW(cursor_addr), lmargin); cursor_move(baddr); return true; } baddr = cursor_addr; while (BA_TO_COL(baddr) < lmargin) { baddr = ROWCOL_TO_BA(BA_TO_ROW(baddr), lmargin); if (!ever) { b0 = baddr; ever = true; } faddr = find_field_attribute(baddr); fa = ea_buf[faddr].fa; if (faddr == baddr || FA_IS_PROTECTED(fa)) { baddr = next_unprotected(baddr); if (baddr <= b0) return false; } } cursor_move(baddr); return true; } /* * Pretend that a sequence of keys was entered at the keyboard. * * "Pasting" means that the sequence came from the X clipboard. Returns are * ignored; newlines mean "move to beginning of next line"; tabs and formfeeds * become spaces. Backslashes are not special, but ASCII ESC characters are * used to signify 3270 Graphic Escapes. If the NOSKIP_PASTE toggle is set, * then we don't do auto-skip, except at the end of the string; when the cursor * lands on a protected region of the screen, we treat printable characters as * cursor-right actions. * * "Not pasting" means that the sequence is a login string specified in the * hosts file, or a parameter to the String action. Returns are "move to * beginning of next line"; newlines mean "Enter AID" and the termination of * processing the string. Backslashes are processed as in C. * * Returns the number of unprocessed characters. */ size_t emulate_uinput(const ucs4_t *ws, size_t xlen, bool pasting) { enum { BASE, BACKSLASH, BACKX, BACKE, BACKP, BACKPA, BACKPF, OCTAL, HEX, EBC, XGE } state = BASE; int literal = 0; int nc = 0; enum iaction ia = pasting ? IA_PASTE : IA_STRING; int orig_addr = cursor_addr; int orig_col = BA_TO_COL(cursor_addr); int last_addr = cursor_addr; int last_row = BA_TO_ROW(cursor_addr); bool just_wrapped = false; ucs4_t c; bool auto_skip = true; if (pasting && toggled(OVERLAY_PASTE)) { auto_skip = false; } /* * In the switch statements below, "break" generally means "consume * this character," while "continue" means "rescan this character." */ while (xlen) { /* * It isn't possible to unlock the keyboard from a string, * so if the keyboard is locked, it's fatal */ if (kybdlock) { vtrace(" keyboard locked, string dropped\n"); return 0; } if (pasting && IN_3270) { /* Check for cursor wrap to top of screen. */ if (cursor_addr < orig_addr) { return xlen-1; /* wrapped */ } /* Jump cursor over left margin. */ if (MarginedPaste() && BA_TO_COL(cursor_addr) < orig_col) { if (!remargin(orig_col)) { return xlen-1; } } } if (last_addr != cursor_addr) { last_addr = cursor_addr; if (last_row == BA_TO_ROW(cursor_addr)) { just_wrapped = false; } else { last_row = BA_TO_ROW(cursor_addr); just_wrapped = true; } } c = *ws; switch (state) { case BASE: switch (c) { case '\b': run_action("Left", ia, NULL, NULL); break; case '\f': if (pasting) { key_UCharacter(0x20, KT_STD, ia); } else { run_action("Clear", ia, NULL, NULL); if (IN_3270) { return xlen-1; } } break; case '\n': if (pasting) { if (auto_skip) { if (!just_wrapped) { run_action("Newline", ia, NULL, NULL); } } else { int baddr; int row; /* * Overlay paste mode: Move to the beginning of the * next row, unless we just wrapped there. * * If this is the last pasted character, ignore it. */ if (xlen == 1) { return 0; } if (!just_wrapped) { row = BA_TO_ROW(cursor_addr); if (row >= ROWS - 1) { return xlen - 1; } baddr = ROWCOL_TO_BA(row + 1, 0); cursor_move(baddr); } } last_row = BA_TO_ROW(cursor_addr); just_wrapped = false; } else { run_action("Enter", ia, NULL, NULL); if (IN_3270) { return xlen-1; } } break; case '\r': if (!pasting) { run_action("Newline", ia, NULL, NULL); } break; case '\t': run_action("Tab", ia, NULL, NULL); break; case '\\': /* backslashes are NOT special when pasting */ if (!pasting) { state = BACKSLASH; } else { key_UCharacter((unsigned char)c, KT_STD, ia); } break; case '\033': /* ESC is special only when pasting */ if (pasting) { state = XGE; } break; case '[': /* APL left bracket */ if (pasting && appres.apl_mode) { key_UCharacter(latin1_Yacute, KT_GE, ia); } else { key_UCharacter((unsigned char)c, KT_STD, ia); } break; case ']': /* APL right bracket */ if (pasting && appres.apl_mode) { key_UCharacter(latin1_uml, KT_GE, ia); } else { key_UCharacter((unsigned char)c, KT_STD, ia); } break; case UPRIV_fm: /* private-use FM */ if (pasting) { key_Character(EBC_fm, false, true); } break; case UPRIV_dup: /* private-use DUP */ if (pasting) { key_Character(EBC_dup, false, true); } break; case UPRIV_eo: /* private-use EO */ if (pasting) { key_Character(EBC_eo, false, true); } break; case UPRIV_sub: /* private-use SUB */ if (pasting) { key_Character(EBC_sub, false, true); } break; default: if (pasting && (c >= UPRIV_GE_00 && c <= UPRIV_GE_ff)) { key_Character(c - UPRIV_GE_00, KT_GE, ia); } else { key_UCharacter(c, KT_STD, ia); } break; } break; case BACKSLASH: /* last character was a backslash */ switch (c) { case 'a': popup_an_error("String: Bell not supported"); cancel_if_idle_command(); state = BASE; break; case 'b': run_action("Left", ia, NULL, NULL); state = BASE; break; case 'f': run_action("Clear", ia, NULL, NULL); state = BASE; if (IN_3270) { return xlen-1; } break; case 'n': run_action("Enter", ia, NULL, NULL); state = BASE; if (IN_3270) { return xlen-1; } break; case 'p': state = BACKP; break; case 'r': run_action("Newline", ia, NULL, NULL); state = BASE; break; case 't': run_action("Tab", ia, NULL, NULL); state = BASE; break; case 'T': run_action("BackTab", ia, NULL, NULL); state = BASE; break; case 'v': popup_an_error("String: Vertical tab not supported"); cancel_if_idle_command(); state = BASE; break; case 'u': case 'x': state = BACKX; break; case 'e': state = BACKE; break; case '\\': key_UCharacter((unsigned char) c, KT_STD, ia); state = BASE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': state = OCTAL; literal = 0; nc = 0; continue; default: state = BASE; continue; } break; case BACKP: /* last two characters were "\p" */ switch (c) { case 'a': literal = 0; nc = 0; state = BACKPA; break; case 'f': literal = 0; nc = 0; state = BACKPF; break; default: popup_an_error("String: Unknown character after \\p"); cancel_if_idle_command(); state = BASE; break; } break; case BACKPF: /* last three characters were "\pf" */ if (nc < 2 && isdigit((unsigned char)c)) { literal = (literal * 10) + (c - '0'); nc++; } else if (!nc) { popup_an_error("String: Unknown character after \\pf"); cancel_if_idle_command(); state = BASE; } else { do_pf(literal); if (IN_3270) { return xlen; } state = BASE; continue; } break; case BACKPA: /* last three characters were "\pa" */ if (nc < 1 && isdigit((unsigned char)c)) { literal = (literal * 10) + (c - '0'); nc++; } else if (!nc) { popup_an_error("String: Unknown character after \\pa"); cancel_if_idle_command(); state = BASE; } else { do_pa(literal); if (IN_3270) { return xlen-1; } state = BASE; continue; } break; case BACKX: /* last two characters were "\x" or "\u" */ if (isxdigit((unsigned char)c)) { state = HEX; literal = 0; nc = 0; continue; } else { popup_an_error("String: Missing hex digits after \\x"); cancel_if_idle_command(); state = BASE; continue; } case BACKE: /* last two characters were "\e" */ if (isxdigit((unsigned char)c)) { state = EBC; literal = 0; nc = 0; continue; } else { popup_an_error("String: Missing hex digits after \\e"); cancel_if_idle_command(); state = BASE; continue; } case OCTAL: /* have seen \ and one or more octal digits */ if (nc < 3 && isdigit((unsigned char)c) && c < '8') { literal = (literal * 8) + FROM_HEX(c); nc++; break; } else { key_UCharacter((unsigned char) literal, KT_STD, ia); state = BASE; continue; } case HEX: /* have seen \x and one or more hex digits */ if (nc < 4 && isxdigit((unsigned char)c)) { literal = (literal * 16) + FROM_HEX(c); nc++; break; } else { key_UCharacter((unsigned char) literal, KT_STD, ia); state = BASE; continue; } case EBC: /* have seen \e and one or more hex digits */ if (nc < 4 && isxdigit((unsigned char)c)) { literal = (literal * 16) + FROM_HEX(c); nc++; break; } else { vtrace(" %s -> Key(X'%02X')\n", ia_name[(int) ia], literal); if (!(literal & ~0xff)) { key_Character((unsigned char) literal, false, true); } else { unsigned char ebc_pair[2]; ebc_pair[0] = (literal >> 8) & 0xff; ebc_pair[1] = literal & 0xff; key_WCharacter(ebc_pair); } state = BASE; continue; } case XGE: /* have seen ESC */ switch (c) { case ';': /* FM */ key_Character(EBC_fm, false, true); break; case '*': /* DUP */ key_Character(EBC_dup, false, true); break; default: key_UCharacter((unsigned char) c, KT_GE, ia); break; } state = BASE; break; } ws++; xlen--; } switch (state) { case BASE: if (MarginedPaste() && BA_TO_COL(cursor_addr) < orig_col) { (void) remargin(orig_col); } break; case OCTAL: case HEX: key_UCharacter((unsigned char) literal, KT_STD, ia); state = BASE; if (MarginedPaste() && BA_TO_COL(cursor_addr) < orig_col) { (void) remargin(orig_col); } break; case EBC: vtrace(" %s -> Key(X'%02X')\n", ia_name[(int) ia], literal); key_Character((unsigned char) literal, false, true); state = BASE; if (MarginedPaste() && BA_TO_COL(cursor_addr) < orig_col) { (void) remargin(orig_col); } break; case BACKPF: if (nc > 0) { do_pf(literal); state = BASE; } break; case BACKPA: if (nc > 0) { do_pa(literal); state = BASE; } break; default: popup_an_error("String: Missing data after \\"); cancel_if_idle_command(); break; } return xlen; } /* Multibyte version of emulate_uinput. */ size_t emulate_input(const char *s, size_t len, bool pasting) { static ucs4_t *w_ibuf = NULL; static size_t w_ibuf_len = 0; int xlen; /* Convert from a multi-byte string to a Unicode string. */ if (len + 1 > w_ibuf_len) { w_ibuf_len = len + 1; w_ibuf = (ucs4_t *)Realloc(w_ibuf, w_ibuf_len * sizeof(ucs4_t)); } xlen = multibyte_to_unicode_string(s, len, w_ibuf, w_ibuf_len); if (xlen < 0) { return 0; /* failed */ } /* Process it as Unicode. */ return emulate_uinput(w_ibuf, xlen, pasting); } /* * Pretend that a sequence of hexadecimal characters was entered at the * keyboard. The input is a sequence of hexadecimal bytes, 2 characters * per byte. If connected in NVT mode, these are treated as ASCII * characters; if in 3270 mode, they are considered EBCDIC. * * Graphic Escapes are handled as \E. */ void hex_input(const char *s) { const char *t; bool escaped; unsigned char *xbuf = NULL; unsigned char *tbuf = NULL; int nbytes = 0; /* Validate the string. */ if (strlen(s) % 2) { popup_an_error("HexString: Odd number of characters in " "specification"); cancel_if_idle_command(); return; } t = s; escaped = false; while (*t) { if (isxdigit((unsigned char)*t) && isxdigit((unsigned char)*(t + 1))) { escaped = false; nbytes++; } else if (!strncmp(t, "\\E", 2) || !strncmp(t, "\\e", 2)) { if (escaped) { popup_an_error("HexString: Double \\E"); cancel_if_idle_command(); return; } if (!IN_3270) { popup_an_error("HexString: \\E in NVT mode"); cancel_if_idle_command(); return; } escaped = true; } else { popup_an_error("HexString: Illegal character in " "specification"); cancel_if_idle_command(); return; } t += 2; } if (escaped) { popup_an_error("HexString: Nothing follows \\E"); cancel_if_idle_command(); return; } /* Allocate a temporary buffer. */ if (!IN_3270 && nbytes) { tbuf = xbuf = (unsigned char *)Malloc(nbytes); } /* Pump it in. */ t = s; escaped = false; while (*t) { if (isxdigit((unsigned char)*t) && isxdigit((unsigned char)*(t + 1))) { unsigned c; c = (FROM_HEX(*t) * 16) + FROM_HEX(*(t + 1)); if (IN_3270) key_Character(c, escaped, true); else *tbuf++ = (unsigned char)c; escaped = false; } else if (!strncmp(t, "\\E", 2) || !strncmp(t, "\\e", 2)) { escaped = true; } t += 2; } if (!IN_3270 && nbytes) { net_hexnvt_out(xbuf, nbytes); Free(xbuf); } } /* * Set up the cursor and input field for command input. * Returns the length of the input field, or 0 if there is no field * to set up. */ int kybd_prime(void) { int baddr; register unsigned char fa; int len = 0; /* * No point in trying if the the keyboard is locked or we aren't in * 3270 mode. */ if (kybdlock || !IN_3270) { return 0; } /* * If unformatted, guess that we can use all the NULs from the cursor * address forward, leaving one empty slot to delimit the end of the * command. It's up to the host to make sense of what we send. */ if (!formatted) { baddr = cursor_addr; while (ea_buf[baddr].cc == EBC_null || ea_buf[baddr].cc == EBC_space) { len++; INC_BA(baddr); if (baddr == cursor_addr) { break; } } if (len) { len--; } return len; } fa = get_field_attribute(cursor_addr); if (ea_buf[cursor_addr].fa || FA_IS_PROTECTED(fa)) { /* * The cursor is not in an unprotected field. Find the * next one. */ baddr = next_unprotected(cursor_addr); /* If there isn't any, give up. */ if (!baddr) { return 0; } /* Move the cursor there. */ } else { /* Already in an unprotected field. Find its start. */ baddr = cursor_addr; while (!ea_buf[baddr].fa) { DEC_BA(baddr); } INC_BA(baddr); } /* Move the cursor to the beginning of the field. */ cursor_move(baddr); /* Erase it. */ while (!ea_buf[baddr].fa) { ctlr_add(baddr, 0, 0); len++; INC_BA(baddr); } /* Return the field length. */ return len; } /* * Translate a key name to a key, including APL and extended characters. */ static ks_t my_string_to_key(const char *s, enum keytype *keytypep, ucs4_t *ucs4) { ks_t k; int consumed; enum me_fail error; /* No UCS-4 yet. */ *ucs4 = 0L; /* Look for my contrived APL symbols. */ if (!strncmp(s, "apl_", 4)) { int is_ge; k = apl_string_to_key(s, &is_ge); if (is_ge) { *keytypep = KT_GE; } else { *keytypep = KT_STD; } return k; } else { /* Look for a standard HTML entity or X11 keysym name. */ k = string_to_key((char *)s); *keytypep = KT_STD; if (k != KS_NONE) { return k; } } /* Look for "euro". */ if (!strcasecmp(s, "euro")) { *ucs4 = 0x20ac; return KS_NONE; } /* Look for U+nnnn of 0xXXXX. */ if (!strncasecmp(s, "U+", 2) || !strncasecmp(s, "0x", 2)) { *ucs4 = strtoul(s + 2, NULL, 16); return KS_NONE; } /* Look for a valid local multibyte character. */ *ucs4 = multibyte_to_unicode(s, strlen(s), &consumed, &error); if ((size_t)consumed != strlen(s)) { *ucs4 = 0; } return KS_NONE; } static bool build_composites(void) { char *c, *c0, *c1; char *ln; char ksname[3][64]; char junk[2]; ks_t k[3]; enum keytype a[3]; int i; struct composite *cp; if (appres.interactive.compose_map == NULL) { popup_an_error("Compose: No %s defined", ResComposeMap); return false; } c0 = get_fresource("%s.%s", ResComposeMap, appres.interactive.compose_map); if (c0 == NULL) { popup_an_error("Compose: Cannot find %s \"%s\"", ResComposeMap, appres.interactive.compose_map); return false; } c1 = c = NewString(c0); /* will be modified by strtok */ while ((ln = strtok(c, "\n"))) { bool okay = true; c = NULL; if (sscanf(ln, " %63[^+ \t] + %63[^= \t] =%63s%1s", ksname[0], ksname[1], ksname[2], junk) != 3) { popup_an_error("Compose: Invalid syntax: %s", ln); continue; } for (i = 0; i < 3; i++) { ucs4_t ucs4; k[i] = my_string_to_key(ksname[i], &a[i], &ucs4); if (k[i] == KS_NONE) { /* For now, ignore UCS4. XXX: Fix this. */ popup_an_error("Compose: Invalid name: \"%s\"", ksname[i]); okay = false; break; } } if (!okay) { continue; } composites = (struct composite *) Realloc((char *)composites, (n_composites + 1) * sizeof(struct composite)); cp = composites + n_composites; cp->k1.key = k[0]; cp->k1.keytype = a[0]; cp->k2.key = k[1]; cp->k2.keytype = a[1]; cp->translation.key = k[2]; cp->translation.keytype = a[2]; n_composites++; } Free(c1); return true; } /* * Called by the toolkit when the "Compose" key is pressed. "Compose" is * implemented by pressing and releasing three keys: "Compose" and two * data keys. For example, "Compose" "s" "s" gives the German "ssharp" * character, and "Compose" "C", "," gives a capital "C" with a cedilla * (symbol Ccedilla). * * The mechanism breaks down a little when the user presses "Compose" and * then a non-data key. Oh well. */ static bool Compose_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Compose", ia, argc, argv); if (check_argc("Compose", argc, 0, 0) < 0) { return false; } reset_idle_timer(); if (!composites && !build_composites()) { return true; } if (composing == NONE) { composing = COMPOSE; status_compose(true, 0, KT_STD); } return true; } suite3270-3.6/Common/lazya.c0000664000076500007650000000566113221577163013720 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * lazya.c * Lazy allocations */ #include "globals.h" #include "trace.h" #include "utils.h" #include "lazya.h" #define LAZY_RING 64 /* ring buffer size */ static char *lazy_ring[LAZY_RING]; static int lazy_ix = 0; /** * Add a buffer to the lazy allocation ring. * * @param[in] buf Buffer to store * * @return buf, for convenience */ char * lazya(char *buf) { /* * Free whatever element we would overwrite, and store this buffer there. */ Replace(lazy_ring[lazy_ix], buf); /* Advance to the next slot. */ lazy_ix = (lazy_ix + 1) % LAZY_RING; return buf; } /** * Format a string into Malloc'd memory and put it into the lazy ring. * * @param[in] fmt Format * * @return Buffer */ char * lazyaf(const char *fmt, ...) { va_list args; char *r; va_start(args, fmt); r = xs_vbuffer(fmt, args); va_end(args); return lazya(r); } /** * Format a string into Malloc'd memory and put it into the lazy ring. * Varargs version. * * @param[in] fmt Format * * @return Buffer */ char * vlazyaf(const char *fmt, va_list args) { return lazya(xs_vbuffer(fmt, args)); } /** * Flush the lazy allocation ring. */ void lazya_flush(void) { int i; int nf = 0; for (i = 0; i < LAZY_RING; i++) { if (lazy_ring[i]) { nf++; } Replace(lazy_ring[i], NULL); } lazy_ix = 0; if (nf) { vtrace("lazya_flush: flushed %d elements\n", nf); } } suite3270-3.6/Common/lib3270_files.mk0000664000076500007650000000064413221577163015225 0ustar pdmpdm# Object files for lib3270. LIB3270_OBJECTS = Malloc.o XtGlue.o actions.o apl.o b8.o bind-opt.o charset.o \ ctlr.o event.o favicon.o fprint_screen.o ft.o ft_cut.o ft_dft.o \ glue.o host.o httpd-core.o httpd-io.o httpd-nodes.o idle.o kybd.o \ linemode.o llist.o macros.o nvt.o print_screen.o readres.o \ resources.o rpq.o sio_common.o sf.o telnet.o telnet_new_environ.o \ telnet_sio.o toggles.o trace.o util.o xio.o suite3270-3.6/Common/lib3270i_files.mk0000664000076500007650000000011213221577163015364 0ustar pdmpdm# Object files for lib3270i. LIB3270I_OBJECTS = pr3287_session.o scroll.o suite3270-3.6/Common/lib3270stubs_files.mk0000664000076500007650000000077313221577163016311 0ustar pdmpdm# Object files for lib3270stubs. LIB3270STUBS_OBJECTS = ft_gui_stubs.o glue_gui_stubs.o host_gui_stubs.o \ menubar_stubs.o nvt_gui_stubs.o popups_stubs.o \ pr3287_session_stubs.o print_gui_stubs.o product_stubs1.o \ product_stubs2.o product_stubs3.o product_stubs4.o save_stubs.o \ screen_stubs1.o screen_stubs2.o screen_stubs3.o screen_stubs4.o \ screen_stubs5.o screen_stubs6.o scroll_stubs.o select_stubs.o \ sio_none.o ssl_passwd_gui_stubs.o status_stubs.o telnet_gui_stubs.o \ trace_gui_stubs.o suite3270-3.6/Common/lib32xx_files.mk0000664000076500007650000000027513221577163015436 0ustar pdmpdm# Object files for lib32xx. LIB32XX_OBJECTS = asprintf.o indent_s.o lazya.o proxy.o resolver.o see.o \ sioc.o split_host.o tables.o unicode.o unicode_dbcs.o utf8.o varbuf.o \ xs_buffer.o suite3270-3.6/Common/libs.mk0000664000076500007650000000154413221577163013712 0ustar pdmpdm# Root of the library object directory. Assumes $(TOP) and $(HOST) are set. LIBOBJ = $(TOP)/obj/$(HOST) # For Unix, include generated library dependencies. ifndef WIN32_FLAGS include $(TOP)/lib/32xx/32xx-deplibs.mk endif # Library depend macros. DEP3270 = $(LIBOBJ)/lib3270/lib3270.a DEP3270I = $(LIBOBJ)/lib3270i/lib3270i.a DEP32XX = $(LIBOBJ)/lib32xx/lib32xx.a DEP3270STUBS = $(LIBOBJ)/lib3270stubs/lib3270stubs.a # Library reference macros. LD3270 = -L$(LIBOBJ)/lib3270 -l3270 LD3270I = -L$(LIBOBJ)/lib3270i -l3270i LD32XX = -L$(LIBOBJ)/lib32xx -l32xx $(LIB32XX_DEPLIBS) LD3270STUBS = -L$(LIBOBJ)/lib3270stubs -l3270stubs # Library build rules. $(DEP3270): cd $(TOP)/lib/$(W)3270 && $(MAKE) all $(DEP3270I): cd $(TOP)/lib/$(W)3270i && $(MAKE) all $(DEP32XX): cd $(TOP)/lib/$(W)32xx && $(MAKE) all $(DEP3270STUBS): cd $(TOP)/lib/$(W)3270stubs && $(MAKE) all suite3270-3.6/Common/linemode.c0000664000076500007650000002705613221577163014376 0ustar pdmpdm/* * Copyright (c) 1993-2016, Paul Mattes. * Copyright (c) 2004, Don Russell. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES AND * GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, * DON RUSSELL, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * linemode.c * TELNET NVT line-mode processing. */ #include "globals.h" #include "appres.h" #include "linemode.h" #include "nvt.h" #include "unicodec.h" #include "utils.h" #include "telnet.h" #define LM_BUFSZ 16384 typedef struct { ucs4_t ucs4; int mb_len; int echo_len; bool dbcs; } width_t; /* Globals */ /* Statics */ static unsigned char *lbuf = NULL; /* line-mode input buffer */ static unsigned char *lbptr; static width_t *widths = NULL; static bool lnext = false; static bool backslashed = false; static bool t_valid = false; static char vintr; static char vquit; static char verase; static char vkill; static char veof; static char vwerase; static char vrprnt; static char vlnext; static void do_data(char c); static void do_intr(char c); static void do_quit(char c); static void do_cerase(char c); static void do_werase(char c); static void do_kill(char c); static void do_rprnt(char c); static void do_eof(char c); static void do_eol(char c); static void do_lnext(char c); /** * Expand a character into a displayable string, which means expanding DEL to * "^?" and codes 0x00 through 0x1f to "^X" notation. * * @param[in] c character to expand * * @return String representation of c. */ static const char * just_ctl_see(int c) { static char buf[3]; unsigned char uc = c & 0xff; if (uc == 0x7f) { return "^?"; } if (uc < ' ') { buf[0] = '^'; buf[1] = uc + '@'; buf[2] = '\0'; } else { buf[0] = uc; buf[1] = '\0'; } return buf; } /** * Translate the input buffer into UCS4 characters and the number of positions * to back up per UCS4 character. * * @return number of UCS4 characters. */ static int expand_lbuf() { size_t len = lbptr - lbuf; unsigned char *xbptr = lbuf; int nx = 0; if (len == 0) { return 0; } if (widths != NULL) { Free(widths); } widths = (width_t *)Malloc(len * sizeof(width_t)); while (len) { int consumed; enum me_fail f; ucs4_t u; /* Handle nulls separately. */ if (*xbptr == '\0') { widths[nx].ucs4 = 0; widths[nx].mb_len = 1; widths[nx].echo_len = 2; /* ^@ */ widths[nx].dbcs = false; nx++; len--; xbptr++; continue; } u = multibyte_to_unicode((char *)xbptr, len, &consumed, &f); if (u == 0) { /* If we get an error, punt. */ len--; xbptr++; continue; } widths[nx].ucs4 = u; widths[nx].mb_len = consumed; if (u < ' ' || u == 0x7f) { widths[nx].echo_len = 2; /* ^X */ widths[nx].dbcs = false; } else if (u >= 0x2e80 && u <= 0xd7ff) { widths[nx].echo_len = 1; /* DBCS */ widths[nx].dbcs = true; } else { widths[nx].echo_len = 1; widths[nx].dbcs = false; } nx++; len -= consumed; xbptr += consumed; } return nx; } /* * parse_ctlchar * Parse an stty control-character specification. * A cheap, non-complaining implementation. */ static char parse_ctlchar(char *s) { if (!s || !*s) { return 0; } if ((int) strlen(s) > 1) { if (*s != '^') { return 0; } else if (*(s + 1) == '?') { return 0177; } else { return *(s + 1) - '@'; } } else { return *s; } } /** * Initialize the control characters for line mode. */ void linemode_init(void) { if (t_valid) { return; } vintr = parse_ctlchar(appres.linemode.intr); vquit = parse_ctlchar(appres.linemode.quit); verase = parse_ctlchar(appres.linemode.erase); vkill = parse_ctlchar(appres.linemode.kill); veof = parse_ctlchar(appres.linemode.eof); vwerase = parse_ctlchar(appres.linemode.werase); vrprnt = parse_ctlchar(appres.linemode.rprnt); vlnext = parse_ctlchar(appres.linemode.lnext); t_valid = true; } /* * linemode_out * Send output in NVT line mode. */ void linemode_out(const char *buf, size_t len) { size_t i; for (i = 0; i < len; i++) { char c = buf[i]; /* Input conversions. */ if (!lnext && c == '\r' && appres.linemode.icrnl) { c = '\n'; } else if (!lnext && c == '\n' && appres.linemode.inlcr) { c = '\r'; } /* Backslashes. */ if (c == '\\' && !backslashed) { backslashed = true; } else { backslashed = false; } /* Control chars. */ if (c == '\n') { do_eol(c); } else if (c == vintr) { do_intr(c); } else if (c == vquit) { do_quit(c); } else if (c == verase) { do_cerase(c); } else if (c == vkill) { do_kill(c); } else if (c == vwerase) { do_werase(c); } else if (c == vrprnt) { do_rprnt(c); } else if (c == veof) { do_eof(c); } else if (c == vlnext) { do_lnext(c); } else if (c == 0x08 || c == 0x7f) { /* Yes, a hack. */ do_cerase(c); } else { do_data(c); } } } void linemode_buf_init(void) { if (lbuf == NULL) { lbuf = (unsigned char *)Malloc(LM_BUFSZ); } lbptr = lbuf; lnext = false; backslashed = false; } static void nvt_process_s(const char *data) { while (*data) { nvt_process((unsigned int)*data++); } } static void nvt_backspace(bool dbcs) { nvt_process_s(dbcs? "\b\b \b\b" : "\b \b"); } static void forward_data(void) { net_cookedout((char *)lbuf, lbptr - lbuf); linemode_buf_init(); } static void do_data(char c) { if (lbptr + 1 < lbuf + LM_BUFSZ) { *lbptr++ = c; if (c == '\r') { *lbptr++ = '\0'; } nvt_process_s(just_ctl_see((int)c)); } else { nvt_process_s("\007"); } lnext = false; backslashed = false; } static void do_intr(char c) { if (lnext) { do_data(c); return; } nvt_process_s(ctl_see((int)c)); linemode_buf_init(); net_interrupt(); } static void do_quit(char c) { if (lnext) { do_data(c); return; } nvt_process_s(ctl_see((int)c)); linemode_buf_init(); net_break(); } /** * Erase a character. * * @param[in] c Input character that triggered the character erase. */ static void do_cerase(char c) { int n_ucs4; size_t len; if (backslashed) { lbptr--; nvt_process_s("\b"); do_data(c); return; } if (lnext) { do_data(c); return; } if (!(n_ucs4 = expand_lbuf())) { return; } lbptr -= widths[n_ucs4 - 1].mb_len; len = widths[n_ucs4 - 1].echo_len; while (len--) { nvt_backspace(widths[n_ucs4 - 1].dbcs); } } /** * Erase a word. * * @param[in] c Input character that triggered the word erase. */ static void do_werase(char c) { bool any = false; int n_ucs4; int ix; if (lnext) { do_data(c); return; } if (!(n_ucs4 = expand_lbuf())) { return; } for (ix = n_ucs4 - 1; ix >= 0; ix--) { ucs4_t ch = widths[ix].ucs4; size_t len; if (ch == ' ' || ch == '\t') { if (any) { break; } } else { any = true; } lbptr -= widths[ix].mb_len; len = widths[ix].echo_len; while (len--) { nvt_backspace(widths[ix].dbcs); } } } /** * Erase the whole input buffer. * * @param[in] c Input character that triggered the buffer kill. */ static void do_kill(char c) { int n_ucs4; int ix; if (backslashed) { lbptr--; nvt_process_s("\b"); do_data(c); return; } if (lnext) { do_data(c); return; } if (!(n_ucs4 = expand_lbuf())) { return; } for (ix = n_ucs4 - 1; ix >= 0; ix--) { int len = widths[ix].echo_len; while (len--) { nvt_backspace(widths[ix].dbcs); } } lbptr = lbuf; } /** * Reprint the input buffer. * * @param[in] c Input character that triggered the reprint. */ static void do_rprnt(char c) { unsigned char *p; int n_ucs4; int ix; if (lnext) { do_data(c); return; } nvt_process_s(just_ctl_see((int) c)); nvt_process_s("\r\n"); if (!(n_ucs4 = expand_lbuf())) { return; } p = lbuf; for (ix = 0; ix < n_ucs4; ix++) { ucs4_t ch = widths[ix].ucs4; if (ch < ' ') { nvt_process((unsigned int)'^'); nvt_process((unsigned int)(ch + '@')); } else if (ch == 0x7f) { nvt_process_s("^?"); } else { int i; for (i = 0; i < widths[ix].mb_len; i++) { nvt_process((unsigned int)(*(p + i))); } } p += widths[ix].mb_len; } } static void do_eof(char c) { if (backslashed) { lbptr--; nvt_process_s("\b"); do_data(c); return; } if (lnext) { do_data(c); return; } do_data(c); forward_data(); } static void do_eol(char c) { if (lnext) { do_data(c); return; } if (lbptr + 2 >= lbuf + LM_BUFSZ) { nvt_process_s("\007"); return; } *lbptr++ = '\r'; *lbptr++ = '\n'; nvt_process_s("\r\n"); forward_data(); } static void do_lnext(char c) { if (lnext) { do_data(c); return; } lnext = true; nvt_process_s("^\b"); } /* * linemode_chars * Report line-mode characters. */ struct ctl_char * linemode_chars(void) { static struct ctl_char c[9]; c[0].name = "intr"; strcpy(c[0].value, ctl_see(vintr)); c[1].name = "quit"; strcpy(c[1].value, ctl_see(vquit)); c[2].name = "erase"; strcpy(c[2].value, ctl_see(verase)); c[3].name = "kill"; strcpy(c[3].value, ctl_see(vkill)); c[4].name = "eof"; strcpy(c[4].value, ctl_see(veof)); c[5].name = "werase"; strcpy(c[5].value, ctl_see(vwerase)); c[6].name = "rprnt"; strcpy(c[6].value, ctl_see(vrprnt)); c[7].name = "lnext"; strcpy(c[7].value, ctl_see(vlnext)); c[8].name = NULL; return c; } /* * linemode_send_erase * Send the linemode ERASE character. */ void linemode_send_erase(void) { net_cookout(&verase, 1); } /* * linemode_send_kill * Send the linemode KILL character. */ void linemode_send_kill(void) { net_cookout(&vkill, 1); } /* * linemode_send_werase * Send the linemode WERASE character. */ void linemode_send_werase(void) { net_cookout(&vwerase, 1); } /* * linemode_dump() * Transition from line mode to character-at-a-time mode. * * Dump whatever is in the line mode buffer to the host. * This might result in double-echoing, but at least we won't lose any * input data. */ void linemode_dump(void) { forward_data(); } suite3270-3.6/Common/llist.c0000664000076500007650000000417513221577163013726 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * llist.c * Doubly-linked list utilities. */ #include "globals.h" #include "utils.h" bool llist_isempty(llist_t *l) { return l->next == l && l->prev == l; } void llist_init(llist_t *l) { l->next = l->prev = l; } void llist_insert_before(llist_t *element, llist_t *before) { element->next = before; element->prev = before->prev; before->prev->next = element; before->prev = element; } void llist_unlink(llist_t *element) { element->next->prev = element->prev; element->prev->next = element->next; } suite3270-3.6/Common/macros.c0000664000076500007650000026525213221577163014070 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * macros.c * This module handles string, macro and script (sms) processing. */ #include "globals.h" #if !defined(_WIN32) /*[*/ #include #include #include #include #include #else /*][*/ #include "wincmn.h" #endif /*]*/ #include #include #include #include #include "3270ds.h" #include "appres.h" #include "ctlr.h" #include "resources.h" #include "toggles.h" #include "actions.h" #include "bind-opt.h" #include "charset.h" #include "child.h" #include "ctlrc.h" #include "unicodec.h" #include "ft.h" #include "host.h" #include "idle.h" #include "kybd.h" #include "lazya.h" #include "macros.h" #include "menubar.h" #include "popups.h" #include "pr3287_session.h" #include "product.h" #include "screen.h" #include "split_host.h" #include "status.h" #include "telnet.h" #include "trace.h" #include "utf8.h" #include "utils.h" #include "varbuf.h" #include "xio.h" #include "w3misc.h" #define NVT_SAVE_SIZE 4096 #if defined(_WIN32) /*[*/ #define SOCK_CLOSE(s) closesocket(s) #else /*][*/ #define SOCK_CLOSE(s) close(s) #endif /*[*/ /* Maximum size of a macro (a line of script input). */ #define MSC_BUF 1024 /* Globals */ struct macro_def *macro_defs = NULL; bool macro_output = false; /* Statics */ typedef struct sms { struct sms *next; /* next sms on the stack */ char *msc; /* input buffer */ size_t msc_len;/* length of input buffer */ char *dptr; /* data pointer (macros only) */ enum sms_state { SS_IDLE, /* no command active (scripts only) */ SS_INCOMPLETE, /* command(s) buffered and ready to run */ SS_RUNNING, /* command executing */ SS_KBWAIT, /* command awaiting keyboard unlock */ SS_CONNECT_WAIT,/* command awaiting connection to complete */ SS_FT_WAIT, /* command awaiting file transfer to complete */ SS_TIME_WAIT, /* command awaiting simple timeout */ SS_PAUSED, /* stopped in PauseScript action */ SS_WAIT_NVT, /* awaiting completion of Wait(NVTMode) */ SS_WAIT_3270, /* awaiting completion of Wait(3270Mode) */ SS_WAIT_OUTPUT, /* awaiting completion of Wait(Output) */ SS_SWAIT_OUTPUT,/* awaiting completion of Snap(Wait) */ SS_WAIT_DISC, /* awaiting completion of Wait(Disconnect) */ SS_WAIT_IFIELD, /* awaiting completion of Wait(InputField) */ SS_WAIT_UNLOCK, /* awaiting completion of Wait(Unlock) */ SS_EXPECTING, /* awaiting completion of Expect() */ SS_CLOSING /* awaiting completion of CloseScript() */ } state; enum sms_type { ST_STRING, /* string */ ST_MACRO, /* macro */ ST_COMMAND, /* interactive command */ ST_KEYMAP, /* keyboard map */ ST_IDLE, /* idle command */ ST_CHILD, /* child process */ ST_PEER, /* peer (external) process */ ST_FILE, /* read commands from file */ ST_CB /* callback (httpd or other) */ #define NUM_ST (ST_CB + 1) } type; bool success; bool need_prompt; bool is_login; bool is_hex; /* flag for ST_STRING only */ bool output_wait_needed; bool executing; /* recursion avoidance */ bool accumulated; /* accumulated time flag */ bool idle_error; /* idle command caused an error */ bool is_socket; /* I/O is via a socket */ bool is_transient; /* I/O is via a transient socket */ bool is_external; /* I/O is via a transient socket to -socket */ unsigned long msec; /* total accumulated time */ FILE *outfile; int infd; socket_t insocket; #if defined(_WIN32) /*[*/ HANDLE inhandle; HANDLE child_handle; ioid_t exit_id; ioid_t listen_id; #endif /*]*/ int pid; ioid_t expect_id; ioid_t wait_id; struct sms_cbx { /* ST_CB context: */ const sms_cb_t *cb; /* callback block */ sms_cbh handle; /* handle */ } cbx; } sms_t; static sms_t *sms = NULL; static int sms_depth = 0; static socket_t socketfd = INVALID_SOCKET; static ioid_t socket_id = NULL_IOID; #if defined(_WIN32) /*[*/ static HANDLE socket_event = NULL; #endif /*]*/ #define VALID_INFD(sms) \ ((!(sms)->is_socket && (sms)->infd >= 0) || \ ((sms)->is_socket && (sms)->insocket != INVALID_SOCKET)) static const char *sms_state_name[] = { "IDLE", "INCOMPLETE", "RUNNING", "KBWAIT", "CONNECT_WAIT", "FT_WAIT", "TIME_WAIT", "PAUSED", "WAIT_NVT", "WAIT_3270", "WAIT_OUTPUT", "SWAIT_OUTPUT", "WAIT_DISC", "WAIT_IFIELD", "WAIT_UNLOCK", "EXPECTING", "CLOSING" }; static struct macro_def *macro_last = (struct macro_def *) NULL; static ioid_t stdin_id = NULL_IOID; static unsigned char *nvt_save_buf; static size_t nvt_save_cnt = 0; static int nvt_save_ix = 0; static char *expect_text = NULL; static size_t expect_len = 0; static const char *st_name[NUM_ST] = { "String", /* STRING */ "Macro", /* MACRO */ "Command", /* COMMAND */ "KeymapAction", /* KEYMAP */ "IdleCommand", /* IDLE */ "ChildScript", /* CHILD */ "PeerScript", /* PEER */ "File", /* FILE */ "Callback" /* CB */ }; static enum iaction st_cause[NUM_ST] = { IA_MACRO, /* STRING */ IA_MACRO, /* MACRO */ IA_COMMAND, /* COMMAND */ IA_KEYMAP, /* KEYMAP */ IA_IDLE, /* IDLE */ IA_MACRO, /* CHILD */ IA_MACRO, /* PEER */ IA_MACRO, /* FILE */ IA_MACRO /* CB (unused) */ }; #define ST_sNAME(s) st_name[(int)(s)->type] #define ST_NAME \ ((sms->type == ST_CB) ? sms->cbx.cb->shortname : ST_sNAME(sms)) #if defined(_WIN32) /*[*/ static HANDLE peer_thread; static HANDLE peer_enable_event, peer_done_event; static char peer_buf[256]; int peer_nr; int peer_errno; #endif /*]*/ static void cleanup_socket(bool b); static void script_prompt(bool success); static void script_input(iosrc_t fd, ioid_t id); static void sms_pop(bool can_exit); static void socket_connection(iosrc_t fd, ioid_t id); #if defined(_WIN32) /*[*/ static void child_socket_connection(iosrc_t fd, ioid_t id); static void child_exited(iosrc_t fd, ioid_t id); #endif /*]*/ static void wait_timed_out(ioid_t id); static void read_from_file(void); static sms_t *sms_redirect_to(void); /* Macro that defines that the keyboard is locked due to user input. */ #define KBWAIT (kybdlock & (KL_OIA_LOCKED|KL_OIA_TWAIT|KL_DEFERRED_UNLOCK|KL_ENTER_INHIBIT|KL_AWAITING_FIRST)) #define CKBWAIT (toggled(AID_WAIT) && KBWAIT) /* Macro that defines when it's safe to continue a Wait()ing sms. */ #define CAN_PROCEED ( \ IN_SSCP || \ (IN_3270 && (HOST_FLAG(NO_LOGIN_HOST) || \ (formatted && cursor_addr)) && !CKBWAIT) || \ (IN_NVT && !(kybdlock & KL_AWAITING_FIRST)) \ ) static action_t Abort_action; static action_t AnsiText_action; static action_t Ascii_action; static action_t AsciiField_action; static action_t CloseScript_action; static action_t ContinueScript_action; static action_t Ebcdic_action; static action_t EbcdicField_action; static action_t Execute_action; static action_t Expect_action; static action_t Macro_action; static action_t PauseScript_action; static action_t Query_action; static action_t ReadBuffer_action; static action_t Script_action; static action_t Snap_action; static action_t Source_action; static action_t Wait_action; static action_t Bell_action; static action_t Printer_action; static void trace_script_output(const char *fmt, ...) { va_list args; char *msgbuf; char *s; char *m; char c; if (!toggled(TRACING)) { return; } va_start(args, fmt); msgbuf = xs_vbuffer(fmt, args); va_end(args); m = msgbuf; s = msgbuf; while ((c = *s++)) { if (c == '\n') { vtrace("Output for %s[%d]: '%.*s'\n", ST_NAME, sms_depth, (int)((s - 1) - m), m); m = s; continue; } } Free(msgbuf); } /* Callbacks for state changes. */ static void sms_connect(bool connected) { /* Hack to ensure that disconnects don't cause infinite recursion. */ if (sms != NULL && sms->executing) { return; } if (!connected) { while (sms != NULL && sms->is_login) { #if !defined(_WIN32) /*[*/ if (sms->type == ST_CHILD && sms->pid > 0) { (void) kill(sms->pid, SIGTERM); } #endif /*]*/ sms_pop(false); } } sms_continue(); } static void sms_in3270(bool in3270) { if (in3270 || IN_SSCP) { sms_continue(); } } /** * Macros module registration. */ void macros_register(void) { static action_table_t macros_actions[] = { { "Abort", Abort_action, ACTION_KE }, { "AnsiText", AnsiText_action, 0 }, { "Ascii", Ascii_action, 0 }, { "AsciiField", AsciiField_action, 0 }, { "Bell", Bell_action, 0 }, { "CloseScript", CloseScript_action, 0 }, { "ContinueScript", ContinueScript_action, ACTION_KE }, { "Ebcdic", Ebcdic_action, 0 }, { "EbcdicField", EbcdicField_action, 0 }, { "Execute", Execute_action, ACTION_KE }, { "Expect", Expect_action, 0 }, { "Macro", Macro_action, ACTION_KE }, { "PauseScript", PauseScript_action, 0 }, { "Query", Query_action, 0 }, { "ReadBuffer", ReadBuffer_action, 0 }, { "Script", Script_action, ACTION_KE }, { "Snap", Snap_action, 0 }, { "Source", Source_action, ACTION_KE }, { "Wait", Wait_action, ACTION_KE } }; static action_table_t macros_dactions[] = { { "Printer", Printer_action, ACTION_KE }, }; static toggle_register_t toggles[] = { { AID_WAIT, NULL, 0 } }; /* Register for state changes. */ register_schange_ordered(ST_CONNECT, sms_connect, 2000); register_schange_ordered(ST_3270_MODE, sms_in3270, 2000); /* Register actions.*/ register_actions(macros_actions, array_count(macros_actions)); if (product_has_display()) { register_actions(macros_dactions, array_count(macros_dactions)); } /* Register toggles. */ register_toggles(toggles, array_count(toggles)); } /* Parse the macros resource into the macro list */ void macros_init(void) { char *s = NULL; char *name, *action; struct macro_def *m; int ns; int ix = 1; static char *last_s = NULL; /* Free the previous macro definitions. */ while (macro_defs) { m = macro_defs->next; Free(macro_defs); macro_defs = m; } macro_defs = NULL; macro_last = NULL; if (last_s) { Free(last_s); last_s = NULL; } /* Search for new ones. */ if (PCONNECTED) { char *rname; char *space; rname = NewString(current_host); if ((space = strchr(rname, ' '))) { *space = '\0'; } s = get_fresource("%s.%s", ResMacros, rname); Free(rname); } if (s == NULL) { if (appres.macros == NULL) { return; } s = NewString(appres.macros); } else { s = NewString(s); } last_s = s; while ((ns = split_dresource(&s, &name, &action)) == 1) { m = (struct macro_def *)Malloc(sizeof(*m)); if (!split_hier(name, &m->name, &m->parents)) { Free(m); continue; } m->action = action; if (macro_last) { macro_last->next = m; } else { macro_defs = m; } m->next = NULL; macro_last = m; ix++; } if (ns < 0) { xs_warning("Error in macro %d", ix); } } /* * Enable input from a script. */ static void script_enable(void) { #if defined(_WIN32) /*[*/ /* Windows child scripts are listening sockets. */ if (sms->type == ST_CHILD && sms->inhandle != INVALID_HANDLE_VALUE) { sms->listen_id = AddInput(sms->inhandle, child_socket_connection); return; } #endif /*]*/ if (VALID_INFD(sms) && stdin_id == NULL_IOID) { vtrace("Enabling input for %s[%d]\n", ST_NAME, sms_depth); #if defined(_WIN32) /*[*/ stdin_id = AddInput(sms->inhandle, script_input); #else /*][*/ if (sms->is_socket) { stdin_id = AddInput(sms->insocket, script_input); } else { stdin_id = AddInput(sms->infd, script_input); } #endif /*]*/ } } /* * Disable input from a script. */ static void script_disable(void) { if (stdin_id != NULL_IOID) { vtrace("Disabling input for %s[%d]\n", ST_NAME, sms_depth); RemoveInput(stdin_id); stdin_id = NULL_IOID; } } /* Allocate a new sms. */ static sms_t * new_sms(enum sms_type type) { sms_t *s; s = (sms_t *)Calloc(1, sizeof(sms_t)); s->state = SS_IDLE; s->type = type; s->success = true; s->need_prompt = false; s->is_login = false; s->outfile = NULL; s->infd = -1; s->insocket = INVALID_SOCKET; #if defined(_WIN32) /*[*/ s->inhandle = INVALID_HANDLE_VALUE; s->child_handle = INVALID_HANDLE_VALUE; #endif /*]*/ s->pid = -1; s->expect_id = NULL_IOID; s->wait_id = NULL_IOID; s->output_wait_needed = false; s->executing = false; s->accumulated = false; s->idle_error = false; s->msec = 0L; return s; } /* * Push an sms definition on the stack. * Returns whether or not that is legal. */ static bool sms_push(enum sms_type type) { sms_t *s; /* Preempt any running sms. */ if (sms != NULL) { /* Remove the running sms's input. */ script_disable(); } s = new_sms(type); if (sms != NULL) { s->is_login = sms->is_login; /* propagate from parent */ } s->next = sms; sms = s; /* Enable the abort button on the menu and the status indication. */ if (++sms_depth == 1) { menubar_as_set(true); status_script(true); } if (nvt_save_buf == NULL) { nvt_save_buf = (unsigned char *)Malloc(NVT_SAVE_SIZE); } return true; } /* * Add an sms definition to the _bottom_ of the stack. */ static sms_t * sms_enqueue(enum sms_type type) { sms_t *s, *t, *t_prev = NULL; /* Allocate and initialize a new structure. */ s = new_sms(type); /* Find the bottom of the stack. */ for (t = sms; t != NULL; t = t->next) { t_prev = t; } if (t_prev == NULL) { /* Empty stack. */ s->next = sms; sms = s; /* * Enable the abort button on the menu and the status * line indication. */ menubar_as_set(true); status_script(true); } else { /* Add to bottom. */ s->next = NULL; t_prev->next = s; } sms_depth++; if (nvt_save_buf == NULL) { nvt_save_buf = (unsigned char *)Malloc(NVT_SAVE_SIZE); } return s; } /* Pop an sms definition off the stack. */ static void sms_pop(bool can_exit) { sms_t *s; vtrace("%s[%d] complete\n", ST_NAME, sms_depth); /* When you pop the peer script, that's the end of x3270. */ if (sms->type == ST_PEER && !sms->is_transient && can_exit) { x3270_exit(0); } /* If this is a callback or script macro, propagate the state. */ if (sms->next != NULL && (sms->next->type == ST_CB || sms->next->type == ST_CHILD || sms->next->type == ST_PEER)) { sms->next->success = sms->success; } /* Remove the input event. */ script_disable(); /* Close the files. */ if (sms->outfile != NULL) { fclose(sms->outfile); } if (VALID_INFD(sms)) { if (sms->is_socket) { SOCK_CLOSE(sms->insocket); } else { close(sms->infd); } } /* Cancel any pending timeouts. */ if (sms->expect_id != NULL_IOID) { RemoveTimeOut(sms->expect_id); } if (sms->wait_id != NULL_IOID) { RemoveTimeOut(sms->wait_id); } /* * If this was an idle command that generated an error, now is the * time to announce that. (If we announced it when the error first * occurred, we might be telling the wrong party, such as a script.) */ if (sms->idle_error) { popup_an_error("Idle command disabled due to error"); } /* If this was a -socket peer, get ready for another connection. */ if (sms->type == ST_PEER && sms->is_external) { if (appres.script_port_once) { vtrace("EOF on socket with %s set, exiting\n", ResScriptPortOnce); x3270_exit(0); } #if defined(_WIN32) /*[*/ socket_id = AddInput(socket_event, socket_connection); #else /*][*/ socket_id = AddInput(socketfd, socket_connection); #endif /*]*/ } /* Release the memory. */ s = sms; if (s->msc != NULL) { Free(s->msc); } sms = s->next; Free(s); sms_depth--; if (sms == NULL) { /* Turn off the menu option. */ menubar_as_set(false); status_script(false); } else if (CKBWAIT && (int)sms->state < (int)SS_KBWAIT) { /* The child implicitly blocked the parent. */ sms->state = SS_KBWAIT; vtrace("%s[%d] implicitly paused %s\n", ST_NAME, sms_depth, sms_state_name[sms->state]); } else if (sms->state == SS_IDLE && sms->type != ST_FILE) { /* The parent needs to be restarted. */ script_enable(); } else if (sms->type == ST_FILE) { read_from_file(); } #if defined(_WIN32) /*[*/ /* If the new top sms is an exited script, pop it, too. */ if (sms != NULL && sms->type == ST_CHILD && sms->child_handle == INVALID_HANDLE_VALUE) { sms_pop(false); } #endif /*]*/ } #if defined(_WIN32) /*[*/ /* stdin input thread */ static DWORD WINAPI peer_read(LPVOID lpParameter _is_unused) { for (;;) { DWORD rv; rv = WaitForSingleObject(peer_enable_event, INFINITE); switch (rv) { case WAIT_ABANDONED: case WAIT_TIMEOUT: case WAIT_FAILED: peer_nr = -1; peer_errno = EINVAL; SetEvent(peer_done_event); break; case WAIT_OBJECT_0: peer_nr = read(0, peer_buf, sizeof(peer_buf)); if (peer_nr < 0) { peer_errno = errno; } SetEvent(peer_done_event); break; } } return 0; } #endif /*]*/ /* * Peer script initialization. * * Must be called after the initial call to connect to the host from the * command line, so that the initial state can be set properly. */ void peer_script_init(void) { sms_t *s; bool on_top; if (appres.script_port) { struct sockaddr *sa; socklen_t sa_len; int on = 1; char hostbuf[256]; if (!parse_bind_opt(appres.script_port, &sa, &sa_len)) { popup_an_error("Invalid script port value '%s', " "ignoring", appres.script_port); return; } #if !defined(_WIN32) /*[*/ if (appres.socket) { xs_warning("-scriptport overrides -socket"); } #endif /*]*/ /* -scriptport overrides -script */ appres.scripted = false; /* Create the listening socket. */ socketfd = socket(sa->sa_family, SOCK_STREAM, 0); if (socketfd == INVALID_SOCKET) { #if !defined(_WIN32) /*[*/ popup_an_errno(errno, "script port socket()"); #else /*][*/ popup_an_error("script port socket(): %s", win32_strerror(GetLastError())); #endif /*]*/ Free(sa); return; } if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { #if !defined(_WIN32) /*[*/ popup_an_errno(errno, "script port setsockopt(SO_REUSEADDR)"); #else /*][*/ popup_an_error("script port setsockopt(SO_REUSEADDR): %s", win32_strerror(GetLastError())); #endif /*]*/ Free(sa); return; } if (bind(socketfd, sa, sa_len) < 0) { #if !defined(_WIN32) /*[*/ popup_an_errno(errno, "script port socket bind"); #else /*][*/ popup_an_error("script port socket bind: %s", win32_strerror(GetLastError())); #endif /*]*/ SOCK_CLOSE(socketfd); socketfd = -1; Free(sa); return; } if (listen(socketfd, 1) < 0) { #if !defined(_WIN32) /*[*/ popup_an_errno(errno, "script port socket listen"); #else /*][*/ popup_an_error("script port socket listen: %s", win32_strerror(GetLastError())); #endif /*]*/ SOCK_CLOSE(socketfd); socketfd = -1; Free(sa); return; } #if defined(_WIN32) /*[*/ socket_event = CreateEvent(NULL, FALSE, FALSE, NULL); if (socket_event == NULL) { popup_an_error("script port CreateEvent: %s", win32_strerror(GetLastError())); SOCK_CLOSE(socketfd); socketfd = -1; Free(sa); return; } if (WSAEventSelect(socketfd, socket_event, FD_ACCEPT) != 0) { popup_an_error("script port WSAEventSelect: %s", win32_strerror(GetLastError())); SOCK_CLOSE(socketfd); socketfd = -1; Free(sa); return; } socket_id = AddInput(socket_event, socket_connection); #else /*][*/ socket_id = AddInput(socketfd, socket_connection); #endif/*]*/ register_schange(ST_EXITING, cleanup_socket); if (sa->sa_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in *)sa; vtrace("Listening on script port %s (%s, port %u).\n", appres.script_port, inet_ntop(sa->sa_family, &sin->sin_addr, hostbuf, sizeof(hostbuf)), ntohs(sin->sin_port)); } #if defined(X3270_IPV6) /*[*/ else { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; vtrace("Listening on script port %s (%s, port %u).\n", appres.script_port, inet_ntop(sa->sa_family, &sin6->sin6_addr, hostbuf, sizeof(hostbuf)), ntohs(sin6->sin6_port)); } #endif /*]*/ Free(sa); return; } #if !defined(_WIN32) /*[*/ if (appres.socket && !appres.script_port) { struct sockaddr_un ssun; /* -socket overrides -script */ appres.scripted = false; /* Create the listening socket. */ socketfd = socket(AF_UNIX, SOCK_STREAM, 0); if (socketfd < 0) { popup_an_errno(errno, "script Unix-domain socket"); return; } (void) memset(&ssun, '\0', sizeof(ssun)); ssun.sun_family = AF_UNIX; (void) snprintf(ssun.sun_path, sizeof(ssun.sun_path), "/tmp/x3sck.%u", (unsigned)getpid()); (void) unlink(ssun.sun_path); if (bind(socketfd, (struct sockaddr *)&ssun, sizeof(ssun)) < 0) { popup_an_errno(errno, "script Unix-domain socket bind"); close(socketfd); socketfd = -1; return; } if (listen(socketfd, 1) < 0) { popup_an_errno(errno, "script Unix-domain socket listen"); close(socketfd); socketfd = -1; (void) unlink(ssun.sun_path); return; } socket_id = AddInput(socketfd, socket_connection); register_schange(ST_EXITING, cleanup_socket); return; } #endif /*]*/ if (appres.httpd_port) { appres.scripted = false; } if (!appres.scripted) { return; } if (sms == NULL) { /* No login script running, simply push a new sms. */ (void) sms_push(ST_PEER); s = sms; on_top = true; } else { /* Login script already running, pretend we started it. */ s = sms_enqueue(ST_PEER); s->state = SS_RUNNING; on_top = false; } s->infd = fileno(stdin); #if defined(_WIN32) /*[*/ peer_enable_event = CreateEvent(NULL, FALSE, FALSE, NULL); peer_done_event = s->inhandle = CreateEvent(NULL, FALSE, FALSE, NULL); peer_thread = CreateThread(NULL, 0, peer_read, NULL, 0, NULL); if (peer_thread == NULL) { popup_an_error("Cannot create peer script thread: %s\n", win32_strerror(GetLastError())); } SetEvent(peer_enable_event); #endif /*]*/ s->outfile = stdout; (void) SETLINEBUF(s->outfile); /* even if it's a pipe */ if (on_top) { if (HALF_CONNECTED || (CONNECTED && (kybdlock & KL_AWAITING_FIRST))) { s->state = SS_CONNECT_WAIT; } else { script_enable(); } } } /* Accept a new socket connection. */ static void socket_connection(iosrc_t fd _is_unused, ioid_t id _is_unused) { socket_t accept_fd; sms_t *s; /* Accept the connection. */ #if !defined(_WIN32) /*[*/ if (appres.script_port) #endif /*]*/ { union { struct sockaddr sa; struct sockaddr_in sin; #if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sin6; #endif /*]*/ } sa; socklen_t len = sizeof(sa); char hostbuf[128]; accept_fd = accept(socketfd, &sa.sa, &len); if (accept_fd != INVALID_SOCKET) { if (sa.sa.sa_family == AF_INET) { vtrace("New script socket connection from %s:%u\n", inet_ntop(AF_INET, &sa.sin.sin_addr, hostbuf, sizeof(hostbuf)), ntohs(sa.sin.sin_port)); } #if defined(X3270_IPV6) /*[*/ else if (sa.sa.sa_family == AF_INET6) { vtrace("New script socket connection from %s:%u\n", inet_ntop(AF_INET6, &sa.sin6.sin6_addr, hostbuf, sizeof(hostbuf)), ntohs(sa.sin6.sin6_port)); } #endif /*]*/ else { vtrace("New script socket connection from ???\n"); } } } #if !defined(_WIN32) /*[*/ else { struct sockaddr_un ssun; socklen_t len = sizeof(ssun); (void) memset(&ssun, '\0', sizeof(ssun)); ssun.sun_family = AF_UNIX; accept_fd = accept(socketfd, (struct sockaddr *)&ssun, &len); if (accept_fd != INVALID_SOCKET) { vtrace("New Unix-domain script socket connection\n"); } } #endif /*]*/ if (accept_fd == INVALID_SOCKET) { popup_an_errno(errno, "script socket accept"); return; } /* Push on a peer script. */ (void) sms_push(ST_PEER); s = sms; s->is_transient = true; s->is_external = true; s->insocket = accept_fd; #if !defined(_WIN32) /*[*/ s->outfile = fdopen(dup(accept_fd), "w"); #endif /*]*/ #if defined(_WIN32) /*[*/ s->inhandle = CreateEvent(NULL, FALSE, FALSE, NULL); if (s->inhandle == NULL) { fprintf(stderr, "Can't create socket handle\n"); exit(1); } if (WSAEventSelect(s->insocket, s->inhandle, FD_READ | FD_CLOSE) != 0) { fprintf(stderr, "Can't set socket handle events\n"); exit(1); } #endif /*]*/ s->is_socket = true; script_enable(); /* Don't accept any more connections. */ RemoveInput(socket_id); socket_id = NULL_IOID; } # if defined(_WIN32) /*[*/ /* Accept a new socket connection from a child process. */ static void child_socket_connection(iosrc_t fd _is_unused, ioid_t id _is_unused) { socket_t accept_fd; sms_t *old_sms; sms_t *s; struct sockaddr_in sin; socklen_t len = sizeof(sin); /* Accept the connection. */ (void) memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; accept_fd = accept(sms->insocket, (struct sockaddr *)&sin, &len); if (accept_fd == INVALID_SOCKET) { popup_an_error("script socket accept: %s", win32_strerror(GetLastError())); return; } vtrace("New child script socket connection\n"); /* Push on a peer script. */ old_sms = sms; (void) sms_push(ST_PEER); s = sms; s->is_transient = true; s->insocket = accept_fd; s->inhandle = CreateEvent(NULL, FALSE, FALSE, NULL); if (s->inhandle == NULL) { fprintf(stderr, "Can't create socket handle\n"); exit(1); } if (WSAEventSelect(s->insocket, s->inhandle, FD_READ | FD_CLOSE) != 0) { fprintf(stderr, "Can't set socket handle events\n"); exit(1); } s->is_socket = true; script_enable(); /* Don't accept any more connections on the global listen socket. */ RemoveInput(old_sms->listen_id); old_sms->listen_id = NULL_IOID; } #endif /*]*/ /* Clean up the Unix-domain socket. */ static void cleanup_socket(bool b _is_unused) { #if !defined(_WIN32) /*[*/ (void) unlink(lazyaf("/tmp/x3sck.%u", getpid())); #endif /*]*/ } #if defined(_WIN32) /*[*/ /* Process an event on a child script handle (presumably a process exit). */ static void child_exited(iosrc_t fd _is_unused, ioid_t id _is_unused) { sms_t *s; DWORD status; for (s = sms; s != NULL; s = s->next) { if (s->type == ST_CHILD) { status = 0; if (GetExitCodeProcess(s->child_handle, &status) == 0) { popup_an_error("GetExitCodeProcess failed: %s", win32_strerror(GetLastError())); } else if (status != STILL_ACTIVE) { vtrace("Child script exited with status 0x%x\n", (unsigned)status); CloseHandle(s->child_handle); s->child_handle = INVALID_HANDLE_VALUE; RemoveInput(s->exit_id); s->exit_id = NULL_IOID; if (s == sms) { sms_pop(false); sms_continue(); } break; } } } } #endif /*]*/ /* * Interpret and execute a script or macro command. */ enum em_stat { EM_CONTINUE, EM_PAUSE, EM_ERROR }; static enum em_stat execute_command(enum iaction cause, char *s, char **np) { # define MAX_ANAME 64 enum { ME_GND, /* before action name */ ME_COMMENT, /* within a comment */ ME_FUNCTION, /* within action name */ ME_FUNCTIONx, /* saw whitespace after action name */ ME_LPAREN, /* saw left paren */ ME_P_PARM, /* paren: within unquoted parameter */ ME_P_QPARM, /* paren: within quoted parameter */ ME_P_BSL, /* paren: after backslash in quoted parameter */ ME_P_PARMx, /* paren: saw whitespace after parameter */ ME_S_PARM, /* space: within unquoted parameter */ ME_S_QPARM, /* space: within quoted parameter */ ME_S_BSL, /* space: after backslash in quoted parameter */ ME_S_PARMx /* space: saw whitespace after parameter */ } state = ME_GND; char c; char aname[MAX_ANAME+1]; int nx = 0; unsigned param_count = 0; /* parameter count */ unsigned vbcount = 0; /* allocated parameter count */ varbuf_t *r = NULL; /* accumulated parameters */ int failreason = 0; action_elt_t *e; action_elt_t *any = NULL; action_elt_t *exact = NULL; unsigned i; enum em_stat rc = EM_ERROR; /* failure return code */ static const char *fail_text[] = { /*1*/ "Action name must begin with an alphanumeric character", /*2*/ "Syntax error in action name", /*3*/ "Syntax error: \")\" or \",\" expected", /*4*/ "Extra data after parameters", /*5*/ "Syntax error: \")\" expected" }; #define fail(n) { failreason = n; goto failure; } while ((c = *s++)) { if ((param_count + 1) > vbcount) { /* Allocate a varbuf for the next parameter. */ r = (varbuf_t *)Realloc(r, (param_count + 1) * sizeof(varbuf_t)); vb_init(&r[param_count]); vbcount = param_count + 1; } switch (state) { case ME_GND: if (isspace((unsigned char)c)) { continue; } else if (isalnum((unsigned char)c)) { state = ME_FUNCTION; nx = 0; aname[nx++] = c; } else if (c == '!' || c == '#') { state = ME_COMMENT; } else { fail(1); } break; case ME_COMMENT: break; case ME_FUNCTION: /* within function name */ if (c == '(' || isspace((unsigned char)c)) { aname[nx] = '\0'; if (c == '(') { nx = 0; state = ME_LPAREN; } else { state = ME_FUNCTIONx; } } else if (isalnum((unsigned char)c) || c == '_' || c == '-') { if (nx < MAX_ANAME) { aname[nx++] = c; } } else { fail(2); } break; case ME_FUNCTIONx: /* space after function name */ if (isspace((unsigned char)c)) { continue; } else if (c == '(') { nx = 0; state = ME_LPAREN; } else if (c == '"') { nx = 0; state = ME_S_QPARM; } else { state = ME_S_PARM; nx = 0; vb_append(&r[param_count], &c, 1); } break; case ME_LPAREN: if (isspace((unsigned char)c)) { continue; } else if (c == '"') { state = ME_P_QPARM; } else if (c == ',') { param_count++; } else if (c == ')') { goto success; } else { state = ME_P_PARM; vb_append(&r[param_count], &c, 1); } break; case ME_P_PARM: if (isspace((unsigned char)c)) { param_count++; state = ME_P_PARMx; } else if (c == ')') { param_count++; goto success; } else if (c == ',') { param_count++; state = ME_LPAREN; } else { vb_append(&r[param_count], &c, 1); } break; case ME_P_BSL: if (c == 'n') { vb_append(&r[param_count], "\n", 1); } else { if (c != '"') { vb_append(&r[param_count], "\\", 1); } vb_append(&r[param_count], &c, 1); } state = ME_P_QPARM; break; case ME_P_QPARM: if (c == '"') { param_count++; state = ME_P_PARMx; } else if (c == '\\') { state = ME_P_BSL; } else { vb_append(&r[param_count], &c, 1); } break; case ME_P_PARMx: if (isspace((unsigned char)c)) { continue; } else if (c == ',') { state = ME_LPAREN; } else if (c == ')') { goto success; } else { fail(3); } break; case ME_S_PARM: if (isspace((unsigned char)c)) { param_count++; state = ME_S_PARMx; } else { vb_append(&r[param_count], &c, 1); } break; case ME_S_BSL: if (c == 'n') { vb_append(&r[param_count], "\n", 1); } else { if (c != '"') { vb_append(&r[param_count], "\\", 1); } vb_append(&r[param_count], &c, 1); } state = ME_S_QPARM; break; case ME_S_QPARM: if (c == '"') { param_count++; state = ME_S_PARMx; } else if (c == '\\') { state = ME_S_BSL; } else { vb_append(&r[param_count], &c, 1); } break; case ME_S_PARMx: if (isspace((unsigned char)c)) { continue; } else if (c == '"') { state = ME_S_QPARM; } else { vb_append(&r[param_count], &c, 1); state = ME_S_PARM; } break; } } /* Terminal state. */ switch (state) { case ME_FUNCTION: /* mid-function-name */ aname[nx] = '\0'; break; case ME_FUNCTIONx: /* space after function */ break; case ME_GND: /* nothing */ case ME_COMMENT: if (np) { *np = s - 1; } rc = EM_CONTINUE; goto silent_failure; case ME_S_PARMx: /* space after space-style parameter */ break; case ME_S_PARM: /* mid space-style parameter */ param_count++; break; default: fail(5); } success: if (c) { while (*s && isspace((unsigned char)*s)) { s++; } if (*s) { if (np) { *np = s; } else { fail(4); } } else if (np) { *np = s; } } else if (np) { *np = s-1; } /* * There used to be logic to do variable substituion here under most * circumstances. That's just plain wrong. * * Substitutions should be handled for specific arguments to specific * actions. If substitutions are needed for special situations, they * should be added explicitly, or new actions or variants of actions * should be added that include the substitutions. */ /* Search the action list. */ FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strcasecmp(aname, e->t.name)) { exact = any = e; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (exact == NULL) { FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strncasecmp(aname, e->t.name, strlen(aname))) { if (any != NULL) { popup_an_error("Ambiguous action name: %s", aname); goto silent_failure; } any = e; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); } if (any != NULL) { const char **params = NULL; sms->accumulated = false; sms->msec = 0L; if (param_count) { /* Create the parameter array. */ params = (const char **)Malloc(param_count * sizeof(const char *)); for (i = 0; i < param_count; i++) { params[i] = vb_buf(&r[i])? vb_buf(&r[i]) : NewString(""); } } run_action_entry(any, cause, param_count, param_count? params: NULL); if (vbcount) { /* Free the varbuf array. */ Free((char *)params); for (i = 0; i < vbcount; i++) { vb_free(&r[i]); } Free(r); r = NULL; } /* Refresh the screen, in case the action changed it. */ screen_disp(false); } else { popup_an_error("Unknown action: %s", aname); goto silent_failure; } /* If it produced an error message, it failed. */ if (!sms->success) { return EM_ERROR; } if (ft_state != FT_NONE) { sms->state = SS_FT_WAIT; } trace_rollover_check(); if (CKBWAIT) { return EM_PAUSE; } else { return EM_CONTINUE; } failure: popup_an_error("%s", fail_text[failreason-1]); silent_failure: if (vbcount) { for (i = 0; i < vbcount; i++) { vb_free(&r[i]); } Free(r); } return rc; #undef fail } /* Run the string at the top of the stack. */ static void run_string(void) { size_t len; size_t len_left; vtrace("%s[%d] running\n", ST_NAME, sms_depth); sms->state = SS_RUNNING; len = strlen(sms->dptr); vtrace("%sString[%d]: '%s'\n", sms->is_hex ? "Hex" : "", sms_depth, sms->dptr); if (sms->is_hex) { if (CKBWAIT) { sms->state = SS_KBWAIT; vtrace("%s[%d] paused %s\n", ST_NAME, sms_depth, sms_state_name[sms->state]); } else { hex_input(sms->dptr); sms_pop(false); } } else { if ((len_left = emulate_input(sms->dptr, len, false))) { sms->dptr += len - len_left; if (CKBWAIT) { sms->state = SS_KBWAIT; vtrace("%s[%d] paused %s\n", ST_NAME, sms_depth, sms_state_name[sms->state]); } } else { sms_pop(false); } } } /* Run the macro at the top of the stack. */ static void run_macro(void) { char *a = sms->dptr; char *nextm; enum em_stat es; sms_t *s; vtrace("%s[%d] running\n", ST_NAME, sms_depth); /* * Keep executing commands off the line until one pauses or * we run out of commands. */ while (*a) { enum iaction ia; /* * Check for command failure. */ if (!sms->success) { vtrace("%s[%d] failed\n", ST_NAME, sms_depth); /* Propagate it. */ if (sms->next != NULL) { sms->next->success = false; } break; } sms->state = SS_RUNNING; vtrace("%s[%d]: '%s'\n", ST_NAME, sms_depth, a); s = sms; s->success = true; s->executing = true; if (s->type == ST_MACRO && s->next != NULL && s->next->type == ST_CB) { ia = s->next->cbx.cb->ia; } else if (s->type == ST_MACRO && s->next != NULL && (s->next->type == ST_CHILD || s->next->type == ST_PEER)) { ia = IA_SCRIPT; } else { ia = st_cause[s->type]; } es = execute_command(ia, a, &nextm); s->executing = false; s->dptr = nextm; /* * If a new sms was started, we will be resumed * when it completes. */ if (sms != s) { return; } /* Macro could not execute. Abort it. */ if (es == EM_ERROR) { vtrace("%s[%d] error\n", ST_NAME, sms_depth); /* Propagate it. */ if (sms->next != NULL) { sms->next->success = false; } /* If it was an idle command, cancel it. */ cancel_if_idle_command(); break; } /* Macro paused, implicitly or explicitly. Suspend it. */ if (es == EM_PAUSE || (int)sms->state >= (int)SS_KBWAIT) { if (sms->state == SS_RUNNING) { sms->state = SS_KBWAIT; } vtrace("%s[%d] paused %s\n", ST_NAME, sms_depth, sms_state_name[sms->state]); sms->dptr = nextm; return; } /* Macro ran. */ a = nextm; } /* Finished with this macro. */ sms_pop(false); /* If the top sms is now in closing state, pop it, too. */ if (sms != NULL && sms->state == SS_CLOSING) { sms_pop(false); } } /* Push a macro (macro, command or keymap action) on the stack. */ static void push_xmacro(enum sms_type type, const char *s, size_t len, bool is_login) { macro_output = false; if (!sms_push(type)) { return; } sms->msc = Malloc(len + 1); (void) memcpy(sms->msc, s, len + 1); sms->msc_len = strlen(sms->msc); sms->dptr = sms->msc; if (is_login) { sms->state = SS_WAIT_IFIELD; sms->is_login = true; } else { sms->state = SS_INCOMPLETE; } sms_continue(); } /* Push a macro on the stack. */ void push_macro(char *s, bool is_login) { push_xmacro(ST_MACRO, s, strlen(s), is_login); } /* Push an interactive command on the stack. */ void push_command(char *s) { push_xmacro(ST_COMMAND, s, strlen(s), false); } /* Push a keymap action on the stack. */ void push_keymap_action(char *s) { push_xmacro(ST_KEYMAP, s, strlen(s), false); } /* Push an idle action on the stack. */ void push_idle(char *s) { push_xmacro(ST_IDLE, s, strlen(s), false); } /* Push a string on the stack. */ static void push_string(char *s, bool is_login, bool is_hex) { if (!sms_push(ST_STRING)) { return; } sms->msc = NewString(s); sms->msc_len = strlen(sms->msc); sms->dptr = sms->msc; if (is_login) { sms->state = SS_WAIT_IFIELD; sms->is_login = true; } else { sms->state = SS_INCOMPLETE; } sms->is_hex = is_hex; if (sms_depth == 1) { sms_continue(); } } /* Push a Source'd file on the stack. */ static void push_file(int fd) { if (!sms_push(ST_FILE)) { return; } sms->infd = fd; read_from_file(); } /* Push a callback on the stack. */ void push_cb(const char *buf, size_t len, const sms_cb_t *cb, sms_cbh handle) { /* Push the callback sms on the stack. */ if (!sms_push(ST_CB)) { return; } sms->cbx.cb = cb; sms->cbx.handle = handle; sms->state = SS_RUNNING; sms->need_prompt = true; /* Push the command in as a macro on top of that. */ push_xmacro(ST_MACRO, buf, len, false); } /* Set a pending string. */ void ps_set(char *s, bool is_hex) { push_string(s, false, is_hex); } /* Callback for macros menu. */ void macro_command(struct macro_def *m) { push_macro(m->action, false); } /* * If the string looks like an action, e.g., starts with "Xxx(", run a login * macro. Otherwise, set a simple pending login string. */ void login_macro(char *s) { char *t = s; bool looks_right = false; while (isspace((unsigned char)*t)) { t++; } if (isalnum((unsigned char)*t)) { while (isalnum((unsigned char)*t)) { t++; } while (isspace((unsigned char)*t)) { t++; } if (*t == '(') { looks_right = true; } } if (looks_right) { push_macro(s, true); } else { push_string(s, true, false); } } /* Run the first command in the msc[] buffer. */ static void run_script(void) { char *ptr; size_t cmd_len; char *cmd; vtrace("%s[%d] %s\n", ST_NAME, sms_depth, sms->need_prompt? "continuing": "running"); /* If a prompt is required, send one. */ if (sms->need_prompt) { script_prompt(sms->success); sms->need_prompt = false; } /* If there isn't anything left, we're done. */ if (!sms->msc_len) { script_enable(); return; } /* Isolate the command. */ ptr = memchr(sms->msc, '\n', sms->msc_len); if (!ptr) { /* No newline yet. */ script_enable(); return; } *ptr++ = '\0'; cmd_len = ptr - sms->msc; cmd = NewString(sms->msc); /* Execute it. */ sms->state = SS_RUNNING; sms->success = true; vtrace("%s[%d]: '%s'\n", ST_NAME, sms_depth, cmd); sms->need_prompt = true; /* Move the rest of the buffer over. */ sms->msc_len -= cmd_len; if (sms->msc_len) { (void) memmove(sms->msc, ptr, sms->msc_len); } sms->msc[sms->msc_len] = '\0'; /* Push a macro for this line of input. */ sms->executing = true; push_macro(cmd, false); sms->executing = false; /* Copy the output wait state to the child. */ sms->output_wait_needed = sms->next->output_wait_needed; Free(cmd); } /* Read the next command from a file. */ static void read_from_file(void) { varbuf_t r; char *buf; vb_init(&r); sms->msc_len = 0; while (true) { char c; int nr; nr = read(sms->infd, &c, 1); if (nr < 0) { vtrace("%s[%d] read error\n", ST_NAME, sms_depth); vb_free(&r); sms_pop(false); return; } if (nr == 0) { if (sms->msc_len == 0) { vtrace("%s[%d] read EOF\n", ST_NAME, sms_depth); vb_free(&r); sms_pop(false); return; } else { vtrace("%s[%d] read EOF without newline\n", ST_NAME, sms_depth); break; } } if (c == '\r' || c == '\n') { if (vb_len(&r)) { break; } else { continue; } } vb_append(&r, &c, 1); sms->msc_len++; } /* Run the command as a macro. */ buf = vb_consume(&r); vtrace("%s[%d] read '%s'\n", ST_NAME, sms_depth, buf); sms->state = SS_INCOMPLETE; push_macro(buf, false); Free(buf); } /* Handle an error generated during the execution of a script or macro. */ void sms_error(const char *msg) { sms_t *s; bool is_script = false; /* Print the error message. */ s = sms_redirect_to(); is_script = (s != NULL); if (is_script) { size_t sl = strlen(msg); char *text = Malloc(strlen("data: ") + sl + 2); char *newline; char *last_space; /* Prepend 'data: ', unless doing a callback. */ if (s->type == ST_CB) { strcpy(text, msg); } else { sprintf(text, "data: %s", msg); } /* Translate newlines to spaces. */ newline = text; while ((newline = strchr(newline, '\n')) != NULL) { *newline++ = ' '; } if (s->type == ST_CB) { /* Remove trailing spaces. */ while (sl && text[sl - 1] == ' ') { sl--; } trace_script_output("%.*s\n", (int)sl, text); (*s->cbx.cb->data)(s->cbx.handle, text, sl); } else { /* End with one newline. */ last_space = strrchr(text, ' '); if (last_space != NULL && last_space == text + strlen(text) - 1) { *last_space = '\n'; } else { strcat(text, "\n"); } trace_script_output("%s", text); if (s->is_socket) { send(s->insocket, text, (int)strlen(text), 0); } else { fprintf(s->outfile, "%s", text); } } Free(text); } else { (void) fprintf(stderr, "%s\n", msg); fflush(stderr); } /* Fail the current command. */ sms->success = false; /* Cancel any login. */ if (s != NULL && s->is_login) { host_disconnect(true); } } /* * Generate a response to a script command. * Makes sure that each line of output is prefixed with 'data:', if * appropriate, and makes sure that the output is newline terminated. * * If the parameter is an empty string, generates nothing, but if it is a * newline, generates an empty line. */ void sms_info(const char *fmt, ...) { char *nl; char *msgbuf; char *msg; va_list args; sms_t *s; va_start(args, fmt); msgbuf = xs_vbuffer(fmt, args); va_end(args); msg = msgbuf; do { size_t nc; nl = strchr(msg, '\n'); if (nl != NULL) { nc = nl - msg; } else { nc = strlen(msg); } if (nc || (nl != NULL)) { if ((s = sms_redirect_to()) != NULL) { if (s->type == ST_CB) { (*s->cbx.cb->data)(s->cbx.handle, msg, nc); trace_script_output("%.*s\n", nc, msg); } else { char *text = Malloc(strlen("data: ") + nc + 2); sprintf(text, "data: %.*s\n", (int)nc, msg); if (s->is_socket) { send(s->insocket, text, (int)strlen(text), 0); } else { (void) fprintf(s->outfile, "%s", text); } trace_script_output("%s", text); Free(text); } } else { (void) printf("%.*s\n", (int)nc, msg); } } msg = nl + 1; } while (nl); Free(msgbuf); macro_output = true; } /* Process available input from a script. */ static void script_input(iosrc_t fd _is_unused, ioid_t id _is_unused) { char buf[8192]; size_t n2r; ssize_t nr; char *ptr; char c; vtrace("Input for %s[%d] %s reading %s %d\n", ST_NAME, sms_depth, sms_state_name[sms->state], sms->is_socket? "socket": "fd", sms->is_socket? (int)sms->insocket: sms->infd); /* Read in what you can. */ n2r = sizeof(buf); if (sms->is_socket) { nr = recv(sms->insocket, buf, (int)n2r, 0); } #if defined(_WIN32) /*[*/ else if (sms->inhandle == peer_done_event) { nr = peer_nr; peer_nr = 0; if (nr < 0) { errno = peer_errno; } SetEvent(peer_enable_event); memcpy(buf, peer_buf, nr); } #endif /*]*/ else { nr = read(sms->infd, buf, (int)n2r); } if (nr < 0) { #if defined(_WIN32) /*[*/ if (sms->is_socket) { popup_an_error("%s[%d] recv: %s", ST_NAME, sms_depth, win32_strerror(GetLastError())); } else #endif { popup_an_errno(errno, "%s[%d] read", ST_NAME, sms_depth); } sms_pop(true); sms_continue(); return; } vtrace("Input for %s[%d] %s complete, nr=%d\n", ST_NAME, sms_depth, sms_state_name[sms->state], (int)nr); if (nr == 0) { /* end of file */ vtrace("EOF %s[%d]\n", ST_NAME, sms_depth); if (sms->msc_len) { popup_an_error("%s[%d]: missing newline", ST_NAME, sms_depth); } sms_pop(true); sms_continue(); return; } /* Reallocate. */ if (sms->msc == NULL) { sms->msc = Malloc(sizeof(buf)); } else { sms->msc = Realloc(sms->msc, sms->msc_len + nr + 1); } /* Append to the pending command, stripping carriage returns. */ ptr = buf; while (nr--) { if ((c = *ptr++) != '\r') { sms->msc[sms->msc_len++] = c; } } sms->msc[sms->msc_len] = '\0'; /* Run the command(s). */ sms->state = SS_INCOMPLETE; sms_continue(); } /* Resume a paused sms, if conditions are now ripe. */ void sms_continue(void) { static bool continuing = false; if (continuing) { return; } continuing = true; while (true) { if (sms == NULL) { continuing = false; return; } switch (sms->state) { case SS_IDLE: continuing = false; return; /* nothing to do */ case SS_INCOMPLETE: case SS_RUNNING: break; /* let it proceed */ case SS_KBWAIT: if (CKBWAIT) { continuing = false; return; } break; case SS_WAIT_NVT: if (IN_NVT) { sms->state = SS_WAIT_IFIELD; continue; } continuing = false; return; case SS_WAIT_3270: if (IN_3270 | IN_SSCP) { sms->state = SS_WAIT_IFIELD; continue; } continuing = false; return; case SS_WAIT_UNLOCK: if (KBWAIT) { continuing = false; return; } break; case SS_WAIT_IFIELD: if (!CAN_PROCEED) { continuing = false; return; } /* fall through... */ case SS_CONNECT_WAIT: if (HALF_CONNECTED || (CONNECTED && (kybdlock & KL_AWAITING_FIRST))) { continuing = false; return; } break; case SS_FT_WAIT: if (ft_state == FT_NONE) { break; } else { continuing = false; return; } case SS_TIME_WAIT: continuing = false; return; case SS_WAIT_OUTPUT: case SS_SWAIT_OUTPUT: if (!CONNECTED) { popup_an_error("Host disconnected"); break; } continuing = false; return; case SS_WAIT_DISC: if (!CONNECTED) { break; } else { continuing = false; return; } case SS_PAUSED: continuing = false; return; case SS_EXPECTING: continuing = false; return; case SS_CLOSING: script_prompt(true); continuing = false; return; } /* Restart the sms. */ sms->state = SS_IDLE; if (sms->wait_id != NULL_IOID) { RemoveTimeOut(sms->wait_id); sms->wait_id = NULL_IOID; } switch (sms->type) { case ST_STRING: run_string(); break; case ST_MACRO: case ST_COMMAND: case ST_KEYMAP: case ST_IDLE: run_macro(); break; case ST_PEER: case ST_CHILD: run_script(); break; case ST_FILE: read_from_file(); break; case ST_CB: script_prompt(sms->success); break; } } continuing = false; } /* * Return true if there is a pending macro. */ bool sms_in_macro(void) { sms_t *s; for (s = sms; s != NULL; s = s->next) { if (s->type == ST_MACRO || s->type == ST_STRING) { return true; } } return false; } /* Set and propagate the output_wait_needed flag. */ static void set_output_needed(bool needed) { sms_t *next = sms->next; /* Set the current sms' state. */ sms->output_wait_needed = needed; /* If its parent is a script, set its parent's state, too. */ if (sms->type == ST_MACRO && next != NULL && (next->type == ST_PEER || next->type == ST_CHILD || next->type == ST_CB)) { next->output_wait_needed = needed; } } /* * Macro- and script-specific actions. */ static void dump_range(int first, int len, bool in_ascii, struct ea *buf, int rel_rows _is_unused, int rel_cols) { int i; bool any = false; bool is_zero = false; varbuf_t r; vb_init(&r); /* * If the client has looked at the live screen, then if they later * execute 'Wait(output)', they will need to wait for output from the * host. output_wait_needed is cleared by sms_host_output, * which is called from the write logic in ctlr.c. * * Any of the following actions will enable Wait(Output): * - Ascii * - Ebcdic */ if (sms != NULL && buf == ea_buf) { set_output_needed(true); } is_zero = FA_IS_ZERO(get_field_attribute(first)); for (i = 0; i < len; i++) { if (i && !((first + i) % rel_cols)) { action_output("%s", vb_buf(&r)); vb_reset(&r); any = false; } if (in_ascii) { char mb[16]; ucs4_t uc; size_t j; size_t xlen; if (buf[first + i].fa) { is_zero = FA_IS_ZERO(buf[first + i].fa); vb_appends(&r, " "); } else if (is_zero) { vb_appends(&r, " "); } else if (IS_LEFT(ctlr_dbcs_state(first + i))) { xlen = ebcdic_to_multibyte( (buf[first + i].cc << 8) | buf[first + i + 1].cc, mb, sizeof(mb)); for (j = 0; j < xlen - 1; j++) { vb_appendf(&r, "%c", mb[j]); } } else if (IS_RIGHT(ctlr_dbcs_state(first + i))) { continue; } else { xlen = ebcdic_to_multibyte_x( buf[first + i].cc, buf[first + i].cs, mb, sizeof(mb), EUO_BLANK_UNDEF, &uc); for (j = 0; j < xlen - 1; j++) { vb_appendf(&r, "%c", mb[j]); } } } else { vb_appendf(&r, "%s%02x", any ? " " : "", buf[first + i].cc); } any = true; } if (any) { action_output("%s", vb_buf(&r)); } vb_free(&r); } static bool dump_fixed(const char **params, unsigned count, const char *name, bool in_ascii, struct ea *buf, int rel_rows, int rel_cols, int caddr) { int row, col, len, rows = 0, cols = 0; switch (count) { case 0: /* everything */ row = 0; col = 0; len = rel_rows*rel_cols; break; case 1: /* from cursor, for n */ row = caddr / rel_cols; col = caddr % rel_cols; len = atoi(params[0]); break; case 3: /* from (row,col), for n */ row = atoi(params[0]); col = atoi(params[1]); len = atoi(params[2]); break; case 4: /* from (row,col), for rows x cols */ row = atoi(params[0]); col = atoi(params[1]); rows = atoi(params[2]); cols = atoi(params[3]); len = 0; break; default: popup_an_error("%s requires 0, 1, 3 or 4 arguments", name); return false; } if ((row < 0 || row > rel_rows || col < 0 || col > rel_cols || len < 0) || ((count < 4) && ((row * rel_cols) + col + len > rel_rows * rel_cols)) || ((count == 4) && (cols < 0 || rows < 0 || col + cols > rel_cols || row + rows > rel_rows)) ) { popup_an_error("%s: Invalid argument", name); return false; } if (count < 4) { dump_range((row * rel_cols) + col, len, in_ascii, buf, rel_rows, rel_cols); } else { int i; for (i = 0; i < rows; i++) { dump_range(((row+i) * rel_cols) + col, cols, in_ascii, buf, rel_rows, rel_cols); } } return true; } static bool dump_field(unsigned count, const char *name, bool in_ascii) { int faddr; int start, baddr; int len = 0; if (count != 0) { popup_an_error("%s requires 0 arguments", name); return false; } if (!formatted) { popup_an_error("%s: Screen is not formatted", name); return false; } faddr = find_field_attribute(cursor_addr); start = faddr; INC_BA(start); baddr = start; do { if (ea_buf[baddr].fa) { break; } len++; INC_BA(baddr); } while (baddr != start); dump_range(start, len, in_ascii, ea_buf, ROWS, COLS); return true; } static bool Ascii_action(ia_t ia _is_unused, unsigned argc, const char **argv) { return dump_fixed(argv, argc, "Ascii", true, ea_buf, ROWS, COLS, cursor_addr); } static bool AsciiField_action(ia_t ia _is_unused, unsigned argc, const char **argv) { return dump_field(argc, "AsciiField", true); } static bool Ebcdic_action(ia_t ia _is_unused, unsigned argc, const char **argv) { return dump_fixed(argv, argc, "Ebcdic", false, ea_buf, ROWS, COLS, cursor_addr); } static bool EbcdicField_action(ia_t ia _is_unused, unsigned argc, const char **argv) { return dump_field(argc, "EbcdicField", false); } static unsigned char calc_cs(unsigned char cs) { switch (cs & CS_MASK) { case CS_APL: return 0xf1; case CS_LINEDRAW: return 0xf2; case CS_DBCS: return 0xf8; default: return 0x00; } } /* * Internals of the ReadBuffer action. * Operates on the supplied 'buf' parameter, which might be the live * screen buffer 'ea_buf' or a copy saved with 'Snap'. */ static bool do_read_buffer(const char **params, unsigned num_params, struct ea *buf, int fd) { int baddr; unsigned char current_fg = 0x00; unsigned char current_bg = 0x00; unsigned char current_gr = 0x00; unsigned char current_cs = 0x00; unsigned char current_ic = 0x00; bool in_ebcdic = false; varbuf_t r; if (num_params > 0) { if (num_params > 1) { popup_an_error("ReadBuffer: extra agruments"); return false; } if (!strncasecmp(params[0], "Ascii", strlen(params[0]))) { in_ebcdic = false; } else if (!strncasecmp(params[0], "Ebcdic", strlen(params[0]))) { in_ebcdic = true; } else { popup_an_error("ReadBuffer: first parameter must be Ascii or " "Ebcdic"); return false; } } if (fd >= 0) { char *s; int nw; s = xs_buffer("rows %d cols %d cursor %d\n", ROWS, COLS, cursor_addr); nw = write(fd, s, (int)strlen(s)); Free(s); if (nw < 0) { return false; } } /* * If the client has looked at the live screen, then if they later * execute 'Wait(output)', they will need to wait for output from the * host. output_wait_needed is cleared by sms_host_output, * which is called from the write logic in ctlr.c. * * Any of the following actions will enable Wait(Output): * - Ascii * - Ebcdic * - ReadBuffer */ if (sms != NULL && buf == ea_buf) { set_output_needed(true); } vb_init(&r); baddr = 0; do { if (!(baddr % COLS)) { if (baddr) { if (fd >= 0) { if (write(fd, vb_buf(&r) + 1, (int)(vb_len(&r) - 1)) < 0) { goto done; } if (write(fd, "\n", 1) < 0) { goto done; } } else { action_output("%s", vb_buf(&r) + 1); } } vb_reset(&r); } if (buf[baddr].fa) { vb_appendf(&r, " SF(%02x=%02x", XA_3270, buf[baddr].fa); if (buf[baddr].fg) { vb_appendf(&r, ",%02x=%02x", XA_FOREGROUND, buf[baddr].fg); } if (buf[baddr].bg) { vb_appendf(&r, ",%02x=%02x", XA_BACKGROUND, buf[baddr].bg); } if (buf[baddr].gr) { vb_appendf(&r, ",%02x=%02x", XA_HIGHLIGHTING, buf[baddr].gr | 0xf0); } if (buf[baddr].ic) { vb_appendf(&r, ",%02x=%02x", XA_INPUT_CONTROL, buf[baddr].ic); } if (buf[baddr].cs & CS_MASK) { vb_appendf(&r, ",%02x=%02x", XA_CHARSET, calc_cs(buf[baddr].cs)); } vb_appends(&r, ")"); } else { bool any_sa = false; # define SA_SEP (any_sa? ",": " SA(") if (buf[baddr].fg != current_fg) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_FOREGROUND, buf[baddr].fg); current_fg = buf[baddr].fg; any_sa = true; } if (buf[baddr].bg != current_bg) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_BACKGROUND, buf[baddr].fg); current_bg = buf[baddr].bg; any_sa = true; } if (buf[baddr].gr != current_gr) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_HIGHLIGHTING, buf[baddr].gr | 0xf0); current_gr = buf[baddr].gr; any_sa = true; } if (buf[baddr].ic != current_ic) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_INPUT_CONTROL, buf[baddr].ic); current_gr = buf[baddr].gr; any_sa = true; } if ((buf[baddr].cs & ~CS_GE) != (current_cs & ~CS_GE)) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_CHARSET, calc_cs(buf[baddr].cs)); current_cs = buf[baddr].cs; any_sa = true; } if (any_sa) { vb_appends(&r, ")"); } if (in_ebcdic) { if (buf[baddr].cs & CS_GE) { vb_appendf(&r, " GE(%02x)", buf[baddr].cc); } else { vb_appendf(&r, " %02x", buf[baddr].cc); } } else { bool done = false; char mb[16]; size_t j; ucs4_t uc; size_t len; if (IS_LEFT(ctlr_dbcs_state(baddr))) { len = ebcdic_to_multibyte( (buf[baddr].cc << 8) | buf[baddr + 1].cc, mb, sizeof(mb)); vb_appends(&r, " "); for (j = 0; j < len-1; j++) { vb_appendf(&r, "%02x", mb[j] & 0xff); } done = true; } else if (IS_RIGHT(ctlr_dbcs_state(baddr))) { vb_appends(&r, " -"); done = true; } switch (buf[baddr].cc) { case EBC_null: mb[0] = '\0'; break; case EBC_so: mb[0] = 0x0e; mb[1] = '\0'; break; case EBC_si: mb[0] = 0x0f; mb[1] = '\0'; break; default: (void) ebcdic_to_multibyte_x(buf[baddr].cc, buf[baddr].cs, mb, sizeof(mb), EUO_NONE, &uc); break; } if (!done) { vb_appends(&r, " "); if (mb[0] == '\0') { vb_appends(&r, "00"); } else { for (j = 0; mb[j]; j++) { vb_appendf(&r, "%02x", mb[j] & 0xff); } } } } } INC_BA(baddr); } while (baddr != 0); if (fd >= 0) { if (write(fd, vb_buf(&r) + 1, (int)(vb_len(&r) - 1)) < 0) { goto done; } if (write(fd, "\n", 1) < 0) { goto done; } } else { action_output("%s", vb_buf(&r) + 1); } done: vb_free(&r); return true; } /* * ReadBuffer action. */ static bool ReadBuffer_action(ia_t ia _is_unused, unsigned argc, const char **argv) { return do_read_buffer(argv, argc, ea_buf, -1); } /* * The sms prompt is preceeded by a status line with 11 fields: * * 1 keyboard status * U unlocked * L locked, waiting for host response * E locked, keying error * 2 formatting status of screen * F formatted * U unformatted * 3 protection status of current field * U unprotected (modifiable) * P protected * 4 connect status * N not connected * C(host) connected * 5 emulator mode * N not connected * C connected in NVT character mode * L connected in NVT line mode * P 3270 negotiation pending * I connected in 3270 mode * 6 model number * 7 rows * 8 cols * 9 cursor row * 10 cursor col * 11 main window id */ static char * status_string(void) { char kb_stat; char fmt_stat; char prot_stat; char *connect_stat = NULL; char em_mode; char *r; if (!kybdlock) { kb_stat = 'U'; } else { kb_stat = 'L'; } if (formatted) { fmt_stat = 'F'; } else { fmt_stat = 'U'; } if (!formatted) { prot_stat = 'U'; } else { unsigned char fa; fa = get_field_attribute(cursor_addr); if (FA_IS_PROTECTED(fa)) { prot_stat = 'P'; } else { prot_stat = 'U'; } } if (CONNECTED) { connect_stat = xs_buffer("C(%s)", current_host); } else { connect_stat = NewString("N"); } if (CONNECTED) { if (IN_NVT) { if (linemode) { em_mode = 'L'; } else { em_mode = 'C'; } } else if (IN_3270) { em_mode = 'I'; } else { em_mode = 'P'; } } else { em_mode = 'N'; } r = xs_buffer("%c %c %c %s %c %d %d %d %d %d 0x%lx", kb_stat, fmt_stat, prot_stat, connect_stat, em_mode, model_num, ROWS, COLS, cursor_addr / COLS, cursor_addr % COLS, screen_window_number()); Free(connect_stat); return r; } static void script_prompt(bool success) { char *s; const char *timing; char *t; s = status_string(); if (sms != NULL && sms->accumulated) { timing = lazyaf("%ld.%03ld", sms->msec / 1000L, sms->msec % 1000L); sms->accumulated = 0; } else { timing = "-"; } if (sms->type == ST_CB) { t = lazyaf("%s %s", s, timing); trace_script_output("%s\n", t); } else { t = lazyaf("%s %s\n%s\n", s, timing, success ? "ok" : "error"); trace_script_output("%s", t); } Free(s); if (sms->is_socket) { send(sms->insocket, t, (int)strlen(t), 0); } else if (sms->type == ST_CB) { struct sms_cbx cbx = sms->cbx; sms_pop(false); (*cbx.cb->done)(cbx.handle, success, t, strlen(t)); sms_continue(); } else { (void) fprintf(sms->outfile, "%s", t); (void) fflush(sms->outfile); } } /* Save the state of the screen for Snap queries. */ static char *snap_status = NULL; static struct ea *snap_buf = NULL; static int snap_rows = 0; static int snap_cols = 0; static int snap_field_start = -1; static int snap_field_length = -1; static int snap_caddr = 0; static void snap_save(void) { set_output_needed(true); Replace(snap_status, status_string()); Replace(snap_buf, (struct ea *)Malloc(ROWS*COLS*sizeof(struct ea))); (void) memcpy(snap_buf, ea_buf, ROWS*COLS*sizeof(struct ea)); snap_rows = ROWS; snap_cols = COLS; if (!formatted) { snap_field_start = -1; snap_field_length = -1; } else { int baddr; snap_field_length = 0; snap_field_start = find_field_attribute(cursor_addr); INC_BA(snap_field_start); baddr = snap_field_start; do { if (ea_buf[baddr].fa) { break; } snap_field_length++; INC_BA(baddr); } while (baddr != snap_field_start); } snap_caddr = cursor_addr; } /* * "Snap" action, maintains a snapshot for consistent multi-field comparisons: * * Snap [Save] * updates the saved image from the live image * Snap Rows * returns the number of rows * Snap Cols * returns the number of columns * Snap Staus * Snap Ascii ... * Snap AsciiField (not yet) * Snap Ebcdic ... * Snap EbcdicField (not yet) * Snap ReadBuffer * runs the named command * Snap Wait [tmo] Output * wait for the screen to change, then do a Snap Save */ static bool Snap_action(ia_t ia _is_unused, unsigned argc, const char **argv) { if (sms == NULL || sms->state != SS_RUNNING) { popup_an_error("Snap can only be called from scripts or macros"); return false; } if (argc == 0) { snap_save(); return true; } /* Handle 'Snap Wait' separately. */ if (!strcasecmp(argv[0], "Wait")) { long tmo = -1; char *ptr; unsigned maxp = 0; if (argc > 1 && (tmo = strtol(argv[1], &ptr, 10)) >= 0 && ptr != argv[0] && *ptr == '\0') { maxp = 3; } else { tmo = -1; maxp = 2; } if (argc > maxp) { popup_an_error("Too many arguments to Snap(Wait)"); return false; } if (argc < maxp) { popup_an_error("Too few arguments to Snap(Wait)"); return false; } if (strcasecmp(argv[argc - 1], "Output")) { popup_an_error("Unknown parameter to Snap(Wait)"); return false; } /* Must be connected. */ if (!(CONNECTED || HALF_CONNECTED)) { popup_an_error("Snap: Not connected"); return false; } /* * Make sure we need to wait. * If we don't, then Snap(Wait) is equivalent to Snap(). */ if (!sms->output_wait_needed) { snap_save(); return true; } /* Set the new state. */ sms->state = SS_SWAIT_OUTPUT; /* Set up a timeout, if they want one. */ if (tmo >= 0) { sms->wait_id = AddTimeOut(tmo? (tmo * 1000): 1, wait_timed_out); } return true; } if (!strcasecmp(argv[0], "Save")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } snap_save(); } else if (!strcasecmp(argv[0], "Status")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } if (snap_status == NULL) { popup_an_error("No saved state"); return false; } action_output("%s", snap_status); } else if (!strcasecmp(argv[0], "Rows")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } if (snap_status == NULL) { popup_an_error("No saved state"); return false; } action_output("%d", snap_rows); } else if (!strcasecmp(argv[0], "Cols")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } if (snap_status == NULL) { popup_an_error("No saved state"); return false; } action_output("%d", snap_cols); } else if (!strcasecmp(argv[0], "Ascii")) { if (snap_status == NULL) { popup_an_error("No saved state"); return false; } return dump_fixed(argv + 1, argc - 1, "Ascii", true, snap_buf, snap_rows, snap_cols, snap_caddr); } else if (!strcasecmp(argv[0], "Ebcdic")) { if (snap_status == NULL) { popup_an_error("No saved state"); return false; } return dump_fixed(argv + 1, argc - 1, "Ebcdic", false, snap_buf, snap_rows, snap_cols, snap_caddr); } else if (!strcasecmp(argv[0], "ReadBuffer")) { if (snap_status == NULL) { popup_an_error("No saved state"); return false; } return do_read_buffer(argv + 1, argc - 1, snap_buf, -1); } else { popup_an_error("Snap: Argument must be Save, Status, Rows, Cols, " "Wait, Ascii, Ebcdic, or ReadBuffer"); return false; } return true; } /* * Wait for various conditions. */ static bool Wait_action(ia_t ia _is_unused, unsigned argc, const char **argv) { enum sms_state next_state = SS_WAIT_IFIELD; float tmo = -1.0; char *ptr; unsigned np; const char **pr; /* Pick off the timeout parameter first. */ if (argc > 0 && (tmo = strtof(argv[0], &ptr)) >= 0.0 && ptr != argv[0] && *ptr == '\0') { np = argc - 1; pr = argv + 1; } else { tmo = -1.0; np = argc; pr = argv; } if (np > 1) { popup_an_error("Too many arguments to Wait or invalid timeout value"); return false; } if (sms == NULL || sms->state != SS_RUNNING) { popup_an_error("Wait can only be called from scripts or macros"); return false; } if (np == 1) { if (!strcasecmp(pr[0], "NVTMode") || !strcasecmp(pr[0], "ansi")) { if (!IN_NVT) { next_state = SS_WAIT_NVT; } } else if (!strcasecmp(pr[0], "3270Mode") || !strcasecmp(pr[0], "3270")) { if (!IN_3270) { next_state = SS_WAIT_3270; } } else if (!strcasecmp(pr[0], "Output")) { if (sms->output_wait_needed) { next_state = SS_WAIT_OUTPUT; } else { return true; } } else if (!strcasecmp(pr[0], "Disconnect")) { if (CONNECTED) { next_state = SS_WAIT_DISC; } else { return true; } } else if (!strcasecmp(pr[0], "Unlock")) { if (KBWAIT) { next_state = SS_WAIT_UNLOCK; } else { return true; } } else if (tmo > 0.0 && !strcasecmp(pr[0], "Seconds")) { next_state = SS_TIME_WAIT; } else if (strcasecmp(pr[0], "InputField")) { popup_an_error("Wait argument must be InputField, " "NVTmode, 3270Mode, Output, Seconds, Disconnect " "or Unlock"); return false; } } if (next_state != SS_TIME_WAIT && !(CONNECTED || HALF_CONNECTED)) { popup_an_error("Wait: Not connected"); return false; } /* Is it already okay? */ if (next_state == SS_WAIT_IFIELD && CAN_PROCEED) { return true; } /* No, wait for it to happen. */ sms->state = next_state; /* Set up a timeout, if they want one. */ if (tmo >= 0.0) { unsigned long tmo_msec = (unsigned long)(tmo * 1000); if (tmo_msec == 0) { tmo_msec = 1; } sms->wait_id = AddTimeOut(tmo_msec, wait_timed_out); } return true; } /* * Callback from Connect() and Reconnect() actions, to minimally pause a * running sms. */ void sms_connect_wait(void) { if (sms != NULL && (int)sms->state >= (int)SS_RUNNING && sms->state != SS_WAIT_IFIELD && (HALF_CONNECTED || (CONNECTED && (kybdlock & KL_AWAITING_FIRST)))) { sms->state = SS_CONNECT_WAIT; } } /* * Callback from ctlr.c, to indicate that the host has changed the screen. */ void sms_host_output(void) { if (sms != NULL) { set_output_needed(false); switch (sms->state) { case SS_SWAIT_OUTPUT: snap_save(); /* fall through... */ case SS_WAIT_OUTPUT: sms->state = SS_RUNNING; sms_continue(); break; default: break; } } } /* Return whether error pop-ups and action output should be short-circuited. */ static sms_t * sms_redirect_to(void) { sms_t *s; for (s = sms; s != NULL; s = s->next) { if ((s->type == ST_CHILD || s->type == ST_PEER || s->type == ST_CB) && (s->state == SS_RUNNING || s->state == SS_CONNECT_WAIT || s->state == SS_WAIT_OUTPUT || s->state == SS_SWAIT_OUTPUT || s->state == SS_FT_WAIT || s->wait_id != NULL_IOID)) { return s; } } return NULL; } /* Return whether error pop-ups and acition output should be short-circuited. */ bool sms_redirect(void) { return sms_redirect_to() != NULL; } /* Return whether any scripts are active. */ bool sms_active(void) { return sms != NULL; } /* Translate an expect string (uses C escape syntax). */ static void expand_expect(const char *s) { char *t = Malloc(strlen(s) + 1); char c; enum { XS_BASE, XS_BS, XS_O, XS_X } state = XS_BASE; int n = 0; int nd = 0; static char hexes[] = "0123456789abcdef"; expect_text = t; while ((c = *s++)) { switch (state) { case XS_BASE: if (c == '\\') { state = XS_BS; } else { *t++ = c; } break; case XS_BS: switch (c) { case 'x': nd = 0; n = 0; state = XS_X; break; case 'r': *t++ = '\r'; state = XS_BASE; break; case 'n': *t++ = '\n'; state = XS_BASE; break; case 'b': *t++ = '\b'; state = XS_BASE; break; default: if (c >= '0' && c <= '7') { nd = 1; n = c - '0'; state = XS_O; } else { *t++ = c; state = XS_BASE; } break; } break; case XS_O: if (nd < 3 && c >= '0' && c <= '7') { n = (n * 8) + (c - '0'); nd++; } else { *t++ = n; *t++ = c; state = XS_BASE; } break; case XS_X: if (isxdigit((unsigned char)c)) { n = (n * 16) + (int)(strchr(hexes, tolower((unsigned char)c)) - hexes); nd++; } else { if (nd) { *t++ = n; } else { *t++ = 'x'; } *t++ = c; state = XS_BASE; } break; } } expect_len = t - expect_text; } /* 'mem' version of strstr */ static char * memstr(char *s1, char *s2, int n1, int n2) { int i; for (i = 0; i <= n1 - n2; i++, s1++) { if (*s1 == *s2 && !memcmp(s1, s2, n2)) { return s1; } } return NULL; } /* Check for a match against an expect string. */ static bool expect_matches(void) { size_t ix, i; unsigned char buf[NVT_SAVE_SIZE]; char *t; ix = (nvt_save_ix + NVT_SAVE_SIZE - nvt_save_cnt) % NVT_SAVE_SIZE; for (i = 0; i < nvt_save_cnt; i++) { buf[i] = nvt_save_buf[(ix + i) % NVT_SAVE_SIZE]; } t = memstr((char *)buf, expect_text, (int)nvt_save_cnt, (int)expect_len); if (t != NULL) { nvt_save_cnt -= ((unsigned char *)t - buf) + expect_len; Free(expect_text); expect_text = NULL; return true; } else { return false; } } /* Store an NVT character for use by the Ansi action. */ void sms_store(unsigned char c) { if (sms == NULL) { return; } /* Save the character in the buffer. */ nvt_save_buf[nvt_save_ix++] = c; nvt_save_ix %= NVT_SAVE_SIZE; if (nvt_save_cnt < NVT_SAVE_SIZE) { nvt_save_cnt++; } /* If a script or macro is waiting to match a string, check now. */ if (sms->state == SS_EXPECTING && expect_matches()) { RemoveTimeOut(sms->expect_id); sms->expect_id = NULL_IOID; sms->state = SS_INCOMPLETE; sms_continue(); } } /* Dump whatever NVT data has been sent by the host since last called. */ static bool AnsiText_action(ia_t ia, unsigned argc, const char **argv) { size_t i; size_t ix; unsigned char c; varbuf_t r; action_debug("AnsiText", ia, argc, argv); if (check_argc("AnsiText", argc, 0, 0) < 0) { return false; } if (!nvt_save_cnt) { return true; } ix = (nvt_save_ix + NVT_SAVE_SIZE - nvt_save_cnt) % NVT_SAVE_SIZE; vb_init(&r); for (i = 0; i < nvt_save_cnt; i++) { c = nvt_save_buf[(ix + i) % NVT_SAVE_SIZE]; if (!(c & ~0x1f)) switch (c) { case '\n': vb_appends(&r, "\\n"); break; case '\r': vb_appends(&r, "\\r"); break; case '\b': vb_appends(&r, "\\b"); break; default: vb_appendf(&r, "\\%03o", c); break; } else if (c == '\\') { vb_appends(&r, "\\\\"); } else { vb_append(&r, (char *)&c, 1); } } action_output("%s", vb_buf(&r)); vb_free(&r); nvt_save_cnt = 0; nvt_save_ix = 0; return true; } /* Pause a script. */ static bool PauseScript_action(ia_t ia, unsigned argc, const char **argv) { action_debug("PauseScript", ia, argc, argv); if (check_argc("PauseScript", argc, 0, 0) < 0) { return false; } if (sms == NULL || sms->type == ST_STRING || sms->type == ST_COMMAND || sms->type == ST_IDLE) { popup_an_error("PauseScript can only be called from a script"); return false; } sms->state = SS_PAUSED; return true; } /* Continue a script. */ static bool ContinueScript_action(ia_t ia, unsigned argc, const char **argv) { sms_t *s; action_debug("ContinueScript", ia, argc, argv); if (check_argc("ContinueScript", argc, 0, 1) < 0) { return false; } /* * Skip past whatever scripts are RUNNING or INCOMPLETE at the top of the * stack, until we find one that is PAUSED. */ for (s = sms; s != NULL; s = s->next) { if (s->state != SS_RUNNING && s->state != SS_INCOMPLETE) { break; } } if (s == NULL || s->state != SS_PAUSED) { popup_an_error("ContinueScript: No script waiting"); sms_continue(); return false; } /* Pop the RUNNING and INCOMPLETE scripts. */ while (sms != NULL && sms->state == SS_RUNNING) { sms_pop(false); } /* Continue the running script and output the token to it. */ sms->state = SS_RUNNING; if (argc) { action_output("%s", argv[0]); } sms_continue(); return true; } /* Stop listening to stdin. */ static bool CloseScript_action(ia_t ia, unsigned argc, const char **argv) { action_debug("CloseScript", ia, argc, argv); if (check_argc("CloseScript", argc, 0, 1) < 0) { return false; } if (sms != NULL && sms->type == ST_MACRO && sms->next != NULL && (sms->next->type == ST_PEER || sms->next->type == ST_CHILD)) { /* Close this script. */ sms->next->state = SS_CLOSING; /* If nonzero status passed, fail the calling script. */ if (argc > 0 && atoi(argv[0]) != 0) { sms->next->success = false; if (sms->is_login) { host_disconnect(true); } return false; } } else { popup_an_error("CloseScript can only be called from a script"); return false; } return true; } /* Execute an arbitrary shell command. */ static bool Execute_action(ia_t ia, unsigned argc, const char **argv) { int status; bool rv = true; action_debug("Execute", ia, argc, argv); if (check_argc("Execute", argc, 1, 1) < 0) { return false; } status = system(argv[0]); if (status < 0) { popup_an_errno(errno, "system(\"%s\") failed", argv[0]); rv = false; } else if (status != 0) { #if defined(_WIN32) /*[*/ popup_an_error("system(\"%s\") exited with status %d\n", argv[0], status); #else /*][*/ if (WIFEXITED(status)) { popup_an_error("system(\"%s\") exited with status %d\n", argv[0], WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { popup_an_error("system(\"%s\") killed by signal %d\n", argv[0], WTERMSIG(status)); } else if (WIFSTOPPED(status)) { popup_an_error("system(\"%s\") stopped by signal %d\n", argv[0], WSTOPSIG(status)); } #endif /*]*/ rv = false; } /* Get back mouse events; system() cancels them. */ screen_system_fixup(); return rv; } /* Timeout for Expect action. */ static void expect_timed_out(ioid_t id _is_unused) { if (sms == NULL || sms->state != SS_EXPECTING) { return; } Free(expect_text); expect_text = NULL; popup_an_error("Expect: Timed out"); sms->expect_id = NULL_IOID; sms->state = SS_INCOMPLETE; sms->success = false; if (sms->is_login) { host_disconnect(true); } sms_continue(); } /* Timeout for Wait action. */ static void wait_timed_out(ioid_t id _is_unused) { /* If they just wanted a delay, succeed. */ if (sms->state == SS_TIME_WAIT) { sms->success = true; sms->state = SS_INCOMPLETE; sms->wait_id = NULL_IOID; sms_continue(); return; } /* Pop up the error message. */ popup_an_error("Wait: Timed out"); /* Forget the ID. */ sms->wait_id = NULL_IOID; /* If this is a login macro, it has failed. */ if (sms->is_login) { host_disconnect(true); } sms->success = false; sms->state = SS_INCOMPLETE; /* Let the script proceed. */ sms_continue(); } /* Wait for a string from the host (NVT mode only). */ static bool Expect_action(ia_t ia, unsigned argc, const char **argv) { int tmo; action_debug("Expect", ia, argc, argv); if (check_argc("Expect", argc, 1, 2) < 0) { return false; } /* Verify the environment and parameters. */ if (sms == NULL || sms->state != SS_RUNNING) { popup_an_error("Expect can only be called from a script or macro"); return false; } if (!IN_NVT) { popup_an_error("Expect is valid only when connected in NVT mode"); return false; } if (argc == 2) { tmo = atoi(argv[1]); if (tmo < 1 || tmo > 600) { popup_an_error("Expect: Invalid timeout: %s", argv[1]); return false; } } else { tmo = 30; } /* See if the text is there already; if not, wait for it. */ expand_expect(argv[0]); if (!expect_matches()) { sms->expect_id = AddTimeOut(tmo * 1000, expect_timed_out); sms->state = SS_EXPECTING; } /* else allow sms to proceed */ return true; } #if defined(_WIN32) /*[*/ /* Let the system pick a TCP port to bind to, and listen on it. */ static unsigned short pick_port(socket_t *sp) { socket_t s; struct sockaddr_in sin; socklen_t len; s = socket(PF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { popup_an_error("socket: %s\n", win32_strerror(GetLastError())); return 0; } (void) memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { popup_an_error("bind: %s\n", win32_strerror(GetLastError())); SOCK_CLOSE(s); return 0; } len = sizeof(sin); if (getsockname(s, (struct sockaddr *)&sin, &len) < 0) { popup_an_error("getsockaddr: %s\n", win32_strerror(GetLastError())); SOCK_CLOSE(s); return 0; } if (listen(s, 10) < 0) { popup_an_error("listen: %s\n", win32_strerror(GetLastError())); SOCK_CLOSE(s); return 0; } *sp = s; return ntohs(sin.sin_port); } #endif /*]*/ /* "Script" action, runs a script as a child process. */ #if !defined(_WIN32) /*[*/ static bool Script_action(ia_t ia, unsigned argc, const char **argv) { int inpipe[2]; int outpipe[2]; if (argc < 1) { popup_an_error("Script requires at least one argument"); return false; } /* Create a new script description. */ if (!sms_push(ST_CHILD)) { return false; } /* * Create pipes and stdout stream for the script process. * inpipe[] is read by x3270, written by the script * outpipe[] is written by x3270, read by the script */ if (pipe(inpipe) < 0) { sms_pop(false); popup_an_error("pipe() failed"); return false; } if (pipe(outpipe) < 0) { (void) close(inpipe[0]); (void) close(inpipe[1]); sms_pop(false); popup_an_error("pipe() failed"); return false; } if ((sms->outfile = fdopen(outpipe[1], "w")) == NULL) { (void) close(inpipe[0]); (void) close(inpipe[1]); (void) close(outpipe[0]); (void) close(outpipe[1]); sms_pop(false); popup_an_error("fdopen() failed"); return false; } (void) SETLINEBUF(sms->outfile); /* Fork and exec the script process. */ if ((sms->pid = fork_child()) < 0) { (void) close(inpipe[0]); (void) close(inpipe[1]); (void) close(outpipe[0]); sms_pop(false); popup_an_error("fork() failed"); return false; } /* Child processing. */ if (sms->pid == 0) { char **child_argv; unsigned i; /* Clean up the pipes. */ (void) close(outpipe[1]); (void) close(inpipe[0]); /* Export the names of the pipes into the environment. */ (void) putenv(xs_buffer("X3270OUTPUT=%d", outpipe[0])); (void) putenv(xs_buffer("X3270INPUT=%d", inpipe[1])); /* Set up arguments. */ child_argv = (char **)Malloc((argc + 1) * sizeof(char *)); for (i = 0; i < argc; i++) { child_argv[i] = (char *)argv[i]; } child_argv[i] = NULL; /* Exec. */ (void) execvp(argv[0], child_argv); (void) fprintf(stderr, "exec(%s) failed\n", argv[0]); (void) _exit(1); } /* Clean up our ends of the pipes. */ sms->infd = inpipe[0]; (void) close(inpipe[1]); (void) close(outpipe[0]); /* Enable input. */ script_enable(); /* Set up to reap the child's exit status. */ ++children; return true; } #endif /*]*/ #if defined(_WIN32) /*[*/ /* "Script" action, runs a script as a child process. */ static bool Script_action(ia_t ia, unsigned argc, const char **argv) { socket_t s = INVALID_SOCKET; unsigned short port = 0; HANDLE hevent; char *pe; STARTUPINFO startupinfo; PROCESS_INFORMATION process_information; char *args; unsigned i; action_debug("Script", ia, argc, argv); if (argc < 1) { popup_an_error("Script requires at least one argument"); return false; } /* Set up X3270PORT for the child process. */ port = pick_port(&s); if (port == 0) { return false; } hevent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hevent == NULL) { popup_an_error("CreateEvent: %s", win32_strerror(GetLastError())); closesocket(s); return false; } if (WSAEventSelect(s, hevent, FD_ACCEPT) != 0) { popup_an_error("WSAEventSelect: %s", win32_strerror(GetLastError())); closesocket(s); return false; } pe = xs_buffer("X3270PORT=%d", port); putenv(pe); Free(pe); /* Start the child process. */ (void) memset(&startupinfo, '\0', sizeof(STARTUPINFO)); startupinfo.cb = sizeof(STARTUPINFO); (void) memset(&process_information, '\0', sizeof(PROCESS_INFORMATION)); args = NewString(argv[0]); for (i = 1; i < argc; i++) { char *t; if (strchr(argv[i], ' ') != NULL && argv[i][0] != '"' && argv[i][strlen(argv[i]) - 1] != '"') { t = xs_buffer("%s \"%s\"", args, argv[i]); } else { t = xs_buffer("%s %s", args, argv[i]); } Free(args); args = t; } if (CreateProcess( NULL, args, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &startupinfo, &process_information) == 0) { popup_an_error("CreateProcess(%s) failed: %s", argv[0], win32_strerror(GetLastError())); Free(args); return false; } else { Free(args); CloseHandle(process_information.hThread); } /* Create a new script description. */ if (!sms_push(ST_CHILD)) { return false; } sms->child_handle = process_information.hProcess; sms->inhandle = hevent; sms->insocket = s; sms->is_socket = true; /* * Wait for the child process to exit. * Note that this is an asynchronous event -- exits for multiple * children can happen in any order. */ sms->exit_id = AddInput(process_information.hProcess, child_exited); /* Allow the child script to connect back to us. */ sms->listen_id = AddInput(hevent, child_socket_connection); /* Enable input. */ script_enable(); return true; } #endif /*]*/ /* "Macro" action, explicitly invokes a named macro. */ static bool Macro_action(ia_t ia, unsigned argc, const char **argv) { struct macro_def *m; action_debug("Macro", ia, argc, argv); if (check_argc("Macro", argc, 1, 1) < 0) { return false; } for (m = macro_defs; m != NULL; m = m->next) { if (!strcmp(m->name, argv[0])) { push_macro(m->action, false); return true; } } popup_an_error("no such macro: '%s'", argv[0]); return false; } /* * Idle cancellation: cancels the idle command if the current sms or any sms * that called it caused an error. */ void cancel_if_idle_command(void) { sms_t *s; for (s = sms; s != NULL; s = s->next) { if (s->type == ST_IDLE) { cancel_idle_timer(); s->idle_error = true; vtrace("Cancelling idle command"); break; } } } /* "Printer" action, starts or stops a printer session. */ static bool Printer_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Printer", ia, argc, argv); if (check_argc("Printer", argc, 1, 2) < 0) { return false; } if (!strcasecmp(argv[0], "Start")) { pr3287_session_start((argc > 1)? argv[1] : NULL); } else if (!strcasecmp(argv[0], "Stop")) { if (argc != 1) { popup_an_error("Printer: Extra argument(s)"); return false; } pr3287_session_stop(); } else { popup_an_error("Printer: Argument must be Start or Stop"); return false; } return true; } /* Abort all running scripts. */ void abort_script(void) { while (sms != NULL) { #if !defined(_WIN32) /*[*/ if (sms->type == ST_CHILD && sms->pid > 0) (void) kill(sms->pid, SIGTERM); #endif /*]*/ sms_pop(true); } } /* "Abort" action, stops pending scripts. */ static bool Abort_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Abort", ia, argc, argv); if (check_argc("Abort", argc, 0, 0) < 0) { return false; } if (ia == IA_SCRIPT) { return false; } #if !defined(_WIN32) /*[*/ child_ignore_output(); #endif /*]*/ abort_script(); return true; } /* Accumulate command execution time. */ void sms_accumulate_time(struct timeval *t0, struct timeval *t1) { sms_t *s; unsigned long msec; msec = (t1->tv_sec - t0->tv_sec) * 1000 + (t1->tv_usec - t0->tv_usec + 500) / 1000; if (sms != NULL) { sms->accumulated = true; sms->msec += msec; #if defined(DEBUG_ACCUMULATE) /*[*/ printf("%s: accumulated %lu msec\n", ST_NAME, sms->msec); #endif /*]*/ } s = sms_redirect_to(); if (s != NULL) { s->accumulated = true; s->msec += msec; } } static bool Query_action(ia_t ia, unsigned argc, const char **argv) { static struct { char *name; const char *(*fn)(void); char *string; } queries[] = { { "BindPluName", net_query_bind_plu_name, NULL }, { "ConnectionState", net_query_connection_state, NULL }, { "CodePage", get_host_codepage, NULL }, { "Cursor", ctlr_query_cursor, NULL }, { "Formatted", ctlr_query_formatted, NULL }, { "Host", net_query_host, NULL }, { "LocalEncoding", get_codeset, NULL }, { "LuName", net_query_lu_name, NULL }, { "Model", NULL, full_model_name }, { "ScreenCurSize", ctlr_query_cur_size, NULL }, { "ScreenMaxSize", ctlr_query_max_size, NULL }, { "Ssl", net_query_ssl, NULL }, { NULL, NULL } }; int i; switch (argc) { case 0: for (i = 0; queries[i].name != NULL; i++) { action_output("%s: %s", queries[i].name, queries[i].fn? (*queries[i].fn)(): queries[i].string); } break; case 1: for (i = 0; queries[i].name != NULL; i++) { if (!strcasecmp(argv[0], queries[i].name)) { const char *s; if (queries[i].fn) { s = (*queries[i].fn)(); } else { s = queries[i].string; } action_output("%s\n", *s? s: " "); return true; } } popup_an_error("Query: Unknown parameter"); break; default: popup_an_error("Query: Requires 0 or 1 arguments"); break; } return true; } /* * Bell action, used by scripts to ring the console bell and enter a comment * into the trace log. */ static bool Bell_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Bell", ia, argc, argv); if (check_argc("Bell", argc, 0, 0) < 0) { return false; } if (product_has_display()) { ring_bell(); } else { action_output("(ding)"); } return true; } static bool Source_action(ia_t ia, unsigned argc, const char **argv) { int fd; char *expanded_filename; action_debug("Source", ia, argc, argv); if (check_argc("Source", argc, 1, 1) < 0) { return false; } expanded_filename = do_subst(argv[0], DS_VARS | DS_TILDE); fd = open(expanded_filename, O_RDONLY); if (fd < 0) { Free(expanded_filename); popup_an_errno(errno, "%s", argv[0]); return false; } Free(expanded_filename); push_file(fd); return true; } suite3270-3.6/Common/Malloc.c0000664000076500007650000000431313221577163014000 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* Memory allocation functions. */ #include "globals.h" void * Malloc(size_t len) { char *r; r = malloc(len); if (r == NULL) { Error("Out of memory"); } return r; } void * Calloc(size_t nelem, size_t elsize) { char *r; r = malloc(nelem * elsize); if (r == NULL) { Error("Out of memory"); } return memset(r, '\0', nelem * elsize); } void * Realloc(void *p, size_t len) { p = realloc(p, len); if (p == NULL) { Error("Out of memory"); } return p; } void Free(void *p) { if (p != NULL) { free(p); } } char * NewString(const char *s) { if (s != NULL) { return strcpy(Malloc(strlen(s) + 1), s); } else { return NULL; } } suite3270-3.6/Common/menubar_stubs.c0000664000076500007650000000331413221577163015442 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * menubar_stubs.c * Stubs for menubar.c. */ #include "globals.h" #include "menubar.h" void menubar_as_set(bool sensitive _is_unused) { } void menubar_retoggle(toggle_index_t ix _is_unused) { } suite3270-3.6/Common/mkfb.c0000664000076500007650000002706213221577163013516 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * mkfb.c * Utility to create RDB string definitions from a simple * #ifdef'd .ad file. * * mkfb [-c] [-o outfile] [infile...] */ #include #include "conf.h" #if defined(_WIN32) /*[*/ # include "wincmn.h" #else /*][*/ # include # include # include # include #endif /*]*/ #define BUFSZ 1024 /* input line buffer size */ #define ARRSZ 8192 /* output array size */ #define SSSZ 10 /* maximum nested ifdef */ unsigned aix[ARRSZ]; /* fallback array indices */ unsigned xlno[ARRSZ]; /* fallback array line numbers */ unsigned n_fallbacks = 0; /* number of fallback entries */ /* ifdef state stack */ #define MODE_COLOR 0x00000001 #define MODE_APL 0x00000002 #define MODE_DBCS 0x00000004 #define MODE__WIN32 0x00000008 #define MODEMASK 0x00000fff struct { unsigned long ifdefs; unsigned long ifndefs; unsigned lno; } ss[SSSZ]; unsigned ssp = 0; struct { const char *name; unsigned long mask; } parts[] = { { "COLOR", MODE_COLOR }, { "X3270_APL", MODE_APL }, { "X3270_DBCS", MODE_DBCS }, { "_WIN32", MODE__WIN32 } }; #define NPARTS (sizeof(parts)/sizeof(parts[0])) unsigned long is_defined = MODE_COLOR | MODE_APL | #if defined(X3270_DBCS) MODE_DBCS #else 0 #endif | #if defined(FOR_WIN32) || defined(_WIN32) MODE__WIN32 #else 0 #endif ; unsigned long is_undefined; char *me; void emit(FILE *t, int ix, char c); void usage(void) { fprintf(stderr, "usage: %s [-c] [-o outfile] [infile...]\n", me); exit(1); } /* * Wrapper around Windows' brain-dead tmpfile(). */ static FILE * mkfb_tmpfile(void) { FILE *f; #if defined(_WIN32) /*[*/ char *n; #endif /*]*/ #if !defined(_WIN32) /*[*/ f = tmpfile(); if (f == NULL) { perror("tmpfile"); exit(1); } #else /*][*/ n = _tempnam(NULL, "mkfb"); if (n == NULL) { fprintf(stderr, "_tempnam failed.\n"); exit(1); } f = fopen(n, "w+b"); if (f == NULL) { fprintf(stderr, "_tempnam open(\"%s\") failed: %s\n", n, strerror(errno)); exit(1); } free(n); #endif /*]*/ return f; } int main(int argc, char *argv[]) { int ix; char *ofile = NULL; char buf[BUFSZ]; int lno = 0; int cc = 0; unsigned i; int continued = 0; const char *filename = "standard input"; FILE *u, *t, *tc = NULL, *tm = NULL; int cmode = 0; unsigned long ifdefs; unsigned long ifndefs; int last_continue = 0; int infiles = 0; /* Parse arguments. */ if ((me = strrchr(argv[0], '/')) != NULL) { me++; } else { me = argv[0]; } for (ix = 1; ix < argc; ix++) { if (argv[ix][0] != '-') { break; } if (!strcmp(argv[ix], "-c")) { cmode = 1; } else if (!strcmp(argv[ix], "-o")) { if (argc < ix + 1) { usage(); } ix++; ofile = argv[ix]; } else { usage(); } } infiles = argc - ix; /* Open the output file. */ if (ofile) { if (freopen(ofile, "w", stdout) == NULL) { perror(ofile); exit(1); } } is_undefined = MODE_COLOR | (~is_defined & MODEMASK); /* Start a temp file. */ u = mkfb_tmpfile(); /* Do #ifdef, comment and whitespace processing first. */ while (!infiles || ix < argc) { if (infiles) { if (freopen(argv[ix], "r", stdin) == NULL) { perror(argv[ix]); exit(1); } filename = argv[ix]; ix++; } while (fgets(buf, BUFSZ, stdin) != NULL) { char *s = buf; size_t sl; unsigned i; lno++; /* Skip leading white space. */ while (isspace((unsigned char)*s)) { s++; } if (cmode && (!strncmp(s, "x3270.", 6) || !strncmp(s, "x3270*", 6))) { s += 6; } /* Remove trailing white space. */ while ((sl = strlen(s)) && isspace((unsigned char)s[sl-1])) { s[sl-1] = '\0'; } /* Skip comments and empty lines. */ if ((!last_continue && *s == '!') || !*s) { continue; } /* Check for simple if[n]defs. */ if (*s == '#') { int ifnd = 1; if (!strncmp(s, "#ifdef ", 7) || !(ifnd = strncmp(s, "#ifndef ", 8))) { char *tk; if (ssp >= SSSZ) { fprintf(stderr, "%s, line %d: Stack overflow\n", filename, lno); exit(1); } ss[ssp].ifdefs = 0L; ss[ssp].ifndefs = 0L; ss[ssp].lno = lno; tk = s + 7 + !ifnd; for (i = 0; i < NPARTS; i++) { if (!strcmp(tk, parts[i].name)) { if (!ifnd) { ss[ssp++].ifndefs = parts[i].mask; } else { ss[ssp++].ifdefs = parts[i].mask; } break; } } if (i >= NPARTS) { fprintf(stderr, "%s, line %d: Unknown condition\n", filename, lno); exit(1); } continue; } else if (!strcmp(s, "#else")) { unsigned long tmp; if (!ssp) { fprintf(stderr, "%s, line %d: Missing #if[n]def\n", filename, lno); exit(1); } tmp = ss[ssp-1].ifdefs; ss[ssp-1].ifdefs = ss[ssp-1].ifndefs; ss[ssp-1].ifndefs = tmp; } else if (!strcmp(s, "#endif")) { if (!ssp) { fprintf(stderr, "%s, line %d: Missing #if[n]def\n", filename, lno); exit(1); } ssp--; } else { fprintf(stderr, "%s, line %d: Unrecognized # directive\n", filename, lno); exit(1); } continue; } /* Figure out if there's anything to emit. */ /* First, look for contradictions. */ ifdefs = 0; ifndefs = 0; for (i = 0; i < ssp; i++) { ifdefs |= ss[i].ifdefs; ifndefs |= ss[i].ifndefs; } if (ifdefs & ifndefs) { #ifdef DEBUG_IFDEFS fprintf(stderr, "contradiction, line %d\n", lno); #endif continue; } /* Then, apply the actual values. */ if (ifdefs && (ifdefs & is_defined) != ifdefs) { #ifdef DEBUG_IFDEFS fprintf(stderr, "ifdef failed, line %d\n", lno); #endif continue; } if (ifndefs && (ifndefs & is_undefined) != ifndefs) { #ifdef DEBUG_IFDEFS fprintf(stderr, "ifndef failed, line %d\n", lno); #endif continue; } /* Emit the text. */ fprintf(u, "%lx %lx %d\n%s\n", ifdefs, ifndefs, lno, s); last_continue = strlen(s) > 0 && s[strlen(s) - 1] == '\\'; } if (!infiles) { break; } } if (ssp) { fprintf(stderr, "%d missing #endif(s)\n", ssp); fprintf(stderr, "last #ifdef was at line %u\n", ss[ssp-1].lno); exit(1); } /* Re-scan, emitting code this time. */ rewind(u); t = mkfb_tmpfile(); if (!cmode) { tc = mkfb_tmpfile(); tm = mkfb_tmpfile(); } /* Emit the initial boilerplate. */ fprintf(t, "/* This file was created automatically by mkfb. */\n\n"); fprintf(t, "#include \"globals.h\"\n"); fprintf(t, "#include \"fallbacks.h\"\n"); if (cmode) { fprintf(t, "static unsigned char fsd[] = {\n"); } else { fprintf(t, "unsigned char common_fallbacks[] = {\n"); fprintf(tc, "unsigned char color_fallbacks[] = {\n"); fprintf(tm, "unsigned char mono_fallbacks[] = {\n"); } /* Scan the file, emitting the fsd array and creating the indices. */ while (fscanf(u, "%lx %lx %d\n", &ifdefs, &ifndefs, &lno) == 3) { char *s = buf; char c; int white; FILE *t_this = t; int ix = 0; if (fgets(buf, BUFSZ, u) == NULL) { break; } if (strlen(buf) > 0 && buf[strlen(buf)-1] == '\n') { buf[strlen(buf)-1] = '\0'; } #if 0 fprintf(stderr, "%lx %lx %d %s\n", ifdefs, ifndefs, lno, buf); #endif /* Add array offsets. */ if (cmode) { /* Ignore color. Accumulate offsets into an array. */ if (n_fallbacks >= ARRSZ) { fprintf(stderr, "Buffer overflow\n"); exit(1); } aix[n_fallbacks] = cc; xlno[n_fallbacks++] = lno; } else { /* Use color to decide which file to write into. */ if (!(ifdefs & MODE_COLOR) && !(ifndefs & MODE_COLOR)) { /* Both. */ t_this = t; ix = 0; } else if (ifdefs & MODE_COLOR) { /* Just color. */ t_this = tc; ix = 1; } else { /* Just mono. */ t_this = tm; ix = 2; } } continued = 0; white = 0; while ((c = *s++) != '\0') { if (c == ' ' || c == '\t') { white++; } else if (white) { emit(t_this, ix, ' '); cc++; white = 0; } switch (c) { case ' ': case '\t': break; case '#': if (!cmode) { emit(t_this, ix, '\\'); emit(t_this, ix, '#'); cc += 2; } else { emit(t_this, ix, c); cc++; } break; case '\\': if (*s == '\0') { continued = 1; break; } else if (cmode) { switch ((c = *s++)) { case 't': c = '\t'; break; case 'n': c = '\n'; break; default: break; } } /* else fall through */ default: emit(t_this, ix, c); cc++; break; } } if (white) { emit(t_this, ix, ' '); cc++; white = 0; } if (!continued) { if (cmode) { emit(t_this, ix, 0); } else { emit(t_this, ix, '\n'); } cc++; } } fclose(u); if (cmode) { fprintf(t, "};\n\n"); } else { emit(t, 0, 0); fprintf(t, "};\n\n"); emit(tc, 0, 0); fprintf(tc, "};\n\n"); emit(tm, 0, 0); fprintf(tm, "};\n\n"); } /* Copy tmp to output. */ rewind(t); if (!cmode) { rewind(tc); rewind(tm); } while (fgets(buf, sizeof(buf), t) != NULL) { printf("%s", buf); } if (!cmode) { while (fgets(buf, sizeof(buf), tc) != NULL) { printf("%s", buf); } while (fgets(buf, sizeof(buf), tm) != NULL) { printf("%s", buf); } } if (cmode) { /* Emit the fallback array. */ printf("char *fallbacks[%u] = {\n", n_fallbacks + 1); for (i = 0; i < n_fallbacks; i++) { printf("\t(char *)&fsd[%u], /* line %u */\n", aix[i], xlno[i]); } printf("\tNULL\n};\n\n"); /* Emit some test code. */ printf("%s", "#if defined(DEBUG) /*[*/\n\ #include \n\ int\n\ main(int argc, char *argv[])\n\ {\n\ int i;\n\ \n\ for (i = 0; fallbacks[i] != NULL; i++)\n\ printf(\"%d: %s\\n\", i, fallbacks[i]);\n\ return 0;\n\ }\n"); printf("#endif /*]*/\n\n"); } fflush(stdout); fclose(stdout); fclose(t); if (!cmode) { fclose(tc); fclose(tm); } return 0; } static int n_out[3] = { 0, 0, 0 }; void emit(FILE *t, int ix, char c) { if (n_out[ix] >= 19) { fprintf(t, "\n"); n_out[ix] = 0; } fprintf(t, "%3d,", (unsigned char)c); n_out[ix]++; } suite3270-3.6/Common/mkicon.c0000664000076500007650000000120413221577163014045 0ustar pdmpdm#include /* * Make an icon file. * * mkicon icon-file >c-file */ int main(int argc, char *argv[]) { FILE *f; int c; int i = 0; if (argc != 2) { fprintf(stderr, "Usage: %s icon-file >c-file\n", argv[0]); return 1; } f = fopen(argv[1], "rb"); if (f == NULL) { perror(argv[1]); return 1; } printf("unsigned char favicon[] = {\n"); while ((c = fgetc(f)) != EOF) { if (i && !(i % 16)) { printf("\n"); } printf("%3d,", c); i++; } if ((i % 16) != 1) { printf("\n"); } printf("};\nunsigned favicon_size = sizeof(favicon);\n"); fclose(f); return 0; } suite3270-3.6/Common/Nodisplay/resources.c0000664000076500007650000000473213221577163016552 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "globals.h" #include "fallbacks.h" /* s3270 substitute Xt resource database. */ static struct dresource { struct dresource *next; const char *name; char *value; } *drdb = NULL, **drdb_next = &drdb; void add_resource(const char *name, char *value) { struct dresource *d; for (d = drdb; d != NULL; d = d->next) { if (!strcmp(d->name, name)) { d->value = value; return; } } d = Malloc(sizeof(struct dresource)); d->next = NULL; d->name = name; d->value = value; *drdb_next = d; drdb_next = &d->next; } char * get_resource(const char *name) { struct dresource *d; int i; for (d = drdb; d != NULL; d = d->next) { if (!strcmp(d->name, name)) { return d->value; } } for (i = 0; fallbacks[i] != NULL; i++) { if (!strncmp(fallbacks[i], name, strlen(name)) && *(fallbacks[i] + strlen(name)) == ':') { return fallbacks[i] + strlen(name) + 2; } } return NULL; } suite3270-3.6/Common/nvt.c0000664000076500007650000016035113221577163013405 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * nvt.c * NVT (ANSI X3.64 / DEC VT100 / xterm) terminal emulation. */ #include "globals.h" #include "appres.h" #include "ctlr.h" #include "3270ds.h" #include "toggles.h" #include "charset.h" #include "ctlrc.h" #include "host.h" #include "macros.h" #include "nvt.h" #include "nvt_gui.h" #include "screen.h" #include "scroll.h" #include "tables.h" #include "telnet.h" #include "telnet_core.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #define MB_MAX 16 #define PE_MAX 1024 #define SC 1 /* save cursor position */ #define RC 2 /* restore cursor position */ #define NL 3 /* new line */ #define UP 4 /* cursor up */ #define E2 5 /* second level of ESC processing */ #define rS 6 /* reset */ #define IC 7 /* insert chars */ #define DN 8 /* cursor down */ #define RT 9 /* cursor right */ #define LT 10 /* cursor left */ #define CM 11 /* cursor motion */ #define ED 12 /* erase in display */ #define EL 13 /* erase in line */ #define IL 14 /* insert lines */ #define DL 15 /* delete lines */ #define DC 16 /* delete characters */ #define SG 17 /* set graphic rendition */ #define BL 18 /* ring bell */ #define NP 19 /* new page */ #define BS 20 /* backspace */ #define CR 21 /* carriage return */ #define LF 22 /* line feed */ #define HT 23 /* horizontal tab */ #define E1 24 /* first level of ESC processing */ #define Xx 25 /* undefined control character (nop) */ #define Pc 26 /* printing character */ #define Sc 27 /* semicolon (after ESC [) */ #define Dg 28 /* digit (after ESC [ or ESC [ ?) */ #define RI 29 /* reverse index */ #define DA 30 /* send device attributes */ #define SM 31 /* set mode */ #define RM 32 /* reset mode */ #define DO 33 /* return terminal ID (obsolete) */ #define SR 34 /* device status report */ #define CS 35 /* character set designate */ #define E3 36 /* third level of ESC processing */ #define DS 37 /* DEC private set */ #define DR 38 /* DEC private reset */ #define DV 39 /* DEC private save */ #define DT 40 /* DEC private restore */ #define SS 41 /* set scrolling region */ #define TM 42 /* text mode (ESC ]) */ #define T2 43 /* semicolon (after ESC ]) */ #define TX 44 /* text parameter (after ESC ] n ;) */ #define TB 45 /* text parameter done (ESC ] n ; xxx BEL) */ #define TS 46 /* tab set */ #define TC 47 /* tab clear */ #define C2 48 /* character set designate (finish) */ #define G0 49 /* select G0 character set */ #define G1 50 /* select G1 character set */ #define G2 51 /* select G2 character set */ #define G3 52 /* select G3 character set */ #define S2 53 /* select G2 for next character */ #define S3 54 /* select G3 for next character */ #define MB 55 /* process multi-byte character */ #define CH 56 /* cursor horizontal absolute (CHA) */ #define VP 57 /* vertical position absolute (VPA) */ static enum state { DATA = 0, ESC = 1, CSDES = 2, N1 = 3, DECP = 4, TEXT = 5, TEXT2 = 6, MBPEND = 7 } state = DATA; /* * Terminal functions for ANSI X3.64 are called ansi_xxx. * DEC VT100-specific functions are called dec_xxx. * Xterm-specific functions are called xterm_xxx. */ static enum state ansi_data_mode(int, int); static enum state dec_save_cursor(int, int); static enum state dec_restore_cursor(int, int); static enum state ansi_newline(int, int); static enum state ansi_cursor_up(int, int); static enum state ansi_esc2(int, int); static enum state ansi_reset(int, int); static enum state ansi_insert_chars(int, int); static enum state ansi_cursor_down(int, int); static enum state ansi_cursor_right(int, int); static enum state ansi_cursor_left(int, int); static enum state ansi_cursor_motion(int, int); static enum state ansi_erase_in_display(int, int); static enum state ansi_erase_in_line(int, int); static enum state ansi_insert_lines(int, int); static enum state ansi_delete_lines(int, int); static enum state ansi_delete_chars(int, int); static enum state ansi_sgr(int, int); static enum state ansi_bell(int, int); static enum state ansi_newpage(int, int); static enum state ansi_backspace(int, int); static enum state ansi_cr(int, int); static enum state ansi_lf(int, int); static enum state ansi_htab(int, int); static enum state ansi_escape(int, int); static enum state ansi_nop(int, int); static enum state ansi_printing(int, int); static enum state ansi_semicolon(int, int); static enum state ansi_digit(int, int); static enum state ansi_reverse_index(int, int); static enum state ansi_send_attributes(int, int); static enum state ansi_set_mode(int, int); static enum state ansi_reset_mode(int, int); static enum state dec_return_terminal_id(int, int); static enum state ansi_status_report(int, int); static enum state ansi_cs_designate(int, int); static enum state ansi_esc3(int, int); static enum state dec_set(int, int); static enum state dec_reset(int, int); static enum state dec_save(int, int); static enum state dec_restore(int, int); static enum state dec_scrolling_region(int, int); static enum state xterm_text_mode(int, int); static enum state xterm_text_semicolon(int, int); static enum state xterm_text(int, int); static enum state xterm_text_do(int, int); static enum state ansi_htab_set(int, int); static enum state ansi_htab_clear(int, int); static enum state ansi_cs_designate2(int, int); static enum state ansi_select_g0(int, int); static enum state ansi_select_g1(int, int); static enum state ansi_select_g2(int, int); static enum state ansi_select_g3(int, int); static enum state ansi_one_g2(int, int); static enum state ansi_one_g3(int, int); static enum state ansi_multibyte(int, int); static enum state ansi_cursor_horizontal_absolute(int, int); static enum state ansi_vertical_position_absolute(int, int); typedef enum state (*afn_t)(int, int); static afn_t nvt_fn[] = { /* 0 */ &ansi_data_mode, /* 1 */ &dec_save_cursor, /* 2 */ &dec_restore_cursor, /* 3 */ &ansi_newline, /* 4 */ &ansi_cursor_up, /* 5 */ &ansi_esc2, /* 6 */ &ansi_reset, /* 7 */ &ansi_insert_chars, /* 8 */ &ansi_cursor_down, /* 9 */ &ansi_cursor_right, /* 10 */ &ansi_cursor_left, /* 11 */ &ansi_cursor_motion, /* 12 */ &ansi_erase_in_display, /* 13 */ &ansi_erase_in_line, /* 14 */ &ansi_insert_lines, /* 15 */ &ansi_delete_lines, /* 16 */ &ansi_delete_chars, /* 17 */ &ansi_sgr, /* 18 */ &ansi_bell, /* 19 */ &ansi_newpage, /* 20 */ &ansi_backspace, /* 21 */ &ansi_cr, /* 22 */ &ansi_lf, /* 23 */ &ansi_htab, /* 24 */ &ansi_escape, /* 25 */ &ansi_nop, /* 26 */ &ansi_printing, /* 27 */ &ansi_semicolon, /* 28 */ &ansi_digit, /* 29 */ &ansi_reverse_index, /* 30 */ &ansi_send_attributes, /* 31 */ &ansi_set_mode, /* 32 */ &ansi_reset_mode, /* 33 */ &dec_return_terminal_id, /* 34 */ &ansi_status_report, /* 35 */ &ansi_cs_designate, /* 36 */ &ansi_esc3, /* 37 */ &dec_set, /* 38 */ &dec_reset, /* 39 */ &dec_save, /* 40 */ &dec_restore, /* 41 */ &dec_scrolling_region, /* 42 */ &xterm_text_mode, /* 43 */ &xterm_text_semicolon, /* 44 */ &xterm_text, /* 45 */ &xterm_text_do, /* 46 */ &ansi_htab_set, /* 47 */ &ansi_htab_clear, /* 48 */ &ansi_cs_designate2, /* 49 */ &ansi_select_g0, /* 50 */ &ansi_select_g1, /* 51 */ &ansi_select_g2, /* 52 */ &ansi_select_g3, /* 53 */ &ansi_one_g2, /* 54 */ &ansi_one_g3, /* 55 */ &ansi_multibyte, /* 56 */ &ansi_cursor_horizontal_absolute, /* 57 */ &ansi_vertical_position_absolute, }; static unsigned char st[8][256] = { /* * State table for base processing (state == DATA) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ Xx,Xx,Xx,Xx,Xx,Xx,Xx,BL,BS,HT,LF,LF,NP,CR,G1,G0, /* 10 */ Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,E1,Xx,Xx,Xx,Xx, /* 20 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* 30 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* 40 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* 50 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* 60 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* 70 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Xx, /* 80 */ Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx, /* 90 */ Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx,Xx, /* a0 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* b0 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* c0 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* d0 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* e0 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc, /* f0 */ Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc,Pc }, /* * State table for ESC processing (state == ESC) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0,CS,CS,CS,CS, 0, 0, 0, 0, /* 30 */ 0, 0, 0, 0, 0, 0, 0,SC,RC, 0, 0, 0, 0, 0, 0, 0, /* 40 */ 0, 0, 0, 0, 0,NL, 0, 0,TS, 0, 0, 0, 0,RI,S2,S3, /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,E2, 0,TM, 0, 0, /* 60 */ 0, 0, 0,rS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,G2,G3, /* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* * State table for ESC ()*+ C processing (state == CSDES) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 30 */ C2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 40 */ 0,C2,C2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* * State table for ESC [ processing (state == N1) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 30 */ Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg, 0,Sc, 0, 0, 0,E3, /* 40 */ IC,UP,DN,RT,LT, 0, 0,CH,CM, 0,ED,EL,IL,DL, 0, 0, /* 50 */ DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 */ 0, 0, 0,DA,VP, 0,CM,TC,SM, 0, 0, 0,RM,SG,SR, 0, /* 70 */ 0, 0,SS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* * State table for ESC [ ? processing (state == DECP) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 30 */ Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg, 0, 0, 0, 0, 0, 0, /* 40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 */ 0, 0, 0, 0, 0, 0, 0, 0,DS, 0, 0, 0,DR, 0, 0, 0, /* 70 */ 0, 0,DT,DV, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* * State table for ESC ] processing (state == TEXT) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 30 */ Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg,Dg, 0,T2, 0, 0, 0, 0, /* 40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* * State table for ESC ] n ; processing (state == TEXT2) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0,TB, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* 30 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* 40 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* 50 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* 60 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* 70 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,Xx, /* 80 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* 90 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* a0 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* b0 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* c0 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* d0 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* e0 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX, /* f0 */ TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX,TX }, /* * State table for multi-byte characters (state == MBPEND) */ { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 10 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 20 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 30 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 40 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 50 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 60 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 70 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 80 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* 90 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* a0 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* b0 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* c0 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* d0 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* e0 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB, /* f0 */ MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB,MB }, }; /* Character sets. */ #define CS_G0 0 #define CS_G1 1 #define CS_G2 2 #define CS_G3 3 /* Character set designations. */ #define CSD_LD 0 #define CSD_UK 1 #define CSD_US 2 static int saved_cursor = 0; #define NN 20 static int n[NN], nx = 0; #define NT 256 static char text[NT + 1]; static int tx = 0; static int nvt_ch; static unsigned char gr = 0; static unsigned char saved_gr = 0; static unsigned char fg = 0; static unsigned char saved_fg = 0; static unsigned char bg = 0; static unsigned char saved_bg = 0; static int cset = CS_G0; static int saved_cset = CS_G0; static int csd[4] = { CSD_US, CSD_US, CSD_US, CSD_US }; static int saved_csd[4] = { CSD_US, CSD_US, CSD_US, CSD_US }; static int once_cset = -1; static int insert_mode = 0; static int auto_newline_mode = 0; static int appl_cursor = 0; static int saved_appl_cursor = 0; static int wraparound_mode = 1; static int saved_wraparound_mode = 1; static int rev_wraparound_mode = 0; static int saved_rev_wraparound_mode = 0; static int allow_wide_mode = 0; static int saved_allow_wide_mode = 0; static int wide_mode = 0; static int saved_wide_mode = 0; static bool saved_altbuffer = false; static int scroll_top = -1; static int scroll_bottom = -1; static unsigned char *tabs = (unsigned char *) NULL; static char gnnames[] = "()*+"; static char csnames[] = "0AB"; static int cs_to_change; static int pmi = 0; static char pending_mbs[MB_MAX]; static int pe = 0; static unsigned char ped[PE_MAX]; static bool held_wrap = false; static void nvt_scroll(void); static enum state ansi_data_mode(int ig1 _is_unused, int ig2 _is_unused) { return DATA; } static enum state dec_save_cursor(int ig1 _is_unused, int ig2 _is_unused) { int i; saved_cursor = cursor_addr; saved_cset = cset; for (i = 0; i < 4; i++) saved_csd[i] = csd[i]; saved_fg = fg; saved_bg = bg; saved_gr = gr; return DATA; } static enum state dec_restore_cursor(int ig1 _is_unused, int ig2 _is_unused) { int i; cset = saved_cset; for (i = 0; i < 4; i++) csd[i] = saved_csd[i]; fg = saved_fg; bg = saved_bg; gr = saved_gr; cursor_move(saved_cursor); held_wrap = false; return DATA; } static enum state ansi_newline(int ig1 _is_unused, int ig2 _is_unused) { int nc; cursor_move(cursor_addr - (cursor_addr % COLS)); nc = cursor_addr + COLS; if (nc < scroll_bottom * COLS) cursor_move(nc); else nvt_scroll(); held_wrap = false; return DATA; } static enum state ansi_cursor_up(int nn, int ig2 _is_unused) { int rr; if (nn < 1) nn = 1; rr = cursor_addr / COLS; if (rr - nn < 0) cursor_move(cursor_addr % COLS); else cursor_move(cursor_addr - (nn * COLS)); held_wrap = false; return DATA; } static enum state ansi_esc2(int ig1 _is_unused, int ig2 _is_unused) { register int i; for (i = 0; i < NN; i++) n[i] = 0; nx = 0; return N1; } static enum state ansi_reset(int ig1 _is_unused, int ig2 _is_unused) { int i; static bool first = true; gr = 0; saved_gr = 0; fg = 0; saved_fg = 0; bg = 0; saved_bg = 0; cset = CS_G0; saved_cset = CS_G0; csd[0] = csd[1] = csd[2] = csd[3] = CSD_US; saved_csd[0] = saved_csd[1] = saved_csd[2] = saved_csd[3] = CSD_US; once_cset = -1; saved_cursor = 0; insert_mode = 0; auto_newline_mode = 0; appl_cursor = 0; saved_appl_cursor = 0; wraparound_mode = 1; saved_wraparound_mode = 1; rev_wraparound_mode = 0; saved_rev_wraparound_mode = 0; allow_wide_mode = 0; saved_allow_wide_mode = 0; wide_mode = 0; allow_wide_mode = 0; saved_altbuffer = false; scroll_top = 1; scroll_bottom = ROWS; Replace(tabs, (unsigned char *)Malloc((COLS+7)/8)); for (i = 0; i < (COLS+7)/8; i++) tabs[i] = 0x01; held_wrap = false; if (!first) { ctlr_altbuffer(true); ctlr_aclear(0, ROWS * COLS, 1); ctlr_altbuffer(false); ctlr_clear(false); screen_80(); } first = false; pmi = 0; return DATA; } static enum state ansi_insert_chars(int nn, int ig2 _is_unused) { int cc = cursor_addr % COLS; /* current col */ int mc = COLS - cc; /* max chars that can be inserted */ int ns; /* chars that are shifting */ if (nn < 1) nn = 1; if (nn > mc) nn = mc; /* Move the surviving chars right */ ns = mc - nn; if (ns) ctlr_bcopy(cursor_addr, cursor_addr + nn, ns, 1); /* Clear the middle of the line */ ctlr_aclear(cursor_addr, nn, 1); return DATA; } static enum state ansi_cursor_down(int nn, int ig2 _is_unused) { int rr; if (nn < 1) nn = 1; rr = cursor_addr / COLS; if (rr + nn >= ROWS) cursor_move((ROWS-1)*COLS + (cursor_addr%COLS)); else cursor_move(cursor_addr + (nn * COLS)); held_wrap = false; return DATA; } static enum state ansi_cursor_right(int nn, int ig2 _is_unused) { int cc; if (nn < 1) nn = 1; cc = cursor_addr % COLS; if (cc == COLS-1) return DATA; if (cc + nn >= COLS) nn = COLS - 1 - cc; cursor_move(cursor_addr + nn); held_wrap = false; return DATA; } static enum state ansi_cursor_left(int nn, int ig2 _is_unused) { int cc; if (held_wrap) { held_wrap = false; return DATA; } if (nn < 1) nn = 1; cc = cursor_addr % COLS; if (!cc) return DATA; if (nn > cc) nn = cc; cursor_move(cursor_addr - nn); return DATA; } static enum state ansi_cursor_motion(int n1, int n2) { if (n1 < 1) n1 = 1; if (n1 > ROWS) n1 = ROWS; if (n2 < 1) n2 = 1; if (n2 > COLS) n2 = COLS; cursor_move((n1 - 1) * COLS + (n2 - 1)); held_wrap = false; return DATA; } static enum state ansi_cursor_horizontal_absolute(int n1, int n2 _is_unused) { if (n1 < 1) n1 = 1; if (n1 > COLS) n1 = COLS; cursor_move((cursor_addr / COLS) * COLS + (n1 - 1)); held_wrap = false; return DATA; } static enum state ansi_vertical_position_absolute(int n1, int n2 _is_unused) { if (n1 < 1) n1 = 1; if (n1 > ROWS) n1 = ROWS; cursor_move(((n1 - 1) * COLS) + (cursor_addr % COLS)); held_wrap = false; return DATA; } static enum state ansi_erase_in_display(int nn, int ig2 _is_unused) { switch (nn) { case 0: /* below */ ctlr_aclear(cursor_addr, (ROWS * COLS) - cursor_addr, 1); break; case 1: /* above */ ctlr_aclear(0, cursor_addr + 1, 1); break; case 2: /* all (without moving cursor) */ if (cursor_addr == 0 && !is_altbuffer) scroll_save(ROWS, true); ctlr_aclear(0, ROWS * COLS, 1); break; } return DATA; } static enum state ansi_erase_in_line(int nn, int ig2 _is_unused) { int nc = cursor_addr % COLS; switch (nn) { case 0: /* to right */ ctlr_aclear(cursor_addr, COLS - nc, 1); break; case 1: /* to left */ ctlr_aclear(cursor_addr - nc, nc+1, 1); break; case 2: /* all */ ctlr_aclear(cursor_addr - nc, COLS, 1); break; } return DATA; } static enum state ansi_insert_lines(int nn, int ig2 _is_unused) { int rr = cursor_addr / COLS; /* current row */ int mr = scroll_bottom - rr; /* rows left at and below this one */ int ns; /* rows that are shifting */ /* If outside of the scrolling region, do nothing */ if (rr < scroll_top - 1 || rr >= scroll_bottom) return DATA; if (nn < 1) nn = 1; if (nn > mr) nn = mr; /* Move the victims down */ ns = mr - nn; if (ns) ctlr_bcopy(rr * COLS, (rr + nn) * COLS, ns * COLS, 1); /* Clear the middle of the screen */ ctlr_aclear(rr * COLS, nn * COLS, 1); return DATA; } static enum state ansi_delete_lines(int nn, int ig2 _is_unused) { int rr = cursor_addr / COLS; /* current row */ int mr = scroll_bottom - rr; /* max rows that can be deleted */ int ns; /* rows that are shifting */ /* If outside of the scrolling region, do nothing */ if (rr < scroll_top - 1 || rr >= scroll_bottom) return DATA; if (nn < 1) nn = 1; if (nn > mr) nn = mr; /* Move the surviving rows up */ ns = mr - nn; if (ns) ctlr_bcopy((rr + nn) * COLS, rr * COLS, ns * COLS, 1); /* Clear the rest of the screen */ ctlr_aclear((rr + ns) * COLS, nn * COLS, 1); return DATA; } static enum state ansi_delete_chars(int nn, int ig2 _is_unused) { int cc = cursor_addr % COLS; /* current col */ int mc = COLS - cc; /* max chars that can be deleted */ int ns; /* chars that are shifting */ if (nn < 1) nn = 1; if (nn > mc) nn = mc; /* Move the surviving chars left */ ns = mc - nn; if (ns) ctlr_bcopy(cursor_addr + nn, cursor_addr, ns, 1); /* Clear the end of the line */ ctlr_aclear(cursor_addr + ns, nn, 1); return DATA; } static enum state ansi_sgr(int ig1 _is_unused, int ig2 _is_unused) { int i; for (i = 0; i <= nx && i < NN; i++) { switch (n[i]) { case 0: gr = 0; fg = 0; bg = 0; break; case 1: gr |= GR_INTENSIFY; break; case 4: gr |= GR_UNDERLINE; break; case 5: gr |= GR_BLINK; break; case 7: gr |= GR_REVERSE; break; case 30: fg = 0xf0; /* black -> neutral black */ break; case 31: fg = 0xf2; /* red -> red */ break; case 32: fg = 0xf4; /* green -> green */ break; case 33: fg = 0xf6; /* yellow -> yellow */ break; case 34: fg = 0xf1; /* blue -> blue */ break; case 35: fg = 0xf3; /* magenta -> pink */ break; case 36: fg = 0xf5; /* cyan -> turquiose */ break; case 37: fg = 0xf7; /* white -> neutral white */ break; case 39: fg = 0; /* default */ break; case 40: bg = 0xf0; /* black -> neutral black */ break; case 41: bg = 0xf2; /* red -> red */ break; case 42: bg = 0xf4; /* green -> green */ break; case 43: bg = 0xf6; /* yellow -> yellow */ break; case 44: bg = 0xf1; /* blue -> blue */ break; case 45: bg = 0xf3; /* magenta -> pink */ break; case 46: bg = 0xf5; /* cyan -> turquoise */ break; case 47: bg = 0xf7; /* white -> neutral white */ break; case 49: bg = 0; /* default */ break; } } return DATA; } static enum state ansi_bell(int ig1 _is_unused, int ig2 _is_unused) { ring_bell(); return DATA; } static enum state ansi_newpage(int ig1 _is_unused, int ig2 _is_unused) { ctlr_clear(false); return DATA; } static enum state ansi_backspace(int ig1 _is_unused, int ig2 _is_unused) { if (held_wrap) { held_wrap = false; return DATA; } if (rev_wraparound_mode) { if (cursor_addr > (scroll_top - 1) * COLS) cursor_move(cursor_addr - 1); } else { if (cursor_addr % COLS) cursor_move(cursor_addr - 1); } return DATA; } static enum state ansi_cr(int ig1 _is_unused, int ig2 _is_unused) { if (cursor_addr % COLS) cursor_move(cursor_addr - (cursor_addr % COLS)); if (auto_newline_mode) (void) ansi_lf(0, 0); held_wrap = false; return DATA; } static enum state ansi_lf(int ig1 _is_unused, int ig2 _is_unused) { int nc = cursor_addr + COLS; held_wrap = false; /* If we're below the scrolling region, don't scroll. */ if ((cursor_addr / COLS) >= scroll_bottom) { if (nc < ROWS * COLS) cursor_move(nc); return DATA; } if (nc < scroll_bottom * COLS) cursor_move(nc); else nvt_scroll(); return DATA; } static enum state ansi_htab(int ig1 _is_unused, int ig2 _is_unused) { int col = cursor_addr % COLS; int i; held_wrap = false; if (col == COLS-1) return DATA; for (i = col+1; i < COLS-1; i++) if (tabs[i/8] & 1<<(i%8)) break; cursor_move(cursor_addr - col + i); return DATA; } static enum state ansi_escape(int ig1 _is_unused, int ig2 _is_unused) { return ESC; } static enum state ansi_nop(int ig1 _is_unused, int ig2 _is_unused) { return DATA; } #define PWRAP { \ nc = cursor_addr + 1; \ if (nc < scroll_bottom * COLS) \ cursor_move(nc); \ else { \ if (cursor_addr / COLS >= scroll_bottom) \ cursor_move(cursor_addr / COLS * COLS); \ else { \ nvt_scroll(); \ cursor_move(nc - COLS); \ } \ } \ } static enum state ansi_printing(int ig1 _is_unused, int ig2 _is_unused) { int nc; unsigned short ebc_ch; enum dbcs_state d; if ((pmi == 0) && (nvt_ch & 0x80)) { char mbs[2]; int consumed; enum me_fail fail; unsigned long ucs4; mbs[0] = (char)nvt_ch; mbs[1] = '\0'; ucs4 = multibyte_to_unicode(mbs, 1, &consumed, &fail); if (ucs4 == 0) { switch (fail) { case ME_SHORT: /* Start munching multi-byte. */ pmi = 0; pending_mbs[pmi++] = (char)nvt_ch; return MBPEND; case ME_INVALID: default: /* Invalid multi-byte -> '?' */ nvt_ch = '?'; break; } } else { nvt_ch = ucs4; } } pmi = 0; /* Translate to EBCDIC to see if it's DBCS. */ ebc_ch = unicode_to_ebcdic(nvt_ch); if (ebc_ch & ~0xff) { if (!dbcs) { nvt_ch = '?'; ebc_ch = asc2ebc0['?']; } } if (held_wrap) { PWRAP; held_wrap = false; } if (insert_mode) (void) ansi_insert_chars(1, 0); d = ctlr_dbcs_state(cursor_addr); switch (csd[(once_cset != -1) ? once_cset : cset]) { case CSD_LD: /* line drawing "0" */ if (nvt_ch >= 0x5f && nvt_ch <= 0x7e) ctlr_add(cursor_addr, (unsigned char)(nvt_ch - 0x5f), CS_LINEDRAW); else if (ebc_ch & ~0xff) ctlr_add(cursor_addr, (unsigned char)unicode_to_ebcdic('?'), CS_BASE); else ctlr_add(cursor_addr, (unsigned char)ebc_ch, CS_BASE); break; case CSD_UK: /* UK "A" */ if (nvt_ch == '#') ctlr_add(cursor_addr, 0x1e, CS_LINEDRAW); else if (ebc_ch & ~0xff) ctlr_add(cursor_addr, (unsigned char)unicode_to_ebcdic('?'), CS_BASE); else ctlr_add(cursor_addr, (unsigned char)ebc_ch, CS_BASE); break; case CSD_US: /* US "B" */ if (ebc_ch & ~0xff) { /* Add a DBCS character to the buffer. */ if (!dbcs) { /* Not currently using a DBCS character set. */ ctlr_add(cursor_addr, (unsigned char)unicode_to_ebcdic('?'), CS_BASE); break; } /* Get past the last column. */ if ((cursor_addr % COLS) == (COLS-1)) { if (!wraparound_mode) return DATA; ctlr_add(cursor_addr, EBC_space, CS_BASE); ctlr_add_gr(cursor_addr, gr); ctlr_add_fg(cursor_addr, fg); ctlr_add_bg(cursor_addr, bg); cursor_addr = cursor_addr + 1; d = ctlr_dbcs_state(cursor_addr); } /* Add the left half. */ ctlr_add(cursor_addr, (ebc_ch >> 8) & 0xff, CS_DBCS); ctlr_add_gr(cursor_addr, gr); ctlr_add_fg(cursor_addr, fg); ctlr_add_bg(cursor_addr, bg); /* Handle unaligned DBCS overwrite. */ if (d == DBCS_RIGHT || d == DBCS_RIGHT_WRAP) { int xaddr; xaddr = cursor_addr; DEC_BA(xaddr); ctlr_add(xaddr, EBC_space, CS_BASE); ea_buf[xaddr].db = DBCS_NONE; } /* Add the right half. */ INC_BA(cursor_addr); ctlr_add(cursor_addr, ebc_ch & 0xff, CS_DBCS); ctlr_add_gr(cursor_addr, gr); ctlr_add_fg(cursor_addr, fg); ctlr_add_bg(cursor_addr, bg); /* Handle cursor wrap. */ if (wraparound_mode) { if (!((cursor_addr + 1) % COLS)) { held_wrap = true; } else { PWRAP; } } else { if ((cursor_addr % COLS) != (COLS - 1)) cursor_move(cursor_addr + 1); } (void) ctlr_dbcs_postprocess(); return DATA; } /* Add an SBCS character to the buffer. */ ctlr_add(cursor_addr, (unsigned char)ebc_ch, CS_BASE); break; } /* Handle conflicts with existing DBCS characters. */ if (d == DBCS_RIGHT || d == DBCS_RIGHT_WRAP) { int xaddr; xaddr = cursor_addr; DEC_BA(xaddr); ctlr_add(xaddr, EBC_space, CS_BASE); ea_buf[xaddr].db = DBCS_NONE; ea_buf[cursor_addr].db = DBCS_NONE; (void) ctlr_dbcs_postprocess(); } if (d == DBCS_LEFT || d == DBCS_LEFT_WRAP) { int xaddr; xaddr = cursor_addr; INC_BA(xaddr); ctlr_add(xaddr, EBC_space, CS_BASE); ea_buf[xaddr].db = DBCS_NONE; ea_buf[cursor_addr].db = DBCS_NONE; (void) ctlr_dbcs_postprocess(); } once_cset = -1; ctlr_add_gr(cursor_addr, gr); ctlr_add_fg(cursor_addr, fg); ctlr_add_bg(cursor_addr, bg); if (wraparound_mode) { /* * There is a fascinating behavior of xterm which we will * attempt to emulate here. When a character is printed in the * last column, the cursor sticks there, rather than wrapping * to the next line. Another printing character will put the * cursor in column 2 of the next line. One cursor-left * sequence won't budge it; two will. Saving and restoring * the cursor won't move the cursor, but will cancel all of * the above behaviors... * * In my opinion, very strange, but among other things, 'vi' * depends on it! */ if (!((cursor_addr + 1) % COLS)) { held_wrap = true; } else { PWRAP; } } else { if ((cursor_addr % COLS) != (COLS - 1)) cursor_move(cursor_addr + 1); } return DATA; } static enum state ansi_multibyte(int ig1, int ig2) { unsigned long ucs4; int consumed; enum me_fail fail; afn_t fn; if (pmi >= MB_MAX - 2) { /* String too long. */ pmi = 0; nvt_ch = '?'; return ansi_printing(ig1, ig2); } pending_mbs[pmi++] = (char)nvt_ch; pending_mbs[pmi] = '\0'; ucs4 = multibyte_to_unicode(pending_mbs, pmi, &consumed, &fail); if (ucs4 != 0) { /* Success! */ nvt_ch = ucs4; return ansi_printing(ig1, ig2); } if (fail == ME_SHORT) { /* Go get more. */ return MBPEND; } /* Failure. */ /* Replace the sequence with '?'. */ ucs4 = nvt_ch; /* save for later */ pmi = 0; nvt_ch = '?'; (void) ansi_printing(ig1, ig2); /* * Reprocess whatever we choked on (especially if it's a control * character). */ nvt_ch = ucs4; state = DATA; fn = nvt_fn[st[(int)DATA][nvt_ch]]; return (*fn)(n[0], n[1]); } static enum state ansi_semicolon(int ig1 _is_unused, int ig2 _is_unused) { if (nx >= NN) return DATA; nx++; return state; } static enum state ansi_digit(int ig1 _is_unused, int ig2 _is_unused) { n[nx] = (n[nx] * 10) + (nvt_ch - '0'); return state; } static enum state ansi_reverse_index(int ig1 _is_unused, int ig2 _is_unused) { int rr = cursor_addr / COLS; /* current row */ int np = (scroll_top - 1) - rr; /* number of rows in the scrolling region, above this line */ int ns; /* number of rows to scroll */ int nn = 1; /* number of rows to index */ held_wrap = false; /* If the cursor is above the scrolling region, do a simple margined cursor up. */ if (np < 0) { (void) ansi_cursor_up(nn, 0); return DATA; } /* Split the number of lines to scroll into ns */ if (nn > np) { ns = nn - np; nn = np; } else ns = 0; /* Move the cursor up without scrolling */ if (nn) (void) ansi_cursor_up(nn, 0); /* Insert lines at the top for backward scroll */ if (ns) (void) ansi_insert_lines(ns, 0); return DATA; } static enum state ansi_send_attributes(int nn, int ig2 _is_unused) { if (!nn) net_sends("\033[?1;2c"); return DATA; } static enum state dec_return_terminal_id(int ig1 _is_unused, int ig2 _is_unused) { return ansi_send_attributes(0, 0); } static enum state ansi_set_mode(int nn, int ig2 _is_unused) { switch (nn) { case 4: insert_mode = 1; break; case 20: auto_newline_mode = 1; break; } return DATA; } static enum state ansi_reset_mode(int nn, int ig2 _is_unused) { switch (nn) { case 4: insert_mode = 0; break; case 20: auto_newline_mode = 0; break; } return DATA; } static enum state ansi_status_report(int nn, int ig2 _is_unused) { char *s; switch (nn) { case 5: net_sends("\033[0n"); break; case 6: s = xs_buffer("\033[%d;%dR", (cursor_addr/COLS) + 1, (cursor_addr%COLS) + 1); net_sends(s); Free(s); break; } return DATA; } static enum state ansi_cs_designate(int ig1 _is_unused, int ig2 _is_unused) { cs_to_change = (int)(strchr(gnnames, nvt_ch) - gnnames); return CSDES; } static enum state ansi_cs_designate2(int ig1 _is_unused, int ig2 _is_unused) { csd[cs_to_change] = (int)(strchr(csnames, nvt_ch) - csnames); return DATA; } static enum state ansi_select_g0(int ig1 _is_unused, int ig2 _is_unused) { cset = CS_G0; return DATA; } static enum state ansi_select_g1(int ig1 _is_unused, int ig2 _is_unused) { cset = CS_G1; return DATA; } static enum state ansi_select_g2(int ig1 _is_unused, int ig2 _is_unused) { cset = CS_G2; return DATA; } static enum state ansi_select_g3(int ig1 _is_unused, int ig2 _is_unused) { cset = CS_G3; return DATA; } static enum state ansi_one_g2(int ig1 _is_unused, int ig2 _is_unused) { once_cset = CS_G2; return DATA; } static enum state ansi_one_g3(int ig1 _is_unused, int ig2 _is_unused) { once_cset = CS_G3; return DATA; } static enum state ansi_esc3(int ig1 _is_unused, int ig2 _is_unused) { return DECP; } static enum state dec_set(int ig1 _is_unused, int ig2 _is_unused) { int i; for (i = 0; i <= nx && i < NN; i++) switch (n[i]) { case 1: /* application cursor keys */ appl_cursor = 1; break; case 2: /* set G0-G3 */ csd[0] = csd[1] = csd[2] = csd[3] = CSD_US; break; case 3: /* 132-column mode */ if (allow_wide_mode) { wide_mode = 1; screen_132(); } break; case 7: /* wraparound mode */ wraparound_mode = 1; break; case 40: /* allow 80/132 switching */ allow_wide_mode = 1; break; case 45: /* reverse-wraparound mode */ rev_wraparound_mode = 1; break; case 47: /* alt buffer */ case 1049: ctlr_altbuffer(true); break; } return DATA; } static enum state dec_reset(int ig1 _is_unused, int ig2 _is_unused) { int i; for (i = 0; i <= nx && i < NN; i++) switch (n[i]) { case 1: /* normal cursor keys */ appl_cursor = 0; break; case 3: /* 132-column mode */ if (allow_wide_mode) { wide_mode = 0; screen_80(); } break; case 7: /* no wraparound mode */ wraparound_mode = 0; break; case 40: /* allow 80/132 switching */ allow_wide_mode = 0; break; case 45: /* no reverse-wraparound mode */ rev_wraparound_mode = 0; break; case 47: /* alt buffer */ case 1049: ctlr_altbuffer(false); break; } return DATA; } static enum state dec_save(int ig1 _is_unused, int ig2 _is_unused) { int i; for (i = 0; i <= nx && i < NN; i++) switch (n[i]) { case 1: /* application cursor keys */ saved_appl_cursor = appl_cursor; break; case 3: /* 132-column mode */ saved_wide_mode = wide_mode; break; case 7: /* wraparound mode */ saved_wraparound_mode = wraparound_mode; break; case 40: /* allow 80/132 switching */ saved_allow_wide_mode = allow_wide_mode; break; case 45: /* reverse-wraparound mode */ saved_rev_wraparound_mode = rev_wraparound_mode; break; case 47: /* alt buffer */ case 1049: saved_altbuffer = is_altbuffer; break; } return DATA; } static enum state dec_restore(int ig1 _is_unused, int ig2 _is_unused) { int i; for (i = 0; i <= nx && i < NN; i++) switch (n[i]) { case 1: /* application cursor keys */ appl_cursor = saved_appl_cursor; break; case 3: /* 132-column mode */ if (allow_wide_mode) { wide_mode = saved_wide_mode; if (wide_mode) screen_132(); else screen_80(); } break; case 7: /* wraparound mode */ wraparound_mode = saved_wraparound_mode; break; case 40: /* allow 80/132 switching */ allow_wide_mode = saved_allow_wide_mode; break; case 45: /* reverse-wraparound mode */ rev_wraparound_mode = saved_rev_wraparound_mode; break; case 47: /* alt buffer */ case 1049: /* alt buffer */ ctlr_altbuffer(saved_altbuffer); break; } return DATA; } static enum state dec_scrolling_region(int top, int bottom) { if (top < 1) top = 1; if (bottom > ROWS) bottom = ROWS; if (top <= bottom && (top > 1 || bottom < ROWS)) { scroll_top = top; scroll_bottom = bottom; cursor_move(0); } else { scroll_top = 1; scroll_bottom = ROWS; } return DATA; } static enum state xterm_text_mode(int ig1 _is_unused, int ig2 _is_unused) { nx = 0; n[0] = 0; return TEXT; } static enum state xterm_text_semicolon(int ig1 _is_unused, int ig2 _is_unused) { tx = 0; return TEXT2; } static enum state xterm_text(int ig1 _is_unused, int ig2 _is_unused) { if (tx < NT) text[tx++] = nvt_ch; return state; } static enum state xterm_text_do(int ig1 _is_unused, int ig2 _is_unused) { text[tx] = '\0'; xterm_text_gui(n[0], text); return DATA; } static enum state ansi_htab_set(int ig1 _is_unused, int ig2 _is_unused) { register int col = cursor_addr % COLS; tabs[col/8] |= 1<<(col%8); return DATA; } static enum state ansi_htab_clear(int nn, int ig2 _is_unused) { register int col, i; switch (nn) { case 0: col = cursor_addr % COLS; tabs[col/8] &= ~(1<<(col%8)); break; case 3: for (i = 0; i < (COLS+7)/8; i++) tabs[i] = 0; break; } return DATA; } /* * Scroll the screen or the scrolling region. */ static void nvt_scroll(void) { held_wrap = false; /* Save the top line */ if (scroll_top == 1 && scroll_bottom == ROWS) { if (!is_altbuffer) scroll_save(1, false); ctlr_scroll(); return; } /* Scroll all but the last line up */ if (scroll_bottom > scroll_top) ctlr_bcopy(scroll_top * COLS, (scroll_top - 1) * COLS, (scroll_bottom - scroll_top) * COLS, 1); /* Clear the last line */ ctlr_aclear((scroll_bottom - 1) * COLS, COLS, 1); } /* Callback for when we enter NVT mode. */ static void nvt_in3270(bool in3270) { if (!in3270) (void) ansi_reset(0, 0); } /* * External entry points */ void nvt_process(unsigned int c) { afn_t fn; c &= 0xff; nvt_ch = c; scroll_to_bottom(); if (toggled(SCREEN_TRACE)) { trace_char((char)c); } fn = nvt_fn[st[(int)state][c]]; state = (*fn)(n[0], n[1]); /* Saving pending escape data. */ if (state == DATA) { pe = 0; } else if (pe < PE_MAX) { ped[pe++] = c; } /* Let a script go. */ sms_host_output(); } void nvt_send_up(void) { if (appl_cursor) net_sends("\033OA"); else net_sends("\033[A"); } void nvt_send_down(void) { if (appl_cursor) net_sends("\033OB"); else net_sends("\033[B"); } void nvt_send_right(void) { if (appl_cursor) net_sends("\033OC"); else net_sends("\033[C"); } void nvt_send_left(void) { if (appl_cursor) net_sends("\033OD"); else net_sends("\033[D"); } void nvt_send_home(void) { net_sends("\033[H"); } void nvt_send_clear(void) { net_sends("\033[2K"); } void nvt_send_pf(int nn) { char *s; static int code[] = { /* * F1 through F12 are VT220 codes. (Note the discontinuity -- * \E[16~ is missing) */ 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 23, 24, /* * F13 through F20 are defined for xterm. */ 25, 26, 28, 29, 31, 32, 33, 34, /* * F21 through F24 are x3270 extensions. */ 35, 36, 37, 38 }; if (nn < 1 || (unsigned)nn > sizeof(code)/sizeof(code[0])) { return; } if (nn <= 4) { /* xterm sends PF codes instead of F codes for F1..F4. */ nvt_send_pa(nn); return; } s = xs_buffer("\033[%d~", code[nn-1]); net_sends(s); Free(s); } void nvt_send_pa(int nn) { char *s; static char code[4] = { 'P', 'Q', 'R', 'S' }; if (nn < 1 || nn > 4) { return; } s = xs_buffer("\033O%c", code[nn-1]); net_sends(s); Free(s); } static void toggle_lineWrap(toggle_index_t ix _is_unused, enum toggle_type type _is_unused) { if (toggled(LINE_WRAP)) { wraparound_mode = 1; } else { wraparound_mode = 0; } } /* Emit an SGR command. */ static void emit_sgr(int mode) { space3270out((mode < 10)? 4: 5); *obptr++ = 0x1b; *obptr++ = '['; if (mode > 9) *obptr++ = '0' + (mode / 10); *obptr++ = '0' + (mode % 10); *obptr++ = 'm'; } /* Emit a DEC Private Mode command. */ static void emit_decpriv(int mode, char op) { space3270out((mode < 10)? 5: 6); *obptr++ = 0x1b; *obptr++ = '['; *obptr++ = '?'; if (mode > 9) *obptr++ = '0' + (mode / 10); *obptr++ = '0' + (mode % 10); *obptr++ = op; } /* Emit a CUP (cursor position) command. */ static void emit_cup(int baddr) { if (baddr) { char *s; size_t sl; s = xs_buffer("\033[%d;%dH", (baddr / COLS) + 1, (baddr % COLS) + 1); sl = strlen(s); space3270out(sl); strcpy((char *)obptr, s); Free(s); obptr += sl; } else { space3270out(3); *obptr++ = 0x1b; *obptr++ = '['; *obptr++ = 'H'; } } /* Emit spaces or a CUP, whichever is shorter. */ static int ansi_dump_spaces(size_t spaces, int baddr) { char *s; size_t sl; if (!spaces) { return 0; } /* * Move the cursor, if it takes less space than * expanding the spaces. * It is possible to optimize this further with clever * CU[UDFB] sequences, but not (yet) worth the effort. */ s = xs_buffer("\033[%d;%dH", (baddr / COLS) + 1, (baddr % COLS) + 1); sl = strlen(s); if (sl < spaces) { space3270out(sl); strcpy((char *)obptr, s); obptr += sl; } else { space3270out(spaces); while (spaces--) { *obptr++ = ' '; } } Free(s); return 0; } /* * Snap the provided screen buffer (primary or alternate). * This is (mostly) optimized to draw the minimum necessary, assuming a * blank screen. */ static void nvt_snap_one(struct ea *buf) { int baddr; int cur_gr = 0; int cur_fg = 0; int cur_bg = 0; int spaces = 0; static int uncolor_table[16] = { /* 0xf0 */ 0, /* neutral black -> black */ /* 0xf1 */ 4, /* blue -> blue */ /* 0xf2 */ 1, /* red -> red */ /* 0xf3 */ 5, /* pink -> magenta */ /* 0xf4 */ 2, /* green -> green */ /* 0xf5 */ 6, /* turquoise -> cyan */ /* 0xf6 */ 3, /* yellow -> yellow */ /* 0xf7 */ 7, /* neutral white -> white */ /* 0xf8 */ 0, /* (shouldn't happen) */ /* 0xf9 */ 0, /* (shouldn't happen) */ /* 0xfa */ 0, /* (shouldn't happen) */ /* 0xfb */ 0, /* (shouldn't happen) */ /* 0xfc */ 0, /* (shouldn't happen) */ /* 0xfd */ 0, /* (shouldn't happen) */ /* 0xfe */ 0, /* (shouldn't happen) */ /* 0xff */ 0 /* (shouldn't happen) */ }; char mb[16]; size_t len; int xlen; size_t i; enum dbcs_state d; int c; int last_sgr = 0; # define EMIT_SGR(n) { emit_sgr(n); last_sgr = (n); } /* Draw what's on the screen. */ baddr = 0; do { int xgr = buf[baddr].gr; /* Set the attributes. */ if (xgr != cur_gr) { spaces = ansi_dump_spaces(spaces, baddr); if ((xgr ^ cur_gr) & cur_gr) { /* * Something turned off. Turn everything off, * then turn the remaining modes on below. */ EMIT_SGR(0); xgr = 0; } else { /* * Clear the bits in xgr that are already set * in cur_gr. Turn on the new modes. */ xgr &= ~cur_gr; } /* Turn on the attributes remaining in xgr. */ if (xgr & GR_INTENSIFY) { EMIT_SGR(1); } if (xgr & GR_UNDERLINE) { EMIT_SGR(4); } if (xgr & GR_BLINK) { EMIT_SGR(5); } if (xgr & GR_REVERSE) { EMIT_SGR(7); } cur_gr = buf[baddr].gr; } /* Set the colors. */ if (buf[baddr].fg != cur_fg) { spaces = ansi_dump_spaces(spaces, baddr); if (buf[baddr].fg) { c = uncolor_table[buf[baddr].fg & 0x0f]; } else { c = 9; } EMIT_SGR(30 + c); cur_fg = buf[baddr].fg; } if (buf[baddr].bg != cur_bg) { spaces = ansi_dump_spaces(spaces, baddr); if (buf[baddr].bg) { c = uncolor_table[buf[baddr].bg & 0x0f]; } else { c = 9; } EMIT_SGR(40 + c); cur_bg = buf[baddr].bg; } /* Expand the current character to multibyte. */ d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { int xaddr = baddr; INC_BA(xaddr); len = ebcdic_to_multibyte(buf[baddr].cc << 8 | buf[xaddr].cc, mb, sizeof(mb)); } else if (IS_RIGHT(d)) { len = 0; } else { len = ebcdic_to_multibyte(buf[baddr].cc, mb, sizeof(mb)); } if (len > 0) { len--; /* terminating NUL */ } xlen = 0; for (i = 0; i < len; i++) { if ((mb[i] & 0xff) == 0xff) { xlen++; } } /* Optimize for white space. */ if (!cur_fg && !cur_bg && !cur_gr && ((len + xlen) == 1) && (mb[0] == ' ')) { spaces++; } else { if (spaces) { spaces = ansi_dump_spaces(spaces, baddr); } /* Emit the current character. */ space3270out(len + xlen); for (i = 0; i < len; i++) { if ((mb[i] & 0xff) == 0xff) { *obptr++ = 0xff; } *obptr++ = mb[i]; } } INC_BA(baddr); } while (baddr != 0); /* Remove any attributes we set above. */ if (last_sgr != 0) { emit_sgr(0); } } /* Snap the contents of the screen buffers in NVT mode. */ void nvt_snap(void) { /* * Note that ea_buf is the live buffer, and aea_buf is the other * buffer. So the task here is to draw the other buffer first, * then switch modes and draw the live one. */ if (is_altbuffer) { /* Draw the primary screen first. */ nvt_snap_one(aea_buf); emit_cup(0); /* Switch to the alternate. */ emit_decpriv(47, 'h'); /* Draw the secondary, and stay in alternate mode. */ nvt_snap_one(ea_buf); } else { int i; int any = 0; static struct ea zea = { 0, 0, 0, 0, 0, 0, 0, 0 }; /* See if aea_buf has anything in it. */ for (i = 0; i < ROWS * COLS; i++) { if (memcmp(&aea_buf[i], &zea, sizeof(struct ea))) { any = 1; break; } } if (any) { /* Switch to the alternate. */ emit_decpriv(47, 'h'); /* Draw the alternate screen. */ nvt_snap_one(aea_buf); emit_cup(0); /* Switch to the primary. */ emit_decpriv(47, 'l'); } /* Draw the primary, and stay in primary mode. */ nvt_snap_one(ea_buf); } } /* * Snap the non-default terminal modes. * This is a subtle piece of logic, and may harbor a few bugs yet. */ void nvt_snap_modes(void) { int i; static char csdsel[4] = "()*+"; /* Set up the saved cursor (cursor, fg, bg, gr, cset, csd). */ if (saved_cursor != 0 || saved_fg != 0 || saved_bg != 0 || saved_gr != 0 || saved_cset != CS_G0 || saved_csd[0] != CSD_US || saved_csd[1] != CSD_US || saved_csd[2] != CSD_US || saved_csd[3] != CSD_US) { if (saved_cursor != 0) emit_cup(saved_cursor); if (saved_fg != 0) emit_sgr(30 + saved_fg); if (saved_bg != 0) emit_sgr(40 + saved_bg); if (saved_gr != 0) { if (saved_gr & GR_INTENSIFY) emit_sgr(1); if (saved_gr & GR_UNDERLINE) emit_sgr(4); if (saved_gr & GR_BLINK) emit_sgr(5); if (saved_gr & GR_REVERSE) emit_sgr(7); } if (saved_cset != CS_G0) { switch (saved_cset) { case CS_G1: space3270out(1); *obptr++ = 0x0e; break; case CS_G2: space3270out(2); *obptr++ = 0x1b; *obptr++ = 'N'; break; case CS_G3: space3270out(2); *obptr++ = 0x1b; *obptr++ = 'O'; break; default: break; } } for (i = 0; i < 4; i++) { if (saved_csd[i] != CSD_US) { space3270out(3); *obptr++ = 0x1b; *obptr++ = csdsel[i]; *obptr++ = gnnames[saved_csd[i]]; } } /* Emit a SAVE CURSOR to stash these away. */ space3270out(2); *obptr++ = 0x1b; *obptr++ = '7'; } /* Now set the above to their current values, except for the cursor. */ if (fg != saved_fg) emit_sgr(30 + fg); if (bg != saved_bg) emit_sgr(40 + bg); if (gr != saved_gr) { emit_sgr(0); if (gr & GR_INTENSIFY) emit_sgr(1); if (gr & GR_UNDERLINE) emit_sgr(4); if (gr & GR_BLINK) emit_sgr(5); if (gr & GR_REVERSE) emit_sgr(7); } if (cset != saved_cset) { switch (cset) { case CS_G0: space3270out(1); *obptr++ = 0x0f; break; case CS_G1: space3270out(1); *obptr++ = 0x0e; break; case CS_G2: space3270out(2); *obptr++ = 0x1b; *obptr++ = 'n'; break; case CS_G3: space3270out(2); *obptr++ = 0x1b; *obptr++ = 'o'; break; default: break; } } for (i = 0; i < 4; i++) { if (csd[i] != saved_csd[i]) { space3270out(3); *obptr++ = 0x1b; *obptr++ = csdsel[i]; *obptr++ = gnnames[csd[i]]; } } /* * Handle appl_cursor, wrapaparound_mode, rev_wraparound_mode, * allow_wide_mode, wide_mode and altbuffer, both the saved values and * the current ones. */ if (saved_appl_cursor) { emit_decpriv(1, 'h'); /* set */ emit_decpriv(1, 's'); /* save */ if (!appl_cursor) emit_decpriv(1, 'l'); /* reset */ } else if (appl_cursor) { emit_decpriv(1, 'h'); /* set */ } if (saved_wide_mode) { emit_decpriv(3, 'h'); /* set */ emit_decpriv(3, 's'); /* save */ if (!wide_mode) emit_decpriv(3, 'l'); /* reset */ } else if (wide_mode) { emit_decpriv(3, 'h'); /* set */ } if (saved_wraparound_mode == 0) { emit_decpriv(7, 'h'); /* set (no-wraparound mode) */ emit_decpriv(7, 's'); /* save */ if (wraparound_mode) emit_decpriv(7, 'l'); /* reset */ } else if (!wraparound_mode) { emit_decpriv(7, 'h'); /* set (no-wraparound mode) */ } if (saved_allow_wide_mode) { emit_decpriv(40, 'h'); /* set */ emit_decpriv(40, 's'); /* save */ if (!allow_wide_mode) emit_decpriv(40, 'l'); /* reset */ } else if (allow_wide_mode) { emit_decpriv(40, 'h'); /* set */ } if (saved_rev_wraparound_mode) { emit_decpriv(45, 'h'); /* set (rev--wraparound mode) */ emit_decpriv(45, 's'); /* save */ if (!rev_wraparound_mode) emit_decpriv(45, 'l'); /* reset */ } else if (rev_wraparound_mode) { emit_decpriv(45, 'h'); /* set (rev-wraparound mode) */ } if (saved_altbuffer) { emit_decpriv(47, 'h'); /* set */ emit_decpriv(47, 's'); /* save */ if (!is_altbuffer) emit_decpriv(47, 'l'); /* reset */ } /* else not necessary to set it now -- it was already set when the screen was drawn */ /* * Now take care of auto_newline, insert mode, the scroll region * and tabs. */ if (auto_newline_mode) { space3270out(4); *obptr++ = 0x1b; *obptr++ = '['; *obptr++ = '4'; *obptr++ = 'h'; } if (insert_mode) { space3270out(5); *obptr++ = 0x1b; *obptr++ = '['; *obptr++ = '2'; *obptr++ = '0'; *obptr++ = 'h'; } if (scroll_top != 1 || scroll_bottom != ROWS) { space3270out(10); obptr += sprintf((char *)obptr, "\033[%d;%dr", scroll_top, scroll_bottom); } if (tabs) { unsigned char *deftabs; deftabs = (unsigned char *)Malloc((COLS+7)/8); for (i = 0; i < (COLS+7)/8; i++) deftabs[i] = 0x01; for (i = 0; i < COLS; i++) { if (tabs[i/8] & 1<<(i%8)) { if (!(deftabs[i/8] & 1<<(i%8))) { /* Tab was cleared. */ space3270out(15); obptr += sprintf((char *)obptr, "\033[%d;%dH", (cursor_addr / COLS) + 1, ((cursor_addr + i) % COLS) + 1); *obptr++ = 0x1b; *obptr++ = '['; *obptr++ = '0'; *obptr++ = 'g'; } } else { if (deftabs[i/8] & 1<<(i%8)) { /* Tab was set. */ space3270out(13); obptr += sprintf((char *)obptr, "\033[%d;%dH", (cursor_addr / COLS) + 1, ((cursor_addr + i) % COLS) + 1); *obptr++ = 0x1b; *obptr++ = 'H'; } } } } /* * We're done moving the cursor for other purposes (saving it, * messing with tabs). Put it where it should be now. */ emit_cup(cursor_addr); /* Now add any pending single-character CS change. */ switch (once_cset) { case CS_G2: space3270out(2); *obptr++ = 0x1b; *obptr++ = 'N'; break; case CS_G3: space3270out(2); *obptr++ = 0x1b; *obptr++ = 'O'; break; default: break; } /* Now add any incomplete escape sequence. */ if (pe) { int xlen = 0; for (i = 0; i < pe; i++) if (ped[i] == 0xff) xlen++; space3270out(pe + xlen); for (i = 0; i < pe; i++) { if (ped[i] == 0xff) *obptr++ = 0xff; *obptr++ = ped[i]; } } /* Last, emit any incomplete multi-byte data. */ if (pmi) { space3270out(pmi); for (i = 0; i < pmi; i++) { *obptr++ = pending_mbs[i]; } } } /** * NVT-mode module registration. */ void nvt_register(void) { static toggle_register_t toggles[] = { { LINE_WRAP, toggle_lineWrap, 0 } }; /* Register our toggles. */ register_toggles(toggles, array_count(toggles)); /* Register for state changes. */ register_schange(ST_3270_MODE, nvt_in3270); } suite3270-3.6/Common/nvt_gui_stubs.c0000664000076500007650000000330013221577163015457 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * nvt_gui_stubs.c * Stubs for the NVT-mode GUI functions. */ #include "globals.h" #include "nvt_gui.h" void xterm_text_gui(int code _is_unused, const char *text _is_unused) { } suite3270-3.6/Common/popups_stubs.c0000664000076500007650000000330113221577163015333 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * popups_stubs.c * Stubs for menubar.c. */ #include "globals.h" #include #include "popups.h" void popup_an_info(const char *fmt _is_unused, ...) { /* Do nothing. */ } suite3270-3.6/Common/pr3287/charset.c0000664000076500007650000000721613221577163015174 0ustar pdmpdm/* * Copyright (c) 2001-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * charset.c * Limited character set support. */ #include "globals.h" #include #include #include #if !defined(_WIN32) /*[*/ # include # include #endif /*]*/ #if defined(__CYGWIN__) /*[*/ # include #undef _WIN32 #endif /*]*/ #include "3270ds.h" #include "charset.h" #include "unicodec.h" #include "unicode_dbcs.h" #include "utf8.h" #if defined(_WIN32) /*[*/ # define LOCAL_CODEPAGE CP_ACP #else /*][*/ # define LOCAL_CODEPAGE 0 #endif /*]*/ unsigned long cgcsgid = 0x02b90025; unsigned long cgcsgid_dbcs = 0x02b90025; int dbcs = 0; char *encoding = NULL; char *converters = NULL; /* * Change character sets. */ enum cs_result charset_init(const char *csname) { #if !defined(_WIN32) /*[*/ char *codeset_name; #endif /*]*/ const char *host_codepage; const char *cgcsgid_str; #if !defined(_WIN32) /*[*/ setlocale(LC_ALL, ""); codeset_name = nl_langinfo(CODESET); # if defined(__CYGWIN__) /*[*/ /* * Cygwin's locale support is quite limited. If the locale * indicates "US-ASCII", which appears to be the only supported * encoding, ignore it and use the Windows ANSI code page, which * observation indicates is what is actually supported. * * Hopefully at some point Cygwin will start returning something * meaningful here and this logic will stop triggering. * * If this (lack of) functionality persists, then it will probably * become necessary for pr3287 to support the wpr3287 '-printercp' * option, so that the printer code page can be configured. */ if (!strcmp(codeset_name, "US-ASCII")) { codeset_name = Malloc(64); sprintf(codeset_name, "CP%d", GetACP()); } # endif /*]*/ set_codeset(codeset_name, false); #endif /*]*/ if (!set_uni(csname, LOCAL_CODEPAGE, &host_codepage, &cgcsgid_str, NULL, NULL)) { return CS_NOTFOUND; } cgcsgid = strtoul(cgcsgid_str, NULL, 0); if (!(cgcsgid & ~0xffff)) { cgcsgid |= 0x02b90000; } if (set_uni_dbcs(csname, &cgcsgid_str) == 0) { dbcs = 1; cgcsgid_dbcs = strtoul(cgcsgid_str, NULL, 0); } return CS_OKAY; } suite3270-3.6/Common/pr3287/ctlr.c0000664000076500007650000013205213221577163014504 0ustar pdmpdm/* * Copyright (c) 1993-2014, Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ctlr.c * This module handles interpretation of the 3270 data stream and * maintenance of the 3270 device state. * */ #include #include #include #if !defined(_MSC_VER) /*[*/ #include #endif /*]*/ #include #include #if !defined(_WIN32) /*[*/ #include #endif /*]*/ #include #include "globals.h" #include "pr3287.h" #include "3270ds.h" #include "charset.h" #include "ctlrc.h" #include "trace.h" #include "sf.h" #include "tables.h" #include "unicodec.h" #include "xtablec.h" #if defined(_WIN32) /*[*/ #include "wsc.h" #include #endif /*]*/ #define CS_GE 0x04 /* hack */ #define WCC_LINE_LENGTH(c) ((c) & 0x30) #define WCC_132 0x00 #define WCC_40 0x10 #define WCC_64 0x20 #define WCC_80 0x30 #define MAX_BUF (MAX_UNF_MPP * MAX_UNF_MPP) /* swag */ #define VISIBLE 0x01 /* visible field */ #define INVISIBLE 0x02 /* invisible field */ #define BUFSZ 4096 #define FCORDER_NOP 0x0001 /* dummy filler for DBCS right half */ static const char *ll_name[] = { "unformatted132", "formatted40", "formatted64", "formatted80" }; static int ll_len[] = { 132, 40, 64, 80 }; /* 3270 (formatted mode) data */ static unsigned char default_gr; static unsigned char default_cs; static int line_length; static ucs4_t page_buf[MAX_BUF]; static unsigned char *xlate_buf[MAX_BUF]; int xlate_len[MAX_BUF]; static int baddr = 0; static bool page_buf_initted = false; static bool any_3270_printable = false; static int any_3270_output = 0; #if !defined(_WIN32) /*[*/ static FILE *prfile = NULL; static int prpid = -1; #else /*][*/ static int ws_initted = 0; static int ws_needpre = 1; #endif /*]*/ static unsigned char wcc_line_length; static int ctlr_erase(void); static int dump_formatted(void); static int dump_unformatted(void); static int stash(unsigned char c); static int prflush(void); static int copyfile(const char *filename); #define DECODE_BADDR(c1, c2) \ ((((c1) & 0xC0) == 0x00) ? \ (((c1) & 0x3F) << 8) | (c2) : \ (((c1) & 0x3F) << 6) | ((c2) & 0x3F)) /* SCS constants and data. */ #define MAX_MPP 132 #define MAX_MPL 108 static ucs4_t linebuf[MAX_MPP+1]; static struct { unsigned malloc_len; unsigned data_len; char *buf; } trnbuf[MAX_MPP+1]; static char htabs[MAX_MPP+1]; static char vtabs[MAX_MPL+1]; static int lm, tm, bm, mpp, mpl, scs_any; static int pp; static int line; static bool scs_initted = false; static bool any_scs_output = false; static size_t scs_leftover_len = 0; static int scs_leftover_buf[256]; static int scs_dbcs_subfield = 0; static unsigned char scs_dbcs_c1 = 0; static unsigned scs_cs = 0; static bool ffeoj_last = false; /* * Interpret an incoming 3270 command. */ enum pds process_ds(unsigned char *buf, size_t buflen) { if (!buflen) return PDS_OKAY_NO_OUTPUT; trace_ds("< "); switch (buf[0]) { /* 3270 command */ case CMD_EAU: /* erase all unprotected */ case SNA_CMD_EAU: trace_ds("EraseAllUnprotected\n"); if (ctlr_erase() < 0 || prflush() < 0) return PDS_FAILED; return PDS_OKAY_NO_OUTPUT; break; case CMD_EWA: /* erase/write alternate */ case SNA_CMD_EWA: trace_ds("EraseWriteAlternate"); if (ctlr_erase() < 0 || prflush() < 0) return PDS_FAILED; baddr = 0; ctlr_write(buf, buflen, true); return PDS_OKAY_NO_OUTPUT; break; case CMD_EW: /* erase/write */ case SNA_CMD_EW: trace_ds("EraseWrite"); if (ctlr_erase() < 0 || prflush() < 0) return PDS_FAILED; baddr = 0; ctlr_write(buf, buflen, true); return PDS_OKAY_NO_OUTPUT; break; case CMD_W: /* write */ case SNA_CMD_W: trace_ds("Write"); ctlr_write(buf, buflen, false); return PDS_OKAY_NO_OUTPUT; break; case CMD_RB: /* read buffer */ case SNA_CMD_RB: trace_ds("ReadBuffer\n"); return PDS_BAD_CMD; break; case CMD_RM: /* read modifed */ case SNA_CMD_RM: trace_ds("ReadModified\n"); return PDS_BAD_CMD; break; case CMD_RMA: /* read modifed all */ case SNA_CMD_RMA: trace_ds("ReadModifiedAll\n"); return PDS_BAD_CMD; break; case CMD_WSF: /* write structured field */ case SNA_CMD_WSF: trace_ds("WriteStructuredField"); return write_structured_field(buf, buflen); break; case CMD_NOP: /* no-op */ trace_ds("NoOp\n"); return PDS_OKAY_NO_OUTPUT; break; default: /* unknown 3270 command */ errmsg("Unknown 3270 Data Stream command: 0x%X", buf[0]); return PDS_BAD_CMD; } } /* * Process a 3270 Write command. */ void ctlr_write(unsigned char buf[], size_t buflen, bool erase) { register unsigned char *cp; bool wcc_keyboard_restore, wcc_sound_alarm; bool wcc_start_printer; bool ra_ge; int i; unsigned char na; int any_fa; ucs4_t ra_xlate = 0; const char *paren = "("; int xbaddr; enum { NONE, ORDER, SBA, TEXT, NULLCH } previous = NONE; #define END_TEXT0 { if (previous == TEXT) trace_ds("'"); } #define END_TEXT(cmd) { END_TEXT0; trace_ds(" %s", cmd); } #define START_FIELD(fa) { \ ctlr_add(0, FA_IS_ZERO(fa)?INVISIBLE:VISIBLE, 0, default_gr); \ trace_ds(see_attr(fa)); \ } if (buflen < 2) return; if (!page_buf_initted) { (void) memset(page_buf, '\0', MAX_BUF * sizeof(ucs4_t)); (void) memset(xlate_buf, '\0', MAX_BUF * sizeof(unsigned char *)); (void) memset(xlate_len, '\0', MAX_BUF * sizeof(int)); page_buf_initted = true; baddr = 0; } default_gr = 0; default_cs = 0; if (WCC_RESET(buf[1])) { trace_ds("%sreset", paren); paren = ","; } wcc_line_length = WCC_LINE_LENGTH(buf[1]); if (wcc_line_length) { trace_ds("%s%s", paren, ll_name[wcc_line_length >> 4]); paren = ","; } else { trace_ds("%sunformatted", paren); paren = ","; } line_length = ll_len[wcc_line_length >> 4]; wcc_sound_alarm = WCC_SOUND_ALARM(buf[1]); if (wcc_sound_alarm) { trace_ds("%salarm", paren); paren = ","; } wcc_keyboard_restore = WCC_KEYBOARD_RESTORE(buf[1]); if (wcc_keyboard_restore) { trace_ds("%srestore", paren); paren = ","; } if (WCC_RESET_MDT(buf[1])) { trace_ds("%sresetMDT", paren); paren = ","; } wcc_start_printer = WCC_START_PRINTER(buf[1]); if (wcc_start_printer) { trace_ds("%sstartprinter", paren); paren = ","; } if (strcmp(paren, "(")) trace_ds(")"); for (cp = &buf[2]; cp < (buf + buflen); cp++) { switch (*cp) { case ORDER_SF: /* start field */ END_TEXT("StartField"); previous = ORDER; cp++; /* skip field attribute */ START_FIELD(*cp); break; case ORDER_SBA: /* set buffer address */ cp += 2; /* skip buffer address */ xbaddr = DECODE_BADDR(*(cp-1), *cp); END_TEXT("SetBufferAddress"); if (wcc_line_length) trace_ds("(%d,%d)", 1+(xbaddr/line_length), 1+(xbaddr%line_length)); else trace_ds("(%d[%+d])", xbaddr, xbaddr-baddr); if (xbaddr >= MAX_BUF) { /* Error! */ baddr = 0; return; } if (wcc_line_length) { /* Formatted. */ baddr = xbaddr; } else if (xbaddr > baddr) { /* Unformatted. */ while (baddr < xbaddr) { ctlr_add(0, ' ', default_cs, default_gr); } } previous = SBA; break; case ORDER_IC: /* insert cursor */ END_TEXT("InsertCursor"); previous = ORDER; break; case ORDER_PT: /* program tab */ END_TEXT("ProgramTab"); previous = ORDER; break; case ORDER_RA: /* repeat to address */ cp += 2; /* skip buffer address */ xbaddr = DECODE_BADDR(*(cp-1), *cp); END_TEXT("RepeatToAddress"); if (wcc_line_length) trace_ds("(%d,%d)", 1+(xbaddr/line_length), 1+(xbaddr%line_length)); else trace_ds("(%d[%+d])", xbaddr, xbaddr-baddr); cp++; /* skip char to repeat */ if (*cp == ORDER_GE){ ra_ge = true; trace_ds("GraphicEscape"); cp++; } else ra_ge = false; trace_ds("'%s'", see_ebc(*cp)); previous = ORDER; if (xbaddr > MAX_BUF || xbaddr < baddr) { baddr = 0; return; } /* Translate '*cp' once. */ switch (*cp) { case FCORDER_FF: case FCORDER_CR: case FCORDER_NL: case FCORDER_EM: ra_xlate = *cp; break; default: if (*cp <= 0x3F) { ra_xlate = '\0'; } else { ra_xlate = ebcdic_to_unicode(*cp, ra_ge? CS_GE: CS_BASE, EUO_NONE); } break; } while (baddr < xbaddr) { ctlr_add(ra_ge? 0: *cp, ra_xlate, ra_ge? CS_GE: default_cs, default_gr); } break; case ORDER_EUA: /* erase unprotected to address */ cp += 2; /* skip buffer address */ xbaddr = DECODE_BADDR(*(cp-1), *cp); END_TEXT("EraseUnprotectedAll"); previous = ORDER; break; case ORDER_GE: /* graphic escape */ END_TEXT("GraphicEscape "); cp++; /* skip char */ previous = ORDER; if (*cp) trace_ds("'"); trace_ds("%s", see_ebc(*cp)); if (*cp) trace_ds("'"); ctlr_add(0, ebcdic_to_unicode(*cp, CS_GE, EUO_NONE), CS_GE, default_gr); break; case ORDER_MF: /* modify field */ END_TEXT("ModifyField"); previous = ORDER; cp++; na = *cp; cp += na * 2; break; case ORDER_SFE: /* start field extended */ END_TEXT("StartFieldExtended"); previous = ORDER; cp++; /* skip order */ na = *cp; any_fa = 0; for (i = 0; i < (int)na; i++) { cp++; if (*cp == XA_3270) { trace_ds(" 3270"); cp++; START_FIELD(*cp); any_fa++; } else if (*cp == XA_FOREGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; } else if (*cp == XA_HIGHLIGHTING) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; } else if (*cp == XA_CHARSET) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; } else if (*cp == XA_ALL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); cp++; } else { trace_ds("%s[unsupported]", see_efa(*cp, *(cp + 1))); cp++; } } if (!any_fa) START_FIELD(0); ctlr_add(0, '\0', 0, default_gr); break; case ORDER_SA: /* set attribute */ END_TEXT("SetAttribtue"); previous = ORDER; cp++; if (*cp == XA_FOREGROUND) { trace_ds("%s", see_efa(*cp, *(cp + 1))); } else if (*cp == XA_HIGHLIGHTING) { trace_ds("%s", see_efa(*cp, *(cp + 1))); default_gr = *(cp + 1) & 0x07; } else if (*cp == XA_ALL) { trace_ds("%s", see_efa(*cp, *(cp + 1))); default_gr = 0; default_cs = 0; } else if (*cp == XA_CHARSET) { trace_ds("%s", see_efa(*cp, *(cp + 1))); default_cs = (*(cp + 1) == 0xf1) ? 1 : 0; } else trace_ds("%s[unsupported]", see_efa(*cp, *(cp + 1))); cp++; break; case FCORDER_FF: /* Form Feed */ END_TEXT("FF"); previous = ORDER; ctlr_add(0, FCORDER_FF, default_cs, default_gr); break; case FCORDER_CR: /* Carriage Return */ END_TEXT("CR"); previous = ORDER; ctlr_add(0, FCORDER_CR, default_cs, default_gr); break; case FCORDER_NL: /* New Line */ END_TEXT("NL"); previous = ORDER; ctlr_add(0, FCORDER_NL, default_cs, default_gr); break; case FCORDER_EM: /* End of Media */ END_TEXT("EM"); previous = ORDER; ctlr_add(0, FCORDER_EM, default_cs, default_gr); break; case FCORDER_DUP: /* Visible control characters */ case FCORDER_FM: END_TEXT(see_ebc(*cp)); previous = ORDER; ctlr_add(0, ebc2asc0[*cp], default_cs, default_gr); break; case FCORDER_SUB: /* misc format control orders */ case FCORDER_EO: END_TEXT(see_ebc(*cp)); previous = ORDER; ctlr_add(0, '\0', default_cs, default_gr); break; case FCORDER_NULL: END_TEXT("NULL"); previous = NULLCH; ctlr_add(0, '\0', default_cs, default_gr); break; default: /* enter character */ if (*cp <= 0x3F) { END_TEXT("ILLEGAL-ORDER "); previous = ORDER; ctlr_add(0, '\0', default_cs, default_gr); trace_ds("%s", see_ebc(*cp)); break; } if (previous != TEXT) trace_ds(" '"); previous = TEXT; trace_ds("%s", see_ebc(*cp)); ctlr_add(*cp, ebcdic_to_unicode(*cp, default_cs, EUO_NONE), default_cs, default_gr); break; } } trace_ds("\n"); } #undef START_FIELDx #undef START_FIELD0 #undef START_FIELD #undef END_TEXT0 #undef END_TEXT /* * Process SCS (SNA Character Stream) data. */ /* Reinitialize the SCS virtual 3287. */ static void init_scs_horiz(void) { int i; mpp = MAX_MPP; lm = 1; htabs[1] = 1; for (i = 2; i <= MAX_MPP; i++) { htabs[i] = 0; } } static void init_scs_vert(void) { int i; mpl = 1; tm = 1; bm = mpl; vtabs[1] = 1; for (i = 0; i <= MAX_MPL; i++) { vtabs[i] = 0; } } static void init_scs(void) { int i; if (scs_initted) return; trace_ds("Initializing SCS virtual 3287.\n"); init_scs_horiz(); init_scs_vert(); pp = 1; line = 1; scs_any = 0; for (i = 0; i < MAX_MPP+1; i++) linebuf[i] = ' '; for (i = 0; i < MAX_MPP+1; i++) { if (trnbuf[i].malloc_len != 0) { Free(trnbuf[i].buf); trnbuf[i].buf = NULL; trnbuf[i].malloc_len = 0; } trnbuf[i].data_len = 0; } scs_leftover_len = 0; scs_dbcs_subfield = 0; scs_dbcs_c1 = 0; scs_cs = 0; scs_initted = true; } #if defined(_WIN32) /*[*/ static int unicode_to_printer(ucs4_t u, char mb[], int mb_len) { int nc; wchar_t wuc = u; nc = WideCharToMultiByte(options.printercp, 0, &wuc, 1, mb, mb_len, NULL, NULL); if (nc > 0) mb[nc++] = '\0'; return nc; } #endif /*[*/ /* * Our philosophy for automatic newlines and formfeeds is that we generate them * only if the user attempts to put data outside the MPP/MPL-defined area. * Therefore, the user can put a byte on the last column of each line, and on * the last column of the last line of the page, and not need to worry about * suppressing their own NL or FF. */ /* * Dump and reset the current line. * This will always result in at least one byte of output to the printer (a * newline). The 'line' variable is always incremented, and may end up * pointing past the bottom margin. The 'pp' variable is set to the left * margin. * * We do not observe the -skipcc option with SCS data. */ static int dump_scs_line(bool reset_pp, bool always_nl) { int i; bool any_data = false; /* Find the last non-space character in the line buffer. */ for (i = mpp; i >= 1; i--) { if (trnbuf[i].data_len != 0 || linebuf[i] != ' ') break; } /* * If there is data there, print it with a trailing newline and * clear out the line buffer for next time. If not, just print the * newline. */ if (i >= 1) { int j; int n_data = 0; int n_trn = 0; int k; for (j = 1; j <= i; j++) { /* * Dump and transparent data that precedes this * character. */ if (trnbuf[j].data_len) { unsigned k; n_trn += trnbuf[j].data_len; for (k = 0; k < trnbuf[j].data_len; k++) { if (stash(trnbuf[j].buf[k]) < 0) return -1; } trnbuf[j].data_len = 0; } if (j < i || linebuf[j] != ' ') { char mb[16]; int len; if (linebuf[j] == FCORDER_NOP) continue; n_data++; any_data = true; scs_any = true; #if !defined(_WIN32) /*[*/ len = unicode_to_multibyte(linebuf[j], mb, sizeof(mb)); #else /*][*/ len = unicode_to_printer(linebuf[j], mb, sizeof(mb)); #endif /*]*/ if (len == 0) { mb[0] = ' '; len = 1; } else len--; for (k = 0; k < len; k++) if (stash(mb[k]) < 0) return -1; } } #if defined(DEBUG_FF) /*[*/ trace_ds(" [dumping %d+%dt]", n_data, n_trn); #endif /*]*/ for (k = 0; k < MAX_MPP+1; k++) linebuf[k] = ' '; } if (any_data || always_nl) { if (options.crlf) { if (stash('\r') < 0) return -1; } if (stash('\n') < 0) return -1; line++; } #if defined(DEBUG_FF) /*[*/ trace_ds(" [line=%d]", line); #endif /*]*/ if (reset_pp) pp = lm; any_scs_output = false; return 0; } /* SCS formfeed. */ static int scs_formfeed(bool explicit) { int nls = 0; /* * In ffskip mode, if it's an explicit formfeed, and we haven't * printed any non-transparent data, do nothing. */ if (options.ffskip && explicit && !scs_any) return 0; /* * In ffthru mode, pass through a \f, but only if it's explicit. */ if (options.ffthru) { if (explicit) { if (stash('\f') < 0) return -1; scs_any = 0; } line = 1; return 0; } if (explicit) scs_any = 0; if (mpl > 1) { /* Skip to the end of the physical page. */ while (line <= mpl) { if (options.crlf) { if (stash('\r') < 0) return -1; } if (stash('\n') < 0) return -1; nls++; line++; } line = 1; /* Skip the top margin. */ while (line < tm) { if (options.crlf) { if (stash('\r') < 0) return -1; } if (stash('\n') < 0) return -1; nls++; line++; } #if defined(DEBUG_FF) /*[*/ if (nls) trace_ds(" [formfeed %s %d]", explicit? "explicit": "implicit", nls); #endif /*]*/ } else { line = 1; } return 0; } /* * Add a printable character to the SCS virtual 3287. * If the line position is past the bottom margin, we will skip to the top of * the next page. If the character position is past the MPP, we will skip to * the left margin of the next line. */ static int add_scs(ucs4_t c) { /* * They're about to print something. * If the line is past the bottom margin, we need to skip to the * MPL, and then past the top margin. */ if (line > bm) { if (scs_formfeed(false) < 0) return -1; } /* * If this character would overflow the line, then dump the current * line and start over at the left margin. */ if (pp > mpp) { if (dump_scs_line(true, true) < 0) return -1; } /* * Store this character in the line buffer and advance the print * position. */ if (c != ' ') linebuf[pp++] = c; else pp++; any_scs_output = true; ffeoj_last = false; return 0; } /* * Add a string of transparent data to the SCS virtual 3287. * Transparent data lives between the 'counted' 3287 characters. Really. */ static void add_scs_trn(unsigned char *cp, int cnt) { int i; unsigned new_malloc_len; for (i = 0; i < cnt; i++) { trace_ds(" %02x", cp[i]); } new_malloc_len = trnbuf[pp].data_len + cnt; while (trnbuf[pp].malloc_len < new_malloc_len) { trnbuf[pp].malloc_len += BUFSZ; trnbuf[pp].buf = Realloc(trnbuf[pp].buf, trnbuf[pp].malloc_len); } (void) memcpy(trnbuf[pp].buf + trnbuf[pp].data_len, cp, cnt); trnbuf[pp].data_len += cnt; any_scs_output = true; ffeoj_last = true; } /* * Process a bufferful of SCS data. * * Note that unlike a 3270 Write command, even though the record is bounded * by an EOR, the SCS data are not guaranteed to be complete. * * Rather than have a full FSM for every byte of every SCS order, we resort * to the rather inefficient method of concatenating the previous, incomplete * record with a copy of the new record, processing it as a contiguous * buffer, and saving any incomplete order for next time. */ /* * 'Internal' SCS function, called by process_scs() below with the previous * leftover data plus the current buffer. * * If an incomplete order is detected, saves it in scs_leftover_buf for * next time. */ static enum pds process_scs_contig(unsigned char *buf, size_t buflen) { register unsigned char *cp; int i; int cnt; int tab; ucs4_t uc; enum { NONE, DATA, ORDER } last = NONE; # define END_TEXT(s) { \ if (last == DATA) \ trace_ds("'"); \ trace_ds(" " s); \ last = ORDER; \ } # define LEFTOVER { \ trace_ds(" [pending]"); \ scs_leftover_len = buflen - (cp - buf); \ (void) memcpy(scs_leftover_buf, cp, scs_leftover_len); \ cp = buf + buflen; \ } trace_ds("< "); init_scs(); for (cp = &buf[0]; cp < (buf + buflen); cp++) { switch (*cp) { case SCS_BS: /* back space */ END_TEXT("BS"); if (pp != 1) pp--; if (scs_dbcs_subfield && pp != 1) pp--; break; case SCS_CR: /* carriage return */ END_TEXT("CR"); pp = lm; break; case SCS_ENP: /* enable presentation */ END_TEXT("ENP"); /* No-op. */ break; case SCS_FF: /* form feed */ END_TEXT("FF"); /* Dump any pending data, and go to the next line. */ if (dump_scs_line(true, false) < 0) return PDS_FAILED; /* * If there is a max page length, skip to the next * page. */ if (scs_formfeed(true) < 0) return PDS_FAILED; break; case SCS_HT: /* horizontal tab */ END_TEXT("HT"); for (i = pp + 1; i <= mpp; i++) { if (htabs[i]) break; } if (i <= mpp) pp = i; else { if (add_scs(' ') < 0) return PDS_FAILED; } break; case SCS_INP: /* inhibit presentation */ END_TEXT("INP"); /* No-op. */ break; case SCS_IRS: /* inter-record separator */ END_TEXT("IRS"); case SCS_NL: /* new line */ if (*cp == SCS_NL) END_TEXT("NL"); if (dump_scs_line(true, true) < 0) return PDS_FAILED; break; case SCS_VT: /* vertical tab */ END_TEXT("VT"); for (i = line+1; i <= MAX_MPL; i++){ if (vtabs[i]) break; } if (i <= MAX_MPL) { if (dump_scs_line(false, true) < 0) return PDS_FAILED; while (line < i) { if (options.crlf) { if (stash('\r') < 0) return PDS_FAILED; } if (stash('\n') < 0) return PDS_FAILED; line++; } break; } else { /* fall through... */ } case SCS_VCS: /* vertical channel select */ if (*cp == SCS_VCS) END_TEXT("VCS"); case SCS_LF: /* line feed */ if (*cp == SCS_LF) END_TEXT("LF"); if (dump_scs_line(false, true) < 0) return PDS_FAILED; break; case SCS_GE: /* graphic escape */ END_TEXT("GE"); if ((cp + 1) >= buf + buflen) { LEFTOVER; break; } /* Skip over the order. */ cp++; /* No support, so all characters are spaces. */ trace_ds(" %02x", *cp); if (add_scs(' ') < 0) return PDS_FAILED; break; case SCS_SA: /* set attribute */ END_TEXT("SA"); if ((cp + 2) >= buf + buflen) { LEFTOVER; break; } switch (*(cp + 1)) { case SCS_SA_RESET: trace_ds(" Reset(%02x)", *(cp + 2)); scs_dbcs_subfield = 0; scs_cs = 0; break; case SCS_SA_HIGHLIGHT: trace_ds(" Highlight(%02x)", *(cp + 2)); break; case SCS_SA_CS: trace_ds(" CharacterSet(%02x)", *(cp + 2)); if (scs_cs != *(cp + 2)) { if (scs_cs == 0xf8) { scs_dbcs_subfield = 0; } else if (*(cp + 2) == 0xf8) { scs_dbcs_subfield = 1; } scs_cs = *(cp + 2); } break; case SCS_SA_GRID: trace_ds(" Grid(%02x)", *(cp + 2)); break; default: trace_ds(" Unknown(%02x %02x)", *(cp + 1), *(cp + 2)); break; } /* Skip it. */ cp += 2; break; case SCS_TRN: /* transparent */ END_TEXT("TRN"); /* Make sure a length byte is present. */ if ((cp + 1) >= buf + buflen) { LEFTOVER; break; } /* Skip over the order. */ cp++; /* * Next byte is the length of the transparent data, * not including the length byte itself. */ cnt = *cp; if (cp + cnt - 1 >= buf + buflen) { cp--; LEFTOVER; break; } trace_ds("(%d)", cnt); /* Copy out the data literally. */ add_scs_trn(cp+1, cnt); cp += cnt; scs_dbcs_subfield = 0; break; case SCS_SET: /* set... */ /* Skip over the first byte of the order. */ if (cp + 2 >= buf + buflen || cp + *(cp + 2) - 1 >= buf + buflen) { END_TEXT("SET"); LEFTOVER; break; } switch (*++cp) { case SCS_SHF: /* set horizontal format */ END_TEXT("SHF"); /* Take defaults first. */ init_scs_horiz(); /* * The length is next. It includes the * length field itself. */ cnt = *++cp; trace_ds("(%d)", cnt); if (cnt < 2) break; /* no more data */ /* Skip over the length byte. */ if (!--cnt || cp + 1 >= buf + buflen) break; /* The MPP is next. */ mpp = *++cp; trace_ds(" mpp=%d", mpp); if (!mpp || mpp > MAX_MPP) mpp = MAX_MPP; /* Skip over the MPP. */ if (!--cnt || cp + 1 >= buf + buflen) break; /* The LM is next. */ lm = *++cp; trace_ds(" lm=%d", lm); if (lm < 1 || lm >= mpp) lm = 1; /* Skip over the LM. */ if (!--cnt || cp + 1 >= buf + buflen) break; /* Skip over the RM. */ cp++; trace_ds(" rm=%d", *cp); /* Next are the tab stops. */ while (--cnt && cp + 1 < buf + buflen) { tab = *++cp; trace_ds(" tab=%d", tab); if (tab >= 1 && tab <= mpp) htabs[tab] = 1; } break; case SCS_SLD: /* set line density */ END_TEXT("SLD"); /* * Skip over the second byte of the * order. */ cp++; /* * The length is next. It does not * include length field itself. */ if (cp >= buf + buflen) break; cnt = *cp; trace_ds("(%d)", cnt); if (cnt != 2) break; /* be gentle */ cnt--; trace_ds(" %02x", *(cp + 1)); cp += cnt; break; case SCS_SVF: /* set vertical format */ END_TEXT("SVF"); /* Take defaults first. */ init_scs_vert(); /* * Skip over the second byte of the * order. */ cp++; /* * The length is next. It includes the * length field itself. */ if (cp >= buf + buflen) break; cnt = *cp; trace_ds("(%d)", cnt); if (cnt < 2) break; /* no more data */ /* Skip over the length byte. */ cp++; cnt--; if (!cnt || cp >= buf + buflen) break; /* The MPL is next. */ mpl = *cp; trace_ds(" mpl=%d", mpl); if (!mpl || mpl > MAX_MPL) mpl = 1; if (cnt < 2) { bm = mpl; break; } /* Skip over the MPL. */ cp++; cnt--; if (!cnt || cp >= buf + buflen) break; /* The TM is next. */ tm = *cp; trace_ds(" tm=%d", tm); if (tm < 1 || tm >= mpl) tm = 1; if (cnt < 2) break; /* Skip over the TM. */ cp++; cnt--; if (!cnt || cp >= buf + buflen) break; /* The BM is next. */ bm = *cp; trace_ds(" bm=%d", bm); if (bm < tm || bm >= mpl) bm = mpl; if (cnt < 2) break; /* Skip over the BM. */ cp++; cnt--; /* Next are the tab stops. */ while (cnt > 1 && cp < buf + buflen) { tab = *cp; trace_ds(" tab=%d", tab); if (tab >= 1 && tab <= mpp) vtabs[tab] = 1; cp++; cnt--; } break; default: END_TEXT("SET(?"); trace_ds("%02x)", *cp); cp += *(cp + 1); break; } break; case SCS_SO: /* DBCS subfield start */ END_TEXT("SO"); scs_dbcs_subfield = 1; break; case SCS_SI: /* DBCS subfield end */ END_TEXT("SI"); scs_dbcs_subfield = 0; break; default: /* * Stray control codes are spaces, all else gets * translated from EBCDIC to ASCII. */ if (*cp <= 0x3f) { END_TEXT("?"); trace_ds("%02x", *cp); if (add_scs(' ') < 0) return PDS_FAILED; break; } if (last == NONE) trace_ds("'"); else if (last == ORDER) trace_ds(" '"); if (scs_dbcs_subfield && dbcs) { if (scs_dbcs_subfield % 2) { scs_dbcs_c1 = *cp; } else { uc = ebcdic_to_unicode( (scs_dbcs_c1 << 8) | *cp, CS_BASE, EUO_NONE); if (uc == 0) { /* No translation. */ trace_ds("?DBCS(X'%02x%02x')", scs_dbcs_c1, *cp); if (add_scs(' ') < 0) return PDS_FAILED; if (add_scs(' ') < 0) return PDS_FAILED; } else { /* * Add the Unicode character * and a no-op to account for * the right-hand side. */ trace_ds("DBCS(X'%02x%02x')", scs_dbcs_c1, *cp); if (add_scs(uc) < 0) return PDS_FAILED; if (add_scs(FCORDER_NOP) < 0) return PDS_FAILED; } } scs_dbcs_subfield++; last = DATA; break; } uc = ebcdic_to_unicode(*cp, CS_BASE, EUO_NONE); { char mb[16]; (void) unicode_to_multibyte(uc, mb, sizeof(mb)); trace_ds("%s", mb); } if (add_scs(uc) < 0) return PDS_FAILED; last = DATA; break; } } if (last == DATA) trace_ds("'"); trace_ds("\n"); if (prflush() < 0) return PDS_FAILED; return PDS_OKAY_NO_OUTPUT; } /* * 'External' SCS function. Handles leftover data from any previous, * incomplete SCS record. */ enum pds process_scs(unsigned char *buf, size_t buflen) { enum pds r; if (scs_leftover_len) { unsigned char *contig = Malloc(scs_leftover_len + buflen); size_t total_len; (void) memcpy(contig, scs_leftover_buf, scs_leftover_len); (void) memcpy(contig + scs_leftover_len, buf, buflen); total_len = scs_leftover_len + buflen; scs_leftover_len = 0; r = process_scs_contig(contig, total_len); Free(contig); } else { r = process_scs_contig(buf, buflen); } return r; } #if !defined(_WIN32) /*[*/ /* * SIGCHLD handler. Does nothing, but on systems that conform to the Single * Unix Specification, defining it ensures that the print command process will * become a zombie if it exits prematurely. */ static void sigchld_handler(int sig) { } /* * Special version of popen where the child ignores SIGINT. */ static FILE * popen_no_sigint(const char *command) { int fds[2]; FILE *f; /* Create a pipe. */ if (pipe(fds) < 0) { return NULL; } /* Create a stdio stream from the write end. */ f = fdopen(fds[1], "w"); if (f == NULL) { close(fds[0]); close(fds[1]); return NULL; } /* Handle SIGCHLD signals. */ (void) signal(SIGCHLD, sigchld_handler); /* Fork a child process. */ switch ((prpid = fork())) { case 0: /* child */ fclose(f); dup2(fds[0], 0); signal(SIGINT, SIG_IGN); execl("/bin/sh", "sh", "-c", command, NULL); /* execv failed, return nonzero status */ exit(1); break; case -1: /* parent, error */ fclose(f); close(fds[0]); return NULL; default: /* parent, success */ close(fds[0]); break; } return f; } static int pclose_no_sigint(FILE *f) { int rc; int status; fclose(f); do { rc = waitpid(prpid, &status, 0); } while (rc < 0 && errno == EINTR); prpid = -1; if (rc < 0) return rc; else return status; } #endif /*]*/ /* * Send a character to the printer. */ static int stash(unsigned char c) { #if defined(_WIN32) /*[*/ if (!ws_initted) { if (ws_start(options.printer) < 0) { return -1; } ws_initted = 1; } if (ws_needpre) { if ((options.trnpre != NULL) && copyfile(options.trnpre) < 0) return -1; ws_needpre = 0; } trace_pdc(c); if (ws_putc((char)c)) { return -1; } #else /*][*/ if (prfile == NULL) { prfile = popen_no_sigint(options.command); if (prfile == NULL) { errmsg("%s: %s", options.command, strerror(errno)); return -1; } if ((options.trnpre != NULL) && copyfile(options.trnpre) < 0) { (void) pclose_no_sigint(prfile); prfile = NULL; return -1; } } trace_pdc(c); if (fputc(c, prfile) == EOF) { errmsg("Write error to '%s': %s", options.command, strerror(errno)); (void) pclose_no_sigint(prfile); prfile = NULL; return -1; } #endif /*]*/ return 0; } /* * Flush the pipe going to the printer process, to try to flush out any * pending errors. */ static int prflush(void) { #if defined(_WIN32) /*[*/ if (ws_initted && ws_flush() < 0) return -1; #else /*][*/ if (prfile != NULL) { if (fflush(prfile) < 0) { errmsg("Flush error to '%s': %s", options.command, strerror(errno)); (void) pclose_no_sigint(prfile); prfile = NULL; return -1; } } #endif /*]*/ return 0; } /* * Change a character in the 3270 buffer. */ void ctlr_add(unsigned char ebc, ucs4_t c, unsigned char cs, unsigned char gr) { /* Map control characters, according to the write mode. */ if (c < ' ') { if (wcc_line_length) { /* * When formatted, all control characters but FFs and * the funky VISIBLE/INVISIBLE controls are translated * to NULLs, so they don't display, and don't * contribute to empty lines. */ if (c != FCORDER_FF && c != VISIBLE && c != INVISIBLE) c = '\0'; } else { /* * Unformatted, all control characters but CR/NL/FF/EM * are displayed as spaces. */ if (c != FCORDER_CR && c != FCORDER_NL && c != FCORDER_FF && c != FCORDER_EM) c = ' '; } } /* Add the character. */ page_buf[baddr] = c; if (ebc >= 0x40) xlate_len[baddr] = xtable_lookup(ebc, &xlate_buf[baddr]); baddr = (baddr + 1) % MAX_BUF; any_3270_output = 1; ffeoj_last = false; /* Implement -emflush mode. */ if (options.emflush && !wcc_line_length && c == FCORDER_EM) { /* XXX: Unfortunately, we do not return error status here. */ dump_unformatted(); baddr = 1; any_3270_output = 0; } } static struct { char buf; /* printable data */ unsigned char *trn; /* transparent data */ unsigned trn_len; /* length of transparent data */ } uo_data[MAX_UNF_MPP + 2]; /* room for full line plus carriage control */ static unsigned uo_col; /* current output column */ static unsigned uo_maxcol; /* maximum column buffered */ static bool uo_last_cr = false; /* last data was CR */ /* * Dump and free any transparent unformatted data at col. */ static int dump_uo_trn(unsigned col) { unsigned i; int rv = 0; if (uo_data[col].trn != NULL) { for (i = 0; i < uo_data[col].trn_len; i++) { if (stash(uo_data[col].trn[i]) < 0) { rv = -1; break; } } Free(uo_data[col].trn); uo_data[col].trn = NULL; uo_data[col].trn_len = 0; } return rv; } /* * Dump pending unformatted output. */ static int dump_uo(void) { unsigned i; for (i = 0; i < uo_maxcol; i++) { if (dump_uo_trn(i) < 0) { return -1; } if (!i && options.skipcc) { continue; } if (stash(uo_data[i].buf) < 0) { return -1; } } if (uo_maxcol < MAX_UNF_MPP + 2) { if (dump_uo_trn(uo_maxcol) < 0) { return -1; } } return 0; } /* * Unformatted output function. Processes one character of output data. * * This function will buffer up to MPP characters of output, until it is * passed a '\n' or '\f' character. * * By default, it will process '\r' characters like a printer, i.e., it will * not overwrite a buffered non-space character with a space character. This * is how an output line can span multiple 3270 unformatted write commands. * * If 'crthru' is set, '\r' characters simply trigger a buffer flush. */ static int uoutput(char c) { switch (c) { case '\r': if (options.crthru) { if (dump_uo() < 0) { return -1; } if (stash(c) < 0) { return -1; } uo_col = uo_maxcol = 0; uo_last_cr = true; } else { uo_col = 0; } break; case '\n': if (dump_uo() < 0) { return -1; } if (options.crlf && !uo_last_cr) { if (stash('\r') < 0) return -1; } if (stash(c) < 0) return -1; uo_col = uo_maxcol = 0; uo_last_cr = false; break; case '\f': uo_last_cr = false; if (any_3270_printable || !options.ffskip) { if (dump_uo() < 0) { return -1; } if (stash(c) < 0) return -1; } uo_col = uo_maxcol = 0; break; default: uo_last_cr = false; /* Don't overwrite with spaces. */ if (c == ' ') { if (uo_col >= uo_maxcol) uo_data[uo_col++].buf = c; else uo_col++; } else { uo_data[uo_col++].buf = c; any_3270_printable = true; } if (uo_col > uo_maxcol) uo_maxcol = uo_col; break; } return 0; } /* * Add transparent data to the unformatted output buffer. */ static void uoutput_trn(const unsigned char *s, int len) { unsigned char *new; if (len <= 0) { return; } new = Realloc(uo_data[uo_col].trn, uo_data[uo_col].trn_len + len); if (uo_data[uo_col].trn != NULL) { memcpy(new, uo_data[uo_col].trn, uo_data[uo_col].trn_len); } memcpy(new + uo_data[uo_col].trn_len, s, len); uo_data[uo_col].trn = new; uo_data[uo_col].trn_len += len; } /* * Dump an unformatted output buffer. * * The buffer is treated as a sequence of characters, with control characters * for new line, carriage return, form feed and end of media. * * By definition, the "print position" is 0 when this function begins and ends. */ static int dump_unformatted(void) { int i; int prcol = 0; ucs4_t c; int done = 0; char mb[16]; const char *mbp; int len; int j; if (!any_3270_output) return 0; for (i = 0; i < MAX_BUF && !done; i++) { switch (c = page_buf[i]) { case '\0': break; case FCORDER_NOP: break; case FCORDER_CR: if (uoutput('\r') < 0) return -1; prcol = 0; break; case FCORDER_NL: if (uoutput('\n') < 0) return -1; prcol = 0; break; case FCORDER_FF: if (uoutput('\f') < 0) return -1; prcol = 0; break; case FCORDER_EM: if (prcol != 0) if (uoutput('\n') < 0) return -1; done = 1; break; default: /* printable */ /* * Insert a newline if they send a 133rd printable * character on a line. * * If they specified '-skipcc', don't count the first * character on the line as printable. */ if (++prcol > options.mpp + (options.skipcc != 0)) { if (uoutput('\n') < 0) return -1; prcol = 0; } /* Handle transparent data. */ if (xlate_buf[i] != NULL) { uoutput_trn(xlate_buf[i], xlate_len[i]); break; } #if !defined(_WIN32) /*[*/ len = unicode_to_multibyte(c, mb, sizeof(mb)); #else /*][*/ len = unicode_to_printer(c, mb, sizeof(mb)); #endif /*]*/ if (len == 0) { mb[0] = ' '; len = 1; } else { len--; } mbp = mb; for (j = 0; j < len; j++) { if (uoutput(mbp[j]) < 0) return -1; } break; } } /* If the buffer didn't end with an EM, flush any pending line. */ if (!done) { if (uoutput('\n') < 0) return -1; } /* Clear out the buffer. */ (void) memset(page_buf, '\0', MAX_BUF * sizeof(ucs4_t)); (void) memset(xlate_buf, '\0', MAX_BUF * sizeof(unsigned char *)); (void) memset(xlate_len, '\0', MAX_BUF * sizeof(int)); /* Clear the output state. */ for (i = 0; i < MAX_UNF_MPP + 2; i++) { uo_data[i].buf = 0; if (uo_data[i].trn != NULL) { Free(uo_data[i].trn); } uo_data[i].trn = NULL; uo_data[i].trn_len = 0; } uo_col = 0; uo_maxcol = 0; uo_last_cr = false; /* Flush buffered data. */ #if defined(_WIN32) /*[*/ if (ws_initted) (void) ws_flush(); #else /*][*/ fflush(prfile); #endif /*]*/ any_3270_output = 0; return 0; } /* * Dump a formatted output buffer. * * The buffer is treated as a sequence of lines, with the length specified by * the write control character. * * Each line is terminated by a newline, with trailing spaces and nulls * suppressed. * Nulls are displayed as spaces, except when they constitute an entire line, * in which case the line is suppressed. * Formfeeds are passed through, and otherwise treated like nulls. * * We do not observe the -skipcc option with formatted data. */ static int dump_formatted(void) { int i; ucs4_t *cp = page_buf; int visible = 1; int newlines = 0; bool data_without_newline = false; if (!any_3270_output) return 0; for (i = 0; i < MAX_UNF_MPP; i++) { int blanks = 0; int any_data = 0; int j; for (j = 0; j < line_length && ((i * line_length) + j) < MAX_BUF; j++) { char c = *cp++; switch (c) { case VISIBLE: /* visible field */ visible = 1; blanks++; break; case INVISIBLE: /* invisible field */ visible = 0; blanks++; break; case '\f': while (newlines) { if (options.crlf) { if (stash('\r') < 0) return -1; } if (stash('\n') < 0) return -1; newlines--; data_without_newline = false; } if (any_3270_printable || !options.ffskip) if (stash('\f') < 0) return -1; blanks++; break; case '\0': blanks++; break; case ' ': blanks++; any_data++; data_without_newline = true; break; default: while (newlines) { if (options.crlf) { if (stash('\r') < 0) return -1; } if (stash('\n') < 0) return -1; newlines--; data_without_newline = false; } while (blanks) { if (stash(' ') < 0) return -1; blanks--; } any_data++; data_without_newline = true; if (!visible) { if (stash(' ') < 0) return -1; } else { char mb[16]; int len; int j; #if !defined(_WIN32) /*[*/ len = unicode_to_multibyte(c, mb, sizeof(mb)); #else /*][*/ len = unicode_to_printer(c, mb, sizeof(mb)); #endif /*]*/ if (len == 0) { mb[0] = ' '; len = 1; } else { len--; } for (j = 0; j < len; j++) { if (stash(mb[j]) < 0) return -1; } } if (visible) any_3270_printable = true; break; } } if (any_data || options.blanklines) newlines++; } /* If there was data on the last line, put out a newline. */ if (data_without_newline) { if (options.crlf) { if (stash('\r') < 0) return -1; } if (stash('\n') < 0) return -1; } /* Clear the buffer. */ (void) memset(page_buf, '\0', MAX_BUF * sizeof(ucs4_t)); #if defined(_WIN32) /*[*/ if (ws_initted) (void) ws_flush(); #else /*][*/ fflush(prfile); #endif /*]*/ any_3270_output = 0; return 0; } int print_eoj(void) { int rc = 0; /* Dump any pending 3270-mode output. */ if (any_3270_output) { if (wcc_line_length) { if (dump_formatted() < 0) rc = -1; } else { if (dump_unformatted() < 0) rc = -1; } } /* Dump any pending SCS-mode output. */ if (any_scs_output) { if (dump_scs_line(true, false) < 0) rc = -1; } /* Handle -ffeoj, which blindly adds a formfeed to every page. */ if (options.ffeoj && !ffeoj_last) { if (scs_any) { trace_ds("Automatic SCS EOJ formfeed.\n"); scs_formfeed(true); if (dump_scs_line(true, false) < 0) rc = -1; } else { trace_ds("Automatic 3270 %s EOJ formfeed.\n", wcc_line_length? "formatted": "unformatted"); ctlr_add(0, FCORDER_FF, default_cs, default_gr); if (wcc_line_length) { if (dump_formatted() < 0) rc = -1; } else { if (dump_unformatted() < 0) rc = -1; } } ffeoj_last = true; } /* Close the stream to the print process. */ #if defined(_WIN32) /*[*/ if (ws_initted) { trace_ds("End of print job.\n"); if (options.trnpost != NULL && copyfile(options.trnpost) < 0) rc = -1; if (ws_endjob() < 0) rc = -1; ws_needpre = 1; } #else /*]*/ if (prfile != NULL) { trace_ds("End of print job.\n"); if (options.trnpost != NULL && copyfile(options.trnpost) < 0) rc = -1; rc = pclose_no_sigint(prfile); if (rc) { if (rc < 0) errmsg("Close error on '%s': %s", options.command, strerror(errno)); else if (WIFEXITED(rc)) errmsg("'%s' exited with status %d", options.command, WEXITSTATUS(rc)); else if (WIFSIGNALED(rc)) errmsg("'%s' terminated by signal %d", options.command, WTERMSIG(rc)); else errmsg("'%s' returned status %d", options.command, rc); rc = -1; } prfile = NULL; } #endif /*]*/ /* Make sure the next 3270 job starts with clean conditions. */ page_buf_initted = 0; /* * Reset the FF suprpession logic. */ any_3270_printable = false; return rc; } void print_unbind(void) { /* * Make sure that the next SCS job starts with clean conditions. */ scs_initted = false; } static int ctlr_erase(void) { /* Dump whatever we've got so far. */ /* Dump any pending 3270-mode output. */ if (wcc_line_length) { if (dump_formatted() < 0) return -1; } else { if (dump_unformatted() < 0) return -1; } /* Dump any pending SCS-mode output. */ if (any_scs_output) { if (dump_scs_line(true, false) < 0) /* XXX: 1st true? */ return -1; } /* Make sure the buffer is clean. */ (void) memset(page_buf, '\0', MAX_BUF * sizeof(ucs4_t)); any_3270_output = 0; baddr = 0; return 0; } /* * Copy a -trnpre/-trnpost file to the printer. We open and read the file * for each print job, so someone can change their contents while we are * running (hopefully between print jobs). */ static int copyfile(const char *filename) { FILE *f; char c; int rc = 0; if ((f = fopen(filename, "rb")) == NULL) { errmsg("%s: %s", filename, strerror(errno)); return -1; } while ((c = fgetc(f)) != EOF) { trace_pdc((unsigned char)c); #if defined(_WIN32) /*[*/ if (ws_putc(c) < 0) { #else /*][*/ if (fputc(c, prfile) < 0) { errmsg("write(%s): %s", options.command, strerror(errno)); #endif /*]*/ rc = -1; break; } } fclose(f); return rc; } suite3270-3.6/Common/pr3287/ctlrc.h0000664000076500007650000000424513221577163014656 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ctlrc.h * Global declarations for ctlr.c. */ enum pds { PDS_OKAY_NO_OUTPUT = 0, /* command accepted, produced no output */ PDS_OKAY_OUTPUT = 1, /* command accepted, produced output */ PDS_BAD_CMD = -1, /* command rejected */ PDS_BAD_ADDR = -2, /* command contained a bad address */ PDS_FAILED = -3 /* command failed */ }; void ctlr_add(unsigned char ebc, ucs4_t c, unsigned char cs, unsigned char gr); void ctlr_write(unsigned char buf[], size_t buflen, bool erase); int print_eoj(void); void print_unbind(void); enum pds process_ds(unsigned char *buf, size_t buflen); enum pds process_scs(unsigned char *buf, size_t buflen); suite3270-3.6/Common/pr3287/globals.h0000664000076500007650000001161713221577163015173 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013, 2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Autoconf settings. */ #include "conf.h" /* autoconf settings */ #if defined(HAVE_VASPRINTF) && !defined(_GNU_SOURCE) /*[*/ #define _GNU_SOURCE /* vasprintf isn't POSIX */ #endif /*]*/ #include /* Unix standard I/O library */ #include /* Other Unix library functions */ #if !defined(_MSC_VER) /*[*/ # include /* Unix system calls */ #endif /*]*/ #include /* Character classes */ #include /* String manipulations */ #include /* Basic system data types */ #if !defined(_MSC_VER) /*[*/ # include /* System time-related data types */ #endif /*]*/ #include /* C library time functions */ #include /* Varargs */ #if !defined(_MSC_VER) /*[*/ # include /* bool, true, false */ #else /*][*/ typedef char bool; /* roll our own for MSC */ # define true 1 # define false 0 #endif /*]*/ #if defined(_WIN32) /*[*/ # include "wincmn.h" /* Common Windows definitions. */ #endif /*]*/ #include "localdefs.h" extern unsigned long cgcsgid; extern unsigned long cgcsgid_dbcs; extern int dbcs; #define Replace(var, value) { Free(var); var = (value); } typedef unsigned int ucs4_t; typedef unsigned short ebc_t; #define CS_MASK 0x03 /* mask for specific character sets */ #define CS_BASE 0x00 /* base character set (X'00') */ #define CS_APL 0x01 /* APL character set (X'01' or GE) */ #define CS_LINEDRAW 0x02 /* DEC line-drawing character set (ANSI) */ #define CS_DBCS 0x03 /* DBCS character set (X'F8') */ #define CS_GE 0x04 /* cs flag for Graphic Escape */ extern const char *app; extern const char *build; extern const char *cyear; /* * * Compiler-specific #defines. * */ /* '_is_unused' explicitly flags an unused parameter */ #if defined(__GNUC__) /*[*/ # define _is_unused __attribute__((__unused__)) # define printflike(s,f) __attribute__ ((__format__ (__printf__, s, f))) #else /*][*/ # define _is_unused /* nothing */ # define printflike(s, f) /* nothing */ #endif /*]*/ #if 'A' > 'a' /*[*/ # define EBCDIC_HOST 1 #endif /*]*/ /* Handy stuff. */ #define array_count(a) sizeof(a)/sizeof(a[0]) /* Doubly-linked lists. */ typedef struct llist { struct llist *next; struct llist *prev; } llist_t; /* Memory allocation. */ void *Malloc(size_t); void Free(void *); void *Calloc(size_t, size_t); void *Realloc(void *, size_t); char *NewString(const char *); /* Error exits. */ void Error(const char *); void Warning(const char *); /* I/O typedefs. */ #if !defined(_WIN32) /*[*/ typedef int iosrc_t; # define INVALID_IOSRC (-1) #else /*][*/ typedef HANDLE iosrc_t; # define INVALID_IOSRC INVALID_HANDLE_VALUE #endif /*]*/ typedef unsigned long ioid_t; #define NULL_IOID 0L typedef unsigned long ks_t; #define KS_NONE 0L /* Common socket definitions. */ #if !defined(_WIN32) /*[*/ typedef int socket_t; # define INVALID_SOCKET (-1) # define INET_ADDR_T in_addr_t # define SOCK_CLOSE(s) close(s) # define socket_errno() errno # define SE_EWOULDBLOCK EWOULDBLOCK # define SE_ECONNRESET ECONNRESET # define SE_EINTR EINTR # define SE_EPIPE EPIPE #else /*][*/ typedef SOCKET socket_t; # define INET_ADDR_T unsigned long # define SOCK_CLOSE(s) closesocket(s) # define socket_errno() WSAGetLastError() # define SE_EWOULDBLOCK WSAEWOULDBLOCK # define SE_ECONNRESET WSAECONNRESET # define SE_EINTR WSAEINTR # define SE_EPIPE WSAECONNABORTED #endif /*]*/ suite3270-3.6/Common/pr3287/localdefs.h0000664000076500007650000000351013221577163015475 0ustar pdmpdm/* * Copyright (c) 2000-2010, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * localdefs.h * Local definitions for pr3287. * * This file contains definitions for environment-specific * facilities, such as memory allocation, I/O registration, * and timers. */ #define PR3287 1 #if defined(_WIN32) /*[*/ # define WPR3287 1 #endif /*]*/ extern void errmsg(const char *, ...); suite3270-3.6/Common/pr3287/popupsc.h0000664000076500007650000000015513221577163015234 0ustar pdmpdmextern void popup_an_error(const char *fmt, ...); extern void popup_an_errno(int err, const char *fmt, ...); suite3270-3.6/Common/pr3287/pr3287.c0000664000076500007650000010064513221577163014510 0ustar pdmpdm/* * Copyright (c) 2000-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287: A 3270 printer emulator for TELNET sessions. * * pr3287 [options] [lu[,lu...]@]host[:port] * Options are: * -accepthostname any|[DNS:]name|address * accept any certificate hostname, or a specific name, or an * IP address * -assoc session * associate with a session (TN3270E only) * -cadir dir * -cafile file * -certfile file * -certfiletype type * -chainfile file * -clientcert name * -command "string" * command to use to print (default "lpr", POSIX only) * -charset name * use the specified character set * -crlf * expand newlines to CR/LF (POSIX only) * -crthru * pass through CRs in unformatted 3270 mode * -dameon * become a daemon after negotiating * -blanklines * display blank lines even if they're empty (formatted LU3) * -emflush * flush printer output when an unformatted EM order arrives * (historical option, now the default) * -noemflush * do not flush printer output when an unformatted EM order arrives * -eojtimeout n * time out end of job after n seconds * -ffeoj * assume an FF at the end of each job * -ffthru * pass through SCS FF orders * -ffskip * skip FF at top of page * -keyfile file * -keyfiletype type * -keypasswd type:text * -mpp n * set the maximum presentation position (unformatted line length) * -nocrlf * expand newlines to CR/LF (Windows only) * -noverifycert * do not verify host certificates for SSL or SSL/TLS connections * -printer "printer name" * printer to use (default is $PRINTER or system default, * Windows only) * -printercp n * Code page to use for output (Windows only) * -proxy "spec" * proxy specification * -reconnect * keep trying to reconnect * -selfsignedok * allow self-signed host certificates * -skipcc * skip ASA carriage control characters in host output * -syncport port * TCP port for login session synchronization * -trace * trace data stream to a file * -tracedir dir * directory to write trace file in (POSIX only) * -trnpre file * file of transparent data to send before jobs * -trnpost file * file of transparent data to send after jobs * -v * display version information and exit * -verifycert * verify host certificates for SSL or SSL/TLS connections * -V * verbose output about negotiation * -xtable file * custom EBCDIC-to-ASCII translation table */ #include #include #include #include #include #if !defined(_WIN32) /*[*/ # include # include #endif /*]*/ #include #if !defined(_MSC_VER) /*[*/ # include #endif /*]*/ #if !defined(_WIN32) /*[*/ # include # include # include #else /*][*/ # include # include # undef AF_INET6 #endif /*]*/ #include #include #include #include "globals.h" #include "charset.h" #include "trace.h" #include "ctlrc.h" #include "popups.h" #include "pr3287.h" #include "proxy.h" #include "pr_telnet.h" #include "resolver.h" #include "resources.h" #include "sio.h" #include "split_host.h" #include "telnet_core.h" #include "unicodec.h" #include "utf8.h" #include "utils.h" #include "xtablec.h" #if defined(_WIN32) /*[*/ # include "w3misc.h" # include "wsc.h" # include "windirs.h" #endif /*]*/ #if defined(_IOLBF) /*[*/ # define SETLINEBUF(s) setvbuf(s, NULL, _IOLBF, BUFSIZ) #else /*][*/ # define SETLINEBUF(s) setlinebuf(s) #endif /*]*/ #if !defined(INADDR_NONE) /*[*/ # define INADDR_NONE 0xffffffffL #endif /*]*/ /* Globals. */ options_t options; socket_t syncsock = INVALID_SOCKET; #if defined(_WIN32) /*[*/ char *instdir; #endif /* ]*/ /* Locals. */ static char *programname = NULL; static int proxy_type = 0; static char *proxy_host = NULL; static char *proxy_portname = NULL; static unsigned short proxy_port = 0; void pr3287_exit(int); const char *build_options(void); /* Print a usage message and exit. */ static void usage(void) { unsigned ssl_options = sio_all_options_supported(); (void) fprintf(stderr, "usage: %s [options] [lu[,lu...]@]host[:port]\nOptions:\n", programname); if (ssl_options & SSL_OPT_ACCEPT_HOSTNAME) { (void) fprintf(stderr, " " OptAcceptHostname " \n" " accept a specific name in host cert\n"); } (void) fprintf(stderr, " -assoc associate with a session (TN3270E only)\n"); if (ssl_options & SSL_OPT_CA_DIR) { (void) fprintf(stderr, " " OptCaDir " find CA certificate database in \n"); } if (ssl_options & SSL_OPT_CA_FILE) { (void) fprintf(stderr, " " OptCaFile " find CA certificates in \n"); } if (ssl_options & SSL_OPT_CERT_FILE) { (void) fprintf(stderr, " " OptCertFile " find client certificate in \n"); } if (ssl_options & SSL_OPT_CERT_FILE_TYPE) { (void) fprintf(stderr, " " OptCertFileType " pem|asn1\n" " specify client certificate file type\n"); } if (ssl_options & SSL_OPT_CHAIN_FILE) { (void) fprintf(stderr, " " OptChainFile " \n" " specify client certificate chain file\n"); } (void) fprintf(stderr, " " OptCharset " use built-in alternate EBCDIC-to-ASCII mappings\n"); if (ssl_options & SSL_OPT_CLIENT_CERT) { (void) fprintf(stderr, " " OptClientCert " use SSL/TLS client certificate \n"); } (void) fprintf(stderr, #if !defined(_WIN32) /*[*/ " -command \"\" use for printing (default \"lpr\")\n" #endif /*]*/ " -blanklines display blank lines even if empty (formatted LU3)\n" #if !defined(_WIN32) /*[*/ " -daemon become a daemon after connecting\n" #endif /*]*/ " -emflush flush printer output when an unformatted EM order arrives\n" " (historical option; this is now the default)\n" " -noemflush do not flush printer output when an unformatted EM order\n" " arrives\n" #if defined(_WIN32) /*[*/ " -nocrlf don't expand newlines to CR/LF\n" #else /*][*/ " -crlf expand newlines to CR/LF\n" #endif /*]*/ " -crthru pass through CRs in unformatted 3270 mode\n" " -eojtimeout \n" " time out end of print job\n" " -ffeoj assume FF at the end of each print job\n" " -ffthru pass through SCS FF orders\n" " -ffskip skip FF orders at top of page\n"); if (ssl_options & SSL_OPT_KEY_FILE) { (void) fprintf(stderr, " " OptKeyFile " find certificate private key in \n"); } if (ssl_options & SSL_OPT_KEY_FILE_TYPE) { (void) fprintf(stderr, " " OptKeyFileType " pem|asn1\n" " specify private key file type\n"); } if (ssl_options & SSL_OPT_KEY_PASSWD) { (void) fprintf(stderr, " " OptKeyPasswd " file:|string:\n" " specify private key password\n"); } (void) fprintf(stderr, " -ignoreeoj ignore PRINT-EOJ commands\n" " -mpp define the Maximum Presentation Position (unformatted\n" " line length)\n"); if (ssl_options & SSL_OPT_VERIFY_HOST_CERT) { (void) fprintf(stderr, " " OptNoVerifyHostCert " do not verify host certificate for SSL/TLS connections\n"); } (void) fprintf(stderr, #if defined(_WIN32) /*[*/ " -printer \"printer name\"\n" " use specific printer (default is $PRINTER or the system\n" " default printer)\n" " -printercp \n" " code page for output (default is system ANSI code page)\n" #endif /*]*/ " -proxy \"\"\n" " connect to host via specified proxy\n" " " OptReconnect " keep trying to reconnect\n"); (void) fprintf(stderr, " -skipcc skip ASA carriage control characters in unformatted host\n" " output\n" " -syncport port TCP port for login session synchronization\n" #if defined(_WIN32) /*[*/ " " OptTrace " trace data stream to /x3trc..txt\n" #else /*][*/ " " OptTrace " trace data stream to /tmp/x3trc.\n" #endif /*]*/ " -tracedir directory to keep trace information in\n" " -trnpre file of transparent data to send before each job\n" " -trnpost file of transparent data to send after each job\n" " -v display version information and exit\n"); if (ssl_options & SSL_OPT_VERIFY_HOST_CERT) { (void) fprintf(stderr, " " OptVerifyHostCert " verify host certificate for SSL/TLS connections (enabled by default)\n"); } (void) fprintf(stderr, " -V log verbose information about connection negotiation\n" " -xtable specify a custom EBCDIC-to-ASCII translation table\n"); pr3287_exit(1); } /* Print an error message. */ void verrmsg(const char *fmt, va_list ap) { static char buf[2][4096] = { "", "" }; static int ix = 0; ix = !ix; (void) vsprintf(buf[ix], fmt, ap); vtrace("Error: %s\n", buf[ix]); if (!strcmp(buf[ix], buf[!ix])) { if (options.verbose) (void) fprintf(stderr, "Suppressed error '%s'\n", buf[ix]); return; } #if !defined(_WIN32) /*[*/ if (options.bdaemon == AM_DAEMON) { /* XXX: Need to put something in the Application Event Log. */ syslog(LOG_ERR, "%s: %s", programname, buf[ix]); } else { #endif /*]*/ (void) fprintf(stderr, "%s: %s\n", programname, buf[ix]); #if !defined(_WIN32) /*[*/ } #endif /*]*/ } void errmsg(const char *fmt, ...) { va_list args; va_start(args, fmt); (void) verrmsg(fmt, args); va_end(args); } /* xs_warning() is an alias for errmsg() */ void xs_warning(const char *fmt, ...) { va_list args; char *b; va_start(args, fmt); b = xs_vbuffer(fmt, args); va_end(args); errmsg("%s", b); } /* Memory allocation. */ void * Malloc(size_t len) { void *p = malloc(len); if (p == NULL) { errmsg("Out of memory"); pr3287_exit(1); } return p; } void Free(void *p) { free(p); } void * Realloc(void *p, size_t len) { void *pn; pn = realloc(p, len); if (pn == NULL) { errmsg("Out of memory"); pr3287_exit(1); } return pn; } char * NewString(const char *s) { char *p; p = Malloc(strlen(s) + 1); return strcpy(p, s); } void Error(const char *msg) { errmsg(msg); pr3287_exit(1); } /* Signal handler for SIGTERM, SIGINT and SIGHUP. */ static void fatal_signal(int sig) { /* Flush any pending data and exit. */ vtrace("Fatal signal %d\n", sig); (void) print_eoj(); errmsg("Exiting on signal %d", sig); exit(0); } #if !defined(_WIN32) /*[*/ /* Signal handler for SIGUSR1. */ static void flush_signal(int sig) { /* Flush any pending data and exit. */ vtrace("Flush signal %d\n", sig); (void) print_eoj(); } #endif /*]*/ void pr3287_exit(int status) { #if defined(_WIN32) && defined(NEED_PAUSE) /*[*/ char buf[2]; if (status) { printf("\n[Press ] "); fflush(stdout); (void) fgets(buf, 2, stdin); } #endif /*]*/ /* Close the synchronization socket gracefully. */ if (syncsock != INVALID_SOCKET) { SOCK_CLOSE(syncsock); syncsock = INVALID_SOCKET; } exit(status); } static void init_options(void) { /* Clear them all out, just in case. */ memset(&options, '\0', sizeof(options)); /* Set individual defaults. */ options.assoc = NULL; #if !defined(_WIN32) /*[*/ options.bdaemon = NOT_DAEMON; #endif /*]*/ options.blanklines = 0; options.charset = "us"; #if !defined(_WIN32) /*[*/ options.command = "lpr"; #endif /*]*/ #if !defined(_WIN32) /*[*/ options.crlf = 0; #else /*][*/ options.crlf = 1; #endif /*]*/ options.crthru = 0; options.emflush = 1; options.eoj_timeout = 0L; options.ffeoj = 0; options.ffthru = 0; options.ffskip = 0; options.ignoreeoj = 0; #if defined(_WIN32) /*[*/ if ((options.printer = getenv("PRINTER")) == NULL) options.printer = ws_default_printer(); options.printercp = 0; #endif /*]*/ options.proxy_spec = NULL; options.reconnect = 0; options.skipcc = 0; options.mpp = DEFAULT_UNF_MPP; options.ssl.accept_hostname = NULL; options.ssl.ca_dir = NULL; options.ssl.ca_file = NULL; options.ssl.cert_file = NULL; options.ssl.cert_file_type = NULL; options.ssl.chain_file = NULL; options.ssl.key_file = NULL; options.ssl.key_file_type = NULL; options.ssl.key_passwd = NULL; options.ssl.client_cert = NULL; options.ssl_host = false; options.ssl.verify_host_cert = true; options.syncport = 0; #if !defined(_WIN32) /*[*/ options.tracedir = "/tmp"; #else /*][*/ options.tracedir = NULL; #endif /*]*/ options.tracing = 0; options.trnpre = NULL; options.trnpost = NULL; options.verbose = 0; } int main(int argc, char *argv[]) { int i; char *lu = NULL; char *host = NULL; char *port = "23"; char *accept = NULL; unsigned prefixes; char *error; char *xtable = NULL; unsigned short p; union { struct sockaddr sa; struct sockaddr_in sin; #if defined(AF_INET6) && defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sin6; #endif /*]*/ } ha; socklen_t ha_len = sizeof(ha); socket_t s = INVALID_SOCKET; int rc = 0; int report_success = 0; unsigned ssl_options = sio_all_options_supported(); /* Learn our name. */ #if defined(_WIN32) /*[*/ if ((programname = strrchr(argv[0], '\\')) != NULL) #else /*][*/ if ((programname = strrchr(argv[0], '/')) != NULL) #endif /*]*/ programname++; else programname = argv[0]; #if !defined(_WIN32) /*[*/ if (!programname[0]) programname = "wpr3287"; #endif /*]*/ #if defined(_WIN32) /*[*/ if (!get_dirs("wc3270", &instdir, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) exit(1); if (sockstart() < 0) exit(1); #endif /*]*/ /* Gather the options. */ init_options(); for (i = 1; i < argc && argv[i][0] == '-'; i++) { #if !defined(_WIN32) /*[*/ if (!strcmp(argv[i], "-daemon")) options.bdaemon = WILL_DAEMON; else #endif /*]*/ if ((ssl_options & SSL_OPT_ACCEPT_HOSTNAME) && !strcmp(argv[i], OptAcceptHostname)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptAcceptHostname "\n"); usage(); } options.ssl.accept_hostname = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-assoc")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -assoc\n"); usage(); } options.assoc = argv[i + 1]; i++; #if !defined(_WIN32) /*[*/ } else if (!strcmp(argv[i], "-command")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -command\n"); usage(); } options.command = argv[i + 1]; i++; #endif /*]*/ } else if ((ssl_options & SSL_OPT_CA_DIR) && !strcmp(argv[i], OptCaDir)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptCaDir "\n"); usage(); } options.ssl.ca_dir = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_CA_FILE) && !strcmp(argv[i], OptCaFile)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptCaFile "\n"); usage(); } options.ssl.ca_file = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_CERT_FILE) && !strcmp(argv[i], OptCertFile)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptCertFile "\n"); usage(); } options.ssl.cert_file = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_CERT_FILE_TYPE) && !strcmp(argv[i], OptCertFileType)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptCertFileType "\n"); usage(); } options.ssl.cert_file_type = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_CHAIN_FILE) && !strcmp(argv[i], OptChainFile)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptChainFile "\n"); usage(); } options.ssl.chain_file = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_KEY_FILE) && !strcmp(argv[i], OptKeyFile)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptKeyFile "\n"); usage(); } options.ssl.key_file = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_KEY_FILE_TYPE) && !strcmp(argv[i], OptKeyFileType)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptKeyFileType "\n"); usage(); } options.ssl.key_file_type = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_KEY_PASSWD) && !strcmp(argv[i], OptKeyPasswd)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptKeyPasswd "\n"); usage(); } options.ssl.key_passwd = argv[i + 1]; i++; } else if ((ssl_options & SSL_OPT_CLIENT_CERT) && !strcmp(argv[i], OptClientCert)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptClientCert "\n"); usage(); } options.ssl.client_cert = argv[i + 1]; i++; } else if (!strcmp(argv[i], OptCharset)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptCharset "\n"); usage(); } options.charset = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-blanklines")) { options.blanklines = 1; } else if (!strcmp(argv[i], "-emflush")) { options.emflush = 1; } else if (!strcmp(argv[i], "-noemflush")) { options.emflush = 0; #if defined(_WIN32) /*[*/ } else if (!strcmp(argv[i], "-nocrlf")) { options.crlf = 0; #else /*][*/ } else if (!strcmp(argv[i], "-crlf")) { options.crlf = 1; #endif /*]*/ } else if (!strcmp(argv[i], "-crthru")) { options.crthru = 1; } else if (!strcmp(argv[i], "-eojtimeout")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -eojtimeout\n"); usage(); } options.eoj_timeout = strtoul(argv[i + 1], NULL, 0); i++; } else if (!strcmp(argv[i], "-ignoreeoj")) { options.ignoreeoj = 1; } else if (!strcmp(argv[i], "-ffeoj")) { options.ffeoj = 1; } else if (!strcmp(argv[i], "-ffthru")) { options.ffthru = 1; } else if (!strcmp(argv[i], "-ffskip")) { options.ffskip = 1; #if defined(_WIN32) /*[*/ } else if (!strcmp(argv[i], "-printer")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -printer\n"); usage(); } options.printer = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-printercp")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -printercp\n"); usage(); } options.printercp = (int)strtoul(argv[i + 1], NULL, 0); i++; #endif /*]*/ } else if (!strcmp(argv[i], "-mpp")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -mpp\n"); usage(); } options.mpp = (int)strtoul(argv[i + 1], NULL, 0); if (options.mpp < MIN_UNF_MPP || options.mpp > MAX_UNF_MPP) { (void) fprintf(stderr, "Invalid for -mpp\n"); usage(); } i++; } else if ((ssl_options & SSL_OPT_VERIFY_HOST_CERT) && !strcmp(argv[i], OptNoVerifyHostCert)) { options.ssl.verify_host_cert = false; } else if (!strcmp(argv[i], OptReconnect)) { options.reconnect = 1; } else if (!strcmp(argv[i], "-v")) { printf("%s\n%s\n", build, build_options()); charset_list(); printf("\n\ Copyright 1989-%s, Paul Mattes, GTRC and others.\n\ See the source code or documentation for licensing details.\n\ Distributed WITHOUT ANY WARRANTY; without even the implied warranty of\n\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", cyear); exit(0); } else if ((ssl_options & SSL_OPT_VERIFY_HOST_CERT) && !strcmp(argv[i], OptVerifyHostCert)) { options.ssl.verify_host_cert = true; } else if (!strcmp(argv[i], "-V")) { options.verbose = 1; } else if (!strcmp(argv[i], "-syncport")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -syncport\n"); usage(); } options.syncport = (int)strtoul(argv[i + 1], NULL, 0); i++; } else if (!strcmp(argv[i], OptTrace)) { options.tracing = 1; } else if (!strcmp(argv[i], "-tracedir")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -tracedir\n"); usage(); } options.tracedir = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-trnpre")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -trnpre\n"); usage(); } options.trnpre = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-trnpost")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -trnpost\n"); usage(); } options.trnpost = argv[i + 1]; i++; } else if (!strcmp(argv[i], OptProxy)) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for " OptProxy "\n"); usage(); } options.proxy_spec = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-xtable")) { if (argc <= i + 1 || !argv[i + 1][0]) { (void) fprintf(stderr, "Missing value for -xtable\n"); usage(); } xtable = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-skipcc")) { options.skipcc = 1; } else if (!strcmp(argv[i], "--help")) { usage(); } else usage(); } if (argc != i + 1) usage(); /* * Pick apart the hostname, LUs and port. * We allow "L:" and "@" in either order. */ if (!new_split_host(argv[i], &lu, &host, &port, &accept, &prefixes, &error)) { (void) fprintf(stderr, "%s\n", error); pr3287_exit(1); } if (port == NULL) { port = "23"; } if (HOST_nFLAG(prefixes, SSL_HOST)) { options.ssl_host = true; } if (HOST_nFLAG(prefixes, NO_VERIFY_CERT_HOST)) { options.ssl.verify_host_cert = false; } if (accept != NULL) { options.ssl.accept_hostname = accept; } if (HOST_nFLAG(prefixes, NO_LOGIN_HOST) || HOST_nFLAG(prefixes, NON_TN3270E_HOST) || HOST_nFLAG(prefixes, PASSTHRU_HOST) || HOST_nFLAG(prefixes, STD_DS_HOST) || HOST_nFLAG(prefixes, BIND_LOCK_HOST)) { usage(); } if (options.ssl_host && !sio_supported()) { (void) fprintf(stderr, "Secure connections not supported.\n"); pr3287_exit(1); } #if defined(_WIN32) /*[*/ /* Set the printer code page. */ if (options.printercp == 0) options.printercp = GetACP(); #endif /*]*/ /* Set up the character set. */ if (charset_init(options.charset) != CS_OKAY) { pr3287_exit(1); } /* Set up the custom translation table. */ if (xtable != NULL && xtable_init(xtable) < 0) pr3287_exit(1); /* Try opening the trace file, if there is one. */ if (options.tracing) { char tracefile[4096]; time_t clk; int i; int u = 0; int fd; #if defined(_WIN32) /*[*/ size_t sl; #endif /*]*/ do { char dashu[32]; if (u) { snprintf(dashu, sizeof(dashu), "-%d", u); } else { dashu[0] = '\0'; } #if defined(_WIN32) /*[*/ if (options.tracedir == NULL) { options.tracedir = ""; } sl = strlen(options.tracedir); (void) snprintf(tracefile, sizeof(tracefile), "%s%sx3trc.%d%s.txt", options.tracedir, sl? ((options.tracedir[sl - 1] == '\\')? "": "\\"): "", getpid(), dashu); #else /*][*/ (void) snprintf(tracefile, sizeof(tracefile), "%s/x3trc.%u%s", options.tracedir, (unsigned)getpid(), dashu); #endif /*]*/ fd = open(tracefile, O_WRONLY | O_CREAT | O_EXCL, 0600); if (fd < 0) { if (errno != EEXIST) { perror(tracefile); pr3287_exit(1); } u++; } } while (fd < 0); tracef = fdopen(fd, "w"); if (tracef == NULL) { perror(tracefile); pr3287_exit(1); } (void) SETLINEBUF(tracef); clk = time((time_t *)0); vtrace_nts("Trace started %s", ctime(&clk)); vtrace_nts(" Version: %s\n %s\n", build, build_options()); #if !defined(_WIN32) /*[*/ vtrace_nts(" Locale codeset: %s\n", locale_codeset); #else /*][*/ vtrace_nts(" ANSI codepage: %d, printer codepage: %d\n", GetACP(), options.printercp); #endif /*]*/ vtrace_nts(" Host codepage: %d", (int)(cgcsgid & 0xffff)); if (dbcs) { vtrace_nts("+%d", (int)(cgcsgid_dbcs & 0xffff)); } vtrace_nts("\n"); vtrace_nts(" Command:"); for (i = 0; i < argc; i++) { vtrace_nts(" %s", argv[i]); } vtrace_nts("\n"); #if defined(_WIN32) /*[*/ vtrace_nts(" Instdir: %s\n", instdir? instdir: "(null)"); #endif /*]*/ /* Dump the translation table. */ if (xtable != NULL) { int ebc; unsigned char *x; vtrace_nts("Translation table:\n"); for (ebc = 0; ebc <= 0xff; ebc++) { int nx = xtable_lookup(ebc, &x); if (nx >= 0) { int j; vtrace_nts(" ebcdic X'%02X' ascii", ebc); for (j = 0; j < nx; j++) { vtrace_nts(" 0x%02x", (unsigned char)x[j]); } vtrace_nts("\n"); } } } } #if !defined(_WIN32) /*[*/ /* Become a daemon. */ if (options.bdaemon != NOT_DAEMON) { switch (fork()) { case -1: perror("fork"); exit(1); break; case 0: /* Child: Break away from the TTY. */ if (setsid() < 0) exit(1); options.bdaemon = AM_DAEMON; break; default: /* Parent: We're all done. */ exit(0); break; } } #endif /*]*/ /* Handle signals. */ (void) signal(SIGTERM, fatal_signal); (void) signal(SIGINT, fatal_signal); #if !defined(_WIN32) /*[*/ (void) signal(SIGHUP, fatal_signal); (void) signal(SIGUSR1, flush_signal); (void) signal(SIGPIPE, SIG_IGN); #endif /*]*/ /* Set up the proxy. */ if (options.proxy_spec != NULL) { proxy_type = proxy_setup(options.proxy_spec, &proxy_host, &proxy_portname); if (proxy_type < 0) pr3287_exit(1); } /* Set up the synchronization socket. */ if (options.syncport) { struct sockaddr_in sin; memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(options.syncport); syncsock = socket(PF_INET, SOCK_STREAM, 0); if (syncsock == INVALID_SOCKET) { popup_a_sockerr("socket(syncsock)"); pr3287_exit(1); } if (connect(syncsock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { popup_a_sockerr("connect(syncsock)"); pr3287_exit(1); } vtrace("Connected to sync port %d.\n", options.syncport); } /* * One-time initialization is now complete. * (Most) everything beyond this will now be retried, if the -reconnect * option is in effect. */ for (;;) { char *errtxt; /* Resolve the host name. */ if (proxy_type > 0) { unsigned long lport; char *ptr; struct servent *sp; if (resolve_host_and_port(proxy_host, proxy_portname, 0, &proxy_port, &ha.sa, &ha_len, &errtxt, NULL) < 0) { popup_an_error("%s", errtxt); rc = 1; goto retry; } lport = strtoul(port, &ptr, 0); if (ptr == port || *ptr != '\0' || lport == 0L || lport & ~0xffff) { if (!(sp = getservbyname(port, "tcp"))) { popup_an_error("Unknown port number " "or service: %s", port); rc = 1; goto retry; } p = ntohs(sp->s_port); } else p = (unsigned short)lport; } else { if (resolve_host_and_port(host, port, 0, &p, &ha.sa, &ha_len, &errtxt, NULL) < 0) { popup_an_error("%s", errtxt); rc = 1; goto retry; } } /* Connect to the host. */ s = socket(ha.sa.sa_family, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { popup_a_sockerr("socket"); pr3287_exit(1); } if (connect(s, &ha.sa, ha_len) < 0) { popup_a_sockerr("%s", (proxy_type > 0)? proxy_host: host); rc = 1; goto retry; } if (proxy_type > 0) { /* Connect to the host through the proxy. */ if (options.verbose) { (void) fprintf(stderr, "Connected to proxy " "server %s, port %u\n", proxy_host, proxy_port); } if (!proxy_negotiate(proxy_type, s, host, p)) { rc = 1; goto retry; } } /* Say hello. */ if (options.verbose) { (void) fprintf(stderr, "Connected to %s, port %u%s\n", host, p, options.ssl_host? " via SSL": ""); if (options.assoc != NULL) (void) fprintf(stderr, "Associating with LU " "%s\n", options.assoc); else if (lu != NULL) (void) fprintf(stderr, "Connecting to LU %s\n", lu); #if !defined(_WIN32) /*[*/ (void) fprintf(stderr, "Command: %s\n", options.command); #else /*][*/ (void) fprintf(stderr, "Printer: %s\n", options.printer? options.printer: "(none)"); #endif /*]*/ } vtrace("Connected to %s, port %u%s\n", host, p, options.ssl_host? " via SSL": ""); if (options.assoc != NULL) { vtrace("Associating with LU %s\n", options.assoc); } else if (lu != NULL) { vtrace("Connecting to LU %s\n", lu); } #if !defined(_WIN32) /*[*/ vtrace("Command: %s\n", options.command); #else /*][*/ vtrace("Printer: %s\n", options.printer? options.printer: "(none)"); #endif /*]*/ /* Negotiate. */ if (!pr_net_negotiate(host, &ha.sa, ha_len, s, lu, options.assoc)) { rc = 1; goto retry; } /* Report sudden success. */ if (report_success) { errmsg("Connected to %s, port %u", host, p); report_success = 0; } /* Process what we're told to process. */ if (!pr_net_process(s)) { rc = 1; if (options.verbose) (void) fprintf(stderr, "Disconnected (error).\n"); goto retry; } if (options.verbose) (void) fprintf(stderr, "Disconnected (eof).\n"); retry: /* Flush any pending data. */ (void) print_eoj(); /* Close the socket. */ if (s != INVALID_SOCKET) { net_disconnect(true); s = INVALID_SOCKET; } if (!options.reconnect) break; report_success = 1; /* Wait a while, to reduce thrash. */ if (rc) #if !defined(_WIN32) /*[*/ sleep(5); #else /*][*/ Sleep(5 * 1000000); #endif /*]*/ rc = 0; } pr3287_exit(rc); return rc; } /* Error pop-ups. */ void popup_an_error(const char *fmt, ...) { va_list args; va_start(args, fmt); (void) verrmsg(fmt, args); va_end(args); } void popup_an_errno(int err, const char *fmt, ...) { va_list args; va_start(args, fmt); if (err > 0) { char msgbuf[4096]; (void) vsprintf(msgbuf, fmt, args); errmsg("%s: %s", msgbuf, strerror(err)); } else { (void) verrmsg(fmt, args); } va_end(args); } #if defined(_MSC_VER) /*[*/ #define xstr(s) str(s) #define str(s) #s #endif /*]*/ const char * build_options(void) { const char *build = NULL; if (build == NULL) { build = xs_buffer("Build options:" #if defined(X3270_DBCS) /*[*/ " --enable-dbcs" #else /*][*/ " --disable-dbcs" #endif /*]*/ "%s" #if defined(_MSC_VER) /*[*/ " via MSVC " xstr(_MSC_VER) #endif /*]*/ #if defined(__GNUC__) /*[*/ " via gcc " __VERSION__ #endif /*]*/ #if defined(__LP64__) || defined(__LLP64__) /*[*/ " 64-bit" #else /*][*/ " 32-bit" #endif /*]*/ , using_iconv()? " -with-iconv": ""); } return build; } suite3270-3.6/Common/pr3287/pr3287_files.mk0000664000076500007650000000016213221577163016050 0ustar pdmpdm# Object files common to 3287 emulators PR3287_OBJECTS = charset.o ctlr.o pr3287.o sf.o telnet.o trace.o xtable.o suite3270-3.6/Common/pr3287/pr3287.h0000664000076500007650000000634213221577163014514 0ustar pdmpdm/* * Copyright (c) 2013-2014, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287: A 3270 printer emulator for TELNET sessions. * * Global declarations. */ /* Nested include for ssl_config_t. */ #include "ssl_config.h" /* Options. */ typedef struct { const char *assoc; /* TN3270 session to associate with (-assoc) */ #if !defined(_WIN32) /*[*/ enum { NOT_DAEMON, WILL_DAEMON, AM_DAEMON } bdaemon; /* daemon mode */ #endif /*]*/ int blanklines; /* -blanklines */ const char *charset; /* character set (-charset) */ #if !defined(_WIN32) /*[*/ const char *command; /* command to run for printing */ #endif /*]*/ int crlf; /* -crlf */ int crthru; /* -crtrhru */ int emflush; /* -emfush */ unsigned long eoj_timeout; /* -eojtimeout */ int ffeoj; /* -ffeoj */ int ffthru; /* -ffthru */ int ffskip; /* -ffskip */ int ignoreeoj; /* -ignoreeoj */ #if defined(_WIN32) /*[*/ const char *printer; /* printer to use (-printer) */ int printercp; /* -printercp */ #endif /*]*/ const char *proxy_spec; /* proxy specification */ int reconnect; /* -reconnect */ int skipcc; /* -skipcc */ int mpp; /* -mpp */ bool ssl_host; /* L: */ ssl_config_t ssl; /* SSL options */ int syncport; /* -syncport */ const char *tracedir; /* where we are tracing (-tracedir) */ int tracing; /* are we tracing? (-trace) */ const char *trnpre; /* -trnpre */ const char *trnpost; /* -trnpost */ int verbose; /* -V */ } options_t; extern options_t options; #if defined(_WIN32) /*[*/ extern char *instdir; extern char *common_appdata; #endif /*]*/ extern socket_t syncsock; extern void pr3287_exit(int exit_code); #define MIN_UNF_MPP 40 /* minimum value for unformatted MPP */ #define MAX_UNF_MPP 256 /* maximum value for unformatted MPP */ #define DEFAULT_UNF_MPP 132 /* default value for unformatted MPP */ suite3270-3.6/Common/pr3287/pr_telnet.h0000664000076500007650000000354213221577163015542 0ustar pdmpdm/* * Copyright (c) 1995-2013, 2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr_telnet.h * Global declarations for pr3287 telnet.c, beyond (or different * from) what is declared in telnet_core.h. */ extern bool pr_net_negotiate(const char *host, struct sockaddr *sa, socklen_t len, socket_t s, char *lu, const char *assoc); extern bool pr_net_process(socket_t s); extern void pr_ssl_base_init(void); suite3270-3.6/Common/pr3287_session.c0000664000076500007650000007225213221577163015310 0ustar pdmpdm/* * Copyright (c) 2000-2010, 2013-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287_session.c * 3287 printer session support */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include # include # include #endif /*]*/ #include #include #include #include #include "appres.h" #include "resources.h" #include "charset.h" #include "host.h" #include "lazya.h" #include "popups.h" #include "pr3287_session.h" #include "telnet_core.h" #include "sio.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #include "w3misc.h" #include "xio.h" #define PRINTER_BUF 1024 #if !defined(_WIN32) /*[*/ #define SOCK_CLOSE(s) close(s) #else /*][*/ #define SOCK_CLOSE(s) closesocket(s) #endif /*]*/ #define PRINTER_DELAY_MS 3000 #define PRINTER_KILL_MS 5000 /* Statics */ #if !defined(_WIN32) /*[*/ static int pr3287_pid = -1; #else /*][*/ static HANDLE pr3287_handle = NULL; #endif /*]*/ static enum { P_NONE, /* no printer session */ P_DELAY, /* delay before (re)starting pr3287 */ P_RUNNING, /* pr3287 process running */ P_SHUTDOWN, /* pr3287 graceful shutdown requested */ P_TERMINATING /* pr3287 forcible termination requested */ } pr3287_state = P_NONE; static socket_t pr3287_ls = INVALID_SOCKET; /* printer sync listening socket */ static ioid_t pr3287_ls_id = NULL_IOID; /* input ID */ #if defined(_WIN32) /*[*/ static HANDLE pr3287_ls_handle = NULL; #endif /*]*/ static socket_t pr3287_sync = INVALID_SOCKET; /* printer sync socket */ static ioid_t pr3287_sync_id = NULL_IOID; /* input ID */ #if defined(_WIN32) /*[*/ static HANDLE pr3287_sync_handle = NULL; #endif /*]*/ static ioid_t pr3287_kill_id = NULL_IOID; /* kill timeout ID */ static ioid_t pr3287_delay_id = NULL_IOID; /* delay timeout ID */ static char *pr3287_delay_lu = NULL; static bool pr3287_delay_associated = false; static struct pr3o { int fd; /* file descriptor */ ioid_t input_id; /* input ID */ ioid_t timeout_id; /* timeout ID */ int count; /* input count */ char buf[PRINTER_BUF]; /* input buffer */ } pr3287_stdout = { -1, 0L, 0L, 0 }, pr3287_stderr = { -1, 0L, 0L, 0 }; #if !defined(_WIN32) /*[*/ static void pr3287_output(iosrc_t fd, ioid_t id); static void pr3287_error(iosrc_t fd, ioid_t id); static void pr3287_otimeout(ioid_t id); static void pr3287_etimeout(ioid_t id); static void pr3287_dump(struct pr3o *p, bool is_err, bool is_dead); #endif /*]*/ static void pr3287_host_connect(bool connected _is_unused); static void pr3287_exiting(bool b _is_unused); static void pr3287_accept(iosrc_t fd, ioid_t id); static void pr3287_start_now(const char *lu, bool associated); /* Globals */ /** * Printer session module registration. */ void pr3287_session_register(void) { /* Register interest in host connects and mode changes. */ register_schange(ST_CONNECT, pr3287_host_connect); register_schange(ST_3270_MODE, pr3287_host_connect); register_schange(ST_EXITING, pr3287_exiting); } /* * If the printer process was terminated, but has not yet exited, wait for it * to exit. */ static void pr3287_reap_now(void) { #if !defined(_WIN32) /*[*/ int status; #else /*][*/ DWORD exit_code; #endif /*]*/ assert(pr3287_state == P_TERMINATING); vtrace("Waiting for old printer session to exit.\n"); #if !defined(_WIN32) /*[*/ if (waitpid(pr3287_pid, &status, 0) < 0) { popup_an_errno(errno, "Printer process waitpid() failed"); return; } --children; pr3287_pid = -1; #else /*][*/ if (WaitForSingleObject(pr3287_handle, 2000) == WAIT_TIMEOUT) { popup_an_error("Printer process failed to exit (Wait)"); return; } if (GetExitCodeProcess(pr3287_handle, &exit_code) == 0) { popup_an_error("GetExitCodeProcess() for printer session failed: %s", win32_strerror(GetLastError())); return; } if (exit_code == STILL_ACTIVE) { popup_an_error("Printer process failed to exit (Get)"); return; } CloseHandle(pr3287_handle); pr3287_handle = NULL; if (exit_code != 0) { popup_an_error("Printer process exited with status 0x%lx", (long)exit_code); } CloseHandle(pr3287_handle); pr3287_handle = NULL; #endif /*]*/ vtrace("Old printer session exited.\n"); pr3287_state = P_NONE; st_changed(ST_PRINTER, false); } /* Delayed start function. */ static void delayed_start(ioid_t id _is_unused) { assert(pr3287_state == P_DELAY); vtrace("Printer session start delay complete.\n"); /* Start the printer. */ pr3287_state = P_NONE; assert(pr3287_delay_lu != NULL); pr3287_start_now(pr3287_delay_lu, pr3287_delay_associated); /* Forget the saved state. */ pr3287_delay_id = NULL_IOID; Free(pr3287_delay_lu); pr3287_delay_lu = NULL; } /* * Printer session start-up function. * * If 'lu' is non-NULL, then use the specific-LU form. * If not, use the assoc form. * * This function may just store the parameters and let a timeout start the * process. It can also be invoked interactively, and might fail. */ void pr3287_session_start(const char *lu) { bool associated = false; /* Gotta be in 3270 mode. */ if (!IN_3270) { popup_an_error("Not in 3270 mode"); return; } /* Figure out the LU. */ if (lu == NULL) { /* Associate with the current session. */ associated = true; /* Gotta be in TN3270E mode. */ if (!IN_TN3270E) { popup_an_error("Not in TN3270E mode"); return; } /* Gotta be connected to an LU. */ if (connected_lu == NULL) { popup_an_error("Not connected to a specific LU"); return; } lu = connected_lu; } /* Can't start two. */ switch (pr3287_state) { case P_NONE: /* * Remember what was requested, and set a timeout to start the * new session. */ vtrace("Delaying printer session start %dms.\n", PRINTER_DELAY_MS); Replace(pr3287_delay_lu, NewString(lu)); pr3287_delay_associated = associated; pr3287_state = P_DELAY; pr3287_delay_id = AddTimeOut(PRINTER_DELAY_MS, delayed_start); break; case P_DELAY: case P_RUNNING: /* Redundant start request. */ popup_an_error("Printer is already started or running"); return; case P_SHUTDOWN: /* * Remember what was requested, and let the state change or * timeout functions start the new session. * * There is a window here where two manual start commands could * get in after a manual stop. This is needed because we can't * distinguish a manual from an automatic start. */ vtrace("Delaying printer session start %dms after exit.\n", PRINTER_DELAY_MS); Replace(pr3287_delay_lu, NewString(lu)); pr3287_delay_associated = associated; return; case P_TERMINATING: /* Collect the exit status now and start the new session. */ pr3287_reap_now(); pr3287_start_now(lu, associated); break; } } /* * Synchronous printer start-up function. * * Called when it is safe to start a pr3287 session. */ static void pr3287_start_now(const char *lu, bool associated) { const char *cmdlineName; const char *cmdline; #if !defined(_WIN32) /*[*/ const char *cmd; #else /*][*/ const char *printerName; #endif /*]*/ const char *s; char *cmd_text; char c; char *charset_cmd; /* -charset */ char *proxy_cmd = NULL; /* -proxy */ #if defined(_WIN32) /*[*/ char *pcp_res = NULL; char *printercp = NULL; /* -printercp */ char *cp_cmdline; STARTUPINFO si; PROCESS_INFORMATION pi; #else /*][*/ int stdout_pipe[2]; int stderr_pipe[2]; #endif /*]*/ char *pr3287_opts; bool success = true; struct sockaddr_in pr3287_lsa; socklen_t len; char *syncopt; varbuf_t r; assert(pr3287_state == P_NONE); /* Select the command line to use. */ if (associated) { cmdlineName = ResAssocCommand; } else { cmdlineName = ResLuCommandLine; } vtrace("Starting %s%s printer session.\n", lu, associated? " associated": ""); /* Create a listening socket for pr3287 to connect back to. */ pr3287_ls = socket(PF_INET, SOCK_STREAM, 0); if (pr3287_ls == INVALID_SOCKET) { popup_a_sockerr("socket(printer sync)"); return; } memset(&pr3287_lsa, '\0', sizeof(pr3287_lsa)); pr3287_lsa.sin_family = AF_INET; pr3287_lsa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if (bind(pr3287_ls, (struct sockaddr *)&pr3287_lsa, sizeof(pr3287_lsa)) < 0) { popup_a_sockerr("bind(printer sync)"); SOCK_CLOSE(pr3287_ls); return; } memset(&pr3287_lsa, '\0', sizeof(pr3287_lsa)); pr3287_lsa.sin_family = AF_INET; len = sizeof(pr3287_lsa); if (getsockname(pr3287_ls, (struct sockaddr *)&pr3287_lsa, &len) < 0) { popup_a_sockerr("getsockname(printer sync)"); SOCK_CLOSE(pr3287_ls); return; } syncopt = lazyaf("%s %d", OptSyncPort, ntohs(pr3287_lsa.sin_port)); if (listen(pr3287_ls, 5) < 0) { popup_a_sockerr("listen(printer sync)"); SOCK_CLOSE(pr3287_ls); return; } #if defined(_WIN32) /*[*/ pr3287_ls_handle = CreateEvent(NULL, FALSE, FALSE, NULL); if (pr3287_ls_handle == NULL) { popup_an_error("CreateEvent: %s", win32_strerror(GetLastError())); SOCK_CLOSE(pr3287_ls); pr3287_ls = INVALID_SOCKET; return; } if (WSAEventSelect(pr3287_ls, pr3287_ls_handle, FD_ACCEPT) != 0) { popup_an_error("WSAEventSelect: %s", win32_strerror(GetLastError())); SOCK_CLOSE(pr3287_ls); pr3287_ls = INVALID_SOCKET; return; } pr3287_ls_id = AddInput(pr3287_ls_handle, pr3287_accept); #else /*][*/ pr3287_ls_id = AddInput(pr3287_ls, pr3287_accept); #endif /*]*/ /* Fetch the command line and command resources. */ cmdline = get_resource(cmdlineName); if (cmdline == NULL) { popup_an_error("%s resource not defined", cmdlineName); SOCK_CLOSE(pr3287_ls); return; } #if !defined(_WIN32) /*[*/ cmd = get_resource(ResPrinterCommand); if (cmd == NULL) { popup_an_error(ResPrinterCommand " resource not defined"); SOCK_CLOSE(pr3287_ls); return; } #else /*][*/ printerName = get_resource(ResPrinterName); #endif /*]*/ /* Construct the charset option. */ charset_cmd = lazyaf("-charset %s", get_charset_name()); /* Construct proxy option. */ if (appres.proxy != NULL) { #if !defined(_WIN32) /*[*/ proxy_cmd = lazyaf("-proxy \"%s\"", appres.proxy); #else /*][ */ proxy_cmd = lazyaf("-proxy %s", appres.proxy); #endif /*]*/ } #if defined(_WIN32) /*[*/ /* Get the codepage for the printer. */ pcp_res = get_resource(ResPrinterCodepage); if (pcp_res) { printercp = lazyaf("-printercp %s", pcp_res); } #endif /*]*/ /* Get printer options. */ pr3287_opts = appres.interactive.printer_opts; if (pr3287_opts == NULL) { pr3287_opts = get_resource(ResPrinterOptions); } /* Construct the command line. */ /* Substitute. */ vb_init(&r); for (s = cmdline; (c = *s) != '\0'; s++) { if (c == '%') { if (!strncmp(s+1, "L%", 2)) { vb_appends(&r, lu); s += 2; continue; } else if (!strncmp(s+1, "H%", 2)) { vb_appends(&r, qualified_host); s += 2; continue; #if !defined(_WIN32) /*[*/ } else if (!strncmp(s+1, "C%", 2)) { vb_appends(&r, cmd); s += 2; continue; #endif /*]*/ } else if (!strncmp(s+1, "R%", 2)) { vb_appends(&r, charset_cmd); s += 2; continue; } else if (!strncmp(s+1, "P%", 2)) { if (proxy_cmd != NULL) { vb_appends(&r, proxy_cmd); } s += 2; continue; #if defined(_WIN32) /*[*/ } else if (!strncmp(s+1, "I%", 2)) { if (printercp != NULL) { vb_appends(&r, printercp); } s += 2; continue; #endif /*]*/ } else if (!strncmp(s+1, "O%", 2)) { if (pr3287_opts != NULL) { vb_appends(&r, pr3287_opts); } s += 2; continue; } else if (!strncmp(s+1, "V%", 2)) { unsigned ssl_opts = sio_all_options_supported(); if ((ssl_opts & SSL_OPT_VERIFY_HOST_CERT) && !appres.ssl.verify_host_cert) { vb_appends(&r, " " OptNoVerifyHostCert); } if ((ssl_opts & SSL_OPT_CA_DIR) && appres.ssl.ca_dir) { vb_appendf(&r, " %s \"%s\"", OptCaDir, appres.ssl.ca_dir); } if ((ssl_opts & SSL_OPT_CA_FILE) && appres.ssl.ca_file) { vb_appendf(&r, " %s \"%s\"", OptCaFile, appres.ssl.ca_file); } if ((ssl_opts & SSL_OPT_CERT_FILE) && appres.ssl.cert_file) { vb_appendf(&r, " %s \"%s\"", OptCertFile, appres.ssl.cert_file); } if ((ssl_opts & SSL_OPT_CERT_FILE_TYPE) && appres.ssl.cert_file_type) { vb_appendf(&r, " %s %s", OptCertFileType, appres.ssl.cert_file_type); } if ((ssl_opts & SSL_OPT_CHAIN_FILE) && appres.ssl.chain_file) { vb_appendf(&r, " %s \"%s\"", OptChainFile, appres.ssl.chain_file); } if ((ssl_opts & SSL_OPT_KEY_FILE) && appres.ssl.key_file) { vb_appendf(&r, " %s \"%s\"", OptKeyFile, appres.ssl.key_file); } if ((ssl_opts & SSL_OPT_KEY_PASSWD) && appres.ssl.key_passwd) { vb_appendf(&r, " %s \"%s\"", OptKeyPasswd, appres.ssl.key_passwd); } if ((ssl_opts & SSL_OPT_CLIENT_CERT) && appres.ssl.client_cert) { vb_appendf(&r, " %s %s", OptClientCert, appres.ssl.client_cert); } if ((ssl_opts & SSL_OPT_ACCEPT_HOSTNAME) && appres.ssl.accept_hostname) { vb_appendf(&r, " %s \"%s\"", OptAcceptHostname, appres.ssl.accept_hostname); } s += 2; continue; } else if (!strncmp(s+1, "S%", 2)) { vb_appends(&r, syncopt); s += 2; continue; } } vb_append(&r, &c, 1); } cmd_text = vb_consume(&r); #if !defined(_WIN32) /*[*/ vtrace("Printer command: %s\n", cmd_text); /* Make pipes for printer's stdout and stderr. */ if (pipe(stdout_pipe) < 0) { popup_an_errno(errno, "pipe() failed"); Free(cmd_text); SOCK_CLOSE(pr3287_ls); return; } (void) fcntl(stdout_pipe[0], F_SETFD, 1); if (pipe(stderr_pipe) < 0) { popup_an_errno(errno, "pipe() failed"); (void) close(stdout_pipe[0]); (void) close(stdout_pipe[1]); Free(cmd_text); SOCK_CLOSE(pr3287_ls); return; } (void) fcntl(stderr_pipe[0], F_SETFD, 1); /* Fork and exec the printer session. */ switch (pr3287_pid = fork()) { case 0: /* child process */ (void) dup2(stdout_pipe[1], 1); (void) close(stdout_pipe[1]); (void) dup2(stderr_pipe[1], 2); (void) close(stderr_pipe[1]); if (setsid() < 0) { perror("setsid"); _exit(1); } (void) execlp("/bin/sh", "sh", "-c", cmd_text, NULL); (void) perror("exec(printer)"); _exit(1); default: /* parent process */ (void) close(stdout_pipe[1]); pr3287_stdout.fd = stdout_pipe[0]; (void) close(stderr_pipe[1]); pr3287_stderr.fd = stderr_pipe[0]; pr3287_stdout.input_id = AddInput(pr3287_stdout.fd, pr3287_output); pr3287_stderr.input_id = AddInput(pr3287_stderr.fd, pr3287_error); ++children; break; case -1: /* error */ popup_an_errno(errno, "fork()"); (void) close(stdout_pipe[0]); (void) close(stdout_pipe[1]); (void) close(stderr_pipe[0]); (void) close(stderr_pipe[1]); success = false; break; } #else /*][*/ /* Pass the command via the environment. */ if (printerName != NULL) { putenv(lazyaf("PRINTER=%s", printerName)); } /* Create the wpr3287 process. */ if (!strncasecmp(cmd_text, "wpr3287.exe", 11)) { cp_cmdline = lazyaf("%s%s", instdir, cmd_text); } else { cp_cmdline = cmd_text; } vtrace("Printer command: %s\n", cp_cmdline); if (printerName != NULL) { vtrace("Printer (via %%PRINTER%%): %s\n", printerName); } memset(&si, '\0', sizeof(si)); si.cb = sizeof(pi); memset(&pi, '\0', sizeof(pi)); if (!CreateProcess(NULL, cp_cmdline, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi)) { popup_an_error("CreateProcess() for printer session failed: %s", win32_strerror(GetLastError())); success = false; } else { pr3287_handle = pi.hProcess; CloseHandle(pi.hThread); } #endif /*]*/ Free(cmd_text); /* Tell everyone else. */ if (success) { pr3287_state = P_RUNNING; st_changed(ST_PRINTER, true); } } #if !defined(_WIN32) /*[*/ /* There's data from the printer session. */ static void pr3287_data(struct pr3o *p, bool is_err) { int space; int nr; static char exitmsg[] = "Printer session exited"; /* Read whatever there is. */ space = PRINTER_BUF - p->count - 1; nr = read(p->fd, p->buf + p->count, space); /* Handle read errors and end-of-file. */ if (nr < 0) { popup_an_errno(errno, "Printer session pipe input failed"); pr3287_session_stop(); return; } if (nr == 0) { vtrace("Printer session %s EOF.\n", is_err? "stderr": "stdout"); if (pr3287_stderr.timeout_id != NULL_IOID) { /* * Append a termination error message to whatever the * printer process said, and pop it up. */ p = &pr3287_stderr; space = PRINTER_BUF - p->count - 1; if (p->count && *(p->buf + p->count - 1) != '\n') { *(p->buf + p->count) = '\n'; p->count++; space--; } (void) strncpy(p->buf + p->count, exitmsg, space); p->count += strlen(exitmsg); if (p->count >= PRINTER_BUF) { p->count = PRINTER_BUF - 1; } pr3287_dump(p, true, true); } else { popup_an_error("%s", exitmsg); } /* Now that we've gotten EOF, make sure we stop the process. */ pr3287_session_stop(); return; } /* Add it to the buffer, and add a NULL. */ p->count += nr; p->buf[p->count] = '\0'; /* * If there's no more room in the buffer, dump it now. Otherwise, * give it a second to generate more output. */ if (p->count >= PRINTER_BUF - 1) { pr3287_dump(p, is_err, false); } else if (p->timeout_id == NULL_IOID) { p->timeout_id = AddTimeOut(1000, is_err? pr3287_etimeout: pr3287_otimeout); } } /* The printer process has some output for us. */ static void pr3287_output(iosrc_t fd _is_unused, ioid_t id _is_unused) { pr3287_data(&pr3287_stdout, false); } /* The printer process has some error output for us. */ static void pr3287_error(iosrc_t fd _is_unused, ioid_t id _is_unused) { pr3287_data(&pr3287_stderr, true); } /* Timeout from printer output or error output. */ static void pr3287_timeout(struct pr3o *p, bool is_err) { /* Forget the timeout ID. */ p->timeout_id = NULL_IOID; /* Dump the output. */ pr3287_dump(p, is_err, false); } /* Timeout from printer output. */ static void pr3287_otimeout(ioid_t id _is_unused) { pr3287_timeout(&pr3287_stdout, false); } /* Timeout from printer error output. */ static void pr3287_etimeout(ioid_t id _is_unused) { pr3287_timeout(&pr3287_stderr, true); } /* Dump pending printer process output. */ static void pr3287_dump(struct pr3o *p, bool is_err, bool is_dead) { if (p->count) { /* * Strip any trailing newline, and make sure the buffer is * NULL terminated. */ if (p->buf[p->count - 1] == '\n') { p->buf[--(p->count)] = '\0'; } else if (p->buf[p->count]) { p->buf[p->count] = '\0'; } /* Dump it and clear the buffer. */ popup_printer_output(is_err, is_dead? NULL: pr3287_session_stop, "%s", p->buf); p->count = 0; } } #endif /*]*/ /* Shut off printer sync input. */ static void pr3287_stop_sync(void) { assert(pr3287_sync_id != NULL_IOID); RemoveInput(pr3287_sync_id); pr3287_sync_id = NULL_IOID; #if defined(_WIN32) /*[*/ assert(pr3287_sync_handle != NULL); CloseHandle(pr3287_sync_handle); pr3287_sync_handle = NULL; #endif /*]*/ SOCK_CLOSE(pr3287_sync); pr3287_sync = INVALID_SOCKET; } /* Input from pr3287 on the synchronization socket. */ static void pr3287_sync_input(iosrc_t fd _is_unused, ioid_t id _is_unused) { vtrace("Input or EOF on printer sync socket.\n"); assert(pr3287_state >= P_RUNNING); /* * We don't do anything at this point, besides clean up the state * associated with the sync socket. * * The pr3287 session is considered gone when (1) it closes the sync * socket and (2) it exits. The only change in behavior when the sync * socket is closed is that when we want to stop pr3287, we just start * the timeout to force-terminate it, instead of closing the sync * socket first and letting it clean itself up. */ /* No more need for the sync socket. */ pr3287_stop_sync(); } /* Shut off the printer sync listening socket. */ static void pr3287_stop_listening(void) { assert(pr3287_ls_id != NULL_IOID); assert(pr3287_ls != INVALID_SOCKET); #if defined(_WIN32) /*[*/ assert(pr3287_ls_handle != NULL); #endif /*]*/ RemoveInput(pr3287_ls_id); pr3287_ls_id = NULL_IOID; #if defined(_WIN32) /*[*/ CloseHandle(pr3287_ls_handle); pr3287_ls_handle = NULL; #endif /*]*/ SOCK_CLOSE(pr3287_ls); pr3287_ls = INVALID_SOCKET; } /* Accept a synchronization connection from pr3287. */ static void pr3287_accept(iosrc_t fd _is_unused, ioid_t id) { struct sockaddr_in sin; socklen_t len = sizeof(sin); /* Accept the connection. */ assert(pr3287_state == P_RUNNING); pr3287_sync = accept(pr3287_ls, (struct sockaddr *)&sin, &len); if (pr3287_sync == INVALID_SOCKET) { popup_a_sockerr("accept(printer sync)"); } else { vtrace("Accepted sync connection from printer.\n"); #if defined(_WIN32) /*[*/ pr3287_sync_handle = CreateEvent(NULL, FALSE, FALSE, NULL); if (pr3287_sync_handle == NULL) { popup_an_error("CreateEvent failed"); x3270_exit(1); } if (WSAEventSelect(pr3287_sync, pr3287_sync_handle, FD_READ | FD_CLOSE) != 0) { popup_an_error("Can't set socket handle events\n"); x3270_exit(1); } pr3287_sync_id = AddInput(pr3287_sync_handle, pr3287_sync_input); #else /*][*/ pr3287_sync_id = AddInput(pr3287_sync, pr3287_sync_input); #endif /*]*/ } /* No more need for the listening socket. */ pr3287_stop_listening(); } /* Clean up all connections to pr3287. */ static void pr3287_cleanup_io(void) { /* Remove inputs. */ if (pr3287_stdout.input_id) { RemoveInput(pr3287_stdout.input_id); pr3287_stdout.input_id = NULL_IOID; } if (pr3287_stderr.input_id) { RemoveInput(pr3287_stderr.input_id); pr3287_stderr.input_id = NULL_IOID; } /* Cancel timeouts. */ if (pr3287_stdout.timeout_id != NULL_IOID) { RemoveTimeOut(pr3287_stdout.timeout_id); pr3287_stdout.timeout_id = NULL_IOID; } if (pr3287_stderr.timeout_id != NULL_IOID) { RemoveTimeOut(pr3287_stderr.timeout_id); pr3287_stderr.timeout_id = NULL_IOID; } /* Clear buffers. */ pr3287_stdout.count = 0; pr3287_stderr.count = 0; /* * If we have a sync socket connection, shut it down to signal pr3287 * to exit gracefully. */ if (pr3287_sync != INVALID_SOCKET) { vtrace("Stopping printer by shutting down sync socket.\n"); assert(pr3287_ls == INVALID_SOCKET); /* The separate shutdown() call is likely redundant. */ #if !defined(_WIN32) /*[*/ shutdown(pr3287_sync, SHUT_WR); #else /*][*/ shutdown(pr3287_sync, SD_SEND); #endif /*]*/ /* We no longer care about printer sync input. */ pr3287_stop_sync(); } else if (pr3287_ls_id != NULL_IOID) { /* Stop listening for sync connections. */ pr3287_stop_listening(); } } /* * Check for an exited printer session. * * On Unix, this function is supplied with a process ID and status for an * exited child process. If there is a printer process running and its process * ID matches, process the rest of the state change. * * On Windows, this function is responsible for collecting the status of an * exited printer process, if any. */ void pr3287_session_check( #if !defined(_WIN32) /*[*/ pid_t pid, int status #else /*][*/ void #endif /*]*/ ) { #if defined(_WIN32) /*[*/ DWORD exit_code; #endif /*]*/ if (pr3287_state == P_NONE) { return; } #if !defined(_WIN32) /*[*/ if (pid != pr3287_pid) { return; } /* * If we didn't stop it on purpose, decode and display the printer's * exit status. */ if (pr3287_state == P_RUNNING) { if (WIFEXITED(status)) { popup_an_error("Printer process exited with status %d", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { popup_an_error("Printer process killed by signal %d", WTERMSIG(status)); } else { popup_an_error("Printer process stopped by unknown status %d", status); } } pr3287_pid = -1; #else /*][*/ if (pr3287_handle != NULL && GetExitCodeProcess(pr3287_handle, &exit_code) != 0 && exit_code != STILL_ACTIVE) { CloseHandle(pr3287_handle); pr3287_handle = NULL; if (pr3287_state == P_RUNNING) { popup_an_error("Printer process exited with status 0x%lx", (long)exit_code); } } else { /* It is still running. */ return; } #endif /*]*/ vtrace("Printer session exited.\n"); /* Stop any pending printer kill request. */ if (pr3287_state == P_SHUTDOWN) { assert(pr3287_kill_id != NULL_IOID); RemoveTimeOut(pr3287_kill_id); pr3287_kill_id = NULL_IOID; pr3287_state = P_NONE; } /* No need for sync input any more. */ if (pr3287_sync_id != NULL_IOID) { pr3287_stop_sync(); } /* * Clean up I/O. * It would be better to wait for EOF first so we can display errors from * pr3287, but for now, we just need to get the state straight. */ pr3287_cleanup_io(); pr3287_state = P_NONE; /* Propagate the state. */ st_changed(ST_PRINTER, false); /* * If there is a pending request to start the printer, set a timeout to * start it. */ if (pr3287_delay_lu != NULL) { pr3287_state = P_DELAY; pr3287_delay_id = AddTimeOut(PRINTER_DELAY_MS, delayed_start); } } /* Terminate pr3287, with prejudice. */ static void pr3287_kill(ioid_t id _is_unused) { vtrace("Forcibly terminating printer session.\n"); /* Kill the process. */ #if defined(_WIN32) /*[*/ assert(pr3287_handle != NULL); TerminateProcess(pr3287_handle, 0); #else /*][*/ assert(pr3287_pid != -1); (void) kill(-pr3287_pid, SIGTERM); #endif /*]*/ pr3287_kill_id = NULL_IOID; pr3287_state = P_TERMINATING; } /* Close the printer session. */ void pr3287_session_stop() { switch (pr3287_state) { case P_DELAY: vtrace("Canceling delayed printer session start.\n"); assert(pr3287_delay_id != NULL_IOID); RemoveTimeOut(pr3287_delay_id); pr3287_delay_id = NULL_IOID; assert(pr3287_delay_lu != NULL); Free(pr3287_delay_lu); pr3287_delay_lu = NULL; break; case P_RUNNING: /* Run through the logic below. */ break; default: /* Nothing interesting to do. */ return; } vtrace("Stopping printer session.\n"); pr3287_cleanup_io(); /* Set a timeout to terminate it not so gracefully. */ pr3287_state = P_SHUTDOWN; pr3287_kill_id = AddTimeOut(PRINTER_KILL_MS, pr3287_kill); } /* The emulator is exiting. Make sure the printer session is cleaned up. */ static void pr3287_exiting(bool b _is_unused) { if (pr3287_state >= P_RUNNING && pr3287_state < P_TERMINATING) { pr3287_kill(NULL_IOID); } } /* Host connect/disconnect/3270-mode event. */ static void pr3287_host_connect(bool connected _is_unused) { if (IN_3270) { char *pr3287_lu = appres.interactive.printer_lu; if (pr3287_lu != NULL && !pr3287_session_running()) { if (!strcmp(pr3287_lu, ".")) { if (IN_TN3270E) { /* Associate with TN3270E session. */ pr3287_session_start(NULL); } } else { /* Specific LU. */ pr3287_session_start(pr3287_lu); } } else if (!IN_E && pr3287_lu != NULL && !strcmp(pr3287_lu, ".") && pr3287_session_running()) { /* Stop an automatic associated printer. */ pr3287_session_stop(); } } else if (pr3287_session_running()) { /* * We're no longer in 3270 mode, then we can no longer have a * printer session. This may cause some fireworks if there is * a print job pending when we do this, so some sort of awful * timeout may be needed. */ pr3287_session_stop(); } else { /* * Forget state associated with printer start-up. */ if (pr3287_state == P_DELAY) { pr3287_state = P_NONE; } if (pr3287_delay_id != NULL_IOID) { RemoveTimeOut(pr3287_delay_id); pr3287_delay_id = NULL_IOID; } if (pr3287_delay_lu != NULL) { Free(pr3287_delay_lu); pr3287_delay_lu = NULL; } } } bool pr3287_session_running(void) { return (pr3287_state == P_RUNNING); } suite3270-3.6/Common/pr3287_session_stubs.c0000664000076500007650000000333113221577163016520 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287_session_stubs.c * Stubs for pr3287 printer sessions. */ #include "globals.h" #include "pr3287_session.h" void pr3287_session_start(const char *lu _is_unused) { } void pr3287_session_stop(void) { } suite3270-3.6/Common/pr3287/sf.c0000664000076500007650000004026013221577163014147 0ustar pdmpdm/* * Copyright (c) 1994-2009, 2013-2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sf.c * This module handles 3270 structured fields. * */ #include #include #include #include "globals.h" #include "3270ds.h" #include #include "ctlrc.h" #if !defined(PR3287) /*[*/ # include "ft_dft.h" #endif /*]*/ #include "sf.h" #if defined(_WIN32) /*[*/ # include "ws2tcpip.h" #else /*][*/ # include #endif /*]*/ #include "telnet_core.h" #include "trace.h" /* Statics */ static bool qr_in_progress = false; static enum pds sf_read_part(unsigned char buf[], unsigned buflen); static enum pds sf_erase_reset(unsigned char buf[], int buflen); static enum pds sf_set_reply_mode(unsigned char buf[], int buflen); static enum pds sf_outbound_ds(unsigned char buf[], int buflen); static void query_reply_start(void); static void do_query_reply(unsigned char code); static void query_reply_end(void); /* Some permanent substitutions. */ #define maxROWS 72 #define maxCOLS 66 #define char_width 10 #define char_height 20 #define standard_font 0 static unsigned char supported_replies[] = { QR_SUMMARY, /* 0x80 */ QR_USABLE_AREA, /* 0x81 */ QR_ALPHA_PART, /* 0x84 */ QR_CHARSETS, /* 0x85 */ QR_COLOR, /* 0x86 */ QR_HIGHLIGHTING, /* 0x87 */ QR_REPLY_MODES, /* 0x88 */ QR_DBCS_ASIA, /* 0x91 */ QR_IMP_PART, /* 0xa6 */ QR_DDM, /* 0x95 */ }; #define NSR (sizeof(supported_replies)/sizeof(unsigned char)) /* * Process a 3270 Write Structured Field command */ enum pds write_structured_field(unsigned char buf[], size_t buflen) { size_t fieldlen; unsigned char *cp = buf; bool first = true; enum pds rv = PDS_OKAY_NO_OUTPUT; enum pds rv_this = PDS_OKAY_NO_OUTPUT; bool bad_cmd = false; /* Skip the WSF command itself. */ cp++; buflen--; /* Interpret fields. */ while (buflen > 0) { if (first) trace_ds(" "); else trace_ds("< WriteStructuredField "); first = false; /* Pick out the field length. */ if (buflen < 2) { trace_ds("error: single byte at end of message\n"); return rv ? rv : PDS_BAD_CMD; } fieldlen = (cp[0] << 8) + cp[1]; if (fieldlen == 0) fieldlen = buflen; if (fieldlen < 3) { trace_ds("error: field length %d too small\n", (int)fieldlen); return rv ? rv : PDS_BAD_CMD; } if (fieldlen > buflen) { trace_ds("error: field length %d exceeds remaining " "message length %d\n", (int)fieldlen, (int)buflen); return rv ? rv : PDS_BAD_CMD; } /* Dispatch on the ID. */ switch (cp[2]) { case SF_READ_PART: trace_ds("ReadPartition"); rv_this = sf_read_part(cp, (int)fieldlen); break; case SF_ERASE_RESET: trace_ds("EraseReset"); rv_this = sf_erase_reset(cp, (int)fieldlen); break; case SF_SET_REPLY_MODE: trace_ds("SetReplyMode"); rv_this = sf_set_reply_mode(cp, (int)fieldlen); break; case SF_OUTBOUND_DS: trace_ds("OutboundDS"); rv_this = sf_outbound_ds(cp, (int)fieldlen); break; #if !defined(PR3287) /*[*/ case SF_TRANSFER_DATA: /* File transfer data */ trace_ds("FileTransferData"); ft_dft_data(cp, (int)fieldlen); break; #endif /*]*/ default: trace_ds("unsupported ID 0x%02x\n", cp[2]); rv_this = PDS_BAD_CMD; break; } /* * Accumulate errors or output flags. * One real ugliness here is that if we have already * generated some output, then we have already positively * acknowledged the request, so if we fail here, we have no * way to return the error indication. */ if (rv_this < 0) bad_cmd = true; else rv |= rv_this; /* Skip to the next field. */ cp += fieldlen; buflen -= fieldlen; } if (first) trace_ds(" (null)\n"); if (bad_cmd && !rv) return PDS_BAD_CMD; else return rv; } static enum pds sf_read_part(unsigned char buf[], unsigned buflen) { unsigned char partition; unsigned i; int any = 0; const char *comma = ""; if (buflen < 5) { trace_ds(" error: field length %d too small\n", buflen); return PDS_BAD_CMD; } partition = buf[3]; trace_ds("(0x%02x)", partition); switch (buf[4]) { case SF_RP_QUERY: trace_ds(" Query"); if (partition != 0xff) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); query_reply_start(); for (i = 0; i < NSR; i++) { if (dbcs || supported_replies[i] != QR_DBCS_ASIA) { do_query_reply(supported_replies[i]); } } query_reply_end(); break; case SF_RP_QLIST: trace_ds(" QueryList "); if (partition != 0xff) { trace_ds("error: illegal partition\n"); return PDS_BAD_CMD; } if (buflen < 6) { trace_ds("error: missing request type\n"); return PDS_BAD_CMD; } query_reply_start(); switch (buf[5]) { case SF_RPQ_LIST: trace_ds("List("); if (buflen < 7) { trace_ds(")\n"); do_query_reply(QR_NULL); } else { for (i = 6; i < buflen; i++) { trace_ds("%s%s", comma, see_qcode(buf[i])); comma = ","; } trace_ds(")\n"); for (i = 0; i < NSR; i++) { if (memchr((char *)&buf[6], (char)supported_replies[i], buflen-6) && (dbcs || supported_replies[i] != QR_DBCS_ASIA)) { do_query_reply(supported_replies[i]); any++; } } if (!any) { do_query_reply(QR_NULL); } } break; case SF_RPQ_EQUIV: trace_ds("Equivlent+List("); for (i = 6; i < buflen; i++) { trace_ds("%s%s", comma, see_qcode(buf[i])); comma = ","; } trace_ds(")\n"); for (i = 0; i < NSR; i++) { if (dbcs || supported_replies[i] != QR_DBCS_ASIA) { do_query_reply(supported_replies[i]); } } break; case SF_RPQ_ALL: trace_ds("All\n"); for (i = 0; i < NSR; i++) { if (dbcs || supported_replies[i] != QR_DBCS_ASIA) { do_query_reply(supported_replies[i]); } } break; default: trace_ds("unknown request type 0x%02x\n", buf[5]); return PDS_BAD_CMD; } query_reply_end(); break; case SNA_CMD_RMA: trace_ds(" ReadModifiedAll"); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); return PDS_BAD_CMD; break; case SNA_CMD_RB: trace_ds(" ReadBuffer"); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); return PDS_BAD_CMD; break; case SNA_CMD_RM: trace_ds(" ReadModified"); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); return PDS_BAD_CMD; break; default: trace_ds(" unknown type 0x%02x\n", buf[4]); return PDS_BAD_CMD; } return PDS_OKAY_OUTPUT; } static enum pds sf_erase_reset(unsigned char buf[], int buflen) { if (buflen != 4) { trace_ds(" error: wrong field length %d\n", buflen); return PDS_BAD_CMD; } switch (buf[3]) { case SF_ER_DEFAULT: trace_ds(" Default\n"); break; case SF_ER_ALT: trace_ds(" Alternate\n"); break; default: trace_ds(" unknown type 0x%02x\n", buf[3]); return PDS_BAD_CMD; } return PDS_OKAY_NO_OUTPUT; } static enum pds sf_set_reply_mode(unsigned char buf[], int buflen) { unsigned char partition; if (buflen < 5) { trace_ds(" error: wrong field length %d\n", buflen); return PDS_BAD_CMD; } partition = buf[3]; trace_ds("(0x%02x)", partition); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } switch (buf[4]) { case SF_SRM_FIELD: trace_ds(" Field\n"); break; case SF_SRM_XFIELD: trace_ds(" ExtendedField\n"); break; case SF_SRM_CHAR: trace_ds(" Character"); break; default: trace_ds(" unknown mode 0x%02x\n", buf[4]); return PDS_BAD_CMD; } return PDS_OKAY_NO_OUTPUT; } static enum pds sf_outbound_ds(unsigned char buf[], int buflen) { if (buflen < 5) { trace_ds(" error: field length %d too short\n", buflen); return PDS_BAD_CMD; } trace_ds("(0x%02x)", buf[3]); if (buf[3] != 0x00) { trace_ds(" error: illegal partition 0x%0x\n", buf[3]); return PDS_BAD_CMD; } switch (buf[4]) { case SNA_CMD_W: trace_ds(" Write"); if (buflen > 5) ctlr_write(&buf[4], buflen-4, false); else trace_ds("\n"); break; case SNA_CMD_EW: trace_ds(" EraseWrite"); if (buflen > 5) ctlr_write(&buf[4], buflen-4, true); else trace_ds("\n"); break; case SNA_CMD_EWA: trace_ds(" EraseWriteAlternate"); if (buflen > 5) ctlr_write(&buf[4], buflen-4, true); else trace_ds("\n"); break; case SNA_CMD_EAU: trace_ds(" EraseAllUnprotected\n"); break; default: trace_ds(" unknown type 0x%02x\n", buf[4]); return PDS_BAD_CMD; } return PDS_OKAY_NO_OUTPUT; } static void query_reply_start(void) { obptr = obuf; space3270out(1); *obptr++ = AID_SF; qr_in_progress = true; } static void do_query_reply(unsigned char code) { size_t len; unsigned i; const char *comma = ""; size_t obptr0 = obptr - obuf; unsigned char *obptr_len; unsigned short num, denom; if (qr_in_progress) { trace_ds("> StructuredField\n"); qr_in_progress = false; } space3270out(4); obptr += 2; /* skip length for now */ *obptr++ = SFID_QREPLY; *obptr++ = code; switch (code) { case QR_CHARSETS: trace_ds("> QueryReply(CharacterSets)\n"); space3270out(64); if (dbcs) *obptr++ = 0x8e; /* flags: GE, CGCSGID, DBCS */ else *obptr++ = 0x82; /* flags: GE, CGCSGID present */ *obptr++ = 0x00; /* more flags */ *obptr++ = char_width; /* SDW */ *obptr++ = char_height; /* SDW */ *obptr++ = 0x00; /* no load PS */ *obptr++ = 0x00; *obptr++ = 0x00; *obptr++ = 0x00; if (dbcs) *obptr++ = 0x0b; /* DL (11 bytes) */ else *obptr++ = 0x07; /* DL (7 bytes) */ *obptr++ = 0x00; /* SET 0: */ if (dbcs) *obptr++ = 0x00; /* FLAGS: non-load, single- plane, single-bute */ else *obptr++ = 0x10; /* FLAGS: non-loadable, single-plane, single-byte, no compare */ *obptr++ = 0x00; /* LCID 0 */ if (dbcs) { *obptr++ = 0x00; /* SW 0 */ *obptr++ = 0x00; /* SH 0 */ *obptr++ = 0x00; /* SUBSN */ *obptr++ = 0x00; /* SUBSN */ } SET32(obptr, cgcsgid); /* CGCSGID */ if (!standard_font) { /* special 3270 font, includes APL */ *obptr++ = 0x01;/* SET 1: */ *obptr++ = 0x10;/* FLAGS: non-loadable, single-plane, single-byte, no compare */ *obptr++ = 0xf1;/* LCID */ if (dbcs) { *obptr++ = 0x00;/* SW 0 */ *obptr++ = 0x00;/* SH 0 */ *obptr++ = 0x00;/* SUBSN */ *obptr++ = 0x00;/* SUBSN */ } *obptr++ = 0x03;/* CGCSGID: 3179-style APL2 */ *obptr++ = 0xc3; *obptr++ = 0x01; *obptr++ = 0x36; } if (dbcs) { *obptr++ = 0x80; /* SET 0x80: */ *obptr++ = 0x20; /* FLAGS: DBCS */ *obptr++ = 0xf8; /* LCID: 0xf8 */ *obptr++ = char_width * 2; /* SW */ *obptr++ = char_height; /* SH */ *obptr++ = 0x41; /* SUBSN */ *obptr++ = 0x7f; /* SUBSN */ SET32(obptr, cgcsgid_dbcs); /* CGCSGID */ } break; case QR_IMP_PART: trace_ds("> QueryReply(ImplicitPartition)\n"); space3270out(13); *obptr++ = 0x0; /* reserved */ *obptr++ = 0x0; *obptr++ = 0x0b; /* length of display size */ *obptr++ = 0x01; /* "implicit partition size" */ *obptr++ = 0x00; /* reserved */ SET16(obptr, 72); /* implicit partition width */ SET16(obptr, 66); /* implicit partition height */ SET16(obptr, maxCOLS); /* alternate height */ SET16(obptr, maxROWS); /* alternate width */ break; case QR_NULL: trace_ds("> QueryReply(Null)\n"); break; case QR_SUMMARY: trace_ds("> QueryReply(Summary("); space3270out(NSR); for (i = 0; i < NSR; i++) { if (dbcs || supported_replies[i] != QR_DBCS_ASIA) { trace_ds("%s%s", comma, see_qcode(supported_replies[i])); comma = ","; *obptr++ = supported_replies[i]; } } trace_ds("))\n"); break; case QR_USABLE_AREA: trace_ds("> QueryReply(UsableArea)\n"); space3270out(19); *obptr++ = 0x01; /* 12/14-bit addressing */ *obptr++ = 0x00; /* no special character features */ SET16(obptr, maxCOLS); /* usable width */ SET16(obptr, maxROWS); /* usable height */ *obptr++ = 0x01; /* units (mm) */ num = /*display_widthMM()*/ 8*5/4; denom = /*display_width()*/ 7 * 72; while (!(num %2) && !(denom % 2)) { num /= 2; denom /= 2; } SET16(obptr, (int)num); /* Xr numerator */ SET16(obptr, (int)denom); /* Xr denominator */ num = /*display_heightMM()*/ 11*5/4; denom = /*display_height()*/ 9*66; while (!(num %2) && !(denom % 2)) { num /= 2; denom /= 2; } SET16(obptr, (int)num); /* Yr numerator */ SET16(obptr, (int)denom); /* Yr denominator */ *obptr++ = char_width; /* AW */ *obptr++ = char_height; /* AH */ SET16(obptr, 0); /* buffer */ break; case QR_COLOR: trace_ds("> QueryReply(Color)\n"); space3270out(4 + 2*15); *obptr++ = 0x00; /* no options */ *obptr++ = 16; /* report on 16 colors */ *obptr++ = 0x00; /* default color: */ *obptr++ = 0xf0 + HOST_COLOR_GREEN; /* green */ for (i = 0xf1; i <= 0xff; i++) { *obptr++ = i; *obptr++ = i; } break; case QR_HIGHLIGHTING: trace_ds("> QueryReply(Highlighting)\n"); space3270out(11); *obptr++ = 5; /* report on 5 pairs */ *obptr++ = XAH_DEFAULT; /* default: */ *obptr++ = XAH_NORMAL; /* normal */ *obptr++ = XAH_BLINK; /* blink: */ *obptr++ = XAH_BLINK; /* blink */ *obptr++ = XAH_REVERSE; /* reverse: */ *obptr++ = XAH_REVERSE; /* reverse */ *obptr++ = XAH_UNDERSCORE; /* underscore: */ *obptr++ = XAH_UNDERSCORE; /* underscore */ *obptr++ = XAH_INTENSIFY; /* intensify: */ *obptr++ = XAH_INTENSIFY; /* intensify */ break; case QR_REPLY_MODES: trace_ds("> QueryReply(ReplyModes)\n"); space3270out(3); *obptr++ = SF_SRM_FIELD; *obptr++ = SF_SRM_XFIELD; *obptr++ = SF_SRM_CHAR; break; case QR_DBCS_ASIA: /* XXX: Should we support this, even when not in DBCS mode? */ trace_ds("> QueryReply(DbcsAsia)\n"); space3270out(7); *obptr++ = 0x00; /* flags (none) */ *obptr++ = 0x03; /* field length 3 */ *obptr++ = 0x01; /* SI/SO supported */ *obptr++ = 0x80; /* character set ID 0x80 */ *obptr++ = 0x03; /* field length 3 */ *obptr++ = 0x02; /* input control */ *obptr++ = 0x01; /* creation supported */ break; case QR_ALPHA_PART: trace_ds("> QueryReply(AlphanumericPartitions)\n"); space3270out(4); *obptr++ = 0; /* 1 partition */ SET16(obptr, maxROWS*maxCOLS); /* buffer space */ *obptr++ = 0; /* no special features */ break; case QR_DDM: trace_ds("> QueryReply(DistributedDataManagement)\n"); space3270out(8); SET16(obptr,0); /* set reserved field to 0 */ SET16(obptr,2048); /* set inbound length limit */ SET16(obptr,2048); /* set outbound length limit */ SET16(obptr,0x0101); /* NSS=01, DDMSS=01 */ break; default: return; /* internal error */ } obptr_len = obuf + obptr0; len = (obptr - obuf) - obptr0; SET16(obptr_len, len); } static void query_reply_end(void) { net_output(); } suite3270-3.6/Common/pr3287/telnet.c0000775000076500007650000013005613221577163015040 0ustar pdmpdm/* * Copyright (c) 1993-2015, 2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * telnet.c * This module initializes and manages a telnet socket to * the given IBM host. */ #include "globals.h" #if defined(_WIN32) /*[*/ # include # include #undef AF_INET6 #else /*][*/ # include # include # include # include # include #endif /*]*/ #define TELCMDS 1 #define TELOPTS 1 #include "arpa_telnet.h" #include #include #if !defined(_WIN32) /*[*/ # include #endif /*]*/ #include #if !defined(_MSC_VER) /*[*/ # include #endif /*]*/ #if !defined(_MSC_VER) /*[*/ # include #endif /*]*/ #include #include #include "tn3270e.h" #include "pr3287.h" #include "ctlrc.h" #include "indent_s.h" #include "resolver.h" #include "telnet_core.h" #include "utils.h" #include "sio.h" #include "sioc.h" #include "trace.h" #include "pr_telnet.h" #if !defined(TELOPT_STARTTLS) /*[*/ # define TELOPT_STARTTLS 46 #endif /*]*/ #define TLS_FOLLOWS 1 /* connection state */ enum cstate { NOT_CONNECTED, /* no socket, unknown mode */ PENDING, /* connection pending */ CONNECTED_INITIAL, /* connected, no mode yet */ CONNECTED_NVT, /* connected in NVT mode */ CONNECTED_3270, /* connected in old-style 3270 mode */ CONNECTED_INITIAL_E, /* connected in TN3270E mode, unnegotiated */ CONNECTED_E_NVT, /* connected in TN3270E mode, NVT mode */ CONNECTED_SSCP, /* connected in TN3270E mode, SSCP-LU mode */ CONNECTED_TN3270E /* connected in TN3270E mode, 3270 mode */ }; enum cstate cstate = NOT_CONNECTED; #define PCONNECTED ((int)cstate >= (int)PENDING) #define HALF_CONNECTED (cstate == PENDING) #define CONNECTED ((int)cstate >= (int)CONNECTED_INITIAL) #define IN_NVT (cstate == CONNECTED_NVT || cstate == CONNECTED_E_NVT) #define IN_3270 (cstate == CONNECTED_3270 || cstate == CONNECTED_TN3270E || cstate == CONNECTED_SSCP) #define IN_SSCP (cstate == CONNECTED_SSCP) #define IN_TN3270E (cstate == CONNECTED_TN3270E) #define IN_E (cstate >= CONNECTED_INITIAL_E) static char *connected_lu = NULL; static char *connected_type = NULL; static char *hostname = NULL; #define BUFSZ 4096 #define N_OPTS 256 static int on = 1; /* Globals */ time_t ns_time; size_t ns_brcvd; int ns_rrcvd; size_t ns_bsent; int ns_rsent; unsigned char *obuf; /* 3270 output buffer */ int obuf_size = 0; unsigned char *obptr = (unsigned char *) NULL; int linemode = 1; const char *termtype = "IBM-3287-1"; /* Statics */ static struct timeval ds_ts; static socket_t sock = INVALID_SOCKET; /* active socket */ static unsigned char myopts[N_OPTS], hisopts[N_OPTS]; /* telnet option flags */ static unsigned char *ibuf = (unsigned char *) NULL; /* 3270 input buffer */ static unsigned char *ibptr; static int ibuf_size = 0; /* size of ibuf */ static unsigned char *obuf_base = NULL; static unsigned char *netrbuf = NULL; /* network input buffer */ static unsigned char *sbbuf = NULL; /* telnet sub-option buffer */ static unsigned char *sbptr; static unsigned char telnet_state; static int syncing; static unsigned long e_funcs; /* negotiated TN3270E functions */ #define E_OPT(n) (1 << (n)) static unsigned short e_xmit_seq; /* transmit sequence number */ static int response_required; static int tn3270e_negotiated = 0; static enum { E_NONE, E_3270, E_NVT, E_SSCP } tn3270e_submode = E_NONE; static int tn3270e_bound = 0; static char **lus = NULL; static char **curr_lu = NULL; static char *try_lu = NULL; static char *try_assoc = NULL; static void setup_lus(char *luname, const char *assoc); static bool telnet_fsm(unsigned char c); static void net_rawout(unsigned const char *buf, size_t len); static void check_in3270(void); static void store3270in(unsigned char c); static int tn3270e_negotiate(void); static void process_eor(void); static const char *tn3270e_function_names(const unsigned char *, int); static void tn3270e_subneg_send(unsigned char, unsigned long); static unsigned long tn3270e_fdecode(const unsigned char *, int); static void tn3270_ack(void); static void tn3270_nak(enum pds); static void tn3270e_ack(void); static void tn3270e_nak(enum pds); static void tn3270e_cleared(void); static bool net_input(socket_t s); #define trace_str(str) vtrace("%s", (str)) static const char *cmd(int c); static const char *opt(unsigned char c); static const char *nnn(int c); /* telnet states */ #define TNS_DATA 0 /* receiving data */ #define TNS_IAC 1 /* got an IAC */ #define TNS_WILL 2 /* got an IAC WILL */ #define TNS_WONT 3 /* got an IAC WONT */ #define TNS_DO 4 /* got an IAC DO */ #define TNS_DONT 5 /* got an IAC DONT */ #define TNS_SB 6 /* got an IAC SB */ #define TNS_SB_IAC 7 /* got an IAC after an IAC SB */ /* telnet predefined messages */ static unsigned char do_opt[] = { IAC, DO, '_' }; static unsigned char dont_opt[] = { IAC, DONT, '_' }; static unsigned char will_opt[] = { IAC, WILL, '_' }; static unsigned char wont_opt[] = { IAC, WONT, '_' }; static unsigned char functions_req[] = { IAC, SB, TELOPT_TN3270E, TN3270E_OP_FUNCTIONS }; const char *telquals[2] = { "IS", "SEND" }; const char *reason_code[8] = { "CONN-PARTNER", "DEVICE-IN-USE", "INV-ASSOCIATE", "INV-NAME", "INV-DEVICE-TYPE", "TYPE-NAME-ERROR", "UNKNOWN-ERROR", "UNSUPPORTED-REQ" }; #define rsn(n) (((n) <= TN3270E_REASON_UNSUPPORTED_REQ) ? \ reason_code[(n)] : "??") const char *function_name[5] = { "BIND-IMAGE", "DATA-STREAM-CTL", "RESPONSES", "SCS-CTL-CODES", "SYSREQ" }; #define fnn(n) (((n) <= TN3270E_FUNC_SYSREQ) ? \ function_name[(n)] : "??") const char *data_type[9] = { "3270-DATA", "SCS-DATA", "RESPONSE", "BIND-IMAGE", "UNBIND", "NVT-DATA", "REQUEST", "SSCP-LU-DATA", "PRINT-EOJ" }; #define e_dt(n) (((n) <= TN3270E_DT_PRINT_EOJ) ? \ data_type[(n)] : "??") const char *req_flag[1] = { " ERR-COND-CLEARED" }; #define e_rq(fn, n) (((fn) == TN3270E_DT_REQUEST) ? \ (((n) <= TN3270E_RQF_ERR_COND_CLEARED) ? \ req_flag[(n)] : " ??") : "") const char *hrsp_flag[3] = { "NO-RESPONSE", "ERROR-RESPONSE", "ALWAYS-RESPONSE" }; #define e_hrsp(n) (((n) <= TN3270E_RSF_ALWAYS_RESPONSE) ? \ hrsp_flag[(n)] : "??") const char *trsp_flag[2] = { "POSITIVE-RESPONSE", "NEGATIVE-RESPONSE" }; #define e_trsp(n) (((n) <= TN3270E_RSF_NEGATIVE_RESPONSE) ? \ trsp_flag[(n)] : "??") #define e_rsp(fn, n) (((fn) == TN3270E_DT_RESPONSE) ? e_trsp(n) : e_hrsp(n)) const char *neg_type[4] = { "COMMAND-REJECT", "INTERVENTION-REQUIRED", "OPERATION-CHECK", "COMPONENT-DISCONNECTED" }; #define e_neg_type(n) (((n) <= TN3270E_NEG_COMPONENT_DISCONNECTED) ? \ neg_type[n]: "??") bool ssl_supported = true; bool secure_connection = false; bool secure_unverified = false; static sio_t sio; static bool need_tls_follows = false; static int continue_tls(unsigned char *sbbuf, int len); static bool refused_tls = false; static bool ever_3270 = false; char * sockerrmsg(void) { static char buf[1024]; #if defined(_WIN32) /*[*/ if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, sizeof(buf), NULL) == 0) { snprintf(buf, sizeof(buf), "Windows error %d", WSAGetLastError()); } #else /*][*/ snprintf(buf, sizeof(buf), "%s", strerror(errno)); #endif /*]*/ return buf; } void popup_a_sockerr(const char *fmt, ...) { va_list args; char *buf; va_start(args, fmt); buf = xs_vbuffer(fmt, args); va_end(args); errmsg("%s: %s", buf, sockerrmsg()); Free(buf); } /* * pr_net_negotiate * Initialize the connection, and negotiate TN3270 options with the host. * * Returns true for success, false for failure. */ bool pr_net_negotiate(const char *host, struct sockaddr *sa, socklen_t len, socket_t s, char *lu, const char *assoc) { bool data = false; /* Save the hostname. */ char *h = Malloc(strlen(host) + 1); strcpy(h, host); Replace(hostname, h); /* Set options for inline out-of-band data and keepalives. */ if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)) < 0) { popup_a_sockerr("setsockopt(SO_OOBINLINE)"); return false; } if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) { popup_a_sockerr("setsockopt(SO_KEEPALIVE)"); return false; } #if !defined(_WIN32) /*[*/ /* Don't share the socket with our children. */ (void) fcntl(s, F_SETFD, 1); #endif /*]*/ /* init ssl */ if (options.ssl_host && !secure_connection) { char *session, *cert; if (sio_init(&options.ssl, NULL, &sio) != SI_SUCCESS) { errmsg("%s\n", sio_last_error()); return false; } if (!sio_negotiate(sio, s, host, &data)) { errmsg("%s\n", sio_last_error()); return false; } secure_connection = true; session = indent_s(sio_session_info(sio)); cert = indent_s(sio_server_cert_info(sio)); vtrace("TLS/SSL tunneled connection complete. " "Connection is now secure.\n" "Session:\n%s\nServer certificate:\n%s\n", session, cert); Free(session); Free(cert); } /* Allocate the receive buffers. */ if (netrbuf == NULL) { netrbuf = (unsigned char *)Malloc(BUFSZ); } if (ibuf == NULL) { ibuf = (unsigned char *)Malloc(BUFSIZ); } ibuf_size = BUFSIZ; ibptr = ibuf; /* Set up the LU list. */ setup_lus(lu, assoc); /* Set up telnet options. */ (void) memset((char *) myopts, 0, sizeof(myopts)); (void) memset((char *) hisopts, 0, sizeof(hisopts)); e_funcs = E_OPT(TN3270E_FUNC_BIND_IMAGE) | E_OPT(TN3270E_FUNC_DATA_STREAM_CTL) | E_OPT(TN3270E_FUNC_RESPONSES) | E_OPT(TN3270E_FUNC_SCS_CTL_CODES) | E_OPT(TN3270E_FUNC_SYSREQ); e_xmit_seq = 0; response_required = TN3270E_RSF_NO_RESPONSE; need_tls_follows = false; telnet_state = TNS_DATA; /* Clear statistics and flags. */ (void) time(&ns_time); ns_brcvd = 0; ns_rrcvd = 0; ns_bsent = 0; ns_rsent = 0; syncing = 0; tn3270e_negotiated = 0; tn3270e_submode = E_NONE; tn3270e_bound = 0; /* Speak with the host until we suceed or give up. */ cstate = CONNECTED_INITIAL; sock = s; /* hack! */ while (!tn3270e_negotiated && /* TN3270E */ cstate != CONNECTED_3270 && /* TN3270 */ cstate != NOT_CONNECTED) { /* gave up */ if (!net_input(s)) { return false; } } /* Success. */ return true; } bool pr_net_process(socket_t s) { while (cstate != NOT_CONNECTED) { fd_set rfds; struct timeval t; struct timeval *tp; int nr; int maxfd = (int)s; FD_ZERO(&rfds); FD_SET(s, &rfds); if (options.eoj_timeout) { t.tv_sec = options.eoj_timeout; t.tv_usec = 0; tp = &t; } else { tp = NULL; } if (syncsock != INVALID_SOCKET) { if (syncsock > s) { maxfd = (int)syncsock; } FD_SET(syncsock, &rfds); } nr = select(maxfd + 1, &rfds, NULL, NULL, tp); if (nr == 0 && options.eoj_timeout) { print_eoj(); } if (nr > 0 && FD_ISSET(s, &rfds)) { if (!net_input(s)) { return false; } } if (nr > 0 && syncsock != INVALID_SOCKET && FD_ISSET(syncsock, &rfds)) { vtrace("Input on syncsock -- exiting.\n"); net_disconnect(true); #if defined(_WIN32) /*[*/ /* Let Windows send the TCP FIN. */ Sleep(500); #endif /*]*/ pr3287_exit(0); } } return true; } /* Disconnect from the host. */ void net_disconnect(bool including_ssl) { if (sock != INVALID_SOCKET) { vtrace("SENT disconnect\n"); SOCK_CLOSE(sock); sock = INVALID_SOCKET; if (sio != NULL) { sio_close(sio); sio = NULL; } secure_connection = false; secure_unverified = false; if (refused_tls && !ever_3270) { errmsg("Connection failed:\n" "Host requested TLS but SSL not supported"); } refused_tls = false; ever_3270 = false; } } /* Set up the LU list. */ static void setup_lus(char *luname, const char *assoc) { char *lu; char *comma; int n_lus = 1; int i; connected_lu = NULL; connected_type = NULL; curr_lu = NULL; try_lu = NULL; if (lus) { Free(lus); lus = NULL; } if (assoc != NULL) { try_assoc = NewString(assoc); return; } if (luname == NULL || !luname[0]) { return; } /* * Count the commas in the LU name. That plus one is the * number of LUs to try. */ lu = luname; while ((comma = strchr(lu, ',')) != NULL) { n_lus++; lu++; } /* * Allocate enough memory to construct an argv[] array for * the LUs. */ lus = (char **)Malloc((n_lus+1) * sizeof(char *) + strlen(luname) + 1); /* Copy each LU into the array. */ lu = (char *)(lus + n_lus + 1); (void) strcpy(lu, luname); i = 0; do { lus[i++] = lu; comma = strchr(lu, ','); if (comma != NULL) { *comma = '\0'; lu = comma + 1; } } while (comma != NULL); lus[i] = NULL; curr_lu = lus; try_lu = *curr_lu; } /* * net_input * Called by the toolkit whenever there is input available on the * socket. Reads the data, processes the special telnet commands * and calls process_ds to process the 3270 data stream. */ static bool net_input(socket_t s) { register unsigned char *cp; ssize_t nr; if (sio != NULL) { nr = sio_read(sio, (char *)netrbuf, BUFSZ); } else { nr = recv(s, (char *)netrbuf, BUFSZ, 0); } if (nr < 0) { if ((sio != NULL && nr == SIO_EWOULDBLOCK) || (sio == NULL && socket_errno() == SE_EWOULDBLOCK)) { vtrace("EWOULDBLOCK\n"); return true; } if (sio != NULL) { vtrace("RCVD sio error %s\n", sio_last_error()); errmsg("%s\n", sio_last_error()); cstate = NOT_CONNECTED; return false; } vtrace("RCVD socket error %s\n", sockerrmsg()); popup_a_sockerr("Socket read"); cstate = NOT_CONNECTED; return false; } else if (nr == 0) { /* Host disconnected. */ trace_str("RCVD disconnect\n"); cstate = NOT_CONNECTED; return true; } /* Process the data. */ trace_netdata('<', netrbuf, nr); ns_brcvd += nr; for (cp = netrbuf; cp < (netrbuf + nr); cp++) { if (!telnet_fsm(*cp)) { cstate = NOT_CONNECTED; return false; } } return true; } /* Advance 'try_lu' to the next desired LU name. */ static void next_lu(void) { if (curr_lu != NULL && (try_lu = *++curr_lu) == NULL) { curr_lu = NULL; } } /* * telnet_fsm * Telnet finite-state machine. * Returns true for okay, false for errors. */ static bool telnet_fsm(unsigned char c) { switch (telnet_state) { case TNS_DATA: /* normal data processing */ if (c == IAC) { /* got a telnet command */ telnet_state = TNS_IAC; break; } if (IN_NVT && !IN_E) { /* NVT data? */ ; } else { store3270in(c); } break; case TNS_IAC: /* process a telnet command */ if (c != EOR && c != IAC) { vtrace("RCVD %s ", cmd(c)); } switch (c) { case IAC: /* escaped IAC, insert it */ if (IN_NVT && !IN_E) { ; } else store3270in(c); telnet_state = TNS_DATA; break; case EOR: /* eor, process accumulated input */ trace_str("RCVD EOR"); if (IN_3270 || (IN_E && tn3270e_negotiated)) { trace_str("\n"); ns_rrcvd++; process_eor(); } else trace_str(" (ignored -- not in 3270 mode)\n"); ibptr = ibuf; telnet_state = TNS_DATA; break; case WILL: telnet_state = TNS_WILL; break; case WONT: telnet_state = TNS_WONT; break; case DO: telnet_state = TNS_DO; break; case DONT: telnet_state = TNS_DONT; break; case SB: telnet_state = TNS_SB; if (sbbuf == NULL) sbbuf = (unsigned char *)Malloc(1024); sbptr = sbbuf; break; case DM: trace_str("\n"); if (syncing) { syncing = 0; /* x_except_on(s); */ } telnet_state = TNS_DATA; break; case AO: if (IN_3270 && !IN_E) { trace_str("\n"); if (print_eoj() < 0) tn3270_nak(PDS_FAILED); } else { trace_str(" (ignored -- not in TN3270 mode)\n"); } ibptr = ibuf; telnet_state = TNS_DATA; break; case GA: case NOP: trace_str("\n"); telnet_state = TNS_DATA; break; default: trace_str(" (ignored -- unsupported)\n"); telnet_state = TNS_DATA; break; } break; case TNS_WILL: /* telnet WILL DO OPTION command */ vtrace("%s\n", opt(c)); switch (c) { case TELOPT_SGA: case TELOPT_BINARY: case TELOPT_EOR: case TELOPT_TTYPE: case TELOPT_ECHO: case TELOPT_TN3270E: if (!hisopts[c]) { hisopts[c] = 1; do_opt[2] = c; net_rawout(do_opt, sizeof(do_opt)); vtrace("SENT %s %s\n", cmd(DO), opt(c)); /* For UTS, volunteer to do EOR when they do. */ if (c == TELOPT_EOR && !myopts[c]) { myopts[c] = 1; will_opt[2] = c; net_rawout(will_opt, sizeof(will_opt)); vtrace("SENT %s %s\n", cmd(WILL), opt(c)); } check_in3270(); } break; default: dont_opt[2] = c; net_rawout(dont_opt, sizeof(dont_opt)); vtrace("SENT %s %s\n", cmd(DONT), opt(c)); break; } telnet_state = TNS_DATA; break; case TNS_WONT: /* telnet WONT DO OPTION command */ vtrace("%s\n", opt(c)); if (hisopts[c]) { hisopts[c] = 0; dont_opt[2] = c; net_rawout(dont_opt, sizeof(dont_opt)); vtrace("SENT %s %s\n", cmd(DONT), opt(c)); check_in3270(); } telnet_state = TNS_DATA; break; case TNS_DO: /* telnet PLEASE DO OPTION command */ vtrace("%s\n", opt(c)); switch (c) { case TELOPT_BINARY: case TELOPT_EOR: case TELOPT_TTYPE: case TELOPT_SGA: case TELOPT_TM: case TELOPT_TN3270E: case TELOPT_STARTTLS: if (c == TELOPT_STARTTLS && !sio_supported()) { refused_tls = true; goto wont; } if (!myopts[c]) { if (c != TELOPT_TM) myopts[c] = 1; will_opt[2] = c; net_rawout(will_opt, sizeof(will_opt)); vtrace("SENT %s %s\n", cmd(WILL), opt(c)); check_in3270(); } if (c == TELOPT_STARTTLS) { static unsigned char follows_msg[] = { IAC, SB, TELOPT_STARTTLS, TLS_FOLLOWS, IAC, SE }; /* * Send IAC SB STARTTLS FOLLOWS IAC SE * to announce that what follows is TLS. */ net_rawout(follows_msg, sizeof(follows_msg)); vtrace("SENT %s %s FOLLOWS %s\n", cmd(SB), opt(TELOPT_STARTTLS), cmd(SE)); need_tls_follows = true; } break; wont: default: wont_opt[2] = c; net_rawout(wont_opt, sizeof(wont_opt)); vtrace("SENT %s %s\n", cmd(WONT), opt(c)); break; } telnet_state = TNS_DATA; break; case TNS_DONT: /* telnet PLEASE DON'T DO OPTION command */ vtrace("%s\n", opt(c)); if (myopts[c]) { myopts[c] = 0; wont_opt[2] = c; net_rawout(wont_opt, sizeof(wont_opt)); vtrace("SENT %s %s\n", cmd(WONT), opt(c)); check_in3270(); } telnet_state = TNS_DATA; break; case TNS_SB: /* telnet sub-option string command */ if (c == IAC) telnet_state = TNS_SB_IAC; else *sbptr++ = c; break; case TNS_SB_IAC: /* telnet sub-option string command */ *sbptr++ = c; if (c == SE) { telnet_state = TNS_DATA; if (sbbuf[0] == TELOPT_TTYPE && sbbuf[1] == TELQUAL_SEND) { size_t tt_len, tb_len; char *tt_out; vtrace("%s %s\n", opt(sbbuf[0]), telquals[sbbuf[1]]); if (lus != NULL && try_assoc == NULL && try_lu == NULL) { /* None of the LUs worked. */ errmsg("Cannot connect to specified " "LU"); return false; } tt_len = strlen(termtype); if (try_lu != NULL && *try_lu) { tt_len += strlen(try_lu) + 1; connected_lu = try_lu; } else connected_lu = NULL; tb_len = 4 + tt_len + 2; tt_out = Malloc(tb_len + 1); (void) sprintf(tt_out, "%c%c%c%c%s%s%s%c%c", IAC, SB, TELOPT_TTYPE, TELQUAL_IS, termtype, (try_lu != NULL && *try_lu) ? "@" : "", (try_lu != NULL && *try_lu) ? try_lu : "", IAC, SE); net_rawout((unsigned char *)tt_out, tb_len); vtrace("SENT %s %s %s %.*s %s\n", cmd(SB), opt(TELOPT_TTYPE), telquals[TELQUAL_IS], tt_len, tt_out + 4, cmd(SE)); Free(tt_out); /* Advance to the next LU name. */ next_lu(); } else if (myopts[TELOPT_TN3270E] && sbbuf[0] == TELOPT_TN3270E) { if (tn3270e_negotiate()) return false; } else if (need_tls_follows && myopts[TELOPT_STARTTLS] && sbbuf[0] == TELOPT_STARTTLS) { if (continue_tls(sbbuf, (int)(sbptr - sbbuf)) < 0) return false; } } else { telnet_state = TNS_SB; } break; } return true; } /* Send a TN3270E terminal type request. */ static void tn3270e_request(void) { size_t tt_len, tb_len; char *tt_out; char *t; tt_len = strlen(termtype); if (try_assoc != NULL) tt_len += strlen(try_assoc) + 1; else if (try_lu != NULL && *try_lu) tt_len += strlen(try_lu) + 1; tb_len = 5 + tt_len + 2; tt_out = Malloc(tb_len + 1); t = tt_out; t += sprintf(tt_out, "%c%c%c%c%c%s", IAC, SB, TELOPT_TN3270E, TN3270E_OP_DEVICE_TYPE, TN3270E_OP_REQUEST, termtype); if (try_assoc != NULL) t += sprintf(t, "%c%s", TN3270E_OP_ASSOCIATE, try_assoc); else if (try_lu != NULL && *try_lu) t += sprintf(t, "%c%s", TN3270E_OP_CONNECT, try_lu); (void) sprintf(t, "%c%c", IAC, SE); net_rawout((unsigned char *)tt_out, tb_len); vtrace("SENT %s %s DEVICE-TYPE REQUEST %.*s%s%s%s%s " "%s\n", cmd(SB), opt(TELOPT_TN3270E), strlen(termtype), tt_out + 5, (try_assoc != NULL) ? " ASSOCIATE " : "", (try_assoc != NULL) ? try_assoc : "", (try_lu != NULL && *try_lu) ? " CONNECT " : "", (try_lu != NULL && *try_lu) ? try_lu : "", cmd(SE)); Free(tt_out); } /* * Negotiation of TN3270E options. * Returns 0 if okay, -1 if we have to give up altogether. */ static int tn3270e_negotiate(void) { #define LU_MAX 32 static char reported_lu[LU_MAX+1]; static char reported_type[LU_MAX+1]; int sblen; unsigned long e_rcvd; /* Find out how long the subnegotiation buffer is. */ for (sblen = 0; ; sblen++) { if (sbbuf[sblen] == SE) break; } vtrace("TN3270E "); switch (sbbuf[1]) { case TN3270E_OP_SEND: if (sbbuf[2] == TN3270E_OP_DEVICE_TYPE) { /* Host wants us to send our device type. */ vtrace("SEND DEVICE-TYPE SE\n"); tn3270e_request(); } else { vtrace("SEND ??%u SE\n", sbbuf[2]); } break; case TN3270E_OP_DEVICE_TYPE: /* Device type negotiation. */ vtrace("DEVICE-TYPE "); switch (sbbuf[2]) { case TN3270E_OP_IS: { int tnlen, snlen; /* Device type success. */ /* Isolate the terminal type and session. */ tnlen = 0; while (sbbuf[3+tnlen] != SE && sbbuf[3+tnlen] != TN3270E_OP_CONNECT) tnlen++; snlen = 0; if (sbbuf[3+tnlen] == TN3270E_OP_CONNECT) { while(sbbuf[3+tnlen+1+snlen] != SE) snlen++; } vtrace("IS %.*s CONNECT %.*s SE\n", tnlen, &sbbuf[3], snlen, &sbbuf[3+tnlen+1]); /* Remember the LU. */ if (tnlen) { if (tnlen > LU_MAX) tnlen = LU_MAX; (void)strncpy(reported_type, (char *)&sbbuf[3], tnlen); reported_type[tnlen] = '\0'; connected_type = reported_type; } if (snlen) { if (snlen > LU_MAX) snlen = LU_MAX; (void)strncpy(reported_lu, (char *)&sbbuf[3+tnlen+1], snlen); reported_lu[snlen] = '\0'; connected_lu = reported_lu; } /* Tell them what we can do. */ tn3270e_subneg_send(TN3270E_OP_REQUEST, e_funcs); break; } case TN3270E_OP_REJECT: /* Device type failure. */ vtrace("REJECT REASON %s SE\n", rsn(sbbuf[4])); if (try_assoc != NULL) { errmsg("Cannot associate with specified LU: %s", rsn(sbbuf[4])); return -1; } next_lu(); if (try_lu != NULL) { /* Try the next LU. */ tn3270e_request(); } else if (lus != NULL) { /* No more LUs to try. Give up. */ errmsg("Cannot connect to specified LU: %s", rsn(sbbuf[4])); return -1; } else { errmsg("Device type rejected, cannot connect: " "%s", rsn(sbbuf[4])); return -1; } break; default: vtrace("??%u SE\n", sbbuf[2]); break; } break; case TN3270E_OP_FUNCTIONS: /* Functions negotiation. */ vtrace("FUNCTIONS "); switch (sbbuf[2]) { case TN3270E_OP_REQUEST: /* Host is telling us what functions they want. */ vtrace("REQUEST %s SE\n", tn3270e_function_names(sbbuf+3, sblen-3)); e_rcvd = tn3270e_fdecode(sbbuf+3, sblen-3); if ((e_rcvd == e_funcs) || (e_funcs & ~e_rcvd)) { /* They want what we want, or less. Done. */ e_funcs = e_rcvd; tn3270e_subneg_send(TN3270E_OP_IS, e_funcs); tn3270e_negotiated = 1; vtrace("TN3270E option negotiation " "complete.\n"); check_in3270(); } else { /* * They want us to do something we can't. * Request the common subset. */ e_funcs &= e_rcvd; tn3270e_subneg_send(TN3270E_OP_REQUEST, e_funcs); } break; case TN3270E_OP_IS: /* They accept our last request. */ vtrace("IS %s SE\n", tn3270e_function_names(sbbuf+3, sblen-3)); e_rcvd = tn3270e_fdecode(sbbuf+3, sblen-3); if (e_rcvd != e_funcs) { if (e_funcs & ~e_rcvd) { /* They've removed something. Fine. */ e_funcs &= e_rcvd; } else { /* * They've added something. Abandon * TN3270E, they're brain dead. */ vtrace("Host illegally added " "function(s), aborting " "TN3270E\n"); wont_opt[2] = TELOPT_TN3270E; net_rawout(wont_opt, sizeof(wont_opt)); vtrace("SENT %s %s\n", cmd(WONT), opt(TELOPT_TN3270E)); myopts[TELOPT_TN3270E] = 0; check_in3270(); break; } } tn3270e_negotiated = 1; vtrace("TN3270E option negotiation complete.\n"); check_in3270(); break; default: vtrace("??%u SE\n", sbbuf[2]); break; } break; default: vtrace("??%u SE\n", sbbuf[1]); } /* Good enough for now. */ return 0; } /* Expand a string of TN3270E function codes into text. */ static const char * tn3270e_function_names(const unsigned char *buf, int len) { int i; static char text_buf[1024]; char *s = text_buf; if (!len) return("(null)"); for (i = 0; i < len; i++) { s += sprintf(s, "%s%s", (s == text_buf) ? "" : " ", fnn(buf[i])); } return text_buf; } /* Transmit a TN3270E FUNCTIONS REQUEST or FUNCTIONS IS message. */ static void tn3270e_subneg_send(unsigned char op, unsigned long funcs) { unsigned char proto_buf[7 + 32]; int proto_len; int i; /* Construct the buffers. */ (void) memcpy(proto_buf, functions_req, 4); proto_buf[4] = op; proto_len = 5; for (i = 0; i < 32; i++) { if (funcs & E_OPT(i)) proto_buf[proto_len++] = i; } /* Complete and send out the protocol message. */ proto_buf[proto_len++] = IAC; proto_buf[proto_len++] = SE; net_rawout(proto_buf, proto_len); /* Complete and send out the trace text. */ vtrace("SENT %s %s FUNCTIONS %s %s %s\n", cmd(SB), opt(TELOPT_TN3270E), (op == TN3270E_OP_REQUEST)? "REQUEST": "IS", tn3270e_function_names(proto_buf + 5, proto_len - 7), cmd(SE)); } /* Translate a string of TN3270E functions into a bit-map. */ static unsigned long tn3270e_fdecode(const unsigned char *buf, int len) { unsigned long r = 0L; int i; /* Note that this code silently ignores options >= 32. */ for (i = 0; i < len; i++) { if (buf[i] < 32) r |= E_OPT(buf[i]); } return r; } static void process_eor(void) { enum pds rv; if (syncing || !(ibptr - ibuf)) { return; } if (IN_E) { tn3270e_header *h = (tn3270e_header *)ibuf; vtrace("RCVD TN3270E(%s%s %s %u)\n", e_dt(h->data_type), e_rq(h->data_type, h->request_flag), e_rsp(h->data_type, h->response_flag), h->seq_number[0] << 8 | h->seq_number[1]); switch (h->data_type) { case TN3270E_DT_3270_DATA: case TN3270E_DT_SCS_DATA: if ((e_funcs & E_OPT(TN3270E_FUNC_BIND_IMAGE)) && !tn3270e_bound) { return; } tn3270e_submode = E_3270; check_in3270(); response_required = h->response_flag; if (h->data_type == TN3270E_DT_3270_DATA) { rv = process_ds(ibuf + EH_SIZE, (ibptr - ibuf) - EH_SIZE); } else { rv = process_scs(ibuf + EH_SIZE, (ibptr - ibuf) - EH_SIZE); } if (rv < 0 && response_required != TN3270E_RSF_NO_RESPONSE) { tn3270e_nak(rv); } else if (rv == PDS_OKAY_NO_OUTPUT && response_required == TN3270E_RSF_ALWAYS_RESPONSE) { tn3270e_ack(); } response_required = TN3270E_RSF_NO_RESPONSE; return; case TN3270E_DT_BIND_IMAGE: if (!(e_funcs & E_OPT(TN3270E_FUNC_BIND_IMAGE))) { return; } tn3270e_bound = 1; check_in3270(); if (h->response_flag) { tn3270e_ack(); } return; case TN3270E_DT_UNBIND: if (!(e_funcs & E_OPT(TN3270E_FUNC_BIND_IMAGE))) { return; } tn3270e_bound = 0; if (tn3270e_submode == E_3270) { tn3270e_submode = E_NONE; } check_in3270(); if (print_eoj() == 0) { rv = PDS_OKAY_NO_OUTPUT; } else { rv = PDS_FAILED; } if (h->response_flag) { if (rv >= 0) { tn3270e_ack(); } else { tn3270e_nak(rv); } } print_unbind(); return; case TN3270E_DT_SSCP_LU_DATA: case TN3270E_DT_NVT_DATA: if (h->response_flag) { tn3270e_nak(PDS_BAD_CMD); } return; case TN3270E_DT_PRINT_EOJ: rv = PDS_OKAY_NO_OUTPUT; if (options.ignoreeoj) { vtrace("(ignored)\n"); } else if (print_eoj() < 0) { rv = PDS_FAILED; } if (h->response_flag) { if (rv >= 0) { tn3270e_ack(); } else { tn3270e_nak(rv); } } return; default: return; } } else { /* Plain old 3270 mode. */ rv = process_ds(ibuf, ibptr - ibuf); if (rv < 0) { tn3270_nak(rv); } else { tn3270_ack(); } return; } } /* * net_exception * Called when there is an exceptional condition on the socket. */ void net_exception(void) { trace_str("RCVD urgent data indication\n"); if (!syncing) { syncing = 1; /* x_except_off(); */ } } /* * Flavors of Network Output: * * net_output send a 3270 record * net_rawout send telnet protocol data */ /* * net_rawout * Send out raw telnet data. We assume that there will always be enough * space to buffer what we want to transmit, so we don't handle EAGAIN or * EWOULDBLOCK. */ static void net_rawout(unsigned const char *buf, size_t len) { ssize_t nw; trace_netdata('>', buf, len); while (len) { #if defined(OMTU) /*[*/ size_t n2w = len; int pause = 0; if (n2w > OMTU) { n2w = OMTU; pause = 1; } #else # define n2w len #endif if (sio != NULL) nw = sio_write(sio, (const char *)buf, (int)n2w); else nw = send(sock, (const char *) buf, (int)n2w, 0); if (nw < 0) { if (sio != NULL) { vtrace("RCVD socket error: %s\n", sio_last_error()); errmsg("%s\n", sio_last_error()); cstate = NOT_CONNECTED; return; } vtrace("RCVD socket error %s\n", sockerrmsg()); if (socket_errno() == SE_EPIPE || socket_errno() == SE_ECONNRESET) { cstate = NOT_CONNECTED; return; } else if (socket_errno() == SE_EINTR) { goto bot; } else { popup_a_sockerr("Socket write"); cstate = NOT_CONNECTED; return; } } ns_bsent += nw; len -= nw; buf += nw; bot: #if defined(OMTU) /*[*/ if (pause) sleep(1); #endif /*]*/ ; } } /* * check_in3270 * Check for switches between NVT, SSCP-LU and 3270 modes. */ static void check_in3270(void) { enum cstate new_cstate = NOT_CONNECTED; static const char *state_name[] = { "unconnected", "pending", "connected initial", "TN3270 NVT", "TN3270 3270", "TN3270E", "TN3270E NVT", "TN3270E SSCP-LU", "TN3270E 3270" }; if (myopts[TELOPT_TN3270E]) { if (!tn3270e_negotiated) new_cstate = CONNECTED_INITIAL_E; else switch (tn3270e_submode) { case E_NONE: new_cstate = CONNECTED_INITIAL_E; break; case E_NVT: new_cstate = CONNECTED_E_NVT; break; case E_3270: new_cstate = CONNECTED_TN3270E; ever_3270 = true; break; case E_SSCP: new_cstate = CONNECTED_SSCP; break; } } else if (myopts[TELOPT_BINARY] && myopts[TELOPT_EOR] && myopts[TELOPT_TTYPE] && hisopts[TELOPT_BINARY] && hisopts[TELOPT_EOR]) { new_cstate = CONNECTED_3270; ever_3270 = true; } else if (cstate == CONNECTED_INITIAL) { /* Nothing has happened, yet. */ return; } else { new_cstate = CONNECTED_NVT; } if (new_cstate != cstate) { int was_in_e = IN_E; vtrace("Now operating in %s mode.\n", state_name[new_cstate]); cstate = new_cstate; /* * If the user specified an association, and the host has * entered TELNET NVT mode or TN3270 (non-TN3270E) mode, * give up. */ if (try_assoc != NULL && !IN_E) { errmsg("Host does not support TN3270E, cannot " "associate with specified LU"); /* No return value, gotta abort here. */ pr3287_exit(1); } /* * If we've now switched between non-TN3270E mode and * TN3270E state, reset the LU list so we can try again * in the new mode. */ if (lus != NULL && was_in_e != IN_E) { curr_lu = lus; try_lu = *curr_lu; } /* Allocate the initial 3270 input buffer. */ if (new_cstate >= CONNECTED_INITIAL && !ibuf_size) { ibuf = (unsigned char *)Malloc(BUFSIZ); ibuf_size = BUFSIZ; ibptr = ibuf; } /* If we fell out of TN3270E, remove the state. */ if (!myopts[TELOPT_TN3270E]) { tn3270e_negotiated = 0; tn3270e_submode = E_NONE; tn3270e_bound = 0; } } } /* * store3270in * Store a character in the 3270 input buffer, checking for buffer * overflow and reallocating ibuf if necessary. */ static void store3270in(unsigned char c) { if (ibptr - ibuf >= ibuf_size) { ibuf_size += BUFSIZ; ibuf = (unsigned char *)Realloc((char *)ibuf, ibuf_size); ibptr = ibuf + ibuf_size - BUFSIZ; } *ibptr++ = c; } /* * space3270out * Ensure that more characters will fit in the 3270 output buffer. * Allocates the buffer in BUFSIZ chunks. * Allocates hidden space at the front of the buffer for TN3270E. */ void space3270out(size_t n) { size_t nc = 0; /* amount of data currently in obuf */ unsigned more = 0; if (obuf_size) { nc = obptr - obuf; } while ((nc + n + EH_SIZE) > (obuf_size + more)) { more += BUFSIZ; } if (more) { obuf_size += more; obuf_base = (unsigned char *)Realloc((char *)obuf_base, obuf_size); obuf = obuf_base + EH_SIZE; obptr = obuf + nc; } } /* * nnn * Expands a number to a character string, for displaying unknown telnet * commands and options. */ static const char * nnn(int c) { static char buf[64]; (void) sprintf(buf, "%d", c); return buf; } /* * cmd * Expands a TELNET command into a character string. */ static const char * cmd(int c) { if (TELCMD_OK(c)) return TELCMD(c); else return nnn((int)c); } /* * opt * Expands a TELNET option into a character string. */ static const char * opt(unsigned char c) { if (TELOPT_OK(c)) return TELOPT(c); else if (c == TELOPT_TN3270E) return "TN3270E"; else if (c == TELOPT_STARTTLS) return "START-TLS"; else return nnn((int)c); } #define LINEDUMP_MAX 32 void trace_netdata(char direction, unsigned const char *buf, size_t len) { size_t offset; struct timeval ts; double tdiff; if (tracef == NULL) return; (void) gettimeofday(&ts, NULL); if (IN_3270) { tdiff = ((1.0e6 * (double)(ts.tv_sec - ds_ts.tv_sec)) + (double)(ts.tv_usec - ds_ts.tv_usec)) / 1.0e6; vtrace_nts("%c +%gs\n", direction, tdiff); } ds_ts = ts; for (offset = 0; offset < len; offset++) { if (!(offset % LINEDUMP_MAX)) vtrace_nts("%s%c 0x%-3x ", (offset ? "\n" : ""), direction, (unsigned)offset); vtrace_nts("%02x", buf[offset]); } vtrace_nts("\n"); } /* * net_output * Send 3270 output over the network, prepending TN3270E headers and * tacking on the necessary telnet end-of-record command. */ void net_output(void) { #define BSTART ((IN_TN3270E || IN_SSCP) ? obuf_base : obuf) /* Set the TN3720E header. */ if (IN_TN3270E || IN_SSCP) { tn3270e_header *h = (tn3270e_header *)obuf_base; /* Check for sending a TN3270E response. */ if (response_required == TN3270E_RSF_ALWAYS_RESPONSE) { tn3270e_ack(); response_required = TN3270E_RSF_NO_RESPONSE; } /* Set the outbound TN3270E header. */ h->data_type = IN_TN3270E ? TN3270E_DT_3270_DATA : TN3270E_DT_SSCP_LU_DATA; h->request_flag = 0; h->response_flag = 0; h->seq_number[0] = (e_xmit_seq >> 8) & 0xff; h->seq_number[1] = e_xmit_seq & 0xff; } /* Count the number of IACs in the message. */ { char *buf = (char *)BSTART; size_t len = obptr - BSTART; char *iac; int cnt = 0; while (len && (iac = memchr(buf, IAC, len)) != NULL) { cnt++; len -= iac - buf + 1; buf = iac + 1; } if (cnt) { space3270out(cnt); len = obptr - BSTART; buf = (char *)BSTART; /* Now quote them. */ while (len && (iac = memchr(buf, IAC, len)) != NULL) { size_t ml = len - (iac - buf); memmove(iac + 1, iac, ml); len -= iac - buf + 1; buf = iac + 2; obptr++; } } } /* Add IAC EOR to the end and send it. */ space3270out(2); *obptr++ = IAC; *obptr++ = EOR; if (IN_TN3270E || IN_SSCP) { vtrace("SENT TN3270E(%s NO-RESPONSE %u)\n", IN_TN3270E ? "3270-DATA" : "SSCP-LU-DATA", e_xmit_seq); if (e_funcs & E_OPT(TN3270E_FUNC_RESPONSES)) e_xmit_seq = (e_xmit_seq + 1) & 0x7fff; } net_rawout(BSTART, obptr - BSTART); trace_str("SENT EOR\n"); ns_rsent++; #undef BSTART } /* Send a TN3270 positive response to the server. */ static void tn3270_ack(void) { unsigned char rsp_buf[7]; int rsp_len = sizeof(rsp_buf); rsp_buf[0] = 0x01; /* SOH */ rsp_buf[1] = 0x6c; /* % */ rsp_buf[2] = 0xd9; /* R */ rsp_buf[3] = 0x02; /* Device End - No Error */ rsp_buf[4] = 0x00; /* No error */ rsp_buf[5] = IAC; rsp_buf[6] = EOR; vtrace("SENT TN3270 PRINTER STATUS(OKAY)\n"); net_rawout(rsp_buf, rsp_len); } /* Send a TN3270 negative response to the server. */ static void tn3270_nak(enum pds rv) { unsigned char rsp_buf[7]; int rsp_len = sizeof(rsp_buf); rsp_buf[0] = 0x01; /* SOH */ rsp_buf[1] = 0x6c; /* % */ rsp_buf[2] = 0xd9; /* R */ rsp_buf[3] = 0x04; /* Error */ switch (rv) { case PDS_BAD_CMD: rsp_buf[4] = 0x20; /* Command Rejected (CR) */ break; case PDS_BAD_ADDR: rsp_buf[4] = 0x04; /* Data check - invalid print data */ break; case PDS_FAILED: rsp_buf[4] = 0x10; /* Printer not ready */ break; default: rsp_buf[4] = 0x20; /* Command Rejected - shouldn't happen */ break; } rsp_buf[5] = IAC; rsp_buf[6] = EOR; vtrace("SENT TN3270 PRINTER STATUS(ERROR)\n"); net_rawout(rsp_buf, rsp_len); /* * If we just told the host 'intervention required', tell it * everything's okay now. */ if (rv == PDS_FAILED) tn3270_ack(); } /* Send a TN3270E positive response to the server. */ static void tn3270e_ack(void) { unsigned char rsp_buf[9]; tn3270e_header *h, *h_in; int rsp_len = EH_SIZE; h = (tn3270e_header *)rsp_buf; h_in = (tn3270e_header *)ibuf; h->data_type = TN3270E_DT_RESPONSE; h->request_flag = 0; h->response_flag = TN3270E_RSF_POSITIVE_RESPONSE; h->seq_number[0] = h_in->seq_number[0]; h->seq_number[1] = h_in->seq_number[1]; if (h->seq_number[1] == IAC) rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = TN3270E_POS_DEVICE_END; rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = EOR; vtrace("SENT TN3270E(RESPONSE POSITIVE-RESPONSE " "%u) DEVICE-END\n", h_in->seq_number[0] << 8 | h_in->seq_number[1]); net_rawout(rsp_buf, rsp_len); } /* Send a TN3270E negative response to the server. */ static void tn3270e_nak(enum pds rv) { unsigned char rsp_buf[9], r; tn3270e_header *h, *h_in; int rsp_len = EH_SIZE; h = (tn3270e_header *)rsp_buf; h_in = (tn3270e_header *)ibuf; h->data_type = TN3270E_DT_RESPONSE; h->request_flag = 0; h->response_flag = TN3270E_RSF_NEGATIVE_RESPONSE; h->seq_number[0] = h_in->seq_number[0]; h->seq_number[1] = h_in->seq_number[1]; if (h->seq_number[1] == IAC) rsp_buf[rsp_len++] = IAC; switch (rv) { default: case PDS_BAD_CMD: rsp_buf[rsp_len++] = r = TN3270E_NEG_COMMAND_REJECT; break; case PDS_BAD_ADDR: rsp_buf[rsp_len++] = r = TN3270E_NEG_OPERATION_CHECK; break; case PDS_FAILED: rsp_buf[rsp_len++] = r = TN3270E_NEG_INTERVENTION_REQUIRED; break; } rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = EOR; vtrace("SENT TN3270E(RESPONSE NEGATIVE-RESPONSE %u) %s\n", h_in->seq_number[0] << 8 | h_in->seq_number[1], e_neg_type(r)); net_rawout(rsp_buf, rsp_len); /* * If we just told the host 'intervention required', tell it * everything's okay now. */ if (r == TN3270E_NEG_INTERVENTION_REQUIRED) tn3270e_cleared(); } /* Send a TN3270E error cleared indication to the host. */ static void tn3270e_cleared(void) { unsigned char rsp_buf[9]; tn3270e_header *h; int rsp_len = EH_SIZE; h = (tn3270e_header *)rsp_buf; h->data_type = TN3270E_OP_REQUEST; h->request_flag = TN3270E_RQF_ERR_COND_CLEARED; h->response_flag = 0; h->seq_number[0] = (e_xmit_seq >> 8) & 0xff; h->seq_number[1] = e_xmit_seq & 0xff; if (h->seq_number[1] == IAC) rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = EOR; vtrace("SENT TN3270E(REQUEST ERR-COND-CLEARED %u)\n", e_xmit_seq); net_rawout(rsp_buf, rsp_len); e_xmit_seq = (e_xmit_seq + 1) & 0x7fff; } /* Add a dummy TN3270E header to the output buffer. */ bool net_add_dummy_tn3270e(void) { tn3270e_header *h; if (!IN_E || tn3270e_submode == E_NONE) return false; space3270out(EH_SIZE); h = (tn3270e_header *)obptr; switch (tn3270e_submode) { case E_NONE: break; case E_NVT: h->data_type = TN3270E_DT_NVT_DATA; break; case E_SSCP: h->data_type = TN3270E_DT_SSCP_LU_DATA; break; case E_3270: h->data_type = TN3270E_DT_3270_DATA; break; } h->request_flag = 0; h->response_flag = TN3270E_RSF_NO_RESPONSE; h->seq_number[0] = 0; h->seq_number[1] = 0; obptr += EH_SIZE; return true; } /* * Add IAC EOR to a buffer. */ void net_add_eor(unsigned char *buf, size_t len) { buf[len++] = IAC; buf[len++] = EOR; } /* Process a STARTTLS subnegotiation. */ static int continue_tls(unsigned char *sbbuf, int len) { bool data = false; char *session, *cert; /* Whatever happens, we're not expecting another SB STARTTLS. */ need_tls_follows = false; /* Make sure the option is FOLLOWS. */ if (len < 2 || sbbuf[1] != TLS_FOLLOWS) { /* Trace the junk. */ vtrace("%s ? %s\n", opt(TELOPT_STARTTLS), cmd(SE)); errmsg("TLS negotiation failure"); return -1; } /* Trace what we got. */ vtrace("%s FOLLOWS %s\n", opt(TELOPT_STARTTLS), cmd(SE)); /* Initialize the SSL library. */ if (sio_init(&options.ssl, NULL, &sio) != SI_SUCCESS) { errmsg("%s\n", sio_last_error()); return -1; } if (!sio_negotiate(sio, sock, hostname, &data)) { errmsg("%s\n", sio_last_error()); return -1; } secure_connection = true; /* Success. */ session = indent_s(sio_session_info(sio)); cert = indent_s(sio_server_cert_info(sio)); vtrace("TLS/SSL negotiated connection complete. " "Connection is now secure.\n" "Session:\n%s\nServer certificate:\n%s\n", session, cert); Free(session); Free(cert); return 0; } suite3270-3.6/Common/pr3287/trace.c0000664000076500007650000001273513221577163014643 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace.c * 3270 data stream tracing. * */ #include "globals.h" #include #include #include #include #include #include "3270ds.h" #include "ctlrc.h" #include "trace.h" /* Maximum length of printer-data output. */ #define PD_MAX 77 /* Statics */ typedef enum { TM_BASE, TM_EVENT, TM_DS, TM_PD } tmode_t; static tmode_t tmode = TM_BASE; static size_t tscnt = 0; /* Globals */ FILE *tracef = (FILE *) 0; static char *tdsbuf = NULL; #define TDS_LEN 75 /* Transition from one mode to another. */ static void clear_tmode(tmode_t desired) { if (tmode == TM_BASE || tmode == desired) { return; } fputc('\n', tracef); tscnt = 0; tmode = TM_BASE; } /* Data Stream trace print, handles line wraps. */ void trace_ds(const char *fmt, ...) { va_list args; size_t len; const char *s; bool nl = false; if (tracef == NULL) { return; } /* Allocate buffer. */ if (tdsbuf == NULL) { tdsbuf = Malloc(4096); } /* Print out remainder of message. */ va_start(args, fmt); (void) vsnprintf(tdsbuf, 4096, fmt, args); va_end(args); clear_tmode(TM_DS); /* * Skip leading newlines, if we're already at the beginning of a * line. */ s = tdsbuf; if (tmode == TM_BASE) { while (*s == '\n') { s++; } } len = strlen(s); if (len && s[len-1] == '\n') { len--; nl = true; } while (tscnt + len >= 75) { size_t plen = 75-tscnt; (void) fprintf(tracef, "%.*s ...\n... ", (int)plen, s); tscnt = 4; s += plen; len -= plen; } if (len) { (void) fprintf(tracef, "%.*s", (int)len, s); tscnt += len; } if (nl) { fputc('\n', tracef); tscnt = 0; tmode = TM_BASE; } fflush(tracef); if (tscnt) { tmode = TM_DS; } } /* Trace something that isn't the host or printer data stream. */ static void vatrace(int do_ts, const char *fmt, va_list args) { size_t sl; char *s; clear_tmode(TM_EVENT); /* Allocate buffer. */ if (tdsbuf == NULL) { tdsbuf = Malloc(4096); } /* Print out remainder of message. */ (void) vsnprintf(tdsbuf, 4096, fmt, args); s = tdsbuf; /* * Skip leading newlines, if we're already at the beginning of a * line. */ if (tmode == TM_BASE) { while (*s == '\n') { s++; } } /* Start with a timestamp. */ if (tmode == TM_BASE && do_ts) { struct timeval tv; time_t t; struct tm *tm; (void) gettimeofday(&tv, NULL); t = tv.tv_sec; tm = localtime(&t); (void) fprintf(tracef, "%d%02d%02d.%02d%02d%02d.%03d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000L)); fflush(tracef); } sl = strlen(s); if (sl > 0) { bool nl = false; if (tdsbuf[sl - 1] == '\n') { nl = true; } fprintf(tracef, "%s", tdsbuf); fflush(tracef); if (nl) { tscnt = 0; tmode = TM_BASE; } else { tscnt += sl; tmode = TM_EVENT; } } } /* Trace something that isn't host or printer data, with a timestamp. */ void vtrace(const char *fmt, ...) { va_list args; if (tracef == NULL) { return; } va_start(args, fmt); vatrace(1, fmt, args); va_end(args); } /* Trace something that isn't host or printer data, without a timestamp. */ void vtrace_nts(const char *fmt, ...) { va_list args; if (tracef == NULL) { return; } va_start(args, fmt); vatrace(0, fmt, args); va_end(args); } /* Trace a byte of data going to the raw print stream. */ void trace_pdc(unsigned char c) { if (tracef == NULL) { return; } clear_tmode(TM_PD); if (!tscnt) { tscnt = fprintf(tracef, " "); } tscnt += fprintf(tracef, "%02x", c); if (tscnt >= PD_MAX) { fputc('\n', tracef); tscnt = 0; tmode = TM_BASE; } else { tmode = TM_PD; } } /* Trace a string of data going to the raw print stream. */ void trace_pds(unsigned char *s) { unsigned char c; while ((c = *s++) != '\0') { trace_pdc(c); } } /* Trace a buffer full of data going to the raw print stream. */ void trace_pdb(unsigned char *s, size_t len) { while (len-- > 0) { trace_pdc(*s++); } } suite3270-3.6/Common/pr3287/trace.h0000664000076500007650000000430413221577163014641 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace_dsc.h * Global declarations for trace_ds.c. */ extern FILE *tracef; const char *rcba(int baddr); const char *see_aid(unsigned char code); const char *see_attr(unsigned char fa); const char *see_color(unsigned char setting); const char *see_ebc(unsigned char ch); const char *see_efa(unsigned char efa, unsigned char value); const char *see_efa_only(unsigned char efa); const char *see_qcode(unsigned char id); void trace_ds(const char *fmt, ...); void vtrace(const char *fmt, ...); void vtrace_nts(const char *fmt, ...); void trace_pdb(unsigned char *buf, size_t len); void trace_pdc(unsigned char c); void trace_pds(unsigned char *buf); const char *unknown(unsigned char value); suite3270-3.6/Common/pr3287/xtable.c0000664000076500007650000002405713221577163015024 0ustar pdmpdm/* * Copyright (c) 2013, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287 custom translation table support (-xtable). */ #include "globals.h" #include #include "xtablec.h" /* Symbolically-named ASCII control characters. */ static struct { const char *name; int value; } cc[] = { { "bs", '\b' }, { "cr", '\r' }, { "bel", '\a' }, { "esc", 27 }, { "escape", 27 }, { "ff", '\f' }, { "ht", '\t' }, { "lf", 10 }, { "nl", 10 }, { "nul", 0 }, { "space", 32 }, { "tab", '\t' }, { "vt", '\v' }, { NULL, 0 } }; /* Translation table. */ #define MAX_EX 64 static struct { int len; /* -1 for no translation, 0 for empty translation */ unsigned char expansion[MAX_EX]; } xls[256]; static int xtable_initted = 0; /* * Expand 1-3 octal characters. * (*s) points to the first. * Point (*s) at the last. */ static char loct(char **s) { char *t = *s; char r = *t - '0'; if (*(t + 1) >= '0' && *(t + 1) <= '7') { r *= 8; r += *++t - '0'; if (*(t + 1) >= 0 && *(t + 1) < '7') { r *= 8; r += *++t - '0'; } } *s = t; return r; } /* * Translate a hex digit to 0..16. * Return -1 for an invalid digit. */ static int xdigit(char c) { if (c >= '0' && c <= '9') return c - '0'; else if (c >= 'a' && c <= 'f') return 10 + (c - 'a'); else if (c >= 'A' && c <= 'F') return 10 + (c - 'A'); else return -1; } /* * Expand 1-2 hex characters. * (*s) points to the character before the first. * Point (*s) at the last. */ static int lhex(char **s) { char *t = *s; char r = 0; int d; d = xdigit(*(t + 1)); if (d >= 0) { r = d; t++; d = xdigit(*(t + 1)); if (d >= 0) { r = (r * 16) + d; t++; } } else { return -1; } *s = t; return r; } #define is_white(c) ((c) == ' ' || (c) == '\t' || (c) == 'r' || (c) == '\n') #define is_delim(c) (is_white(c) || (c) == '\0') #define is_comment(s) (*(s) == '!' || *(s) == '#' || !strncmp(s, "//", 2)) /* Initialize the translation table. */ int xtable_init(const char *filename) { FILE *f; char buf[1024]; int lno = 0; int i; int rc = 0; /* Initialize the translation table. */ for (i = 0; i < 256; i++) xls[i].len = -1; /* We're initted well enough for xtable_lookup() to be called. */ xtable_initted = 1; /* Open the file. */ f = fopen(filename, "r"); if (f == NULL) { errmsg("%s: %s", filename, strerror(errno)); return -1; } /* Read it. */ while (fgets(buf, sizeof(buf), f) != NULL) { char *s; unsigned long ebc, asc; char *p; char xl[64]; int sx; lno++; s = buf; while (is_white(*s)) s++; /* Skip empty lines. */ if (!*s) continue; /* Skip comment lines. */ if (is_comment(s)) continue; /* * The format of a line is: * ebcdic EBCDIC-code ascii [ASCII-code]... * An EBCDIC code can be specified as: * X'nn' Hexadecimal * 0xnn Hexadecimal * 0nn Octal * nn Decimal * An ASCII code can be specified as: * 0xn Hexadecimal * 0n Octal * n Decimal * ^X Control code * CR NL LF FF NUL TAB SPACE ESC ESCAPE * More control codes * "text" Literal text * Named and literal characters are not supported on the EBCDIC * side because their definition depends on the host codepage. * Literal characters are supported on the ASCII side, though * their interpretation of single characters depends on the * local character set. */ /* Parse 'ebcdic'. */ if (strncasecmp(s, "ebcdic", strlen("ebcdic")) || !is_white(*(s + strlen("ebcdic")))) { errmsg("%s:%d: missing 'ebcdic' keyword", filename, lno); rc = -1; goto done; } s += strlen("ebcdic"); while (is_white(*s)) s++; /* Skip empty lines. */ if (!*s) continue; /* Skip comment lines. */ if (is_comment(s)) continue; /* Parse the EBCDIC code. */ if (!strncasecmp(s, "X'", 2)) { ebc = strtoul(s + 2, &p, 16); if (*p != '\'' || !is_delim(*(p + 1))) { errmsg("%s:%d: EBCDIC code X'nn' " "syntax error", filename, lno); rc = -1; goto done; } p++; } else { ebc = strtoul(s, &p, 0); if (!is_delim(*p)) { errmsg("%s:%d: EBCDIC code number " "syntax error", filename, lno); rc = -1; goto done; } } if (ebc < 64) { errmsg("%s:%d: EBCDIC code < 64", filename, lno); rc = -1; goto done; } if (ebc > 255) { errmsg("%s:%d: EBCDIC code > 255", filename, lno); rc = -1; goto done; } s = p; while (is_white(*s)) s++; /* Parse 'ascii'. */ if (strncasecmp(s, "ascii", strlen("ascii")) || !is_white(*(s + strlen("ascii")))) { errmsg("%s:%d: missing 'ascii' keyword", filename, lno); rc = -1; goto done; } s += strlen("ascii"); /* Skip empty lines. */ if (!*s) continue; /* Skip comment lines. */ if (is_comment(s)) continue; /* Parse the ASCII codes. */ sx = 0; while (*s) { while (is_white(*s)) s++; if (!*s || is_comment(s)) break; if (*s >= '0' && *s <= '9') { /* Looks like a number. */ asc = strtoul(s, &p, 0); if (!is_delim(*p)) { errmsg("%s:%d:%zd: number syntax " "error", filename, lno, s - buf + 1); rc = -1; goto done; } s = p; } else if (*s == '^') { /* Looks like a control character. */ if (*(s + 1) >= '@' && *(s + 1) <= '_' && is_delim(*(s + 2))) { asc = *(s + 1) - '@'; } else { errmsg("%s:%d:%zd: control character " "syntax error", filename, lno, s - buf + 1); rc = -1; goto done; } s += 2; } else if (*s == '"') { char *t; /* Quoted text. */ t = ++s; for (;;) { t = strchr(t, '"'); if (t != s && *(t - 1) == '\\') { t++; continue; } if (t == NULL || !is_delim(*(t + 1))) { errmsg("%s:%d:%zd: quoted " "text syntax error ", filename, lno, s - buf + 1); rc = -1; goto done; } break; } while (s < t) { int c = *s++; if (c == '\\') { switch (*s) { case '0': c = loct(&s); break; case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case 'x': c = lhex(&s); if (c < 0) { errmsg( "%s:%d:%zd: \\x syntax error ", filename, lno, s - buf + 1); rc = -1; goto done; } break; default: c = *s; break; } s++; } if ((size_t)sx > sizeof(xl)) { errmsg("%s:%d: too many " "(%d) ASCII characters", filename, lno, sx); rc = -1; goto done; } xl[sx++] = c; } /* Skip the trailing double quote. */ s++; /* * Don't fall through to the logic that adds * one character to the translation. */ continue; } else { int j; /* Might be a symbolic character. */ for (j = 0; cc[j].name != NULL; j++) { size_t sl = strlen(cc[j].name); if (!strncasecmp(cc[j].name, s, sl) && is_delim(s[sl])) { asc = cc[j].value; s += sl; break; } } if (cc[j].name == NULL) { errmsg("%s:%d:%zd: unknown token", filename, lno, s - buf + 1); rc = -1; goto done; } } if (asc > 255) { errmsg("%s:%d: ASCII code > 255", filename, lno); rc = -1; goto done; } if ((size_t)sx > sizeof(xl)) { errmsg("%s:%d: too many (%d) ASCII " "characters", filename, lno, sx); rc = -1; goto done; } xl[sx++] = (char)asc; } /* Save the translation. */ xls[ebc].len = sx; memcpy(xls[ebc].expansion, xl, sx); } #if defined(DUMP_TABLE) /*[*/ { int ebc; for (ebc = 0; ebc < 256; ebc++) { if (xls[ebc].len >= 0) { int k; printf("X'%02X' ->", ebc); for (k = 0; k < xls[ebc].len; k++) { printf(" 0x%02x", (unsigned char) xls[ebc].expansion[k]); } printf("\n"); } } fflush(stdout); /* for Windows */ } #endif /*]*/ done: fclose(f); return rc; } /* * Translate an EBCDIC code to ASCII, using the custom table. * Returns: * -1 no translation defined (use default table) * 0 expand to nothing * n expand to returned characters */ int xtable_lookup(unsigned char ebc, unsigned char **r) { if (!xtable_initted || ebc < 0x40) { *r = NULL; return -1; } if (xls[ebc].len > 0) { *r = xls[ebc].expansion; } else if (xls[ebc].len == 0) { *r = (unsigned char *)""; } else { *r = NULL; } return xls[ebc].len; } suite3270-3.6/Common/pr3287/xtablec.h0000664000076500007650000000326213221577163015167 0ustar pdmpdm/* * Copyright (c) 2013, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287 custom translation table support (-xtable). */ extern int xtable_init(const char *filename); extern int xtable_lookup(unsigned char ebc, unsigned char **r); suite3270-3.6/Common/print_gui_stubs.c0000664000076500007650000000330113221577163016005 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_gui_stubs.c * Stubs for the print text GUI. */ #include "globals.h" #include "print_gui.h" bool print_text_gui(bool use_file _is_unused) { return false; } suite3270-3.6/Common/print_screen.c0000664000076500007650000002621513221577163015271 0ustar pdmpdm/* * Copyright (c) 1994-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_screen.c * Screen printing functions. */ #include "globals.h" #include "appres.h" #include "3270ds.h" #include "ctlr.h" #include "ctlrc.h" #include #include "resources.h" #include "actions.h" #include "charset.h" #include "fprint_screen.h" #include "popups.h" #include "print_screen.h" #include "print_gui.h" #include "product.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #if defined(_WIN32) /*[*/ # include # include # include "w3misc.h" # include "winprint.h" #endif /*]*/ /* Typedefs */ /* Globals */ /* Statics */ /* Print Text popup */ #if !defined(_WIN32) /*[*/ /* Termination code for print text process. */ static void print_text_done(FILE *f) { int status; status = pclose(f); if (status) { popup_an_error("Print program exited with status %d.", (status & 0xff00) > 8); } else { if (appres.interactive.do_confirms) { popup_an_info("Screen image printed."); } } } #endif /*]*/ /** * Default caption. * * @return caption text */ char * default_caption(void) { static char *r = NULL; #if !defined(_WIN32) /*[*/ /* Unix version: username@host %T% */ char hostname[132]; char *user; gethostname(hostname, sizeof(hostname)); hostname[sizeof(hostname) - 1] = '\0'; user = getenv("USER"); if (user == NULL) { user = "(unknown)"; } if (r != NULL) { Free(r); } r = xs_buffer("%s @ %s %%T%%", user, hostname); #else /*][*/ char *username; char *computername; char *userdomain; char ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; username = getenv("USERNAME"); if (username == NULL) { username = "(unknown)"; } computername = getenv("COMPUTERNAME"); if (computername == NULL) { DWORD size = MAX_COMPUTERNAME_LENGTH + 1; if (GetComputerName(ComputerName, &size)) { computername = ComputerName; } else { computername = "(unknown)"; } } userdomain = getenv("USERDOMAIN"); if (userdomain == NULL) { userdomain = "(unknown)"; } if (r != NULL) { Free(r); } if (strcasecmp(userdomain, computername)) { r = xs_buffer("%s\\%s @ %s %%T%%", userdomain, username, computername); } else { r = xs_buffer("%s @ %s %%T%%", username, computername); } #endif return r; } /* Print or save the contents of the screen as text. */ bool PrintText_action(ia_t ia, unsigned argc, const char **argv) { unsigned i; const char *name = NULL; bool secure = appres.secure; ptype_t ptype = P_TEXT; bool use_file = false; bool use_string = false; bool replace = false; char *temp_name = NULL; unsigned opts = FPS_EVEN_IF_EMPTY; const char *caption = NULL; FILE *f; int fd = -1; fps_status_t status; if (!product_has_display()) { opts |= FPS_NO_DIALOG; } action_debug("PrintText", ia, argc, argv); /* * Pick off optional arguments: * file directs the output to a file instead of a command; * must be the last keyword * html generates HTML output instead of ASCII text (and implies * 'file') * rtf generates RTF output instead of ASCII text (and implies * 'file') * gdi prints to a GDI printer (Windows only) * nodialog skip print dialog (Windows only) * this is the default for ws3270 * dialog use print dialog (Windows only) * this is the default for wc3270 * replace replace the file * append append to the file, if it exists (default) * wordpad prints via WordPad (wc3270 only) * modi print modified fields in italics * caption "text" * Adds caption text above the screen * %T% is replaced by a timestamp * secure disables the pop-up dialog, if this action is invoked from * a keymap (x3270 only) * command directs the output to a command (this is the default, but * allows the command to be one of the other keywords); * must be the last keyword * string returns the data as a string, allowed only from scripts */ for (i = 0; i < argc; i++) { if (!strcasecmp(argv[i], "file")) { use_file = true; i++; break; } else if (!strcasecmp(argv[i], "html")) { ptype = P_HTML; use_file = true; } else if (!strcasecmp(argv[i], "rtf")) { ptype = P_RTF; use_file = true; } else if (!strcasecmp(argv[i], "replace")) { replace = true; } else if (!strcasecmp(argv[i], "append")) { replace = false; } #if defined(_WIN32) /*[*/ else if (!strcasecmp(argv[i], "gdi")) { ptype = P_GDI; } else if (!strcasecmp(argv[i], "wordpad")) { ptype = P_RTF; } else if (!strcasecmp(argv[i], "nodialog")) { opts |= FPS_NO_DIALOG; } else if (!strcasecmp(argv[i], "dialog")) { opts &= ~FPS_NO_DIALOG; } #endif /*]*/ else if (!strcasecmp(argv[i], "secure")) { secure = true; } else if (!strcasecmp(argv[i], "command")) { if ((ptype != P_TEXT) || use_file) { popup_an_error("PrintText: contradictory options"); return false; } i++; break; } else if (!strcasecmp(argv[i], "string")) { if (ia_cause != IA_SCRIPT) { popup_an_error("PrintText(string) can only be used from a " "script"); return false; } use_string = true; use_file = true; } else if (!strcasecmp(argv[i], "modi")) { opts |= FPS_MODIFIED_ITALIC; } else if (!strcasecmp(argv[i], "caption")) { if (i == argc - 1) { popup_an_error("PrintText: mising caption parameter"); return false; } caption = argv[++i]; } else { break; } } switch (argc - i) { case 0: /* Use the default. */ if (!use_file) { #if !defined(_WIN32) /*[*/ name = get_resource(ResPrintTextCommand); #else /*][*/ name = get_resource(ResPrinterName); /* XXX */ #endif /*]*/ } break; case 1: if (use_string) { popup_an_error("PrintText: extra arguments or invalid option(s)"); return false; } name = argv[i]; break; default: popup_an_error("PrinText: extra arguments or invalid option(s)"); return false; } #if defined(_WIN32) /*[*/ /* On Windows, use GDI as the default. */ if (!use_string && !use_file && ptype == P_TEXT) { ptype = P_GDI; } #endif /*]*/ if (name != NULL && name[0] == '@') { /* * Starting the PrintTextCommand resource value with '@' * suppresses the pop-up dialog, as does setting the 'secure' * resource. */ secure = true; name++; } if (!use_file && (name == NULL || !*name)) { #if !defined(_WIN32) /*[*/ name = "lpr"; #else /*][*/ name = NULL; #endif /*]*/ } /* See if the GUI wants to handle it. */ if (!secure && print_text_gui(use_file)) { return true; } /* Do the real work. */ if (use_file) { if (use_string) { #if defined(_WIN32) /*[*/ fd = win_mkstemp(&temp_name, ptype); #else /*][*/ temp_name = NewString("/tmp/x3hXXXXXX"); fd = mkstemp(temp_name); #endif /*]*/ if (fd < 0) { popup_an_errno(errno, "mkstemp"); return false; } f = fdopen(fd, "w+"); vtrace("PrintText: using '%s'\n", temp_name); } else { if (name == NULL || !*name) { popup_an_error("PrintText: missing filename"); return false; } f = fopen(name, replace? "w": "a"); } } else { #if !defined(_WIN32) /*[*/ f = popen(name, "w"); #else /*][*/ fd = win_mkstemp(&temp_name, ptype); if (fd < 0) { popup_an_errno(errno, "mkstemp"); return false; } if (ptype == P_GDI) { f = fdopen(fd, "wb+"); } else { f = fdopen(fd, "w+"); } vtrace("PrintText: using '%s'\n", temp_name); #endif /*]*/ } if (f == NULL) { popup_an_errno(errno, "PrintText: %s", name); if (fd >= 0) { (void) close(fd); } if (temp_name) { unlink(temp_name); Free(temp_name); } return false; } /* Captions look nice on GDI, so create a default one. */ if (ptype == P_GDI && caption == NULL) { caption = default_caption(); } status = fprint_screen(f, ptype, opts, caption, name); switch (status) { case FPS_STATUS_SUCCESS: case FPS_STATUS_SUCCESS_WRITTEN: vtrace("PrintText: printing succeeded.\n"); break; case FPS_STATUS_ERROR: popup_an_error("Screen print failed."); /* fall through */ case FPS_STATUS_CANCEL: if (status == FPS_STATUS_CANCEL) { vtrace("PrintText: printing canceled.\n"); } fclose(f); if (temp_name) { unlink(temp_name); Free(temp_name); } return false; } if (use_string) { char buf[8192]; /* Print to string. */ fflush(f); rewind(f); while (fgets(buf, sizeof(buf), f) != NULL) { action_output("%s", buf); } fclose(f); unlink(temp_name); Free(temp_name); return true; } if (use_file) { /* Print to specified file. */ fclose(f); return true; } /* Print to printer. */ #if !defined(_WIN32) /*[*/ print_text_done(f); #else /*][*/ fclose(f); if (ptype == P_RTF) { if (product_has_display()) { /* Run WordPad to print the file, asynchronusly. */ start_wordpad_async("PrintText", temp_name, name); } else { /* Run WordPad to print the file, synchronusly. */ start_wordpad_sync("PrintText", temp_name, name); unlink(temp_name); } } else if (ptype == P_GDI) { /* All done with the temp file. */ unlink(temp_name); } if (appres.interactive.do_confirms) { popup_an_info("Screen image printing.\n"); } #endif /*]*/ Free(temp_name); return true; } /** * Print screen module registration. */ void print_screen_register(void) { static action_table_t print_text_actions[] = { { "PrintText", PrintText_action, ACTION_KE } }; /* Register the actions. */ register_actions(print_text_actions, array_count(print_text_actions)); } suite3270-3.6/Common/product_stubs1.c0000664000076500007650000000331213221577163015550 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * product_stubs1.c * Stub functions for product information. */ #include "globals.h" #include "product.h" /* By default, there is no display. */ bool product_has_display(void) { return false; } suite3270-3.6/Common/product_stubs2.c0000664000076500007650000000336713221577163015563 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * product_stubs2.c * Stub functions for product information. */ #include "globals.h" #include "product.h" /* By default, there is are no product-specific build options. */ const char * product_specific_build_options(void) { return NULL; } suite3270-3.6/Common/product_stubs3.c0000664000076500007650000000324513221577163015557 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * product_stubs3.c * Stub functions for product information. */ #include "globals.h" #include "product.h" bool product_auto_oversize(void) { return false; } suite3270-3.6/Common/product_stubs4.c0000664000076500007650000000323113221577163015553 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * product_stubs4.c * Stub functions for product information. */ #include "globals.h" #include "product.h" void product_set_appres_defaults(void) { } suite3270-3.6/Common/proxy.c0000664000076500007650000005166513221577163013766 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * proxy.c * This module implements various kinds of proxies. */ #include "globals.h" #if !defined(_WIN32) /*[*/ #include #include #include #include # if defined(HAVE_SYS_SELECT_H) /*[*/ # include /* fd_set declaration */ # endif /*]*/ #endif /*]*/ #include "3270ds.h" #include "popups.h" #include "proxy.h" #include "proxy_names.h" #include "resolver.h" #include "telnet_core.h" #include "trace.h" #include "utils.h" #include "w3misc.h" /* * Supported proxy types. * * At some point we will add SOCKS. */ enum { PT_NONE, PT_PASSTHRU,/* Sun telnet-passthru */ PT_HTTP, /* RFC 2817 CONNECT tunnel */ PT_TELNET, /* 'connect host port' proxy */ PT_SOCKS4, /* SOCKS version 4 (or 4A if necessary) */ PT_SOCKS4A, /* SOCKS version 4A (force remote name resolution) */ PT_SOCKS5, /* SOCKS version 5 (RFC 1928) */ PT_SOCKS5D, /* SOCKS version 5 (force remote name resolution) */ PT_MAX } proxytype_t; /* proxy type names -- keep these in sync with proxytype_t! */ char *type_name[] = { "unknown", "passthru", "HTTP", "TELNET", "SOCKS4", "SOCKS4A", "SOCKS5", "SOCKS5D" }; static bool parse_host_port(char *s, char **phost, char **pport); static bool proxy_passthru(socket_t fd, char *host, unsigned short port); static bool proxy_http(socket_t fd, char *host, unsigned short port); static bool proxy_telnet(socket_t fd, char *host, unsigned short port); static bool proxy_socks4(socket_t fd, char *host, unsigned short port, int force_a); static bool proxy_socks5(socket_t fd, char *host, unsigned short port, int force_d); char * proxy_type_name(int type) { if (type < 1 || type >= PT_MAX) { return "unknown"; } else { return type_name[type]; } } /* * Resolve the type, hostname and port for a proxy. * Returns -1 for failure, 0 for no proxy, >0 (the proxy type) for success. */ int proxy_setup(const char *proxy, char **phost, char **pport) { char *colon; size_t sl; if (proxy == NULL) { return PT_NONE; } if ((colon = strchr(proxy, ':')) == NULL || (colon == proxy)) { popup_an_error("Invalid proxy syntax"); return -1; } sl = colon - proxy; if (sl == strlen(PROXY_PASSTHRU) && !strncasecmp(proxy, PROXY_PASSTHRU, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { *pport = NewString(PORT_PASSTHRU); } return PT_PASSTHRU; } if (sl == strlen(PROXY_HTTP) && !strncasecmp(proxy, PROXY_HTTP, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { *pport = NewString(PORT_HTTP); } return PT_HTTP; } if (sl == strlen(PROXY_TELNET) && !strncasecmp(proxy, PROXY_TELNET, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { popup_an_error("Must specify port for telnet proxy"); return -1; } return PT_TELNET; } if (sl == strlen(PROXY_SOCKS4) && !strncasecmp(proxy, PROXY_SOCKS4, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { *pport = NewString(PORT_SOCKS4); } return PT_SOCKS4; } if (sl == strlen(PROXY_SOCKS4A) && !strncasecmp(proxy, PROXY_SOCKS4A, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { *pport = NewString(PORT_SOCKS4A); } return PT_SOCKS4A; } if (sl == strlen(PROXY_SOCKS5) && !strncasecmp(proxy, PROXY_SOCKS5, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { *pport = NewString(PORT_SOCKS5); } return PT_SOCKS5; } if (sl == strlen(PROXY_SOCKS5D) && !strncasecmp(proxy, PROXY_SOCKS5D, sl)) { if (!parse_host_port(colon + 1, phost, pport)) { return -1; } if (*pport == NULL) { *pport = NewString(PORT_SOCKS5D); } return PT_SOCKS5D; } popup_an_error("Invalid proxy type '%.*s'", (int)sl, proxy); return -1; } /* * Parse host[:port] from a string. * 'host' can be in square brackets to allow numeric IPv6 addresses. * Returns the host name and port name in heap memory. * Returns false for failure, true for success. */ static bool parse_host_port(char *s, char **phost, char **pport) { char *colon; char *hstart; size_t hlen; if (*s == '[') { char *rbrack; /* Hostname in square brackets. */ hstart = s + 1; rbrack = strchr(s, ']'); if (rbrack == NULL || rbrack == s + 1 || (*(rbrack + 1) != '\0' && *(rbrack + 1) != ':')) { popup_an_error("Invalid proxy hostname syntax"); return false; } if (*(rbrack + 1) == ':') { colon = rbrack + 1; } else { colon = NULL; } hlen = rbrack - (s + 1); } else { hstart = s; colon = strchr(s, ':'); if (colon == s) { popup_an_error("Invalid proxy hostname syntax"); return false; } if (colon == NULL) { hlen = strlen(s); } else { hlen = colon - s; } } /* Parse the port. */ if (colon == NULL || !*(colon + 1)) { *pport = NULL; } else { *pport = NewString(colon + 1); } /* Copy out the hostname. */ *phost = Malloc(hlen + 1); strncpy(*phost, hstart, hlen); (*phost)[hlen] = '\0'; return true; } /* * Negotiate with the proxy server. * Returns false for failure, true for success. */ bool proxy_negotiate(int type, socket_t fd, char *host, unsigned short port) { switch (type) { case PT_NONE: return 0; case PT_PASSTHRU: return proxy_passthru(fd, host, port); case PT_HTTP: return proxy_http(fd, host, port); case PT_TELNET: return proxy_telnet(fd, host, port); case PT_SOCKS4: return proxy_socks4(fd, host, port, 0); case PT_SOCKS4A: return proxy_socks4(fd, host, port, 1); case PT_SOCKS5: return proxy_socks5(fd, host, port, 0); case PT_SOCKS5D: return proxy_socks5(fd, host, port, 1); default: return false; } } /* Sun PASSTHRU proxy. */ static bool proxy_passthru(socket_t fd, char *host, unsigned short port) { char *buf; buf = xs_buffer("%s %u\r\n", host, port); vtrace("Passthru Proxy: xmit '%.*s'", (int)(strlen(buf) - 2), buf); trace_netdata('>', (unsigned char *)buf, strlen(buf)); if (send(fd, buf, (int)strlen(buf), 0) < 0) { popup_a_sockerr("Passthru Proxy: send error"); Free(buf); return false; } Free(buf); return true; } /* HTTP (RFC 2817 CONNECT tunnel) proxy. */ static bool proxy_http(socket_t fd, char *host, unsigned short port) { char *buf; char *colon; char rbuf[1024]; int nr; int nread = 0; char *space; /* Send the CONNECT request. */ colon = strchr(host, ':'); buf = xs_buffer("CONNECT %s%s%s:%u HTTP/1.1\r\n", (colon? "[": ""), host, (colon? "]": ""), port); vtrace("HTTP Proxy: xmit '%.*s'\n", (int)(strlen(buf) - 2), buf); trace_netdata('>', (unsigned char *)buf, strlen(buf)); if (send(fd, buf, (int)strlen(buf), 0) < 0) { popup_a_sockerr("HTTP Proxy: send error"); Free(buf); return false; } Free(buf); buf = xs_buffer("Host: %s%s%s:%u\r\n", (colon? "[": ""), host, (colon? "]": ""), port); vtrace("HTTP Proxy: xmit '%.*s'\n", (int)(strlen(buf) - 2), buf); trace_netdata('>', (unsigned char *)buf, strlen(buf)); if (send(fd, buf, (int)strlen(buf), 0) < 0) { popup_a_sockerr("HTTP Proxy: send error"); Free(buf); return false; } Free(buf); buf = "\r\n"; vtrace("HTTP Proxy: xmit ''\n"); trace_netdata('>', (unsigned char *)buf, strlen(buf)); if (send(fd, buf, (int)strlen(buf), 0) < 0) { popup_a_sockerr("HTTP Proxy: send error"); return false; } /* * Process the reply. * Read a byte at a time until \n or EOF. */ for (;;) { fd_set rfds; struct timeval tv; FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 15; tv.tv_usec = 0; if (select((int)(fd + 1), &rfds, NULL, NULL, &tv) < 0) { popup_an_error("HTTP Proxy: server timeout"); if (nread) { trace_netdata('<', (unsigned char *)rbuf, nread); } return false; } nr = recv(fd, &rbuf[nread], 1, 0); if (nr < 0) { popup_a_sockerr("HTTP Proxy: receive error"); if (nread) { trace_netdata('<', (unsigned char *)rbuf, nread); } return false; } if (nr == 0) { if (nread) { trace_netdata('<', (unsigned char *)rbuf, nread); } popup_an_error("HTTP Proxy: unexpected EOF"); return false; } if (rbuf[nread] == '\r') { continue; } if (rbuf[nread] == '\n') { break; } if ((size_t)++nread >= sizeof(rbuf)) { nread = sizeof(rbuf) - 1; break; } } rbuf[nread] = '\0'; trace_netdata('<', (unsigned char *)rbuf, nread); vtrace("HTTP Proxy: recv '%s'\n", rbuf); if (strncmp(rbuf, "HTTP/", 5) || (space = strchr(rbuf, ' ')) == NULL) { popup_an_error("HTTP Proxy: unrecognized reply"); return false; } if (*(space + 1) != '2') { popup_an_error("HTTP Proxy: CONNECT failed:\n%s", rbuf); return false; } return 0; } /* TELNET proxy. */ static bool proxy_telnet(socket_t fd, char *host, unsigned short port) { char *buf; buf = xs_buffer("connect %s %u\r\n", host, port); vtrace("TELNET Proxy: xmit '%.*s'", (int)(strlen(buf) - 2), buf); trace_netdata('>', (unsigned char *)buf, strlen(buf)); if (send(fd, buf, (int)strlen(buf), 0) < 0) { popup_a_sockerr("TELNET Proxy: send error"); Free(buf); return false; } Free(buf); return true; } /* SOCKS version 4 proxy. */ static bool proxy_socks4(socket_t fd, char *host, unsigned short port, int force_a) { struct hostent *hp; struct in_addr ipaddr; int use_4a = 0; char *user; char *buf; char *s; char rbuf[8]; int nr; int nread = 0; unsigned short rport; /* Resolve the hostname to an IPv4 address. */ if (force_a) { use_4a = 1; } else { hp = gethostbyname(host); if (hp != NULL) { memcpy(&ipaddr, hp->h_addr, hp->h_length); } else { ipaddr.s_addr = inet_addr(host); if (ipaddr.s_addr == (in_addr_t)-1) { use_4a = 1; } } } /* Resolve the username. */ user = getenv("USER"); if (user == NULL) { user = "nobody"; } /* Send the request to the server. */ if (use_4a) { buf = Malloc(32 + strlen(user) + strlen(host)); s = buf; *s++ = 0x04; *s++ = 0x01; SET16(s, port); SET32(s, 0x00000001); strcpy(s, user); s += strlen(user) + 1; strcpy(s, host); s += strlen(host) + 1; vtrace("SOCKS4 Proxy: version 4 connect port %u address 0.0.0.1 user " "'%s' host '%s'\n", port, user, host); trace_netdata('>', (unsigned char *)buf, s - buf); if (send(fd, buf, (int)(s - buf), 0) < 0) { popup_a_sockerr("SOCKS4 Proxy: send error"); Free(buf); return false; } Free(buf); } else { unsigned long u; buf = Malloc(32 + strlen(user)); s = buf; *s++ = 0x04; *s++ = 0x01; SET16(s, port); u = ntohl(ipaddr.s_addr); SET32(s, u); strcpy(s, user); s += strlen(user) + 1; vtrace("SOCKS4 Proxy: xmit version 4 connect port %u address %s user " "'%s'\n", port, inet_ntoa(ipaddr), user); trace_netdata('>', (unsigned char *)buf, s - buf); if (send(fd, buf, (int)(s - buf), 0) < 0) { Free(buf); popup_a_sockerr("SOCKS4 Proxy: send error"); return false; } Free(buf); } /* * Process the reply. * Read 8 bytes of response. */ for (;;) { fd_set rfds; struct timeval tv; FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 15; tv.tv_usec = 0; if (select((int)(fd + 1), &rfds, NULL, NULL, &tv) < 0) { popup_an_error("SOCKS4 Proxy: server timeout"); return false; } nr = recv(fd, &rbuf[nread], 1, 0); if (nr < 0) { popup_a_sockerr("SOCKS4 Proxy: receive error"); return false; } if (nr == 0) { break; } if ((size_t)++nread >= sizeof(rbuf)) { break; } } trace_netdata('<', (unsigned char *)rbuf, nread); if (use_4a) { struct in_addr a; rport = (rbuf[2] << 8) | rbuf[3]; memcpy(&a, &rbuf[4], 4); vtrace("SOCKS4 Proxy: recv status 0x%02x port %u address %s\n", rbuf[1], rport, inet_ntoa(a)); } else { vtrace("SOCKS4 Proxy: recv status 0x%02x\n", rbuf[1]); } switch (rbuf[1]) { case 0x5a: break; case 0x5b: popup_an_error("SOCKS4 Proxy: request rejected or failed"); return false; case 0x5c: popup_an_error("SOCKS4 Proxy: client is not reachable"); return false; case 0x5d: popup_an_error("SOCKS4 Proxy: userid error"); return false; default: popup_an_error("SOCKS4 Proxy: unknown status 0x%02x", rbuf[1]); return false; } return true; } /* SOCKS version 5 (RFC 1928) proxy. */ static bool proxy_socks5(socket_t fd, char *host, unsigned short port, int force_d) { union { struct sockaddr sa; struct sockaddr_in sin; #if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sin6; #endif /*]*/ } ha; socklen_t ha_len = 0; int use_name = 0; char *buf; char *s; unsigned char rbuf[8]; int nr; int nread = 0; int n2read = 0; char nbuf[256]; int done = 0; char *atype_name[] = { "", "IPv4", "", "domainname", "IPv6" }; unsigned char *portp; unsigned short rport; if (force_d) { use_name = 1; } else { char *errmsg; rhp_t rv; /* Resolve the hostname. */ rv = resolve_host_and_port(host, NULL, 0, &rport, &ha.sa, &ha_len, &errmsg, NULL); if (rv == RHP_CANNOT_RESOLVE) { use_name = 1; } else if (RHP_IS_ERROR(rv)) { popup_an_error("SOCKS5 proxy: %s/%u: %s", host, port, errmsg); return false; } } /* Send the authentication request to the server. */ strcpy((char *)rbuf, "\005\001\000"); vtrace("SOCKS5 Proxy: xmit version 5 nmethods 1 (no auth)\n"); trace_netdata('>', rbuf, 3); if (send(fd, (char *)rbuf, 3, 0) < 0) { popup_a_sockerr("SOCKS5 Proxy: send error"); return false; } /* * Wait for the server reply. * Read 2 bytes of response. */ nread = 0; for (;;) { fd_set rfds; struct timeval tv; FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 15; tv.tv_usec = 0; if (select((int)(fd + 1), &rfds, NULL, NULL, &tv) < 0) { popup_an_error("SOCKS5 Proxy: server timeout"); if (nread) { trace_netdata('<', rbuf, nread); } return false; } nr = recv(fd, (char *)&rbuf[nread], 1, 0); if (nr < 0) { popup_a_sockerr("SOCKS5 Proxy: receive error"); if (nread) { trace_netdata('<', rbuf, nread); } return false; } if (nr == 0) { popup_a_sockerr("SOCKS5 Proxy: unexpected EOF"); if (nread) { trace_netdata('<', rbuf, nread); } return false; } if (++nread >= 2) { break; } } trace_netdata('<', rbuf, nread); if (rbuf[0] != 0x05 || (rbuf[1] != 0 && rbuf[1] != 0xff)) { popup_an_error("SOCKS5 Proxy: bad authentication response"); return false; } vtrace("SOCKS5 Proxy: recv version %d method %d\n", rbuf[0], rbuf[1]); if (rbuf[1] == 0xff) { popup_an_error("SOCKS5 Proxy: authentication failure"); return false; } /* Send the request to the server. */ buf = Malloc(32 + strlen(host)); s = buf; *s++ = 0x05; /* protocol version 5 */ *s++ = 0x01; /* CONNECT */ *s++ = 0x00; /* reserved */ if (use_name) { *s++ = 0x03; /* domain name */ *s++ = (char)strlen(host); strcpy(s, host); s += strlen(host); } else if (ha.sa.sa_family == AF_INET) { *s++ = 0x01; /* IPv4 */ memcpy(s, &ha.sin.sin_addr, 4); s += 4; strcpy(nbuf, inet_ntoa(ha.sin.sin_addr)); #if defined(X3270_IPV6) /*[*/ } else { *s++ = 0x04; /* IPv6 */ memcpy(s, &ha.sin6.sin6_addr, sizeof(struct in6_addr)); s += sizeof(struct in6_addr); (void) inet_ntop(AF_INET6, &ha.sin6.sin6_addr, nbuf, sizeof(nbuf)); #endif /*]*/ } SET16(s, port); vtrace("SOCKS5 Proxy: xmit version 5 connect %s %s port %u\n", use_name? "domainname": ((ha.sa.sa_family == AF_INET)? "IPv4": "IPv6"), use_name? host: nbuf, port); trace_netdata('>', (unsigned char *)buf, s - buf); if (send(fd, buf, (int)(s - buf), 0) < 0) { popup_a_sockerr("SOCKS5 Proxy: send error"); Free(buf); return false; } Free(buf); /* * Process the reply. * Only the first two bytes of the response are interesting; * skip the rest. */ nread = 0; done = 0; buf = NULL; while (!done) { fd_set rfds; struct timeval tv; unsigned char r; FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 15; tv.tv_usec = 0; if (select((int)(fd + 1), &rfds, NULL, NULL, &tv) < 0) { popup_an_error("SOCKS5 Proxy: server timeout"); return false; } nr = recv(fd, (char *)&r, 1, 0); if (nr < 0) { popup_a_sockerr("SOCKS5 Proxy: receive error"); if (nread) { trace_netdata('<', (unsigned char *)buf, nread); } return false; } if (nr == 0) { popup_an_error("SOCKS5 Proxy: unexpected EOF"); if (nread) { trace_netdata('<', (unsigned char *)buf, nread); } return false; } buf = Realloc(buf, nread + 1); buf[nread] = r; switch (nread++) { case 0: if (r != 0x05) { popup_an_error("SOCKS5 Proxy: incorrect reply version 0x%02x", r); if (nread) { trace_netdata('<', (unsigned char *)buf, nread); } return false; } break; case 1: if (r != 0x00) { trace_netdata('<', (unsigned char *)buf, nread); } switch (r) { case 0x00: break; case 0x01: popup_an_error("SOCKS5 Proxy: server failure"); return false; case 0x02: popup_an_error("SOCKS5 Proxy: connection not allowed"); return false; case 0x03: popup_an_error("SOCKS5 Proxy: network unreachable"); return false; case 0x04: popup_an_error("SOCKS5 Proxy: host unreachable"); return false; case 0x05: popup_an_error("SOCKS5 Proxy: connection refused"); return false; case 0x06: popup_an_error("SOCKS5 Proxy: ttl expired"); return false; case 0x07: popup_an_error("SOCKS5 Proxy: command not supported"); return false; case 0x08: popup_an_error("SOCKS5 Proxy: address type not supported"); return false; default: popup_an_error("SOCKS5 Proxy: unknown server error 0x%02x", r); return false; } break; case 2: break; case 3: switch (r) { case 0x01: n2read = 6; break; case 0x03: n2read = -1; break; #if defined(X3270_IPV6) /*[*/ case 0x04: n2read = sizeof(struct in6_addr) + 2; break; #endif /*]*/ default: popup_an_error("SOCKS5 Proxy: unknown server address type " "0x%02x", r); if (nread) { trace_netdata('<', (unsigned char *)buf, nread); } return false; } break; default: if (n2read == -1) { n2read = r + 2; } else if (!--n2read) { done = 1; } break; } } trace_netdata('<', (unsigned char *)buf, nread); switch (buf[3]) { case 0x01: /* IPv4 */ memcpy(&ha.sin.sin_addr, &buf[4], 4); strcpy(nbuf, inet_ntoa(ha.sin.sin_addr)); portp = (unsigned char *)&buf[4 + 4]; break; case 0x03: /* domainname */ strncpy(nbuf, &buf[5], buf[4]); nbuf[(unsigned char)buf[4]] = '\0'; portp = (unsigned char *)&buf[5 + (unsigned char)buf[4]]; break; #if defined(X3270_IPV6) /*[*/ case 0x04: /* IPv6 */ memcpy(&ha.sin6.sin6_addr, &buf[4], sizeof(struct in6_addr)); (void) inet_ntop(AF_INET6, &ha.sin6.sin6_addr, nbuf, sizeof(nbuf)); portp = (unsigned char *)&buf[4 + sizeof(struct in6_addr)]; break; #endif /*]*/ default: /* can't happen */ nbuf[0] = '\0'; portp = (unsigned char *)buf; break; } rport = (*portp << 8) + *(portp + 1); vtrace("SOCKS5 Proxy: recv version %d status 0x%02x address %s %s " "port %u\n", buf[0], buf[1], atype_name[(unsigned char)buf[3]], nbuf, rport); Free(buf); return true; } suite3270-3.6/Common/readres.c0000664000076500007650000001161013221577163014214 0ustar pdmpdm/* * Copyright (c) 2009, 2013-2016 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * readres.c * A displayless 3270 Terminal Emulator * Resource file reader. */ #include "globals.h" #include #include "glue.h" #include "readres.h" #include "utils.h" /* * Make sure a resource definition begins with the application name, then * split it into the name and the value. */ int validate_and_split_resource(const char *where, const char *arg, const char **left, size_t *rnlenp, const char **right) { size_t match_len; size_t rnlen; const char *s = arg; static char *me_dot = NULL; static char *me_star = NULL; static size_t me_len = 0; if (me_dot == NULL) { me_dot = xs_buffer("%s.", app); me_star = xs_buffer("%s*", app); me_len = strlen(me_dot); } /* Enforce "-3270." or "-3270*" or "*". */ if (!strncmp(s, me_dot, me_len)) { match_len = me_len; } else if (!strncmp(arg, me_star, me_len)) { match_len = me_len; } else if (arg[0] == '*') { match_len = 1; } else { xs_warning("%s: Invalid resource syntax '%.*s', name must begin with " "'%s'", where, (int)me_len, arg, me_dot); return -1; } /* Separate the parts. */ s = arg + match_len; while (*s && *s != ':' && !isspace((unsigned char)*s)) { s++; } rnlen = s - (arg + match_len); if (!rnlen) { xs_warning("%s: Invalid resource syntax, missing resource name", where); return -1; } while (isspace((unsigned char)*s)) { s++; } if (*s != ':') { xs_warning("%s: Invalid resource syntax, missing ':'", where); return -1; } s++; while (isspace((unsigned char)*s)) { s++; } /* Return what we got. */ *left = arg + match_len; *rnlenp = rnlen; *right = s; return 0; } /* Read resources from a file. */ bool read_resource_filex(const char *filename, bool fatal) { FILE *f; size_t ilen; char buf[4096]; char *where; int lno = 0; f = fopen(filename, "r"); if (f == NULL) { if (fatal) { xs_warning("Cannot open '%s': %s", filename, strerror(errno)); } return false; } /* Merge in what's in the file into the resource database. */ ilen = 0; while (fgets(buf + ilen, (int)(sizeof(buf) - ilen), f) != NULL || ilen) { char *s; size_t sl; bool bsl = false; lno++; /* Stip any trailing newline. */ sl = strlen(buf + ilen); if (sl && (buf + ilen)[sl-1] == '\n') { (buf + ilen)[--sl] = '\0'; } /* Check for a trailing backslash. */ s = buf + ilen; if ((sl > 0) && (s[sl - 1] == '\\')) { s[sl - 1] = '\0'; bsl = true; } /* Skip leading whitespace. */ s = buf; while (isspace((unsigned char)*s)) { s++; } /* If this line is a continuation, try again. */ if (bsl) { ilen += strlen(buf + ilen); if ((unsigned)ilen >= sizeof(buf) - 1) { xs_warning("%s:%d: Line too long\n", filename, lno); break; } continue; } /* Skip comments. */ if (*s == '!') { ilen = 0; continue; } if (*s == '#') { xs_warning("%s:%d: Invalid profile syntax ('#' ignored)", filename, lno); ilen = 0; continue; } /* Strip trailing whitespace and check for empty lines. */ sl = strlen(s); while (sl && isspace((unsigned char)s[sl-1])) { s[--sl] = '\0'; } if (!sl) { ilen = 0; continue; } /* Digest it. */ where = xs_buffer("%s:%d", filename, lno); parse_xrm(s, where); Free(where); /* Get ready for the next iteration. */ ilen = 0; } fclose(f); return true; } suite3270-3.6/Common/resolver.c0000664000076500007650000002050013221577163014426 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2014-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * resolver.c * Hostname resolution. */ #include "globals.h" #if !defined(_WIN32) /*[*/ #include #include #include #endif /*]*/ #include #include "lazya.h" #include "resolver.h" #if defined(_WIN32) /*[*/ # include "w3misc.h" # include "winvers.h" #endif /*]*/ #if defined(X3270_IPV6) /*[*/ /* * Resolve a hostname and port using getaddrinfo, allowing IPv4 or IPv6. * Returns RHP_SUCCESS for success, RHP_FATAL for fatal error (name resolution * impossible), RHP_CANNOT_RESOLVE for simple error (cannot resolve the name). * * XXX: Apparently getaddrinfo does not range-check a numeric service. */ static rhp_t resolve_host_and_port_v46(const char *host, char *portname, int ix, unsigned short *pport, struct sockaddr *sa, socklen_t *sa_len, char **errmsg, int *lastp) { struct addrinfo hints, *res0, *res; int rc; /* getaddrinfo() does not appear to range-check the port. Do that here. */ if (portname != NULL) { unsigned long l; if ((l = strtoul(portname, NULL, 0)) && (l & ~0xffffL)) { if (errmsg) { *errmsg = lazyaf("%s/%s:\n%s", host, portname, "Invalid port"); } return RHP_CANNOT_RESOLVE; } } (void) memset(&hints, '\0', sizeof(struct addrinfo)); hints.ai_flags = 0; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; rc = getaddrinfo(host, portname, &hints, &res0); if (rc != 0) { if (errmsg) { *errmsg = lazyaf("%s/%s:\n%s", host, portname? portname: "(none)", gai_strerror(rc)); } return RHP_CANNOT_RESOLVE; } res = res0; /* * Return the reqested element. * Hopefully the list will not change between calls. */ while (ix && res->ai_next != NULL) { res = res->ai_next; ix--; } if (res == NULL) { /* Ran off the end? The list must have changed. */ if (errmsg) { *errmsg = lazyaf("%s/%s:\n%s", host, portname? portname: "(none)", gai_strerror(EAI_AGAIN)); } freeaddrinfo(res); return RHP_CANNOT_RESOLVE; } switch (res->ai_family) { case AF_INET: *pport = ntohs(((struct sockaddr_in *) res->ai_addr)->sin_port); break; case AF_INET6: *pport = ntohs(((struct sockaddr_in6 *) res->ai_addr)->sin6_port); break; default: if (errmsg) { *errmsg = lazyaf("%s:\nunknown family %d", host, res->ai_family); } freeaddrinfo(res); return RHP_FATAL; } (void) memcpy(sa, res->ai_addr, res->ai_addrlen); *sa_len = (socklen_t)res->ai_addrlen; if (lastp != NULL) { *lastp = (res->ai_next == NULL); } freeaddrinfo(res0); return RHP_SUCCESS; } #endif /*]*/ #if !defined(X3270_IPV6) /*[*/ /* * Resolve a hostname and port using gethostbyname and getservbyname, and * allowing only IPv4. * Returns RHP_SUCCESS for success, RHP_FATAL for fatal error (name resolution * impossible), RHP_CANNOT_RESOLVE for simple error (cannot resolve the name). */ static rhp_t resolve_host_and_port_v4(const char *host, char *portname, int ix, unsigned short *pport, struct sockaddr *sa, socklen_t *sa_len, char **errmsg, int *lastp) { struct hostent *hp; struct servent *sp; unsigned short port; unsigned long lport; char *ptr; struct sockaddr_in *sin = (struct sockaddr_in *)sa; /* Get the port number. */ lport = strtoul(portname, &ptr, 0); if (ptr == portname || *ptr != '\0' || lport == 0L || lport & ~0xffff) { if (!(sp = getservbyname(portname, "tcp"))) { if (errmsg) { *errmsg = lazyaf("Unknown port number or service: %s", portname); } return RHP_FATAL; } port = sp->s_port; } else { port = htons((unsigned short)lport); } *pport = ntohs(port); /* Use gethostbyname() to resolve the hostname. */ hp = gethostbyname(host); if (hp == (struct hostent *) 0) { sin->sin_family = AF_INET; sin->sin_addr.s_addr = inet_addr(host); if (sin->sin_addr.s_addr == INADDR_NONE) { if (errmsg) { *errmsg = lazyaf("Unknown host:\n%s", host); } return RHP_CANNOT_RESOLVE; } if (lastp != NULL) { *lastp = true; } } else { int i; for (i = 0; i < ix; i++) { if (hp->h_addr_list[i] == NULL) { if (errmsg) { *errmsg = lazyaf("Unknown host:\n%s", host); } return RHP_CANNOT_RESOLVE; } } sin->sin_family = hp->h_addrtype; (void) memmove(&sin->sin_addr, hp->h_addr_list[i], hp->h_length); if (lastp != NULL) { *lastp = (hp->h_addr_list[i + 1] == NULL); } } sin->sin_port = port; *sa_len = sizeof(struct sockaddr_in); return RHP_SUCCESS; } #endif /*]*/ /* * Resolve a hostname and port. * Returns RHP_SUCCESS for success, RHP_FATAL for fatal error (name resolution * impossible), RHP_CANNOT_RESOLVE for simple error (cannot resolve the name). */ rhp_t resolve_host_and_port(const char *host, char *portname, int ix, unsigned short *pport, struct sockaddr *sa, socklen_t *sa_len, char **errmsg, int *lastp) { #if !defined(X3270_IPV6) /*[*/ return resolve_host_and_port_v4(host, portname, ix, pport, sa, sa_len, errmsg, lastp); #else /*][*/ return resolve_host_and_port_v46(host, portname, ix, pport, sa, sa_len, errmsg, lastp); #endif } #if defined(X3270_IPV6) /*[*/ /* * Resolve a sockaddr into a numeric hostname and port, IPv4 or IPv6. * Returns true for success, false for failure. */ # if defined(_WIN32) /*[*/ # define LEN DWORD # else /*][*/ # define LEN size_t # endif /*]*/ static bool numeric_host_and_port_v46(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, char **errmsg) { int rc; /* Use getnameinfo(). */ rc = getnameinfo(sa, salen, host, (LEN)hostlen, serv, (LEN)servlen, NI_NUMERICHOST | NI_NUMERICSERV); if (rc != 0) { if (errmsg) { *errmsg = lazyaf("%s", gai_strerror(rc)); } return false; } return true; } #endif /*]*/ #if !defined(X3270_IPV6) /*[*/ /* * Resolve a sockaddr into a numeric hostname and port, IPv4 only. * Returns true for success, false for failure. */ static bool numeric_host_and_port_v4(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, char **errmsg) { struct sockaddr_in *sin = (struct sockaddr_in *)sa; /* Use inet_ntoa() and snprintf(). */ snprintf(host, hostlen, "%s", inet_ntoa(sin->sin_addr)); snprintf(serv, servlen, "%u", ntohs(sin->sin_port)); return true; } #endif /*]*/ /* * Resolve a sockaddr into a numeric hostname and port. * Returns Trur for success, false for failure. */ bool numeric_host_and_port(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, char **errmsg) { #if !defined(X3270_IPV6) /*[*/ return numeric_host_and_port_v4(sa, salen, host, hostlen, serv, servlen, errmsg); #else /*][*/ return numeric_host_and_port_v46(sa, salen, host, hostlen, serv, servlen, errmsg); #endif /*]*/ } suite3270-3.6/Common/rpq.c0000664000076500007650000005165013221577163013401 0ustar pdmpdm/* * Copyright (c) 2005-2009, 2013-2016 Paul Mattes. * Copyright (c) 2004-2005, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * rpq.c * RPQNAMES structured field support. * */ #include "globals.h" #include #if !defined(_WIN32) /*[*/ # include # include # include #endif /*]*/ #include #include "3270ds.h" #include "ctlrc.h" #include "popups.h" #include "sf.h" /* has to come before rpq.h */ #include "rpq.h" #include "tables.h" #include "telnet.h" #include "telnet_core.h" #include "trace.h" #include "unicodec.h" /* Statics */ static bool select_rpq_terms(void); static int get_rpq_timezone(void); static size_t get_rpq_user(unsigned char buf[], const size_t buflen); #if !defined(_WIN32) /*[*/ static size_t get_rpq_address(unsigned char buf[], const size_t buflen); #endif /*]*/ static void rpq_warning(const char *fmt, ...); static void rpq_dump_warnings(void); static bool rpq_complained = false; #if !defined(_WIN32) /*[*/ static bool omit_due_space_limit = false; #endif /*]*/ /* * Define symbolic names for RPQ self-defining terms. * (Numbering is arbitrary, but must be 0-255 inclusive. * Do not renumber existing items because these identify the * self-defining term to the mainframe software. Changing pre-existing * values will possibly impact host based software. */ #define RPQ_ADDRESS 0 #define RPQ_TIMESTAMP 1 #define RPQ_TIMEZONE 2 #define RPQ_USER 3 #define RPQ_VERSION 4 /* * Define a table of RPQ self-defing terms. * NOTE: Synonyms could be specified by coding different text items but using * the same "id" value. * Items should be listed in alphabetical order by "text" name so if the user * specifies abbreviations, they work in a predictable manner. E.g., "TIME" * should match TIMESTAMP instead of TIMEZONE. */ static struct rpq_keyword { bool omit; /* set from X3270RPQ="kw1:kw2..." environment var */ size_t oride; /* displacement */ const bool allow_oride; const unsigned char id; const char *text; } rpq_keywords[] = { {true, 0, true, RPQ_ADDRESS, "ADDRESS"}, {true, 0, false, RPQ_TIMESTAMP, "TIMESTAMP"}, {true, 0, true, RPQ_TIMEZONE, "TIMEZONE"}, {true, 0, true, RPQ_USER, "USER"}, {true, 0, false, RPQ_VERSION, "VERSION"}, }; #define NS_RPQ (sizeof(rpq_keywords)/sizeof(rpq_keywords[0])) static char *x3270rpq; /* * RPQNAMES query reply. */ void do_qr_rpqnames(void) { # define TERM_PREFIX_SIZE 2 /* Each term has 1 byte length and 1 byte id */ unsigned char *rpql, *p_term; unsigned j; int term_id; size_t i, x; size_t remaining = 254; /* maximum data area for rpqname reply */ bool omit_due_space_limit; trace_ds("> QueryReply(RPQNames)\n"); /* * Allocate enough space for the maximum allowed item. * By pre-allocating the space I don't have to worry about the * possibility of addresses changing. */ space3270out(4+4+1+remaining); /* Maximum space for an RPQNAME item */ SET32(obptr, 0); /* Device number, 0 = All */ SET32(obptr, 0); /* Model number, 0 = All */ rpql = obptr++; /* Save address to place data length. */ /* * Create fixed length portion - program id: x3270 * This is known 8-bit text so we can use asc2ebc0 to translate it. */ for (j = 0; j < 5; j++) { *obptr++ = asc2ebc0[(int)"x3270"[j]]; remaining--; } /* Create user selected variable-length self-defining terms. */ select_rpq_terms(); for (j = 0; j < NS_RPQ; j++) { if (rpq_keywords[j].omit) { continue; } omit_due_space_limit = false; term_id = rpq_keywords[j].id; p_term = obptr; /* save starting address (to insert length later) */ obptr++; /* skip length of term, fill in later */ *obptr++ = term_id; /* identify this term */ /* * Adjust remaining space by the term prefix size so each case * can use the "remaining" space without concern for the * prefix. This subtraction is accounted for after the item * is built and the updated remaining space is determined. */ remaining -= TERM_PREFIX_SIZE; switch (term_id) { /* build the term based on id */ case RPQ_USER: /* User text from env. vars */ obptr += get_rpq_user(obptr, remaining); break; case RPQ_TIMEZONE: /* UTC time offset */ omit_due_space_limit = (remaining < 2); if (!omit_due_space_limit) { SET16(obptr, get_rpq_timezone()); } break; case RPQ_ADDRESS: /* Workstation address */ #if !defined(_WIN32) /*[*/ obptr += get_rpq_address(obptr, remaining); #endif /*]*/ break; case RPQ_VERSION: /* program version */ /* * Note: It is legal to use asc2ebc0 to translate the * build string from ASCII to EBCDIC because the build * string is always generated in the "C" locale. */ x = strlen(build_rpq_version); omit_due_space_limit = (x > remaining); if (!omit_due_space_limit) { for (i = 0; i < x; i++) { *obptr++ = asc2ebc0[(int)(*(build_rpq_version+i) & 0xff)]; } } break; case RPQ_TIMESTAMP: /* program build time (yyyymmddhhmmss bcd) */ x = strlen(build_rpq_timestamp); omit_due_space_limit = ((x + 1) / 2 > remaining); if (!omit_due_space_limit) { for (i = 0; i < x; i += 2) { *obptr++ = ((*(build_rpq_timestamp+i) - '0') << 4) + (*(build_rpq_timestamp+i+1) - '0'); } } break; default: /* unsupported ID, (can't happen) */ Error("Unsupported RPQ term"); break; } if (omit_due_space_limit) rpq_warning("RPQ %s term omitted due to insufficient space", rpq_keywords[j].text); /* * The item is built, insert item length as needed and * adjust space remaining. * obptr now points at "next available byte". */ x = obptr-p_term; if (x > TERM_PREFIX_SIZE) { *p_term = (unsigned char)x; remaining -= x; /* This includes length and id fields, correction below */ } else { /* We didn't add an item after all, reset pointer. */ obptr = p_term; } /* * When we calculated the length of the term, a few lines * above, that length included the term length and term id * prefix too. (TERM_PREFIX_SIZE) * But just prior to the switch statement, we decremented the * remaining space by that amount so subsequent routines would * be told how much space they have for their data, without * each routine having to account for that prefix. * That means the remaining space is actually more than we * think right now, by the length of the prefix.... add that * back so the remaining space is accurate. * * And... if there was no item added, we still have to make the * same correction to "claim back" the term prefix area so it * may be used by the next possible term. */ remaining += TERM_PREFIX_SIZE; } /* Fill in overall length of RPQNAME info */ *rpql = (unsigned char)(obptr - rpql); rpq_dump_warnings(); } /* Utility function used by the RPQNAMES query reply. */ static bool select_rpq_terms(void) { size_t i; unsigned j,k; size_t len; char *uplist; char *p1, *p2; char *kw; bool is_no_form; /* See if the user wants any rpqname self-defining terms returned */ if ((x3270rpq = getenv("X3270RPQ")) == NULL) { return false; } /* * Make an uppercase copy of the user selections so I can match * keywords more easily. * If there are override values, I'll get those from the ORIGINAL * string so upper/lower case is preserved as necessary. */ uplist = (char *) malloc(strlen(x3270rpq)+1); assert(uplist != NULL); p1 = uplist; p2 = x3270rpq; do { *p1++ = toupper((unsigned char)*p2++); } while (*p2); *p1 = '\0'; for (i = 0; i < strlen(x3270rpq); ) { kw = uplist+i; i++; if (isspace((unsigned char)*kw)) { continue; /* skip leading white space */ } if (*kw == ':') { continue; } /* : separates terms, but \: is literal : */ p1 = kw; do { p1 = strchr(p1+1,':'); if (p1 == NULL) break; } while (*(p1-1) == '\\'); /* p1 points to the : separating a term, or is NULL */ if (p1 != NULL) *p1 = '\0'; /* kw is now a string of the entire, single term. */ i = (kw - uplist) + strlen(kw) + 1; /* It might be a keyword=value item... */ for (p1 = kw; *p1; p1++) { if (!isupper((unsigned char)*p1)) { break; } } len = p1-kw; is_no_form = ((len > 2) && (strncmp("NO", kw, 2) == 0)); if (is_no_form) { kw += 2; /* skip "NO" prefix for matching keyword */ len -= 2; /* adjust keyword length */ } for (j = 0; j < NS_RPQ; j++) { if (strncmp(kw, rpq_keywords[j].text, len) == 0) { rpq_keywords[j].omit = is_no_form; if (*p1 == '=') { if (rpq_keywords[j].allow_oride) { rpq_keywords[j].oride = p1 - uplist + 1; } else { rpq_warning("RPQ %s term override ignored", p1); } } break; } } if (j >= NS_RPQ) { /* unrecognized keyword... */ if (strcmp(kw,"ALL") == 0) { for (k = 0; k < NS_RPQ; k++) { rpq_keywords[k].omit = is_no_form; } } else { rpq_warning("RPQ term \"%s\" is unrecognized", kw); } } } free(uplist); /* * Return to caller with indication (T/F) of any items * to be selected (T) or are all terms suppressed? (F) */ for (i = 0; i < NS_RPQ; i++) { if (!rpq_keywords[i].omit) { return true; } } return false; } /* Utility function used by the RPQNAMES query reply. */ static int get_rpq_timezone(void) { /* * Return the signed number of minutes we're offset from UTC. * Example: North America Pacific Standard Time = UTC - 8 Hours, so we * return (-8) * 60 = -480. * Since the smallest variance between two timezones is 15 minutes, * use small, positive values to represent various errors: * 1 - Cannot determine local calendar time * 2 - Cannot determine UTC * 3 - Difference exceeds 12 hours * 4 - User override is invalid */ time_t here; struct tm here_tm; struct tm *utc_tm; double delta; char *p1, *p2; struct rpq_keyword *kw; /* id isn't necessarily the table index... locate item */ for (kw = &rpq_keywords[0]; kw -> id != RPQ_TIMEZONE; kw++) { } /* Is there a user override? */ if ((kw->allow_oride) && (kw->oride > 0)) { ldiv_t hhmm; long x; p1 = x3270rpq + kw->oride; x = strtol(p1, &p2, 10); if (errno != 0) { rpq_warning("RPQ TIMEZONE term is invalid - use +/-hhmm"); return 4; } if ((*p2 != '\0') && (*p2 != ':') && (!isspace((unsigned char)*p2))) { return 4; } hhmm = ldiv(x, 100L); if (hhmm.rem > 59L) { rpq_warning("RPQ TIMEZONE term is invalid - use +/-hhmm"); return 4; } delta = (labs(hhmm.quot) * 60L) + hhmm.rem; if (hhmm.quot < 0L) delta = -delta; } else { /* * No override specified, try to get information from the system. */ if ((here = time(NULL)) == (time_t)(-1)) { rpq_warning("RPQ: Unable to determine workstation local time"); return 1; } memcpy(&here_tm, localtime(&here), sizeof(struct tm)); if ((utc_tm = gmtime(&here)) == NULL) { rpq_warning("RPQ: Unable to determine workstation UTC time"); return 2; } /* * Do not take Daylight Saving Time into account. * We just want the "raw" time difference. */ here_tm.tm_isdst = 0; utc_tm->tm_isdst = 0; delta = difftime(mktime(&here_tm), mktime(utc_tm)) / 60L; } /* sanity check: difference cannot exceed +/- 12 hours */ if (labs((long)delta) > 720L) { rpq_warning("RPQ timezone exceeds 12 hour UTC offset"); } return (labs((long)delta) > 720L)? 3 : (int) delta; } /* Utility function used by the RPQNAMES query reply. */ static size_t get_rpq_user(unsigned char buf[], const size_t buflen) { /* * Text may be specified in one of two ways, but not both. * An environment variable provides the user interface: * - X3270RPQ: Keyword USER= * * NOTE: If the string begins with 0x then no ASCII/EBCDIC * translation is done. The hex characters will be sent as true hex * data. E.g., X3270RPQ="user=0x ab 12 EF" will result in 3 bytes * sent as 0xAB12EF. White space is optional in hex data format. * When hex format is required, the 0x prefix must be the first two * characters of the string. E.g., X3270RPQ="user= 0X AB" will * result in 6 bytes sent as 0x40F0E740C1C2 because the text is * accepted "as is" then translated from ASCII to EBCDIC. */ const char *rpqtext = NULL; size_t x = 0; struct rpq_keyword *kw; char *sbuf, *sbuf0; const char *s; enum me_fail error; int xlen; /* id isn't necessarily the table index... locate item */ for (kw = &rpq_keywords[0]; kw -> id != RPQ_USER; kw++) { } if ((!kw->allow_oride) || (kw->oride <= 0)) { return 0; } rpqtext = x3270rpq + kw->oride; if ((*rpqtext == '0') && (toupper((unsigned char)*(rpqtext+1)) == 'X')) { /* Text has 0x prefix... interpret as hex, no translation */ char hexstr[512]; /* more than enough room to copy */ char *p_h; char c; bool is_first_hex_digit; p_h = &hexstr[0]; /* * Copy the hex digits from X3270RPQ, removing white * space, and using all upper case for the hex digits a-f. */ rpqtext += 2; /* skip 0x prefix */ for (*p_h = '\0'; *rpqtext; rpqtext++) { c = toupper((unsigned char)*rpqtext); if ((c==':') || (c=='\0')) { break; } if (isspace((unsigned char)c)) { continue; /* skip white space */ } if (!isxdigit((unsigned char)c)) { rpq_warning("RPQ USER term has non-hex character"); break; } x = (p_h - hexstr) / 2; if (x >= buflen) { x = buflen; rpq_warning("RPQ USER term truncated after %d bytes", x); break; /* too long, truncate */ } *p_h++ = c; /* copy (upper case) character */ *p_h = '\0'; /* keep string properly terminated */ } /* * 'hexstr' is now a character string of 0-9, A-F only, * (a-f were converted to upper case). * There may be an odd number of characters, implying a leading * 0. The string is also known to fit in the area specified. */ /* * Hex digits are handled in pairs, set a flag so we keep track * of which hex digit we're currently working with. */ is_first_hex_digit = ((strlen(hexstr) % 2) == 0); if (!is_first_hex_digit) { rpq_warning("RPQ USER term has odd number of hex digits"); } *buf = 0; /* initialize first byte for possible implied leading zero */ for (p_h = &hexstr[0]; *p_h; p_h++) { int n; /* convert the hex character to a value 0-15 */ n = isdigit((unsigned char)*p_h) ? *p_h - '0' : *p_h - 'A' + 10; if (is_first_hex_digit) { *buf = n << 4; } else { *buf++ |= n; } is_first_hex_digit = !is_first_hex_digit; } return (strlen(hexstr) + 1) / 2; } /* plain text - subject to ascii/ebcdic translation */ /* * Copy the source string to a temporary buffer, terminating on * ':', unless preceded by '\'. */ sbuf = sbuf0 = Malloc(strlen(rpqtext) + 1); for (s = rpqtext; *s && (*s != ':'); s++) { if (*s == '\\' && *(s + 1)) { *sbuf++ = *++s; } else { *sbuf++ = *s; } } *sbuf = '\0'; /* Translate multibyte to EBCDIC in the target buffer. */ xlen = multibyte_to_ebcdic_string(sbuf0, strlen(sbuf0), buf, buflen, &error); if (xlen < 0) { rpq_warning("RPQ USER term translation error"); if (buflen) { *buf = asc2ebc0['?']; x = 1; } } else { x = xlen; } Free(sbuf0); return x; } #if !defined(_WIN32) /*[*/ static size_t get_rpq_address(unsigned char *buf, const size_t maxlen) { struct rpq_keyword *kw; size_t x = 0; if (maxlen < 2) { omit_due_space_limit = true; return 0; } /* id isn't necessarily the table index... locate item */ for (kw = &rpq_keywords[0]; kw->id != RPQ_ADDRESS; kw++) { } /* Is there a user override? */ if ((kw->allow_oride) && (kw->oride > 0)) { char *p1, *p2, *rpqtext; # if defined(X3270_IPV6) /*[*/ struct addrinfo *res; int ga_err; # else /*][*/ in_addr_t ia; # endif /*]*/ p1 = x3270rpq + kw->oride; rpqtext = (char *) malloc(strlen(p1) + 1); for (p2 = rpqtext; *p1; p2++) { if (*p1 == ':') { break; } if ((*p1 == '\\') && (*(p1 + 1) == ':')) { p1++; } *p2 = *p1; p1++; } *p2 = '\0'; # if defined(X3270_IPV6) /*[*/ ga_err = getaddrinfo(rpqtext, NULL, NULL, &res); if (ga_err == 0) { void *src = NULL; int len = 0; SET16(buf, res->ai_family); x += 2; switch (res->ai_family) { case AF_INET: src = &((struct sockaddr_in *)res->ai_addr)->sin_addr; len = sizeof(struct in_addr); break; case AF_INET6: src = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr; len = sizeof(struct in6_addr); break; default: rpq_warning("RPQ ADDRESS term has unrecognized family %u", res->ai_family); break; } if (x + len <= maxlen) { x += len; (void) memcpy(buf, src, len); } else { rpq_warning("RPQ ADDRESS term incomplete due to space limit"); } /* Give back storage obtained by getaddrinfo */ freeaddrinfo(res); } else { rpq_warning("RPQ: can't resolve '%s': %s", rpqtext, gai_strerror(ga_err)); } # else /*][*/ /* * No IPv6 support. * Use plain old inet_addr() and gethostbyname(). */ ia = inet_addr(rpqtext); if (ia == htonl(INADDR_NONE)) { struct hostent *h; h = gethostbyname(rpqtext); if (h == NULL || h->h_addrtype != AF_INET) { rpq_warning("RPQ: gethostbyname error"); return 0; } (void) memcpy(&ia, h->h_addr_list[0], h->h_length); } SET16(buf, AF_INET); x += 2; if (x + (int)sizeof(in_addr_t) <= maxlen) { (void) memcpy(buf, &ia, sizeof(in_addr_t)); x += sizeof(in_addr_t); } else { rpq_warning("RPQ ADDRESS term incomplete due to space limit"); } # endif /*]*/ free(rpqtext); } else { /* No override... get our address from the actual socket */ union { struct sockaddr sa; struct sockaddr_in sa4; # if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sa6; # endif /*]*/ } u; int addrlen = sizeof(u); void *src = NULL; int len = 0; if (net_getsockname(&u, &addrlen) < 0) { return 0; } SET16(buf, u.sa.sa_family); x += 2; switch (u.sa.sa_family) { case AF_INET: src = &u.sa4.sin_addr; len = sizeof(struct in_addr); break; # if defined(X3270_IPV6) /*[*/ case AF_INET6: src = &u.sa6.sin6_addr; len = sizeof(struct in6_addr); break; # endif /*]*/ default: rpq_warning("RPQ ADDRESS term has unrecognized family %u", u.sa.sa_family); break; } if (x + len <= maxlen) { (void) memcpy(buf, src, len); x += len; } else { rpq_warning("RPQ ADDRESS term incomplete due to space limit"); } } return x; } #endif /*]*/ #define RPQ_WARNBUF_SIZE 1024 static char *rpq_warnbuf = NULL; static int rpq_wbcnt = 0; static void rpq_warning(const char *fmt, ...) { va_list a; /* Only accumulate RPQ warnings if they have not been displayed already. */ if (!rpq_complained) { va_start(a, fmt); if (rpq_warnbuf == NULL) { rpq_warnbuf = Malloc(RPQ_WARNBUF_SIZE); } if (rpq_wbcnt < RPQ_WARNBUF_SIZE) { *(rpq_warnbuf + rpq_wbcnt++) = '\n'; *(rpq_warnbuf + rpq_wbcnt) = '\0'; } if (rpq_wbcnt < RPQ_WARNBUF_SIZE) { rpq_wbcnt += vsnprintf(rpq_warnbuf + rpq_wbcnt, RPQ_WARNBUF_SIZE - rpq_wbcnt, fmt, a); } va_end(a); } } static void rpq_dump_warnings(void) { /* If there's something to complain about, only complain once. */ if (!rpq_complained && rpq_wbcnt) { popup_an_error("%s", rpq_warnbuf); rpq_wbcnt = 0; rpq_complained = true; free(rpq_warnbuf); rpq_warnbuf = NULL; } } suite3270-3.6/Common/s3270.c0000664000076500007650000002252213221577163013351 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR * GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * s3270.c * A displayless 3270 Terminal Emulator * Main proceudre. */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include # include #endif /*]*/ #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "actions.h" #include "bind-opt.h" #include "charset.h" #include "ctlrc.h" #include "unicodec.h" #include "ft.h" #include "glue.h" #include "host.h" #include "httpd-core.h" #include "httpd-nodes.h" #include "httpd-io.h" #include "idle.h" #include "kybd.h" #include "macros.h" #include "nvt.h" #include "opts.h" #include "popups.h" #include "print_screen.h" #include "product.h" #include "screen.h" #include "selectc.h" #include "sio.h" #include "telnet.h" #include "toggles.h" #include "trace.h" #include "utils.h" #include "xio.h" #if defined(_WIN32) /*[*/ # include "w3misc.h" # include "windirs.h" # include "winvers.h" #endif /*]*/ #if defined(_WIN32) /*[*/ char *instdir = NULL; char *mydesktop = NULL; char *mydocs3270 = NULL; char *commondocs3270 = NULL; unsigned windirs_flags; #endif /*]*/ static void check_min_version(const char *min_version); static void s3270_register(void); void usage(const char *msg) { if (msg != NULL) { fprintf(stderr, "%s\n", msg); } fprintf(stderr, "Usage: %s [options] [ps:][LUname@]hostname[:port]\n", programname); fprintf(stderr, "Options:\n"); cmdline_help(false); exit(1); } static void s3270_connect(bool ignored) { if (CONNECTED || appres.disconnect_clear) { ctlr_erase(true); } } int main(int argc, char *argv[]) { const char *cl_hostname = NULL; #if defined(_WIN32) /*[*/ (void) get_version_info(); if (!get_dirs("wc3270", &instdir, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &windirs_flags)) { exit(1); } if (sockstart() < 0) { exit(1); } #endif /*]*/ /* * Call the module registration functions, to build up the tables of * actions, options and callbacks. */ ctlr_register(); ft_register(); host_register(); idle_register(); kybd_register(); macros_register(); nvt_register(); print_screen_register(); s3270_register(); toggles_register(); trace_register(); xio_register(); sio_register(); argc = parse_command_line(argc, (const char **)argv, &cl_hostname); if (appres.min_version != NULL) { check_min_version(appres.min_version); } if (charset_init(appres.charset) != CS_OKAY) { xs_warning("Cannot find charset \"%s\"", appres.charset); (void) charset_init(NULL); } model_init(); ctlr_init(-1); ctlr_reinit(-1); idle_init(); if (appres.httpd_port) { struct sockaddr *sa; socklen_t sa_len; if (!parse_bind_opt(appres.httpd_port, &sa, &sa_len)) { xs_warning("Invalid -httpd port \"%s\"", appres.httpd_port); } else { httpd_objects_init(); hio_init(sa, sa_len); } } ft_init(); hostfile_init(); #if !defined(_WIN32) /*[*/ /* Make sure we don't fall over any SIGPIPEs. */ (void) signal(SIGPIPE, SIG_IGN); #endif /*]*/ /* Handle initial toggle settings. */ initialize_toggles(); /* Connect to the host. */ if (cl_hostname != NULL) { if (!host_connect(cl_hostname)) { exit(1); } /* Wait for negotiations to complete or fail. */ while (!IN_NVT && !IN_3270) { (void) process_events(true); if (!PCONNECTED) { exit(1); } } } /* Prepare to run a peer script. */ peer_script_init(); /* Process events forever. */ while (1) { (void) process_events(true); #if !defined(_WIN32) /*[*/ if (children && waitpid(-1, (int *)0, WNOHANG) > 0) { --children; } #endif /*]*/ } } /** * Set product-specific appres defaults. */ void product_set_appres_defaults(void) { appres.scripted = true; appres.oerr_lock = true; appres.unlock_delay = false; } /** * Parse a version number. * Version numbers are of the form: .text, such as * 3.4ga10 (3, 4, 10) * 3.5apha3 (3, 5, 3) * The version can be under-specified, e.g.: * 3.4 (3, 4, 0) * 3 (3, 0, 0) * Numbers are limited to 0..999. * @param[in] text String to decode. * @param[out] major Major number. * @param[out] minor Minor number. * @param[out] iteration Iteration. * * @return true if parse successful. */ #define MAX_VERSION 999 static bool parse_version(const char *text, int *major, int *minor, int *iteration) { const char *t = text; unsigned long n; char *ptr; *major = 0; *minor = 0; *iteration = 0; /* Parse the major number. */ n = strtoul(t, &ptr, 10); if (ptr == t || (*ptr != '.' && *ptr != '\0') || n > MAX_VERSION) { return false; } *major = (int)n; if (*ptr == '\0') { /* Just a major number. */ return true; } /* Parse the minor number. */ t = ptr + 1; n = strtoul(t, &ptr, 10); if (ptr == text || n > MAX_VERSION) { return false; } *minor = (int)n; if (*ptr == '\0') { /* Just a major and minor number. */ return true; } /* Parse the iteration. */ t = ptr; while (!isdigit((unsigned char)*t) && *t != '\0') { t++; } if (*t == '\0') { return false; } n = strtoul(t, &ptr, 10); if (ptr == t || *ptr != '\0' || n > MAX_VERSION) { return false; } *iteration = (int)n; return true; } /** * Check the requested version against the actual version. * @param[in] min_version Desired minimum version */ static void check_min_version(const char *min_version) { int our_major, our_minor, our_iteration; int min_major, min_minor, min_iteration; /* Parse our version. */ if (!parse_version(build_rpq_version, &our_major, &our_minor, &our_iteration)) { fprintf(stderr, "Internal error: Can't parse version: %s\n", build_rpq_version); exit(1); } /* Parse the desired version. */ if (!parse_version(min_version, &min_major, &min_minor, &min_iteration)) { fprintf(stderr, "Invalid %s: %s\n", ResMinVersion, min_version); exit(1); } /* Compare. */ if (our_major < min_major || our_minor < min_minor || our_iteration < min_iteration) { fprintf(stderr, "Version %s < requested %s, aborting\n", build_rpq_version, min_version); exit(1); } } /** * Main module registration. */ static void s3270_register(void) { static opt_t s3270_opts[] = { { OptScripted, OPT_NOP, false, ResScripted, NULL, NULL, "Turn on scripting" }, { OptUtf8, OPT_BOOLEAN, true, ResUtf8, aoffset(utf8), NULL, "Force local codeset to be UTF-8" }, { OptMinVersion,OPT_STRING, false, ResMinVersion,aoffset(min_version), "", "Fail unless at this version or greater" } }; static res_t s3270_resources[] = { { ResIdleCommand,aoffset(idle_command), XRM_STRING }, { ResIdleCommandEnabled,aoffset(idle_command_enabled),XRM_BOOLEAN }, { ResIdleTimeout,aoffset(idle_timeout), XRM_STRING } }; static xres_t s3270_xresources[] = { { ResPrintTextScreensPerPage, V_FLAT }, #if defined(_WIN32) /*[*/ { ResPrinterCodepage, V_FLAT }, { ResPrinterName, V_FLAT }, { ResPrintTextFont, V_FLAT }, { ResPrintTextHorizontalMargin, V_FLAT }, { ResPrintTextOrientation, V_FLAT }, { ResPrintTextSize, V_FLAT }, { ResPrintTextVerticalMargin, V_FLAT }, #else /*][*/ { ResPrintTextCommand, V_FLAT }, #endif /*]*/ }; /* Register for state changes. */ register_schange(ST_CONNECT, s3270_connect); register_schange(ST_3270_MODE, s3270_connect); /* Register our options. */ register_opts(s3270_opts, array_count(s3270_opts)); /* Register our resources. */ register_resources(s3270_resources, array_count(s3270_resources)); register_xresources(s3270_xresources, array_count(s3270_xresources)); } suite3270-3.6/Common/s3270/localdefs.h0000664000076500007650000000346313221577163015315 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * localdefs.h * Local definitions for s3270. * * This file contains definitions for environment-specific * facilities, such as memory allocation, I/O registration, * and timers. */ /* Identify ourselves. */ #define S3270 1 #if defined(_WIN32) /*[*/ # define WS3270 1 #endif /*]*/ suite3270-3.6/Common/save_stubs.c0000664000076500007650000000312613221577163014750 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * save_stubs.c * Stubs for save.c. */ void save_yourself(void) { } suite3270-3.6/Common/screen_stubs1.c0000664000076500007650000000403713221577163015354 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen_stubs1.c * Stubs for screen.c when there is no display at all. * * These are defined by x3270, c3270 and wc3270, but not by * anything else. * * Other screen stubs that are common to everything but x3270 * are in screen_stubs2. */ #include "globals.h" #include "ctlr.h" #include "screen.h" void cursor_move(int baddr) { cursor_addr = baddr; } bool screen_selected(int baddr _is_unused) { return false; } void ring_bell(void) { } void screen_disp(bool erasing _is_unused) { } void screen_flip(void) { } suite3270-3.6/Common/screen_stubs2.c0000664000076500007650000000437113221577163015356 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen_stubs2.c * Stubs for screen.c when there is a non-graphical display or * no display at all. */ #include "globals.h" #include "screen.h" static int cw = 7; int *char_width = &cw; static int ch = 7; int *char_height = &ch; void blink_start(void) { } unsigned display_heightMM(void) { return 100; } unsigned display_height(void) { return 1; } unsigned display_widthMM(void) { return 100; } unsigned display_width(void) { return 1; } void mcursor_locked(void) { } void mcursor_normal(void) { } void mcursor_waiting(void) { } bool screen_obscured(void) { return false; } void screen_scroll(void) { } unsigned long screen_window_number(void) { return 0L; } bool screen_has_bg_color(void) { return true; } suite3270-3.6/Common/screen_stubs3.c0000664000076500007650000000322213221577163015351 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen_stubs3.c * Stubs for screen.c. */ #include "globals.h" #include "screen.h" void screen_132(void) { } void screen_80(void) { } suite3270-3.6/Common/screen_stubs4.c0000664000076500007650000000331513221577163015355 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen_stubs4.c * Stubs for screen.c. */ #include "globals.h" #include "screen.h" bool screen_new_display_charsets(const char *realname, const char *csnames) { return true; /* success */ } suite3270-3.6/Common/screen_stubs5.c0000664000076500007650000000321113221577163015351 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen_stubs4.c * Stubs for screen functions. */ #include "globals.h" #include "screen.h" void screen_system_fixup(void) { } suite3270-3.6/Common/screen_stubs6.c0000664000076500007650000000322613221577163015360 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen_stubs5.c * Stubs for screen functions. */ #include "globals.h" #include "screen.h" bool screen_suspend(void) { return false; } suite3270-3.6/Common/scroll.c0000664000076500007650000002645213221577163014077 0ustar pdmpdm/* * Copyright (c) 1994-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * scroll.c * Scrollbar support */ #include "globals.h" #include "appres.h" #include "ctlr.h" #include "3270ds.h" #include "actions.h" #include "ctlrc.h" #include "kybd.h" #include "popups.h" #include "screen.h" #include "scroll.h" #include "selectc.h" #include "status.h" #include "trace.h" /* Globals */ bool scroll_initted = false; /* Statics */ /* Saved screens. */ static struct ea **ea_save = (struct ea **) NULL; /* Number of lines saved. */ static int n_saved = 0; static int scroll_next = 0; static int scrolled_back = 0; static bool need_saving = true; static bool vscreen_swapped = false; static char *sbuf = NULL; static int sa_bufsize; static char *zbuf = NULL; /* Thumb state: */ /* Fraction of blank area above thumb (0.0 to 1.0) */ static float thumb_top = 0.0; /* How much blank area there is, above and below the thumb (maximum possible * value for thumb_top) */ static float thumb_top_base = 0.0; /* Fraction of thumb shown (1.0 - thumb_top_base) */ static float thumb_shown = 1.0; static void sync_scroll(int sb); static void save_image(void); static void scroll_reset(void); /* * Initialize (or re-initialize) the scrolling parameters and save area. */ void scroll_buf_init(void) { register int i; int sa_size; unsigned char *s; if (appres.interactive.save_lines % maxROWS) { appres.interactive.save_lines = ((appres.interactive.save_lines+maxROWS-1)/maxROWS) * maxROWS; } if (!appres.interactive.save_lines) { appres.interactive.save_lines = maxROWS; } if (sbuf != NULL) { Free(sbuf); Free(zbuf); Free(ea_save); } sa_size = appres.interactive.save_lines + maxROWS; ea_save = (struct ea **)Calloc(sizeof(struct ea *), sa_size); sa_bufsize = (sa_size * (sizeof(unsigned char) + sizeof(struct ea))) * maxCOLS; sbuf = Malloc(sa_bufsize); zbuf = Malloc(maxCOLS); (void) memset(zbuf, '\0', maxCOLS); s = (unsigned char *)sbuf; for (i = 0; i < sa_size; s += (maxCOLS * sizeof(struct ea)), i++) { ea_save[i] = (struct ea *)s; } scroll_reset(); scroll_initted = true; } static void screen_set_thumb_traced(float top, float shown) { #if defined(SCROLL_DEBUG) /*[*/ vtrace(" -> screen_set_thumb(top %f, shown %f)\n", top, shown); vtrace(" -> top %f top_base %f shown %f\n", thumb_top, thumb_top_base, thumb_shown); #endif /*]*/ screen_set_thumb(top, shown); } /* * Reset the scrolling parameters and erase the save area. */ static void scroll_reset(void) { (void) memset(sbuf, 0, sa_bufsize); scroll_next = 0; n_saved = 0; scrolled_back = 0; thumb_top_base = thumb_top = 0.0; thumb_shown = 1.0; need_saving = true; screen_set_thumb_traced(thumb_top, thumb_shown); enable_cursor(true); } /* * Save lines of data from the top of the screen. */ void scroll_save(int n, bool trim_blanks) { int i; #if defined(SCROLL_DEBUG) /*[*/ vtrace("scroll_save(%d, %s)\n", n, trim_blanks? "trim": "no trim"); #endif /*]*/ /* Trim trailing blank lines from 'n', if requested */ if (trim_blanks) { while (n) { int i; for (i = 0; i < COLS; i++) { if (ea_buf[(n-1)*COLS + i].cc) { break; } } if (i < COLS) { break; } else { n--; } } if (!n) { return; } } /* Scroll to bottom on "output". */ if (scrolled_back) { sync_scroll(0); } /* Save the screen contents. */ for (i = 0; i < n; i++) { if (i < COLS) { (void) memmove(ea_save[scroll_next], (ea_buf+(i*COLS)), COLS*sizeof(struct ea)); if (COLS < maxCOLS) { (void) memset((char *)(ea_save[scroll_next] + COLS), '\0', (maxCOLS - COLS) * sizeof(struct ea)); } } else { (void) memset((char *)ea_save[scroll_next], '\0', maxCOLS * sizeof(struct ea)); } scroll_next = (scroll_next + 1) % appres.interactive.save_lines; if (n_saved < appres.interactive.save_lines) { n_saved++; } } /* Reset the thumb. */ thumb_top_base = thumb_top = ((float)n_saved / (float)(appres.interactive.save_lines + maxROWS)); thumb_shown = (float)(1.0 - thumb_top); screen_set_thumb_traced(thumb_top, thumb_shown); } /* * Add blank lines to the scroll buffer to make it a multiple of the * screen size. */ void scroll_round(void) { int n; if (!(n_saved % maxROWS)) { return; } /* Zero the scroll buffer. */ for (n = maxROWS - (n_saved % maxROWS); n; n--) { (void) memset((char *)ea_save[scroll_next], '\0', maxCOLS * sizeof(struct ea)); scroll_next = (scroll_next + 1) % appres.interactive.save_lines; if (n_saved < appres.interactive.save_lines) { n_saved++; } } /* Reset the thumb. */ thumb_top_base = thumb_top = ((float)n_saved / (float)(appres.interactive.save_lines + maxROWS)); thumb_shown = (float)(1.0 - thumb_top); screen_set_thumb_traced(thumb_top, thumb_shown); } /* * Jump to the bottom of the scroll buffer. */ void scroll_to_bottom(void) { if (scrolled_back) { sync_scroll(0); /* screen_set_thumb_traced(thumb_top, thumb_shown); */ } need_saving = true; } /* * Save the current screen image, if it hasn't been saved since last updated. */ static void save_image(void) { int i; if (!need_saving) { return; } for (i = 0; i < maxROWS; i++) { (void) memmove(ea_save[appres.interactive.save_lines+i], (ea_buf + (i * COLS)), COLS*sizeof(struct ea)); } need_saving = false; } /* * Redraw the display so it begins back lines. */ static void sync_scroll(int sb) { int slop; int i; int scroll_first; float tt0; unselect(0, ROWS * COLS); /* * If in 3270 mode, round to a multiple of the screen size and * set the scroll bar. */ if (ever_3270) { if ((slop = (sb % maxROWS))) { if (slop <= maxROWS / 2) { sb -= slop; } else { sb += maxROWS - slop; } } if (sb) { kybd_scroll_lock(true); } else { kybd_scroll_lock(false); } } /* Update the status line. */ if (ever_3270) { status_scrolled(sb / maxROWS); } else { status_scrolled(0); } /* Swap screen sizes. */ if (sb && !scrolled_back && ((COLS < maxCOLS) || (ROWS < maxROWS))) { COLS = maxCOLS; ROWS = maxROWS; vscreen_swapped = true; } else if (!sb && scrolled_back && vscreen_swapped) { ctlr_shrink(); COLS = MODEL_2_COLS; ROWS = MODEL_2_ROWS; vscreen_swapped = false; } scroll_first = (scroll_next + appres.interactive.save_lines-sb) % appres.interactive.save_lines; /* Update the screen. */ for (i = 0; i < maxROWS; i++) { if (i < sb) { (void) memmove((ea_buf + (i * COLS)), ea_save[(scroll_first+i) % appres.interactive.save_lines], COLS*sizeof(struct ea)); } else { (void) memmove((ea_buf + (i * COLS)), ea_save[appres.interactive.save_lines+i-sb], COLS*sizeof(struct ea)); } } /* Disable the cursor if we're scrolled back, enable it if not. */ enable_cursor(sb == 0); scrolled_back = sb; ctlr_changed(0, ROWS*COLS); blink_start(); tt0 = ((float)n_saved / (float)(appres.interactive.save_lines + maxROWS)); thumb_shown = (float)(1.0 - tt0); thumb_top = ((float)(n_saved-sb) / (float)(appres.interactive.save_lines + maxROWS)); screen_set_thumb_traced(thumb_top, thumb_shown); } /* * Fixed-amount scroll action. */ static void scroll_n(int nss, int direction) { int nsr; if (!n_saved) { return; } if (!nss) { nss = 1; } save_image(); if (direction > 0) { /* scroll forward */ if (nss > scrolled_back) { sync_scroll(0); } else { nsr = scrolled_back - nss; if (ever_3270 && (nsr % maxROWS)) { nsr -= nsr % maxROWS; } sync_scroll(nsr); } } else { /* scroll back */ if (scrolled_back + nss > n_saved) { sync_scroll(n_saved); } else { nsr = scrolled_back + nss; if (ever_3270 && (nsr % maxROWS)) { nsr += maxROWS - (nsr % maxROWS); } sync_scroll(nsr); } } screen_set_thumb_traced((float)(n_saved - scrolled_back) / (float)(appres.interactive.save_lines + maxROWS), thumb_shown); } /* * Callback for "scroll" action (incrementing the thumb in one direction). */ void scroll_proc(int n, int total) { float pct; int nss; if (!n_saved) { return; } if (n < 0) { pct = (float)(-n) / (float)total; } else { pct = (float)n / (float)total; } #if defined(SCROLL_DEBUG) /*[*/ vtrace("scroll_proc(%d, %d) -> %f%%\n", n, total, pct); #endif /*]*/ nss = (int)(pct * thumb_shown * n_saved); scroll_n(nss, n); } /* * Callback for "jump" action (moving the thumb to a particular spot). */ void jump_proc(float top) { #if defined(SCROLL_DEBUG) /*[*/ vtrace("jump_proc(%f)\n", top); #endif /*]*/ if (!n_saved) { screen_set_thumb_traced(thumb_top, thumb_shown); return; } if (top > thumb_top_base) { /* too far down */ screen_set_thumb_traced(thumb_top_base, thumb_shown); sync_scroll(0); } else { save_image(); sync_scroll((int)((1.0 - top) * n_saved)); } } /* * Resynchronize the thumb (called when the scrollbar is turned on). */ void rethumb(void) { screen_set_thumb_traced(thumb_top, thumb_shown); } static bool Scroll_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Scroll", ia, argc, argv); if (check_argc("Scroll", argc, 1, 1) < 0) { return false; } if (!strcasecmp(argv[0], "Forward")) { scroll_n(maxROWS, +1); } else if (!strcasecmp(argv[0], "Backward")) { scroll_n(maxROWS, -1); } else { popup_an_error("Scroll parameter must be Forward or Backward"); return false; } return true; } /** * Scrollbar module registration. */ void scroll_register(void) { static action_table_t scroll_actions[] = { { "Scroll", Scroll_action, ACTION_KE } }; /* Register the actions. */ register_actions(scroll_actions, array_count(scroll_actions)); } suite3270-3.6/Common/scroll_stubs.c0000664000076500007650000000332313221577163015307 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * scroll_stubs.c * Stub funtions for scroll.c. */ #include "globals.h" #include "scroll.h" void scroll_save(int n _is_unused, bool trim_blanks _is_unused) { } void scroll_to_bottom(void) { } suite3270-3.6/Common/see.c0000664000076500007650000003002313221577163013342 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * Copyright (c) 2004, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * see.c * 3270 data stream decode functions. * */ #include "globals.h" #include #include #include #include "3270ds.h" #include "lazya.h" #include "utf8.h" #include "utils.h" #include "see.h" #include "unicodec.h" #include "varbuf.h" /** * Return an unknown value. * * @param[in] value The value to encode * * @return Encoded text representation of the value, good for only one call. */ static const char * unknown(unsigned char value) { return lazyaf("unknown[0x%x]", value); } /** * Encode an EBCDIC character. * * @param[in] ch EBCDIC character to encode * * @return Encoded text representation of the value, good for only one call. */ const char * see_ebc(unsigned char ch) { char mb[16]; ucs4_t uc; switch (ch) { case FCORDER_NULL: return "NULL"; case FCORDER_FF: return "FF"; case FCORDER_CR: return "CR"; case FCORDER_SO: return "SO"; case FCORDER_SI: return "SI"; case FCORDER_NL: return "NL"; case FCORDER_EM: return "EM"; case FCORDER_LF: return "LF"; case FCORDER_DUP: return "DUP"; case FCORDER_FM: return "FM"; case FCORDER_SUB: return "SUB"; case FCORDER_EO: return "EO"; } if (ebcdic_to_multibyte_x(ch, CS_BASE, mb, sizeof(mb), EUO_NONE, &uc) && (mb[0] != ' ' || ch == 0x40)) { return lazya(NewString(mb)); } else { return lazyaf("X'%02X'", ch); } } /** * Encode an AID code * * @param[in] code AID value to encode * * @return Encoded text representation of the value, good for only one call. */ const char * see_aid(unsigned char code) { switch (code) { case AID_NO: return "NoAID"; case AID_ENTER: return "Enter"; case AID_PF1: return "PF1"; case AID_PF2: return "PF2"; case AID_PF3: return "PF3"; case AID_PF4: return "PF4"; case AID_PF5: return "PF5"; case AID_PF6: return "PF6"; case AID_PF7: return "PF7"; case AID_PF8: return "PF8"; case AID_PF9: return "PF9"; case AID_PF10: return "PF10"; case AID_PF11: return "PF11"; case AID_PF12: return "PF12"; case AID_PF13: return "PF13"; case AID_PF14: return "PF14"; case AID_PF15: return "PF15"; case AID_PF16: return "PF16"; case AID_PF17: return "PF17"; case AID_PF18: return "PF18"; case AID_PF19: return "PF19"; case AID_PF20: return "PF20"; case AID_PF21: return "PF21"; case AID_PF22: return "PF22"; case AID_PF23: return "PF23"; case AID_PF24: return "PF24"; case AID_OICR: return "OICR"; case AID_MSR_MHS: return "MSR_MHS"; case AID_SELECT: return "Select"; case AID_PA1: return "PA1"; case AID_PA2: return "PA2"; case AID_PA3: return "PA3"; case AID_CLEAR: return "Clear"; case AID_SYSREQ: return "SysReq"; case AID_QREPLY: return "QueryReplyAID"; default: return unknown(code); } } /** * Encode a field attribute. * * @param[in] fa Field attribute to encode * * @return Encoded text representation of the value, good for only one call. */ const char * see_attr(unsigned char fa) { varbuf_t r; const char *sep = "("; vb_init(&r); if (fa & FA_PROTECT) { vb_appendf(&r, "%sprotected", sep); sep = ","; if (fa & FA_NUMERIC) { vb_appendf(&r, "%sskip", sep); sep = ","; } } else if (fa & FA_NUMERIC) { vb_appendf(&r, "%snumeric", sep); sep = ","; } switch (fa & FA_INTENSITY) { case FA_INT_NORM_NSEL: break; case FA_INT_NORM_SEL: vb_appendf(&r, "%sdetectable", sep); sep = ","; break; case FA_INT_HIGH_SEL: vb_appendf(&r, "%sintensified", sep); sep = ","; break; case FA_INT_ZERO_NSEL: vb_appendf(&r, "%snondisplay", sep); sep = ","; break; } if (fa & FA_MODIFY) { vb_appendf(&r, "%smodified", sep); sep = ","; } if (strcmp(sep, "(")) { vb_appends(&r, ")"); } else { vb_appends(&r, "(default)"); } return lazya(vb_consume(&r)); } /** * Encode a highlight attribute. * * @param[in] setting Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ static const char * see_highlight(unsigned char setting) { switch (setting) { case XAH_DEFAULT: return "default"; case XAH_NORMAL: return "normal"; case XAH_BLINK: return "blink"; case XAH_REVERSE: return "reverse"; case XAH_UNDERSCORE: return "underscore"; case XAH_INTENSIFY: return "intensify"; default: return unknown(setting); } } static const char *color_name[] = { "neutralBlack", "blue", "red", "pink", "green", "turquoise", "yellow", "neutralWhite", "black", "deepBlue", "orange", "purple", "paleGreen", "paleTurquoise", "grey", "white", NULL }; /** * Encode a color attribute. * * @param[in] setting Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ const char * see_color(unsigned char setting) { if (setting == XAC_DEFAULT) { return "default"; } else if (setting < 0xf0) { return unknown(setting); } else { return color_name[setting - 0xf0]; } } /** * Decode a host color name or index. * * @param[in] name Color name or index * * @return Color index (HOST_COLOR_xxx) or -1. */ int decode_host_color(const char *name) { int i; unsigned long l; char *ptr; /* Check for invalid parameter. */ if (name == NULL || !*name) { return -1; } /* Check for a symbolic match. */ for (i = 0; color_name[i] != NULL; i++) { if (!strcasecmp(name, color_name[i])) { return i; } } /* Check for a number. */ l = strtoul(name, &ptr, 0); if (l > 0xf || ptr == name || *ptr != '\0') { return -1; } return (int)l; } /** * Encode a transparency attribute. * * @param[in] setting Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ static const char * see_transparency(unsigned char setting) { switch (setting) { case XAT_DEFAULT: return "default"; case XAT_OR: return "or"; case XAT_XOR: return "xor"; case XAT_OPAQUE: return "opaque"; default: return unknown(setting); } } /** * Encode a validation attribute. * * @param[in] setting Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ static const char * see_validation(unsigned char setting) { varbuf_t r; const char *sep = "("; vb_init(&r); if (setting & XAV_FILL) { vb_appendf(&r, "%sfill", sep); sep = ","; } if (setting & XAV_ENTRY) { vb_appendf(&r, "%sentry", sep); sep = ","; } if (setting & XAV_TRIGGER) { vb_appendf(&r, "%strigger", sep); sep = ","; } if (strcmp(sep, "(")) { vb_appends(&r, ")"); } else { vb_appends(&r, "(none)"); } return lazya(vb_consume(&r)); } /** * Encode an outlining attribute. * * @param[in] setting Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ static const char * see_outline(unsigned char setting) { varbuf_t r; const char *sep = "("; vb_init(&r); if (setting & XAO_UNDERLINE) { vb_appendf(&r, "%sunderline", sep); sep = ","; } if (setting & XAO_RIGHT) { vb_appendf(&r, "%sright", sep); sep = ","; } if (setting & XAO_OVERLINE) { vb_appendf(&r, "%soverline", sep); sep = ","; } if (setting & XAO_LEFT) { vb_appendf(&r, "%sleft", sep); sep = ","; } if (strcmp(sep, "(")) { vb_appends(&r, ")"); } else { vb_appends(&r, "(none)"); } return lazya(vb_consume(&r)); } /** * Encode an input control attribute. * * @param[in] setting Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ static const char * see_input_control(unsigned char setting) { switch (setting) { case XAI_DISABLED: return "disabled"; case XAI_ENABLED: return "enabled"; default: return unknown(setting); } } /** * Encode an extended field attribute. * * @param[in] efa Attribute to encode * @param[in] value Value of attribute * * @return Encoded text representation of the value, good for only one call. */ const char * see_efa(unsigned char efa, unsigned char value) { switch (efa) { case XA_ALL: return lazyaf(" all(%x)", value); case XA_3270: return lazyaf(" 3270%s", see_attr(value)); case XA_VALIDATION: return lazyaf(" validation%s", see_validation(value)); case XA_OUTLINING: return lazyaf(" outlining(%s)", see_outline(value)); case XA_HIGHLIGHTING: return lazyaf(" highlighting(%s)", see_highlight(value)); case XA_FOREGROUND: return lazyaf(" foreground(%s)", see_color(value)); case XA_CHARSET: return lazyaf(" charset(%x)", value); case XA_BACKGROUND: return lazyaf(" background(%s)", see_color(value)); case XA_TRANSPARENCY: return lazyaf(" transparency(%s)", see_transparency(value)); case XA_INPUT_CONTROL: return lazyaf(" input-control(%s)", see_input_control(value)); default: return lazyaf(" %s[0x%x]", unknown(efa), value); } } /** * Encode just an extended attribute. * * @param[in] efa Attribute to encode * * @return Encoded text representation of the value, good for only one call. */ const char * see_efa_only(unsigned char efa) { switch (efa) { case XA_ALL: return "all"; case XA_3270: return "3270"; case XA_VALIDATION: return "validation"; case XA_OUTLINING: return "outlining"; case XA_HIGHLIGHTING: return "highlighting"; case XA_FOREGROUND: return "foreground"; case XA_CHARSET: return "charset"; case XA_BACKGROUND: return "background"; case XA_TRANSPARENCY: return "transparency"; default: return unknown(efa); } } /** * Encode a query reply code. * * @param[in] id Code to encode * * @return Encoded text representation of the value, good for only one call. */ const char * see_qcode(unsigned char id) { switch (id) { case QR_CHARSETS: return "CharacterSets"; case QR_IMP_PART: return "ImplicitPartition"; case QR_SUMMARY: return "Summary"; case QR_USABLE_AREA: return "UsableArea"; case QR_COLOR: return "Color"; case QR_HIGHLIGHTING: return "Highlighting"; case QR_REPLY_MODES: return "ReplyModes"; case QR_DBCS_ASIA: return "DbcsAsia"; case QR_ALPHA_PART: return "AlphanumericPartitions"; case QR_DDM: return "DistributedDataManagement"; case QR_RPQNAMES: return "RPQNames"; default: return unknown(id); } } suite3270-3.6/Common/select_stubs.c0000664000076500007650000000343413221577163015273 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * select_stubs.c * Stubs for select.c. */ #include "globals.h" #include "selectc.h" void unselect(int baddr _is_unused, int len _is_unused) { } bool area_is_selected(int baddr _is_unused, int len _is_unused) { return false; } void select_register(void) { } suite3270-3.6/Common/sf.c0000664000076500007650000005307713221577163013214 0ustar pdmpdm/* * Copyright (c) 1994-2010, 2013-2015 Paul Mattes. * Copyright (c) 2004, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sf.c * This module handles 3270 structured fields. * */ #include "globals.h" #include "3270ds.h" #include "appres.h" #include "ctlr.h" #include "charset.h" #include "ctlrc.h" #include "ft_dft.h" #include "ft_private.h" #include "kybd.h" #include "sf.h" /* has to come before rpq.h */ #include "rpq.h" #include "screen.h" #include "see.h" #include "telnet_core.h" #include "trace.h" #define SW_3279_2 0x09 #define SH_3279_2 0x0c #define Xr_3279_2 0x000a02e5 #define Yr_3279_2 0x0002006f /* Statics */ static bool qr_in_progress = false; static enum pds sf_read_part(unsigned char buf[], unsigned buflen); static enum pds sf_erase_reset(unsigned char buf[], int buflen); static enum pds sf_set_reply_mode(unsigned char buf[], int buflen); static enum pds sf_create_partition(unsigned char buf[], int buflen); static enum pds sf_outbound_ds(unsigned char buf[], int buflen); static void query_reply_start(void); static void do_query_reply(unsigned char code); static void query_reply_end(void); typedef bool qr_multi_fn_t(unsigned *subindex, bool *more); static qr_single_fn_t do_qr_summary, do_qr_usable_area, do_qr_alpha_part, do_qr_charsets, do_qr_color, do_qr_highlighting, do_qr_reply_modes, do_qr_imp_part, do_qr_null; static qr_single_fn_t do_qr_dbcs_asia; static qr_single_fn_t do_qr_ddm; static struct reply { unsigned char code; qr_single_fn_t *single_fn; qr_multi_fn_t *multi_fn; } replies[] = { { QR_SUMMARY, do_qr_summary, NULL }, /* 0x80 */ { QR_USABLE_AREA, do_qr_usable_area, NULL }, /* 0x81 */ { QR_ALPHA_PART, do_qr_alpha_part, NULL }, /* 0x84 */ { QR_CHARSETS, do_qr_charsets, NULL }, /* 0x85 */ { QR_COLOR, do_qr_color, NULL }, /* 0x86 */ { QR_HIGHLIGHTING, do_qr_highlighting, NULL }, /* 0x87 */ { QR_REPLY_MODES, do_qr_reply_modes, NULL }, /* 0x88 */ { QR_DBCS_ASIA, do_qr_dbcs_asia, NULL }, /* 0x91 */ { QR_DDM, do_qr_ddm, NULL }, /* 0x95 */ { QR_RPQNAMES, do_qr_rpqnames, NULL }, /* 0xa1 */ { QR_IMP_PART, do_qr_imp_part, NULL }, /* 0xa6 */ /* QR_NULL must be last in the table */ { QR_NULL, do_qr_null, NULL }, /* 0xff */ }; /* * NSR_ALL is the number of query replies supported, including NULL. * NSR is the number of query replies supported, except for NULL. */ #define NSR_ALL (sizeof(replies)/sizeof(struct reply)) #define NSR (NSR_ALL - 1) /* * Process a 3270 Write Structured Field command */ enum pds write_structured_field(unsigned char buf[], size_t buflen) { size_t fieldlen; unsigned char *cp = buf; bool first = true; enum pds rv = PDS_OKAY_NO_OUTPUT; enum pds rv_this = PDS_OKAY_NO_OUTPUT; bool bad_cmd = false; /* Skip the WSF command itself. */ cp++; buflen--; /* Interpret fields. */ while (buflen > 0) { if (first) trace_ds(" "); else trace_ds("< WriteStructuredField "); first = false; /* Pick out the field length. */ if (buflen < 2) { trace_ds("error: single byte at end of message\n"); return rv ? rv : PDS_BAD_CMD; } fieldlen = (cp[0] << 8) + cp[1]; if (fieldlen == 0) fieldlen = buflen; if (fieldlen < 3) { trace_ds("error: field length %d too small\n", (int)fieldlen); return rv ? rv : PDS_BAD_CMD; } if (fieldlen > buflen) { trace_ds("error: field length %d exceeds remaining " "message length %d\n", (int)fieldlen, (int)buflen); return rv ? rv : PDS_BAD_CMD; } /* Dispatch on the ID. */ switch (cp[2]) { case SF_READ_PART: trace_ds("ReadPartition"); rv_this = sf_read_part(cp, (int)fieldlen); break; case SF_ERASE_RESET: trace_ds("EraseReset"); rv_this = sf_erase_reset(cp, (int)fieldlen); break; case SF_SET_REPLY_MODE: trace_ds("SetReplyMode"); rv_this = sf_set_reply_mode(cp, (int)fieldlen); break; case SF_CREATE_PART: trace_ds("CreatePartition"); rv_this = sf_create_partition(cp, (int)fieldlen); break; case SF_OUTBOUND_DS: trace_ds("OutboundDS"); rv_this = sf_outbound_ds(cp, (int)fieldlen); break; case SF_TRANSFER_DATA: /* File transfer data */ trace_ds("FileTransferData"); ft_dft_data(cp, (int)fieldlen); break; default: trace_ds("unsupported ID 0x%02x\n", cp[2]); rv_this = PDS_BAD_CMD; break; } /* * Accumulate errors or output flags. * One real ugliness here is that if we have already * generated some output, then we have already positively * acknowledged the request, so if we fail here, we have no * way to return the error indication. */ if (rv_this < 0) bad_cmd = true; else rv |= rv_this; /* Skip to the next field. */ cp += fieldlen; buflen -= fieldlen; } if (first) trace_ds(" (null)\n"); if (bad_cmd && !rv) return PDS_BAD_CMD; else return rv; } static enum pds sf_read_part(unsigned char buf[], unsigned buflen) { unsigned char partition; unsigned i; int any = 0; const char *comma = ""; if (buflen < 5) { trace_ds(" error: field length %d too small\n", buflen); return PDS_BAD_CMD; } partition = buf[3]; trace_ds("(0x%02x)", partition); switch (buf[4]) { case SF_RP_QUERY: trace_ds(" Query"); if (partition != 0xff) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); query_reply_start(); for (i = 0; i < NSR; i++) { if (dbcs || replies[i].code != QR_DBCS_ASIA) { do_query_reply(replies[i].code); } } query_reply_end(); break; case SF_RP_QLIST: trace_ds(" QueryList "); if (partition != 0xff) { trace_ds("error: illegal partition\n"); return PDS_BAD_CMD; } if (buflen < 6) { trace_ds("error: missing request type\n"); return PDS_BAD_CMD; } query_reply_start(); switch (buf[5]) { case SF_RPQ_LIST: trace_ds("List("); if (buflen < 7) { trace_ds(")\n"); do_query_reply(QR_NULL); } else { for (i = 6; i < buflen; i++) { trace_ds("%s%s", comma, see_qcode(buf[i])); comma = ","; } trace_ds(")\n"); for (i = 0; i < NSR; i++) { if (memchr((char *)&buf[6], (char)replies[i].code, buflen-6) && (dbcs || replies[i].code != QR_DBCS_ASIA) ) { do_query_reply(replies[i].code); any++; } } if (!any) { do_query_reply(QR_NULL); } } break; case SF_RPQ_EQUIV: trace_ds("Equivlent+List("); for (i = 6; i < buflen; i++) { trace_ds("%s%s", comma, see_qcode(buf[i])); comma = ","; } trace_ds(")\n"); for (i = 0; i < NSR; i++) if (dbcs || replies[i].code != QR_DBCS_ASIA) { do_query_reply(replies[i].code); } break; case SF_RPQ_ALL: trace_ds("All\n"); for (i = 0; i < NSR; i++) if (dbcs || replies[i].code != QR_DBCS_ASIA) { do_query_reply(replies[i].code); } break; default: trace_ds("unknown request type 0x%02x\n", buf[5]); return PDS_BAD_CMD; } query_reply_end(); break; case SNA_CMD_RMA: trace_ds(" ReadModifiedAll"); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); ctlr_read_modified(AID_QREPLY, true); break; case SNA_CMD_RB: trace_ds(" ReadBuffer"); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); ctlr_read_buffer(AID_QREPLY); break; case SNA_CMD_RM: trace_ds(" ReadModified"); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } trace_ds("\n"); ctlr_read_modified(AID_QREPLY, false); break; default: trace_ds(" unknown type 0x%02x\n", buf[4]); return PDS_BAD_CMD; } return PDS_OKAY_OUTPUT; } static enum pds sf_erase_reset(unsigned char buf[], int buflen) { if (buflen != 4) { trace_ds(" error: wrong field length %d\n", buflen); return PDS_BAD_CMD; } switch (buf[3]) { case SF_ER_DEFAULT: trace_ds(" Default\n"); ctlr_erase(false); break; case SF_ER_ALT: trace_ds(" Alternate\n"); ctlr_erase(true); break; default: trace_ds(" unknown type 0x%02x\n", buf[3]); return PDS_BAD_CMD; } return PDS_OKAY_NO_OUTPUT; } static enum pds sf_set_reply_mode(unsigned char buf[], int buflen) { unsigned char partition; int i; const char *comma = "("; if (buflen < 5) { trace_ds(" error: wrong field length %d\n", buflen); return PDS_BAD_CMD; } partition = buf[3]; trace_ds("(0x%02x)", partition); if (partition != 0x00) { trace_ds(" error: illegal partition\n"); return PDS_BAD_CMD; } switch (buf[4]) { case SF_SRM_FIELD: trace_ds(" Field\n"); break; case SF_SRM_XFIELD: trace_ds(" ExtendedField\n"); break; case SF_SRM_CHAR: trace_ds(" Character"); break; default: trace_ds(" unknown mode 0x%02x\n", buf[4]); return PDS_BAD_CMD; } reply_mode = buf[4]; if (buf[4] == SF_SRM_CHAR) { crm_nattr = buflen - 5; for (i = 5; i < buflen; i++) { crm_attr[i - 5] = buf[i]; trace_ds("%s%s", comma, see_efa_only(buf[i])); comma = ","; } trace_ds("%s\n", crm_nattr ? ")" : ""); } return PDS_OKAY_NO_OUTPUT; } static enum pds sf_create_partition(unsigned char buf[], int buflen) { unsigned char pid; unsigned char uom; /* unit of measure */ unsigned char am; /* addressing mode */ unsigned char flags; /* flags */ unsigned short h; /* height of presentation space */ unsigned short w; /* width of presentation space */ unsigned short rv; /* viewport origin row */ unsigned short cv; /* viewport origin column */ unsigned short hv; /* viewport height */ unsigned short wv; /* viewport width */ unsigned short rw; /* window origin row */ unsigned short cw; /* window origin column */ unsigned short rs; /* scroll rows */ /* hole */ unsigned short pw; /* character cell point width */ unsigned short ph; /* character cell point height */ static const char *bit4[16] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; if (buflen > 3) { trace_ds("("); /* Partition. */ pid = buf[3]; trace_ds("pid=0x%02x", pid); if (pid != 0x00) { trace_ds(") error: illegal partition\n"); return PDS_BAD_CMD; } } else pid = 0x00; if (buflen > 4) { uom = (buf[4] & 0xf0) >> 4; trace_ds(",uom=B'%s'", bit4[uom]); if (uom != 0x0 && uom != 0x02) { trace_ds(") error: illegal units\n"); return PDS_BAD_CMD; } am = buf[4] & 0x0f; trace_ds(",am=B'%s'", bit4[am]); if (am > 0x2) { trace_ds(") error: illegal a-mode\n"); return PDS_BAD_CMD; } } else { uom = 0; am = 0; } if (buflen > 5) { flags = buf[5]; trace_ds(",flags=0x%02x", flags); } else { flags = 0; } if (buflen > 7) { GET16(h, &buf[6]); trace_ds(",h=%d", h); } else h = maxROWS; if (buflen > 9) { GET16(w, &buf[8]); trace_ds(",w=%d", w); } else w = maxCOLS; if (buflen > 11) { GET16(rv, &buf[10]); trace_ds(",rv=%d", rv); } else rv = 0; if (buflen > 13) { GET16(cv, &buf[12]); trace_ds(",cv=%d", cv); } else cv = 0; if (buflen > 15) { GET16(hv, &buf[14]); trace_ds(",hv=%d", hv); } else hv = (h > maxROWS)? maxROWS: h; if (buflen > 17) { GET16(wv, &buf[16]); trace_ds(",wv=%d", wv); } else wv = (w > maxCOLS)? maxCOLS: w; if (buflen > 19) { GET16(rw, &buf[18]); trace_ds(",rw=%d", rw); } else rw = 0; if (buflen > 21) { GET16(cw, &buf[20]); trace_ds(",cw=%d", cw); } else cw = 0; if (buflen > 23) { GET16(rs, &buf[22]); trace_ds(",rs=%d", rs); } else rs = (h > hv)? 1: 0; if (buflen > 27) { GET16(pw, &buf[26]); trace_ds(",pw=%d", pw); } else pw = *char_width; if (buflen > 29) { GET16(ph, &buf[28]); trace_ds(",ph=%d", ph); } else ph = *char_height; trace_ds(")\n"); cursor_move(0); buffer_addr = 0; return PDS_OKAY_NO_OUTPUT; } static enum pds sf_outbound_ds(unsigned char buf[], int buflen) { enum pds rv; if (buflen < 5) { trace_ds(" error: field length %d too short\n", buflen); return PDS_BAD_CMD; } trace_ds("(0x%02x)", buf[3]); if (buf[3] != 0x00) { trace_ds(" error: illegal partition 0x%0x\n", buf[3]); return PDS_BAD_CMD; } switch (buf[4]) { case SNA_CMD_W: trace_ds(" Write"); if (buflen > 5) { if ((rv = ctlr_write(&buf[4], buflen-4, false)) < 0) return rv; } else trace_ds("\n"); break; case SNA_CMD_EW: trace_ds(" EraseWrite"); ctlr_erase(screen_alt); if (buflen > 5) { if ((rv = ctlr_write(&buf[4], buflen-4, true)) < 0) return rv; } else trace_ds("\n"); break; case SNA_CMD_EWA: trace_ds(" EraseWriteAlternate"); ctlr_erase(screen_alt); if (buflen > 5) { if ((rv = ctlr_write(&buf[4], buflen-4, true)) < 0) return rv; } else trace_ds("\n"); break; case SNA_CMD_EAU: trace_ds(" EraseAllUnprotected\n"); ctlr_erase_all_unprotected(); break; default: trace_ds(" unknown type 0x%02x\n", buf[4]); return PDS_BAD_CMD; } return PDS_OKAY_NO_OUTPUT; } static void query_reply_start(void) { obptr = obuf; space3270out(1); *obptr++ = AID_SF; qr_in_progress = true; } static void do_query_reply(unsigned char code) { unsigned i; unsigned subindex = 0; bool more = false; /* Find the right entry in the reply table. */ for (i = 0; i < NSR_ALL; i++) { if (replies[i].code == code) break; } if (i >= NSR_ALL || (replies[i].single_fn == NULL && replies[i].multi_fn == NULL)) return; if (qr_in_progress) { trace_ds("> StructuredField\n"); qr_in_progress = false; } do { size_t obptr0 = obptr - obuf; bool full = true; space3270out(4); obptr += 2; /* skip length for now */ *obptr++ = SFID_QREPLY; *obptr++ = code; more = false; if (replies[i].single_fn) replies[i].single_fn(); else full = replies[i].multi_fn(&subindex, &more); if (full) { size_t len; unsigned char *obptr_len; /* Fill in the length. */ obptr_len = obuf + obptr0; len = (obptr - obuf) - obptr0; SET16(obptr_len, len); } else { /* Back over the header. */ obptr -= 4; } } while (more); } static void do_qr_null(void) { trace_ds("> QueryReply(Null)\n"); } static void do_qr_summary(void) { unsigned i; const char *comma = ""; trace_ds("> QueryReply(Summary("); space3270out(NSR); for (i = 0; i < NSR; i++) { if (dbcs || replies[i].code != QR_DBCS_ASIA) { trace_ds("%s%s", comma, see_qcode(replies[i].code)); comma = ","; *obptr++ = replies[i].code; } } trace_ds("))\n"); } static void do_qr_usable_area(void) { trace_ds("> QueryReply(UsableArea)\n"); space3270out(19); *obptr++ = 0x01; /* 12/14-bit addressing */ *obptr++ = 0x00; /* no special character features */ SET16(obptr, maxCOLS); /* usable width */ SET16(obptr, maxROWS); /* usable height */ *obptr++ = 0x01; /* units (mm) */ SET32(obptr, Xr_3279_2); /* Xr, canned from 3279-2 */ SET32(obptr, Yr_3279_2); /* Yr, canned from 3279-2 */ /* * If we ever implement graphics, these will * need to change. */ *obptr++ = SW_3279_2; /* AW, canned from 3279-2 */ *obptr++ = SH_3279_2; /* AH, canned from 3279-2 */ SET16(obptr, maxCOLS*maxROWS); /* buffer, questionable */ } static void do_qr_color(void) { int i; int color_max; trace_ds("> QueryReply(Color)\n"); color_max = (appres.color8 || !appres.m3279)? 8: 16; space3270out(4 + 2*15); *obptr++ = 0x00; /* no options */ *obptr++ = color_max; /* report on 8 or 16 colors */ *obptr++ = 0x00; /* default color: */ *obptr++ = 0xf0 + HOST_COLOR_GREEN; /* green */ for (i = 0xf1; i < 0xf1 + color_max - 1; i++) { *obptr++ = i; if (appres.m3279) { *obptr++ = i; } else { *obptr++ = 0x00; } } if (screen_has_bg_color()) { /* Add background color. */ if (appres.m3279 && appres.qr_bg_color) { space3270out(4); *obptr++ = 4; /* length */ *obptr++ = 0x02; /* background color */ *obptr++ = 0x00; /* attribute */ *obptr++ = 0xf0; /* default color */ } } } static void do_qr_highlighting(void) { trace_ds("> QueryReply(Highlighting)\n"); space3270out(11); *obptr++ = 5; /* report on 5 pairs */ *obptr++ = XAH_DEFAULT; /* default: */ *obptr++ = XAH_NORMAL; /* normal */ *obptr++ = XAH_BLINK; /* blink: */ *obptr++ = XAH_BLINK; /* blink */ *obptr++ = XAH_REVERSE; /* reverse: */ *obptr++ = XAH_REVERSE; /* reverse */ *obptr++ = XAH_UNDERSCORE; /* underscore: */ *obptr++ = XAH_UNDERSCORE; /* underscore */ *obptr++ = XAH_INTENSIFY; /* intensify: */ *obptr++ = XAH_INTENSIFY; /* intensify */ } static void do_qr_reply_modes(void) { trace_ds("> QueryReply(ReplyModes)\n"); space3270out(3); *obptr++ = SF_SRM_FIELD; *obptr++ = SF_SRM_XFIELD; *obptr++ = SF_SRM_CHAR; } static void do_qr_dbcs_asia(void) { /* XXX: Should we support this, even when not in DBCS mode? */ trace_ds("> QueryReply(DbcsAsia)\n"); space3270out(7); *obptr++ = 0x00; /* flags (none) */ *obptr++ = 0x03; /* field length 3 */ *obptr++ = 0x01; /* SI/SO supported */ *obptr++ = 0x80; /* character set ID 0x80 */ *obptr++ = 0x03; /* field length 3 */ *obptr++ = 0x02; /* input control */ *obptr++ = 0x01; /* creation supported */ } static void do_qr_alpha_part(void) { trace_ds("> QueryReply(AlphanumericPartitions)\n"); space3270out(4); *obptr++ = 0; /* 1 partition */ SET16(obptr, maxROWS*maxCOLS); /* buffer space */ *obptr++ = 0; /* no special features */ } static void do_qr_charsets(void) { trace_ds("> QueryReply(CharacterSets)\n"); space3270out(64); if (dbcs) { *obptr++ = 0x8e; /* flags: GE, CGCSGID, DBCS */ } else { *obptr++ = 0x82; /* flags: GE, CGCSGID present */ } *obptr++ = 0x00; /* more flags */ *obptr++ = SW_3279_2; /* SDW, canned from 3279-2 */ *obptr++ = SH_3279_2; /* SDW, canned from 3279-2 */ *obptr++ = 0x00; /* no load PS */ *obptr++ = 0x00; *obptr++ = 0x00; *obptr++ = 0x00; if (dbcs) { *obptr++ = 0x0b; /* DL (11 bytes) */ } else { *obptr++ = 0x07; /* DL (7 bytes) */ } *obptr++ = 0x00; /* SET 0: */ if (dbcs) { *obptr++ = 0x00; /* FLAGS: non-load, single- plane, single-byte */ } else { *obptr++ = 0x10; /* FLAGS: non-loadable, single-plane, single-byte, no compare */ } *obptr++ = 0x00; /* LCID 0 */ if (dbcs) { *obptr++ = 0x00; /* SW 0 */ *obptr++ = 0x00; /* SH 0 */ *obptr++ = 0x00; /* SUBSN */ *obptr++ = 0x00; /* SUBSN */ } SET32(obptr, cgcsgid); /* CGCSGID */ /* special 3270 font, includes APL */ *obptr++ = 0x01;/* SET 1: */ if (appres.apl_mode) *obptr++ = 0x00; /* FLAGS: non-loadable, single-plane, single-byte, no compare */ else *obptr++ = 0x10; /* FLAGS: non-loadable, single-plane, single-byte, no compare */ *obptr++ = 0xf1; /* LCID */ if (dbcs) { *obptr++ = 0x00; /* SW 0 */ *obptr++ = 0x00; /* SH 0 */ *obptr++ = 0x00; /* SUBSN */ *obptr++ = 0x00; /* SUBSN */ } *obptr++ = 0x03; /* CGCSGID: 3179-style APL2 */ *obptr++ = 0xc3; *obptr++ = 0x01; *obptr++ = 0x36; if (dbcs) { *obptr++ = 0x80; /* SET 0x80: */ *obptr++ = 0x20; /* FLAGS: DBCS */ *obptr++ = 0xf8; /* LCID: 0xf8 */ *obptr++ = SW_3279_2 * 2; /* SW, canned from 3279-2 */ *obptr++ = SH_3279_2; /* SH, canned from 3279-2 */ *obptr++ = 0x41; /* SUBSN */ *obptr++ = 0x7f; /* SUBSN */ SET32(obptr, cgcsgid_dbcs); /* CGCSGID */ } } static void do_qr_ddm(void) { int size; if (ftc != NULL) { size = ftc->dft_buffersize; } else { size = set_dft_buffersize(0); } trace_ds("> QueryReply(DistributedDataManagement)\n"); space3270out(8); SET16(obptr,0); /* set reserved field to 0 */ SET16(obptr, size); /* set inbound length limit INLIM */ SET16(obptr, size); /* set outbound length limit OUTLIM */ SET16(obptr, 0x0101); /* NSS=01, DDMSS=01 */ } static void do_qr_imp_part(void) { trace_ds("> QueryReply(ImplicitPartition)\n"); space3270out(13); *obptr++ = 0x0; /* reserved */ *obptr++ = 0x0; *obptr++ = 0x0b; /* length of display size */ *obptr++ = 0x01; /* "implicit partition size" */ *obptr++ = 0x00; /* reserved */ SET16(obptr, 80); /* implicit partition width */ SET16(obptr, 24); /* implicit partition height */ SET16(obptr, maxCOLS); /* alternate height */ SET16(obptr, maxROWS); /* alternate width */ } static void query_reply_end(void) { net_output(); kybd_inhibit(true); } suite3270-3.6/Common/sioc.c0000664000076500007650000001010213221577163013517 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sioc.c * Common back-end logic for secure I/O. */ #include "globals.h" #include #include #include "utils.h" #include "ssl_config.h" #include "sio.h" #include "sioc.h" #include "varbuf.h" #define READ_BUF 1024 #define STRING_PASSWD "string:" #define FILE_PASSWD "file:" /* Typedefs */ /* Statics */ /* Globals */ static char *sioc_last_error; /* Record an error. */ void sioc_set_error(const char *fmt, ...) { va_list args; char *t, *u; va_start(args, fmt); t = xs_vbuffer(fmt, args); va_end(args); u = xs_buffer("SSL: %s", t); Free(t); Replace(sioc_last_error, u); } /* Clear the last error. */ void sioc_error_reset(void) { Replace(sioc_last_error, NULL); } /* * Returns the last error as text. */ const char * sio_last_error(void) { return ((sioc_last_error != NULL)? sioc_last_error: "SSL: No error"); } /* Expand the contents of a file into a string. */ char * sioc_string_from_file(const char *path, size_t *len_ret) { FILE *f; char *accum = NULL; size_t n_accum = 0; f = fopen(path, "r"); if (f == NULL) { sioc_set_error("%s: %s", path, strerror(errno)); *len_ret = 0; return NULL; } while (true) { size_t nr; accum = Realloc(accum, n_accum + READ_BUF); nr = fread(accum + n_accum, 1, READ_BUF, f); n_accum += nr; if (nr < READ_BUF) { break; } } /* Null-terminate the string, but don't count that in the length. */ accum = Realloc(accum, n_accum + 1); accum[n_accum] = '\0'; fclose(f); *len_ret = n_accum; return accum; } /* Parse a password spec. */ char * sioc_parse_password_spec(const char *spec) { if (!strncasecmp(spec, STRING_PASSWD, strlen(STRING_PASSWD))) { /* string:xxx */ return NewString(spec + strlen(STRING_PASSWD)); } if (!strncasecmp(spec, FILE_PASSWD, strlen(FILE_PASSWD))) { size_t len; char *password; /* file:xxx */ password = sioc_string_from_file(spec + strlen(FILE_PASSWD), &len); if (password == NULL) { return NULL; } if (len > 0 && password[len - 1] == '\n') { password[--len] = '\0'; } if (len > 0 && password[len - 1] == '\r') { password[--len] = '\0'; } if (len == 0) { sioc_set_error("Empty password file"); Free(password); return NULL; } return password; } /* No qualifier, assume direct value */ return (NewString(spec)); } /* * Report all supported SSL-related options. */ unsigned sio_all_options_supported(void) { if (sio_supported()) { return SSL_REQUIRED_OPTS | sio_options_supported(); } else { return 0; } } suite3270-3.6/Common/sio_common.c0000664000076500007650000001714413221577163014741 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sio_common.c * Common logic for secure I/O. */ #include "globals.h" #include #include "appres.h" #include "resources.h" #include "opts.h" #include "utils.h" #include "sio.h" /* Typedefs */ /* Statics */ /* Globals */ /* * Add SSL options. */ static void add_ssl_opts(void) { struct { unsigned flag; opt_t opt; } flagged_opts[] = { { SSL_OPT_ACCEPT_HOSTNAME, { OptAcceptHostname, OPT_STRING, false, ResAcceptHostname, aoffset(ssl.accept_hostname), "[DNS:]", "Host name to accept from server certificate" } }, { SSL_OPT_VERIFY_HOST_CERT, { OptVerifyHostCert, OPT_BOOLEAN, true, ResVerifyHostCert, aoffset(ssl.verify_host_cert), NULL, "Enable SSL/TLS host certificate validation (set by default)" } }, { SSL_OPT_VERIFY_HOST_CERT, { OptNoVerifyHostCert, OPT_BOOLEAN, false, ResVerifyHostCert, aoffset(ssl.verify_host_cert), NULL, "Disable SSL/TLS host certificate validation" } }, { SSL_OPT_CA_DIR, { OptCaDir, OPT_STRING, false, ResCaDir, aoffset(ssl.ca_dir), "","SSL/TLS CA certificate database directory" } }, { SSL_OPT_CA_FILE, { OptCaFile, OPT_STRING, false, ResCaFile, aoffset(ssl.ca_file), "", "SSL/TLS CA certificate file" } }, { SSL_OPT_CERT_FILE, { OptCertFile, OPT_STRING, false, ResCertFile, aoffset(ssl.cert_file), "", "SSL/TLS client certificate file" } }, { SSL_OPT_CERT_FILE_TYPE, { OptCertFileType, OPT_STRING, false, ResCertFileType, aoffset(ssl.cert_file_type), "pem|asn1", "SSL/TLS client certificate file type" } }, { SSL_OPT_CHAIN_FILE, { OptChainFile,OPT_STRING, false,ResChainFile, aoffset(ssl.chain_file), "", "SSL/TLS certificate chain file" } }, { SSL_OPT_KEY_FILE, { OptKeyFile, OPT_STRING, false, ResKeyFile, aoffset(ssl.key_file), "", "Get SSL/TLS private key from " } }, { SSL_OPT_KEY_FILE_TYPE, { OptKeyFileType, OPT_STRING, false, ResKeyFileType, aoffset(ssl.key_file_type), "pem|asn1", "SSL/TLS private key file type" } }, { SSL_OPT_KEY_PASSWD, { OptKeyPasswd,OPT_STRING, false, ResKeyPasswd, aoffset(ssl.key_passwd), "file:|string:", "SSL/TLS private key password" } }, { SSL_OPT_CLIENT_CERT, { OptClientCert, OPT_STRING, false, ResClientCert, aoffset(ssl.client_cert), "", "SSL/TLS client certificate name" } } }; int n_opts = (int)(sizeof(flagged_opts) / sizeof(flagged_opts[0])); unsigned n_ssl_opts = 0; opt_t *ssl_opts; int add_ix = 0; /* Fetch the list from the implementation. */ unsigned supported_options = sio_all_options_supported(); /* Match options against the supported ones. */ FOREACH_SSL_OPTS(opt) { if (supported_options & opt) { int j; for (j = 0; j < n_opts; j++) { if (flagged_opts[j].flag == opt) { n_ssl_opts++; } } } } FOREACH_SSL_OPTS_END(opt); if (!n_ssl_opts) { return; } /* Construct the list of options to add. */ ssl_opts = (opt_t *)Malloc(n_ssl_opts * sizeof(opt_t)); FOREACH_SSL_OPTS(opt) { if (supported_options & opt) { int j; for (j = 0; j < n_opts; j++) { if (flagged_opts[j].flag == opt) { ssl_opts[add_ix++] = flagged_opts[j].opt; /* struct copy */ } } } } FOREACH_SSL_OPTS_END(opt); /* Add them. */ register_opts(ssl_opts, n_ssl_opts); } static void add_ssl_resources(void) { struct { unsigned flag; res_t res; } flagged_res[] = { { SSL_OPT_ACCEPT_HOSTNAME, { ResAcceptHostname, aoffset(ssl.accept_hostname), XRM_STRING } }, { SSL_OPT_VERIFY_HOST_CERT, { ResVerifyHostCert, aoffset(ssl.verify_host_cert), XRM_BOOLEAN } }, { SSL_OPT_STARTTLS, { ResStartTls, aoffset(ssl.starttls), XRM_BOOLEAN } }, { SSL_OPT_CA_DIR, { ResCaDir, aoffset(ssl.ca_dir), XRM_STRING } }, { SSL_OPT_CA_FILE, { ResCaFile, aoffset(ssl.ca_file), XRM_STRING } }, { SSL_OPT_CERT_FILE, { ResCertFile, aoffset(ssl.cert_file), XRM_STRING } }, { SSL_OPT_CERT_FILE_TYPE, { ResCertFileType,aoffset(ssl.cert_file_type), XRM_STRING } }, { SSL_OPT_CHAIN_FILE, { ResChainFile, aoffset(ssl.chain_file), XRM_STRING } }, { SSL_OPT_KEY_FILE, { ResKeyFile, aoffset(ssl.key_file), XRM_STRING } }, { SSL_OPT_KEY_FILE_TYPE, { ResKeyFileType, aoffset(ssl.key_file_type),XRM_STRING } }, { SSL_OPT_KEY_PASSWD, { ResKeyPasswd, aoffset(ssl.key_passwd), XRM_STRING } }, { SSL_OPT_CLIENT_CERT, { ResClientCert, aoffset(ssl.client_cert), XRM_STRING } } }; int n_res = (int)(sizeof(flagged_res) / sizeof(flagged_res[0])); unsigned n_ssl_res = 0; res_t *ssl_res; int add_ix = 0; int i; /* Fetch the list from the implementation. */ unsigned supported_options = sio_all_options_supported(); /* Match options against the supported ones. */ FOREACH_SSL_OPTS(opt) { if (supported_options & opt) { int j; for (j = 0; j < n_res; j++) { if (flagged_res[j].flag == opt) { n_ssl_res++; break; } } } } FOREACH_SSL_OPTS_END(opt); if (!n_ssl_res) { return; } /* Construct the list of resources to add. */ ssl_res = (res_t *)Malloc(n_ssl_res * sizeof(res_t)); i = 0; FOREACH_SSL_OPTS(opt) { if (supported_options & opt) { int j; for (j = 0; j < n_res; j++) { if (flagged_res[j].flag == opt) { ssl_res[add_ix++] = flagged_res[j].res; /* struct copy */ } } } i++; } FOREACH_SSL_OPTS_END(opt); /* Add them. */ register_resources(ssl_res, n_ssl_res); } /* * Register SSL-specific options and resources. */ void sio_register(void) { add_ssl_opts(); add_ssl_resources(); } /* * Translate an option flag to its name. */ const char * sio_option_name(unsigned option) { /* Option names, in bitmap order. */ static const char *sio_option_names[] = { ResAcceptHostname, ResVerifyHostCert, ResStartTls, ResCaDir, ResCaFile, ResCertFile, ResCertFileType, ResChainFile, ResKeyFile, ResKeyFileType, ResKeyPasswd, ResClientCert }; int i = 0; FOREACH_SSL_OPTS(opt) { if (option & opt) { return sio_option_names[i]; } i++; } FOREACH_SSL_OPTS_END(opt); return NULL; } suite3270-3.6/Common/sio_none.c0000664000076500007650000000515013221577163014402 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sio_none.c * Secure I/O non-support. */ #include "globals.h" #include "ssl_config.h" #include "sio.h" #include "sioc.h" bool sio_supported(void) { return false; } sio_init_ret_t sio_init(ssl_config_t *config, const char *password, sio_t *sio_ret) { sioc_set_error("SSL/TLS not supported"); *sio_ret = NULL; return SI_FAILURE; } bool sio_negotiate(sio_t sio, socket_t sock, const char *hostname, bool *data) { sioc_set_error("SSL/TLS not supported"); *data = false; return false; } int sio_read(sio_t sio, char *buf, size_t buflen) { sioc_set_error("SSL/TLS not supported"); return SIO_FATAL_ERROR; } int sio_write(sio_t sio, const char *buf, size_t buflen) { sioc_set_error("SSL/TLS not supported"); return SIO_FATAL_ERROR; } void sio_close(sio_t sio) { } bool sio_secure_unverified(sio_t sio) { return false; } unsigned sio_options_supported(void) { return 0; } const char * sio_session_info(sio_t sio) { return "None"; } const char * sio_server_cert_info(sio_t sio) { return "None"; } const char * sio_provider(void) { return "None"; } suite3270-3.6/Common/sio_openssl.c0000664000076500007650000006243413221577163015136 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sio_openssl.c * Secure I/O via the OpenSSL library. */ #include "globals.h" #if defined(_WIN32) /*[*/ # error "Not supported on Windows" #endif /*]*/ #include #include #include #include #include #include "ssl_config.h" #include "sio.h" #include "sioc.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #if !defined(LIBRESSL_VERSION_NUMBER) /*[*/ # if OPENSSL_VERSION_NUMBER >= 0x10100000L /*[*/ # define OPENSSL110 # endif /*]*/ # if OPENSSL_VERSION_NUMBER >= 0x10002000L /*[*/ # define OPENSSL102 # endif /*]*/ #endif /*]*/ /* Globals */ /* Statics */ typedef struct { ssl_config_t *config; SSL_CTX *ctx; SSL *con; socket_t sock; const char *hostname; char *accept_dnsname; char *password; bool need_password; bool secure_unverified; char *session_info; char *server_cert_info; } ssl_sio_t; static ssl_sio_t *current_sio; #if OPENSSL_VERSION_NUMBER >= 0x00907000L /*[*/ # define INFO_CONST const #else /*][*/ # define INFO_CONST #endif /*]*/ static void client_info_callback(INFO_CONST SSL *s, int where, int ret); #if !defined(OPENSSL102) /*[*/ static char *spc_verify_cert_hostname(X509 *cert, const char *hostname); #endif /*]*/ /* Verify function. */ static int ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx _is_unused) { /* * Succeed if OpenSSL already thinks the cert is okay, or if we're not * supposed to check. */ return preverify_ok || !current_sio->config->verify_host_cert; } #if !defined(OPENSSL102) /*[*/ /* * Check the name in the host certificate. * * Returns true if the certificate is okay (or doesn't need to be), false if * the connection should fail because of a bad certificate. */ static bool check_cert_name(ssl_sio_t *s) { X509 *cert; char *unmatched_names; cert = SSL_get_peer_certificate(s->con); if (cert == NULL) { if (s->config->verify_host_cert) { sioc_set_error("No host certificate"); return false; } else { s->secure_unverified = true; vtrace("No host certificate.\n"); return true; } } unmatched_names = spc_verify_cert_hostname(cert, (s->accept_dnsname != NULL)? s->accept_dnsname: s->hostname); if (unmatched_names != NULL) { X509_free(cert); if (s->config->verify_host_cert) { sioc_set_error("Host certificate name(s) do not match '%s':\n%s", s->hostname, unmatched_names); return false; } else { char *reason; s->secure_unverified = true; vtrace("Host certificate name(s) do not match hostname.\n"); reason = xs_buffer("Host certificate name(s) do not match '%s': " "%s", s->hostname, unmatched_names); Free(reason); return true; } Free(unmatched_names); } X509_free(cert); return true; } #endif /*]*/ /* Password callback. */ static int passwd_cb(char *buf, int size, int rwflag _is_unused, void *userdata) { ssl_sio_t *s = (ssl_sio_t *)userdata; int pass_len; char *p; bool need_free = false; if (s->password != NULL) { /* Interactive password overrides everything else. */ p = s->password; } else if (s->config->key_passwd == NULL) { /* No configured password. We need to ask the GUI. Fail for now. */ s->need_password = true; return 0; } else { /* Parse the configured password. */ p = sioc_parse_password_spec(s->config->key_passwd); if (p == NULL) { return 0; } need_free = true; } pass_len = (int)strlen(p); if (pass_len > size - 1) { pass_len = size - 1; } strncpy(buf, p, pass_len); buf[pass_len] = '\0'; if (need_free) { Free(p); } return pass_len; } static int parse_file_type(const char *s) { if (s == NULL || !strcasecmp(s, "pem")) { return SSL_FILETYPE_PEM; } else if (!strcasecmp(s, "asn1")) { return SSL_FILETYPE_ASN1; } else { return -1; } } static char * get_ssl_error(char *buf) { unsigned long e; e = ERR_get_error(); if (getenv("SSL_VERBOSE_ERRORS")) { (void) ERR_error_string(e, buf); } else { char xbuf[120]; char *colon; (void) ERR_error_string(e, xbuf); colon = strrchr(xbuf, ':'); if (colon != NULL) { strcpy(buf, colon + 1); } else { strcpy(buf, xbuf); } } return buf; } /* One-time initialization. */ static void base_init(void) { static bool initted = false; if (initted) { return; } initted = true; #if defined(OPENSSL110) /*[*/ OPENSSL_init_ssl(0, NULL); #else /*][*/ SSL_load_error_strings(); SSL_library_init(); #endif /*]*/ } /* Returns true if secure I/O is supported. */ bool sio_supported(void) { return true; } #if !defined(OPENSSL102) /*[*/ /* Hostname match function. */ static int hostname_matches(const char *hostname, const char *cn, size_t len) { /* * If the name from the certificate contains an embedded NUL, then by * definition it will not match the hostname. */ if (strlen(cn) < len) { return 0; } /* * Try a direct comparison. */ if (!strcasecmp(hostname, cn)) { return 1; } /* * Try a wild-card comparison. */ if (!strncmp(cn, "*.", 2) && strlen(hostname) > strlen(cn + 1) && !strcasecmp(hostname + strlen(hostname) - strlen(cn + 1), cn + 1)) { return 1; } return 0; } /* * Certificate hostname expansion function. * Mostly, this expands NULs. */ static char * expand_hostname(const char *cn, size_t len) { static char buf[1024]; int ix = 0; if (len > sizeof(buf) / 2 + 1) { len = sizeof(buf) / 2 + 1; } while (len--) { char c = *cn++; if (c) { buf[ix++] = c; } else { buf[ix++] = '\\'; buf[ix++] = '0'; } } buf[ix] = '\0'; return buf; } /* * Add a unique element to a NULL-terminated list of strings. * Return the old list, or free it and return a new one. */ static char ** add_to_namelist(char **list, char *item) { char **new; int count; if (list == NULL) { /* First element. */ new = (char **)Malloc(2 * sizeof(char *)); new[0] = NewString(item); new[1] = NULL; return new; } /* Count the number of elements, and bail if we find a match. */ for (count = 0; list[count] != NULL; count++) { if (!strcasecmp(list[count], item)) { return list; } } new = (char **)Malloc((count + 2) * sizeof(char *)); memcpy(new, list, count * sizeof(char *)); Free(list); new[count] = NewString(item); new[count + 1] = NULL; return new; } /* * Free a namelist. */ static void free_namelist(char **list) { int i; for (i = 0; list[i] != NULL; i++) { Free(list[i]); } Free(list); } /* * Expand a namelist into text. */ static char * expand_namelist(char **list) { int i; char *r = NULL; if (list != NULL) { for (i = 0; list[i] != NULL; i++) { char *new; new = xs_buffer("%s%s%s", r? r: "", r? " ": "", list[i]); Replace(r, new); } } return r? r: NewString("(none)"); } #endif /*]*/ #if !defined(OPENSSL102) /*[*/ /* Hostname validation function. */ static char * spc_verify_cert_hostname(X509 *cert, const char *hostname) { int ok = 0; X509_NAME *subj; char name[256]; GENERAL_NAMES *values; GENERAL_NAME *value; int num_an, i; unsigned char *dns; int len; char **namelist = NULL; char *nnl; /* Check the common name. */ if (!ok && (subj = X509_get_subject_name(cert)) && (len = X509_NAME_get_text_by_NID(subj, NID_commonName, name, sizeof(name))) > 0) { name[sizeof(name) - 1] = '\0'; if (!strcmp(hostname, "*") || hostname_matches(hostname, name, len)) { ok = 1; vtrace("SSL_connect: commonName %s matches hostname %s\n", name, hostname); } else { vtrace("SSL_connect: non-matching commonName: %s\n", expand_hostname(name, len)); nnl = xs_buffer("DNS:%s", expand_hostname(name, len)); namelist = add_to_namelist(namelist, nnl); Free(nnl); } } /* Check the alternate names. */ if (!ok && (values = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0))) { num_an = sk_GENERAL_NAME_num(values); for (i = 0; i < num_an && !ok; i++) { value = sk_GENERAL_NAME_value(values, i); if (value->type == GEN_DNS) { len = ASN1_STRING_to_UTF8(&dns, value->d.dNSName); if (!strcmp(hostname, "*") || hostname_matches(hostname, (char *)dns, len)) { ok = 1; vtrace("SSL_connect: alternameName DNS:%s matches " "hostname %s\n", expand_hostname((char *)dns, len), hostname); OPENSSL_free(dns); break; } else { vtrace("SSL_connect: non-matching alternateName: DNS:%s\n", expand_hostname((char *)dns, len)); nnl = xs_buffer("DNS:%s", expand_hostname((char *)dns, len)); namelist = add_to_namelist(namelist, nnl); Free(nnl); } OPENSSL_free(dns); } if (ok) { break; } } } if (ok) { if (namelist) { free_namelist(namelist); } return NULL; } else if (namelist == NULL) { return NewString("(none)"); } else { nnl = expand_namelist(namelist); free_namelist(namelist); return nnl; } } #endif /*]*/ /* * Create a new OpenSSL connection. */ sio_init_ret_t sio_init(ssl_config_t *config, const char *password, sio_t *sio_ret) { ssl_sio_t *s = NULL; char err_buf[120]; int cert_file_type = SSL_FILETYPE_PEM; sio_init_ret_t err_ret = SI_FAILURE; sioc_error_reset(); /* Base initialization. */ base_init(); s = (ssl_sio_t *)Malloc(sizeof(ssl_sio_t)); memset(s, 0, sizeof(*s)); s->sock = INVALID_SOCKET; #if defined(OPENSSL110) /*[*/ s->ctx = SSL_CTX_new(TLS_method()); #else /*][*/ s->ctx = SSL_CTX_new(SSLv23_method()); #endif /*]*/ if (s->ctx == NULL) { sioc_set_error("SSL_CTX_new failed"); goto fail; } SSL_CTX_set_options(s->ctx, SSL_OP_ALL); SSL_CTX_set_info_callback(s->ctx, client_info_callback); SSL_CTX_set_default_passwd_cb_userdata(s->ctx, s); SSL_CTX_set_default_passwd_cb(s->ctx, passwd_cb); s->con = SSL_new(s->ctx); if (s->con == NULL) { sioc_set_error("SSL_new failed"); goto fail; } s->config = config; SSL_set_verify_depth(s->con, 64); vtrace("SSL: will%s verify host certificate\n", s->config->verify_host_cert? "": " not"); if (password != NULL) { s->password = NewString(password); } /* Parse the -accepthostname option. */ if (s->config->accept_hostname != NULL) { if (!strcasecmp(s->config->accept_hostname, "any") || !strcmp(s->config->accept_hostname, "*")) { s->accept_dnsname = "*"; } else if (!strncasecmp(s->config->accept_hostname, "DNS:", 4) && s->config->accept_hostname[4] != '\0') { s->accept_dnsname = &s->config->accept_hostname[4]; } else if (!strncasecmp(s->config->accept_hostname, "IP:", 3) && s->config->accept_hostname[3] != '\0') { sioc_set_error("Cannot use 'IP:' for acceptHostname"); goto fail; } else { s->accept_dnsname = s->config->accept_hostname; } } /* Pull in the CA certificate file. */ if (s->config->ca_file != NULL || s->config->ca_dir != NULL) { if (SSL_CTX_load_verify_locations(s->ctx, s->config->ca_file, s->config->ca_dir) != 1) { sioc_set_error("CA database load (%s%s%s%s%s%s%s%s%s) failed:\n%s", s->config->ca_file? "file ": "", s->config->ca_file? "\"": "", s->config->ca_file? s->config->ca_file: "", s->config->ca_file? "\"": "", (s->config->ca_file && s->config->ca_dir)? ", ": "", s->config->ca_dir? "dir ": "", s->config->ca_dir? "\"": "", s->config->ca_dir? s->config->ca_dir: "", s->config->ca_dir? "\"": "", get_ssl_error(err_buf)); goto fail; } } else { SSL_CTX_set_default_verify_paths(s->ctx); } /* Pull in the client certificate file. */ if (s->config->chain_file != NULL) { if (SSL_CTX_use_certificate_chain_file(s->ctx, s->config->chain_file) != 1) { sioc_set_error("Client certificate chain file load (\"%s\") " "failed:\n%s", s->config->chain_file, get_ssl_error(err_buf)); goto fail; } } else if (s->config->cert_file != NULL) { cert_file_type = parse_file_type(s->config->cert_file_type); if (cert_file_type == -1) { sioc_set_error("Invalid client certificate file type '%s'", s->config->cert_file_type); goto fail; } if (SSL_CTX_use_certificate_file(s->ctx, s->config->cert_file, cert_file_type) != 1) { sioc_set_error("Client certificate file load (\"%s\") failed:\n%s", s->config->cert_file, get_ssl_error(err_buf)); goto fail; } } /* Pull in the private key file. */ if (s->config->key_file != NULL) { int key_file_type = parse_file_type(s->config->key_file_type); if (key_file_type == -1) { sioc_set_error("Invalid private key file type '%s'", s->config->key_file_type); goto fail; } if (SSL_CTX_use_PrivateKey_file(s->ctx, s->config->key_file, key_file_type) != 1) { sioc_set_error("Private key file load (\"%s\") failed:\n%s", s->config->key_file, get_ssl_error(err_buf)); err_ret = s->need_password? SI_NEED_PASSWORD: SI_WRONG_PASSWORD; goto fail; } } else if (s->config->chain_file != NULL) { if (SSL_CTX_use_PrivateKey_file(s->ctx, s->config->chain_file, SSL_FILETYPE_PEM) != 1) { sioc_set_error("Private key file load (\"%s\") failed:\n%s", s->config->chain_file, get_ssl_error(err_buf)); err_ret = s->need_password? SI_NEED_PASSWORD: SI_WRONG_PASSWORD; goto fail; } } else if (s->config->cert_file != NULL) { if (SSL_CTX_use_PrivateKey_file(s->ctx, s->config->cert_file, cert_file_type) != 1) { sioc_set_error("Private key file load (\"%s\") failed:\n%s", s->config->cert_file, get_ssl_error(err_buf)); err_ret = s->need_password? SI_NEED_PASSWORD: SI_WRONG_PASSWORD; goto fail; } } /* Check the key. */ if (s->config->key_file != NULL && SSL_CTX_check_private_key(s->ctx) != 1) { sioc_set_error("Private key check failed:\n%s", get_ssl_error(err_buf)); goto fail; } /* Success. */ *sio_ret = (sio_t *)s; return SI_SUCCESS; fail: /* Failure. */ if (s != NULL) { if (s->ctx != NULL) { SSL_CTX_free(s->ctx); s->ctx = NULL; } if (s->con != NULL) { SSL_free(s->con); s->con = NULL; } if (s->password != NULL) { Free(s->password); s->password = NULL; } Free(s); } return err_ret; } /* Callback for tracing protocol negotiation. */ static void client_info_callback(INFO_CONST SSL *s, int where, int ret) { if (where == SSL_CB_CONNECT_LOOP) { vtrace("SSL_connect trace: %s %s\n", SSL_state_string(s), SSL_state_string_long(s)); } else if (where == SSL_CB_CONNECT_EXIT) { if (ret == 0) { vtrace("SSL_connect trace: failed in %s\n", SSL_state_string_long(s)); } else if (ret < 0) { unsigned long e; char err_buf[1024]; char *st; char *colon; err_buf[0] = '\n'; e = ERR_get_error(); if (e != 0) { (void) ERR_error_string(e, err_buf + 1); } else if (errno != 0) { strcpy(err_buf + 1, strerror(errno)); } else { err_buf[0] = '\0'; } st = xs_buffer("SSL_connect trace: error in %s%s", SSL_state_string_long(s), err_buf); if ((colon = strrchr(st, ':')) != NULL) { *colon = '\n'; } sioc_set_error("%s", st); Free(st); } } } /* Display a certificate. */ void display_cert(varbuf_t *v, X509 *cert, int level, const char *who) { EVP_PKEY *pkey; BIO *mem; long nw; char *p; /* Public key. */ if ((pkey = X509_get_pubkey(cert)) == NULL) { vb_appendf(v, "%*sError getting cert public key\n", level, ""); } if (pkey != NULL) { vb_appendf(v, "%*s%sPublic key: %d bit ", level, "", who, EVP_PKEY_bits(pkey)); switch (EVP_PKEY_base_id(pkey)) { case EVP_PKEY_RSA: vb_appendf(v, "RSA"); break; case EVP_PKEY_DSA: vb_appendf(v, "DSA"); break; default: vb_appendf(v, "non-RSA/DSA"); break; } vb_appendf(v, "\n"); } /* Subject and issuer. */ mem = BIO_new(BIO_s_mem()); X509_NAME_print_ex(mem, X509_get_subject_name(cert), 0, XN_FLAG_ONELINE | XN_FLAG_SEP_CPLUS_SPC | XN_FLAG_FN_SN); nw = BIO_get_mem_data(mem, &p); vb_appendf(v, "%*s%sSubject: %.*s\n", level, "", who, (int)nw, p); BIO_free(mem); mem = BIO_new(BIO_s_mem()); X509_NAME_print_ex(mem, X509_get_issuer_name(cert), 0, XN_FLAG_ONELINE | XN_FLAG_SEP_CPLUS_SPC | XN_FLAG_FN_SN); nw = BIO_get_mem_data(mem, &p); vb_appendf(v, "%*s%sIssuer: %.*s\n", level, "", who, (int)nw, p); BIO_free(mem); /* Alternate names. */ if (level == 0) { GENERAL_NAMES *values; GENERAL_NAME *value; int num_an, j, len; unsigned char *dns; if ((values = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0))) { bool header = false; num_an = sk_GENERAL_NAME_num(values); for (j = 0; j < num_an; j++) { value = sk_GENERAL_NAME_value(values, j); if (value->type == GEN_DNS) { len = ASN1_STRING_to_UTF8(&dns, value->d.dNSName); if (!header) { vb_appendf(v, "%*sAlternate DNS names:", level, ""); header = true; } vb_appendf(v, " %.*s", len, (char *)dns); OPENSSL_free(dns); } } if (header) { vb_appendf(v, "\n"); } } } } /* Display session info. */ static void display_session(varbuf_t *v, SSL *con) { vb_appendf(v, "Version: %s\n", SSL_get_version(con)); vb_appendf(v, "Cipher: %s\n", SSL_get_cipher_name(con)); } /* Display server certificate info. */ static void display_server_cert(varbuf_t *v, SSL *con) { X509 *cert; STACK_OF(X509) *chain; int i; chain = SSL_get_peer_cert_chain(con); if (chain == NULL) { cert = SSL_get_peer_certificate(con); if (cert == NULL) { vb_appendf(v, "Error getting server cert\n"); return; } chain = sk_X509_new_null(); sk_X509_push(chain, cert); } for (i = 0; i < sk_X509_num(chain); i++) { char *who = i? xs_buffer("CA %d ", i): ""; cert = sk_X509_value(chain, i); display_cert(v, cert, 0, who); if (i > 0) { Free(who); } } } /* * Negotiate an SSL connection. * Returns true for success, false for failure. * If it returns false, the socket should be disconnected. */ bool sio_negotiate(sio_t sio, socket_t sock, const char *hostname, bool *data) { ssl_sio_t *s; int rv; varbuf_t v; size_t len; long vr; sioc_error_reset(); *data = false; if (sio == NULL) { sioc_set_error("NULL sio"); return false; } s = (ssl_sio_t *)sio; if (s->con == NULL || s->sock != INVALID_SOCKET) { sioc_set_error("Invalid sio"); return false; } vtrace("Starting OpenSSL negotiation, host '%s'", hostname); if (s->accept_dnsname != NULL) { vtrace(", accept name '%s'", s->accept_dnsname); } vtrace(".\n"); s->sock = sock; s->hostname = hostname; #if defined(OPENSSL102) /*[*/ /* Have OpenSSL verify the hostname. */ if (s->config->verify_host_cert && (s->accept_dnsname == NULL || strcmp(s->accept_dnsname, "*"))) { X509_VERIFY_PARAM *param = SSL_get0_param(s->con); if (!X509_VERIFY_PARAM_set1_host(param, (s->accept_dnsname != NULL)? s->accept_dnsname: s->hostname, 0)) { char err_buf[1024]; sioc_set_error("Set host failed:\n%s", get_ssl_error(err_buf)); return false; } } #endif /*]*/ SSL_set_verify(s->con, SSL_VERIFY_PEER, ssl_verify_callback); /* Set up the TLS/SSL connection. */ if (SSL_set_fd(s->con, (int)s->sock) != 1) { vtrace("OpenSSL sio_negotiate: can't set fd\n"); return false; } current_sio = s; rv = SSL_connect(s->con); current_sio = NULL; if (s->config->verify_host_cert) { vr = SSL_get_verify_result(s->con); if (vr != X509_V_OK) { sioc_set_error("Host certificate verification failed:\n%s (%ld)", X509_verify_cert_error_string(vr), vr); return false; } } else { s->secure_unverified = true; } if (rv != 1) { char err_buf[120]; sioc_set_error("SSL_connect failed:\n%s", get_ssl_error(err_buf)); return false; } #if !defined(OPENSSL102) /*[*/ /* Check the host certificate. */ if (!check_cert_name(s)) { vtrace("disconnect: check_cert_name failed\n"); return false; } #endif /*]*/ /* Display the session info. */ vb_init(&v); display_session(&v, s->con); s->session_info = vb_consume(&v); len = strlen(s->session_info); if (len > 0 && s->session_info[len - 1] == '\n') { s->session_info[len - 1] = '\0'; } /* Display the server cert. */ vb_init(&v); display_server_cert(&v, s->con); s->server_cert_info = vb_consume(&v); len = strlen(s->server_cert_info); if (len > 0 && s->server_cert_info[len - 1] == '\n') { s->server_cert_info[len - 1] = '\0'; } return true; } /* * Read encrypted data from a socket. * Returns the data length, SIO_EOF for EOF, SIO_FATAL_ERROR for a fatal error, * SIO_NONFATAL_ERROR for a non-fatal error. */ int sio_read(sio_t sio, char *buf, size_t buflen) { ssl_sio_t *s; int nr; sioc_error_reset(); if (sio == NULL) { sioc_set_error("NULL sio"); return SIO_FATAL_ERROR; } s = (ssl_sio_t *)sio; if (s->con == NULL || s->sock == INVALID_SOCKET) { sioc_set_error("Invalid sio"); return SIO_FATAL_ERROR; } nr = SSL_read(s->con, buf, buflen); if (nr < 0) { unsigned long e; char err_buf[120]; if (errno == EWOULDBLOCK) { vtrace("SSL_read: EWOULDBLOCK\n"); return SIO_EWOULDBLOCK; } e = ERR_get_error(); if (e != 0) { (void) ERR_error_string(e, err_buf); } else { strcpy(err_buf, "unknown error"); } vtrace("RCVD SSL_read error %ld (%s)\n", e, err_buf); sioc_set_error("SSL_read:\n%s", err_buf); return SIO_FATAL_ERROR; } return nr; } /* * Write encrypted data on the socket. * Returns the data length or SIO_FATAL_ERROR. */ int sio_write(sio_t sio, const char *buf, size_t buflen) { ssl_sio_t *s; int nw; sioc_error_reset(); if (sio == NULL) { sioc_set_error("NULL sio"); return SIO_FATAL_ERROR; } s = (ssl_sio_t *)sio; if (s->con == NULL || s->sock == INVALID_SOCKET) { sioc_set_error("Invalid sio"); return SIO_FATAL_ERROR; } nw = SSL_write(s->con, buf, (int)buflen); if (nw < 0) { unsigned long e; char err_buf[120]; e = ERR_get_error(); (void) ERR_error_string(e, err_buf); vtrace("RCVD SSL_write error %ld (%s)\n", e, err_buf); sioc_set_error("SSL_write:\n%s", err_buf); return SIO_FATAL_ERROR; } return nw; } /* Closes the SSL connection. */ void sio_close(sio_t sio) { ssl_sio_t *s; if (sio == NULL) { return; } s = (ssl_sio_t *)sio; if (s->con == NULL || s->sock == INVALID_SOCKET) { return; } if (s->ctx != NULL) { SSL_CTX_free(s->ctx); s->ctx = NULL; } if (s->password != NULL) { Free(s->password); s->password = NULL; } if (s->session_info != NULL) { Free(s->session_info); s->session_info = NULL; } if (s->server_cert_info != NULL) { Free(s->server_cert_info); s->server_cert_info = NULL; } SSL_shutdown(s->con); SSL_free(s->con); s->con = NULL; s->sock = INVALID_SOCKET; Free(s); } /* * Returns true if the current connection is unverified. */ bool sio_secure_unverified(sio_t sio) { ssl_sio_t *s = (ssl_sio_t *)sio; return (s != NULL)? s->secure_unverified: false; } /* * Returns a bitmap of the supported options. */ unsigned sio_options_supported(void) { return SSL_OPT_CA_DIR | SSL_OPT_CA_FILE | SSL_OPT_CERT_FILE | SSL_OPT_CERT_FILE_TYPE | SSL_OPT_CHAIN_FILE | SSL_OPT_KEY_FILE | SSL_OPT_KEY_FILE_TYPE | SSL_OPT_KEY_PASSWD; } /* * Returns session info. */ const char * sio_session_info(sio_t sio) { ssl_sio_t *s = (ssl_sio_t *)sio; return (s != NULL)? s->session_info: NULL; } /* * Returns server certificate info. */ const char * sio_server_cert_info(sio_t sio) { ssl_sio_t *s = (ssl_sio_t *)sio; return (s != NULL)? s->server_cert_info: NULL; } /* * Returns the name of the provider. */ const char * sio_provider(void) { return SSLeay_version(SSLEAY_VERSION); } suite3270-3.6/Common/sio_secure_transport.c0000775000076500007650000007447613221577163017071 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sio_secure_transport.c * Secure I/O via the MacOS Secure Transport facility. */ #include "globals.h" #include #include #include #include "lazya.h" #include "ssl_config.h" #include "sio.h" #include "sioc.h" #include "ssl_passwd_gui.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #define ARRAY_SIZE(n) (int)(sizeof(n) / sizeof(n[0])) /* Globals */ /* Statics */ typedef struct { socket_t sock; /* socket */ const char *hostname; /* server name */ bool secure_unverified; /* true if server cert not verified */ SSLContextRef context; /* secure transport context */ char *session_info; /* session information */ char *server_cert_info; /* server cert information */ } stransport_sio_t; static ssl_config_t *config; static char *interactive_password; #define CIPHER(s) { s, #s } typedef struct { int value; const char *name; } cipher_name_t; cipher_name_t cipher_names[] = { CIPHER(SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA), CIPHER(SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA), CIPHER(SSL_DHE_DSS_WITH_DES_CBC_SHA), CIPHER(SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA), CIPHER(SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(SSL_DHE_RSA_WITH_DES_CBC_SHA), CIPHER(SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA), CIPHER(SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA), CIPHER(SSL_DH_DSS_WITH_DES_CBC_SHA), CIPHER(SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA), CIPHER(SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(SSL_DH_RSA_WITH_DES_CBC_SHA), CIPHER(SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA), CIPHER(SSL_DH_anon_EXPORT_WITH_RC4_40_MD5), CIPHER(SSL_DH_anon_WITH_3DES_EDE_CBC_SHA), CIPHER(SSL_DH_anon_WITH_DES_CBC_SHA), CIPHER(SSL_DH_anon_WITH_RC4_128_MD5), CIPHER(SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA), CIPHER(SSL_FORTEZZA_DMS_WITH_NULL_SHA), CIPHER(SSL_NO_SUCH_CIPHERSUITE), CIPHER(SSL_NULL_WITH_NULL_NULL), CIPHER(SSL_RSA_EXPORT_WITH_DES40_CBC_SHA), CIPHER(SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5), CIPHER(SSL_RSA_EXPORT_WITH_RC4_40_MD5), CIPHER(SSL_RSA_WITH_3DES_EDE_CBC_MD5), CIPHER(SSL_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(SSL_RSA_WITH_DES_CBC_MD5), CIPHER(SSL_RSA_WITH_DES_CBC_SHA), CIPHER(SSL_RSA_WITH_IDEA_CBC_MD5), CIPHER(SSL_RSA_WITH_IDEA_CBC_SHA), CIPHER(SSL_RSA_WITH_NULL_MD5), CIPHER(SSL_RSA_WITH_NULL_SHA), CIPHER(SSL_RSA_WITH_RC2_CBC_MD5), CIPHER(SSL_RSA_WITH_RC4_128_MD5), CIPHER(SSL_RSA_WITH_RC4_128_SHA), CIPHER(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_DHE_DSS_WITH_AES_128_CBC_SHA), CIPHER(TLS_DHE_DSS_WITH_AES_128_CBC_SHA256), CIPHER(TLS_DHE_DSS_WITH_AES_128_GCM_SHA256), CIPHER(TLS_DHE_DSS_WITH_AES_256_CBC_SHA), CIPHER(TLS_DHE_DSS_WITH_AES_256_CBC_SHA256), CIPHER(TLS_DHE_DSS_WITH_AES_256_GCM_SHA384), CIPHER(TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_DHE_PSK_WITH_AES_128_CBC_SHA), CIPHER(TLS_DHE_PSK_WITH_AES_128_CBC_SHA256), CIPHER(TLS_DHE_PSK_WITH_AES_128_GCM_SHA256), CIPHER(TLS_DHE_PSK_WITH_AES_256_CBC_SHA), CIPHER(TLS_DHE_PSK_WITH_AES_256_CBC_SHA384), CIPHER(TLS_DHE_PSK_WITH_AES_256_GCM_SHA384), CIPHER(TLS_DHE_PSK_WITH_NULL_SHA), CIPHER(TLS_DHE_PSK_WITH_NULL_SHA256), CIPHER(TLS_DHE_PSK_WITH_NULL_SHA384), CIPHER(TLS_DHE_PSK_WITH_RC4_128_SHA), CIPHER(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_DHE_RSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_DHE_RSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256), CIPHER(TLS_DHE_RSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_DH_DSS_WITH_AES_128_CBC_SHA), CIPHER(TLS_DH_DSS_WITH_AES_128_CBC_SHA256), CIPHER(TLS_DH_DSS_WITH_AES_128_GCM_SHA256), CIPHER(TLS_DH_DSS_WITH_AES_256_CBC_SHA), CIPHER(TLS_DH_DSS_WITH_AES_256_CBC_SHA256), CIPHER(TLS_DH_DSS_WITH_AES_256_GCM_SHA384), CIPHER(TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_DH_RSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_DH_RSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_DH_RSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_DH_RSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_DH_RSA_WITH_AES_256_CBC_SHA256), CIPHER(TLS_DH_RSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_DH_anon_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_DH_anon_WITH_AES_128_CBC_SHA), CIPHER(TLS_DH_anon_WITH_AES_128_CBC_SHA256), CIPHER(TLS_DH_anon_WITH_AES_128_GCM_SHA256), CIPHER(TLS_DH_anon_WITH_AES_256_CBC_SHA), CIPHER(TLS_DH_anon_WITH_AES_256_CBC_SHA256), CIPHER(TLS_DH_anon_WITH_AES_256_GCM_SHA384), CIPHER(TLS_DH_anon_WITH_RC4_128_MD5), CIPHER(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384), CIPHER(TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_ECDHE_ECDSA_WITH_NULL_SHA), CIPHER(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA), CIPHER(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384), CIPHER(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_ECDHE_RSA_WITH_NULL_SHA), CIPHER(TLS_ECDHE_RSA_WITH_RC4_128_SHA), CIPHER(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384), CIPHER(TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_ECDH_ECDSA_WITH_NULL_SHA), CIPHER(TLS_ECDH_ECDSA_WITH_RC4_128_SHA), CIPHER(TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384), CIPHER(TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_ECDH_RSA_WITH_NULL_SHA), CIPHER(TLS_ECDH_RSA_WITH_RC4_128_SHA), CIPHER(TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_ECDH_anon_WITH_AES_128_CBC_SHA), CIPHER(TLS_ECDH_anon_WITH_AES_256_CBC_SHA), CIPHER(TLS_ECDH_anon_WITH_NULL_SHA), CIPHER(TLS_ECDH_anon_WITH_RC4_128_SHA), CIPHER(TLS_EMPTY_RENEGOTIATION_INFO_SCSV), CIPHER(TLS_NULL_WITH_NULL_NULL), CIPHER(TLS_PSK_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA), CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA256), CIPHER(TLS_PSK_WITH_AES_128_GCM_SHA256), CIPHER(TLS_PSK_WITH_AES_256_CBC_SHA), CIPHER(TLS_PSK_WITH_AES_256_CBC_SHA384), CIPHER(TLS_PSK_WITH_AES_256_GCM_SHA384), CIPHER(TLS_PSK_WITH_NULL_SHA), CIPHER(TLS_PSK_WITH_NULL_SHA256), CIPHER(TLS_PSK_WITH_NULL_SHA384), CIPHER(TLS_PSK_WITH_RC4_128_SHA), CIPHER(TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_RSA_PSK_WITH_AES_128_CBC_SHA), CIPHER(TLS_RSA_PSK_WITH_AES_128_CBC_SHA256), CIPHER(TLS_RSA_PSK_WITH_AES_128_GCM_SHA256), CIPHER(TLS_RSA_PSK_WITH_AES_256_CBC_SHA), CIPHER(TLS_RSA_PSK_WITH_AES_256_CBC_SHA384), CIPHER(TLS_RSA_PSK_WITH_AES_256_GCM_SHA384), CIPHER(TLS_RSA_PSK_WITH_NULL_SHA), CIPHER(TLS_RSA_PSK_WITH_NULL_SHA256), CIPHER(TLS_RSA_PSK_WITH_NULL_SHA384), CIPHER(TLS_RSA_PSK_WITH_RC4_128_SHA), CIPHER(TLS_RSA_WITH_3DES_EDE_CBC_SHA), CIPHER(TLS_RSA_WITH_AES_128_CBC_SHA), CIPHER(TLS_RSA_WITH_AES_128_CBC_SHA256), CIPHER(TLS_RSA_WITH_AES_128_GCM_SHA256), CIPHER(TLS_RSA_WITH_AES_256_CBC_SHA), CIPHER(TLS_RSA_WITH_AES_256_CBC_SHA256), CIPHER(TLS_RSA_WITH_AES_256_GCM_SHA384), CIPHER(TLS_RSA_WITH_NULL_MD5), CIPHER(TLS_RSA_WITH_NULL_SHA), CIPHER(TLS_RSA_WITH_NULL_SHA256), CIPHER(TLS_RSA_WITH_RC4_128_MD5), CIPHER(TLS_RSA_WITH_RC4_128_SHA), { 0, NULL } }; /* Record an error from a Secure Transport call. */ static void set_oserror(OSStatus status, const char *fmt, ...) { va_list args; char *t; CFStringRef errmsg; va_start(args, fmt); t = xs_vbuffer(fmt, args); va_end(args); errmsg = SecCopyErrorMessageString(status, NULL); if (errmsg != NULL) { sioc_set_error("%s: %s", t, CFStringGetCStringPtr(errmsg, kCFStringEncodingASCII)); CFRelease(errmsg); } else { sioc_set_error("%s: Error %d", t, (int)status); } Free(t); } /* Read function called by Secure Transport. */ OSStatus read_func(SSLConnectionRef connection, void *data, size_t *data_length) { stransport_sio_t *s = (stransport_sio_t *)connection; int nr; size_t n_read = 0; if (s->sock == INVALID_SOCKET) { *data_length = 0; return errSecIO; } /* * They want us to return all of the data, or errSSLWouldBlock. * For now, we operate in blocking mode, so we just keep trying. */ while (n_read < *data_length) { nr = recv(s->sock, (char *)data + n_read, *data_length - n_read, 0); vtrace("SSL: read %d/%d bytes\n", nr, (int)(*data_length - n_read)); if (nr < 0) { vtrace("SSL recv: %s\n", strerror(errno)); *data_length = n_read; return errSecIO; } else if (nr == 0) { *data_length = n_read; return errSSLClosedGraceful; } n_read += nr; } *data_length = n_read; return errSecSuccess; } /* Write function called by Secure Transport. */ OSStatus write_func(SSLConnectionRef connection, const void *data, size_t *data_length) { stransport_sio_t *s = (stransport_sio_t *)connection; int nw; if (s->sock == INVALID_SOCKET) { *data_length = 0; return errSecIO; } nw = send(s->sock, data, *data_length, 0); vtrace("SSL: wrote %d/%d bytes\n", nw, (int)*data_length); if (nw < 0) { vtrace("SSL send: %s\n", strerror(errno)); *data_length = 0; return errSecIO; } else { *data_length = nw; return errSecSuccess; } } /* Get the subject or issuer name details from a cert. */ static char * name_details(CFArrayRef array) { const void *keys[] = { kSecOIDCommonName, kSecOIDEmailAddress, kSecOIDOrganizationalUnitName, kSecOIDOrganizationName, kSecOIDLocalityName, kSecOIDStateProvinceName, kSecOIDCountryName }; static const char *labels[] = { "CN", "E", "OU", "O", "L", "S", "C", "E" }; varbuf_t v; char *comma = ""; vb_init(&v); for (int i = 0; i < ARRAY_SIZE(keys); i++) { CFIndex n; for (n = 0 ; n < CFArrayGetCount(array); n++) { CFDictionaryRef dict; CFTypeRef dictkey; CFStringRef str; char buf[1024]; dict = CFArrayGetValueAtIndex(array, n); if (CFGetTypeID(dict) != CFDictionaryGetTypeID()) { continue; } dictkey = CFDictionaryGetValue(dict, kSecPropertyKeyLabel); if (!CFEqual(dictkey, keys[i])) { continue; } str = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue); if (CFStringGetCString(str, buf, sizeof(buf), kCFStringEncodingUTF8)) { vb_appendf(&v, "%s%s=%s", comma, labels[i], buf); comma = ", "; } } } return vb_consume(&v); } /* Get the alternate names from a cert. */ static char * alt_names(CFArrayRef array) { const void *keys[] = { CFSTR("DNS Name") /* XXX: There must be a constant for this */ }; varbuf_t v; char *comma = ""; int i; vb_init(&v); for (i = 0; i < ARRAY_SIZE(keys); i++) { CFIndex n; for (n = 0 ; n < CFArrayGetCount(array); n++) { CFDictionaryRef dict; CFTypeRef dictkey; CFStringRef str; char buf[1024]; dict = CFArrayGetValueAtIndex(array, n); if (CFGetTypeID(dict) != CFDictionaryGetTypeID()) { continue; } dictkey = CFDictionaryGetValue(dict, kSecPropertyKeyLabel); if (!CFEqual(dictkey, keys[i])) { continue; } str = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue); if (CFStringGetCString(str, buf, sizeof(buf), kCFStringEncodingUTF8)) { vb_appendf(&v, "%s%s", comma, buf); comma = ", "; } } } return vb_consume(&v); } /* Get details from a cert. */ static char * cert_details(const char *prefix, SecCertificateRef certificateRef) { CFErrorRef error; const void *keys[] = { kSecOIDX509V1SubjectName, kSecOIDX509V1IssuerName, kSecOIDSubjectAltName }; static const void *labels[] = { "Subject", "Issuer", "Subject alternate names" }; static char *(*decoders[])(CFArrayRef) = { name_details, name_details, alt_names }; CFArrayRef keySelection = CFArrayCreate(NULL, keys, ARRAY_SIZE(keys), &kCFTypeArrayCallBacks); CFDictionaryRef vals = SecCertificateCopyValues(certificateRef, keySelection, &error); varbuf_t v; int i; vb_init(&v); /* So I can see the OIDs and figure out which one is the alt name. */ for (i = 0; i < ARRAY_SIZE(keys); i++) { CFDictionaryRef dict; CFArrayRef values; char *s; dict = CFDictionaryGetValue(vals, keys[i]); if (dict == NULL) { continue; } values = CFDictionaryGetValue(dict, kSecPropertyKeyValue); if (values == NULL) { continue; } s = decoders[i](values); vb_appendf(&v, "%s%s: %s\n", prefix, labels[i], s); Free(s); } CFRelease(vals); return vb_consume(&v); } /* Display certificate information. */ static void display_cert(varbuf_t *v, const char *prefix, SecCertificateRef cert) { #if defined(LONG_DESC_IS_USEFUL) /*[*/ CFStringRef desc = SecCertificateCopyLongDescription(NULL, cert, NULL); if (desc != NULL) { char text[1024]; memset(text, 0, sizeof(text)); if (CFStringGetCString(desc, text, sizeof(text), kCFStringEncodingUTF8)) { vb_appendf(v, "%s cert: %s\n", prefix, text); } CFRelease(desc); } #endif /*]*/ char *s = cert_details(prefix, cert); vb_appends(v, s); Free(s); } /* Convert a cipher to its name. */ const char * cipher_name(int n) { int i; struct { const char *orig; const char *subst; } substs[] = { { "_", " " }, { "WITH", "with" }, { "NULL", "null" }, { "FORTEZZA", "Fortezza" }, { NULL, NULL } }; for (i = 0; cipher_names[i].name != NULL; i++) { if (cipher_names[i].value == n) { char *s = lazyaf("%s", cipher_names[i].name); int j; for (j = 0; substs[j].orig != NULL; j++) { char *t; while ((t = strstr(s, substs[j].orig)) != NULL) { strncpy(t, substs[j].subst, strlen(substs[j].subst)); } } return s; } } return lazyaf("0x%x\n", n); } /* Display connection info. */ static void display_connection_info(varbuf_t *v, stransport_sio_t *s) { OSStatus status; SSLProtocol protocol; SSLCipherSuite cipher_suite; status = SSLGetNegotiatedProtocolVersion(s->context, &protocol); if (status == errSecSuccess) { vb_appendf(v, "Protocol version: "); switch (protocol) { case kSSLProtocol2: vb_appendf(v, "SSL 2"); break; case kSSLProtocol3: vb_appendf(v, "SSL 3"); break; case kTLSProtocol1: vb_appendf(v, "TLS 1.0"); break; case kTLSProtocol11: vb_appendf(v, "TLS 1.1"); break; case kTLSProtocol12: vb_appendf(v, "TLS 1.2"); break; default: vb_appendf(v, "0x%x", (unsigned)protocol); break; } vb_appendf(v, "\n"); } status = SSLGetNegotiatedCipher(s->context, &cipher_suite); if (status == errSecSuccess) { vb_appendf(v, "Cipher: %s\n", cipher_name(cipher_suite)); } } /* Display server cert info. */ static void display_server_cert(varbuf_t *v, stransport_sio_t *s) { OSStatus status; SecTrustRef trust = NULL; status = SSLCopyPeerTrust(s->context, &trust); if (status == errSecSuccess && trust != NULL) { CFIndex count = SecTrustGetCertificateCount(trust); CFIndex i; for (i = 0L ; i < count ; i++) { char *prefix = ""; if (i) { prefix = lazyaf("CA %d ", i); } display_cert(v, prefix, SecTrustGetCertificateAtIndex(trust, i)); } CFRelease(trust); } } /* Create a CFDataRef from the contents of a file. */ static CFDataRef dataref_from_file(const char *path) { char *accum = NULL; size_t n_accum = 0; CFDataRef dataref; accum = sioc_string_from_file(path, &n_accum); if (accum == NULL) { return NULL; } dataref = CFDataCreate(NULL, (UInt8 *)accum, n_accum); Free(accum); return dataref; } /* Copy the identity from a file. */ static OSStatus identity_from_file(const char *path, const char *password, SecIdentityRef *identity_ret) { CFDataRef pkcs_data = dataref_from_file(path); if (pkcs_data == NULL) { return errSecItemNotFound; } else { CFStringRef pass_string = (password != NULL)? CFStringCreateWithCString(NULL, password, kCFStringEncodingUTF8) : NULL; const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { pass_string }; CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, (pass_string != NULL)? 1L: 0L, NULL, NULL); CFArrayRef items = NULL; OSStatus status = SecPKCS12Import(pkcs_data, options, &items); if (status == errSecSuccess && items != NULL && CFArrayGetCount(items)) { CFDictionaryRef identity_and_trust = CFArrayGetValueAtIndex(items, 0L); const void *identity = CFDictionaryGetValue(identity_and_trust, kSecImportItemIdentity); /* We only need the identity. */ CFRetain(identity); *identity_ret = (SecIdentityRef)identity; } if (items != NULL) { CFRelease(items); } CFRelease(options); CFRelease(pkcs_data); if (pass_string != NULL) { CFRelease(pass_string); } return status; } } /* * Get an identity from a certificate in the keychain, based on the common * name. */ static OSStatus identity_from_keychain(char *name, SecIdentityRef *identity_ret) { # define KEY_ENTRIES 4 OSStatus status; CFTypeRef keys[KEY_ENTRIES]; CFTypeRef values[KEY_ENTRIES]; CFDictionaryRef query_dict; CFArrayRef ids; /* Assume we will return nothing. */ *identity_ret = NULL; /* * Set up search criteria. * The Apple docs imply that you can search for a match against the * common name, e.g. kSecMatchSubjectWholeString. It doesn't appear to * work; you get back all certificates. So the result needs to be searched * manually for a common name match. */ keys[0] = kSecClass; values[0] = kSecClassIdentity; /* want identity (cert and key) */ keys[1] = kSecReturnRef; values[1] = kCFBooleanTrue; /* want a reference */ keys[2] = kSecMatchLimit; values[2] = kSecMatchLimitAll; /* all of them */ keys[3] = kSecMatchPolicy; values[3] = SecPolicyCreateSSL(false, NULL); /* just SSL certs */ query_dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, KEY_ENTRIES, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFRelease(values[3]); /* the policy */ /* Search for a common name match. */ status = SecItemCopyMatching(query_dict, (CFTypeRef *)&ids); CFRelease(query_dict); if (status == errSecSuccess) { CFIndex count = CFArrayGetCount(ids); CFIndex i; bool matched = false; /* TODO: Could do a case-independent match, or a substring match. */ vtrace("identity_from_keychain: Got %d match%s\n", (int)count, ((int)count == 1)? "": "es"); for (i = 0; i < count && !matched; i++) { SecIdentityRef identity = (SecIdentityRef)CFArrayGetValueAtIndex(ids, i); SecCertificateRef cert = NULL; if (SecIdentityCopyCertificate(identity, &cert) == errSecSuccess) { CFStringRef cf_common_name; char common_name[1024]; if (SecCertificateCopyCommonName(cert, &cf_common_name) == errSecSuccess) { if (CFStringGetCString(cf_common_name, common_name, sizeof(common_name), kCFStringEncodingUTF8) && !strcmp(name, common_name)) { CFRetain(identity); *identity_ret = identity; matched = true; } CFRelease(cf_common_name); } CFRelease(cert); } } CFRelease(ids); return matched? errSecSuccess: errSecItemNotFound; } return status; } /* Set up the client certificate. */ static sio_init_ret_t set_client_cert(stransport_sio_t *s) { OSStatus status; SecIdentityRef identity = NULL; char *cert_name; if (config->cert_file != NULL) { char *password = NULL; bool need_free = false; if (interactive_password != NULL) { password = interactive_password; } else if (config->key_passwd != NULL) { password = sioc_parse_password_spec(config->key_passwd); if (password == NULL) { return SI_FAILURE; } need_free = true; } cert_name = config->cert_file; status = identity_from_file(cert_name, password, &identity); if (need_free) { Free(password); } } else if (config->client_cert != NULL) { cert_name = config->client_cert; status = identity_from_keychain(cert_name, &identity); } else { /* No client cert. */ return SI_SUCCESS; } if (status == errSecSuccess && identity != NULL) { SecCertificateRef cert = NULL; CFTypeRef certs_array[1]; CFArrayRef certs; /* Found it. */ status = SecIdentityCopyCertificate(identity, &cert); if (status == errSecSuccess) { varbuf_t v; vb_init(&v); display_cert(&v, "Client", cert); vtrace("%s", vb_buf(&v)); vb_free(&v); CFRelease(cert); } /* Set it. */ certs_array[0] = identity; certs = CFArrayCreate(NULL, (const void **)certs_array, 1L, &kCFTypeArrayCallBacks); status = SSLSetCertificate(s->context, certs); if (certs != NULL) { CFRelease(certs); } if (status != errSecSuccess) { set_oserror(status, "SSLSetCertificate"); return SI_FAILURE; } CFRelease(identity); return SI_SUCCESS; } /* Failure. */ switch (status) { case errSecAuthFailed: case errSecPkcs12VerifyFailure: sioc_set_error("Incorrect password for certificate \"%s\"", cert_name); return SI_WRONG_PASSWORD; case errSecDecode: case errSecUnknownFormat: sioc_set_error("Can't parse certificate certificate \"%s\"", cert_name); return SI_FAILURE; case errSecPassphraseRequired: sioc_set_error("Certificate \"%s\" requires a password", cert_name); return SI_NEED_PASSWORD; case errSecItemNotFound: sioc_set_error("Can't find certificate \"%s\"", cert_name); return SI_FAILURE; default: set_oserror(status, "Can't load certificate \"%s\"", cert_name); return SI_FAILURE; } } /* Free an SSL context. */ static void sio_free(stransport_sio_t *s) { s->sock = INVALID_SOCKET; SSLClose(s->context); CFRelease(s->context); s->context = NULL; if (s->session_info != NULL) { Free(s->session_info); s->session_info = NULL; } if (s->server_cert_info != NULL) { Free(s->server_cert_info); s->server_cert_info = NULL; } Free(s); } /* Returns true if secure I/O is supported. */ bool sio_supported(void) { return true; } /* * Create a new connection. */ sio_init_ret_t sio_init(ssl_config_t *c, const char *password, sio_t *sio_ret) { stransport_sio_t *s; OSStatus status; sio_init_ret_t ret = SI_SUCCESS; sioc_error_reset(); *sio_ret = NULL; config = c; s = (stransport_sio_t *)Malloc(sizeof(stransport_sio_t)); memset(s, 0, sizeof(*s)); s->sock = INVALID_SOCKET; s->context = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType); if (password != NULL) { Replace(interactive_password, NewString(password)); } status = SSLSetIOFuncs(s->context, read_func, write_func); if (status != errSecSuccess) { set_oserror(status, "SSLSetIOFuncs"); goto fail; } status = SSLSetConnection(s->context, s); if (status != errSecSuccess) { set_oserror(status, "SSLSetConnection"); goto fail; } if (!config->verify_host_cert) { status = SSLSetSessionOption(s->context, kSSLSessionOptionBreakOnServerAuth, true); if (status != errSecSuccess) { set_oserror(status, "SSLSetSessionOption"); goto fail; } } /* Set the client certificate, which could require a password. */ ret = set_client_cert(s); if (ret == SI_SUCCESS) { *sio_ret = (sio_t)s; return ret; } fail: sio_free(s); *sio_ret = NULL; return ret; } /* * Negotiate an SSL connection. * Returns true for success, false for failure. * If it returns false, the socket should be disconnected. * * Returns 'data' true if there is already protocol data pending. */ bool sio_negotiate(sio_t sio, socket_t sock, const char *hostname, bool *data) { stransport_sio_t *s; const char *accept_hostname = hostname; OSStatus status; varbuf_t v; size_t sl; sioc_error_reset(); *data = false; if (sio == NULL) { sioc_set_error("NULL sio"); return false; } s = (stransport_sio_t *)sio; if (s->sock != INVALID_SOCKET) { sioc_set_error("Invalid sio"); return false; } s->sock = sock; s->hostname = hostname; /* Perform handshake. */ if (config->accept_hostname != NULL) { if (!strncasecmp(accept_hostname, "DNS:", 4)) { accept_hostname = config->accept_hostname + 4; sioc_set_error("Empty acceptHostname"); goto fail; } else if (!strncasecmp(config->accept_hostname, "IP:", 3)) { sioc_set_error("Cannot use 'IP:' acceptHostname"); goto fail; } else if (!strcasecmp(config->accept_hostname, "any")) { sioc_set_error("Cannot use 'any' acceptHostname"); goto fail; } else { accept_hostname = config->accept_hostname; } } status = SSLSetPeerDomainName(s->context, accept_hostname, strlen(accept_hostname)); if (status != errSecSuccess) { set_oserror(status, "SSLSetPeerDomainName"); goto fail; } status = SSLHandshake(s->context); if (status != errSecSuccess && status != errSSLServerAuthCompleted) { set_oserror(status, "SSLHandshake"); goto fail; } if (status == errSSLServerAuthCompleted) { /* Do it again, to complete the handshake. */ status = SSLHandshake(s->context); if (status != errSecSuccess) { set_oserror(status, "SSLHandshake"); goto fail; } } /* Display connection info. */ vb_init(&v); display_connection_info(&v, s); s->session_info = vb_consume(&v); sl = strlen(s->session_info); if (sl > 0 && s->session_info[sl - 1] == '\n') { s->session_info[sl - 1] = '\0'; } /* Display server cert info. */ vb_init(&v); display_server_cert(&v, s); s->server_cert_info = vb_consume(&v); sl = strlen(s->server_cert_info); if (sl > 0 && s->server_cert_info[sl - 1] == '\n') { s->server_cert_info[sl - 1] = '\0'; } /* Success. */ s->secure_unverified = !config->verify_host_cert; return true; fail: return false; } /* * Read encrypted data from a socket. * Returns the data length, SIO_EOF for EOF, SIO_FATAL_ERROR for a fatal error, * SIO_EWOULDBLOCK for incomplete input. */ int sio_read(sio_t sio, char *buf, size_t buflen) { stransport_sio_t *s; OSStatus status; size_t n_read = 0; sioc_error_reset(); if (sio == NULL) { sioc_set_error("NULL sio"); return SIO_FATAL_ERROR; } s = (stransport_sio_t *)sio; if (s->sock == INVALID_SOCKET) { sioc_set_error("Invalid sio"); return SIO_FATAL_ERROR; } status = SSLRead(s->context, buf, buflen, &n_read); if (status == errSSLClosedGraceful || status == errSSLClosedNoNotify) { vtrace("SSL: EOF\n"); return 0; } if (status != errSecSuccess) { set_oserror(status, "SSLRead %d", status); return SIO_FATAL_ERROR; } return (int)n_read; } /* * Write encrypted data on the socket. * Returns the data length or SIO_FATAL_ERROR. */ int sio_write(sio_t sio, const char *buf, size_t buflen) { stransport_sio_t *s; OSStatus status; size_t n_written = 0; sioc_error_reset(); if (sio == NULL) { sioc_set_error("NULL sio"); return SIO_FATAL_ERROR; } s = (stransport_sio_t *)sio; if (s->sock == INVALID_SOCKET) { sioc_set_error("Invalid sio"); return SIO_FATAL_ERROR; } status = SSLWrite(s->context, buf, buflen, &n_written); if (status != errSecSuccess) { set_oserror(status, "SSLWrite"); return SIO_FATAL_ERROR; } return (int)buflen; } /* Closes the SSL connection. */ void sio_close(sio_t sio) { stransport_sio_t *s; if (sio == NULL) { return; } s = (stransport_sio_t *)sio; if (s->sock == INVALID_SOCKET) { return; } sio_free(s); } /* * Returns true if the current connection is unverified. */ bool sio_secure_unverified(sio_t sio) { stransport_sio_t *s = (stransport_sio_t *)sio; return s? s->secure_unverified: false; } /* * Returns a bitmap of the supported options. */ unsigned sio_options_supported(void) { return SSL_OPT_CERT_FILE | SSL_OPT_CLIENT_CERT | SSL_OPT_KEY_PASSWD; } const char * sio_session_info(sio_t sio) { stransport_sio_t *s = (stransport_sio_t *)sio; return (s != NULL)? s->session_info: NULL; } const char * sio_server_cert_info(sio_t sio) { stransport_sio_t *s = (stransport_sio_t *)sio; return (s != NULL)? s->server_cert_info: NULL; } const char * sio_provider(void) { return "Apple Secure Transport"; } suite3270-3.6/Common/split_host.c0000664000076500007650000001763513221577163014774 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * split_host.c * Host name parsing. */ #include "globals.h" #include "split_host.h" #include "utils.h" static char *pfxstr = "AaCcLlNnPpSsBbYy"; /** * Hostname parser. * [prefix:...][lu@]hostname[:port][=accept] * Backslashes to quote anything (including backslashes). * [ ] quotes : and @, e.g., [1:2::3] to quote an IPv6 numeric hostname. * * @param[in] raw Raw hostname, with possible decorations * @param[out] lu Returned Malloc'd LU name, or NULL * @param[out] host Returned Malloc'd hostname, isolated from other parts * @param[out] port Returned Malloc'd port, or NULL * @param[out] accept Returned Malloc'd accept hostname, or NULL * @param[out] prefixes Returned bitmap of prefixes, indexed by ACLNPSBY (bit 0 * is A, bit 1 is C, bit 2 is L, etc.) * @param[out] error Returned error text for failure, or NULL * * @return true for success, false for syntax error. */ bool new_split_host(char *raw, char **lu, char **host, char **port, char **accept, unsigned *prefixes, char **error) { char *start = raw; size_t sl = strlen(raw); char *s; char *uq = NULL; int uq_len = 0; char *qmap = NULL; char *rqmap; char *errmsg = "nonspecific"; bool rc = false; bool quoted = false; int bracketed = 0; int n_ch = 0; int n_at = 0; int n_colon = 0; int n_equal = 0; char *part[4] = { NULL, NULL, NULL, NULL }; int part_ix = 0; char *pfx; *lu = NULL; *host = NULL; *port = NULL; *accept = NULL; *prefixes = 0; *error = NULL; /* Trim leading and trailing blanks. */ while (sl && isspace((unsigned char)*start)) { start++; sl--; } while (sl && isspace((unsigned char)start[sl - 1])) { sl--; } if (!sl) { errmsg = "empty string"; goto done; } /* * 'start' now points to the start of the string, and sl is its length. */ /* * Create a bit-map of quoted characters. * This includes and character preceded by \, and any : or @ inside * unquoted [ and ]. * This can fail if an unquoted [ is found inside a [ ], or if an * unquoted [ is not terminated, or if whitespace is found. * Backslashes and unquoted square brackets are deleted at this point. * Leaves a filtered copy of the string in uq[]. */ uq = Malloc(sl + 1); qmap = Malloc(sl + 1); memset(qmap, ' ', sl); qmap[sl] = '\0'; rqmap = qmap; for (s = start; (size_t)(s - start) < sl; s++) { if (isspace((unsigned char)*s)) { errmsg = "contains whitespace"; goto done; } if (quoted) { qmap[uq_len] = '+'; quoted = false; uq[uq_len++] = *s; continue; } else if (*s == '\\') { quoted = true; continue; } if (bracketed) { if (*s == ':' || *s == '@') { qmap[uq_len] = '+'; /* add the character below */ } else if (*s == '[') { errmsg = "nested '['"; goto done; } else if (*s == ']') { /* * What follows has to be the end of the * string, or an unquoted ':' or a '@'. */ if ((size_t)(s - start) == sl - 1 || *(s + 1) == '@' || *(s + 1) == ':') { bracketed = 0; } else { errmsg = "text following ']'"; goto done; } continue; } } else if (*s == '[') { /* * Make sure that what came before is the beginning of * the string or an unquoted : or @. */ if (uq_len == 0 || (qmap[uq_len - 1] == ' ' && (uq[uq_len - 1] == ':' || uq[uq_len - 1] == '@'))) { bracketed = 1; } else { errmsg = "text preceding '['"; goto done; } continue; } uq[uq_len++] = *s; } if (quoted) { errmsg = "dangling '\\'"; goto done; } if (bracketed) { errmsg = "missing ']'"; goto done; } if (!uq_len) { errmsg = "empty hostname"; goto done; } uq[uq_len] = '\0'; /* Trim off prefixes. */ s = uq; while ((pfx = strchr(pfxstr, *s)) != NULL && qmap[(s + 1) - uq] == ' ' && *(s + 1) == ':') { *prefixes |= 1 << ((pfx - pfxstr) / 2); s += 2; rqmap += 2; } start = s; /* * Now check for syntax: [LUname@]hostname[:port][=accept] * So more than one @, more than one :, : before @, or no text before @ * or :, or no text after : are all syntax errors. * So is more than one = and no text after =. * This also lets us figure out which elements are there. */ while (*s) { if (rqmap[s - start] == ' ') { if (*s == '@') { if (n_ch == 0) { errmsg = "empty LU name"; goto done; } if (n_colon > 0) { errmsg = "'@' after ':'"; goto done; } if (n_equal > 0) { errmsg = "'@' after '='"; goto done; } if (n_at > 0) { errmsg = "double '@'"; goto done; } n_at++; n_ch = 0; } else if (*s == ':') { if (n_colon > 0) { errmsg = "double ':'"; goto done; } if (n_ch == 0) { errmsg = "empty hostname"; goto done; } if (n_equal > 0) { errmsg = "':' after '='"; goto done; } n_colon++; n_ch = 0; } else if (*s == '=') { if (n_equal > 0) { errmsg = "double '='"; goto done; } if (n_ch == 0) { errmsg = "empty accept name"; goto done; } n_equal++; n_ch = 0; } else { n_ch++; } } else { n_ch++; } s++; } if (!n_ch) { if (n_equal) { errmsg = "empty accept name"; } else if (n_colon) { errmsg = "empty port"; } else { errmsg = "empty hostname"; } goto done; } /* * The syntax is clean, and we know what parts there are. * Split them out. */ if (n_at) { *lu = Malloc(uq_len + 1); part[0] = *lu; } *host = Malloc(uq_len + 1); part[1] = *host; if (n_colon) { *port = Malloc(uq_len + 1); part[2] = *port; } if (n_equal) { *accept = Malloc(uq_len + 1); part[3] = *accept; } s = start; n_ch = 0; while (*s) { if (rqmap[s - start] == ' ' && (*s == '@' || *s == ':' || *s == '=')) { part[part_ix][n_ch] = '\0'; part_ix++; n_ch = 0; } else { while (part[part_ix] == NULL) { part_ix++; } part[part_ix][n_ch++] = *s; } s++; } part[part_ix][n_ch] = '\0'; /* Success! */ rc = true; done: if (uq != NULL) { Free(uq); } if (qmap != NULL) { Free(qmap); } if (!rc) { *error = xs_buffer("Hostname syntax error in '%s': %s", raw, errmsg); } return rc; } suite3270-3.6/Common/ssl_passwd_gui_stubs.c0000664000076500007650000000343713221577163017045 0ustar pdmpdm/* * Copyright (c) 2014-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ssl_passwd_gui_stubs.c * Stubs for the SSL password GUI. */ #include "globals.h" #include "ssl_passwd_gui.h" ssl_passwd_ret_t ssl_passwd_gui_callback(char *buf _is_unused, int size _is_unused, bool again _is_unused) { return SP_NOT_SUPPORTED; /* not supported */ } suite3270-3.6/Common/status_stubs.c0000664000076500007650000000457613221577163015347 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * status_stubs.c * Stub functions for status.c. */ #include "globals.h" #include "status.h" void status_compose(bool on _is_unused, unsigned char c _is_unused, enum keytype keytype _is_unused) { } void status_ctlr_done(void) { } void status_insert_mode(bool on _is_unused) { } void status_lu(const char *s _is_unused) { } void status_minus(void) { } void status_oerr(int error_type _is_unused) { } void status_reset(void) { } void status_reverse_mode(bool on _is_unused) { } void status_screentrace(int n _is_unused) { } void status_script(bool on _is_unused) { } void status_scrolled(int n _is_unused) { } void status_syswait(void) { } void status_timing(struct timeval *t0 _is_unused, struct timeval *t1 _is_unused) { } void status_twait(void) { } void status_typeahead(bool on _is_unused) { } void status_uncursor_pos(void) { } void status_untiming(void) { } suite3270-3.6/Common/tables.c0000664000076500007650000001262413221577163014047 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * tables.c * Translation tables between ASCII (actually ISO 8859-1) and * EBCDIC code page 37. */ #include "globals.h" #include "tables.h" const unsigned char ebc2asc0[256] = { /*00*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*08*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*10*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*18*/ 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x3b, 0x20, /*20*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*28*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*30*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*38*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*40*/ 0x20, 0x20, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, /*48*/ 0xe7, 0xf1, 0xa2, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /*50*/ 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, /*58*/ 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0xac, /*60*/ 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, /*68*/ 0xc7, 0xd1, 0xa6, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /*70*/ 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, /*78*/ 0xcc, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /*80*/ 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /*88*/ 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /*90*/ 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, /*98*/ 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /*a0*/ 0xb5, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /*a8*/ 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0xdd, 0xde, 0xae, /*b0*/ 0x5e, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, /*b8*/ 0xbd, 0xbe, 0x5b, 0x5d, 0xaf, 0xa8, 0xb4, 0xd7, /*c0*/ 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /*c8*/ 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /*d0*/ 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /*d8*/ 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xf9, 0xfa, 0xff, /*e0*/ 0x5c, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /*e8*/ 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /*f0*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /*f8*/ 0x38, 0x39, 0xb3, 0xdb, 0xdc, 0xd9, 0xda, 0x20 }; const unsigned char asc2ebc0[256] = { /*00*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*08*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*10*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*18*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*20*/ 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, /*28*/ 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, /*30*/ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /*38*/ 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, /*40*/ 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /*48*/ 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, /*50*/ 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, /*58*/ 0xe7, 0xe8, 0xe9, 0xba, 0xe0, 0xbb, 0xb0, 0x6d, /*60*/ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /*68*/ 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /*70*/ 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, /*78*/ 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0xa1, 0x00, /*80*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*88*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*90*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*98*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*a0*/ 0x41, 0xaa, 0x4a, 0xb1, 0x9f, 0xb2, 0x6a, 0xb5, /*a8*/ 0xbd, 0xb4, 0x9a, 0x8a, 0x5f, 0xca, 0xaf, 0xbc, /*b0*/ 0x90, 0x8f, 0xea, 0xfa, 0xbe, 0xa0, 0xb6, 0xb3, /*b8*/ 0x9d, 0xda, 0x9b, 0x8b, 0xb7, 0xb8, 0xb9, 0xab, /*c0*/ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9e, 0x68, /*c8*/ 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /*d0*/ 0xac, 0x69, 0xed, 0xee, 0xeb, 0xef, 0xec, 0xbf, /*d8*/ 0x80, 0xfd, 0xfe, 0xfb, 0xfc, 0xad, 0xae, 0x59, /*e0*/ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9c, 0x48, /*e8*/ 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /*f0*/ 0x8c, 0x49, 0xcd, 0xce, 0xcb, 0xcf, 0xcc, 0xe1, /*f8*/ 0x70, 0xdd, 0xde, 0xdb, 0xdc, 0x8d, 0x8e, 0xdf }; suite3270-3.6/Common/telnet.c0000664000076500007650000024403413221577163014072 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 2004, Don Russell. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES AND * GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, * DON RUSSELL, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet.c * This module initializes and manages a telnet socket to * the given IBM host. */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include # include #endif /*]*/ #define TELCMDS 1 #define TELOPTS 1 #include "arpa_telnet.h" #if !defined(_WIN32) /*[*/ # include #endif /*]*/ #include #include #if !defined(_WIN32) /*[*/ # include #endif /*]*/ #include #include "tn3270e.h" #include "3270ds.h" #include "appres.h" #include "actions.h" #include "b8.h" #include "ctlrc.h" #include "host.h" #include "indent_s.h" #include "kybd.h" #include "lazya.h" #include "linemode.h" #include "macros.h" #include "nvt.h" #include "popups.h" #include "proxy.h" #include "resolver.h" #include "sio.h" #include "sioc.h" #include "split_host.h" #include "ssl_passwd_gui.h" #include "status.h" #include "telnet.h" #include "telnet_core.h" #include "telnet_gui.h" #include "telnet_private.h" #include "telnet_sio.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #include "w3misc.h" #include "xio.h" #if !defined(TELOPT_NAWS) /*[*/ # define TELOPT_NAWS 31 #endif /*]*/ #if !defined(TELOPT_STARTTLS) /*[*/ # define TELOPT_STARTTLS 46 #endif /*]*/ #define TLS_FOLLOWS 1 #define BUFSZ 32768 #define TRACELINE 72 #define N_OPTS 256 /* Globals */ char *hostname = NULL; time_t ns_time; int ns_brcvd; int ns_rrcvd; int ns_bsent; int ns_rsent; unsigned char *obuf; /* 3270 output buffer */ unsigned char *obptr = (unsigned char *) NULL; int linemode = 1; #if defined(LOCAL_PROCESS) /*[*/ bool local_process = false; #endif /*]*/ char *termtype; const char *telquals[3] = { "IS", "SEND", "INFO" }; /* Statics */ static socket_t sock = INVALID_SOCKET; /* active socket */ #if defined(_WIN32) /*[*/ static HANDLE sock_handle = INVALID_HANDLE_VALUE; #endif /*]*/ static unsigned char myopts[N_OPTS], hisopts[N_OPTS]; /* telnet option flags */ static bool did_ne_send; static bool deferred_will_ttype; static unsigned char *ibuf = (unsigned char *) NULL; /* 3270 input buffer */ static unsigned char *ibptr; static int ibuf_size = 0; /* size of ibuf */ static unsigned char *obuf_base = NULL; static int obuf_size = 0; static unsigned char *netrbuf = NULL; /* network input buffer */ static unsigned char *sbbuf = NULL; /* telnet sub-option buffer */ static unsigned char *sbptr; static unsigned char telnet_state; static int syncing; #if !defined(_WIN32) /*[*/ static ioid_t output_id = NULL_IOID; #endif /*]*/ static ioid_t connect_timeout_id = NULL_IOID; /* explicit Connect timeout */ static ioid_t nop_timeout_id = NULL_IOID; static char ttype_tmpval[13]; static unsigned short e_xmit_seq; /* transmit sequence number */ static int response_required; static size_t nvt_data = 0; static int tn3270e_negotiated = 0; static enum { E_UNBOUND, E_3270, E_NVT, E_SSCP } tn3270e_submode = E_UNBOUND; static int tn3270e_bound = 0; static unsigned char *bind_image = NULL; static size_t bind_image_len = 0; static char *plu_name = NULL; static int maxru_sec = 0; static int maxru_pri = 0; static int bind_rd = 0; static int bind_cd = 0; static int bind_ra = 0; static int bind_ca = 0; #define BIND_DIMS_PRESENT 0x1 /* BIND included screen dimensions */ #define BIND_DIMS_ALT 0x2 /* BIND included alternate size */ #define BIND_DIMS_VALID 0x4 /* BIND screen sizes were valid */ static unsigned bind_state = 0; static char **lus = NULL; static char **curr_lu = NULL; static char *try_lu = NULL; static int proxy_type = 0; static char *proxy_host = NULL; static char *proxy_portname = NULL; static unsigned short proxy_port = 0; static b8_t e_funcs; /* negotiated TN3270E functions */ static bool secure_connection; static char *net_accept; static bool telnet_fsm(unsigned char c); static void net_rawout(unsigned const char *buf, size_t len); static void check_in3270(void); static void store3270in(unsigned char c); static void check_linemode(bool init); static int non_blocking(bool on); static void net_connected(void); static void connection_complete(void); static int tn3270e_negotiate(void); static int process_eor(void); static const char *tn3270e_function_names(const unsigned char *, int); static void tn3270e_subneg_send(unsigned char, b8_t *); static void tn3270e_fdecode(const unsigned char *, int, b8_t *); static void tn3270e_ack(void); static void tn3270e_nak(enum pds); static const char *nnn(int c); /* telnet states */ #define TNS_DATA 0 /* receiving data */ #define TNS_IAC 1 /* got an IAC */ #define TNS_WILL 2 /* got an IAC WILL */ #define TNS_WONT 3 /* got an IAC WONT */ #define TNS_DO 4 /* got an IAC DO */ #define TNS_DONT 5 /* got an IAC DONT */ #define TNS_SB 6 /* got an IAC SB */ #define TNS_SB_IAC 7 /* got an IAC after an IAC SB */ /* telnet predefined messages */ static unsigned char do_opt[] = { IAC, DO, '_' }; static unsigned char dont_opt[] = { IAC, DONT, '_' }; static unsigned char will_opt[] = { IAC, WILL, '_' }; static unsigned char wont_opt[] = { IAC, WONT, '_' }; static unsigned char functions_req[] = { IAC, SB, TELOPT_TN3270E, TN3270E_OP_FUNCTIONS }; static const char *reason_code[8] = { "CONN-PARTNER", "DEVICE-IN-USE", "INV-ASSOCIATE", "INV-NAME", "INV-DEVICE-TYPE", "TYPE-NAME-ERROR", "UNKNOWN-ERROR", "UNSUPPORTED-REQ" }; # define rsn(n) (((n) <= TN3270E_REASON_UNSUPPORTED_REQ)? \ reason_code[(n)]: "??") static const char *function_name[5] = { "BIND-IMAGE", "DATA-STREAM-CTL", "RESPONSES", "SCS-CTL-CODES", "SYSREQ" }; # define fnn(n) (((n) <= TN3270E_FUNC_SYSREQ)? \ function_name[(n)]: "??") static const char *data_type[9] = { "3270-DATA", "SCS-DATA", "RESPONSE", "BIND-IMAGE", "UNBIND", "NVT-DATA", "REQUEST", "SSCP-LU-DATA", "PRINT-EOJ" }; # define e_dt(n) (((n) <= TN3270E_DT_PRINT_EOJ)? \ data_type[(n)]: "??") static const char *req_flag[1] = { " ERR-COND-CLEARED" }; # define e_rq(fn, n) (((fn) == TN3270E_DT_REQUEST)? \ (((n) <= TN3270E_RQF_ERR_COND_CLEARED)? \ req_flag[(n)]: " ??"): "") static const char *hrsp_flag[3] = { "NO-RESPONSE", "ERROR-RESPONSE", "ALWAYS-RESPONSE" }; # define e_hrsp(n) (((n) <= TN3270E_RSF_ALWAYS_RESPONSE)? \ hrsp_flag[(n)]: "??") static const char *trsp_flag[2] = { "POSITIVE-RESPONSE", "NEGATIVE-RESPONSE" }; # define e_trsp(n) (((n) <= TN3270E_RSF_NEGATIVE_RESPONSE)? \ trsp_flag[(n)]: "??") # define e_rsp(fn, n) (((fn) == TN3270E_DT_RESPONSE)? e_trsp(n): e_hrsp(n)) #if !defined(_WIN32) /*[*/ # define XMIT_ROWS ((appres.c3270.altscreen)? MODEL_2_ROWS: maxROWS) # define XMIT_COLS ((appres.c3270.altscreen)? MODEL_2_COLS: maxCOLS) #else /*][*/ # define XMIT_ROWS maxROWS # define XMIT_COLS maxCOLS #endif /*]*/ sio_t sio = NULL; static void continue_tls(unsigned char *sbbuf, int len); static bool refused_tls = false; static bool nested_tls = false; static bool any_host_data = false; static bool need_tls_follows = false; static bool net_connect_pending; #if !defined(_WIN32) /*[*/ static void output_possible(iosrc_t fd, ioid_t id); #endif /*]*/ #if defined(_WIN32) /*[*/ # define socket_errno() WSAGetLastError() # define socket_strerror(n) win32_strerror(n) # define SE_EWOULDBLOCK WSAEWOULDBLOCK # define SE_ECONNRESET WSAECONNRESET # define SE_EINTR WSAEINTR # define SE_EAGAIN WSAEINPROGRESS # define SE_EPIPE WSAECONNABORTED # define SE_EINPROGRESS WSAEINPROGRESS # define SOCK_IOCTL(s, f, v) ioctlsocket(s, f, (DWORD *)v) # define IOCTL_T u_long #else /*][*/ # define socket_errno() errno # define socket_strerror(n) strerror(n) # define SE_EWOULDBLOCK EWOULDBLOCK # define SE_ECONNRESET ECONNRESET # define SE_EINTR EINTR # define SE_EAGAIN EAGAIN # define SE_EPIPE EPIPE # if defined(EINPROGRESS) /*[*/ # define SE_EINPROGRESS EINPROGRESS # endif /*]*/ # define SOCK_IOCTL ioctl # define IOCTL_T int #endif /*]*/ #if defined(SE_EINPROGRESS) /*[*/ # define IS_EINPROGRESS(e) ((e) == SE_EINPROGRESS) #else /*][*/ # define IS_EINPROGRESS(e) false #endif /*]*/ typedef union { struct sockaddr sa; struct sockaddr_in sin; #if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sin6; #endif /*]*/ } sockaddr_46_t; #define NUM_HA 4 static sockaddr_46_t haddr[NUM_HA]; static socklen_t ha_len[NUM_HA] = { sizeof(haddr[0]), sizeof(haddr[0]), sizeof(haddr[0]), sizeof(haddr[0]) }; static int num_ha = 0; static int ha_ix = 0; #if defined(_WIN32) /*[*/ void popup_a_sockerr(const char *fmt, ...) { va_list args; char *buffer; va_start(args, fmt); buffer = vlazyaf(fmt, args); va_end(args); popup_an_error("%s: %s", buffer, win32_strerror(socket_errno())); } #else /*][*/ void popup_a_sockerr(const char *fmt, ...) { va_list args; char *buffer; va_start(args, fmt); buffer = vlazyaf(fmt, args); va_end(args); popup_an_errno(errno, "%s", buffer); } #endif /*]*/ /* The host connection timed out. */ static void connect_timed_out(ioid_t id _is_unused) { popup_an_error("Host connection timed out"); connect_timeout_id = NULL_IOID; host_disconnect(true); } /* Connect to one of the addresses in haddr[]. */ static iosrc_t connect_to(int ix, bool noisy, bool *pending) { int on = 1; char hn[256]; char pn[256]; char *errmsg; #if defined(OMTU) /*[*/ int mtu = OMTU; #endif /*]*/ # define close_fail { (void) SOCK_CLOSE(sock); \ sock = INVALID_SOCKET; \ return INVALID_IOSRC; \ } /* create the socket */ if ((sock = socket(haddr[ix].sa.sa_family, SOCK_STREAM, 0)) == INVALID_SOCKET) { popup_a_sockerr("socket"); return INVALID_IOSRC; } /* set options for inline out-of-band data and keepalives */ if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)) < 0) { popup_a_sockerr("setsockopt(SO_OOBINLINE)"); close_fail; } if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) { popup_a_sockerr("setsockopt(SO_KEEPALIVE)"); close_fail; } #if defined(OMTU) /*[*/ if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&mtu, sizeof(mtu)) < 0) { popup_a_sockerr("setsockopt(SO_SNDBUF)"); close_fail; } #endif /*]*/ /* set the socket to be non-delaying */ if (non_blocking(true) < 0) { close_fail; } #if !defined(_WIN32) /*[*/ /* don't share the socket with our children */ (void) fcntl(sock, F_SETFD, 1); #endif /*]*/ /* init ssl */ if (HOST_FLAG(SSL_HOST)) { if (!sio_supported()) { popup_an_error("SSL/TLS not supported\n"); close_fail; } } if (numeric_host_and_port(&haddr[ix].sa, ha_len[ix], hn, sizeof(hn), pn, sizeof(pn), &errmsg)) { vtrace("Trying %s, port %s...\n", hn, pn); telnet_gui_connecting(hn, pn); } /* Set an explicit timeout, if configured. */ if (appres.connect_timeout) { connect_timeout_id = AddTimeOut(appres.connect_timeout * 1000, connect_timed_out); } /* connect */ if (connect(sock, &haddr[ix].sa, ha_len[ix]) == -1) { if (socket_errno() == SE_EWOULDBLOCK || IS_EINPROGRESS(socket_errno())) { vtrace("TCP connection pending.\n"); *pending = true; #if !defined(_WIN32) /*[*/ output_id = AddOutput(sock, output_possible); #endif /*]*/ } else { if (noisy) { popup_a_sockerr("Connect to %s, port %d", hostname, current_port); } close_fail; } } else { if (non_blocking(false) < 0) { close_fail; } net_connected(); /* net_connected() can cause the connection to fail. */ if (sock == INVALID_SOCKET) { close_fail; } } /* all done */ #if defined(_WIN32) /*[*/ sock_handle = CreateEvent(NULL, FALSE, FALSE, NULL); if (sock_handle == NULL) { fprintf(stderr, "Cannot create socket handle: %s\n", win32_strerror(GetLastError())); x3270_exit(1); } if (WSAEventSelect(sock, sock_handle, FD_READ | FD_CONNECT | FD_CLOSE) != 0) { fprintf(stderr, "WSAEventSelect failed: %s\n", win32_strerror(GetLastError())); x3270_exit(1); } return sock_handle; #else /*][*/ return sock; #endif /*]*/ } /* * net_connect * Establish a telnet socket to the given host passed as an argument. * Called only once and is responsible for setting up the telnet * variables. Returns the file descriptor of the connected socket. */ net_connect_t net_connect(const char *host, char *portname, char *accept, bool ls, iosrc_t *iosrc) { struct servent *sp; struct hostent *hp; char passthru_haddr[8]; int passthru_len = 0; unsigned short passthru_port = 0; char *errmsg; iosrc_t s; *iosrc = INVALID_IOSRC; if (netrbuf == NULL) { netrbuf = (unsigned char *)Malloc(BUFSZ); } linemode_init(); environ_init(); Replace(hostname, NewString(host)); net_accept = accept; /* set up temporary termtype */ if (appres.termname != NULL) { termtype = appres.termname; } else if (appres.nvt_mode || HOST_FLAG(ANSI_HOST)) { termtype = "xterm"; } else if (ov_rows || ov_cols) { termtype = "IBM-DYNAMIC"; } else if (HOST_FLAG(STD_DS_HOST)) { (void) snprintf(ttype_tmpval, sizeof(ttype_tmpval), "IBM-327%c-%d", appres.m3279? '9': '8', model_num); termtype = ttype_tmpval; } else { termtype = full_model_name; } /* get the passthru host and port number */ if (HOST_FLAG(PASSTHRU_HOST)) { const char *hn; hn = getenv("INTERNET_HOST"); if (hn == NULL) { hn = "internet-gateway"; } hp = gethostbyname(hn); if (hp == (struct hostent *) 0) { popup_an_error("Unknown passthru host: %s", hn); return NC_FAILED; } (void) memmove(passthru_haddr, hp->h_addr, hp->h_length); passthru_len = hp->h_length; sp = getservbyname("telnet-passthru","tcp"); if (sp != NULL) { passthru_port = sp->s_port; } else { passthru_port = htons(3514); } } else if (appres.proxy != NULL && !proxy_type) { proxy_type = proxy_setup(appres.proxy, &proxy_host, &proxy_portname); if (proxy_type > 0) { unsigned long lport; char *ptr; struct servent *sp; lport = strtoul(portname, &ptr, 0); if (ptr == portname || *ptr != '\0' || lport == 0L || lport & ~0xffff) { if (!(sp = getservbyname(portname, "tcp"))) { popup_an_error("Unknown port number or service: %s", portname); return NC_FAILED; } current_port = ntohs(sp->s_port); } else { current_port = (unsigned short)lport; } } if (proxy_type < 0) { return NC_FAILED; } } /* fill in the socket address of the given host */ (void) memset((char *) &haddr, 0, sizeof(haddr)); if (HOST_FLAG(PASSTHRU_HOST)) { /* * XXX: We don't try multiple addresses for the passthru * host. */ haddr[0].sin.sin_family = AF_INET; (void) memmove(&haddr[0].sin.sin_addr, passthru_haddr, passthru_len); haddr[0].sin.sin_port = passthru_port; ha_len[0] = sizeof(struct sockaddr_in); num_ha = 1; ha_ix = 0; } else if (proxy_type > 0) { /* * XXX: We don't try multiple addresses for a proxy * host. */ rhp_t rv; rv = resolve_host_and_port(proxy_host, proxy_portname, 0, &proxy_port, &haddr[0].sa, &ha_len[0], &errmsg, NULL); if (RHP_IS_ERROR(rv)) { popup_an_error("%s", errmsg); return NC_FAILED; } num_ha = 1; ha_ix = 0; } else { #if defined(LOCAL_PROCESS) /*[*/ if (ls) { local_process = true; } else { #endif /*]*/ int i; int last = false; rhp_t rv; #if defined(LOCAL_PROCESS) /*[*/ local_process = false; #endif /*]*/ num_ha = 0; for (i = 0; i < NUM_HA && !last; i++) { rv = resolve_host_and_port(host, portname, i, ¤t_port, &haddr[i].sa, &ha_len[i], &errmsg, &last); if (RHP_IS_ERROR(rv)) { popup_an_error("%s", errmsg); return NC_FAILED; } num_ha++; } ha_ix = 0; #if defined(LOCAL_PROCESS) /*[*/ } #endif /*]*/ } #if defined(LOCAL_PROCESS) /*[*/ if (local_process) { int amaster; struct winsize w; w.ws_row = XMIT_ROWS; w.ws_col = XMIT_COLS; w.ws_xpixel = 0; w.ws_ypixel = 0; switch (forkpty(&amaster, NULL, NULL, &w)) { case -1: /* failed */ popup_an_errno(errno, "forkpty"); close_fail; case 0: /* child */ putenv("TERM=xterm"); if (strchr(host, ' ') != NULL) { (void) execlp("/bin/sh", "sh", "-c", host, NULL); } else { char *arg1; arg1 = strrchr(host, '/'); (void) execlp(host, (arg1 == NULL)? host: arg1 + 1, NULL); } perror(host); _exit(1); break; default: /* parent */ sock = amaster; (void) fcntl(sock, F_SETFD, 1); connection_complete(); host_in3270(CONNECTED_NVT); break; } *iosrc = sock; return NC_CONNECTED; } #endif /*]*/ /* Set up the SSL context, whether this is an SSL host or not. */ if (sio_supported()) { bool pending = false; sio = sio_init_wrapper(NULL, HOST_FLAG(NO_VERIFY_CERT_HOST), net_accept, &pending); if (sio == NULL) { if (pending) { net_connect_pending = true; return NC_SSL_PASS; } net_disconnect(false); return NC_FAILED; } } /* Try each of the haddrs. */ while (ha_ix < num_ha) { bool pending = false; if ((s = connect_to(ha_ix, (ha_ix == num_ha - 1), &pending)) != INVALID_IOSRC) { *iosrc = s; return pending? NC_CONNECT_PENDING: NC_CONNECTED; } ha_ix++; } /* Ran out. */ return NC_FAILED; } #undef close_fail /* Set up the LU list. */ static void setup_lus(void) { char *lu; char *comma; int n_lus = 1; int i; connected_lu = NULL; connected_type = NULL; if (!luname[0]) { Replace(lus, NULL); curr_lu = NULL; try_lu = NULL; return; } /* * Count the commas in the LU name. That plus one is the * number of LUs to try. */ lu = luname; while ((comma = strchr(lu, ',')) != NULL) { n_lus++; lu++; } /* * Allocate enough memory to construct an argv[] array for * the LUs. */ Replace(lus, (char **)Malloc((n_lus+1) * sizeof(char *) + strlen(luname) + 1)); /* Copy each LU into the array. */ lu = (char *)(lus + n_lus + 1); (void) strcpy(lu, luname); i = 0; do { lus[i++] = lu; comma = strchr(lu, ','); if (comma != NULL) { *comma = '\0'; lu = comma + 1; } } while (comma != NULL); lus[i] = NULL; curr_lu = lus; try_lu = *curr_lu; } /* Send a periodic TELNET NOP. */ static void send_nop(ioid_t id _is_unused) { static unsigned char nop[] = { IAC, NOP }; vtrace("SENT NOP\n"); net_rawout(nop, sizeof(nop)); if (cstate != NOT_CONNECTED) { nop_timeout_id = AddTimeOut(appres.nop_seconds * 1000, send_nop); } } static void net_connected_complete(void) { /* Done with SSL or proxy. */ if (appres.nvt_mode || HOST_FLAG(ANSI_HOST)) { host_in3270(CONNECTED_NVT); } else { cstate = CONNECTED_INITIAL; } /* set up telnet options */ memset((char *)myopts, 0, sizeof(myopts)); memset((char *)hisopts, 0, sizeof(hisopts)); did_ne_send = false; deferred_will_ttype = false; b8_zero(&e_funcs); b8_set_bit(&e_funcs, TN3270E_FUNC_BIND_IMAGE); b8_set_bit(&e_funcs, TN3270E_FUNC_RESPONSES); b8_set_bit(&e_funcs, TN3270E_FUNC_SYSREQ); e_xmit_seq = 0; response_required = TN3270E_RSF_NO_RESPONSE; need_tls_follows = false; telnet_state = TNS_DATA; ibptr = ibuf; /* clear statistics and flags */ (void) time(&ns_time); ns_brcvd = 0; ns_rrcvd = 0; ns_bsent = 0; ns_rsent = 0; syncing = 0; tn3270e_negotiated = 0; tn3270e_submode = E_UNBOUND; tn3270e_bound = 0; setup_lus(); check_linemode(true); /* write out the passthru hostname and port nubmer */ if (HOST_FLAG(PASSTHRU_HOST)) { char *buf; buf = xs_buffer("%s %d\r\n", hostname, current_port); (void) send(sock, buf, (int)strlen(buf), 0); Free(buf); } /* set up NOP transmission */ if (appres.nop_seconds != 0) { nop_timeout_id = AddTimeOut(appres.nop_seconds * 1000, send_nop); } } static void net_connected(void) { bool data = false; /* Cancel the timeout. */ if (connect_timeout_id != NULL_IOID) { RemoveTimeOut(connect_timeout_id); connect_timeout_id = NULL_IOID; } /* * If the connection went through on the first connect() call, then * our state is NOT_CONNECTED, so host_disconnect() will not call back * net_disconnect(). That would be bad. So set the state to something * non-zero. */ cstate = NEGOTIATING; if (proxy_type > 0) { /* Negotiate with the proxy. */ vtrace("Connected to proxy server %s, port %u.\n", proxy_host, proxy_port); if (!proxy_negotiate(proxy_type, sock, hostname, current_port)) { host_disconnect(true); return; } } vtrace("Connected to %s, port %u%s.\n", hostname, current_port, HOST_FLAG(SSL_HOST)? " via SSL": ""); /* Set up SSL. */ if (HOST_FLAG(SSL_HOST) && sio != NULL && !secure_connection) { bool rv; char *session, *cert; rv = sio_negotiate(sio, sock, hostname, &data); if (!rv) { /* No need to trace the error, it was already displayed. */ popup_an_error("%s", sio_last_error()); host_disconnect(true); return; } secure_connection = true; session = indent_s(sio_session_info(sio)); cert = indent_s(sio_server_cert_info(sio)); vtrace("Connection is now secure.\n" "Provider: %s\n" "Session:\n%s\nServer certificate:\n%s\n", sio_provider(), session, cert); Free(session); Free(cert); /* Tell everyone else again. */ host_connected(); } net_connected_complete(); if (data) { vtrace("Reading extra data after negotiation\n"); net_input(INVALID_IOSRC, NULL_IOID); } } /* * net_password_continue * Called by the password GUI when a password has been entered. */ void net_password_continue(char *password) { bool pending; iosrc_t s; if (!net_connect_pending) { /* Connection is gone. */ return; } net_connect_pending = false; /* Try initializing sio again, with a new password. */ if ((sio = sio_init_wrapper(password, HOST_FLAG(NO_VERIFY_CERT_HOST), net_accept, &pending)) == NULL) { if (pending) { /* Still pending, try again. */ net_connect_pending = true; } return; } /* Try connecting. */ while (ha_ix < num_ha) { s = connect_to(ha_ix, (ha_ix == num_ha - 1), &pending); if (s != INVALID_IOSRC) { host_newfd(s); host_new_connection(pending); break; } ha_ix++; } } /* * remove_output * Cancel the callback for output available. */ static void remove_output(void) { #if !defined(_WIN32) /*[*/ if (output_id != NULL_IOID) { RemoveInput(output_id); output_id = NULL_IOID; } #endif /*]*/ } /* * connection_complete * The connection appears to be complete (output is possible or input * appeared ready but recv() returned EWOULDBLOCK). Complete the * connection-completion processing. */ static void connection_complete(void) { #if !defined(_WIN32) /*[*/ if (non_blocking(false) < 0) { host_disconnect(true); return; } #endif /*]*/ host_connected(); net_connected(); remove_output(); } #if !defined(_WIN32) /*[*/ /* * output_possible * Output is possible on the socket. Used only when a connection is * pending, to determine that the connection is complete. */ static void output_possible(iosrc_t fd _is_unused, ioid_t id _is_unused) { #if defined(CONNECT_GETPEERNAME) /*[*/ sockaddr_46_t sa; socklen_t len = sizeof(sa); # define COMPLETE_CONNECT(s) getpeername(s, &sa.sa, &len) # else /*][*/ # define COMPLETE_CONNECT(s) connect(s, &haddr[ha_ix].sa, sizeof(haddr[0])) #endif /*]*/ vtrace("Output possible\n"); /* * Try a connect() again to see if the connection completed sucessfully. * On some systems, such as Linux, this is harmless and succeeds. * On others, such as MacOS, this is mostly harmless and fails * with EISCONN. * * On Solaris, we do a getpeername() instead of a connect(). The second * connect() would fail with EINVAL there. */ if (COMPLETE_CONNECT(sock) < 0) { if (errno != EISCONN) { vtrace("RCVD socket error %d (%s)\n", socket_errno(), strerror(errno)); popup_a_sockerr("Connection failed"); host_disconnect(true); return; } } if (HALF_CONNECTED) { connection_complete(); } remove_output(); } #endif /*]*/ /* * net_disconnect * Shut down the socket. */ void net_disconnect(bool including_ssl) { if (including_ssl && sio != NULL) { sio_close(sio); sio = NULL; secure_connection = false; } if (CONNECTED) { (void) shutdown(sock, 2); } (void) SOCK_CLOSE(sock); sock = INVALID_SOCKET; #if defined(_WIN32) /*[*/ CloseHandle(sock_handle); sock_handle = INVALID_HANDLE_VALUE; #endif /*]*/ vtrace("SENT disconnect\n"); /* Cancel the timeout. */ if (connect_timeout_id != NULL_IOID) { RemoveTimeOut(connect_timeout_id); connect_timeout_id = NULL_IOID; } /* Cancel NOPs. */ if (nop_timeout_id != NULL_IOID) { RemoveTimeOut(nop_timeout_id); nop_timeout_id = NULL_IOID; } /* We're not connected to an LU any more. */ status_lu(NULL); /* We have no more interest in output buffer space. */ remove_output(); /* If we refused TLS and never entered 3270 mode, say so. */ if (refused_tls && !any_host_data) { if (!appres.ssl.starttls) { popup_an_error("Connection failed:\n" "Host requested STARTTLS but STARTTLS disabled"); } else if (nested_tls) { popup_an_error("Connection failed:\n" "Host requested nested STARTTLS"); } else { popup_an_error("Connection failed:\n" "Host requested STARTTLS but TLS/SSL not supported"); } } refused_tls = false; nested_tls = false; any_host_data = false; net_set_default_termtype(); net_connect_pending = false; } /* * net_input * Called by the toolkit whenever there is input available on the * socket. Reads the data, processes the special telnet commands * and calls process_ds to process the 3270 data stream. */ void net_input(iosrc_t fd _is_unused, ioid_t id _is_unused) { register unsigned char *cp; int nr; bool ignore_ssl = false; #if defined(_WIN32) /*[*/ WSANETWORKEVENTS events; /* * Make the socket non-blocking. * Note that WSAEventSelect does this automatically (and won't allow * us to change it back to blocking), except on Wine. */ if (sock != INVALID_SOCKET && non_blocking(true) < 0) { host_disconnect(true); return; } #endif /*]*/ if (sock == INVALID_SOCKET) { return; } #if defined(_WIN32) /*[*/ if (WSAEnumNetworkEvents(sock, sock_handle, &events) != 0) { popup_an_error("WSAEnumNetworkEvents failed: %s", win32_strerror(WSAGetLastError())); host_disconnect(true); return; } vtrace("net_input: NetworkEvents 0x%lx%s%s%s\n", events.lNetworkEvents, (events.lNetworkEvents & FD_CONNECT) ? " CONNECT": "", (events.lNetworkEvents & FD_CLOSE) ? " CLOSE": "", (events.lNetworkEvents & FD_READ) ? " READ": ""); if (HALF_CONNECTED) { if (events.lNetworkEvents & FD_CONNECT) { if (events.iErrorCode[FD_CONNECT_BIT] != 0) { popup_an_error("Connection failed: %s", win32_strerror(events.iErrorCode[FD_CONNECT_BIT])); host_disconnect(true); return; } else { connection_complete(); if (sock == INVALID_SOCKET) { return; } } } else { vtrace("Spurious net_input call\n"); return; } } #endif /*]*/ nvt_data = 0; vtrace("Reading host socket%s\n", secure_connection? " via SSL": ""); if (secure_connection) { /* * OpenSSL does not like getting refused connections * when it hasn't done any I/O yet. So peek ahead to * see if it's worth getting it involved at all. */ if (HALF_CONNECTED && (nr = recv(sock, (char *) netrbuf, 1, MSG_PEEK)) <= 0) { ignore_ssl = true; } else { nr = sio_read(sio, (char *) netrbuf, BUFSZ); } } else { #if defined(LOCAL_PROCESS) /*[*/ if (local_process) { nr = read(sock, (char *) netrbuf, BUFSZ); } else #endif /*]*/ { nr = recv(sock, (char *) netrbuf, BUFSZ, 0); } } vtrace("Host socket read complete nr=%d\n", nr); if (nr < 0) { if ((secure_connection && nr == SIO_EWOULDBLOCK) || (!secure_connection && socket_errno() == SE_EWOULDBLOCK)) { vtrace("EWOULDBLOCK\n"); return; } if (secure_connection && !ignore_ssl) { popup_an_error("%s", sio_last_error()); host_disconnect(true); return; } if (HALF_CONNECTED && socket_errno() == SE_EAGAIN) { connection_complete(); return; } #if defined(LOCAL_PROCESS) /*[*/ if (errno == EIO && local_process) { vtrace("RCVD local process disconnect\n"); host_disconnect(false); return; } #endif /*]*/ vtrace("RCVD socket error %d (%s)\n", socket_errno(), socket_strerror(socket_errno())); if (HALF_CONNECTED) { if (ha_ix == num_ha - 1) { popup_a_sockerr("Connect to %s, " "port %d", hostname, current_port); } else { bool pending; iosrc_t s; net_disconnect(false); while (++ha_ix < num_ha) { s = connect_to(ha_ix, (ha_ix == num_ha - 1), &pending); if (s != INVALID_IOSRC) { host_newfd(s); host_new_connection(pending); return; } } } } else if (socket_errno() != SE_ECONNRESET) { popup_a_sockerr("Socket read"); } host_disconnect(true); return; } else if (nr == 0) { /* Host disconnected. */ vtrace("RCVD disconnect\n"); host_disconnect(false); return; } /* Process the data. */ if (HALF_CONNECTED) { if (non_blocking(false) < 0) { host_disconnect(true); return; } host_connected(); net_connected(); remove_output(); } trace_netdata('<', netrbuf, nr); ns_brcvd += nr; for (cp = netrbuf; cp < (netrbuf + nr); cp++) { #if defined(LOCAL_PROCESS) /*[*/ if (local_process) { /* More to do here, probably. */ if (cstate == CONNECTED_INITIAL) { /* now can assume NVT mode */ host_in3270(CONNECTED_NVT); hisopts[TELOPT_ECHO] = 1; check_linemode(false); kybdlock_clr(KL_AWAITING_FIRST, "telnet_fsm"); status_reset(); ps_process(); } nvt_process((unsigned int) *cp); } else { #endif /*]*/ if (!telnet_fsm(*cp)) { (void) ctlr_dbcs_postprocess(); host_disconnect(true); return; } #if defined(LOCAL_PROCESS) /*[*/ } #endif /*]*/ } if (IN_NVT) { (void) ctlr_dbcs_postprocess(); } if (nvt_data) { vtrace("\n"); nvt_data = 0; } #if defined(_WIN32) /*[*/ if (events.lNetworkEvents & FD_CLOSE) { vtrace("RCVD disconnect\n"); host_disconnect(false); } #endif /*]*/ /* See if it's time to roll over the trace file. */ trace_rollover_check(); } /* * set16 * Put a 16-bit value in a buffer. * Returns the number of bytes required. */ static size_t set16(char *buf, int n) { char *b0 = buf; n %= 256 * 256; if ((n / 256) == IAC) *(unsigned char *)buf++ = IAC; *buf++ = (n / 256); n %= 256; if (n == IAC) *(unsigned char *)buf++ = IAC; *buf++ = n; return buf - b0; } /* * send_naws * Send a Telnet window size sub-option negotation. */ static void send_naws(void) { char naws_msg[14]; size_t naws_len = 0; (void) snprintf(naws_msg, sizeof(naws_msg), "%c%c%c", IAC, SB, TELOPT_NAWS); naws_len += 3; naws_len += set16(naws_msg + naws_len, XMIT_COLS); naws_len += set16(naws_msg + naws_len, XMIT_ROWS); (void) sprintf(naws_msg + naws_len, "%c%c", IAC, SE); naws_len += 2; net_rawout((unsigned char *)naws_msg, naws_len); vtrace("SENT %s NAWS %d %d %s\n", cmd(SB), XMIT_COLS, XMIT_ROWS, cmd(SE)); } /* Advance 'try_lu' to the next desired LU name. */ static void next_lu(void) { if (curr_lu != NULL && (try_lu = *++curr_lu) == NULL) curr_lu = NULL; } #if defined(EBCDIC_HOST) /*[*/ /* * force_ascii * Force the argument string to ASCII. On ASCII (or ASCII-derived) hosts, * this is a no-op. On EBCDIC-based hosts, translation is necessary. */ static const char * force_ascii(const char *s) { static char buf[256]; unsigned char c, e; int i; i = 0; while ((c = *s++) && i < sizeof(buf) - 1) { e = ebc2asc0[c]; if (e) buf[i++] = e; else buf[i++] = 0x3f; /* '?' */ } buf[i] = '\0'; return buf; } #else /*][*/ #define force_ascii(s) (s) #endif /*]*/ #if defined(EBCDIC_HOST) /*[*/ /* * force_local * Force the argument string from ASCII to the local character set. On * ASCII (or ASCII-derived) hosts, this is a no-op. On EBCDIC-based * hosts, translation is necessary. * * Does the translation in-place. */ void force_local(char *s) { unsigned char c, e; while ((c = *s) != '\0') { e = asc2ebc0[c]; if (e) { *s = e; } else { *s = '?'; } s++; } } #else /*][*/ #define force_local(s) #endif /*]*/ /* * telnet_fsm * Telnet finite-state machine. * Returns true for okay, false for errors. */ static bool telnet_fsm(unsigned char c) { char *see_chr; size_t sl; switch (telnet_state) { case TNS_DATA: /* normal data processing */ if (c == IAC) { /* got a telnet command */ telnet_state = TNS_IAC; if (nvt_data) { vtrace("\n"); nvt_data = 0; } break; } if (cstate == CONNECTED_INITIAL) { /* now can assume NVT mode */ if (linemode) { linemode_buf_init(); } host_in3270(CONNECTED_NVT); kybdlock_clr(KL_AWAITING_FIRST, "telnet_fsm"); status_reset(); ps_process(); } if (IN_NVT && !IN_E) { if (!nvt_data) { vtrace("<.. "); nvt_data = 4; } see_chr = ctl_see((int) c); nvt_data += (sl = strlen(see_chr)); if (nvt_data >= TRACELINE) { vtrace(" ...\n... "); nvt_data = 4 + sl; } vtrace("%s", see_chr); if (!syncing) { if (linemode && appres.linemode.onlcr && c == '\n') { nvt_process((unsigned int) '\r'); } nvt_process((unsigned int) c); sms_store(c); } } else { store3270in(c); } break; case TNS_IAC: /* process a telnet command */ if (c != EOR && c != IAC) { vtrace("RCVD %s ", cmd(c)); } switch (c) { case IAC: /* escaped IAC, insert it */ if (IN_NVT && !IN_E) { if (!nvt_data) { vtrace("<.. "); nvt_data = 4; } see_chr = ctl_see((int) c); nvt_data += (sl = strlen(see_chr)); if (nvt_data >= TRACELINE) { vtrace(" ...\n ..."); nvt_data = 4 + sl; } vtrace("%s", see_chr); nvt_process((unsigned int) c); sms_store(c); } else { store3270in(c); } telnet_state = TNS_DATA; break; case EOR: /* eor, process accumulated input */ if (IN_3270 || (IN_E && tn3270e_negotiated)) { ns_rrcvd++; if (process_eor()) { return false; } } else { Warning("EOR received when not in 3270 mode, ignored."); } vtrace("RCVD EOR\n"); ibptr = ibuf; telnet_state = TNS_DATA; break; case WILL: telnet_state = TNS_WILL; break; case WONT: telnet_state = TNS_WONT; break; case DO: telnet_state = TNS_DO; break; case DONT: telnet_state = TNS_DONT; break; case SB: telnet_state = TNS_SB; if (sbbuf == NULL) { sbbuf = (unsigned char *)Malloc(1024); } sbptr = sbbuf; break; case DM: vtrace("\n"); if (syncing) { syncing = 0; #if !defined(_WIN32) /*[*/ x_except_on(sock); #else /*][*/ x_except_on(sock_handle); #endif /*]*/ } telnet_state = TNS_DATA; break; case GA: case NOP: vtrace("\n"); telnet_state = TNS_DATA; break; default: vtrace("???\n"); telnet_state = TNS_DATA; break; } break; case TNS_WILL: /* telnet WILL DO OPTION command */ vtrace("%s\n", opt(c)); switch (c) { case TELOPT_SGA: case TELOPT_BINARY: case TELOPT_EOR: case TELOPT_TTYPE: case TELOPT_ECHO: case TELOPT_TN3270E: if (c != TELOPT_TN3270E || !HOST_FLAG(NON_TN3270E_HOST)) { if (!hisopts[c]) { hisopts[c] = 1; do_opt[2] = c; net_rawout(do_opt, sizeof(do_opt)); vtrace("SENT %s %s\n", cmd(DO), opt(c)); /* For UTS, volunteer to do EOR when they do. */ if (c == TELOPT_EOR && !myopts[c]) { myopts[c] = 1; will_opt[2] = c; net_rawout(will_opt, sizeof(will_opt)); vtrace("SENT %s %s\n", cmd(WILL), opt(c)); } check_in3270(); check_linemode(false); } break; } default: dont_opt[2] = c; net_rawout(dont_opt, sizeof(dont_opt)); vtrace("SENT %s %s\n", cmd(DONT), opt(c)); break; } telnet_state = TNS_DATA; break; case TNS_WONT: /* telnet WONT DO OPTION command */ vtrace("%s\n", opt(c)); if (hisopts[c]) { hisopts[c] = 0; dont_opt[2] = c; net_rawout(dont_opt, sizeof(dont_opt)); vtrace("SENT %s %s\n", cmd(DONT), opt(c)); check_in3270(); check_linemode(false); } telnet_state = TNS_DATA; break; case TNS_DO: /* telnet PLEASE DO OPTION command */ vtrace("%s\n", opt(c)); switch (c) { case TELOPT_BINARY: case TELOPT_EOR: case TELOPT_TTYPE: case TELOPT_SGA: case TELOPT_NAWS: case TELOPT_TM: case TELOPT_TN3270E: case TELOPT_STARTTLS: if (c == TELOPT_STARTTLS && (!sio_supported() || !appres.ssl.starttls || secure_connection)) { refused_tls = true; if (secure_connection) { nested_tls = true; } goto wont; } case TELOPT_NEW_ENVIRON: if (c == TELOPT_TN3270E && HOST_FLAG(NON_TN3270E_HOST)) { goto wont; } if (c == TELOPT_TM && !appres.bsd_tm) { goto wont; } if (c == TELOPT_NEW_ENVIRON && !appres.new_environ) { goto wont; } if (c == TELOPT_TTYPE && myopts[TELOPT_NEW_ENVIRON] && !did_ne_send) { /* * Defer sending WILL TTYPE until after the host asks for SB * NEW_ENVIRON SEND. */ myopts[c] = 1; deferred_will_ttype = true; break; } if (!myopts[c]) { if (c != TELOPT_TM) { myopts[c] = 1; } will_opt[2] = c; net_rawout(will_opt, sizeof(will_opt)); vtrace("SENT %s %s\n", cmd(WILL), opt(c)); check_in3270(); check_linemode(false); } if (c == TELOPT_NAWS) { send_naws(); } if (c == TELOPT_STARTTLS) { static unsigned char follows_msg[] = { IAC, SB, TELOPT_STARTTLS, TLS_FOLLOWS, IAC, SE }; /* * Send IAC SB STARTTLS FOLLOWS IAC SE to announce that what * follows is TLS. */ net_rawout(follows_msg, sizeof(follows_msg)); vtrace("SENT %s %s FOLLOWS %s\n", cmd(SB), opt(TELOPT_STARTTLS), cmd(SE)); need_tls_follows = true; } break; default: wont: wont_opt[2] = c; net_rawout(wont_opt, sizeof(wont_opt)); vtrace("SENT %s %s\n", cmd(WONT), opt(c)); break; } telnet_state = TNS_DATA; break; case TNS_DONT: /* telnet PLEASE DON'T DO OPTION command */ vtrace("%s\n", opt(c)); if (myopts[c]) { myopts[c] = 0; wont_opt[2] = c; net_rawout(wont_opt, sizeof(wont_opt)); vtrace("SENT %s %s\n", cmd(WONT), opt(c)); check_in3270(); check_linemode(false); } if (c == TELOPT_TTYPE && deferred_will_ttype) { deferred_will_ttype = false; } telnet_state = TNS_DATA; break; case TNS_SB: /* telnet sub-option string command */ if (c == IAC) { telnet_state = TNS_SB_IAC; } else { *sbptr++ = c; } break; case TNS_SB_IAC: /* telnet sub-option string command */ *sbptr++ = c; if (c == SE) { telnet_state = TNS_DATA; if (sbbuf[0] == TELOPT_TTYPE && sbbuf[1] == TELQUAL_SEND) { size_t tt_len, tb_len; char *tt_out; vtrace("%s %s\n", opt(sbbuf[0]), telquals[sbbuf[1]]); if (lus != NULL && try_lu == NULL) { /* None of the LUs worked. */ popup_an_error("Cannot connect to specified LU"); return false; } tt_len = strlen(termtype); if (try_lu != NULL && *try_lu) { tt_len += strlen(try_lu) + 1; connected_lu = try_lu; } else { connected_lu = NULL; } status_lu(connected_lu); tb_len = 4 + tt_len + 2; tt_out = Malloc(tb_len + 1); (void) sprintf(tt_out, "%c%c%c%c%s%s%s%c%c", IAC, SB, TELOPT_TTYPE, TELQUAL_IS, force_ascii(termtype), (try_lu != NULL && *try_lu)? "@": "", (try_lu != NULL && *try_lu)? force_ascii(try_lu) : "", IAC, SE); net_rawout((unsigned char *)tt_out, tb_len); Free(tt_out); vtrace("SENT %s %s %s %s%s%s %s\n", cmd(SB), opt(TELOPT_TTYPE), telquals[TELQUAL_IS], termtype, (try_lu != NULL && *try_lu)? "@": "", (try_lu != NULL && *try_lu)? try_lu: "", cmd(SE)); /* Advance to the next LU name. */ next_lu(); } else if (myopts[TELOPT_TN3270E] && sbbuf[0] == TELOPT_TN3270E) { if (tn3270e_negotiate()) { return false; } } else if (sio_supported() && sio != NULL && need_tls_follows && myopts[TELOPT_STARTTLS] && sbbuf[0] == TELOPT_STARTTLS) { continue_tls(sbbuf, (int)(sbptr - sbbuf)); } else if (sbbuf[0] == TELOPT_NEW_ENVIRON && sbbuf[1] == TELQUAL_SEND && appres.new_environ) { unsigned char *reply_buf; size_t reply_buflen; char *trace_in; char *trace_out; if (!telnet_new_environ(sbbuf + 2, (sbptr - sbbuf - 3), &reply_buf, &reply_buflen, &trace_in, &trace_out)) { vtrace("%s %s [error]\n", opt(sbbuf[0]), telquals[sbbuf[1]]); } else { vtrace("%s\n", trace_in); Free(trace_in); net_rawout(reply_buf, reply_buflen); Free(reply_buf); vtrace("SENT %s\n", trace_out); Free(trace_out); } /* * Remember that we did a NEW_ENVIRON SEND, so we won't defer a * future DO TTYPE. */ did_ne_send = true; /* Now respond to DO TTYPE. */ if (deferred_will_ttype && myopts[TELOPT_TTYPE]) { will_opt[2] = TELOPT_TTYPE; net_rawout(will_opt, sizeof(will_opt)); vtrace("SENT %s %s\n", cmd(WILL), opt(TELOPT_TTYPE)); check_in3270(); check_linemode(false); deferred_will_ttype = false; } } } else { telnet_state = TNS_SB; } break; } return true; } /* Send a TN3270E terminal type request. */ static void tn3270e_request(void) { size_t tt_len, tb_len; char *tt_out; char *t; char *xtn; /* Convert 3279 to 3278, per the RFC. */ xtn = NewString(termtype); if (!strncmp(xtn, "IBM-3279", 8)) xtn[7] = '8'; tt_len = strlen(termtype); if (try_lu != NULL && *try_lu) tt_len += strlen(try_lu) + 1; tb_len = 5 + tt_len + 2; tt_out = Malloc(tb_len + 1); t = tt_out; t += sprintf(tt_out, "%c%c%c%c%c%s", IAC, SB, TELOPT_TN3270E, TN3270E_OP_DEVICE_TYPE, TN3270E_OP_REQUEST, force_ascii(xtn)); if (try_lu != NULL && *try_lu) t += sprintf(t, "%c%s", TN3270E_OP_CONNECT, force_ascii(try_lu)); (void) sprintf(t, "%c%c", IAC, SE); net_rawout((unsigned char *)tt_out, tb_len); Free(tt_out); vtrace("SENT %s %s DEVICE-TYPE REQUEST %s%s%s " "%s\n", cmd(SB), opt(TELOPT_TN3270E), xtn, (try_lu != NULL && *try_lu)? " CONNECT ": "", (try_lu != NULL && *try_lu)? try_lu: "", cmd(SE)); Free(xtn); } /* * Back off of TN3270E. */ static void backoff_tn3270e(const char *why) { vtrace("Aborting TN3270E: %s\n", why); /* Tell the host 'no'. */ wont_opt[2] = TELOPT_TN3270E; net_rawout(wont_opt, sizeof(wont_opt)); vtrace("SENT %s %s\n", cmd(WONT), opt(TELOPT_TN3270E)); /* Restore the LU list; we may need to run it again in TN3270 mode. */ setup_lus(); /* Reset our internal state. */ myopts[TELOPT_TN3270E] = 0; check_in3270(); } /* * Negotiation of TN3270E options. * Returns 0 if okay, -1 if we have to give up altogether. */ static int tn3270e_negotiate(void) { #define LU_MAX 32 static char reported_lu[LU_MAX+1]; static char reported_type[LU_MAX+1]; int sblen; b8_t e_rcvd; /* Find out how long the subnegotiation buffer is. */ for (sblen = 0; ; sblen++) { if (sbbuf[sblen] == SE) break; } vtrace("TN3270E "); switch (sbbuf[1]) { case TN3270E_OP_SEND: if (sbbuf[2] == TN3270E_OP_DEVICE_TYPE) { /* Host wants us to send our device type. */ vtrace("SEND DEVICE-TYPE SE\n"); tn3270e_request(); } else { vtrace("SEND ??%u SE\n", sbbuf[2]); } break; case TN3270E_OP_DEVICE_TYPE: /* Device type negotiation. */ vtrace("DEVICE-TYPE "); switch (sbbuf[2]) { case TN3270E_OP_IS: { int tnlen, snlen; /* Device type success. */ /* Isolate the terminal type and session. */ tnlen = 0; while (sbbuf[3+tnlen] != SE && sbbuf[3+tnlen] != TN3270E_OP_CONNECT) tnlen++; snlen = 0; if (sbbuf[3+tnlen] == TN3270E_OP_CONNECT) { while(sbbuf[3+tnlen+1+snlen] != SE) snlen++; } /* Remember the LU. */ if (tnlen) { if (tnlen > LU_MAX) tnlen = LU_MAX; (void)strncpy(reported_type, (char *)&sbbuf[3], tnlen); reported_type[tnlen] = '\0'; force_local(reported_type); connected_type = reported_type; } if (snlen) { if (snlen > LU_MAX) snlen = LU_MAX; (void)strncpy(reported_lu, (char *)&sbbuf[3+tnlen+1], snlen); reported_lu[snlen] = '\0'; force_local(reported_lu); connected_lu = reported_lu; status_lu(connected_lu); } vtrace("IS %s CONNECT %s SE\n", tnlen? connected_type: "", snlen? connected_lu: ""); /* Tell them what we can do. */ tn3270e_subneg_send(TN3270E_OP_REQUEST, &e_funcs); break; } case TN3270E_OP_REJECT: /* Device type failure. */ vtrace("REJECT REASON %s SE\n", rsn(sbbuf[4])); if (sbbuf[4] == TN3270E_REASON_UNSUPPORTED_REQ) { backoff_tn3270e("Host rejected request type"); break; } next_lu(); if (try_lu != NULL) { /* Try the next LU. */ tn3270e_request(); } else if (lus != NULL) { /* No more LUs to try. Give up. */ backoff_tn3270e("Host rejected resource(s)"); } else { backoff_tn3270e("Device type rejected"); } break; default: vtrace("??%u SE\n", sbbuf[2]); break; } break; case TN3270E_OP_FUNCTIONS: /* Functions negotiation. */ vtrace("FUNCTIONS "); switch (sbbuf[2]) { case TN3270E_OP_REQUEST: /* Host is telling us what functions they want. */ vtrace("REQUEST %s SE\n", tn3270e_function_names(sbbuf+3, sblen-3)); tn3270e_fdecode(sbbuf+3, sblen-3, &e_rcvd); if (b8_none_added(&e_funcs, &e_rcvd)) { /* They want what we want, or less. Done. */ b8_copy(&e_funcs, &e_rcvd); tn3270e_subneg_send(TN3270E_OP_IS, &e_funcs); tn3270e_negotiated = 1; vtrace("TN3270E option negotiation " "complete.\n"); check_in3270(); } else { /* * They want us to do something we can't. * Request the common subset. */ b8_and(&e_funcs, &e_funcs, &e_rcvd); tn3270e_subneg_send(TN3270E_OP_REQUEST, &e_funcs); } break; case TN3270E_OP_IS: /* They accept our last request, or a subset thereof. */ vtrace("IS %s SE\n", tn3270e_function_names(sbbuf+3, sblen-3)); tn3270e_fdecode(sbbuf+3, sblen-3, &e_rcvd); if (b8_none_added(&e_funcs, &e_rcvd)) { /* They want what we want, or less. Done. */ b8_copy(&e_funcs, &e_rcvd); } else { /* * They've added something. Abandon TN3270E, * they're brain dead. */ backoff_tn3270e("Host illegally added " "function(s)"); break; } tn3270e_negotiated = 1; vtrace("TN3270E option negotiation complete.\n"); /* * If the host does not support BIND_IMAGE, then we * must go straight to 3270 mode. We do not implicitly * unlock the keyboard, though -- that requires a * Write command from the host. */ if (!b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE)) { tn3270e_submode = E_3270; } check_in3270(); break; default: vtrace("??%u SE\n", sbbuf[2]); break; } break; default: vtrace("??%u SE\n", sbbuf[1]); } /* Good enough for now. */ return 0; } /* Expand a string of TN3270E function codes into text. */ static const char * tn3270e_function_names(const unsigned char *buf, int len) { int i; static char text_buf[1024]; char *s = text_buf; if (!len) return("(null)"); for (i = 0; i < len; i++) { s += sprintf(s, "%s%s", (s == text_buf)? "": " ", fnn(buf[i])); } return text_buf; } /* Expand the current TN3270E function codes into text. */ const char * tn3270e_current_opts(void) { int i; static char text_buf[1024]; char *s = text_buf; if (b8_is_zero(&e_funcs) || !IN_E) return NULL; for (i = 0; i < MX8; i++) { if (b8_bit_is_set(&e_funcs, i)) { s += sprintf(s, "%s%s", (s == text_buf)? "": " ", fnn(i)); } } return text_buf; } /* Transmit a TN3270E FUNCTIONS REQUEST or FUNCTIONS IS message. */ static void tn3270e_subneg_send(unsigned char op, b8_t *funcs) { unsigned char proto_buf[7 + MX8]; int proto_len; int i; /* Construct the buffers. */ (void) memcpy(proto_buf, functions_req, 4); proto_buf[4] = op; proto_len = 5; for (i = 0; i < MX8; i++) { if (b8_bit_is_set(funcs, (i))) { proto_buf[proto_len++] = i; } } /* Complete and send out the protocol message. */ proto_buf[proto_len++] = IAC; proto_buf[proto_len++] = SE; net_rawout(proto_buf, proto_len); /* Complete and send out the trace text. */ vtrace("SENT %s %s FUNCTIONS %s %s %s\n", cmd(SB), opt(TELOPT_TN3270E), (op == TN3270E_OP_REQUEST)? "REQUEST": "IS", tn3270e_function_names(proto_buf + 5, proto_len - 7), cmd(SE)); } /* Translate a string of TN3270E functions into a bitmap. */ static void tn3270e_fdecode(const unsigned char *buf, int len, b8_t *r) { int i; b8_zero(r); for (i = 0; i < len; i++) { b8_set_bit(r, buf[i]); } } static int maxru(unsigned char c) { if (!(c & 0x80)) return 0; return ((c >> 4) & 0x0f) * (1 << (c & 0xf)); } static void process_bind(unsigned char *buf, size_t buflen) { size_t namelen; size_t dest_ix = 0; /* Save the raw image. */ Replace(bind_image, (unsigned char *)Malloc(buflen)); memcpy(bind_image, buf, buflen); bind_image_len = buflen; /* Clean up the derived state. */ if (plu_name == NULL) plu_name = Malloc(mb_max_len(BIND_PLU_NAME_MAX + 1)); (void) memset(plu_name, '\0', mb_max_len(BIND_PLU_NAME_MAX + 1)); maxru_sec = 0; maxru_pri = 0; bind_rd = 0; bind_cd = 0; bind_ra = 0; bind_ca = 0; bind_state = 0; /* Make sure it's a BIND. */ if (buflen < 1 || buf[0] != BIND_RU) { return; } /* Extract the maximum RUs. */ if (buflen > BIND_OFF_MAXRU_SEC) maxru_sec = maxru(buf[BIND_OFF_MAXRU_SEC]); if (buflen > BIND_OFF_MAXRU_PRI) maxru_pri = maxru(buf[BIND_OFF_MAXRU_PRI]); /* Extract the screen size. */ if (buflen > BIND_OFF_SSIZE) { int bind_ss = buf[BIND_OFF_SSIZE]; switch (bind_ss) { case 0x00: case 0x02: bind_rd = MODEL_2_ROWS; bind_cd = MODEL_2_COLS; bind_ra = MODEL_2_ROWS; bind_ca = MODEL_2_COLS; bind_state = BIND_DIMS_PRESENT | BIND_DIMS_ALT | BIND_DIMS_VALID; break; case 0x03: bind_rd = MODEL_2_ROWS; bind_cd = MODEL_2_COLS; bind_ra = maxROWS; bind_ca = maxCOLS; bind_state = BIND_DIMS_PRESENT | BIND_DIMS_VALID; break; case 0x7e: bind_rd = buf[BIND_OFF_RD]; bind_cd = buf[BIND_OFF_CD]; bind_ra = buf[BIND_OFF_RD]; bind_ca = buf[BIND_OFF_CD]; bind_state = BIND_DIMS_PRESENT | BIND_DIMS_ALT | BIND_DIMS_VALID; break; case 0x7f: bind_rd = buf[BIND_OFF_RD]; bind_cd = buf[BIND_OFF_CD]; bind_ra = buf[BIND_OFF_RA]; bind_ca = buf[BIND_OFF_CA]; bind_state = BIND_DIMS_PRESENT | BIND_DIMS_ALT | BIND_DIMS_VALID; break; default: bind_state = 0; break; } } /* Validate and implement the screen size. */ if (appres.bind_limit && (bind_state & BIND_DIMS_PRESENT)) { if (bind_rd > maxROWS || bind_cd > maxCOLS) { popup_an_error("Ignoring invalid BIND image screen " "size parameters:\n" " BIND Default Rows-Cols %ux%u > Maximum " "%ux%u", bind_rd, bind_cd, maxROWS, maxCOLS); bind_state &= ~BIND_DIMS_VALID; } else if (bind_rd < MODEL_2_ROWS || bind_cd < MODEL_2_COLS) { popup_an_error("Ignoring invalid BIND image screen " "size parameters:\n" " BIND Default Rows-Cols %ux%u < Minimum %ux%u", bind_rd, bind_cd, MODEL_2_ROWS, MODEL_2_COLS); bind_state &= ~BIND_DIMS_VALID; } else if (bind_ra > maxROWS || bind_ca > maxCOLS) { popup_an_error("Ignoring invalid BIND image screen " "size parameters:\n" " BIND Alternate Rows-Cols %ux%u > Maximum " "%ux%u", bind_ra, bind_ca, maxROWS, maxCOLS); bind_state &= ~BIND_DIMS_VALID; } else if (bind_ra < MODEL_2_ROWS || bind_ca < MODEL_2_COLS) { popup_an_error("Ignoring invalid BIND image screen " "size parameters:\n" " BIND Alternate Rows-Cols %ux%u < Minimum " "%ux%u", bind_ra, bind_ca, MODEL_2_ROWS, MODEL_2_COLS); bind_state &= ~BIND_DIMS_VALID; } else { defROWS = bind_rd; defCOLS = bind_cd; altROWS = bind_ra; altCOLS = bind_ca; } } ctlr_erase(false); /* Extract the PLU name. */ if (buflen > BIND_OFF_PLU_NAME_LEN) { namelen = buf[BIND_OFF_PLU_NAME_LEN]; if (namelen > BIND_PLU_NAME_MAX) namelen = BIND_PLU_NAME_MAX; if ((namelen > 0) && (buflen > BIND_OFF_PLU_NAME + namelen)) { #if defined(EBCDIC_HOST) /*[*/ memcpy(plu_name, &buf[BIND_OFF_PLU_NAME], namelen); plu_name[namelen] = '\0'; #else /*][*/ size_t i; for (i = 0; i < namelen; i++) { size_t nx; nx = ebcdic_to_multibyte( buf[BIND_OFF_PLU_NAME + i], plu_name + dest_ix, mb_max_len(1)); if (nx > 1) dest_ix += nx - 1; } #endif /*]*/ } } /* A BIND implicitly puts us in 3270 mode. */ tn3270e_submode = E_3270; } /* Decode an UNBIND reason. */ static const char * unbind_reason (unsigned char r) { switch (r) { case TN3270E_UNBIND_NORMAL: return "normal"; case TN3270E_UNBIND_BIND_FORTHCOMING: return "BIND forthcoming"; case TN3270E_UNBIND_VR_INOPERATIVE: return "virtual route inoperative"; case TN3270E_UNBIND_RX_INOPERATIVE: return "route extension inoperative"; case TN3270E_UNBIND_HRESET: return "hierarchical reset"; case TN3270E_UNBIND_SSCP_GONE: return "SSCP gone"; case TN3270E_UNBIND_VR_DEACTIVATED: return "virtual route deactivated"; case TN3270E_UNBIND_LU_FAILURE_PERM: return "unrecoverable LU failure"; case TN3270E_UNBIND_LU_FAILURE_TEMP: return "recoverable LU failure"; case TN3270E_UNBIND_CLEANUP: return "cleanup"; case TN3270E_UNBIND_BAD_SENSE: return "bad sense code or user-supplied sense code"; default: return lazyaf("unknown X'%02x'", r); } } static int process_eor(void) { if (syncing || !(ibptr - ibuf)) return(0); if (IN_E) { tn3270e_header *h = (tn3270e_header *)ibuf; unsigned char *s; enum pds rv; vtrace("RCVD TN3270E(%s%s %s %u)\n", e_dt(h->data_type), e_rq(h->data_type, h->request_flag), e_rsp(h->data_type, h->response_flag), h->seq_number[0] << 8 | h->seq_number[1]); switch (h->data_type) { case TN3270E_DT_3270_DATA: if (b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE) && !tn3270e_bound) { return 0; } tn3270e_submode = E_3270; check_in3270(); response_required = h->response_flag; rv = process_ds(ibuf + EH_SIZE, (ibptr - ibuf) - EH_SIZE); if (rv < 0 && response_required != TN3270E_RSF_NO_RESPONSE) tn3270e_nak(rv); else if (rv == PDS_OKAY_NO_OUTPUT && response_required == TN3270E_RSF_ALWAYS_RESPONSE) tn3270e_ack(); response_required = TN3270E_RSF_NO_RESPONSE; return 0; case TN3270E_DT_BIND_IMAGE: if (!b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE)) { return 0; } process_bind(ibuf + EH_SIZE, (ibptr - ibuf) - EH_SIZE); if (bind_state & BIND_DIMS_PRESENT) { if (bind_state & BIND_DIMS_ALT) { trace_ds("< BIND PLU-name '%s' " "MaxSec-RU %d MaxPri-RU %d " "Rows-Cols Default %dx%d " "Alternate %dx%d%s%s\n", plu_name, maxru_sec, maxru_pri, bind_rd, bind_cd, bind_ra, bind_ca, (bind_state & BIND_DIMS_VALID)? "": " (invalid)", appres.bind_limit? "": " (ignored)"); } else { trace_ds("< BIND PLU-name '%s' " "MaxSec-RU %d MaxPri-RU %d " "Rows-Cols Default %dx%d%s%s\n", plu_name, maxru_sec, maxru_pri, bind_rd, bind_cd, (bind_state & BIND_DIMS_VALID)? "": " (invalid)", appres.bind_limit? "": " (ignored)"); } } else { trace_ds("< BIND PLU-name '%s' " "MaxSec-RU %d MaxPri-RU %d\n", plu_name, maxru_sec, maxru_pri); } tn3270e_bound = 1; check_in3270(); return 0; case TN3270E_DT_UNBIND: if (!b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE)) { return 0; } if ((ibptr - ibuf) > EH_SIZE) { trace_ds("< UNBIND %s\n", unbind_reason(ibuf[EH_SIZE])); } tn3270e_bound = 0; /* * Undo any screen-sizing effects from a previous BIND. */ defROWS = MODEL_2_ROWS; defCOLS = MODEL_2_COLS; altROWS = maxROWS; altCOLS = maxCOLS; ctlr_erase(false); tn3270e_submode = E_UNBOUND; check_in3270(); return 0; case TN3270E_DT_NVT_DATA: /* In tn3270e NVT mode */ tn3270e_submode = E_NVT; check_in3270(); for (s = ibuf; s < ibptr; s++) { nvt_process(*s++); } return 0; case TN3270E_DT_SSCP_LU_DATA: if (!b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE)) { return 0; } tn3270e_submode = E_SSCP; check_in3270(); ctlr_write_sscp_lu(ibuf + EH_SIZE, (ibptr - ibuf) - EH_SIZE); return 0; default: /* Should do something more extraordinary here. */ return 0; } } else { (void) process_ds(ibuf, ibptr - ibuf); } return 0; } /* * net_exception * Called when there is an exceptional condition on the socket. */ void net_exception(iosrc_t fd _is_unused, ioid_t id _is_unused) { #if defined(LOCAL_PROCESS) /*[*/ if (local_process) { vtrace("RCVD exception\n"); } else #endif /*[*/ { vtrace("RCVD urgent data indication\n"); if (!syncing) { syncing = 1; x_except_off(); } } } /* * Flavors of Network Output: * * 3270 mode * net_output send a 3270 record * * NVT mode; call each other in turn * net_sendc net_cookout for 1 byte * net_sends net_cookout for a null-terminated string * net_cookout send user data with cooked-mode processing, NVT mode * net_cookedout send user data, NVT mode, already cooked * net_rawout send telnet protocol data, NVT mode * */ /* * net_cookedout * Send user data out in NVT mode, without cooked-mode processing. */ void net_cookedout(const char *buf, size_t len) { if (toggled(TRACING)) { size_t i; vtrace(">"); for (i = 0; i < len; i++) { vtrace(" %s", ctl_see((int)*(buf+i))); } vtrace("\n"); } net_rawout((unsigned const char *)buf, len); } /* * net_cookout * Send output in NVT mode, including cooked-mode processing if * appropriate. */ void net_cookout(const char *buf, size_t len) { if (!IN_NVT || (kybdlock & KL_AWAITING_FIRST)) { return; } if (linemode) { linemode_out(buf, len); } else { net_cookedout(buf, len); } } /* * net_rawout * Send out raw telnet data. We assume that there will always be enough * space to buffer what we want to transmit, so we don't handle EAGAIN or * EWOULDBLOCK. */ static void net_rawout(unsigned const char *buf, size_t len) { int nw; trace_netdata('>', buf, len); while (len) { #if defined(OMTU) /*[*/ size_t n2w = len; int pause = 0; if (n2w > OMTU) { n2w = OMTU; pause = 1; } #else # define n2w len #endif if (secure_connection) nw = sio_write(sio, (const char *) buf, (int)n2w); else #if defined(LOCAL_PROCESS) /*[*/ if (local_process) nw = write(sock, (const char *) buf, (int)n2w); else #endif /*]*/ nw = send(sock, (const char *) buf, (int)n2w, 0); if (nw < 0) { if (secure_connection) { popup_an_error("%s", sio_last_error()); host_disconnect(false); return; } vtrace("RCVD socket error %d (%s)\n", socket_errno(), socket_strerror(socket_errno())); if (socket_errno() == SE_EPIPE || socket_errno() == SE_ECONNRESET) { host_disconnect(false); return; } else if (socket_errno() == SE_EINTR) { goto bot; } else { popup_a_sockerr("Socket write"); host_disconnect(true); return; } } ns_bsent += nw; len -= nw; buf += nw; bot: #if defined(OMTU) /*[*/ if (pause) sleep(1); #endif /*]*/ ; } } /* * net_hexnvt_out * Send uncontrolled user data to the host in NVT mode, performing IAC * and CR quoting as necessary. */ void net_hexnvt_out(unsigned char *buf, int len) { unsigned char *tbuf; unsigned char *xbuf; if (!len) return; /* Trace the data. */ if (toggled(TRACING)) { int i; vtrace(">"); for (i = 0; i < len; i++) vtrace(" %s", ctl_see((int) *(buf+i))); vtrace("\n"); } /* Expand it. */ tbuf = xbuf = (unsigned char *)Malloc(2*len); while (len) { unsigned char c = *buf++; *tbuf++ = c; len--; if (c == IAC) *tbuf++ = IAC; else if (c == '\r' && (!len || *buf != '\n')) *tbuf++ = '\0'; } /* Send it to the host. */ net_rawout(xbuf, tbuf - xbuf); Free(xbuf); } /* * check_in3270 * Check for switches between NVT, SSCP-LU and 3270 modes. */ static void check_in3270(void) { enum cstate new_cstate = NOT_CONNECTED; static const char *state_name[] = { "unconnected", /* NOT_CONNECTED */ "SSL password pending", /* SSL_PASS */ "resolving hostname", /* RESOLVING */ "TCP connection pending", /* PENDING */ "negotiating SSL or proxy", /* NEGOTIATING */ "connected; 3270 state unknown", /* CONNECTED_INITIAL */ "TN3270 NVT", /* CONNECTED_NVT */ "TN3270 3270", /* CONNECTED_3270 */ "TN3270E unbound", /* CONNECTED_UNBOUND */ "TN3270E NVT", /* CONNECTED_E_NVT */ "TN3270E SSCP-LU", /* CONNECTED_SSCP */ "TN3270E 3270" /* CONNECTED_TN3270E */ }; if (myopts[TELOPT_TN3270E]) { if (!tn3270e_negotiated) new_cstate = CONNECTED_UNBOUND; else switch (tn3270e_submode) { case E_UNBOUND: new_cstate = CONNECTED_UNBOUND; break; case E_NVT: new_cstate = CONNECTED_E_NVT; break; case E_3270: new_cstate = CONNECTED_TN3270E; break; case E_SSCP: new_cstate = CONNECTED_SSCP; break; } } else if (myopts[TELOPT_BINARY] && myopts[TELOPT_EOR] && myopts[TELOPT_TTYPE] && hisopts[TELOPT_BINARY] && hisopts[TELOPT_EOR]) { new_cstate = CONNECTED_3270; } else if (cstate == CONNECTED_INITIAL) { /* Nothing has happened, yet. */ return; } else if (appres.nvt_mode || HOST_FLAG(ANSI_HOST)) { new_cstate = CONNECTED_NVT; } else { new_cstate = CONNECTED_INITIAL; } if (new_cstate != cstate) { int was_in_e = IN_E; /* * If we've now switched between non-TN3270E mode and * TN3270E mode, reset the LU list so we can try again * in the new mode. */ if (lus != NULL && was_in_e != IN_E) { curr_lu = lus; try_lu = *curr_lu; } /* Allocate the initial 3270 input buffer. */ if (new_cstate >= CONNECTED_INITIAL && !ibuf_size) { ibuf = (unsigned char *)Malloc(BUFSIZ); ibuf_size = BUFSIZ; ibptr = ibuf; } /* Reinitialize line mode. */ if ((new_cstate == CONNECTED_NVT && linemode) || new_cstate == CONNECTED_E_NVT) { linemode_buf_init(); } /* If we fell out of TN3270E, remove the state. */ if (!myopts[TELOPT_TN3270E]) { tn3270e_negotiated = 0; tn3270e_submode = E_UNBOUND; tn3270e_bound = 0; } vtrace("Now operating in %s mode.\n", state_name[new_cstate]); if (IN_3270 || IN_NVT || IN_SSCP) { any_host_data = true; } host_in3270(new_cstate); } } /* * store3270in * Store a character in the 3270 input buffer, checking for buffer * overflow and reallocating ibuf if necessary. */ static void store3270in(unsigned char c) { if (ibptr - ibuf >= ibuf_size) { ibuf_size += BUFSIZ; ibuf = (unsigned char *)Realloc((char *)ibuf, ibuf_size); ibptr = ibuf + ibuf_size - BUFSIZ; } *ibptr++ = c; } /* * space3270out * Ensure that more characters will fit in the 3270 output buffer. * Allocates the buffer in BUFSIZ chunks. * Allocates hidden space at the front of the buffer for TN3270E. */ void space3270out(size_t n) { size_t nc = 0; /* amount of data currently in obuf */ unsigned more = 0; if (obuf_size) nc = obptr - obuf; while ((nc + n + EH_SIZE) > (obuf_size + more)) { more += BUFSIZ; } if (more) { obuf_size += more; obuf_base = (unsigned char *)Realloc((char *)obuf_base, obuf_size); obuf = obuf_base + EH_SIZE; obptr = obuf + nc; } } /* * check_linemode * Set the global variable 'linemode', which says whether we are in * character-by-character mode or line mode. */ static void check_linemode(bool init) { int wasline = linemode; /* * The next line is a deliberate kluge to effectively ignore the SGA * option. If the host will echo for us, we assume * character-at-a-time; otherwise we assume fully cooked by us. * * This allows certain IBM hosts which volunteer SGA but refuse * ECHO to operate more-or-less normally, at the expense of * implementing the (hopefully useless) "character-at-a-time, local * echo" mode. * * We still implement "switch to line mode" and "switch to character * mode" properly by asking for both SGA and ECHO to be off or on, but * we basically ignore the reply for SGA. */ linemode = !hisopts[TELOPT_ECHO] /* && !hisopts[TELOPT_SGA] */; if (init || linemode != wasline) { st_changed(ST_LINE_MODE, linemode); if (!init) { vtrace("Operating in %s mode.\n", linemode? "line": "character-at-a-time"); } if (IN_NVT) { if (linemode) { linemode_buf_init(); } else { linemode_dump(); } } } } /* * nnn * Expands a number to a character string, for displaying unknown telnet * commands and options. */ static const char * nnn(int c) { return lazyaf("%d", c); } /* * cmd * Expands a TELNET command into a character string. */ const char * cmd(int c) { if (TELCMD_OK(c)) { return TELCMD(c); } else { return nnn(c); } } /* * opt * Expands a TELNET option into a character string. */ const char * opt(unsigned char c) { if (TELOPT_OK(c)) { return TELOPT(c); } else if (c == TELOPT_TN3270E) { return "TN3270E"; } else if (c == TELOPT_STARTTLS) { return "START-TLS"; } else { return nnn((int)c); } } #define LINEDUMP_MAX 32 void trace_netdata(char direction, unsigned const char *buf, size_t len) { size_t offset; if (!toggled(TRACING)) return; for (offset = 0; offset < len; offset++) { if (!(offset % LINEDUMP_MAX)) ntvtrace("%s%c 0x%-3x ", (offset? "\n": ""), direction, (unsigned)offset); ntvtrace("%02x", buf[offset]); } ntvtrace("\n"); } /* * net_output * Send 3270 output over the network: * - Prepend TN3270E header * - Expand IAC to IAC IAC * - Append IAC EOR */ void net_output(void) { static unsigned char *xobuf = NULL; static int xobuf_len = 0; int need_resize = 0; unsigned char *nxoptr, *xoptr; #define BSTART ((IN_TN3270E || IN_SSCP)? obuf_base: obuf) /* Set the TN3720E header. */ if (IN_TN3270E || IN_SSCP) { tn3270e_header *h = (tn3270e_header *)obuf_base; /* Check for sending a TN3270E response. */ if (response_required == TN3270E_RSF_ALWAYS_RESPONSE) { tn3270e_ack(); response_required = TN3270E_RSF_NO_RESPONSE; } /* Set the outbound TN3270E header. */ h->data_type = IN_TN3270E? TN3270E_DT_3270_DATA: TN3270E_DT_SSCP_LU_DATA; h->request_flag = 0; h->response_flag = 0; h->seq_number[0] = (e_xmit_seq >> 8) & 0xff; h->seq_number[1] = e_xmit_seq & 0xff; vtrace("SENT TN3270E(%s NO-RESPONSE %u)\n", IN_TN3270E? "3270-DATA": "SSCP-LU-DATA", e_xmit_seq); if (b8_bit_is_set(&e_funcs, TN3270E_FUNC_RESPONSES)) { e_xmit_seq = (e_xmit_seq + 1) & 0x7fff; } } /* Reallocate the expanded output buffer. */ while (xobuf_len < (obptr - BSTART + 1) * 2) { xobuf_len += BUFSZ; need_resize++; } if (need_resize) { Replace(xobuf, (unsigned char *)Malloc(xobuf_len)); } /* Copy and expand IACs. */ xoptr = xobuf; nxoptr = BSTART; while (nxoptr < obptr) { if ((*xoptr++ = *nxoptr++) == IAC) { *xoptr++ = IAC; } } /* Append the IAC EOR and transmit. */ *xoptr++ = IAC; *xoptr++ = EOR; net_rawout(xobuf, xoptr - xobuf); vtrace("SENT EOR\n"); ns_rsent++; #undef BSTART } /* Send a TN3270E positive response to the server. */ static void tn3270e_ack(void) { unsigned char rsp_buf[10]; tn3270e_header *h_in = (tn3270e_header *)ibuf; int rsp_len = 0; rsp_len = 0; rsp_buf[rsp_len++] = TN3270E_DT_RESPONSE; /* data_type */ rsp_buf[rsp_len++] = 0; /* request_flag */ rsp_buf[rsp_len++] = TN3270E_RSF_POSITIVE_RESPONSE; /* response_flag */ rsp_buf[rsp_len++] = h_in->seq_number[0]; /* seq_number[0] */ if (h_in->seq_number[0] == IAC) rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = h_in->seq_number[1]; /* seq_number[1] */ if (h_in->seq_number[1] == IAC) rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = TN3270E_POS_DEVICE_END; rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = EOR; vtrace("SENT TN3270E(RESPONSE POSITIVE-RESPONSE %u) DEVICE-END\n", h_in->seq_number[0] << 8 | h_in->seq_number[1]); net_rawout(rsp_buf, rsp_len); } /* Send a TN3270E negative response to the server. */ static void tn3270e_nak(enum pds rv) { unsigned char rsp_buf[10]; tn3270e_header *h_in = (tn3270e_header *)ibuf; int rsp_len = 0; char *neg = NULL; rsp_buf[rsp_len++] = TN3270E_DT_RESPONSE; /* data_type */ rsp_buf[rsp_len++] = 0; /* request_flag */ rsp_buf[rsp_len++] = TN3270E_RSF_NEGATIVE_RESPONSE; /* response_flag */ rsp_buf[rsp_len++] = h_in->seq_number[0]; /* seq_number[0] */ if (h_in->seq_number[0] == IAC) rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = h_in->seq_number[1]; /* seq_number[1] */ if (h_in->seq_number[1] == IAC) rsp_buf[rsp_len++] = IAC; switch (rv) { default: case PDS_BAD_CMD: rsp_buf[rsp_len++] = TN3270E_NEG_COMMAND_REJECT; neg = "COMMAND-REJECT"; break; case PDS_BAD_ADDR: rsp_buf[rsp_len++] = TN3270E_NEG_OPERATION_CHECK; neg = "OPERATION-CHECK"; break; } rsp_buf[rsp_len++] = IAC; rsp_buf[rsp_len++] = EOR; vtrace("SENT TN3270E(RESPONSE NEGATIVE-RESPONSE %u) %s\n", h_in->seq_number[0] << 8 | h_in->seq_number[1], neg); net_rawout(rsp_buf, rsp_len); } /* Add a dummy TN3270E header to the output buffer. */ bool net_add_dummy_tn3270e(void) { tn3270e_header *h; if (!IN_E || tn3270e_submode == E_UNBOUND) return false; space3270out(EH_SIZE); h = (tn3270e_header *)obptr; switch (tn3270e_submode) { case E_UNBOUND: break; case E_NVT: h->data_type = TN3270E_DT_NVT_DATA; break; case E_SSCP: h->data_type = TN3270E_DT_SSCP_LU_DATA; break; case E_3270: h->data_type = TN3270E_DT_3270_DATA; break; } h->request_flag = 0; h->response_flag = TN3270E_RSF_NO_RESPONSE; h->seq_number[0] = 0; h->seq_number[1] = 0; obptr += EH_SIZE; return true; } /* * Add IAC EOR to a buffer. */ void net_add_eor(unsigned char *buf, size_t len) { buf[len++] = IAC; buf[len++] = EOR; } /* * net_sendc * Send a character of user data over the network in NVT mode. */ void net_sendc(char c) { if (c == '\r' && !linemode #if defined(LOCAL_PROCESS) /*[*/ && !local_process #endif /*]*/ ) { /* CR must be quoted */ net_cookout("\r\0", 2); } else { net_cookout(&c, 1); } } /* * net_sends * Send a null-terminated string of user data in NVT mode. */ void net_sends(const char *s) { net_cookout(s, strlen(s)); } /* * External entry points to negotiate line or character mode. */ void net_linemode(void) { if (!CONNECTED) return; if (hisopts[TELOPT_ECHO]) { dont_opt[2] = TELOPT_ECHO; net_rawout(dont_opt, sizeof(dont_opt)); vtrace("SENT %s %s\n", cmd(DONT), opt(TELOPT_ECHO)); } if (hisopts[TELOPT_SGA]) { dont_opt[2] = TELOPT_SGA; net_rawout(dont_opt, sizeof(dont_opt)); vtrace("SENT %s %s\n", cmd(DONT), opt(TELOPT_SGA)); } } void net_charmode(void) { if (!CONNECTED) return; if (!hisopts[TELOPT_ECHO]) { do_opt[2] = TELOPT_ECHO; net_rawout(do_opt, sizeof(do_opt)); vtrace("SENT %s %s\n", cmd(DO), opt(TELOPT_ECHO)); } if (!hisopts[TELOPT_SGA]) { do_opt[2] = TELOPT_SGA; net_rawout(do_opt, sizeof(do_opt)); vtrace("SENT %s %s\n", cmd(DO), opt(TELOPT_SGA)); } } /* * net_break * Send telnet break, which is used to implement 3270 ATTN. * */ void net_break(void) { static unsigned char buf[] = { IAC, BREAK }; /* I don't know if we should first send TELNET synch ? */ net_rawout(buf, sizeof(buf)); vtrace("SENT BREAK\n"); } /* * net_interrupt * Send telnet IP. * */ void net_interrupt(void) { static unsigned char buf[] = { IAC, IP }; /* I don't know if we should first send TELNET synch ? */ net_rawout(buf, sizeof(buf)); vtrace("SENT IP\n"); } /* * net_abort * Send telnet AO. * */ void net_abort(void) { static unsigned char buf[] = { IAC, AO }; if (b8_bit_is_set(&e_funcs, TN3270E_FUNC_SYSREQ)) { /* * I'm not sure yet what to do here. Should the host respond * to the AO by sending us SSCP-LU data (and putting us into * SSCP-LU mode), or should we put ourselves in it? * Time, and testers, will tell. */ switch (tn3270e_submode) { case E_UNBOUND: case E_NVT: break; case E_SSCP: net_rawout(buf, sizeof(buf)); vtrace("SENT AO\n"); if (tn3270e_bound || !b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE)) { tn3270e_submode = E_3270; check_in3270(); } break; case E_3270: net_rawout(buf, sizeof(buf)); vtrace("SENT AO\n"); tn3270e_submode = E_SSCP; check_in3270(); break; } } } /* * Construct a string to reproduce the current TELNET options. * Returns a bool indicating whether it is necessary. */ bool net_snap_options(void) { bool any = false; int i; static unsigned char ttype_str[] = { IAC, DO, TELOPT_TTYPE, IAC, SB, TELOPT_TTYPE, TELQUAL_SEND, IAC, SE }; if (!CONNECTED) return false; obptr = obuf; /* Do TTYPE first. */ if (myopts[TELOPT_TTYPE]) { unsigned j; space3270out(sizeof(ttype_str)); for (j = 0; j < sizeof(ttype_str); j++) *obptr++ = ttype_str[j]; } /* Do the other options. */ for (i = 0; i < N_OPTS; i++) { space3270out(6); if (i == TELOPT_TTYPE) continue; if (hisopts[i]) { *obptr++ = IAC; *obptr++ = WILL; *obptr++ = (unsigned char)i; any = true; } if (myopts[i]) { *obptr++ = IAC; *obptr++ = DO; *obptr++ = (unsigned char)i; any = true; } } /* If we're in TN3270E mode, snap the subnegotations as well. */ if (myopts[TELOPT_TN3270E]) { any = true; space3270out(5 + ((connected_type != NULL)? strlen(connected_type): 0) + ((connected_lu != NULL)? + strlen(connected_lu): 0) + 2); *obptr++ = IAC; *obptr++ = SB; *obptr++ = TELOPT_TN3270E; *obptr++ = TN3270E_OP_DEVICE_TYPE; *obptr++ = TN3270E_OP_IS; if (connected_type != NULL) { (void) memcpy(obptr, connected_type, strlen(connected_type)); obptr += strlen(connected_type); } if (connected_lu != NULL) { *obptr++ = TN3270E_OP_CONNECT; (void) memcpy(obptr, connected_lu, strlen(connected_lu)); obptr += strlen(connected_lu); } *obptr++ = IAC; *obptr++ = SE; space3270out(38); (void) memcpy(obptr, functions_req, 4); obptr += 4; *obptr++ = TN3270E_OP_IS; for (i = 0; i < MX8; i++) { if (b8_bit_is_set(&e_funcs, i)) { *obptr++ = i; } } *obptr++ = IAC; *obptr++ = SE; if (tn3270e_bound) { tn3270e_header *h; size_t i; int xlen = 0; for (i = 0; i < bind_image_len; i++) { if (bind_image[i] == 0xff) xlen++; } space3270out(EH_SIZE + bind_image_len + xlen + 3); h = (tn3270e_header *)obptr; h->data_type = TN3270E_DT_BIND_IMAGE; h->request_flag = 0; h->response_flag = 0; h->seq_number[0] = 0; h->seq_number[1] = 0; obptr += EH_SIZE; for (i = 0; i < bind_image_len; i++) { if (bind_image[i] == 0xff) *obptr++ = 0xff; *obptr++ = bind_image[i]; } *obptr++ = IAC; *obptr++ = EOR; } } return any; } /* * Set blocking/non-blocking mode on the socket. On error, pops up an error * message, but does not close the socket. */ static int non_blocking(bool on) { #if !defined(BLOCKING_CONNECT_ONLY) /*[*/ # if defined(FIONBIO) /*[*/ IOCTL_T i = on? 1: 0; vtrace("Making host socket %sblocking\n", on? "non-": ""); if (sock == INVALID_SOCKET) { return 0; } if (SOCK_IOCTL(sock, FIONBIO, &i) < 0) { popup_a_sockerr("ioctl(FIONBIO, %d)", on); return -1; } # else /*][*/ int f; vtrace("Making host socket %sblocking\n", on? "non-": ""); if (sock == INVALID_SOCKET) { return 0; } if ((f = fcntl(sock, F_GETFL, 0)) == -1) { popup_an_errno(errno, "fcntl(F_GETFL)"); return -1; } if (on) { f |= O_NDELAY; } else { f &= ~O_NDELAY; } if (fcntl(sock, F_SETFL, f) < 0) { popup_an_errno(errno, "fcntl(F_SETFL)"); return -1; } # endif /*]*/ #endif /*]*/ return 0; } /* Process a STARTTLS subnegotiation. */ static void continue_tls(unsigned char *sbbuf, int len) { bool data = false; char *session, *cert; /* Whatever happens, we're not expecting another SB STARTTLS. */ need_tls_follows = false; /* Make sure the option is FOLLOWS. */ if (len < 2 || sbbuf[1] != TLS_FOLLOWS) { /* Trace the junk. */ vtrace("%s ? %s\n", opt(TELOPT_STARTTLS), cmd(SE)); popup_an_error("TLS negotiation failure"); host_disconnect(true); return; } /* Trace what we got. */ vtrace("%s FOLLOWS %s\n", opt(TELOPT_STARTTLS), cmd(SE)); /* Negotiate the session. */ if (!sio_negotiate(sio, sock, hostname, &data)) { popup_an_error("%s", sio_last_error()); host_disconnect(true); return; } secure_connection = true; /* Success. */ session = indent_s(sio_session_info(sio)); cert = indent_s(sio_server_cert_info(sio)); vtrace("TLS/SSL negotiated connection complete. " "Connection is now secure.\n" "Provider: %s\n" "Session:\n%s\nServer certificate:\n%s\n", sio_provider(), session, cert); Free(session); Free(cert); /* Tell the world that we are (still) connected, now in secure mode. */ host_connected(); if (data) { /* Got extra data with the negotiation. */ vtrace("Reading extra data after negotiation\n"); net_input(INVALID_IOSRC, NULL_IOID); } } /* Return the current BIND application name, if any. */ const char * net_query_bind_plu_name(void) { /* * Return the PLU name, if we're in TN3270E 3270 mode and have * negotiated the BIND-IMAGE option. */ if ((cstate == CONNECTED_TN3270E) && b8_bit_is_set(&e_funcs, TN3270E_FUNC_BIND_IMAGE)) { return plu_name? plu_name: ""; } else { return ""; } } /* Return the current connection state. */ const char * net_query_connection_state(void) { if (CONNECTED) { if (IN_E) { switch (tn3270e_submode) { default: case E_UNBOUND: return "tn3270e unbound"; case E_3270: return "tn3270e 3270"; case E_NVT: return "tn3270e nvt"; case E_SSCP: return "tn3270 sscp-lu"; } } else { if (IN_3270) { return "tn3270 3270"; } else { return "tn3270 nvt"; } } } else if (HALF_CONNECTED) { return "connecting"; } else { return ""; } } /* Return the LU name. */ const char * net_query_lu_name(void) { if (CONNECTED && connected_lu != NULL) { return connected_lu; } else { return ""; } } /* Return the hostname and port. */ const char * net_query_host(void) { if (CONNECTED) { #if defined(LOCAL_PROCESS) /*[*/ if (local_process) { return lazyaf("process %s", hostname); } #endif /*]*/ return lazyaf("host %s %u", hostname, current_port); } else { return ""; } } /* Return the SSL state. */ const char * net_query_ssl(void) { static char *not_secure = "not secure"; if (CONNECTED) { if (!secure_connection) { return not_secure; } return lazyaf("secure %s", net_secure_unverified()? "host-unverified": "host-verified"); } else { return ""; } } /* Return the local address for the socket. */ int net_getsockname(void *buf, int *len) { if (sock == INVALID_SOCKET) { return -1; } return getsockname(sock, buf, (socklen_t *)(void *)len); } /* Return a text version of the current proxy type, or NULL. */ char * net_proxy_type(void) { if (proxy_type > 0) { return proxy_type_name(proxy_type); } else { return NULL; } } /* Return the current proxy host, or NULL. */ char * net_proxy_host(void) { if (proxy_type > 0) { return proxy_host; } else { return NULL; } } /* Return the current proxy port, or NULL. */ char * net_proxy_port(void) { if (proxy_type > 0) { return proxy_portname; } else { return NULL; } } /* Return the SNA binding state. */ bool net_bound(void) { return (IN_E && tn3270e_bound); } /* * Set the default termtype. * * This is called at init time, whenever we disconnect, and whenever the screen * dimensions change (which by definition happens while we are disconnected). * It sets 'termtype' to the default value, assuming an extended data stream * host. When we connect to a particular host, we may use a different value * (such as without the -E, for the S: prefix). */ void net_set_default_termtype(void) { if (appres.termname) { termtype = appres.termname; } else if (appres.nvt_mode || HOST_FLAG(ANSI_HOST)) { termtype = "xterm"; } else if (ov_rows || ov_cols) { termtype = "IBM-DYNAMIC"; } else { termtype = full_model_name; } } bool net_secure_unverified(void) { return secure_connection && sio_secure_unverified(sio); } const char * net_session_info(void) { if (sio == NULL) { return NULL; } return sio_session_info(sio); } const char * net_server_cert_info(void) { if (sio == NULL) { return NULL; } return sio_server_cert_info(sio); } bool net_secure_connection(void) { return secure_connection; } unsigned net_sio_supported(void) { return sio_supported(); } const char * net_sio_provider(void) { return sio_provider(); } suite3270-3.6/Common/telnet_gui_stubs.c0000664000076500007650000000332313221577163016150 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_gui_stubs.c * Stubs for TELNET GUI functions. */ #include "globals.h" #include "telnet_gui.h" void telnet_gui_connecting(const char *hostname _is_unused, const char *portname _is_unused) { } suite3270-3.6/Common/telnet_new_environ.c0000664000076500007650000003243413221577163016502 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE US* OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_new_environ.c * The TELNET NEW-ENVIRON option (RFC 1572). */ #include "globals.h" #include "arpa_telnet.h" #include "tn3270e.h" #include "3270ds.h" #include "appres.h" #include "lazya.h" #include "sio.h" #include "telnet.h" #include "telnet_core.h" #include "telnet_private.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #define ESCAPED(c) \ (c == TELOBJ_VAR || c == TELOBJ_USERVAR || c == TELOBJ_ESC || \ c == TELOBJ_VALUE) #define USER_VARNAME "USER" #define DEVNAME_USERVARNAME "DEVNAME" /* Globals */ /* Statics */ static const char *telobjs[4] = { "VAR", "VALUE", "ESC", "USERVAR" }; /* An environment variable. */ typedef struct { llist_t list; char *name; size_t name_len; char *value; size_t value_len; } environ_t; static llist_t vars = LLIST_INIT(vars); static llist_t uservars = LLIST_INIT(uservars); /* A request. */ typedef struct { llist_t list; int group; /* TELOBJ_VAR or TELOBJ_USERVAR */ char *name; /* Variable name (including escapes), or NULL for all */ size_t name_len; /* Name length */ } ereq_t; /* Compute the length of a quoted environment name or value. */ size_t escaped_len(const char *s, size_t len) { size_t ret = 0; while (len--) { char c = *s++; ret += 1 + ESCAPED(c); } return ret; } /* Copy and quote an environment name or value. */ void escaped_copy(char *to, const char *from, size_t len) { while (len--) { char c = *from++; if (ESCAPED(c)) { *to++ = TELOBJ_ESC; } *to++ = c; } } /* Add a value to an environment list. */ static void add_environ(llist_t *list, const char *name, size_t name_len, const char *value, size_t value_len) { size_t name_xlen = escaped_len(name, name_len); size_t value_xlen = escaped_len(value, value_len); /* Add it to the list. */ environ_t *e = (environ_t *)Malloc(sizeof(environ_t) + name_xlen + value_xlen); e->name = (char *)(e + 1); escaped_copy(e->name, name, name_len); e->name_len = name_xlen; e->value = e->name + name_xlen; escaped_copy(e->value, value, value_len); e->value_len = value_xlen; llist_init(&e->list); llist_insert_before(&e->list, list); } /* * Find a value on an environment list. * Returns it in escaped format. */ static environ_t * find_environ(llist_t *list, const char *name, size_t namelen) { environ_t *e; /* We have no variables with embedded nulls in their names. */ if (memchr(name, 0, namelen) != NULL) { return NULL; } /* Search for a match. */ FOREACH_LLIST(list, e, environ_t *) { if (!memcmp(name, e->name, namelen)) { return e; } } FOREACH_LLIST_END(list, e, environ_t *); return NULL; } /* Initialize the NEW-ENVIRON variables. */ void environ_init(void) { static bool initted = false; char *user; if (initted) { return; } initted = true; user = appres.user? appres.user: getenv("USER"); if (user == NULL) { user = getenv("USERNAME"); } if (user == NULL) { user = "UNKNOWN"; } add_environ(&vars, USER_VARNAME, strlen(USER_VARNAME), user, strlen(user)); if (appres.devname != NULL) { add_environ(&uservars, DEVNAME_USERVARNAME, strlen(DEVNAME_USERVARNAME), appres.devname, strlen(appres.devname)); } } /* Expand a name into a readable string. */ static char * expand_name(const char *s, size_t len) { varbuf_t v; unsigned char c; vb_init(&v); while (len--) { c = (unsigned char)*s++; if (c == TELOBJ_ESC) { if (len == 1) { break; } c = (unsigned char)*s++; len--; } if (c == '\\') { vb_appends(&v, "\\\\"); } else if (c < ' ' || c >= 0x7f) { vb_appendf(&v, "\\u%04x", c); } else { vb_append(&v, (char *)&c, 1); } } return lazya(vb_consume(&v)); } /* Expand IACs in a reply buffer. */ static void expand_iac(const unsigned char *raw, size_t raw_len, unsigned char **result, size_t *result_len) { int iacs = 0; const unsigned char *remain = raw; size_t remain_len = raw_len; void *iac; unsigned char *out; while ((iac = memchr(remain, IAC, remain_len)) != NULL) { iacs++; remain = (unsigned char *)iac + 1; if (remain >= raw + raw_len) { break; } remain_len = (raw + raw_len) - remain; } *result_len = raw_len + iacs; *result = Malloc(*result_len); out = *result; while (raw_len--) { unsigned char c = *raw++; if (c == IAC) { *out++ = IAC; } *out++ = c; } } /* * Parse the TELNET NEW-ENVIRON option. * * @param[in] request_buf TELNET IAC SB buffer. Leading IAC SB * NEW-ENVIRON SEND and trailing IAC SE have been * removed. Embedded IACs have been removed. * @param[in] request_buflen Length of the request buffer. * @param[out] fake_input Returned true if input was faked (empty * request). * @returns List of requests, or null if there was an error. */ static llist_t * parse_new_environ(unsigned char *request_buf, size_t request_buflen, bool *fake_input) { size_t i; enum { EE_BASE, /* base state */ EE_VAR, /* VAR or USERVAR seen */ EE_NAME, /* name character seen */ EE_NAME_ESC /* ESC seen in name */ } state = EE_BASE; static llist_t ereqs; /* returned parsed request */ ereq_t *ereq = NULL; /* current request (group or variable) */ *fake_input = false; llist_init(&ereqs); /* Parse the input into a series of requests. */ for (i = 0; i < request_buflen; i++) { unsigned char c = request_buf[i]; switch (state) { case EE_BASE: switch (c) { case TELOBJ_VAR: case TELOBJ_USERVAR: /* New request is pending. */ ereq = (ereq_t *)Malloc(sizeof(ereq_t)); memset(ereq, 0, sizeof(ereq_t)); llist_init(&ereq->list); ereq->group = c; state = EE_VAR; break; default: /* Only those two are allowed. */ return NULL; break; } break; case EE_VAR: switch (c) { case TELOBJ_VAR: case TELOBJ_USERVAR: /* The previous request is done. */ llist_insert_before(&ereq->list, &ereqs); /* Start a new one. */ ereq = (ereq_t *)Malloc(sizeof(ereq_t)); memset(ereq, 0, sizeof(ereq_t)); llist_init(&ereq->list); ereq->group = c; break; default: ereq->name = Malloc(1); ereq->name[0] = c; ereq->name_len = 1; state = (c == TELOBJ_ESC)? EE_NAME_ESC: EE_NAME; break; } break; case EE_NAME: switch (c) { case TELOBJ_VAR: case TELOBJ_USERVAR: /* The previous request is done. */ llist_insert_before(&ereq->list, &ereqs); /* Start a new one. */ ereq = (ereq_t *)Malloc(sizeof(ereq_t)); memset(ereq, 0, sizeof(ereq_t)); llist_init(&ereq->list); ereq->group = c; state = EE_VAR; break; case TELOBJ_ESC: state = EE_NAME_ESC; /* fall through... */ default: ereq->name_len++; ereq->name = Realloc(ereq->name, ereq->name_len); ereq->name[ereq->name_len - 1] = c; break; } break; case EE_NAME_ESC: ereq->name_len++; ereq->name = Realloc(ereq->name, ereq->name_len); ereq->name[ereq->name_len - 1] = c; break; } } if (state == EE_BASE) { /* No input. Fake TELOBJ_VER and TELOBJ_USERVAR. */ ereq = (ereq_t *)Malloc(sizeof(ereq_t)); memset(ereq, 0, sizeof(ereq_t)); llist_init(&ereq->list); ereq->group = TELOBJ_VAR; llist_insert_before(&ereq->list, &ereqs); ereq = (ereq_t *)Malloc(sizeof(ereq_t)); memset(ereq, 0, sizeof(ereq_t)); llist_init(&ereq->list); ereq->group = TELOBJ_USERVAR; llist_insert_before(&ereq->list, &ereqs); *fake_input = true; } else { /* Something is pending. */ llist_insert_before(&ereq->list, &ereqs); } return &ereqs; } /* * Parse the TELNET NEW-ENVIRON option and form the response. * * @param[in] request_buf TELNET IAC SB buffer. Leading IAC SB * NEW-ENVIRON SEND and trailing IAC SE have been * removed. Embedded IACs have been removed. * @param[in] request_buflen Length of the buffer. * @param[out] reply_buf Returned malloc'd transmit buffer, starting * with IAC SB, ending with IAC SE. * @param[out] reply_buflen Returned buffer length. * @param[out] trace_inp Returned malloc'd input trace message. * @param[out] trace_outp Returned malloc'd output trace message. * @returns true for success */ bool telnet_new_environ(unsigned char *request_buf, size_t request_buflen, unsigned char **reply_buf, size_t *reply_buflen, char **trace_inp, char **trace_outp) { varbuf_t trace_in; /* input trace */ varbuf_t reply; /* reply */ varbuf_t trace_out; /* output trace */ llist_t *ereqs; /* parsed request */ ereq_t *ereq; /* request element */ environ_t *value; /* found value */ bool fake_input = false; unsigned char *reply_body; size_t reply_body_len; /* Parse the request. */ ereqs = parse_new_environ(request_buf, request_buflen, &fake_input); if (ereqs == NULL) { /* Parse error. */ return false; } /* Build up the return values. */ vb_init(&trace_in); vb_appendf(&trace_in, "%s %s", opt(TELOPT_NEW_ENVIRON), telquals[TELQUAL_SEND]); vb_init(&reply); vb_appendf(&reply, "%c%c", TELOPT_NEW_ENVIRON, TELQUAL_IS); vb_init(&trace_out); vb_appendf(&trace_out, "%s %s %s", cmd(SB), opt(TELOPT_NEW_ENVIRON), telquals[TELQUAL_IS]); FOREACH_LLIST(ereqs, ereq, ereq_t *) { if (ereq->name_len == 0) { llist_t *l; /* No variable name. Dump the whole group. */ if (!fake_input) { /* Trace the request. */ vb_appendf(&trace_in, " %s", telobjs[ereq->group]); } l = (ereq->group == TELOBJ_VAR)? &vars: &uservars; FOREACH_LLIST(l, value, environ_t *) { /* Add this value to the reply. */ vb_appendf(&reply, "%c", ereq->group); vb_append(&reply, value->name, value->name_len); vb_appendf(&reply, "%c", TELOBJ_VALUE); vb_append(&reply, value->value, value->value_len); /* Trace the reply. */ vb_appendf(&trace_out, " %s \"%s\" %s \"%s\"", telobjs[ereq->group], expand_name(value->name, value->name_len), telobjs[TELOBJ_VALUE], expand_name(value->value, value->value_len)); } FOREACH_LLIST_END(l, ereq, ereq_t *) } else { environ_t *value; /* Trace thr request. */ vb_appendf(&trace_in, " %s \"%s\"", telobjs[ereq->group], expand_name(ereq->name, ereq->name_len)); /* Dump one entry. */ value = find_environ( (ereq->group == TELOBJ_VAR)? &vars : &uservars, ereq->name, ereq->name_len); vb_appendf(&reply, "%c", ereq->group); vb_append(&reply, ereq->name, ereq->name_len); if (value != NULL) { vb_appendf(&reply, "%c", TELOBJ_VALUE); vb_append(&reply, value->value, value->value_len); } /* Trace the reply, */ vb_appendf(&trace_out, " %s \"%s\"", telobjs[ereq->group], expand_name(ereq->name, ereq->name_len)); if (value != NULL) { vb_appendf(&trace_out, " %s \"%s\"", telobjs[TELOBJ_VALUE], expand_name(value->value, value->value_len)); } } } FOREACH_LLIST_END(ereqs, ereq, ereq_t); /* Trace SE in and out. */ vb_appendf(&trace_in, " %s", cmd(SE)); vb_appendf(&trace_out, " %s", cmd(SE)); /* Free the parsed request. */ while (!llist_isempty(ereqs)) { ereq = (ereq_t *)ereqs->next; llist_unlink(&ereq->list); if (ereq->name != NULL) { Free(ereq->name); } Free(ereq); } /* Expand IACs, which may be hiding in names or values. */ expand_iac((const unsigned char *)vb_buf(&reply), vb_len(&reply), &reply_body, &reply_body_len); vb_free(&reply); /* Form the final reply message: IAC SB, reply body, IAC SE. */ *reply_buflen = 2 + reply_body_len + 2; *reply_buf = Malloc(2 + reply_body_len + 2); **reply_buf = IAC; *(*reply_buf + 1) = SB; memcpy(*reply_buf + 2, reply_body, reply_body_len); *(*reply_buf + 2 + reply_body_len) = IAC; *(*reply_buf + 2 + reply_body_len + 1) = SE; Free(reply_body); /* Return the traces. */ *trace_inp = vb_consume(&trace_in); *trace_outp = vb_consume(&trace_out); return true; } suite3270-3.6/Common/telnet_sio.c0000664000076500007650000001376313221577163014747 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_sio.c * Glue between telnet and secure I/O (sio). */ #include "globals.h" #include #include "appres.h" #include "popups.h" #include "sio.h" #include "ssl_passwd_gui.h" #include "telnet_sio.h" #include "trace.h" /* * Password cache. * We remember interactive passwords, keyed by the configuration (cert_file, * cert_file_type, chain_file, key_file, key_file_type, client_cert). */ typedef struct _password_cache { struct _password_cache *next; ssl_config_t config; char *password; } password_cache_t; static password_cache_t *password_cache; /* Compare two possibly-null strings. */ static bool nstreq(const char *a, const char *b) { return (a == NULL && b == NULL) || (a != NULL && b != NULL && !strcmp(a, b)); } /* Duplicate a possibly-null string. */ static char *nstrdup(const char *a) { return (a != NULL)? NewString(a): NULL; } /* Add or update an entry in the password cache. */ static void add_to_cache(ssl_config_t *config, const char *password) { password_cache_t *p; for (p = password_cache; p != NULL; p++) { if (nstreq(p->config.cert_file, config->cert_file) && nstreq(p->config.cert_file_type, config->cert_file_type) && nstreq(p->config.chain_file, config->chain_file) && nstreq(p->config.key_file, config->key_file) && nstreq(p->config.key_file_type, config->key_file_type) && nstreq(p->config.client_cert, config->client_cert)) { /* Overwrite existing entry. */ Replace(p->password, NewString(password)); return; } } /* Create a new entry. */ p = (password_cache_t *)Malloc(sizeof(password_cache_t)); memset(&p->config, 0, sizeof(ssl_config_t)); p->config.cert_file = nstrdup(config->cert_file); p->config.cert_file_type = nstrdup(config->cert_file_type); p->config.chain_file = nstrdup(config->chain_file); p->config.key_file = nstrdup(config->key_file); p->config.key_file_type = nstrdup(config->key_file_type); p->config.client_cert = nstrdup(config->client_cert); p->password = NewString(password); p->next = password_cache; password_cache = p; } /* Look up an entry in the password cache. */ static char * lookup_cache(ssl_config_t *config) { password_cache_t *p; for (p = password_cache; p != NULL; p++) { if (nstreq(p->config.cert_file, config->cert_file) && nstreq(p->config.cert_file_type, config->cert_file_type) && nstreq(p->config.chain_file, config->chain_file) && nstreq(p->config.key_file, config->key_file) && nstreq(p->config.key_file_type, config->key_file_type) && nstreq(p->config.client_cert, config->client_cert)) { return p->password; } } return NULL; } /* * Set up TLS, integrated with password prompting. */ sio_t sio_init_wrapper(char *password, bool force_no_verify, char *accept, bool *pending) { char password_buf[1024]; sio_t s; bool again = false; static ssl_config_t *config = NULL; /* Create a temporary config for sio to consume. */ Replace(config, Malloc(sizeof(ssl_config_t))); memcpy(config, &appres.ssl, sizeof(ssl_config_t)); if (force_no_verify) { config->verify_host_cert = false; } if (accept) { config->accept_hostname = accept; } if (password == NULL) { password = lookup_cache(&appres.ssl); if (password != NULL) { vtrace("SSL: Using cached password\n"); } } else { add_to_cache(&appres.ssl, password); } *pending = false; while (true) { sio_init_ret_t ret = sio_init(config, password, &s); switch (ret) { case SI_SUCCESS: return s; case SI_FAILURE: popup_an_error("%s", sio_last_error()); return NULL; case SI_WRONG_PASSWORD: vtrace("SSL: Password is wrong\n"); if (password == NULL) { popup_an_error("%s", sio_last_error()); return NULL; } again = true; /* else fall through, letting them enter another password */ case SI_NEED_PASSWORD: switch (ssl_passwd_gui_callback(password_buf, sizeof(password_buf), again)) { case SP_SUCCESS: /* Got it right away. */ vtrace("SSL: Password needed, supplied by GUI\n"); password = password_buf; add_to_cache(&appres.ssl, password); /* Try again. */ break; case SP_FAILURE: vtrace("SSL: Password needed, GUI failed\n"); return NULL; case SP_PENDING: vtrace("SSL: Password needed, GUI pending\n"); *pending = true; return NULL; case SP_NOT_SUPPORTED: vtrace("SSL: Password needed, GUI unavailable\n"); popup_an_error("Private key password needed"); return NULL; } break; } } } suite3270-3.6/Common/toggles.c0000664000076500007650000001654413221577163014246 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * toggles.c * This module handles toggles. */ #include "globals.h" #include "appres.h" #include "resources.h" #include "actions.h" #include "menubar.h" #include "popups.h" #include "toggles.h" #include "utils.h" /* Live state of toggles. */ typedef struct { bool changed; /* has the value changed since init */ bool supported; /* is the toggle supported */ unsigned flags; /* miscellaneous flags */ toggle_upcall_t *upcall; /* notify folks it has changed */ } toggle_t; static toggle_t toggle[N_TOGGLES]; /* Toggle name dictionary. */ toggle_name_t toggle_names[] = { { ResMonoCase, MONOCASE, false }, { ResAltCursor, ALT_CURSOR, false }, { ResCursorBlink, CURSOR_BLINK, false }, { ResShowTiming, SHOW_TIMING, false }, { ResCursorPos, CURSOR_POS, false }, { ResTrace, TRACING, false }, { ResDsTrace, TRACING, true }, /* compatibility */ { ResScrollBar, SCROLL_BAR, false }, { ResLineWrap, LINE_WRAP, false }, { ResBlankFill, BLANK_FILL, false }, { ResScreenTrace, SCREEN_TRACE, false }, { ResEventTrace, TRACING, true }, /* compatibility */ { ResMarginedPaste, MARGINED_PASTE, false }, { ResRectangleSelect, RECTANGLE_SELECT, false }, { ResCrosshair, CROSSHAIR, false }, { ResVisibleControl, VISIBLE_CONTROL, false }, { ResAidWait, AID_WAIT, false }, { ResUnderscore, UNDERSCORE, false }, { ResOverlayPaste, OVERLAY_PASTE, false }, { NULL, 0, false } }; /* * Generic toggle stuff */ static void do_toggle_reason(toggle_index_t ix, enum toggle_type reason) { toggle_t *t = &toggle[ix]; /* * Change the value, call the internal update routine, and reset the * menu label(s). */ toggle_toggle(ix); if (t->upcall != NULL) { t->upcall(ix, reason); } menubar_retoggle(ix); } void do_toggle(int ix) { do_toggle_reason(ix, TT_INTERACTIVE); } void do_menu_toggle(int ix) { do_toggle_reason(ix, TT_XMENU); } /* * Called from system initialization code to handle initial toggle settings. */ void initialize_toggles(void) { toggle_index_t ix; for (ix = 0; ix < N_TOGGLES; ix++) { if (toggled(ix) && (toggle[ix].flags & TOGGLE_NEED_INIT)) { /* Make the upcall. */ toggle[ix].upcall(ix, TT_INITIAL); /* It might have failed. Fix up the menu if it did. */ if (!toggled(ix)) { menubar_retoggle(ix); } } } } /* * Called from system exit code to handle toggles. */ void toggle_exiting(bool mode _is_unused) { toggle_index_t ix; for (ix = 0; ix < N_TOGGLES; ix++) { if (toggled(ix) && toggle[ix].flags & TOGGLE_NEED_CLEANUP) { set_toggle(ix, false); toggle[ix].upcall(ix, TT_FINAL); } } } bool Toggle_action(ia_t ia, unsigned argc, const char **argv) { int j; int ix; action_debug("Toggle", ia, argc, argv); if (check_argc("Toggle", argc, 1, 2) < 0) { return false; } for (j = 0; toggle_names[j].name != NULL; j++) { if (!toggle_supported(toggle_names[j].index)) { continue; } if (!strcasecmp(argv[0], toggle_names[j].name)) { ix = toggle_names[j].index; break; } } if (toggle_names[j].name == NULL) { popup_an_error("Toggle: Unknown toggle name '%s'", argv[0]); return false; } if (argc == 1) { do_toggle_reason(ix, TT_ACTION); } else if (!strcasecmp(argv[1], "set")) { if (!toggled(ix)) { do_toggle_reason(ix, TT_ACTION); } } else if (!strcasecmp(argv[1], "clear")) { if (toggled(ix)) { do_toggle_reason(ix, TT_ACTION); } } else { popup_an_error("Toggle: Unknown keyword '%s' (must be 'set' or " "'clear')", argv[1]); return false; } return true; } /** * Toggles module registration. */ void toggles_register(void) { static action_table_t toggle_actions[] = { { "Toggle", Toggle_action, ACTION_KE } }; /* Register the cleanup routine. */ register_schange(ST_EXITING, toggle_exiting); /* Register the actions. */ register_actions(toggle_actions, array_count(toggle_actions)); } /** * Flip the value of a toggle without notifying anyone. * * @param ix Toggle index */ void toggle_toggle(toggle_index_t ix) { set_toggle(ix, !toggled(ix)); } /** * Set the value of a toggle, without notifying anyone. * * @param ix Toggle index */ void set_toggle(toggle_index_t ix, bool value) { appres.toggle[ix] = value; toggle[ix].changed = true; } /** * Set the initial value of a toggle, which does not include marking it * changed or notifying anyone. * * @param ix Toggle index */ void set_toggle_initial(toggle_index_t ix, bool value) { appres.toggle[ix] = value; } /** * Return current state of a toggle. * * @param ix Toggle index * * @return Toggle state */ bool toggled(toggle_index_t ix) { return appres.toggle[ix]; } /** * Return change status of a toggle. * * @param ix Toggle index * * @return true if changed, false otherwise */ bool toggle_changed(toggle_index_t ix) { return toggle[ix].changed; } /** * Check for a toggle being supported in this app. * * @param[in] ix Toggle index * * @return true if supported, false otherwise. */ bool toggle_supported(toggle_index_t ix) { return toggle[ix].supported; } /** * Register a group of toggle callbacks. * * @param[in] toggles Array of callbacks to register * @param[in] count Number of elements in toggles[] */ void register_toggles(toggle_register_t toggles[], unsigned count) { unsigned i; for (i = 0; i < count; i++) { toggle[toggles[i].ix].supported = true; toggle[toggles[i].ix].upcall = toggles[i].upcall; toggle[toggles[i].ix].flags = toggles[i].flags; } } suite3270-3.6/Common/trace.c0000664000076500007650000007245313221577163013701 0ustar pdmpdm/* * Copyright (c) 1993-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace.c * 3270 data stream tracing. * */ #include "globals.h" #include #include #include #include #include "3270ds.h" #include "appres.h" #include "ctlr.h" #include "charset.h" #include "child.h" #include "ctlrc.h" #include "fprint_screen.h" #include "lazya.h" #include "menubar.h" #include "nvt.h" #include "popups.h" #include "print_screen.h" #include "product.h" #include "save.h" #include "status.h" #include "telnet.h" #include "telnet_core.h" #include "toggles.h" #include "trace.h" #include "trace_gui.h" #include "utf8.h" #include "utils.h" #if defined(_WIN32) /*[*/ # include "w3misc.h" # include "windirs.h" # include "winprint.h" #endif /*]*/ /* Size of the data stream trace buffer. */ #define TRACE_DS_BUFSIZE (4*1024) /* Wrap column for data stream tracing. */ #define TRACE_DS_WRAP 75 /* Maximum size of a tracefile header. */ #define MAX_HEADER_SIZE (32*1024) /* Minimum size of a trace file. */ #define MIN_TRACEFILE_SIZE (64*1024) #define MIN_TRACEFILE_SIZE_NAME "64K" /* System calls which may not be there. */ #if !defined(HAVE_FSEEKO) /*[*/ #define fseeko(s, o, w) fseek(s, (long)o, w) #define ftello(s) (off_t)ftell(s) #endif /*]*/ #if defined(EILSEQ) /*[*/ # define IS_EILSEQ(e) ((e) == EILSEQ) #else /*]*/ # define IS_EILSEQ(e) 0 #endif /*]*/ /* Statics */ static size_t dscnt = 0; #if !defined(_WIN32) /*[*/ static int tracewindow_pid = -1; #else /*][*/ static HANDLE tracewindow_handle = NULL; #endif /*]*/ static FILE *tracef = NULL; static FILE *tracef_pipe = NULL; static char *tracef_bufptr = NULL; static off_t tracef_size = 0; static off_t tracef_max = 0; static char *onetime_tracefile_name = NULL; static tss_t screentrace_how = TSS_FILE; static ptype_t screentrace_ptype = P_TEXT; static tss_t screentrace_last_how = TSS_FILE; static char *onetime_screentrace_name = NULL; static void vwtrace(bool do_ts, const char *fmt, va_list args); static void wtrace(bool do_ts, const char *fmt, ...); static char *create_tracefile_header(const char *mode); static void stop_tracing(void); static char *screentrace_name = NULL; #if defined(_WIN32) /*[*/ static char *screentrace_tmpfn; #endif /*]*/ static int screentrace_count; /* Globals */ bool trace_skipping = false; char *tracefile_name = NULL; /* Statics */ static bool wrote_ts = false; /* display a (row,col) */ const char * rcba(int baddr) { return lazyaf("(%d,%d)", baddr/COLS + 1, baddr%COLS + 1); } /* Data Stream trace print, handles line wraps */ /* * This function is careful to do line breaks based on wchar_t's, not * bytes, so multi-byte characters are traced properly. * However, it doesn't know that DBCS characters are two columns wide, so it * will get those wrong and break too late. To get that right, it needs some * sort of function to tell it that a wchar_t is double-width, which we lack at * the moment. * * If wchar_t's are Unicode, it could perhaps use some sort of heuristic based * on which plane the character is in. */ static void trace_ds_s(char *s, bool can_break) { size_t len = strlen(s); size_t len0 = len + 1; size_t wlen; bool nl = false; wchar_t *w_buf; /* wchar_t translation of s */ wchar_t *w_cur; /* current wchar_t pointer */ wchar_t *w_chunk; /* transient wchar_t buffer */ char *mb_chunk; /* transient multibyte buffer */ if (!toggled(TRACING) || tracef == NULL || !len) { return; } /* Allocate buffers for chunks of output data. */ mb_chunk = Malloc(len0); w_chunk = (wchar_t *)Malloc(len0 * sizeof(wchar_t)); /* Convert the input string to wchar_t's. */ w_buf = (wchar_t *)Malloc(len0 * sizeof(wchar_t)); wlen = mbstowcs(w_buf, s, len); if (wlen == (size_t)-1) { Error("trace_ds_s: mbstowcs failed"); } w_cur = w_buf; /* Check for a trailing newline. */ if (len && s[len-1] == '\n') { wlen--; nl = true; } if (!can_break && dscnt + wlen >= TRACE_DS_WRAP) { wtrace(false, "...\n... "); dscnt = 0; } while (dscnt + wlen >= TRACE_DS_WRAP) { size_t plen = TRACE_DS_WRAP - dscnt; size_t mblen; if (plen) { memcpy(w_chunk, w_cur, plen * sizeof(wchar_t)); w_chunk[plen] = 0; mblen = wcstombs(mb_chunk, w_chunk, len0); if (mblen == 0 || mblen == (size_t)-1) { Error("trace_ds_s: wcstombs 1 failed"); } } else { mb_chunk[0] = '\0'; mblen = 0; } wtrace(false, "%.*s ...\n... ", mblen, mb_chunk); dscnt = 4; w_cur += plen; wlen -= plen; } if (wlen) { size_t mblen; memcpy(w_chunk, w_cur, wlen * sizeof(wchar_t)); w_chunk[wlen] = 0; mblen = wcstombs(mb_chunk, w_chunk, len0); if (mblen == 0 || mblen == (size_t)-1) Error("trace_ds_s: wcstombs 2 failed"); wtrace(false, "%.*s", mblen, mb_chunk); dscnt += wlen; } if (nl) { wtrace(false, "\n"); dscnt = 0; } Free(mb_chunk); Free(w_buf); Free(w_chunk); } /* * External interface to data stream tracing -- no timestamps, automatic line * wraps. */ void trace_ds(const char *fmt, ...) { va_list args; char *s; if (!toggled(TRACING) || tracef == NULL) { return; } /* print out remainder of message */ va_start(args, fmt); s = xs_vbuffer(fmt, args); va_end(args); trace_ds_s(s, true); Free(s); } /* Conditional event trace. */ void vtrace(const char *fmt, ...) { va_list args; if (!toggled(TRACING) || tracef == NULL) { return; } /* print out message */ va_start(args, fmt); vwtrace(true, fmt, args); va_end(args); } /* Conditional event trace. */ void ntvtrace(const char *fmt, ...) { va_list args; if (!toggled(TRACING) || tracef == NULL) { return; } /* print out message */ va_start(args, fmt); vwtrace(false, fmt, args); va_end(args); } /* * Generate a timestamp for the trace file. */ static char * gen_ts(void) { struct timeval tv; time_t t; struct tm *tm; (void) gettimeofday(&tv, NULL); t = tv.tv_sec; tm = localtime(&t); return lazyaf("%d%02d%02d.%02d%02d%02d.%03d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000L)); } /* * Write to the trace file, varargs style. * This is the only function that actually does output to the trace file -- * all others are wrappers around this function. */ static void vwtrace(bool do_ts, const char *fmt, va_list args) { size_t n2w_left, n2w, nw; char *ts; char *buf = NULL; char *bp; /* Ugly hack to write into a memory buffer. */ if (tracef_bufptr != NULL) { if (do_ts) { tracef_bufptr += sprintf(tracef_bufptr, "%s", gen_ts()); } tracef_bufptr += vsprintf(tracef_bufptr, fmt, args); return; } if (tracef == NULL) { return; } ts = NULL; buf = xs_vbuffer(fmt, args); n2w_left = strlen(buf); bp = buf; while (n2w_left > 0) { char *nl; bool wrote_nl = false; if (do_ts && !wrote_ts) { if (ts == NULL) { ts = gen_ts(); } (void) fwrite(ts, strlen(ts), 1, tracef); fflush(tracef); if (tracef_pipe != NULL) { (void) fwrite(ts, strlen(ts), 1, tracef_pipe); fflush(tracef); } wrote_ts = true; } nl = strchr(bp, '\n'); if (nl != NULL) { wrote_nl = true; n2w = nl - bp + 1; } else { n2w = n2w_left; } nw = fwrite(bp, n2w, 1, tracef); if (nw == 1) { fflush(tracef); } else { if (errno != EPIPE && !IS_EILSEQ(errno)) { popup_an_errno(errno, "Write to trace file failed"); } if (!IS_EILSEQ(errno)) { stop_tracing(); goto done; } } if (tracef_pipe != NULL) { nw = fwrite(bp, n2w, 1, tracef_pipe); if (nw != 1) { (void) fclose(tracef_pipe); tracef_pipe = NULL; } else { fflush(tracef_pipe); } } if (wrote_nl) { wrote_ts = false; } bp += n2w; n2w_left -= n2w; } tracef_size = ftello(tracef); done: if (buf != NULL) { Free(buf); } return; } /* Write to the trace file. */ static void wtrace(bool do_ts, const char *fmt, ...) { if (tracef != NULL) { va_list args; va_start(args, fmt); vwtrace(do_ts, fmt, args); va_end(args); } } static void stop_tracing(void) { if (tracef != NULL && tracef != stdout) { (void) fclose(tracef); } tracef = NULL; if (tracef_pipe != NULL) { (void) fclose(tracef_pipe); tracef_pipe = NULL; } if (toggled(TRACING)) { toggle_toggle(TRACING); menubar_retoggle(TRACING); } } /* Check for a trace file rollover event. */ void trace_rollover_check(void) { if (tracef == NULL || tracef_max == 0) { return; } /* See if we've reached a rollover point. */ if (tracef_size >= tracef_max) { char *alt_filename; char *new_header; #if defined(_WIN32) /*[*/ char *period; #endif /*]*/ /* Close up this file. */ wtrace(true, "Trace rolled over\n"); fclose(tracef); tracef = NULL; /* Unlink and rename the alternate file. */ #if defined(_WIN32) /*[*/ period = strrchr(tracefile_name, '.'); if (period != NULL) { alt_filename = xs_buffer("%.*s-%s", (int)(period - tracefile_name), tracefile_name, period); } else #endif /*]*/ { alt_filename = xs_buffer("%s-", tracefile_name); } (void) unlink(alt_filename); (void) rename(tracefile_name, alt_filename); Free(alt_filename); alt_filename = NULL; tracef = fopen(tracefile_name, "w"); if (tracef == NULL) { popup_an_errno(errno, "%s", tracefile_name); return; } /* Initialize it. */ tracef_size = 0L; (void) SETLINEBUF(tracef); new_header = create_tracefile_header("rolled over"); wtrace(false, new_header); Free(new_header); } } static int trace_reason; /* Create a trace file header. */ static char * create_tracefile_header(const char *mode) { char *buf; int i; /* Create a buffer and redirect output. */ buf = Malloc(MAX_HEADER_SIZE); tracef_bufptr = buf; /* Display current status */ wtrace(true, "Trace %s\n", mode); wtrace(false, " Version: %s\n", build); wtrace(false, " %s\n", build_options()); save_yourself(); wtrace(false, " Command: %s\n", command_string); wtrace(false, " Model %s, %d rows x %d cols", model_name, maxROWS, maxCOLS); wtrace(false, ", %s display", appres.interactive.mono? "monochrome": "color"); if (appres.extended) { wtrace(false, ", extended data stream"); } wtrace(false, ", %s emulation", appres.m3279 ? "color" : "monochrome"); wtrace(false, ", %s charset", get_charset_name()); if (appres.apl_mode) { wtrace(false, ", APL mode"); } wtrace(false, "\n"); #if !defined(_WIN32) /*[*/ wtrace(false, " Locale codeset: %s\n", locale_codeset); #else /*][*/ wtrace(false, " ANSI codepage: %d\n", GetACP()); # if defined(_WIN32) /*[*/ wtrace(false, " Local codepage: %d\n", appres.local_cp); # endif /*]*/ #endif /*]*/ wtrace(false, " Host codepage: %d", (int)(cgcsgid & 0xffff)); if (dbcs) { wtrace(false, "+%d", (int)(cgcsgid_dbcs & 0xffff)); } wtrace(false, "\n"); #if defined(_WIN32) /*[*/ wtrace(false, " Docs: %s\n", mydocs3270? mydocs3270: "(null)"); wtrace(false, " Install dir: %s\n", instdir? instdir: "(null)"); wtrace(false, " Desktop: %s\n", mydesktop? mydesktop: "(null)"); #endif /*]*/ wtrace(false, " Toggles:"); for (i = 0; toggle_names[i].name != NULL; i++) { if (toggle_supported(toggle_names[i].index) && !toggle_names[i].is_alias && toggled(toggle_names[i].index)) { wtrace(false, " %s", toggle_names[i].name); } } wtrace(false, "\n"); if (CONNECTED) { wtrace(false, " Connected to %s, port %u\n", current_host, current_port); } /* Snap the current TELNET options. */ if (net_snap_options()) { wtrace(false, " TELNET state:\n"); trace_netdata('<', obuf, obptr - obuf); } /* Dump the screen contents and modes into the trace file. */ if (CONNECTED) { /* * Note that if the screen is not formatted, we do not * attempt to save what's on it. However, if we're in * 3270 SSCP-LU or NVT mode, we'll do a dummy, empty * write to ensure that the display is in the right * mode. */ if (IN_3270) { wtrace(false, " Screen contents (%s3270) %sformatted:\n", IN_E? "TN3270E-": "", formatted? "": "un"); obptr = obuf; (void) net_add_dummy_tn3270e(); ctlr_snap_buffer(); space3270out(2); net_add_eor(obuf, obptr - obuf); obptr += 2; trace_netdata('<', obuf, obptr - obuf); obptr = obuf; if (ctlr_snap_modes()) { wtrace(false, " 3270 modes:\n"); space3270out(2); net_add_eor(obuf, obptr - obuf); obptr += 2; trace_netdata('<', obuf, obptr - obuf); } } else if (IN_E) { obptr = obuf; (void) net_add_dummy_tn3270e(); wtrace(false, " Screen contents (%s):\n", IN_SSCP? "SSCP-LU": "TN3270E-NVT"); if (IN_SSCP) { ctlr_snap_buffer_sscp_lu(); } else if (IN_NVT) { nvt_snap(); } space3270out(2); net_add_eor(obuf, obptr - obuf); obptr += 2; trace_netdata('<', obuf, obptr - obuf); if (IN_NVT) { wtrace(false, " NVT modes:\n"); obptr = obuf; nvt_snap_modes(); trace_netdata('<', obuf, obptr - obuf); } } else if (IN_NVT) { obptr = obuf; wtrace(false, " Screen contents (NVT):\n"); nvt_snap(); trace_netdata('<', obuf, obptr - obuf); wtrace(false, " NVT modes:\n"); obptr = obuf; nvt_snap_modes(); trace_netdata('<', obuf, obptr - obuf); } } wtrace(false, " Data stream:\n"); /* Return the buffer. */ tracef_bufptr = NULL; return buf; } /* Calculate the tracefile maximum size. */ static void get_tracef_max(void) { static bool calculated = false; char *ptr; bool bad = false; if (calculated) { return; } calculated = true; if (appres.trace_file_size == NULL || !strcmp(appres.trace_file_size, "0") || !strncasecmp(appres.trace_file_size, "none", strlen(appres.trace_file_size))) { tracef_max = 0; return; } tracef_max = strtoul(appres.trace_file_size, &ptr, 0); if (tracef_max == 0 || ptr == appres.trace_file_size || *(ptr + 1)) { bad = true; } else switch (*ptr) { case 'k': case 'K': tracef_max *= 1024; break; case 'm': case 'M': tracef_max *= 1024 * 1024; break; case '\0': break; default: bad = true; break; } if (bad) { tracef_max = MIN_TRACEFILE_SIZE; trace_gui_bad_size(MIN_TRACEFILE_SIZE_NAME); } else if (tracef_max < MIN_TRACEFILE_SIZE) { tracef_max = MIN_TRACEFILE_SIZE; } } /* Parse the name '/dev/fd', so we can simulate it. */ static int get_devfd(const char *pathname) { unsigned long fd; char *ptr; if (strncmp(pathname, "/dev/fd/", 8)) { return -1; } fd = strtoul(pathname + 8, &ptr, 10); if (ptr == pathname + 8 || *ptr != '\0' || fd > INT_MAX) { return -1; } return fd; } #if !defined(_WIN32) /*[*/ /* * Start up a window to monitor the trace file. * * @param[in] path Trace file path. On Unix, this can be NULL to indicate * that the trace is just being piped. * @param[in] pipefd Array of pipe file descriptors. */ static void start_trace_window(const char *path, int pipefd[]) { switch (tracewindow_pid = fork_child()) { case 0: /* child process */ (void) execlp("xterm", "xterm", "-title", path? path: "trace", "-sb", "-e", "/bin/sh", "-c", xs_buffer("cat <&%d", pipefd[0]), NULL); (void) perror("exec(xterm) failed"); _exit(1); break; default: /* parent */ (void) close(pipefd[0]); ++children; break; case -1: /* error */ popup_an_errno(errno, "fork() failed"); break; } } #else /*][*/ /* * Start up a window to monitor the trace file. * * @param[in] path Trace file path. */ static void start_trace_window(const char *path) { STARTUPINFO startupinfo; PROCESS_INFORMATION process_information; memset(&startupinfo, 0, sizeof(STARTUPINFO)); startupinfo.cb = sizeof(STARTUPINFO); startupinfo.lpTitle = (char *)path; memset(&process_information, 0, sizeof(PROCESS_INFORMATION)); if (CreateProcess(lazyaf("%scatf.exe", instdir), lazyaf("\"%scatf.exe\" \"%s\"", instdir, path), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupinfo, &process_information) == 0) { popup_an_error("CreateProcess(%scatf.exe \"%s\") failed: %s", instdir, path, win32_strerror(GetLastError())); } else { tracewindow_handle = process_information.hProcess; CloseHandle(process_information.hThread); } } #endif /*]*/ /* Start tracing, using the specified file. */ void tracefile_ok(const char *tfn) { int devfd = -1; #if !defined(_WIN32) /*[*/ int pipefd[2]; bool just_piped = false; #endif /*]*/ char *buf; char *stfn; stfn = do_subst(tfn, DS_VARS | DS_TILDE | DS_UNIQUE); if (strchr(stfn, '\'') || ((int)strlen(stfn) > 0 && stfn[strlen(stfn)-1] == '\\')) { popup_an_error("Illegal file name: %s", tfn); Free(stfn); goto done; } tracef_max = 0; if (!strcmp(stfn, "stdout")) { tracef = stdout; } else { #if !defined(_WIN32) /*[*/ FILE *pipefile = NULL; if (!strcmp(stfn, "none") || !stfn[0]) { just_piped = true; if (!appres.trace_monitor) { popup_an_error("Must specify a trace file name"); free(stfn); goto done; } } if (appres.trace_monitor) { if (pipe(pipefd) < 0) { popup_an_errno(errno, "pipe() failed"); Free(stfn); goto done; } pipefile = fdopen(pipefd[1], "w"); if (pipefile == NULL) { popup_an_errno(errno, "fdopen() failed"); (void) close(pipefd[0]); (void) close(pipefd[1]); Free(stfn); goto done; } (void) SETLINEBUF(pipefile); (void) fcntl(pipefd[1], F_SETFD, 1); } if (just_piped) { tracef = pipefile; } else #endif /*]*/ { bool append = false; #if !defined(_WIN32) /*[*/ tracef_pipe = pipefile; #endif /*]*/ /* Get the trace file maximum. */ get_tracef_max(); /* Open and configure the file. */ if ((devfd = get_devfd(stfn)) >= 0) tracef = fdopen(dup(devfd), "a"); else if (!strncmp(stfn, ">>", 2)) { append = true; tracef = fopen(stfn + 2, "a"); } else { tracef = fopen(stfn, "w"); } if (tracef == NULL) { popup_an_errno(errno, "%s", stfn); #if !defined(_WIN32) /*[*/ fclose(tracef_pipe); (void) close(pipefd[0]); (void) close(pipefd[1]); #endif /*]*/ Free(stfn); goto done; } tracef_size = ftello(tracef); Replace(tracefile_name, NewString(append? stfn + 2: stfn)); (void) SETLINEBUF(tracef); #if !defined(_WIN32) /*[*/ (void) fcntl(fileno(tracef), F_SETFD, 1); #endif /*]*/ } } /* Start the monitor window. */ if (tracef != stdout && appres.trace_monitor && product_has_display()) { #if !defined(_WIN32) /*[*/ start_trace_window(just_piped? NULL: stfn, pipefd); #else /*][*/ if (windirs_flags && GD_CATF) { start_trace_window(stfn); } #endif /*]*/ } Free(stfn); /* We're really tracing, turn the flag on. */ set_toggle(trace_reason, true); menubar_retoggle(trace_reason); /* Display current status. */ buf = create_tracefile_header("started"); wtrace(false, "%s", buf); Free(buf); done: return; } #if defined(_WIN32) /*[*/ const char * default_trace_dir(void) { if (product_has_display()) { /* * wc3270 puts traces on the desktop, and if that's not defined, in * the current directory. */ return mydesktop? mydesktop: ".\\"; } else { /* ws3270 puts traces in the current directory. */ return ".\\"; } } #endif /*]*/ /* Open the trace file. */ static void tracefile_on(int reason, enum toggle_type tt) { char *tracefile_buf = NULL; char *tracefile; if (tracef != NULL) { return; } trace_reason = reason; if (appres.secure && tt != TT_INITIAL) { tracefile_ok("none"); return; } if (onetime_tracefile_name != NULL) { tracefile = tracefile_buf = onetime_tracefile_name; onetime_tracefile_name = NULL; } else if (appres.trace_file) { tracefile = appres.trace_file; } else { #if defined(_WIN32) /*[*/ tracefile_buf = xs_buffer("%s%sx3trc.$UNIQUE.txt", appres.trace_dir? appres.trace_dir: default_trace_dir(), appres.trace_dir? "\\": ""); #else /*][*/ tracefile_buf = xs_buffer("%s/x3trc.$UNIQUE", appres.trace_dir); #endif /*]*/ tracefile = tracefile_buf; } if (!trace_gui_on(reason, tt, tracefile)) { tracefile_ok(tracefile); } else { /* Turn the toggle _off_ until the popup succeeds. */ set_toggle(reason, false); } if (tracefile_buf != NULL) { Free(tracefile_buf); } } /* Close the trace file. */ static void tracefile_off(void) { wtrace(true, "Trace stopped\n"); #if !defined(_WIN32) /*[*/ if (tracewindow_pid != -1) { (void) kill(tracewindow_pid, SIGKILL); tracewindow_pid = -1; } #else /*][*/ if (tracewindow_handle != NULL) { TerminateProcess(tracewindow_handle, 0); CloseHandle(tracewindow_handle); tracewindow_handle = NULL; } #endif /*]*/ stop_tracing(); } void trace_set_trace_file(const char *path) { Replace(onetime_tracefile_name, NewString(path)); } static void toggle_tracing(toggle_index_t ix _is_unused, enum toggle_type tt) { /* If turning on trace and no trace file, open one. */ if (toggled(TRACING) && tracef == NULL) { tracefile_on(TRACING, tt); if (tracef == NULL) { set_toggle(TRACING, false); } } else if (!toggled(TRACING)) { /* If turning off trace and not still tracing events, close the trace file. */ tracefile_off(); } } /* Screen trace file support. */ static FILE *screentracef = NULL; static fps_t screentrace_fps = NULL; /* * Screen trace function, called when the host clears the screen. */ static void do_screentrace(bool always _is_unused) { /* * XXX: We should do something smarter here should fprint_screen_body() * fail. */ (void) fprint_screen_body(screentrace_fps); status_screentrace(++screentrace_count); } void trace_screen(bool is_clear) { trace_skipping = false; if (!toggled(SCREEN_TRACE) || !screentracef) { return; } do_screentrace(is_clear); } /* Called from NVT emulation code to log a single character. */ void trace_char(char c) { if (!toggled(SCREEN_TRACE) || !screentracef) { return; } (void) fputc(c, screentracef); } /* * Called when disconnecting in NVT mode, to finish off the trace file * and keep the next screen clear from re-recording the screen image. * (In a gross violation of data hiding and modularity, trace_skipping is * manipulated directly in ctlr_clear()). */ void trace_nvt_disc(void) { int i; (void) fputc('\n', screentracef); for (i = 0; i < COLS; i++) { (void) fputc('=', screentracef); } (void) fputc('\n', screentracef); trace_skipping = true; } /* * Screen tracing callback. * Returns true for success, false for failure. */ static bool screentrace_cb(tss_t how, ptype_t ptype, char *tfn) { char *xtfn = NULL; int srv; if (how == TSS_FILE) { xtfn = do_subst(tfn, DS_VARS | DS_TILDE | DS_UNIQUE); screentracef = fopen(xtfn, "a"); } else { /* Printer. */ #if !defined(_WIN32) /*[*/ screentracef = popen(tfn, "w"); #else /*][*/ int fd; fd = win_mkstemp(&screentrace_tmpfn, ptype); if (fd < 0) { popup_an_errno(errno, "%s", "(temporary file)"); Free(tfn); return false; } screentracef = fdopen(fd, (ptype == P_GDI)? "wb+": "w"); #endif /*]*/ } if (screentracef == NULL) { if (how == TSS_FILE) popup_an_errno(errno, "%s", xtfn); else #if !defined(_WIN32) /*[*/ popup_an_errno(errno, "%s", tfn); #else /*][*/ popup_an_errno(errno, "%s", "(temporary file)"); #endif /*]*/ Free(xtfn); #if defined(_WIN32) /*[*/ Free(screentrace_tmpfn); screentrace_tmpfn = NULL; #endif /*]*/ return false; } if (how == TSS_FILE) Replace(screentrace_name, NewString(xtfn)); else Replace(screentrace_name, NewString(tfn)); Free(tfn); (void) SETLINEBUF(screentracef); #if !defined(_WIN32) /*[*/ (void) fcntl(fileno(screentracef), F_SETFD, 1); #endif /*]*/ srv = fprint_screen_start(screentracef, ptype, (how == TSS_PRINTER)? FPS_FF_SEP: 0, default_caption(), screentrace_name, &screentrace_fps); if (FPS_IS_ERROR(srv)) { if (srv == FPS_STATUS_ERROR) { popup_an_error("Screen trace start failed."); } else if (srv == FPS_STATUS_CANCEL) { popup_an_error("Screen trace canceled."); } fclose(screentracef); return false; } /* We're really tracing, turn the flag on. */ set_toggle(SCREEN_TRACE, true); menubar_retoggle(SCREEN_TRACE); return true; } /* End the screen trace. */ static void end_screentrace(bool is_final _is_unused) { fprint_screen_done(&screentrace_fps); (void) fclose(screentracef); screentracef = NULL; #if defined(_WIN32) /*[*/ if (screentrace_how == TSS_PRINTER) { if (screentrace_ptype == P_RTF) { /* Start up WordPad to print the file. */ if (is_final) { start_wordpad_sync("ScreenTrace", screentrace_tmpfn, screentrace_name); } else { start_wordpad_async("ScreenTrace", screentrace_tmpfn, screentrace_name); } } else { /* Get rid of the temp file. */ unlink(screentrace_tmpfn); } } #endif /*]*/ } void trace_set_screentrace_file(tss_t how, ptype_t ptype, const char *name) { screentrace_how = how; screentrace_ptype = ptype; Replace(onetime_screentrace_name, name? NewString(name): NULL); } tss_t trace_get_screentrace_how(void) { return screentrace_how; } tss_t trace_get_screentrace_last_how(void) { return screentrace_last_how; } const char * trace_get_screentrace_name(void) { return (screentrace_name && screentrace_name[0])? screentrace_name: "(system default)"; } /* Return the default filename for screen tracing. */ char * screentrace_default_file(ptype_t ptype) { const char *suffix; switch (ptype) { default: case P_TEXT: suffix = "txt"; break; case P_HTML: suffix = "html"; break; case P_RTF: suffix = "rtf"; break; } #if defined(_WIN32) /*[*/ return xs_buffer("%s%sx3scr.$UNIQUE.%s", appres.trace_dir? appres.trace_dir: default_trace_dir(), appres.trace_dir? "\\": "", suffix); #else /*][*/ return xs_buffer("%s/x3scr.$UNIQUE.%s", appres.trace_dir, suffix); #endif /*]*/ } /* Return the default printer for screen tracing. */ char * screentrace_default_printer(void) { #if defined(_WIN32) /*[*/ return NewString(""); #else /*][*/ return NewString("lpr"); #endif /*]*/ } /* * Turn screen tracing on or off. * * If turning it on, screentrace_how contains TSS_FILE or TSS_PRINTER, * and screentrace_name is NULL (use the default) or the name of a * file, printer command (Unix) or printer (Windows). */ static void toggle_screenTrace(toggle_index_t ix _is_unused, enum toggle_type tt) { char *tracefile_buf = NULL; char *tracefile; if (toggled(SCREEN_TRACE)) { /* Turn it on. */ status_screentrace((screentrace_count = 0)); if (onetime_screentrace_name != NULL) { tracefile = tracefile_buf = onetime_screentrace_name; onetime_screentrace_name = NULL; } else if (screentrace_how == TSS_FILE && appres.screentrace_file != NULL) { tracefile = appres.screentrace_file; } else { if (screentrace_how == TSS_FILE) { tracefile = tracefile_buf = screentrace_default_file(screentrace_ptype); } else { tracefile = tracefile_buf = screentrace_default_printer(); } } if (!screentrace_cb(screentrace_how, screentrace_ptype, NewString(tracefile))) { set_toggle(SCREEN_TRACE, false); status_screentrace((screentrace_count = -1)); } } else { /* Turn it off. */ if (ctlr_any_data() && !trace_skipping) { do_screentrace(false); } end_screentrace(tt == TT_FINAL); screentrace_last_how = screentrace_how; screentrace_how = TSS_FILE; /* back to the default */ screentrace_ptype = P_TEXT; /* back to the default */ status_screentrace((screentrace_count = -1)); } if (tracefile_buf != NULL) { Free(tracefile_buf); } trace_gui_toggle(); } /** * Trace module registration. */ void trace_register(void) { static toggle_register_t toggles[] = { { TRACING, toggle_tracing, TOGGLE_NEED_INIT | TOGGLE_NEED_CLEANUP }, { SCREEN_TRACE, toggle_screenTrace, TOGGLE_NEED_INIT | TOGGLE_NEED_CLEANUP } }; register_toggles(toggles, array_count(toggles)); } suite3270-3.6/Common/trace_gui_stubs.c0000664000076500007650000000354713221577163015763 0ustar pdmpdm/* * Copyright (c) 2014-2015, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace_gui_stubs.c * Stubs for trace_gui.c. */ #include "globals.h" #include "toggles.h" #include "trace_gui.h" void trace_gui_bad_size(const char *default_value _is_unused) { } bool trace_gui_on(int reason _is_unused, enum toggle_type tt _is_unused, const char *tracefile _is_unused) { return false; } void trace_gui_toggle(void) { } suite3270-3.6/Common/unicode.c0000775000076500007650000025252613221577163014235 0ustar pdmpdm/* * Copyright (c) 2008-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * unicode.c * A Windows console-based 3270 Terminal Emulator * EBCDIC/Unicode translation functions */ #include "globals.h" #include #if !defined(_MSC_VER) /*[*/ # include #endif /*]*/ #include #include "3270ds.h" #include "unicodec.h" #include "unicode_dbcs.h" #include "utf8.h" #include "utils.h" /* * Locale-related definitions. * Note that USE_ICONV can be used to override __STDC_ISO_10646__, so that * development of iconv-based logic can be done on 10646-compliant systems. */ #if defined(__STDC_ISO_10646__) && !defined(USE_ICONV) /*[*/ # define UNICODE_WCHAR 1 #endif /*]*/ #if !defined(_WIN32) && !defined(UNICODE_WCHAR) /*[*/ # undef USE_ICONV # define USE_ICONV 1 # include #endif /*]*/ #if defined(USE_ICONV) /*[*/ iconv_t i_u2mb = (iconv_t)-1; iconv_t i_mb2u = (iconv_t)-1; #if !defined(_LIBICONV_VERSION) || _LIBICONV_VERSION <= 0x010B /*[*/ typedef char *ici_t; /* old iconv */ #else /*][*/ typedef const char *ici_t; /* new iconv */ #endif /*]*/ #endif /*]*/ #define DEFAULT_CSNAME "us" #if defined(X3270_DBCS) /*[*/ bool dbcs_allowed = true; #else /*][*/ bool dbcs_allowed = false; #endif /*]*/ #if defined(_WIN32) /*[*/ int u_local_cp; #endif /*]*/ /* * EBCDIC-to-Unicode translation tables. * Each table maps EBCDIC codes X'41' through X'FE' to UCS-2. * Other codes are mapped programmatically. */ #define UT_SIZE 190 #define UT_OFFSET 0x41 typedef struct { char *name; unsigned short code[UT_SIZE]; const char *host_codepage; const char *cgcsgid; bool is_dbcs; } uni_t; static uni_t uni[] = { { "cp037", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005b, 0x005d, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "37", "37", false }, { "cp273", { 0x00a0, 0x00e2, 0x007b, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00c4, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x007e, 0x00dc, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x005b, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00f6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x00a7, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x00df, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x0040, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e4, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00a6, 0x00f2, 0x00f3, 0x00f5, 0x00fc, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x007d, 0x00f9, 0x00fa, 0x00ff, 0x00d6, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x005c, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x005d, 0x00d9, 0x00da }, "273", "273", false }, { "cp275", { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c9, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, 0x00c7, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e7, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e3, 0x003a, 0x00d5, 0x00c3, 0x0027, 0x003d, 0x0022, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f5, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e9, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005c, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, "275", "275", false }, { "cp277", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x007d, 0x00e7, 0x00f1, 0x0023, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x00a4, 0x00c5, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x0024, 0x00c7, 0x00d1, 0x00f8, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00a6, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x00c6, 0x00d8, 0x0027, 0x003d, 0x0022, 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x007b, 0x00b8, 0x005b, 0x005d, 0x00b5, 0x00fc, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e6, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x00e5, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x007e, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "277", "277", false }, { "cp278", { 0x00a0, 0x00e2, 0x007b, 0x00e0, 0x00e1, 0x00e3, 0x007d, 0x00e7, 0x00f1, 0x00a7, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x0060, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x00a4, 0x00c5, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x0023, 0x00c0, 0x00c1, 0x00c3, 0x0024, 0x00c7, 0x00d1, 0x00f6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00e9, 0x003a, 0x00c4, 0x00d6, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x005d, 0x00b5, 0x00fc, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x005b, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e4, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00a6, 0x00f2, 0x00f3, 0x00f5, 0x00e5, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x007e, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x0040, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "278", "278", false }, { "cp280", { 0x00a0, 0x00e2, 0x00e4, 0x007b, 0x00e1, 0x00e3, 0x00e5, 0x005c, 0x00f1, 0x00b0, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x005d, 0x00ea, 0x00eb, 0x007d, 0x00ed, 0x00ee, 0x00ef, 0x007e, 0x00df, 0x00e9, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00f2, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00f9, 0x003a, 0x00a3, 0x00a7, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x005b, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x00ec, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x0023, 0x00a5, 0x00b7, 0x00a9, 0x0040, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e0, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00a6, 0x00f3, 0x00f5, 0x00e8, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x0060, 0x00fa, 0x00ff, 0x00e7, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "280", "280", false }, { "cp284", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00a6, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x0023, 0x00f1, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x00d1, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x00a8, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005e, 0x0021, 0x00af, 0x007e, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "284", "284", false }, { "cp285", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x0024, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x00a3, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x00af, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x005b, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005e, 0x005d, 0x007e, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "285", "285", false }, { "cp297", { 0x00a0, 0x00e2, 0x00e4, 0x0040, 0x00e1, 0x00e3, 0x00e5, 0x005c, 0x00f1, 0x00b0, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x007b, 0x00ea, 0x00eb, 0x007d, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x00a7, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00f9, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00b5, 0x003a, 0x00a3, 0x00e0, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x005b, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x0060, 0x00a8, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x0023, 0x00a5, 0x00b7, 0x00a9, 0x005d, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x007e, 0x00b4, 0x00d7, 0x00e9, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x00e8, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00a6, 0x00fa, 0x00ff, 0x00e7, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "297", "297", false }, { "cp424", { 0x5d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0000, 0x05ea, 0x0000, 0x0000, 0x00a0, 0x0000, 0x0000, 0x0000, 0x21d4, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0000, 0x0000, 0x0000, 0x00b8, 0x0000, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005b, 0x005d, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x0000, 0x0000, 0x0000, 0x0000 }, "424", "0x054501a8", false }, { "cp500", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "500", "500", false }, { "cp803", { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x05d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x00a2, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0000, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, "803", "0x047b0323", false }, { "cp870", { 0x00a0, 0x00e2, 0x00e4, 0x0163, 0x00e1, 0x0103, 0x010d, 0x00e7, 0x0107, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x0119, 0x00eb, 0x016f, 0x00ed, 0x00ee, 0x013e, 0x013a, 0x00df, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x02dd, 0x00c1, 0x0102, 0x010c, 0x00c7, 0x0106, 0x007c, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x02c7, 0x00c9, 0x0118, 0x00cb, 0x016e, 0x00cd, 0x00ce, 0x013d, 0x0139, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x02d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x015b, 0x0148, 0x0111, 0x00fd, 0x0159, 0x015f, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0142, 0x0144, 0x0161, 0x00b8, 0x02db, 0x00a4, 0x0105, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x015a, 0x0147, 0x0110, 0x00dd, 0x0158, 0x015e, 0x00b7, 0x0104, 0x017c, 0x0162, 0x017b, 0x00a7, 0x017e, 0x017a, 0x017d, 0x0179, 0x0141, 0x0143, 0x0160, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x0155, 0x00f3, 0x0151, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x011a, 0x0171, 0x00fc, 0x0165, 0x00fa, 0x011b, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x010f, 0x00d4, 0x00d6, 0x0154, 0x00d3, 0x0150, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x010e, 0x0170, 0x00dc, 0x0164, 0x00da }, "870", "0x03bf0366", false }, { "cp871", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00fe, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x00c6, 0x0024, 0x002a, 0x0029, 0x003b, 0x00d6, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00f0, 0x003a, 0x0023, 0x00d0, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x0060, 0x00fd, 0x007b, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x007d, 0x00b8, 0x005d, 0x00a4, 0x00b5, 0x00f6, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x0040, 0x00dd, 0x005b, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x005c, 0x00d7, 0x00de, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x007e, 0x00f2, 0x00f3, 0x00f5, 0x00e6, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x00b4, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x005e, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "871", "871", false }, { "cp875", { 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x0000, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00a8, 0x0386, 0x0388, 0x0389, 0x2207, 0x038a, 0x038c, 0x038e, 0x038f, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0385, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x00b4, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x00a3, 0x03ac, 0x03ad, 0x03ae, 0x0390, 0x03af, 0x03cc, 0x03cd, 0x03b0, 0x03ce, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x03c9, 0x03ca, 0x03cb, 0x2018, 0x2015, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b1, 0x00bd, 0x0000, 0x00b7, 0x2019, 0x00a6, 0x005c, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00a7, 0x0000, 0x0000, 0x00ab, 0x00ac, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00a9, 0x0000, 0x0000, 0x00bb }, "875", "0x039d036b", false }, { "cp880", { 0x0000, 0x0452, 0x0453, 0x0451, 0x0000, 0x0455, 0x0456, 0x0457, 0x0458, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x0459, 0x045a, 0x045b, 0x045c, 0x0000, 0x045f, 0x042a, 0x2116, 0x0402, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x0403, 0x0401, 0x0000, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x040a, 0x040b, 0x040c, 0x0000, 0x0000, 0x040f, 0x044e, 0x0430, 0x0431, 0x0000, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0446, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x044f, 0x0000, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x0000, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x041d, 0x041e, 0x041f, 0x042f, 0x0420, 0x0421, 0x005c, 0x00a4, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427 }, "880", "0x03bf0370", false }, #if defined(X3270_DBCS) /*[*/ { "cp930", { /* 0x40 */ 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, /* 0x48 */ 0xff68, 0xff69, 0x00a3, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, /* 0x50 */ 0x0026, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, 0x0000, /* 0x58 */ 0xff70, 0x0000, 0x0021, 0x00a5, 0x002a, 0x0029, 0x003b, 0x00ac, /* 0x60 */ 0x002d, 0x002f, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, /* 0x68 */ 0x0067, 0x0068, 0x0000, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, /* 0x70 */ 0x005b, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x78 */ 0x0070, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, /* 0x80 */ 0x005d, 0xff67, 0xff68, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, /* 0x88 */ 0xff78, 0xff79, 0xff7a, 0x0071, 0xff7b, 0xff7c, 0xff7d, 0xff7e, /* 0x90 */ 0xff7f, 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, /* 0x98 */ 0xff87, 0xff88, 0xff89, 0x0072, 0x0000, 0xff8a, 0xff8b, 0xff8c, /* 0xa0 */ 0x007e, 0x00af, 0xff8d, 0xff8e, 0xff8f, 0xff90, 0xff91, 0xff92, /* 0xa8 */ 0xff93, 0xff94, 0xff95, 0x0073, 0xff96, 0xff97, 0xff98, 0xff99, /* 0xb0 */ 0x005e, 0x00a2, 0x005c, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, /* 0xb8 */ 0x0079, 0x007a, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, /* 0xc0 */ 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd0 */ 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, /* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe0 */ 0x0024, 0x20ac, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, /* 0xe8 */ 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 } , "930", "0x04940122" /* 1172, 0290 */, true }, { "cp935", { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a3, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x00a5, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007e, 0x00af, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005e, 0x0000, 0x005c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005b, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, "935", "0x04960344" /* 1174, 836 */, true }, { "cp937", { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005b, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005c, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, "937", "0x04970025" /* 1175, 037 */, true }, { "cp939", { /* 40 */ 0x0000, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, /* 48 */ 0xff67, 0xff68, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, /* 50 */ 0x0026, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, /* 58 */ 0xff70, 0xff71, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, /* 60 */ 0x002d, 0x002f, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, /* 68 */ 0xff78, 0xff79, 0x0000, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, /* 70 */ 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, 0xff80, 0xff81, /* 78 */ 0xff82, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, /* 80 */ 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 88 */ 0x0068, 0x0069, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, 0xff88, /* 90 */ 0x0000, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, /* 98 */ 0x0071, 0x0072, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, /* a0 */ 0x00af, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, /* a8 */ 0x0079, 0x007a, 0xff8f, 0xff90, 0xff91, 0x005b, 0xff92, 0xff93, /* b0 */ 0x005e, 0x00a3, 0x00a5, 0xff94, 0xff95, 0xff96, 0xff97, 0xff98, /* b8 */ 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0x005d, 0xff9e, 0xff9f, /* c0 */ 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* c8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* d0 */ 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, /* d8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* e0 */ 0x005c, 0x20ac, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, /* e8 */ 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* f0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* f8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, "939", "0x04940403" /* 1172, 1027 */, true }, #endif /*]*/ { "cp1026", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x007b, 0x00f1, 0x00c7, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x011e, 0x0130, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x005b, 0x00d1, 0x015f, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0131, 0x003a, 0x00d6, 0x015e, 0x0027, 0x003d, 0x00dc, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x007d, 0x0060, 0x00a6, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x02db, 0x00c6, 0x00a4, 0x00b5, 0x00f6, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x005d, 0x0024, 0x0040, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x2014, 0x00a8, 0x00b4, 0x00d7, 0x00e7, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x007e, 0x00f2, 0x00f3, 0x00f5, 0x011f, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x005c, 0x00f9, 0x00fa, 0x00ff, 0x00fc, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x0023, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x0022, 0x00d9, 0x00da }, "1026", "0x04800402", false }, { "cp1047", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x005b, 0x00de, 0x00ae, 0x00ac, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00dd, 0x00a8, 0x00af, 0x005d, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1047", "1047", false }, { "cp1140", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005b, 0x005d, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1140", "0x02b70474" /* 695, 1140 */, false }, { "cp1141", { 0x00a0, 0x00e2, 0x007b, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00c4, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x007e, 0x00dc, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x005b, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00f6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x00a7, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x00b5, 0x00df, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x0040, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e4, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00a6, 0x00f2, 0x00f3, 0x00f5, 0x00fc, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x007d, 0x00f9, 0x00fa, 0x00ff, 0x00d6, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x005c, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x005d, 0x00d9, 0x00da }, "1141", "0x02b70475" /* 695, 1141 */, false }, { "cp1142", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x007d, 0x00e7, 0x00f1, 0x0023, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x20ac, 0x00c5, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x0024, 0x00c7, 0x00d1, 0x00f8, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00a6, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x00c6, 0x00d8, 0x0027, 0x003d, 0x0022, 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x007b, 0x00b8, 0x005b, 0x005d, 0x00b5, 0x00fc, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e6, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x00e5, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x007e, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1142", "0x02b70476" /* 695, 1142 */, false }, { "cp1143", { 0x00a0, 0x00e2, 0x007b, 0x00e0, 0x00e1, 0x00e3, 0x007d, 0x00e7, 0x00f1, 0x00a7, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x0060, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x20ac, 0x00c5, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x0023, 0x00c0, 0x00c1, 0x00c3, 0x0024, 0x00c7, 0x00d1, 0x00f6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x005c, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00e9, 0x003a, 0x00c4, 0x00d6, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x005d, 0x00b5, 0x00fc, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x005b, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e4, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00a6, 0x00f2, 0x00f3, 0x00f5, 0x00e5, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x007e, 0x00f9, 0x00fa, 0x00ff, 0x00c9, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x0040, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1143", "0x02b70477" /* 695, 1143 */, false }, { "cp1144", { 0x00a0, 0x00e2, 0x00e4, 0x007b, 0x00e1, 0x00e3, 0x00e5, 0x005c, 0x00f1, 0x00b0, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x005d, 0x00ea, 0x00eb, 0x007d, 0x00ed, 0x00ee, 0x00ef, 0x007e, 0x00df, 0x00e9, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00f2, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00f9, 0x003a, 0x00a3, 0x00a7, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x005b, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x00b5, 0x00ec, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x0023, 0x00a5, 0x00b7, 0x00a9, 0x0040, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e0, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00a6, 0x00f3, 0x00f5, 0x00e8, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x0060, 0x00fa, 0x00ff, 0x00e7, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1144", "0x02b70478" /* 695, 1144 */, false }, { "cp1145", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00a6, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x0023, 0x00f1, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x00d1, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x00b5, 0x00a8, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005e, 0x0021, 0x00af, 0x007e, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1145", "0x02b70479" /* 695, 1145 */, false }, { "cp1146", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x0024, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x00a3, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x00b5, 0x00af, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x005b, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005e, 0x005d, 0x007e, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1146", "0x02b7047a" /* 695, 1146 */, false }, { "cp1147", { 0x00a0, 0x00e2, 0x00e4, 0x0040, 0x00e1, 0x00e3, 0x00e5, 0x005c, 0x00f1, 0x00b0, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x007b, 0x00ea, 0x00eb, 0x007d, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x00a7, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00f9, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00b5, 0x003a, 0x00a3, 0x00e0, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x005b, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x0060, 0x00a8, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x0023, 0x00a5, 0x00b7, 0x00a9, 0x005d, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x007e, 0x00b4, 0x00d7, 0x00e9, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x00e8, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00a6, 0x00fa, 0x00ff, 0x00e7, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1147", "0x02b7047b" /* 695, 1147 */, false }, { "cp1148", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x20ac, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1148", "0x02b7047c" /* 695, 1148 */, false }, { "cp1149", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00de, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x00c6, 0x0024, 0x002a, 0x0029, 0x003b, 0x00d6, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00f0, 0x003a, 0x0023, 0x00d0, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x0060, 0x00fd, 0x007b, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x007d, 0x00b8, 0x005d, 0x20ac, 0x00b5, 0x00f6, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x0040, 0x00dd, 0x005b, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x005c, 0x00d7, 0x00fe, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x007e, 0x00f2, 0x00f3, 0x00f5, 0x00e6, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x00b4, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x005e, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "1149", "0x02b7047d" /* 695, 1149 */, false }, { "cp1160", { 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x005b, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x0e48, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x005d, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x005e, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0e3f, 0x0e4e, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0e4f, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e5a, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e5b, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0e49, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0e3a, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x005c, 0x0e4a, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4b, 0x20ac }, "1160", "0x05730488" /* 1395, 1160 */, false }, #if defined(X3270_DBCS) /*[*/ { "cp1388", { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a3, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x00a5, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007e, 0x00af, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005e, 0x0000, 0x005c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005b, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, "1388", "0x04960344" /* 1174, 836 */, true }, #endif /*]*/ { "apl", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005b, 0x005d, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "37", "37", false }, { "bracket", { 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x005b, 0x00de, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00dd, 0x00a8, 0x00af, 0x005d, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da }, "37+", "37", false }, { NULL } }; /* Code page aliases. */ typedef struct { char *alias; char *canon; } cpalias_t; cpalias_t cpaliases[] = { { "belgian", "cp500" }, { "belgian-euro", "cp1148" }, { "brazilian", "cp275" }, #if defined(X3270_DBCS) /*[*/ { "chinese-gb18030","cp1388" }, { "cp1027", "cp939" }, /* historical error */ { "cp290", "cp930" }, /* historical error */ #endif /*]*/ { "cp37", "cp037" }, #if defined(X3270_DBCS) /*[*/ { "cp836", "cp935" }, /* historical error */ #endif /*]*/ { "finnish", "cp278" }, { "finnish-euro", "cp1143" }, { "french", "cp297" }, { "french-euro", "cp1147" }, { "german", "cp273" }, { "german-euro", "cp1141" }, { "greek", "cp875" }, { "hebrew", "cp424" }, { "hebrew-old", "cp803" }, { "icelandic", "cp871" }, { "icelandic-euro", "cp1149" }, { "italian", "cp280" }, { "italian-euro", "cp1144" }, #if defined(X3270_DBCS) /*[*/ { "japanese-1027", "cp939" }, /* historical error */ { "japanese-290", "cp930" }, /* historical error */ { "japanese-kana", "cp930" }, { "japanese-latin", "cp939" }, #endif /*]*/ { "norwegian", "cp277" }, { "norwegian-euro", "cp1142" }, { "oldibm", "bracket" }, { "bracket437", "bracket" }, { "polish", "cp870" }, { "russian", "cp880" }, #if defined(X3270_DBCS) /*[*/ { "simplified-chinese","cp935" }, #endif /*]*/ { "slovenian", "cp870" }, { "spanish", "cp284" }, { "spanish-euro", "cp1145" }, { "swedish", "cp278" }, { "swedish-euro", "cp1143" }, { "thai", "cp1160" }, #if defined(X3270_DBCS) /*[*/ { "traditional-chinese", "cp937" }, #endif /*]*/ { "turkish", "cp1026" }, { "uk", "cp285" }, { "uk-euro", "cp1146" }, { DEFAULT_CSNAME, "cp037" }, { "us-euro", "cp1140" }, { "us-intl", "cp037" }, { NULL, NULL } }; static uni_t *cur_uni = NULL; void charset_list(void) { int i; int j; char *sep = ""; printf("SBCS host code pages (with aliases):\n"); for (i = 0; uni[i].name != NULL; i++) { bool any = false; char *asep = " ("; if (!dbcs_allowed && uni[i].is_dbcs) { continue; } printf("%s%s", sep, uni[i].name); for (j = 0; cpaliases[j].alias != NULL; j++) { if (!strcmp(cpaliases[j].canon, uni[i].name)) { printf("%s%s", asep, cpaliases[j].alias); asep = ", "; any = true; } } if (any) { printf(")"); } sep = ", "; } printf("\n"); if (dbcs_allowed) { charset_list_dbcs(); } } /* * Translate a single EBCDIC character in an arbitrary character set to * Unicode. Note that CS_DBCS is never used -- use CS_BASE and pass an * EBCDIC character > 0xff. * * Returns 0 for no translation. */ ucs4_t ebcdic_to_unicode(ebc_t c, unsigned char cs, unsigned flags) { int iuc; ucs4_t uc; #if 0 /* I'm not sure why this was put in, but it breaks display of DUP and FM. Hopefully I'll figure out why it was put in in the first place and I can put it back under the right conditions. */ /* Control characters become blanks. */ if (c <= 0x41 || c == 0xff) uc = 0; #endif /* * We do not pay attention to BLANK_UNDEF -- we always return 0 * for undefined characters. */ flags &= ~EUO_BLANK_UNDEF; /* Dispatch on the character set. */ if ((cs & CS_GE) || ((cs & CS_MASK) == CS_APL)) { iuc = apl_to_unicode(c, flags); if (iuc != -1) uc = iuc; else uc = 0; } else if (cs == CS_LINEDRAW) { iuc = linedraw_to_unicode(c /* XXX: flags */); if (iuc != -1) uc = iuc; else uc = 0; } else if (cs != CS_BASE) uc = 0; else uc = ebcdic_base_to_unicode(c, flags); return uc; } /* * Translate a single EBCDIC character in the base or DBCS character sets to * Unicode. * * EBCDIC 'FM' and 'DUP' characters are treated specially. If EUO_UPRIV * is set, they are returned as U+f8fe and U+feff (private-use) respectively * so they can be displayed with overscores in the special 3270 font; * otherwise they are returned as '*' and ';'. * EBCDIC 'EO' and 'SUB' are special-cased to U+25cf and U+25a0, respectively. * * If EUO_BLANK_UNDEF is set, other undisplayable characters are returned as * spaces; otherwise they are returned as 0. */ ucs4_t ebcdic_base_to_unicode(ebc_t c, unsigned flags) { if (c & 0xff00) { return ebcdic_dbcs_to_unicode(c, flags); } if (c == 0x40) { return 0x0020; } if (c >= UT_OFFSET && c < 0xff) { ebc_t uc = cur_uni->code[c - UT_OFFSET]; return uc? uc: ((flags & EUO_BLANK_UNDEF)? ' ': 0); } else switch (c) { case EBC_fm: return (flags & EUO_UPRIV)? UPRIV_fm: ';'; case EBC_dup: return (flags & EUO_UPRIV)? UPRIV_dup: '*'; case EBC_eo: if (flags & EUO_ASCII_BOX) { return (flags & EUO_BLANK_UNDEF)? ' ': 0; } return (flags & EUO_UPRIV)? UPRIV_eo: 0x25cf; /* solid circle */ case EBC_sub: if (flags & EUO_ASCII_BOX) { return (flags & EUO_BLANK_UNDEF)? ' ': 0; } return (flags & EUO_UPRIV)? UPRIV_sub: 0x25a0; /* solid block */ default: if (flags & EUO_BLANK_UNDEF) { return ' '; } else { return 0; } } } /* * Map a UCS-4 character to an EBCDIC character. * Returns 0 for failure, nonzero for success. */ ebc_t unicode_to_ebcdic(ucs4_t u) { int i; ebc_t d; if (!u) return 0; if (u == 0x0020) return 0x40; for (i = 0; i < UT_SIZE; i++) { if (cur_uni->code[i] == u) { return UT_OFFSET + i; } } /* See if it's DBCS. */ d = unicode_to_ebcdic_dbcs(u); if (d) return d; return 0; } /* * Map a UCS-4 character to an EBCDIC character, possibly including APL (GE) * characters. * Returns 0 for failure, nonzero for success. */ ebc_t unicode_to_ebcdic_ge(ucs4_t u, bool *ge) { ebc_t e; *ge = false; e = unicode_to_ebcdic(u); if (e) return e; /* Handle GEs. Yes, this is slow, but I'm lazy. */ for (e = 0x70; e <= 0xfe; e++) { if ((ucs4_t)apl_to_unicode(e, EUO_NONE) == u) { *ge = true; return e; } } return 0; } /* * Set the SBCS EBCDIC-to-Unicode translation table. * Returns true for success, false for failure. */ bool set_uni(const char *csname, int local_cp _is_unused, const char **host_codepage, const char **cgcsgid, const char **realnamep, bool *is_dbcs) { int i; const char *realname; bool rc = false; bool cannot_fail = false; #if defined(_WIN32) /*[*/ u_local_cp = local_cp; #endif /*]*/ if (is_dbcs != NULL) { *is_dbcs = false; } /* * If the csname is NULL, this is a fallback to the default * and the iconv lookup cannot fail. */ if (csname == NULL) { csname = DEFAULT_CSNAME; cannot_fail = true; } realname = csname; /* Search for an alias. */ for (i = 0; cpaliases[i].alias != NULL; i++) { if (!strcasecmp(csname, cpaliases[i].alias)) { realname = cpaliases[i].canon; break; } } /* Search for a match. */ for (i = 0; uni[i].name != NULL; i++) { if (!dbcs_allowed && uni[i].is_dbcs) { continue; } if (!strcasecmp(realname, uni[i].name)) { cur_uni = &uni[i]; *host_codepage = uni[i].host_codepage; *cgcsgid = uni[i].cgcsgid; if (realnamep != NULL) { *realnamep = realname; } if (is_dbcs != NULL && uni[i].is_dbcs) { *is_dbcs = true; } rc = true; break; } } if (cannot_fail && !rc) { Error("Cannot find default charset definition"); } #if defined(USE_ICONV) /*[*/ /* * wchar_t's are not Unicode, so getting to/from Unicode is only half * the battle. We need to use iconv() to get between Unicode to the * local multi-byte representation. We'll explicitly use UTF-8, which * appears to be the most broadly-supported translation. */ if (rc) { if (!is_utf8) { /* * If iconv doesn't support the locale's codeset, then * this box is hosed. */ i_u2mb = iconv_open(locale_codeset, "UTF-8"); if (i_u2mb == (iconv_t)(-1)) { rc = false; } else { i_mb2u = iconv_open("UTF-8", locale_codeset); if (i_mb2u == (iconv_t)(-1)) { iconv_close(i_u2mb); rc = false; } } } if (!rc && cannot_fail) { /* Try again with plain-old ASCII. */ xs_warning("Cannot find iconv translation from locale codeset " "'%s' to UTF-8, using ASCII", locale_codeset); i_u2mb = iconv_open("ASCII", "UTF-8"); if (i_u2mb == (iconv_t)-1) { Error("No iconv UTF-8 to ASCII translation"); } i_mb2u = iconv_open("UTF-8", "ASCII"); if (i_mb2u == (iconv_t)-1) { Error("No iconv ASCII to UTF-8 translation"); } rc = true; } } #endif /*]*/ return rc; } /* * Translate an x3270 font line-drawing character (the first two rows of a * standard X11 fixed-width font) to Unicode. * * Returns -1 if there is no translation. */ int linedraw_to_unicode(ebc_t c) { static ebc_t ld2uc[32] = { /* 00 */ 0x2588, 0x25c6, 0x2592, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b0, /* 08 */ 0x00b1, 0x0000, 0x0000, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, /* 10 */ 0x002d, 0x002d, 0x2500, 0x002d, 0x005f, 0x251c, 0x2524, 0x2534, /* 18 */ 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x2022 }; if (c < 32 && ld2uc[c] != 0x0000) return ld2uc[c]; else return -1; } int apl_to_unicode(ebc_t c, unsigned flags) { static ebc_t apl2uc[256] = { /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 40 */ 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 70 */ 0x25c7, 0x2227, 0x00a8, 0x233b, 0x2378, 0x2377, 0x22a2, 0x22a3, /* 78 */ 0x2228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 80 */ 0x007e, 0x0000, 0x0000, 0x23b8, 0x23b9, 0x2502, 0x0000, 0x0000, /* 88 */ 0x0000, 0x0000, 0x2191, 0x2193, 0x2264, 0x2308, 0x230a, 0x2192, /* 90 */ 0x2395, 0x258c, 0x2590, 0x2580, 0x2584, 0x25a0, 0x0000, 0x0000, /* 98 */ 0x0000, 0x0000, 0x2283, 0x2282, 0x00a4, 0x25cb, 0x00b1, 0x2190, /* a0 */ 0x00af, 0x00b0, 0x2500, 0x2022, 0x0000, 0x0000, 0x0000, 0x0000, /* a8 */ 0x0000, 0x0000, 0x2229, 0x222a, 0x22a5, 0x005b, 0x2265, 0x2218, /* b0 */ 0x03b1, 0x03b5, 0x03b9, 0x03c1, 0x03c9, 0x0000, 0x00d7, 0x005c, /* b8 */ 0x00f7, 0x0000, 0x2207, 0x2206, 0x22a4, 0x005d, 0x2260, 0x2502, /* c0 */ 0x007b, 0x207c, 0x002b, 0x220e, 0x2514, 0x250c, 0x251c, 0x2534, /* c8 */ 0x00a7, 0x0000, 0x2372, 0x2371, 0x2337, 0x233d, 0x2342, 0x2349, /* d0 */ 0x007d, 0x207e, 0x002d, 0x253c, 0x2518, 0x2510, 0x2524, 0x252c, /* d8 */ 0x00b6, 0x0000, 0x2336, 0x0021, 0x2352, 0x234b, 0x235e, 0x235d, /* e0 */ 0x2261, 0x2081, 0x0282, 0x0283, 0x2364, 0x2365, 0x236a, 0x20ac, /* e8 */ 0x0000, 0x0000, 0x233f, 0x2340, 0x2235, 0x2296, 0x2339, 0x2355, /* f0 */ 0x2070, 0x00b9, 0x00b2, 0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, /* f8 */ 0x2078, 0x2079, 0x0000, 0x236b, 0x2359, 0x235f, 0x234e, 0x0000 }; static ebc_t apla2uc[256] = { /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 40 */ 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 70 */ 0x0000, 0x0000, 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 80 */ 0x007e, 0x0000, 0x0000, 0x0000, 0x0000, 0x007c, 0x0000, 0x0000, /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x00b1, 0x0000, /* a0 */ 0x00af, 0x00b0, 0x002d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005b, 0x0000, 0x0000, /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d7, 0x005c, /* b8 */ 0x00f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x005d, 0x0000, 0x007c, /* c0 */ 0x007b, 0x0000, 0x002b, 0x0000, 0x002b, 0x002b, 0x002b, 0x002b, /* c8 */ 0x00a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* d0 */ 0x007d, 0x0000, 0x002d, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, /* d8 */ 0x00b6, 0x0000, 0x0000, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, /* e0 */ 0x0000, 0x0000, 0x0282, 0x0283, 0x0000, 0x0000, 0x0000, 0x0000, /* e8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* f0 */ 0x0000, 0x00b9, 0x00b2, 0x00b3, 0x0000, 0x0000, 0x0000, 0x0000, /* f8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; if (flags & EUO_ASCII_BOX) { if (c < 256 && apla2uc[c] != 0x0000) { #if defined(_WIN32) /*[*/ /* Windows DBCS fonts make U+0080..U+00ff wide, too. */ if (apla2uc[c] > 0x7f) { goto fail; } #endif /*]*/ return apla2uc[c]; } else { goto fail; } } if (c < 256 && apl2uc[c] != 0x0000) { return apl2uc[c]; } else { goto fail; } fail: if (flags & EUO_APL_CIRCLED) { static char undera[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00 }; char *x = strchr(undera, c); if (x != NULL) { return 0x24b6 + (int)(x - undera); } } return -1; } /* * Translate an EBCDIC character to the current locale's multi-byte * representation. * * Returns the number of bytes in the multi-byte representation, including * the terminating NULL. mb[] should be big enough to include the NULL * in the result. * * Also returns in 'ucp' the UCS-4 Unicode value of the EBCDIC character. * * Note that 'ebc' is an ebc_t (uint16_t), not an unsigned char. This is * so that DBCS values can be passed in as 16 bits (with the first byte * in the high-order bits). There is no ambiguity because all valid EBCDIC * DBCS characters have a nonzero first byte. * * Returns 0 if EUO_BLANK_UNDEF is clear and there is no printable EBCDIC * translation for 'ebc'. * * Returns '?' in mb[] if there is no local multi-byte representation of * the EBCDIC character. */ size_t ebcdic_to_multibyte_x(ebc_t ebc, unsigned char cs, char mb[], size_t mb_len, unsigned flags, ucs4_t *ucp) { ucs4_t uc; #if defined(_WIN32) /*[*/ int nc; BOOL udc; wchar_t wuc; #elif defined(UNICODE_WCHAR) /*][*/ int nc; #else /*][*/ char u8b[7]; int nu8; ici_t inbuf; char *outbuf; size_t inbytesleft, outbytesleft; size_t nc; #endif /*]*/ /* Translate from EBCDIC to Unicode. */ uc = ebcdic_to_unicode(ebc, cs, flags); if (ucp != NULL) *ucp = uc; if (uc == 0) { if (flags & EUO_BLANK_UNDEF) { mb[0] = ' '; mb[1] = '\0'; return 2; } else { return 0; } } /* Translate from Unicode to local multibyte. */ #if defined(_WIN32) /*[*/ /* * wchar_t's are Unicode. */ wuc = uc; nc = WideCharToMultiByte(u_local_cp, 0, &wuc, 1, mb, (int)mb_len, (u_local_cp == CP_UTF8)? NULL: "?", (u_local_cp == CP_UTF8)? NULL: &udc); if (nc != 0) { mb[nc++] = '\0'; return nc; } else { mb[0] = '?'; mb[1] = '\0'; return 2; } #elif defined(UNICODE_WCHAR) /*][*/ /* * wchar_t's are Unicode. * If 'is_utf8' is set, use unicode_to_utf8(). This allows us to set * 'is_utf8' directly, ignoring the locale, for Tcl. * Otherwise, use wctomb(). */ if (is_utf8) { nc = unicode_to_utf8(uc, mb); if (nc < 0) return 0; mb[nc++] = '\0'; return nc; } nc = wctomb(mb, uc); if (nc > 0) { /* Return to the initial shift state and null-terminate. */ nc += wctomb(mb + nc, 0); return nc; } else { mb[0] = '?'; mb[1] = '\0'; return 2; } #else /*][*/ /* * Use iconv. */ /* Translate the wchar_t we got from UCS-4 to UTF-8. */ nu8 = unicode_to_utf8(uc, u8b); if (nu8 < 0) return 0; /* Local multi-byte might be UTF-8, in which case, we're done. */ if (is_utf8) { memcpy(mb, u8b, nu8); mb[nu8++] = '\0'; return nu8; } /* Let iconv translate from UTF-8 to local multi-byte. */ inbuf = u8b; inbytesleft = nu8; outbuf = mb; outbytesleft = mb_len; nc = iconv(i_u2mb, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (nc == (size_t)-1 || inbytesleft == (unsigned)nu8) { mb[0] = '?'; mb[1] = '\0'; return 2; } /* Return to the initial shift state. */ nc = iconv(i_u2mb, NULL, NULL, &outbuf, &outbytesleft); if (nc == (size_t)-1) { mb[0] = '?'; mb[1] = '\0'; return 0; } /* Null-terminate the return the length. */ mb[mb_len - outbytesleft--] = '\0'; return mb_len - outbytesleft; #endif /*]*/ } /* Commonest version of ebcdic_to_multibyte_x: * cs is CS_BASE * EUO_BLANK_UNDEF is set * ucp is ignored */ size_t ebcdic_to_multibyte(ebc_t ebc, char mb[], size_t mb_len) { return ebcdic_to_multibyte_x(ebc, CS_BASE, mb, mb_len, EUO_BLANK_UNDEF, NULL); } /* * Convert an EBCDIC string to a multibyte string. * Makes lots of assumptions: standard character set, EUO_BLANK_UNDEF. * Returns the length of the multibyte string. */ size_t ebcdic_to_multibyte_string(unsigned char *ebc, size_t ebc_len, char mb[], size_t mb_len) { size_t nmb = 0; while (ebc_len && mb_len) { size_t xlen; xlen = ebcdic_to_multibyte(*ebc, mb, mb_len); if (xlen) { mb += xlen - 1; mb_len -= (xlen - 1); nmb += xlen - 1; } ebc++; ebc_len--; } return nmb; } /* * Return the maximum buffer length needed to translate 'len' EBCDIC characters * in the current locale. */ int mb_max_len(int len) { #if defined(_WIN32) /*[*/ /* * On Windows, it's 1:1 (we don't do DBCS, and we don't support locales * like UTF-8). * * XXX: On Windows, we *do* do DBCS. Should this change? */ return len + 1; #elif defined(UNICODE_WCHAR) /*][*/ /* Allocate enough space for shift-state transitions. */ return (MB_CUR_MAX * (len * 2)) + 1; #else /*]*/ if (is_utf8) return (len * 6) + 1; else /* * We don't actually know. Guess that MB_CUR_MAX is 16, and compute * as for UNICODE_WCHAR. */ return (16 * (len * 2)) + 1; #endif /*]*/ } /* * Translate a multi-byte character in the current locale to UCS-4. * * Returns a UCS-4 character or 0, indicating an error in translation. * Also returns the number of characters consumed. * * Can also return 0 and ME_SHORT, which is not strictly an error, but rather * an incomplete sequence. */ ucs4_t multibyte_to_unicode(const char *mb, size_t mb_len, int *consumedp, enum me_fail *errorp) { int nw; ucs4_t ucs4; if (is_utf8) { /* Translate from UTF-8 to UCS-4. */ nw = utf8_to_unicode(mb, (int)mb_len, &ucs4); if (nw < 0) { *errorp = ME_INVALID; return 0; } if (nw == 0) { *errorp = ME_SHORT; return 0; } *consumedp = nw; } else { #if defined(_WIN32) /*[*/ wchar_t wc[3]; unsigned i; /* Use MultiByteToWideChar() to get from the ANSI codepage to UTF-16. */ for (i = 1; i <= mb_len; i++) { nw = MultiByteToWideChar(u_local_cp, MB_ERR_INVALID_CHARS, mb, i, wc, 3); if (nw != 0) break; } if (i > mb_len) { *errorp = ME_INVALID; return 0; } *consumedp = i; ucs4 = wc[0]; #elif defined(UNICODE_WCHAR) /*][*/ /* wchar_t's are Unicode. */ wchar_t wc[3]; /* mbtowc() will translate to Unicode. */ nw = mbtowc(wc, mb, mb_len); if (nw == -1) { if (errno == EILSEQ) *errorp = ME_INVALID; else *errorp = ME_SHORT; nw = mbtowc(NULL, NULL, 0); return 0; } /* * Reset the shift state. * XXX: Doing this will ruin the shift state if this function is called * repeatedly to process a string. There should probably be a parameter * passed in to control whether or not to reset the shift state, or * perhaps there should be a function to translate a string. */ *consumedp = nw; nw = mbtowc(NULL, NULL, 0); ucs4 = wc[0]; #else /*][*/ /* wchar_t's have unknown encoding. */ ici_t inbuf; char *outbuf; size_t inbytesleft, outbytesleft; char utf8buf[16]; size_t ibl; /* Translate from local MB to UTF-8 using iconv(). */ for (ibl = 1; ibl <= mb_len; ibl++) { size_t xnw; inbuf = (ici_t)mb; outbuf = utf8buf; inbytesleft = ibl; outbytesleft = sizeof(utf8buf); xnw = iconv(i_mb2u, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (xnw == (size_t)-1) { if (errno == EILSEQ) { *errorp = ME_INVALID; (void) iconv(i_mb2u, NULL, NULL, NULL, NULL); return 0; } else { if (ibl == mb_len) { *errorp = ME_SHORT; (void) iconv(i_mb2u, NULL, NULL, NULL, NULL); return 0; } } } else break; } *consumedp = ibl - inbytesleft; /* Translate from UTF-8 to UCS-4. */ (void) utf8_to_unicode(utf8buf, sizeof(utf8buf) - outbytesleft, &ucs4); #endif /*]*/ } return ucs4; } /* * Convert a multi-byte string to a UCS-4 string. * Does not NULL-terminate the result. * Returns the number of UCS-4 characters stored. */ int multibyte_to_unicode_string(const char *mb, size_t mb_len, ucs4_t *ucs4, size_t u_len) { int consumed; enum me_fail error; int nr = 0; error = ME_NONE; while (u_len && mb_len && (*ucs4++ = multibyte_to_unicode(mb, mb_len, &consumed, &error)) != 0) { u_len--; mb += consumed; mb_len -= consumed; nr++; } if (error != ME_NONE) return -1; else return nr; } /* * Translate a multi-byte character in the current locale to an EBCDIC * character. * * Returns an 8-bit (SBCS) or 16-bit (DBCS) EBCDIC character, or 0, indicating * an error in translation. Also returns the number of characters consumed. */ ebc_t multibyte_to_ebcdic(const char *mb, size_t mb_len, int *consumedp, enum me_fail *errorp) { ucs4_t ucs4; ucs4 = multibyte_to_unicode(mb, mb_len, consumedp, errorp); if (ucs4 == 0) return 0; return unicode_to_ebcdic(ucs4); } /* * Convert a local multi-byte string to an EBCDIC string. * Returns the length of the resulting EBCDIC string, or -1 if there is a * conversion error. */ int multibyte_to_ebcdic_string(char *mb, size_t mb_len, unsigned char *ebc, size_t ebc_len, enum me_fail *errorp) { int ne = 0; bool in_dbcs = false; while (mb_len > 0 && ebc_len > 0) { ebc_t e; int consumed; e = multibyte_to_ebcdic(mb, mb_len, &consumed, errorp); if (e == 0) return -1; if (e & 0xff00) { /* DBCS. */ if (!in_dbcs) { /* Make sure there's room for SO, b1, b2, SI. */ if (ebc_len < 4) return ne; *ebc++ = EBC_so; ebc_len++; ne++; in_dbcs = true; } /* Make sure there's room for b1, b2, SI. */ if (ebc_len < 3) { *ebc++ = EBC_si; ne++; return ne; } *ebc++ = (e >> 8) & 0xff; *ebc++ = e & 0xff; ebc_len -= 2; ne += 2; } else { /* SBCS. */ if (in_dbcs) { *ebc++ = EBC_si; ne++; if (!--ebc_len) return ne; in_dbcs = false; } *ebc++ = e & 0xff; ebc_len--; ne++; } mb += consumed; mb_len -= consumed; } /* * Terminate the DBCS string, if we end inside it. * We're guaranteed to have space for the SI; we checked before adding * the last DBCS character. */ if (in_dbcs) { *ebc++ = EBC_si; ne++; } return ne; } /* * Translate a UCS-4 character to a local multi-byte string. */ int unicode_to_multibyte(ucs4_t ucs4, char *mb, size_t mb_len) { #if defined(_WIN32) /*[*/ wchar_t wuc = ucs4; BOOL udc; int nc; nc = WideCharToMultiByte(u_local_cp, 0, &wuc, 1, mb, (int)mb_len, (u_local_cp == CP_UTF8)? NULL: "?", (u_local_cp == CP_UTF8)? NULL: &udc); if (nc > 0) mb[nc++] = '\0'; return nc; #elif defined(UNICODE_WCHAR) /*][*/ int nc; if (is_utf8) { nc = unicode_to_utf8(ucs4, mb); if (nc < 0) return 0; mb[nc++] = '\0'; return nc; } nc = wctomb(mb, ucs4); if (nc > 0) { /* Return to the initial shift state and null-terminate. */ nc += wctomb(mb + nc, 0); return nc; } else { mb[0] = '?'; mb[1] = '\0'; return 2; } #else /*][*/ int nu8; char u8b[16]; ici_t inbuf; char *outbuf; size_t inbytesleft, outbytesleft; size_t nc; /* Use iconv. */ /* Translate the wchar_t we got from UCS-4 to UTF-8. */ nu8 = unicode_to_utf8(ucs4, u8b); if (nu8 < 0) return 0; /* Local multi-byte might be UTF-8, in which case, we're done. */ if (is_utf8) { memcpy(mb, u8b, nu8); mb[nu8++] = '\0'; return nu8; } /* Let iconv translate from UTF-8 to local multi-byte. */ inbuf = u8b; inbytesleft = nu8; outbuf = mb; outbytesleft = mb_len; nc = iconv(i_u2mb, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (nc == (size_t)-1) { mb[0] = '?'; mb[1] = '\0'; return 2; } /* Return to the initial shift state. */ nc = iconv(i_u2mb, NULL, NULL, &outbuf, &outbytesleft); if (nc == (size_t)-1) { mb[0] = '?'; mb[1] = '\0'; return 0; } /* Null-terminate the return the length. */ mb[mb_len - outbytesleft--] = '\0'; return mb_len - outbytesleft; #endif /*]*/ } /* Returns true if using iconv. */ bool using_iconv(void) { #if defined(USE_ICONV) /*[*/ return true; #else /*][*/ return false; #endif } suite3270-3.6/Common/unicode_dbcs.c0000664000076500007650000711171513221577163015226 0ustar pdmpdm/* * Copyright (c) 2008-2012, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * unicode_dbcs.c * A Windows console-based 3270 Terminal Emulator * DBCS EBCDIC/Unicode translation functions */ #include "globals.h" #include "unicodec.h" #include "unicode_dbcs.h" /* * Note: #undef'ing X3270_DBCS disables the ability to configure a DBCS host * codepage, but it does not disable the internal logic that supports DBCS. * Its purpose is to save space in the executable by removing the translation * tables, not by turning the code into #ifdef spaghetti. */ /* * DBCS EBCDIC-to-Unicode translation tables. */ typedef struct { char *name; const char *codepage; const char *u2ebc[512]; /* Unicode to EBCDIC vectors */ const char *ebc2u[512]; /* EBCDIC to Unicode vectors */ } uni16_t; #if defined(X3270_DBCS) /*[*/ static uni16_t uni16[] = { { "cp930", "0x0172012c" /* 370, 300 */, /* Unicode to EBCDIC DBCS translation table for ibm-300_P110-1997 */ { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x6a\x44\x6a\x44\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xed\x44\x4b\x00\x00\x00\x00\x44\x50\x00\x00\x43\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ NULL, /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x61\x41\x62\x41\x63\x41\x64\x41\x65\x41\x66\x41\x67\x41\x68\x41\x69\x41\x6a\x41\x6b\x41\x6c\x41\x6d\x41\x6e\x41\x6f\x41\x70\x41\x71\x00\x00\x41\x72\x41\x73\x41\x74\x41\x75\x41\x76\x41\x77\x41\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x41\x41\x42\x41\x43\x41\x44\x41\x45\x41\x46\x41\x47\x41\x48\x41\x49\x41\x4a\x41\x4b\x41\x4c\x41\x4d\x41\x4e\x41\x4f\x41\x50\x41\x51\x00\x00\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x41\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\x41\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xc0\x41\xc1\x41\xc2\x41\xc3\x41\xc4\x41\xc5\x41\xc7\x41\xc8\x41\xc9\x41\xca\x41\xcb\x41\xcc\x41\xcd\x41\xce\x41\xcf\x41\xd0\x41\xd1\x41\xd2\x41\xd3\x41\xd4\x41\xd5\x41\xd6\x41\xd7\x41\xd8\x41\xd9\x41\xda\x41\xdb\x41\xdc\x41\xdd\x41\xde\x41\xdf\x41\xe0\x41\x80\x41\x81\x41\x82\x41\x83\x41\x84\x41\x85\x41\x87\x41\x88\x41\x89\x41\x8a\x41\x8b\x41\x8c\x41\x8d\x41\x8e\x41\x8f\x41\x90\x41\x91\x41\x92\x41\x93\x41\x94\x41\x95\x41\x96\x41\x97\x41\x98\x41\x99\x41\x9a\x41\x9b\x41\x9c\x41\x9d\x41\x9e\x41\x9f\x41\xa0\x00\x00\x41\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x5a\x00\x00\x00\x00\x00\x00\x44\x4a\x00\x00\x44\x7c\x00\x00\x44\x61\x44\x71\x00\x00\x00\x00\x44\x62\x44\x72\x00\x00\x00\x00\x43\x77\x43\x78\x00\x00\x00\x00\x00\x00\x44\x7e\x44\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x73\x00\x00\x44\xee\x44\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ NULL, /* 2100 */ "\x00\x00\x00\x00\x00\x00\x44\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xf1\x41\xf2\x41\xf3\x41\xf4\x41\xf5\x41\xf6\x41\xf7\x41\xf8\x41\xf9\x41\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xb1\x41\xb2\x41\xb3\x41\xb4\x41\xb5\x41\xb6\x41\xb7\x41\xb8\x41\xb9\x41\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xf1\x44\xf2\x44\xf0\x44\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x6e\x00\x00\x43\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x43\x70\x00\x00\x43\x4e\x43\x71\x00\x00\x00\x00\x00\x00\x43\x4f\x43\x64\x00\x00\x00\x00\x43\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5f\x00\x00\x00\x00\x43\x61\x44\x4d\x00\x00\x43\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x6c\x43\x6d\x43\x6b\x43\x6a\x43\x62\x43\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x68\x44\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x4c\x43\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x44\x67\x44\x77\x00\x00\x00\x00\x43\x5d\x43\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x43\x68\x43\x69\x00\x00\x00\x00\x43\x66\x43\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ "\x43\x7c\x43\xb7\x43\x7d\x43\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x7e\x00\x00\x00\x00\x43\xb9\x43\x7f\x00\x00\x00\x00\x43\xe1\x43\xb1\x00\x00\x00\x00\x43\xe3\x43\xb0\x00\x00\x00\x00\x43\xe2\x43\xb2\x43\xee\x00\x00\x00\x00\x43\xe9\x00\x00\x00\x00\x43\xe4\x43\xb4\x43\xf0\x00\x00\x00\x00\x43\xeb\x00\x00\x00\x00\x43\xe6\x43\xb3\x00\x00\x00\x00\x43\xea\x43\xef\x00\x00\x00\x00\x43\xe5\x43\xb5\x00\x00\x00\x00\x43\xec\x43\xf1\x00\x00\x00\x00\x43\xe7\x43\xb6\x00\x00\x00\x00\x43\xed\x00\x00\x00\x00\x43\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xea\x44\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe3\x44\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xec\x44\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe8\x44\xe7\x00\x00\x00\x00\x00\x00\x44\xe0\x00\x00\x00\x00\x44\xe4\x44\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe6\x44\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x79\x00\x00\x44\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x76\x00\x00\x00\x00\x43\x75\x00\x00\x43\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ "\x40\x40\x43\x44\x43\x41\x44\x5b\x00\x00\x44\x5d\x44\x5e\x44\x5f\x44\x64\x44\x74\x44\x65\x44\x75\x43\x42\x43\x43\x44\x42\x44\x43\x44\x66\x44\x76\x44\x6c\x44\x7d\x44\x63\x44\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x47\x44\x81\x44\x48\x44\x82\x44\x49\x44\x83\x44\x51\x44\x84\x44\x52\x44\x85\x44\x86\x44\xc0\x44\x87\x44\xc1\x44\x88\x44\xc2\x44\x89\x44\xc3\x44\x8a\x44\xc4\x44\x8c\x44\xc5\x44\x8d\x44\xc6\x44\x8e\x44\xc7\x44\x8f\x44\xc8\x44\x90\x44\xc9\x44\x91\x44\xca\x44\x92\x44\xcb\x44\x56\x44\x93\x44\xcc\x44\x94\x44\xcd\x44\x95\x44\xce\x44\x96\x44\x97\x44\x98\x44\x99\x44\x9a\x44\x9d\x44\xcf\x44\xd5\x44\x9e\x44\xd0\x44\xd6\x44\x9f\x44\xd1\x44\xd7\x44\xa2\x44\xd2\x44\xd8\x44\xa3\x44\xd3\x44\xd9\x44\xa4\x44\xa5", /* 3080 */ "\x44\xa6\x44\xa7\x44\xa8\x44\x53\x44\xa9\x44\x54\x44\xaa\x44\x55\x44\xac\x44\xad\x44\xae\x44\xaf\x44\xba\x44\xbb\x44\x57\x44\xbc\x44\xda\x44\xdb\x44\x46\x44\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xbe\x43\xbf\x44\xdc\x44\xdd\x00\x00\x00\x00\x43\x47\x43\x81\x43\x48\x43\x82\x43\x49\x43\x83\x43\x51\x43\x84\x43\x52\x43\x85\x43\x86\x43\xc0\x43\x87\x43\xc1\x43\x88\x43\xc2\x43\x89\x43\xc3\x43\x8a\x43\xc4\x43\x8c\x43\xc5\x43\x8d\x43\xc6\x43\x8e\x43\xc7\x43\x8f\x43\xc8\x43\x90\x43\xc9\x43\x91\x43\xca\x43\x92\x43\xcb\x43\x56\x43\x93\x43\xcc\x43\x94\x43\xcd\x43\x95\x43\xce\x43\x96\x43\x97\x43\x98\x43\x99\x43\x9a\x43\x9d\x43\xcf\x43\xd5\x43\x9e\x43\xd0\x43\xd6\x43\x9f\x43\xd1\x43\xd7\x43\xa2\x43\xd2\x43\xd8\x43\xa3\x43\xd3\x43\xd9\x43\xa4\x43\xa5\x43\xa6\x43\xa7\x43\xa8\x43\x53\x43\xa9\x43\x54\x43\xaa\x43\x55\x43\xac\x43\xad\x43\xae\x43\xaf\x43\xba\x43\xbb\x43\x57\x43\xbc\x43\xda\x43\xdb\x43\x46\x43\xbd\x43\xd4\x43\x59\x43\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x43\x45\x43\x58\x43\xdc\x43\xdd\x00\x00", /* 3100 */ NULL, /* 3180 */ NULL, /* 3200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ NULL, /* 4080 */ NULL, /* 4100 */ NULL, /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ NULL, /* 4380 */ NULL, /* 4400 */ NULL, /* 4480 */ NULL, /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ NULL, /* 4680 */ NULL, /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ NULL, /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ NULL, /* 4c80 */ NULL, /* 4d00 */ NULL, /* 4d80 */ NULL, /* 4e00 */ "\x45\x41\x4b\xce\x00\x00\x45\x47\x00\x00\x00\x00\x00\x00\x45\x4d\x49\xd3\x45\x43\x45\x5e\x45\x5f\x00\x00\x46\xaf\x47\x89\x00\x00\x56\x42\x4d\xec\x00\x00\x00\x00\x4f\x97\x56\x43\x46\x9b\x57\x75\x4d\x56\x50\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x62\x00\x00\x00\x00\x48\x83\x00\x00\x00\x00\x00\x00\x00\x00\x48\x7c\x00\x00\x56\x44\x00\x00\x56\x45\x00\x00\x00\x00\x45\x5c\x00\x00\x00\x00\x00\x00\x56\x46\x4c\xb8\x00\x00\x00\x00\x00\x00\x56\x47\x00\x00\x46\x7a\x48\xab\x00\x00\x47\x62\x54\xc8\x00\x00\x00\x00\x56\x48\x00\x00\x00\x00\x56\x49\x4b\x9f\x00\x00\x45\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xd8\x00\x00\x55\xa9\x54\xa5\x4f\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd0\x56\x4a\x49\x47\x56\x4b\x4b\xbd\x00\x00\x00\x00\x00\x00\x45\x49\x4e\xb5\x47\x49\x00\x00\x00\x00\x56\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xbf\x00\x00\x4a\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x70\x00\x00", /* 4e80 */ "\x47\xc0\x00\x00\x56\x4d\x00\x00\x00\x00\x56\x4e\x4b\xb1\x00\x00\x47\xc2\x48\x96\x56\x4f\x45\xce\x45\x42\x00\x00\x56\x50\x00\x00\x00\x00\x49\x9d\x4b\x74\x00\x00\x45\x45\x45\x6d\x00\x00\x00\x00\x4b\xe4\x50\xe8\x00\x00\x55\xdc\x48\x67\x00\x00\x56\x52\x51\x67\x56\x53\x4c\xce\x56\x54\x00\x00\x47\x8e\x4f\x7f\x4f\xfa\x00\x00\x4b\xac\x00\x00\x00\x00\x4b\x73\x45\x75\x4e\x52\x49\x9c\x00\x00\x56\x55\x00\x00\x00\x00\x56\x56\x00\x00\x00\x00\x56\x57\x00\x00\x00\x00\x00\x00\x45\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xd9\x47\x76\x56\x5c\x00\x00\x56\x5a\x00\x00\x56\x5b\x50\x85\x00\x00\x00\x00\x45\xe0\x48\x4b\x00\x00\x56\x59\x56\x58\x4b\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x54\x65\x48\xb5\x47\x55\x56\x5e\x47\x5d\x48\xa2\x00\x00\x00\x00\x00\x00\x44\x5c\x56\x5f\x56\x61\x00\x00\x56\x5d\x00\x00\x45\x9a\x49\xc3\x46\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x60\x4d\x71\x00\x00\x4d\xed\x00\x00\x48\x69\x00\x00\x00\x00\x00\x00\x48\xb2\x53\x41\x00\x00\x00\x00\x00\x00\x4a\x55\x56\x62\x00\x00\x00\x00\x00\x00", /* 4f00 */ "\x56\x65\x47\xd2\x00\x00\x56\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x63\x45\xb2\x00\x00\x00\x00\x4d\x99\x4e\x9f\x4a\x83\x50\xf6\x4a\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xbd\x00\x00\x56\x64\x48\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xa6\x56\x68\x00\x00\x00\x00\x00\x00\x49\xc9\x00\x00\x54\x4a\x00\x00\x46\xf4\x56\x6a\x50\x8a\x00\x00\x4b\xbc\x54\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xdf\x00\x00\x00\x00\x4e\xfe\x56\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xc8\x48\xa4\x46\xe0\x45\x76\x4c\xe6\x00\x00\x46\x96\x00\x00\x47\x70\x56\x6e\x56\x6b\x00\x00\x49\xc1\x56\x67\x56\x6f\x45\x94\x56\x69\x56\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7c\x56\x7a\x00\x00\x00\x00\x48\x76\x00\x00\x4b\x94\x51\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x56\x77\x54\x62\x00\x00\x00\x00\x48\xb6", /* 4f80 */ "\x00\x00\x00\x00\x00\x00\x4f\x98\x00\x00\x00\x00\x56\x7d\x00\x00\x56\x72\x00\x00\x56\x71\x4a\x46\x00\x00\x4f\xc2\x00\x00\x56\x73\x00\x00\x4f\x8d\x56\x70\x00\x00\x56\x7b\x00\x00\x56\x7e\x00\x00\x56\x76\x00\x00\x56\x74\x48\xbc\x00\x00\x4a\x9e\x00\x00\x00\x00\x52\xec\x47\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x78\x00\x00\x56\x75\x53\xb9\x53\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x8c\x55\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x4c\x00\x00\x00\x00\x48\x51\x4a\x6a\x54\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x52\x94\x46\x60\x00\x00\x00\x00\x56\x86\x56\x80\x00\x00\x56\x85\x56\x83\x00\x00\x00\x00\x56\x7f\x00\x00\x00\x00\x4e\x97\x56\x81\x00\x00\x56\x84\x56\x82\x00\x00\x45\xaa\x00\x00\x53\xc4\x52\xec\x45\xa5\x00\x00\x4b\x4a\x56\x87\x56\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xde\x56\x96\x00\x00\x00\x00\x00\x00\x4c\xe1\x00\x00\x4d\xb1\x51\xf8\x00\x00\x50\xf9\x00\x00\x4e\x67\x00\x00\x00\x00\x00\x00\x56\x95\x56\x94", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x8f\x56\x99\x00\x00\x00\x00\x45\xd6\x00\x00\x49\xfa\x00\x00\x4a\xc4\x00\x00\x56\xa1\x00\x00\x56\x97\x4b\x6a\x00\x00\x56\x8c\x00\x00\x53\x43\x00\x00\x00\x00\x4c\xae\x56\x89\x00\x00\x00\x00\x00\x00\x56\x98\x4a\xd0\x00\x00\x56\x90\x56\x91\x55\x69\x48\x7d\x56\x8e\x52\xf1\x00\x00\x56\x8b\x56\x92\x56\x8d\x4d\x51\x56\x93\x4f\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x63\x00\x00\x00\x00\x52\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x8a\x00\x00\x56\xa4\x56\x9a\x00\x00\x00\x00\x56\xa2\x56\x9b\x56\x9e\x4d\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x49\x56\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x56\x9c\x56\xa0\x00\x00\x00\x00\x00\x00\x56\x9f\x00\x00\x4e\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xa5\x00\x00\x00\x00\x00\x00\x56\xa3\x00\x00\x54\xd2\x00\x00\x49\x43\x4f\x95\x50\xc3\x00\x00\x56\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x50\x59\x00\x00\x00\x00", /* 5080 */ "\x56\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x56\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xe7\x00\x00\x00\x00\x00\x00\x4f\xc3\x00\x00\x00\x00\x56\xa8\x00\x00\x00\x00\x00\x00\x50\x9c\x46\xac\x56\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x43\x54\xda\x00\x00\x00\x00\x00\x00\x00\x00\x56\xad\x56\xb0\x56\xab\x4b\x58\x00\x00\x4c\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x43\x00\x00\x00\x00\x00\x00\x56\xb1\x00\x00\x00\x00\x4f\xc9\x00\x00\x00\x00\x00\x00\x56\xae\x56\xaf\x00\x00\x00\x00\x48\xec\x00\x00\x4b\xba\x00\x00\x55\xad\x00\x00\x00\x00\x00\x00\x4a\xbb\x52\xd4\x00\x00\x56\xb5\x00\x00\x4d\x82\x00\x00\x00\x00\x00\x00\x56\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x56\xb7\x00\x00\x56\xb4\x00\x00\x4e\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xb6\x56\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xb2\x56\xba\x00\x00\x00\x00\x00\x00\x56\xb9\x00\x00\x55\x78\x00\x00\x00\x00\x00\x00\x00\x00", /* 5100 */ "\x49\xca\x56\xbc\x56\xbd\x00\x00\x45\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x56\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x6f\x00\x00\x56\xc0\x56\xbf\x56\xc1\x00\x00\x52\x90\x00\x00\x56\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xa2\x00\x00\x56\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x56\xc4\x00\x00\x00\x00\x56\xc3\x56\xc6\x56\xc5\x00\x00\x00\x00\x56\xc7\x56\xc8\x4c\x91\x00\x00\x46\x95\x4b\xe8\x48\xc9\x4d\xf3\x55\x5a\x47\xa2\x45\x9e\x56\xc9\x47\x9e\x56\xca\x4b\x56\x50\x50\x00\x00\x46\x9f\x00\x00\x56\xcb\x00\x00\x56\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x4b\x00\x00\x51\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xcd\x00\x00\x56\xce\x46\x65\x00\x00\x00\x00\x46\xb1\x56\xcf\x56\xd0\x45\x48\x46\xbb\x45\x46\x56\xd1\x00\x00\x00\x00\x47\xb3\x00\x00\x00\x00\x00\x00\x46\x49\x4f\x67\x47\xaf\x47\xc9\x00\x00\x00\x00\x00\x00\x48\xf4\x00\x00\x00\x00\x00\x00", /* 5180 */ "\x56\xd2\x00\x00\x56\xd3\x00\x00\x00\x00\x45\x8e\x46\x45\x00\x00\x00\x00\x56\xd6\x4e\xa1\x00\x00\x56\xd5\x48\xeb\x00\x00\x56\xd7\x61\x9d\x56\xd8\x4f\x8f\x56\xd9\x00\x00\x56\xda\x56\xdb\x52\x7e\x00\x00\x48\xc4\x00\x00\x00\x00\x00\x00\x56\xdc\x00\x00\x00\x00\x4e\x7b\x00\x00\x56\xdf\x00\x00\x56\xdd\x54\x67\x56\xde\x00\x00\x48\x78\x56\xe0\x56\xe1\x56\xe2\x4b\xde\x00\x00\x00\x00\x00\x00\x56\xe6\x56\xe4\x56\xe5\x56\xe3\x50\xc9\x56\xe7\x51\x46\x48\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xe9\x56\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xdc\x56\xea\x4f\x80\x00\x00\x00\x00\x56\xeb\x00\x00\x55\xf9\x53\x44\x4b\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x77\x00\x00\x00\x00\x00\x00\x00\x00\x56\xec\x68\x84\x4e\xd9\x00\x00\x00\x00\x56\xed\x4d\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x48\xe6\x55\x8a\x00\x00\x56\xee\x54\x9e\x00\x00\x56\xef\x56\xf0\x00\x00\x00\x00\x56\xf1\x51\xac\x00\x00\x00\x00\x00\x00\x56\xf2\x51\xec\x00\x00\x50\xcf\x50\xe6\x45\x9b\x00\x00\x00\x00\x4b\xb6\x56\xf3\x00\x00", /* 5200 */ "\x4c\x50\x00\x00\x00\x00\x4f\x44\x56\xf4\x00\x00\x45\xb4\x47\x65\x4b\x9b\x00\x00\x4c\xd7\x56\xf5\x00\x00\x00\x00\x54\xe3\x00\x00\x00\x00\x4c\x52\x00\x00\x00\x00\x56\xf6\x56\xf7\x00\x00\x4b\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x5c\x46\xdd\x00\x00\x56\xf8\x00\x00\x45\xbc\x56\xf9\x00\x00\x00\x00\x00\x00\x56\xfa\x00\x00\x4c\xdd\x00\x00\x00\x00\x56\xfb\x00\x00\x00\x00\x46\xc4\x48\xcf\x4b\x6b\x56\xfc\x4b\xc0\x4b\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x79\x56\xfd\x00\x00\x00\x00\x47\x4d\x00\x00\x00\x00\x4a\x90\x56\xfe\x51\xae\x45\xaf\x00\x00\x57\x41\x00\x00\x00\x00\x00\x00\x00\x00\x57\x43\x00\x00\x51\x99\x00\x00\x00\x00\x00\x00\x00\x00\x49\xc7\x00\x00\x54\x81\x57\x42\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xd3\x47\x66\x54\x81\x00\x00\x00\x00\x00\x00\x57\x48\x57\x45\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x4e\x4d\x85\x57\x44\x47\xd6\x57\x46\x57\x47\x4b\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x4a\x00\x00\x57\x49", /* 5280 */ "\x00\x00\x00\x00\x00\x00\x55\xd6\x00\x00\x00\x00\x00\x00\x49\xf0\x57\x4c\x51\x85\x00\x00\x00\x00\x00\x00\x57\x4b\x00\x00\x00\x00\x00\x00\x57\x4e\x57\x4d\x00\x00\x55\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xf7\x57\x4f\x00\x00\x00\x00\x48\x70\x45\x9f\x00\x00\x00\x00\x4e\x68\x00\x00\x00\x00\x57\x50\x00\x00\x00\x00\x46\x71\x4a\x64\x54\xc6\x57\x51\x57\x52\x00\x00\x5f\xaa\x00\x00\x4d\x92\x00\x00\x00\x00\x48\xa9\x57\x54\x00\x00\x00\x00\x00\x00\x49\x78\x00\x00\x00\x00\x57\x53\x00\x00\x55\x6a\x00\x00\x57\x56\x57\x55\x00\x00\x54\xb1\x00\x00\x4e\xef\x00\x00\x46\x9c\x00\x00\x48\xce\x00\x00\x00\x00\x00\x00\x57\x57\x00\x00\x00\x00\x00\x00\x00\x00\x53\xd6\x00\x00\x00\x00\x45\xe4\x00\x00\x53\x92\x4b\x9a\x46\xed\x00\x00\x57\x58\x00\x00\x45\xb5\x57\x59\x4a\xe1\x57\x5c\x00\x00\x47\xee\x57\x5a\x49\x9f\x00\x00\x57\x5b\x4c\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x7a\x57\x5d\x00\x00\x57\x5e\x00\x00\x00\x00\x57\x5f\x57\x60\x54\x70\x00\x00\x00\x00\x00\x00\x51\xe9\x52\x97", /* 5300 */ "\x57\x61\x4f\x5b\x4e\xcb\x00\x00\x00\x00\x4a\xa8\x57\x62\x57\x63\x57\x64\x00\x00\x00\x00\x00\x00\x00\x00\x57\x66\x00\x00\x57\x68\x57\x67\x00\x00\x00\x00\x00\x00\x00\x00\x57\x69\x45\x90\x45\x5a\x00\x00\x54\x57\x57\x6a\x00\x00\x00\x00\x51\xb7\x00\x00\x00\x00\x4e\x6b\x4d\x4d\x00\x00\x57\x6c\x57\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xed\x00\x00\x00\x00\x00\x00\x00\x00\x57\x6d\x00\x00\x57\x6e\x00\x00\x57\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x57\x70\x4f\xd1\x45\x54\x4a\x87\x00\x00\x00\x00\x00\x00\x50\xf1\x57\x71\x45\x4a\x00\x00\x45\x4c\x00\x00\x57\x72\x57\x73\x4e\x47\x45\xdf\x57\x74\x47\x90\x00\x00\x00\x00\x57\x76\x00\x00\x00\x00\x00\x00\x53\xad\x4a\xf2\x49\x96\x47\xd7\x00\x00\x00\x00\x45\x59\x48\xe3\x00\x00\x45\xf6\x00\x00\x51\xc0\x00\x00\x57\x79\x00\x00\x49\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xdb\x00\x00\x00\x00\x57\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x57\x7b\x4c\x82\x47\x99\x4b\x91\x57\x7c\x4b\x6d\x4a\xa4\x4c\xf5\x00\x00\x57\x7d\x4e\x79\x00\x00\x00\x00\x57\x7e\x00\x00\x00\x00\x00\x00\x53\xe2", /* 5380 */ "\x00\x00\x00\x00\x57\x7f\x00\x00\x53\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x80\x00\x00\x00\x00\x57\x81\x00\x00\x4f\x55\x00\x00\x49\x42\x00\x00\x00\x00\x00\x00\x00\x00\x45\x74\x57\x82\x00\x00\x00\x00\x00\x00\x00\x00\x57\x84\x57\x83\x00\x00\x51\x78\x53\x67\x00\x00\x00\x00\x00\x00\x53\xb7\x57\x85\x00\x00\x57\x86\x00\x00\x57\x87\x4c\x8e\x00\x00\x00\x00\x57\x88\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xd2\x57\x89\x00\x00\x00\x00\x00\x00\x00\x00\x48\xf5\x50\xa5\x48\x5c\x46\xd4\x4b\x71\x47\xf9\x47\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xa5\x00\x00\x46\xa6\x48\x4c\x00\x00\x50\xf5\x00\x00\x55\xb2\x00\x00\x57\x8b\x00\x00\x57\x8c\x00\x00\x51\x94\x53\xf5\x45\x88\x45\xd4\x4c\x8b\x00\x00\x00\x00\x57\x91\x4f\x71\x4e\x41\x4d\xd5\x4f\x86\x57\x92\x57\x90\x47\xc6\x47\x78\x50\x42\x47\xd9\x48\x5a\x00\x00\x00\x00\x4f\x59\x48\xe2\x45\xf0\x00\x00\x57\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x57\x94\x00\x00\x55\xea\x47\xba\x00\x00\x00\x00\x00\x00\x45\xa0\x45\x7e\x53\xd3\x55\xbc\x46\x6d\x45\xf3\x51\xaf\x50\xc6\x4e\xb2\x46\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xcf\x00\x00\x57\x9d\x00\x00\x50\x7a\x53\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x4f\x00\x00\x00\x00\x57\x9c\x00\x00\x49\xcb\x57\x97\x57\x98\x57\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x9b\x00\x00\x4b\x98\x49\xc4\x00\x00\x53\xe5\x57\x99\x57\x95\x47\xf6\x00\x00\x57\x96\x00\x00\x4b\x50\x00\x00\x00\x00\x00\x00\x50\x73\x00\x00\x4f\x56\x4a\xee\x49\x54\x00\x00\x00\x00\x00\x00\x57\x9e\x00\x00\x00\x00\x50\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xa1\x00\x00\x54\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xa5\x57\xa3\x00\x00\x47\x7f\x00\x00\x57\xa0\x57\xaa\x57\xa4\x00\x00\x00\x00\x00\x00\x57\xa7\x4a\xf6\x49\xb0\x00\x00\x00\x00", /* 5480 */ "\x57\xa8\x00\x00\x00\x00\x00\x00\x57\xab\x00\x00\x57\xad\x00\x00\x00\x00\x00\x00\x57\xae\x4f\x50\x45\x7a\x00\x00\x57\xa1\x57\x9f\x57\xac\x00\x00\x57\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xb2\x00\x00\x57\xbc\x57\xb4\x00\x00\x00\x00\x57\xb9\x57\xbd\x00\x00\x57\xba\x57\xb5\x00\x00\x00\x00\x57\xb1\x00\x00\x00\x00\x4c\xde\x53\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x57\xb3\x00\x00\x00\x00\x00\x00\x57\xb0\x52\xb1\x57\xbe\x00\x00\x4e\xf9\x45\xd0\x57\xbb\x00\x00\x57\xb6\x00\x00\x00\x00\x57\xaf\x57\xb8\x4a\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xcb\x57\xc7\x00\x00\x00\x00\x57\xbf\x57\xc1\x00\x00\x55\x68\x55\xf0\x00\x00\x00\x00\x00\x00\x57\xc6\x57\xc5\x00\x00\x00\x00\x00\x00\x47\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x7c\x00\x00\x00\x00\x57\xc4\x00\x00\x57\xc0", /* 5500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xdb\x00\x00\x51\xb8\x4f\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc2\x4b\xab\x00\x00\x00\x00\x00\x00\x57\xc3\x00\x00\x54\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xcc\x4b\xe0\x00\x00\x4d\x43\x00\x00\x57\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x57\xd1\x57\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x54\x78\x00\x00\x57\xc9\x00\x00\x00\x00\x00\x00\x53\x83\x57\xce\x46\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xcb\x00\x00\x00\x00\x46\xe4\x00\x00\x00\x00\x00\x00\x47\xe4\x00\x00\x00\x00\x57\xcf\x57\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x57\xcd\x57\xd3\x54\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x57\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xd8\x57\xdd\x00\x00\x57\xd9\x00\x00", /* 5580 */ "\x57\xd5\x00\x00\x00\x00\x57\xdf\x46\xb3\x00\x00\x57\xde\x57\xe1\x00\x00\x52\x53\x57\xd6\x55\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xda\x57\xd4\x52\xb5\x00\x00\x45\xd1\x54\x75\x57\xdb\x57\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xd3\x57\xe2\x57\xe0\x51\x68\x4d\x6d\x4c\x5f\x00\x00\x57\xdc\x00\x00\x4e\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xe5\x57\xe3\x00\x00\x58\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xa2\x00\x00\x57\xe6\x00\x00\x00\x00\x57\xe4\x00\x00\x00\x00\x00\x00\x4b\x5e\x57\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xeb\x00\x00\x57\xe9\x00\x00\x00\x00\x00\x00\x57\xee\x57\xed\x00\x00", /* 5600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x63\x00\x00\x00\x00\x47\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xea\x00\x00\x57\xec\x54\xec\x50\xf3\x00\x00\x00\x00\x57\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xf8\x00\x00\x50\xca\x57\xf3\x00\x00\x54\x7f\x00\x00\x57\xf2\x00\x00\x57\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x62\x00\x00\x57\xf0\x00\x00\x57\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xf6\x00\x00\x00\x00\x00\x00\x45\xfc\x00\x00\x57\xfa\x57\xf5\x57\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x6d\x00\x00\x00\x00\x00\x00\x55\xf1\x00\x00\x55\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5680 */ "\x57\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xf7\x55\xd8\x00\x00\x00\x00\x58\x41\x00\x00\x00\x00\x00\x00\x00\x00\x57\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x57\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x54\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x42\x00\x00\x51\x90\x00\x00\x00\x00\x58\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x46\x00\x00\x58\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x49\x00\x00\x00\x00\x00\x00\x58\x4c\x58\x4a\x58\x48\x58\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x58\x47\x00\x00\x51\x90\x00\x00\x00\x00\x00\x00\x58\x4d\x00\x00\x00\x00\x58\x4f\x00\x00\x58\x4e\x00\x00\x00\x00\x00\x00\x58\x50\x56\xd4\x00\x00\x50\x65\x45\x44\x00\x00\x00\x00\x46\xa9\x00\x00\x4a\x49\x00\x00\x00\x00\x47\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x51\x00\x00\x4b\x44\x00\x00\x4a\xfa\x47\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x52\x4a\x94\x00\x00\x00\x00\x45\x8f\x00\x00\x58\x53", /* 5700 */ "\x52\x66\x00\x00\x00\x00\x53\xcf\x58\x54\x00\x00\x00\x00\x00\x00\x58\x56\x58\x55\x00\x00\x51\xbd\x00\x00\x58\x57\x00\x00\x4f\x49\x00\x00\x00\x00\x47\xe1\x54\xe7\x00\x00\x00\x00\x58\x5a\x00\x00\x58\x59\x00\x00\x00\x00\x00\x00\x58\x5b\x00\x00\x00\x00\x46\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x5c\x47\x82\x47\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x49\xe6\x00\x00\x00\x00\x45\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd1\x58\x5d\x00\x00\x00\x00\x58\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x58\x61\x00\x00\x45\xec\x00\x00\x00\x00\x00\x00\x00\x00\x49\xae\x00\x00\x00\x00\x4c\x55\x00\x00\x00\x00\x00\x00\x58\x5e\x58\x62\x4e\x8d\x4e\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x65\x00\x00\x00\x00\x53\xa6\x58\x63\x51\xc4\x00\x00\x00\x00\x53\x98\x49\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x66", /* 5780 */ "\x00\x00\x00\x00\x4b\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x64\x58\x67\x00\x00\x46\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x69\x00\x00\x54\x66\x47\xce\x58\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x6d\x00\x00\x58\x6c\x00\x00\x00\x00\x00\x00\x53\xcd\x00\x00\x00\x00\x58\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x71\x00\x00\x00\x00\x58\x6e\x00\x00\x00\x00\x58\x6f\x58\x73\x58\x70\x00\x00\x00\x00\x4e\xac\x00\x00\x00\x00\x45\xdb\x00\x00\x00\x00\x00\x00\x58\x74\x58\x75\x58\x72\x00\x00\x58\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xf4\x00\x00\x00\x00\x48\xe9\x51\x7e\x00\x00\x00\x00\x58\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x48\x00\x00\x00\x00\x4d\x57\x00\x00\x4d\xac\x46\xf1\x00\x00\x46\xa3\x00\x00\x00\x00\x00\x00", /* 5800 */ "\x46\x9d\x00\x00\x49\x7f\x00\x00\x00\x00\x4a\xe7\x53\x71\x00\x00\x00\x00\x00\x00\x58\x78\x58\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xb0\x00\x00\x00\x00\x00\x00\x58\x7b\x00\x00\x00\x00\x00\x00\x53\xa7\x00\x00\x00\x00\x00\x00\x58\x7c\x00\x00\x00\x00\x4b\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xac\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x53\x50\xa4\x49\xb8\x00\x00\x00\x00\x45\xd9\x54\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x7c\x00\x00\x00\x00\x58\x80\x00\x00\x00\x00\x53\x9f\x4b\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x53\x58\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xc6\x58\x81\x00\x00\x4c\xcb\x00\x00\x00\x00\x48\x6a\x52\xf8\x4f\x6f\x46\x57\x00\x00\x00\x00\x00\x00\x53\xc1\x00\x00\x00\x00\x4f\x5e\x58\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x43\x00\x00\x4f\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x58\x83\x00\x00\x58\x86\x00\x00\x00\x00\x4d\x89\x00\x00\x00\x00\x00\x00\x58\x84\x00\x00\x00\x00\x00\x00\x00\x00\x52\x79\x00\x00", /* 5880 */ "\x00\x00\x00\x00\x00\x00\x4a\x95\x00\x00\x58\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xbe\x00\x00\x00\x00\x00\x00\x46\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x51\x50\x00\x00\x58\x8a\x58\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xfc\x00\x00\x00\x00\x58\x88\x00\x00\x00\x00\x58\x8b\x00\x00\x00\x00\x00\x00\x58\x8c\x52\x89\x00\x00\x00\x00\x00\x00\x00\x00\x58\x89\x58\x8d\x58\x8e\x55\x52\x00\x00\x00\x00\x54\x88\x00\x00\x00\x00\x4b\x95\x00\x00\x00\x00\x00\x00\x58\x8f\x00\x00\x4e\x8e\x00\x00\x00\x00\x4e\xc8\x00\x00\x51\x96\x00\x00\x00\x00\x00\x00\x00\x00\x58\x91\x00\x00\x58\x90\x00\x00\x55\xb9\x00\x00\x58\x92\x58\x94\x58\x93\x00\x00\x00\x00\x58\x96\x00\x00\x58\x95\x58\x97\x00\x00\x00\x00\x00\x00\x00\x00\x58\x98\x58\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x7d\x51\x4f\x00\x00\x4c\x9f\x58\x9a\x49\x6c\x4e\xb0\x47\x75\x00\x00\x00\x00\x00\x00\x00\x00\x58\x9b\x00\x00\x58\x9c\x50\x77\x58\x9d\x58\x9e\x52\x75\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x58\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x6f\x58\xa0\x58\xa1\x00\x00\x00\x00\x00\x00\x49\x7e\x58\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xc3\x46\x94\x00\x00\x52\xc8\x54\xdd\x45\xfe\x58\xa3\x48\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x8b\x00\x00\x00\x00\x58\xa5\x00\x00\x45\x5b\x00\x00\x46\x8a\x45\xab\x45\x73\x58\xa6\x58\xa7\x47\x92\x00\x00\x00\x00\x49\x41\x58\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x51\x47\x58\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xf2\x00\x00\x00\x00\x4d\x69\x45\xe6\x4d\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x51\x8f\x4c\x53\x58\xac\x4c\x64\x00\x00\x58\xad\x52\x84\x58\xab\x00\x00\x55\x83\x58\xaf\x00\x00\x58\xae\x58\xb0\x00\x00\x58\xb1\x00\x00\x00\x00\x58\xb4\x00\x00\x58\xb3\x58\xb2\x00\x00\x46\xe5\x00\x00\x58\xb5\x4e\xca\x58\xb7\x4e\xbb\x00\x00\x58\xb6\x00\x00\x4e\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x46\x99\x4d\x90\x00\x00\x00\x00\x00\x00\x58\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x46\x9e\x00\x00\x00\x00", /* 5980 */ "\x00\x00\x58\xb9\x4b\xf8\x51\xa2\x55\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x43\x00\x00\x00\x00\x58\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x95\x00\x00\x00\x00\x53\xd1\x00\x00\x00\x00\x4a\x66\x00\x00\x58\xbb\x00\x00\x58\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xbd\x58\xbe\x4d\x9e\x00\x00\x00\x00\x50\xec\x00\x00\x00\x00\x00\x00\x53\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xdc\x58\xc0\x49\xa3\x00\x00\x00\x00\x53\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xc1\x00\x00\x00\x00\x4c\xc1\x00\x00\x49\x90\x00\x00\x00\x00\x00\x00\x00\x00\x54\x9c\x53\xf2\x00\x00\x4f\xf1\x48\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x58\xc3\x58\xc4\x00\x00\x51\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x55\x55\xde\x00\x00\x58\xc2\x00\x00\x55\x8c\x4a\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x79\x00\x00\x00\x00\x00\x00\x00\x00\x52\xb9\x00\x00\x00\x00\x00\x00\x4b\x42", /* 5a00 */ "\x00\x00\x4c\x65\x00\x00\x55\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x54\x00\x00\x58\xc9\x00\x00\x58\xc8\x00\x00\x00\x00\x58\xc6\x52\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x58\xc5\x00\x00\x00\x00\x00\x00\x54\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xce\x58\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x98\x00\x00\x00\x00\x00\x00\x58\xcb\x50\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xcc\x00\x00\x00\x00\x58\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xd0\x00\x00\x00\x00\x00\x00\x49\x6f\x00\x00\x00\x00\x00\x00\x58\xd1\x00\x00\x58\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x54", /* 5a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xd2\x48\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xd3\x58\xd8\x58\xd4\x00\x00\x00\x00\x4e\x89\x58\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xe0\x00\x00\x58\xd6\x4e\xc3\x00\x00\x00\x00\x00\x00\x58\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xdd\x58\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x67\x00\x00\x58\xd9\x00\x00\x00\x00\x58\xdb\x00\x00\x00\x00\x58\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xde\x58\xdf\x00\x00\x00\x00\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x8b\x00\x00\x58\xe1\x58\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xe4\x00\x00\x52\xea\x00\x00\x00\x00\x00\x00\x55\xe8\x00\x00\x58\xe3\x00\x00\x00\x00\x00\x00\x58\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xe6\x00\x00\x58\xe9\x00\x00\x00\x00\x58\xe7\x00\x00\x58\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x64\x58\xea\x00\x00\x00\x00\x4b\xd9\x58\xeb\x58\xec\x48\xf2\x4a\x41\x00\x00\x52\x58\x58\xee\x4f\xf2\x45\xf4\x00\x00\x4f\x83\x00\x00\x00\x00\x00\x00\x4a\xec\x4e\xaf\x58\xef\x45\xbe\x00\x00\x00\x00\x58\xf0\x00\x00\x4c\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x58\xf1\x59\x5b\x00\x00\x58\xf2\x00\x00\x58\xf3\x00\x00\x00\x00\x58\xf4\x00\x00\x58\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5b80 */ "\x58\xf6\x00\x00\x00\x00\x58\xf7\x00\x00\x48\x6f\x00\x00\x46\xd5\x46\xf0\x45\xa8\x00\x00\x52\x4d\x48\xc5\x4c\x75\x00\x00\x46\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x5c\x00\x00\x47\xdd\x49\xa2\x4d\x64\x45\xe7\x50\xab\x4d\x8b\x49\x4d\x00\x00\x45\xed\x00\x00\x00\x00\x4a\xde\x49\x8f\x47\xb8\x4f\x7a\x58\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x92\x00\x00\x4e\xd4\x00\x00\x00\x00\x49\x68\x50\x78\x52\xef\x46\x86\x00\x00\x58\xf9\x48\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x82\x58\xfc\x00\x00\x4f\xe9\x58\xfa\x49\xdf\x4a\x84\x4a\x56\x58\xfb\x00\x00\x58\xfd\x00\x00\x00\x00\x45\xac\x00\x00\x00\x00\x00\x00\x59\x41\x00\x00\x4b\x81\x55\xf4\x52\x44\x00\x00\x00\x00\x00\x00\x59\x42\x00\x00\x00\x00\x47\xf8\x00\x00\x4b\x59\x59\x43\x4b\x93\x00\x00\x52\xb8\x59\x46\x00\x00\x59\x45\x59\x47\x51\xfc\x4f\xa9\x5c\x7e\x49\x87\x00\x00\x59\x48\x59\x44\x00\x00\x4c\x7a\x00\x00\x59\x49\x00\x00\x00\x00\x59\x4a\x00\x00\x55\x56\x59\x4b\x00\x00\x4b\x60\x00\x00\x46\xa0\x00\x00\x00\x00\x00\x00\x46\x56\x46\xb2", /* 5c00 */ "\x00\x00\x4d\x76\x49\xfb\x00\x00\x49\x8a\x59\x4c\x49\x59\x59\x4d\x59\x4e\x51\x89\x4c\xef\x4d\x5f\x00\x00\x59\x4f\x48\xae\x45\x5d\x00\x00\x48\x4a\x00\x00\x59\x50\x00\x00\x00\x00\x53\xc0\x00\x00\x00\x00\x00\x00\x48\x71\x00\x00\x00\x00\x00\x00\x59\x51\x00\x00\x59\x52\x00\x00\x59\x53\x00\x00\x53\xae\x00\x00\x00\x00\x00\x00\x59\x54\x00\x00\x00\x00\x00\x00\x00\x00\x68\x80\x00\x00\x00\x00\x00\x00\x4b\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x55\x51\x5d\x4c\x6b\x49\xce\x4a\x86\x4f\xb9\x45\xc8\x4c\xc6\x48\x8b\x59\x56\x00\x00\x00\x00\x00\x00\x48\x5e\x59\x57\x00\x00\x4d\x94\x00\x00\x4d\xa7\x45\xe9\x00\x00\x55\xba\x59\x58\x54\x43\x59\x5a\x54\xb2\x00\x00\x59\x59\x00\x00\x48\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x43\x00\x00\x00\x00\x47\x6d\x00\x00\x53\xfb\x55\xc0\x55\xc0\x00\x00\x4a\x8e\x4c\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x5c\x00\x00\x59\x5d\x4f\xdd\x00\x00\x45\x65\x00\x00\x00\x00\x00\x00\x00\x00\x59\x5e\x00\x00\x00\x00\x59\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x60\x00\x00\x00\x00\x00\x00\x47\x4a\x52\x5a\x00\x00\x00\x00\x59\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x72\x00\x00\x00\x00\x00\x00\x00\x00\x59\x67\x00\x00\x54\xb9\x45\xbf\x00\x00\x59\x63\x50\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x52\x62\x00\x00\x4d\x46\x00\x00\x00\x00\x59\x65\x59\x66\x47\x48\x00\x00\x59\x68\x59\x64\x59\x6a\x00\x00\x59\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x69\x00\x00\x59\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x96\x51\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x9d\x59\x6d\x59\x72\x00\x00\x00\x00\x59\x71\x00\x00\x4a\xac\x48\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x59\x70\x45\x6f\x00\x00\x00\x00\x00\x00\x59\x6f\x50\x72\x00\x00\x59\x6e\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x7f\x00\x00\x00\x00\x00\x00\x59\x73\x00\x00\x00\x00\x45\x7f\x00\x00\x00\x00\x59\x77\x00\x00\x00\x00\x51\x4d\x59\x74\x50\x74\x54\xf1\x59\x7c\x59\x7b\x59\x7a\x59\x76\x00\x00\x00\x00\x00\x00\x59\x75\x00\x00\x00\x00\x59\x79\x00\x00\x00\x00\x00\x00\x00\x00\x59\x78\x00\x00\x4f\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x83\x59\x7d\x00\x00\x59\x82\x00\x00\x49\x8c\x00\x00\x59\x7e\x59\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x9e\x00\x00\x00\x00\x59\x85\x59\x87\x00\x00\x4e\xd3\x00\x00\x00\x00\x00\x00\x59\x86\x00\x00\x00\x00\x59\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5d80 */ "\x00\x00\x00\x00\x59\x8b\x00\x00\x59\x8a\x00\x00\x00\x00\x59\x89\x00\x00\x00\x00\x00\x00\x47\xd1\x59\x8c\x00\x00\x00\x00\x00\x00\x59\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x59\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x90\x00\x00\x59\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x92\x59\x93\x59\x95\x4c\xe8\x00\x00\x59\x94\x4f\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x96\x00\x00\x00\x00\x49\xcf\x52\x81\x00\x00\x00\x00\x59\x97\x00\x00\x59\x99\x59\x98\x00\x00\x00\x00\x51\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x59\x9a\x00\x00\x45\x67\x47\x41\x00\x00\x00\x00\x4d\x47\x00\x00\x4c\x67\x00\x00\x45\x6a\x48\x5b\x4c\xa3\x4a\x52\x00\x00\x00\x00\x59\x9b\x00\x00\x00\x00\x49\x8b\x00\x00\x00\x00\x47\xad\x4a\x4b\x4a\xe6\x4e\x7d\x59\x9c\x00\x00\x53\xcb\x00\x00\x00\x00\x00\x00\x48\x93\x00\x00\x4e\x46\x4a\x7d\x00\x00", /* 5e00 */ "\x00\x00\x00\x00\x45\x53\x47\x6b\x00\x00\x00\x00\x4f\x75\x00\x00\x00\x00\x00\x00\x00\x00\x59\x9d\x4a\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x59\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x51\xc7\x00\x00\x00\x00\x59\x9f\x59\x9e\x59\xa1\x00\x00\x48\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x44\x00\x00\x4b\x53\x00\x00\x49\x60\x49\x82\x00\x00\x00\x00\x4d\xc5\x00\x00\x00\x00\x59\xa2\x54\xbe\x46\xef\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x85\x00\x00\x00\x00\x59\xa5\x00\x00\x00\x00\x59\xa4\x59\xa3\x4a\x5e\x00\x00\x59\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x49\x6b\x00\x00\x59\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xa9\x4c\xca\x00\x00\x59\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x83\x00\x00\x48\xde\x59\xaa\x4e\x7f\x59\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6f\x45\x8d\x45\x60\x59\xac\x59\xad\x00\x00\x45\xa9\x48\xda\x59\xae\x50\xa2\x4d\xaf\x52\x5f\x4b\x57\x59\xaf", /* 5e80 */ "\x00\x00\x4b\x92\x00\x00\x45\xb7\x48\x50\x00\x00\x00\x00\x55\x8d\x00\x00\x00\x00\x4a\xed\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x64\x55\x4f\x48\x54\x00\x00\x00\x00\x51\x5a\x00\x00\x45\x51\x00\x00\x00\x00\x00\x00\x59\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xde\x48\xb1\x00\x00\x00\x00\x00\x00\x45\xf8\x00\x00\x48\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xeb\x50\xc1\x46\x9a\x4c\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xb1\x59\xb2\x4b\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x59\xb3\x4e\xdb\x4e\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x59\xb5\x59\xb4\x00\x00\x00\x00\x54\xad\x00\x00\x00\x00\x53\x6c\x00\x00\x00\x00\x00\x00\x59\xb7\x59\xb8\x00\x00\x59\xb6\x00\x00\x55\xaf\x55\x62\x59\xba\x59\xb9\x50\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x59\xbb\x59\xbc\x00\x00\x00\x00\x59\xbd\x00\x00\x00\x00\x00\x00\x59\xbe\x59\xbf\x00\x00\x59\xc0\x59\xc1\x00\x00\x47\xd0\x50\x5b\x52\xd6\x00\x00\x46\x66\x4b\xaf\x55\x64\x00\x00\x54\x4b\x51\xd9", /* 5f00 */ "\x00\x00\x4b\x47\x00\x00\x59\xc2\x54\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x59\xc3\x50\xcd\x59\xc4\x56\x41\x56\x51\x00\x00\x46\x8f\x50\xe1\x59\xc5\x00\x00\x4b\x63\x51\xe5\x46\xda\x59\xc6\x54\xac\x45\xd3\x00\x00\x00\x00\x55\x97\x00\x00\x00\x00\x00\x00\x4c\x9b\x00\x00\x59\xc7\x00\x00\x00\x00\x00\x00\x47\xe6\x4e\x42\x53\x6b\x00\x00\x59\xc8\x00\x00\x00\x00\x00\x00\x59\xc9\x00\x00\x59\xca\x00\x00\x4b\x6e\x00\x00\x00\x00\x59\xcb\x48\xba\x00\x00\x46\xd2\x59\xcc\x00\x00\x00\x00\x00\x00\x52\xe0\x00\x00\x4a\xd4\x00\x00\x00\x00\x59\xcd\x00\x00\x00\x00\x00\x00\x53\xc7\x00\x00\x00\x00\x59\xce\x00\x00\x53\x85\x00\x00\x59\xcf\x00\x00\x59\xd0\x00\x00\x00\x00\x59\xd1\x00\x00\x46\x5f\x00\x00\x00\x00\x59\xd2\x59\xd3\x00\x00\x59\xd4\x00\x00\x00\x00\x59\xd5\x59\xd6\x00\x00\x00\x00\x00\x00\x59\xd7\x46\x90\x00\x00\x00\x00\x00\x00\x45\xe1\x59\xd8\x00\x00\x4d\xcd\x51\x59\x4e\x86\x4e\x88\x52\x9c\x00\x00\x00\x00\x49\x64\x49\x5e\x00\x00\x59\xd9\x00\x00\x00\x00\x00\x00\x59\xda\x00\x00\x49\x5d\x00\x00\x00\x00\x47\x72\x00\x00\x00\x00\x59\xdd", /* 5f80 */ "\x4c\xea\x4a\x61\x59\xdc\x59\xdb\x4e\x60\x48\xa3\x00\x00\x59\xe0\x59\xdf\x00\x00\x59\xde\x49\x91\x45\xe5\x00\x00\x00\x00\x00\x00\x50\xb3\x59\xe1\x4c\x6c\x48\xfb\x00\x00\x00\x00\x00\x00\x47\xe8\x59\xe4\x59\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x59\xe3\x00\x00\x59\xe5\x46\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xe6\x4a\x70\x4e\xf5\x00\x00\x00\x00\x59\xe7\x4b\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x46\x54\x4c\x74\x00\x00\x00\x00\x59\xe8\x00\x00\x48\xf8\x00\x00\x00\x00\x59\xe9\x55\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xe7\x00\x00\x47\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x97\x4b\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xea\x46\x61\x4c\x45\x4e\xa3\x00\x00\x00\x00\x48\x95\x59\xf0\x59\xf1\x00\x00\x46\x4f\x00\x00\x00\x00\x00\x00\x59\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x60\x00\x00\x00\x00\x00\x00\x00\x00\x59\xef\x59\xee\x00\x00\x00\x00\x00\x00\x4a\xae\x00\x00\x00\x00\x59\xed\x00\x00\x00\x00\x59\xeb\x00\x00\x50\x56\x00\x00\x59\xf2", /* 6000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xf7\x59\xfd\x59\xf5\x00\x00\x4c\xd6\x00\x00\x00\x00\x59\xfa\x4e\xf0\x00\x00\x00\x00\x59\xf4\x00\x00\x59\xf9\x50\x9f\x46\xad\x00\x00\x00\x00\x50\x81\x59\xf3\x00\x00\x00\x00\x00\x00\x47\xcc\x59\xfc\x46\x6e\x54\xde\x59\xf6\x4e\x71\x59\xfb\x00\x00\x00\x00\x00\x00\x55\x42\x00\x00\x59\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x42\x52\x56\x5a\x4c\x00\x00\x00\x00\x5a\x49\x00\x00\x00\x00\x00\x00\x5a\x48\x4b\xca\x00\x00\x5a\x4a\x00\x00\x00\x00\x4b\xd5\x00\x00\x47\xc7\x00\x00\x00\x00\x52\x98\x00\x00\x00\x00\x00\x00\x5a\x50\x5a\x41\x00\x00\x00\x00\x5a\x44\x00\x00\x5a\x47\x5a\x43\x00\x00\x55\x94\x5a\x4b\x5a\x4d\x4e\xce\x00\x00\x00\x00\x53\xb8\x4c\x81\x5a\x45\x5a\x4f\x5a\x4e\x49\x4e\x00\x00\x4b\xb0\x53\x84\x00\x00\x00\x00\x00\x00\x00\x00\x46\x43\x00\x00\x5a\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6080 */ "\x00\x00\x5a\x52\x00\x00\x5a\x53\x5a\x55\x5a\x51\x00\x00\x00\x00\x00\x00\x54\x69\x5a\x57\x5a\x5c\x4d\xe3\x55\x44\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x5a\x00\x00\x50\x91\x00\x00\x5a\x58\x5a\x59\x00\x00\x00\x00\x5a\x54\x5a\x56\x00\x00\x00\x00\x00\x00\x4a\xb1\x4d\xd8\x00\x00\x00\x00\x4d\xeb\x00\x00\x00\x00\x48\x73\x5a\x5b\x00\x00\x4b\xcd\x49\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x9d\x52\x76\x53\xa3\x5a\x64\x55\x54\x00\x00\x5a\x5e\x00\x00\x00\x00\x00\x00\x51\x45\x5a\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x5f\x5a\x63\x4e\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x78\x00\x00\x5a\x61\x00\x00\x5a\x65\x00\x00\x00\x00\x5a\x66\x00\x00\x54\x9d\x00\x00\x4e\xd7\x00\x00\x5a\x5f\x4f\xe0\x5a\x60\x5a\x5d\x00\x00\x4b\x68\x00\x00\x00\x00\x00\x00\x55\x4a\x50\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xb8\x5a\x73\x5a\x68\x48\xb3\x5a\x6e\x00\x00\x5a\x6b\x5a\x6c\x00\x00\x54\x72\x5a\x6f\x5a\x72\x00\x00\x00\x00\x00\x00\x00\x00", /* 6100 */ "\x5a\x6d\x52\x82\x00\x00\x5a\x70\x00\x00\x00\x00\x5a\x6a\x00\x00\x53\xc8\x50\x98\x00\x00\x00\x00\x00\x00\x5a\x74\x5a\x75\x47\x63\x00\x00\x5a\x76\x00\x00\x00\x00\x00\x00\x5a\x69\x00\x00\x00\x00\x00\x00\x00\x00\x52\xb2\x45\xc6\x00\x00\x00\x00\x00\x00\x47\xf7\x5a\x67\x5a\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x7b\x5a\x7a\x00\x00\x00\x00\x00\x00\x5a\x80\x00\x00\x00\x00\x00\x00\x5a\x7e\x00\x00\x00\x00\x00\x00\x5a\x81\x00\x00\x00\x00\x5a\x79\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x7f\x5a\x84\x5a\x7c\x51\xe3\x00\x00\x00\x00\x5a\x85\x00\x00\x5a\x86\x00\x00\x00\x00\x5a\x77\x4c\xbe\x00\x00\x5a\x7d\x48\xfd\x53\x8e\x5a\x78\x4a\x76\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x92\x00\x00\x52\xe3\x00\x00\x00\x00\x5a\x8a\x5a\x8b\x5a\x8c\x00\x00\x00\x00\x5a\x83\x00\x00\x5a\x91\x00\x00\x00\x00\x4d\xdb\x4d\xd3\x00\x00\x5a\x82\x00\x00\x4e\xb6\x52\x8a\x00\x00\x00\x00\x5a\x8d\x00\x00\x00\x00\x4c\x49\x5a\x8f\x4f\xad\x5a\x90\x00\x00\x5a\x87\x5a\x8e\x5a\x93\x48\xa8\x5a\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xf4\x00\x00", /* 6180 */ "\x00\x00\x00\x00\x50\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x88\x00\x00\x00\x00\x5a\x99\x00\x00\x00\x00\x00\x00\x4f\x4a\x00\x00\x55\x5b\x5a\x9a\x00\x00\x00\x00\x5a\x98\x00\x00\x5a\x96\x00\x00\x5a\x94\x5a\x95\x55\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xfc\x00\x00\x00\x00\x53\xc2\x00\x00\x51\x75\x00\x00\x5a\x9b\x5a\x97\x00\x00\x5a\x9c\x00\x00\x00\x00\x00\x00\x47\xbe\x00\x00\x00\x00\x00\x00\x4e\x6c\x00\x00\x00\x00\x00\x00\x5a\xa3\x00\x00\x00\x00\x00\x00\x51\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xa1\x00\x00\x00\x00\x5a\xa2\x4e\xa4\x5a\xa0\x5a\x9f\x5a\x9e\x5a\xa4\x5a\x9d\x5a\xa6\x00\x00\x00\x00\x4e\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xa8\x00\x00\x00\x00\x5a\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x53\x00\x00\x5a\xa9\x00\x00\x5a\xab\x5a\xaa\x4d\xc6\x00\x00\x5a\xad\x00\x00\x5a\xaf\x5a\xac\x5a\xb0\x5a\xae", /* 6200 */ "\x5a\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xb2\x5a\xb3\x51\x61\x00\x00\x54\x60\x5a\xb4\x51\x7f\x00\x00\x45\xba\x49\xde\x4d\xa0\x5a\xb5\x5a\xb6\x00\x00\x4d\x7f\x00\x00\x00\x00\x00\x00\x55\x95\x5a\xb7\x00\x00\x64\x6e\x5a\xb8\x54\xd9\x00\x00\x5a\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x47\x64\x00\x00\x00\x00\x00\x00\x5a\xba\x00\x00\x00\x00\x00\x00\x5a\xbb\x4f\x92\x5a\xbc\x00\x00\x5a\xbd\x5a\xbe\x50\x92\x00\x00\x00\x00\x00\x00\x45\xcf\x00\x00\x00\x00\x4c\x44\x00\x00\x00\x00\x00\x00\x47\xdc\x45\x8c\x5a\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xca\x65\x5d\x50\xad\x00\x00\x45\xcb\x00\x00\x49\xf1\x5a\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x47\xea\x00\x00\x49\x81\x00\x00\x00\x00\x55\xd5\x00\x00\x00\x00\x5a\xc3\x00\x00\x00\x00\x5a\xc1\x00\x00\x5a\xc4\x00\x00\x00\x00\x5a\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xb7\x00\x00\x00\x00\x4c\x69\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x7a\x00\x00\x00\x00\x4c\x76\x00\x00\x00\x00\x5a\xc6\x00\x00\x5a\xca\x4c\x48", /* 6280 */ "\x48\xf7\x00\x00\x5a\xc7\x5a\xcd\x4e\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xc8\x4e\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x66\x5a\xc9\x5a\xcb\x5a\xce\x47\x51\x5a\xcc\x4a\x67\x49\x8d\x00\x00\x00\x00\x5a\xdc\x4a\x85\x00\x00\x4e\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xda\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xa6\x5a\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x86\x00\x00\x00\x00\x00\x00\x4b\x90\x00\x00\x00\x00\x00\x00\x51\xe0\x00\x00\x5a\xd1\x49\xe1\x4d\x53\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xd9\x00\x00\x00\x00\x4a\xa1\x5a\xd4\x5a\xdb\x5a\xd5\x5a\xdd\x5a\xd8\x00\x00\x53\x45\x4f\xba\x00\x00\x5a\xd2\x53\xa2\x5a\xd0\x4f\x61\x4b\xdb\x5a\xd7\x00\x00\x00\x00\x5a\xcf\x50\x45\x52\x5c\x00\x00\x4b\xfd\x5a\xd6\x4e\xe2\x00\x00\x00\x00\x4d\x77\x48\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xc5\x4e\xe5\x5a\xdf\x5a\xe4\x00\x00\x5a\xe0\x00\x00\x50\x8d\x00\x00\x5a\xe5\x4f\x9e\x55\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xd7\x5a\xe6", /* 6300 */ "\x00\x00\x46\xd8\x5a\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x47\xb6\x5a\xe3\x54\x89\x00\x00\x00\x00\x5a\xde\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xe1\x4f\x81\x00\x00\x00\x00\x54\x8f\x00\x00\x00\x00\x00\x00\x48\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x87\x00\x00\x00\x00\x52\xa8\x5a\xe9\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xa0\x00\x00\x00\x00\x55\x7d\x5a\xe8\x00\x00\x5a\xea\x5a\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x41\x00\x00\x55\x46\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x85\x4b\xb3\x5a\xf5\x00\x00\x5a\xf4\x00\x00\x00\x00\x4e\xd6\x00\x00\x00\x00\x00\x00\x54\x93\x00\x00\x00\x00\x00\x00\x5a\xef\x4d\x8f\x00\x00\x00\x00\x4f\xc0\x54\xc0\x00\x00\x00\x00\x00\x00\x00\x00", /* 6380 */ "\x5a\xed\x00\x00\x00\x00\x4d\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x61\x5a\xf2\x00\x00\x00\x00\x4e\xec\x00\x00\x5a\xec\x5a\xf1\x00\x00\x00\x00\x4c\xfa\x00\x00\x00\x00\x00\x00\x5a\xeb\x00\x00\x4d\x44\x00\x00\x00\x00\x4a\xe3\x00\x00\x00\x00\x00\x00\x5a\xf3\x55\xe6\x4b\x4f\x4b\x7f\x5a\xf0\x00\x00\x47\xa8\x00\x00\x4c\xac\x48\xd5\x55\xd0\x4a\x60\x5a\xee\x55\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xc1\x00\x00\x54\xcd\x5a\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xa3\x00\x00\x00\x00\x5a\xf7\x00\x00\x5a\xf9\x00\x00\x00\x00\x4e\xfd\x5b\x42\x00\x00\x5a\xfa\x00\x00\x00\x00\x5a\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xcf\x49\xb9\x00\x00\x5a\xfe\x00\x00\x00\x00\x00\x00\x4c\xf2\x00\x00\x00\x00\x00\x00\x4c\x46\x49\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x60\x00\x00\x5a\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xd5\x5a\xfb\x5b\x41\x00\x00\x00\x00\x00\x00\x4f\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xd8\x00\x00\x5b\x4b\x00\x00\x00\x00\x00\x00\x5b\x45\x54\xa3\x00\x00\x5b\x4c\x5b\x49\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x46\x00\x00\x5b\x4a\x00\x00\x00\x00\x00\x00\x4d\xc8\x52\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x43\x00\x00\x5b\x47\x00\x00\x00\x00\x00\x00\x4e\x49\x00\x00\x00\x00\x00\x00\x50\xa3\x00\x00\x00\x00\x00\x00\x4e\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x4d\x00\x00\x00\x00\x54\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x4e\x00\x00\x48\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x51\x00\x00\x55\xf5\x00\x00\x51\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6480 */ "\x00\x00\x00\x00\x00\x00\x4a\x74\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xde\x5b\x57\x00\x00\x5b\x55\x00\x00\x00\x00\x00\x00\x00\x00\x53\x48\x00\x00\x00\x00\x5b\x53\x55\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x7a\x5b\x58\x00\x00\x00\x00\x00\x00\x5b\x59\x00\x00\x51\xe1\x00\x00\x4e\x62\x4c\x77\x00\x00\x53\x72\x00\x00\x4e\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x52\x00\x00\x5b\x56\x5b\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x51\x4e\x5b\x62\x00\x00\x00\x00\x5b\x5e\x00\x00\x5b\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x9b\x5b\x54\x00\x00\x00\x00\x00\x00\x5b\x5d\x00\x00\x5b\x60\x00\x00\x00\x00\x00\x00\x5b\x61\x00\x00\x5b\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x65\x5b\x66\x55\x43\x5b\x67\x00\x00\x00\x00\x4f\xd6\x5b\x64\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xcd\x00\x00\x00\x00\x5b\x68\x00\x00\x5b\x63\x5b\x6b\x00\x00\x5b\x69\x00\x00\x5b\x6a\x00\x00\x00\x00\x00\x00\x5b\x6c\x00\x00\x00\x00\x5b\x6e\x55\xf6\x00\x00", /* 6500 */ "\x5b\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x6f\x00\x00\x00\x00\x00\x00\x5b\x70\x5b\x71\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x72\x5b\x74\x5b\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x7f\x5b\x75\x5b\x76\x00\x00\x00\x00\x47\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x77\x5b\x78\x5b\x7a\x5b\x79\x5b\x7b\x48\x8f\x00\x00\x4b\xc5\x00\x00\x00\x00\x48\xaf\x45\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xf7\x00\x00\x00\x00\x5b\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x80\x5b\x7e\x46\x47\x00\x00\x4c\x5c\x00\x00\x00\x00\x00\x00\x5b\x82\x5b\x7f\x4b\x8a\x5b\x81\x47\xa5\x00\x00\x00\x00\x00\x00\x5b\x83\x51\xb1\x00\x00\x00\x00\x00\x00\x4f\xcf\x4a\xc9\x00\x00\x00\x00\x49\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xb0\x00\x00\x00\x00\x00\x00\x46\xcc\x00\x00\x5b\x84\x00\x00\x47\x7c\x4b\xf3\x00\x00\x49\x51\x5b\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6580 */ "\x00\x00\x00\x00\x5b\x86\x5b\x87\x00\x00\x00\x00\x00\x00\x45\xca\x58\xed\x46\x8e\x00\x00\x00\x00\x51\x9d\x00\x00\x47\xdb\x00\x00\x4b\x80\x52\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x83\x00\x00\x46\x4e\x00\x00\x5b\x89\x4b\xd1\x00\x00\x00\x00\x5b\x8a\x00\x00\x55\x81\x00\x00\x00\x00\x54\xcf\x51\x41\x00\x00\x51\xc2\x00\x00\x00\x00\x00\x00\x5b\x8b\x4e\xfc\x49\x89\x00\x00\x4e\xa5\x45\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x8c\x00\x00\x45\xcd\x00\x00\x00\x00\x4d\xa4\x48\x88\x00\x00\x00\x00\x00\x00\x5b\x8f\x00\x00\x5b\x8d\x5b\x90\x4a\xcf\x5b\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x7b\x5b\x91\x00\x00\x00\x00\x4a\xdc\x00\x00\x00\x00\x5b\x92\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xab\x00\x00\x5b\x93\x00\x00\x51\x65\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x95\x5b\x94\x4b\x77\x00\x00\x00\x00\x45\x62\x4d\x9d\x4c\x7b\x4d\x6a\x46\xe9\x00\x00\x00\x00\x4d\x67\x47\xec\x00\x00\x00\x00\x00\x00\x5b\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xa3\x5b\x9c\x00\x00\x00\x00\x00\x00\x00\x00", /* 6600 */ "\x5b\x97\x00\x00\x5b\x99\x5b\x9b\x00\x00\x00\x00\x4f\xe7\x46\xfe\x00\x00\x5b\x9d\x52\x8e\x00\x00\x46\xd1\x00\x00\x45\xa6\x54\xe8\x00\x00\x00\x00\x00\x00\x47\xe9\x4c\x59\x5b\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xa3\x00\x00\x5b\xa1\x47\xa9\x47\xac\x00\x00\x00\x00\x00\x00\x5b\xa4\x46\x62\x00\x00\x55\x9d\x48\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x45\xb3\x5b\xa0\x4b\xbb\x00\x00\x52\xeb\x00\x00\x00\x00\x5b\xa2\x5b\x9f\x51\x93\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x9f\x4c\x98\x00\x00\x00\x00\x5b\x9e\x00\x00\x52\x51\x46\x51\x48\xb0\x5b\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xa6\x00\x00\x4b\xb2\x00\x00\x00\x00\x00\x00\x51\xea\x00\x00\x00\x00\x54\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xa8\x00\x00\x5b\xab\x00\x00\x00\x00\x00\x00\x5b\xad\x5b\xa9\x4f\xce\x00\x00\x00\x00\x5b\xac\x00\x00\x5b\xaa\x5b\xa7\x55\x6d\x50\xa0\x51\xb2\x4c\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x49\xf8\x49\x93\x5b\xb0\x00\x00\x00\x00\x5b\xaf\x47\x95\x00\x00\x4a\xf8\x00\x00\x00\x00\x00\x00\x46\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6680 */ "\x00\x00\x4c\x83\x00\x00\x5b\xb1\x5b\xb3\x00\x00\x00\x00\x4f\x46\x5b\xb2\x4e\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xab\x00\x00\x00\x00\x4f\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x6c\x4b\xe2\x5b\xb5\x5b\xb4\x00\x00\x00\x00\x00\x00\x5b\xb7\x00\x00\x00\x00\x5b\xb6\x00\x00\x4c\xc7\x00\x00\x00\x00\x00\x00\x50\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x50\x93\x00\x00\x00\x00\x4a\xfe\x00\x00\x00\x00\x00\x00\x5b\xb8\x00\x00\x4c\xb2\x00\x00\x00\x00\x00\x00\x5b\xbf\x52\x43\x00\x00\x00\x00\x5b\xbe\x00\x00\x5b\xbd\x5b\xbb\x00\x00\x5b\xba\x00\x00\x00\x00\x5b\xb9\x00\x00\x00\x00\x4c\x56\x00\x00\x5b\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc0\x00\x00\x00\x00\x51\x52\x5b\xc1\x00\x00\x4b\xfe\x52\xa6\x00\x00\x00\x00\x51\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc2\x00\x00\x00\x00\x5b\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc4\x00\x00\x49\xb6\x4e\xbc\x4a\x6d\x5b\xc5\x00\x00\x5b\xc6\x47\x9d\x4e\xd2\x5b\xc7\x53\x97\x57\x8d\x49\x5f\x51\x66\x4b\xc3", /* 6700 */ "\x46\xf5\x00\x00\x00\x00\x56\xac\x00\x00\x00\x00\x00\x00\x00\x00\x45\x61\x46\x85\x00\x00\x4b\xc4\x00\x00\x47\xd4\x5b\xc8\x54\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xa4\x55\xf3\x5b\xca\x48\x6e\x00\x00\x00\x00\x00\x00\x47\xbb\x00\x00\x47\x5c\x5b\xcb\x46\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xcd\x5b\xce\x45\x6c\x00\x00\x49\xc6\x47\x46\x45\x66\x48\xf9\x5b\xd0\x00\x00\x00\x00\x4d\x42\x00\x00\x00\x00\x4e\xa2\x00\x00\x5b\xd2\x5b\xd3\x5b\xd4\x00\x00\x4d\x96\x00\x00\x00\x00\x50\xf0\x00\x00\x5b\xd1\x00\x00\x53\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xd5\x00\x00\x00\x00\x46\x68\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x51\x50\xd0\x46\xbc\x45\x56\x00\x00\x54\xc1\x00\x00\x00\x00\x50\xf4\x00\x00\x00\x00\x5b\xd7\x00\x00\x00\x00\x52\x5d\x00\x00\x5b\xd6\x4b\x4b\x54\x80\x47\x5e\x51\xa6\x52\x91\x5b\xd9\x46\x76\x5b\xd8\x00\x00\x00\x00\x00\x00\x5b\xde\x00\x00\x00\x00\x50\x8b\x00\x00\x4c\x63\x5b\xdc\x45\x57\x5b\x9a\x5b\xe0\x00\x00\x4a\xa6\x00\x00\x52\x80\x00\x00\x00\x00\x00\x00\x00\x00\x54\xdf\x00\x00\x45\x78\x46\xb4", /* 6780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xdb\x00\x00\x52\x5e\x00\x00\x5b\xda\x00\x00\x5b\xdf\x54\xf2\x00\x00\x00\x00\x00\x00\x4a\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x78\x00\x00\x45\xa2\x00\x00\x00\x00\x49\xd9\x00\x00\x47\xb9\x46\x72\x00\x00\x00\x00\x4f\xd2\x5b\xe2\x52\xd0\x00\x00\x00\x00\x00\x00\x5b\xe1\x00\x00\x00\x00\x5b\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x61\x00\x00\x00\x00\x00\x00\x54\xc9\x5b\xe6\x00\x00\x4e\xe8\x5b\xe4\x5b\xe9\x5b\xf2\x00\x00\x5b\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xf0\x55\xcd\x00\x00\x00\x00\x4a\x7f\x00\x00\x5b\xf4\x00\x00\x00\x00\x00\x00\x52\xd9\x00\x00\x00\x00\x00\x00\x5b\xf1\x49\x80\x50\x4a\x4e\xc1\x00\x00\x48\x9b\x4d\xea\x00\x00\x00\x00\x00\x00\x4f\xd8\x00\x00\x4e\xe1\x00\x00\x00\x00\x5b\xed\x54\xf3\x00\x00\x00\x00\x00\x00\x5b\xee\x00\x00\x5b\xeb\x00\x00\x00\x00\x5b\xea\x00\x00\x5b\xe8\x00\x00\x00\x00\x5b\xe7\x00\x00\x5b\xef\x5b\xe5\x00\x00\x4b\xea\x00\x00\x46\xea\x47\xa7\x51\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x73\x00\x00\x00\x00\x50\x54\x4a\xc1", /* 6800 */ "\x00\x00\x5b\xf3\x52\xd1\x47\xd3\x45\xfa\x51\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xe3\x00\x00\x00\x00\x4d\xcc\x47\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xf5\x00\x00\x00\x00\x48\xbf\x52\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xde\x48\x56\x52\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xfa\x00\x00\x55\xda\x00\x00\x00\x00\x00\x00\x4b\x9e\x46\x67\x00\x00\x00\x00\x47\xde\x4d\xe0\x00\x00\x00\x00\x5b\xf8\x50\xd6\x49\xab\x4a\xda\x5b\xf9\x00\x00\x5b\xf6\x00\x00\x48\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xf7\x5b\xfb\x00\x00\x49\xc0\x48\x79\x5b\xec\x53\x6d\x53\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xfd\x00\x00\x00\x00\x47\x71\x4d\x88\x00\x00\x51\xf3\x00\x00\x00\x00\x00\x00\x5b\xfc\x00\x00\x00\x00\x00\x00\x50\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x4b\x00\x00\x4e\x77\x5c\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x44\x5c\x42", /* 6880 */ "\x00\x00\x4e\x44\x00\x00\x5c\x48\x00\x00\x47\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xfe\x5b\xfe\x5c\x45\x00\x00\x00\x00\x00\x00\x50\xda\x5c\x47\x00\x00\x00\x00\x52\xcc\x00\x00\x00\x00\x00\x00\x53\xbc\x00\x00\x4e\x92\x00\x00\x5c\x43\x52\xc6\x00\x00\x50\xac\x00\x00\x00\x00\x00\x00\x58\xa4\x52\xd3\x48\x58\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x46\x00\x00\x51\xe4\x46\x82\x53\x59\x00\x00\x53\x61\x00\x00\x5c\x4c\x49\xad\x00\x00\x00\x00\x5c\x4a\x5c\x4d\x00\x00\x5c\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xb1\x00\x00\x5c\x60\x00\x00\x53\x86\x55\xca\x5c\x50\x4e\xf1\x00\x00\x5c\x56\x00\x00\x5c\x5f\x00\x00\x00\x00\x4b\x5a\x00\x00\x5c\x57\x5c\x59\x00\x00\x54\xc2\x5c\x52\x00\x00\x4b\xef\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xa9\x5c\x5e\x5c\x54\x00\x00\x5c\x5d\x00\x00\x00\x00\x00\x00\x5c\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x9d\x5c\x5b\x00\x00\x00\x00\x53\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x94\x55\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6900 */ "\x54\x68\x5c\x4f\x00\x00\x00\x00\x5c\x5c\x4f\xf7\x00\x00\x00\x00\x5c\x51\x00\x00\x00\x00\x4d\xfd\x5c\x55\x47\xc5\x4b\xa0\x5c\x4e\x00\x00\x00\x00\x5c\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xed\x53\x70\x51\x63\x48\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x63\x5c\x61\x5c\x64\x00\x00\x53\xfa\x5c\x53\x00\x00\x5c\x65\x00\x00\x5c\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x71\x00\x00\x00\x00\x00\x00\x54\xa7\x00\x00\x5c\x69\x00\x00\x00\x00\x52\xed\x00\x00\x00\x00\x00\x00\x5c\x6f\x00\x00\x4c\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x95\x5c\x6b\x55\xc5\x00\x00\x00\x00\x00\x00\x5c\x70\x53\x4c\x00\x00\x54\xe2\x5c\x73\x5c\x72\x00\x00\x4a\xdf\x52\x7c\x4d\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x6e\x00\x00\x5c\x6c\x54\xa2\x00\x00\x45\x6b\x53\xef\x4f\xae\x00\x00\x00\x00\x00\x00\x52\xb3\x5c\x6d\x49\xb7\x00\x00\x5c\x68\x5c\x6a\x5c\x67\x00\x00\x00\x00\x52\xba\x47\x61\x5c\x74\x00\x00", /* 6980 */ "\x00\x00\x5c\x75\x4c\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x52\x00\x00\x00\x00\x00\x00\x49\xeb\x00\x00\x00\x00\x54\x76\x00\x00\x00\x00\x55\xc7\x5c\x86\x00\x00\x00\x00\x5c\x79\x00\x00\x00\x00\x4d\x7e\x5c\x85\x00\x00\x00\x00\x00\x00\x5c\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x4a\x00\x00\x00\x00\x5c\x80\x5c\x76\x00\x00\x53\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x82\x00\x00\x00\x00\x5c\x7c\x5c\x77\x00\x00\x5c\x7a\x00\x00\x5c\x83\x00\x00\x00\x00\x00\x00\x4d\xb9\x00\x00\x00\x00\x5c\x7f\x47\x96\x4e\xfa\x52\xdb\x5c\x7d\x00\x00\x54\x8c\x00\x00\x00\x00\x5c\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x48\x48\x68\x81\x00\x00\x00\x00\x00\x00\x5c\x81\x5c\x87\x00\x00\x00\x00\x00\x00\x5c\x90\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x8f\x5c\x89\x00\x00\x00\x00\x5c\x94\x00\x00\x5c\x92\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x8d\x00\x00\x4b\x5c\x00\x00\x4d\xb7\x00\x00\x5c\x8c", /* 6a00 */ "\x00\x00\x00\x00\x5c\x8a\x00\x00\x00\x00\x53\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x95\x49\x4f\x5c\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x97\x5c\x99\x5c\x93\x00\x00\x00\x00\x53\x8b\x00\x00\x49\x66\x00\x00\x5c\x8b\x00\x00\x00\x00\x5c\x91\x53\x9b\x00\x00\x48\x64\x5c\x96\x5c\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xdc\x45\xf2\x4b\x6f\x00\x00\x00\x00\x5c\x88\x00\x00\x5c\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x55\x85\x5c\x9f\x00\x00\x5c\xa7\x46\xcf\x4e\x69\x00\x00\x00\x00\x4b\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x9c\x00\x00\x5c\xa6\x5c\xa1\x5c\xa5\x00\x00\x00\x00\x45\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xc2\x5c\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x79\x00\x00\x55\xd4\x5c\xa2\x00\x00\x00\x00\x00\x00\x5c\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xa8\x5c\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xaf\x4f\xb2", /* 6a80 */ "\x4f\xf5\x00\x00\x00\x00\x00\x00\x5c\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xab\x55\xee\x00\x00\x5c\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x55\x00\x00\x00\x00\x00\x00\x5c\x9e\x00\x00\x5c\xad\x5c\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb2\x00\x00\x5c\xb1\x00\x00\x54\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb5\x00\x00\x00\x00\x5c\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb7\x5c\xb4\x52\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xba\x00\x00\x55\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xbb\x4d\xa6\x00\x00\x00\x00\x5c\xb8\x53\x62\x00\x00\x00\x00\x5c\xb9\x00\x00\x5c\xbc\x00\x00\x00\x00\x00\x00\x51\xc5\x00\x00\x5c\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xc2\x52\xee\x00\x00\x00\x00\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xde\x5c\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xc3\x00\x00\x00\x00\x00\x00\x5c\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xf7\x00\x00\x5c\xc5\x4c\xb5\x45\x97\x00\x00\x4b\x9d\x00\x00\x00\x00\x00\x00\x4a\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xc7\x5c\xc6\x5c\xc8\x51\x7d\x00\x00\x00\x00\x4c\xf8\x4e\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xcc\x00\x00\x00\x00\x00\x00\x5c\xcb\x00\x00\x5c\xcd\x00\x00\x00\x00\x46\xf7\x00\x00\x54\x87\x00\x00\x5c\xce\x00\x00\x00\x00\x4d\x4e\x5c\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xcf\x00\x00\x5c\xd1\x00\x00\x00\x00\x00\x00\x5c\xd2\x00\x00\x5c\xd3\x48\xd8\x45\x77\x4d\x4c\x00\x00\x45\xb1\x00\x00\x00\x00\x47\xd8\x55\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x9f\x00\x00\x00\x00\x00\x00\x48\xe4\x49\x55\x00\x00\x00\x00\x00\x00\x5c\xd4\x5c\xd5\x00\x00\x49\x99\x00\x00\x00\x00\x00\x00\x5c\xd6", /* 6b80 */ "\x5c\xd7\x00\x00\x00\x00\x5c\xd9\x5c\xd8\x00\x00\x4f\x42\x00\x00\x00\x00\x53\xa4\x48\x65\x49\x92\x00\x00\x5c\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xdc\x4e\x73\x00\x00\x5c\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xdf\x5c\xe0\x00\x00\x00\x00\x00\x00\x5c\xe1\x00\x00\x5c\xe2\x5c\xe3\x5c\xe4\x54\x59\x47\xed\x00\x00\x5c\xe5\x00\x00\x00\x00\x49\xe9\x50\xc0\x5c\xe6\x00\x00\x00\x00\x48\x49\x58\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x5b\x5c\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xe8\x00\x00\x49\x69\x49\xf5\x00\x00\x00\x00\x00\x00\x4c\x97\x5c\xe9\x47\x4e\x00\x00\x5c\xea\x00\x00\x53\xd7\x00\x00\x00\x00\x46\xe2\x00\x00\x00\x00\x00\x00\x5c\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xed\x5c\xec\x00\x00\x00\x00\x5c\xef\x00\x00\x00\x00\x00\x00\x5c\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x8e\x00\x00\x47\x56\x00\x00\x5c\xf1\x5c\xf2\x00\x00\x00\x00\x45\xb9\x00\x00\x00\x00\x00\x00\x5c\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xf5\x5c\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x9c\x00\x00\x00\x00\x4c\xa4\x45\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x6e\x5c\xf6\x53\x4d\x4d\x84\x49\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x5e\x00\x00\x50\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xf8\x00\x00\x4e\xc4\x00\x00\x00\x00\x4e\x82\x00\x00\x5c\xf9\x55\x5e\x5c\xf7\x45\xad\x45\xe8\x00\x00\x5c\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x45\x00\x00\x52\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xfe\x50\xd2\x00\x00\x50\xc8\x5d\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xa4\x00\x00\x00\x00\x49\x4c\x5d\x44\x00\x00", /* 6c80 */ "\x00\x00\x5d\x42\x5c\xfb\x55\xd9\x00\x00\x00\x00\x5c\xfd\x00\x00\x4c\x8f\x00\x00\x00\x00\x00\x00\x55\x98\x5c\xfc\x00\x00\x00\x00\x5d\x48\x00\x00\x5d\x47\x4f\xf8\x00\x00\x00\x00\x47\xfd\x00\x00\x00\x00\x4e\xad\x5d\x41\x5d\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x75\x45\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xec\x00\x00\x00\x00\x5d\x4d\x00\x00\x00\x00\x5d\x50\x00\x00\x46\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xaa\x46\x5c\x5d\x52\x45\x84\x46\xc6\x5d\x4b\x5d\x51\x4e\x6f\x00\x00\x4a\x58\x00\x00\x00\x00\x5d\x49\x5d\x4c\x00\x00\x00\x00\x00\x00\x46\xee\x4d\xb8\x00\x00\x51\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xd7\x00\x00\x46\x4a\x00\x00\x55\xc6\x00\x00\x5d\x55\x5d\x4e\x5d\x53\x00\x00\x5d\x4f\x00\x00\x00\x00\x00\x00\x4e\x87\x46\xca\x4d\x4b\x00\x00\x4e\x56\x00\x00\x00\x00\x49\x44\x00\x00\x5d\x56\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x54\x46\xf3\x5d\x4a\x00\x00\x4f\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xda\x5d\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x4e\x00\x00\x52\xb6\x00\x00\x54\x50\x00\x00\x00\x00\x4d\x98\x5d\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xdc\x00\x00\x00\x00\x00\x00\x50\xb7\x4f\xd4\x5d\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x72\x5d\x5c\x00\x00\x52\xac\x5d\x59\x00\x00\x50\xbc\x00\x00\x00\x00\x47\xb4\x00\x00\x5d\x5b\x4a\x72\x00\x00\x00\x00\x46\xfc\x00\x00\x00\x00\x4c\xc9\x46\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x66\x5d\x64\x00\x00\x45\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x5f\x5d\x63\x00\x00\x46\x6b\x00\x00\x00\x00\x46\xeb\x4a\x9d\x00\x00\x55\xcc\x00\x00\x4a\x8c\x5d\x62\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x7e\x00\x00\x00\x00\x45\xa7\x4d\x41\x5d\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x6a\x00\x00\x5d\x60\x48\x6b\x00\x00\x00\x00\x00\x00\x4f\x7d\x00\x00\x5d\x67\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x61\x00\x00\x5d\x68\x5d\x6b\x00\x00\x00\x00\x4d\xda\x00\x00\x5d\x69\x55\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x72\x00\x00\x00\x00\x4f\x91\x00\x00\x00\x00\x4a\x45\x00\x00\x00\x00\x5d\x6f\x00\x00\x00\x00\x5d\x73\x00\x00\x00\x00\x00\x00\x4e\x74\x00\x00\x00\x00\x00\x00\x4a\x88\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x7c\x5d\x75\x5d\x71\x00\x00\x00\x00\x00\x00\x52\xc7\x5d\x78\x00\x00\x00\x00\x5d\x74\x00\x00\x4a\xbf\x5d\x7b\x00\x00\x00\x00\x5d\x82\x00\x00\x00\x00\x55\xe1\x5d\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x77\x00\x00\x00\x00\x4c\xa5\x00\x00\x00\x00\x5d\x81\x00\x00\x5d\x70\x00\x00\x5d\x79\x00\x00\x5d\x83\x55\x4e\x5d\x76\x00\x00\x5d\x84\x00\x00\x00\x00\x47\x77\x5d\x7f\x48\x94\x00\x00\x48\xea\x00\x00\x4b\x46\x5d\x7a\x5d\x6c\x5d\x7d\x4a\x91\x5d\x80\x00\x00\x00\x00\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x96\x00\x00\x54\x41\x47\x69\x4a\xc0\x5d\x6d\x48\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x98\x00\x00\x51\x64\x00\x00\x00\x00\x00\x00\x5d\x87\x50\xe4\x47\x8a\x00\x00\x5d\x99\x00\x00\x5d\x92\x52\x7a\x45\xd2\x00\x00\x5d\x8c\x5d\x98\x4e\x43\x51\xa0\x5d\x93\x00\x00\x49\x50\x00\x00\x5d\x8f\x49\x45\x5d\x85\x5d\x6e\x48\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x9a\x5d\x8a\x5d\x96\x00\x00\x5d\x95\x00\x00\x5d\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x88\x00\x00\x00\x00\x5d\x91\x5d\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x52\x00\x00\x51\x55\x00\x00\x00\x00\x53\xf3\x5d\x8e\x00\x00\x00\x00\x5d\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xbd\x00\x00\x00\x00\x00\x00\x5d\x8d\x00\x00\x00\x00\x5d\x86\x48\xbd\x00\x00\x00\x00\x5d\x88\x00\x00\x00\x00\x00\x00\x5d\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x6b\x4c\x90", /* 6e80 */ "\x47\x5b\x00\x00\x5d\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xfa\x00\x00\x00\x00\x5d\xa5\x47\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xce\x00\x00\x5d\x9d\x00\x00\x00\x00\x00\x00\x4d\xc4\x4a\x4d\x00\x00\x5d\xa8\x00\x00\x00\x00\x52\x71\x00\x00\x00\x00\x53\x76\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xa0\x00\x00\x00\x00\x5d\xa2\x00\x00\x00\x00\x00\x00\x48\xbe\x5d\x9e\x00\x00\x00\x00\x54\x97\x00\x00\x00\x00\x5d\x9f\x00\x00\x5d\xa6\x00\x00\x00\x00\x5d\xa7\x00\x00\x5d\xa1\x4e\xe6\x00\x00\x00\x00\x00\x00\x52\xa9\x00\x00\x48\x57\x5d\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xa2\x00\x00\x52\x4a\x5d\xa3\x5d\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xa3\x4d\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xab\x00\x00\x00\x00\x5d\xb1\x00\x00\x00\x00\x5d\xaf\x00\x00\x4f\xb7\x00\x00\x00\x00\x5d\xb7\x5d\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xad\x5d\xb4", /* 6f00 */ "\x00\x00\x4b\x78\x4f\xbc\x00\x00\x00\x00\x00\x00\x4d\xae\x00\x00\x00\x00\x54\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xc4\x00\x00\x55\x75\x00\x00\x5d\xb6\x49\xed\x54\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x8e\x00\x00\x4f\x58\x54\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x6e\x4e\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xb0\x5d\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xb5\x5d\xae\x00\x00\x5d\xa9\x00\x00\x00\x00\x00\x00\x5d\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xfa\x00\x00\x00\x00\x4a\xc2\x00\x00\x00\x00\x00\x00\x5d\xc3\x00\x00\x00\x00\x5d\xbd\x4d\xc0\x00\x00\x00\x00\x46\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xd2\x00\x00\x5d\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xbe\x4c\x93\x5d\xbc\x54\x46\x00\x00\x00\x00\x00\x00\x5d\xbf\x00\x00\x00\x00\x00\x00\x5d\xba\x00\x00\x5d\xb9\x00\x00\x5d\xc2\x00\x00\x00\x00\x00\x00", /* 6f80 */ "\x5d\xbb\x55\xa0\x5d\xc0\x00\x00\x48\x87\x00\x00\x5d\xb8\x00\x00\x5d\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xc5\x00\x00\x00\x00\x5d\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xcb\x00\x00\x5d\xc9\x4e\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x89\x00\x00\x5d\xc8\x00\x00\x5d\xca\x00\x00\x00\x00\x00\x00\x5d\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xd0\x50\xbe\x5d\xcf\x4a\xce\x00\x00\x00\x00\x5d\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xd4\x5d\xd1\x00\x00\x00\x00\x5d\xd3\x00\x00\x00\x00\x5d\xcd\x00\x00\x00\x00\x00\x00\x5d\xd0\x53\x80\x50\x7e\x00\x00\x00\x00\x51\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xa3\x5d\xd2\x00\x00\x5d\xd6\x4d\xd4\x00\x00\x50\x55\x00\x00\x5d\xe2\x00\x00\x5d\xd5\x66\x58\x00\x00\x00\x00\x00\x00\x5d\xdb\x00\x00\x00\x00\x00\x00\x51\x87\x00\x00", /* 7000 */ "\x00\x00\x5d\xdd\x00\x00\x00\x00\x00\x00\x5d\xd7\x55\x50\x5d\xd8\x00\x00\x5d\xd9\x00\x00\x5d\xda\x00\x00\x00\x00\x00\x00\x5d\xde\x00\x00\x5d\xdc\x00\x00\x00\x00\x00\x00\x55\xd1\x00\x00\x00\x00\x5d\xe4\x00\x00\x5d\xe0\x5d\xdf\x00\x00\x52\xb0\x53\x5c\x5d\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xde\x52\xae\x5d\xe3\x00\x00\x00\x00\x00\x00\x46\x5b\x00\x00\x00\x00\x00\x00\x5d\xe5\x00\x00\x5d\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xea\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x85\x00\x00\x00\x00\x00\x00\x4b\x65\x4a\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x73\x00\x00\x00\x00\x00\x00\x54\x6a\x4c\xbc\x00\x00\x00\x00", /* 7080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xea\x00\x00\x00\x00\x00\x00\x49\x7d\x4f\xcb\x00\x00\x00\x00\x00\x00\x4d\xad\x00\x00\x00\x00\x00\x00\x4f\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xed\x5d\xee\x48\x61\x5d\xf0\x5d\xec\x00\x00\x00\x00\x00\x00\x52\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xef\x47\x88\x49\xd7\x52\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xd1\x00\x00\x00\x00\x5d\xf2\x00\x00\x00\x00\x00\x00\x50\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xf3\x00\x00\x00\x00\x00\x00\x53\x8c\x00\x00\x5d\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x87\x00\x00\x00\x00\x00\x00\x5d\xf8\x00\x00\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x53\xee\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xfa\x54\x4f\x00\x00\x5d\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x47\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xfc\x5d\xfd\x00\x00\x4c\x6f\x00\x00\x00\x00\x5e\x42\x00\x00\x54\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x85\x5e\x43\x00\x00\x00\x00\x4b\xdd\x00\x00\x00\x00\x5d\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x41\x00\x00\x54\xea\x53\x57\x5d\xfe\x47\x42\x00\x00\x54\xa0\x00\x00\x00\x00\x5e\x44\x00\x00\x4c\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x90\x00\x00\x00\x00", /* 7180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x47\x00\x00\x00\x00\x00\x00\x5e\x45\x00\x00\x46\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x46\x00\x00\x00\x00\x00\x00\x00\x00\x52\x9d\x5e\x48\x00\x00\x00\x00\x00\x00\x4f\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xbb\x00\x00\x00\x00\x00\x00\x5e\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x47\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x4d\x00\x00\x00\x00\x5e\x4b\x00\x00\x49\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xf8\x5e\x50\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x53\x00\x00\x4a\x79\x00\x00\x5e\x4e\x00\x00\x5e\x51\x50\x47\x00\x00\x5e\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xfb\x5e\x55\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x66\x54\xce\x5e\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x56\x54\xe6\x57\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x54\x00\x00\x00\x00\x00\x00\x5e\x59\x00\x00\x5e\x57\x5e\x58\x00\x00\x5e\x5a\x5e\x5b", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x5c\x00\x00\x00\x00\x5e\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x5e\x00\x00\x4c\x87\x00\x00\x5e\x60\x5e\x5f\x00\x00\x00\x00\x5e\x61\x00\x00\x5e\x62\x00\x00\x00\x00\x53\xa9\x45\xcc\x00\x00\x00\x00\x00\x00\x50\x96\x5e\x63\x5e\x64\x52\xdd\x4c\x79\x5e\x65\x5e\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x67\x47\x67\x4a\xbd\x00\x00\x00\x00\x5e\x68\x55\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x69\x53\xfc\x00\x00\x49\x73\x00\x00\x55\xb7\x00\x00\x4a\xaf\x00\x00\x50\x9a\x55\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x48\x7b\x00\x00\x46\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x58\x00\x00\x5e\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x46\xa2\x00\x00\x00\x00\x00\x00\x54\x8a\x5e\x6b\x00\x00", /* 7280 */ "\x53\x54\x5e\x6c\x5e\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6f\x00\x00\x00\x00\x00\x00\x5e\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xdc\x00\x00\x5e\x71\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x72\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xc5\x00\x00\x00\x00\x4c\xa7\x00\x00\x5e\x73\x5e\x74\x00\x00\x00\x00\x00\x00\x48\x52\x00\x00\x00\x00\x5e\x79\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x75\x00\x00\x00\x00\x00\x00\x4e\x5a\x5e\x76\x5e\x78\x00\x00\x5e\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x7a\x00\x00\x51\xdb\x00\x00\x5e\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x52\x74\x00\x00\x4e\xcf\x00\x00\x50\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x7d\x5e\x7e\x5e\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x7b\x00\x00\x00\x00\x4a\xdb\x4c\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x80\x52\xfe\x5e\x7f\x00\x00\x00\x00\x50\x6f\x54\xd6\x00\x00\x00\x00", /* 7300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x84\x5e\x81\x00\x00\x00\x00\x00\x00\x4a\x51\x5e\x83\x5e\x85\x00\x00\x4e\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x86\x5e\x8b\x00\x00\x00\x00\x00\x00\x5e\x88\x49\xc5\x4f\xd0\x00\x00\x00\x00\x4f\x45\x5e\x89\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x87\x00\x00\x50\x4f\x53\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x8c\x4c\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x95\x51\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x8e\x5e\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x65\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x92\x00\x00\x5e\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x93\x00\x00\x4d\x61\x00\x00\x00\x00\x5e\x96\x00\x00\x5e\x94\x5e\x95\x00\x00\x51\xcb\x5e\x97\x00\x00\x00\x00\x00\x00\x00\x00", /* 7380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x6e\x00\x00\x00\x00\x47\x83\x00\x00\x45\xfd\x00\x00\x49\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xf9\x5e\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x9c\x00\x00\x5e\x99\x00\x00\x00\x00\x5e\x9d\x00\x00\x4c\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x98\x5e\x9e\x53\x99\x00\x00\x00\x00\x4d\x5d\x5e\x9b\x00\x00\x00\x00\x00\x00\x5e\xa2\x00\x00\x00\x00\x00\x00\x5e\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xa5\x00\x00\x4b\x99\x00\x00\x00\x00\x5e\xa1\x00\x00\x5e\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xb9\x00\x00\x00\x00\x50\x66\x5e\xa3\x00\x00\x00\x00\x5e\xa4\x00\x00\x00\x00\x00\x00\x5e\xa8\x00\x00\x00\x00\x5e\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xb7\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x48\xdb\x00\x00\x5e\xa9\x45\xeb\x5e\xa7\x00\x00\x50\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x5c\x00\x00\x00\x00\x5e\xac\x5e\xaa\x00\x00\x00\x00\x5e\xad\x5e\xab\x00\x00\x00\x00\x00\x00\x5e\xae\x00\x00\x00\x00\x00\x00\x5e\xaf\x54\x53\x4c\xd8\x52\xa3\x52\x9f\x00\x00\x00\x00\x00\x00\x5e\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xb2\x00\x00\x5e\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xb1\x00\x00\x00\x00\x00\x00\x5e\xb4\x53\xf1\x4f\x52\x5e\xb6\x00\x00\x4b\x5b\x5e\xb3\x50\x8c\x00\x00\x5e\xbc\x5e\xb9\x5e\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xb7\x5e\xba\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xbe\x5e\xb8\x00\x00\x00\x00\x51\x88\x00\x00\x00\x00\x68\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xbf\x00\x00", /* 7480 */ "\x00\x00\x00\x00\x00\x00\x52\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xbd\x00\x00\x50\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xc1\x5e\xc0\x00\x00\x00\x00\x5e\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x64\x00\x00\x00\x00\x00\x00\x5e\xc7\x00\x00\x54\x52\x5e\xc8\x00\x00\x00\x00\x49\xc2\x5e\xc9\x00\x00\x5e\xca\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xcb\x00\x00\x5e\xcc\x5e\xce\x5e\xcd\x00\x00\x00\x00\x00\x00\x4c\xd4\x5e\xcf\x5e\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7500 */ "\x00\x00\x5e\xd1\x00\x00\x5e\xd3\x5e\xd2\x5e\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xd6\x5e\xd5\x5e\xd7\x00\x00\x00\x00\x54\x95\x00\x00\x5e\xd8\x00\x00\x53\xe6\x00\x00\x00\x00\x4b\x55\x00\x00\x4b\x66\x00\x00\x52\xa7\x00\x00\x5e\xd9\x45\x99\x00\x00\x00\x00\x00\x00\x45\xc0\x00\x00\x55\xd7\x5e\xda\x00\x00\x45\xb6\x00\x00\x00\x00\x4d\x58\x5e\xdb\x00\x00\x00\x00\x58\xfe\x45\x63\x46\x7c\x48\xa0\x49\x67\x00\x00\x00\x00\x00\x00\x45\x7c\x57\x65\x00\x00\x45\x55\x46\x77\x5e\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xdd\x00\x00\x5e\xe1\x00\x00\x00\x00\x5e\xe0\x5e\xdf\x5b\x7c\x47\xae\x5e\xde\x00\x00\x55\x8f\x00\x00\x47\x8b\x00\x00\x00\x00\x4e\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x47\xab\x5e\xe3\x5e\xe2\x4d\x72\x50\x86\x00\x00\x00\x00\x49\xfe\x00\x00\x55\x9a\x00\x00\x5e\xe4\x4c\xf0\x51\xb4\x5e\xe5\x00\x00\x52\xfd\x48\xb9\x5e\xe6\x00\x00\x5e\xe9\x00\x00\x5e\xe7\x4a\xa9\x00\x00\x00\x00\x4e\x54\x5e\xe8\x00\x00\x5e\xeb\x50\xdd\x5e\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xd4", /* 7580 */ "\x00\x00\x00\x00\x5e\xec\x00\x00\x00\x00\x00\x00\x5e\xed\x5e\xee\x00\x00\x5e\xf0\x5e\xef\x4e\xa0\x00\x00\x00\x00\x51\x71\x55\xb0\x00\x00\x4c\xb4\x00\x00\x00\x00\x5e\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xf2\x00\x00\x00\x00\x5e\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xf5\x00\x00\x5e\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xfd\x4d\x97\x5e\xf7\x00\x00\x5e\xf9\x00\x00\x00\x00\x5e\xfb\x54\xe1\x00\x00\x00\x00\x5e\xfc\x5e\xfa\x51\x42\x00\x00\x00\x00\x00\x00\x5e\xf6\x5e\xf8\x00\x00\x49\xbf\x00\x00\x4e\x4a\x00\x00\x00\x00\x5f\x41\x00\x00\x00\x00\x5e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x42\x00\x00\x51\x82\x53\xfd\x00\x00\x00\x00\x55\x49\x5f\x43\x00\x00\x4c\x47\x00\x00\x00\x00\x5f\x45\x00\x00\x00\x00\x00\x00\x51\x74\x5f\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x4a\x00\x00\x5f\x4c\x5f\x4d\x50\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x4b\x00\x00\x5f\x48\x00\x00\x5f\x46\x5f\x47", /* 7600 */ "\x00\x00\x5f\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x4f\x00\x00\x5f\x4e\x00\x00\x52\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x50\x5f\x52\x5f\x53\x5f\x54\x00\x00\x5f\x55\x00\x00\x54\xa4\x5f\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x57\x00\x00\x00\x00\x00\x00\x5f\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xb7\x00\x00\x00\x00\x00\x00\x5f\x5c\x5f\x59\x5f\x5a\x00\x00\x00\x00\x00\x00\x54\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xaa\x00\x00\x00\x00\x00\x00\x53\x7e\x00\x00\x5f\x5b\x00\x00\x00\x00\x00\x00\x5f\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x5e\x5f\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x62\x5f\x60\x5f\x61\x5f\x63\x00\x00\x5f\x64\x00\x00\x00\x00\x00\x00\x5f\x65\x00\x00\x5f\x66\x00\x00\x00\x00\x00\x00\x5f\x67\x00\x00\x53\x9a\x00\x00\x46\x4b\x46\xe8\x5f\x68\x46\x59\x45\x4b\x00\x00", /* 7680 */ "\x5f\x6a\x00\x00\x5f\x69\x5f\x6b\x45\xef\x00\x00\x4a\xb0\x4c\xbb\x5f\x6c\x00\x00\x00\x00\x5f\x6d\x00\x00\x00\x00\x52\x99\x00\x00\x52\xa4\x00\x00\x00\x00\x4e\x81\x00\x00\x00\x00\x53\x96\x00\x00\x00\x00\x5f\x6e\x5f\x6f\x5f\x72\x5f\x70\x00\x00\x5f\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xda\x00\x00\x5f\x74\x00\x00\x00\x00\x00\x00\x5f\x75\x00\x00\x00\x00\x68\x68\x5f\x76\x5f\x77\x5f\x78\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xc7\x00\x00\x00\x00\x5f\x79\x53\xba\x00\x00\x00\x00\x50\x57\x00\x00\x51\xb5\x00\x00\x47\x74\x00\x00\x00\x00\x5f\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7d\x00\x00\x00\x00\x00\x00\x5f\x7c\x4d\x65\x00\x00\x00\x00\x00\x00\x48\x44\x5c\xc9\x00\x00\x5f\x7e\x4b\x84\x00\x00\x5f\x7f\x00\x00\x49\xe3\x48\x90\x5f\x80\x00\x00\x53\xf7\x00\x00\x00\x00\x5f\x81\x00\x00\x00\x00\x00\x00\x46\x75\x00\x00\x00\x00\x00\x00\x50\x80\x00\x00\x46\x74\x00\x00\x00\x00\x00\x00\x46\x78\x00\x00\x00\x00\x5f\x83\x00\x00\x00\x00\x50\x82\x00\x00", /* 7700 */ "\x00\x00\x48\x47\x00\x00\x00\x00\x5f\x86\x00\x00\x00\x00\x5f\x85\x5f\x84\x52\xbc\x00\x00\x4d\xa2\x45\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x8b\x00\x00\x00\x00\x51\xca\x46\x42\x4e\x6a\x00\x00\x00\x00\x00\x00\x5f\x87\x5f\x89\x5f\x8a\x00\x00\x00\x00\x5f\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x8c\x5f\x8d\x00\x00\x4e\x5f\x00\x00\x49\xa5\x00\x00\x00\x00\x00\x00\x47\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x8e\x5f\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x90\x5f\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x6c\x00\x00\x4a\x73\x00\x00\x5f\x94\x4a\x96\x00\x00\x5f\x91\x00\x00\x00\x00\x5f\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x97\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x96\x5f\x95", /* 7780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x99\x00\x00\x00\x00\x5f\x98\x00\x00\x00\x00\x5f\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x9c\x00\x00\x5f\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x55\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xb0\x52\x7d\x00\x00\x00\x00\x5f\x9d\x00\x00\x00\x00\x4f\x9b\x00\x00\x00\x00\x5f\x9e\x00\x00\x00\x00\x5f\x9f\x00\x00\x5f\xa3\x5f\xa1\x5f\xa2\x00\x00\x5f\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x50\x00\x00\x00\x00\x5f\xa6\x50\xed\x5f\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xc1\x5f\xa8\x00\x00\x45\xb0\x00\x00\x55\xc9\x00\x00\x4e\x4d\x00\x00\x00\x00\x00\x00\x4a\x82\x5f\xa9\x51\xbb\x00\x00\x00\x00\x00\x00\x45\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xab\x00\x00\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x49\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xad\x00\x00\x46\xd3\x4c\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb0\x5f\xae\x00\x00\x00\x00\x00\x00\x4d\x45\x54\xb4\x52\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xc2\x00\x00\x4a\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x84\x4a\xef\x00\x00\x00\x00\x53\x69\x00\x00\x00\x00\x52\xbf\x00\x00\x5f\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb6\x00\x00\x5f\xb9\x00\x00\x00\x00\x00\x00", /* 7880 */ "\x00\x00\x4f\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb7\x51\x95\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xba\x53\x56\x5f\xb5\x00\x00\x00\x00\x51\x7b\x00\x00\x4f\xb1\x00\x00\x52\xd2\x00\x00\x54\x5b\x00\x00\x00\x00\x5f\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xbb\x00\x00\x00\x00\x00\x00\x4d\xf8\x00\x00\x50\x7d\x5f\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x48\x7a\x00\x00\x5f\xc4\x00\x00\x5f\xc3\x00\x00\x00\x00\x4a\x62\x00\x00\x00\x00\x00\x00\x5f\xc5\x5f\xc0\x00\x00\x00\x00\x00\x00\x5f\xc6\x5f\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x9c\x5f\xbf\x00\x00\x00\x00\x5f\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xc8\x49\xb4\x00\x00\x00\x00\x00\x00\x5f\xc7\x00\x00\x00\x00\x48\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xca\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x51\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x9c\x00\x00\x00\x00\x5f\xcd\x4d\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xb9\x00\x00\x00\x00\x00\x00\x51\x4c\x5f\xd0\x5f\xcf\x00\x00\x00\x00\x00\x00\x5f\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x53\x00\x00\x49\x58\x00\x00\x46\x63\x00\x00\x5f\xd3\x53\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x92\x4e\xd8\x4f\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x8c\x00\x00\x00\x00\x55\x5c\x00\x00\x5f\xd8\x4c\xdc\x53\x65\x00\x00\x00\x00\x5f\xd7\x00\x00\x00\x00\x4c\xeb\x45\xa1\x5f\xd6\x5f\xd4\x00\x00\x4f\x89\x00\x00\x00\x00\x49\xf9\x00\x00\x00\x00\x4d\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x53\x00\x00\x00\x00\x52\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xda", /* 7980 */ "\x50\xe7\x4d\x75\x00\x00\x00\x00\x50\xae\x4f\x87\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xdb\x00\x00\x00\x00\x52\x86\x4b\xa7\x45\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xdf\x00\x00\x5f\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xaa\x4f\xd7\x00\x00\x00\x00\x5f\xe0\x00\x00\x00\x00\x00\x00\x54\xf5\x00\x00\x50\xfa\x55\x53\x00\x00\x5f\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6a\x5f\xe2\x00\x00\x00\x00\x55\x5d\x54\x63\x53\xd0\x45\xf1\x46\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xe3\x00\x00\x46\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xed\x4d\xba\x00\x00\x00\x00\x5f\xe4\x00\x00\x00\x00\x4c\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x83\x00\x00\x54\xb5\x00\x00\x5f\xe7\x50\x8f\x00\x00\x4c\x8a\x5f\xe5\x00\x00\x4d\x9f\x00\x00\x00\x00\x5f\xe6\x00\x00\x00\x00\x00\x00\x4b\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x75\x00\x00\x00\x00\x00\x00\x00\x00", /* 7a00 */ "\x52\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xe8\x00\x00\x00\x00\x47\xf4\x00\x00\x5f\xe9\x47\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xfa\x00\x00\x00\x00\x50\x87\x5f\xea\x5f\xeb\x4d\xcf\x00\x00\x52\x96\x00\x00\x00\x00\x5f\xec\x53\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x92\x00\x00\x00\x00\x5f\xed\x47\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xef\x00\x00\x00\x00\x00\x00\x5f\xf0\x4d\xbe\x4f\xc7\x5f\xee\x4f\xd5\x4e\x94\x00\x00\x48\xd4\x5f\xf1\x00\x00\x00\x00\x52\xbe\x00\x00\x00\x00\x5f\xf3\x00\x00\x00\x00\x00\x00\x48\x91\x52\x54\x50\xb8\x50\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf5\x5f\xf4\x4e\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf6\x00\x00\x4f\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf8\x00\x00\x00\x00\x00\x00\x4b\x86\x00\x00\x49\x86\x00\x00\x00\x00\x5f\xf9\x47\x8d\x00\x00\x00\x00\x5f\xfa\x00\x00\x4e\x91", /* 7a80 */ "\x00\x00\x4a\xfd\x00\x00\x51\x69\x54\x99\x00\x00\x00\x00\x00\x00\x5f\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xb0\x4b\xe9\x00\x00\x5f\xfc\x5f\xfe\x60\x41\x5f\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x42\x4a\x65\x00\x00\x00\x00\x00\x00\x50\xaa\x49\xa7\x60\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x44\x00\x00\x00\x00\x00\x00\x55\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x60\x47\x00\x00\x00\x00\x00\x00\x60\x46\x60\x49\x60\x48\x00\x00\x60\x4a\x52\xf0\x00\x00\x60\x4b\x45\xdd\x00\x00\x60\x4c\x00\x00\x60\x4d\x00\x00\x60\x4f\x60\x4e\x60\x51\x00\x00\x60\x50\x00\x00\x00\x00\x00\x00\x60\x52\x60\x53\x00\x00\x49\xe7\x60\x54\x00\x00\x66\xc1\x47\x6e\x60\x55\x60\x56\x54\x6b\x00\x00\x4d\x50\x60\x57\x60\x58\x00\x00\x00\x00\x51\xc8\x60\x5a\x00\x00\x60\x5b\x00\x00\x48\xef\x60\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x71\x00\x00\x60\x5d\x45\xf5\x54\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x52\x87", /* 7b00 */ "\x00\x00\x00\x00\x60\x5e\x00\x00\x54\xd5\x00\x00\x60\x62\x00\x00\x51\xcf\x00\x00\x60\x61\x60\x60\x00\x00\x00\x00\x00\x00\x60\x5f\x00\x00\x49\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xe7\x60\x65\x00\x00\x4f\x41\x00\x00\x00\x00\x60\x66\x00\x00\x47\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x52\xf4\x4f\xd9\x00\x00\x60\x68\x00\x00\x00\x00\x00\x00\x46\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x63\x00\x00\x60\x67\x60\x64\x00\x00\x00\x00\x49\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6c\x4a\xc7\x00\x00\x4d\x9b\x46\xa7\x00\x00\x4b\x8f\x60\x6b\x60\x6a\x00\x00\x52\xf5\x60\x69\x4b\x45\x4b\x7c\x00\x00\x49\xd0\x00\x00\x46\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x84\x00\x00\x50\x48\x00\x00\x00\x00\x00\x00\x00\x00\x53\x4e\x00\x00\x60\x73\x00\x00\x60\x71\x60\x72\x00\x00\x00\x00\x60\x70\x60\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7b80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x9b\x4f\x51\x00\x00\x00\x00\x00\x00\x55\xa4\x00\x00\x60\x77\x00\x00\x60\x7b\x00\x00\x00\x00\x60\x7a\x00\x00\x4e\xe0\x4c\xcc\x00\x00\x48\x43\x60\x75\x60\x7c\x60\x79\x00\x00\x60\x78\x60\x74\x60\x82\x60\x76\x00\x00\x46\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xca\x00\x00\x00\x00\x51\x8d\x00\x00\x00\x00\x00\x00\x4a\xfb\x00\x00\x00\x00\x60\x80\x00\x00\x00\x00\x00\x00\x50\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xa1\x51\xe8\x00\x00\x00\x00\x49\xe8\x00\x00\x60\x81\x4f\xb6\x00\x00\x49\xa8\x00\x00\x60\x7e\x60\x7f\x00\x00\x00\x00\x60\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x83\x00\x00\x00\x00\x48\x75\x00\x00\x00\x00\x00\x00\x4a\xd8\x60\x87\x60\x85\x00\x00\x00\x00\x60\x84\x00\x00\x00\x00\x00\x00\x54\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x8c\x00\x00\x00\x00\x60\x8e\x60\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7c00 */ "\x60\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x8d\x00\x00\x00\x00\x00\x00\x4f\x53\x57\x8a\x60\x8a\x60\x88\x00\x00\x00\x00\x51\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xca\x60\x92\x00\x00\x4b\xec\x00\x00\x60\x8f\x00\x00\x00\x00\x00\x00\x60\x90\x00\x00\x00\x00\x60\x91\x60\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x93\x51\xab\x00\x00\x00\x00\x00\x00\x00\x00\x60\x95\x52\x70\x4f\x4c\x60\x96\x00\x00\x00\x00\x60\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x97\x4d\xfe\x00\x00\x51\xf2\x60\x9a\x00\x00\x00\x00\x00\x00\x4f\x99\x00\x00\x60\x99\x00\x00\x60\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x9c\x4c\xee\x00\x00\x00\x00\x00\x00\x52\xaa\x60\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x6f\x00\x00\x60\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xf0\x00\x00", /* 7c80 */ "\x00\x00\x55\xe7\x4e\x85\x60\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x9e\x00\x00\x4f\xcc\x00\x00\x53\xc9\x00\x00\x00\x00\x60\xa1\x00\x00\x4c\xa9\x00\x00\x00\x00\x4c\x4b\x00\x00\x4d\x59\x4b\xf7\x00\x00\x00\x00\x4f\xc8\x00\x00\x00\x00\x00\x00\x4b\xfb\x00\x00\x60\xa5\x60\xa3\x00\x00\x60\xa2\x52\xab\x00\x00\x4b\xd4\x60\xa7\x00\x00\x00\x00\x60\xa4\x00\x00\x60\xa6\x60\xab\x00\x00\x00\x00\x60\xaa\x60\xa9\x60\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xac\x00\x00\x00\x00\x00\x00\x60\xae\x46\x6c\x00\x00\x51\xbc\x00\x00\x60\xb0\x00\x00\x00\x00\x60\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x54\x71\x00\x00\x00\x00\x00\x00\x51\x60\x00\x00\x00\x00\x00\x00\x60\xb1\x00\x00\x00\x00\x00\x00\x48\x84\x00\x00\x60\xb3\x00\x00\x00\x00\x00\x00\x60\xb4\x00\x00\x54\x92\x51\x8c\x51\x4b\x00\x00\x60\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xb5\x00\x00\x00\x00\x60\xb6\x00\x00\x60\xb7\x00\x00\x60\xb8\x00\x00\x46\xc7\x00\x00\x52\xc2\x48\xfa\x00\x00\x00\x00\x51\xfe\x00\x00", /* 7d00 */ "\x46\xdb\x00\x00\x60\xba\x00\x00\x47\xbd\x4b\x67\x60\xb9\x00\x00\x00\x00\x00\x00\x60\xbd\x4c\xf9\x00\x00\x49\xe2\x00\x00\x00\x00\x4f\xb5\x00\x00\x00\x00\x00\x00\x47\xa6\x60\xbc\x00\x00\x4f\x47\x4c\x78\x46\x80\x49\xf3\x4f\xf3\x60\xbb\x00\x00\x00\x00\x00\x00\x47\x9f\x48\x77\x4c\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xf0\x55\x92\x00\x00\x60\xc0\x51\x48\x47\x68\x00\x00\x60\xc1\x4e\x59\x00\x00\x60\xc3\x00\x00\x00\x00\x00\x00\x4c\xe4\x4c\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x60\xc2\x00\x00\x00\x00\x49\xf4\x55\x63\x46\xb9\x60\xbe\x60\xc5\x00\x00\x60\xc4\x00\x00\x00\x00\x60\xbf\x46\x88\x00\x00\x60\xc9\x60\xcc\x46\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x60\xd0\x60\xc6\x00\x00\x50\x6d\x00\x00\x00\x00\x4c\xe7\x4e\xf7\x60\xcd\x00\x00\x00\x00\x47\x57\x00\x00\x60\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xcb\x00\x00\x00\x00\x48\x81\x52\x68\x60\xc7\x00\x00\x4a\xe4\x4a\xf3\x00\x00\x00\x00\x49\xf6\x00\x00\x00\x00\x00\x00\x54\xed\x00\x00\x00\x00", /* 7d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x74\x00\x00\x00\x00\x00\x00\x60\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x4a\x47\xcb\x54\xeb\x50\x70\x00\x00\x00\x00\x60\xdc\x60\xda\x00\x00\x60\xd8\x60\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xd7\x51\xa3\x48\x80\x60\xd1\x60\xd9\x60\xdd\x48\xcb\x4a\x53\x00\x00\x4d\xc9\x60\xd3\x00\x00\x60\xd4\x60\xdb\x00\x00\x54\xd3\x54\xa6\x00\x00\x60\xd6\x49\xdc\x48\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xd5\x00\x00\x00\x00\x4b\x97\x53\x7d\x00\x00\x00\x00\x00\x00\x47\x93\x00\x00\x48\xa5\x4a\x9b\x00\x00\x00\x00\x60\xde\x60\xe1\x00\x00\x60\xdf\x00\x00\x46\x87\x00\x00\x60\xe8\x60\xe0\x60\xe3\x00\x00\x4a\x80\x60\xe7\x00\x00\x00\x00\x60\xe2\x00\x00\x00\x00\x00\x00\x48\x4e\x4c\xfc\x00\x00\x00\x00\x55\x6b\x00\x00\x00\x00\x4e\x9a\x00\x00\x00\x00\x60\xe6\x00\x00\x48\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe4\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x4b\xaa\x00\x00\x00\x00\x48\x59\x60\xe9\x00\x00\x00\x00\x00\x00\x60\xee\x60\xea\x60\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xe6\x00\x00\x00\x00\x4f\x6b\x60\xed\x00\x00\x60\xeb\x5b\xcc\x55\xa8\x00\x00\x00\x00\x4e\x93\x00\x00\x00\x00\x00\x00\x00\x00\x49\xe4\x00\x00\x00\x00\x49\xf7\x00\x00\x00\x00\x60\xf2\x60\xf9\x00\x00\x00\x00\x60\xf4\x00\x00\x60\xf8\x00\x00\x60\xf6\x60\xef\x60\xf5\x00\x00\x60\xf3\x48\x66\x00\x00\x00\x00\x47\x59\x00\x00\x60\xf7\x00\x00\x00\x00\x60\xf0\x00\x00\x60\xf1\x00\x00\x48\x68\x53\x73\x00\x00\x52\xda\x00\x00\x00\x00\x00\x00\x00\x00\x60\xfd\x00\x00\x48\x9a\x51\xd4\x60\xfb\x00\x00\x00\x00\x60\xfe\x61\x41\x00\x00\x00\x00\x60\xfa\x60\xfc\x00\x00\x00\x00\x52\xda\x00\x00\x00\x00\x00\x00\x00\x00\x60\xf1\x61\x42\x00\x00\x61\x45\x61\x44\x53\x73\x00\x00\x4d\x9a\x00\x00\x00\x00\x4b\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x43\x00\x00\x61\x47\x61\x46\x61\x48\x00\x00\x61\x4a", /* 7e80 */ "\x00\x00\x00\x00\x55\xeb\x61\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x52\x78\x61\x4c\x51\xbf\x00\x00\x61\x4e\x00\x00\x61\x4d\x55\xfa\x52\x73\x00\x00\x61\x4f\x61\x50\x61\x51\x00\x00\x61\x52\x00\x00\x00\x00\x00\x00\x00\x00\x61\x53\x53\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x84\x00\x00\x61\x54\x00\x00\x61\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x56\x00\x00\x61\x57\x00\x00\x00\x00\x00\x00\x00\x00\x61\x58\x54\xcb\x61\x59\x00\x00\x51\x6e\x61\x5a\x00\x00\x00\x00\x61\x5c\x61\x5b\x00\x00\x00\x00\x61\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x5e\x61\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x61\x61\x60\x61\x62\x4c\x4e\x55\xef\x00\x00\x00\x00\x46\x8c\x00\x00\x4f\x82\x00\x00\x4c\x99\x00\x00\x00\x00\x55\x79\x00\x00\x55\xa5\x61\x63\x5a\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7f80 */ "\x00\x00\x00\x00\x61\x64\x61\x66\x00\x00\x4d\xfa\x61\x65\x61\x67\x61\x68\x00\x00\x4a\xd1\x00\x00\x61\x69\x00\x00\x45\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x6d\x00\x00\x00\x00\x61\x6c\x61\x6b\x00\x00\x00\x00\x61\x6e\x00\x00\x61\x6f\x47\xb1\x00\x00\x00\x00\x00\x00\x55\x96\x45\x98\x00\x00\x00\x00\x00\x00\x00\x00\x61\x71\x61\x70\x00\x00\x00\x00\x61\x72\x00\x00\x00\x00\x00\x00\x61\x74\x00\x00\x61\x75\x61\x73\x00\x00\x00\x00\x00\x00\x47\x8f\x00\x00\x00\x00\x00\x00\x4f\xfb\x00\x00\x00\x00\x00\x00\x61\x78\x61\x79\x00\x00\x00\x00\x00\x00\x61\x7a\x00\x00\x4d\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x69\x00\x00\x54\xf9\x61\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x69\x61\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x61\x7d\x00\x00\x00\x00\x61\x7e\x00\x00\x55\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x54\xb6\x00\x00\x00\x00\x61\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x80\x00\x00\x51\xf6\x4d\xb5\x00\x00\x00\x00\x00\x00", /* 8000 */ "\x52\xa0\x49\x85\x00\x00\x47\x60\x61\x81\x46\x70\x53\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x61\x82\x51\xe6\x00\x00\x00\x00\x00\x00\x49\x8e\x00\x00\x61\x83\x00\x00\x00\x00\x49\x9a\x00\x00\x4f\xec\x54\xe4\x61\x84\x00\x00\x00\x00\x61\x85\x00\x00\x00\x00\x00\x00\x00\x00\x61\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xab\x00\x00\x00\x00\x4e\x99\x00\x00\x00\x00\x00\x00\x00\x00\x61\x89\x00\x00\x55\xb8\x00\x00\x61\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x8b\x00\x00\x00\x00\x00\x00\x61\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x8c\x00\x00\x00\x00\x00\x00\x4b\xb5\x00\x00\x61\x8d\x00\x00\x54\x79\x00\x00\x00\x00\x00\x00\x48\xbb\x61\x8e\x00\x00\x4b\x89\x61\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xca\x61\x93\x00\x00\x61\x92\x61\x91\x4d\xa8\x00\x00\x61\x94\x48\xd7\x00\x00\x61\x95\x00\x00\x00\x00\x00\x00\x61\x96\x53\xe4\x61\x97", /* 8080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x61\x98\x61\x99\x53\xb6\x4b\x41\x00\x00\x4a\x42\x00\x00\x55\x7f\x4e\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x9a\x00\x00\x00\x00\x52\x67\x00\x00\x52\x6a\x00\x00\x61\x9b\x52\x92\x00\x00\x4c\x8c\x00\x00\x00\x00\x00\x00\x4c\xc5\x53\x82\x00\x00\x00\x00\x49\x7b\x00\x00\x00\x00\x00\x00\x4b\x79\x4c\xfb\x00\x00\x61\x9e\x61\x9c\x00\x00\x50\xeb\x00\x00\x52\xd5\x48\xac\x00\x00\x54\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xf6\x61\xa3\x00\x00\x4e\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xb2\x00\x00\x52\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x88\x00\x00\x00\x00\x61\xa1\x61\xa4\x61\x9f\x00\x00\x61\xa2\x50\xb6\x00\x00\x00\x00\x4d\x63\x00\x00\x00\x00\x4e\xe9\x61\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xa6\x00\x00\x61\xa7\x00\x00\x00\x00\x4e\xab\x00\x00\x00\x00\x00\x00\x4b\xe3\x00\x00\x00\x00\x00\x00\x61\xb0\x47\x4f\x00\x00\x00\x00", /* 8100 */ "\x00\x00\x00\x00\x48\x74\x00\x00\x00\x00\x50\x51\x55\xec\x47\xe3\x50\x79\x61\xa5\x53\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5c\x61\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xaa\x00\x00\x4a\xb4\x00\x00\x4c\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x61\xad\x00\x00\x00\x00\x61\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x61\xac\x00\x00\x00\x00\x00\x00\x00\x00\x61\xab\x00\x00\x00\x00\x52\xc4\x00\x00\x4d\x62\x61\xaf\x00\x00\x61\xae\x52\x47\x4c\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb3\x61\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x51\xce\x00\x00\x00\x00\x61\xb2\x00\x00\x4b\xa4\x61\xb1\x00\x00\x00\x00\x61\xb6\x00\x00\x00\x00\x00\x00\x4d\xb6\x4c\xa0\x52\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x52\x9a", /* 8180 */ "\x61\xba\x00\x00\x61\xbb\x61\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb8\x00\x00\x61\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd8\x00\x00\x00\x00\x00\x00\x61\xbf\x00\x00\x61\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x51\x91\x00\x00\x4d\x8a\x50\x60\x00\x00\x00\x00\x61\xbc\x00\x00\x00\x00\x61\xbe\x61\xc1\x00\x00\x00\x00\x00\x00\x4e\xf6\x61\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xc4\x00\x00\x00\x00\x50\x76\x00\x00\x61\xc0\x00\x00\x00\x00\x61\xc3\x00\x00\x61\xca\x00\x00\x00\x00\x61\xc7\x61\xc6\x53\x5f\x61\xc8\x00\x00\x61\xc9\x00\x00\x00\x00\x00\x00\x54\x74\x00\x00\x61\xc5\x61\xcb\x00\x00\x00\x00\x00\x00\x61\xcc\x00\x00\x00\x00\x00\x00\x61\xcd\x00\x00\x4d\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x61\xce\x61\xcf\x61\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x61\xd1\x61\xd2\x00\x00\x00\x00\x4a\x47\x00\x00\x53\x8a\x00\x00\x51\x73\x4c\xd0\x00\x00\x45\xc3\x00\x00\x00\x00\x4d\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x48\x4c\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xd3\x61\xd4\x4a\x89\x00\x00\x61\xd5\x00\x00", /* 8200 */ "\x00\x00\x61\xd6\x61\xd7\x00\x00\x00\x00\x61\xd8\x00\x00\x53\x58\x46\x6a\x57\x78\x62\xba\x00\x00\x50\x94\x61\xd9\x4c\x58\x00\x00\x61\xda\x00\x00\x61\xdb\x00\x00\x00\x00\x00\x00\x61\xdc\x4e\x5b\x4c\xaa\x00\x00\x00\x00\x4f\xc1\x4f\xb8\x00\x00\x4a\x63\x4b\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xdd\x48\x9f\x61\xde\x49\x56\x00\x00\x61\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x61\xe1\x00\x00\x54\xdb\x4b\x87\x53\xac\x61\xe0\x46\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xae\x61\xe3\x61\xe4\x00\x00\x00\x00\x61\xe5\x00\x00\x61\xe6\x00\x00\x00\x00\x61\xe8\x00\x00\x61\xe7\x00\x00\x4c\x4a\x00\x00\x61\xe9\x00\x00\x61\xea\x61\xeb\x00\x00\x00\x00\x55\xb4\x45\xc4\x00\x00\x61\xec\x47\xc3\x00\x00\x00\x00\x00\x00\x4d\x54\x61\xed\x53\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xee\x00\x00", /* 8280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x9a\x00\x00\x61\xef\x00\x00\x00\x00\x00\x00\x00\x00\x61\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xbd\x00\x00\x00\x00\x00\x00\x49\x72\x00\x00\x61\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x7b\x4a\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x61\xf1\x61\xf4\x54\x42\x00\x00\x4f\xe5\x00\x00\x46\xd9\x00\x00\x46\x83\x00\x00\x00\x00\x00\x00\x00\x00\x49\x53\x4d\xd0\x00\x00\x61\xf3\x00\x00\x4e\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x4b\x61\xf9\x55\x59\x52\xd7\x00\x00\x00\x00\x4a\xb8\x00\x00\x62\x46\x00\x00\x53\x77\x62\x43\x00\x00\x62\x41\x61\xf7\x00\x00\x61\xf5\x00\x00\x61\xf6\x00\x00\x46\xd6\x4a\x5f\x54\xb0\x00\x00\x00\x00\x00\x00\x4d\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xee\x00\x00\x61\xfb\x61\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x61\xfe\x62\x44\x61\xfd\x00\x00\x00\x00\x00\x00\x00\x00", /* 8300 */ "\x00\x00\x61\xf8\x46\x46\x61\xfc\x54\x7a\x4b\xd3\x62\x42\x00\x00\x00\x00\x62\x45\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x4a\x53\xf6\x62\x52\x00\x00\x00\x00\x00\x00\x50\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x58\x00\x00\x00\x00\x00\x00\x00\x00\x47\x4c\x00\x00\x00\x00\x62\x51\x00\x00\x00\x00\x00\x00\x62\x50\x00\x00\x62\x4b\x54\x7b\x00\x00\x62\x49\x62\x47\x49\x77\x00\x00\x4d\xf7\x62\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x62\x4f\x53\xb3\x00\x00\x00\x00\x48\x42\x53\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x51\x5f\x62\x4e\x00\x00\x46\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5f\x00\x00\x62\x5a\x00\x00\x4b\xa1\x00\x00\x00\x00\x00\x00\x49\xe0\x62\x5d\x00\x00\x00\x00\x62\x5b", /* 8380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x62\x00\x00\x54\x86\x00\x00\x62\x63\x62\x5c\x00\x00\x00\x00\x00\x00\x62\x59\x00\x00\x00\x00\x00\x00\x00\x00\x62\x60\x00\x00\x00\x00\x62\x57\x00\x00\x00\x00\x00\x00\x62\x53\x00\x00\x00\x00\x00\x00\x51\xee\x62\x55\x62\x61\x00\x00\x62\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x64\x00\x00\x62\x54\x54\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xc9\x00\x00\x00\x00\x00\x00\x62\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x75\x00\x00\x00\x00\x00\x00\x62\x6e\x00\x00\x00\x00\x00\x00\x47\x53\x00\x00\x62\x67\x00\x00\x00\x00\x46\xd7\x00\x00\x4c\x73\x00\x00\x62\x68\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x51\x00\x00\x00\x00\x51\x80\x00\x00\x62\x6c\x00\x00\x00\x00\x00\x00\x4b\xa8\x00\x00\x00\x00\x53\xd4\x62\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x6a\x00\x00\x54\xe9\x00\x00\x00\x00\x00\x00\x4b\x6c\x51\x6d\x48\xcc\x62\x71\x00\x00\x62\x65\x00\x00\x62\x74\x62\x69\x00\x00\x00\x00\x00\x00\x62\x76\x00\x00\x62\x6a\x00\x00\x00\x00", /* 8400 */ "\x00\x00\x00\x00\x00\x00\x62\x6b\x54\xf7\x00\x00\x00\x00\x62\x6f\x00\x00\x00\x00\x52\xc9\x62\x6d\x50\xdb\x62\x72\x54\x82\x00\x00\x00\x00\x00\x00\x00\x00\x62\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x73\x00\x00\x54\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x4a\x62\x77\x00\x00\x4b\x75\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x7c\x00\x00\x00\x00\x00\x00\x62\x85\x00\x00\x00\x00\x62\x84\x00\x00\x00\x00\x00\x00\x62\x79\x47\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x82\x00\x00\x62\x7e\x45\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x55\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x59\x00\x00\x00\x00\x00\x00\x48\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x47\x62\x78\x50\x71\x00\x00\x00\x00\x4e\x72\x00\x00\x00\x00\x62\x81\x00\x00\x62\x7c\x4f\x79\x51\x6c\x62\x7f\x62\x83\x00\x00\x54\x4e\x00\x00\x00\x00\x00\x00\x50\xd9\x00\x00\x62\x7b\x00\x00\x62\x7d\x50\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8480 */ "\x00\x00\x00\x00\x62\x80\x00\x00\x62\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x93\x00\x00\x00\x00\x00\x00\x4f\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x50\x95\x00\x00\x00\x00\x52\x59\x00\x00\x00\x00\x62\x89\x00\x00\x62\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x90\x00\x00\x00\x00\x00\x00\x00\x00\x49\xb2\x00\x00\x62\x8a\x00\x00\x00\x00\x00\x00\x4a\xba\x62\x87\x00\x00\x62\x8c\x50\xb9\x00\x00\x00\x00\x62\x88\x00\x00\x62\x8f\x00\x00\x00\x00\x4c\x94\x00\x00\x62\x91\x00\x00\x00\x00\x50\x83\x62\x86\x4f\x6d\x00\x00\x62\x8b\x00\x00\x00\x00\x62\x8e\x4f\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x62\x92\x00\x00\x00\x00\x62\x94\x62\x8d\x00\x00\x52\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x88\x00\x00\x4b\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x8b\x00\x00\x00\x00\x62\x95", /* 8500 */ "\x52\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x6c\x00\x00\x55\x7b\x62\x9c\x62\x9b\x00\x00\x62\x97\x62\x98\x00\x00\x54\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x62\x9a\x00\x00\x54\xa8\x00\x00\x53\xf8\x00\x00\x00\x00\x4f\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x99\x4e\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xd1\x00\x00\x00\x00\x62\xa0\x62\xa5\x00\x00\x52\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x62\xa4\x53\xa8\x62\xa6\x62\xa7\x00\x00\x00\x00\x55\x65\x00\x00\x00\x00\x00\x00\x00\x00\x62\x9e\x00\x00\x62\xa9\x00\x00\x54\x91\x62\xa3\x62\xa1\x62\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x50\xde\x54\xf0\x51\xd3\x62\xa8\x00\x00\x62\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xb7\x00\x00", /* 8580 */ "\x62\xaa\x00\x00\x00\x00\x00\x00\x4a\x92\x00\x00\x00\x00\x62\xb4\x62\xac\x00\x00\x62\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xb8\x62\xad\x00\x00\x00\x00\x62\xb1\x00\x00\x00\x00\x4c\xec\x00\x00\x51\xad\x00\x00\x62\xb2\x62\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xab\x00\x00\x4f\xbf\x00\x00\x62\xaf\x4c\xf1\x54\x5a\x49\x98\x46\xe1\x00\x00\x62\xb3\x53\xf9\x62\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xbf\x62\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xbc\x00\x00\x00\x00\x00\x00\x4e\xed\x00\x00\x62\xbe\x62\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x62\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xc4\x62\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x68\x62\xc3\x00\x00\x00\x00\x00\x00\x4f\xf6\x4c\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xe2\x00\x00\x62\xc5\x53\xed\x50\x5f\x00\x00\x00\x00\x62\xc9\x00\x00", /* 8600 */ "\x00\x00\x00\x00\x54\x96\x00\x00\x00\x00\x00\x00\x4e\xda\x4c\xbf\x00\x00\x00\x00\x62\xc6\x62\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xc7\x00\x00\x00\x00\x5c\xbd\x5c\xbe\x00\x00\x00\x00\x62\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xa6\x00\x00\x5f\x82\x62\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xcf\x4a\xab\x00\x00\x52\x60\x00\x00\x00\x00\x00\x00\x52\xfb\x62\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x72\x00\x00\x52\x50\x00\x00\x55\x88\x62\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd3\x00\x00\x00\x00\x00\x00\x4b\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xb6\x00\x00\x51\x44\x00\x00\x00\x00\x00\x00\x00\x00", /* 8680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xaa\x62\xd8\x62\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd5\x00\x00\x4f\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd6\x55\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd7\x62\xd9\x62\xe3\x00\x00\x00\x00\x00\x00\x62\xdc\x62\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xdd\x00\x00\x62\xde\x4f\xea\x00\x00\x62\xe0\x00\x00\x53\xd8\x00\x00\x4d\xf9\x62\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x55\xbb\x00\x00\x62\xe9\x00\x00\x00\x00\x62\xe5\x62\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x55\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x62\xe6\x00\x00\x00\x00\x62\xe7\x4e\x66\x53\xa5\x4f\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x4e\x62\xf3\x00\x00\x62\xef\x00\x00\x00\x00\x55\x99\x00\x00", /* 8700 */ "\x62\xed\x00\x00\x4e\xcd\x62\xee\x00\x00\x00\x00\x62\xeb\x00\x00\x62\xec\x62\xf1\x62\xf4\x00\x00\x00\x00\x62\xf2\x00\x00\x00\x00\x00\x00\x62\xf0\x62\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xdc\x00\x00\x62\xfa\x00\x00\x53\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xf8\x00\x00\x00\x00\x00\x00\x62\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xf5\x00\x00\x00\x00\x52\x6d\x00\x00\x00\x00\x00\x00\x62\xf7\x00\x00\x00\x00\x00\x00\x62\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xe8\x00\x00\x52\xa1\x62\xfd\x00\x00\x62\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x63\x49\x00\x00\x53\x47\x00\x00\x63\x42\x00\x00\x63\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xfb\x63\x46\x00\x00\x00\x00\x63\x4a\x00\x00\x00\x00\x51\xc3\x00\x00\x63\x43\x00\x00\x63\x45\x00\x00\x00\x00\x00\x00\x63\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x41\x00\x00\x4e\x6e\x00\x00\x62\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4b", /* 8780 */ "\x00\x00\x00\x00\x63\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4e\x00\x00\x00\x00\x63\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x55\x00\x00\x00\x00\x00\x00\x63\x4f\x00\x00\x00\x00\x00\x00\x63\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd6\x63\x59\x00\x00\x63\x51\x00\x00\x00\x00\x63\x52\x00\x00\x00\x00\x00\x00\x63\x56\x00\x00\x63\x4d\x54\xf4\x00\x00\x00\x00\x00\x00\x63\x50\x00\x00\x00\x00\x00\x00\x00\x00\x63\x53\x00\x00\x63\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xe8\x00\x00\x00\x00\x63\x5a\x00\x00\x00\x00\x63\x5b\x00\x00\x00\x00\x00\x00\x63\x63\x63\x64\x00\x00\x50\x90\x00\x00\x51\xc6\x00\x00\x00\x00\x63\x62\x00\x00", /* 8800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xbd\x00\x00\x63\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x61\x63\x5d\x63\x5f\x00\x00\x63\x65\x00\x00\x00\x00\x00\x00\x63\x66\x63\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xa1\x00\x00\x63\x68\x63\x67\x53\x51\x00\x00\x00\x00\x00\x00\x63\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x63\x6b\x00\x00\x00\x00\x63\x6c\x00\x00\x63\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x43\x00\x00\x63\x6e\x00\x00\x63\x6f\x00\x00\x4b\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xa4\x63\x70\x00\x00\x00\x00\x00\x00\x00\x00\x63\x71\x48\x6c\x00\x00\x00\x00\x00\x00\x4b\xa5\x00\x00\x63\x72\x00\x00\x47\x80\x00\x00\x4d\xa5\x63\x73\x00\x00\x00\x00\x4b\xed\x63\x74\x4a\xea\x00\x00\x00\x00\x00\x00\x00\x00\x46\xc0\x00\x00\x00\x00\x63\x75\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x54\x00\x00\x63\x7a\x00\x00\x00\x00\x63\x78\x00\x00\x52\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x79\x63\x77\x4a\xa7", /* 8880 */ "\x00\x00\x63\x76\x63\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x6a\x00\x00\x00\x00\x4a\x54\x00\x00\x63\x82\x00\x00\x00\x00\x00\x00\x00\x00\x63\x7e\x00\x00\x00\x00\x00\x00\x4a\x57\x63\x7d\x00\x00\x63\x80\x00\x00\x00\x00\x00\x00\x00\x00\x63\x7c\x00\x00\x00\x00\x00\x00\x63\x81\x00\x00\x63\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x8d\x00\x00\x00\x00\x63\x7f\x00\x00\x54\xc5\x63\x86\x00\x00\x00\x00\x4f\x5a\x63\x85\x00\x00\x54\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x84\x00\x00\x49\xbd\x4f\x60\x63\x87\x63\x88\x48\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x63\x89\x46\xf8\x00\x00\x00\x00\x63\x8a\x63\x8b\x00\x00\x00\x00\x49\x6a\x63\x8c\x00\x00\x4f\x8a\x00\x00\x54\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x92\x4f\xa8\x53\x49\x63\x90\x00\x00\x00\x00\x4f\x43\x63\x8d\x00\x00\x00\x00\x63\x8f\x45\x7b\x4c\x8d\x00\x00", /* 8900 */ "\x00\x00\x00\x00\x63\x8e\x00\x00\x63\x93\x00\x00\x00\x00\x4b\x51\x00\x00\x00\x00\x63\x97\x00\x00\x63\x94\x00\x00\x00\x00\x00\x00\x54\x5e\x00\x00\x51\xba\x63\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xda\x63\x96\x63\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x63\x95\x63\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x9e\x00\x00\x63\xa0\x00\x00\x00\x00\x63\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x9c\x00\x00\x63\x9f\x50\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xa2\x63\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xa4\x54\xaf\x63\xa3\x00\x00\x00\x00\x00\x00\x63\xa7\x00\x00\x63\xa5\x00\x00\x00\x00\x00\x00\x63\xa6\x00\x00\x00\x00\x63\xa8\x00\x00\x63\xa9\x00\x00\x00\x00\x4d\xdf\x00\x00\x63\xaa\x00\x00\x00\x00\x63\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xac\x45\x58", /* 8980 */ "\x00\x00\x46\x55\x00\x00\x63\xad\x00\x00\x00\x00\x4d\xf2\x4b\xfa\x63\xae\x00\x00\x63\xaf\x45\xbb\x00\x00\x00\x00\x00\x00\x46\xfb\x00\x00\x00\x00\x00\x00\x63\xb0\x00\x00\x00\x00\x4a\x50\x53\xeb\x63\xb1\x00\x00\x4a\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x63\xb4\x4e\xd0\x00\x00\x63\xb3\x48\x85\x00\x00\x63\xb5\x00\x00\x00\x00\x63\xb6\x00\x00\x00\x00\x63\xb7\x48\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xb8\x00\x00\x00\x00\x63\xba\x00\x00\x63\xb9\x63\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xbc\x00\x00\x53\x60\x63\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xb7\x00\x00\x00\x00\x4c\xd1\x63\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xbf\x00\x00\x00\x00\x00\x00\x63\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8a00 */ "\x47\x9a\x00\x00\x4f\xc4\x63\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x45\xc9\x00\x00\x50\xf2\x00\x00\x63\xc4\x00\x00\x49\xd2\x00\x00\x63\xc3\x00\x00\x63\xc5\x4b\xc8\x00\x00\x00\x00\x63\xc2\x4a\xb6\x47\x94\x00\x00\x00\x00\x63\xc6\x00\x00\x63\xc7\x00\x00\x50\xef\x00\x00\x00\x00\x00\x00\x54\xcc\x00\x00\x63\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x71\x00\x00\x00\x00\x45\xe2\x00\x00\x00\x00\x00\x00\x4a\x9a\x00\x00\x4b\xad\x4c\xdf\x00\x00\x63\xc9\x63\xcb\x00\x00\x00\x00\x4d\x68\x4f\x66\x49\xba\x00\x00\x00\x00\x00\x00\x00\x00\x63\xca\x00\x00\x00\x00\x00\x00\x00\x00\x63\xce\x00\x00\x63\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x76\x55\xe3\x63\xcd\x00\x00\x4f\x88\x49\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xcc\x00\x00\x00\x00\x4e\x90\x00\x00\x51\xc1\x00\x00\x63\xd3\x54\xfb\x00\x00\x00\x00\x49\x48\x00\x00\x00\x00\x4c\xb0\x00\x00\x50\xd3\x63\xd2\x63\xd1\x51\x8e\x00\x00\x4b\x5f\x47\x50\x4d\x8d\x4d\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xd4\x00\x00\x00\x00\x63\xd0\x00\x00\x00\x00\x00\x00", /* 8a80 */ "\x00\x00\x00\x00\x63\xd6\x00\x00\x63\xd7\x63\xd5\x00\x00\x4e\xb4\x00\x00\x4d\x8c\x00\x00\x00\x00\x4b\x76\x4a\x7e\x00\x00\x00\x00\x00\x00\x63\xda\x00\x00\x4f\xa0\x00\x00\x4f\xa2\x00\x00\x00\x00\x4a\xcb\x00\x00\x63\xdd\x00\x00\x00\x00\x00\x00\x48\xe7\x00\x00\x46\xfd\x63\xd9\x00\x00\x63\xde\x4d\x91\x63\xdb\x63\xdc\x63\xdf\x63\xd8\x00\x00\x00\x00\x00\x00\x49\x52\x4a\x4f\x00\x00\x00\x00\x4b\x83\x00\x00\x49\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xf2\x00\x00\x00\x00\x52\x65\x00\x00\x63\xe1\x46\x89\x00\x00\x00\x00\x63\xe3\x00\x00\x50\xb2\x00\x00\x00\x00\x49\x63\x00\x00\x00\x00\x00\x00\x4a\xe8\x63\xe0\x63\xe2\x00\x00\x4b\xc1\x00\x00\x00\x00\x51\x81\x00\x00\x00\x00\x00\x00\x48\xf3\x00\x00\x00\x00\x00\x00\x63\xe4\x63\xf2\x55\x70\x00\x00\x63\xf1\x63\xed\x63\xea\x63\xec\x63\xeb\x00\x00\x63\xe7\x00\x00\x52\x46\x63\xe6\x00\x00\x00\x00\x00\x00\x4e\x96\x00\x00\x4e\x9c\x4f\x9c\x00\x00\x00\x00\x63\xe8\x00\x00\x63\xe5\x00\x00\x00\x00\x63\xef\x63\xf0\x47\xe2\x00\x00\x55\xab\x00\x00\x00\x00\x00\x00\x4f\xe1\x00\x00", /* 8b00 */ "\x4f\x4d\x54\xe5\x55\x73\x00\x00\x4f\xe2\x00\x00\x00\x00\x63\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x63\xf3\x00\x00\x52\xf9\x00\x00\x63\xf7\x00\x00\x00\x00\x00\x00\x63\xe9\x00\x00\x63\xf6\x63\xf8\x00\x00\x49\x7c\x63\xf5\x4a\x6e\x00\x00\x4d\xbb\x00\x00\x00\x00\x63\xf9\x4d\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x63\xfd\x00\x00\x53\x81\x00\x00\x00\x00\x63\xfe\x55\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x87\x00\x00\x00\x00\x00\x00\x00\x00\x64\x41\x00\x00\x00\x00\x63\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x46\x00\x00\x00\x00\x64\x42\x00\x00\x64\x44\x64\x43\x00\x00\x00\x00\x00\x00\x64\x45\x00\x00\x00\x00\x64\x47\x00\x00\x4a\x75\x00\x00\x64\x49\x64\x48\x4e\x4f\x00\x00\x00\x00\x64\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x64\x4b\x64\x4d\x00\x00\x00\x00\x64\x4e\x47\x81\x61\x76\x4b\x7b\x00\x00\x64\x4a\x00\x00\x00\x00\x49\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x4f\x00\x00\x64\x50", /* 8b80 */ "\x64\x51\x00\x00\x00\x00\x51\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x88\x00\x00\x64\x52\x00\x00\x64\x53\x00\x00\x53\xfe\x00\x00\x64\x55\x64\x56\x00\x00\x00\x00\x64\x57\x00\x00\x00\x00\x64\x54\x64\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x81\x00\x00\x00\x00\x64\x59\x00\x00\x00\x00\x00\x00\x00\x00\x64\x5b\x00\x00\x64\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x99\x00\x00\x64\x5c\x00\x00\x46\x48\x00\x00\x64\x5d\x00\x00\x64\x5e\x00\x00\x64\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x64\x60\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x94\x64\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x68\x53\x55\x64\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x63\x55\x93\x64\x64\x00\x00\x64\x65\x00\x00\x00\x00\x00\x00", /* 8c80 */ "\x00\x00\x00\x00\x64\x66\x00\x00\x00\x00\x64\x68\x00\x00\x00\x00\x00\x00\x64\x67\x64\x69\x00\x00\x50\x64\x64\x6a\x64\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x6d\x00\x00\x00\x00\x00\x00\x64\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x49\xea\x46\xb6\x00\x00\x49\xc8\x49\xaf\x4a\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xa3\x4a\xeb\x4a\x5d\x64\x70\x49\xa1\x4b\xd2\x64\x6f\x64\x71\x4c\x62\x4d\xef\x00\x00\x64\x73\x64\x74\x48\x7f\x00\x00\x64\x76\x49\x74\x4a\xf4\x00\x00\x00\x00\x46\xd0\x50\x7b\x64\x72\x00\x00\x48\x72\x46\x41\x64\x75\x55\xf8\x4b\x4d\x50\x67\x00\x00\x00\x00\x46\x50\x64\x77\x00\x00\x4f\xfd\x00\x00\x00\x00\x64\x79\x64\x78\x00\x00\x00\x00\x53\x9e\x00\x00\x50\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7b\x4d\xee\x4f\x94\x00\x00\x4a\xad\x00\x00\x4f\x4f\x00\x00\x47\xe5\x64\x7a\x55\x66\x00\x00\x4f\xa7\x00\x00\x00\x00\x00\x00\x46\xec\x00\x00\x00\x00\x52\xc1\x00\x00\x00\x00\x64\x7c\x00\x00\x00\x00\x00\x00\x64\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7f\x64\x80\x4e\x8f\x64\x7e\x00\x00\x00\x00", /* 8d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x53\x5a\x55\x74\x00\x00\x64\x81\x4c\x7c\x00\x00\x64\x82\x55\x84\x00\x00\x64\x84\x00\x00\x64\x83\x64\x86\x00\x00\x64\x85\x64\x87\x64\x88\x00\x00\x64\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xf9\x00\x00\x51\x51\x64\x8a\x00\x00\x00\x00\x00\x00\x53\xcc\x00\x00\x64\x8b\x00\x00\x00\x00\x4a\xaa\x64\x8c\x00\x00\x51\xc9\x50\xee\x00\x00\x64\x8d\x48\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8d80 */ "\x00\x00\x64\x8f\x00\x00\x00\x00\x00\x00\x4a\x78\x00\x00\x00\x00\x00\x00\x00\x00\x46\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xed\x00\x00\x00\x00\x00\x00\x00\x00\x55\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x92\x00\x00\x00\x00\x00\x00\x64\x91\x00\x00\x00\x00\x00\x00\x64\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x98\x64\x96\x00\x00\x00\x00\x64\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x95\x00\x00\x00\x00\x00\x00\x64\x94\x64\x97\x00\x00\x4d\xc2\x00\x00\x64\x9b\x00\x00\x4c\xcd\x00\x00\x64\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x55\xcb\x00\x00\x64\x99\x64\x9a\x00\x00\x00\x00\x00\x00\x47\x84\x00\x00\x00\x00\x00\x00\x50\xb4\x00\x00\x50\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x9d\x00\x00\x00\x00\x64\x9f", /* 8e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x9e\x64\xa0\x4c\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x7c\x64\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa1\x64\xa2\x64\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa7\x00\x00\x00\x00\x00\x00\x64\xa8\x64\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa5\x00\x00\x55\xa7\x00\x00\x00\x00\x64\xaa\x64\xae\x64\xab\x64\xa9\x00\x00\x64\xac\x00\x00\x00\x00\x00\x00\x64\xad\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb2\x00\x00\x00\x00\x00\x00\x64\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x68\x64\xb1\x00\x00\x00\x00\x64\xb3\x64\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb5\x00\x00\x52\xf6\x00\x00\x64\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb7\x00\x00\x00\x00\x00\x00", /* 8e80 */ "\x00\x00\x64\xb8\x00\x00\x00\x00\x64\xba\x64\xb9\x00\x00\x64\xb6\x00\x00\x00\x00\x64\xbc\x64\xbb\x00\x00\x4c\xa1\x00\x00\x00\x00\x00\x00\x64\xbe\x00\x00\x64\xbd\x64\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x64\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xc2\x47\x9c\x50\x44\x00\x00\x00\x00\x53\x53\x53\x7a\x64\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xc4\x00\x00\x53\x53\x00\x00\x00\x00\x00\x00\x00\x00\x64\xc6\x64\xc5\x00\x00\x64\xc7\x00\x00\x46\x53\x64\xc8\x4d\xaa\x48\x97\x00\x00\x64\xc9\x00\x00\x00\x00\x4e\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xca\x00\x00\x00\x00\x00\x00\x4c\xb1\x00\x00\x00\x00\x47\x52\x64\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xa6\x00\x00\x00\x00\x64\xcd\x64\xcc\x48\xa6\x64\xcf\x00\x00", /* 8f00 */ "\x00\x00\x00\x00\x00\x00\x4a\x5a\x00\x00\x64\xd2\x00\x00\x00\x00\x00\x00\x4d\x6e\x64\xd0\x00\x00\x64\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xd4\x64\xd5\x4a\x68\x64\xd3\x00\x00\x00\x00\x00\x00\x64\xd7\x00\x00\x51\x5b\x64\xd6\x47\x87\x00\x00\x64\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xd9\x00\x00\x00\x00\x4e\xf4\x48\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x55\xa6\x00\x00\x00\x00\x00\x00\x64\xda\x00\x00\x00\x00\x00\x00\x00\x00\x46\x93\x64\xdc\x00\x00\x64\xdb\x00\x00\x00\x00\x64\xdf\x50\x6c\x00\x00\x00\x00\x64\xde\x00\x00\x50\xfe\x64\xdd\x64\xe1\x00\x00\x00\x00\x64\xe0\x00\x00\x00\x00\x64\xe2\x54\xee\x64\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x64\xe5\x00\x00\x00\x00\x50\xa9\x00\x00\x52\xe1\x64\xe6\x64\xe7\x64\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5e\x64\xe9\x00\x00\x4d\x74\x64\xea\x00\x00\x00\x00\x00\x00\x64\xeb\x00\x00\x00\x00\x00\x00\x64\xed\x64\xec\x00\x00\x00\x00\x00\x00\x00\x00\x64\xee\x61\x49\x64\xef\x47\xdf\x52\xe5\x48\x45\x00\x00\x00\x00\x00\x00\x00\x00\x64\xf0\x00\x00\x00\x00\x45\xd5\x47\xf5\x48\x41\x00\x00\x00\x00\x54\x7e\x00\x00\x00\x00\x55\xdf\x00\x00\x49\xcd\x50\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xa9\x00\x00\x00\x00\x46\x73\x00\x00\x00\x00\x48\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xf4\x00\x00\x00\x00\x64\xf3\x53\x5d\x00\x00\x00\x00\x64\xf6\x4e\x9e\x49\xef\x00\x00\x53\xdf\x00\x00\x64\xf5\x4a\x9c\x00\x00\x00\x00\x00\x00\x64\xf7\x00\x00\x00\x00\x4e\x58\x64\xfa\x64\xf9\x54\xa9\x00\x00\x00\x00\x49\xd1\x00\x00\x00\x00", /* 9000 */ "\x4b\x49\x47\x44\x00\x00\x4c\x72\x00\x00\x64\xf8\x4b\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x65\x44\x00\x00\x65\x41\x64\xfd\x4b\xda\x50\xbb\x64\xfb\x00\x00\x51\x5e\x48\xf0\x64\xfc\x65\x43\x4f\xb3\x00\x00\x4f\xca\x45\xe3\x00\x00\x00\x00\x53\xb1\x65\x42\x48\xcd\x45\xb8\x64\xfe\x4d\xce\x47\x54\x00\x00\x00\x00\x00\x00\x65\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x77\x00\x00\x00\x00\x4a\xd3\x46\x69\x00\x00\x00\x00\x54\x85\x65\x46\x00\x00\x4a\xd6\x65\x47\x00\x00\x00\x00\x55\xac\x00\x00\x65\x4e\x00\x00\x00\x00\x54\xf8\x4c\xf7\x00\x00\x00\x00\x4c\x6d\x00\x00\x49\xec\x00\x00\x65\x4d\x4a\x8b\x46\xab\x00\x00\x50\x5d\x48\x8d\x65\x48\x65\x4a\x65\x4b\x65\x4c\x45\x50\x46\xa4\x49\xbc\x65\x4f\x00\x00\x65\x50\x52\xf3\x00\x00\x00\x00\x54\x55\x00\x00\x65\x51\x00\x00\x46\xe3\x54\x4c\x00\x00\x4e\xc2\x00\x00\x68\x82\x00\x00\x65\x53\x65\x52\x49\xcc\x00\x00\x00\x00\x00\x00\x51\x43\x54\x58\x65\x54\x00\x00\x00\x00\x65\x57\x00\x00\x00\x00\x52\x6e\x65\x55\x53\x5b\x48\x5d\x00\x00\x4c\xda\x00\x00\x52\x6b\x65\x59\x00\x00\x4c\xc4", /* 9080 */ "\x65\x5b\x53\x7b\x65\x58\x60\x45\x4d\xa9\x00\x00\x00\x00\x51\x86\x00\x00\x65\x5a\x50\xea\x00\x00\x00\x00\x00\x00\x00\x00\x65\x5c\x00\x00\x4c\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x46\x00\x00\x00\x00\x46\xc5\x00\x00\x51\xa8\x00\x00\x4e\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x65\x5e\x00\x00\x65\x5f\x00\x00\x00\x00\x00\x00\x65\x60\x00\x00\x00\x00\x4d\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x52\x00\x00\x00\x00\x00\x00\x45\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x63\x00\x00\x00\x00\x65\x64\x00\x00\x00\x00\x49\x9e\x65\x61\x00\x00\x65\x62\x00\x00\x00\x00\x00\x00\x45\x95\x00\x00\x00\x00\x00\x00\x00\x00\x51\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xb7\x00\x00\x49\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x4f\x00\x00\x00\x00", /* 9100 */ "\x00\x00\x00\x00\x65\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x68\x00\x00\x00\x00\x65\x67\x00\x00\x00\x00\x00\x00\x65\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x54\x00\x00\x00\x00\x65\x6c\x00\x00\x65\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x73\x65\x6d\x55\x48\x52\xbb\x47\xf3\x55\x91\x00\x00\x00\x00\x00\x00\x47\x58\x00\x00\x4e\x7c\x00\x00\x65\x6e\x00\x00\x65\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xae\x65\x70\x00\x00\x65\x71\x00\x00\x00\x00\x00\x00\x65\x72\x50\xbd\x00\x00\x51\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x74\x65\x73\x00\x00\x4d\x86\x00\x00\x51\xeb\x48\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9180 */ "\x00\x00\x00\x00\x65\x77\x00\x00\x00\x00\x00\x00\x00\x00\x51\xa9\x00\x00\x65\x76\x00\x00\x65\x75\x00\x00\x51\x6f\x00\x00\x00\x00\x51\x70\x00\x00\x53\x78\x00\x00\x00\x00\x00\x00\x00\x00\x51\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x78\x00\x00\x50\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x7b\x65\x79\x50\x7f\x00\x00\x00\x00\x65\x7a\x00\x00\x51\xfa\x00\x00\x00\x00\x65\x7d\x65\x7c\x00\x00\x00\x00\x50\xc2\x00\x00\x65\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x7f\x65\x80\x00\x00\x00\x00\x00\x00\x00\x00\x53\x46\x53\xbf\x4d\x79\x52\x52\x00\x00\x65\x81\x47\x6c\x45\xa3\x45\x69\x47\xb5\x65\x82\x45\x86\x00\x00\x00\x00\x00\x00\x00\x00\x65\x87\x65\x85\x4f\xf4\x00\x00\x65\x83\x65\x84\x4a\xcc\x49\x88\x65\x86\x65\x88\x00\x00\x65\x89\x00\x00\x4c\xe3\x65\x8d\x65\x8f\x53\x4a\x4b\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x8a\x65\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x8b\x65\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd0\x00\x00\x00\x00\x65\x92", /* 9200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x90\x00\x00\x00\x00\x00\x00\x65\x95\x00\x00\x00\x00\x4e\x63\x53\x8f\x00\x00\x65\x93\x52\x69\x00\x00\x00\x00\x65\x94\x65\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x98\x00\x00\x00\x00\x65\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xae\x00\x00\x00\x00\x55\xbf\x00\x00\x65\xa6\x65\x9b\x00\x00\x65\x9f\x00\x00\x00\x00\x65\xa4\x65\x9e\x00\x00\x00\x00\x00\x00\x45\xd7\x65\x9a\x00\x00\x00\x00\x65\xa0\x65\x9c\x00\x00\x65\xa7\x00\x00\x00\x00\x65\xa1\x00\x00\x65\xa2\x65\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x99\x00\x00\x65\xa3\x65\xa9\x49\xd4\x00\x00\x00\x00\x53\x93\x00\x00\x00\x00\x00\x00\x4e\xa8\x00\x00\x65\x9d\x00\x00\x4f\xb4\x65\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xac\x65\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x83\x00\x00", /* 9280 */ "\x47\x8c\x00\x00\x00\x00\x4c\xe2\x00\x00\x48\xc0\x00\x00\x00\x00\x52\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xad\x00\x00\x65\xaf\x00\x00\x65\xb1\x65\xae\x00\x00\x4d\xdc\x00\x00\x4e\x80\x65\xb0\x65\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xbb\x00\x00\x65\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xb3\x65\xb7\x00\x00\x54\x49\x65\xbd\x00\x00\x65\xb9\x00\x00\x65\xb5\x00\x00\x65\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xbc\x00\x00\x00\x00\x00\x00\x52\xc0\x00\x00\x00\x00\x65\xb4\x00\x00\x65\xb2\x53\x63\x00\x00\x00\x00\x4d\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x55\xbe\x48\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x51\xe7\x53\x94\x65\xc2\x65\xc5\x46\xa1\x00\x00\x00\x00\x65\xc9", /* 9300 */ "\x00\x00\x00\x00\x65\xce\x00\x00\x00\x00\x00\x00\x55\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xc0\x53\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xef\x65\xc7\x65\xcb\x00\x00\x00\x00\x65\xcc\x65\xc8\x00\x00\x4e\x57\x65\xc3\x65\xca\x65\xcd\x00\x00\x65\xc1\x4b\x8e\x00\x00\x53\xf0\x00\x00\x00\x00\x52\x57\x4f\xe6\x00\x00\x52\x83\x50\xb1\x00\x00\x00\x00\x48\x86\x00\x00\x00\x00\x65\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x65\xbe\x65\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xc4\x00\x00\x00\x00\x00\x00\x51\xf7\x00\x00\x00\x00\x4b\x48\x00\x00\x55\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xaa\x00\x00\x65\xd4\x65\xd5\x00\x00\x00\x00\x00\x00\x48\xc7\x52\xad\x00\x00\x00\x00\x00\x00\x65\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x70\x00\x00\x65\xd3\x00\x00\x65\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd2\x00\x00\x53\xbd\x00\x00", /* 9380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xda\x00\x00\x4d\x70\x51\x97\x00\x00\x00\x00\x54\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd8\x00\x00\x00\x00\x54\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6e\x65\xd9\x4c\x89\x00\x00\x65\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xe2\x00\x00\x00\x00\x65\xdd\x00\x00\x65\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xe5\x50\x41\x00\x00\x00\x00\x00\x00\x00\x00\x65\xdc\x65\xde\x65\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x65\xe3\x65\xe4\x00\x00\x00\x00\x4a\x8d\x00\x00\x00\x00\x65\xe6\x65\xe0\x00\x00\x00\x00\x65\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9400 */ "\x00\x00\x00\x00\x00\x00\x65\xec\x00\x00\x00\x00\x00\x00\x65\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xcd\x00\x00\x00\x00\x65\xea\x65\xe9\x00\x00\x00\x00\x00\x00\x4c\xc8\x52\xcf\x65\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xf0\x00\x00\x00\x00\x00\x00\x51\x56\x65\xee\x00\x00\x53\x88\x00\x00\x65\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xf2\x00\x00\x00\x00\x65\xf5\x65\xf4\x00\x00\x00\x00\x65\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x4e\x65\xf3\x52\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xf8\x65\xf7\x00\x00\x00\x00\x65\xfb\x00\x00\x65\xf9\x00\x00\x65\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x65\xfd\x00\x00\x66\x41\x00\x00\x00\x00\x00\x00\x00\x00\x66\x44\x66\x43\x66\x45\x66\x42", /* 9480 */ "\x00\x00\x66\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9580 */ "\x46\xaa\x00\x00\x66\x47\x51\x9c\x00\x00\x00\x00\x00\x00\x66\x48\x00\x00\x4b\x7d\x66\x49\x46\xcd\x00\x00\x00\x00\x00\x00\x54\x5f\x00\x00\x4d\xd9\x66\x4a\x45\xc1\x66\x4b\x00\x00\x66\x4c\x00\x00\x66\x4d\x66\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x4f\x00\x00\x45\xc5\x4a\xe9\x54\x9b\x51\x72\x00\x00\x66\x51\x66\x50\x00\x00\x00\x00\x00\x00\x00\x00\x66\x52\x00\x00\x00\x00\x00\x00\x00\x00\x51\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x55\x00\x00\x66\x54\x66\x53\x00\x00\x66\x56\x00\x00\x00\x00\x00\x00\x00\x00\x66\x59\x00\x00\x00\x00\x00\x00\x53\x64\x00\x00\x00\x00\x66\x57\x00\x00\x66\x5b\x66\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x5d\x66\x5c\x66\x5e\x00\x00\x4b\xcc\x00\x00\x00\x00\x00\x00\x66\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x66\x60\x66\x62\x00\x00\x00\x00\x66\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x86\x00\x00\x00\x00\x00\x00\x00\x00\x66\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x64\x00\x00\x45\x91\x00\x00\x00\x00\x00\x00\x66\x65\x66\x66\x00\x00\x00\x00\x47\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xef\x00\x00\x00\x00\x00\x00\x46\xae\x4f\xe8\x00\x00\x66\x67\x00\x00\x4b\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x6a\x66\x69\x49\xe5\x00\x00\x66\x68\x48\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x57\x66\x6b\x66\x6c\x52\x72\x66\x6d\x00\x00\x00\x00\x49\xd8\x4c\x84\x49\x6d\x4f\xfe\x66\x6e\x00\x00\x00\x00\x00\x00\x55\xc3\x00\x00\x66\x71\x00\x00\x00\x00\x00\x00\x4c\xd2\x00\x00\x66\x70\x4e\x61\x00\x00\x50\xc7\x4a\xb7\x66\x6f\x49\x61\x00\x00\x4a\x6c\x00\x00\x00\x00\x47\xbf\x00\x00\x00\x00", /* 9680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xb9\x46\x5d\x00\x00\x4c\xe5\x00\x00\x4a\x93\x66\x73\x00\x00\x66\x72\x49\xa9\x4e\x76\x00\x00\x00\x00\x00\x00\x00\x00\x50\x5a\x66\x76\x00\x00\x66\x77\x66\x75\x53\xc3\x00\x00\x47\x97\x4b\xf9\x66\x79\x00\x00\x00\x00\x4e\xae\x00\x00\x00\x00\x4c\xe0\x00\x00\x00\x00\x00\x00\x66\x7a\x65\x56\x00\x00\x66\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x66\x7f\x66\x7e\x66\x7c\x66\x7d\x00\x00\x66\x80\x00\x00\x66\x81\x55\x45\x66\x82\x66\x83\x00\x00\x4f\xda\x4e\xd5\x00\x00\x00\x00\x00\x00\x4f\x64\x51\xa4\x00\x00\x00\x00\x45\x70\x47\x45\x47\xa0\x4c\x4d\x00\x00\x54\x77\x00\x00\x66\x85\x52\xb7\x52\x5b\x66\x84\x00\x00\x00\x00\x4a\x8a\x00\x00\x00\x00\x00\x00\x66\x86\x63\x54\x00\x00\x00\x00\x66\x88\x00\x00\x51\xfb\x66\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x97\x49\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x49\xdd\x00\x00\x49\xbb\x52\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x90\x00\x00\x4a\xbc\x00\x00\x00\x00\x00\x00\x50\x69\x4b\xd6\x00\x00\x66\x89\x00\x00\x45\x82\x00\x00\x00\x00\x00\x00\x00\x00", /* 9700 */ "\x47\xfb\x00\x00\x00\x00\x00\x00\x66\x8a\x00\x00\x66\x8b\x4d\xde\x66\x8c\x00\x00\x4f\x4b\x00\x00\x00\x00\x66\x8e\x66\x90\x66\x92\x00\x00\x66\x91\x00\x00\x66\x8f\x00\x00\x00\x00\x66\x93\x00\x00\x00\x00\x66\x8d\x00\x00\x00\x00\x4d\xe8\x00\x00\x4e\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x94\x00\x00\x00\x00\x4e\x48\x00\x00\x00\x00\x66\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x96\x00\x00\x4b\xc6\x66\x97\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xcf\x66\x98\x00\x00\x66\x99\x00\x00\x66\x9a\x66\x9b\x00\x00\x00\x00\x00\x00\x66\xa0\x66\x9e\x66\x9d\x00\x00\x66\x9c\x00\x00\x66\x9f\x66\xa1\x00\x00\x00\x00\x00\x00\x66\xa2\x00\x00\x66\xa3\x00\x00\x66\xa4\x46\x4c\x00\x00\x00\x00\x66\xa5\x48\xc3\x00\x00\x00\x00\x46\x44\x00\x00\x00\x00\x66\xa6\x00\x00\x48\xe1\x00\x00\x66\xa7\x68\x52\x46\x91\x00\x00\x66\xa8\x00\x00\x66\xa9\x00\x00\x66\xaa\x4a\xa3\x00\x00\x53\xb5\x00\x00\x66\xab\x00\x00\x00\x00\x00\x00\x52\xce\x00\x00\x00\x00\x4d\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x66\xac\x66\xb0\x00\x00\x66\xae\x00\x00\x00\x00\x00\x00", /* 9780 */ "\x00\x00\x66\xaf\x00\x00\x00\x00\x54\x45\x66\xad\x52\x77\x00\x00\x00\x00\x00\x00\x00\x00\x66\xb1\x00\x00\x50\x4c\x00\x00\x66\xb2\x66\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xe7\x00\x00\x00\x00\x00\x00\x66\xb4\x00\x00\x00\x00\x00\x00\x51\xed\x00\x00\x00\x00\x66\xb7\x00\x00\x00\x00\x66\xb6\x00\x00\x66\xb5\x00\x00\x00\x00\x63\xfc\x00\x00\x54\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xb8\x66\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xba\x00\x00\x00\x00\x66\xbb\x00\x00\x66\xbc\x00\x00\x00\x00\x66\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xbf\x4f\xdf\x00\x00\x00\x00\x00\x00\x66\xc0\x48\x4d\x00\x00\x66\xc2\x52\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x55\x77\x00\x00\x00\x00\x00\x00\x4a\x5c", /* 9800 */ "\x00\x00\x4c\xd9\x4d\x5b\x49\x46\x00\x00\x4a\x97\x47\xb2\x00\x00\x46\xb0\x00\x00\x00\x00\x00\x00\x54\x56\x00\x00\x00\x00\x66\xc3\x4d\x4a\x53\x9d\x55\x57\x51\x7a\x00\x00\x00\x00\x00\x00\x55\xe4\x4a\xcd\x00\x00\x66\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xc6\x00\x00\x00\x00\x66\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xb3\x47\xeb\x00\x00\x00\x00\x4e\xb3\x00\x00\x00\x00\x00\x00\x55\x76\x00\x00\x00\x00\x66\xc7\x50\xfb\x66\xc8\x00\x00\x53\xab\x4a\x7a\x66\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x66\xca\x47\xfe\x47\xf1\x54\x8e\x66\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x48\xb8\x4a\xe5\x00\x00\x66\xcb\x4c\x57\x00\x00\x55\xc1\x55\xc1\x00\x00\x00\x00\x46\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xcc\x00\x00\x4e\xee\x00\x00\x00\x00\x00\x00\x66\xcd\x00\x00\x00\x00\x00\x00\x66\xce\x66\xcf\x66\xd0\x00\x00\x66\xd2\x66\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\xe7\x00\x00\x66\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd4\x00\x00\x66\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd8\x66\xd7\x00\x00\x66\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x8a\x66\xda\x00\x00\x00\x00\x46\xb8\x00\x00\x00\x00\x53\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xdc\x00\x00\x66\xde\x00\x00\x66\xdb\x5c\xca\x46\xb5\x00\x00\x00\x00\x4b\xa3\x00\x00\x52\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x8f\x4d\x49\x49\x57\x00\x00", /* 9900 */ "\x00\x00\x00\x00\x00\x00\x66\xe0\x00\x00\x50\xbf\x00\x00\x00\x00\x00\x00\x54\xbc\x49\x79\x00\x00\x50\xa7\x00\x00\x00\x00\x00\x00\x55\xb3\x00\x00\x66\xe2\x55\x4b\x66\xe3\x00\x00\x00\x00\x00\x00\x66\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x66\xe1\x66\xe8\x00\x00\x66\xea\x66\xe7\x00\x00\x00\x00\x66\xe9\x00\x00\x00\x00\x66\xe5\x48\x62\x00\x00\x00\x00\x00\x00\x66\xeb\x00\x00\x66\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xed\x66\xee\x00\x00\x00\x00\x00\x00\x66\xef\x00\x00\x00\x00\x66\xf1\x00\x00\x00\x00\x00\x00\x66\xf0\x00\x00\x66\xf3\x66\xf5\x00\x00\x00\x00\x00\x00\x66\xf2\x66\xf4\x52\xe8\x00\x00\x00\x00\x66\xf6\x00\x00\x51\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xbe\x66\xf7\x66\xf8\x46\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x66\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xfa\x00\x00\x00\x00\x4b\x85\x00\x00\x00\x00\x00\x00\x46\x64\x66\xfb\x66\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x52\xdf\x50\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x55\xe5\x00\x00\x00\x00\x4d\xe5\x49\xac\x4c\xfe\x00\x00\x4f\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xf5\x67\x44\x49\xfc\x00\x00\x00\x00\x53\xbe\x00\x00\x00\x00\x67\x43\x00\x00\x00\x00\x67\x41\x00\x00\x67\x42\x00\x00\x66\xfe\x00\x00\x00\x00\x67\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x45\x67\x46\x00\x00\x00\x00\x67\x48\x67\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x4b\x00\x00\x00\x00\x67\x4a\x00\x00\x00\x00\x00\x00\x4c\xc0", /* 9a00 */ "\x00\x00\x67\x4c\x00\x00\x00\x00\x00\x00\x67\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x58\x67\x4d\x00\x00\x00\x00\x4d\xd2\x48\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xda\x00\x00\x00\x00\x67\x50\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x56\x00\x00\x67\x52\x00\x00\x67\x54\x67\x55\x00\x00\x67\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x58\x67\x59\x00\x00\x00\x00\x00\x00\x53\xda\x00\x00\x00\x00\x67\x57\x00\x00\x67\x5b\x00\x00\x00\x00\x4c\xd5\x67\x5a\x00\x00\x00\x00\x00\x00\x67\x5c\x00\x00\x00\x00\x67\x5d\x00\x00\x67\x60\x67\x5f\x00\x00\x00\x00\x00\x00\x67\x5e\x67\x61\x67\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x67\x63\x00\x00\x00\x00\x67\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x9c\x00\x00\x00\x00\x00\x00\x67\x65\x00\x00\x00\x00\x00\x00\x67\x66\x00\x00\x00\x00\x00\x00\x52\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x67\x00\x00\x67\x6a\x00\x00\x67\x68\x67\x69\x00\x00\x00\x00\x00\x00\x45\x71\x67\x6b\x00\x00\x00\x00\x67\x6c\x00\x00\x67\x6d\x67\x6e\x00\x00\x00\x00\x67\x6f\x67\x70\x00\x00\x00\x00\x67\x71\x00\x00\x00\x00\x00\x00\x4c\xf6\x67\x73\x00\x00\x50\x9d\x67\x74\x67\x72\x00\x00\x67\x76\x00\x00\x00\x00\x67\x75\x00\x00\x00\x00\x67\x77\x00\x00\x00\x00\x00\x00\x67\x78\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x7a\x00\x00\x67\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x67\x7c\x00\x00\x00\x00\x67\x7d\x67\x7e\x00\x00\x67\x7f\x00\x00\x67\x80\x67\x81\x67\x82\x67\x83\x00\x00\x00\x00\x00\x00\x67\x84\x67\x85\x00\x00\x67\x86\x67\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x88\x4a\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x52\xcb\x50\xa8\x67\x8a\x67\x89\x4d\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x8b\x67\x8c\x53\x89\x00\x00\x67\x8d\x00\x00\x00\x00\x4d\xe2\x00\x00\x00\x00\x00\x00\x67\x8e\x00\x00\x48\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xf4\x00\x00\x00\x00\x67\x91\x00\x00\x67\x90\x67\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b80 */ "\x00\x00\x00\x00\x00\x00\x67\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x8e\x67\x93\x00\x00\x67\x95\x52\x8d\x67\x92\x00\x00\x00\x00\x67\x96\x67\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x98\x67\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x9a\x00\x00\x55\xce\x4e\xb7\x00\x00\x53\x91\x4c\xe9\x00\x00\x00\x00\x67\x9b\x00\x00\x00\x00\x67\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa0\x00\x00\x67\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x67\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa1\x00\x00\x00\x00\x4f\xc6\x67\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa2\x00\x00\x67\xa3\x67\xa4\x00\x00\x67\xa8\x00\x00\x4f\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x50\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa9\x67\xa6\x67\xa5\x67\xa7\x00\x00\x00\x00\x00\x00\x4d\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x51\x67\xab\x67\xac\x00\x00\x00\x00\x67\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9c00 */ "\x67\xb1\x00\x00\x00\x00\x00\x00\x67\xad\x00\x00\x67\xb5\x00\x00\x67\xb6\x67\xb2\x67\xb8\x00\x00\x67\xb4\x55\x71\x00\x00\x00\x00\x52\x93\x00\x00\x67\xb7\x67\xb3\x67\xb0\x67\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xbc\x00\x00\x00\x00\x67\xbb\x67\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x6e\x67\xb9\x55\xc8\x67\xbd\x00\x00\x67\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xd5\x51\xf0\x54\xab\x00\x00\x00\x00\x67\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc0\x67\xbe\x55\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4c\x00\x00\x00\x00\x67\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc5\x00\x00\x67\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x79\x00\x00\x67\xc8\x00\x00\x4d\x95\x00\x00\x67\xc7\x67\xc9\x00\x00\x00\x00\x00\x00\x67\xca\x00\x00\x00\x00\x4e\xa6\x4b\x70\x00\x00\x54\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9d00 */ "\x00\x00\x00\x00\x00\x00\x67\xcc\x00\x00\x00\x00\x67\xcd\x51\xa1\x54\xfc\x67\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x54\x64\x00\x00\x00\x00\x00\x00\x67\xd4\x00\x00\x00\x00\x67\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xc3\x00\x00\x00\x00\x00\x00\x67\xd2\x00\x00\x00\x00\x00\x00\x67\xd1\x00\x00\x00\x00\x67\xcf\x00\x00\x4c\x54\x00\x00\x67\xce\x50\xba\x67\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xd6\x00\x00\x00\x00\x67\xd8\x67\xd6\x00\x00\x67\xd5\x00\x00\x00\x00\x67\xd7\x00\x00\x67\xd9\x00\x00\x67\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xdf\x67\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xdd\x00\x00\x00\x00\x4b\xe7\x67\xdb\x67\xdc\x00\x00\x50\xfd\x55\x7e\x00\x00\x00\x00\x67\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe4\x51\x8a\x00\x00\x00\x00\x67\xe5\x67\xe2\x00\x00\x67\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe3\x00\x00\x53\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe9\x00\x00\x67\xea\x00\x00\x00\x00\x00\x00\x50\xe5\x00\x00\x00\x00\x67\xeb\x00\x00\x47\x7a\x00\x00\x00\x00\x00\x00\x67\xef\x00\x00\x67\xf0\x67\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xed\x67\xf3\x00\x00\x67\xec\x00\x00\x67\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xf2\x00\x00\x00\x00\x00\x00\x67\xf6\x00\x00\x00\x00\x00\x00\x54\x64\x00\x00\x67\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xf9\x00\x00\x67\xfa\x00\x00\x00\x00\x4b\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xf7\x4b\x7a\x50\xaf\x00\x00\x00\x00\x67\xfb\x00\x00\x00\x00", /* 9e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xfe\x67\xfc\x67\xfd\x00\x00\x00\x00\x68\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x42\x00\x00\x00\x00\x4c\x7d\x68\x43\x00\x00\x00\x00\x4c\x7d\x68\x44\x00\x00\x46\x97", /* 9e80 */ "\x00\x00\x68\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x46\x00\x00\x00\x00\x68\x47\x68\x48\x00\x00\x00\x00\x00\x00\x00\x00\x68\x4a\x51\xf9\x51\x9e\x00\x00\x68\x49\x00\x00\x4c\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x4b\x00\x00\x51\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x4c\x4a\xe0\x00\x00\x00\x00\x53\xb4\x68\x4e\x00\x00\x00\x00\x68\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x61\x55\x5f\x00\x00\x00\x00\x68\x4d\x52\x61\x55\x5f\x48\xa7\x68\x50\x00\x00\x68\x51\x4e\xea\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x53\x55\xae\x51\xa7\x68\x54\x68\x55\x68\x56\x46\x79\x00\x00\x68\x57\x00\x00\x00\x00\x00\x00\x5e\x90\x4d\xbc\x00\x00\x51\xdd\x68\x58\x68\x5a\x68\x59\x00\x00\x68\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5c\x00\x00\x00\x00\x68\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5f\x00\x00\x68\x60\x68\x61\x00\x00\x68\x62\x00\x00\x68\x63\x68\x64\x68\x65\x00\x00\x00\x00", /* 9f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x66\x68\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xaf\x00\x00\x68\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xcb\x68\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xfd\x00\x00\x00\x00\x68\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6d\x51\xf5\x00\x00\x00\x00\x68\x6e\x68\x6f\x00\x00\x00\x00\x68\x70\x00\x00\x68\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x73\x68\x74\x68\x75\x4c\x80\x68\x72\x00\x00\x00\x00\x68\x76\x68\x77\x00\x00\x00\x00\x68\x79\x00\x00\x68\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7b\x00\x00\x00\x00\x00\x00\x68\x7c\x68\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7e\x5f\xf7\x00\x00\x00\x00\x68\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ "\x69\x41\x69\x42\x69\x43\x69\x44\x69\x45\x69\x46\x69\x47\x69\x48\x69\x49\x69\x4a\x69\x4b\x69\x4c\x69\x4d\x69\x4e\x69\x4f\x69\x50\x69\x51\x69\x52\x69\x53\x69\x54\x69\x55\x69\x56\x69\x57\x69\x58\x69\x59\x69\x5a\x69\x5b\x69\x5c\x69\x5d\x69\x5e\x69\x5f\x69\x60\x69\x61\x69\x62\x69\x63\x69\x64\x69\x65\x69\x66\x69\x67\x69\x68\x69\x69\x69\x6a\x69\x6b\x69\x6c\x69\x6d\x69\x6e\x69\x6f\x69\x70\x69\x71\x69\x72\x69\x73\x69\x74\x69\x75\x69\x76\x69\x77\x69\x78\x69\x79\x69\x7a\x69\x7b\x69\x7c\x69\x7d\x69\x7e\x69\x7f\x69\x80\x69\x81\x69\x82\x69\x83\x69\x84\x69\x85\x69\x86\x69\x87\x69\x88\x69\x89\x69\x8a\x69\x8b\x69\x8c\x69\x8d\x69\x8e\x69\x8f\x69\x90\x69\x91\x69\x92\x69\x93\x69\x94\x69\x95\x69\x96\x69\x97\x69\x98\x69\x99\x69\x9a\x69\x9b\x69\x9c\x69\x9d\x69\x9e\x69\x9f\x69\xa0\x69\xa1\x69\xa2\x69\xa3\x69\xa4\x69\xa5\x69\xa6\x69\xa7\x69\xa8\x69\xa9\x69\xaa\x69\xab\x69\xac\x69\xad\x69\xae\x69\xaf\x69\xb0\x69\xb1\x69\xb2\x69\xb3\x69\xb4\x69\xb5\x69\xb6\x69\xb7\x69\xb8\x69\xb9\x69\xba\x69\xbb\x69\xbc\x69\xbd\x69\xbe\x69\xbf\x69\xc0", /* e080 */ "\x69\xc1\x69\xc2\x69\xc3\x69\xc4\x69\xc5\x69\xc6\x69\xc7\x69\xc8\x69\xc9\x69\xca\x69\xcb\x69\xcc\x69\xcd\x69\xce\x69\xcf\x69\xd0\x69\xd1\x69\xd2\x69\xd3\x69\xd4\x69\xd5\x69\xd6\x69\xd7\x69\xd8\x69\xd9\x69\xda\x69\xdb\x69\xdc\x69\xdd\x69\xde\x69\xdf\x69\xe0\x69\xe1\x69\xe2\x69\xe3\x69\xe4\x69\xe5\x69\xe6\x69\xe7\x69\xe8\x69\xe9\x69\xea\x69\xeb\x69\xec\x69\xed\x69\xee\x69\xef\x69\xf0\x69\xf1\x69\xf2\x69\xf3\x69\xf4\x69\xf5\x69\xf6\x69\xf7\x69\xf8\x69\xf9\x69\xfa\x69\xfb\x69\xfc\x69\xfd\x69\xfe\x6a\x41\x6a\x42\x6a\x43\x6a\x44\x6a\x45\x6a\x46\x6a\x47\x6a\x48\x6a\x49\x6a\x4a\x6a\x4b\x6a\x4c\x6a\x4d\x6a\x4e\x6a\x4f\x6a\x50\x6a\x51\x6a\x52\x6a\x53\x6a\x54\x6a\x55\x6a\x56\x6a\x57\x6a\x58\x6a\x59\x6a\x5a\x6a\x5b\x6a\x5c\x6a\x5d\x6a\x5e\x6a\x5f\x6a\x60\x6a\x61\x6a\x62\x6a\x63\x6a\x64\x6a\x65\x6a\x66\x6a\x67\x6a\x68\x6a\x69\x6a\x6a\x6a\x6b\x6a\x6c\x6a\x6d\x6a\x6e\x6a\x6f\x6a\x70\x6a\x71\x6a\x72\x6a\x73\x6a\x74\x6a\x75\x6a\x76\x6a\x77\x6a\x78\x6a\x79\x6a\x7a\x6a\x7b\x6a\x7c\x6a\x7d\x6a\x7e\x6a\x7f\x6a\x80\x6a\x81\x6a\x82", /* e100 */ "\x6a\x83\x6a\x84\x6a\x85\x6a\x86\x6a\x87\x6a\x88\x6a\x89\x6a\x8a\x6a\x8b\x6a\x8c\x6a\x8d\x6a\x8e\x6a\x8f\x6a\x90\x6a\x91\x6a\x92\x6a\x93\x6a\x94\x6a\x95\x6a\x96\x6a\x97\x6a\x98\x6a\x99\x6a\x9a\x6a\x9b\x6a\x9c\x6a\x9d\x6a\x9e\x6a\x9f\x6a\xa0\x6a\xa1\x6a\xa2\x6a\xa3\x6a\xa4\x6a\xa5\x6a\xa6\x6a\xa7\x6a\xa8\x6a\xa9\x6a\xaa\x6a\xab\x6a\xac\x6a\xad\x6a\xae\x6a\xaf\x6a\xb0\x6a\xb1\x6a\xb2\x6a\xb3\x6a\xb4\x6a\xb5\x6a\xb6\x6a\xb7\x6a\xb8\x6a\xb9\x6a\xba\x6a\xbb\x6a\xbc\x6a\xbd\x6a\xbe\x6a\xbf\x6a\xc0\x6a\xc1\x6a\xc2\x6a\xc3\x6a\xc4\x6a\xc5\x6a\xc6\x6a\xc7\x6a\xc8\x6a\xc9\x6a\xca\x6a\xcb\x6a\xcc\x6a\xcd\x6a\xce\x6a\xcf\x6a\xd0\x6a\xd1\x6a\xd2\x6a\xd3\x6a\xd4\x6a\xd5\x6a\xd6\x6a\xd7\x6a\xd8\x6a\xd9\x6a\xda\x6a\xdb\x6a\xdc\x6a\xdd\x6a\xde\x6a\xdf\x6a\xe0\x6a\xe1\x6a\xe2\x6a\xe3\x6a\xe4\x6a\xe5\x6a\xe6\x6a\xe7\x6a\xe8\x6a\xe9\x6a\xea\x6a\xeb\x6a\xec\x6a\xed\x6a\xee\x6a\xef\x6a\xf0\x6a\xf1\x6a\xf2\x6a\xf3\x6a\xf4\x6a\xf5\x6a\xf6\x6a\xf7\x6a\xf8\x6a\xf9\x6a\xfa\x6a\xfb\x6a\xfc\x6a\xfd\x6a\xfe\x6b\x41\x6b\x42\x6b\x43\x6b\x44", /* e180 */ "\x6b\x45\x6b\x46\x6b\x47\x6b\x48\x6b\x49\x6b\x4a\x6b\x4b\x6b\x4c\x6b\x4d\x6b\x4e\x6b\x4f\x6b\x50\x6b\x51\x6b\x52\x6b\x53\x6b\x54\x6b\x55\x6b\x56\x6b\x57\x6b\x58\x6b\x59\x6b\x5a\x6b\x5b\x6b\x5c\x6b\x5d\x6b\x5e\x6b\x5f\x6b\x60\x6b\x61\x6b\x62\x6b\x63\x6b\x64\x6b\x65\x6b\x66\x6b\x67\x6b\x68\x6b\x69\x6b\x6a\x6b\x6b\x6b\x6c\x6b\x6d\x6b\x6e\x6b\x6f\x6b\x70\x6b\x71\x6b\x72\x6b\x73\x6b\x74\x6b\x75\x6b\x76\x6b\x77\x6b\x78\x6b\x79\x6b\x7a\x6b\x7b\x6b\x7c\x6b\x7d\x6b\x7e\x6b\x7f\x6b\x80\x6b\x81\x6b\x82\x6b\x83\x6b\x84\x6b\x85\x6b\x86\x6b\x87\x6b\x88\x6b\x89\x6b\x8a\x6b\x8b\x6b\x8c\x6b\x8d\x6b\x8e\x6b\x8f\x6b\x90\x6b\x91\x6b\x92\x6b\x93\x6b\x94\x6b\x95\x6b\x96\x6b\x97\x6b\x98\x6b\x99\x6b\x9a\x6b\x9b\x6b\x9c\x6b\x9d\x6b\x9e\x6b\x9f\x6b\xa0\x6b\xa1\x6b\xa2\x6b\xa3\x6b\xa4\x6b\xa5\x6b\xa6\x6b\xa7\x6b\xa8\x6b\xa9\x6b\xaa\x6b\xab\x6b\xac\x6b\xad\x6b\xae\x6b\xaf\x6b\xb0\x6b\xb1\x6b\xb2\x6b\xb3\x6b\xb4\x6b\xb5\x6b\xb6\x6b\xb7\x6b\xb8\x6b\xb9\x6b\xba\x6b\xbb\x6b\xbc\x6b\xbd\x6b\xbe\x6b\xbf\x6b\xc0\x6b\xc1\x6b\xc2\x6b\xc3\x6b\xc4", /* e200 */ "\x6b\xc5\x6b\xc6\x6b\xc7\x6b\xc8\x6b\xc9\x6b\xca\x6b\xcb\x6b\xcc\x6b\xcd\x6b\xce\x6b\xcf\x6b\xd0\x6b\xd1\x6b\xd2\x6b\xd3\x6b\xd4\x6b\xd5\x6b\xd6\x6b\xd7\x6b\xd8\x6b\xd9\x6b\xda\x6b\xdb\x6b\xdc\x6b\xdd\x6b\xde\x6b\xdf\x6b\xe0\x6b\xe1\x6b\xe2\x6b\xe3\x6b\xe4\x6b\xe5\x6b\xe6\x6b\xe7\x6b\xe8\x6b\xe9\x6b\xea\x6b\xeb\x6b\xec\x6b\xed\x6b\xee\x6b\xef\x6b\xf0\x6b\xf1\x6b\xf2\x6b\xf3\x6b\xf4\x6b\xf5\x6b\xf6\x6b\xf7\x6b\xf8\x6b\xf9\x6b\xfa\x6b\xfb\x6b\xfc\x6b\xfd\x6b\xfe\x6c\x41\x6c\x42\x6c\x43\x6c\x44\x6c\x45\x6c\x46\x6c\x47\x6c\x48\x6c\x49\x6c\x4a\x6c\x4b\x6c\x4c\x6c\x4d\x6c\x4e\x6c\x4f\x6c\x50\x6c\x51\x6c\x52\x6c\x53\x6c\x54\x6c\x55\x6c\x56\x6c\x57\x6c\x58\x6c\x59\x6c\x5a\x6c\x5b\x6c\x5c\x6c\x5d\x6c\x5e\x6c\x5f\x6c\x60\x6c\x61\x6c\x62\x6c\x63\x6c\x64\x6c\x65\x6c\x66\x6c\x67\x6c\x68\x6c\x69\x6c\x6a\x6c\x6b\x6c\x6c\x6c\x6d\x6c\x6e\x6c\x6f\x6c\x70\x6c\x71\x6c\x72\x6c\x73\x6c\x74\x6c\x75\x6c\x76\x6c\x77\x6c\x78\x6c\x79\x6c\x7a\x6c\x7b\x6c\x7c\x6c\x7d\x6c\x7e\x6c\x7f\x6c\x80\x6c\x81\x6c\x82\x6c\x83\x6c\x84\x6c\x85\x6c\x86", /* e280 */ "\x6c\x87\x6c\x88\x6c\x89\x6c\x8a\x6c\x8b\x6c\x8c\x6c\x8d\x6c\x8e\x6c\x8f\x6c\x90\x6c\x91\x6c\x92\x6c\x93\x6c\x94\x6c\x95\x6c\x96\x6c\x97\x6c\x98\x6c\x99\x6c\x9a\x6c\x9b\x6c\x9c\x6c\x9d\x6c\x9e\x6c\x9f\x6c\xa0\x6c\xa1\x6c\xa2\x6c\xa3\x6c\xa4\x6c\xa5\x6c\xa6\x6c\xa7\x6c\xa8\x6c\xa9\x6c\xaa\x6c\xab\x6c\xac\x6c\xad\x6c\xae\x6c\xaf\x6c\xb0\x6c\xb1\x6c\xb2\x6c\xb3\x6c\xb4\x6c\xb5\x6c\xb6\x6c\xb7\x6c\xb8\x6c\xb9\x6c\xba\x6c\xbb\x6c\xbc\x6c\xbd\x6c\xbe\x6c\xbf\x6c\xc0\x6c\xc1\x6c\xc2\x6c\xc3\x6c\xc4\x6c\xc5\x6c\xc6\x6c\xc7\x6c\xc8\x6c\xc9\x6c\xca\x6c\xcb\x6c\xcc\x6c\xcd\x6c\xce\x6c\xcf\x6c\xd0\x6c\xd1\x6c\xd2\x6c\xd3\x6c\xd4\x6c\xd5\x6c\xd6\x6c\xd7\x6c\xd8\x6c\xd9\x6c\xda\x6c\xdb\x6c\xdc\x6c\xdd\x6c\xde\x6c\xdf\x6c\xe0\x6c\xe1\x6c\xe2\x6c\xe3\x6c\xe4\x6c\xe5\x6c\xe6\x6c\xe7\x6c\xe8\x6c\xe9\x6c\xea\x6c\xeb\x6c\xec\x6c\xed\x6c\xee\x6c\xef\x6c\xf0\x6c\xf1\x6c\xf2\x6c\xf3\x6c\xf4\x6c\xf5\x6c\xf6\x6c\xf7\x6c\xf8\x6c\xf9\x6c\xfa\x6c\xfb\x6c\xfc\x6c\xfd\x6c\xfe\x6d\x41\x6d\x42\x6d\x43\x6d\x44\x6d\x45\x6d\x46\x6d\x47\x6d\x48", /* e300 */ "\x6d\x49\x6d\x4a\x6d\x4b\x6d\x4c\x6d\x4d\x6d\x4e\x6d\x4f\x6d\x50\x6d\x51\x6d\x52\x6d\x53\x6d\x54\x6d\x55\x6d\x56\x6d\x57\x6d\x58\x6d\x59\x6d\x5a\x6d\x5b\x6d\x5c\x6d\x5d\x6d\x5e\x6d\x5f\x6d\x60\x6d\x61\x6d\x62\x6d\x63\x6d\x64\x6d\x65\x6d\x66\x6d\x67\x6d\x68\x6d\x69\x6d\x6a\x6d\x6b\x6d\x6c\x6d\x6d\x6d\x6e\x6d\x6f\x6d\x70\x6d\x71\x6d\x72\x6d\x73\x6d\x74\x6d\x75\x6d\x76\x6d\x77\x6d\x78\x6d\x79\x6d\x7a\x6d\x7b\x6d\x7c\x6d\x7d\x6d\x7e\x6d\x7f\x6d\x80\x6d\x81\x6d\x82\x6d\x83\x6d\x84\x6d\x85\x6d\x86\x6d\x87\x6d\x88\x6d\x89\x6d\x8a\x6d\x8b\x6d\x8c\x6d\x8d\x6d\x8e\x6d\x8f\x6d\x90\x6d\x91\x6d\x92\x6d\x93\x6d\x94\x6d\x95\x6d\x96\x6d\x97\x6d\x98\x6d\x99\x6d\x9a\x6d\x9b\x6d\x9c\x6d\x9d\x6d\x9e\x6d\x9f\x6d\xa0\x6d\xa1\x6d\xa2\x6d\xa3\x6d\xa4\x6d\xa5\x6d\xa6\x6d\xa7\x6d\xa8\x6d\xa9\x6d\xaa\x6d\xab\x6d\xac\x6d\xad\x6d\xae\x6d\xaf\x6d\xb0\x6d\xb1\x6d\xb2\x6d\xb3\x6d\xb4\x6d\xb5\x6d\xb6\x6d\xb7\x6d\xb8\x6d\xb9\x6d\xba\x6d\xbb\x6d\xbc\x6d\xbd\x6d\xbe\x6d\xbf\x6d\xc0\x6d\xc1\x6d\xc2\x6d\xc3\x6d\xc4\x6d\xc5\x6d\xc6\x6d\xc7\x6d\xc8", /* e380 */ "\x6d\xc9\x6d\xca\x6d\xcb\x6d\xcc\x6d\xcd\x6d\xce\x6d\xcf\x6d\xd0\x6d\xd1\x6d\xd2\x6d\xd3\x6d\xd4\x6d\xd5\x6d\xd6\x6d\xd7\x6d\xd8\x6d\xd9\x6d\xda\x6d\xdb\x6d\xdc\x6d\xdd\x6d\xde\x6d\xdf\x6d\xe0\x6d\xe1\x6d\xe2\x6d\xe3\x6d\xe4\x6d\xe5\x6d\xe6\x6d\xe7\x6d\xe8\x6d\xe9\x6d\xea\x6d\xeb\x6d\xec\x6d\xed\x6d\xee\x6d\xef\x6d\xf0\x6d\xf1\x6d\xf2\x6d\xf3\x6d\xf4\x6d\xf5\x6d\xf6\x6d\xf7\x6d\xf8\x6d\xf9\x6d\xfa\x6d\xfb\x6d\xfc\x6d\xfd\x6d\xfe\x6e\x41\x6e\x42\x6e\x43\x6e\x44\x6e\x45\x6e\x46\x6e\x47\x6e\x48\x6e\x49\x6e\x4a\x6e\x4b\x6e\x4c\x6e\x4d\x6e\x4e\x6e\x4f\x6e\x50\x6e\x51\x6e\x52\x6e\x53\x6e\x54\x6e\x55\x6e\x56\x6e\x57\x6e\x58\x6e\x59\x6e\x5a\x6e\x5b\x6e\x5c\x6e\x5d\x6e\x5e\x6e\x5f\x6e\x60\x6e\x61\x6e\x62\x6e\x63\x6e\x64\x6e\x65\x6e\x66\x6e\x67\x6e\x68\x6e\x69\x6e\x6a\x6e\x6b\x6e\x6c\x6e\x6d\x6e\x6e\x6e\x6f\x6e\x70\x6e\x71\x6e\x72\x6e\x73\x6e\x74\x6e\x75\x6e\x76\x6e\x77\x6e\x78\x6e\x79\x6e\x7a\x6e\x7b\x6e\x7c\x6e\x7d\x6e\x7e\x6e\x7f\x6e\x80\x6e\x81\x6e\x82\x6e\x83\x6e\x84\x6e\x85\x6e\x86\x6e\x87\x6e\x88\x6e\x89\x6e\x8a", /* e400 */ "\x6e\x8b\x6e\x8c\x6e\x8d\x6e\x8e\x6e\x8f\x6e\x90\x6e\x91\x6e\x92\x6e\x93\x6e\x94\x6e\x95\x6e\x96\x6e\x97\x6e\x98\x6e\x99\x6e\x9a\x6e\x9b\x6e\x9c\x6e\x9d\x6e\x9e\x6e\x9f\x6e\xa0\x6e\xa1\x6e\xa2\x6e\xa3\x6e\xa4\x6e\xa5\x6e\xa6\x6e\xa7\x6e\xa8\x6e\xa9\x6e\xaa\x6e\xab\x6e\xac\x6e\xad\x6e\xae\x6e\xaf\x6e\xb0\x6e\xb1\x6e\xb2\x6e\xb3\x6e\xb4\x6e\xb5\x6e\xb6\x6e\xb7\x6e\xb8\x6e\xb9\x6e\xba\x6e\xbb\x6e\xbc\x6e\xbd\x6e\xbe\x6e\xbf\x6e\xc0\x6e\xc1\x6e\xc2\x6e\xc3\x6e\xc4\x6e\xc5\x6e\xc6\x6e\xc7\x6e\xc8\x6e\xc9\x6e\xca\x6e\xcb\x6e\xcc\x6e\xcd\x6e\xce\x6e\xcf\x6e\xd0\x6e\xd1\x6e\xd2\x6e\xd3\x6e\xd4\x6e\xd5\x6e\xd6\x6e\xd7\x6e\xd8\x6e\xd9\x6e\xda\x6e\xdb\x6e\xdc\x6e\xdd\x6e\xde\x6e\xdf\x6e\xe0\x6e\xe1\x6e\xe2\x6e\xe3\x6e\xe4\x6e\xe5\x6e\xe6\x6e\xe7\x6e\xe8\x6e\xe9\x6e\xea\x6e\xeb\x6e\xec\x6e\xed\x6e\xee\x6e\xef\x6e\xf0\x6e\xf1\x6e\xf2\x6e\xf3\x6e\xf4\x6e\xf5\x6e\xf6\x6e\xf7\x6e\xf8\x6e\xf9\x6e\xfa\x6e\xfb\x6e\xfc\x6e\xfd\x6e\xfe\x6f\x41\x6f\x42\x6f\x43\x6f\x44\x6f\x45\x6f\x46\x6f\x47\x6f\x48\x6f\x49\x6f\x4a\x6f\x4b\x6f\x4c", /* e480 */ "\x6f\x4d\x6f\x4e\x6f\x4f\x6f\x50\x6f\x51\x6f\x52\x6f\x53\x6f\x54\x6f\x55\x6f\x56\x6f\x57\x6f\x58\x6f\x59\x6f\x5a\x6f\x5b\x6f\x5c\x6f\x5d\x6f\x5e\x6f\x5f\x6f\x60\x6f\x61\x6f\x62\x6f\x63\x6f\x64\x6f\x65\x6f\x66\x6f\x67\x6f\x68\x6f\x69\x6f\x6a\x6f\x6b\x6f\x6c\x6f\x6d\x6f\x6e\x6f\x6f\x6f\x70\x6f\x71\x6f\x72\x6f\x73\x6f\x74\x6f\x75\x6f\x76\x6f\x77\x6f\x78\x6f\x79\x6f\x7a\x6f\x7b\x6f\x7c\x6f\x7d\x6f\x7e\x6f\x7f\x6f\x80\x6f\x81\x6f\x82\x6f\x83\x6f\x84\x6f\x85\x6f\x86\x6f\x87\x6f\x88\x6f\x89\x6f\x8a\x6f\x8b\x6f\x8c\x6f\x8d\x6f\x8e\x6f\x8f\x6f\x90\x6f\x91\x6f\x92\x6f\x93\x6f\x94\x6f\x95\x6f\x96\x6f\x97\x6f\x98\x6f\x99\x6f\x9a\x6f\x9b\x6f\x9c\x6f\x9d\x6f\x9e\x6f\x9f\x6f\xa0\x6f\xa1\x6f\xa2\x6f\xa3\x6f\xa4\x6f\xa5\x6f\xa6\x6f\xa7\x6f\xa8\x6f\xa9\x6f\xaa\x6f\xab\x6f\xac\x6f\xad\x6f\xae\x6f\xaf\x6f\xb0\x6f\xb1\x6f\xb2\x6f\xb3\x6f\xb4\x6f\xb5\x6f\xb6\x6f\xb7\x6f\xb8\x6f\xb9\x6f\xba\x6f\xbb\x6f\xbc\x6f\xbd\x6f\xbe\x6f\xbf\x6f\xc0\x6f\xc1\x6f\xc2\x6f\xc3\x6f\xc4\x6f\xc5\x6f\xc6\x6f\xc7\x6f\xc8\x6f\xc9\x6f\xca\x6f\xcb\x6f\xcc", /* e500 */ "\x6f\xcd\x6f\xce\x6f\xcf\x6f\xd0\x6f\xd1\x6f\xd2\x6f\xd3\x6f\xd4\x6f\xd5\x6f\xd6\x6f\xd7\x6f\xd8\x6f\xd9\x6f\xda\x6f\xdb\x6f\xdc\x6f\xdd\x6f\xde\x6f\xdf\x6f\xe0\x6f\xe1\x6f\xe2\x6f\xe3\x6f\xe4\x6f\xe5\x6f\xe6\x6f\xe7\x6f\xe8\x6f\xe9\x6f\xea\x6f\xeb\x6f\xec\x6f\xed\x6f\xee\x6f\xef\x6f\xf0\x6f\xf1\x6f\xf2\x6f\xf3\x6f\xf4\x6f\xf5\x6f\xf6\x6f\xf7\x6f\xf8\x6f\xf9\x6f\xfa\x6f\xfb\x6f\xfc\x6f\xfd\x6f\xfe\x70\x41\x70\x42\x70\x43\x70\x44\x70\x45\x70\x46\x70\x47\x70\x48\x70\x49\x70\x4a\x70\x4b\x70\x4c\x70\x4d\x70\x4e\x70\x4f\x70\x50\x70\x51\x70\x52\x70\x53\x70\x54\x70\x55\x70\x56\x70\x57\x70\x58\x70\x59\x70\x5a\x70\x5b\x70\x5c\x70\x5d\x70\x5e\x70\x5f\x70\x60\x70\x61\x70\x62\x70\x63\x70\x64\x70\x65\x70\x66\x70\x67\x70\x68\x70\x69\x70\x6a\x70\x6b\x70\x6c\x70\x6d\x70\x6e\x70\x6f\x70\x70\x70\x71\x70\x72\x70\x73\x70\x74\x70\x75\x70\x76\x70\x77\x70\x78\x70\x79\x70\x7a\x70\x7b\x70\x7c\x70\x7d\x70\x7e\x70\x7f\x70\x80\x70\x81\x70\x82\x70\x83\x70\x84\x70\x85\x70\x86\x70\x87\x70\x88\x70\x89\x70\x8a\x70\x8b\x70\x8c\x70\x8d\x70\x8e", /* e580 */ "\x70\x8f\x70\x90\x70\x91\x70\x92\x70\x93\x70\x94\x70\x95\x70\x96\x70\x97\x70\x98\x70\x99\x70\x9a\x70\x9b\x70\x9c\x70\x9d\x70\x9e\x70\x9f\x70\xa0\x70\xa1\x70\xa2\x70\xa3\x70\xa4\x70\xa5\x70\xa6\x70\xa7\x70\xa8\x70\xa9\x70\xaa\x70\xab\x70\xac\x70\xad\x70\xae\x70\xaf\x70\xb0\x70\xb1\x70\xb2\x70\xb3\x70\xb4\x70\xb5\x70\xb6\x70\xb7\x70\xb8\x70\xb9\x70\xba\x70\xbb\x70\xbc\x70\xbd\x70\xbe\x70\xbf\x70\xc0\x70\xc1\x70\xc2\x70\xc3\x70\xc4\x70\xc5\x70\xc6\x70\xc7\x70\xc8\x70\xc9\x70\xca\x70\xcb\x70\xcc\x70\xcd\x70\xce\x70\xcf\x70\xd0\x70\xd1\x70\xd2\x70\xd3\x70\xd4\x70\xd5\x70\xd6\x70\xd7\x70\xd8\x70\xd9\x70\xda\x70\xdb\x70\xdc\x70\xdd\x70\xde\x70\xdf\x70\xe0\x70\xe1\x70\xe2\x70\xe3\x70\xe4\x70\xe5\x70\xe6\x70\xe7\x70\xe8\x70\xe9\x70\xea\x70\xeb\x70\xec\x70\xed\x70\xee\x70\xef\x70\xf0\x70\xf1\x70\xf2\x70\xf3\x70\xf4\x70\xf5\x70\xf6\x70\xf7\x70\xf8\x70\xf9\x70\xfa\x70\xfb\x70\xfc\x70\xfd\x70\xfe\x71\x41\x71\x42\x71\x43\x71\x44\x71\x45\x71\x46\x71\x47\x71\x48\x71\x49\x71\x4a\x71\x4b\x71\x4c\x71\x4d\x71\x4e\x71\x4f\x71\x50", /* e600 */ "\x71\x51\x71\x52\x71\x53\x71\x54\x71\x55\x71\x56\x71\x57\x71\x58\x71\x59\x71\x5a\x71\x5b\x71\x5c\x71\x5d\x71\x5e\x71\x5f\x71\x60\x71\x61\x71\x62\x71\x63\x71\x64\x71\x65\x71\x66\x71\x67\x71\x68\x71\x69\x71\x6a\x71\x6b\x71\x6c\x71\x6d\x71\x6e\x71\x6f\x71\x70\x71\x71\x71\x72\x71\x73\x71\x74\x71\x75\x71\x76\x71\x77\x71\x78\x71\x79\x71\x7a\x71\x7b\x71\x7c\x71\x7d\x71\x7e\x71\x7f\x71\x80\x71\x81\x71\x82\x71\x83\x71\x84\x71\x85\x71\x86\x71\x87\x71\x88\x71\x89\x71\x8a\x71\x8b\x71\x8c\x71\x8d\x71\x8e\x71\x8f\x71\x90\x71\x91\x71\x92\x71\x93\x71\x94\x71\x95\x71\x96\x71\x97\x71\x98\x71\x99\x71\x9a\x71\x9b\x71\x9c\x71\x9d\x71\x9e\x71\x9f\x71\xa0\x71\xa1\x71\xa2\x71\xa3\x71\xa4\x71\xa5\x71\xa6\x71\xa7\x71\xa8\x71\xa9\x71\xaa\x71\xab\x71\xac\x71\xad\x71\xae\x71\xaf\x71\xb0\x71\xb1\x71\xb2\x71\xb3\x71\xb4\x71\xb5\x71\xb6\x71\xb7\x71\xb8\x71\xb9\x71\xba\x71\xbb\x71\xbc\x71\xbd\x71\xbe\x71\xbf\x71\xc0\x71\xc1\x71\xc2\x71\xc3\x71\xc4\x71\xc5\x71\xc6\x71\xc7\x71\xc8\x71\xc9\x71\xca\x71\xcb\x71\xcc\x71\xcd\x71\xce\x71\xcf\x71\xd0", /* e680 */ "\x71\xd1\x71\xd2\x71\xd3\x71\xd4\x71\xd5\x71\xd6\x71\xd7\x71\xd8\x71\xd9\x71\xda\x71\xdb\x71\xdc\x71\xdd\x71\xde\x71\xdf\x71\xe0\x71\xe1\x71\xe2\x71\xe3\x71\xe4\x71\xe5\x71\xe6\x71\xe7\x71\xe8\x71\xe9\x71\xea\x71\xeb\x71\xec\x71\xed\x71\xee\x71\xef\x71\xf0\x71\xf1\x71\xf2\x71\xf3\x71\xf4\x71\xf5\x71\xf6\x71\xf7\x71\xf8\x71\xf9\x71\xfa\x71\xfb\x71\xfc\x71\xfd\x71\xfe\x72\x41\x72\x42\x72\x43\x72\x44\x72\x45\x72\x46\x72\x47\x72\x48\x72\x49\x72\x4a\x72\x4b\x72\x4c\x72\x4d\x72\x4e\x72\x4f\x72\x50\x72\x51\x72\x52\x72\x53\x72\x54\x72\x55\x72\x56\x72\x57\x72\x58\x72\x59\x72\x5a\x72\x5b\x72\x5c\x72\x5d\x72\x5e\x72\x5f\x72\x60\x72\x61\x72\x62\x72\x63\x72\x64\x72\x65\x72\x66\x72\x67\x72\x68\x72\x69\x72\x6a\x72\x6b\x72\x6c\x72\x6d\x72\x6e\x72\x6f\x72\x70\x72\x71\x72\x72\x72\x73\x72\x74\x72\x75\x72\x76\x72\x77\x72\x78\x72\x79\x72\x7a\x72\x7b\x72\x7c\x72\x7d\x72\x7e\x72\x7f\x72\x80\x72\x81\x72\x82\x72\x83\x72\x84\x72\x85\x72\x86\x72\x87\x72\x88\x72\x89\x72\x8a\x72\x8b\x72\x8c\x72\x8d\x72\x8e\x72\x8f\x72\x90\x72\x91\x72\x92", /* e700 */ "\x72\x93\x72\x94\x72\x95\x72\x96\x72\x97\x72\x98\x72\x99\x72\x9a\x72\x9b\x72\x9c\x72\x9d\x72\x9e\x72\x9f\x72\xa0\x72\xa1\x72\xa2\x72\xa3\x72\xa4\x72\xa5\x72\xa6\x72\xa7\x72\xa8\x72\xa9\x72\xaa\x72\xab\x72\xac\x72\xad\x72\xae\x72\xaf\x72\xb0\x72\xb1\x72\xb2\x72\xb3\x72\xb4\x72\xb5\x72\xb6\x72\xb7\x72\xb8\x72\xb9\x72\xba\x72\xbb\x72\xbc\x72\xbd\x72\xbe\x72\xbf\x72\xc0\x72\xc1\x72\xc2\x72\xc3\x72\xc4\x72\xc5\x72\xc6\x72\xc7\x72\xc8\x72\xc9\x72\xca\x72\xcb\x72\xcc\x72\xcd\x72\xce\x72\xcf\x72\xd0\x72\xd1\x72\xd2\x72\xd3\x72\xd4\x72\xd5\x72\xd6\x72\xd7\x72\xd8\x72\xd9\x72\xda\x72\xdb\x72\xdc\x72\xdd\x72\xde\x72\xdf\x72\xe0\x72\xe1\x72\xe2\x72\xe3\x72\xe4\x72\xe5\x72\xe6\x72\xe7\x72\xe8\x72\xe9\x72\xea\x72\xeb\x72\xec\x72\xed\x72\xee\x72\xef\x72\xf0\x72\xf1\x72\xf2\x72\xf3\x72\xf4\x72\xf5\x72\xf6\x72\xf7\x72\xf8\x72\xf9\x72\xfa\x72\xfb\x72\xfc\x72\xfd\x72\xfe\x73\x41\x73\x42\x73\x43\x73\x44\x73\x45\x73\x46\x73\x47\x73\x48\x73\x49\x73\x4a\x73\x4b\x73\x4c\x73\x4d\x73\x4e\x73\x4f\x73\x50\x73\x51\x73\x52\x73\x53\x73\x54", /* e780 */ "\x73\x55\x73\x56\x73\x57\x73\x58\x73\x59\x73\x5a\x73\x5b\x73\x5c\x73\x5d\x73\x5e\x73\x5f\x73\x60\x73\x61\x73\x62\x73\x63\x73\x64\x73\x65\x73\x66\x73\x67\x73\x68\x73\x69\x73\x6a\x73\x6b\x73\x6c\x73\x6d\x73\x6e\x73\x6f\x73\x70\x73\x71\x73\x72\x73\x73\x73\x74\x73\x75\x73\x76\x73\x77\x73\x78\x73\x79\x73\x7a\x73\x7b\x73\x7c\x73\x7d\x73\x7e\x73\x7f\x73\x80\x73\x81\x73\x82\x73\x83\x73\x84\x73\x85\x73\x86\x73\x87\x73\x88\x73\x89\x73\x8a\x73\x8b\x73\x8c\x73\x8d\x73\x8e\x73\x8f\x73\x90\x73\x91\x73\x92\x73\x93\x73\x94\x73\x95\x73\x96\x73\x97\x73\x98\x73\x99\x73\x9a\x73\x9b\x73\x9c\x73\x9d\x73\x9e\x73\x9f\x73\xa0\x73\xa1\x73\xa2\x73\xa3\x73\xa4\x73\xa5\x73\xa6\x73\xa7\x73\xa8\x73\xa9\x73\xaa\x73\xab\x73\xac\x73\xad\x73\xae\x73\xaf\x73\xb0\x73\xb1\x73\xb2\x73\xb3\x73\xb4\x73\xb5\x73\xb6\x73\xb7\x73\xb8\x73\xb9\x73\xba\x73\xbb\x73\xbc\x73\xbd\x73\xbe\x73\xbf\x73\xc0\x73\xc1\x73\xc2\x73\xc3\x73\xc4\x73\xc5\x73\xc6\x73\xc7\x73\xc8\x73\xc9\x73\xca\x73\xcb\x73\xcc\x73\xcd\x73\xce\x73\xcf\x73\xd0\x73\xd1\x73\xd2\x73\xd3\x73\xd4", /* e800 */ "\x73\xd5\x73\xd6\x73\xd7\x73\xd8\x73\xd9\x73\xda\x73\xdb\x73\xdc\x73\xdd\x73\xde\x73\xdf\x73\xe0\x73\xe1\x73\xe2\x73\xe3\x73\xe4\x73\xe5\x73\xe6\x73\xe7\x73\xe8\x73\xe9\x73\xea\x73\xeb\x73\xec\x73\xed\x73\xee\x73\xef\x73\xf0\x73\xf1\x73\xf2\x73\xf3\x73\xf4\x73\xf5\x73\xf6\x73\xf7\x73\xf8\x73\xf9\x73\xfa\x73\xfb\x73\xfc\x73\xfd\x73\xfe\x74\x41\x74\x42\x74\x43\x74\x44\x74\x45\x74\x46\x74\x47\x74\x48\x74\x49\x74\x4a\x74\x4b\x74\x4c\x74\x4d\x74\x4e\x74\x4f\x74\x50\x74\x51\x74\x52\x74\x53\x74\x54\x74\x55\x74\x56\x74\x57\x74\x58\x74\x59\x74\x5a\x74\x5b\x74\x5c\x74\x5d\x74\x5e\x74\x5f\x74\x60\x74\x61\x74\x62\x74\x63\x74\x64\x74\x65\x74\x66\x74\x67\x74\x68\x74\x69\x74\x6a\x74\x6b\x74\x6c\x74\x6d\x74\x6e\x74\x6f\x74\x70\x74\x71\x74\x72\x74\x73\x74\x74\x74\x75\x74\x76\x74\x77\x74\x78\x74\x79\x74\x7a\x74\x7b\x74\x7c\x74\x7d\x74\x7e\x74\x7f\x74\x80\x74\x81\x74\x82\x74\x83\x74\x84\x74\x85\x74\x86\x74\x87\x74\x88\x74\x89\x74\x8a\x74\x8b\x74\x8c\x74\x8d\x74\x8e\x74\x8f\x74\x90\x74\x91\x74\x92\x74\x93\x74\x94\x74\x95\x74\x96", /* e880 */ "\x74\x97\x74\x98\x74\x99\x74\x9a\x74\x9b\x74\x9c\x74\x9d\x74\x9e\x74\x9f\x74\xa0\x74\xa1\x74\xa2\x74\xa3\x74\xa4\x74\xa5\x74\xa6\x74\xa7\x74\xa8\x74\xa9\x74\xaa\x74\xab\x74\xac\x74\xad\x74\xae\x74\xaf\x74\xb0\x74\xb1\x74\xb2\x74\xb3\x74\xb4\x74\xb5\x74\xb6\x74\xb7\x74\xb8\x74\xb9\x74\xba\x74\xbb\x74\xbc\x74\xbd\x74\xbe\x74\xbf\x74\xc0\x74\xc1\x74\xc2\x74\xc3\x74\xc4\x74\xc5\x74\xc6\x74\xc7\x74\xc8\x74\xc9\x74\xca\x74\xcb\x74\xcc\x74\xcd\x74\xce\x74\xcf\x74\xd0\x74\xd1\x74\xd2\x74\xd3\x74\xd4\x74\xd5\x74\xd6\x74\xd7\x74\xd8\x74\xd9\x74\xda\x74\xdb\x74\xdc\x74\xdd\x74\xde\x74\xdf\x74\xe0\x74\xe1\x74\xe2\x74\xe3\x74\xe4\x74\xe5\x74\xe6\x74\xe7\x74\xe8\x74\xe9\x74\xea\x74\xeb\x74\xec\x74\xed\x74\xee\x74\xef\x74\xf0\x74\xf1\x74\xf2\x74\xf3\x74\xf4\x74\xf5\x74\xf6\x74\xf7\x74\xf8\x74\xf9\x74\xfa\x74\xfb\x74\xfc\x74\xfd\x74\xfe\x75\x41\x75\x42\x75\x43\x75\x44\x75\x45\x75\x46\x75\x47\x75\x48\x75\x49\x75\x4a\x75\x4b\x75\x4c\x75\x4d\x75\x4e\x75\x4f\x75\x50\x75\x51\x75\x52\x75\x53\x75\x54\x75\x55\x75\x56\x75\x57\x75\x58", /* e900 */ "\x75\x59\x75\x5a\x75\x5b\x75\x5c\x75\x5d\x75\x5e\x75\x5f\x75\x60\x75\x61\x75\x62\x75\x63\x75\x64\x75\x65\x75\x66\x75\x67\x75\x68\x75\x69\x75\x6a\x75\x6b\x75\x6c\x75\x6d\x75\x6e\x75\x6f\x75\x70\x75\x71\x75\x72\x75\x73\x75\x74\x75\x75\x75\x76\x75\x77\x75\x78\x75\x79\x75\x7a\x75\x7b\x75\x7c\x75\x7d\x75\x7e\x75\x7f\x75\x80\x75\x81\x75\x82\x75\x83\x75\x84\x75\x85\x75\x86\x75\x87\x75\x88\x75\x89\x75\x8a\x75\x8b\x75\x8c\x75\x8d\x75\x8e\x75\x8f\x75\x90\x75\x91\x75\x92\x75\x93\x75\x94\x75\x95\x75\x96\x75\x97\x75\x98\x75\x99\x75\x9a\x75\x9b\x75\x9c\x75\x9d\x75\x9e\x75\x9f\x75\xa0\x75\xa1\x75\xa2\x75\xa3\x75\xa4\x75\xa5\x75\xa6\x75\xa7\x75\xa8\x75\xa9\x75\xaa\x75\xab\x75\xac\x75\xad\x75\xae\x75\xaf\x75\xb0\x75\xb1\x75\xb2\x75\xb3\x75\xb4\x75\xb5\x75\xb6\x75\xb7\x75\xb8\x75\xb9\x75\xba\x75\xbb\x75\xbc\x75\xbd\x75\xbe\x75\xbf\x75\xc0\x75\xc1\x75\xc2\x75\xc3\x75\xc4\x75\xc5\x75\xc6\x75\xc7\x75\xc8\x75\xc9\x75\xca\x75\xcb\x75\xcc\x75\xcd\x75\xce\x75\xcf\x75\xd0\x75\xd1\x75\xd2\x75\xd3\x75\xd4\x75\xd5\x75\xd6\x75\xd7\x75\xd8", /* e980 */ "\x75\xd9\x75\xda\x75\xdb\x75\xdc\x75\xdd\x75\xde\x75\xdf\x75\xe0\x75\xe1\x75\xe2\x75\xe3\x75\xe4\x75\xe5\x75\xe6\x75\xe7\x75\xe8\x75\xe9\x75\xea\x75\xeb\x75\xec\x75\xed\x75\xee\x75\xef\x75\xf0\x75\xf1\x75\xf2\x75\xf3\x75\xf4\x75\xf5\x75\xf6\x75\xf7\x75\xf8\x75\xf9\x75\xfa\x75\xfb\x75\xfc\x75\xfd\x75\xfe\x76\x41\x76\x42\x76\x43\x76\x44\x76\x45\x76\x46\x76\x47\x76\x48\x76\x49\x76\x4a\x76\x4b\x76\x4c\x76\x4d\x76\x4e\x76\x4f\x76\x50\x76\x51\x76\x52\x76\x53\x76\x54\x76\x55\x76\x56\x76\x57\x76\x58\x76\x59\x76\x5a\x76\x5b\x76\x5c\x76\x5d\x76\x5e\x76\x5f\x76\x60\x76\x61\x76\x62\x76\x63\x76\x64\x76\x65\x76\x66\x76\x67\x76\x68\x76\x69\x76\x6a\x76\x6b\x76\x6c\x76\x6d\x76\x6e\x76\x6f\x76\x70\x76\x71\x76\x72\x76\x73\x76\x74\x76\x75\x76\x76\x76\x77\x76\x78\x76\x79\x76\x7a\x76\x7b\x76\x7c\x76\x7d\x76\x7e\x76\x7f\x76\x80\x76\x81\x76\x82\x76\x83\x76\x84\x76\x85\x76\x86\x76\x87\x76\x88\x76\x89\x76\x8a\x76\x8b\x76\x8c\x76\x8d\x76\x8e\x76\x8f\x76\x90\x76\x91\x76\x92\x76\x93\x76\x94\x76\x95\x76\x96\x76\x97\x76\x98\x76\x99\x76\x9a", /* ea00 */ "\x76\x9b\x76\x9c\x76\x9d\x76\x9e\x76\x9f\x76\xa0\x76\xa1\x76\xa2\x76\xa3\x76\xa4\x76\xa5\x76\xa6\x76\xa7\x76\xa8\x76\xa9\x76\xaa\x76\xab\x76\xac\x76\xad\x76\xae\x76\xaf\x76\xb0\x76\xb1\x76\xb2\x76\xb3\x76\xb4\x76\xb5\x76\xb6\x76\xb7\x76\xb8\x76\xb9\x76\xba\x76\xbb\x76\xbc\x76\xbd\x76\xbe\x76\xbf\x76\xc0\x76\xc1\x76\xc2\x76\xc3\x76\xc4\x76\xc5\x76\xc6\x76\xc7\x76\xc8\x76\xc9\x76\xca\x76\xcb\x76\xcc\x76\xcd\x76\xce\x76\xcf\x76\xd0\x76\xd1\x76\xd2\x76\xd3\x76\xd4\x76\xd5\x76\xd6\x76\xd7\x76\xd8\x76\xd9\x76\xda\x76\xdb\x76\xdc\x76\xdd\x76\xde\x76\xdf\x76\xe0\x76\xe1\x76\xe2\x76\xe3\x76\xe4\x76\xe5\x76\xe6\x76\xe7\x76\xe8\x76\xe9\x76\xea\x76\xeb\x76\xec\x76\xed\x76\xee\x76\xef\x76\xf0\x76\xf1\x76\xf2\x76\xf3\x76\xf4\x76\xf5\x76\xf6\x76\xf7\x76\xf8\x76\xf9\x76\xfa\x76\xfb\x76\xfc\x76\xfd\x76\xfe\x77\x41\x77\x42\x77\x43\x77\x44\x77\x45\x77\x46\x77\x47\x77\x48\x77\x49\x77\x4a\x77\x4b\x77\x4c\x77\x4d\x77\x4e\x77\x4f\x77\x50\x77\x51\x77\x52\x77\x53\x77\x54\x77\x55\x77\x56\x77\x57\x77\x58\x77\x59\x77\x5a\x77\x5b\x77\x5c", /* ea80 */ "\x77\x5d\x77\x5e\x77\x5f\x77\x60\x77\x61\x77\x62\x77\x63\x77\x64\x77\x65\x77\x66\x77\x67\x77\x68\x77\x69\x77\x6a\x77\x6b\x77\x6c\x77\x6d\x77\x6e\x77\x6f\x77\x70\x77\x71\x77\x72\x77\x73\x77\x74\x77\x75\x77\x76\x77\x77\x77\x78\x77\x79\x77\x7a\x77\x7b\x77\x7c\x77\x7d\x77\x7e\x77\x7f\x77\x80\x77\x81\x77\x82\x77\x83\x77\x84\x77\x85\x77\x86\x77\x87\x77\x88\x77\x89\x77\x8a\x77\x8b\x77\x8c\x77\x8d\x77\x8e\x77\x8f\x77\x90\x77\x91\x77\x92\x77\x93\x77\x94\x77\x95\x77\x96\x77\x97\x77\x98\x77\x99\x77\x9a\x77\x9b\x77\x9c\x77\x9d\x77\x9e\x77\x9f\x77\xa0\x77\xa1\x77\xa2\x77\xa3\x77\xa4\x77\xa5\x77\xa6\x77\xa7\x77\xa8\x77\xa9\x77\xaa\x77\xab\x77\xac\x77\xad\x77\xae\x77\xaf\x77\xb0\x77\xb1\x77\xb2\x77\xb3\x77\xb4\x77\xb5\x77\xb6\x77\xb7\x77\xb8\x77\xb9\x77\xba\x77\xbb\x77\xbc\x77\xbd\x77\xbe\x77\xbf\x77\xc0\x77\xc1\x77\xc2\x77\xc3\x77\xc4\x77\xc5\x77\xc6\x77\xc7\x77\xc8\x77\xc9\x77\xca\x77\xcb\x77\xcc\x77\xcd\x77\xce\x77\xcf\x77\xd0\x77\xd1\x77\xd2\x77\xd3\x77\xd4\x77\xd5\x77\xd6\x77\xd7\x77\xd8\x77\xd9\x77\xda\x77\xdb\x77\xdc", /* eb00 */ "\x77\xdd\x77\xde\x77\xdf\x77\xe0\x77\xe1\x77\xe2\x77\xe3\x77\xe4\x77\xe5\x77\xe6\x77\xe7\x77\xe8\x77\xe9\x77\xea\x77\xeb\x77\xec\x77\xed\x77\xee\x77\xef\x77\xf0\x77\xf1\x77\xf2\x77\xf3\x77\xf4\x77\xf5\x77\xf6\x77\xf7\x77\xf8\x77\xf9\x77\xfa\x77\xfb\x77\xfc\x77\xfd\x77\xfe\x78\x41\x78\x42\x78\x43\x78\x44\x78\x45\x78\x46\x78\x47\x78\x48\x78\x49\x78\x4a\x78\x4b\x78\x4c\x78\x4d\x78\x4e\x78\x4f\x78\x50\x78\x51\x78\x52\x78\x53\x78\x54\x78\x55\x78\x56\x78\x57\x78\x58\x78\x59\x78\x5a\x78\x5b\x78\x5c\x78\x5d\x78\x5e\x78\x5f\x78\x60\x78\x61\x78\x62\x78\x63\x78\x64\x78\x65\x78\x66\x78\x67\x78\x68\x78\x69\x78\x6a\x78\x6b\x78\x6c\x78\x6d\x78\x6e\x78\x6f\x78\x70\x78\x71\x78\x72\x78\x73\x78\x74\x78\x75\x78\x76\x78\x77\x78\x78\x78\x79\x78\x7a\x78\x7b\x78\x7c\x78\x7d\x78\x7e\x78\x7f\x78\x80\x78\x81\x78\x82\x78\x83\x78\x84\x78\x85\x78\x86\x78\x87\x78\x88\x78\x89\x78\x8a\x78\x8b\x78\x8c\x78\x8d\x78\x8e\x78\x8f\x78\x90\x78\x91\x78\x92\x78\x93\x78\x94\x78\x95\x78\x96\x78\x97\x78\x98\x78\x99\x78\x9a\x78\x9b\x78\x9c\x78\x9d\x78\x9e", /* eb80 */ "\x78\x9f\x78\xa0\x78\xa1\x78\xa2\x78\xa3\x78\xa4\x78\xa5\x78\xa6\x78\xa7\x78\xa8\x78\xa9\x78\xaa\x78\xab\x78\xac\x78\xad\x78\xae\x78\xaf\x78\xb0\x78\xb1\x78\xb2\x78\xb3\x78\xb4\x78\xb5\x78\xb6\x78\xb7\x78\xb8\x78\xb9\x78\xba\x78\xbb\x78\xbc\x78\xbd\x78\xbe\x78\xbf\x78\xc0\x78\xc1\x78\xc2\x78\xc3\x78\xc4\x78\xc5\x78\xc6\x78\xc7\x78\xc8\x78\xc9\x78\xca\x78\xcb\x78\xcc\x78\xcd\x78\xce\x78\xcf\x78\xd0\x78\xd1\x78\xd2\x78\xd3\x78\xd4\x78\xd5\x78\xd6\x78\xd7\x78\xd8\x78\xd9\x78\xda\x78\xdb\x78\xdc\x78\xdd\x78\xde\x78\xdf\x78\xe0\x78\xe1\x78\xe2\x78\xe3\x78\xe4\x78\xe5\x78\xe6\x78\xe7\x78\xe8\x78\xe9\x78\xea\x78\xeb\x78\xec\x78\xed\x78\xee\x78\xef\x78\xf0\x78\xf1\x78\xf2\x78\xf3\x78\xf4\x78\xf5\x78\xf6\x78\xf7\x78\xf8\x78\xf9\x78\xfa\x78\xfb\x78\xfc\x78\xfd\x78\xfe\x79\x41\x79\x42\x79\x43\x79\x44\x79\x45\x79\x46\x79\x47\x79\x48\x79\x49\x79\x4a\x79\x4b\x79\x4c\x79\x4d\x79\x4e\x79\x4f\x79\x50\x79\x51\x79\x52\x79\x53\x79\x54\x79\x55\x79\x56\x79\x57\x79\x58\x79\x59\x79\x5a\x79\x5b\x79\x5c\x79\x5d\x79\x5e\x79\x5f\x79\x60", /* ec00 */ "\x79\x61\x79\x62\x79\x63\x79\x64\x79\x65\x79\x66\x79\x67\x79\x68\x79\x69\x79\x6a\x79\x6b\x79\x6c\x79\x6d\x79\x6e\x79\x6f\x79\x70\x79\x71\x79\x72\x79\x73\x79\x74\x79\x75\x79\x76\x79\x77\x79\x78\x79\x79\x79\x7a\x79\x7b\x79\x7c\x79\x7d\x79\x7e\x79\x7f\x79\x80\x79\x81\x79\x82\x79\x83\x79\x84\x79\x85\x79\x86\x79\x87\x79\x88\x79\x89\x79\x8a\x79\x8b\x79\x8c\x79\x8d\x79\x8e\x79\x8f\x79\x90\x79\x91\x79\x92\x79\x93\x79\x94\x79\x95\x79\x96\x79\x97\x79\x98\x79\x99\x79\x9a\x79\x9b\x79\x9c\x79\x9d\x79\x9e\x79\x9f\x79\xa0\x79\xa1\x79\xa2\x79\xa3\x79\xa4\x79\xa5\x79\xa6\x79\xa7\x79\xa8\x79\xa9\x79\xaa\x79\xab\x79\xac\x79\xad\x79\xae\x79\xaf\x79\xb0\x79\xb1\x79\xb2\x79\xb3\x79\xb4\x79\xb5\x79\xb6\x79\xb7\x79\xb8\x79\xb9\x79\xba\x79\xbb\x79\xbc\x79\xbd\x79\xbe\x79\xbf\x79\xc0\x79\xc1\x79\xc2\x79\xc3\x79\xc4\x79\xc5\x79\xc6\x79\xc7\x79\xc8\x79\xc9\x79\xca\x79\xcb\x79\xcc\x79\xcd\x79\xce\x79\xcf\x79\xd0\x79\xd1\x79\xd2\x79\xd3\x79\xd4\x79\xd5\x79\xd6\x79\xd7\x79\xd8\x79\xd9\x79\xda\x79\xdb\x79\xdc\x79\xdd\x79\xde\x79\xdf\x79\xe0", /* ec80 */ "\x79\xe1\x79\xe2\x79\xe3\x79\xe4\x79\xe5\x79\xe6\x79\xe7\x79\xe8\x79\xe9\x79\xea\x79\xeb\x79\xec\x79\xed\x79\xee\x79\xef\x79\xf0\x79\xf1\x79\xf2\x79\xf3\x79\xf4\x79\xf5\x79\xf6\x79\xf7\x79\xf8\x79\xf9\x79\xfa\x79\xfb\x79\xfc\x79\xfd\x79\xfe\x7a\x41\x7a\x42\x7a\x43\x7a\x44\x7a\x45\x7a\x46\x7a\x47\x7a\x48\x7a\x49\x7a\x4a\x7a\x4b\x7a\x4c\x7a\x4d\x7a\x4e\x7a\x4f\x7a\x50\x7a\x51\x7a\x52\x7a\x53\x7a\x54\x7a\x55\x7a\x56\x7a\x57\x7a\x58\x7a\x59\x7a\x5a\x7a\x5b\x7a\x5c\x7a\x5d\x7a\x5e\x7a\x5f\x7a\x60\x7a\x61\x7a\x62\x7a\x63\x7a\x64\x7a\x65\x7a\x66\x7a\x67\x7a\x68\x7a\x69\x7a\x6a\x7a\x6b\x7a\x6c\x7a\x6d\x7a\x6e\x7a\x6f\x7a\x70\x7a\x71\x7a\x72\x7a\x73\x7a\x74\x7a\x75\x7a\x76\x7a\x77\x7a\x78\x7a\x79\x7a\x7a\x7a\x7b\x7a\x7c\x7a\x7d\x7a\x7e\x7a\x7f\x7a\x80\x7a\x81\x7a\x82\x7a\x83\x7a\x84\x7a\x85\x7a\x86\x7a\x87\x7a\x88\x7a\x89\x7a\x8a\x7a\x8b\x7a\x8c\x7a\x8d\x7a\x8e\x7a\x8f\x7a\x90\x7a\x91\x7a\x92\x7a\x93\x7a\x94\x7a\x95\x7a\x96\x7a\x97\x7a\x98\x7a\x99\x7a\x9a\x7a\x9b\x7a\x9c\x7a\x9d\x7a\x9e\x7a\x9f\x7a\xa0\x7a\xa1\x7a\xa2", /* ed00 */ "\x7a\xa3\x7a\xa4\x7a\xa5\x7a\xa6\x7a\xa7\x7a\xa8\x7a\xa9\x7a\xaa\x7a\xab\x7a\xac\x7a\xad\x7a\xae\x7a\xaf\x7a\xb0\x7a\xb1\x7a\xb2\x7a\xb3\x7a\xb4\x7a\xb5\x7a\xb6\x7a\xb7\x7a\xb8\x7a\xb9\x7a\xba\x7a\xbb\x7a\xbc\x7a\xbd\x7a\xbe\x7a\xbf\x7a\xc0\x7a\xc1\x7a\xc2\x7a\xc3\x7a\xc4\x7a\xc5\x7a\xc6\x7a\xc7\x7a\xc8\x7a\xc9\x7a\xca\x7a\xcb\x7a\xcc\x7a\xcd\x7a\xce\x7a\xcf\x7a\xd0\x7a\xd1\x7a\xd2\x7a\xd3\x7a\xd4\x7a\xd5\x7a\xd6\x7a\xd7\x7a\xd8\x7a\xd9\x7a\xda\x7a\xdb\x7a\xdc\x7a\xdd\x7a\xde\x7a\xdf\x7a\xe0\x7a\xe1\x7a\xe2\x7a\xe3\x7a\xe4\x7a\xe5\x7a\xe6\x7a\xe7\x7a\xe8\x7a\xe9\x7a\xea\x7a\xeb\x7a\xec\x7a\xed\x7a\xee\x7a\xef\x7a\xf0\x7a\xf1\x7a\xf2\x7a\xf3\x7a\xf4\x7a\xf5\x7a\xf6\x7a\xf7\x7a\xf8\x7a\xf9\x7a\xfa\x7a\xfb\x7a\xfc\x7a\xfd\x7a\xfe\x7b\x41\x7b\x42\x7b\x43\x7b\x44\x7b\x45\x7b\x46\x7b\x47\x7b\x48\x7b\x49\x7b\x4a\x7b\x4b\x7b\x4c\x7b\x4d\x7b\x4e\x7b\x4f\x7b\x50\x7b\x51\x7b\x52\x7b\x53\x7b\x54\x7b\x55\x7b\x56\x7b\x57\x7b\x58\x7b\x59\x7b\x5a\x7b\x5b\x7b\x5c\x7b\x5d\x7b\x5e\x7b\x5f\x7b\x60\x7b\x61\x7b\x62\x7b\x63\x7b\x64", /* ed80 */ "\x7b\x65\x7b\x66\x7b\x67\x7b\x68\x7b\x69\x7b\x6a\x7b\x6b\x7b\x6c\x7b\x6d\x7b\x6e\x7b\x6f\x7b\x70\x7b\x71\x7b\x72\x7b\x73\x7b\x74\x7b\x75\x7b\x76\x7b\x77\x7b\x78\x7b\x79\x7b\x7a\x7b\x7b\x7b\x7c\x7b\x7d\x7b\x7e\x7b\x7f\x7b\x80\x7b\x81\x7b\x82\x7b\x83\x7b\x84\x7b\x85\x7b\x86\x7b\x87\x7b\x88\x7b\x89\x7b\x8a\x7b\x8b\x7b\x8c\x7b\x8d\x7b\x8e\x7b\x8f\x7b\x90\x7b\x91\x7b\x92\x7b\x93\x7b\x94\x7b\x95\x7b\x96\x7b\x97\x7b\x98\x7b\x99\x7b\x9a\x7b\x9b\x7b\x9c\x7b\x9d\x7b\x9e\x7b\x9f\x7b\xa0\x7b\xa1\x7b\xa2\x7b\xa3\x7b\xa4\x7b\xa5\x7b\xa6\x7b\xa7\x7b\xa8\x7b\xa9\x7b\xaa\x7b\xab\x7b\xac\x7b\xad\x7b\xae\x7b\xaf\x7b\xb0\x7b\xb1\x7b\xb2\x7b\xb3\x7b\xb4\x7b\xb5\x7b\xb6\x7b\xb7\x7b\xb8\x7b\xb9\x7b\xba\x7b\xbb\x7b\xbc\x7b\xbd\x7b\xbe\x7b\xbf\x7b\xc0\x7b\xc1\x7b\xc2\x7b\xc3\x7b\xc4\x7b\xc5\x7b\xc6\x7b\xc7\x7b\xc8\x7b\xc9\x7b\xca\x7b\xcb\x7b\xcc\x7b\xcd\x7b\xce\x7b\xcf\x7b\xd0\x7b\xd1\x7b\xd2\x7b\xd3\x7b\xd4\x7b\xd5\x7b\xd6\x7b\xd7\x7b\xd8\x7b\xd9\x7b\xda\x7b\xdb\x7b\xdc\x7b\xdd\x7b\xde\x7b\xdf\x7b\xe0\x7b\xe1\x7b\xe2\x7b\xe3\x7b\xe4", /* ee00 */ "\x7b\xe5\x7b\xe6\x7b\xe7\x7b\xe8\x7b\xe9\x7b\xea\x7b\xeb\x7b\xec\x7b\xed\x7b\xee\x7b\xef\x7b\xf0\x7b\xf1\x7b\xf2\x7b\xf3\x7b\xf4\x7b\xf5\x7b\xf6\x7b\xf7\x7b\xf8\x7b\xf9\x7b\xfa\x7b\xfb\x7b\xfc\x7b\xfd\x7b\xfe\x7c\x41\x7c\x42\x7c\x43\x7c\x44\x7c\x45\x7c\x46\x7c\x47\x7c\x48\x7c\x49\x7c\x4a\x7c\x4b\x7c\x4c\x7c\x4d\x7c\x4e\x7c\x4f\x7c\x50\x7c\x51\x7c\x52\x7c\x53\x7c\x54\x7c\x55\x7c\x56\x7c\x57\x7c\x58\x7c\x59\x7c\x5a\x7c\x5b\x7c\x5c\x7c\x5d\x7c\x5e\x7c\x5f\x7c\x60\x7c\x61\x7c\x62\x7c\x63\x7c\x64\x7c\x65\x7c\x66\x7c\x67\x7c\x68\x7c\x69\x7c\x6a\x7c\x6b\x7c\x6c\x7c\x6d\x7c\x6e\x7c\x6f\x7c\x70\x7c\x71\x7c\x72\x7c\x73\x7c\x74\x7c\x75\x7c\x76\x7c\x77\x7c\x78\x7c\x79\x7c\x7a\x7c\x7b\x7c\x7c\x7c\x7d\x7c\x7e\x7c\x7f\x7c\x80\x7c\x81\x7c\x82\x7c\x83\x7c\x84\x7c\x85\x7c\x86\x7c\x87\x7c\x88\x7c\x89\x7c\x8a\x7c\x8b\x7c\x8c\x7c\x8d\x7c\x8e\x7c\x8f\x7c\x90\x7c\x91\x7c\x92\x7c\x93\x7c\x94\x7c\x95\x7c\x96\x7c\x97\x7c\x98\x7c\x99\x7c\x9a\x7c\x9b\x7c\x9c\x7c\x9d\x7c\x9e\x7c\x9f\x7c\xa0\x7c\xa1\x7c\xa2\x7c\xa3\x7c\xa4\x7c\xa5\x7c\xa6", /* ee80 */ "\x7c\xa7\x7c\xa8\x7c\xa9\x7c\xaa\x7c\xab\x7c\xac\x7c\xad\x7c\xae\x7c\xaf\x7c\xb0\x7c\xb1\x7c\xb2\x7c\xb3\x7c\xb4\x7c\xb5\x7c\xb6\x7c\xb7\x7c\xb8\x7c\xb9\x7c\xba\x7c\xbb\x7c\xbc\x7c\xbd\x7c\xbe\x7c\xbf\x7c\xc0\x7c\xc1\x7c\xc2\x7c\xc3\x7c\xc4\x7c\xc5\x7c\xc6\x7c\xc7\x7c\xc8\x7c\xc9\x7c\xca\x7c\xcb\x7c\xcc\x7c\xcd\x7c\xce\x7c\xcf\x7c\xd0\x7c\xd1\x7c\xd2\x7c\xd3\x7c\xd4\x7c\xd5\x7c\xd6\x7c\xd7\x7c\xd8\x7c\xd9\x7c\xda\x7c\xdb\x7c\xdc\x7c\xdd\x7c\xde\x7c\xdf\x7c\xe0\x7c\xe1\x7c\xe2\x7c\xe3\x7c\xe4\x7c\xe5\x7c\xe6\x7c\xe7\x7c\xe8\x7c\xe9\x7c\xea\x7c\xeb\x7c\xec\x7c\xed\x7c\xee\x7c\xef\x7c\xf0\x7c\xf1\x7c\xf2\x7c\xf3\x7c\xf4\x7c\xf5\x7c\xf6\x7c\xf7\x7c\xf8\x7c\xf9\x7c\xfa\x7c\xfb\x7c\xfc\x7c\xfd\x7c\xfe\x7d\x41\x7d\x42\x7d\x43\x7d\x44\x7d\x45\x7d\x46\x7d\x47\x7d\x48\x7d\x49\x7d\x4a\x7d\x4b\x7d\x4c\x7d\x4d\x7d\x4e\x7d\x4f\x7d\x50\x7d\x51\x7d\x52\x7d\x53\x7d\x54\x7d\x55\x7d\x56\x7d\x57\x7d\x58\x7d\x59\x7d\x5a\x7d\x5b\x7d\x5c\x7d\x5d\x7d\x5e\x7d\x5f\x7d\x60\x7d\x61\x7d\x62\x7d\x63\x7d\x64\x7d\x65\x7d\x66\x7d\x67\x7d\x68", /* ef00 */ "\x7d\x69\x7d\x6a\x7d\x6b\x7d\x6c\x7d\x6d\x7d\x6e\x7d\x6f\x7d\x70\x7d\x71\x7d\x72\x7d\x73\x7d\x74\x7d\x75\x7d\x76\x7d\x77\x7d\x78\x7d\x79\x7d\x7a\x7d\x7b\x7d\x7c\x7d\x7d\x7d\x7e\x7d\x7f\x7d\x80\x7d\x81\x7d\x82\x7d\x83\x7d\x84\x7d\x85\x7d\x86\x7d\x87\x7d\x88\x7d\x89\x7d\x8a\x7d\x8b\x7d\x8c\x7d\x8d\x7d\x8e\x7d\x8f\x7d\x90\x7d\x91\x7d\x92\x7d\x93\x7d\x94\x7d\x95\x7d\x96\x7d\x97\x7d\x98\x7d\x99\x7d\x9a\x7d\x9b\x7d\x9c\x7d\x9d\x7d\x9e\x7d\x9f\x7d\xa0\x7d\xa1\x7d\xa2\x7d\xa3\x7d\xa4\x7d\xa5\x7d\xa6\x7d\xa7\x7d\xa8\x7d\xa9\x7d\xaa\x7d\xab\x7d\xac\x7d\xad\x7d\xae\x7d\xaf\x7d\xb0\x7d\xb1\x7d\xb2\x7d\xb3\x7d\xb4\x7d\xb5\x7d\xb6\x7d\xb7\x7d\xb8\x7d\xb9\x7d\xba\x7d\xbb\x7d\xbc\x7d\xbd\x7d\xbe\x7d\xbf\x7d\xc0\x7d\xc1\x7d\xc2\x7d\xc3\x7d\xc4\x7d\xc5\x7d\xc6\x7d\xc7\x7d\xc8\x7d\xc9\x7d\xca\x7d\xcb\x7d\xcc\x7d\xcd\x7d\xce\x7d\xcf\x7d\xd0\x7d\xd1\x7d\xd2\x7d\xd3\x7d\xd4\x7d\xd5\x7d\xd6\x7d\xd7\x7d\xd8\x7d\xd9\x7d\xda\x7d\xdb\x7d\xdc\x7d\xdd\x7d\xde\x7d\xdf\x7d\xe0\x7d\xe1\x7d\xe2\x7d\xe3\x7d\xe4\x7d\xe5\x7d\xe6\x7d\xe7\x7d\xe8", /* ef80 */ "\x7d\xe9\x7d\xea\x7d\xeb\x7d\xec\x7d\xed\x7d\xee\x7d\xef\x7d\xf0\x7d\xf1\x7d\xf2\x7d\xf3\x7d\xf4\x7d\xf5\x7d\xf6\x7d\xf7\x7d\xf8\x7d\xf9\x7d\xfa\x7d\xfb\x7d\xfc\x7d\xfd\x7d\xfe\x7e\x41\x7e\x42\x7e\x43\x7e\x44\x7e\x45\x7e\x46\x7e\x47\x7e\x48\x7e\x49\x7e\x4a\x7e\x4b\x7e\x4c\x7e\x4d\x7e\x4e\x7e\x4f\x7e\x50\x7e\x51\x7e\x52\x7e\x53\x7e\x54\x7e\x55\x7e\x56\x7e\x57\x7e\x58\x7e\x59\x7e\x5a\x7e\x5b\x7e\x5c\x7e\x5d\x7e\x5e\x7e\x5f\x7e\x60\x7e\x61\x7e\x62\x7e\x63\x7e\x64\x7e\x65\x7e\x66\x7e\x67\x7e\x68\x7e\x69\x7e\x6a\x7e\x6b\x7e\x6c\x7e\x6d\x7e\x6e\x7e\x6f\x7e\x70\x7e\x71\x7e\x72\x7e\x73\x7e\x74\x7e\x75\x7e\x76\x7e\x77\x7e\x78\x7e\x79\x7e\x7a\x7e\x7b\x7e\x7c\x7e\x7d\x7e\x7e\x7e\x7f\x7e\x80\x7e\x81\x7e\x82\x7e\x83\x7e\x84\x7e\x85\x7e\x86\x7e\x87\x7e\x88\x7e\x89\x7e\x8a\x7e\x8b\x7e\x8c\x7e\x8d\x7e\x8e\x7e\x8f\x7e\x90\x7e\x91\x7e\x92\x7e\x93\x7e\x94\x7e\x95\x7e\x96\x7e\x97\x7e\x98\x7e\x99\x7e\x9a\x7e\x9b\x7e\x9c\x7e\x9d\x7e\x9e\x7e\x9f\x7e\xa0\x7e\xa1\x7e\xa2\x7e\xa3\x7e\xa4\x7e\xa5\x7e\xa6\x7e\xa7\x7e\xa8\x7e\xa9\x7e\xaa", /* f000 */ "\x7e\xab\x7e\xac\x7e\xad\x7e\xae\x7e\xaf\x7e\xb0\x7e\xb1\x7e\xb2\x7e\xb3\x7e\xb4\x7e\xb5\x7e\xb6\x7e\xb7\x7e\xb8\x7e\xb9\x7e\xba\x7e\xbb\x7e\xbc\x7e\xbd\x7e\xbe\x7e\xbf\x7e\xc0\x7e\xc1\x7e\xc2\x7e\xc3\x7e\xc4\x7e\xc5\x7e\xc6\x7e\xc7\x7e\xc8\x7e\xc9\x7e\xca\x7e\xcb\x7e\xcc\x7e\xcd\x7e\xce\x7e\xcf\x7e\xd0\x7e\xd1\x7e\xd2\x7e\xd3\x7e\xd4\x7e\xd5\x7e\xd6\x7e\xd7\x7e\xd8\x7e\xd9\x7e\xda\x7e\xdb\x7e\xdc\x7e\xdd\x7e\xde\x7e\xdf\x7e\xe0\x7e\xe1\x7e\xe2\x7e\xe3\x7e\xe4\x7e\xe5\x7e\xe6\x7e\xe7\x7e\xe8\x7e\xe9\x7e\xea\x7e\xeb\x7e\xec\x7e\xed\x7e\xee\x7e\xef\x7e\xf0\x7e\xf1\x7e\xf2\x7e\xf3\x7e\xf4\x7e\xf5\x7e\xf6\x7e\xf7\x7e\xf8\x7e\xf9\x7e\xfa\x7e\xfb\x7e\xfc\x7e\xfd\x7e\xfe\x7f\x41\x7f\x42\x7f\x43\x7f\x44\x7f\x45\x7f\x46\x7f\x47\x7f\x48\x7f\x49\x7f\x4a\x7f\x4b\x7f\x4c\x7f\x4d\x7f\x4e\x7f\x4f\x7f\x50\x7f\x51\x7f\x52\x7f\x53\x7f\x54\x7f\x55\x7f\x56\x7f\x57\x7f\x58\x7f\x59\x7f\x5a\x7f\x5b\x7f\x5c\x7f\x5d\x7f\x5e\x7f\x5f\x7f\x60\x7f\x61\x7f\x62\x7f\x63\x7f\x64\x7f\x65\x7f\x66\x7f\x67\x7f\x68\x7f\x69\x7f\x6a\x7f\x6b\x7f\x6c", /* f080 */ "\x7f\x6d\x7f\x6e\x7f\x6f\x7f\x70\x7f\x71\x7f\x72\x7f\x73\x7f\x74\x7f\x75\x7f\x76\x7f\x77\x7f\x78\x7f\x79\x7f\x7a\x7f\x7b\x7f\x7c\x7f\x7d\x7f\x7e\x7f\x7f\x7f\x80\x7f\x81\x7f\x82\x7f\x83\x7f\x84\x7f\x85\x7f\x86\x7f\x87\x7f\x88\x7f\x89\x7f\x8a\x7f\x8b\x7f\x8c\x7f\x8d\x7f\x8e\x7f\x8f\x7f\x90\x7f\x91\x7f\x92\x7f\x93\x7f\x94\x7f\x95\x7f\x96\x7f\x97\x7f\x98\x7f\x99\x7f\x9a\x7f\x9b\x7f\x9c\x7f\x9d\x7f\x9e\x7f\x9f\x7f\xa0\x7f\xa1\x7f\xa2\x7f\xa3\x7f\xa4\x7f\xa5\x7f\xa6\x7f\xa7\x7f\xa8\x7f\xa9\x7f\xaa\x7f\xab\x7f\xac\x7f\xad\x7f\xae\x7f\xaf\x7f\xb0\x7f\xb1\x7f\xb2\x7f\xb3\x7f\xb4\x7f\xb5\x7f\xb6\x7f\xb7\x7f\xb8\x7f\xb9\x7f\xba\x7f\xbb\x7f\xbc\x7f\xbd\x7f\xbe\x7f\xbf\x7f\xc0\x7f\xc1\x7f\xc2\x7f\xc3\x7f\xc4\x7f\xc5\x7f\xc6\x7f\xc7\x7f\xc8\x7f\xc9\x7f\xca\x7f\xcb\x7f\xcc\x7f\xcd\x7f\xce\x7f\xcf\x7f\xd0\x7f\xd1\x7f\xd2\x7f\xd3\x7f\xd4\x7f\xd5\x7f\xd6\x7f\xd7\x7f\xd8\x7f\xd9\x7f\xda\x7f\xdb\x7f\xdc\x7f\xdd\x7f\xde\x7f\xdf\x7f\xe0\x7f\xe1\x7f\xe2\x7f\xe3\x7f\xe4\x7f\xe5\x7f\xe6\x7f\xe7\x7f\xe8\x7f\xe9\x7f\xea\x7f\xeb\x7f\xec", /* f100 */ "\x7f\xed\x7f\xee\x7f\xef\x7f\xf0\x7f\xf1\x7f\xf2\x7f\xf3\x7f\xf4\x7f\xf5\x7f\xf6\x7f\xf7\x7f\xf8\x7f\xf9\x7f\xfa\x7f\xfb\x7f\xfc\x7f\xfd\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f880 */ NULL, /* f900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x8e\x58\x77\x58\x82\x59\x80\x5b\xae\x5c\x66\x5c\x78\x5e\x49\x5e\x8a\x5f\x7a\x5f\xd2\x5f\xd5\x5f\xd9\x5f\xdd\x60\x59\x60\xad\x61\x77\x62\xb9\x62\xce\x62\xe2\x63\xee\x64\x8e\x64\xf1\x65\x49\x65\x66\x65\xb8\x65\xc6\x66\x78\x66\xdd\x66\xdf\x66\xe6\x67\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ "\x00\x00\x42\x5a\x42\x7f\x42\x7b\x42\xe0\x42\x6c\x42\x50\x42\x7d\x42\x4d\x42\x5d\x42\x5c\x42\x4e\x42\x6b\x00\x00\x42\x4b\x42\x61\x42\xf0\x42\xf1\x42\xf2\x42\xf3\x42\xf4\x42\xf5\x42\xf6\x42\xf7\x42\xf8\x42\xf9\x42\x7a\x42\x5e\x42\x4c\x42\x7e\x42\x6e\x42\x6f\x42\x7c\x42\xc1\x42\xc2\x42\xc3\x42\xc4\x42\xc5\x42\xc6\x42\xc7\x42\xc8\x42\xc9\x42\xd1\x42\xd2\x42\xd3\x42\xd4\x42\xd5\x42\xd6\x42\xd7\x42\xd8\x42\xd9\x42\xe2\x42\xe3\x42\xe4\x42\xe5\x42\xe6\x42\xe7\x42\xe8\x42\xe9\x44\x44\x43\xe0\x44\x45\x44\x70\x42\x6d\x42\x79\x42\x81\x42\x82\x42\x83\x42\x84\x42\x85\x42\x86\x42\x87\x42\x88\x42\x89\x42\x91\x42\x92\x42\x93\x42\x94\x42\x95\x42\x96\x42\x97\x42\x98\x42\x99\x42\xa2\x42\xa3\x42\xa4\x42\xa5\x42\xa6\x42\xa7\x42\xa8\x42\xa9\x42\xc0\x42\x4f\x42\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4a\x42\x4a\x42\x5f\x42\xa1\x00\x00\x42\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, /* EBCDIC DBCS to Unicode translation table for ibm-300_P110-1997 */ { /* 0000 */ NULL, /* 0080 */ NULL, /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ NULL, /* 0300 */ NULL, /* 0380 */ NULL, /* 0400 */ NULL, /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ NULL, /* 2080 */ NULL, /* 2100 */ NULL, /* 2180 */ NULL, /* 2200 */ NULL, /* 2280 */ NULL, /* 2300 */ NULL, /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ NULL, /* 2580 */ NULL, /* 2600 */ NULL, /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ NULL, /* 3080 */ NULL, /* 3100 */ NULL, /* 3180 */ NULL, /* 3200 */ NULL, /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4080 */ NULL, /* 4100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4180 */ "\x04\x30\x04\x31\x04\x32\x04\x33\x04\x34\x04\x35\x04\x51\x04\x36\x04\x37\x04\x38\x04\x39\x04\x3a\x04\x3b\x04\x3c\x04\x3d\x04\x3e\x04\x3f\x04\x40\x04\x41\x04\x42\x04\x43\x04\x44\x04\x45\x04\x46\x04\x47\x04\x48\x04\x49\x04\x4a\x04\x4b\x04\x4c\x04\x4d\x04\x4e\x04\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x70\x21\x71\x21\x72\x21\x73\x21\x74\x21\x75\x21\x76\x21\x77\x21\x78\x21\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x01\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04\x20\x04\x21\x04\x22\x04\x23\x04\x24\x04\x25\x04\x26\x04\x27\x04\x28\x04\x29\x04\x2a\x04\x2b\x04\x2c\x04\x2d\x04\x2e\x04\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x60\x21\x61\x21\x62\x21\x63\x21\x64\x21\x65\x21\x66\x21\x67\x21\x68\x21\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe1\xff\x0e\xff\x1c\xff\x08\xff\x0b\xff\x5c\xff\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x01\xff\xe5\xff\x0a\xff\x09\xff\x1b\xff\xe2\x22\x12\xff\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xff\x0c\xff\x05\xff\x3f\xff\x1e\xff\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x40\xff\x1a\xff\x03\xff\x20\xff\x07\xff\x1d\xff\x02", /* 4280 */ "\x00\x00\xff\x41\xff\x42\xff\x43\xff\x44\xff\x45\xff\x46\xff\x47\xff\x48\xff\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x4a\xff\x4b\xff\x4c\xff\x4d\xff\x4e\xff\x4f\xff\x50\xff\x51\xff\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe3\xff\x53\xff\x54\xff\x55\xff\x56\xff\x57\xff\x58\xff\x59\xff\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5b\xff\x21\xff\x22\xff\x23\xff\x24\xff\x25\xff\x26\xff\x27\xff\x28\xff\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5d\xff\x2a\xff\x2b\xff\x2c\xff\x2d\xff\x2e\xff\x2f\xff\x30\xff\x31\xff\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\xff\x33\xff\x34\xff\x35\xff\x36\xff\x37\xff\x38\xff\x39\xff\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x10\xff\x11\xff\x12\xff\x13\xff\x14\xff\x15\xff\x16\xff\x17\xff\x18\xff\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x02\x30\x0c\x30\x0d\x30\x01\x30\xfb\x30\xf2\x30\xa1\x30\xa3\x30\xa5\xff\xe0\x22\x20\x22\xa5\x23\x12\x22\x02\x22\x07\x00\x00\x30\xa7\x30\xa9\x30\xe3\x30\xe5\x30\xe7\x30\xc3\x30\xee\x30\xfc\x30\xf5\x30\xf6\x22\x61\x22\x52\x22\x6a\x22\x6b\x22\x1a\x22\x3d\x22\x1d\x22\x2b\x22\x2c\x22\x08\x22\x0b\x22\x86\x22\x87\x22\x82\x22\x83\x22\x2a\x22\x29\x22\x27\x22\x28\x21\xd2\x21\xd4\x22\x00\x22\x03\x21\x2b\x20\x30\x26\x6f\x26\x6d\x26\x6a\x20\x20\x20\x21\x00\xb6\x25\xef\x00\x00\x25\x00\x25\x02\x25\x0c\x25\x10", /* 4380 */ "\x00\x00\x30\xa2\x30\xa4\x30\xa6\x30\xa8\x30\xaa\x30\xab\x30\xad\x30\xaf\x30\xb1\x30\xb3\x00\x00\x30\xb5\x30\xb7\x30\xb9\x30\xbb\x30\xbd\x30\xbf\x30\xc1\x30\xc4\x30\xc6\x30\xc8\x30\xca\x30\xcb\x30\xcc\x30\xcd\x30\xce\x00\x00\x00\x00\x30\xcf\x30\xd2\x30\xd5\x00\x00\x30\x1c\x30\xd8\x30\xdb\x30\xde\x30\xdf\x30\xe0\x30\xe1\x30\xe2\x30\xe4\x30\xe6\x00\x00\x30\xe8\x30\xe9\x30\xea\x30\xeb\x25\x18\x25\x14\x25\x1c\x25\x2c\x25\x24\x25\x34\x25\x3c\x25\x01\x25\x03\x25\x0f\x30\xec\x30\xed\x30\xef\x30\xf3\x30\x9b\x30\x9c\x30\xac\x30\xae\x30\xb0\x30\xb2\x30\xb4\x30\xb6\x30\xb8\x30\xba\x30\xbc\x30\xbe\x30\xc0\x30\xc2\x30\xc5\x30\xc7\x30\xc9\x30\xd0\x30\xd3\x30\xd6\x30\xd9\x30\xdc\x30\xf4\x30\xd1\x30\xd4\x30\xd7\x30\xda\x30\xdd\x30\xf0\x30\xf1\x30\xfd\x30\xfe\x00\x00\x00\x00\xff\x3c\x25\x13\x25\x1b\x25\x17\x25\x23\x25\x33\x25\x2b\x25\x3b\x25\x4b\x25\x20\x25\x2f\x25\x28\x25\x37\x25\x3f\x25\x1d\x25\x30\x25\x25\x25\x38\x25\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x0e\x30\x0f\xff\x3b\xff\x3d\x30\x92\x30\x41\x30\x43\x30\x45\x20\x14\x00\xb1\x22\x60\x22\x1e\x21\x03\x00\x00\x00\xb4\x30\x47\x30\x49\x30\x83\x30\x85\x30\x87\x30\x63\x30\x8e\x00\x00\x00\x00\x20\x10\x30\x03\x4e\xdd\x30\x05\x30\x06\x30\x07\x00\xa8\x20\x18\x20\x1c\x30\x14\x30\x08\x30\x0a\x30\x10\x22\x66\x22\x34\x26\x42\x00\xa7\x20\x3b\x30\x12\x32\x31\xf8\x6f\x21\x21\xff\x3e\x20\x19\x20\x1d\x30\x15\x30\x09\x30\x0b\x30\x11\x22\x67\x22\x35\x26\x40\x00\xd7\x00\xf7\x20\x16\x30\x13\x20\x25\x20\x26", /* 4480 */ "\x00\x00\x30\x42\x30\x44\x30\x46\x30\x48\x30\x4a\x30\x4b\x30\x4d\x30\x4f\x30\x51\x30\x53\x00\x00\x30\x55\x30\x57\x30\x59\x30\x5b\x30\x5d\x30\x5f\x30\x61\x30\x64\x30\x66\x30\x68\x30\x6a\x30\x6b\x30\x6c\x30\x6d\x30\x6e\x00\x00\x00\x00\x30\x6f\x30\x72\x30\x75\x00\x00\x00\x00\x30\x78\x30\x7b\x30\x7e\x30\x7f\x30\x80\x30\x81\x30\x82\x30\x84\x30\x86\x00\x00\x30\x88\x30\x89\x30\x8a\x30\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x8c\x30\x8d\x30\x8f\x30\x93\x00\x00\x00\x00\x30\x4c\x30\x4e\x30\x50\x30\x52\x30\x54\x30\x56\x30\x58\x30\x5a\x30\x5c\x30\x5e\x30\x60\x30\x62\x30\x65\x30\x67\x30\x69\x30\x70\x30\x73\x30\x76\x30\x79\x30\x7c\x00\x00\x30\x71\x30\x74\x30\x77\x30\x7a\x30\x7d\x30\x90\x30\x91\x30\x9d\x30\x9e\x00\x00\x00\x00\x25\xcb\x25\xcf\x25\xb3\x25\xb2\x25\xce\x26\x06\x26\x05\x25\xc7\x25\xc6\x25\xa1\x25\xa0\x25\xbd\x25\xbc\x00\xb0\x20\x32\x20\x33\x21\x92\x21\x90\x21\x91\x21\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4e\x8c\x4e\x09\x56\xdb\x4e\x94\x51\x6d\x4e\x03\x51\x6b\x4e\x5d\x53\x41\x76\x7e\x53\x43\x4e\x07\x51\x04\x90\xfd\x90\x53\x5e\x9c\x77\x0c\x5e\x02\x53\x3a\x75\x3a\x67\x51\x67\x71\x89\x7f\x53\x57\x53\x17\x59\x27\x4e\x2d\x5c\x0f\x4e\x0a\x4e\x0b\x5e\x74\x67\x08\x65\xe5\x75\x30\x5b\x50\x5c\x71\x67\x2c\x5d\xdd\x85\xe4\x91\xce\x5d\xe5\x69\x6d\x67\x28\x4e\x95\x90\xce\x5c\xf6\x96\xc4\x9a\xd8\x5c\xa1\x59\x2b\x53\x9f\x4e\xac\x4f\x50\x6b\x63\x67\x7e\x6a\x5f\x54\x8c\x88\xfd\x75\x37\x7f\x8e\x54\x09\x5d\x0e", /* 4580 */ "\x77\xf3\x8c\x37\x96\xfb\x95\x77\x6c\xbb\x6c\xa2\x91\xd1\x65\xb0\x53\xe3\x6a\x4b\x4e\x45\x79\x8f\x62\x40\x5e\x73\x51\x85\x56\xfd\x53\x16\x96\x2a\x5b\xae\x4e\xba\x4f\x5c\x90\xe8\x6e\x05\x6b\x21\x7f\xa9\x75\x1f\x4e\xe3\x51\xfa\x6c\x34\x68\xee\x51\x49\x52\xa0\x54\x08\x79\x5e\x67\x97\x91\xcd\x88\x4c\x4f\xe1\x66\x0e\x6d\x77\x5b\x89\x5e\x78\x4f\xdd\x59\x2a\x5b\xcc\x6c\x5f\x92\x34\x52\x4d\x77\xe5\x6b\x66\x4f\x0a\x66\x2d\x52\x06\x52\xdd\x75\x28\x5e\x83\x90\x20\x6c\x17\x62\x10\x89\x8b\x52\x29\x4f\x1a\x5b\x66\x5c\xa9\x75\x23\x95\x93\x57\x30\x81\xea\x82\x6f\x95\xa2\x61\x1b\x65\x3f\x5c\x3e\x8a\x08\x65\x87\x62\x4b\x72\x36\x65\xb9\x4e\x8b\x62\x38\x54\xc1\x55\x9c\x6e\x21\x5f\x18\x53\xe4\x8f\xba\x50\x09\x92\x44\x4e\x4b\x58\x34\x6d\x0b\x57\xce\x6d\x25\x7a\xcb\x5e\xa6\x53\x48\x4e\xca\x5f\x66\x8a\x2d\x90\x1a\x52\xd5\x5f\x8c\x59\x48\x5b\x9a\x6c\x60\x5c\x4b\x6d\x5c\x74\x06\x57\x42\x5b\x9f\x82\xf1\x76\x84\x53\xf8\x79\xc0\x6a\x2a\x54\x0d\x5b\x5d\x7a\xf9\x53\x5a\x52\x9b\x5e\xab\x84\x49\x68\x04\x6c\x38\x56\x68\x73\x89\x59\x1a\x00\x00", /* 4600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xc0\x77\x1f\x60\x75\x97\x59\x51\x86\x83\x02\x65\x4f\x8c\x4a\x51\x75\x6c\xd5\x76\x7a\x97\x52\x58\x97\x65\x99\x5f\xe0\x8c\xc7\x66\x42\x72\x69\x8e\xca\x5f\xb3\x89\x81\x5b\xfe\x58\x5a\x79\xcb\x76\x7d\x6c\xb3\x70\x2c\x6c\xb9\x96\x86\x85\x35\x5f\x53\x4f\xca\x5f\xd7\x66\x25\x79\x3e\x99\xac\x51\x65\x5e\xfa\x68\x39\x67\x49\x90\x32\x82\x08\x6d\x66\x7c\xbe\x54\x0c\x60\x27\x7c\x73\x80\x05\x52\xa9\x67\x9d\x8f\xd1\x76\xf4\x76\xee\x67\x65\x75\x3b\x76\xf8\x9e\xd2\x4e\x38\x82\x39\x75\x31\x58\xeb\x7b\x2c\x71\x8a", /* 4680 */ "\x7d\x19\x50\x65\x68\xb0\x82\xb3\x57\x1f\x67\x09\x5b\xb6\x7d\xda\x7d\x4c\x8a\xbf\x59\x29\x67\x1f\x7f\x6e\x6d\x45\x65\x89\x5f\x0f\x5f\x62\x97\x62\x7a\x2e\x8f\x38\x59\x16\x51\x43\x4f\x53\x9e\x7f\x5f\xa1\x59\x73\x5e\xb7\x4e\x16\x52\xc7\x58\x00\x59\x7d\x51\x50\x5b\xfa\x92\xfc\x72\x79\x57\xfc\x90\x54\x54\x11\x53\xd6\x7b\x49\x66\x7a\x56\xde\x95\x80\x90\x4b\x50\x99\x60\x1d\x96\x3f\x4e\x0d\x98\x08\x51\x68\x5b\xff\x55\x84\x67\x7f\x98\xef\x8c\x9e\x73\xfe\x98\xdf\x7d\x44\x98\x5e\x51\x6c\x67\x50\x99\x99\x55\x46\x7d\x50\x88\x68\x77\xe2\x6f\x5f\x79\xc1\x52\x36\x90\xa6\x6c\xbc\x7c\xf8\x5b\x8f\x7b\x56\x6c\xe2\x54\xe1\x65\x70\x95\x8b\x6e\x96\x6a\x39\x8c\xbb\x66\x0c\x5f\x37\x78\x14\x53\xcb\x5b\x87\x82\xe5\x83\xca\x63\x01\x82\xb1\x5f\x15\x7d\x00\x83\x52\x52\x25\x4f\xee\x8d\x8a\x4f\x4f\x85\xac\x6b\xdb\x90\x60\x55\x4f\x59\x65\x57\x8b\x5f\xc3\x76\x7b\x65\xe9\x67\xf3\x6d\x69\x8c\xea\x52\xd9\x6c\xc9\x5e\x38\x5b\x88\x57\xfa\x7b\xa1\x6c\xf0\x4f\x38\x67\x00\x4e\xe5\x6b\x4c\x88\xd5\x8d\x64\x8d\xb3\x89\x8f\x6d\x41\x8a\xa0\x66\x07\x00\x00", /* 4700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xde\x71\x67\x58\x69\x90\x01\x96\xc5\x67\x2b\x54\xf2\x5c\xb8\x4e\x5f\x5c\x90\x52\x1d\x83\x28\x52\x47\x6b\xd4\x80\xfd\x8a\x71\x62\x95\x8e\xe2\x83\xc5\x90\x23\x4e\xd6\x6c\x11\x7d\x66\x91\x52\x7e\x41\x4f\xa1\x6e\x80\x67\x1d\x4e\xd8\x67\x61\x71\x21\x80\x03\x69\x7d\x4e\x3b\x61\x0f\x62\x26\x52\x07\x52\x64\x72\x47\x7d\x30\x6e\x08\x7a\x32\x5e\x03\x91\xcc\x5c\x5e\x7a\xe0\x59\x09\x4f\x55\x68\x5c\x5f\x7c\x67\xfb\x76\xca\x58\xf2\x4e\xc1\x6d\xf1\x53\xf0\x9c\xe5\x9d\xb4\x65\x2f\x65\x74\x89\xd2\x56\x09\x54\x73", /* 4780 */ "\x88\x5b\x8b\x70\x57\x27\x73\x87\x8d\xef\x70\x6b\x96\x1c\x8f\x1d\x70\xb9\x4e\x0e\x6e\x1b\x75\x51\x92\x80\x7a\x7a\x4e\xa4\x7f\xbd\x53\x4a\x53\xce\x59\x2e\x7d\xcf\x8a\x18\x66\x74\x69\xcb\x96\x9b\x68\x85\x53\x70\x8a\x00\x68\x17\x8e\xab\x66\xf8\x51\x4b\x7d\x20\x96\xc6\x7b\xc0\x51\x48\x6e\xdd\x6c\x7a\x65\x59\x7d\x14\x67\xf4\x63\xa5\x66\x1f\x77\x40\x75\x59\x66\x20\x5d\xf1\x75\x4c\x51\x77\x65\x6c\x7f\xa4\x98\x06\x51\x71\x6d\x3b\x91\xcf\x63\x07\x89\xe3\x5b\xa4\x67\x9c\x54\x04\x67\x1b\x96\x32\x7d\x04\x61\xb2\x96\x7d\x4e\x80\x56\xf3\x4e\x88\x82\x72\x7a\x0e\x69\x0d\x53\xef\x60\x52\x4f\x4d\x51\x78\x5f\xc5\x7d\x9a\x60\x25\x57\x28\x57\xa3\x54\x1b\x5e\xf6\x5d\x8b\x4f\x01\x68\x03\x67\x0d\x71\xb1\x52\x72\x53\x54\x6b\x69\x53\xf2\x51\x2a\x65\x8e\x62\x3f\x5b\x97\x68\x3c\x8f\xb0\x7b\x20\x57\x12\x8a\xf8\x81\x07\x55\x53\x8c\xe2\x5f\x25\x98\xa8\x5f\x97\x66\x13\x62\x53\x98\x2d\x65\xed\x6b\xb5\x52\xe2\x71\x36\x56\xe3\x98\x4d\x84\x3d\x91\x4d\x7a\x0b\x8f\xbb\x54\x3e\x61\x1f\x5b\xdb\x53\xcd\x7a\x14\x97\x00\x6e\x90\x6c\x96\x98\x4c\x00\x00", /* 4800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\xbc\x83\x49\x7b\x97\x76\xdb\x8f\xb2\x90\xa3\x77\x01\x69\xd8\x6b\xbf\x5c\x11\x4e\xcb\x53\xd7\x97\xf3\x7d\xe8\x59\xd4\x5e\x84\x4f\xc2\x72\xb6\x79\x3a\x5e\x97\x5a\x9b\x68\x2a\x6e\xcb\x68\xa8\x7e\x04\x53\xf3\x5d\xe6\x53\xca\x90\x78\x5c\x45\x60\xc5\x7d\xf4\x70\xad\x99\x28\x92\x71\x6a\x21\x6b\x8a\x7e\x3e\x4e\x9c\x7e\x4a\x4e\xf2\x58\x57\x6d\x88\x88\x53\x69\x1c\x67\x17\x5b\x85\x52\x9f\x5c\x1a\x8c\xbf\x60\xa6\x81\x02\x7b\xe0\x4f\x73\x7d\x21\x51\xa8\x68\x51\x78\xba\x72\x67\x4e\x26\x50\x24\x89\xb3\x8c\xb4", /* 4880 */ "\x7d\xad\x7d\x71\x5b\xbf\x4e\x21\x7c\xd6\x89\xaa\x93\x32\x6f\x84\x65\xbd\x5b\xb9\x98\xdb\x5c\x40\x79\x50\x90\x4e\x6c\x0f\x65\x39\x76\xe4\x7a\x4d\x6e\x0b\x5d\xfb\x6d\xf3\x5f\xdc\x4e\x89\x8e\xcd\x88\xc5\x91\x78\x7e\x54\x67\xd3\x5e\x1d\x7d\xbf\x7c\x89\x82\x2a\x75\x32\x54\x68\x4e\xd9\x5f\x85\x4f\x4e\x7d\xd1\x8e\xfd\x9e\xbb\x61\x76\x52\xb4\x78\xef\x4e\x39\x80\xb2\x96\x50\x5c\x0e\x65\x3e\x66\x43\x5e\xa7\x4e\xf6\x60\xf3\x9a\x13\x4e\xd5\x4f\x7f\x8f\x2a\x98\x54\x75\x6a\x5f\x35\x80\x5e\x4f\x9b\x6e\x6f\x6e\xb6\x68\x21\x92\x85\x92\xf3\x87\x8d\x97\x56\x51\x99\x5b\x8c\x6e\x2f\x93\x5b\x59\x1c\x51\x45\x9f\x8d\x7d\xb1\x83\xf1\x90\x1f\x52\xc9\x52\x37\x8d\x77\x64\x69\x53\xc2\x55\xb6\x7a\x42\x63\xa8\x8f\xd4\x80\x77\x6b\x62\x4f\x1d\x5e\x79\x74\x03\x6a\x29\x5c\x55\x5e\x61\x84\x5b\x5e\xad\x97\x5e\x53\xf7\x53\x58\x6b\x73\x62\xe1\x51\xe6\x8a\x9e\x66\x28\x57\xdf\x6d\xf5\x51\x8d\x50\xcd\x79\xd1\x9b\x5a\x7a\xef\x90\x14\x68\x48\x5b\x57\x8a\xd6\x51\x7c\x53\xc8\x63\x2f\x62\x80\x5f\xb9\x67\x2d\x7c\xfb\x5f\x93\x51\xb7\x61\x4b\x5c\xf0\x00\x00", /* 4900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x31\x53\x9a\x50\x74\x6c\xe8\x6e\x2c\x98\x03\x4e\x57\x8a\x66\x57\x6a\x84\x29\x51\x5a\x6c\x7d\x5b\x9d\x60\x6d\x6a\x0b\x6e\x29\x65\x77\x8a\xac\x82\xb8\x54\x4a\x6b\x74\x82\x2c\x98\xfe\x79\x3c\x5c\x06\x96\xe3\x78\x02\x52\x24\x5f\x79\x5f\x71\x66\xfd\x5e\x2f\x96\x78\x93\x8c\x8a\xc7\x5f\x70\x60\xaa\x6a\x19\x75\x33\x5b\xb3\x6b\xcd\x88\xdc\x5e\x4c\x58\xf0\x96\x64\x7b\x39\x5a\x66\x4e\x7e\x7a\xf6\x82\x9d\x72\x5b\x8c\xb7\x79\xfb\x78\x5d\x83\x36\x52\xb9\x99\x0a\x52\xf2\x80\xa5\x8b\x19\x70\x89\x59\x0f\x58\x02", /* 4980 */ "\x67\xcf\x62\x55\x5e\x30\x71\x3c\x78\x6b\x80\x01\x7a\x76\x5b\xe9\x91\xdd\x65\xad\x5c\x04\x5d\xee\x5d\x50\x62\x98\x80\x10\x5b\xa3\x59\xcb\x5f\x8b\x6b\x8b\x66\x6f\x8c\x61\x90\xf7\x53\x53\x96\xe2\x85\xab\x6b\x7b\x80\x15\x64\xcd\x4e\xae\x4e\x91\x90\xe1\x52\xe4\x6c\x42\x8c\xab\x5b\x98\x59\xbb\x88\xcf\x77\x3c\x4f\x2f\x7a\xaf\x7b\xc9\x96\x8e\x63\xdb\x68\x42\x99\xc5\x68\xb6\x57\x47\x8c\xa1\x54\x7d\x73\x8b\x84\xb2\x90\xc1\x78\xe8\x7b\x11\x66\xf2\x69\x75\x58\x31\x63\xd0\x8a\x3c\x96\xea\x90\x55\x88\xc1\x99\x96\x75\xc5\x68\x50\x4f\x59\x74\xe6\x4e\xe4\x54\x39\x73\x2a\x67\x2a\x52\x5b\x8c\xa0\x4f\x34\x51\x00\x54\x2b\x90\x69\x8f\xc4\x5c\x3b\x5d\xcc\x7b\x54\x8f\xfd\x8a\x0e\x4e\x08\x92\x5b\x71\xc3\x8a\xb2\x70\xba\x96\x62\x67\x9a\x76\xae\x8b\x77\x7d\xbe\x96\xe8\x62\x11\x5b\xc4\x83\x7b\x62\xbc\x7d\x0d\x76\xe3\x7e\x2b\x96\x4d\x57\x2d\x7a\xdc\x7b\xc4\x6b\xba\x8c\x9d\x69\x8e\x90\x47\x6f\x14\x53\x60\x8f\xeb\x52\x87\x62\x4d\x65\x66\x7d\x1a\x7d\x42\x6b\xce\x7d\x79\x7e\x2e\x66\x6e\x79\x65\x50\x0b\x5c\x02\x99\xd2\x8a\x55\x75\x60\x00\x00", /* 4a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x58\x80\x89\x50\xbe\x5e\x2b\x6d\xb2\x4f\x8b\x81\xe3\x81\xf3\x56\xe0\x7d\x99\x5d\xf2\x89\x9a\x6e\x9d\x6d\x17\x8a\xad\x89\x96\x73\x1b\x5d\xe8\x7d\xb2\x88\x8b\x4e\xfb\x5b\xc6\x88\x96\x6c\xc1\x84\x57\x8f\x03\x6b\xc5\x97\xff\x8c\xa9\x5e\x45\x82\xe6\x63\xaa\x5f\x81\x78\xc1\x82\x1e\x52\xaa\x7a\xaa\x59\x99\x62\x97\x8f\x14\x7f\xd2\x4f\xc3\x54\xc9\x96\x7a\x66\xf4\x8b\x1b\x5e\x72\x5f\xa9\x8a\x2a\x6d\x3e\x77\x63\x64\x83\x8b\x58\x61\x4e\x5a\x5a\x8d\x85\x71\xd0\x98\x3c\x72\xe9\x58\x3a\x5d\xfe\x8a\x8d\x67\xc4", /* 4a80 */ "\x7d\xe0\x4f\x11\x77\xed\x4f\x0f\x5b\xc5\x62\x9c\x5c\x3c\x53\x3b\x6d\xc0\x81\xfc\x96\xd1\x90\x4a\x6d\x6e\x93\xe1\x5c\x64\x98\xfc\x52\x4a\x6d\xfb\x85\x84\x96\x8a\x56\xfa\x58\x83\x77\x66\x98\x05\x4e\x73\x8c\x46\x8a\x31\x7d\xd2\x8f\xf0\x6d\x6a\x4f\x9d\x6b\x6f\x6b\x27\x62\xc5\x51\x1f\x97\x69\x53\x74\x9a\xa8\x67\x75\x88\x7f\x53\x05\x75\x70\x8d\x70\x86\x4e\x5c\xef\x8c\xde\x5f\xf5\x72\x5f\x76\x86\x60\x9f\x80\xcc\x59\xeb\x81\x31\x5e\x0c\x8a\x17\x96\x76\x82\xd7\x74\xb0\x84\xb8\x50\xd5\x96\xf2\x72\x48\x78\x34\x6d\xd1\x6e\x09\x67\xff\x6f\x54\x59\x15\x50\x0d\x72\xac\x9e\xc4\x7b\x46\x9b\x3c\x65\x63\x53\xbb\x8a\x98\x91\xdc\x98\x18\x6f\xc3\x65\xc5\x50\x1f\x7f\x8a\x6f\x64\x90\x31\x5f\x3e\x63\xf4\x90\x38\x8b\x66\x7b\xe4\x72\x06\x68\x43\x72\xec\x65\xcf\x82\xa6\x5b\xa2\x69\x60\x9e\xa6\x52\xdf\x67\x90\x63\x9b\x7d\x75\x98\x55\x5d\xf3\x58\x05\x8a\xcb\x95\xa3\x88\x63\x8c\xa8\x5b\x63\x5e\x8a\x54\x49\x78\x6c\x7d\x2b\x8c\xa2\x53\x52\x7d\x76\x8c\xb8\x70\x70\x54\x7c\x65\x45\x66\x76\x73\xb2\x56\xf2\x7b\xb1\x58\xa8\x7a\x81\x66\xae\x00\x00", /* 4b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x87\x59\xff\x88\x40\x56\xf0\x7b\x51\x6d\xf7\x5f\x01\x93\x4b\x90\x00\x4f\xe3\x67\x5f\x4f\xbf\x8c\xc3\x52\x6f\x63\xa1\x54\x42\x89\x07\x69\x8a\x5e\x2d\x5a\x18\x75\x18\x51\x4d\x5e\x7e\x50\xb5\x5b\xdd\x68\xd2\x74\x5e\x69\xfb\x5f\xae\x55\xe3\x8a\x70\x5b\xf8\x58\x24\x83\x58\x5f\x13\x5e\x95\x70\x6f\x75\x1a\x7d\x05\x60\xe3\x7e\x70\x50\x12\x52\x38\x83\xef\x53\x73\x5f\x31\x6a\x2b\x9c\xf4\x53\xcc\x6d\x32\x4e\xab\x4e\x92\x84\x2c\x8a\x8c\x65\xe2\x6f\x01\x80\xa9\x9d\xf9\x8b\x72\x7b\x52\x95\x89\x6d\x74\x63\xa2", /* 4b80 */ "\x65\x90\x5b\xd2\x63\x19\x8a\xb0\x76\xdf\x99\xa8\x7a\x74\x82\x36\x88\x46\x80\x61\x65\x57\x59\x22\x96\x44\x88\xab\x93\x26\x7b\x4b\x62\xb5\x53\x71\x5e\x81\x5b\xdf\x4f\x75\x58\xc1\x70\x58\x7d\xca\x54\x38\x73\xe0\x52\xd8\x52\x08\x78\xd0\x6b\x23\x68\x38\x4e\x43\x69\x0e\x83\x77\x6e\xd1\x98\xf2\x81\x70\x88\x57\x8e\xf8\x79\x8e\x83\xdc\x8f\xce\x7e\x01\x55\x10\x4e\xa8\x8a\x33\x91\x62\x5e\xfb\x60\x6f\x4e\x86\x66\x4b\x63\x68\x52\x17\x80\x56\x51\xfd\x76\x42\x82\x1f\x96\x85\x50\xcf\x66\x2f\x4f\x3c\x4e\x59\x6a\x3d\x4e\x71\x52\x3a\x8a\xcf\x6a\x58\x66\xff\x67\x0b\x65\x3b\x97\x32\x5e\xc3\x8a\x13\x57\x82\x60\x4b\x86\x6b\x95\xd8\x60\xa9\x4e\x01\x63\xcf\x6f\xc0\x65\x9c\x8c\xac\x83\x05\x7c\xa7\x60\x50\x96\xf7\x5f\xcd\x64\x0d\x5b\x54\x90\x0f\x62\xd3\x59\xb9\x71\x59\x51\xac\x79\xf0\x55\x2f\x52\x75\x66\x97\x80\xf8\x4e\x98\x4e\xcf\x51\xcd\x9d\x5c\x51\x44\x7a\x93\x67\xf1\x58\x41\x7c\x21\x88\x61\x5c\x31\x68\xda\x91\xe7\x9d\xf2\x63\xee\x65\x75\x84\xee\x52\x3b\x6b\x32\x7c\x98\x59\x82\x96\x9c\x89\x87\x7c\x9f\x90\x06\x62\xdb\x66\xdc\x00\x00", /* 4c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x55\x69\x82\x50\xac\x62\x3b\x5f\xd8\x63\xda\x75\xdb\x62\x7f\x61\x6e\x82\x66\x7c\x95\x71\x6e\x96\xc7\x7f\x6a\x54\x26\x52\x00\x83\xd3\x52\x11\x59\x4f\x9d\x28\x57\x4a\x66\xc7\x98\x58\x82\x0e\x66\x14\x73\x3f\x50\xb7\x65\x51\x5e\xb8\x5b\x6b\x55\xac\x5f\xeb\x63\x88\x8c\xaf\x67\x6f\x59\x51\x5a\x01\x71\xe5\x5d\xe3\x8c\x6a\x62\x71\x81\xf4\x5c\x3a\x5f\x92\x90\x45\x73\x84\x71\x49\x79\xd8\x79\x6d\x90\x03\x83\xcc\x5f\xb4\x5b\x8d\x62\x79\x64\xae\x7d\x18\x72\x3e\x5b\xee\x65\xe7\x8d\x08\x9e\x7c\x52\xe7\x5d\x07", /* 4c80 */ "\x9f\x62\x60\x69\x53\x6f\x66\x81\x96\x63\x5e\x3d\x62\xb1\x72\x2a\x6e\x4a\x93\xae\x79\xe6\x53\xe5\x80\x9d\x88\xfe\x53\xb3\x6c\x88\x6e\x7f\x51\x41\x90\x91\x6f\x6e\x84\xc4\x85\xea\x81\x29\x6b\xd2\x66\x3c\x7f\x72\x73\xc2\x5f\x1f\x79\x0e\x60\xb2\x72\xed\x58\xee\x81\x79\x8e\x8d\x5c\x65\x5d\xe7\x6c\x37\x6d\xe1\x86\x2d\x72\xaf\x8e\x0a\x7c\x92\x82\x18\x80\x33\x63\xa7\x92\x91\x50\x19\x81\x55\x8a\x69\x8e\xdf\x66\xb4\x81\x33\x75\x91\x6b\x20\x66\x69\x90\xf5\x4e\x32\x73\xea\x69\x3f\x76\x87\x70\x7d\x7d\x3a\x61\x48\x86\x07\x99\xff\x59\xc9\x78\x32\x78\x15\x90\x7f\x80\xa1\x5c\x3f\x66\xa2\x94\x18\x6d\x44\x5e\x55\x58\x54\x7b\x95\x8d\xe1\x4e\xa1\x8c\x5a\x81\xe8\x89\xe6\x96\x70\x52\x63\x74\xf6\x9a\x5a\x60\x12\x52\x0a\x74\x34\x98\x01\x90\x7a\x55\x04\x79\x56\x52\x30\x54\xb2\x8a\x34\x96\xa3\x4f\xf3\x92\x83\x91\xe3\x7d\x39\x96\x88\x4f\x51\x7d\x61\x5d\xba\x9b\xae\x5f\x80\x79\x5d\x85\x97\x8d\xa3\x7c\x60\x5c\x0a\x75\x65\x85\xa9\x63\xd6\x9e\x97\x7d\x22\x53\x75\x9a\xea\x90\x42\x6b\x3d\x7d\x0b\x63\x92\x80\xaa\x7d\xe9\x9f\x3b\x99\xc6\x00\x00", /* 4d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x78\x67\x31\x55\x31\x63\x98\x78\x25\x5c\xb3\x5d\xe1\x92\xad\x98\xfd\x98\x10\x6c\xe3\x6b\x64\x53\x21\x6b\x53\x5e\x8f\x7a\xe5\x50\x2b\x6e\x56\x62\xbd\x82\x76\x6a\x9c\x4e\x18\x57\xf7\x75\x2b\x7c\x97\x82\xeb\x98\x02\x81\x1a\x73\xcd\x8f\x9b\x5c\x0b\x63\xe1\x73\x72\x81\x50\x80\xe1\x5b\x99\x76\xd7\x62\x91\x65\xec\x8a\x3a\x59\x47\x65\xe8\x6e\x7e\x66\x96\x55\xab\x8f\x09\x92\xed\x93\x96\x4e\xee\x75\x5c\x6f\x38\x8f\x9e\x79\x81\x5c\x01\x62\xe0\x9b\xe8\x91\xc8\x62\x76\x65\xcb\x8e\x0f\x8b\x21\x69\x9b\x62\x16", /* 4d80 */ "\x5a\x92\x90\xb8\x50\xda\x79\xdf\x6c\x41\x52\x70\x91\x75\x8b\x39\x68\x5d\x58\x75\x81\x9c\x5b\x9c\x8a\x89\x8a\x72\x9d\x8f\x63\x77\x59\x74\x8a\xa4\x52\xb1\x69\x62\x5c\x48\x9c\xe9\x67\x3a\x75\xb2\x6d\x1e\x4f\x0d\x7e\x6d\x7b\x48\x7f\xcc\x65\xe6\x59\xa5\x79\xe9\x62\x12\x6e\xde\x77\x0b\x8c\xa7\x65\xbc\x88\x5d\x6a\xdb\x5c\x4a\x80\x74\x90\x84\x8e\xcc\x65\xd7\x57\xf9\x70\x8e\x6f\x06\x5e\x7c\x77\xac\x4f\xf5\x59\x49\x81\xed\x9b\x45\x7f\xfc\x81\x78\x69\xfd\x6c\xca\x69\xc7\x79\xd2\x8b\x1d\x9e\xd9\x81\xd3\x7a\x3c\x79\x68\x6f\x5c\x63\xb2\x8d\xdd\x63\x83\x6e\x9c\x5e\x33\x61\xf8\x76\xbf\x64\x2c\x7d\xb4\x62\x47\x64\x58\x68\x16\x5f\x69\x90\x22\x7a\x1a\x82\xb9\x70\xc8\x9a\x12\x61\x63\x6f\xef\x53\xeb\x9d\x3b\x62\xfe\x60\xa0\x95\x91\x6d\x99\x61\x62\x92\x98\x63\x5c\x97\x07\x89\x72\x68\x3d\x51\xe1\x9b\x54\x60\x8c\x5b\x22\x99\xc4\x71\x26\x8a\x73\x97\x1c\x73\x96\x67\xd4\x60\xa3\x4e\x11\x4e\xf0\x8c\xdb\x8c\xb0\x79\x12\x97\x74\x89\x86\x51\x46\x57\xdc\x99\xd0\x80\xc3\x83\x38\x78\xa7\x86\xcd\x7f\x85\x50\x49\x82\x47\x69\x0b\x7c\x4d\x00\x00", /* 4e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xea\x5f\x26\x6e\x25\x68\x81\x93\x75\x5d\xfd\x53\x47\x97\x27\x64\x3a\x75\xc7\x6f\xa4\x73\xa9\x77\xe9\x94\x51\x8b\x5c\x80\x8c\x67\x4e\x4e\xad\x58\x2f\x75\x73\x8e\xd2\x6c\xe5\x93\x20\x8f\xf7\x7d\x33\x72\xc2\x82\x17\x74\x22\x82\xc5\x9a\x30\x77\x3a\x5f\x84\x96\x73\x64\xad\x92\x0d\x74\xdc\x60\xc7\x86\xed\x4f\xfa\x52\xa3\x6a\x3a\x77\x20\x53\x20\x61\xb6\x56\x74\x87\x76\x6c\xbf\x50\x5c\x60\x2a\x84\x66\x6b\x96\x6d\xbc\x97\xd3\x96\x8f\x68\x76\x60\xd1\x53\x78\x64\xa4\x51\xa0\x91\x54\x5d\xf4\x62\x9e\x5e\x63", /* 4e80 */ "\x92\x9a\x76\x93\x6c\x5a\x65\x97\x50\xe7\x7c\x82\x5f\x6b\x6c\xe1\x5f\x6c\x5a\xc1\x6f\x2c\x85\x2d\x64\x42\x57\x50\x58\xc7\x8c\xfc\x8a\x5e\x7a\x7f\x68\x9d\x7e\x26\x7a\x40\x73\x44\x8a\xeb\x4f\xd7\x7a\x63\x80\x36\x7d\xef\x80\xc6\x8a\xed\x73\x1f\x8f\xea\x4f\x0e\x75\x8b\x51\x8a\x67\x34\x5f\xd9\x61\xc7\x65\xaf\x9c\xf3\x5e\xca\x92\x62\x68\xdf\x6c\xb8\x80\xf4\x57\xcb\x6c\x99\x96\xa0\x5b\x64\x58\xf1\x68\xc4\x54\x10\x98\x30\x8a\x87\x4e\x5e\x61\x67\x9b\xab\x90\xaa\x55\xb0\x82\xbd\x59\x6a\x66\xf3\x82\x99\x58\x93\x71\x9f\x62\x84\x67\xd1\x90\x63\x5a\xcc\x6c\x57\x7c\xe7\x58\x51\x64\xb2\x58\xca\x83\x0e\x59\x68\x53\x02\x5a\x46\x87\x02\x60\x65\x72\xd9\x89\xa7\x66\x89\x66\xf9\x5d\x6f\x5b\xb0\x96\xbc\x63\x6e\x60\xdc\x79\x48\x51\xdd\x86\x06\x5e\xc9\x75\x54\x59\x6e\x6b\x04\x4f\x43\x7b\x94\x67\xda\x62\xdd\x62\x8a\x97\x1e\x62\xed\x6e\xc5\x50\x8d\x67\xb6\x80\xe4\x9e\xbf\x5e\xb5\x63\x8c\x85\xcd\x98\x67\x52\xc5\x60\x16\x68\xcb\x61\xd0\x57\x51\x8f\x29\x5f\xaa\x81\xa8\x7d\x62\x71\xc8\x54\xc0\x69\xcc\x6b\x3e\x65\xac\x63\xc3\x4f\x46\x00\x00", /* 4f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x1b\x6b\x86\x88\xf8\x52\x03\x73\x2e\x66\x87\x7d\x17\x57\xf4\x57\x0f\x61\x8e\x97\x0a\x7c\x3f\x8b\x00\x78\x81\x8c\xe0\x54\x8b\x7b\x87\x74\x5b\x7c\x11\x88\x70\x53\x98\x54\x48\x6c\xf3\x6f\x22\x53\xf6\x88\xb4\x53\x01\x7a\x6b\x86\x95\x58\x6b\x5d\x29\x88\xc2\x62\xd2\x4e\x1e\x50\x36\x96\xc0\x73\x63\x8a\x3b\x51\x76\x71\x99\x7f\xe0\x88\x88\x7e\x1e\x4e\x4f\x84\xcb\x6f\x2b\x58\x59\x93\x6c\x53\xe9\x86\x5a\x91\x49\x86\xef\x5e\x06\x55\x07\x90\x2e\x67\x95\x84\x6c\x5b\xa5\x82\xa5\x84\x31\x6d\x8c\x63\xfa\x4e\xa5", /* 4f80 */ "\x51\xc6\x63\x28\x7f\x70\x5b\x5f\x5d\xbd\x99\xc8\x53\xec\x79\x85\x8a\x54\x79\x62\x88\xdf\x5b\x09\x4f\xb5\x4f\x91\x9b\x8e\x51\x92\x96\xf0\x6d\xaf\x62\x2f\x84\x90\x8c\xdc\x50\x75\x5c\xe0\x4e\x14\x4f\x83\x7c\x54\x84\xd1\x77\xb3\x8a\xee\x5c\xe8\x62\xf6\x66\x3b\x8a\x93\x85\x26\x8a\x95\x65\xfa\x67\x14\x53\xd4\x62\xab\x8c\xe6\x88\xf3\x5b\xe7\x86\x8a\x66\x8e\x58\x2a\x61\x70\x69\x6f\x9f\x13\x7a\x92\x78\x93\x6a\x7f\x90\x17\x92\x66\x7d\x10\x7b\xc7\x6e\xf4\x82\x1c\x5c\x3d\x62\xcd\x85\xc1\x6f\x02\x6e\x67\x66\x91\x85\xa6\x63\x7a\x82\x1b\x4f\x8d\x50\x91\x8a\x02\x62\xec\x9b\xc9\x7a\x3d\x7c\x9b\x50\xc5\x90\x19\x70\x8a\x7c\x8b\x64\xec\x66\x5f\x65\x62\x73\x2b\x53\x39\x67\xa0\x55\xa7\x6d\x2a\x7a\x3f\x64\xe6\x79\xa7\x67\xd8\x7b\x26\x96\xbb\x63\x11\x72\xa0\x5c\x6f\x70\x26\x97\xee\x60\xdf\x8a\xfe\x8b\x04\x84\x94\x9b\xd6\x82\xaf\x93\x2c\x66\x06\x96\x40\x5b\xc2\x86\xc7\x79\x49\x80\x17\x69\x19\x70\x92\x96\x3b\x7c\x7e\x59\xd3\x5b\x5c\x7d\x1b\x91\xd8\x6a\x80\x85\xe9\x69\x05\x6c\x93\x50\x2d\x4e\xa6\x7f\xc1\x61\xa4\x8c\xca\x96\x65\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\xd1\x53\xf1\x59\x8a\x8e\xac\x62\xd8\x68\x67\x71\xd5\x7b\x67\x50\x4f\x67\xd0\x82\xd1\x97\x8d\x74\x8b\x80\xba\x73\x36\x51\x4e\x81\x05\x90\xca\x58\x4a\x67\xfe\x6f\xf1\x5f\xfd\x76\xc6\x9a\x0e\x50\x7d\x96\x94\x5e\xf7\x7b\xb8\x90\x4d\x6c\x4e\x85\xfb\x81\x9d\x67\xaf\x56\x4c\x56\x06\x8c\x8c\x56\xda\x73\xed\x8c\xc4\x8f\xc5\x96\xf6\x6c\x50\x89\x44\x8f\x3f\x7d\x5e\x60\xe8\x72\xfc\x7d\x9c\x84\x63\x5c\xfb\x54\x46\x5d\x16\x6c\xa1\x81\xb3\x58\xfa\x5b\xb4\x81\x08\x54\x1f\x8c\xbc\x61\x82\x78\xa9\x6f\xe1\x91\xac", /* 5080 */ "\x76\xf2\x60\x20\x76\xfe\x84\xc9\x7f\x36\x4e\xc7\x75\x5d\x7a\x17\x84\xec\x75\xf4\x4f\x3a\x67\x6d\x74\x60\x62\xf3\x6f\x20\x79\xe4\x87\xf9\x60\x94\x62\x34\x66\xab\x82\x0c\x84\x99\x72\x3a\x5f\xcc\x61\x09\x70\xcf\x72\x61\x7a\x50\x50\x98\x9a\xed\x5d\x69\x60\x1c\x66\x67\x99\xb4\x5e\x7b\x64\x3e\x58\x30\x53\xc9\x7a\x9f\x99\x0c\x9b\x42\x8f\x5f\x7a\xae\x5b\x9b\x68\xa2\x62\x49\x79\x84\x9d\xfa\x54\x51\x93\x2f\x8a\xc4\x5f\x90\x8d\xf3\x5a\x2f\x80\xde\x6d\x29\x7a\x4f\x84\xbc\x9d\x2b\x90\x10\x6d\x38\x91\x6a\x6f\xc1\x99\x05\x6b\xbb\x5e\xb6\x91\xb8\x50\x76\x6f\x0f\x4e\x19\x54\x0f\x96\x75\x6c\x72\x51\xb4\x56\x31\x9f\x20\x66\xa6\x5f\x0a\x75\xab\x51\xf8\x67\x4f\x8d\xf5\x6c\x70\x8a\x6b\x75\x7f\x5c\xac\x68\x41\x8c\xd3\x9b\xdb\x84\x75\x68\x93\x84\x0c\x72\xdb\x75\x77\x85\x68\x78\x3a\x84\x7a\x5f\x10\x83\x1c\x68\x13\x6e\x1a\x9d\xaf\x51\xf9\x79\x80\x4e\x99\x5e\xe3\x90\x8a\x80\xaf\x59\xa8\x77\xdb\x8d\x74\x8a\x1f\x67\x3d\x53\x3f\x8a\x0a\x56\x18\x67\x56\x53\xd9\x4f\x10\x74\x09\x5a\x41\x4f\xf8\x79\xb0\x98\x38\x8e\x2a\x9d\x60\x8f\x44\x00\x00", /* 5100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xa5\x75\xbe\x90\x6d\x86\x7b\x60\xbc\x51\xb6\x59\x37\x7d\x2f\x91\x6c\x69\xae\x7c\xe0\x79\x2a\x5d\x14\x64\xc1\x58\xec\x58\x9c\x8d\x66\x66\xd9\x61\xf2\x91\x2d\x6e\x58\x94\x35\x96\x5b\x72\x72\x5f\x6a\x5e\x9a\x8f\x1b\x5b\x95\x5c\x39\x90\x13\x83\x4f\x7c\xce\x62\x0a\x90\xed\x69\x1b\x6e\x15\x65\xdb\x66\xfe\x4e\x9f\x55\xaa\x7a\x83\x83\xe9\x8b\x83\x84\x6d\x83\xf0\x7f\x50\x91\x8d\x91\x90\x75\x8e\x95\xa5\x81\xe7\x75\xe2\x61\xa9\x8a\x50\x95\xb2\x53\xa8\x59\xf6\x98\x13\x78\x91\x7c\x17\x6b\x3a\x57\xe0\x62\x0e", /* 5180 */ "\x83\xd6\x8a\xd2\x75\xd4\x92\x7e\x59\xdc\x52\x89\x90\x87\x6f\xfe\x74\x73\x5c\x09\x9d\x6c\x84\xfc\x7c\xdf\x7b\xad\x8a\x6e\x59\x4e\x56\xca\x81\x9a\x79\x47\x66\x36\x53\xe1\x78\x87\x58\xcc\x93\x97\x6e\x13\x52\x56\x82\x8b\x9e\x9f\x95\x83\x65\x8c\x9e\x93\x73\x45\x6e\x26\x9d\x07\x59\x83\x7d\xac\x96\xc1\x61\xbe\x67\x62\x9e\xce\x90\xa8\x91\x87\x9f\x0e\x7c\x38\x51\xf1\x85\x99\x52\x4c\x54\x0e\x79\x01\x65\x5e\x66\x68\x5c\xe1\x75\x66\x76\xc8\x86\x79\x53\x1d\x55\x06\x79\x26\x89\x12\x77\xef\x7c\xc0\x57\x0b\x51\x5c\x7e\x8a\x53\x5c\x8a\x60\x65\xa7\x87\x66\x57\x66\x6a\xe8\x87\xfb\x5e\x16\x7a\xea\x8d\x73\x77\x1e\x73\x7a\x66\xe0\x94\x10\x81\x6b\x7b\x08\x91\xfc\x57\x37\x6f\xe4\x85\x6a\x7e\x55\x99\x57\x87\xba\x69\x4a\x81\x8f\x5e\xff\x89\x1c\x72\xd0\x98\x46\x9e\xdb\x8d\x99\x5d\xd6\x62\xb9\x64\xab\x4f\x76\x61\x3f\x68\xaf\x5f\x14\x80\x0c\x92\xf8\x7b\xc1\x52\xfe\x66\x4f\x91\x77\x51\xf6\x97\xa0\x83\x9e\x64\x7a\x9c\x3a\x68\x05\x7c\x4f\x68\x5f\x9b\x6f\x9f\x4b\x7f\xfb\x93\x48\x4f\xf6\x9e\x92\x91\xb1\x96\xdb\x5b\xe6\x6c\xcc\x7c\xfe\x00\x00", /* 5200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x53\x68\x22\x66\xb9\x5b\xd4\x98\xf4\x8a\xe6\x81\x54\x78\x27\x74\xbd\x6e\xd3\x92\x88\x5a\x20\x5b\x8b\x86\xf8\x76\x0d\x86\x5c\x66\x41\x91\xc9\x55\x89\x7a\x4e\x59\xe5\x60\x42\x93\x2b\x5b\x5a\x84\x9c\x5c\x91\x96\xcd\x62\xd9\x67\x5c\x67\x87\x5e\x7d\x86\x50\x9e\xb9\x5c\xb1\x80\xce\x7a\x00\x8a\xbc\x57\x00\x80\x96\x7d\x72\x92\x11\x80\x98\x90\x7c\x77\x61\x87\x37\x90\x75\x81\x7a\x7c\x3e\x6e\xa2\x96\x5e\x7e\x90\x72\xd7\x58\xfd\x60\xb3\x97\x86\x7e\x88\x58\x7e\x6e\x20\x84\xdc\x69\x61\x77\xad\x51\x97\x65\x2a", /* 5280 */ "\x67\x77\x5d\xcd\x61\x01\x93\x2e\x59\x54\x63\x67\x79\x8d\x7a\xff\x80\xd6\x58\xb3\x61\x68\x6a\xc3\x74\x83\x9b\x92\x66\x0a\x64\x2d\x51\x18\x67\x63\x80\x9b\x9c\x10\x4f\xc9\x69\x53\x7a\x1c\x52\xff\x60\x55\x76\x8e\x81\x7f\x56\x42\x5f\x6d\x71\x94\x70\xbb\x74\x36\x80\x00\x88\x1f\x55\xda\x74\x35\x76\x90\x96\xeb\x66\xdd\x75\x1c\x63\x3d\x6e\xc9\x7c\x64\x7c\xa5\x6d\x35\x93\x5c\x70\x27\x5e\x25\x70\x1d\x54\xbd\x61\x1a\x69\x73\x6c\x6a\x55\x9a\x6d\x19\x96\xcc\x5b\xe1\x59\xfb\x69\x7c\x91\x4c\x77\x09\x85\x00\x7a\x46\x78\x72\x92\xe4\x8c\xed\x7c\xfa\x9d\x1b\x81\x4e\x9a\xc4\x68\xa0\x6d\xcb\x59\x18\x84\x0a\x56\x29\x9b\x41\x68\x97\x70\xb3\x97\x71\x94\x19\x67\xa2\x68\x02\x78\x95\x68\xa7\x50\xd6\x80\xb1\x5e\xf8\x82\xd4\x79\x7a\x67\xca\x7e\x61\x69\xcd\x51\xc4\x72\x3d\x68\x29\x99\xb3\x5f\x3c\x8f\x61\x68\x2b\x61\x55\x65\x91\x8f\xb1\x7e\x1b\x97\x98\x99\x52\x88\x77\x5b\x2c\x66\x31\x4f\xe0\x69\x39\x6a\xfb\x5b\xb5\x7a\xc8\x50\x26\x59\x44\x90\x59\x7b\x25\x7b\x4f\x8e\x74\x85\x43\x58\x58\x8b\x0e\x50\x39\x86\x54\x97\xf6\x75\x69\x72\xf8\x00\x00", /* 5300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xf7\x9d\x89\x50\x16\x51\xcc\x62\xcc\x91\xc6\x87\x55\x64\x9a\x88\xf4\x91\xe6\x68\x54\x69\x5a\x6c\x40\x7b\x6c\x67\x41\x77\xd7\x88\x23\x53\x84\x8e\xc0\x72\x80\x8c\x6b\x78\x8d\x71\x65\x82\x07\x68\xb1\x8d\x04\x90\x77\x70\x1e\x8f\xe6\x81\x0a\x81\xbf\x89\xdc\x68\xb3\x6a\xdf\x92\xea\x95\xc7\x79\x57\x7a\x20\x53\xa9\x8e\x5f\x78\x6f\x79\xb9\x5f\x27\x5e\xd6\x68\x53\x93\xac\x91\x9c\x69\x1a\x58\x06\x64\xb0\x7e\x6b\x7d\x8f\x68\xf2\x6e\xa5\x82\xdb\x91\x92\x52\x43\x8e\xb0\x90\x81\x72\x1b\x7d\xcb\x76\x56\x59\xac", /* 5380 */ "\x6f\xe0\x8b\x28\x80\xa2\x55\x44\x60\x70\x5f\x4a\x68\xc8\x63\x3a\x94\x38\x9b\x4f\x81\xe5\x6a\x17\x70\xdd\x69\xa7\x61\x4c\x92\x0e\x93\x10\x9b\xad\x52\xd7\x92\x5e\x92\xf9\x59\x93\x76\x96\x66\xfb\x57\x69\x73\xca\x76\x78\x6a\x1f\x7e\x9c\x98\x11\x8c\xd1\x58\x40\x63\x49\x87\x1c\x62\xd0\x60\xb4\x6b\x89\x86\xee\x57\x64\x58\x1d\x85\x49\x72\x35\x76\x52\x98\x3b\x82\x37\x53\x51\x5c\x24\x59\xbe\x58\x15\x90\x1d\x69\xb4\x83\x4a\x9e\xa9\x97\x6b\x80\x86\x53\xad\x60\x68\x4f\xae\x76\xc3\x6a\x05\x68\x9b\x93\x7e\x99\xd5\x91\xc7\x5c\x16\x58\x5e\x61\xa7\x96\x99\x4f\xdf\x82\x78\x9c\x52\x5f\x45\x61\x08\x7c\x8d\x80\x6f\x5d\xf7\x8d\x6b\x57\xb0\x98\xe2\x57\x03\x79\xbf\x59\x96\x79\x41\x54\x0a\x83\xdf\x9c\x39\x52\xd2\x6b\xd8\x86\xcb\x4e\xc0\x9a\x52\x53\x66\x80\x06\x73\x37\x64\x92\x8f\xed\x5a\xc9\x54\x20\x53\x7f\x4f\xaf\x80\x7e\x54\x3b\x75\x15\x7b\x18\x87\xec\x54\xb3\x70\x4c\x89\x97\x6c\xab\x85\xfa\x71\x30\x69\x6e\x93\x28\x74\x5a\x59\xd1\x6e\x5b\x61\x7e\x53\xe2\x83\x17\x76\xe7\x85\x23\x85\xaf\x69\x25\x5c\x60\x72\x59\x75\xd5\x8b\x90\x00\x00", /* 5400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x07\x82\xad\x5c\x5b\x7b\xed\x97\x84\x6f\x70\x76\x4c\x88\xb7\x92\xd2\x4f\x36\x5e\xfe\x90\x61\x88\xe1\x84\x71\x71\x1a\x6d\x1b\x80\xb4\x74\xe2\x74\x33\x5a\x7f\x90\x5c\x98\x0c\x53\x19\x90\x6e\x6b\xb4\x85\xaa\x78\x97\x7a\xfa\x6a\xae\x89\x10\x95\x8f\x62\x0c\x4f\x3d\x4f\x7c\x79\xbe\x9d\xd7\x4e\xd4\x57\xa2\x51\xa5\x69\x00\x60\x89\x70\x7c\x7a\xe3\x89\x56\x93\xa7\x9c\x2d\x51\x12\x52\xfa\x7c\xca\x60\xf9\x70\x78\x81\xc6\x55\x9d\x69\x91\x96\xc9\x55\x3e\x80\x5a\x83\x04\x83\x32\x54\xfa\x56\x99\x8f\xbf\x56\x34", /* 5480 */ "\x67\x60\x52\x65\x84\x0e\x5e\x5f\x7b\x65\x90\x35\x83\x87\x6b\x4e\x58\xbe\x63\x09\x72\x7d\x97\xad\x69\xd0\x54\x6a\x98\x4e\x63\x2b\x71\x4e\x85\x57\x7c\xde\x63\x72\x68\xf9\x75\x11\x86\x02\x6e\xba\x5a\x3c\x7a\x84\x85\x1a\x95\xa4\x59\xd0\x60\xda\x51\xea\x5a\x29\x71\x69\x6f\x15\x69\x6b\x64\x14\x76\x26\x4e\x4e\x7d\xbb\x69\x34\x85\x21\x8f\xfa\x93\x54\x9c\x3b\x5f\x17\x5e\xd3\x82\x58\x89\x5f\x82\xe7\x52\xc3\x5c\x51\x83\xab\x78\x26\x79\xe1\x7f\xf0\x62\x6e\x60\xf0\x5c\xa8\x6f\x97\x71\xa8\x99\x09\x51\x32\x5e\x37\x5f\x04\x63\x7b\x67\x53\x68\xd7\x66\x52\x9c\xf6\x88\xb0\x52\xab\x4f\xc4\x4e\x3c\x67\xb3\x7c\x1e\x7f\x4d\x8a\x23\x64\x51\x71\xe6\x65\xa4\x6f\x09\x85\x3d\x50\x72\x7d\xba\x55\x5e\x7b\x04\x72\xfd\x6c\xd3\x84\x22\x62\x1f\x50\xad\x82\x35\x87\x18\x59\x19\x60\x28\x67\x7c\x6f\x23\x75\xb9\x69\x5c\x52\x0e\x80\x18\x8b\x01\x71\xed\x57\x13\x66\x0f\x83\xeb\x71\x64\x7d\x9b\x56\x17\x7d\x7d\x8f\x4d\x93\x18\x85\x69\x5d\x17\x67\x8c\x67\xde\x87\xc7\x79\xae\x58\x35\x84\x04\x90\x41\x7f\xd4\x6f\x51\x8a\x63\x9d\x08\x67\x0f\x93\x9a\x00\x00", /* 5500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xac\x60\x2f\x64\xe2\x60\x8d\x96\xb7\x63\x57\x84\x61\x91\x4b\x75\xd8\x60\xe7\x99\x13\x9c\x57\x59\x84\x6d\xeb\x5e\x96\x70\x06\x9b\xf0\x58\xbb\x79\xb1\x60\xb6\x63\x3f\x5b\xf5\x98\x12\x55\x8b\x82\xd3\x51\x47\x61\x90\x79\x53\x79\xbd\x6c\x5d\x9e\xba\x9c\x48\x8d\xa8\x5e\xe0\x7d\x43\x5e\xfc\x85\x4e\x8c\xe4\x5a\xe1\x54\xe8\x50\x23\x52\xbe\x7d\xec\x85\x11\x66\x66\x6c\x3e\x72\x4c\x8a\xdc\x9c\x0d\x77\xa5\x8b\x02\x8d\x05\x6f\x11\x98\x34\x97\xfb\x50\xfb\x7f\x75\x5a\x03\x85\x13\x4f\xb6\x63\x4c\x9d\x61\x80\x8b", /* 5580 */ "\x52\x94\x65\xa1\x56\x7a\x59\x57\x8d\x0b\x6a\x35\x6a\xd3\x70\xf9\x86\x5e\x6f\xb1\x51\xe7\x7f\xeb\x59\xea\x5e\x87\x6b\x6a\x75\x4f\x71\x7d\x91\x4e\x7d\x2c\x8c\x79\x60\x62\x62\x1a\x7f\xa8\x5f\x1b\x6c\x8c\x86\xfe\x75\x62\x7b\x86\x9a\xb8\x66\x27\x7a\xba\x84\x4e\x6f\x81\x8b\x2c\x86\xa4\x6f\xeb\x7b\x8b\x7f\x77\x8f\x2f\x8e\x44\x7e\x23\x4e\x4d\x79\xa6\x8a\xfa\x90\x3c\x50\xd1\x9e\xcd\x5e\xdf\x75\x8f\x63\x1f\x53\xdb\x99\x10\x82\x6e\x62\xf7\x68\xfa\x72\x5d\x80\x3d\x58\xd5\x5c\x4d\x86\xd9\x54\x0b\x88\x05\x92\xf2\x92\x37\x5c\x62\x98\x5b\x86\xe4\x96\x6a\x72\x62\x69\x55\x6c\xd7\x69\x94\x9c\x2f\x77\xe7\x68\xc9\x8d\xe8\x6d\x6c\x67\xc1\x9b\xaa\x61\x9a\x63\xa9\x70\x15\x93\x06\x93\x4d\x6a\x61\x62\x58\x52\x83\x75\x25\x56\x87\x6c\x83\x68\x34\x64\x9e\x4e\x9b\x72\x52\x59\xe6\x8f\xc2\x5f\xbd\x6d\xd8\x85\xf7\x8a\x51\x98\x17\x99\xc1\x63\xa0\x7c\x81\x5b\x30\x81\x39\x54\x03\x7e\x82\x81\x06\x53\x2a\x6a\x8e\x7f\x6b\x54\xe9\x56\x78\x8a\xb9\x67\x15\x5b\xd3\x64\x78\x64\xfe\x6b\x1d\x8c\xc2\x51\xcb\x7e\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x0c\x4e\x10\x4e\x15\x4e\x28\x4e\x2a\x4e\x31\x4e\x36\x4e\x3f\x4e\x42\x4e\x56\x4e\x58\x4e\x62\x4e\x82\x4e\x85\x4e\x8a\x4e\x8e\x5f\x0d\x4e\x9e\x4e\xa0\x4e\xa2\x4e\xb0\x4e\xb3\x4e\xb6\x4e\xce\x4e\xcd\x4e\xc4\x4e\xc6\x4e\xc2\x4e\xe1\x4e\xd7\x4e\xde\x4e\xed\x4e\xdf\x4e\xfc\x4f\x09\x4f\x1c\x4f\x00\x4f\x03\x4f\x5a\x4f\x30\x4f\x5d\x4f\x39\x4f\x57\x4f\x47\x4f\x5e\x4f\x56\x4f\x5b\x4f\x92\x4f\x8a\x4f\x88\x4f\x8f\x4f\x9a\x4f\xad\x4f\x98\x4f\x7b\x4f\xab\x4f\x69\x4f\x70\x4f\x94\x4f\x6f\x4f\x86\x4f\x96\x4f\xd4", /* 5680 */ "\x4f\xce\x4f\xd8\x4f\xdb\x4f\xd1\x4f\xda\x4f\xd0\x4f\xcd\x4f\xe4\x4f\xe5\x50\x1a\x50\x40\x50\x28\x50\x14\x50\x2a\x50\x25\x50\x05\x50\x21\x50\x22\x50\x29\x50\x2c\x4f\xff\x4f\xfe\x4f\xef\x50\x11\x50\x1e\x50\x06\x50\x43\x50\x47\x50\x55\x50\x50\x50\x48\x50\x5a\x50\x56\x50\x0f\x50\x46\x50\x70\x50\x42\x50\x6c\x50\x78\x50\x80\x50\x94\x50\x9a\x50\x85\x50\xb4\x67\x03\x50\xb2\x50\xc9\x50\xca\x50\xb3\x50\xc2\x50\xf4\x50\xde\x50\xe5\x50\xd8\x50\xed\x50\xe3\x50\xee\x50\xf9\x50\xf5\x51\x09\x51\x01\x51\x02\x51\x1a\x51\x15\x51\x14\x51\x16\x51\x21\x51\x3a\x51\x37\x51\x3c\x51\x3b\x51\x3f\x51\x40\x51\x4a\x51\x4c\x51\x52\x51\x54\x51\x62\x51\x64\x51\x69\x51\x6a\x51\x6e\x51\x80\x51\x82\x56\xd8\x51\x8c\x51\x89\x51\x8f\x51\x91\x51\x93\x51\x95\x51\x96\x51\x9d\x51\xa4\x51\xa6\x51\xa2\x51\xa9\x51\xaa\x51\xab\x51\xb3\x51\xb1\x51\xb2\x51\xb0\x51\xb5\x51\xbe\x51\xbd\x51\xc5\x51\xc9\x51\xdb\x51\xe0\x51\xe9\x51\xec\x51\xed\x51\xf0\x51\xf5\x51\xfe\x52\x04\x52\x0b\x52\x14\x52\x15\x52\x27\x52\x2a\x52\x2e\x52\x33\x52\x39\x52\x44\x52\x4b\x00\x00", /* 5700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x4f\x52\x5e\x52\x54\x52\x71\x52\x6a\x52\x73\x52\x74\x52\x69\x52\x7f\x52\x7d\x52\x8d\x52\x88\x52\x92\x52\x91\x52\x9c\x52\xa6\x52\xac\x52\xad\x52\xbc\x52\xb5\x52\xc1\x52\xc0\x52\xcd\x52\xdb\x52\xde\x52\xe3\x52\xe6\x52\xe0\x52\xf3\x52\xf5\x52\xf8\x52\xf9\x53\x00\x53\x06\x53\x07\x53\x08\x75\x38\x53\x0d\x53\x10\x53\x0f\x53\x15\x53\x1a\x53\x24\x53\x23\x53\x2f\x53\x31\x53\x33\x53\x38\x53\x40\x53\x45\x53\x46\x53\x49\x4e\x17\x53\x4d\x51\xd6\x82\x09\x53\x5e\x53\x69\x53\x6e\x53\x72\x53\x77\x53\x7b\x53\x82", /* 5780 */ "\x53\x93\x53\x96\x53\xa0\x53\xa6\x53\xa5\x53\xae\x53\xb0\x53\xb2\x53\xb6\x53\xc3\x7c\x12\x53\xdd\x53\xdf\x66\xfc\xfa\x0e\x71\xee\x53\xee\x53\xe8\x53\xed\x53\xfa\x54\x01\x54\x3d\x54\x40\x54\x2c\x54\x2d\x54\x3c\x54\x2e\x54\x36\x54\x29\x54\x1d\x54\x4e\x54\x8f\x54\x75\x54\x8e\x54\x5f\x54\x71\x54\x77\x54\x70\x54\x92\x54\x7b\x54\x80\x54\x9c\x54\x76\x54\x84\x54\x90\x54\x86\x54\x8a\x54\xc7\x54\xbc\x54\xaf\x54\xa2\x54\xb8\x54\xa5\x54\xac\x54\xc4\x54\xd8\x54\xc8\x54\xa8\x54\xab\x54\xc2\x54\xa4\x54\xa9\x54\xbe\x54\xe5\x54\xff\x54\xe6\x55\x0f\x55\x14\x54\xfd\x54\xee\x54\xed\x54\xe2\x55\x39\x55\x40\x55\x63\x55\x4c\x55\x2e\x55\x5c\x55\x45\x55\x56\x55\x57\x55\x38\x55\x33\x55\x5d\x55\x99\x55\x80\x55\x8a\x55\x9f\x55\x7b\x55\x7e\x55\x98\x55\x9e\x55\xae\x55\x7c\x55\x86\x55\x83\x55\xa9\x55\x87\x55\xa8\x55\xc5\x55\xdf\x55\xc4\x55\xdc\x55\xe4\x55\xd4\x55\xf9\x56\x14\x55\xf7\x56\x16\x55\xfe\x55\xfd\x56\x1b\x56\x4e\x56\x50\x56\x36\x56\x32\x56\x38\x56\x6b\x56\x64\x56\x86\x56\x2f\x56\x6c\x56\x6a\x71\xdf\x56\x94\x56\x8f\x56\x80\x00\x00", /* 5800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x8a\x56\xa0\x56\xa5\x56\xae\x56\xb6\x56\xb4\x56\xc8\x56\xc2\x56\xbc\x56\xc1\x56\xc3\x56\xc0\x56\xce\x56\xd3\x56\xd1\x56\xd7\x56\xee\x56\xf9\x56\xff\x57\x04\x57\x09\x57\x08\x57\x0d\x55\xc7\x57\x18\x57\x16\x57\x1c\x57\x26\x57\x38\x57\x4e\x57\x3b\x57\x59\x57\x40\x57\x4f\x57\x65\x57\x88\x57\x61\x57\x7f\x57\x89\x57\x93\x57\xa0\x57\xa4\x57\xb3\x57\xac\x57\xaa\x57\xc3\x57\xc6\x57\xc8\x57\xc0\x57\xd4\x57\xc7\x57\xd2\x57\xd3\x57\xd6\xfa\x0f\x58\x0a\x57\xe3\x58\x0b\x58\x19\x58\x21\x58\x4b\x58\x62\x6b\xc0", /* 5880 */ "\x58\x3d\x58\x52\xfa\x10\x58\x70\x58\x79\x58\x85\x58\x72\x58\x9f\x58\xab\x58\xb8\x58\x9e\x58\xae\x58\xb2\x58\xb9\x58\xba\x58\xc5\x58\xd3\x58\xd1\x58\xd7\x58\xd9\x58\xd8\x58\xde\x58\xdc\x58\xdf\x58\xe4\x58\xe5\x58\xef\x58\xf7\x58\xf9\x58\xfb\x58\xfc\x59\x02\x59\x0a\x59\x0b\x59\x10\x59\x1b\x68\xa6\x59\x25\x59\x2c\x59\x2d\x59\x32\x59\x38\x59\x3e\x59\x55\x59\x50\x59\x53\x59\x5a\x59\x58\x59\x5b\x59\x5d\x59\x63\x59\x62\x59\x60\x59\x67\x59\x6c\x59\x69\x59\x78\x59\x81\x59\x8d\x59\x9b\x59\x9d\x59\xa3\x59\xa4\x59\xb2\x59\xba\x59\xc6\x59\xe8\x59\xd9\x59\xda\x5a\x25\x5a\x1f\x5a\x11\x5a\x1c\x5a\x1a\x5a\x09\x5a\x40\x5a\x6c\x5a\x49\x5a\x35\x5a\x36\x5a\x62\x5a\x6a\x5a\x9a\x5a\xbc\x5a\xbe\x5a\xd0\x5a\xcb\x5a\xc2\x5a\xbd\x5a\xe3\x5a\xd7\x5a\xe6\x5a\xe9\x5a\xd6\x5a\xfa\x5a\xfb\x5b\x0c\x5b\x0b\x5b\x16\x5b\x32\x5b\x2a\x5b\x36\x5b\x3e\x5b\x43\x5b\x45\x5b\x40\x5b\x51\x5b\x55\x5b\x56\x65\x88\x5b\x5b\x5b\x65\x5b\x69\x5b\x70\x5b\x73\x5b\x75\x5b\x78\x5b\x7a\x5b\x80\x5b\x83\x5b\xa6\x5b\xb8\x5b\xc3\x5b\xc7\x5b\xc0\x5b\xc9\x75\x2f\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xd0\x5b\xd8\x5b\xde\x5b\xec\x5b\xe4\x5b\xe2\x5b\xe5\x5b\xeb\x5b\xf0\x5b\xf3\x5b\xf6\x5c\x05\x5c\x07\x5c\x08\x5c\x0d\x5c\x13\x5c\x1e\x5c\x20\x5c\x22\x5c\x28\x5c\x38\x5c\x41\x5c\x46\x5c\x4e\x5c\x53\x5c\x50\x5b\x71\x5c\x6c\x5c\x6e\x5c\x76\x5c\x79\x5c\x8c\x5c\x94\x5c\xbe\x5c\xab\x5c\xbb\x5c\xb6\x5c\xb7\x5c\xa6\x5c\xba\x5c\xc5\x5c\xbc\x5c\xc7\x5c\xd9\x5c\xe9\x5c\xfd\x5c\xfa\x5c\xf5\x5c\xed\x5c\xea\x5d\x0b\x5d\x15\x5d\x1f\x5d\x1b\x5d\x11\x5d\x27\x5d\x22\x5d\x1a\x5d\x19\x5d\x18\x5d\x4c\x5d\x52\x5d\x53", /* 5980 */ "\xfa\x11\x5d\x5c\x5d\x4e\x5d\x4b\x5d\x42\x5d\x6c\x5d\x73\x5d\x6d\x5d\x76\x5d\x87\x5d\x84\x5d\x82\x5d\x8c\x5d\xa2\x5d\x9d\x5d\x90\x5d\xac\x5d\xae\x5d\xb7\x5d\xb8\x5d\xbc\x5d\xb9\x5d\xc9\x5d\xd0\x5d\xd3\x5d\xd2\x5d\xdb\x5d\xeb\x5d\xf5\x5e\x0b\x5e\x1a\x5e\x19\x5e\x11\x5e\x1b\x5e\x36\x5e\x44\x5e\x43\x5e\x40\x5e\x47\x5e\x4e\x5e\x57\x5e\x54\x5e\x62\x5e\x64\x5e\x75\x5e\x76\x5e\x7a\x5e\x7f\x5e\xa0\x5e\xc1\x5e\xc2\x5e\xc8\x5e\xd0\x5e\xcf\x5e\xdd\x5e\xda\x5e\xdb\x5e\xe2\x5e\xe1\x5e\xe8\x5e\xe9\x5e\xec\x5e\xf0\x5e\xf1\x5e\xf3\x5e\xf4\x5f\x03\x5f\x09\x5f\x0b\x5f\x11\x5f\x16\x5f\x21\x5f\x29\x5f\x2d\x5f\x2f\x5f\x34\x5f\x38\x5f\x41\x5f\x48\x5f\x4c\x5f\x4e\x5f\x51\x5f\x56\x5f\x57\x5f\x59\x5f\x5c\x5f\x5d\x5f\x61\x5f\x67\x5f\x73\x5f\x77\x5f\x83\x5f\x82\x5f\x7f\x5f\x8a\x5f\x88\x5f\x87\x5f\x91\x5f\x99\x5f\x9e\x5f\x98\x5f\xa0\x5f\xa8\x5f\xad\x5f\xb7\x5f\xbc\x5f\xd6\x5f\xfb\x5f\xe4\x5f\xf8\x5f\xf1\x5f\xf0\x5f\xdd\x5f\xde\x5f\xff\x60\x21\x60\x19\x60\x10\x60\x29\x60\x0e\x60\x31\x60\x1b\x60\x15\x60\x2b\x60\x26\x60\x0f\x60\x3a\x00\x00", /* 5a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x5a\x60\x41\x60\x60\x60\x5d\x60\x6a\x60\x77\x60\x5f\x60\x4a\x60\x46\x60\x4d\x60\x63\x60\x43\x60\x64\x60\x6c\x60\x6b\x60\x59\x60\x85\x60\x81\x60\x83\x60\x9a\x60\x84\x60\x9b\x60\x8a\x60\x96\x60\x97\x60\x92\x60\xa7\x60\x8b\x60\xe1\x60\xb8\x60\xde\x60\xe0\x60\xd3\x60\xbd\x60\xc6\x60\xb5\x60\xd5\x60\xd8\x61\x20\x60\xf2\x61\x15\x61\x06\x60\xf6\x60\xf7\x61\x00\x60\xf4\x60\xfa\x61\x03\x61\x21\x60\xfb\x60\xf1\x61\x0d\x61\x0e\x61\x11\x61\x47\x61\x4d\x61\x37\x61\x28\x61\x27\x61\x3e\x61\x4a\x61\x30\x61\x3c", /* 5a80 */ "\x61\x2c\x61\x34\x61\x65\x61\x5d\x61\x3d\x61\x42\x61\x44\x61\x73\x61\x87\x61\x77\x61\x58\x61\x59\x61\x5a\x61\x6b\x61\x74\x61\x6f\x61\x71\x61\x5f\x61\x53\x61\x75\x61\x98\x61\x99\x61\x96\x61\xac\x61\x94\x61\x8a\x61\x91\x61\xab\x61\xae\x61\xcc\x61\xca\x61\xc9\x61\xc8\x61\xc3\x61\xc6\x61\xba\x61\xcb\x7f\x79\x61\xcd\x61\xe6\x61\xe3\x61\xf4\x61\xf7\x61\xf6\x61\xfd\x61\xfa\x61\xff\x61\xfc\x61\xfe\x62\x00\x62\x08\x62\x09\x62\x0d\x62\x13\x62\x14\x62\x1b\x62\x1e\x62\x21\x62\x2a\x62\x2e\x62\x30\x62\x32\x62\x33\x62\x41\x62\x4e\x62\x5e\x62\x63\x62\x5b\x62\x60\x62\x68\x62\x7c\x62\x82\x62\x89\x62\x92\x62\x7e\x62\x93\x62\x96\x62\x83\x62\x94\x62\xd7\x62\xd1\x62\xbb\x62\xcf\x62\xac\x62\xc6\x62\xc8\x62\xdc\x62\xd4\x62\xca\x62\xc2\x62\xa6\x62\xc7\x62\x9b\x62\xc9\x63\x0c\x62\xee\x62\xf1\x63\x27\x63\x02\x63\x08\x62\xef\x62\xf5\x62\xff\x63\x50\x63\x4d\x63\x3e\x63\x4f\x63\x96\x63\x8e\x63\x80\x63\xab\x63\x76\x63\xa3\x63\x8f\x63\x89\x63\x9f\x63\x6b\x63\x69\x63\xb5\x63\xbe\x63\xe9\x63\xc0\x63\xc6\x63\xf5\x63\xe3\x63\xc9\x63\xd2\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xf6\x63\xc4\x64\x34\x64\x06\x64\x13\x64\x26\x64\x36\x64\x1c\x64\x17\x64\x28\x64\x0f\x64\x16\x64\x4e\x64\x67\x64\x6f\x64\x60\x64\x76\x64\xb9\x64\x9d\x64\xce\x64\x95\x64\xbb\x64\x93\x64\xa5\x64\xa9\x64\x88\x64\xbc\x64\xda\x64\xd2\x64\xc5\x64\xc7\x64\xd4\x64\xd8\x64\xc2\x64\xf1\x64\xe7\x64\xe0\x64\xe1\x64\xe3\x64\xef\x64\xf4\x64\xf6\x64\xf2\x64\xfa\x65\x00\x64\xfd\x65\x18\x65\x1c\x65\x1d\x65\x22\x65\x24\x65\x23\x65\x2b\x65\x2c\x65\x34\x65\x35\x65\x37\x65\x36\x65\x38\x75\x4b\x65\x48\x65\x4e\x65\x56", /* 5b80 */ "\x65\x4d\x65\x58\x65\x55\x65\x5d\x65\x72\x65\x78\x65\x82\x65\x83\x8b\x8a\x65\x9b\x65\x9f\x65\xab\x65\xb7\x65\xc3\x65\xc6\x65\xc1\x65\xc4\x65\xcc\x65\xd2\x65\xd9\x65\xe1\x65\xe0\x65\xf1\x66\x00\x66\x15\x66\x02\x67\x72\x66\x03\x65\xfb\x66\x09\x66\x3f\x66\x35\x66\x2e\x66\x1e\x66\x34\x66\x1c\x66\x24\x66\x44\x66\x49\x66\x65\x66\x57\x66\x5e\x66\x64\x66\x59\x66\x62\x66\x5d\xfa\x12\x66\x73\x66\x70\x66\x83\x66\x88\x66\x84\x66\x99\x66\x98\x66\xa0\x66\x9d\x66\xb2\x66\xc4\x66\xc1\x66\xbf\x66\xc9\x66\xbe\x66\xbc\x66\xb8\x66\xd6\x66\xda\x66\xe6\x66\xe9\x66\xf0\x66\xf5\x66\xf7\x66\xfa\x67\x0e\xf9\x29\x67\x16\x67\x1e\x7e\x22\x67\x26\x67\x27\x97\x38\x67\x2e\x67\x3f\x67\x36\x67\x37\x67\x38\x67\x46\x67\x5e\x67\x59\x67\x66\x67\x64\x67\x89\x67\x85\x67\x70\x67\xa9\x67\x6a\x67\x8b\x67\x73\x67\xa6\x67\xa1\x67\xbb\x67\xb7\x67\xef\x67\xb4\x67\xec\x67\xe9\x67\xb8\x67\xe7\x67\xe4\x68\x52\x67\xdd\x67\xe2\x67\xee\x67\xc0\x67\xce\x67\xb9\x68\x01\x67\xc6\x68\x1e\x68\x46\x68\x4d\x68\x40\x68\x44\x68\x32\x68\x4e\x68\x63\x68\x59\x68\x8e\x00\x00", /* 5c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x77\x68\x7f\x68\x9f\x68\x7e\x68\x8f\x68\xad\x68\x94\x68\x83\x68\xbc\x68\xb9\x68\x74\x68\xb5\x68\xba\x69\x0f\x69\x01\x68\xca\x69\x08\x68\xd8\x69\x26\x68\xe1\x69\x0c\x68\xcd\x68\xd4\x68\xe7\x68\xd5\x69\x12\x68\xef\x69\x04\x68\xe3\x68\xe0\x68\xcf\x68\xc6\x69\x22\x69\x2a\x69\x21\x69\x23\x69\x28\xfa\x13\x69\x79\x69\x77\x69\x36\x69\x78\x69\x54\x69\x6a\x69\x74\x69\x68\x69\x3d\x69\x59\x69\x30\x69\x5e\x69\x5d\x69\x7e\x69\x81\x69\xb2\x69\xbf\xfa\x14\x69\x98\x69\xc1\x69\xd3\x69\xbe\x69\xce\x5b\xe8\x69\xca", /* 5c80 */ "\x69\xb1\x69\xdd\x69\xbb\x69\xc3\x69\xa0\x69\x9c\x69\x95\x69\xde\x6a\x2e\x69\xe8\x6a\x02\x6a\x1b\x69\xff\x69\xf9\x69\xf2\x69\xe7\x69\xe2\x6a\x1e\x69\xed\x6a\x14\x69\xeb\x6a\x0a\x6a\x22\x6a\x12\x6a\x23\x6a\x13\x6a\x30\x6a\x6b\x6a\x44\x6a\x0c\x6a\xa0\x6a\x36\x6a\x78\x6a\x47\x6a\x62\x6a\x59\x6a\x66\x6a\x48\x6a\x46\x6a\x38\x6a\x72\x6a\x73\x6a\x90\x6a\x8d\x6a\x84\x6a\xa2\x6a\xa3\x6a\x7e\x6a\x97\x6a\xac\x6a\xaa\x6a\xbb\x6a\xc2\x6a\xb8\x6a\xb3\x6a\xc1\x6a\xde\x6a\xe2\x6a\xd1\x6a\xda\x6a\xe4\x86\x16\x86\x17\x6a\xea\x6b\x05\x6b\x0a\x6a\xfa\x6b\x12\x6b\x16\x6b\x1f\x6b\x38\x6b\x37\x6b\x39\x76\xdc\x98\xee\x6b\x47\x6b\x43\x6b\x49\x6b\x50\x6b\x59\x6b\x54\x6b\x5b\x6b\x5f\x6b\x61\x6b\x78\x6b\x79\x6b\x7f\x6b\x80\x6b\x84\x6b\x83\x6b\x8d\x6b\x98\x6b\x95\x6b\x9e\x6b\xa4\x6b\xaa\x6b\xab\x6b\xaf\x6b\xb1\x6b\xb2\x6b\xb3\x6b\xb7\x6b\xbc\x6b\xc6\x6b\xcb\x6b\xd3\x6b\xd6\x6b\xdf\x6b\xec\x6b\xeb\x6b\xf3\x6b\xef\x6c\x08\x6c\x13\x6c\x14\x6c\x1b\x6c\x24\x6c\x23\x6c\x3f\x6c\x5e\x6c\x55\x6c\x5c\x6c\x62\x6c\x82\x6c\x8d\x6c\x86\x6c\x6f\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x9a\x6c\x81\x6c\x9b\x6c\x7e\x6c\x68\x6c\x73\x6c\x92\x6c\x90\x6c\xc4\x6c\xf1\x6c\xbd\x6c\xc5\x6c\xae\x6c\xda\x6c\xdd\x6c\xb1\x6c\xbe\x6c\xba\x6c\xdb\x6c\xef\x6c\xd9\x6c\xea\x6d\x1f\x6d\x04\x6d\x36\x6d\x2b\x6d\x3d\x6d\x33\x6d\x12\x6d\x0c\x6d\x63\x6d\x87\x6d\x93\x6d\x6f\x6d\x64\x6d\x5a\x6d\x79\x6d\x59\x6d\x8e\x6d\x95\x6d\x9b\x6d\x85\x6d\x96\x6d\xf9\x6e\x0a\x6e\x2e\x6d\xb5\x6d\xe6\x6d\xc7\x6d\xac\x6d\xb8\x6d\xcf\x6d\xc6\x6d\xec\x6d\xde\x6d\xcc\x6d\xe8\x6d\xf8\x6d\xd2\x6d\xc5\x6d\xfa\x6d\xd9\x6d\xf2", /* 5d80 */ "\x6d\xfc\x6d\xe4\x6d\xd5\x6d\xea\x6d\xee\x6e\x2d\x6e\x6e\x6e\x19\x6e\x72\x6e\x5f\x6e\x39\x6e\x3e\x6e\x23\x6e\x6b\x6e\x5c\x6e\x2b\x6e\x76\x6e\x4d\x6e\x1f\x6e\x27\x6e\x43\x6e\x3c\x6e\x3a\x6e\x4e\x6e\x24\x6e\x1d\x6e\x38\x6e\x82\x6e\xaa\x6e\x98\x6e\xb7\x6e\xbd\x6e\xaf\x6e\xc4\x6e\xb2\x6e\xd4\x6e\xd5\x6e\x8f\x6e\xbf\x6e\xc2\x6e\x9f\x6f\x41\x6f\x45\x6e\xec\x6e\xf8\x6e\xfe\x6f\x3f\x6e\xf2\x6f\x31\x6e\xef\x6f\x32\x6e\xcc\x6e\xff\x6f\x3e\x6f\x13\x6e\xf7\x6f\x86\x6f\x7a\x6f\x78\x6f\x80\x6f\x6f\x6f\x5b\x6f\x6d\x6f\x74\x6f\x82\x6f\x88\x6f\x7c\x6f\x58\x6f\xc6\x6f\x8e\x6f\x91\x6f\x66\x6f\xb3\x6f\xa3\x6f\xb5\x6f\xa1\x6f\xb9\x6f\xdb\x6f\xaa\x6f\xc2\x6f\xdf\x6f\xd5\x6f\xec\x6f\xd8\x6f\xd4\x6f\xf5\x6f\xee\x70\x05\x70\x07\x70\x09\x70\x0b\x6f\xfa\x70\x11\x70\x01\x70\x0f\x70\x1b\x70\x1a\x70\x1f\x6f\xf3\x70\x28\x70\x18\x70\x30\x70\x3e\x70\x32\x70\x51\x70\x63\x70\x85\x70\x99\x70\xaf\x70\xab\x70\xac\x70\xb8\x70\xae\x70\xdf\x70\xcb\x70\xd9\x71\x09\x71\x0f\x71\x04\x70\xf1\x70\xfd\x71\x1c\x71\x19\x71\x5c\x71\x46\x71\x47\x71\x66\x00\x00", /* 5e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x62\x71\x4c\x71\x56\x71\x6c\x71\x88\x71\x8f\x71\x84\x71\x95\xfa\x15\x71\xac\x71\xc1\x71\xb9\x71\xbe\x71\xd2\x71\xe7\x71\xc9\x71\xd4\x71\xd7\x71\xce\x71\xf5\x71\xe0\x71\xec\x71\xfb\x71\xfc\x71\xf9\x71\xfe\x71\xff\x72\x0d\x72\x10\x72\x28\x72\x2d\x72\x2c\x72\x30\x72\x32\x72\x3b\x72\x3c\x72\x3f\x72\x40\x72\x46\x72\x4b\x72\x58\x72\x74\x72\x7e\x72\x81\x72\x87\x72\x82\x72\x92\x72\x96\x72\xa2\x72\xa7\x72\xb1\x72\xb2\x72\xbe\x72\xc3\x72\xc6\x72\xc4\x72\xb9\x72\xce\x72\xd2\x72\xe2\x72\xe0\x72\xe1\x72\xf9", /* 5e80 */ "\x72\xf7\x73\x17\x73\x0a\x73\x1c\x73\x16\x73\x1d\x73\x24\x73\x34\x73\x29\x73\x2f\xfa\x16\x73\x25\x73\x3e\x73\x4f\x73\x4e\x73\x57\x9e\xd8\x73\x6a\x73\x68\x73\x70\x73\x77\x73\x78\x73\x75\x73\x7b\x73\xc8\x73\xbd\x73\xb3\x73\xce\x73\xbb\x73\xc0\x73\xc9\x73\xd6\x73\xe5\x73\xe3\x73\xd2\x73\xee\x73\xf1\x73\xde\x73\xf8\x74\x07\x73\xf5\x74\x05\x74\x26\x74\x2a\x74\x25\x74\x29\x74\x2e\x74\x32\x74\x3a\x74\x55\x74\x3f\x74\x5f\x74\x59\x74\x41\x74\x5c\x74\x69\x74\x70\x74\x63\x74\x6a\x74\x64\x74\x62\x74\x89\x74\x6f\x74\x7e\x74\x9f\x74\x9e\x74\xa2\x74\xa7\x74\xca\x74\xcf\x74\xd4\x74\xe0\x74\xe3\x74\xe7\x74\xe9\x74\xee\x74\xf0\x74\xf2\x74\xf1\x74\xf7\x74\xf8\x75\x01\x75\x04\x75\x03\x75\x05\x75\x0d\x75\x0c\x75\x0e\x75\x13\x75\x1e\x75\x26\x75\x2c\x75\x3c\x75\x44\x75\x4d\x75\x4a\x75\x49\x75\x46\x75\x5b\x75\x5a\x75\x64\x75\x67\x75\x6b\x75\x6f\x75\x74\x75\x6d\x75\x78\x75\x76\x75\x82\x75\x86\x75\x87\x75\x8a\x75\x89\x75\x94\x75\x9a\x75\x9d\x75\xa5\x75\xa3\x75\xc2\x75\xb3\x75\xc3\x75\xb5\x75\xbd\x75\xb8\x75\xbc\x75\xb1\x75\xcd\x00\x00", /* 5f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xca\x75\xd2\x75\xd9\x75\xe3\x75\xde\x75\xfe\x75\xff\x75\xfc\x76\x01\x75\xf0\x75\xfa\x75\xf2\x75\xf3\x76\x0b\x76\x09\x76\x1f\x76\x27\x76\x20\x76\x21\x76\x22\x76\x24\x76\x34\x76\x30\x76\x3b\x76\x47\x76\x48\x76\x58\x76\x46\x76\x5c\x76\x61\x76\x62\x76\x68\x76\x69\x76\x67\x76\x6a\x76\x6c\x76\x70\x76\x72\x76\x76\x76\x7c\x76\x82\x76\x80\x76\x83\x76\x88\x76\x8b\x76\x99\x76\x9a\x76\x9c\x76\x9e\x76\x9b\x76\xa6\x76\xb0\x76\xb4\x76\xb8\x76\xb9\x76\xba\x76\xc2\xfa\x17\x76\xcd\x76\xd6\x76\xd2\x76\xde\x76\xe1", /* 5f80 */ "\x76\xe5\x76\xea\x86\x2f\x76\xfb\x77\x08\x77\x07\x77\x04\x77\x24\x77\x29\x77\x25\x77\x26\x77\x1b\x77\x37\x77\x38\x77\x46\x77\x47\x77\x5a\x77\x68\x77\x6b\x77\x5b\x77\x65\x77\x7f\x77\x7e\x77\x79\x77\x8e\x77\x8b\x77\x91\x77\xa0\x77\x9e\x77\xb0\x77\xb6\x77\xb9\x77\xbf\x77\xbc\x77\xbd\x77\xbb\x77\xc7\x77\xcd\x77\xda\x77\xdc\x77\xe3\x77\xee\x52\xaf\x77\xfc\x78\x0c\x78\x12\x78\x21\x78\x3f\x78\x20\x78\x45\x78\x4e\x78\x64\x78\x74\x78\x8e\x78\x7a\x78\x86\x78\x9a\x78\x7c\x78\x8c\x78\xa3\x78\xb5\x78\xaa\x78\xaf\x78\xd1\x78\xc6\x78\xcb\x78\xd4\x78\xbe\x78\xbc\x78\xc5\x78\xca\x78\xec\x78\xe7\x78\xda\x78\xfd\x78\xf4\x79\x07\x79\x11\x79\x19\x79\x2c\x79\x2b\x79\x30\xfa\x18\x79\x40\x79\x60\xfa\x19\x79\x5f\x79\x5a\x79\x55\xfa\x1a\x79\x7f\x79\x8a\x79\x94\xfa\x1b\x79\x9d\x79\x9b\x79\xaa\x79\xb3\x79\xba\x79\xc9\x79\xd5\x79\xe7\x79\xec\x79\xe3\x7a\x08\x7a\x0d\x7a\x18\x7a\x19\x7a\x1f\x7a\x31\x7a\x3e\x7a\x37\x7a\x3b\x7a\x43\x7a\x57\x7a\x49\x7a\x62\x7a\x61\x7a\x69\x9f\x9d\x7a\x70\x7a\x79\x7a\x7d\x7a\x88\x7a\x95\x7a\x98\x7a\x96\x00\x00", /* 6000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x97\x7a\xa9\x7a\xb0\x7a\xb6\x90\x83\x7a\xc3\x7a\xbf\x7a\xc5\x7a\xc4\x7a\xc7\x7a\xca\x7a\xcd\x7a\xcf\x7a\xd2\x7a\xd1\x7a\xd5\x7a\xd3\x7a\xd9\x7a\xda\x7a\xdd\x7a\xe1\x7a\xe2\x7a\xe6\x7a\xe7\xfa\x1c\x7a\xeb\x7a\xed\x7a\xf0\x7a\xf8\x7b\x02\x7b\x0f\x7b\x0b\x7b\x0a\x7b\x06\x7b\x33\x7b\x36\x7b\x19\x7b\x1e\x7b\x35\x7b\x28\x7b\x50\x7b\x4d\x7b\x4c\x7b\x45\x7b\x5d\x7b\x75\x7b\x7a\x7b\x74\x7b\x70\x7b\x71\x7b\x6e\x7b\x9d\x7b\x98\x7b\x9f\x7b\x8d\x7b\x9c\x7b\x9a\x7b\x92\x7b\x8f\x7b\x99\x7b\xcf\x7b\xcb\x7b\xcc", /* 6080 */ "\x7b\xb4\x7b\xc6\x7b\x9e\x7b\xdd\x7b\xe9\x7b\xe6\x7b\xf7\x7b\xe5\x7c\x14\x7c\x00\x7c\x13\x7c\x07\x7b\xf3\x7c\x0d\x7b\xf6\x7c\x23\x7c\x27\x7c\x2a\x7c\x1f\x7c\x37\x7c\x2b\x7c\x3d\x7c\x40\x7c\x4c\x7c\x43\x7c\x56\x7c\x50\x7c\x58\x7c\x5f\x7c\x65\x7c\x6c\x7c\x75\x7c\x83\x7c\x90\x7c\xa4\x7c\xa2\x7c\xab\x7c\xa1\x7c\xad\x7c\xa8\x7c\xb3\x7c\xb2\x7c\xb1\x7c\xae\x7c\xb9\xfa\x1d\x7c\xbd\x7c\xc5\x7c\xc2\x7c\xd2\x7c\xe2\x7c\xd8\x7c\xdc\x7c\xef\x7c\xf2\x7c\xf4\x7c\xf6\x7d\x06\x7d\x02\x7d\x1c\x7d\x15\x7d\x0a\x7d\x45\x7d\x4b\x7d\x2e\x7d\x32\x7d\x3f\x7d\x35\x7d\x48\x7d\x46\x7d\x5c\x7d\x73\x7d\x56\x7d\x4e\x7d\x68\x7d\x6e\x7d\x4f\x7d\x63\x7d\x93\x7d\x89\x7d\x5b\x7d\xae\x7d\xa3\x7d\xb5\x7d\xb7\x7d\xc7\x7d\xbd\x7d\xab\x7d\xa2\x7d\xaf\x7d\xa0\x7d\xb8\x7d\x9f\x7d\xb0\x7d\xd5\x7d\xd8\x7d\xdd\x7d\xd6\x7d\xe4\x7d\xde\x7d\xfb\x7e\x0b\x7d\xf2\x7d\xe1\x7d\xdc\x7e\x05\x7e\x0a\x7e\x21\x7e\x12\x7e\x1f\x7e\x09\x7e\x3a\x7e\x46\x7e\x66\x7e\x31\x7e\x3d\x7e\x35\x7e\x3b\x7e\x39\x7e\x43\x7e\x37\x7e\x32\x7e\x5d\x7e\x56\x7e\x5e\x7e\x52\x7e\x59\x00\x00", /* 6100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x5a\x7e\x67\x7e\x79\x7e\x6a\x7e\x69\x7e\x7c\x7e\x7b\x7e\x7d\x8f\xae\x7e\x7f\x7e\x83\x7e\x89\x7e\x8e\x7e\x8c\x7e\x92\x7e\x93\x7e\x94\x7e\x96\x7e\x9b\x7f\x38\x7f\x3a\x7f\x45\x7f\x47\x7f\x4c\x7f\x4e\x7f\x51\x7f\x55\x7f\x54\x7f\x58\x7f\x5f\x7f\x60\x7f\x68\x7f\x67\x7f\x69\x7f\x78\x7f\x82\x7f\x86\x7f\x83\x7f\x87\x7f\x88\x7f\x8c\x7f\x94\x7f\x9e\x7f\x9d\x7f\x9a\x7f\xa1\x7f\xa3\x7f\xaf\x7f\xae\x7f\xb2\x7f\xb9\x7f\xb6\x7f\xb8\x8b\x71\xfa\x1e\x7f\xc5\x7f\xc6\x7f\xca\x7f\xd5\x7f\xe1\x7f\xe6\x7f\xe9\x7f\xf3", /* 6180 */ "\x7f\xf9\x80\x04\x80\x0b\x80\x12\x80\x19\x80\x1c\x80\x21\x80\x28\x80\x3f\x80\x3b\x80\x4a\x80\x46\x80\x52\x80\x58\x80\x5f\x80\x62\x80\x68\x80\x73\x80\x72\x80\x70\x80\x76\x80\x79\x80\x7d\x80\x7f\x80\x84\x80\x85\x80\x93\x80\x9a\x80\xad\x51\x90\x80\xac\x80\xdb\x80\xe5\x80\xd9\x80\xdd\x80\xc4\x80\xda\x81\x09\x80\xef\x80\xf1\x81\x1b\x81\x23\x81\x2f\x81\x4b\x81\x46\x81\x3e\x81\x53\x81\x51\x81\x41\x81\x71\x81\x6e\x81\x65\x81\x5f\x81\x66\x81\x74\x81\x83\x81\x88\x81\x8a\x81\x80\x81\x82\x81\xa0\x81\x95\x81\xa3\x81\x93\x81\xb5\x81\xa4\x81\xa9\x81\xb8\x81\xb0\x81\xc8\x81\xbe\x81\xbd\x81\xc0\x81\xc2\x81\xba\x81\xc9\x81\xcd\x81\xd1\x81\xd8\x81\xd9\x81\xda\x81\xdf\x81\xe0\x81\xfa\x81\xfb\x81\xfe\x82\x01\x82\x02\x82\x05\x82\x0d\x82\x10\x82\x12\x82\x16\x82\x29\x82\x2b\x82\x2e\x82\x38\x82\x33\x82\x40\x82\x59\x82\x5a\x82\x5d\x82\x5f\x82\x64\x82\x62\x82\x68\x82\x6a\x82\x6b\x82\x71\x82\x77\x82\x7e\x82\x8d\x82\x92\x82\xab\x82\x9f\x82\xbb\x82\xac\x82\xe1\x82\xe3\x82\xdf\x83\x01\x82\xd2\x82\xf4\x82\xf3\x83\x03\x82\xfb\x82\xf9\x00\x00", /* 6200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\xde\x83\x06\x82\xdc\x82\xfa\x83\x09\x82\xd9\x83\x35\x83\x62\x83\x34\x83\x16\x83\x31\x83\x40\x83\x39\x83\x50\x83\x45\x83\x2f\x83\x2b\x83\x18\x83\x9a\x83\xaa\x83\x9f\x83\xa2\x83\x96\x83\x23\x83\x8e\x83\x75\x83\x7f\x83\x8a\x83\x7c\x83\xb5\x83\x73\x83\x93\x83\xa0\x83\x85\x83\x89\x83\xa8\x83\xf4\x84\x13\x83\xc7\x83\xce\x83\xf7\x83\xfd\x84\x03\x83\xd8\x84\x0b\x83\xc1\x84\x07\x83\xe0\x83\xf2\x84\x0d\x84\x20\x83\xf6\x83\xbd\x83\xfb\x84\x2a\x84\x62\x84\x3c\x84\x84\x84\x77\x84\x6b\x84\x79\x84\x48\x84\x6e", /* 6280 */ "\x84\x82\x84\x69\x84\x46\x84\x6f\x84\x38\x84\x35\x84\xca\x84\xb9\x84\xbf\x84\x9f\x84\xb4\x84\xcd\x84\xbb\x84\xda\x84\xd0\x84\xc1\x84\xad\x84\xc6\x84\xd6\x84\xa1\x84\xd9\x84\xff\x84\xf4\x85\x17\x85\x18\x85\x2c\x85\x1f\x85\x15\x85\x14\x85\x06\x85\x53\x85\x5a\x85\x40\x85\x59\x85\x63\x85\x58\x85\x48\x85\x41\x85\x4a\x85\x4b\x85\x6b\x85\x55\x85\x80\x85\xa4\x85\x88\x85\x91\x85\x8a\x85\xa8\x85\x6d\x85\x94\x85\x9b\x85\xae\x85\x87\x85\x9c\x85\x77\x85\x7e\x85\x90\xfa\x1f\x82\x0a\x85\xb0\x85\xc9\x85\xba\x85\xcf\x85\xb9\x85\xd0\x85\xd5\x85\xdd\x85\xe5\x85\xdc\x85\xf9\x86\x0a\x86\x13\x86\x0b\x85\xfe\x86\x22\x86\x1a\x86\x30\x86\x3f\xfa\x20\x86\x4d\x4e\x55\x86\x55\x86\x5f\x86\x67\x86\x71\x86\x93\x86\xa3\x86\xa9\x86\x8b\x86\xaa\x86\x8c\x86\xb6\x86\xaf\x86\xc4\x86\xc6\x86\xb0\x86\xc9\x86\xce\xfa\x21\x86\xab\x86\xd4\x86\xde\x86\xe9\x86\xec\x86\xdf\x86\xdb\x87\x12\x87\x06\x87\x08\x87\x00\x87\x03\x86\xfb\x87\x11\x87\x09\x87\x0d\x86\xf9\x87\x0a\x87\x34\x87\x3f\x87\x3b\x87\x25\x87\x29\x87\x1a\x87\x5f\x87\x78\x87\x4c\x87\x4e\x00\x00", /* 6300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x74\x87\x57\x87\x68\x87\x82\x87\x6a\x87\x60\x87\x6e\x87\x59\x87\x53\x87\x63\x87\x7f\x87\xa2\x87\xc6\x87\x9f\x87\xaf\x87\xcb\x87\xbd\x87\xc0\x87\xd0\x96\xd6\x87\xab\x87\xc4\x87\xb3\x87\xd2\x87\xbb\x87\xef\x87\xf2\x87\xe0\x88\x0e\x88\x07\x88\x0f\x88\x16\x88\x0d\x87\xfe\x87\xf6\x87\xf7\x88\x11\x88\x15\x88\x22\x88\x21\x88\x27\x88\x31\x88\x36\x88\x39\x88\x3b\x88\x42\x88\x44\x88\x4d\x88\x52\x88\x59\x88\x5e\x88\x62\x88\x6b\x88\x81\x88\x7e\x88\x75\x88\x7d\x88\x72\x88\x82\x88\x9e\x88\x97\x88\x92\x88\xae", /* 6380 */ "\x88\x99\x88\xa2\x88\x8d\x88\xa4\x88\xbf\x88\xb5\x88\xb1\x88\xc3\x88\xc4\x88\xd4\x88\xd8\x88\xd9\x88\xdd\x88\xf9\x89\x02\x88\xfc\x88\xf5\x88\xe8\x88\xf2\x89\x04\x89\x0c\x89\x2a\x89\x1d\x89\x0a\x89\x13\x89\x1e\x89\x25\x89\x2b\x89\x41\x89\x3b\x89\x36\x89\x43\x89\x38\x89\x4d\x89\x4c\x89\x60\x89\x5e\x89\x66\x89\x6a\x89\x64\x89\x6d\x89\x6f\x89\x74\x89\x77\x89\x7e\x89\x83\x89\x88\x89\x8a\x89\x93\x89\x98\x89\xa1\x89\xa9\x89\xa6\x89\xac\x89\xaf\x89\xb2\x89\xba\x89\xbf\x89\xbd\x89\xc0\x89\xda\x89\xdd\x89\xe7\x89\xf4\x89\xf8\x8a\x03\x8a\x16\x8a\x10\x8a\x0c\x8a\x12\x8a\x1b\x8a\x1d\x8a\x25\x8a\x36\x8a\x41\x8a\x37\x8a\x5b\x8a\x52\x8a\x46\x8a\x48\x8a\x7c\x8a\x6d\x8a\x6c\x8a\x62\x8a\x79\x8a\x85\x8a\x82\x8a\x84\x8a\xa8\x8a\xa1\x8a\x91\x8a\xa5\x8a\xa6\x8a\x9a\x8a\xa3\x8a\xa7\x8a\xcc\x8a\xbe\x8a\xcd\x8a\xc2\x8a\xda\x8a\xf3\x8a\xe7\x8a\xe4\x8a\xf1\x8b\x14\x8a\xe0\x8a\xe2\x8a\xe1\x8a\xdf\xfa\x22\x8a\xf6\x8a\xf7\x8a\xde\x8a\xdb\x8b\x0c\x8b\x07\x8b\x1a\x8b\x16\x8b\x10\x8b\x17\x8b\x20\x8b\x33\x8b\x41\x97\xab\x8b\x26\x8b\x2b\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x3e\x8b\x4c\x8b\x4f\x8b\x4e\x8b\x53\x8b\x49\x8b\x56\x8b\x5b\x8b\x5a\x8b\x74\x8b\x6b\x8b\x5f\x8b\x6c\x8b\x6f\x8b\x7d\x8b\x7f\x8b\x80\x8b\x8c\x8b\x8e\x8b\x99\x8b\x92\x8b\x93\x8b\x96\x8b\x9a\x8c\x3a\x8c\x41\x8c\x3f\x8c\x48\x8c\x4c\x8c\x4e\x8c\x50\x8c\x55\x8c\x62\x8c\x6c\x8c\x78\x8c\x7a\x8c\x7c\x8c\x82\x8c\x89\x8c\x85\x8c\x8a\x8c\x8d\x8c\x8e\x8c\x98\x8c\x94\x62\x1d\x8c\xad\x8c\xaa\x8c\xae\x8c\xbd\x8c\xb2\x8c\xb3\x8c\xc1\x8c\xb6\x8c\xc8\x8c\xce\x8c\xcd\x8c\xe3\x8c\xda\x8c\xf0\x8c\xf4\x8c\xfd\x8c\xfa", /* 6480 */ "\x8c\xfb\x8d\x07\x8d\x0a\x8d\x0f\x8d\x0d\x8d\x12\x8d\x10\x8d\x13\x8d\x14\x8d\x16\x8d\x67\x8d\x6d\x8d\x71\x8d\x76\xfa\x23\x8d\x81\x8d\xc2\x8d\xbe\x8d\xba\x8d\xcf\x8d\xda\x8d\xd6\x8d\xcc\x8d\xdb\x8d\xcb\x8d\xea\x8d\xeb\x8d\xdf\x8d\xe3\x8d\xfc\x8e\x08\x8d\xff\x8e\x09\x8e\x1d\x8e\x1e\x8e\x10\x8e\x1f\x8e\x42\x8e\x35\x8e\x30\x8e\x34\x8e\x4a\x8e\x47\x8e\x49\x8e\x4c\x8e\x50\x8e\x48\x8e\x59\x8e\x64\x8e\x60\x8e\x55\x8e\x63\x8e\x76\x8e\x72\x8e\x87\x8e\x7c\x8e\x81\x8e\x85\x8e\x84\x8e\x8b\x8e\x8a\x8e\x93\x8e\x91\x8e\x94\x8e\x99\x8e\xa1\x8e\xaa\x8e\xb1\x8e\xbe\x8e\xc6\x8e\xc5\x8e\xc8\x8e\xcb\x8e\xcf\x8e\xdb\x8e\xe3\x8e\xfc\x8e\xfb\x8e\xeb\x8e\xfe\x8f\x0a\x8f\x0c\x8f\x05\x8f\x15\x8f\x12\x8f\x13\x8f\x1c\x8f\x19\x8f\x1f\x8f\x26\x8f\x33\x8f\x3b\x8f\x39\x8f\x45\x8f\x42\x8f\x3e\x8f\x49\x8f\x46\x8f\x4c\x8f\x4e\x8f\x57\x8f\x5c\x8f\x62\x8f\x63\x8f\x64\x8f\x9c\x8f\x9f\x8f\xa3\x8f\xa8\x8f\xa7\x8f\xad\x8f\xaf\x8f\xb7\xfa\x24\x8f\xda\x8f\xe5\x8f\xe2\x8f\xef\x8f\xe9\x8f\xf4\x90\x05\x8f\xf9\x8f\xf8\x90\x11\x90\x15\x90\x0e\x90\x21\x00\x00", /* 6500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x0d\x90\x1e\x90\x16\x90\x0b\x90\x27\x90\x36\x90\x39\x90\x4f\xfa\x25\x90\x50\x90\x51\x90\x52\x90\x49\x90\x3e\x90\x56\x90\x58\x90\x5e\x90\x68\x90\x67\x90\x6f\x90\x76\x96\xa8\x90\x72\x90\x82\x90\x7d\x90\x89\x90\x80\x90\x8f\x62\x48\x90\xaf\x90\xb1\x90\xb5\x90\xe2\x90\xe4\x90\xdb\x90\xde\x91\x02\xfa\x26\x91\x15\x91\x12\x91\x19\x91\x32\x91\x27\x91\x30\x91\x4a\x91\x56\x91\x58\x91\x63\x91\x65\x91\x69\x91\x73\x91\x72\x91\x8b\x91\x89\x91\x82\x91\xa2\x91\xab\x91\xaf\x91\xaa\x91\xb5\x91\xb4\x91\xba\x91\xc0", /* 6580 */ "\x91\xc1\x91\xcb\x91\xd0\x91\xda\x91\xdb\x91\xd7\x91\xde\x91\xd6\x91\xdf\x91\xe1\x91\xed\x91\xf5\x91\xee\x91\xe4\x91\xf6\x91\xe5\x92\x06\x92\x1e\x91\xff\x92\x10\x92\x14\x92\x0a\x92\x2c\x92\x15\x92\x29\x92\x57\x92\x45\x92\x3a\x92\x49\x92\x64\x92\x40\x92\x3c\x92\x48\x92\x4e\x92\x50\x92\x59\x92\x3f\x92\x51\x92\x39\x92\x4b\x92\x67\x92\x5a\x92\x9c\x92\xa7\x92\x77\x92\x78\x92\x96\x92\x93\x92\x9b\x92\x95\x92\xe9\x92\xcf\x92\xe7\x92\xd7\x92\xd9\x92\xd0\xfa\x27\x92\xd5\x92\xb9\x92\xb7\x92\xe0\x92\xd3\x93\x3a\x93\x35\x93\x0f\x93\x25\x92\xfa\x93\x21\x93\x44\x92\xfb\xfa\x28\x93\x19\x93\x1e\x92\xff\x93\x22\x93\x1a\x93\x1d\x93\x23\x93\x02\x93\x3b\x93\x70\x93\x60\x93\x7c\x93\x6e\x93\x56\x93\x57\x93\xb9\x93\xb0\x93\xa4\x93\xad\x93\x94\x93\xc8\x93\xd6\x93\xc6\x93\xd7\x93\xe8\x93\xe5\x93\xd8\x93\xc3\x93\xdd\x93\xde\x93\xd0\x93\xe4\x94\x1a\x93\xf8\x94\x14\x94\x13\x94\x21\x94\x03\x94\x07\x94\x36\x94\x2b\x94\x31\x94\x3a\x94\x41\x94\x52\x94\x45\x94\x44\x94\x48\x94\x5b\x94\x5a\x94\x60\x94\x62\x94\x5e\x94\x6a\x94\x75\x94\x70\x00\x00", /* 6600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x77\x94\x7f\x94\x7d\x94\x7c\x94\x7e\x94\x81\x95\x82\x95\x87\x95\x8a\x95\x92\x95\x94\x95\x96\x95\x98\x95\x99\x95\xa0\x95\xa8\x95\xa7\x95\xad\x95\xbc\x95\xbb\x95\xb9\x95\xbe\x95\xca\x6f\xf6\x95\xc3\x95\xcd\x95\xcc\x95\xd5\x95\xd4\x95\xd6\x95\xdc\x95\xe1\x95\xe5\x95\xe2\x96\x21\x96\x28\x96\x2e\x96\x2f\x96\x42\x96\x4f\x96\x4c\x96\x4b\x96\x5c\x96\x5d\x96\x5f\x96\x66\x96\x77\x96\x72\x96\x6c\x96\x8d\x96\x8b\xf9\xdc\x96\x98\x96\x95\x96\x97\xfa\x29\x96\x9d\x96\xa7\x96\xaa\x96\xb1\x96\xb2\x96\xb0\x96\xaf", /* 6680 */ "\x96\xb4\x96\xb6\x96\xb8\x96\xb9\x96\xce\x96\xcb\x96\xd5\x96\xdc\x96\xd9\x96\xf9\x97\x04\x97\x06\x97\x08\x97\x19\x97\x0d\x97\x13\x97\x0e\x97\x11\x97\x0f\x97\x16\x97\x24\x97\x2a\x97\x30\x97\x33\x97\x39\x97\x3b\x97\x3d\x97\x3e\x97\x46\x97\x44\x97\x43\x97\x48\x97\x42\x97\x49\x97\x4d\x97\x4f\x97\x51\x97\x55\x97\x5c\x97\x60\x97\x64\x97\x66\x97\x68\x97\x6d\x97\x79\x97\x85\x97\x7c\x97\x81\x97\x7a\x97\x8b\x97\x8f\x97\x90\x97\x9c\x97\xa8\x97\xa6\x97\xa3\x97\xb3\x97\xb4\x97\xc3\x97\xc6\x97\xc8\x97\xcb\x97\xdc\x97\xed\x97\xf2\x7a\xdf\x97\xf5\x98\x0f\x98\x1a\x98\x24\x98\x21\x98\x37\x98\x3d\x98\x4f\x98\x4b\x98\x57\x98\x65\x98\x6b\x98\x6f\x98\x70\x98\x71\x98\x74\x98\x73\x98\xaa\x98\xaf\x98\xb1\x98\xb6\x98\xc4\x98\xc3\x98\xc6\x98\xdc\x98\xed\x98\xe9\xfa\x2a\x98\xeb\xfa\x2b\x99\x03\x99\x1d\x99\x12\x99\x14\x99\x18\x99\x27\xfa\x2c\x99\x21\x99\x1e\x99\x24\x99\x20\x99\x2c\x99\x2e\x99\x3d\x99\x3e\x99\x42\x99\x49\x99\x45\x99\x50\x99\x4b\x99\x51\x99\x4c\x99\x55\x99\x97\x99\x98\x99\x9e\x99\xa5\x99\xad\x99\xae\x99\xbc\x99\xdf\x00\x00", /* 6700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xdb\x99\xdd\x99\xd8\x99\xd1\x99\xed\x99\xee\x99\xe2\x99\xf1\x99\xf2\x99\xfb\x99\xf8\x9a\x01\x9a\x0f\x9a\x05\x9a\x19\x9a\x2b\x9a\x37\x9a\x40\x9a\x45\x9a\x42\x9a\x43\x9a\x3e\x9a\x55\x9a\x4d\x9a\x4e\x9a\x5b\x9a\x57\x9a\x5f\x9a\x62\x9a\x69\x9a\x65\x9a\x64\x9a\x6a\x9a\x6b\x9a\xad\x9a\xb0\x9a\xbc\x9a\xc0\x9a\xcf\x9a\xd3\x9a\xd4\x9a\xd1\x9a\xd9\x9a\xdc\x9a\xde\x9a\xdf\x9a\xe2\x9a\xe3\x9a\xe6\x9a\xef\x9a\xeb\x9a\xee\x9a\xf4\x9a\xf1\x9a\xf7\x9a\xfb\x9b\x06\x9b\x18\x9b\x1a\x9b\x1f\x9b\x22\x9b\x23\x9b\x25", /* 6780 */ "\x9b\x27\x9b\x28\x9b\x29\x9b\x2a\x9b\x2e\x9b\x2f\x9b\x31\x9b\x32\x9b\x3b\x9b\x44\x9b\x43\x9b\x4d\x9b\x4e\x9b\x51\x9b\x58\x9b\x75\x9b\x74\x9b\x72\x9b\x93\x9b\x8f\x9b\x83\x9b\x91\x9b\x96\x9b\x97\x9b\x9f\x9b\xa0\x9b\xa8\x9b\xb1\x9b\xb4\x9b\xc0\x9b\xca\x9b\xbb\x9b\xb9\x9b\xc6\x9b\xcf\x9b\xd1\x9b\xd2\x9b\xe3\x9b\xe2\x9b\xe4\x9b\xd4\x9b\xe1\x9b\xf5\x9b\xf1\x9b\xf2\x9c\x04\x9c\x1b\x9c\x15\x9c\x14\x9c\x00\x9c\x09\x9c\x13\x9c\x0c\x9c\x06\x9c\x08\x9c\x12\x9c\x0a\x9c\x2e\x9c\x25\x9c\x24\x9c\x21\x9c\x30\x9c\x47\x9c\x32\x9c\x46\x9c\x3e\x9c\x5a\x9c\x60\x9c\x67\x9c\x76\x9c\x78\x9c\xeb\x9c\xe7\x9c\xec\x9c\xf0\x9d\x09\x9d\x03\x9d\x06\x9d\x2a\x9d\x26\x9d\x2c\x9d\x23\x9d\x1f\x9d\x15\x9d\x12\x9d\x41\x9d\x3f\x9d\x44\x9d\x3e\x9d\x46\x9d\x48\x9d\x5d\x9d\x5e\x9d\x59\x9d\x51\x9d\x50\x9d\x64\x9d\x72\x9d\x70\x9d\x87\x9d\x6b\x9d\x6f\x9d\x7a\x9d\x9a\x9d\xa4\x9d\xa9\x9d\xab\x9d\xb2\x9d\xc4\x9d\xc1\x9d\xbb\x9d\xb8\x9d\xba\x9d\xc6\x9d\xcf\x9d\xc2\xfa\x2d\x9d\xd9\x9d\xd3\x9d\xf8\x9d\xe6\x9d\xed\x9d\xef\x9d\xfd\x9e\x1a\x9e\x1b\x9e\x19\x00\x00", /* 6800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x1e\x9e\x75\x9e\x79\x9e\x7d\x9e\x81\x9e\x88\x9e\x8b\x9e\x8c\x9e\x95\x9e\x91\x9e\x9d\x9e\xa5\x9e\xb8\x9e\xaa\x9e\xad\x9e\xbc\x9e\xbe\x97\x61\x9e\xcc\x9e\xcf\x9e\xd0\x9e\xd1\x9e\xd4\x9e\xdc\x9e\xde\x9e\xdd\x9e\xe0\x9e\xe5\x9e\xe8\x9e\xef\x9e\xf4\x9e\xf6\x9e\xf7\x9e\xf9\x9e\xfb\x9e\xfc\x9e\xfd\x9f\x07\x9f\x08\x76\xb7\x9f\x15\x9f\x21\x9f\x2c\x9f\x3e\x9f\x4a\x9f\x4e\x9f\x4f\x9f\x52\x9f\x54\x9f\x63\x9f\x5f\x9f\x60\x9f\x61\x9f\x66\x9f\x67\x9f\x6c\x9f\x6a\x9f\x77\x9f\x72\x9f\x76\x9f\x95\x9f\x9c\x9f\xa0", /* 6880 */ "\x5c\x2d\x69\xd9\x90\x65\x74\x76\x51\xdc\x71\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xe0\x02\xe0\x03\xe0\x04\xe0\x05\xe0\x06\xe0\x07\xe0\x08\xe0\x09\xe0\x0a\xe0\x0b\xe0\x0c\xe0\x0d\xe0\x0e\xe0\x0f\xe0\x10\xe0\x11\xe0\x12\xe0\x13\xe0\x14\xe0\x15\xe0\x16\xe0\x17\xe0\x18\xe0\x19\xe0\x1a\xe0\x1b\xe0\x1c\xe0\x1d\xe0\x1e\xe0\x1f\xe0\x20\xe0\x21\xe0\x22\xe0\x23\xe0\x24\xe0\x25\xe0\x26\xe0\x27\xe0\x28\xe0\x29\xe0\x2a\xe0\x2b\xe0\x2c\xe0\x2d\xe0\x2e\xe0\x2f\xe0\x30\xe0\x31\xe0\x32\xe0\x33\xe0\x34\xe0\x35\xe0\x36\xe0\x37\xe0\x38\xe0\x39\xe0\x3a\xe0\x3b\xe0\x3c\xe0\x3d\xe0\x3e", /* 6980 */ "\xe0\x3f\xe0\x40\xe0\x41\xe0\x42\xe0\x43\xe0\x44\xe0\x45\xe0\x46\xe0\x47\xe0\x48\xe0\x49\xe0\x4a\xe0\x4b\xe0\x4c\xe0\x4d\xe0\x4e\xe0\x4f\xe0\x50\xe0\x51\xe0\x52\xe0\x53\xe0\x54\xe0\x55\xe0\x56\xe0\x57\xe0\x58\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xe0\x5d\xe0\x5e\xe0\x5f\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xe0\x64\xe0\x65\xe0\x66\xe0\x67\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x7f\xe0\x80\xe0\x81\xe0\x82\xe0\x83\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xe0\x8f\xe0\x90\xe0\x91\xe0\x92\xe0\x93\xe0\x94\xe0\x95\xe0\x96\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xe0\xa0\xe0\xa1\xe0\xa2\xe0\xa3\xe0\xa4\xe0\xa5\xe0\xa6\xe0\xa7\xe0\xa8\xe0\xa9\xe0\xaa\xe0\xab\xe0\xac\xe0\xad\xe0\xae\xe0\xaf\xe0\xb0\xe0\xb1\xe0\xb2\xe0\xb3\xe0\xb4\xe0\xb5\xe0\xb6\xe0\xb7\xe0\xb8\xe0\xb9\xe0\xba\xe0\xbb\xe0\xbc\xe0\xbd\x00\x00", /* 6a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbe\xe0\xbf\xe0\xc0\xe0\xc1\xe0\xc2\xe0\xc3\xe0\xc4\xe0\xc5\xe0\xc6\xe0\xc7\xe0\xc8\xe0\xc9\xe0\xca\xe0\xcb\xe0\xcc\xe0\xcd\xe0\xce\xe0\xcf\xe0\xd0\xe0\xd1\xe0\xd2\xe0\xd3\xe0\xd4\xe0\xd5\xe0\xd6\xe0\xd7\xe0\xd8\xe0\xd9\xe0\xda\xe0\xdb\xe0\xdc\xe0\xdd\xe0\xde\xe0\xdf\xe0\xe0\xe0\xe1\xe0\xe2\xe0\xe3\xe0\xe4\xe0\xe5\xe0\xe6\xe0\xe7\xe0\xe8\xe0\xe9\xe0\xea\xe0\xeb\xe0\xec\xe0\xed\xe0\xee\xe0\xef\xe0\xf0\xe0\xf1\xe0\xf2\xe0\xf3\xe0\xf4\xe0\xf5\xe0\xf6\xe0\xf7\xe0\xf8\xe0\xf9\xe0\xfa\xe0\xfb\xe0\xfc", /* 6a80 */ "\xe0\xfd\xe0\xfe\xe0\xff\xe1\x00\xe1\x01\xe1\x02\xe1\x03\xe1\x04\xe1\x05\xe1\x06\xe1\x07\xe1\x08\xe1\x09\xe1\x0a\xe1\x0b\xe1\x0c\xe1\x0d\xe1\x0e\xe1\x0f\xe1\x10\xe1\x11\xe1\x12\xe1\x13\xe1\x14\xe1\x15\xe1\x16\xe1\x17\xe1\x18\xe1\x19\xe1\x1a\xe1\x1b\xe1\x1c\xe1\x1d\xe1\x1e\xe1\x1f\xe1\x20\xe1\x21\xe1\x22\xe1\x23\xe1\x24\xe1\x25\xe1\x26\xe1\x27\xe1\x28\xe1\x29\xe1\x2a\xe1\x2b\xe1\x2c\xe1\x2d\xe1\x2e\xe1\x2f\xe1\x30\xe1\x31\xe1\x32\xe1\x33\xe1\x34\xe1\x35\xe1\x36\xe1\x37\xe1\x38\xe1\x39\xe1\x3a\xe1\x3b\xe1\x3c\xe1\x3d\xe1\x3e\xe1\x3f\xe1\x40\xe1\x41\xe1\x42\xe1\x43\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xe1\x48\xe1\x49\xe1\x4a\xe1\x4b\xe1\x4c\xe1\x4d\xe1\x4e\xe1\x4f\xe1\x50\xe1\x51\xe1\x52\xe1\x53\xe1\x54\xe1\x55\xe1\x56\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xe1\x5c\xe1\x5d\xe1\x5e\xe1\x5f\xe1\x60\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xe1\x74\xe1\x75\xe1\x76\xe1\x77\xe1\x78\xe1\x79\xe1\x7a\xe1\x7b\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x7c\xe1\x7d\xe1\x7e\xe1\x7f\xe1\x80\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xe1\x8b\xe1\x8c\xe1\x8d\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe1\xa1\xe1\xa2\xe1\xa3\xe1\xa4\xe1\xa5\xe1\xa6\xe1\xa7\xe1\xa8\xe1\xa9\xe1\xaa\xe1\xab\xe1\xac\xe1\xad\xe1\xae\xe1\xaf\xe1\xb0\xe1\xb1\xe1\xb2\xe1\xb3\xe1\xb4\xe1\xb5\xe1\xb6\xe1\xb7\xe1\xb8\xe1\xb9\xe1\xba", /* 6b80 */ "\xe1\xbb\xe1\xbc\xe1\xbd\xe1\xbe\xe1\xbf\xe1\xc0\xe1\xc1\xe1\xc2\xe1\xc3\xe1\xc4\xe1\xc5\xe1\xc6\xe1\xc7\xe1\xc8\xe1\xc9\xe1\xca\xe1\xcb\xe1\xcc\xe1\xcd\xe1\xce\xe1\xcf\xe1\xd0\xe1\xd1\xe1\xd2\xe1\xd3\xe1\xd4\xe1\xd5\xe1\xd6\xe1\xd7\xe1\xd8\xe1\xd9\xe1\xda\xe1\xdb\xe1\xdc\xe1\xdd\xe1\xde\xe1\xdf\xe1\xe0\xe1\xe1\xe1\xe2\xe1\xe3\xe1\xe4\xe1\xe5\xe1\xe6\xe1\xe7\xe1\xe8\xe1\xe9\xe1\xea\xe1\xeb\xe1\xec\xe1\xed\xe1\xee\xe1\xef\xe1\xf0\xe1\xf1\xe1\xf2\xe1\xf3\xe1\xf4\xe1\xf5\xe1\xf6\xe1\xf7\xe1\xf8\xe1\xf9\xe1\xfa\xe1\xfb\xe1\xfc\xe1\xfd\xe1\xfe\xe1\xff\xe2\x00\xe2\x01\xe2\x02\xe2\x03\xe2\x04\xe2\x05\xe2\x06\xe2\x07\xe2\x08\xe2\x09\xe2\x0a\xe2\x0b\xe2\x0c\xe2\x0d\xe2\x0e\xe2\x0f\xe2\x10\xe2\x11\xe2\x12\xe2\x13\xe2\x14\xe2\x15\xe2\x16\xe2\x17\xe2\x18\xe2\x19\xe2\x1a\xe2\x1b\xe2\x1c\xe2\x1d\xe2\x1e\xe2\x1f\xe2\x20\xe2\x21\xe2\x22\xe2\x23\xe2\x24\xe2\x25\xe2\x26\xe2\x27\xe2\x28\xe2\x29\xe2\x2a\xe2\x2b\xe2\x2c\xe2\x2d\xe2\x2e\xe2\x2f\xe2\x30\xe2\x31\xe2\x32\xe2\x33\xe2\x34\xe2\x35\xe2\x36\xe2\x37\xe2\x38\xe2\x39\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x3a\xe2\x3b\xe2\x3c\xe2\x3d\xe2\x3e\xe2\x3f\xe2\x40\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78", /* 6c80 */ "\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x7f\xe2\x80\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe2\xa1\xe2\xa2\xe2\xa3\xe2\xa4\xe2\xa5\xe2\xa6\xe2\xa7\xe2\xa8\xe2\xa9\xe2\xaa\xe2\xab\xe2\xac\xe2\xad\xe2\xae\xe2\xaf\xe2\xb0\xe2\xb1\xe2\xb2\xe2\xb3\xe2\xb4\xe2\xb5\xe2\xb6\xe2\xb7\xe2\xb8\xe2\xb9\xe2\xba\xe2\xbb\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1\xe2\xc2\xe2\xc3\xe2\xc4\xe2\xc5\xe2\xc6\xe2\xc7\xe2\xc8\xe2\xc9\xe2\xca\xe2\xcb\xe2\xcc\xe2\xcd\xe2\xce\xe2\xcf\xe2\xd0\xe2\xd1\xe2\xd2\xe2\xd3\xe2\xd4\xe2\xd5\xe2\xd6\xe2\xd7\xe2\xd8\xe2\xd9\xe2\xda\xe2\xdb\xe2\xdc\xe2\xdd\xe2\xde\xe2\xdf\xe2\xe0\xe2\xe1\xe2\xe2\xe2\xe3\xe2\xe4\xe2\xe5\xe2\xe6\xe2\xe7\xe2\xe8\xe2\xe9\xe2\xea\xe2\xeb\xe2\xec\xe2\xed\xe2\xee\xe2\xef\xe2\xf0\xe2\xf1\xe2\xf2\xe2\xf3\xe2\xf4\xe2\xf5\xe2\xf6\xe2\xf7\x00\x00", /* 6d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xf8\xe2\xf9\xe2\xfa\xe2\xfb\xe2\xfc\xe2\xfd\xe2\xfe\xe2\xff\xe3\x00\xe3\x01\xe3\x02\xe3\x03\xe3\x04\xe3\x05\xe3\x06\xe3\x07\xe3\x08\xe3\x09\xe3\x0a\xe3\x0b\xe3\x0c\xe3\x0d\xe3\x0e\xe3\x0f\xe3\x10\xe3\x11\xe3\x12\xe3\x13\xe3\x14\xe3\x15\xe3\x16\xe3\x17\xe3\x18\xe3\x19\xe3\x1a\xe3\x1b\xe3\x1c\xe3\x1d\xe3\x1e\xe3\x1f\xe3\x20\xe3\x21\xe3\x22\xe3\x23\xe3\x24\xe3\x25\xe3\x26\xe3\x27\xe3\x28\xe3\x29\xe3\x2a\xe3\x2b\xe3\x2c\xe3\x2d\xe3\x2e\xe3\x2f\xe3\x30\xe3\x31\xe3\x32\xe3\x33\xe3\x34\xe3\x35\xe3\x36", /* 6d80 */ "\xe3\x37\xe3\x38\xe3\x39\xe3\x3a\xe3\x3b\xe3\x3c\xe3\x3d\xe3\x3e\xe3\x3f\xe3\x40\xe3\x41\xe3\x42\xe3\x43\xe3\x44\xe3\x45\xe3\x46\xe3\x47\xe3\x48\xe3\x49\xe3\x4a\xe3\x4b\xe3\x4c\xe3\x4d\xe3\x4e\xe3\x4f\xe3\x50\xe3\x51\xe3\x52\xe3\x53\xe3\x54\xe3\x55\xe3\x56\xe3\x57\xe3\x58\xe3\x59\xe3\x5a\xe3\x5b\xe3\x5c\xe3\x5d\xe3\x5e\xe3\x5f\xe3\x60\xe3\x61\xe3\x62\xe3\x63\xe3\x64\xe3\x65\xe3\x66\xe3\x67\xe3\x68\xe3\x69\xe3\x6a\xe3\x6b\xe3\x6c\xe3\x6d\xe3\x6e\xe3\x6f\xe3\x70\xe3\x71\xe3\x72\xe3\x73\xe3\x74\xe3\x75\xe3\x76\xe3\x77\xe3\x78\xe3\x79\xe3\x7a\xe3\x7b\xe3\x7c\xe3\x7d\xe3\x7e\xe3\x7f\xe3\x80\xe3\x81\xe3\x82\xe3\x83\xe3\x84\xe3\x85\xe3\x86\xe3\x87\xe3\x88\xe3\x89\xe3\x8a\xe3\x8b\xe3\x8c\xe3\x8d\xe3\x8e\xe3\x8f\xe3\x90\xe3\x91\xe3\x92\xe3\x93\xe3\x94\xe3\x95\xe3\x96\xe3\x97\xe3\x98\xe3\x99\xe3\x9a\xe3\x9b\xe3\x9c\xe3\x9d\xe3\x9e\xe3\x9f\xe3\xa0\xe3\xa1\xe3\xa2\xe3\xa3\xe3\xa4\xe3\xa5\xe3\xa6\xe3\xa7\xe3\xa8\xe3\xa9\xe3\xaa\xe3\xab\xe3\xac\xe3\xad\xe3\xae\xe3\xaf\xe3\xb0\xe3\xb1\xe3\xb2\xe3\xb3\xe3\xb4\xe3\xb5\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xb6\xe3\xb7\xe3\xb8\xe3\xb9\xe3\xba\xe3\xbb\xe3\xbc\xe3\xbd\xe3\xbe\xe3\xbf\xe3\xc0\xe3\xc1\xe3\xc2\xe3\xc3\xe3\xc4\xe3\xc5\xe3\xc6\xe3\xc7\xe3\xc8\xe3\xc9\xe3\xca\xe3\xcb\xe3\xcc\xe3\xcd\xe3\xce\xe3\xcf\xe3\xd0\xe3\xd1\xe3\xd2\xe3\xd3\xe3\xd4\xe3\xd5\xe3\xd6\xe3\xd7\xe3\xd8\xe3\xd9\xe3\xda\xe3\xdb\xe3\xdc\xe3\xdd\xe3\xde\xe3\xdf\xe3\xe0\xe3\xe1\xe3\xe2\xe3\xe3\xe3\xe4\xe3\xe5\xe3\xe6\xe3\xe7\xe3\xe8\xe3\xe9\xe3\xea\xe3\xeb\xe3\xec\xe3\xed\xe3\xee\xe3\xef\xe3\xf0\xe3\xf1\xe3\xf2\xe3\xf3\xe3\xf4", /* 6e80 */ "\xe3\xf5\xe3\xf6\xe3\xf7\xe3\xf8\xe3\xf9\xe3\xfa\xe3\xfb\xe3\xfc\xe3\xfd\xe3\xfe\xe3\xff\xe4\x00\xe4\x01\xe4\x02\xe4\x03\xe4\x04\xe4\x05\xe4\x06\xe4\x07\xe4\x08\xe4\x09\xe4\x0a\xe4\x0b\xe4\x0c\xe4\x0d\xe4\x0e\xe4\x0f\xe4\x10\xe4\x11\xe4\x12\xe4\x13\xe4\x14\xe4\x15\xe4\x16\xe4\x17\xe4\x18\xe4\x19\xe4\x1a\xe4\x1b\xe4\x1c\xe4\x1d\xe4\x1e\xe4\x1f\xe4\x20\xe4\x21\xe4\x22\xe4\x23\xe4\x24\xe4\x25\xe4\x26\xe4\x27\xe4\x28\xe4\x29\xe4\x2a\xe4\x2b\xe4\x2c\xe4\x2d\xe4\x2e\xe4\x2f\xe4\x30\xe4\x31\xe4\x32\xe4\x33\xe4\x34\xe4\x35\xe4\x36\xe4\x37\xe4\x38\xe4\x39\xe4\x3a\xe4\x3b\xe4\x3c\xe4\x3d\xe4\x3e\xe4\x3f\xe4\x40\xe4\x41\xe4\x42\xe4\x43\xe4\x44\xe4\x45\xe4\x46\xe4\x47\xe4\x48\xe4\x49\xe4\x4a\xe4\x4b\xe4\x4c\xe4\x4d\xe4\x4e\xe4\x4f\xe4\x50\xe4\x51\xe4\x52\xe4\x53\xe4\x54\xe4\x55\xe4\x56\xe4\x57\xe4\x58\xe4\x59\xe4\x5a\xe4\x5b\xe4\x5c\xe4\x5d\xe4\x5e\xe4\x5f\xe4\x60\xe4\x61\xe4\x62\xe4\x63\xe4\x64\xe4\x65\xe4\x66\xe4\x67\xe4\x68\xe4\x69\xe4\x6a\xe4\x6b\xe4\x6c\xe4\x6d\xe4\x6e\xe4\x6f\xe4\x70\xe4\x71\xe4\x72\xe4\x73\x00\x00", /* 6f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x74\xe4\x75\xe4\x76\xe4\x77\xe4\x78\xe4\x79\xe4\x7a\xe4\x7b\xe4\x7c\xe4\x7d\xe4\x7e\xe4\x7f\xe4\x80\xe4\x81\xe4\x82\xe4\x83\xe4\x84\xe4\x85\xe4\x86\xe4\x87\xe4\x88\xe4\x89\xe4\x8a\xe4\x8b\xe4\x8c\xe4\x8d\xe4\x8e\xe4\x8f\xe4\x90\xe4\x91\xe4\x92\xe4\x93\xe4\x94\xe4\x95\xe4\x96\xe4\x97\xe4\x98\xe4\x99\xe4\x9a\xe4\x9b\xe4\x9c\xe4\x9d\xe4\x9e\xe4\x9f\xe4\xa0\xe4\xa1\xe4\xa2\xe4\xa3\xe4\xa4\xe4\xa5\xe4\xa6\xe4\xa7\xe4\xa8\xe4\xa9\xe4\xaa\xe4\xab\xe4\xac\xe4\xad\xe4\xae\xe4\xaf\xe4\xb0\xe4\xb1\xe4\xb2", /* 6f80 */ "\xe4\xb3\xe4\xb4\xe4\xb5\xe4\xb6\xe4\xb7\xe4\xb8\xe4\xb9\xe4\xba\xe4\xbb\xe4\xbc\xe4\xbd\xe4\xbe\xe4\xbf\xe4\xc0\xe4\xc1\xe4\xc2\xe4\xc3\xe4\xc4\xe4\xc5\xe4\xc6\xe4\xc7\xe4\xc8\xe4\xc9\xe4\xca\xe4\xcb\xe4\xcc\xe4\xcd\xe4\xce\xe4\xcf\xe4\xd0\xe4\xd1\xe4\xd2\xe4\xd3\xe4\xd4\xe4\xd5\xe4\xd6\xe4\xd7\xe4\xd8\xe4\xd9\xe4\xda\xe4\xdb\xe4\xdc\xe4\xdd\xe4\xde\xe4\xdf\xe4\xe0\xe4\xe1\xe4\xe2\xe4\xe3\xe4\xe4\xe4\xe5\xe4\xe6\xe4\xe7\xe4\xe8\xe4\xe9\xe4\xea\xe4\xeb\xe4\xec\xe4\xed\xe4\xee\xe4\xef\xe4\xf0\xe4\xf1\xe4\xf2\xe4\xf3\xe4\xf4\xe4\xf5\xe4\xf6\xe4\xf7\xe4\xf8\xe4\xf9\xe4\xfa\xe4\xfb\xe4\xfc\xe4\xfd\xe4\xfe\xe4\xff\xe5\x00\xe5\x01\xe5\x02\xe5\x03\xe5\x04\xe5\x05\xe5\x06\xe5\x07\xe5\x08\xe5\x09\xe5\x0a\xe5\x0b\xe5\x0c\xe5\x0d\xe5\x0e\xe5\x0f\xe5\x10\xe5\x11\xe5\x12\xe5\x13\xe5\x14\xe5\x15\xe5\x16\xe5\x17\xe5\x18\xe5\x19\xe5\x1a\xe5\x1b\xe5\x1c\xe5\x1d\xe5\x1e\xe5\x1f\xe5\x20\xe5\x21\xe5\x22\xe5\x23\xe5\x24\xe5\x25\xe5\x26\xe5\x27\xe5\x28\xe5\x29\xe5\x2a\xe5\x2b\xe5\x2c\xe5\x2d\xe5\x2e\xe5\x2f\xe5\x30\xe5\x31\x00\x00", /* 7000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x32\xe5\x33\xe5\x34\xe5\x35\xe5\x36\xe5\x37\xe5\x38\xe5\x39\xe5\x3a\xe5\x3b\xe5\x3c\xe5\x3d\xe5\x3e\xe5\x3f\xe5\x40\xe5\x41\xe5\x42\xe5\x43\xe5\x44\xe5\x45\xe5\x46\xe5\x47\xe5\x48\xe5\x49\xe5\x4a\xe5\x4b\xe5\x4c\xe5\x4d\xe5\x4e\xe5\x4f\xe5\x50\xe5\x51\xe5\x52\xe5\x53\xe5\x54\xe5\x55\xe5\x56\xe5\x57\xe5\x58\xe5\x59\xe5\x5a\xe5\x5b\xe5\x5c\xe5\x5d\xe5\x5e\xe5\x5f\xe5\x60\xe5\x61\xe5\x62\xe5\x63\xe5\x64\xe5\x65\xe5\x66\xe5\x67\xe5\x68\xe5\x69\xe5\x6a\xe5\x6b\xe5\x6c\xe5\x6d\xe5\x6e\xe5\x6f\xe5\x70", /* 7080 */ "\xe5\x71\xe5\x72\xe5\x73\xe5\x74\xe5\x75\xe5\x76\xe5\x77\xe5\x78\xe5\x79\xe5\x7a\xe5\x7b\xe5\x7c\xe5\x7d\xe5\x7e\xe5\x7f\xe5\x80\xe5\x81\xe5\x82\xe5\x83\xe5\x84\xe5\x85\xe5\x86\xe5\x87\xe5\x88\xe5\x89\xe5\x8a\xe5\x8b\xe5\x8c\xe5\x8d\xe5\x8e\xe5\x8f\xe5\x90\xe5\x91\xe5\x92\xe5\x93\xe5\x94\xe5\x95\xe5\x96\xe5\x97\xe5\x98\xe5\x99\xe5\x9a\xe5\x9b\xe5\x9c\xe5\x9d\xe5\x9e\xe5\x9f\xe5\xa0\xe5\xa1\xe5\xa2\xe5\xa3\xe5\xa4\xe5\xa5\xe5\xa6\xe5\xa7\xe5\xa8\xe5\xa9\xe5\xaa\xe5\xab\xe5\xac\xe5\xad\xe5\xae\xe5\xaf\xe5\xb0\xe5\xb1\xe5\xb2\xe5\xb3\xe5\xb4\xe5\xb5\xe5\xb6\xe5\xb7\xe5\xb8\xe5\xb9\xe5\xba\xe5\xbb\xe5\xbc\xe5\xbd\xe5\xbe\xe5\xbf\xe5\xc0\xe5\xc1\xe5\xc2\xe5\xc3\xe5\xc4\xe5\xc5\xe5\xc6\xe5\xc7\xe5\xc8\xe5\xc9\xe5\xca\xe5\xcb\xe5\xcc\xe5\xcd\xe5\xce\xe5\xcf\xe5\xd0\xe5\xd1\xe5\xd2\xe5\xd3\xe5\xd4\xe5\xd5\xe5\xd6\xe5\xd7\xe5\xd8\xe5\xd9\xe5\xda\xe5\xdb\xe5\xdc\xe5\xdd\xe5\xde\xe5\xdf\xe5\xe0\xe5\xe1\xe5\xe2\xe5\xe3\xe5\xe4\xe5\xe5\xe5\xe6\xe5\xe7\xe5\xe8\xe5\xe9\xe5\xea\xe5\xeb\xe5\xec\xe5\xed\xe5\xee\xe5\xef\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xf0\xe5\xf1\xe5\xf2\xe5\xf3\xe5\xf4\xe5\xf5\xe5\xf6\xe5\xf7\xe5\xf8\xe5\xf9\xe5\xfa\xe5\xfb\xe5\xfc\xe5\xfd\xe5\xfe\xe5\xff\xe6\x00\xe6\x01\xe6\x02\xe6\x03\xe6\x04\xe6\x05\xe6\x06\xe6\x07\xe6\x08\xe6\x09\xe6\x0a\xe6\x0b\xe6\x0c\xe6\x0d\xe6\x0e\xe6\x0f\xe6\x10\xe6\x11\xe6\x12\xe6\x13\xe6\x14\xe6\x15\xe6\x16\xe6\x17\xe6\x18\xe6\x19\xe6\x1a\xe6\x1b\xe6\x1c\xe6\x1d\xe6\x1e\xe6\x1f\xe6\x20\xe6\x21\xe6\x22\xe6\x23\xe6\x24\xe6\x25\xe6\x26\xe6\x27\xe6\x28\xe6\x29\xe6\x2a\xe6\x2b\xe6\x2c\xe6\x2d\xe6\x2e", /* 7180 */ "\xe6\x2f\xe6\x30\xe6\x31\xe6\x32\xe6\x33\xe6\x34\xe6\x35\xe6\x36\xe6\x37\xe6\x38\xe6\x39\xe6\x3a\xe6\x3b\xe6\x3c\xe6\x3d\xe6\x3e\xe6\x3f\xe6\x40\xe6\x41\xe6\x42\xe6\x43\xe6\x44\xe6\x45\xe6\x46\xe6\x47\xe6\x48\xe6\x49\xe6\x4a\xe6\x4b\xe6\x4c\xe6\x4d\xe6\x4e\xe6\x4f\xe6\x50\xe6\x51\xe6\x52\xe6\x53\xe6\x54\xe6\x55\xe6\x56\xe6\x57\xe6\x58\xe6\x59\xe6\x5a\xe6\x5b\xe6\x5c\xe6\x5d\xe6\x5e\xe6\x5f\xe6\x60\xe6\x61\xe6\x62\xe6\x63\xe6\x64\xe6\x65\xe6\x66\xe6\x67\xe6\x68\xe6\x69\xe6\x6a\xe6\x6b\xe6\x6c\xe6\x6d\xe6\x6e\xe6\x6f\xe6\x70\xe6\x71\xe6\x72\xe6\x73\xe6\x74\xe6\x75\xe6\x76\xe6\x77\xe6\x78\xe6\x79\xe6\x7a\xe6\x7b\xe6\x7c\xe6\x7d\xe6\x7e\xe6\x7f\xe6\x80\xe6\x81\xe6\x82\xe6\x83\xe6\x84\xe6\x85\xe6\x86\xe6\x87\xe6\x88\xe6\x89\xe6\x8a\xe6\x8b\xe6\x8c\xe6\x8d\xe6\x8e\xe6\x8f\xe6\x90\xe6\x91\xe6\x92\xe6\x93\xe6\x94\xe6\x95\xe6\x96\xe6\x97\xe6\x98\xe6\x99\xe6\x9a\xe6\x9b\xe6\x9c\xe6\x9d\xe6\x9e\xe6\x9f\xe6\xa0\xe6\xa1\xe6\xa2\xe6\xa3\xe6\xa4\xe6\xa5\xe6\xa6\xe6\xa7\xe6\xa8\xe6\xa9\xe6\xaa\xe6\xab\xe6\xac\xe6\xad\x00\x00", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xae\xe6\xaf\xe6\xb0\xe6\xb1\xe6\xb2\xe6\xb3\xe6\xb4\xe6\xb5\xe6\xb6\xe6\xb7\xe6\xb8\xe6\xb9\xe6\xba\xe6\xbb\xe6\xbc\xe6\xbd\xe6\xbe\xe6\xbf\xe6\xc0\xe6\xc1\xe6\xc2\xe6\xc3\xe6\xc4\xe6\xc5\xe6\xc6\xe6\xc7\xe6\xc8\xe6\xc9\xe6\xca\xe6\xcb\xe6\xcc\xe6\xcd\xe6\xce\xe6\xcf\xe6\xd0\xe6\xd1\xe6\xd2\xe6\xd3\xe6\xd4\xe6\xd5\xe6\xd6\xe6\xd7\xe6\xd8\xe6\xd9\xe6\xda\xe6\xdb\xe6\xdc\xe6\xdd\xe6\xde\xe6\xdf\xe6\xe0\xe6\xe1\xe6\xe2\xe6\xe3\xe6\xe4\xe6\xe5\xe6\xe6\xe6\xe7\xe6\xe8\xe6\xe9\xe6\xea\xe6\xeb\xe6\xec", /* 7280 */ "\xe6\xed\xe6\xee\xe6\xef\xe6\xf0\xe6\xf1\xe6\xf2\xe6\xf3\xe6\xf4\xe6\xf5\xe6\xf6\xe6\xf7\xe6\xf8\xe6\xf9\xe6\xfa\xe6\xfb\xe6\xfc\xe6\xfd\xe6\xfe\xe6\xff\xe7\x00\xe7\x01\xe7\x02\xe7\x03\xe7\x04\xe7\x05\xe7\x06\xe7\x07\xe7\x08\xe7\x09\xe7\x0a\xe7\x0b\xe7\x0c\xe7\x0d\xe7\x0e\xe7\x0f\xe7\x10\xe7\x11\xe7\x12\xe7\x13\xe7\x14\xe7\x15\xe7\x16\xe7\x17\xe7\x18\xe7\x19\xe7\x1a\xe7\x1b\xe7\x1c\xe7\x1d\xe7\x1e\xe7\x1f\xe7\x20\xe7\x21\xe7\x22\xe7\x23\xe7\x24\xe7\x25\xe7\x26\xe7\x27\xe7\x28\xe7\x29\xe7\x2a\xe7\x2b\xe7\x2c\xe7\x2d\xe7\x2e\xe7\x2f\xe7\x30\xe7\x31\xe7\x32\xe7\x33\xe7\x34\xe7\x35\xe7\x36\xe7\x37\xe7\x38\xe7\x39\xe7\x3a\xe7\x3b\xe7\x3c\xe7\x3d\xe7\x3e\xe7\x3f\xe7\x40\xe7\x41\xe7\x42\xe7\x43\xe7\x44\xe7\x45\xe7\x46\xe7\x47\xe7\x48\xe7\x49\xe7\x4a\xe7\x4b\xe7\x4c\xe7\x4d\xe7\x4e\xe7\x4f\xe7\x50\xe7\x51\xe7\x52\xe7\x53\xe7\x54\xe7\x55\xe7\x56\xe7\x57\xe7\x58\xe7\x59\xe7\x5a\xe7\x5b\xe7\x5c\xe7\x5d\xe7\x5e\xe7\x5f\xe7\x60\xe7\x61\xe7\x62\xe7\x63\xe7\x64\xe7\x65\xe7\x66\xe7\x67\xe7\x68\xe7\x69\xe7\x6a\xe7\x6b\x00\x00", /* 7300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x6c\xe7\x6d\xe7\x6e\xe7\x6f\xe7\x70\xe7\x71\xe7\x72\xe7\x73\xe7\x74\xe7\x75\xe7\x76\xe7\x77\xe7\x78\xe7\x79\xe7\x7a\xe7\x7b\xe7\x7c\xe7\x7d\xe7\x7e\xe7\x7f\xe7\x80\xe7\x81\xe7\x82\xe7\x83\xe7\x84\xe7\x85\xe7\x86\xe7\x87\xe7\x88\xe7\x89\xe7\x8a\xe7\x8b\xe7\x8c\xe7\x8d\xe7\x8e\xe7\x8f\xe7\x90\xe7\x91\xe7\x92\xe7\x93\xe7\x94\xe7\x95\xe7\x96\xe7\x97\xe7\x98\xe7\x99\xe7\x9a\xe7\x9b\xe7\x9c\xe7\x9d\xe7\x9e\xe7\x9f\xe7\xa0\xe7\xa1\xe7\xa2\xe7\xa3\xe7\xa4\xe7\xa5\xe7\xa6\xe7\xa7\xe7\xa8\xe7\xa9\xe7\xaa", /* 7380 */ "\xe7\xab\xe7\xac\xe7\xad\xe7\xae\xe7\xaf\xe7\xb0\xe7\xb1\xe7\xb2\xe7\xb3\xe7\xb4\xe7\xb5\xe7\xb6\xe7\xb7\xe7\xb8\xe7\xb9\xe7\xba\xe7\xbb\xe7\xbc\xe7\xbd\xe7\xbe\xe7\xbf\xe7\xc0\xe7\xc1\xe7\xc2\xe7\xc3\xe7\xc4\xe7\xc5\xe7\xc6\xe7\xc7\xe7\xc8\xe7\xc9\xe7\xca\xe7\xcb\xe7\xcc\xe7\xcd\xe7\xce\xe7\xcf\xe7\xd0\xe7\xd1\xe7\xd2\xe7\xd3\xe7\xd4\xe7\xd5\xe7\xd6\xe7\xd7\xe7\xd8\xe7\xd9\xe7\xda\xe7\xdb\xe7\xdc\xe7\xdd\xe7\xde\xe7\xdf\xe7\xe0\xe7\xe1\xe7\xe2\xe7\xe3\xe7\xe4\xe7\xe5\xe7\xe6\xe7\xe7\xe7\xe8\xe7\xe9\xe7\xea\xe7\xeb\xe7\xec\xe7\xed\xe7\xee\xe7\xef\xe7\xf0\xe7\xf1\xe7\xf2\xe7\xf3\xe7\xf4\xe7\xf5\xe7\xf6\xe7\xf7\xe7\xf8\xe7\xf9\xe7\xfa\xe7\xfb\xe7\xfc\xe7\xfd\xe7\xfe\xe7\xff\xe8\x00\xe8\x01\xe8\x02\xe8\x03\xe8\x04\xe8\x05\xe8\x06\xe8\x07\xe8\x08\xe8\x09\xe8\x0a\xe8\x0b\xe8\x0c\xe8\x0d\xe8\x0e\xe8\x0f\xe8\x10\xe8\x11\xe8\x12\xe8\x13\xe8\x14\xe8\x15\xe8\x16\xe8\x17\xe8\x18\xe8\x19\xe8\x1a\xe8\x1b\xe8\x1c\xe8\x1d\xe8\x1e\xe8\x1f\xe8\x20\xe8\x21\xe8\x22\xe8\x23\xe8\x24\xe8\x25\xe8\x26\xe8\x27\xe8\x28\xe8\x29\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x2a\xe8\x2b\xe8\x2c\xe8\x2d\xe8\x2e\xe8\x2f\xe8\x30\xe8\x31\xe8\x32\xe8\x33\xe8\x34\xe8\x35\xe8\x36\xe8\x37\xe8\x38\xe8\x39\xe8\x3a\xe8\x3b\xe8\x3c\xe8\x3d\xe8\x3e\xe8\x3f\xe8\x40\xe8\x41\xe8\x42\xe8\x43\xe8\x44\xe8\x45\xe8\x46\xe8\x47\xe8\x48\xe8\x49\xe8\x4a\xe8\x4b\xe8\x4c\xe8\x4d\xe8\x4e\xe8\x4f\xe8\x50\xe8\x51\xe8\x52\xe8\x53\xe8\x54\xe8\x55\xe8\x56\xe8\x57\xe8\x58\xe8\x59\xe8\x5a\xe8\x5b\xe8\x5c\xe8\x5d\xe8\x5e\xe8\x5f\xe8\x60\xe8\x61\xe8\x62\xe8\x63\xe8\x64\xe8\x65\xe8\x66\xe8\x67\xe8\x68", /* 7480 */ "\xe8\x69\xe8\x6a\xe8\x6b\xe8\x6c\xe8\x6d\xe8\x6e\xe8\x6f\xe8\x70\xe8\x71\xe8\x72\xe8\x73\xe8\x74\xe8\x75\xe8\x76\xe8\x77\xe8\x78\xe8\x79\xe8\x7a\xe8\x7b\xe8\x7c\xe8\x7d\xe8\x7e\xe8\x7f\xe8\x80\xe8\x81\xe8\x82\xe8\x83\xe8\x84\xe8\x85\xe8\x86\xe8\x87\xe8\x88\xe8\x89\xe8\x8a\xe8\x8b\xe8\x8c\xe8\x8d\xe8\x8e\xe8\x8f\xe8\x90\xe8\x91\xe8\x92\xe8\x93\xe8\x94\xe8\x95\xe8\x96\xe8\x97\xe8\x98\xe8\x99\xe8\x9a\xe8\x9b\xe8\x9c\xe8\x9d\xe8\x9e\xe8\x9f\xe8\xa0\xe8\xa1\xe8\xa2\xe8\xa3\xe8\xa4\xe8\xa5\xe8\xa6\xe8\xa7\xe8\xa8\xe8\xa9\xe8\xaa\xe8\xab\xe8\xac\xe8\xad\xe8\xae\xe8\xaf\xe8\xb0\xe8\xb1\xe8\xb2\xe8\xb3\xe8\xb4\xe8\xb5\xe8\xb6\xe8\xb7\xe8\xb8\xe8\xb9\xe8\xba\xe8\xbb\xe8\xbc\xe8\xbd\xe8\xbe\xe8\xbf\xe8\xc0\xe8\xc1\xe8\xc2\xe8\xc3\xe8\xc4\xe8\xc5\xe8\xc6\xe8\xc7\xe8\xc8\xe8\xc9\xe8\xca\xe8\xcb\xe8\xcc\xe8\xcd\xe8\xce\xe8\xcf\xe8\xd0\xe8\xd1\xe8\xd2\xe8\xd3\xe8\xd4\xe8\xd5\xe8\xd6\xe8\xd7\xe8\xd8\xe8\xd9\xe8\xda\xe8\xdb\xe8\xdc\xe8\xdd\xe8\xde\xe8\xdf\xe8\xe0\xe8\xe1\xe8\xe2\xe8\xe3\xe8\xe4\xe8\xe5\xe8\xe6\xe8\xe7\x00\x00", /* 7500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\xe8\xe8\xe9\xe8\xea\xe8\xeb\xe8\xec\xe8\xed\xe8\xee\xe8\xef\xe8\xf0\xe8\xf1\xe8\xf2\xe8\xf3\xe8\xf4\xe8\xf5\xe8\xf6\xe8\xf7\xe8\xf8\xe8\xf9\xe8\xfa\xe8\xfb\xe8\xfc\xe8\xfd\xe8\xfe\xe8\xff\xe9\x00\xe9\x01\xe9\x02\xe9\x03\xe9\x04\xe9\x05\xe9\x06\xe9\x07\xe9\x08\xe9\x09\xe9\x0a\xe9\x0b\xe9\x0c\xe9\x0d\xe9\x0e\xe9\x0f\xe9\x10\xe9\x11\xe9\x12\xe9\x13\xe9\x14\xe9\x15\xe9\x16\xe9\x17\xe9\x18\xe9\x19\xe9\x1a\xe9\x1b\xe9\x1c\xe9\x1d\xe9\x1e\xe9\x1f\xe9\x20\xe9\x21\xe9\x22\xe9\x23\xe9\x24\xe9\x25\xe9\x26", /* 7580 */ "\xe9\x27\xe9\x28\xe9\x29\xe9\x2a\xe9\x2b\xe9\x2c\xe9\x2d\xe9\x2e\xe9\x2f\xe9\x30\xe9\x31\xe9\x32\xe9\x33\xe9\x34\xe9\x35\xe9\x36\xe9\x37\xe9\x38\xe9\x39\xe9\x3a\xe9\x3b\xe9\x3c\xe9\x3d\xe9\x3e\xe9\x3f\xe9\x40\xe9\x41\xe9\x42\xe9\x43\xe9\x44\xe9\x45\xe9\x46\xe9\x47\xe9\x48\xe9\x49\xe9\x4a\xe9\x4b\xe9\x4c\xe9\x4d\xe9\x4e\xe9\x4f\xe9\x50\xe9\x51\xe9\x52\xe9\x53\xe9\x54\xe9\x55\xe9\x56\xe9\x57\xe9\x58\xe9\x59\xe9\x5a\xe9\x5b\xe9\x5c\xe9\x5d\xe9\x5e\xe9\x5f\xe9\x60\xe9\x61\xe9\x62\xe9\x63\xe9\x64\xe9\x65\xe9\x66\xe9\x67\xe9\x68\xe9\x69\xe9\x6a\xe9\x6b\xe9\x6c\xe9\x6d\xe9\x6e\xe9\x6f\xe9\x70\xe9\x71\xe9\x72\xe9\x73\xe9\x74\xe9\x75\xe9\x76\xe9\x77\xe9\x78\xe9\x79\xe9\x7a\xe9\x7b\xe9\x7c\xe9\x7d\xe9\x7e\xe9\x7f\xe9\x80\xe9\x81\xe9\x82\xe9\x83\xe9\x84\xe9\x85\xe9\x86\xe9\x87\xe9\x88\xe9\x89\xe9\x8a\xe9\x8b\xe9\x8c\xe9\x8d\xe9\x8e\xe9\x8f\xe9\x90\xe9\x91\xe9\x92\xe9\x93\xe9\x94\xe9\x95\xe9\x96\xe9\x97\xe9\x98\xe9\x99\xe9\x9a\xe9\x9b\xe9\x9c\xe9\x9d\xe9\x9e\xe9\x9f\xe9\xa0\xe9\xa1\xe9\xa2\xe9\xa3\xe9\xa4\xe9\xa5\x00\x00", /* 7600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xa6\xe9\xa7\xe9\xa8\xe9\xa9\xe9\xaa\xe9\xab\xe9\xac\xe9\xad\xe9\xae\xe9\xaf\xe9\xb0\xe9\xb1\xe9\xb2\xe9\xb3\xe9\xb4\xe9\xb5\xe9\xb6\xe9\xb7\xe9\xb8\xe9\xb9\xe9\xba\xe9\xbb\xe9\xbc\xe9\xbd\xe9\xbe\xe9\xbf\xe9\xc0\xe9\xc1\xe9\xc2\xe9\xc3\xe9\xc4\xe9\xc5\xe9\xc6\xe9\xc7\xe9\xc8\xe9\xc9\xe9\xca\xe9\xcb\xe9\xcc\xe9\xcd\xe9\xce\xe9\xcf\xe9\xd0\xe9\xd1\xe9\xd2\xe9\xd3\xe9\xd4\xe9\xd5\xe9\xd6\xe9\xd7\xe9\xd8\xe9\xd9\xe9\xda\xe9\xdb\xe9\xdc\xe9\xdd\xe9\xde\xe9\xdf\xe9\xe0\xe9\xe1\xe9\xe2\xe9\xe3\xe9\xe4", /* 7680 */ "\xe9\xe5\xe9\xe6\xe9\xe7\xe9\xe8\xe9\xe9\xe9\xea\xe9\xeb\xe9\xec\xe9\xed\xe9\xee\xe9\xef\xe9\xf0\xe9\xf1\xe9\xf2\xe9\xf3\xe9\xf4\xe9\xf5\xe9\xf6\xe9\xf7\xe9\xf8\xe9\xf9\xe9\xfa\xe9\xfb\xe9\xfc\xe9\xfd\xe9\xfe\xe9\xff\xea\x00\xea\x01\xea\x02\xea\x03\xea\x04\xea\x05\xea\x06\xea\x07\xea\x08\xea\x09\xea\x0a\xea\x0b\xea\x0c\xea\x0d\xea\x0e\xea\x0f\xea\x10\xea\x11\xea\x12\xea\x13\xea\x14\xea\x15\xea\x16\xea\x17\xea\x18\xea\x19\xea\x1a\xea\x1b\xea\x1c\xea\x1d\xea\x1e\xea\x1f\xea\x20\xea\x21\xea\x22\xea\x23\xea\x24\xea\x25\xea\x26\xea\x27\xea\x28\xea\x29\xea\x2a\xea\x2b\xea\x2c\xea\x2d\xea\x2e\xea\x2f\xea\x30\xea\x31\xea\x32\xea\x33\xea\x34\xea\x35\xea\x36\xea\x37\xea\x38\xea\x39\xea\x3a\xea\x3b\xea\x3c\xea\x3d\xea\x3e\xea\x3f\xea\x40\xea\x41\xea\x42\xea\x43\xea\x44\xea\x45\xea\x46\xea\x47\xea\x48\xea\x49\xea\x4a\xea\x4b\xea\x4c\xea\x4d\xea\x4e\xea\x4f\xea\x50\xea\x51\xea\x52\xea\x53\xea\x54\xea\x55\xea\x56\xea\x57\xea\x58\xea\x59\xea\x5a\xea\x5b\xea\x5c\xea\x5d\xea\x5e\xea\x5f\xea\x60\xea\x61\xea\x62\xea\x63\x00\x00", /* 7700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x64\xea\x65\xea\x66\xea\x67\xea\x68\xea\x69\xea\x6a\xea\x6b\xea\x6c\xea\x6d\xea\x6e\xea\x6f\xea\x70\xea\x71\xea\x72\xea\x73\xea\x74\xea\x75\xea\x76\xea\x77\xea\x78\xea\x79\xea\x7a\xea\x7b\xea\x7c\xea\x7d\xea\x7e\xea\x7f\xea\x80\xea\x81\xea\x82\xea\x83\xea\x84\xea\x85\xea\x86\xea\x87\xea\x88\xea\x89\xea\x8a\xea\x8b\xea\x8c\xea\x8d\xea\x8e\xea\x8f\xea\x90\xea\x91\xea\x92\xea\x93\xea\x94\xea\x95\xea\x96\xea\x97\xea\x98\xea\x99\xea\x9a\xea\x9b\xea\x9c\xea\x9d\xea\x9e\xea\x9f\xea\xa0\xea\xa1\xea\xa2", /* 7780 */ "\xea\xa3\xea\xa4\xea\xa5\xea\xa6\xea\xa7\xea\xa8\xea\xa9\xea\xaa\xea\xab\xea\xac\xea\xad\xea\xae\xea\xaf\xea\xb0\xea\xb1\xea\xb2\xea\xb3\xea\xb4\xea\xb5\xea\xb6\xea\xb7\xea\xb8\xea\xb9\xea\xba\xea\xbb\xea\xbc\xea\xbd\xea\xbe\xea\xbf\xea\xc0\xea\xc1\xea\xc2\xea\xc3\xea\xc4\xea\xc5\xea\xc6\xea\xc7\xea\xc8\xea\xc9\xea\xca\xea\xcb\xea\xcc\xea\xcd\xea\xce\xea\xcf\xea\xd0\xea\xd1\xea\xd2\xea\xd3\xea\xd4\xea\xd5\xea\xd6\xea\xd7\xea\xd8\xea\xd9\xea\xda\xea\xdb\xea\xdc\xea\xdd\xea\xde\xea\xdf\xea\xe0\xea\xe1\xea\xe2\xea\xe3\xea\xe4\xea\xe5\xea\xe6\xea\xe7\xea\xe8\xea\xe9\xea\xea\xea\xeb\xea\xec\xea\xed\xea\xee\xea\xef\xea\xf0\xea\xf1\xea\xf2\xea\xf3\xea\xf4\xea\xf5\xea\xf6\xea\xf7\xea\xf8\xea\xf9\xea\xfa\xea\xfb\xea\xfc\xea\xfd\xea\xfe\xea\xff\xeb\x00\xeb\x01\xeb\x02\xeb\x03\xeb\x04\xeb\x05\xeb\x06\xeb\x07\xeb\x08\xeb\x09\xeb\x0a\xeb\x0b\xeb\x0c\xeb\x0d\xeb\x0e\xeb\x0f\xeb\x10\xeb\x11\xeb\x12\xeb\x13\xeb\x14\xeb\x15\xeb\x16\xeb\x17\xeb\x18\xeb\x19\xeb\x1a\xeb\x1b\xeb\x1c\xeb\x1d\xeb\x1e\xeb\x1f\xeb\x20\xeb\x21\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x22\xeb\x23\xeb\x24\xeb\x25\xeb\x26\xeb\x27\xeb\x28\xeb\x29\xeb\x2a\xeb\x2b\xeb\x2c\xeb\x2d\xeb\x2e\xeb\x2f\xeb\x30\xeb\x31\xeb\x32\xeb\x33\xeb\x34\xeb\x35\xeb\x36\xeb\x37\xeb\x38\xeb\x39\xeb\x3a\xeb\x3b\xeb\x3c\xeb\x3d\xeb\x3e\xeb\x3f\xeb\x40\xeb\x41\xeb\x42\xeb\x43\xeb\x44\xeb\x45\xeb\x46\xeb\x47\xeb\x48\xeb\x49\xeb\x4a\xeb\x4b\xeb\x4c\xeb\x4d\xeb\x4e\xeb\x4f\xeb\x50\xeb\x51\xeb\x52\xeb\x53\xeb\x54\xeb\x55\xeb\x56\xeb\x57\xeb\x58\xeb\x59\xeb\x5a\xeb\x5b\xeb\x5c\xeb\x5d\xeb\x5e\xeb\x5f\xeb\x60", /* 7880 */ "\xeb\x61\xeb\x62\xeb\x63\xeb\x64\xeb\x65\xeb\x66\xeb\x67\xeb\x68\xeb\x69\xeb\x6a\xeb\x6b\xeb\x6c\xeb\x6d\xeb\x6e\xeb\x6f\xeb\x70\xeb\x71\xeb\x72\xeb\x73\xeb\x74\xeb\x75\xeb\x76\xeb\x77\xeb\x78\xeb\x79\xeb\x7a\xeb\x7b\xeb\x7c\xeb\x7d\xeb\x7e\xeb\x7f\xeb\x80\xeb\x81\xeb\x82\xeb\x83\xeb\x84\xeb\x85\xeb\x86\xeb\x87\xeb\x88\xeb\x89\xeb\x8a\xeb\x8b\xeb\x8c\xeb\x8d\xeb\x8e\xeb\x8f\xeb\x90\xeb\x91\xeb\x92\xeb\x93\xeb\x94\xeb\x95\xeb\x96\xeb\x97\xeb\x98\xeb\x99\xeb\x9a\xeb\x9b\xeb\x9c\xeb\x9d\xeb\x9e\xeb\x9f\xeb\xa0\xeb\xa1\xeb\xa2\xeb\xa3\xeb\xa4\xeb\xa5\xeb\xa6\xeb\xa7\xeb\xa8\xeb\xa9\xeb\xaa\xeb\xab\xeb\xac\xeb\xad\xeb\xae\xeb\xaf\xeb\xb0\xeb\xb1\xeb\xb2\xeb\xb3\xeb\xb4\xeb\xb5\xeb\xb6\xeb\xb7\xeb\xb8\xeb\xb9\xeb\xba\xeb\xbb\xeb\xbc\xeb\xbd\xeb\xbe\xeb\xbf\xeb\xc0\xeb\xc1\xeb\xc2\xeb\xc3\xeb\xc4\xeb\xc5\xeb\xc6\xeb\xc7\xeb\xc8\xeb\xc9\xeb\xca\xeb\xcb\xeb\xcc\xeb\xcd\xeb\xce\xeb\xcf\xeb\xd0\xeb\xd1\xeb\xd2\xeb\xd3\xeb\xd4\xeb\xd5\xeb\xd6\xeb\xd7\xeb\xd8\xeb\xd9\xeb\xda\xeb\xdb\xeb\xdc\xeb\xdd\xeb\xde\xeb\xdf\x00\x00", /* 7900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xe0\xeb\xe1\xeb\xe2\xeb\xe3\xeb\xe4\xeb\xe5\xeb\xe6\xeb\xe7\xeb\xe8\xeb\xe9\xeb\xea\xeb\xeb\xeb\xec\xeb\xed\xeb\xee\xeb\xef\xeb\xf0\xeb\xf1\xeb\xf2\xeb\xf3\xeb\xf4\xeb\xf5\xeb\xf6\xeb\xf7\xeb\xf8\xeb\xf9\xeb\xfa\xeb\xfb\xeb\xfc\xeb\xfd\xeb\xfe\xeb\xff\xec\x00\xec\x01\xec\x02\xec\x03\xec\x04\xec\x05\xec\x06\xec\x07\xec\x08\xec\x09\xec\x0a\xec\x0b\xec\x0c\xec\x0d\xec\x0e\xec\x0f\xec\x10\xec\x11\xec\x12\xec\x13\xec\x14\xec\x15\xec\x16\xec\x17\xec\x18\xec\x19\xec\x1a\xec\x1b\xec\x1c\xec\x1d\xec\x1e", /* 7980 */ "\xec\x1f\xec\x20\xec\x21\xec\x22\xec\x23\xec\x24\xec\x25\xec\x26\xec\x27\xec\x28\xec\x29\xec\x2a\xec\x2b\xec\x2c\xec\x2d\xec\x2e\xec\x2f\xec\x30\xec\x31\xec\x32\xec\x33\xec\x34\xec\x35\xec\x36\xec\x37\xec\x38\xec\x39\xec\x3a\xec\x3b\xec\x3c\xec\x3d\xec\x3e\xec\x3f\xec\x40\xec\x41\xec\x42\xec\x43\xec\x44\xec\x45\xec\x46\xec\x47\xec\x48\xec\x49\xec\x4a\xec\x4b\xec\x4c\xec\x4d\xec\x4e\xec\x4f\xec\x50\xec\x51\xec\x52\xec\x53\xec\x54\xec\x55\xec\x56\xec\x57\xec\x58\xec\x59\xec\x5a\xec\x5b\xec\x5c\xec\x5d\xec\x5e\xec\x5f\xec\x60\xec\x61\xec\x62\xec\x63\xec\x64\xec\x65\xec\x66\xec\x67\xec\x68\xec\x69\xec\x6a\xec\x6b\xec\x6c\xec\x6d\xec\x6e\xec\x6f\xec\x70\xec\x71\xec\x72\xec\x73\xec\x74\xec\x75\xec\x76\xec\x77\xec\x78\xec\x79\xec\x7a\xec\x7b\xec\x7c\xec\x7d\xec\x7e\xec\x7f\xec\x80\xec\x81\xec\x82\xec\x83\xec\x84\xec\x85\xec\x86\xec\x87\xec\x88\xec\x89\xec\x8a\xec\x8b\xec\x8c\xec\x8d\xec\x8e\xec\x8f\xec\x90\xec\x91\xec\x92\xec\x93\xec\x94\xec\x95\xec\x96\xec\x97\xec\x98\xec\x99\xec\x9a\xec\x9b\xec\x9c\xec\x9d\x00\x00", /* 7a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x9e\xec\x9f\xec\xa0\xec\xa1\xec\xa2\xec\xa3\xec\xa4\xec\xa5\xec\xa6\xec\xa7\xec\xa8\xec\xa9\xec\xaa\xec\xab\xec\xac\xec\xad\xec\xae\xec\xaf\xec\xb0\xec\xb1\xec\xb2\xec\xb3\xec\xb4\xec\xb5\xec\xb6\xec\xb7\xec\xb8\xec\xb9\xec\xba\xec\xbb\xec\xbc\xec\xbd\xec\xbe\xec\xbf\xec\xc0\xec\xc1\xec\xc2\xec\xc3\xec\xc4\xec\xc5\xec\xc6\xec\xc7\xec\xc8\xec\xc9\xec\xca\xec\xcb\xec\xcc\xec\xcd\xec\xce\xec\xcf\xec\xd0\xec\xd1\xec\xd2\xec\xd3\xec\xd4\xec\xd5\xec\xd6\xec\xd7\xec\xd8\xec\xd9\xec\xda\xec\xdb\xec\xdc", /* 7a80 */ "\xec\xdd\xec\xde\xec\xdf\xec\xe0\xec\xe1\xec\xe2\xec\xe3\xec\xe4\xec\xe5\xec\xe6\xec\xe7\xec\xe8\xec\xe9\xec\xea\xec\xeb\xec\xec\xec\xed\xec\xee\xec\xef\xec\xf0\xec\xf1\xec\xf2\xec\xf3\xec\xf4\xec\xf5\xec\xf6\xec\xf7\xec\xf8\xec\xf9\xec\xfa\xec\xfb\xec\xfc\xec\xfd\xec\xfe\xec\xff\xed\x00\xed\x01\xed\x02\xed\x03\xed\x04\xed\x05\xed\x06\xed\x07\xed\x08\xed\x09\xed\x0a\xed\x0b\xed\x0c\xed\x0d\xed\x0e\xed\x0f\xed\x10\xed\x11\xed\x12\xed\x13\xed\x14\xed\x15\xed\x16\xed\x17\xed\x18\xed\x19\xed\x1a\xed\x1b\xed\x1c\xed\x1d\xed\x1e\xed\x1f\xed\x20\xed\x21\xed\x22\xed\x23\xed\x24\xed\x25\xed\x26\xed\x27\xed\x28\xed\x29\xed\x2a\xed\x2b\xed\x2c\xed\x2d\xed\x2e\xed\x2f\xed\x30\xed\x31\xed\x32\xed\x33\xed\x34\xed\x35\xed\x36\xed\x37\xed\x38\xed\x39\xed\x3a\xed\x3b\xed\x3c\xed\x3d\xed\x3e\xed\x3f\xed\x40\xed\x41\xed\x42\xed\x43\xed\x44\xed\x45\xed\x46\xed\x47\xed\x48\xed\x49\xed\x4a\xed\x4b\xed\x4c\xed\x4d\xed\x4e\xed\x4f\xed\x50\xed\x51\xed\x52\xed\x53\xed\x54\xed\x55\xed\x56\xed\x57\xed\x58\xed\x59\xed\x5a\xed\x5b\x00\x00", /* 7b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x5c\xed\x5d\xed\x5e\xed\x5f\xed\x60\xed\x61\xed\x62\xed\x63\xed\x64\xed\x65\xed\x66\xed\x67\xed\x68\xed\x69\xed\x6a\xed\x6b\xed\x6c\xed\x6d\xed\x6e\xed\x6f\xed\x70\xed\x71\xed\x72\xed\x73\xed\x74\xed\x75\xed\x76\xed\x77\xed\x78\xed\x79\xed\x7a\xed\x7b\xed\x7c\xed\x7d\xed\x7e\xed\x7f\xed\x80\xed\x81\xed\x82\xed\x83\xed\x84\xed\x85\xed\x86\xed\x87\xed\x88\xed\x89\xed\x8a\xed\x8b\xed\x8c\xed\x8d\xed\x8e\xed\x8f\xed\x90\xed\x91\xed\x92\xed\x93\xed\x94\xed\x95\xed\x96\xed\x97\xed\x98\xed\x99\xed\x9a", /* 7b80 */ "\xed\x9b\xed\x9c\xed\x9d\xed\x9e\xed\x9f\xed\xa0\xed\xa1\xed\xa2\xed\xa3\xed\xa4\xed\xa5\xed\xa6\xed\xa7\xed\xa8\xed\xa9\xed\xaa\xed\xab\xed\xac\xed\xad\xed\xae\xed\xaf\xed\xb0\xed\xb1\xed\xb2\xed\xb3\xed\xb4\xed\xb5\xed\xb6\xed\xb7\xed\xb8\xed\xb9\xed\xba\xed\xbb\xed\xbc\xed\xbd\xed\xbe\xed\xbf\xed\xc0\xed\xc1\xed\xc2\xed\xc3\xed\xc4\xed\xc5\xed\xc6\xed\xc7\xed\xc8\xed\xc9\xed\xca\xed\xcb\xed\xcc\xed\xcd\xed\xce\xed\xcf\xed\xd0\xed\xd1\xed\xd2\xed\xd3\xed\xd4\xed\xd5\xed\xd6\xed\xd7\xed\xd8\xed\xd9\xed\xda\xed\xdb\xed\xdc\xed\xdd\xed\xde\xed\xdf\xed\xe0\xed\xe1\xed\xe2\xed\xe3\xed\xe4\xed\xe5\xed\xe6\xed\xe7\xed\xe8\xed\xe9\xed\xea\xed\xeb\xed\xec\xed\xed\xed\xee\xed\xef\xed\xf0\xed\xf1\xed\xf2\xed\xf3\xed\xf4\xed\xf5\xed\xf6\xed\xf7\xed\xf8\xed\xf9\xed\xfa\xed\xfb\xed\xfc\xed\xfd\xed\xfe\xed\xff\xee\x00\xee\x01\xee\x02\xee\x03\xee\x04\xee\x05\xee\x06\xee\x07\xee\x08\xee\x09\xee\x0a\xee\x0b\xee\x0c\xee\x0d\xee\x0e\xee\x0f\xee\x10\xee\x11\xee\x12\xee\x13\xee\x14\xee\x15\xee\x16\xee\x17\xee\x18\xee\x19\x00\x00", /* 7c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\x1a\xee\x1b\xee\x1c\xee\x1d\xee\x1e\xee\x1f\xee\x20\xee\x21\xee\x22\xee\x23\xee\x24\xee\x25\xee\x26\xee\x27\xee\x28\xee\x29\xee\x2a\xee\x2b\xee\x2c\xee\x2d\xee\x2e\xee\x2f\xee\x30\xee\x31\xee\x32\xee\x33\xee\x34\xee\x35\xee\x36\xee\x37\xee\x38\xee\x39\xee\x3a\xee\x3b\xee\x3c\xee\x3d\xee\x3e\xee\x3f\xee\x40\xee\x41\xee\x42\xee\x43\xee\x44\xee\x45\xee\x46\xee\x47\xee\x48\xee\x49\xee\x4a\xee\x4b\xee\x4c\xee\x4d\xee\x4e\xee\x4f\xee\x50\xee\x51\xee\x52\xee\x53\xee\x54\xee\x55\xee\x56\xee\x57\xee\x58", /* 7c80 */ "\xee\x59\xee\x5a\xee\x5b\xee\x5c\xee\x5d\xee\x5e\xee\x5f\xee\x60\xee\x61\xee\x62\xee\x63\xee\x64\xee\x65\xee\x66\xee\x67\xee\x68\xee\x69\xee\x6a\xee\x6b\xee\x6c\xee\x6d\xee\x6e\xee\x6f\xee\x70\xee\x71\xee\x72\xee\x73\xee\x74\xee\x75\xee\x76\xee\x77\xee\x78\xee\x79\xee\x7a\xee\x7b\xee\x7c\xee\x7d\xee\x7e\xee\x7f\xee\x80\xee\x81\xee\x82\xee\x83\xee\x84\xee\x85\xee\x86\xee\x87\xee\x88\xee\x89\xee\x8a\xee\x8b\xee\x8c\xee\x8d\xee\x8e\xee\x8f\xee\x90\xee\x91\xee\x92\xee\x93\xee\x94\xee\x95\xee\x96\xee\x97\xee\x98\xee\x99\xee\x9a\xee\x9b\xee\x9c\xee\x9d\xee\x9e\xee\x9f\xee\xa0\xee\xa1\xee\xa2\xee\xa3\xee\xa4\xee\xa5\xee\xa6\xee\xa7\xee\xa8\xee\xa9\xee\xaa\xee\xab\xee\xac\xee\xad\xee\xae\xee\xaf\xee\xb0\xee\xb1\xee\xb2\xee\xb3\xee\xb4\xee\xb5\xee\xb6\xee\xb7\xee\xb8\xee\xb9\xee\xba\xee\xbb\xee\xbc\xee\xbd\xee\xbe\xee\xbf\xee\xc0\xee\xc1\xee\xc2\xee\xc3\xee\xc4\xee\xc5\xee\xc6\xee\xc7\xee\xc8\xee\xc9\xee\xca\xee\xcb\xee\xcc\xee\xcd\xee\xce\xee\xcf\xee\xd0\xee\xd1\xee\xd2\xee\xd3\xee\xd4\xee\xd5\xee\xd6\xee\xd7\x00\x00", /* 7d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\xd8\xee\xd9\xee\xda\xee\xdb\xee\xdc\xee\xdd\xee\xde\xee\xdf\xee\xe0\xee\xe1\xee\xe2\xee\xe3\xee\xe4\xee\xe5\xee\xe6\xee\xe7\xee\xe8\xee\xe9\xee\xea\xee\xeb\xee\xec\xee\xed\xee\xee\xee\xef\xee\xf0\xee\xf1\xee\xf2\xee\xf3\xee\xf4\xee\xf5\xee\xf6\xee\xf7\xee\xf8\xee\xf9\xee\xfa\xee\xfb\xee\xfc\xee\xfd\xee\xfe\xee\xff\xef\x00\xef\x01\xef\x02\xef\x03\xef\x04\xef\x05\xef\x06\xef\x07\xef\x08\xef\x09\xef\x0a\xef\x0b\xef\x0c\xef\x0d\xef\x0e\xef\x0f\xef\x10\xef\x11\xef\x12\xef\x13\xef\x14\xef\x15\xef\x16", /* 7d80 */ "\xef\x17\xef\x18\xef\x19\xef\x1a\xef\x1b\xef\x1c\xef\x1d\xef\x1e\xef\x1f\xef\x20\xef\x21\xef\x22\xef\x23\xef\x24\xef\x25\xef\x26\xef\x27\xef\x28\xef\x29\xef\x2a\xef\x2b\xef\x2c\xef\x2d\xef\x2e\xef\x2f\xef\x30\xef\x31\xef\x32\xef\x33\xef\x34\xef\x35\xef\x36\xef\x37\xef\x38\xef\x39\xef\x3a\xef\x3b\xef\x3c\xef\x3d\xef\x3e\xef\x3f\xef\x40\xef\x41\xef\x42\xef\x43\xef\x44\xef\x45\xef\x46\xef\x47\xef\x48\xef\x49\xef\x4a\xef\x4b\xef\x4c\xef\x4d\xef\x4e\xef\x4f\xef\x50\xef\x51\xef\x52\xef\x53\xef\x54\xef\x55\xef\x56\xef\x57\xef\x58\xef\x59\xef\x5a\xef\x5b\xef\x5c\xef\x5d\xef\x5e\xef\x5f\xef\x60\xef\x61\xef\x62\xef\x63\xef\x64\xef\x65\xef\x66\xef\x67\xef\x68\xef\x69\xef\x6a\xef\x6b\xef\x6c\xef\x6d\xef\x6e\xef\x6f\xef\x70\xef\x71\xef\x72\xef\x73\xef\x74\xef\x75\xef\x76\xef\x77\xef\x78\xef\x79\xef\x7a\xef\x7b\xef\x7c\xef\x7d\xef\x7e\xef\x7f\xef\x80\xef\x81\xef\x82\xef\x83\xef\x84\xef\x85\xef\x86\xef\x87\xef\x88\xef\x89\xef\x8a\xef\x8b\xef\x8c\xef\x8d\xef\x8e\xef\x8f\xef\x90\xef\x91\xef\x92\xef\x93\xef\x94\xef\x95\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x96\xef\x97\xef\x98\xef\x99\xef\x9a\xef\x9b\xef\x9c\xef\x9d\xef\x9e\xef\x9f\xef\xa0\xef\xa1\xef\xa2\xef\xa3\xef\xa4\xef\xa5\xef\xa6\xef\xa7\xef\xa8\xef\xa9\xef\xaa\xef\xab\xef\xac\xef\xad\xef\xae\xef\xaf\xef\xb0\xef\xb1\xef\xb2\xef\xb3\xef\xb4\xef\xb5\xef\xb6\xef\xb7\xef\xb8\xef\xb9\xef\xba\xef\xbb\xef\xbc\xef\xbd\xef\xbe\xef\xbf\xef\xc0\xef\xc1\xef\xc2\xef\xc3\xef\xc4\xef\xc5\xef\xc6\xef\xc7\xef\xc8\xef\xc9\xef\xca\xef\xcb\xef\xcc\xef\xcd\xef\xce\xef\xcf\xef\xd0\xef\xd1\xef\xd2\xef\xd3\xef\xd4", /* 7e80 */ "\xef\xd5\xef\xd6\xef\xd7\xef\xd8\xef\xd9\xef\xda\xef\xdb\xef\xdc\xef\xdd\xef\xde\xef\xdf\xef\xe0\xef\xe1\xef\xe2\xef\xe3\xef\xe4\xef\xe5\xef\xe6\xef\xe7\xef\xe8\xef\xe9\xef\xea\xef\xeb\xef\xec\xef\xed\xef\xee\xef\xef\xef\xf0\xef\xf1\xef\xf2\xef\xf3\xef\xf4\xef\xf5\xef\xf6\xef\xf7\xef\xf8\xef\xf9\xef\xfa\xef\xfb\xef\xfc\xef\xfd\xef\xfe\xef\xff\xf0\x00\xf0\x01\xf0\x02\xf0\x03\xf0\x04\xf0\x05\xf0\x06\xf0\x07\xf0\x08\xf0\x09\xf0\x0a\xf0\x0b\xf0\x0c\xf0\x0d\xf0\x0e\xf0\x0f\xf0\x10\xf0\x11\xf0\x12\xf0\x13\xf0\x14\xf0\x15\xf0\x16\xf0\x17\xf0\x18\xf0\x19\xf0\x1a\xf0\x1b\xf0\x1c\xf0\x1d\xf0\x1e\xf0\x1f\xf0\x20\xf0\x21\xf0\x22\xf0\x23\xf0\x24\xf0\x25\xf0\x26\xf0\x27\xf0\x28\xf0\x29\xf0\x2a\xf0\x2b\xf0\x2c\xf0\x2d\xf0\x2e\xf0\x2f\xf0\x30\xf0\x31\xf0\x32\xf0\x33\xf0\x34\xf0\x35\xf0\x36\xf0\x37\xf0\x38\xf0\x39\xf0\x3a\xf0\x3b\xf0\x3c\xf0\x3d\xf0\x3e\xf0\x3f\xf0\x40\xf0\x41\xf0\x42\xf0\x43\xf0\x44\xf0\x45\xf0\x46\xf0\x47\xf0\x48\xf0\x49\xf0\x4a\xf0\x4b\xf0\x4c\xf0\x4d\xf0\x4e\xf0\x4f\xf0\x50\xf0\x51\xf0\x52\xf0\x53\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x54\xf0\x55\xf0\x56\xf0\x57\xf0\x58\xf0\x59\xf0\x5a\xf0\x5b\xf0\x5c\xf0\x5d\xf0\x5e\xf0\x5f\xf0\x60\xf0\x61\xf0\x62\xf0\x63\xf0\x64\xf0\x65\xf0\x66\xf0\x67\xf0\x68\xf0\x69\xf0\x6a\xf0\x6b\xf0\x6c\xf0\x6d\xf0\x6e\xf0\x6f\xf0\x70\xf0\x71\xf0\x72\xf0\x73\xf0\x74\xf0\x75\xf0\x76\xf0\x77\xf0\x78\xf0\x79\xf0\x7a\xf0\x7b\xf0\x7c\xf0\x7d\xf0\x7e\xf0\x7f\xf0\x80\xf0\x81\xf0\x82\xf0\x83\xf0\x84\xf0\x85\xf0\x86\xf0\x87\xf0\x88\xf0\x89\xf0\x8a\xf0\x8b\xf0\x8c\xf0\x8d\xf0\x8e\xf0\x8f\xf0\x90\xf0\x91\xf0\x92", /* 7f80 */ "\xf0\x93\xf0\x94\xf0\x95\xf0\x96\xf0\x97\xf0\x98\xf0\x99\xf0\x9a\xf0\x9b\xf0\x9c\xf0\x9d\xf0\x9e\xf0\x9f\xf0\xa0\xf0\xa1\xf0\xa2\xf0\xa3\xf0\xa4\xf0\xa5\xf0\xa6\xf0\xa7\xf0\xa8\xf0\xa9\xf0\xaa\xf0\xab\xf0\xac\xf0\xad\xf0\xae\xf0\xaf\xf0\xb0\xf0\xb1\xf0\xb2\xf0\xb3\xf0\xb4\xf0\xb5\xf0\xb6\xf0\xb7\xf0\xb8\xf0\xb9\xf0\xba\xf0\xbb\xf0\xbc\xf0\xbd\xf0\xbe\xf0\xbf\xf0\xc0\xf0\xc1\xf0\xc2\xf0\xc3\xf0\xc4\xf0\xc5\xf0\xc6\xf0\xc7\xf0\xc8\xf0\xc9\xf0\xca\xf0\xcb\xf0\xcc\xf0\xcd\xf0\xce\xf0\xcf\xf0\xd0\xf0\xd1\xf0\xd2\xf0\xd3\xf0\xd4\xf0\xd5\xf0\xd6\xf0\xd7\xf0\xd8\xf0\xd9\xf0\xda\xf0\xdb\xf0\xdc\xf0\xdd\xf0\xde\xf0\xdf\xf0\xe0\xf0\xe1\xf0\xe2\xf0\xe3\xf0\xe4\xf0\xe5\xf0\xe6\xf0\xe7\xf0\xe8\xf0\xe9\xf0\xea\xf0\xeb\xf0\xec\xf0\xed\xf0\xee\xf0\xef\xf0\xf0\xf0\xf1\xf0\xf2\xf0\xf3\xf0\xf4\xf0\xf5\xf0\xf6\xf0\xf7\xf0\xf8\xf0\xf9\xf0\xfa\xf0\xfb\xf0\xfc\xf0\xfd\xf0\xfe\xf0\xff\xf1\x00\xf1\x01\xf1\x02\xf1\x03\xf1\x04\xf1\x05\xf1\x06\xf1\x07\xf1\x08\xf1\x09\xf1\x0a\xf1\x0b\xf1\x0c\xf1\x0d\xf1\x0e\xf1\x0f\xf1\x10\xf1\x11\x00\x00", /* 8000 */ NULL, /* 8080 */ NULL, /* 8100 */ NULL, /* 8180 */ NULL, /* 8200 */ NULL, /* 8280 */ NULL, /* 8300 */ NULL, /* 8380 */ NULL, /* 8400 */ NULL, /* 8480 */ NULL, /* 8500 */ NULL, /* 8580 */ NULL, /* 8600 */ NULL, /* 8680 */ NULL, /* 8700 */ NULL, /* 8780 */ NULL, /* 8800 */ NULL, /* 8880 */ NULL, /* 8900 */ NULL, /* 8980 */ NULL, /* 8a00 */ NULL, /* 8a80 */ NULL, /* 8b00 */ NULL, /* 8b80 */ NULL, /* 8c00 */ NULL, /* 8c80 */ NULL, /* 8d00 */ NULL, /* 8d80 */ NULL, /* 8e00 */ NULL, /* 8e80 */ NULL, /* 8f00 */ NULL, /* 8f80 */ NULL, /* 9000 */ NULL, /* 9080 */ NULL, /* 9100 */ NULL, /* 9180 */ NULL, /* 9200 */ NULL, /* 9280 */ NULL, /* 9300 */ NULL, /* 9380 */ NULL, /* 9400 */ NULL, /* 9480 */ NULL, /* 9500 */ NULL, /* 9580 */ NULL, /* 9600 */ NULL, /* 9680 */ NULL, /* 9700 */ NULL, /* 9780 */ NULL, /* 9800 */ NULL, /* 9880 */ NULL, /* 9900 */ NULL, /* 9980 */ NULL, /* 9a00 */ NULL, /* 9a80 */ NULL, /* 9b00 */ NULL, /* 9b80 */ NULL, /* 9c00 */ NULL, /* 9c80 */ NULL, /* 9d00 */ NULL, /* 9d80 */ NULL, /* 9e00 */ NULL, /* 9e80 */ NULL, /* 9f00 */ NULL, /* 9f80 */ NULL, /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ NULL, /* e080 */ NULL, /* e100 */ NULL, /* e180 */ NULL, /* e200 */ NULL, /* e280 */ NULL, /* e300 */ NULL, /* e380 */ NULL, /* e400 */ NULL, /* e480 */ NULL, /* e500 */ NULL, /* e580 */ NULL, /* e600 */ NULL, /* e680 */ NULL, /* e700 */ NULL, /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ NULL, /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ NULL, /* ff80 */ NULL } }, { "cp935", "0x04380345" /* 1080, 837 */, /* Unicode to EBCDIC DBCS translation table for ibm-837_P100-2000 */ { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x88\x00\x00\x00\x00\x44\x6a\x44\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xed\x44\x4b\x00\x00\x00\x00\x44\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x44\x46\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x48\x46\x46\x46\x5a\x00\x00\x46\x4c\x46\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x46\x50\x46\x4e\x00\x00\x00\x00\x00\x00\x44\x7b\x00\x00\x46\x54\x46\x52\x00\x00\x46\x59\x00\x00\x00\x00\x00\x00", /* 0100 */ "\x00\x00\x46\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x43\x00\x00\x46\x4b\x00\x00\x46\x4f\x00\x00\x46\x53\x00\x00\x46\x55\x00\x00\x46\x56\x00\x00\x46\x57\x00\x00\x46\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0200 */ NULL, /* 0280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x46\x00\x00\x45\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x61\x41\x62\x41\x63\x41\x64\x41\x65\x41\x66\x41\x67\x41\x68\x41\x69\x41\x6a\x41\x6b\x41\x6c\x41\x6d\x41\x6e\x41\x6f\x41\x70\x41\x71\x00\x00\x41\x72\x41\x73\x41\x74\x41\x75\x41\x76\x41\x77\x41\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x41\x41\x42\x41\x43\x41\x44\x41\x45\x41\x46\x41\x47\x41\x48\x41\x49\x41\x4a\x41\x4b\x41\x4c\x41\x4d\x41\x4e\x41\x4f\x41\x50\x41\x51\x00\x00\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x41\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\x41\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xc0\x41\xc1\x41\xc2\x41\xc3\x41\xc4\x41\xc5\x41\xc7\x41\xc8\x41\xc9\x41\xca\x41\xcb\x41\xcc\x41\xcd\x41\xce\x41\xcf\x41\xd0\x41\xd1\x41\xd2\x41\xd3\x41\xd4\x41\xd5\x41\xd6\x41\xd7\x41\xd8\x41\xd9\x41\xda\x41\xdb\x41\xdc\x41\xdd\x41\xde\x41\xdf\x41\xe0\x41\x80\x41\x81\x41\x82\x41\x83\x41\x84\x41\x85\x41\x87\x41\x88\x41\x89\x41\x8a\x41\x8b\x41\x8c\x41\x8d\x41\x8e\x41\x8f\x41\x90\x41\x91\x41\x92\x41\x93\x41\x94\x41\x95\x41\x96\x41\x97\x41\x98\x41\x99\x41\x9a\x41\x9b\x41\x9c\x41\x9d\x41\x9e\x41\x9f\x41\xa0\x00\x00\x41\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x44\x4a\x44\x7c\x00\x00\x44\x61\x44\x71\x00\x00\x00\x00\x44\x62\x44\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7e\x44\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x8b\x00\x00\x44\xee\x44\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ NULL, /* 2100 */ "\x00\x00\x00\x00\x00\x00\x44\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xf1\x41\xf2\x41\xf3\x41\xf4\x41\xf5\x41\xf6\x41\xf7\x41\xf8\x41\xf9\x41\xfa\x41\xfb\x41\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x41\xb1\x41\xb2\x41\xb3\x41\xb4\x41\xb5\x41\xb6\x41\xb7\x41\xb8\x41\xb9\x41\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xf1\x44\xf2\x44\xf0\x44\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x66\x00\x00\x45\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6b\x00\x00\x00\x00\x45\x77\x44\x4d\x00\x00\x45\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6d\x00\x00\x45\x63\x45\x64\x45\x68\x45\x67\x45\x71\x00\x00\x00\x00\x45\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x68\x44\x78\x45\x62\x45\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x75\x00\x00\x00\x00\x00\x00\x45\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x4c\x45\x73\x00\x00\x00\x00\x44\x67\x44\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x79\x45\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xe1\x45\xe2\x45\xe3\x45\xe4\x45\xe5\x45\xe6\x45\xe7\x45\xe8\x45\xe9\x45\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xc5\x45\xc6\x45\xc7\x45\xc8\x45\xc9\x45\xca\x45\xcb\x45\xcc\x45\xcd\x45\xce\x45\xcf\x45\xd0", /* 2480 */ "\x45\xd1\x45\xd2\x45\xd3\x45\xd4\x45\xd5\x45\xd6\x45\xd7\x45\xd8\x45\xb1\x45\xb2\x45\xb3\x45\xb4\x45\xb5\x45\xb6\x45\xb7\x45\xb8\x45\xb9\x45\xba\x45\xbb\x45\xbc\x45\xbd\x45\xbe\x45\xbf\x45\xc0\x45\xc1\x45\xc2\x45\xc3\x45\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2500 */ "\x46\xa4\x46\xa5\x46\xa6\x46\xa7\x46\xa8\x46\xa9\x46\xaa\x46\xab\x46\xac\x46\xad\x46\xae\x46\xaf\x46\xb0\x46\xb1\x46\xb2\x46\xb3\x46\xb4\x46\xb5\x46\xb6\x46\xb7\x46\xb8\x46\xb9\x46\xba\x46\xbb\x46\xbc\x46\xbd\x46\xbe\x46\xbf\x46\xc0\x46\xc1\x46\xc2\x46\xc3\x46\xc4\x46\xc5\x46\xc6\x46\xc7\x46\xc8\x46\xc9\x46\xca\x46\xcb\x46\xcc\x46\xcd\x46\xce\x46\xcf\x46\xd0\x46\xd1\x46\xd2\x46\xd3\x46\xd4\x46\xd5\x46\xd6\x46\xd7\x46\xd8\x46\xd9\x46\xda\x46\xdb\x46\xdc\x46\xdd\x46\xde\x46\xdf\x46\xe0\x46\xe1\x46\xe2\x46\xe3\x46\xe4\x46\xe5\x46\xe6\x46\xe7\x46\xe8\x46\xe9\x46\xea\x46\xeb\x46\xec\x46\xed\x46\xee\x46\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xea\x44\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe3\x44\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xec\x44\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe8\x44\xe7\x00\x00\x00\x00\x00\x00\x44\xe0\x00\x00\x00\x00\x44\xe4\x44\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe6\x44\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x79\x00\x00\x44\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ "\x40\x40\x43\x44\x43\x41\x44\x5b\x00\x00\x44\x5d\x44\x5e\x44\x5f\x44\x64\x44\x74\x44\x65\x44\x75\x43\x42\x43\x43\x44\x42\x44\x43\x44\x66\x44\x76\x44\x6c\x44\x7d\x44\x63\x44\x73\x45\x5b\x45\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x47\x44\x81\x44\x48\x44\x82\x44\x49\x44\x83\x44\x51\x44\x84\x44\x52\x44\x85\x44\x86\x44\xc0\x44\x87\x44\xc1\x44\x88\x44\xc2\x44\x89\x44\xc3\x44\x8a\x44\xc4\x44\x8c\x44\xc5\x44\x8d\x44\xc6\x44\x8e\x44\xc7\x44\x8f\x44\xc8\x44\x90\x44\xc9\x44\x91\x44\xca\x44\x92\x44\xcb\x44\x56\x44\x93\x44\xcc\x44\x94\x44\xcd\x44\x95\x44\xce\x44\x96\x44\x97\x44\x98\x44\x99\x44\x9a\x44\x9d\x44\xcf\x44\xd5\x44\x9e\x44\xd0\x44\xd6\x44\x9f\x44\xd1\x44\xd7\x44\xa2\x44\xd2\x44\xd8\x44\xa3\x44\xd3\x44\xd9\x44\xa4\x44\xa5", /* 3080 */ "\x44\xa6\x44\xa7\x44\xa8\x44\x53\x44\xa9\x44\x54\x44\xaa\x44\x55\x44\xac\x44\xad\x44\xae\x44\xaf\x44\xba\x44\xbb\x44\x57\x44\xbc\x44\xda\x44\xdb\x44\x46\x44\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xbe\x43\xbf\x44\xdc\x44\xdd\x00\x00\x00\x00\x43\x47\x43\x81\x43\x48\x43\x82\x43\x49\x43\x83\x43\x51\x43\x84\x43\x52\x43\x85\x43\x86\x43\xc0\x43\x87\x43\xc1\x43\x88\x43\xc2\x43\x89\x43\xc3\x43\x8a\x43\xc4\x43\x8c\x43\xc5\x43\x8d\x43\xc6\x43\x8e\x43\xc7\x43\x8f\x43\xc8\x43\x90\x43\xc9\x43\x91\x43\xca\x43\x92\x43\xcb\x43\x56\x43\x93\x43\xcc\x43\x94\x43\xcd\x43\x95\x43\xce\x43\x96\x43\x97\x43\x98\x43\x99\x43\x9a\x43\x9d\x43\xcf\x43\xd5\x43\x9e\x43\xd0\x43\xd6\x43\x9f\x43\xd1\x43\xd7\x43\xa2\x43\xd2\x43\xd8\x43\xa3\x43\xd3\x43\xd9\x43\xa4\x43\xa5\x43\xa6\x43\xa7\x43\xa8\x43\x53\x43\xa9\x43\x54\x43\xaa\x43\x55\x43\xac\x43\xad\x43\xae\x43\xaf\x43\xba\x43\xbb\x43\x57\x43\xbc\x43\xda\x43\xdb\x43\x46\x43\xbd\x43\xd4\x43\x59\x43\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x43\x45\x43\x58\x43\xdc\x43\xdd\x00\x00", /* 3100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x65\x46\x66\x46\x67\x46\x68\x46\x69\x46\x6a\x46\x6b\x46\x6c\x46\x6d\x46\x6e\x46\x6f\x46\x70\x46\x71\x46\x72\x46\x73\x46\x74\x46\x75\x46\x76\x46\x77\x46\x78\x46\x79\x46\x7a\x46\x7b\x46\x7c\x46\x7d\x46\x7e\x46\x7f\x46\x80\x46\x81\x46\x82\x46\x83\x46\x84\x46\x85\x46\x86\x46\x87\x46\x88\x46\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3180 */ NULL, /* 3200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xf1\x45\xf2\x45\xf3\x45\xf4\x45\xf5\x45\xf6\x45\xf7\x45\xf8\x45\xf9\x45\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ NULL, /* 4080 */ NULL, /* 4100 */ NULL, /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ NULL, /* 4380 */ NULL, /* 4400 */ NULL, /* 4480 */ NULL, /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ NULL, /* 4680 */ NULL, /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ NULL, /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ NULL, /* 4c80 */ NULL, /* 4d00 */ NULL, /* 4d80 */ NULL, /* 4e00 */ "\x59\xba\x4b\xa0\x00\x00\x53\xde\x00\x00\x00\x00\x00\x00\x57\x93\x5b\x69\x54\xfc\x55\x6f\x58\x62\x5c\xa1\x49\xba\x5a\x8c\x00\x00\x5c\xa3\x4a\x94\x00\x00\x5c\x48\x54\x72\x5c\xa6\x55\xbf\x00\x00\x54\x91\x49\x9c\x59\xb4\x4a\xd3\x4b\xaa\x56\x5f\x5c\xa8\x00\x00\x00\x00\x00\x00\x4b\xa9\x00\x00\x51\x5d\x59\x6f\x00\x00\x55\x45\x5c\xac\x00\x00\x4c\xf5\x59\x5e\x62\x7c\x5b\xcf\x00\x00\x00\x00\x4c\x82\x00\x00\x4a\xad\x00\x00\x51\x79\x00\x00\x5c\xbb\x00\x00\x57\x89\x4b\x44\x57\xa9\x5b\xf6\x00\x00\x50\xf5\x4f\xd8\x5c\xae\x00\x00\x00\x00\x00\x00\x52\xca\x00\x00\x4f\xc2\x00\x00\x5c\xb0\x52\x54\x59\xe4\x00\x00\x5b\xad\x57\xd9\x5b\x47\x4d\xf4\x4c\x46\x50\xd5\x00\x00\x53\xb8\x53\x72\x54\x67\x00\x00\x4d\x74\x00\x00\x4a\x6b\x59\xd1\x00\x00\x00\x00\x5c\xbe\x4f\xc4\x53\xf1\x59\xb1\x58\x50\x58\x88\x00\x00\x00\x00\x00\x00\x00\x00\x55\xe8\x00\x00\x00\x00\x5c\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xf1\x51\xd1\x00\x00\x54\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x4c\x00\x00", /* 4e80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x6b\x00\x00\x5a\x89\x5b\x9a\x00\x00\x55\xc1\x4b\xfd\x5c\xa0\x5a\x7a\x50\x98\x00\x00\x5a\xc5\x4e\x45\x5c\xc0\x57\xe4\x4f\xad\x00\x00\x00\x00\x5c\xa7\x00\x00\x59\x67\x58\xa8\x00\x00\x00\x00\x00\x00\x5c\xbc\x5d\x90\x57\x97\x50\x5a\x00\x00\x4f\x5b\x4d\xa4\x59\xdf\x49\xf9\x4d\xdf\x52\xb5\x00\x00\x58\x8e\x4f\xa8\x57\x44\x51\x61\x00\x00\x00\x00\x00\x00\x54\x77\x5d\x92\x00\x00\x5d\x95\x00\x00\x00\x00\x00\x00\x00\x00\x54\xca\x5c\xe8\x00\x00\x00\x00\x00\x00\x59\xd9\x55\xb1\x54\xc9\x5c\xeb\x5c\xe9\x5c\xc5\x4f\x97\x53\xcc\x4a\x91\x00\x00\x5c\xea\x4f\x92\x4f\x8a\x00\x00\x54\xd3\x4a\xd2\x00\x00\x00\x00\x51\xd7\x00\x00\x49\xd5\x5c\x70\x55\xca\x56\x9c\x5b\x6c\x4c\xb5\x58\x69\x00\x00\x00\x00\x00\x00\x5d\x7a\x5c\xef\x54\x4a\x00\x00\x5c\xed\x00\x00\x4a\xf9\x51\x8f\x59\xd3\x00\x00\x00\x00\x5c\xec\x00\x00\x59\xc6\x5c\xee\x52\x67\x00\x00\x00\x00\x00\x00\x59\x97\x00\x00\x5b\xd8\x5c\xf1\x00\x00\x5c\xf4\x4e\xfd\x4e\xda\x00\x00\x00\x00\x00\x00\x54\xcd\x00\x00\x4c\x7d\x00\x00\x4c\x62", /* 4f00 */ "\x00\x00\x53\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xf7\x59\xc0\x00\x00\x00\x00\x57\xe8\x4e\xbe\x4c\x9d\x4c\x45\x58\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xd9\x5a\x65\x4e\x90\x4e\x82\x5c\xf0\x00\x00\x00\x00\x55\x41\x57\xaf\x4a\xaa\x00\x00\x5c\xf2\x00\x00\x55\x6b\x5c\xf5\x51\xd6\x5c\xf6\x00\x00\x00\x00\x57\xb0\x5c\xf8\x00\x00\x00\x00\x00\x00\x49\xad\x4d\x60\x00\x00\x5d\x43\x00\x00\x48\xe8\x00\x00\x51\x87\x00\x00\x55\x8d\x00\x00\x56\x65\x00\x00\x56\x66\x5d\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x89\x00\x00\x00\x00\x4b\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xba\x4b\x6d\x5c\x41\x5c\x95\x5a\x73\x00\x00\x56\xe4\x00\x00\x4d\xcd\x00\x00\x5d\x42\x5d\x7c\x5a\x81\x5c\xfc\x4c\x91\x5c\x98\x5c\xfd\x5c\xf9\x5d\x41\x52\xe2\x00\x00\x00\x00\x5a\x56\x5c\xf3\x5d\x7d\x00\x00\x5c\xfa\x00\x00\x53\x86\x00\x00\x00\x00\x50\xcf\x00\x00\x00\x00\x59\x91\x48\xda\x00\x00\x00\x00\x4e\xd0\x5d\x46\x00\x00\x5d\x45\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x4c\x5d\x4e\x00\x00\x5d\x4b\x55\xb8", /* 4f80 */ "\x00\x00\x00\x00\x00\x00\x5d\x49\x5b\xb5\x00\x00\x00\x00\x00\x00\x4a\x7e\x5d\x48\x00\x00\x50\xfc\x00\x00\x55\xcb\x00\x00\x5d\x4a\x00\x00\x5d\x47\x00\x00\x00\x00\x5d\x50\x00\x00\x00\x00\x4b\xb0\x00\x00\x00\x00\x00\x00\x4d\x49\x00\x00\x59\xbf\x00\x00\x00\x00\x58\x60\x00\x00\x00\x00\x51\xc1\x00\x00\x4f\x64\x5b\x8d\x49\xdf\x54\x68\x50\x8c\x5d\x4d\x00\x00\x5d\x4f\x00\x00\x57\xe9\x4d\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x84\x00\x00\x00\x00\x00\x00\x4a\xd8\x4b\xec\x5d\x54\x00\x00\x00\x00\x00\x00\x00\x00\x50\x41\x00\x00\x00\x00\x00\x00\x5d\x7e\x54\x6e\x50\xfd\x5d\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x77\x4c\x9e\x00\x00\x5d\x55\x00\x00\x5d\x57\x49\x43\x5a\x82\x5d\x59\x00\x00\x58\xc4\x00\x00\x5d\x56\x00\x00\x00\x00\x5d\x51\x00\x00\x5d\x52\x51\x49\x5d\x53\x00\x00\x00\x00\x4e\xf2\x58\xdd\x4c\xa8\x00\x00\x4f\xe2\x00\x00\x5d\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x5a\x00\x00\x48\xb2\x00\x00\x00\x00\x00\x00\x5d\x62\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x64\x49\x56\x00\x00\x5d\x5f\x00\x00\x00\x00\x4b\x59\x00\x00\x4f\xf2\x00\x00\x00\x00\x00\x00\x56\xc7\x4d\xf1\x59\xcf\x00\x00\x5d\x63\x00\x00\x00\x00\x4f\x89\x00\x00\x4a\x4b\x00\x00\x00\x00\x00\x00\x5d\x65\x4f\xea\x00\x00\x5d\x66\x5d\x5b\x52\xde\x00\x00\x5d\x5e\x5d\x61\x5d\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x4e\x00\x00\x5b\xb4\x00\x00\x54\x84\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x68\x00\x00\x00\x00\x00\x00\x4e\xd8\x5d\x6a\x00\x00\x00\x00\x00\x00\x5d\x5c\x00\x00\x5d\x6b\x53\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x69\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x97\x00\x00\x57\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x5c\x57\x55\x00\x00\x00\x00\x00\x00\x5d\x6d\x00\x00\x00\x00\x5d\x67\x4a\x45", /* 5080 */ "\x50\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xb4\x00\x00\x00\x00\x50\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x48\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xf5\x00\x00\x5d\x6e\x00\x00\x5d\x6f\x4a\xa1\x5d\x70\x00\x00\x00\x00\x4a\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x71\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x72\x00\x00\x00\x00\x00\x00\x51\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x76\x55\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x75\x5d\x74\x5d\x77\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7b\x00\x00\x4f\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xa6\x00\x00\x00\x00\x00\x00\x00\x00", /* 5100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x73\x5d\x78\x00\x00\x00\x00\x00\x00\x5d\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xf8\x5c\xa2\x5a\xc9\x00\x00\x5a\xa9\x58\xd5\x4a\x85\x5b\x77\x00\x00\x58\x68\x4d\x83\x00\x00\x50\x6b\x00\x00\x52\x83\x00\x00\x00\x00\x00\x00\x4b\xd1\x00\x00\x00\x00\x57\x63\x5d\x8f\x5d\x91\x00\x00\x00\x00\x00\x00\x4b\x53\x00\x00\x4b\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xa3\x00\x00\x00\x00\x54\xea\x00\x00\x00\x00\x54\xaa\x00\x00\x00\x00\x48\xca\x4d\x4b\x51\x9a\x5d\x83\x00\x00\x50\xbb\x4d\x52\x00\x00\x4d\x78\x58\xca\x49\x99\x53\xe3\x4f\xde\x4b\x85\x5c\x68\x00\x00\x59\x99\x4e\xe5\x55\xdd\x00\x00\x00\x00", /* 5180 */ "\x4e\xbc\x5d\x87\x5c\xe6\x00\x00\x00\x00\x52\xd9\x00\x00\x00\x00\x4c\xd3\x54\xbc\x00\x00\x00\x00\x49\xe0\x5a\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x52\x50\x00\x00\x00\x00\x52\x82\x5d\xa1\x54\xde\x00\x00\x58\xb3\x00\x00\x4f\xfb\x53\x49\x00\x00\x00\x00\x00\x00\x4d\x7a\x00\x00\x5d\xa2\x00\x00\x5a\xa8\x5d\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x9c\x4b\xab\x00\x00\x00\x00\x4c\x8c\x49\x9a\x5d\x9d\x4a\x86\x4f\xf5\x00\x00\x50\x97\x59\xb0\x50\xe3\x00\x00\x00\x00\x00\x00\x4b\xb2\x5d\x9f\x5d\x9e\x00\x00\x00\x00\x4f\xba\x00\x00\x00\x00\x00\x00\x53\xdf\x00\x00\x5c\x5c\x5d\xa0\x00\x00\x51\x59\x00\x00\x4b\x93\x51\x89\x00\x00\x00\x00\x4e\xf4\x00\x00\x4a\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x7d\x00\x00\x52\xfc\x00\x00\x00\x00\x4e\xb7\x4c\x52\x00\x00\x00\x00\x4c\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x8d\x00\x00\x53\xbd\x00\x00\x50\x4d\x4e\x6b\x00\x00\x00\x00\x4b\x6a\x00\x00\x5e\x69\x58\xd6\x00\x00\x57\x59\x48\xbb\x4a\x97\x4e\x98\x5e\x6a\x4d\xae\x00\x00\x5a\xe3", /* 5200 */ "\x4b\x56\x4b\x94\x5c\xd5\x54\xcf\x00\x00\x00\x00\x4c\x76\x54\x70\x5c\xd6\x00\x00\x50\x4f\x00\x00\x00\x00\x5e\x5b\x5c\xd7\x00\x00\x00\x00\x58\xcb\x4e\x4e\x00\x00\x00\x00\x00\x00\x66\x5e\x51\x70\x51\x96\x5a\xf1\x4c\xd4\x4a\xb3\x00\x00\x4a\x96\x00\x00\x00\x00\x55\x5e\x00\x00\x00\x00\x00\x00\x53\x70\x00\x00\x00\x00\x00\x00\x53\x79\x50\xfa\x00\x00\x49\x91\x00\x00\x5c\xd8\x4d\x6e\x00\x00\x4b\x5d\x00\x00\x00\x00\x5c\xd9\x00\x00\x00\x00\x5b\xc5\x56\x42\x54\xae\x55\x52\x4a\xcb\x50\x6c\x00\x00\x4d\x95\x00\x00\x5c\xda\x5c\xdb\x4b\xe6\x4e\xc0\x56\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x98\x00\x00\x5c\xdc\x54\x50\x00\x00\x00\x00\x4d\x70\x4f\x43\x00\x00\x00\x00\x56\xdd\x00\x00\x53\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xdf\x00\x00\x5c\xdd\x00\x00\x00\x00\x5c\xde\x00\x00\x00\x00\x00\x00\x48\xfd\x00\x00\x4f\xe6\x00\x00\x55\xa2\x4e\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xb0\x00\x00\x00\x00\x4c\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xe1\x00\x00\x4f\x6b", /* 5280 */ "\x00\x00\x5c\xe3\x5c\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xe4\x00\x00\x00\x00\x5c\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x46\x00\x00\x54\xaf\x48\xeb\x4d\x46\x4e\xd2\x57\xf0\x5e\x5d\x51\x73\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xae\x5b\xf9\x53\x4c\x4f\x79\x5e\x5e\x5e\x5f\x00\x00\x00\x00\x00\x00\x50\xf7\x4f\xa1\x50\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x60\x55\xc5\x00\x00\x00\x00\x00\x00\x49\xa9\x00\x00\x00\x00\x00\x00\x5a\x62\x00\x00\x52\x84\x00\x00\x59\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x62\x00\x00\x50\xd4\x00\x00\x00\x00\x00\x00\x5e\x63\x00\x00\x50\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x54\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x89\x55\x77\x00\x00\x00\x00\x00\x00\x4d\x54\x57\xef", /* 5300 */ "\x5a\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x48\xfb\x4a\xd1\x00\x00\x58\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x8a\x00\x00\x5f\xca\x5d\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xaf\x4e\x4f\x49\x51\x00\x00\x4a\x77\x5c\xcd\x00\x00\x00\x00\x5a\xd0\x00\x00\x00\x00\x4f\x53\x50\x90\x00\x00\x58\x5b\x00\x00\x00\x00\x5c\xcf\x00\x00\x00\x00\x00\x00\x4c\x6b\x00\x00\x00\x00\x00\x00\x5c\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xa4\x54\x99\x59\xbc\x00\x00\x00\x00\x5c\xd1\x52\xe3\x00\x00\x55\xad\x00\x00\x54\x47\x00\x00\x5c\xa5\x00\x00\x55\x9e\x57\xe6\x4e\x7c\x48\xea\x00\x00\x00\x00\x00\x00\x4e\x4a\x58\xac\x00\x00\x49\x50\x5c\x85\x5c\x5f\x00\x00\x4b\x45\x51\xf3\x52\xce\x00\x00\x00\x00\x49\xa8\x00\x00\x49\xb6\x00\x00\x49\x86\x60\x52\x5b\x5c\x50\x48\x51\xab\x5c\xd4\x51\xb0\x00\x00\x5c\xd3\x57\xd3\x00\x00\x5d\xdf\x00\x00\x57\xbf\x00\x00\x00\x00\x5c\xb3\x52\x4e\x5a\x41\x57\xa2\x00\x00\x4e\xb3\x54\xb3\x51\xd0\x00\x00\x4f\xec\x58\xb5\x00\x00\x5d\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x54\x85", /* 5380 */ "\x00\x00\x00\x00\x4a\x47\x00\x00\x4b\xf1\x56\xfb\x50\xf9\x00\x00\x00\x00\x50\xf6\x00\x00\x59\x59\x59\x82\x5c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xdd\x00\x00\x00\x00\x50\xe4\x00\x00\x4d\xf0\x00\x00\x00\x00\x5c\xc7\x00\x00\x5a\xac\x00\x00\x00\x00\x58\x82\x5c\xc8\x00\x00\x5c\xc9\x58\x63\x00\x00\x4a\x99\x4f\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x54\xa4\x00\x00\x00\x00\x00\x00\x58\x78\x00\x00\x54\xfd\x49\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x76\x49\xe5\x4e\xaf\x5a\x71\x56\x4b\x4c\x54\x00\x00\x00\x00\x00\x00\x4c\x42\x00\x00\x00\x00\x55\xe4\x00\x00\x54\xa0\x55\xdb\x49\x85\x58\xef\x00\x00\x53\x71\x00\x00\x00\x00\x00\x00\x5e\x65\x4b\x9f\x00\x00\x00\x00\x50\x7a\x4d\x65\x4f\xe3\x51\x8e\x00\x00\x60\x56\x60\x55\x5b\xba\x4f\x70\x5b\x79\x48\xc7\x4b\xa2\x50\x69\x56\xa7\x60\x53\x55\xb6\x5a\x72\x00\x00\x5c\xce\x59\xb5\x4d\xc4\x56\x5e\x56\xbd\x00\x00\x60\x57\x4b\x91\x60\x54\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x5a\x96\x00\x00\x4a\x74\x4c\xf6\x00\x00\x60\x5a\x00\x00\x4d\xce\x4e\xa9\x4b\x96\x00\x00\x57\x4c\x52\x9c\x4d\xf2\x50\xf3\x57\x62\x58\x93\x60\x58\x58\x65\x00\x00\x51\xbf\x60\x59\x51\xef\x00\x00\x00\x00\x00\x00\x4f\xfc\x00\x00\x51\x7f\x57\x6c\x59\xf6\x4c\x6d\x60\x61\x00\x00\x60\x64\x00\x00\x00\x00\x4c\x92\x48\xc8\x4b\xd5\x4c\x74\x00\x00\x4d\xab\x56\xfc\x50\x74\x56\x51\x53\xf3\x00\x00\x5b\xa7\x60\x65\x00\x00\x57\xe1\x4a\x53\x00\x00\x00\x00\x57\xfb\x4a\xb4\x00\x00\x57\xc6\x4d\xef\x00\x00\x57\xe0\x00\x00\x59\x5d\x00\x00\x00\x00\x60\x60\x00\x00\x00\x00\x4a\xf3\x00\x00\x4a\x6a\x00\x00\x4c\xe5\x60\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x52\xc4\x00\x00\x60\x5c\x60\x5d\x60\x5e\x53\x5b\x60\x5f\x60\x62\x5a\xb0\x60\x63\x00\x00\x54\x5a\x57\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xd7\x00\x00\x60\x6a\x00\x00\x60\x6f\x00\x00\x5b\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x69\x60\x7a\x57\xb5\x00\x00\x4d\xc6\x60\x6e\x60\x68\x53\x7e\x00\x00\x00\x00\x55\x8c\x4d\xf3\x52\x9d\x00\x00\x00\x00", /* 5480 */ "\x4f\xd6\x00\x00\x60\x66\x00\x00\x60\x6d\x00\x00\x53\x78\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x46\x4d\xcc\x00\x00\x4f\xcb\x5a\x5d\x4c\xbf\x00\x00\x5b\xe3\x00\x00\x60\x67\x4d\x5e\x50\x47\x00\x00\x00\x00\x51\x9d\x60\x6b\x60\x6c\x00\x00\x60\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x7b\x60\x86\x00\x00\x60\x77\x60\x76\x5c\x69\x60\x84\x60\x85\x63\x8c\x59\xa6\x60\x72\x00\x00\x50\x49\x00\x00\x5a\xda\x00\x00\x50\x68\x60\x74\x00\x00\x00\x00\x00\x00\x58\x6c\x00\x00\x00\x00\x60\x7d\x00\x00\x59\x6a\x00\x00\x60\x7e\x48\xa6\x53\xb6\x60\x73\x00\x00\x4d\xe4\x00\x00\x4b\xde\x57\x7b\x4d\x9f\x5a\xd4\x00\x00\x00\x00\x60\x7f\x58\x8d\x48\xa4\x60\x88\x60\x71\x59\x66\x60\x75\x60\x78\x60\x79\x60\x7c\x00\x00\x4e\x49\x00\x00\x60\x81\x60\x82\x00\x00\x60\x83\x60\x87\x60\x89\x5a\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xe6\x53\x56\x60\x8b\x55\x7a\x51\x48\x52\xc3\x00\x00\x00\x00\x50\x7e\x58\x99\x00\x00\x00\x00\x00\x00\x5b\x7c\x60\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xb7\x00\x00\x4d\xde\x60\x8d\x00\x00\x5e\x61", /* 5500 */ "\x00\x00\x59\x85\x00\x00\x00\x00\x00\x00\x00\x00\x56\x95\x4a\xbc\x00\x00\x48\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x92\x56\xc5\x60\x93\x00\x00\x00\x00\x60\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x60\x8c\x00\x00\x60\x90\x60\x91\x4e\x5d\x00\x00\x00\x00\x60\x94\x00\x00\x00\x00\x60\x95\x00\x00\x4e\x43\x00\x00\x55\xda\x57\xa7\x60\xa6\x4a\x4a\x00\x00\x60\xa5\x00\x00\x00\x00\x00\x00\x60\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x60\x9f\x00\x00\x57\x79\x60\x9d\x00\x00\x60\x9b\x00\x00\x50\x70\x5c\x64\x00\x00\x55\x6c\x00\x00\x00\x00\x60\x99\x48\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x60\x9c\x60\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x68\x00\x00\x00\x00\x53\xa0\x55\x56\x50\xb1\x60\x96\x00\x00\x00\x00\x53\x5e\x00\x00\x5c\xc3\x60\x9a\x52\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xa2\x60\xa3\x60\xa4\x58\xa4\x00\x00\x00\x00\x60\xb3\x56\xe3\x00\x00\x60\xb0\x00\x00", /* 5580 */ "\x50\x46\x60\xae\x57\xb8\x60\xaa\x55\x66\x00\x00\x00\x00\x50\xad\x60\xad\x4d\xec\x4d\xaf\x60\xa8\x00\x00\x00\x00\x00\x00\x60\x97\x00\x00\x60\xb2\x00\x00\x00\x00\x60\xb7\x00\x00\x00\x00\x00\x00\x4a\xac\x60\xb8\x00\x00\x00\x00\x58\x52\x4d\xc7\x00\x00\x60\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xab\x00\x00\x5a\xfa\x00\x00\x60\x98\x00\x00\x53\x88\x00\x00\x60\xac\x00\x00\x5a\x98\x00\x00\x60\xb5\x60\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xc3\x58\xe0\x00\x00\x00\x00\x00\x00\x60\xbb\x00\x00\x00\x00\x60\xc8\x60\xc9\x00\x00\x00\x00\x00\x00\x60\xbd\x60\xa9\x55\x44\x60\xc0\x00\x00\x60\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xc7\x60\xc2\x00\x00\x60\xb4\x00\x00\x57\xca\x00\x00\x56\x63\x60\xcc\x60\xc5\x60\xc1\x00\x00\x60\xca\x00\x00\x60\xb9\x60\xbe\x60\xbf\x00\x00\x00\x00\x60\xc4\x00\x00\x00\x00\x60\xc6\x60\xc7\x00\x00\x60\xcb\x00\x00\x60\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x74\x60\xd4\x00\x00", /* 5600 */ "\x60\xd5\x60\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xcf\x4e\xcd\x00\x00\x00\x00\x60\xd0\x00\x00\x4c\xc1\x5c\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xe9\x00\x00\x00\x00\x51\xee\x00\x00\x00\x00\x60\xce\x60\xbc\x00\x00\x00\x00\x00\x00\x60\xd3\x60\xd2\x00\x00\x00\x00\x60\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x60\xdb\x60\xd7\x00\x00\x00\x00\x00\x00\x5b\xf5\x4a\x50\x00\x00\x5c\x8d\x00\x00\x56\x5b\x00\x00\x00\x00\x60\xd9\x00\x00\x57\xfa\x00\x00\x00\x00\x00\x00\x4d\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe0\x60\xdc\x59\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe1\x00\x00\x00\x00\x60\xda\x60\xd8\x60\xde\x00\x00\x00\x00\x60\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xdd\x00\x00\x60\xe3\x00\x00\x00\x00\x00\x00\x53\xf6\x5c\xab\x5a\xea\x60\xe5\x55\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe6\x60\xe7\x00\x00\x00\x00\x00\x00", /* 5680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe8\x60\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xbe\x56\xe6\x00\x00\x00\x00\x00\x00\x60\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xeb\x00\x00\x00\x00\x60\xec\x00\x00\x00\x00\x54\x95\x56\x64\x00\x00\x60\xed\x4e\x78\x5c\xb5\x59\xf1\x60\xee\x57\x65\x00\x00\x4b\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xf0\x00\x00\x5a\xaf\x00\x00\x00\x00\x50\xa6\x4a\xd0\x00\x00\x00\x00\x57\xa6\x60\xef\x00\x00\x00\x00\x00\x00\x60\xf1\x4d\x6c\x00\x00\x00\x00\x4d\x9b\x57\x5c\x60\xf2", /* 5700 */ "\x00\x00\x00\x00\x00\x00\x53\xd3\x60\xf3\x00\x00\x5a\xb1\x00\x00\x54\xa5\x60\xf5\x60\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xf6\x00\x00\x00\x00\x57\x61\x00\x00\x00\x00\x00\x00\x55\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xd9\x5e\x77\x5e\x79\x00\x00\x5e\x78\x4d\x88\x5e\x7c\x5e\x7d\x4b\x78\x00\x00\x00\x00\x5e\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x7b\x4a\x41\x5e\x7f\x00\x00\x00\x00\x4e\x99\x00\x00\x5b\xb6\x00\x00\x5e\x81\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xf8\x00\x00\x00\x00\x4c\x5b\x00\x00\x5e\x70\x56\xad\x50\x52\x4e\x55\x5c\x99\x50\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x8a\x00\x00\x00\x00\x4e\xe0\x56\xb2\x5e\x7e\x48\xd2\x57\xea\x4c\x78\x5c\x59\x53\xc1\x00\x00\x00\x00\x50\xa3\x00\x00\x56\xb8\x00\x00\x5e\x88\x5e\x82\x53\xb9\x5e\x84\x00\x00\x5e\x89\x00\x00\x53\x98\x00\x00\x00\x00\x00\x00\x5e\x8b\x00\x00\x00\x00\x5e\x8a\x50\x60\x00\x00\x00\x00\x00\x00\x5e\x87\x5e\x86\x00\x00\x00\x00\x00\x00", /* 5780 */ "\x00\x00\x00\x00\x4a\xb8\x50\xab\x51\xa1\x5e\x83\x5e\x85\x00\x00\x00\x00\x00\x00\x00\x00\x58\xcc\x5e\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xdc\x5e\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x94\x5e\x72\x4d\x58\x5a\xaa\x5e\x8d\x00\x00\x50\x71\x5e\x91\x00\x00\x5e\x71\x00\x00\x4b\x87\x00\x00\x5e\x8c\x50\x86\x00\x00\x00\x00\x00\x00\x5e\x8f\x00\x00\x5e\x92\x00\x00\x00\x00\x00\x00\x5e\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x41\x48\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xf0\x00\x00\x00\x00\x4a\x67\x5e\x90\x00\x00\x00\x00\x5e\x99\x00\x00\x53\xd1\x5e\x95\x00\x00\x00\x00\x5e\x96\x5e\x98\x5e\x97\x00\x00\x00\x00\x5e\x9f\x00\x00\x5a\x93\x49\xb9\x00\x00\x00\x00\x00\x00\x5e\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xa3\x00\x00\x5e\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x9b\x00\x00\x00\x00\x00\x00\x5e\x9d\x53\x81\x4e\x9a\x00\x00\x00\x00\x5e\xa2\x00\x00\x00\x00", /* 5800 */ "\x5e\xa4\x00\x00\x56\xc2\x00\x00\x00\x00\x00\x00\x4b\xd0\x5f\x60\x00\x00\x00\x00\x00\x00\x5e\xa0\x00\x00\x5e\xa1\x00\x00\x00\x00\x00\x00\x54\x55\x00\x00\x00\x00\x00\x00\x4b\xe8\x00\x00\x00\x00\x00\x00\x5e\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xa5\x00\x00\x5e\xa8\x49\x44\x00\x00\x00\x00\x4b\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x9b\x66\x94\x00\x00\x00\x00\x00\x00\x56\x7c\x00\x00\x00\x00\x56\x9f\x00\x00\x00\x00\x00\x00\x56\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xed\x5e\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x73\x00\x00", /* 5880 */ "\x5e\xae\x5e\xab\x00\x00\x4f\xb2\x00\x00\x55\xfa\x00\x00\x00\x00\x00\x00\x5e\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x6a\x52\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x5d\x5e\xad\x00\x00\x00\x00\x00\x00\x5a\xf5\x58\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xaa\x4b\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x74\x00\x00\x00\x00\x00\x00\x00\x00\x49\x7a\x00\x00\x00\x00\x00\x00\x5e\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x76\x00\x00\x00\x00\x00\x00\x4d\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xbe\x54\xc8\x00\x00\x5c\x53\x00\x00\x55\x9a\x00\x00\x00\x00\x50\x67\x00\x00\x00\x00\x4d\xf7\x00\x00\x00\x00\x59\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x61\xb9\x00\x00\x4a\xa5\x00\x00\x00\x00\x49\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xb3\x00\x00\x58\x64\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x88\x58\x46\x57\x83\x00\x00\x00\x00\x5d\x8e\x4b\xdf\x00\x00\x59\xb8\x00\x00\x00\x00\x4d\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb8\x61\xb6\x00\x00\x4a\xf2\x00\x00\x56\xeb\x56\xaa\x4c\x93\x00\x00\x5c\xb1\x59\x8c\x4d\xba\x00\x00\x55\xa6\x00\x00\x00\x00\x57\x57\x00\x00\x00\x00\x59\xc3\x50\x85\x4e\xcf\x4b\xe0\x00\x00\x5f\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xc5\x5e\x5c\x00\x00\x59\x79\x00\x00\x00\x00\x53\xe5\x52\xcd\x4c\x8f\x00\x00\x4c\x7c\x00\x00\x00\x00\x50\x9d\x5c\x81\x00\x00\x53\xf4\x00\x00\x00\x00\x49\x5c\x5f\xc7\x4f\x51\x56\xd6\x5f\xc9\x00\x00\x5f\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x8d\x00\x00\x55\x7d\x00\x00\x00\x00\x48\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x4e\x53\x4b\x00\x00\x52\xcb\x00\x00\x4e\xe8\x56\x9e\x00\x00\x00\x00\x00\x00\x4d\xc2\x00\x00\x00\x00", /* 5980 */ "\x00\x00\x63\x9a\x54\xe6\x63\x9b\x57\x9e\x00\x00\x5c\x51\x4c\xbd\x51\xe7\x00\x00\x54\xd0\x00\x00\x00\x00\x63\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xc9\x4e\xca\x00\x00\x00\x00\x59\x9e\x63\xa0\x00\x00\x52\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x63\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x63\x9f\x63\xa4\x57\x77\x00\x00\x00\x00\x4c\x61\x63\x9d\x63\x9e\x63\xa2\x00\x00\x00\x00\x52\xdc\x63\xa7\x00\x00\x00\x00\x63\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x63\x00\x00\x53\xdd\x00\x00\x00\x00\x63\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xb6\x00\x00\x00\x00\x00\x00\x63\xa1\x55\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x84\x4d\x63\x63\xa5\x58\xd4\x57\xae\x00\x00\x00\x00\x63\xa8\x63\xaf\x00\x00\x59\xa5\x00\x00\x4f\x4a\x63\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xae\x00\x00\x50\xd0\x00\x00\x00\x00\x59\xcb\x00\x00\x00\x00\x00\x00\x4e\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xb0\x00\x00\x59\xf5\x00\x00\x00\x00\x00\x00\x5c\x6b", /* 5a00 */ "\x00\x00\x57\x9f\x00\x00\x57\x7e\x51\xa5\x63\xaa\x63\xab\x4f\x5f\x63\xad\x63\xb2\x00\x00\x00\x00\x63\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x63\xb5\x00\x00\x63\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x52\xee\x00\x00\x00\x00\x00\x00\x52\xc7\x00\x00\x00\x00\x4f\xe9\x55\x90\x00\x00\x00\x00\x63\xb6\x00\x00\x4b\xef\x00\x00\x00\x00\x00\x00\x52\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x8a\x63\xb3\x00\x00\x63\xb4\x00\x00\x54\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xbc\x00\x00\x00\x00\x00\x00\x63\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xc4\x00\x00\x00\x00\x57\x92\x63\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x63\xb9\x00\x00\x00\x00\x50\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x44\x63\xbe\x55\x95\x63\xc2\x00\x00\x00\x00\x63\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x58\xf5", /* 5a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x64\x63\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xc6\x58\x51\x00\x00\x66\x95\x00\x00\x00\x00\x63\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xc4\x00\x00\x00\x00\x4e\xdd\x55\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xb4\x00\x00\x00\x00\x58\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xc7\x00\x00\x63\xc8\x00\x00\x63\xcd\x00\x00\x63\xcf\x00\x00\x00\x00\x00\x00\x63\xd0\x00\x00\x00\x00\x00\x00\x63\xca\x4b\x75\x00\x00\x63\xcb\x00\x00\x00\x00\x63\xce\x00\x00\x00\x00\x52\xda\x00\x00\x63\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xd3\x63\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xd4\x00\x00\x5d\x99\x00\x00\x00\x00\x63\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x73\x63\xdc\x00\x00\x63\xdd\x50\x77\x5a\xcf\x00\x00\x5c\x76\x4a\xe5\x56\x90\x63\xd9\x5c\xc2\x5c\x6e\x58\xa1\x00\x00\x52\x6f\x00\x00\x00\x00\x63\xde\x4e\xbd\x4d\x62\x63\xda\x59\x47\x00\x00\x00\x00\x4d\xa1\x51\xce\x00\x00\x5c\xaa\x00\x00\x00\x00\x00\x00\x55\xea\x63\x8f\x00\x00\x63\xdb\x00\x00\x4c\x96\x00\x00\x00\x00\x00\x00\x00\x00\x54\xe5\x00\x00\x00\x00\x52\xf4\x00\x00\x00\x00", /* 5b80 */ "\x63\x52\x52\xfd\x00\x00\x56\x9d\x63\x53\x5b\x4c\x00\x00\x5a\x8f\x55\xd7\x48\xb1\x00\x00\x56\x6e\x57\x8b\x00\x00\x00\x00\x4d\xe9\x00\x00\x00\x00\x00\x00\x63\x55\x00\x00\x63\x54\x00\x00\x5c\x7a\x4d\x79\x5b\xe5\x4b\xa7\x57\x91\x59\xca\x49\x46\x55\xb4\x00\x00\x4a\x89\x55\x94\x50\x6d\x58\xfa\x55\xd1\x63\x56\x4e\x62\x00\x00\x00\x00\x00\x00\x58\x7c\x4d\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xd6\x00\x00\x00\x00\x4d\xa5\x59\x88\x58\x9d\x4e\xd1\x00\x00\x63\x57\x54\xdc\x00\x00\x00\x00\x00\x00\x50\x8e\x49\x97\x56\x7e\x00\x00\x00\x00\x4e\xc4\x00\x00\x4e\xc3\x59\xf9\x52\x7c\x50\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xba\x00\x00\x00\x00\x00\x00\x52\x62\x00\x00\x4d\xad\x5a\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x7e\x52\xae\x49\xeb\x00\x00\x4d\x71\x00\x00\x00\x00\x63\x5b\x51\x68\x00\x00\x00\x00\x5b\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x5c\x00\x00\x63\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xe6\x4b\xd3\x56\x62\x59\x50\x4b\x5c\x00\x00\x00\x00\x55\xd8", /* 5c00 */ "\x00\x00\x4c\x83\x00\x00\x00\x00\x55\x85\x00\x00\x4f\x4b\x00\x00\x00\x00\x57\xbd\x5c\x91\x00\x00\x00\x00\x00\x00\x00\x00\x58\xa0\x00\x00\x55\x79\x00\x00\x00\x00\x4b\xfa\x63\xd7\x4e\xe1\x00\x00\x4a\x5e\x00\x00\x55\x70\x00\x00\x63\xd8\x4a\x42\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xcb\x00\x00\x5a\x68\x5f\xcc\x00\x00\x59\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xcc\x00\x00\x00\x00\x5f\xce\x00\x00\x00\x00\x00\x00\x55\xab\x59\xfb\x4a\x7f\x63\x8b\x52\xe0\x4f\xa0\x57\xb1\x52\xf1\x4f\xd5\x53\xa7\x49\xe2\x00\x00\x00\x00\x4f\xd2\x00\x00\x00\x00\x54\x9d\x56\xea\x4f\x8d\x57\xdc\x00\x00\x00\x00\x55\xb9\x53\xc0\x63\x8d\x58\xbb\x00\x00\x00\x00\x00\x00\x5b\x59\x00\x00\x00\x00\x00\x00\x63\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x55\xf3\x00\x00\x57\x60\x51\xc4\x00\x00\x63\x90\x00\x00\x51\xc3\x63\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x99\x57\x6d\x00\x00\x55\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xd8\x61\x48\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x8d", /* 5c80 */ "\x00\x00\x56\x8b\x53\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x4c\x00\x00\x00\x00\x00\x00\x61\x47\x61\x49\x00\x00\x00\x00\x61\x4a\x61\x4f\x00\x00\x00\x00\x49\xec\x00\x00\x61\x4b\x4c\xd9\x61\x4d\x61\x4e\x61\x50\x4b\x5a\x61\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x53\x61\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x72\x00\x00\x61\x56\x61\x55\x51\x8c\x00\x00\x00\x00\x00\x00\x61\x57\x00\x00\x5a\xbf\x00\x00\x61\x52\x00\x00\x61\x5a\x48\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x61\x54\x00\x00\x50\x9a\x00\x00\x61\x59\x00\x00\x00\x00\x61\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x5f\x00\x00\x00\x00\x61\x5d\x61\x5f\x51\xcc\x00\x00\x4b\xea\x00\x00\x5a\x99\x00\x00\x00\x00\x54\x6d\x00\x00\x00\x00\x4c\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xfd\x00\x00\x00\x00\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x61\x60\x61\x61\x00\x00\x00\x00\x61\x67\x4a\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xdd\x00\x00\x59\x62\x00\x00\x00\x00\x00\x00\x00\x00\x61\x68\x00\x00\x00\x00\x61\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x65\x00\x00\x61\x63\x61\x62\x00\x00\x49\x60\x00\x00\x00\x00\x00\x00\x5b\x58\x61\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x6c\x61\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x9b\x00\x00\x00\x00\x61\x73\x61\x72\x54\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x69\x00\x00\x00\x00\x61\x6e\x00\x00\x61\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x74\x00\x00\x61\x71\x61\x6d\x00\x00\x00\x00\x61\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x61\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5d80 */ "\x00\x00\x00\x00\x61\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x77\x00\x00\x00\x00\x00\x00\x61\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7d\x00\x00\x4a\xa7\x5b\xdc\x00\x00\x00\x00\x59\x52\x4a\x52\x00\x00\x00\x00\x4d\x44\x5c\x94\x54\x69\x4f\xdd\x4d\x4e\x00\x00\x57\xd6\x00\x00\x00\x00\x49\xed\x5e\x6f\x00\x00\x4e\xb9\x59\xd0\x56\x68\x48\xcc\x00\x00\x00\x00\x58\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x84\x4f\x8e\x00\x00", /* 5e00 */ "\x00\x00\x49\x72\x55\xcf\x49\xbb\x00\x00\x56\x47\x4c\x4b\x00\x00\x55\xa5\x00\x00\x00\x00\x00\x00\x58\x43\x00\x00\x00\x00\x60\xf7\x5b\x6a\x60\xfa\x00\x00\x00\x00\x60\xf9\x53\x61\x56\xfa\x00\x00\x51\x51\x60\xf8\x5b\xe2\x49\xae\x5b\xc3\x4b\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xf7\x5b\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x4f\x48\xee\x00\x00\x00\x00\x60\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x41\x4a\x43\x00\x00\x00\x00\x60\xfc\x60\xfd\x52\x51\x00\x00\x00\x00\x00\x00\x00\x00\x52\x7d\x00\x00\x61\x42\x4c\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x43\x52\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x44\x00\x00\x00\x00\x61\x45\x00\x00\x00\x00\x61\x46\x4a\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xc8\x53\xbc\x52\xe9\x00\x00\x49\xa1\x00\x00\x58\xd1\x00\x00\x64\x7b\x4e\x63\x5a\x77\x5a\x64\x00\x00\x4d\x84", /* 5e80 */ "\x61\xce\x00\x00\x00\x00\x00\x00\x5c\x4f\x00\x00\x54\x8d\x49\x73\x00\x00\x00\x00\x4a\xb1\x61\xd0\x00\x00\x00\x00\x00\x00\x58\xf1\x51\xad\x61\xcf\x00\x00\x50\x83\x5a\x46\x4b\x77\x61\xd1\x4b\x8b\x00\x00\x52\x8e\x4c\xfc\x00\x00\x4c\xad\x00\x00\x53\x73\x4c\x6f\x61\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x61\xd2\x4b\xc7\x5c\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xd7\x00\x00\x61\xd5\x55\xfb\x50\x55\x5a\x59\x61\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x61\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x4e\x50\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xda\x61\xd9\x50\xa9\x00\x00\x00\x00\x51\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x61\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xdc\x00\x00\x61\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x68\x00\x00\x59\x73\x57\x42\x00\x00\x00\x00\x4f\x48\x00\x00\x00\x00\x00\x00\x5f\xc2\x5c\xa4", /* 5f00 */ "\x50\x4a\x5e\x6d\x59\xeb\x53\xf9\x53\x4a\x00\x00\x00\x00\x00\x00\x5f\xc3\x00\x00\x49\x77\x60\x4e\x00\x00\x00\x00\x00\x00\x55\xbc\x00\x00\x60\x51\x00\x00\x4d\x4d\x00\x00\x59\xfc\x00\x00\x4c\xa4\x4d\xea\x00\x00\x00\x00\x4a\x7a\x00\x00\x00\x00\x00\x00\x4b\x7c\x5b\x65\x00\x00\x00\x00\x00\x00\x00\x00\x52\x76\x58\x72\x4e\x41\x00\x00\x63\x94\x63\x93\x00\x00\x00\x00\x63\x95\x00\x00\x57\x85\x00\x00\x54\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x4f\x54\x5f\x00\x00\x63\x97\x00\x00\x00\x00\x00\x00\x66\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x87\x00\x00\x4d\x8a\x4b\x51\x00\x00\x51\xbb\x63\x89\x63\x88\x63\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x59\xcc\x00\x00\x00\x00\x00\x00\x61\x8b\x58\xcd\x00\x00\x57\x4e\x00\x00\x59\x86\x00\x00\x00\x00\x49\xc9\x49\x8c\x00\x00\x49\x93\x53\x8e\x00\x00\x00\x00\x5b\x63\x5a\x50\x00\x00\x61\x7c\x00\x00\x00\x00\x00\x00\x61\x7d\x00\x00\x59\xda\x00\x00\x4a\x59\x49\x6b\x00\x00\x00\x00\x00\x00", /* 5f80 */ "\x57\x9a\x5b\x98\x61\x7e\x00\x00\x4f\xb5\x4a\xfc\x00\x00\x61\x7f\x4d\xdb\x61\x81\x4e\x52\x51\xc8\x61\x82\x00\x00\x00\x00\x00\x00\x58\xeb\x00\x00\x57\x5d\x00\x00\x00\x00\x61\x83\x00\x00\x4b\x63\x53\x67\x61\x84\x00\x00\x00\x00\x61\x85\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x86\x00\x00\x59\x4d\x00\x00\x00\x00\x61\x87\x57\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x88\x00\x00\x4b\x62\x00\x00\x00\x00\x00\x00\x00\x00\x61\x89\x4e\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xc3\x61\xdf\x49\x78\x59\xe3\x00\x00\x00\x00\x61\xe0\x00\x00\x00\x00\x4e\xc8\x54\xcb\x00\x00\x61\xe2\x66\xfd\x66\xfc\x60\x4f\x00\x00\x00\x00\x00\x00\x61\xe1\x5b\xbd\x57\x9d\x52\x46\x00\x00\x00\x00\x00\x00\x62\x63\x00\x00\x00\x00\x5b\xd1\x61\xe6\x00\x00\x00\x00\x61\xe7\x00\x00\x00\x00\x5a\x67\x00\x00\x00\x00\x61\xeb\x50\x8d\x00\x00\x61\xec\x61\xe4\x00\x00\x00\x00\x4a\x60\x00\x00\x00\x00\x00\x00\x52\xed\x00\x00\x00\x00\x61\xed\x00\x00\x00\x00\x58\xc2\x00\x00\x4d\xf5\x61\xe8\x4c\x7e", /* 6000 */ "\x4e\x53\x56\xab\x56\x6b\x61\xe3\x61\xe5\x61\xe9\x61\xea\x00\x00\x00\x00\x00\x00\x61\xf6\x00\x00\x00\x00\x61\xf3\x5a\xf4\x61\xf2\x00\x00\x00\x00\x53\x4d\x00\x00\x5b\x9b\x53\x62\x49\xbf\x00\x00\x00\x00\x61\xee\x00\x00\x61\xf1\x51\x4f\x56\x5c\x00\x00\x00\x00\x4b\x41\x61\xf8\x00\x00\x00\x00\x00\x00\x4e\xb0\x61\xf0\x58\xd3\x5a\xb8\x61\xf4\x4d\x76\x61\xf5\x00\x00\x00\x00\x00\x00\x54\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x7c\x67\x41\x00\x00\x00\x00\x61\xf7\x00\x00\x67\x45\x61\xfd\x55\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x55\x00\x00\x4e\x70\x00\x00\x00\x00\x50\x76\x00\x00\x4d\xe2\x00\x00\x00\x00\x56\x41\x00\x00\x00\x00\x00\x00\x67\x46\x67\x43\x00\x00\x00\x00\x67\x42\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x76\x67\x47\x58\xf3\x00\x00\x00\x00\x67\x44\x4d\xdd\x4b\xf6\x62\x41\x4b\xb1\x56\xf0\x4d\x47\x00\x00\x58\x42\x54\x41\x00\x00\x00\x00\x50\x72\x00\x00\x00\x00\x4b\xf0\x00\x00\x61\xf9\x61\xfa\x61\xfc\x61\xfb\x52\xd4\x62\x42\x00\x00\x5a\x61", /* 6080 */ "\x00\x00\x00\x00\x00\x00\x62\x47\x54\x64\x00\x00\x00\x00\x00\x00\x00\x00\x58\x44\x00\x00\x00\x00\x62\x49\x4d\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x62\x48\x00\x00\x4e\x7a\x00\x00\x62\x43\x00\x00\x00\x00\x00\x00\x62\x44\x62\x4a\x00\x00\x62\x46\x00\x00\x57\xf1\x5a\x66\x00\x00\x00\x00\x4e\x5c\x00\x00\x00\x00\x5a\xc2\x00\x00\x52\xf9\x00\x00\x00\x00\x67\x48\x58\xfb\x62\x45\x00\x00\x52\x96\x00\x00\x62\x4d\x49\x4f\x00\x00\x62\x52\x00\x00\x00\x00\x00\x00\x4e\xc1\x00\x00\x00\x00\x62\x4c\x4b\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x8a\x62\x50\x00\x00\x00\x00\x00\x00\x4f\xa9\x57\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x94\x00\x00\x00\x00\x00\x00\x56\xe7\x00\x00\x00\x00\x62\x4f\x00\x00\x62\x51\x00\x00\x58\x47\x62\x4e\x00\x00\x57\xa8\x4e\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x8c\x4f\xe4\x49\xd1\x4a\x6d\x00\x00\x49\x59\x62\x4b\x49\xd0\x4b\x4c\x4d\x7f\x4b\xe7\x00\x00\x00\x00\x58\x8c\x62\x57\x00\x00\x4e\x6c\x00\x00\x00\x00\x54\xc6\x58\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6100 */ "\x62\x58\x4a\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x67\x49\x00\x00\x5a\x9b\x5a\x85\x00\x00\x00\x00\x00\x00\x67\x4a\x62\x59\x59\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x55\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xcf\x62\x53\x00\x00\x00\x00\x62\x56\x4c\x7f\x00\x00\x62\x54\x50\xa1\x00\x00\x00\x00\x00\x00\x62\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xc7\x00\x00\x62\x5b\x00\x00\x4e\x65\x00\x00\x55\x98\x00\x00\x00\x00\x55\x86\x00\x00\x00\x00\x00\x00\x52\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x51\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x7b\x50\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5c\x00\x00\x50\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x90\x00\x00\x00\x00\x5a\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5f\x4d\xa8\x67\x4c\x00\x00\x00\x00\x62\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xb5\x00\x00\x00\x00\x00\x00\x4b\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xb7\x00\x00\x48\xc2\x67\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x4f\x50\xc0\x00\x00\x62\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xb1", /* 6200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x50\x00\x00\x4c\xe9\x00\x00\x57\xeb\x65\xa6\x58\xe6\x55\xf8\x54\xd5\x58\x57\x4a\x69\x57\xd1\x4f\x85\x00\x00\x00\x00\x62\x7e\x4e\x93\x65\xa7\x5b\x5d\x00\x00\x53\xdc\x65\xa8\x00\x00\x00\x00\x00\x00\x65\xa9\x00\x00\x65\xab\x65\xaa\x00\x00\x65\xad\x65\xac\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x78\x00\x00\x65\xae\x00\x00\x51\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xc0\x4a\xf6\x00\x00\x00\x00\x4e\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xe5\x66\xe4\x4c\x5f\x56\x9a\x49\x83\x00\x00\x66\xe6\x00\x00\x00\x00\x00\x00\x55\x68\x66\xe7\x66\xe8\x00\x00\x55\xd5\x5f\xcf\x49\xc4\x5a\xf9\x00\x00\x00\x00\x53\xca\x48\xc6\x4a\xf1\x54\xd2\x00\x00\x00\x00\x00\x00\x57\x70\x00\x00\x00\x00\x50\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7b\x00\x00\x00\x00\x54\x44\x5b\xb3\x00\x00\x50\xa8\x5f\xd0\x55\x48\x59\x90\x53\x44\x48\xe6\x4a\x56\x54\xc4\x00\x00\x00\x00\x48\xe1\x00\x00\x00\x00\x4c\x97\x00\x00\x00\x00\x53\x9b\x00\x00\x00\x00\x4b\xf2\x00\x00\x5b\x72\x4a\x70", /* 6280 */ "\x4e\xbb\x00\x00\x00\x00\x00\x00\x4a\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xf0\x48\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xd5\x55\xe2\x5c\x45\x00\x00\x57\x56\x4b\xb5\x50\x59\x5b\x7b\x00\x00\x4c\xa6\x53\x77\x00\x00\x00\x00\x00\x00\x5f\xd1\x50\x79\x51\xd4\x54\x60\x00\x00\x4e\x44\x49\x48\x00\x00\x00\x00\x53\x8b\x00\x00\x00\x00\x53\x9c\x56\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x49\x47\x00\x00\x00\x00\x00\x00\x4b\x76\x00\x00\x00\x00\x00\x00\x52\xa7\x00\x00\x5f\xd2\x59\x5a\x4a\x8a\x00\x00\x52\x93\x00\x00\x00\x00\x4c\x98\x00\x00\x5b\xf3\x4b\x43\x49\xef\x52\xb3\x52\xe8\x50\xac\x5f\xd3\x00\x00\x48\xe7\x53\x64\x51\x81\x00\x00\x4d\x75\x00\x00\x4f\xdb\x57\x78\x48\xcd\x00\x00\x57\x6f\x5f\xd5\x4f\xcf\x5c\x5e\x5f\xd4\x5b\x70\x48\xdc\x00\x00\x00\x00\x52\xe1\x00\x00\x00\x00\x51\xa2\x4e\xef\x00\x00\x5a\x55\x50\xb8\x53\x41\x49\xa5\x5a\xf0\x00\x00\x00\x00\x50\xa7\x55\xc2\x5f\xd6\x5b\x9d\x00\x00\x4d\x50\x00\x00\x54\xac\x56\x49\x00\x00\x5f\xd8\x50\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x53\xb3\x5c\x47\x55\xaf\x52\xc2", /* 6300 */ "\x00\x00\x4a\x76\x4d\x72\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xb7\x65\xfb\x48\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x50\x87\x00\x00\x00\x00\x56\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x57\x7a\x00\x00\x00\x00\x00\x00\x5b\xbe\x51\xcd\x00\x00\x57\xcd\x56\xa1\x58\xad\x52\xd2\x4b\x52\x5f\xd7\x5b\x96\x4e\xb6\x4e\x73\x00\x00\x00\x00\x48\xa3\x00\x00\x53\x52\x4a\xeb\x00\x00\x00\x00\x00\x00\x5b\x92\x00\x00\x00\x00\x65\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xd9\x57\x46\x00\x00\x00\x00\x57\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x57\xe5\x5f\xdb\x00\x00\x57\x51\x50\xa5\x00\x00\x00\x00\x5c\x5d\x00\x00\x5f\xda\x48\xc5\x4d\xb3\x55\x73\x52\xf2\x4f\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x49\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xcb\x56\x91\x00\x00\x4e\xf0\x4e\x5b\x4b\x57\x00\x00\x00\x00\x00\x00\x53\x96\x00\x00\x5f\xe5\x00\x00\x00\x00\x00\x00\x5f\xe2\x4f\xdc\x00\x00\x00\x00\x5f\xde\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xb6\x4f\x7d\x00\x00\x00\x00\x5f\xdf\x52\xec\x00\x00\x00\x00\x00\x00\x00\x00", /* 6380 */ "\x58\x66\x00\x00\x4b\x81\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xdd\x55\xd9\x4b\x95\x5f\xe4\x00\x00\x5b\x66\x00\x00\x5f\xe0\x56\xcc\x53\xfd\x00\x00\x53\x65\x00\x00\x00\x00\x00\x00\x59\xb3\x00\x00\x4f\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd2\x00\x00\x56\xbc\x4a\x58\x00\x00\x4f\x73\x00\x00\x50\x78\x57\x66\x59\x7a\x4a\xea\x00\x00\x5f\xe3\x5f\xdc\x5f\xe6\x00\x00\x65\xfd\x00\x00\x00\x00\x51\xaf\x5f\xe1\x00\x00\x00\x00\x5b\xbf\x4b\x47\x00\x00\x49\xf3\x00\x00\x5f\xe7\x00\x00\x5f\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xec\x00\x00\x5f\xf0\x00\x00\x00\x00\x54\xdf\x00\x00\x00\x00\x00\x00\x5c\x82\x5f\xee\x52\x89\x56\xe0\x00\x00\x49\xe4\x00\x00\x00\x00\x00\x00\x59\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xed\x00\x00\x5f\xea\x57\xd4\x00\x00\x4a\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x4b\x4f\xbd\x00\x00\x00\x00\x4f\x72\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xe8\x00\x00\x5a\xad\x00\x00\x5f\xdd\x00\x00\x5f\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x50\xbe\x00\x00\x5f\xeb", /* 6400 */ "\x49\xf2\x4c\xe8\x51\xa6\x00\x00\x00\x00\x4f\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf4\x5f\xf7\x00\x00\x00\x00\x49\xaa\x4a\xa3\x00\x00\x00\x00\x4a\xe9\x55\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf5\x56\x71\x00\x00\x4c\xe2\x00\x00\x5f\xf6\x5f\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xf8\x00\x00\x00\x00\x00\x00\x56\xc1\x00\x00\x48\xe0\x4a\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xae\x00\x00\x00\x00\x49\xea\x00\x00\x66\x41\x00\x00\x5f\xf3\x00\x00\x00\x00\x55\x84\x5f\xf2\x48\xd9\x59\xa0\x49\x98\x00\x00\x56\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xef\x00\x00\x56\x44\x00\x00\x00\x00\x00\x00\x5b\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xdc\x00\x00\x52\xa5\x00\x00\x00\x00\x00\x00\x5f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x9f\x52\xa0\x60\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6480 */ "\x00\x00\x00\x00\x51\x6c\x00\x00\x5f\xfb\x4f\xee\x00\x00\x53\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x65\x54\xf5\x00\x00\x00\x00\x56\x5a\x5f\xfd\x00\x00\x00\x00\x60\x44\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x57\x00\x00\x00\x00\x00\x00\x00\x00\x51\x63\x00\x00\x00\x00\x54\x6b\x49\xa4\x4a\xe8\x00\x00\x5c\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x52\xeb\x00\x00\x60\x42\x60\x43\x00\x00\x60\x45\x00\x00\x4d\xb2\x00\x00\x00\x00\x00\x00\x60\x46\x00\x00\x50\xdd\x00\x00\x00\x00\x55\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xd8\x54\x87\x00\x00\x60\x47\x00\x00\x54\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x60\x48\x66\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x73\x00\x00\x00\x00\x00\x00\x60\x4a\x00\x00\x60\x49\x00\x00\x49\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6500 */ "\x53\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xef\x00\x00\x00\x00\x60\x4d\x5b\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x65\xb6\x66\x56\x55\xd4\x00\x00\x5c\xfb\x4c\xc3\x00\x00\x4d\x45\x00\x00\x00\x00\x4c\x65\x5b\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x6a\x00\x00\x00\x00\x58\xa6\x6a\xcc\x00\x00\x00\x00\x4b\x70\x00\x00\x00\x00\x52\x95\x00\x00\x4f\xc7\x00\x00\x00\x00\x00\x00\x66\x57\x48\xbc\x00\x00\x00\x00\x4f\x6c\x00\x00\x51\x52\x00\x00\x49\x76\x4a\x48\x00\x00\x00\x00\x00\x00\x4c\xd1\x55\x42\x00\x00\x00\x00\x4b\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x66\x58\x4f\xb3\x00\x00\x00\x00\x00\x00\x55\xfc\x00\x00\x54\x63\x00\x00\x5b\x9c\x00\x00\x00\x00\x4c\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc3\x00\x00\x00\x00\x00\x00\x5b\x4b\x49\x94\x00\x00\x00\x00\x00\x00\x66\xb2\x48\xde\x00\x00\x66\xb4\x00\x00\x00\x00\x00\x00\x4b\xb6\x00\x00\x51\x6f\x00\x00\x6b\x9b\x58\xb0\x00\x00\x00\x00\x5b\x86\x00\x00\x57\xd2\x00\x00\x00\x00\x4f\x90\x4a\x83\x00\x00\x4c\xaa\x00\x00\x5b\x56\x00\x00\x67\x5d\x00\x00\x4b\xce\x00\x00\x56\x59\x58\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x5d\x00\x00\x00\x00\x66\xb5\x55\xa8\x00\x00\x00\x00\x00\x00\x53\x74\x00\x00\x66\xb8\x66\xb7\x51\xc2\x66\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x58\xfc\x66\xb9\x00\x00\x66\xba\x5c\x86\x00\x00\x00\x00\x66\xbb\x00\x00\x00\x00\x00\x00\x66\xbc\x53\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xdd\x00\x00\x4e\xc7\x00\x00\x00\x00\x54\xd4\x4b\x49\x4f\xc8\x5b\xbb\x5a\xe6\x00\x00\x00\x00\x59\x4e\x58\xf0\x65\xb7\x65\xb8\x65\xb9\x4d\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x55\xb0\x50\x96\x00\x00\x00\x00\x57\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6600 */ "\x65\xbf\x00\x00\x48\xb9\x65\xbd\x00\x00\x00\x00\x50\xa4\x00\x00\x00\x00\x00\x00\x65\xba\x00\x00\x49\xfc\x00\x00\x52\x98\x4e\x89\x00\x00\x00\x00\x00\x00\x59\xd6\x57\xf3\x65\xbe\x00\x00\x00\x00\x00\x00\x65\xbb\x00\x00\x00\x00\x00\x00\x65\xc2\x00\x00\x58\xc6\x5a\x53\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xb9\x00\x00\x52\x61\x5c\x93\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x71\x00\x00\x55\xc6\x00\x00\x65\xc4\x00\x00\x00\x00\x65\xc3\x65\xc6\x65\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xe6\x00\x00\x58\x74\x00\x00\x00\x00\x65\xca\x00\x00\x4e\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x9b\x55\x6e\x00\x00\x00\x00\x65\xcb\x00\x00\x00\x00\x55\x59\x58\x9f\x65\xc9\x5a\xcd\x65\xcc\x65\xce\x00\x00\x00\x00\x57\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x65\xc8\x00\x00\x65\xcd\x00\x00\x00\x00\x57\xed\x00\x00\x4e\x7e\x00\x00\x4a\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xd4\x4f\xaf\x57\xf9\x00\x00\x00\x00\x00\x00\x54\x88\x00\x00\x4f\xa6\x65\xcf\x00\x00\x00\x00\x5b\xc6\x00\x00\x00\x00\x00\x00\x51\x60\x00\x00", /* 6680 */ "\x00\x00\x00\x00\x5a\xdc\x00\x00\x65\xd0\x00\x00\x00\x00\x58\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x55\xed\x00\x00\x00\x00\x00\x00\x00\x00\x53\x4f\x48\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd2\x6a\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x49\x00\x00\x00\x00\x00\x00\x00\x00\x63\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xee\x00\x00\x65\xd5\x65\xd6\x53\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xd7\x00\x00\x00\x00\x65\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xba\x00\x00\x54\x9b\x59\xb6\x4c\xfb\x00\x00\x00\x00\x65\xc1\x00\x00\x49\xdb\x00\x00\x00\x00\x51\xfb\x00\x00\x5a\xf7\x56\xe5", /* 6700 */ "\x5c\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xc1\x5a\x70\x66\x63\x53\x94\x00\x00\x4c\x9f\x00\x00\x00\x00\x66\x74\x00\x00\x00\x00\x00\x00\x56\x57\x66\x7e\x00\x00\x50\xc9\x00\x00\x00\x00\x00\x00\x57\x9c\x00\x00\x4a\x4f\x00\x00\x53\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x9d\x00\x00\x52\xbd\x00\x00\x57\xb3\x52\xa8\x49\x5e\x5a\xfc\x00\x00\x55\xf4\x00\x00\x5b\xeb\x00\x00\x00\x00\x53\xd2\x4b\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x9b\x00\x00\x00\x00\x58\xdf\x00\x00\x00\x00\x55\x51\x00\x00\x5a\xd2\x54\xa7\x00\x00\x00\x00\x4c\xca\x00\x00\x64\xbd\x55\x5c\x00\x00\x00\x00\x64\xba\x00\x00\x50\xed\x58\xd2\x49\xc3\x4a\xe4\x00\x00\x64\xbb\x00\x00\x00\x00\x5b\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xc4\x00\x00\x64\xbc\x55\xf7\x4c\xdb\x56\xf4\x00\x00\x00\x00\x00\x00\x50\xb3\x00\x00\x00\x00\x59\x8f\x64\xbe\x64\xc1\x00\x00\x00\x00\x4d\xbb\x00\x00\x49\x4d\x4f\x7c\x00\x00\x65\xbc\x64\xc2\x00\x00\x64\xc5\x00\x00\x64\xca\x00\x00\x00\x00\x00\x00\x00\x00\x64\xcb\x00\x00\x56\x69\x48\xe4", /* 6780 */ "\x00\x00\x4e\xaa\x00\x00\x00\x00\x4d\x59\x00\x00\x00\x00\x64\xc0\x00\x00\x57\x98\x00\x00\x64\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x57\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x8e\x00\x00\x51\x76\x64\xc3\x00\x00\x52\x56\x00\x00\x4d\x9c\x5b\xa5\x64\xc7\x00\x00\x00\x00\x00\x00\x55\xdf\x5a\xe5\x00\x00\x64\xbf\x00\x00\x64\xc4\x64\xc6\x00\x00\x54\x59\x4c\x84\x00\x00\x64\xc8\x00\x00\x50\x7d\x64\xd1\x00\x00\x00\x00\x64\xd6\x00\x00\x64\xd4\x4e\xdb\x4e\xce\x64\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xdd\x00\x00\x64\xd9\x49\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xd7\x52\xb2\x4c\xcb\x53\xe1\x54\xbd\x54\xe0\x00\x00\x00\x00\x00\x00\x64\xce\x64\xd3\x64\xd5\x00\x00\x4d\x92\x64\xd7\x5c\x96\x00\x00\x52\xfa\x00\x00\x64\xdb\x00\x00\x00\x00\x49\xe8\x00\x00\x00\x00\x00\x00\x64\xd0\x00\x00\x00\x00\x4e\xec\x00\x00\x00\x00\x50\x62\x64\xcc\x5b\xf8\x00\x00\x51\x99\x49\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xde\x00\x00\x55\xc0", /* 6800 */ "\x64\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x44\x00\x00\x49\x8b\x5b\x5b\x64\xcd\x64\xcf\x4b\xaf\x64\xd2\x00\x00\x64\xdc\x50\xb7\x00\x00\x55\xf6\x00\x00\x56\x48\x00\x00\x00\x00\x53\xdb\x50\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xe8\x00\x00\x00\x00\x00\x00\x58\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xf1\x5b\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xdf\x64\xe0\x00\x00\x00\x00\x00\x00\x59\x9a\x4d\xca\x4c\xf8\x00\x00\x00\x00\x4c\xf0\x5a\xd3\x64\xee\x00\x00\x64\xed\x64\xeb\x4d\x91\x56\xd1\x64\xe5\x57\xa5\x50\x93\x00\x00\x48\xb7\x64\xf0\x64\xef\x00\x00\x5c\x60\x00\x00\x64\xe3\x00\x00\x57\x49\x55\x43\x00\x00\x4e\x58\x4f\x7b\x64\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xe1\x64\xe2\x64\xe4\x4b\x55\x64\xe6\x54\x65\x64\xea\x64\xec\x4f\x50\x5c\x4e\x00\x00\x64\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xf4\x00\x00\x57\x50\x64\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6880 */ "\x00\x00\x51\x5a\x00\x00\x64\xe7\x00\x00\x52\x57\x48\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xf3\x00\x00\x00\x00\x00\x00\x64\xf6\x00\x00\x00\x00\x00\x00\x4d\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x72\x00\x00\x00\x00\x00\x00\x52\x6e\x57\xdf\x50\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x56\x94\x00\x00\x56\xdc\x58\xb4\x00\x00\x00\x00\x55\xe0\x00\x00\x64\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xeb\x00\x00\x64\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x7e\x00\x00\x53\xe4\x00\x00\x4d\x98\x00\x00\x00\x00\x00\x00\x00\x00\x48\xf3\x00\x00\x00\x00\x5c\x78\x00\x00\x00\x00\x4e\xab\x00\x00\x53\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xc3\x00\x00\x00\x00\x65\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4d\x00\x00\x65\x42\x50\xe1\x00\x00\x00\x00\x00\x00\x50\x63\x00\x00\x00\x00\x00\x00\x64\xfd\x4d\x77\x00\x00\x64\xfa\x00\x00\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x65\x44\x00\x00\x00\x00\x00\x00\x59\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x43\x00\x00\x5b\xb1\x5c\x55\x00\x00\x65\x47\x00\x00\x4f\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xfb\x64\xfc\x00\x00\x00\x00\x00\x00\x65\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x76\x00\x00\x00\x00\x59\xab\x00\x00\x00\x00\x00\x00\x65\x52\x00\x00\x00\x00\x00\x00\x00\x00\x65\x49\x00\x00\x00\x00\x00\x00\x4a\xa9\x00\x00\x4a\xba\x00\x00\x00\x00\x65\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xa7\x00\x00\x00\x00\x65\x45\x00\x00\x00\x00\x4a\x9f\x00\x00\x00\x00\x65\x4c\x50\xe2\x00\x00\x65\x4a\x00\x00\x00\x00\x65\x59\x00\x00\x00\x00\x65\x58\x00\x00\x00\x00\x00\x00\x00\x00\x65\x4e\x00\x00\x00\x00\x64\xf9\x00\x00\x00\x00\x65\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x4c\x65\x51\x65\x5a\x00\x00\x00\x00\x51\xa4\x00\x00\x00\x00\x00\x00", /* 6980 */ "\x65\x4f\x00\x00\x4c\xc4\x00\x00\x65\x4d\x00\x00\x5a\x7c\x65\x54\x65\x55\x65\x57\x00\x00\x00\x00\x00\x00\x65\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xc5\x65\x65\x00\x00\x00\x00\x65\x50\x00\x00\x00\x00\x65\x5b\x48\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x5c\x5b\x45\x00\x00\x00\x00\x65\x5e\x00\x00\x65\x5f\x00\x00\x00\x00\x00\x00\x65\x61\x00\x00\x00\x00\x51\x92\x00\x00\x00\x00\x54\xb5\x00\x00\x00\x00\x00\x00\x65\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x63\x00\x00\x65\x53\x00\x00\x65\x56\x00\x00\x4e\x51\x00\x00\x00\x00\x00\x00\x65\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xf6\x00\x00\x00\x00\x00\x00\x65\x64\x65\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x65\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xda\x00\x00\x65\x68", /* 6a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x6b\x65\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x61\x00\x00\x52\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x78\x00\x00\x4d\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x65\x69\x00\x00\x5a\x43\x00\x00\x00\x00\x00\x00\x65\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x77\x65\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x6f\x00\x00\x00\x00\x54\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x79\x4a\x68\x00\x00\x65\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x91\x00\x00\x00\x00\x00\x00\x65\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x76\x00\x00\x00\x00\x65\x7a\x00\x00\x00\x00\x00\x00", /* 6a80 */ "\x56\xb3\x00\x00\x00\x00\x00\x00\x58\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x75\x00\x00\x65\x7c\x65\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x7d\x00\x00\x65\x7f\x52\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x57\x4a\xcd\x4e\x56\x58\xbf\x66\xa2\x00\x00\x00\x00\x53\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x66\xa3\x00\x00\x66\xa4\x53\xda\x00\x00\x00\x00\x00\x00\x50\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x66\xa5\x00\x00\x00\x00\x66\xa6\x58\xa9\x00\x00\x54\x58\x00\x00\x00\x00\x4c\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xb8\x5b\x9e\x4a\xca\x49\xbc\x57\xe3\x53\xe6\x00\x00\x00\x00\x57\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xf4\x00\x00\x56\x60\x4e\xde\x00\x00\x00\x00\x00\x00", /* 6b80 */ "\x00\x00\x65\x83\x65\x84\x59\x8b\x65\x86\x00\x00\x4a\xf8\x65\x85\x00\x00\x59\x53\x55\xe1\x49\xcf\x00\x00\x65\x89\x00\x00\x00\x00\x00\x00\x00\x00\x65\x87\x65\x88\x00\x00\x00\x00\x5b\xb2\x00\x00\x00\x00\x00\x00\x65\x8a\x65\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xae\x53\x59\x4b\xcd\x00\x00\x59\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x8f\x00\x00\x4e\x79\x66\xb0\x00\x00\x00\x00\x59\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xe2\x00\x00\x52\xb7\x00\x00\x52\x5f\x00\x00\x00\x00\x4b\xbd\x5c\xb8\x49\x68\x49\x6f\x49\x71\x53\x9f\x00\x00\x49\x70\x00\x00\x52\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x44\x4d\xc0\x00\x00\x00\x00\x00\x00\x56\xb9\x00\x00\x00\x00\x00\x00\x66\x45\x00\x00\x66\x47\x00\x00\x00\x00\x00\x00\x66\x48\x00\x00\x00\x00\x00\x00\x66\x46\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x49\x66\x4b\x66\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x4c\x00\x00\x55\xce\x5c\xb4\x52\x92\x00\x00\x52\x45\x53\xf7\x66\x4d\x52\xc9\x00\x00\x66\x4e\x66\x4f\x66\x50\x4c\x75\x00\x00\x00\x00\x00\x00\x4c\x9b\x00\x00\x66\x51\x54\x83\x00\x00\x66\x53\x00\x00\x4d\xa3\x59\x96\x48\xb0\x66\x52\x66\x54\x00\x00\x00\x00\x00\x00\x4b\x4a\x51\xc7\x54\x89\x00\x00\x66\x55\x00\x00\x56\x4e\x62\x7f\x00\x00\x00\x00\x5a\x60\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x7b\x00\x00\x00\x00\x57\x41\x5b\xac\x54\x94\x00\x00\x00\x00\x00\x00\x5d\x81\x4e\x84\x00\x00\x4d\xb9\x62\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x4b\x00\x00\x00\x00\x00\x00\x62\x81\x55\x67\x00\x00\x4d\xb8\x00\x00\x00\x00\x00\x00\x59\x54\x62\x82\x54\xe9\x4d\x4f\x4f\x4d\x4a\x78\x57\xda\x00\x00\x00\x00\x56\xbf\x00\x00\x00\x00\x00\x00\x62\x89\x62\x8a\x57\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xac\x00\x00\x4e\xb2\x00\x00\x62\x8b\x00\x00\x62\x8c\x00\x00\x00\x00\x58\xd9\x00\x00\x00\x00\x00\x00\x53\xfa\x4c\x7a\x00\x00", /* 6c80 */ "\x00\x00\x54\x7f\x59\xc9\x57\xd5\x00\x00\x62\x85\x62\x8d\x00\x00\x55\x93\x4a\x61\x00\x00\x00\x00\x62\x88\x00\x00\x00\x00\x53\xe2\x62\x86\x00\x00\x00\x00\x67\x53\x62\x87\x00\x00\x00\x00\x00\x00\x00\x00\x55\x53\x00\x00\x53\x87\x00\x00\x00\x00\x00\x00\x4d\x55\x00\x00\x52\x5b\x00\x00\x62\x84\x53\x5d\x51\x44\x51\xd8\x49\xd6\x00\x00\x62\x8e\x4e\x46\x52\xac\x00\x00\x62\x91\x4f\xd9\x00\x00\x00\x00\x62\x9c\x62\x96\x4d\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x70\x5a\x6d\x00\x00\x5b\xcd\x5b\x73\x4d\x61\x5b\x54\x59\x78\x00\x00\x00\x00\x00\x00\x00\x00\x58\xb8\x54\x97\x00\x00\x00\x00\x00\x00\x54\xa9\x49\xb3\x00\x00\x52\x7a\x00\x00\x00\x00\x00\x00\x62\x8f\x00\x00\x00\x00\x62\x9d\x62\x90\x4c\x48\x62\x98\x62\x95\x00\x00\x00\x00\x00\x00\x4c\x5a\x00\x00\x00\x00\x53\x42\x00\x00\x62\x97\x53\x7d\x49\xa7\x53\xfb\x00\x00\x52\xdf\x00\x00\x00\x00\x5c\x42\x00\x00\x50\xe0\x62\x9a\x00\x00\x00\x00\x62\x9b\x62\x9e\x56\xa8\x62\x94\x00\x00\x5a\x5e\x00\x00\x49\x63\x67\x54\x62\x92\x62\x93\x00\x00\x62\x99\x58\xb9\x53\xc2\x5a\xf2\x62\x9f\x00\x00", /* 6d00 */ "\x00\x00\x4f\x81\x00\x00\x00\x00\x62\xa6\x00\x00\x00\x00\x62\xa5\x00\x00\x00\x00\x00\x00\x59\x94\x62\xa2\x00\x00\x62\xa8\x00\x00\x00\x00\x00\x00\x54\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x58\x54\x00\x00\x62\xa7\x62\xad\x51\xe4\x00\x00\x00\x00\x4b\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x93\x00\x00\x62\xa1\x00\x00\x00\x00\x4d\xe8\x62\xa9\x00\x00\x00\x00\x62\xab\x00\x00\x00\x00\x4b\xfc\x5b\xdd\x62\xb1\x00\x00\x62\xac\x00\x00\x00\x00\x00\x00\x62\xa0\x00\x00\x4e\x8f\x57\x7d\x54\x42\x53\x69\x00\x00\x00\x00\x51\x98\x00\x00\x62\xa3\x00\x00\x54\x53\x4f\x4c\x4f\x5d\x62\xa4\x00\x00\x5c\x67\x49\xe1\x00\x00\x62\xaa\x4e\xc2\x62\xae\x00\x00\x4e\x8c\x62\xaf\x53\x48\x62\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x84\x50\x43\x00\x00\x62\xb9\x00\x00\x62\xb6\x00\x00\x62\xba\x00\x00\x00\x00\x62\xbc\x00\x00\x00\x00\x53\xd5\x00\x00\x00\x00\x4d\xc5\x50\xca\x00\x00\x00\x00\x00\x00\x4c\xa0\x62\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xa0\x00\x00\x00\x00\x4d\xa2\x4f\x9f\x00\x00\x00\x00\x00\x00\x62\xbb\x00\x00\x00\x00\x00\x00", /* 6d80 */ "\x00\x00\x00\x00\x57\x5f\x00\x00\x00\x00\x52\xf8\x00\x00\x00\x00\x58\x9c\x55\x87\x00\x00\x00\x00\x5a\x5f\x00\x00\x58\x71\x00\x00\x00\x00\x62\xb2\x00\x00\x62\xb7\x62\xb8\x56\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xcd\x00\x00\x50\xd3\x62\xb4\x51\x50\x62\xb5\x57\xcf\x00\x00\x4e\x61\x4b\x73\x00\x00\x54\xf2\x4f\x47\x5b\x67\x55\x4c\x4c\xa1\x62\xc9\x00\x00\x00\x00\x62\xcb\x59\x64\x00\x00\x00\x00\x59\xb9\x00\x00\x00\x00\x4d\xac\x00\x00\x00\x00\x4d\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xc2\x4b\x8e\x00\x00\x00\x00\x00\x00\x5c\x6d\x62\xbf\x58\x9e\x62\xbe\x00\x00\x00\x00\x00\x00\x51\x7c\x56\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x55\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x52\xd6\x00\x00\x56\xd3\x62\xc7\x00\x00\x00\x00\x00\x00\x62\xc6\x62\xc0\x00\x00\x62\xc3\x4b\x4d\x00\x00\x00\x00\x5a\x79\x00\x00\x62\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x59\xf8\x4a\xe2\x00\x00\x4e\x54\x00\x00\x00\x00\x55\x8f\x00\x00\x4a\xbd\x00\x00\x00\x00\x00\x00\x4e\x8d\x00\x00\x59\x6d\x00\x00\x56\xec\x67\x55\x00\x00\x00\x00\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x86\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xa7\x00\x00\x62\xca\x5c\x75\x62\xc1\x00\x00\x4f\x45\x62\xc4\x00\x00\x00\x00\x5a\x87\x00\x00\x62\xc8\x55\x99\x00\x00\x00\x00\x62\xbd\x00\x00\x00\x00\x5a\x86\x00\x00\x00\x00\x54\x9f\x4b\xc8\x00\x00\x5a\xfb\x49\xb2\x62\xd6\x00\x00\x00\x00\x00\x00\x57\xc1\x00\x00\x62\xcc\x00\x00\x57\xbb\x00\x00\x4c\xda\x00\x00\x00\x00\x62\xd5\x00\x00\x50\x6a\x00\x00\x00\x00\x00\x00\x5a\x6e\x00\x00\x52\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x68\x62\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x64\x62\xce\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd3\x62\xd4\x00\x00\x4d\xfd\x00\x00\x58\x87\x00\x00\x00\x00\x5b\x5f\x00\x00\x00\x00\x00\x00\x62\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xcf\x00\x00\x00\x00\x62\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x86\x55\xa9", /* 6e80 */ "\x00\x00\x00\x00\x00\x00\x50\xa2\x00\x00\x4f\x46\x62\xd2\x00\x00\x00\x00\x4c\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xe6\x5a\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xda\x00\x00\x00\x00\x00\x00\x51\x90\x00\x00\x00\x00\x62\xe8\x00\x00\x00\x00\x59\xe6\x00\x00\x00\x00\x62\xde\x00\x00\x62\xdf\x00\x00\x00\x00\x58\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7d\x00\x00\x62\xd9\x62\xd0\x00\x00\x62\xe4\x00\x00\x54\xdb\x62\xe2\x00\x00\x00\x00\x52\xe6\x62\xe1\x00\x00\x62\xe0\x00\x00\x00\x00\x00\x00\x4a\x9d\x62\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x82\x00\x00\x00\x00\x00\x00\x5c\x6c\x00\x00\x00\x00\x00\x00\x62\xe5\x00\x00\x4e\x4c\x00\x00\x5c\x72\x56\xce\x66\x99\x00\x00\x62\xe3\x00\x00\x00\x00\x4d\x97\x00\x00\x00\x00\x00\x00\x5b\xcc\x62\xd8\x62\xdb\x51\xf9\x62\xdd\x00\x00\x51\xca\x50\xc3\x51\xcf\x00\x00\x49\x96\x56\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x62\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6f00 */ "\x00\x00\x00\x00\x53\xae\x00\x00\x00\x00\x00\x00\x53\xe0\x00\x00\x00\x00\x62\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xa8\x00\x00\x00\x00\x00\x00\x50\xeb\x59\x7d\x62\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xad\x00\x00\x00\x00\x00\x00\x62\xec\x00\x00\x00\x00\x00\x00\x00\x00\x62\xf5\x62\xf3\x51\xfd\x00\x00\x62\xdc\x00\x00\x62\xef\x00\x00\x55\xfd\x00\x00\x5b\x64\x00\x00\x00\x00\x62\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xea\x62\xeb\x00\x00\x00\x00\x00\x00\x62\xf1\x00\x00\x57\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6b\x00\x00\x00\x00\x00\x00\x54\x51\x00\x00\x51\xb9\x00\x00\x00\x00\x00\x00\x62\xe9\x00\x00\x00\x00\x00\x00\x51\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xb5\x4a\x51\x00\x00\x00\x00\x00\x00\x62\xfa\x00\x00\x62\xf2\x00\x00\x00\x00\x00\x00\x62\xf9\x00\x00\x62\xfc\x00\x00\x62\xfb\x00\x00\x00\x00\x00\x00", /* 6f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6e\x00\x00\x00\x00\x00\x00\x4a\x5a\x62\xf6\x00\x00\x00\x00\x62\xf8\x62\xf7\x53\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xc3\x00\x00\x00\x00\x63\x44\x00\x00\x00\x00\x63\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xa3\x00\x00\x63\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xfd\x49\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x48\x00\x00\x63\x49\x63\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x47\x63\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4b\x63\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4f\x00\x00\x00\x00\x00\x00\x63\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x81\x00\x00\x00\x00\x63\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x91\x66\xe0\x52\x91\x00\x00\x4b\x66\x4e\x72\x00\x00\x00\x00\x00\x00\x00\x00\x51\x8a\x5a\xed\x00\x00\x4f\xc3\x00\x00\x00\x00\x00\x00\x5c\x66\x00\x00\x5a\xd5\x49\xd2", /* 7080 */ "\x66\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x65\xc0\x00\x00\x00\x00\x00\x00\x51\xae\x4a\xb5\x00\x00\x00\x00\x00\x00\x59\x77\x00\x00\x00\x00\x00\x00\x4a\x54\x00\x00\x54\xb1\x50\x5b\x66\xbf\x00\x00\x00\x00\x5b\xca\x00\x00\x00\x00\x66\xbe\x66\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xc4\x4f\xe5\x56\xbe\x53\x7a\x4f\xbb\x00\x00\x66\xc5\x00\x00\x49\x9f\x00\x00\x00\x00\x00\x00\x66\xc3\x5b\x48\x4b\x84\x00\x00\x66\xc1\x51\x56\x4a\x84\x00\x00\x00\x00\x66\xc2\x56\x58\x50\xc2\x56\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x51\x72\x00\x00\x66\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe5\x50\xd2\x00\x00\x5b\xf1\x00\x00\x00\x00\x00\x00\x59\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x50\x5e\x00\x00\x4c\x53\x55\x75\x66\xc6\x4e\x83\x00\x00\x56\xcb\x4f\x9e\x54\xc7\x00\x00\x58\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x8a\x00\x00\x53\x8c\x00\x00\x00\x00\x00\x00\x4c\x8a\x00\x00\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x69\x4d\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xc8\x00\x00\x00\x00\x66\xc9\x00\x00\x4e\x60\x66\xca\x00\x00\x66\xe1\x49\x5a\x4c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xcb\x59\x87\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x54\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd2\x00\x00\x4e\x6d\x00\x00\x4e\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xce\x00\x00\x55\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x5a\x00\x00\x66\xe2\x5b\x75\x66\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xf2\x00\x00\x00\x00\x00\x00\x66\xd1\x66\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd3\x00\x00\x66\xd4\x00\x00\x00\x00\x55\x5f\x00\x00\x00\x00", /* 7180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x58\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x59\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x54\xda\x00\x00\x00\x00\x00\x00\x66\xd5\x57\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xeb\x66\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd8\x00\x00\x00\x00\x00\x00\x48\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xd6\x00\x00\x66\xd7\x00\x00\x00\x00\x00\x00\x66\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xdb\x59\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xda\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xee\x00\x00\x66\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xdf\x00\x00\x5c\x46\x00\x00\x53\x60\x00\x00\x00\x00\x00\x00\x66\x5c\x48\xad\x00\x00\x00\x00\x00\x00\x4f\xf3\x4c\xb7\x59\xae\x48\xd5\x4b\x9a\x00\x00\x5c\xb2\x00\x00\x56\x4c\x00\x00\x62\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xab\x48\xe5\x00\x00\x00\x00\x00\x00\x53\x66\x66\x59\x00\x00\x00\x00\x00\x00\x00\x00\x66\x5a\x00\x00\x00\x00\x00\x00\x66\x5b\x00\x00\x00\x00\x59\x60\x00\x00\x53\x43\x00\x00\x65\xf1\x00\x00\x52\xb1\x00\x00\x52\xb4\x50\xcd\x00\x00\x00\x00\x00\x00\x65\xf2\x52\xc0\x00\x00\x57\xee\x00\x00\x00\x00\x00\x00\x00\x00\x65\xef\x65\xf3\x00\x00\x00\x00\x55\x9d\x00\x00\x00\x00\x54\x43\x00\x00\x00\x00\x00\x00\x56\xd7\x57\xfd\x00\x00\x00\x00\x00\x00\x65\xf4\x65\xf5", /* 7280 */ "\x58\x4c\x50\xe6\x00\x00\x00\x00\x65\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xbe\x65\xf7\x00\x00\x65\xf8\x00\x00\x65\xf9\x00\x00\x00\x00\x65\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xad\x61\x8c\x00\x00\x4c\x58\x61\x8d\x00\x00\x00\x00\x00\x00\x61\x8e\x00\x00\x5c\x54\x61\x8f\x61\x90\x5a\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x92\x50\x92\x61\x91\x4b\x72\x00\x00\x00\x00\x00\x00\x49\x57\x00\x00\x00\x00\x00\x00\x00\x00\x61\x94\x61\x93\x00\x00\x4d\xfb\x00\x00\x61\x95\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x57\x00\x00\x4f\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x52\xfb\x00\x00\x4d\xdc\x4f\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x96\x61\x98\x00\x00\x00\x00\x4b\xbf\x58\x61\x55\xa7\x61\x97\x5b\x99\x5a\x9d\x61\x99\x61\x9d\x61\x9a\x00\x00\x00\x00\x61\x9b\x50\xe9\x00\x00\x61\x9f\x61\xa0\x50\xc6\x00\x00\x00\x00\x00\x00", /* 7300 */ "\x00\x00\x61\x9c\x00\x00\x61\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xa4\x00\x00\x00\x00\x00\x00\x51\x74\x00\x00\x00\x00\x00\x00\x00\x00\x61\xa2\x00\x00\x61\xa7\x49\xfd\x61\xa1\x00\x00\x00\x00\x00\x00\x52\x6d\x49\xc1\x61\xa6\x61\xa5\x00\x00\x00\x00\x61\xa3\x61\xa8\x00\x00\x00\x00\x61\xaa\x00\x00\x00\x00\x00\x00\x58\xc8\x5b\xec\x52\x48\x61\xab\x00\x00\x58\x77\x00\x00\x00\x00\x61\xad\x00\x00\x00\x00\x4d\xee\x00\x00\x00\x00\x65\x81\x61\xac\x61\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x4b\x5a\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xaf\x00\x00\x00\x00\x61\xae\x00\x00\x65\x82\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb2\x56\xa0\x00\x00\x61\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb4\x00\x00", /* 7380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x58\xfd\x00\x00\x00\x00\x51\xc9\x00\x00\x5a\x92\x00\x00\x57\x96\x00\x00\x00\x00\x64\x81\x00\x00\x00\x00\x64\x82\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x51\xe9\x00\x00\x00\x00\x00\x00\x64\x85\x00\x00\x00\x00\x64\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x87\x00\x00\x52\x55\x00\x00\x00\x00\x64\x83\x4e\x57\x58\x76\x00\x00\x51\x82\x64\x8a\x00\x00\x00\x00\x00\x00\x64\x89\x00\x00\x00\x00\x64\x95\x49\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x64\x8b\x00\x00\x64\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x8d\x64\x8c\x55\x5a\x00\x00\x00\x00\x5b\x85\x00\x00\x64\x86\x4c\x49\x64\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x64\x94\x00\x00\x5b\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x64\x8e\x00\x00\x64\x93\x00\x00\x64\x92\x00\x00\x00\x00\x00\x00\x48\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x64\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x54\x93\x00\x00\x50\xc4\x50\xec\x00\x00\x00\x00\x51\x91\x64\x91\x00\x00\x00\x00\x00\x00\x00\x00\x64\x97\x56\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa1\x64\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x61\x00\x00\x00\x00\x64\x9b\x64\x9a\x00\x00\x64\x9c\x00\x00\x64\x98\x00\x00\x64\x9f\x00\x00\x64\x9e\x00\x00\x64\x9d\x00\x00\x00\x00\x51\x75\x54\x79\x53\x9e\x53\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa5\x00\x00\x64\xa4\x00\x00\x64\xa6\x4d\xf6\x64\x99\x64\xa3\x00\x00\x54\xef\x55\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa8\x00\x00\x00\x00\x4d\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x9f\x64\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa9\x00\x00", /* 7480 */ "\x64\xac\x64\xad\x00\x00\x51\x47\x00\x00\x00\x00\x00\x00\x64\xae\x00\x00\x00\x00\x00\x00\x64\xaf\x00\x00\x00\x00\x64\xab\x00\x00\x64\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xaa\x00\x00\x64\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb4\x64\xb1\x64\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x6f\x00\x00\x68\xab\x00\x00\x68\xac\x00\x00\x53\xaf\x48\xe9\x54\xbe\x00\x00\x57\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xcc\x65\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x65\xb1\x00\x00\x53\xbe\x4a\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xb2", /* 7500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x9a\x00\x00\x65\xb3\x00\x00\x65\xb4\x00\x00\x65\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xc9\x60\x50\x55\x96\x00\x00\x56\xef\x00\x00\x00\x00\x55\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x9c\x00\x00\x00\x00\x5a\x63\x56\x46\x00\x00\x4c\xa5\x68\xad\x49\x62\x00\x00\x63\x58\x56\xee\x5a\x69\x4e\xd6\x55\x8b\x00\x00\x4b\x88\x00\x00\x52\xcf\x4b\x8a\x00\x00\x67\xad\x4e\x4d\x00\x00\x00\x00\x64\x7e\x00\x00\x67\xae\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x49\x00\x00\x00\x00\x67\xb1\x00\x00\x00\x00\x67\xb0\x4f\x88\x00\x00\x67\xaf\x57\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x51\x95\x5e\x6e\x67\xb2\x58\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd3\x53\xe7\x00\x00\x00\x00\x00\x00\x4c\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xb3\x00\x00\x4a\x8c\x00\x00\x00\x00\x00\x00\x4e\x9c\x67\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7c", /* 7580 */ "\x00\x00\x00\x00\x00\x00\x67\xb5\x00\x00\x00\x00\x4f\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x69\x83\x00\x00\x00\x00\x00\x00\x55\xe7\x00\x00\x59\xc8\x68\xd9\x00\x00\x68\xda\x00\x00\x68\xdb\x51\x66\x00\x00\x4c\xec\x4f\xcd\x00\x00\x00\x00\x68\xdd\x00\x00\x53\x51\x68\xdc\x59\x92\x00\x00\x68\xdf\x48\xcb\x4f\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xde\x68\xde\x00\x00\x4a\xae\x4c\x89\x68\xe5\x68\xe4\x53\xa2\x68\xe0\x68\xe1\x4a\xc2\x00\x00\x00\x00\x68\xe2\x5b\x8f\x00\x00\x00\x00\x56\xda\x4f\xd1\x4e\xb1\x00\x00\x00\x00\x00\x00\x68\xe7\x68\xe6\x68\xe3\x49\xa0\x00\x00\x5b\xa1\x5a\x58\x4f\xb6\x54\xab\x00\x00\x00\x00\x68\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x59\x98\x00\x00\x5b\xcb\x4d\xda\x68\xe8\x00\x00\x4b\xba\x00\x00\x00\x00\x57\x54\x00\x00\x00\x00\x53\xa5\x00\x00\x00\x00\x00\x00\x51\x41\x68\xea\x68\xed\x00\x00\x68\xec\x68\xef\x68\xeb\x00\x00\x4e\x5e\x68\xee\x00\x00\x00\x00\x00\x00\x00\x00\x56\xb4\x68\xf1\x00\x00\x00\x00\x4a\x75\x00\x00\x00\x00\x00\x00\x00\x00\x49\x74\x00\x00\x00\x00\x68\xf2\x00\x00\x00\x00\x68\xf3", /* 7600 */ "\x68\xf5\x4a\xe0\x00\x00\x68\xf0\x00\x00\x68\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x68\xf9\x00\x00\x68\xf7\x00\x00\x00\x00\x00\x00\x68\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x68\xfc\x00\x00\x68\xf8\x68\xfb\x68\xfd\x00\x00\x69\x41\x00\x00\x00\x00\x00\x00\x57\xc0\x69\x44\x00\x00\x69\x43\x00\x00\x51\x97\x68\xfa\x55\xdc\x00\x00\x00\x00\x4a\xf0\x49\x92\x56\xb0\x00\x00\x69\x46\x00\x00\x00\x00\x69\x47\x00\x00\x00\x00\x69\x4c\x5b\x6e\x69\x49\x00\x00\x00\x00\x54\xb2\x00\x00\x00\x00\x00\x00\x69\x42\x00\x00\x69\x4b\x69\x48\x69\x45\x00\x00\x00\x00\x69\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xa8\x69\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4f\x00\x00\x69\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x50\x00\x00\x69\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x59\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x52\x00\x00\x00\x00\x00\x00\x69\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x90\x00\x00\x00\x00\x4b\x67\x00\x00\x48\xd6\x48\xd8\x00\x00", /* 7680 */ "\x00\x00\x00\x00\x5a\xec\x00\x00\x4b\x64\x00\x00\x4f\x74\x4e\x6a\x68\xa6\x00\x00\x00\x00\x4c\xdd\x00\x00\x00\x00\x68\xa7\x00\x00\x00\x00\x48\xa7\x00\x00\x68\xa8\x00\x00\x00\x00\x57\x8f\x00\x00\x00\x00\x68\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xa3\x00\x00\x00\x00\x5b\xe4\x69\x85\x00\x00\x69\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x94\x00\x00\x00\x00\x5a\x7b\x00\x00\x00\x00\x5b\xd0\x53\x89\x00\x00\x5a\x4f\x00\x00\x59\xe5\x00\x00\x00\x00\x67\xc0\x48\xba\x5b\x55\x59\x6e\x4e\xdf\x4d\xcf\x00\x00\x50\x99\x00\x00\x4c\xc6\x4b\x61\x53\x6c\x00\x00\x00\x00\x55\xa1\x00\x00\x00\x00\x00\x00\x52\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xbe\x4b\xa1\x00\x00\x67\x8d\x52\x44\x00\x00\x5b\xb0\x00\x00\x00\x00\x00\x00\x58\x81\x67\x90\x00\x00\x00\x00\x53\x6e\x00\x00\x4b\xdb\x00\x00", /* 7700 */ "\x00\x00\x55\xa0\x00\x00\x00\x00\x67\x8e\x00\x00\x00\x00\x67\x91\x67\x92\x52\x5c\x00\x00\x50\x54\x00\x00\x67\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x95\x67\x93\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x87\x52\x7f\x00\x00\x67\x94\x00\x00\x00\x00\x00\x00\x67\x97\x00\x00\x5b\x43\x59\x43\x00\x00\x00\x00\x00\x00\x67\x96\x00\x00\x52\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x98\x50\x95\x4f\xeb\x67\x99\x00\x00\x56\xf6\x00\x00\x59\x7b\x00\x00\x00\x00\x00\x00\x5c\x65\x5b\x97\x00\x00\x67\x9d\x00\x00\x00\x00\x00\x00\x67\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x9a\x67\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x9e\x4f\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x4f\x67\xa0\x4b\xbc\x00\x00\x67\xa1\x52\xbf\x00\x00\x67\x9f\x00\x00\x00\x00\x4f\x7e\x49\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xc2\x00\x00\x00\x00\x00\x00\x67\xa4\x5c\xb9\x67\xa2", /* 7780 */ "\x67\xa5\x00\x00\x00\x00\x00\x00\x52\x8a\x4a\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa6\x67\xa3\x58\x59\x00\x00\x00\x00\x67\xa7\x51\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa8\x67\xa9\x00\x00\x5f\xaa\x00\x00\x00\x00\x53\xb2\x00\x00\x54\x66\x00\x00\x5b\xf4\x4b\x69\x00\x00\x56\x52\x00\x00\x00\x00\x00\x00\x67\xaa\x00\x00\x00\x00\x57\x4b\x00\x00\x67\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x50\x00\x00\x67\xac\x00\x00\x6b\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xa2\x00\x00\x00\x00\x00\x00\x52\x4c\x69\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xb7\x59\xd2\x00\x00\x5b\xa9\x00\x00\x68\x93\x00\x00\x4f\xd7\x00\x00\x4f\x63\x68\x94\x4b\xcb\x48\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x55\xae\x00\x00\x00\x00\x67\x56\x00\x00\x67\x57\x00\x00\x00\x00\x00\x00\x00\x00\x57\xf8\x4c\x4f\x50\x94", /* 7800 */ "\x67\x58\x51\xea\x55\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x59\x00\x00\x00\x00\x53\xf5\x50\x53\x00\x00\x00\x00\x00\x00\x67\x5c\x53\x99\x00\x00\x59\x70\x00\x00\x5c\x49\x67\x5a\x67\x5b\x00\x00\x59\x83\x00\x00\x67\x5f\x67\x60\x00\x00\x67\x64\x00\x00\x00\x00\x00\x00\x67\x68\x00\x00\x67\x66\x67\x6e\x5b\x89\x00\x00\x67\x69\x00\x00\x00\x00\x67\x67\x67\x5e\x00\x00\x00\x00\x53\x8a\x00\x00\x00\x00\x00\x00\x53\xc5\x00\x00\x00\x00\x55\x8a\x5a\xd1\x67\x61\x67\x62\x67\x63\x67\x65\x00\x00\x50\xf8\x00\x00\x4a\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x89\x00\x00\x67\x70\x00\x00\x00\x00\x00\x00\x00\x00\x67\x71\x00\x00\x67\x6a\x00\x00\x67\x6f\x00\x00\x57\xf7\x00\x00\x00\x00\x56\x56\x67\x6c\x67\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x72\x51\x93\x5a\x52\x67\x6b\x54\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xee\x00\x00\x00\x00\x00\x00\x00\x00\x53\x91\x00\x00\x00\x00\x00\x00", /* 7880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x76\x00\x00\x4b\x90\x00\x00\x00\x00\x51\xb4\x48\xac\x56\x8a\x00\x00\x00\x00\x49\x4e\x00\x00\x67\x74\x00\x00\x00\x00\x00\x00\x57\x8c\x4b\x83\x00\x00\x67\x75\x67\x73\x67\x77\x00\x00\x00\x00\x4b\x9b\x00\x00\x67\x78\x00\x00\x67\x79\x00\x00\x67\x7c\x00\x00\x49\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x97\x4e\xed\x67\x7a\x56\xbb\x49\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x67\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x52\xea\x00\x00\x00\x00\x4a\xc4\x00\x00\x00\x00\x00\x00\x48\xf4\x00\x00\x00\x00\x00\x00\x67\x7f\x50\xd9\x4a\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6d\x00\x00\x00\x00\x00\x00\x67\x7d\x50\x64\x00\x00\x00\x00\x00\x00\x67\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xa4\x00\x00\x00\x00\x00\x00\x67\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x82\x00\x00\x67\x84\x00\x00\x00\x00\x51\x77\x00\x00\x00\x00\x4e\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x4f\x58\x00\x00\x00\x00\x00\x00\x67\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xbd\x66\xe9\x50\xf0\x00\x00\x55\x88\x00\x00\x66\xea\x53\xed\x00\x00\x00\x00\x00\x00\x00\x00\x66\xeb\x00\x00\x53\xec\x66\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xef\x00\x00\x00\x00\x5c\x87\x66\xf2\x00\x00\x00\x00\x66\xf0\x66\xed\x66\xee\x5c\x43\x55\x92\x56\x8f\x66\xf3\x00\x00\x66\xf1\x00\x00\x00\x00\x58\x8a\x00\x00\x66\xf5\x53\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xbf\x00\x00\x66\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x5b\x4e\x97\x00\x00\x66\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7980 */ "\x5d\x98\x4f\x9c\x00\x00\x00\x00\x51\xba\x66\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x66\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x8e\x5c\xad\x50\xea\x00\x00\x54\x7d\x4d\xcb\x00\x00\x58\xe2\x56\x5d\x00\x00\x57\x5a\x00\x00\x00\x00\x4c\xd0\x00\x00\x00\x00\x49\x9d\x00\x00\x54\x90\x00\x00\x5b\xd5\x00\x00\x00\x00\x00\x00\x50\x66\x52\x8c\x00\x00\x00\x00\x68\x96\x00\x00\x00\x00\x52\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x83\x00\x00\x00\x00\x00\x00\x68\x98\x4a\x73\x00\x00\x54\x78\x59\x8e\x00\x00\x5b\xc7\x00\x00\x68\x99\x00\x00\x68\x97\x00\x00\x4e\x9e\x4a\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x75\x00\x00\x00\x00\x59\xc5\x00\x00\x4e\x81\x00\x00\x00\x00", /* 7a00 */ "\x58\x41\x00\x00\x68\x9d\x68\x9c\x00\x00\x00\x00\x68\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6c\x00\x00\x55\x74\x56\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x9f\x00\x00\x00\x00\x48\xdd\x00\x00\x00\x00\x5b\xc8\x00\x00\x00\x00\x00\x00\x68\x9e\x00\x00\x4a\x8e\x00\x00\x00\x00\x6b\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc7\x00\x00\x00\x00\x00\x00\x68\xa1\x00\x00\x68\xa0\x00\x00\x4b\x5e\x4e\xd9\x4e\x9d\x00\x00\x4c\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\xa5\x00\x00\x00\x00\x00\x00\x59\x48\x00\x00\x4f\xbe\x54\x8f\x69\x56\x69\x57\x50\x75\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xa8", /* 7a80 */ "\x69\x58\x57\x5b\x00\x00\x54\x74\x5b\x4d\x00\x00\x69\x59\x00\x00\x69\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x54\x6f\x00\x00\x00\x00\x00\x00\x59\xa3\x5b\xce\x00\x00\x00\x00\x69\x5b\x4f\x71\x4a\xaf\x4f\xbc\x00\x00\x00\x00\x00\x00\x4a\xdb\x57\xd0\x00\x00\x50\x7f\x69\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x50\x9b\x69\x5c\x00\x00\x69\x5f\x00\x00\x00\x00\x00\x00\x69\x5e\x69\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xf9\x00\x00\x00\x00\x5b\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xb9\x4f\xb8\x5b\x62\x00\x00\x00\x00\x50\x42\x00\x00\x57\x4f\x69\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x7f\x00\x00\x4b\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xf0\x6a\x63\x00\x00\x00\x00\x6a\x64\x00\x00\x4c\xcc", /* 7b00 */ "\x00\x00\x00\x00\x00\x00\x6a\x66\x6a\x67\x00\x00\x48\xc9\x00\x00\x6a\x65\x00\x00\x6a\x69\x56\x92\x00\x00\x00\x00\x00\x00\x6a\x6b\x00\x00\x58\xa5\x00\x00\x00\x00\x49\x6a\x6a\x68\x00\x00\x00\x00\x00\x00\x6a\x6f\x00\x00\x4b\x71\x00\x00\x00\x00\x6a\x77\x00\x00\x6a\x72\x00\x00\x00\x00\x00\x00\x6a\x74\x6a\x73\x4c\x9c\x00\x00\x49\x5f\x00\x00\x6a\x6e\x6a\x6a\x4b\x7a\x00\x00\x6a\x70\x00\x00\x00\x00\x6a\x71\x00\x00\x6a\x75\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x6d\x00\x00\x4e\xe2\x00\x00\x51\x9e\x00\x00\x6a\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x7a\x00\x00\x6a\x6c\x00\x00\x4b\x68\x00\x00\x4f\x8f\x6a\x7c\x00\x00\x00\x00\x4c\x44\x50\x91\x5b\xfd\x57\x52\x00\x00\x4a\xef\x00\x00\x49\xde\x00\x00\x6a\x78\x00\x00\x6a\x79\x55\x58\x00\x00\x6a\x7d\x00\x00\x00\x00\x6a\x7e\x00\x00\x6a\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x7f\x00\x00\x00\x00\x6a\x84\x6a\x83\x00\x00\x00\x00\x6a\x7b\x00\x00\x50\x8b\x00\x00\x4a\x90\x00\x00\x6a\x81\x00\x00\x00\x00\x54\x49\x00\x00", /* 7b80 */ "\x4e\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5f\x00\x00\x00\x00\x6a\x85\x00\x00\x00\x00\x00\x00\x49\xac\x4e\x9f\x00\x00\x56\x84\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x8e\x6a\x8a\x00\x00\x00\x00\x00\x00\x4d\x7c\x6a\x8f\x00\x00\x00\x00\x00\x00\x6a\x86\x6a\x87\x6a\x8b\x51\xe0\x6a\x8d\x6a\x90\x6a\x89\x4e\xfc\x00\x00\x00\x00\x00\x00\x58\x85\x00\x00\x00\x00\x6a\x91\x00\x00\x00\x00\x00\x00\x6a\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x93\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x4d\x53\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x94\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x92\x00\x00\x51\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xdc\x6a\x96\x00\x00\x00\x00\x6a\x95\x00\x00\x00\x00\x00\x00\x4a\xda\x00\x00\x00\x00\x00\x00\x6a\x97\x6a\x98\x00\x00\x00\x00\x00\x00\x6a\x99\x00\x00\x00\x00\x00\x00\x50\xb9\x00\x00\x00\x00\x50\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x92\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x9c\x00\x00\x6a\x9b\x00\x00", /* 7c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xd7\x00\x00\x00\x00\x00\x00\x6a\x9f\x6a\x9a\x00\x00\x00\x00\x6a\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xa2\x4e\x69\x00\x00\x00\x00\x6a\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xbd\x6a\xa5\x6a\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x77\x5d\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xdf\x6a\xcb\x5c\x71\x00\x00\x00\x00", /* 7c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xcd\x51\x43\x00\x00\x00\x00\x53\xc8\x00\x00\x4a\xd5\x5b\x53\x00\x00\x00\x00\x00\x00\x6a\xcf\x6a\xce\x6a\xd0\x56\x7a\x00\x00\x00\x00\x6a\xd1\x00\x00\x5a\xc0\x5b\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x81\x00\x00\x00\x00\x00\x00\x51\x58\x00\x00\x00\x00\x51\x5b\x6a\xd2\x4f\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xe1\x00\x00\x00\x00\x6a\xd3\x6a\xd4\x4f\xaa\x00\x00\x00\x00\x6a\xd5\x00\x00\x00\x00\x00\x00\x6a\xda\x00\x00\x6a\xd6\x6a\xd9\x00\x00\x4d\xfc\x00\x00\x6a\xd7\x6a\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xe1\x56\xc6\x6a\xdb\x00\x00\x49\xd9\x00\x00\x00\x00\x52\x73\x00\x00\x00\x00\x5a\xe2\x50\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xe8\x00\x00\x00\x00\x58\x55\x00\x00\x00\x00\x00\x00\x00\x00", /* 7d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x78\x00\x00\x56\x98\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x95\x00\x00\x00\x00\x00\x00\x5c\x6f\x00\x00\x00\x00\x00\x00\x50\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e80 */ "\x00\x00\x00\x00\x5c\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xed\x00\x00\x00\x00\x00\x00\x63\xf8\x4f\xbf\x63\xf9\x4d\xeb\x63\xfa\x58\x6b\x63\xfb\x5a\xbb\x4e\xb5\x63\xfc\x63\xfd\x4e\xcc\x54\xd1\x57\xb2\x64\x41\x00\x00\x4a\xbe\x64\x42\x55\x54\x4c\xd8\x52\xc8\x00\x00\x5c\x7d\x51\xd9\x4c\x77\x5b\xbc\x57\xc5\x4c\x64\x00\x00\x00\x00\x53\x46\x64\x43\x58\x7f\x64\x44\x64\x45\x64\x46\x51\x57\x5c\x8a\x55\x91\x58\x58\x5b\xae\x5b\xd4\x64\x47\x48\xec\x64\x48\x64\x49\x55\x7c\x59\xee\x4f\xac\x64\x4a\x48\xf2\x54\xdd\x4f\x82\x64\x4b\x54\xc5\x00\x00\x64\x4c\x4e\x87\x4c\xf7\x59\x44\x64\x4d\x51\xe6\x4f\xf7\x4f\x6a\x57\x53\x64\x4e\x64\x4f\x4f\xed\x58\xe4\x00\x00\x56\x88\x56\xcf\x4e\xcb\x64\x50\x4e\xa7\x58\xf6\x64\x51\x00\x00\x58\xf7\x64\x52\x64\x53\x4a\xc1\x64\x54\x64\x55\x55\x9f\x57\xab\x52\x81\x64\x57\x49\x61\x4a\x92\x00\x00\x64\x58\x64\x59\x5c\x7b\x5b\x60\x64\x5a\x51\xcb", /* 7f00 */ "\x5c\x5a\x64\x5b\x64\x5c\x64\x5d\x4e\xe9\x52\x86\x50\xc1\x64\x5e\x64\x5f\x4e\xa8\x00\x00\x64\x60\x64\x61\x64\x56\x4b\xcf\x64\x62\x00\x00\x64\x63\x64\x64\x4e\x5a\x4b\x7e\x51\xc5\x49\x81\x64\x65\x5a\xb4\x64\x66\x4c\xbe\x64\x68\x64\x67\x4c\x8d\x00\x00\x64\x69\x49\xf7\x64\x6a\x64\x6b\x64\x6c\x64\x6d\x64\x6e\x64\x6f\x64\x70\x5a\x47\x56\x96\x64\x71\x64\x72\x64\x73\x64\x74\x55\x69\x64\x75\x64\x76\x64\x77\x64\x78\x64\x79\x4f\x69\x64\x7a\x6a\x5e\x00\x00\x4c\xd6\x00\x00\x54\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x5f\x00\x00\x6a\x60\x6a\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x7e\x57\x99\x00\x00\x00\x00\x5c\xe7\x4d\xb0\x00\x00\x51\xdd\x67\xb6\x00\x00\x4c\x43\x00\x00\x00\x00\x00\x00\x00\x00\x67\xb8\x00\x00\x67\xb7\x48\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xba\x5b\x76\x5c\x90\x00\x00\x00\x00\x00\x00\x5b\xc2\x00\x00\x00\x00\x67\xbc\x55\xef\x00\x00\x67\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x67\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x67\xbf\x00\x00", /* 7f80 */ "\x00\x00\x67\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x93\x00\x00\x54\x5c\x00\x00\x52\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x88\x00\x00\x00\x00\x6a\xc5\x58\xde\x6a\xc6\x00\x00\x58\x7b\x00\x00\x00\x00\x54\xb9\x00\x00\x00\x00\x6a\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xc8\x6a\xc9\x00\x00\x6a\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x9b\x4c\xfd\x00\x00\x00\x00\x63\x92\x5a\x91\x00\x00\x6a\xdf\x00\x00\x57\xcb\x00\x00\x00\x00\x00\x00\x4a\x82\x00\x00\x00\x00\x00\x00\x00\x00\x69\x54\x00\x00\x59\xed\x00\x00\x6a\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x89\x6a\xe1\x00\x00\x00\x00\x54\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x74\x4a\xe3\x6a\xe3\x00\x00\x00\x00\x00\x00\x6a\xe2\x6a\xe4\x00\x00\x00\x00\x6a\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xe6\x00\x00\x4d\xb1\x48\xbe\x00\x00\x6a\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x4d\x59\xec\x00\x00\x00\x00\x00\x00", /* 8000 */ "\x59\xaa\x50\xce\x00\x00\x50\x5c\x66\x43\x5b\x7f\x65\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x69\x94\x4b\xf7\x56\x43\x00\x00\x00\x00\x52\xcc\x00\x00\x69\x88\x00\x00\x69\x89\x4c\xfa\x69\x8a\x4d\xc3\x5a\xc4\x48\xd1\x00\x00\x00\x00\x69\x8b\x00\x00\x00\x00\x00\x00\x69\x8c\x00\x00\x69\x8d\x00\x00\x00\x00\x69\x8e\x69\x8f\x69\x90\x69\x92\x69\x91\x53\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x93\x00\x00\x4b\xf9\x00\x00\x69\x95\x59\xad\x5f\xc6\x56\x6a\x00\x00\x00\x00\x4a\x7c\x00\x00\x4b\x42\x00\x00\x4d\x42\x00\x00\x00\x00\x52\xf3\x69\x96\x00\x00\x00\x00\x69\x97\x00\x00\x00\x00\x00\x00\x51\x64\x51\x9c\x5b\xaf\x69\x98\x00\x00\x00\x00\x00\x00\x00\x00\x69\x99\x00\x00\x51\x4a\x00\x00\x00\x00\x00\x00\x53\xb7\x00\x00\x4f\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x9a\x4a\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x52", /* 8080 */ "\x67\x51\x00\x00\x00\x00\x56\x81\x59\xdd\x00\x00\x56\x61\x5b\x78\x00\x00\x54\xe1\x00\x00\x50\xde\x4e\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x61\x00\x00\x00\x00\x58\xa3\x00\x00\x5b\xe1\x00\x00\x4b\xc6\x4c\xd7\x66\x60\x4c\xcd\x00\x00\x66\x5f\x4a\x46\x4d\x69\x5b\xaa\x00\x00\x4c\x95\x4c\x6a\x00\x00\x00\x00\x00\x00\x4e\xe6\x4c\x5e\x66\x66\x00\x00\x66\x67\x48\xb8\x50\x6f\x00\x00\x66\x65\x5a\x9e\x00\x00\x66\x68\x00\x00\x00\x00\x66\x69\x00\x00\x00\x00\x4c\x6e\x00\x00\x66\x62\x66\x64\x55\x97\x5b\xd6\x5b\x6d\x58\xb1\x66\x6f\x57\xb7\x66\x70\x00\x00\x4b\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x53\x66\x72\x56\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x76\x66\x73\x00\x00\x66\x71\x53\x7f\x66\x6e\x55\xa3\x66\x75\x48\xfa\x00\x00\x00\x00\x4d\xf9\x00\x00\x00\x00\x5c\xb6\x69\x84\x00\x00\x66\x6a\x66\x6b\x66\x6c\x66\x6d\x66\x76\x63\xbf\x66\x79\x00\x00\x50\x89\x59\xc7\x66\x77\x66\x7c\x4c\xeb\x66\x78\x00\x00\x4f\x5a\x00\x00\x58\xd7\x00\x00\x48\xb6\x00\x00\x66\x7d\x52\xdb\x00\x00\x00\x00", /* 8100 */ "\x00\x00\x00\x00\x5b\xab\x00\x00\x00\x00\x00\x00\x4a\xdf\x00\x00\x00\x00\x51\xf5\x4e\xb8\x00\x00\x00\x00\x66\x7a\x66\x7b\x5a\xdf\x53\xe9\x52\xd3\x66\x7f\x53\x47\x5d\x96\x00\x00\x49\xb0\x00\x00\x66\x85\x00\x00\x4f\x65\x00\x00\x00\x00\x00\x00\x66\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x84\x00\x00\x00\x00\x4c\xab\x00\x00\x57\x71\x66\x86\x00\x00\x00\x00\x00\x00\x66\x82\x00\x00\x51\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xf2\x00\x00\x66\x87\x00\x00\x50\xaf\x59\xb7\x66\x88\x00\x00\x00\x00\x00\x00\x4c\xae\x4c\xac\x00\x00\x66\x89\x54\x5b\x57\x94\x00\x00\x00\x00\x00\x00\x66\x8b\x66\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x58\xc7\x00\x00\x66\x93\x00\x00\x66\x8f\x00\x00\x00\x00\x00\x00\x66\x92\x54\xf8\x00\x00\x59\x9d\x66\x8d\x00\x00\x00\x00\x66\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xb8\x58\x79\x52\xe4\x66\x90\x66\x91\x56\xd9\x57\x68", /* 8180 */ "\x48\xf1\x00\x00\x66\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x96\x00\x00\x49\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xdf\x00\x00\x66\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x8d\x00\x00\x00\x00\x56\xc4\x52\xa3\x58\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x9a\x00\x00\x00\x00\x66\xa1\x00\x00\x53\x93\x00\x00\x66\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xde\x66\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x57\x6e\x66\xa0\x49\x7b\x5a\x57\x00\x00\x00\x00\x59\xdb\x00\x00\x00\x00\x00\x00\x66\x9e\x00\x00\x66\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x5c\x00\x00\x00\x00\x00\x00\x65\xaf\x00\x00\x00\x00\x5c\x74\x00\x00\x6a\xaa\x4a\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc0\x5b\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x8a\x4f\xc9\x00\x00\x6a\xa6\x00\x00", /* 8200 */ "\x59\xa7\x6a\xa7\x6a\xa8\x00\x00\x6a\xa9\x4f\xca\x5a\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x81\x55\x82\x00\x00\x00\x00\x6a\x62\x00\x00\x55\xe5\x00\x00\x56\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb5\x56\x54\x00\x00\x57\xe7\x5b\xda\x00\x00\x6a\xac\x6a\xad\x6a\xae\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xb1\x00\x00\x4d\xbc\x6a\xb2\x48\xe2\x6a\xaf\x00\x00\x6a\xb0\x4f\x42\x49\xd4\x00\x00\x6a\xb5\x6a\xb6\x4b\xe5\x49\xaf\x58\x6f\x6a\xb3\x4a\xab\x00\x00\x6a\xb4\x00\x00\x00\x00\x6a\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xb8\x00\x00\x00\x00\x57\x47\x00\x00\x6a\xb9\x00\x00\x6a\xba\x00\x00\x00\x00\x00\x00\x6a\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x72\x00\x00\x6a\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xdd\x51\x5c\x4e\xe7\x00\x00\x55\x4b\x59\x7e\x63\x96\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xb2\x59\xd4\x00\x00\x00\x00\x5e\xb3\x48\xab\x5e\xb4", /* 8280 */ "\x00\x00\x00\x00\x4f\x7a\x00\x00\x5e\xb8\x00\x00\x00\x00\x00\x00\x5c\xc1\x00\x00\x5e\xb6\x5a\x94\x00\x00\x55\x76\x5e\xb9\x5e\xb5\x00\x00\x5e\xba\x52\x42\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xbb\x5e\xc4\x5e\xbc\x00\x00\x00\x00\x57\xde\x5b\xa4\x00\x00\x5e\xce\x00\x00\x5e\xcc\x00\x00\x00\x00\x5e\xd1\x4f\x87\x51\xaa\x00\x00\x5e\xb7\x5e\xca\x5e\xcd\x5e\xbd\x4c\x72\x48\xc4\x5e\xc6\x58\xbd\x5e\xc0\x4e\x48\x00\x00\x4c\x5c\x5e\xcb\x00\x00\x00\x00\x5e\xc5\x5e\xbe\x54\x7b\x00\x00\x00\x00\x00\x00\x59\x5f\x5e\xbf\x00\x00\x00\x00\x5e\xc9\x00\x00\x00\x00\x5e\xcf\x00\x00\x00\x00\x57\xac\x5e\xc1\x00\x00\x5e\xc2\x5e\xc7\x5e\xc8\x49\xd3\x5e\xd0\x56\x75\x00\x00\x5a\xb6\x5e\xda\x5e\xde\x56\xa5\x5e\xe5\x00\x00\x52\x88\x5e\xdb\x00\x00\x00\x00\x50\x61\x5e\xd8\x00\x00\x48\xf9\x4d\x56\x5e\xe4\x5e\xd2\x00\x00\x5e\xc3\x5e\xd5\x54\xf3\x50\x81\x00\x00\x00\x00\x00\x00\x00\x00\x55\x5b\x00\x00\x00\x00\x00\x00\x49\x5d\x00\x00\x5a\x42\x00\x00\x00\x00\x5e\xd9\x00\x00\x00\x00\x5e\xd4\x00\x00\x53\xba\x00\x00\x5e\xdd\x00\x00\x00\x00\x00\x00\x00\x00", /* 8300 */ "\x00\x00\x5c\x62\x52\x4f\x4c\x56\x54\x71\x52\x49\x5e\xe1\x5e\xd7\x5e\xea\x5e\xd3\x00\x00\x00\x00\x5e\xdc\x00\x00\x4f\xa4\x5e\xd6\x00\x00\x5e\xdf\x00\x00\x00\x00\x5e\xe2\x5e\xe3\x00\x00\x5e\xf7\x00\x00\x00\x00\x5e\xe0\x5f\x42\x5e\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xea\x4a\xc3\x00\x00\x00\x00\x52\x43\x49\xe6\x5e\xf9\x00\x00\x5e\xf1\x00\x00\x5e\xee\x00\x00\x5e\xfb\x5e\xed\x59\xef\x49\xe7\x00\x00\x54\xd6\x54\xe2\x5e\xfa\x00\x00\x5e\xec\x00\x00\x00\x00\x00\x00\x5e\xf6\x00\x00\x00\x00\x5e\xf4\x00\x00\x00\x00\x4f\xa2\x5e\xf3\x00\x00\x49\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xf2\x4e\xf5\x5e\xe7\x4e\x64\x00\x00\x50\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xd3\x5e\xe8\x5e\xe9\x00\x00\x5e\xf0\x5e\xf5\x5e\xf8\x4b\x54\x00\x00\x54\xd8\x4e\x88\x5e\xfd\x5e\xfc\x5a\x4b\x5f\x41\x5f\x43\x5f\x45\x59\xf0\x5f\x44\x5f\x46\x5f\x47\x59\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xc8\x5f\x49\x00\x00\x00\x00\x5f\x56\x5f\x51\x5f\x54\x00\x00\x00\x00", /* 8380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x50\x53\xcd\x00\x00\x00\x00\x50\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4f\x00\x00\x00\x00\x00\x00\x5e\xeb\x5f\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x57\x00\x00\x00\x00\x5e\xef\x5f\x4f\x00\x00\x5f\x58\x00\x00\x5f\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x59\x5f\x53\x5f\x4d\x52\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x48\x50\xb2\x51\x4b\x5f\x4a\x5f\x4b\x00\x00\x5f\x52\x4e\x92\x5f\x55\x5a\x48\x5f\x5a\x00\x00\x5f\x5b\x52\x47\x00\x00\x00\x00\x5f\x72\x5f\x5c\x00\x00\x00\x00\x00\x00\x5f\x71\x00\x00\x4d\x5d\x00\x00\x00\x00\x4f\xd4\x00\x00\x4f\xf9\x00\x00\x00\x00\x4d\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x6a\x00\x00\x5f\x65\x00\x00\x5f\x5f\x00\x00\x00\x00\x00\x00\x49\xca\x5f\x63\x00\x00\x5f\x6b\x49\xa3\x5f\x75\x00\x00\x00\x00\x00\x00\x5f\x5e\x00\x00\x00\x00\x00\x00\x53\xcf\x5f\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x74\x51\x83\x4c\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x6e\x5f\x6f\x00\x00\x00\x00\x00\x00\x5f\x64\x00\x00\x00\x00", /* 8400 */ "\x00\x00\x5f\x5d\x00\x00\x5f\x6d\x56\xd0\x00\x00\x5f\x69\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x62\x52\x68\x53\xbb\x57\xad\x5f\x6c\x00\x00\x5f\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x61\x00\x00\x00\x00\x00\x00\x5f\x66\x51\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x49\x5a\x4a\x5f\x73\x58\x95\x54\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x67\x00\x00\x00\x00\x00\x00\x5f\x81\x51\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xf7\x00\x00\x5f\x79\x5f\x78\x4c\xef\x5f\x76\x00\x00\x00\x00\x00\x00\x00\x00\x53\xce\x00\x00\x4b\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x83\x00\x00\x4d\xf8\x5a\xe0\x5f\x88\x00\x00\x00\x00\x00\x00\x4a\xcf\x00\x00\x5f\x7a\x00\x00\x50\x9c\x5f\x84\x00\x00\x5f\x7f\x00\x00\x5f\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8480 */ "\x00\x00\x00\x00\x4b\x79\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7b\x5f\x7c\x5f\x7e\x00\x00\x4f\x4f\x5f\x85\x00\x00\x5f\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x96\x00\x00\x52\x69\x00\x00\x00\x00\x56\x83\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xe0\x00\x00\x00\x00\x53\xd0\x00\x00\x5f\x95\x00\x00\x00\x00\x00\x00\x5b\x95\x5f\x94\x5f\x91\x00\x00\x00\x00\x5f\x8d\x00\x00\x5f\x90\x00\x00\x5f\x89\x00\x00\x00\x00\x58\xed\x00\x00\x00\x00\x00\x00\x00\x00\x54\xd7\x5f\x8f\x00\x00\x00\x00\x5f\x8a\x00\x00\x00\x00\x5f\x8b\x56\x93\x00\x00\x5f\x8e\x00\x00\x00\x00\x49\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xb5\x00\x00\x4e\xba\x5f\x92\x00\x00\x00\x00\x5f\x98\x00\x00\x5f\x97\x5f\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x8f\x00\x00\x00\x00\x00\x00\x5f\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa3\x00\x00\x00\x00\x5f\xa2", /* 8500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x99\x00\x00\x00\x00\x00\x00\x00\x00\x52\x90\x00\x00\x51\xfa\x00\x00\x00\x00\x00\x00\x5b\x82\x00\x00\x00\x00\x57\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x9e\x00\x00\x49\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xe7\x55\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x5e\x5f\x9b\x5f\x9d\x5f\x9f\x5f\xa1\x48\xa9\x49\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xab\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa5\x4f\x56\x54\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa0\x00\x00\x00\x00\x5f\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xa7\x00\x00\x00\x00\x00\x00\x5f\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xac\x00\x00\x5a\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb2\x5f\xa9\x5f\xad\x00\x00\x00\x00\x50\xd8\x00\x00", /* 8580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x49\x41\x5f\xb5\x00\x00\x5f\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x46\x5f\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xae\x00\x00\x00\x00\x00\x00\x5f\xaf\x00\x00\x58\xbc\x00\x00\x00\x00\x00\x00\x5f\xb3\x55\xec\x5f\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xb7\x00\x00\x5f\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xd7\x52\x8b\x00\x00\x00\x00\x5f\xb9\x00\x00\x53\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xe4\x00\x00\x00\x00\x00\x00\x5f\xbc", /* 8600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xbd\x00\x00\x5f\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x5a\x00\x00\x00\x00\x00\x00\x5f\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xad\x4e\x42\x51\xb1\x53\x50\x51\xc6\x00\x00\x00\x00\x69\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xe8\x00\x00\x00\x00\x00\x00\x5a\x7d\x00\x00\x00\x00\x00\x00\x66\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x87\x69\xaf\x00\x00\x69\xb0\x00\x00\x00\x00\x55\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe6\x69\xb2\x69\xb4\x69\xb3\x56\x85\x58\x5a\x69\xb1", /* 8680 */ "\x55\xb3\x59\xce\x51\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc2\x69\xb7\x48\xf5\x69\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xbd\x00\x00\x49\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x61\x69\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xbb\x5a\xe8\x00\x00\x00\x00\x69\xba\x69\xb5\x69\xbe\x69\xbc\x00\x00\x69\xb8\x00\x00\x00\x00\x69\xc6\x69\xc3\x69\xc5\x00\x00\x00\x00\x69\xc9\x69\xc1\x69\xbf\x00\x00\x00\x00\x00\x00\x69\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xfa\x00\x00\x00\x00\x00\x00\x69\xc0\x00\x00\x54\x9a\x55\x7f\x00\x00\x69\xc7\x4d\x66\x4b\x50\x00\x00\x00\x00\x69\xc2\x69\xc8\x69\xcf\x69\xd5\x00\x00\x00\x00\x4e\x77\x00\x00\x00\x00\x00\x00\x69\xd4\x57\x7c\x00\x00\x5b\xea\x00\x00\x00\x00\x69\xd1\x69\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x69\xca\x00\x00\x00\x00\x00\x00\x69\xcd\x51\xf8\x00\x00\x5b\x7d\x69\xcb\x69\xcc\x69\xce\x69\xd2\x00\x00\x00\x00\x00\x00\x69\xd8\x5a\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xe9\x00\x00", /* 8700 */ "\x55\xf0\x00\x00\x4c\x85\x69\xd6\x00\x00\x00\x00\x00\x00\x69\xd7\x69\xd9\x69\xdc\x69\xda\x00\x00\x00\x00\x69\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x59\x71\x69\xd0\x00\x00\x57\x69\x00\x00\x57\xce\x5b\xa8\x00\x00\x69\xe2\x00\x00\x52\x7b\x00\x00\x69\xdf\x00\x00\x00\x00\x50\xae\x69\xeb\x69\xdd\x00\x00\x69\xe0\x00\x00\x00\x00\x00\x00\x69\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x69\xe1\x00\x00\x00\x00\x69\xe6\x00\x00\x00\x00\x69\xe5\x00\x00\x00\x00\x69\xe8\x00\x00\x00\x00\x00\x00\x69\xde\x00\x00\x00\x00\x69\xe3\x69\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x4c\x69\xe4\x49\xf4\x00\x00\x00\x00\x69\xf1\x00\x00\x58\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x69\xf4\x00\x00\x00\x00\x00\x00\x4e\x68\x00\x00\x69\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xef\x00\x00\x00\x00\x69\xf5\x69\xf7\x69\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xf2\x00\x00\x69\xf0\x00\x00\x00\x00\x00\x00\x4d\xfa\x00\x00\x4b\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x69\xee\x69\xf6\x69\xec\x69\xed\x00\x00", /* 8780 */ "\x00\x00\x00\x00\x69\xea\x6a\x46\x00\x00\x6a\x43\x00\x00\x00\x00\x6a\x42\x00\x00\x00\x00\x69\xf3\x00\x00\x54\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xfa\x00\x00\x00\x00\x00\x00\x6a\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xfc\x00\x00\x00\x00\x6a\x47\x6a\x49\x6a\x44\x00\x00\x69\xfb\x00\x00\x00\x00\x00\x00\x6a\x4b\x00\x00\x6a\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x51\xdc\x00\x00\x00\x00\x6a\x4e\x00\x00\x00\x00\x6a\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x41\x00\x00\x00\x00\x00\x00\x6a\x51\x6a\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x4f\x69\xfd\x6a\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x52\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x54\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x48\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x53\x00\x00\x00\x00\x00\x00\x6a\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x58\x00\x00", /* 8800 */ "\x00\x00\x00\x00\x00\x00\x5d\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x57\x00\x00\x54\xe3\x6a\x56\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x5b\x4a\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x5c\x00\x00\x00\x00\x6a\x5d\x00\x00\x00\x00\x00\x00\x59\x4a\x00\x00\x00\x00\x00\x00\x6a\xab\x58\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xcf\x59\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x6e\x00\x00\x00\x00\x4f\x76\x00\x00\x59\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe1\x61\x8a\x59\xc1\x69\x62\x49\xb8\x00\x00\x00\x00\x49\x8e\x69\x63\x00\x00\x55\x60\x4a\x64\x00\x00\x5d\x93\x00\x00\x56\x45\x00\x00\x69\x64\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x65\x6a\xbf\x69\x66", /* 8880 */ "\x00\x00\x5a\xab\x69\x67\x00\x00\x48\xbf\x6a\xc0\x00\x00\x00\x00\x6a\xc1\x00\x00\x00\x00\x4a\xfb\x00\x00\x53\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x56\xba\x00\x00\x00\x00\x00\x00\x58\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x68\x00\x00\x5d\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x5b\x00\x00\x58\x4e\x00\x00\x00\x00\x00\x00\x4c\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x69\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x49\xc2\x51\x71\x00\x00\x00\x00\x5c\x50\x69\x69\x00\x00\x00\x00\x69\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x69\x6e\x00\x00\x00\x00\x00\x00\x5d\x97\x00\x00\x59\xe0\x5a\xa2\x00\x00\x00\x00\x6a\xc2\x54\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xc3\x00\x00\x00\x00\x69\x6d\x69\x6f\x50\x84\x69\x70\x00\x00\x00\x00\x69\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x76\x69\x71\x00\x00\x55\x71\x53\x82\x00\x00\x00\x00\x00\x00\x51\xe2\x4d\x9d\x00\x00\x00\x00\x69\x73\x00\x00\x69\x75\x00\x00", /* 8900 */ "\x00\x00\x00\x00\x4d\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xd5\x00\x00\x48\xfc\x69\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x78\x69\x72\x69\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x77\x00\x00\x00\x00\x00\x00\x54\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x57\x6a\x69\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x63\x5d\x00\x00\x00\x00\x00\x00\x69\x7c\x00\x00\x69\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x7f\x00\x00\x00\x00\x58\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xc4\x4f\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x82\x00\x00\x00\x00\x00\x00\x57\xf6", /* 8980 */ "\x00\x00\x59\xa9\x00\x00\x69\x9c\x00\x00\x00\x00\x4c\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xfa\x4d\x7b\x00\x00\x4d\x87\x52\x79\x55\xd2\x65\xe7\x50\xbf\x4f\xf4\x65\xe8\x65\xe9\x65\xea\x00\x00\x65\xeb\x65\xec\x65\xed\x65\xee\x4f\x67\x00\x00\x00\x00\x00\x00\x6b\x9c\x00\x00\x00\x00\x00\x00\x6b\x9e\x00\x00\x6b\x9f\x00\x00\x6b\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x83\x00\x00\x6b\xa0\x4a\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xa1\x00\x00\x00\x00\x00\x00\x6b\xa2\x00\x00\x00\x00\x00\x00\x66\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8a00 */ "\x59\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x9f\x56\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8b80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xa4\x4e\xc5\x4b\xa8\x4c\xbb\x54\xce\x4e\xa4\x5d\xa5\x5d\xa6\x56\xd5\x54\xc2\x5d\xa7\x53\xfc\x00\x00\x59\x55\x59\xe8\x59\x56\x4e\xc6\x00\x00\x4f\x52\x4e\x85\x5d\xa8\x5d\xa9\x59\x68\x5d\xaa\x58\xec\x4b\xee\x51\xda\x00\x00\x56\x6f\x4c\x8e\x55\x89\x4c\x63\x4f\xf6\x5b\xa3\x5d\xab\x5d\xac\x53\xbf\x5c\x88\x55\xb5\x00\x00\x5b\x49\x56\x7f\x5b\x90\x5d\xad\x5b\xde\x4a\xc9\x5d\xaf\x5d\xae\x00\x00\x59\xea\x5d\xb0\x5d\xb1\x5d\xb2\x55\xd3\x5d\xb3\x55\xaa\x5d\xb4\x5d\xb5\x4a\x6f\x5b\xee\x5d\xb6\x4e\x50\x4b\x4e\x5d\xb7\x5d\xb8\x4d\x8f\x59\x4f\x59\xe7\x5d\xb9\x4c\xc2\x58\x8b\x49\xee\x5d\xba\x5d\xbb\x00\x00\x4f\x8c\x57\xdb\x5a\x90\x5d\xbc\x57\xf2\x5d\xbd\x5a\x75\x4e\x86\x5d\xbe\x56\x55\x56\x70\x5d\xbf\x54\x8c\x5b\xed\x5d\xc0\x53\x55\x4b\xc0\x5d\xc1\x4c\x6c\x50\x6e\x5d\xc2", /* 8c00 */ "\x5d\xc3\x56\x4d\x5d\xc4\x4b\x98\x5d\xc5\x51\x62\x5c\x5b\x5d\xc6\x56\xb7\x00\x00\x59\xe9\x52\xb0\x5d\xc7\x4b\x9e\x4e\x71\x5d\xc8\x58\xb2\x5d\xc9\x5d\xca\x57\xbc\x5d\xcb\x5d\xcc\x5d\xcd\x49\xf6\x5d\xd0\x5d\xce\x59\x89\x5d\xcf\x52\x75\x5d\xd1\x00\x00\x5d\xd2\x5d\xd3\x5d\xd4\x58\xba\x59\xa4\x48\xf8\x5d\xd5\x54\x4b\x5d\xd6\x4f\x98\x52\x41\x5d\xd7\x5d\xd8\x52\x9e\x56\xb6\x5d\xd9\x5d\xda\x50\xbd\x53\xd6\x5d\xdb\x5d\xdc\x54\x54\x5d\xdd\x5d\xde\x4d\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xb8\x6a\xf7\x00\x00\x6a\xf8\x00\x00\x00\x00\x57\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x59\x00\x00\x00\x00\x00\x00\x00\x00\x66\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x94\x4e\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xbf\x5a\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x79\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x95\x49\x4a\x49\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8c80 */ "\x00\x00\x00\x00\x6b\x96\x00\x00\x00\x00\x6b\x98\x00\x00\x00\x00\x00\x00\x4d\xd0\x6b\x97\x00\x00\x52\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x9a\x00\x00\x00\x00\x00\x00\x6b\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x54\x5b\x8b\x4c\xb9\x00\x00\x4d\x51\x49\xc5\x5a\xef\x58\x6d\x48\xdb\x5b\x6b\x4e\x96\x5b\xc9\x4c\x57\x56\xaf\x53\xb5\x49\x82\x4d\x5a\x5b\xfb\x4d\x82\x4c\x41\x4e\xf9\x65\xd9\x65\xda\x56\xf8\x4d\x94\x65\xdb\x4a\xfa\x52\x53\x4c\x71\x4d\xd7\x65\xdc\x5a\xf3\x65\xdd\x4e\xd5\x4e\x7f\x65\xde\x51\x7e\x51\xb7\x5a\xde\x5c\x6a\x65\xdf\x65\xe0\x65\xe3\x65\xe1\x65\xe2\x55\x7e\x4c\xb2\x4b\xc3\x65\xe4\x55\xe9\x55\x6d\x4a\xcc\x00\x00\x00\x00\x61\xd8\x53\x83\x65\xe5\x50\xb4\x00\x00\x5c\x58\x65\xe6\x5c\x4c\x54\xfb\x5c\xd2\x5c\xcc\x5a\xdd\x00\x00\x5a\xf8\x55\x64\x5a\x4e\x4c\xd2\x4a\x81\x00\x00\x55\x83\x6a\xf5\x00\x00\x00\x00\x00\x00\x4d\xd4\x00\x00\x6a\xf6\x00\x00\x00\x00\x5c\x7f\x00\x00\x00\x00\x6a\xf0\x4c\xaf\x5b\x74\x4c\xce\x53\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8d80 */ "\x00\x00\x4a\x63\x00\x00\x00\x00\x6a\xf1\x4a\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xbc\x54\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xf3\x00\x00\x00\x00\x6a\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xca\x00\x00\x00\x00\x00\x00\x54\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xf4\x00\x00\x5c\x84\x53\x5f\x6b\x60\x00\x00\x00\x00\x6b\x5b\x00\x00\x6b\x63\x00\x00\x6b\x62\x00\x00\x5b\xb9\x6b\x61\x00\x00\x00\x00\x00\x00\x5a\xbd\x6b\x64\x00\x00\x6b\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x48\xce\x4b\x99\x00\x00\x6b\x69\x6b\x6a\x00\x00\x53\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x65\x6b\x66\x00\x00\x00\x00\x6b\x67\x6b\x6b\x00\x00\x4f\xdf\x6b\x68\x4c\xf9\x00\x00\x00\x00\x00\x00\x6b\x70\x6b\x73\x00\x00\x00\x00\x00\x00\x50\x88\x00\x00\x4d\x93\x6b\x5c\x6b\x6d\x00\x00\x00\x00\x51\xb6\x00\x00\x00\x00\x00\x00\x56\xf7\x00\x00\x4e\xf8\x00\x00\x6b\x6e\x6b\x6f\x6b\x71\x4b\xe4\x6b\x72\x00\x00\x6b\x75\x00\x00\x00\x00", /* 8e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x5d\x00\x00\x00\x00\x00\x00\x6b\x74\x5a\x5b\x00\x00\x4a\x8d\x00\x00\x00\x00\x56\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x77\x4f\xe0\x6b\x78\x00\x00\x00\x00\x56\xde\x6b\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xc7\x5c\x79\x00\x00\x6b\x79\x00\x00\x6b\x7a\x6b\x7c\x00\x00\x6b\x83\x00\x00\x00\x00\x00\x00\x6b\x81\x00\x00\x00\x00\x00\x00\x6b\x7f\x6b\x7d\x00\x00\x00\x00\x6b\x82\x00\x00\x00\x00\x6b\x7e\x6b\x85\x6b\x86\x00\x00\x56\xe2\x00\x00\x00\x00\x63\x5f\x4b\x58\x6b\x84\x6b\x89\x56\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x87\x6b\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x64\x00\x00\x00\x00\x6b\x5f\x00\x00\x00\x00\x4b\x65\x49\xe3\x00\x00\x6b\x8d\x6b\x8a\x00\x00\x4b\xd6\x00\x00\x6b\x8e\x00\x00\x6b\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x8c\x00\x00\x00\x00\x4a\xd9", /* 8e80 */ "\x00\x00\x5a\xe9\x00\x00\x00\x00\x00\x00\x6b\x8f\x00\x00\x4a\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x90\x6b\x92\x00\x00\x00\x00\x00\x00\x6b\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x93\x00\x00\x6b\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x8e\x4d\x4a\x00\x00\x00\x00\x54\x9c\x00\x00\x00\x00\x4b\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x55\x5a\xfd\x4d\x8d\x58\xf8\x00\x00\x65\x8e\x5c\x4a\x65\x8f\x51\xd5\x54\xec\x4d\xe3\x65\x90\x65\x91\x65\x92\x5b\xe0\x65\x93\x65\x94\x65\x96\x65\x95\x65\x97\x65\x98\x54\x82\x65\x99\x5a\xd7\x65\x9a\x4f\x6e", /* 8f80 */ "\x00\x00\x65\x9b\x65\x9c\x4f\x6f\x65\x9d\x4c\xa7\x51\x5e\x65\x9e\x49\x52\x4e\x74\x4d\x96\x65\x9f\x00\x00\x65\xa0\x65\xa1\x65\xa2\x4c\x99\x4e\xac\x00\x00\x55\xe3\x60\xcd\x5a\xae\x58\x5d\x5b\x57\x65\xa3\x5b\x7e\x65\xa4\x58\xc0\x4d\x5c\x00\x00\x4a\xc6\x49\x79\x00\x00\x00\x00\x00\x00\x50\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x49\x87\x49\x88\x00\x00\x49\x89\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x5d\x54\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x63\x61\x00\x00\x00\x00\x49\x7f\x00\x00\x00\x00\x00\x00\x51\x69\x4a\xee\x00\x00\x00\x00\x54\x48\x5a\x78\x00\x00\x53\xf8\x59\x58\x00\x00\x4d\x9e\x51\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x4d\x00\x00\x5a\xca\x4f\x9d\x00\x00\x63\x62\x4c\x55\x63\x63\x00\x00\x00\x00\x4e\x59\x5b\x83\x00\x00\x4f\x99\x5a\xb5\x57\xa4\x51\x4c\x4a\x79\x00\x00\x00\x00\x56\xf5\x00\x00\x63\x66\x63\x64\x63\x68\x00\x00\x63\x6a\x63\x67\x4b\x6f\x53\xc7\x00\x00\x4b\x9d\x63\x65\x00\x00\x55\xf5\x00\x00\x00\x00\x63\x69\x00\x00\x00\x00\x00\x00\x52\x74\x49\x65\x4e\xa2\x00\x00\x00\x00\x00\x00\x5c\x57\x00\x00\x00\x00", /* 9000 */ "\x57\x6b\x56\x6d\x55\xc9\x56\xd2\x63\x6c\x63\x6b\x52\xe5\x00\x00\x00\x00\x59\x41\x59\x57\x63\x6d\x00\x00\x63\x70\x00\x00\x57\x58\x5b\xef\x63\x6f\x4b\x7d\x00\x00\x57\x5e\x00\x00\x63\x71\x4b\xb9\x00\x00\x00\x00\x57\x48\x4d\x85\x00\x00\x55\xc4\x4a\x71\x56\x79\x5a\xeb\x63\x72\x4c\x8b\x00\x00\x00\x00\x00\x00\x63\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x75\x4a\xfd\x63\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x73\x63\x74\x00\x00\x59\xdc\x00\x00\x00\x00\x51\xde\x49\x66\x00\x00\x5a\x83\x00\x00\x00\x00\x4b\xdc\x56\x8d\x00\x00\x63\x77\x00\x00\x00\x00\x5a\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x8a\x00\x00\x4b\xf3\x63\x7a\x63\x78\x63\x79\x4b\x60\x00\x00\x00\x00\x00\x00\x59\xc4\x63\x7c\x00\x00\x00\x00\x63\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x7d\x54\x52\x00\x00\x59\xa2\x00\x00\x00\x00\x63\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xe1\x5b\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x81\x5c\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x82\x00\x00\x49\x7c", /* 9080 */ "\x59\x9c\x00\x00\x63\x83\x63\x85\x00\x00\x00\x00\x00\x00\x00\x00\x63\x84\x00\x00\x00\x00\x63\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xd7\x00\x00\x4b\x6b\x00\x00\x64\x7f\x00\x00\x5d\xf4\x00\x00\x5d\xf7\x00\x00\x5d\xf5\x00\x00\x5d\xf6\x00\x00\x00\x00\x00\x00\x5d\xf9\x58\xce\x52\xc6\x00\x00\x00\x00\x48\xed\x00\x00\x00\x00\x00\x00\x58\xaf\x00\x00\x5d\xf8\x00\x00\x5a\x6a\x4d\xa9\x5e\x42\x54\x92\x00\x00\x5d\xfb\x5d\xfa\x55\x7b\x5d\xfc\x00\x00\x5e\x41\x5c\x7e\x5d\xfd\x51\x7a\x00\x00\x00\x00\x5e\x45\x00\x00\x00\x00\x5a\x95\x00\x00\x00\x00\x5e\x47\x5e\x44\x00\x00\x5e\x48\x00\x00\x00\x00\x4f\x5c\x00\x00\x00\x00\x00\x00\x50\xc8\x5e\x43\x5e\x46\x5b\xa2\x00\x00\x5e\x49\x00\x00\x00\x00\x00\x00\x5e\x4d\x00\x00\x00\x00\x00\x00\x5e\x4e\x5e\x4c\x4d\xc1\x00\x00\x00\x00\x00\x00\x50\x44\x5e\x4b\x00\x00\x00\x00\x00\x00\x5e\x4a\x5a\xc6\x49\xbe\x00\x00\x00\x00\x5e\x4f\x00\x00\x4d\x9a\x00\x00\x5e\x50\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x5b\x00\x00\x00\x00\x00\x00\x4b\x46\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xbb\x5e\x51\x00\x00", /* 9100 */ "\x00\x00\x00\x00\x4b\xf4\x00\x00\x5e\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x69\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x54\x00\x00\x00\x00\x00\x00\x5e\x53\x5e\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x57\x00\x00\x5e\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x59\x00\x00\x00\x00\x5e\x5a\x00\x00\x00\x00\x5a\x6f\x6a\xf9\x54\x96\x5c\x63\x53\x85\x6a\xfb\x6a\xfc\x6a\xfa\x00\x00\x4f\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x58\xee\x00\x00\x00\x00\x4c\x73\x00\x00\x00\x00\x5a\xcc\x56\xa9\x00\x00\x00\x00\x6b\x42\x6b\x41\x4d\xa7\x6a\xfd\x56\x76\x00\x00\x00\x00\x00\x00\x6b\x44\x50\xd1\x00\x00\x4a\x8b\x00\x00\x57\x4a\x6b\x45\x6b\x43\x4f\x54\x6b\x48\x00\x00\x6b\x49\x4f\x6d\x52\x58\x50\x82\x56\x82\x6b\x4a\x00\x00\x00\x00\x00\x00\x6b\x46\x6b\x47\x52\xef", /* 9180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x4c\x00\x00\x4a\xbb\x00\x00\x5c\x8e\x00\x00\x4a\xd6\x6b\x4b\x6b\x4e\x00\x00\x00\x00\x6b\x4d\x6b\x4f\x58\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x71\x54\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x50\x6b\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x52\x00\x00\x00\x00\x6b\x53\x6b\x54\x6b\x55\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x57\x6b\x56\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xc8\x00\x00\x5a\x74\x55\xcc\x00\x00\x50\xee\x5b\xd7\x59\xaf\x51\x5f\x00\x00\x4f\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9480 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc3\x67\xc4\x67\xc5\x5b\x8c\x4b\xa3\x67\xc7\x67\xc6\x67\xc8\x67\xc9\x54\x45\x67\xca\x67\xcb\x00\x00\x4c\x50\x4b\x97\x67\xcc\x67\xce\x00\x00\x67\xcd\x00\x00\x4c\xc5\x67\xcf\x67\xd0\x67\xd1\x4b\xda\x4a\x4e\x5b\xd2\x52\xc5\x49\x55\x4c\xd5\x67\xd2\x67\xd3\x5a\xbe\x54\x75\x4f\xfa\x57\xd8\x4d\x53\x67\xd5\x67\xd4\x67\xd7\x67\xd6\x53\x45\x67\xd8\x67\xd9\x54\x4e\x67\xda\x54\x4f\x67\xdb\x49\xa6\x67\xdc\x67\xdd\x67\xde\x67\xdf\x67\xe0\x5c\x8b\x67\xe1\x67\xe2\x4e\xd7\x67\xe3\x5a\x6b\x56\xf9\x49\xab\x51\x86\x67\xe4\x54\x46\x52\x4d\x00\x00\x67\xe5\x67\xe6\x67\xe7\x67\xe8\x67\xe9\x67\xea\x67\xeb\x00\x00\x67\xec\x67\xed\x67\xee\x00\x00\x00\x00\x67\xef\x67\xf0\x67\xf1\x67\xf3\x67\xf2\x00\x00\x67\xf4\x57\x4d\x51\xc0\x67\xf5\x67\xf6\x67\xf7\x5b\x41\x67\xf8\x58\x53\x67\xf9\x67\xfa\x00\x00\x67\xfb\x67\xfc\x68\x41\x67\xfd\x68\x42\x4c\xf4\x52\x9b\x68\x43\x68\x44\x4f\x62\x59\xbe\x49\xf8\x68\x45\x68\x46\x68\x47\x59\xf7\x68\x48\x5b\xfc\x68\x49\x53\xcb\x00\x00\x68\x4a\x68\x4b\x51\x54\x68\x4c", /* 9500 */ "\x58\x9b\x56\x99\x68\x4e\x68\x4d\x4a\x9b\x4d\x99\x68\x4f\x68\x50\x58\xe1\x68\x51\x68\x52\x4c\x87\x58\xbe\x68\x53\x68\x54\x68\x55\x54\xf0\x56\xdf\x68\x56\x68\x57\x68\x58\x68\x59\x68\x5a\x5b\x81\x68\x5b\x4a\xec\x52\x4a\x68\x5c\x00\x00\x68\x5d\x68\x5e\x68\x5f\x00\x00\x57\xfc\x68\x60\x51\xdf\x4a\xb7\x5c\x56\x4f\x96\x00\x00\x58\x67\x68\x63\x68\x61\x68\x62\x68\x64\x4b\xa6\x4e\xfb\x4f\xe1\x52\x6c\x68\x65\x68\x66\x00\x00\x68\x67\x68\x6f\x68\x68\x68\x69\x68\x6a\x54\x62\x68\x92\x4b\xcc\x68\x6b\x00\x00\x68\x6c\x68\x6d\x4b\xc5\x52\x5e\x68\x6e\x00\x00\x68\x70\x68\x71\x68\x72\x5b\x93\x00\x00\x68\x73\x52\xf6\x00\x00\x68\x74\x52\xf7\x68\x75\x68\x76\x4c\xe3\x48\xf6\x68\x77\x68\x78\x68\x79\x00\x00\x68\x7a\x68\x7b\x68\x7c\x68\x7d\x00\x00\x68\x7e\x4f\xb4\x68\x82\x68\x7f\x68\x81\x00\x00\x68\x83\x68\x84\x51\x6d\x68\x85\x68\x86\x68\x87\x68\x88\x68\x89\x68\x8a\x68\x8b\x68\x8c\x68\x8d\x50\xd7\x00\x00\x68\x8e\x51\x4d\x68\x8f\x68\x90\x68\x91\x00\x00\x00\x00\x58\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x44", /* 9580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x65\x62\x65\x55\x61\x62\x66\x00\x00\x49\x75\x57\xc9\x4a\xb2\x54\xf1\x62\x67\x58\x70\x62\x68\x4e\xe3\x62\x69\x62\x6a\x52\x66\x5b\x42\x52\xd5\x4d\x8c\x57\xc4\x62\x6b\x52\x97\x62\x6c\x00\x00", /* 9600 */ "\x4c\x47\x4c\xf2\x4d\xd1\x62\x6d\x62\x6e\x5a\xc3\x62\x6f\x00\x00\x62\x70\x59\x6b\x62\x71\x62\x72\x62\x73\x62\x74\x59\x76\x62\x75\x49\xfa\x50\xba\x62\x76\x00\x00\x50\xaa\x62\x77\x62\x78\x62\x79\x00\x00\x62\x7a\x62\x7b\x00\x00\x4c\xb6\x5d\xe1\x00\x00\x4b\xd2\x00\x00\x5d\xe3\x5d\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xe5\x00\x00\x00\x00\x00\x00\x54\xed\x00\x00\x00\x00\x5d\xe4\x4c\x60\x59\x95\x59\xf4\x5b\x94\x4f\x77\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x89\x5d\xe7\x5d\xe6\x00\x00\x48\xa1\x57\x73\x00\x00\x5d\xe8\x00\x00\x4c\xbc\x4e\xc9\x51\xbc\x51\xa3\x4a\x62\x5d\xe9\x00\x00\x51\xa9\x52\xaf\x4f\x55\x00\x00\x00\x00\x58\x7e\x00\x00\x00\x00\x00\x00\x5d\xea\x55\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x7d\x00\x00\x00\x00\x00\x00\x5d\xeb\x00\x00\x4b\xb7\x5a\xb9\x00\x00\x4a\x9e\x00\x00\x00\x00\x5d\xec\x5a\xc8\x58\x75\x53\x84\x00\x00\x5d\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xee\x00\x00\x5d\xef\x51\x8b\x56\xd4\x58\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x88\x51\xa0\x00\x00\x5d\xf0\x00\x00\x00\x00\x56\x86\x00\x00\x5d\xf1\x00\x00\x56\x87\x59\xfd\x00\x00\x00\x00\x00\x00\x4c\xf3\x00\x00\x00\x00\x5d\xf2\x48\xae\x58\x56\x00\x00\x00\x00\x5b\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xf3\x00\x00\x00\x00\x62\x64\x00\x00\x00\x00\x51\x45\x00\x00\x00\x00\x6b\xbe\x00\x00\x00\x00\x6b\xbf\x6b\xc0\x52\xd0\x00\x00\x54\xb7\x59\x84\x00\x00\x00\x00\x58\xda\x59\x65\x4e\xae\x4d\x6d\x00\x00\x68\x95\x00\x00\x00\x00\x4a\xc5\x5a\x5a\x6b\xc1\x4a\x9c\x00\x00\x00\x00\x6b\xc2\x00\x00\x00\x00\x4b\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x8b\x6b\xa6\x59\x49\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xa8\x00\x00\x00\x00\x00\x00\x6b\xa7\x00\x00\x00\x00\x51\x84\x50\xd6\x00\x00\x49\x42\x00\x00\x00\x00\x00\x00\x00\x00\x57\xec\x00\x00", /* 9700 */ "\x58\xe7\x6b\xaa\x00\x00\x00\x00\x58\x97\x00\x00\x6b\xa9\x5b\x91\x6b\xab\x52\x59\x00\x00\x00\x00\x00\x00\x4e\x95\x6b\xad\x6b\xac\x00\x00\x00\x00\x00\x00\x52\xdd\x00\x00\x00\x00\x51\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x4a\x00\x00\x58\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xae\x00\x00\x00\x00\x6b\xaf\x00\x00\x00\x00\x6b\xb0\x00\x00\x51\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xd3\x53\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x81\x6b\xa5\x00\x00\x00\x00\x4f\xb7\x00\x00\x00\x00\x4f\xb1\x00\x00\x4b\x86\x00\x00\x00\x00\x4c\x67\x00\x00\x50\x5f\x52\x72\x52\x87\x00\x00\x00\x00\x5c\xcb\x00\x00\x00\x00\x00\x00\x4c\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x9a\x59\x45\x00\x00\x48\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x50\x00\x00\x00\x00\x00\x00", /* 9780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xab\x00\x00\x48\xaf\x00\x00\x00\x00\x00\x00\x6c\x52\x6c\x53\x00\x00\x6c\x54\x00\x00\x00\x00\x00\x00\x54\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xce\x00\x00\x00\x00\x6c\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x56\x00\x00\x49\x7e\x00\x00\x6c\x55\x00\x00\x00\x00\x6c\x58\x00\x00\x6c\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xa3\x54\xcc\x00\x00\x4d\xaa\x64\xb7\x64\xb8\x64\xb9\x4f\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xf3\x00\x00\x5a\xce\x55\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xb2\x4b\xa4\x54\x8b\x69\x9d\x58\x8f\x56\x53\x58\xea\x64\x90\x57\x88\x4d\x6b\x4b\xd8", /* 9880 */ "\x69\x9e\x48\xe3\x56\x6c\x69\x9f\x5a\xa3\x51\xac\x51\x8d\x53\xc3\x4f\xb0\x69\xa0\x4e\xd4\x00\x00\x69\xa1\x69\xa2\x00\x00\x69\xa3\x59\xc2\x53\xb4\x00\x00\x57\x67\x69\xa4\x00\x00\x5a\x51\x50\x65\x56\xe1\x00\x00\x69\xa5\x69\xa6\x59\x75\x4b\xed\x69\xa7\x69\xa8\x4b\x7f\x69\xa9\x69\xaa\x00\x00\x49\xfb\x69\xab\x69\xac\x54\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x88\x00\x00\x00\x00\x66\xa8\x66\xa9\x66\xaa\x00\x00\x66\xab\x00\x00\x00\x00\x53\xad\x66\xac\x66\xad\x00\x00\x00\x00\x00\x00\x4c\x69\x55\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xb7\x6c\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x70\x00\x00\x00\x00\x49\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x73\x6c\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xba\x00\x00\x4e\xa1\x00\x00\x61\xbb\x61\xbc\x61\xbd\x61\xbe\x61\xbf\x61\xc0\x4c\x59\x59\xfa\x4f\x44\x55\xcd\x49\x45\x56\x67\x00\x00\x61\xc1\x4b\xfb\x54\xc3\x61\xc2\x00\x00\x00\x00\x4f\x68\x00\x00\x49\x9e\x61\xc3\x00\x00\x4b\xf5", /* 9980 */ "\x61\xc4\x52\xd8\x00\x00\x00\x00\x61\xc5\x58\x7a\x4d\x7d\x61\xc6\x50\xa0\x00\x00\x61\xc7\x49\xf5\x00\x00\x61\xc8\x00\x00\x51\x94\x61\xc9\x61\xca\x51\xf7\x61\xcb\x61\xcc\x61\xcd\x55\xd6\x5c\xb7\x5d\x86\x58\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\xa4\x00\x00\x00\x00\x5e\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xec\x5a\xa5\x57\x74\x59\x51\x4a\x7b\x54\x9e\x00\x00\x49\xb4\x51\xbe\x63\xdf\x55\xba\x63\xe0\x63\xe1\x4f\xd3\x63\xe2\x5c\x44\x57\x75\x63\xe4\x4e\xdc\x63\xe3", /* 9a80 */ "\x63\xe5\x63\xe6\x51\xed\x00\x00\x4f\x5e\x63\xe7\x51\xe5\x4d\xa6\x63\xe8\x00\x00\x63\xe9\x4a\x72\x59\x8a\x00\x00\x00\x00\x50\x45\x63\xea\x53\xee\x63\xeb\x63\xec\x00\x00\x00\x00\x63\xed\x53\xac\x63\xee\x00\x00\x55\x47\x63\xef\x63\xf0\x63\xf1\x63\x59\x63\xf2\x63\xf3\x51\xe1\x63\xf4\x63\xf5\x5b\xe7\x63\xf6\x00\x00\x63\xf7\x4d\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x5b\x6c\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x5e\x6c\x5c\x4d\xa0\x00\x00\x6c\x5f\x00\x00\x6c\x60\x00\x00\x00\x00\x00\x00\x6c\x62\x6c\x61\x6c\x64\x00\x00\x00\x00\x6c\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x65\x6c\x66\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x67\x00\x00\x56\x89\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x74\x00\x00\x6c\x75\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x76\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x78\x00\x00\x6c\x7a\x00\x00\x6c\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7b\x00\x00\x6c\x79\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b00 */ "\x00\x00\x00\x00\x00\x00\x5c\x77\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7d\x00\x00\x00\x00\x00\x00\x6c\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7f\x00\x00\x00\x00\x00\x00\x6c\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6b\x00\x00\x00\x00\x5c\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x98\x4d\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x50\x9e\x4e\x8b\x6c\x69\x53\xc6\x6c\x68\x00\x00\x6c\x6a\x6c\x6c\x6c\x6b\x00\x00\x00\x00\x00\x00\x6c\x6d\x00\x00\x57\xb9\x00\x00\x6c\x6e\x00\x00\x00\x00\x52\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b80 */ NULL, /* 9c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x84\x00\x00\x00\x00\x6b\xce", /* 9c80 */ "\x00\x00\x51\xb2\x6b\xcf\x00\x00\x00\x00\x6b\xd0\x6b\xd1\x6b\xd2\x6b\xd3\x00\x00\x00\x00\x6b\xd5\x00\x00\x49\x4b\x6b\xd6\x00\x00\x6b\xd7\x6b\xd8\x6b\xd9\x00\x00\x6b\xda\x6b\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xdc\x6b\xdd\x58\x6a\x00\x00\x6b\xde\x6b\xdf\x6b\xe0\x6b\xe1\x6b\xe2\x6b\xe3\x50\xef\x6b\xe4\x6b\xe5\x6b\xe6\x6b\xe7\x6b\xe8\x00\x00\x6b\xe9\x00\x00\x6b\xea\x6b\xeb\x00\x00\x6b\xec\x6b\xed\x6b\xee\x6b\xef\x6b\xf0\x6b\xf1\x6b\xf2\x6b\xf3\x4f\xa7\x00\x00\x6b\xf4\x6b\xf5\x6b\xf6\x6b\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xf9\x6b\xf8\x6b\xf9\x6b\xfa\x6b\xfb\x00\x00\x00\x00\x6b\xfc\x6b\xfd\x6c\x41\x6c\x42\x6c\x43\x6c\x44\x6c\x45\x00\x00\x00\x00\x6c\x46\x6c\x47\x6c\x48\x49\x8f\x6c\x49\x6c\x4a\x6c\x4b\x00\x00\x00\x00\x6c\x4c\x6c\x4d\x51\x7b\x6c\x4e\x00\x00\x00\x00\x6c\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9d00 */ NULL, /* 9d80 */ NULL, /* 9e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xf0\x68\xae\x4e\xa5\x68\xaf\x52\x9a\x00\x00\x53\x58\x59\x5b\x00\x00\x68\xb0\x68\xb1\x68\xb2\x68\xb3\x68\xb4\x59\x5c\x00\x00\x59\x8d\x00\x00\x68\xb6\x68\xb5\x5a\xa6\x00\x00\x57\x72\x68\xb7\x68\xb9\x68\xb8\x68\xba\x68\xbb\x00\x00\x00\x00\x4c\xea\x68\xbc\x4d\xe7\x00\x00\x68\xbd\x68\xbe\x4f\xe8\x68\xbf\x4b\xeb\x68\xc0\x68\xc1\x68\xc2\x68\xc3\x54\xb4\x68\xc4\x68\xc5\x00\x00\x68\xc6\x53\x95\x00\x00\x68\xc7\x00\x00\x00\x00\x00\x00\x68\xc8\x00\x00\x68\xc9\x6c\x5d\x00\x00\x68\xca\x68\xcb\x68\xcc\x00\x00\x68\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x68\xce\x4d\xd6\x00\x00\x68\xcf\x68\xd0\x68\xd1\x68\xd2\x68\xd3\x68\xd4\x68\xd5\x68\xd7\x00\x00\x00\x00\x5a\x45\x68\xd6\x00\x00\x68\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x5a\x51\xb8", /* 9e80 */ "\x00\x00\x00\x00\x6c\x85\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x86\x6c\x87\x00\x00\x00\x00\x6c\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x89\x51\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x8b\x00\x00\x6c\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xef\x00\x00\x00\x00\x00\x00\x6a\xee\x00\x00\x00\x00\x51\xe8\x00\x00\x6c\x82\x6c\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x66\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x85\x00\x00\x00\x00\x00\x00\x55\xf1\x50\xe7\x68\xa3\x00\x00\x4d\xd9\x00\x00\x00\x00\x54\x4d\x00\x00\x00\x00\x00\x00\x52\xab\x00\x00\x00\x00\x6c\x8d\x6c\x8e\x6c\x8f\x00\x00\x6c\x91\x6c\x90\x00\x00\x6c\x92\x00\x00\x00\x00\x6c\x95\x00\x00\x6c\x94\x00\x00\x6c\x93\x6c\x96\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x8a\x00\x00\x67\x8b\x67\x8c\x00\x00\x6b\xbb\x00\x00", /* 9f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xbc\x00\x00\x6b\xbd\x4b\xa5\x00\x00\x5c\xbd\x00\x00\x00\x00\x4d\x64\x00\x00\x00\x00\x00\x00\x5c\xba\x00\x00\x5e\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xf2\x00\x00\x6c\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x99\x00\x00\x00\x00\x6c\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x9c\x00\x00\x6c\x9b\x00\x00\x49\x67\x00\x00\x6c\x9d\x6c\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xea\x66\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x7d", /* 9f80 */ "\x6b\xb2\x00\x00\x00\x00\x6b\xb3\x51\x85\x6b\xb4\x6b\xb5\x6b\xb6\x6b\xb7\x6b\xb8\x6b\xb9\x54\xa2\x6b\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x9b\x4d\x48\x67\x89\x00\x00\x00\x00\x00\x00\x4d\x8b\x5d\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ "\x76\x41\x76\x42\x76\x43\x76\x44\x76\x45\x76\x46\x76\x47\x76\x48\x76\x49\x76\x4a\x76\x4b\x76\x4c\x76\x4d\x76\x4e\x76\x4f\x76\x50\x76\x51\x76\x52\x76\x53\x76\x54\x76\x55\x76\x56\x76\x57\x76\x58\x76\x59\x76\x5a\x76\x5b\x76\x5c\x76\x5d\x76\x5e\x76\x5f\x76\x60\x76\x61\x76\x62\x76\x63\x76\x64\x76\x65\x76\x66\x76\x67\x76\x68\x76\x69\x76\x6a\x76\x6b\x76\x6c\x76\x6d\x76\x6e\x76\x6f\x76\x70\x76\x71\x76\x72\x76\x73\x76\x74\x76\x75\x76\x76\x76\x77\x76\x78\x76\x79\x76\x7a\x76\x7b\x76\x7c\x76\x7d\x76\x7e\x76\x7f\x76\x81\x76\x82\x76\x83\x76\x84\x76\x85\x76\x86\x76\x87\x76\x88\x76\x89\x76\x8a\x76\x8b\x76\x8c\x76\x8d\x76\x8e\x76\x8f\x76\x90\x76\x91\x76\x92\x76\x93\x76\x94\x76\x95\x76\x96\x76\x97\x76\x98\x76\x99\x76\x9a\x76\x9b\x76\x9c\x76\x9d\x76\x9e\x76\x9f\x76\xa0\x76\xa1\x76\xa2\x76\xa3\x76\xa4\x76\xa5\x76\xa6\x76\xa7\x76\xa8\x76\xa9\x76\xaa\x76\xab\x76\xac\x76\xad\x76\xae\x76\xaf\x76\xb0\x76\xb1\x76\xb2\x76\xb3\x76\xb4\x76\xb5\x76\xb6\x76\xb7\x76\xb8\x76\xb9\x76\xba\x76\xbb\x76\xbc\x76\xbd\x76\xbe\x76\xbf\x76\xc0\x76\xc1", /* e080 */ "\x76\xc2\x76\xc3\x76\xc4\x76\xc5\x76\xc6\x76\xc7\x76\xc8\x76\xc9\x76\xca\x76\xcb\x76\xcc\x76\xcd\x76\xce\x76\xcf\x76\xd0\x76\xd1\x76\xd2\x76\xd3\x76\xd4\x76\xd5\x76\xd6\x76\xd7\x76\xd8\x76\xd9\x76\xda\x76\xdb\x76\xdc\x76\xdd\x76\xde\x76\xdf\x76\xe0\x76\xe1\x76\xe2\x76\xe3\x76\xe4\x76\xe5\x76\xe6\x76\xe7\x76\xe8\x76\xe9\x76\xea\x76\xeb\x76\xec\x76\xed\x76\xee\x76\xef\x76\xf0\x76\xf1\x76\xf2\x76\xf3\x76\xf4\x76\xf5\x76\xf6\x76\xf7\x76\xf8\x76\xf9\x76\xfa\x76\xfb\x76\xfc\x76\xfd\x77\x41\x77\x42\x77\x43\x77\x44\x77\x45\x77\x46\x77\x47\x77\x48\x77\x49\x77\x4a\x77\x4b\x77\x4c\x77\x4d\x77\x4e\x77\x4f\x77\x50\x77\x51\x77\x52\x77\x53\x77\x54\x77\x55\x77\x56\x77\x57\x77\x58\x77\x59\x77\x5a\x77\x5b\x77\x5c\x77\x5d\x77\x5e\x77\x5f\x77\x60\x77\x61\x77\x62\x77\x63\x77\x64\x77\x65\x77\x66\x77\x67\x77\x68\x77\x69\x77\x6a\x77\x6b\x77\x6c\x77\x6d\x77\x6e\x77\x6f\x77\x70\x77\x71\x77\x72\x77\x73\x77\x74\x77\x75\x77\x76\x77\x77\x77\x78\x77\x79\x77\x7a\x77\x7b\x77\x7c\x77\x7d\x77\x7e\x77\x7f\x77\x81\x77\x82\x77\x83\x77\x84\x77\x85", /* e100 */ "\x77\x86\x77\x87\x77\x88\x77\x89\x77\x8a\x77\x8b\x77\x8c\x77\x8d\x77\x8e\x77\x8f\x77\x90\x77\x91\x77\x92\x77\x93\x77\x94\x77\x95\x77\x96\x77\x97\x77\x98\x77\x99\x77\x9a\x77\x9b\x77\x9c\x77\x9d\x77\x9e\x77\x9f\x77\xa0\x77\xa1\x77\xa2\x77\xa3\x77\xa4\x77\xa5\x77\xa6\x77\xa7\x77\xa8\x77\xa9\x77\xaa\x77\xab\x77\xac\x77\xad\x77\xae\x77\xaf\x77\xb0\x77\xb1\x77\xb2\x77\xb3\x77\xb4\x77\xb5\x77\xb6\x77\xb7\x77\xb8\x77\xb9\x77\xba\x77\xbb\x77\xbc\x77\xbd\x77\xbe\x77\xbf\x77\xc0\x77\xc1\x77\xc2\x77\xc3\x77\xc4\x77\xc5\x77\xc6\x77\xc7\x77\xc8\x77\xc9\x77\xca\x77\xcb\x77\xcc\x77\xcd\x77\xce\x77\xcf\x77\xd0\x77\xd1\x77\xd2\x77\xd3\x77\xd4\x77\xd5\x77\xd6\x77\xd7\x77\xd8\x77\xd9\x77\xda\x77\xdb\x77\xdc\x77\xdd\x77\xde\x77\xdf\x77\xe0\x77\xe1\x77\xe2\x77\xe3\x77\xe4\x77\xe5\x77\xe6\x77\xe7\x77\xe8\x77\xe9\x77\xea\x77\xeb\x77\xec\x77\xed\x77\xee\x77\xef\x77\xf0\x77\xf1\x77\xf2\x77\xf3\x77\xf4\x77\xf5\x77\xf6\x77\xf7\x77\xf8\x77\xf9\x77\xfa\x77\xfb\x77\xfc\x77\xfd\x78\x41\x78\x42\x78\x43\x78\x44\x78\x45\x78\x46\x78\x47\x78\x48", /* e180 */ "\x78\x49\x78\x4a\x78\x4b\x78\x4c\x78\x4d\x78\x4e\x78\x4f\x78\x50\x78\x51\x78\x52\x78\x53\x78\x54\x78\x55\x78\x56\x78\x57\x78\x58\x78\x59\x78\x5a\x78\x5b\x78\x5c\x78\x5d\x78\x5e\x78\x5f\x78\x60\x78\x61\x78\x62\x78\x63\x78\x64\x78\x65\x78\x66\x78\x67\x78\x68\x78\x69\x78\x6a\x78\x6b\x78\x6c\x78\x6d\x78\x6e\x78\x6f\x78\x70\x78\x71\x78\x72\x78\x73\x78\x74\x78\x75\x78\x76\x78\x77\x78\x78\x78\x79\x78\x7a\x78\x7b\x78\x7c\x78\x7d\x78\x7e\x78\x7f\x78\x81\x78\x82\x78\x83\x78\x84\x78\x85\x78\x86\x78\x87\x78\x88\x78\x89\x78\x8a\x78\x8b\x78\x8c\x78\x8d\x78\x8e\x78\x8f\x78\x90\x78\x91\x78\x92\x78\x93\x78\x94\x78\x95\x78\x96\x78\x97\x78\x98\x78\x99\x78\x9a\x78\x9b\x78\x9c\x78\x9d\x78\x9e\x78\x9f\x78\xa0\x78\xa1\x78\xa2\x78\xa3\x78\xa4\x78\xa5\x78\xa6\x78\xa7\x78\xa8\x78\xa9\x78\xaa\x78\xab\x78\xac\x78\xad\x78\xae\x78\xaf\x78\xb0\x78\xb1\x78\xb2\x78\xb3\x78\xb4\x78\xb5\x78\xb6\x78\xb7\x78\xb8\x78\xb9\x78\xba\x78\xbb\x78\xbc\x78\xbd\x78\xbe\x78\xbf\x78\xc0\x78\xc1\x78\xc2\x78\xc3\x78\xc4\x78\xc5\x78\xc6\x78\xc7\x78\xc8\x78\xc9", /* e200 */ "\x78\xca\x78\xcb\x78\xcc\x78\xcd\x78\xce\x78\xcf\x78\xd0\x78\xd1\x78\xd2\x78\xd3\x78\xd4\x78\xd5\x78\xd6\x78\xd7\x78\xd8\x78\xd9\x78\xda\x78\xdb\x78\xdc\x78\xdd\x78\xde\x78\xdf\x78\xe0\x78\xe1\x78\xe2\x78\xe3\x78\xe4\x78\xe5\x78\xe6\x78\xe7\x78\xe8\x78\xe9\x78\xea\x78\xeb\x78\xec\x78\xed\x78\xee\x78\xef\x78\xf0\x78\xf1\x78\xf2\x78\xf3\x78\xf4\x78\xf5\x78\xf6\x78\xf7\x78\xf8\x78\xf9\x78\xfa\x78\xfb\x78\xfc\x78\xfd\x79\x41\x79\x42\x79\x43\x79\x44\x79\x45\x79\x46\x79\x47\x79\x48\x79\x49\x79\x4a\x79\x4b\x79\x4c\x79\x4d\x79\x4e\x79\x4f\x79\x50\x79\x51\x79\x52\x79\x53\x79\x54\x79\x55\x79\x56\x79\x57\x79\x58\x79\x59\x79\x5a\x79\x5b\x79\x5c\x79\x5d\x79\x5e\x79\x5f\x79\x60\x79\x61\x79\x62\x79\x63\x79\x64\x79\x65\x79\x66\x79\x67\x79\x68\x79\x69\x79\x6a\x79\x6b\x79\x6c\x79\x6d\x79\x6e\x79\x6f\x79\x70\x79\x71\x79\x72\x79\x73\x79\x74\x79\x75\x79\x76\x79\x77\x79\x78\x79\x79\x79\x7a\x79\x7b\x79\x7c\x79\x7d\x79\x7e\x79\x7f\x79\x81\x79\x82\x79\x83\x79\x84\x79\x85\x79\x86\x79\x87\x79\x88\x79\x89\x79\x8a\x79\x8b\x79\x8c\x79\x8d", /* e280 */ "\x79\x8e\x79\x8f\x79\x90\x79\x91\x79\x92\x79\x93\x79\x94\x79\x95\x79\x96\x79\x97\x79\x98\x79\x99\x79\x9a\x79\x9b\x79\x9c\x79\x9d\x79\x9e\x79\x9f\x79\xa0\x79\xa1\x79\xa2\x79\xa3\x79\xa4\x79\xa5\x79\xa6\x79\xa7\x79\xa8\x79\xa9\x79\xaa\x79\xab\x79\xac\x79\xad\x79\xae\x79\xaf\x79\xb0\x79\xb1\x79\xb2\x79\xb3\x79\xb4\x79\xb5\x79\xb6\x79\xb7\x79\xb8\x79\xb9\x79\xba\x79\xbb\x79\xbc\x79\xbd\x79\xbe\x79\xbf\x79\xc0\x79\xc1\x79\xc2\x79\xc3\x79\xc4\x79\xc5\x79\xc6\x79\xc7\x79\xc8\x79\xc9\x79\xca\x79\xcb\x79\xcc\x79\xcd\x79\xce\x79\xcf\x79\xd0\x79\xd1\x79\xd2\x79\xd3\x79\xd4\x79\xd5\x79\xd6\x79\xd7\x79\xd8\x79\xd9\x79\xda\x79\xdb\x79\xdc\x79\xdd\x79\xde\x79\xdf\x79\xe0\x79\xe1\x79\xe2\x79\xe3\x79\xe4\x79\xe5\x79\xe6\x79\xe7\x79\xe8\x79\xe9\x79\xea\x79\xeb\x79\xec\x79\xed\x79\xee\x79\xef\x79\xf0\x79\xf1\x79\xf2\x79\xf3\x79\xf4\x79\xf5\x79\xf6\x79\xf7\x79\xf8\x79\xf9\x79\xfa\x79\xfb\x79\xfc\x79\xfd\x7a\x41\x7a\x42\x7a\x43\x7a\x44\x7a\x45\x7a\x46\x7a\x47\x7a\x48\x7a\x49\x7a\x4a\x7a\x4b\x7a\x4c\x7a\x4d\x7a\x4e\x7a\x4f\x7a\x50", /* e300 */ "\x7a\x51\x7a\x52\x7a\x53\x7a\x54\x7a\x55\x7a\x56\x7a\x57\x7a\x58\x7a\x59\x7a\x5a\x7a\x5b\x7a\x5c\x7a\x5d\x7a\x5e\x7a\x5f\x7a\x60\x7a\x61\x7a\x62\x7a\x63\x7a\x64\x7a\x65\x7a\x66\x7a\x67\x7a\x68\x7a\x69\x7a\x6a\x7a\x6b\x7a\x6c\x7a\x6d\x7a\x6e\x7a\x6f\x7a\x70\x7a\x71\x7a\x72\x7a\x73\x7a\x74\x7a\x75\x7a\x76\x7a\x77\x7a\x78\x7a\x79\x7a\x7a\x7a\x7b\x7a\x7c\x7a\x7d\x7a\x7e\x7a\x7f\x7a\x81\x7a\x82\x7a\x83\x7a\x84\x7a\x85\x7a\x86\x7a\x87\x7a\x88\x7a\x89\x7a\x8a\x7a\x8b\x7a\x8c\x7a\x8d\x7a\x8e\x7a\x8f\x7a\x90\x7a\x91\x7a\x92\x7a\x93\x7a\x94\x7a\x95\x7a\x96\x7a\x97\x7a\x98\x7a\x99\x7a\x9a\x7a\x9b\x7a\x9c\x7a\x9d\x7a\x9e\x7a\x9f\x7a\xa0\x7a\xa1\x7a\xa2\x7a\xa3\x7a\xa4\x7a\xa5\x7a\xa6\x7a\xa7\x7a\xa8\x7a\xa9\x7a\xaa\x7a\xab\x7a\xac\x7a\xad\x7a\xae\x7a\xaf\x7a\xb0\x7a\xb1\x7a\xb2\x7a\xb3\x7a\xb4\x7a\xb5\x7a\xb6\x7a\xb7\x7a\xb8\x7a\xb9\x7a\xba\x7a\xbb\x7a\xbc\x7a\xbd\x7a\xbe\x7a\xbf\x7a\xc0\x7a\xc1\x7a\xc2\x7a\xc3\x7a\xc4\x7a\xc5\x7a\xc6\x7a\xc7\x7a\xc8\x7a\xc9\x7a\xca\x7a\xcb\x7a\xcc\x7a\xcd\x7a\xce\x7a\xcf\x7a\xd0\x7a\xd1", /* e380 */ "\x7a\xd2\x7a\xd3\x7a\xd4\x7a\xd5\x7a\xd6\x7a\xd7\x7a\xd8\x7a\xd9\x7a\xda\x7a\xdb\x7a\xdc\x7a\xdd\x7a\xde\x7a\xdf\x7a\xe0\x7a\xe1\x7a\xe2\x7a\xe3\x7a\xe4\x7a\xe5\x7a\xe6\x7a\xe7\x7a\xe8\x7a\xe9\x7a\xea\x7a\xeb\x7a\xec\x7a\xed\x7a\xee\x7a\xef\x7a\xf0\x7a\xf1\x7a\xf2\x7a\xf3\x7a\xf4\x7a\xf5\x7a\xf6\x7a\xf7\x7a\xf8\x7a\xf9\x7a\xfa\x7a\xfb\x7a\xfc\x7a\xfd\x7b\x41\x7b\x42\x7b\x43\x7b\x44\x7b\x45\x7b\x46\x7b\x47\x7b\x48\x7b\x49\x7b\x4a\x7b\x4b\x7b\x4c\x7b\x4d\x7b\x4e\x7b\x4f\x7b\x50\x7b\x51\x7b\x52\x7b\x53\x7b\x54\x7b\x55\x7b\x56\x7b\x57\x7b\x58\x7b\x59\x7b\x5a\x7b\x5b\x7b\x5c\x7b\x5d\x7b\x5e\x7b\x5f\x7b\x60\x7b\x61\x7b\x62\x7b\x63\x7b\x64\x7b\x65\x7b\x66\x7b\x67\x7b\x68\x7b\x69\x7b\x6a\x7b\x6b\x7b\x6c\x7b\x6d\x7b\x6e\x7b\x6f\x7b\x70\x7b\x71\x7b\x72\x7b\x73\x7b\x74\x7b\x75\x7b\x76\x7b\x77\x7b\x78\x7b\x79\x7b\x7a\x7b\x7b\x7b\x7c\x7b\x7d\x7b\x7e\x7b\x7f\x7b\x81\x7b\x82\x7b\x83\x7b\x84\x7b\x85\x7b\x86\x7b\x87\x7b\x88\x7b\x89\x7b\x8a\x7b\x8b\x7b\x8c\x7b\x8d\x7b\x8e\x7b\x8f\x7b\x90\x7b\x91\x7b\x92\x7b\x93\x7b\x94\x7b\x95", /* e400 */ "\x7b\x96\x7b\x97\x7b\x98\x7b\x99\x7b\x9a\x7b\x9b\x7b\x9c\x7b\x9d\x7b\x9e\x7b\x9f\x7b\xa0\x7b\xa1\x7b\xa2\x7b\xa3\x7b\xa4\x7b\xa5\x7b\xa6\x7b\xa7\x7b\xa8\x7b\xa9\x7b\xaa\x7b\xab\x7b\xac\x7b\xad\x7b\xae\x7b\xaf\x7b\xb0\x7b\xb1\x7b\xb2\x7b\xb3\x7b\xb4\x7b\xb5\x7b\xb6\x7b\xb7\x7b\xb8\x7b\xb9\x7b\xba\x7b\xbb\x7b\xbc\x7b\xbd\x7b\xbe\x7b\xbf\x7b\xc0\x7b\xc1\x7b\xc2\x7b\xc3\x7b\xc4\x7b\xc5\x7b\xc6\x7b\xc7\x7b\xc8\x7b\xc9\x7b\xca\x7b\xcb\x7b\xcc\x7b\xcd\x7b\xce\x7b\xcf\x7b\xd0\x7b\xd1\x7b\xd2\x7b\xd3\x7b\xd4\x7b\xd5\x7b\xd6\x7b\xd7\x7b\xd8\x7b\xd9\x7b\xda\x7b\xdb\x7b\xdc\x7b\xdd\x7b\xde\x7b\xdf\x7b\xe0\x7b\xe1\x7b\xe2\x7b\xe3\x7b\xe4\x7b\xe5\x7b\xe6\x7b\xe7\x7b\xe8\x7b\xe9\x7b\xea\x7b\xeb\x7b\xec\x7b\xed\x7b\xee\x7b\xef\x7b\xf0\x7b\xf1\x7b\xf2\x7b\xf3\x7b\xf4\x7b\xf5\x7b\xf6\x7b\xf7\x7b\xf8\x7b\xf9\x7b\xfa\x7b\xfb\x7b\xfc\x7b\xfd\x7c\x41\x7c\x42\x7c\x43\x7c\x44\x7c\x45\x7c\x46\x7c\x47\x7c\x48\x7c\x49\x7c\x4a\x7c\x4b\x7c\x4c\x7c\x4d\x7c\x4e\x7c\x4f\x7c\x50\x7c\x51\x7c\x52\x7c\x53\x7c\x54\x7c\x55\x7c\x56\x7c\x57\x7c\x58", /* e480 */ "\x7c\x59\x7c\x5a\x7c\x5b\x7c\x5c\x7c\x5d\x7c\x5e\x7c\x5f\x7c\x60\x7c\x61\x7c\x62\x7c\x63\x7c\x64\x7c\x65\x7c\x66\x7c\x67\x7c\x68\x7c\x69\x7c\x6a\x7c\x6b\x7c\x6c\x7c\x6d\x7c\x6e\x7c\x6f\x7c\x70\x7c\x71\x7c\x72\x7c\x73\x7c\x74\x7c\x75\x7c\x76\x7c\x77\x7c\x78\x7c\x79\x7c\x7a\x7c\x7b\x7c\x7c\x7c\x7d\x7c\x7e\x7c\x7f\x7c\x81\x7c\x82\x7c\x83\x7c\x84\x7c\x85\x7c\x86\x7c\x87\x7c\x88\x7c\x89\x7c\x8a\x7c\x8b\x7c\x8c\x7c\x8d\x7c\x8e\x7c\x8f\x7c\x90\x7c\x91\x7c\x92\x7c\x93\x7c\x94\x7c\x95\x7c\x96\x7c\x97\x7c\x98\x7c\x99\x7c\x9a\x7c\x9b\x7c\x9c\x7c\x9d\x7c\x9e\x7c\x9f\x7c\xa0\x7c\xa1\x7c\xa2\x7c\xa3\x7c\xa4\x7c\xa5\x7c\xa6\x7c\xa7\x7c\xa8\x7c\xa9\x7c\xaa\x7c\xab\x7c\xac\x7c\xad\x7c\xae\x7c\xaf\x7c\xb0\x7c\xb1\x7c\xb2\x7c\xb3\x7c\xb4\x7c\xb5\x7c\xb6\x7c\xb7\x7c\xb8\x7c\xb9\x7c\xba\x7c\xbb\x7c\xbc\x7c\xbd\x7c\xbe\x7c\xbf\x7c\xc0\x7c\xc1\x7c\xc2\x7c\xc3\x7c\xc4\x7c\xc5\x7c\xc6\x7c\xc7\x7c\xc8\x7c\xc9\x7c\xca\x7c\xcb\x7c\xcc\x7c\xcd\x7c\xce\x7c\xcf\x7c\xd0\x7c\xd1\x7c\xd2\x7c\xd3\x7c\xd4\x7c\xd5\x7c\xd6\x7c\xd7\x7c\xd8\x7c\xd9", /* e500 */ "\x7c\xda\x7c\xdb\x7c\xdc\x7c\xdd\x7c\xde\x7c\xdf\x7c\xe0\x7c\xe1\x7c\xe2\x7c\xe3\x7c\xe4\x7c\xe5\x7c\xe6\x7c\xe7\x7c\xe8\x7c\xe9\x7c\xea\x7c\xeb\x7c\xec\x7c\xed\x7c\xee\x7c\xef\x7c\xf0\x7c\xf1\x7c\xf2\x7c\xf3\x7c\xf4\x7c\xf5\x7c\xf6\x7c\xf7\x7c\xf8\x7c\xf9\x7c\xfa\x7c\xfb\x7c\xfc\x7c\xfd\x7d\x41\x7d\x42\x7d\x43\x7d\x44\x7d\x45\x7d\x46\x7d\x47\x7d\x48\x7d\x49\x7d\x4a\x7d\x4b\x7d\x4c\x7d\x4d\x7d\x4e\x7d\x4f\x7d\x50\x7d\x51\x7d\x52\x7d\x53\x7d\x54\x7d\x55\x7d\x56\x7d\x57\x7d\x58\x7d\x59\x7d\x5a\x7d\x5b\x7d\x5c\x7d\x5d\x7d\x5e\x7d\x5f\x7d\x60\x7d\x61\x7d\x62\x7d\x63\x7d\x64\x7d\x65\x7d\x66\x7d\x67\x7d\x68\x7d\x69\x7d\x6a\x7d\x6b\x7d\x6c\x7d\x6d\x7d\x6e\x7d\x6f\x7d\x70\x7d\x71\x7d\x72\x7d\x73\x7d\x74\x7d\x75\x7d\x76\x7d\x77\x7d\x78\x7d\x79\x7d\x7a\x7d\x7b\x7d\x7c\x7d\x7d\x7d\x7e\x7d\x7f\x7d\x81\x7d\x82\x7d\x83\x7d\x84\x7d\x85\x7d\x86\x7d\x87\x7d\x88\x7d\x89\x7d\x8a\x7d\x8b\x7d\x8c\x7d\x8d\x7d\x8e\x7d\x8f\x7d\x90\x7d\x91\x7d\x92\x7d\x93\x7d\x94\x7d\x95\x7d\x96\x7d\x97\x7d\x98\x7d\x99\x7d\x9a\x7d\x9b\x7d\x9c\x7d\x9d", /* e580 */ "\x7d\x9e\x7d\x9f\x7d\xa0\x7d\xa1\x7d\xa2\x7d\xa3\x7d\xa4\x7d\xa5\x7d\xa6\x7d\xa7\x7d\xa8\x7d\xa9\x7d\xaa\x7d\xab\x7d\xac\x7d\xad\x7d\xae\x7d\xaf\x7d\xb0\x7d\xb1\x7d\xb2\x7d\xb3\x7d\xb4\x7d\xb5\x7d\xb6\x7d\xb7\x7d\xb8\x7d\xb9\x7d\xba\x7d\xbb\x7d\xbc\x7d\xbd\x7d\xbe\x7d\xbf\x7d\xc0\x7d\xc1\x7d\xc2\x7d\xc3\x7d\xc4\x7d\xc5\x7d\xc6\x7d\xc7\x7d\xc8\x7d\xc9\x7d\xca\x7d\xcb\x7d\xcc\x7d\xcd\x7d\xce\x7d\xcf\x7d\xd0\x7d\xd1\x7d\xd2\x7d\xd3\x7d\xd4\x7d\xd5\x7d\xd6\x7d\xd7\x7d\xd8\x7d\xd9\x7d\xda\x7d\xdb\x7d\xdc\x7d\xdd\x7d\xde\x7d\xdf\x7d\xe0\x7d\xe1\x7d\xe2\x7d\xe3\x7d\xe4\x7d\xe5\x7d\xe6\x7d\xe7\x7d\xe8\x7d\xe9\x7d\xea\x7d\xeb\x7d\xec\x7d\xed\x7d\xee\x7d\xef\x7d\xf0\x7d\xf1\x7d\xf2\x7d\xf3\x7d\xf4\x7d\xf5\x7d\xf6\x7d\xf7\x7d\xf8\x7d\xf9\x7d\xfa\x7d\xfb\x7d\xfc\x7d\xfd\x7e\x41\x7e\x42\x7e\x43\x7e\x44\x7e\x45\x7e\x46\x7e\x47\x7e\x48\x7e\x49\x7e\x4a\x7e\x4b\x7e\x4c\x7e\x4d\x7e\x4e\x7e\x4f\x7e\x50\x7e\x51\x7e\x52\x7e\x53\x7e\x54\x7e\x55\x7e\x56\x7e\x57\x7e\x58\x7e\x59\x7e\x5a\x7e\x5b\x7e\x5c\x7e\x5d\x7e\x5e\x7e\x5f\x7e\x60", /* e600 */ "\x7e\x61\x7e\x62\x7e\x63\x7e\x64\x7e\x65\x7e\x66\x7e\x67\x7e\x68\x7e\x69\x7e\x6a\x7e\x6b\x7e\x6c\x7e\x6d\x7e\x6e\x7e\x6f\x7e\x70\x7e\x71\x7e\x72\x7e\x73\x7e\x74\x7e\x75\x7e\x76\x7e\x77\x7e\x78\x7e\x79\x7e\x7a\x7e\x7b\x7e\x7c\x7e\x7d\x7e\x7e\x7e\x7f\x7e\x81\x7e\x82\x7e\x83\x7e\x84\x7e\x85\x7e\x86\x7e\x87\x7e\x88\x7e\x89\x7e\x8a\x7e\x8b\x7e\x8c\x7e\x8d\x7e\x8e\x7e\x8f\x7e\x90\x7e\x91\x7e\x92\x7e\x93\x7e\x94\x7e\x95\x7e\x96\x7e\x97\x7e\x98\x7e\x99\x7e\x9a\x7e\x9b\x7e\x9c\x7e\x9d\x7e\x9e\x7e\x9f\x7e\xa0\x7e\xa1\x7e\xa2\x7e\xa3\x7e\xa4\x7e\xa5\x7e\xa6\x7e\xa7\x7e\xa8\x7e\xa9\x7e\xaa\x7e\xab\x7e\xac\x7e\xad\x7e\xae\x7e\xaf\x7e\xb0\x7e\xb1\x7e\xb2\x7e\xb3\x7e\xb4\x7e\xb5\x7e\xb6\x7e\xb7\x7e\xb8\x7e\xb9\x7e\xba\x7e\xbb\x7e\xbc\x7e\xbd\x7e\xbe\x7e\xbf\x7e\xc0\x7e\xc1\x7e\xc2\x7e\xc3\x7e\xc4\x7e\xc5\x7e\xc6\x7e\xc7\x7e\xc8\x7e\xc9\x7e\xca\x7e\xcb\x7e\xcc\x7e\xcd\x7e\xce\x7e\xcf\x7e\xd0\x7e\xd1\x7e\xd2\x7e\xd3\x7e\xd4\x7e\xd5\x7e\xd6\x7e\xd7\x7e\xd8\x7e\xd9\x7e\xda\x7e\xdb\x7e\xdc\x7e\xdd\x7e\xde\x7e\xdf\x7e\xe0\x7e\xe1", /* e680 */ "\x7e\xe2\x7e\xe3\x7e\xe4\x7e\xe5\x7e\xe6\x7e\xe7\x7e\xe8\x7e\xe9\x7e\xea\x7e\xeb\x7e\xec\x7e\xed\x7e\xee\x7e\xef\x7e\xf0\x7e\xf1\x7e\xf2\x7e\xf3\x7e\xf4\x7e\xf5\x7e\xf6\x7e\xf7\x7e\xf8\x7e\xf9\x7e\xfa\x7e\xfb\x7e\xfc\x7e\xfd\x7f\x41\x7f\x42\x7f\x43\x7f\x44\x7f\x45\x7f\x46\x7f\x47\x7f\x48\x7f\x49\x7f\x4a\x7f\x4b\x7f\x4c\x7f\x4d\x7f\x4e\x7f\x4f\x7f\x50\x7f\x51\x7f\x52\x7f\x53\x7f\x54\x7f\x55\x7f\x56\x7f\x57\x7f\x58\x7f\x59\x7f\x5a\x7f\x5b\x7f\x5c\x7f\x5d\x7f\x5e\x7f\x5f\x7f\x60\x7f\x61\x7f\x62\x7f\x63\x7f\x64\x7f\x65\x7f\x66\x7f\x67\x7f\x68\x7f\x69\x7f\x6a\x7f\x6b\x7f\x6c\x7f\x6d\x7f\x6e\x7f\x6f\x7f\x70\x7f\x71\x7f\x72\x7f\x73\x7f\x74\x7f\x75\x7f\x76\x7f\x77\x7f\x78\x7f\x79\x7f\x7a\x7f\x7b\x7f\x7c\x7f\x7d\x7f\x7e\x7f\x7f\x7f\x81\x7f\x82\x7f\x83\x7f\x84\x7f\x85\x7f\x86\x7f\x87\x7f\x88\x7f\x89\x7f\x8a\x7f\x8b\x7f\x8c\x7f\x8d\x7f\x8e\x7f\x8f\x7f\x90\x7f\x91\x7f\x92\x7f\x93\x7f\x94\x7f\x95\x7f\x96\x7f\x97\x7f\x98\x7f\x99\x7f\x9a\x7f\x9b\x7f\x9c\x7f\x9d\x7f\x9e\x7f\x9f\x7f\xa0\x7f\xa1\x7f\xa2\x7f\xa3\x7f\xa4\x7f\xa5", /* e700 */ "\x7f\xa6\x7f\xa7\x7f\xa8\x7f\xa9\x7f\xaa\x7f\xab\x7f\xac\x7f\xad\x7f\xae\x7f\xaf\x7f\xb0\x7f\xb1\x7f\xb2\x7f\xb3\x7f\xb4\x7f\xb5\x7f\xb6\x7f\xb7\x7f\xb8\x7f\xb9\x7f\xba\x7f\xbb\x7f\xbc\x7f\xbd\x7f\xbe\x7f\xbf\x7f\xc0\x7f\xc1\x7f\xc2\x7f\xc3\x7f\xc4\x7f\xc5\x7f\xc6\x7f\xc7\x7f\xc8\x7f\xc9\x7f\xca\x7f\xcb\x7f\xcc\x7f\xcd\x7f\xce\x7f\xcf\x7f\xd0\x7f\xd1\x7f\xd2\x7f\xd3\x7f\xd4\x7f\xd5\x7f\xd6\x7f\xd7\x7f\xd8\x7f\xd9\x7f\xda\x7f\xdb\x7f\xdc\x7f\xdd\x7f\xde\x7f\xdf\x7f\xe0\x7f\xe1\x7f\xe2\x7f\xe3\x7f\xe4\x7f\xe5\x7f\xe6\x7f\xe7\x7f\xe8\x7f\xe9\x7f\xea\x7f\xeb\x7f\xec\x7f\xed\x7f\xee\x7f\xef\x7f\xf0\x7f\xf1\x7f\xf2\x7f\xf3\x7f\xf4\x7f\xf5\x7f\xf6\x7f\xf7\x7f\xf8\x7f\xf9\x7f\xfa\x7f\xfb\x7f\xfc\x7f\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5b\x44\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ "\x00\x00\x42\x5a\x42\x7f\x42\x7b\x42\xe0\x42\x6c\x42\x50\x42\x7d\x42\x4d\x42\x5d\x42\x5c\x42\x4e\x42\x6b\x42\x60\x42\x4b\x42\x61\x42\xf0\x42\xf1\x42\xf2\x42\xf3\x42\xf4\x42\xf5\x42\xf6\x42\xf7\x42\xf8\x42\xf9\x42\x7a\x42\x5e\x42\x4c\x42\x7e\x42\x6e\x42\x6f\x42\x7c\x42\xc1\x42\xc2\x42\xc3\x42\xc4\x42\xc5\x42\xc6\x42\xc7\x42\xc8\x42\xc9\x42\xd1\x42\xd2\x42\xd3\x42\xd4\x42\xd5\x42\xd6\x42\xd7\x42\xd8\x42\xd9\x42\xe2\x42\xe3\x42\xe4\x42\xe5\x42\xe6\x42\xe7\x42\xe8\x42\xe9\x44\x44\x43\xe0\x44\x45\x44\x70\x42\x6d\x42\x79\x42\x81\x42\x82\x42\x83\x42\x84\x42\x85\x42\x86\x42\x87\x42\x88\x42\x89\x42\x91\x42\x92\x42\x93\x42\x94\x42\x95\x42\x96\x42\x97\x42\x98\x42\x99\x42\xa2\x42\xa3\x42\xa4\x42\xa5\x42\xa6\x42\xa7\x42\xa8\x42\xa9\x42\xc0\x42\x4f\x42\xd0\x43\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4a\x42\x4a\x42\x5f\x42\xa1\x42\x6a\x42\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, /* EBCDIC DBCS to Unicode translation table for ibm-837_P100-2000 */ { /* 0000 */ NULL, /* 0080 */ NULL, /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ NULL, /* 0300 */ NULL, /* 0380 */ NULL, /* 0400 */ NULL, /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ NULL, /* 2080 */ NULL, /* 2100 */ NULL, /* 2180 */ NULL, /* 2200 */ NULL, /* 2280 */ NULL, /* 2300 */ NULL, /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ NULL, /* 2580 */ NULL, /* 2600 */ NULL, /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ NULL, /* 3080 */ NULL, /* 3100 */ NULL, /* 3180 */ NULL, /* 3200 */ NULL, /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4080 */ NULL, /* 4100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4180 */ "\x04\x30\x04\x31\x04\x32\x04\x33\x04\x34\x04\x35\x04\x51\x04\x36\x04\x37\x04\x38\x04\x39\x04\x3a\x04\x3b\x04\x3c\x04\x3d\x04\x3e\x04\x3f\x04\x40\x04\x41\x04\x42\x04\x43\x04\x44\x04\x45\x04\x46\x04\x47\x04\x48\x04\x49\x04\x4a\x04\x4b\x04\x4c\x04\x4d\x04\x4e\x04\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x70\x21\x71\x21\x72\x21\x73\x21\x74\x21\x75\x21\x76\x21\x77\x21\x78\x21\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x01\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04\x20\x04\x21\x04\x22\x04\x23\x04\x24\x04\x25\x04\x26\x04\x27\x04\x28\x04\x29\x04\x2a\x04\x2b\x04\x2c\x04\x2d\x04\x2e\x04\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x60\x21\x61\x21\x62\x21\x63\x21\x64\x21\x65\x21\x66\x21\x67\x21\x68\x21\x69\x21\x6a\x21\x6b\x00\x00\x00\x00\x00\x00", /* 4200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe1\xff\x0e\xff\x1c\xff\x08\xff\x0b\xff\x5c\xff\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x01\xff\xe5\xff\x0a\xff\x09\xff\x1b\xff\xe2\xff\x0d\xff\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe4\xff\x0c\xff\x05\xff\x3f\xff\x1e\xff\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x40\xff\x1a\xff\x03\xff\x20\xff\x07\xff\x1d\xff\x02", /* 4280 */ "\x00\x00\xff\x41\xff\x42\xff\x43\xff\x44\xff\x45\xff\x46\xff\x47\xff\x48\xff\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x4a\xff\x4b\xff\x4c\xff\x4d\xff\x4e\xff\x4f\xff\x50\xff\x51\xff\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe3\xff\x53\xff\x54\xff\x55\xff\x56\xff\x57\xff\x58\xff\x59\xff\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5b\xff\x21\xff\x22\xff\x23\xff\x24\xff\x25\xff\x26\xff\x27\xff\x28\xff\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5d\xff\x2a\xff\x2b\xff\x2c\xff\x2d\xff\x2e\xff\x2f\xff\x30\xff\x31\xff\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\xff\x33\xff\x34\xff\x35\xff\x36\xff\x37\xff\x38\xff\x39\xff\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x10\xff\x11\xff\x12\xff\x13\xff\x14\xff\x15\xff\x16\xff\x17\xff\x18\xff\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x02\x30\x0c\x30\x0d\x30\x01\x30\xfb\x30\xf2\x30\xa1\x30\xa3\x30\xa5\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\xa7\x30\xa9\x30\xe3\x30\xe5\x30\xe7\x30\xc3\x30\xee\x30\xfc\x30\xf5\x30\xf6\xf8\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4380 */ "\x00\x00\x30\xa2\x30\xa4\x30\xa6\x30\xa8\x30\xaa\x30\xab\x30\xad\x30\xaf\x30\xb1\x30\xb3\x00\x00\x30\xb5\x30\xb7\x30\xb9\x30\xbb\x30\xbd\x30\xbf\x30\xc1\x30\xc4\x30\xc6\x30\xc8\x30\xca\x30\xcb\x30\xcc\x30\xcd\x30\xce\x00\x00\x00\x00\x30\xcf\x30\xd2\x30\xd5\x00\x00\xff\x5e\x30\xd8\x30\xdb\x30\xde\x30\xdf\x30\xe0\x30\xe1\x30\xe2\x30\xe4\x30\xe6\x00\x00\x30\xe8\x30\xe9\x30\xea\x30\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\xec\x30\xed\x30\xef\x30\xf3\x30\x9b\x30\x9c\x30\xac\x30\xae\x30\xb0\x30\xb2\x30\xb4\x30\xb6\x30\xb8\x30\xba\x30\xbc\x30\xbe\x30\xc0\x30\xc2\x30\xc5\x30\xc7\x30\xc9\x30\xd0\x30\xd3\x30\xd6\x30\xd9\x30\xdc\x30\xf4\x30\xd1\x30\xd4\x30\xd7\x30\xda\x30\xdd\x30\xf0\x30\xf1\x30\xfd\x30\xfe\x00\x00\x00\x00\xff\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x0e\x30\x0f\xff\x3b\xff\x3d\x30\x92\x30\x41\x30\x43\x30\x45\x20\x15\x00\xb1\x22\x60\x22\x1e\x21\x03\x00\x00\x00\xb4\x30\x47\x30\x49\x30\x83\x30\x85\x30\x87\x30\x63\x30\x8e\x00\x00\x00\x00\x20\x10\x30\x03\xf8\x3e\x30\x05\x30\x06\x30\x07\x00\xa8\x20\x18\x20\x1c\x30\x14\x30\x08\x30\x0a\x30\x10\x22\x64\x22\x34\x26\x42\x00\xa7\x20\x3b\x30\x12\x32\x31\x21\x16\x21\x21\xff\x3e\x20\x19\x20\x1d\x30\x15\x30\x09\x30\x0b\x30\x11\x22\x65\x22\x35\x26\x40\x00\xd7\x00\xf7\x20\x16\x30\x13\x20\x25\x20\x26", /* 4480 */ "\x00\x00\x30\x42\x30\x44\x30\x46\x30\x48\x30\x4a\x30\x4b\x30\x4d\x30\x4f\x30\x51\x30\x53\x00\x00\x30\x55\x30\x57\x30\x59\x30\x5b\x30\x5d\x30\x5f\x30\x61\x30\x64\x30\x66\x30\x68\x30\x6a\x30\x6b\x30\x6c\x30\x6d\x30\x6e\x00\x00\x00\x00\x30\x6f\x30\x72\x30\x75\x00\x00\x00\x00\x30\x78\x30\x7b\x30\x7e\x30\x7f\x30\x80\x30\x81\x30\x82\x30\x84\x30\x86\x00\x00\x30\x88\x30\x89\x30\x8a\x30\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x8c\x30\x8d\x30\x8f\x30\x93\x00\x00\x00\x00\x30\x4c\x30\x4e\x30\x50\x30\x52\x30\x54\x30\x56\x30\x58\x30\x5a\x30\x5c\x30\x5e\x30\x60\x30\x62\x30\x65\x30\x67\x30\x69\x30\x70\x30\x73\x30\x76\x30\x79\x30\x7c\x00\x00\x30\x71\x30\x74\x30\x77\x30\x7a\x30\x7d\x30\x90\x30\x91\x30\x9d\x30\x9e\x00\x00\x00\x00\x25\xcb\x25\xcf\x25\xb3\x25\xb2\x25\xce\x26\x06\x26\x05\x25\xc7\x25\xc6\x25\xa1\x25\xa0\x25\xbd\x25\xbc\x00\xb0\x20\x32\x20\x33\x21\x92\x21\x90\x21\x91\x21\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc9\x02\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x16\x30\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x36\x22\x27\x22\x28\x22\x11\x22\x0f\x22\x2a\x22\x29\x22\x08\x22\x37\x22\x1a\x22\xa5\x22\x25\x22\x20\x23\x12\x22\x99\x22\x2b\x22\x2e\x22\x61\x22\x4c\x22\x48\x22\x3d\x22\x1d\x00\x00\x22\x6e\x22\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x20\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x88\x24\x89\x24\x8a\x24\x8b\x24\x8c\x24\x8d\x24\x8e\x24\x8f\x24\x90\x24\x91\x24\x92\x24\x93\x24\x94\x24\x95\x24\x96\x24\x97\x24\x98\x24\x99\x24\x9a\x24\x9b\x24\x74\x24\x75\x24\x76\x24\x77\x24\x78\x24\x79\x24\x7a\x24\x7b\x24\x7c\x24\x7d\x24\x7e\x24\x7f\x24\x80\x24\x81\x24\x82\x24\x83\x24\x84\x24\x85\x24\x86\x24\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x60\x24\x61\x24\x62\x24\x63\x24\x64\x24\x65\x24\x66\x24\x67\x24\x68\x24\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x20\x32\x21\x32\x22\x32\x23\x32\x24\x32\x25\x32\x26\x32\x27\x32\x28\x32\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\xe1\x01\xce\x00\xe0\x01\x13\x00\xe9\x01\x1b\x00\xe8\x01\x2b\x00\xed\x01\xd0\x00\xec\x01\x4d\x00\xf3\x01\xd2\x00\xf2\x01\x6b\x00\xfa\x01\xd4\x00\xf9\x01\xd6\x01\xd8\x01\xda\x01\xdc\x00\xfc\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x05\x31\x06\x31\x07\x31\x08\x31\x09\x31\x0a\x31\x0b\x31\x0c\x31\x0d\x31\x0e\x31\x0f\x31\x10\x31\x11\x31\x12\x31\x13\x31\x14\x31\x15\x31\x16\x31\x17\x31\x18\x31\x19\x31\x1a\x31\x1b\x31\x1c\x31\x1d\x31\x1e\x31\x1f", /* 4680 */ "\x31\x20\x31\x21\x31\x22\x31\x23\x31\x24\x31\x25\x31\x26\x31\x27\x31\x28\x31\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x25\x01\x25\x02\x25\x03\x25\x04\x25\x05\x25\x06\x25\x07\x25\x08\x25\x09\x25\x0a\x25\x0b\x25\x0c\x25\x0d\x25\x0e\x25\x0f\x25\x10\x25\x11\x25\x12\x25\x13\x25\x14\x25\x15\x25\x16\x25\x17\x25\x18\x25\x19\x25\x1a\x25\x1b\x25\x1c\x25\x1d\x25\x1e\x25\x1f\x25\x20\x25\x21\x25\x22\x25\x23\x25\x24\x25\x25\x25\x26\x25\x27\x25\x28\x25\x29\x25\x2a\x25\x2b\x25\x2c\x25\x2d\x25\x2e\x25\x2f\x25\x30\x25\x31\x25\x32\x25\x33\x25\x34\x25\x35\x25\x36\x25\x37\x25\x38\x25\x39\x25\x3a\x25\x3b\x25\x3c\x25\x3d\x25\x3e\x25\x3f\x25\x40\x25\x41\x25\x42\x25\x43\x25\x44\x25\x45\x25\x46\x25\x47\x25\x48\x25\x49\x25\x4a\x25\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4a\x96\x3f\x57\xc3\x63\x28\x54\xce\x55\x09\x54\xc0\x76\x91\x76\x4c\x85\x3c\x77\xee\x82\x7e\x78\x8d\x72\x31\x96\x98\x97\x8d\x6c\x28\x5b\x89\x4f\xfa\x63\x09\x66\x97\x5c\xb8\x80\xfa\x68\x48\x80\xae\x66\x02\x76\xce\x51\xf9\x65\x56\x71\xac\x7f\xf1\x88\x84\x50\xb2\x59\x65\x61\xca\x6f\xb3\x82\xad\x63\x4c\x62\x52\x53\xed\x54\x27\x7b\x06\x51\x6b\x75\xa4\x5d\xf4\x62\xd4\x8d\xcb\x97\x76\x62\x8a\x80\x19\x57\x5d\x97\x38\x7f\x62\x72\x38\x76\x7d\x67\xcf\x76\x7e\x64\x46\x4f\x70\x8d\x25\x62\xdc\x7a\x17\x65\x91\x73\xed\x64\x2c\x62\x73\x82\x2c\x98\x81\x67\x7f\x72\x48\x62\x6e\x62\xcc\x4f\x34\x74\xe3\x53\x4a\x52\x9e\x7e\xca\x90\xa6\x5e\x2e\x68\x86\x69\x9c\x81\x80\x7e\xd1\x68\xd2\x78\xc5\x86\x8c\x95\x51\x50\x8d\x8c\x24\x82\xde\x80\xde\x53\x05\x89\x12\x52\x65\x00\x00\x00\x00", /* 4900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x84\x96\xf9\x4f\xdd\x58\x21\x99\x71\x5b\x9d\x62\xb1\x62\xa5\x66\xb4\x8c\x79\x9c\x8d\x72\x06\x67\x6f\x78\x91\x60\xb2\x53\x51\x53\x17\x8f\x88\x80\xcc\x8d\x1d\x94\xa1\x50\x0d\x72\xc8\x59\x07\x60\xeb\x71\x19\x88\xab\x59\x54\x82\xef\x67\x2c\x7b\x28\x5d\x29\x7e\xf7\x75\x2d\x6c\xf5\x8e\x66\x8f\xf8\x90\x3c\x9f\x3b\x6b\xd4\x91\x19\x7b\x14\x5f\x7c\x78\xa7\x84\xd6\x85\x3d\x6b\xd5\x6b\xd9\x6b\xd6\x5e\x01\x5e\x87\x75\xf9\x95\xed\x65\x5d\x5f\x0a\x5f\xc5\x8f\x9f\x58\xc1\x81\xc2\x90\x7f\x96\x5b\x97\xad\x8f\xb9", /* 4980 */ "\x00\x00\x7f\x16\x8d\x2c\x62\x41\x4f\xbf\x53\xd8\x53\x5e\x8f\xa8\x8f\xa9\x8f\xab\x90\x4d\x68\x07\x5f\x6a\x81\x98\x88\x68\x9c\xd6\x61\x8b\x52\x2b\x76\x2a\x5f\x6c\x65\x8c\x6f\xd2\x6e\xe8\x5b\xbe\x64\x48\x51\x75\x51\xb0\x67\xc4\x4e\x19\x79\xc9\x99\x7c\x70\xb3\x75\xc5\x5e\x76\x73\xbb\x83\xe0\x64\xad\x62\xe8\x94\xb5\x6c\xe2\x53\x5a\x52\xc3\x64\x0f\x94\xc2\x7b\x94\x4f\x2f\x5e\x1b\x82\x36\x81\x16\x81\x8a\x6e\x24\x6c\xca\x9a\x73\x63\x55\x53\x5c\x54\xfa\x88\x65\x57\xe0\x4e\x0d\x5e\x03\x6b\x65\x7c\x3f\x90\xe8\x60\x16\x64\xe6\x73\x1c\x88\xc1\x67\x50\x62\x4d\x8d\x22\x77\x6c\x8e\x29\x91\xc7\x5f\x69\x83\xdc\x85\x21\x99\x10\x53\xc2\x86\x95\x6b\x8b\x60\xed\x60\xe8\x70\x7f\x82\xcd\x82\x31\x4e\xd3\x6c\xa7\x85\xcf\x64\xcd\x7c\xd9\x69\xfd\x66\xf9\x83\x49\x53\x95\x7b\x56\x4f\xa7\x51\x8c\x6d\x4b\x5c\x42\x8e\x6d\x63\xd2\x53\xc9\x83\x2c\x83\x36\x67\xe5\x78\xb4\x64\x3d\x5b\xdf\x5c\x94\x5d\xee\x8b\xe7\x62\xc6\x67\xf4\x8c\x7a\x64\x00\x63\xba\x87\x49\x99\x8b\x8c\x17\x7f\x20\x94\xf2\x4e\xa7\x96\x10\x98\xa4\x66\x0c\x73\x16\x00\x00\x00\x00", /* 4a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x3a\x5c\x1d\x5e\x38\x95\x7f\x50\x7f\x80\xa0\x53\x82\x65\x5e\x75\x45\x55\x31\x50\x21\x8d\x85\x62\x84\x94\x9e\x67\x1d\x56\x32\x6f\x6e\x5d\xe2\x54\x35\x70\x92\x8f\x66\x62\x6f\x64\xa4\x63\xa3\x5f\x7b\x6f\x88\x90\xf4\x81\xe3\x8f\xb0\x5c\x18\x66\x68\x5f\xf1\x6c\x89\x96\x48\x8d\x81\x88\x6c\x64\x91\x79\xf0\x57\xce\x6a\x59\x62\x10\x54\x48\x4e\x58\x7a\x0b\x60\xe9\x6f\x84\x8b\xda\x62\x7f\x90\x1e\x9a\x8b\x79\xe4\x54\x03\x75\xf4\x63\x01\x53\x19\x6c\x60\x8f\xdf\x5f\x1b\x9a\x70\x80\x3b\x9f\x7f\x4f\x88\x5c\x3a", /* 4a80 */ "\x00\x00\x8d\x64\x7f\xc5\x65\xa5\x70\xbd\x51\x45\x51\xb2\x86\x6b\x5d\x07\x5b\xa0\x62\xbd\x91\x6c\x75\x74\x8e\x0c\x7a\x20\x61\x01\x7b\x79\x4e\xc7\x7e\xf8\x77\x85\x4e\x11\x81\xed\x52\x1d\x51\xfa\x6a\x71\x53\xa8\x8e\x87\x95\x04\x96\xcf\x6e\xc1\x96\x64\x69\x5a\x78\x40\x50\xa8\x77\xd7\x64\x10\x89\xe6\x59\x04\x63\xe3\x5d\xdd\x7a\x7f\x69\x3d\x4f\x20\x82\x39\x55\x98\x4e\x32\x75\xae\x7a\x97\x5e\x62\x5e\x8a\x95\xef\x52\x1b\x54\x39\x70\x8a\x63\x76\x95\x24\x57\x82\x66\x25\x69\x3f\x91\x87\x55\x07\x6d\xf3\x7e\xaf\x88\x22\x62\x33\x7e\xf0\x75\xb5\x83\x28\x78\xc1\x96\xcc\x8f\x9e\x61\x48\x74\xf7\x8b\xcd\x6b\x64\x52\x3a\x8d\x50\x6b\x21\x80\x6a\x84\x71\x56\xf1\x53\x06\x4e\xce\x4e\x1b\x51\xd1\x7c\x97\x91\x8b\x7c\x07\x4f\xc3\x8e\x7f\x7b\xe1\x7a\x9c\x64\x67\x5d\x14\x50\xac\x81\x06\x76\x01\x7c\xb9\x6d\xec\x7f\xe0\x67\x51\x5b\x58\x5b\xf8\x78\xcb\x64\xae\x64\x13\x63\xaa\x63\x2b\x95\x19\x64\x2d\x8f\xbe\x7b\x54\x76\x29\x62\x53\x59\x27\x54\x46\x6b\x79\x50\xa3\x62\x34\x5e\x26\x6b\x86\x4e\xe3\x8d\x37\x88\x8b\x5f\x85\x90\x2e\x00\x00\x00\x00", /* 4b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x20\x80\x3d\x62\xc5\x4e\x39\x53\x55\x90\xf8\x63\xb8\x80\xc6\x65\xe6\x6c\x2e\x4f\x46\x60\xee\x6d\xe1\x8b\xde\x5f\x39\x86\xcb\x5f\x53\x63\x21\x51\x5a\x83\x61\x68\x63\x52\x00\x63\x63\x8e\x48\x50\x12\x5c\x9b\x79\x77\x5b\xfc\x52\x30\x7a\x3b\x60\xbc\x90\x53\x76\xd7\x5f\xb7\x5f\x97\x76\x84\x8e\x6c\x70\x6f\x76\x7b\x7b\x49\x77\xaa\x51\xf3\x90\x93\x58\x24\x4f\x4e\x6e\xf4\x8f\xea\x65\x4c\x7b\x1b\x72\xc4\x6d\xa4\x7f\xdf\x5a\xe1\x62\xb5\x5e\x95\x57\x30\x84\x82\x7b\x2c\x5e\x1d\x5f\x1f\x90\x12\x7f\x14\x98\xa0", /* 4b80 */ "\x00\x00\x63\x82\x6e\xc7\x78\x98\x70\xb9\x51\x78\x97\x5b\x57\xab\x75\x35\x4f\x43\x75\x38\x5e\x97\x60\xe6\x59\x60\x6d\xc0\x6b\xbf\x78\x89\x53\xfc\x96\xd5\x51\xcb\x52\x01\x63\x89\x54\x0a\x94\x93\x8c\x03\x8d\xcc\x72\x39\x78\x9f\x87\x76\x8f\xed\x8c\x0d\x53\xe0\x4e\x01\x76\xef\x53\xee\x94\x89\x98\x76\x9f\x0e\x95\x2d\x5b\x9a\x8b\xa2\x4e\x22\x4e\x1c\x51\xac\x84\x63\x61\xc2\x52\xa8\x68\x0b\x4f\x97\x60\x6b\x51\xbb\x6d\x1e\x51\x5c\x62\x96\x65\x97\x96\x61\x8c\x46\x90\x17\x75\xd8\x90\xfd\x77\x63\x6b\xd2\x72\x8a\x72\xec\x8b\xfb\x58\x35\x77\x79\x8d\x4c\x67\x5c\x95\x40\x80\x9a\x5e\xa6\x6e\x21\x59\x92\x7a\xef\x77\xed\x95\x3b\x6b\xb5\x65\xad\x7f\x0e\x58\x06\x51\x51\x96\x1f\x5b\xf9\x58\xa9\x54\x28\x8e\x72\x65\x66\x98\x7f\x56\xe4\x94\x9d\x76\xfe\x90\x41\x63\x87\x54\xc6\x59\x1a\x59\x3a\x57\x9b\x8e\xb2\x67\x35\x8d\xfa\x82\x35\x52\x41\x60\xf0\x58\x15\x86\xfe\x5c\xe8\x9e\x45\x4f\xc4\x98\x9d\x8b\xb9\x5a\x25\x60\x76\x53\x84\x62\x7c\x90\x4f\x91\x02\x99\x7f\x60\x69\x80\x0c\x51\x3f\x80\x33\x5c\x14\x99\x75\x6d\x31\x4e\x8c\x00\x00\x00\x00", /* 4c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x30\x53\xd1\x7f\x5a\x7b\x4f\x4f\x10\x4e\x4f\x96\x00\x6c\xd5\x73\xd0\x85\xe9\x5e\x06\x75\x6a\x7f\xfb\x6a\x0a\x77\xfe\x94\x92\x7e\x41\x51\xe1\x70\xe6\x53\xcd\x8f\xd4\x83\x03\x8d\x29\x72\xaf\x99\x6d\x6c\xdb\x57\x4a\x82\xb3\x65\xb9\x80\xaa\x62\x3f\x96\x32\x59\xa8\x4e\xff\x8b\xbf\x7e\xba\x65\x3e\x83\xf2\x97\x5e\x55\x61\x98\xde\x80\xa5\x53\x2a\x8b\xfd\x54\x20\x80\xba\x5e\x9f\x6c\xb8\x8d\x39\x82\xac\x91\x5a\x54\x29\x6c\x1b\x52\x06\x7e\xb7\x57\x5f\x71\x1a\x6c\x7e\x7c\x89\x59\x4b\x4e\xfd\x5f\xff\x61\x24", /* 4c80 */ "\x00\x00\x7c\xaa\x4e\x30\x5c\x01\x67\xab\x87\x02\x5c\xf0\x95\x0b\x98\xce\x75\xaf\x70\xfd\x90\x22\x51\xaf\x7f\x1d\x8b\xbd\x59\x49\x51\xe4\x4f\x5b\x54\x26\x59\x2b\x65\x77\x80\xa4\x5b\x75\x62\x76\x62\xc2\x8f\x90\x5e\x45\x6c\x1f\x7b\x26\x4f\x0f\x4f\xd8\x67\x0d\x6d\x6e\x6d\xaa\x79\x8f\x88\xb1\x5f\x17\x75\x2b\x62\x9a\x8f\x85\x4f\xef\x91\xdc\x65\xa7\x81\x2f\x81\x51\x5e\x9c\x81\x50\x8d\x74\x52\x6f\x89\x86\x8d\x4b\x59\x0d\x50\x85\x4e\xd8\x96\x1c\x72\x36\x81\x79\x8d\x1f\x5b\xcc\x8b\xa3\x96\x44\x59\x87\x7f\x1a\x54\x90\x56\x76\x56\x0e\x8b\xe5\x65\x39\x69\x82\x94\x99\x76\xd6\x6e\x89\x5e\x72\x75\x18\x67\x46\x67\xd1\x7a\xff\x80\x9d\x8d\x76\x61\x1f\x79\xc6\x65\x62\x8d\x63\x51\x88\x52\x1a\x94\xa2\x7f\x38\x80\x9b\x7e\xb2\x5c\x97\x6e\x2f\x67\x60\x7b\xd9\x76\x8b\x9a\xd8\x81\x8f\x7f\x94\x7c\xd5\x64\x1e\x95\x50\x7a\x3f\x54\x4a\x54\xe5\x6b\x4c\x64\x01\x62\x08\x9e\x3d\x80\xf3\x75\x99\x52\x72\x97\x69\x84\x5b\x68\x3c\x86\xe4\x96\x01\x96\x94\x94\xec\x4e\x2a\x54\x04\x7e\xd9\x68\x39\x8d\xdf\x80\x15\x66\xf4\x5e\x9a\x7f\xb9\x00\x00\x00\x00", /* 4d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc2\x80\x3f\x68\x97\x5d\xe5\x65\x3b\x52\x9f\x60\x6d\x9f\x9a\x4f\x9b\x8e\xac\x51\x6c\x5b\xab\x5f\x13\x5d\xe9\x6c\x5e\x62\xf1\x8d\x21\x51\x71\x94\xa9\x52\xfe\x6c\x9f\x82\xdf\x72\xd7\x57\xa2\x67\x84\x8d\x2d\x59\x1f\x8f\x9c\x83\xc7\x54\x95\x7b\x8d\x4f\x30\x6c\xbd\x5b\x64\x59\xd1\x9f\x13\x53\xe4\x86\xca\x9a\xa8\x8c\x37\x80\xa1\x65\x45\x98\x7e\x56\xfa\x96\xc7\x52\x2e\x74\xdc\x52\x50\x5b\xe1\x63\x02\x89\x02\x4e\x56\x62\xd0\x60\x2a\x68\xfa\x51\x73\x5b\x98\x51\xa0\x89\xc2\x7b\xa1\x99\x86\x7f\x50\x60\xef", /* 4d80 */ "\x00\x00\x70\x4c\x8d\x2f\x51\x49\x5e\x7f\x90\x1b\x74\x70\x89\xc4\x57\x2d\x78\x45\x5f\x52\x9f\x9f\x95\xfa\x8f\x68\x9b\x3c\x8b\xe1\x76\x78\x68\x42\x67\xdc\x8d\xea\x8d\x35\x52\x3d\x8f\x8a\x6e\xda\x68\xcd\x95\x05\x90\xed\x56\xfd\x67\x9c\x88\xf9\x8f\xc7\x54\xc8\x9a\xb8\x5b\x69\x6d\x77\x6c\x26\x4e\xa5\x5b\xb3\x9a\x87\x91\x63\x61\xa8\x90\xaf\x97\xe9\x54\x2b\x6d\xb5\x5b\xd2\x51\xfd\x55\x8a\x7f\x55\x7f\xf0\x64\xbc\x63\x4d\x65\xf1\x61\xbe\x60\x8d\x71\x0a\x6c\x57\x6c\x49\x59\x2f\x67\x6d\x82\x2a\x58\xd5\x56\x8e\x8c\x6a\x6b\xeb\x90\xdd\x59\x7d\x80\x17\x53\xf7\x6d\x69\x54\x75\x55\x9d\x83\x77\x83\xcf\x68\x38\x79\xbe\x54\x8c\x4f\x55\x54\x08\x76\xd2\x8c\x89\x96\x02\x6c\xb3\x6d\xb8\x8d\x6b\x89\x10\x9e\x64\x8d\x3a\x56\x3f\x9e\xd1\x75\xd5\x5f\x88\x72\xe0\x60\x68\x54\xfc\x4e\xa8\x6a\x2a\x88\x61\x60\x52\x8f\x70\x54\xc4\x70\xd8\x86\x79\x9e\x3f\x6d\x2a\x5b\x8f\x5f\x18\x7e\xa2\x55\x89\x4f\xaf\x73\x34\x54\x3c\x53\x9a\x50\x19\x54\x0e\x54\x7c\x4e\x4e\x5f\xfd\x74\x5a\x58\xf6\x84\x6b\x80\xe1\x87\x74\x72\xd0\x7c\xca\x6e\x56\x00\x00\x00\x00", /* 4e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x27\x86\x4e\x55\x2c\x62\xa4\x4e\x92\x6c\xaa\x62\x37\x82\xb1\x54\xd7\x53\x4e\x73\x3e\x6e\xd1\x75\x3b\x52\x12\x53\x16\x8b\xdd\x69\xd0\x5f\x8a\x60\x00\x6d\xee\x57\x4f\x6b\x22\x73\xaf\x68\x53\x8f\xd8\x7f\x13\x63\x62\x60\xa3\x55\x24\x75\xea\x8c\x62\x71\x15\x6d\xa3\x5b\xa6\x5e\x7b\x83\x52\x61\x4c\x9e\xc4\x78\xfa\x87\x57\x7c\x27\x76\x87\x51\xf0\x60\xf6\x71\x4c\x66\x43\x5e\x4c\x60\x4d\x8c\x0e\x70\x70\x63\x25\x8f\x89\x5f\xbd\x60\x62\x86\xd4\x56\xde\x6b\xc1\x60\x94\x61\x67\x53\x49\x60\xe0\x66\x66\x8d\x3f", /* 4e80 */ "\x00\x00\x79\xfd\x4f\x1a\x70\xe9\x6c\x47\x8b\xb3\x8b\xf2\x7e\xd8\x83\x64\x66\x0f\x5a\x5a\x9b\x42\x6d\x51\x6d\xf7\x8c\x41\x6d\x3b\x4f\x19\x70\x6b\x83\xb7\x62\x16\x60\xd1\x97\x0d\x8d\x27\x79\x78\x51\xfb\x57\x3e\x57\xfa\x67\x3a\x75\x78\x7a\x3d\x79\xef\x7b\x95\x80\x8c\x99\x65\x8f\xf9\x6f\xc0\x8b\xa5\x9e\x21\x59\xec\x7e\xe9\x7f\x09\x54\x09\x67\x81\x68\xd8\x8f\x91\x7c\x4d\x96\xc6\x53\xca\x60\x25\x75\xbe\x6c\x72\x53\x73\x5a\xc9\x7e\xa7\x63\x24\x51\xe0\x81\x0a\x5d\xf1\x84\xdf\x62\x80\x51\x80\x5b\x63\x4f\x0e\x79\x6d\x52\x42\x60\xb8\x6d\x4e\x5b\xc4\x5b\xc2\x8b\xa1\x8b\xb0\x65\xe2\x5f\xcc\x96\x45\x59\x93\x7e\xe7\x7e\xaa\x56\x09\x67\xb7\x59\x39\x4f\x73\x5b\xb6\x52\xa0\x83\x5a\x98\x8a\x8d\x3e\x75\x32\x94\xbe\x50\x47\x7a\x3c\x4e\xf7\x67\xb6\x9a\x7e\x5a\xc1\x6b\x7c\x76\xd1\x57\x5a\x5c\x16\x7b\x3a\x95\xf4\x71\x4e\x51\x7c\x80\xa9\x82\x70\x59\x78\x7f\x04\x83\x27\x68\xc0\x67\xec\x78\xb1\x78\x77\x62\xe3\x63\x61\x7b\x80\x4f\xed\x52\x6a\x51\xcf\x83\x50\x69\xdb\x92\x74\x8d\xf5\x8d\x31\x89\xc1\x95\x2e\x7b\xad\x4e\xf6\x00\x00\x00\x00", /* 4f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x65\x82\x30\x52\x51\x99\x6f\x6e\x10\x6e\x85\x6d\xa7\x5e\xfa\x50\xf5\x59\xdc\x5c\x06\x6d\x46\x6c\x5f\x75\x86\x84\x8b\x68\x68\x59\x56\x8b\xb2\x53\x20\x91\x71\x96\x4d\x85\x49\x69\x12\x79\x01\x71\x26\x80\xf6\x4e\xa4\x90\xca\x6d\x47\x9a\x84\x5a\x07\x56\xbc\x64\x05\x94\xf0\x77\xeb\x4f\xa5\x81\x1a\x72\xe1\x89\xd2\x99\x7a\x7f\x34\x7e\xde\x52\x7f\x65\x59\x91\x75\x8f\x7f\x8f\x83\x53\xeb\x7a\x96\x63\xed\x63\xa5\x76\x86\x79\xf8\x88\x57\x96\x36\x62\x2a\x52\xab\x82\x82\x68\x54\x67\x70\x63\x77\x77\x6b\x7a\xed", /* 4f80 */ "\x00\x00\x6d\x01\x7e\xd3\x89\xe3\x59\xd0\x62\x12\x85\xc9\x82\xa5\x75\x4c\x50\x1f\x4e\xcb\x75\xa5\x8b\xeb\x5c\x4a\x5d\xfe\x7b\x4b\x65\xa4\x91\xd1\x4e\xca\x6d\x25\x89\x5f\x7d\x27\x95\x26\x4e\xc5\x8c\x28\x8f\xdb\x97\x73\x66\x4b\x79\x81\x8f\xd1\x70\xec\x6d\x78\x5c\x3d\x52\xb2\x83\x46\x51\x62\x83\x0e\x77\x5b\x66\x76\x9c\xb8\x4e\xac\x60\xca\x7c\xbe\x7c\xb3\x7e\xcf\x4e\x95\x8b\x66\x66\x6f\x98\x88\x97\x59\x58\x83\x65\x6c\x95\x5c\x5f\x84\x75\xc9\x97\x56\x7a\xdf\x7a\xde\x51\xc0\x70\xaf\x7a\x98\x63\xea\x7a\x76\x7e\xa0\x73\x96\x97\xed\x4e\x45\x70\x78\x4e\x5d\x91\x52\x53\xa9\x65\x51\x65\xe7\x81\xfc\x82\x05\x54\x8e\x5c\x31\x75\x9a\x97\xa0\x62\xd8\x72\xd9\x75\xbd\x5c\x45\x9a\x79\x83\xca\x5c\x40\x54\x80\x77\xe9\x4e\x3e\x6c\xae\x80\x5a\x62\xd2\x63\x6e\x5d\xe8\x51\x77\x8d\xdd\x8e\x1e\x95\x2f\x4f\xf1\x53\xe5\x60\xe7\x70\xac\x52\x67\x63\x50\x9e\x43\x5a\x1f\x50\x26\x77\x37\x53\x77\x7e\xe2\x64\x85\x65\x2b\x62\x89\x63\x98\x50\x14\x72\x35\x89\xc9\x51\xb3\x8b\xc0\x7e\xdd\x57\x47\x83\xcc\x94\xa7\x51\x9b\x54\x1b\x5c\xfb\x00\x00\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xca\x7a\xe3\x6d\x5a\x90\xe1\x9a\x8f\x55\x80\x54\x96\x53\x61\x54\xaf\x5f\x00\x63\xe9\x69\x77\x51\xef\x61\x68\x52\x0a\x58\x2a\x52\xd8\x57\x4e\x78\x0d\x77\x0b\x5e\xb7\x61\x77\x7c\xe0\x62\x5b\x62\x97\x4e\xa2\x70\x95\x80\x03\x62\xf7\x70\xe4\x97\x60\x57\x77\x82\xdb\x67\xef\x68\xf5\x78\xd5\x98\x97\x79\xd1\x58\xf3\x54\xb3\x53\xef\x6e\x34\x51\x4b\x52\x3b\x5b\xa2\x8b\xfe\x80\xaf\x55\x43\x57\xa6\x60\x73\x57\x51\x54\x2d\x7a\x7a\x60\x50\x5b\x54\x63\xa7\x62\xa0\x53\xe3\x62\x63\x5b\xc7\x67\xaf\x54\xed\x7a\x9f", /* 5080 */ "\x00\x00\x82\xe6\x91\x77\x5e\x93\x88\xe4\x59\x38\x57\xae\x63\x0e\x8d\xe8\x80\xef\x57\x57\x7b\x77\x4f\xa9\x5f\xeb\x5b\xbd\x6b\x3e\x53\x21\x7b\x50\x72\xc2\x68\x46\x77\xff\x77\x36\x65\xf7\x51\xb5\x4e\x8f\x76\xd4\x5c\xbf\x7a\xa5\x84\x75\x59\x4e\x9b\x41\x50\x80\x99\x88\x61\x27\x6e\x83\x57\x64\x66\x06\x63\x46\x56\xf0\x62\xec\x62\x69\x5e\xd3\x96\x14\x57\x83\x62\xc9\x55\x87\x87\x21\x81\x4a\x8f\xa3\x55\x66\x83\xb1\x67\x65\x8d\x56\x84\xdd\x5a\x6a\x68\x0f\x62\xe6\x7b\xee\x96\x11\x51\x70\x6f\x9c\x8c\x30\x63\xfd\x89\xc8\x61\xd2\x7f\x06\x70\xc2\x6e\xe5\x74\x05\x69\x94\x72\xfc\x5e\xca\x90\xce\x67\x17\x6d\x6a\x63\x5e\x52\xb3\x72\x62\x80\x01\x4f\x6c\x59\xe5\x91\x6a\x70\xd9\x6d\x9d\x52\xd2\x4e\x50\x96\xf7\x95\x6d\x85\x7e\x78\xca\x7d\x2f\x51\x21\x57\x92\x64\xc2\x80\x8b\x7c\x7b\x6c\xea\x68\xf1\x69\x5e\x51\xb7\x53\x98\x68\xa8\x72\x81\x9e\xce\x7b\xf1\x72\xf8\x79\xbb\x6f\x13\x74\x06\x67\x4e\x91\xcc\x9c\xa4\x79\x3c\x83\x89\x83\x54\x54\x0f\x68\x17\x4e\x3d\x53\x89\x52\xb1\x78\x3e\x53\x86\x52\x29\x50\x88\x4f\x8b\x4f\xd0\x00\x00\x00\x00", /* 5100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xe2\x7a\xcb\x7c\x92\x6c\xa5\x96\xb6\x52\x9b\x74\x83\x54\xe9\x4f\xe9\x80\x54\x83\xb2\x8f\xde\x95\x70\x5e\xc9\x60\x1c\x6d\x9f\x5e\x18\x65\x5b\x81\x38\x94\xfe\x60\x4b\x70\xbc\x7e\xc3\x7c\xae\x51\xc9\x68\x81\x7c\xb1\x82\x6f\x4e\x24\x8f\x86\x91\xcf\x66\x7e\x4e\xae\x8c\x05\x64\xa9\x80\x4a\x50\xda\x75\x97\x71\xce\x5b\xe5\x8f\xbd\x6f\x66\x4e\x86\x64\x82\x95\x63\x5e\xd6\x65\x99\x52\x17\x88\xc2\x70\xc8\x52\xa3\x73\x0e\x74\x33\x67\x97\x78\xf7\x97\x16\x4e\x34\x90\xbb\x9c\xde\x6d\xcb\x51\xdb\x8d\x41\x54\x1d", /* 5180 */ "\x00\x00\x62\xce\x73\xb2\x83\xf1\x96\xf6\x9f\x84\x94\xc3\x4f\x36\x7f\x9a\x51\xcc\x70\x75\x96\x75\x5c\xad\x98\x86\x53\xe6\x4e\xe4\x6e\x9c\x74\x09\x69\xb4\x78\x6b\x99\x8f\x75\x59\x52\x18\x76\x24\x6d\x41\x67\xf3\x51\x6d\x9f\x99\x80\x4b\x54\x99\x7b\x3c\x7a\xbf\x96\x86\x57\x84\x62\xe2\x96\x47\x69\x7c\x5a\x04\x64\x02\x7b\xd3\x6f\x0f\x96\x4b\x82\xa6\x53\x62\x98\x85\x5e\x90\x70\x89\x63\xb3\x53\x64\x86\x4f\x9c\x81\x9e\x93\x78\x8c\x97\x32\x8d\xef\x8d\x42\x9e\x7f\x6f\x5e\x79\x84\x5f\x55\x96\x46\x62\x2e\x9a\x74\x54\x15\x94\xdd\x4f\xa3\x65\xc5\x5c\x65\x5c\x61\x7f\x15\x86\x51\x6c\x2f\x5f\x8b\x73\x87\x6e\xe4\x7e\xff\x5c\xe6\x63\x1b\x5b\x6a\x6e\xe6\x53\x75\x4e\x71\x63\xa0\x75\x65\x62\xa1\x8f\x6e\x4f\x26\x4e\xd1\x6c\xa6\x7e\xb6\x8b\xba\x84\x1d\x87\xba\x7f\x57\x90\x3b\x95\x23\x7b\xa9\x9a\xa1\x88\xf8\x84\x3d\x6d\x1b\x9a\x86\x7e\xdc\x59\x88\x9e\xbb\x73\x9b\x78\x01\x86\x82\x9a\x6c\x9a\x82\x56\x1b\x54\x17\x57\xcb\x4e\x70\x9e\xa6\x53\x56\x8f\xc8\x81\x09\x77\x92\x99\x92\x86\xee\x6e\xe1\x85\x13\x66\xfc\x61\x62\x6f\x2b\x00\x00\x00\x00", /* 5200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x29\x82\x92\x83\x2b\x76\xf2\x6c\x13\x5f\xd9\x83\xbd\x73\x2b\x83\x05\x95\x1a\x6b\xdb\x77\xdb\x94\xc6\x53\x6f\x83\x02\x51\x92\x5e\x3d\x8c\x8c\x8d\x38\x4e\x48\x73\xab\x67\x9a\x68\x85\x91\x76\x97\x09\x71\x64\x6c\xa1\x77\x09\x5a\x92\x95\x41\x6b\xcf\x7f\x8e\x66\x27\x5b\xd0\x59\xb9\x5a\x9a\x95\xe8\x95\xf7\x4e\xec\x84\x0c\x84\x99\x6a\xac\x76\xdf\x95\x30\x73\x1b\x68\xa6\x5b\x5f\x77\x2f\x91\x9a\x97\x61\x7c\xdc\x8f\xf7\x8c\x1c\x5f\x25\x7c\x73\x79\xd8\x89\xc5\x6c\xcc\x87\x1c\x5b\xc6\x5e\x42\x68\xc9\x77\x20", /* 5280 */ "\x00\x00\x7e\xf5\x51\x95\x51\x4d\x52\xc9\x5a\x29\x7f\x05\x97\x62\x82\xd7\x63\xcf\x77\x84\x85\xd0\x79\xd2\x6e\x3a\x5e\x99\x59\x99\x85\x11\x70\x6d\x6c\x11\x62\xbf\x76\xbf\x65\x4f\x60\xaf\x95\xfd\x66\x0e\x87\x9f\x9e\x23\x94\xed\x54\x0d\x54\x7d\x8c\x2c\x64\x78\x64\x79\x86\x11\x6a\x21\x81\x9c\x78\xe8\x64\x69\x9b\x54\x62\xb9\x67\x2b\x83\xab\x58\xa8\x9e\xd8\x6c\xab\x6f\x20\x5b\xde\x96\x4c\x8c\x0b\x72\x5f\x67\xd0\x62\xc7\x72\x61\x4e\xa9\x59\xc6\x6b\xcd\x58\x93\x66\xae\x5e\x55\x52\xdf\x61\x55\x67\x28\x76\xee\x77\x66\x72\x67\x7a\x46\x62\xff\x54\xea\x54\x50\x94\xa0\x90\xa3\x5a\x1c\x7e\xb3\x6c\x16\x4e\x43\x59\x76\x80\x10\x59\x48\x53\x57\x75\x37\x96\xbe\x56\xca\x63\x20\x81\x11\x60\x7c\x95\xf9\x6d\xd6\x54\x62\x99\x81\x51\x85\x5a\xe9\x80\xfd\x59\xae\x97\x13\x50\x2a\x6c\xe5\x5c\x3c\x62\xdf\x4f\x60\x53\x3f\x81\x7b\x90\x06\x6e\xba\x85\x2b\x62\xc8\x5e\x74\x78\xbe\x64\xb5\x63\x7b\x5f\xf5\x5a\x18\x91\x7f\x9e\x1f\x5c\x3f\x63\x4f\x80\x42\x5b\x7d\x55\x6e\x95\x4a\x95\x4d\x6d\x85\x60\xa8\x67\xe0\x72\xde\x51\xdd\x5b\x81\x00\x00\x00\x00", /* 5300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xe7\x6c\xde\x72\x5b\x62\x6d\x94\xae\x7e\xbd\x81\x13\x6d\x53\x51\x9c\x5f\x04\x59\x74\x52\xaa\x60\x12\x59\x73\x66\x96\x86\x50\x75\x9f\x63\x2a\x61\xe6\x7c\xef\x8b\xfa\x54\xe6\x6b\x27\x9e\x25\x6b\xb4\x85\xd5\x54\x55\x50\x76\x6c\xa4\x55\x6a\x8d\xb4\x72\x2c\x5e\x15\x60\x15\x74\x36\x62\xcd\x63\x92\x72\x4c\x5f\x98\x6e\x43\x6d\x3e\x65\x00\x6f\x58\x76\xd8\x78\xd0\x76\xfc\x75\x54\x52\x24\x53\xdb\x4e\x53\x5e\x9e\x65\xc1\x80\x2a\x80\xd6\x62\x9b\x54\x86\x52\x28\x70\xae\x88\x8d\x8d\xd1\x6c\xe1\x54\x78\x80\xda", /* 5380 */ "\x00\x00\x57\xf9\x88\xf4\x8d\x54\x96\x6a\x91\x4d\x4f\x69\x6c\x9b\x55\xb7\x76\xc6\x78\x30\x62\xa8\x70\xf9\x6f\x8e\x5f\x6d\x84\xec\x68\xda\x78\x7c\x7b\xf7\x81\xa8\x67\x0b\x9e\x4f\x63\x67\x78\xb0\x57\x6f\x78\x12\x97\x39\x62\x79\x62\xab\x52\x88\x74\x35\x6b\xd7\x55\x64\x81\x3e\x75\xb2\x76\xae\x53\x39\x75\xde\x50\xfb\x5c\x41\x8b\x6c\x7b\xc7\x50\x4f\x72\x47\x9a\x97\x98\xd8\x6f\x02\x74\xe2\x79\x68\x64\x87\x77\xa5\x62\xfc\x98\x91\x8d\x2b\x54\xc1\x80\x58\x4e\x52\x57\x6a\x82\xf9\x84\x0d\x5e\x73\x51\xed\x74\xf6\x8b\xc4\x5c\x4f\x57\x61\x6c\xfc\x98\x87\x5a\x46\x78\x34\x9b\x44\x8f\xeb\x7c\x95\x52\x56\x62\x51\x94\xfa\x4e\xc6\x83\x86\x84\x61\x83\xe9\x84\xb2\x57\xd4\x67\x34\x57\x03\x66\x6e\x6d\x66\x8c\x31\x66\xdd\x70\x11\x67\x1f\x6b\x3a\x68\x16\x62\x1a\x59\xbb\x4e\x03\x51\xc4\x6f\x06\x67\xd2\x6c\x8f\x51\x76\x68\xcb\x59\x47\x6b\x67\x75\x66\x5d\x0e\x81\x10\x9f\x50\x65\xd7\x79\x48\x79\x41\x9a\x91\x8d\x77\x5c\x82\x4e\x5e\x4f\x01\x54\x2f\x59\x51\x78\x0c\x56\x68\x6c\x14\x8f\xc4\x5f\x03\x6c\x7d\x6c\xe3\x8b\xab\x63\x90\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x70\x6d\x3d\x72\x75\x62\x66\x94\x8e\x94\xc5\x53\x43\x8f\xc1\x7b\x7e\x4e\xdf\x8c\x26\x4e\x7e\x9e\xd4\x94\xb1\x94\xb3\x52\x4d\x6f\x5c\x90\x63\x6d\x45\x8c\x34\x58\x11\x5d\x4c\x6b\x20\x6b\x49\x67\xaa\x54\x5b\x81\x54\x7f\x8c\x58\x99\x85\x37\x5f\x3a\x62\xa2\x6a\x47\x95\x39\x65\x72\x60\x84\x68\x65\x77\xa7\x4e\x54\x4f\xa8\x5d\xe7\x97\x98\x64\xac\x7f\xd8\x5c\xed\x4f\xcf\x7a\x8d\x52\x07\x83\x04\x4e\x14\x60\x2f\x7a\x83\x94\xa6\x4f\xb5\x4e\xb2\x79\xe6\x74\x34\x52\xe4\x82\xb9\x64\xd2\x79\xbd\x5b\xdd\x6c\x81", /* 5480 */ "\x00\x00\x97\x52\x8f\x7b\x6c\x22\x50\x3e\x53\x7f\x6e\x05\x64\xce\x66\x74\x6c\x30\x60\xc5\x98\x77\x8b\xf7\x5e\x86\x74\x3c\x7a\x77\x79\xcb\x4e\x18\x90\xb1\x74\x03\x6c\x42\x56\xda\x91\x4b\x6c\xc5\x8d\x8b\x53\x3a\x86\xc6\x66\xf2\x8e\xaf\x5c\x48\x9a\x71\x6e\x20\x53\xd6\x5a\x36\x9f\x8b\x8d\xa3\x53\xbb\x57\x08\x98\xa7\x67\x43\x91\x9b\x6c\xc9\x51\x68\x75\xca\x62\xf3\x72\xac\x52\x38\x52\x9d\x7f\x3a\x70\x94\x76\x38\x53\x74\x9e\x4a\x69\xb7\x78\x6e\x96\xc0\x88\xd9\x7f\xa4\x71\x36\x71\xc3\x51\x89\x67\xd3\x74\xe4\x58\xe4\x65\x18\x56\xb7\x8b\xa9\x99\x76\x62\x70\x7e\xd5\x60\xf9\x70\xed\x58\xec\x4e\xc1\x4e\xba\x5f\xcd\x97\xe7\x4e\xfb\x8b\xa4\x52\x03\x59\x8a\x7e\xab\x62\x54\x4e\xcd\x65\xe5\x62\x0e\x83\x38\x84\xc9\x83\x63\x87\x8d\x71\x94\x6e\xb6\x5b\xb9\x7e\xd2\x51\x97\x63\xc9\x67\xd4\x80\x89\x83\x39\x88\x15\x51\x12\x5b\x7a\x59\x82\x8f\xb1\x4e\x73\x6c\x5d\x51\x65\x89\x25\x8f\x6f\x96\x2e\x85\x4a\x74\x5e\x95\x10\x95\xf0\x6d\xa6\x82\xe5\x5f\x31\x64\x92\x6d\x12\x84\x28\x81\x6e\x9c\xc3\x58\x5e\x8d\x5b\x4e\x09\x53\xc1\x00\x00\x00\x00", /* 5500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x1e\x65\x63\x68\x51\x55\xd3\x4e\x27\x64\x14\x9a\x9a\x62\x6b\x5a\xc2\x74\x5f\x82\x72\x6d\xa9\x68\xee\x50\xe7\x83\x8e\x78\x02\x67\x40\x52\x39\x6c\x99\x7e\xb1\x50\xbb\x55\x65\x71\x5e\x7b\x5b\x66\x52\x73\xca\x82\xeb\x67\x49\x5c\x71\x52\x20\x71\x7d\x88\x6b\x95\xea\x96\x55\x64\xc5\x8d\x61\x81\xb3\x55\x84\x6c\x55\x62\x47\x7f\x2e\x58\x92\x4f\x24\x55\x46\x8d\x4f\x66\x4c\x4e\x0a\x5c\x1a\x88\xf3\x68\xa2\x63\x4e\x7a\x0d\x70\xe7\x82\x8d\x52\xfa\x97\xf6\x5c\x11\x54\xe8\x90\xb5\x7e\xcd\x59\x62\x8d\x4a\x86\xc7", /* 5580 */ "\x00\x00\x82\x0c\x82\x0d\x8d\x66\x64\x44\x5c\x04\x61\x51\x6d\x89\x79\x3e\x8b\xbe\x78\x37\x75\x33\x54\x7b\x4f\x38\x8e\xab\x6d\xf1\x5a\x20\x7e\xc5\x79\x5e\x6c\x88\x5b\xa1\x5a\x76\x75\x1a\x80\xbe\x61\x4e\x6e\x17\x58\xf0\x75\x1f\x75\x25\x72\x72\x53\x47\x7e\xf3\x77\x01\x76\xdb\x52\x69\x80\xdc\x57\x23\x5e\x08\x59\x31\x72\xee\x65\xbd\x6e\x7f\x8b\xd7\x5c\x38\x86\x71\x53\x41\x77\xf3\x62\xfe\x65\xf6\x4e\xc0\x98\xdf\x86\x80\x5b\x9e\x8b\xc6\x53\xf2\x77\xe2\x4f\x7f\x5c\x4e\x9a\x76\x59\xcb\x5f\x0f\x79\x3a\x58\xeb\x4e\x16\x67\xff\x4e\x8b\x62\xed\x8a\x93\x90\x1d\x52\xbf\x66\x2f\x55\xdc\x56\x6c\x90\x02\x4e\xd5\x4f\x8d\x91\xca\x99\x70\x6c\x0f\x5e\x02\x60\x43\x5b\xa4\x89\xc6\x8b\xd5\x65\x36\x62\x4b\x99\x96\x5b\x88\x5b\xff\x63\x88\x55\x2e\x53\xd7\x76\x26\x51\x7d\x85\x2c\x67\xa2\x68\xb3\x6b\x8a\x62\x92\x8f\x93\x53\xd4\x82\x12\x6d\xd1\x75\x8f\x4e\x66\x8d\x4e\x5b\x70\x71\x9f\x85\xaf\x66\x91\x66\xd9\x7f\x72\x87\x00\x9e\xcd\x9f\x20\x5c\x5e\x67\x2f\x8f\xf0\x68\x11\x67\x5f\x62\x0d\x7a\xd6\x58\x85\x5e\xb6\x65\x70\x6f\x31\x00\x00\x00\x00", /* 5600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x55\x52\x37\x80\x0d\x64\x54\x88\x70\x75\x29\x5e\x05\x68\x13\x62\xf4\x97\x1c\x53\xcc\x72\x3d\x8c\x01\x6c\x34\x77\x61\x7a\x0e\x54\x2e\x77\xac\x98\x7a\x82\x1c\x8b\xf4\x78\x55\x67\x14\x70\xc1\x65\xaf\x64\x95\x56\x36\x60\x1d\x79\xc1\x53\xf8\x4e\x1d\x6b\x7b\x80\x86\x5b\xfa\x55\xe3\x56\xdb\x4f\x3a\x4f\x3c\x99\x72\x5d\xf3\x67\x7e\x80\x38\x60\x02\x98\x82\x90\x01\x5b\x8b\x8b\xbc\x8b\xf5\x64\x1c\x82\x58\x64\xde\x55\xfd\x82\xcf\x91\x65\x4f\xd7\x7d\x20\x90\x1f\x7c\x9f\x50\xf3\x58\x51\x6e\xaf\x5b\xbf\x8b\xc9", /* 5680 */ "\x00\x00\x80\x83\x91\x78\x84\x9c\x7b\x97\x86\x7d\x96\x8b\x96\x8f\x7e\xe5\x9a\xd3\x78\x8e\x5c\x81\x7a\x57\x90\x42\x96\xa7\x79\x5f\x5b\x59\x63\x5f\x7b\x0b\x84\xd1\x68\xad\x55\x06\x7f\x29\x74\x10\x7d\x22\x95\x01\x62\x40\x58\x4c\x4e\xd6\x5b\x83\x59\x79\x58\x54\x73\x6d\x63\x1e\x8e\x4b\x8e\x0f\x80\xce\x82\xd4\x62\xac\x53\xf0\x6c\xf0\x91\x5e\x59\x2a\x60\x01\x6c\x70\x57\x4d\x64\x4a\x8d\x2a\x76\x2b\x6e\xe9\x57\x5b\x6a\x80\x75\xf0\x6f\x6d\x8c\x2d\x8c\x08\x57\x66\x6b\xef\x88\x92\x78\xb3\x63\xa2\x53\xf9\x70\xad\x6c\x64\x58\x58\x64\x2a\x58\x02\x68\xe0\x81\x9b\x55\x10\x7c\xd6\x50\x18\x8e\xba\x6d\xcc\x8d\x9f\x70\xeb\x63\x8f\x6d\x9b\x6e\xd4\x7e\xe6\x84\x04\x68\x43\x90\x03\x6d\xd8\x96\x76\x8b\xa8\x59\x57\x72\x79\x85\xe4\x81\x7e\x75\xbc\x8a\x8a\x68\xaf\x52\x54\x8e\x22\x95\x11\x63\xd0\x98\x98\x8e\x44\x55\x7c\x4f\x53\x66\xff\x56\x8f\x60\xd5\x6d\x95\x52\x43\x5c\x49\x59\x29\x6d\xfb\x58\x6b\x75\x30\x75\x1c\x60\x6c\x82\x14\x81\x46\x63\x11\x67\x61\x8f\xe2\x77\x3a\x8d\xf3\x8d\x34\x94\xc1\x5e\x16\x53\x85\x54\x2c\x70\xc3\x00\x00\x00\x00", /* 5700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x40\x5e\xf7\x50\x5c\x4e\xad\x5e\xad\x63\x3a\x82\x47\x90\x1a\x68\x50\x91\x6e\x77\xb3\x54\x0c\x94\xdc\x5f\x64\x7a\xe5\x68\x76\x63\x45\x7b\x52\x7e\xdf\x75\xdb\x50\x77\x62\x95\x59\x34\x90\x0f\x51\xf8\x79\xc3\x7a\x81\x56\xfe\x5f\x92\x90\x14\x6d\x82\x5c\x60\x57\x1f\x54\x10\x51\x54\x6e\x4d\x56\xe2\x63\xa8\x98\x93\x81\x7f\x87\x15\x89\x2a\x90\x00\x54\x1e\x5c\x6f\x81\xc0\x62\xd6\x62\x58\x81\x31\x9e\x35\x96\x40\x9a\x6e\x9a\x7c\x69\x2d\x59\xa5\x62\xd3\x55\x3e\x63\x16\x54\xc7\x86\xd9\x6d\x3c\x5a\x03\x74\xe6", /* 5780 */ "\x00\x00\x88\x9c\x6b\x6a\x59\x16\x8c\x4c\x5f\x2f\x6e\x7e\x73\xa9\x98\x7d\x4e\x38\x70\xf7\x5b\x8c\x78\x97\x63\x3d\x66\x5a\x76\x96\x60\xcb\x5b\x9b\x5a\x49\x4e\x07\x81\x55\x6c\x6a\x73\x8b\x4e\xa1\x67\x89\x7f\x51\x5f\x80\x65\xfa\x67\x1b\x5f\xd8\x59\x84\x5a\x01\x5d\xcd\x5f\xae\x53\x71\x97\xe6\x8f\xdd\x68\x45\x56\xf4\x55\x2f\x60\xdf\x4e\x3a\x6f\x4d\x7e\xf4\x82\xc7\x84\x0e\x59\xd4\x4f\x1f\x4f\x2a\x5c\x3e\x7e\xac\x67\x2a\x85\x1a\x54\x73\x75\x4f\x80\xc3\x55\x82\x9b\x4f\x4f\x4d\x6e\x2d\x8c\x13\x5c\x09\x61\x70\x53\x6b\x76\x1f\x6e\x29\x86\x8a\x65\x87\x95\xfb\x7e\xb9\x54\x3b\x7a\x33\x7d\x0a\x95\xee\x55\xe1\x7f\xc1\x74\xee\x63\x1d\x87\x17\x6d\xa1\x7a\x9d\x62\x11\x65\xa1\x53\x67\x63\xe1\x6c\x83\x5d\xeb\x54\x5c\x94\xa8\x4e\x4c\x6c\x61\x8b\xec\x5c\x4b\x65\xe0\x82\x9c\x68\xa7\x54\x3e\x54\x34\x6b\xcb\x6b\x66\x4e\x94\x63\x42\x53\x48\x82\x1e\x4f\x0d\x4f\xae\x57\x5e\x62\x0a\x96\xfe\x66\x64\x72\x69\x52\xff\x52\xa1\x60\x9f\x8b\xef\x66\x14\x71\x99\x67\x90\x89\x7f\x78\x52\x77\xfd\x66\x70\x56\x3b\x54\x38\x95\x21\x72\x7a\x00\x00\x00\x00", /* 5800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x60\x6f\x5e\x0c\x60\x89\x81\x9d\x59\x15\x60\xdc\x71\x84\x70\xef\x6e\xaa\x6c\x50\x72\x80\x6a\x84\x88\xad\x5e\x2d\x4e\x60\x5a\xb3\x55\x9c\x94\xe3\x6d\x17\x7c\xfb\x96\x99\x62\x0f\x7e\xc6\x77\x8e\x86\x7e\x53\x23\x97\x1e\x8f\x96\x66\x87\x5c\xe1\x4f\xa0\x72\xed\x4e\x0b\x53\xa6\x59\x0f\x54\x13\x63\x80\x95\x28\x51\x48\x4e\xd9\x9c\x9c\x7e\xa4\x54\xb8\x8d\x24\x88\x54\x82\x37\x95\xf2\x6d\x8e\x5f\x26\x5a\xcc\x66\x3e\x96\x69\x73\xb0\x73\x2e\x53\xbf\x81\x7a\x99\x85\x7f\xa1\x5b\xaa\x96\x77\x96\x50\x7e\xbf", /* 5880 */ "\x00\x00\x76\xf8\x53\xa2\x95\x76\x99\x99\x7b\xb1\x89\x44\x6e\x58\x4e\x61\x7f\xd4\x79\x65\x8b\xe6\x60\xf3\x54\xcd\x4e\xab\x98\x79\x5d\xf7\x6a\x61\x50\xcf\x54\x11\x8c\x61\x84\x27\x78\x5d\x97\x04\x52\x4a\x54\xee\x56\xa3\x95\x00\x6d\x88\x5b\xb5\x6d\xc6\x66\x53\x5c\x0f\x5b\x5d\x68\x21\x80\x96\x55\x78\x7b\x11\x65\x48\x69\x54\x4e\x9b\x6b\x47\x87\x4e\x97\x8b\x53\x4f\x63\x1f\x64\x3a\x90\xaa\x65\x9c\x80\xc1\x8c\x10\x51\x99\x68\xb0\x53\x78\x87\xf9\x61\xc8\x6c\xc4\x6c\xfb\x8c\x22\x5c\x51\x85\xaa\x82\xaf\x95\x0c\x6b\x23\x8f\x9b\x65\xb0\x5f\xfb\x5f\xc3\x4f\xe1\x88\x45\x66\x1f\x81\x65\x73\x29\x60\xfa\x51\x74\x52\x11\x57\x8b\x5f\x62\x90\xa2\x88\x4c\x91\x92\x5e\x78\x67\x4f\x60\x27\x59\xd3\x51\x44\x51\xf6\x80\xf8\x53\x08\x6c\x79\x96\xc4\x71\x8a\x4f\x11\x4f\xee\x7f\x9e\x67\x3d\x55\xc5\x95\x08\x79\xc0\x88\x96\x7e\xe3\x58\x9f\x62\x0c\x97\x00\x86\x5a\x56\x18\x98\x7b\x5f\x90\x8b\xb8\x84\xc4\x91\x57\x53\xd9\x65\xed\x5e\x8f\x75\x5c\x60\x64\x7d\x6e\x5a\x7f\x7e\xea\x7e\xed\x8f\x69\x55\xa7\x5b\xa3\x60\xac\x65\xcb\x73\x84\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x09\x76\x63\x77\x29\x7e\xda\x97\x74\x85\x9b\x5b\x66\x7a\x74\x96\xea\x88\x40\x52\xcb\x71\x8f\x5f\xaa\x65\xec\x8b\xe2\x5b\xfb\x9a\x6f\x5d\xe1\x6b\x89\x6c\x5b\x8b\xad\x8b\xaf\x90\x0a\x8f\xc5\x53\x8b\x62\xbc\x9e\x26\x9e\x2d\x54\x40\x4e\x2b\x82\xbd\x72\x59\x86\x9c\x5d\x16\x88\x59\x6d\xaf\x96\xc5\x54\xd1\x4e\x9a\x8b\xb6\x71\x09\x54\xbd\x96\x09\x70\xdf\x6d\xf9\x76\xd0\x4e\x25\x78\x14\x87\x12\x5c\xa9\x5e\xf6\x8a\x00\x98\x9c\x96\x0e\x70\x8e\x6c\xbf\x59\x44\x63\xa9\x77\x3c\x88\x4d\x6f\x14\x82\x73\x58\x30", /* 5980 */ "\x00\x00\x71\xd5\x53\x8c\x78\x1a\x96\xc1\x55\x01\x5f\x66\x71\x30\x5b\xb4\x8c\x1a\x9a\x8c\x6b\x83\x59\x2e\x9e\x2f\x79\xe7\x67\x68\x62\x6c\x4f\x6f\x75\xa1\x7f\x8a\x6d\x0b\x96\x33\x6c\x27\x4e\xf0\x75\xd2\x51\x7b\x68\x37\x6f\x3e\x90\x80\x81\x70\x59\x96\x74\x76\x64\x47\x5c\x27\x90\x65\x7a\x91\x8c\x23\x59\xda\x54\xac\x82\x00\x83\x6f\x89\x81\x80\x00\x69\x30\x56\x4e\x80\x36\x72\x37\x91\xce\x51\xb6\x4e\x5f\x98\x75\x63\x96\x4e\x1a\x53\xf6\x66\xf3\x81\x4b\x59\x1c\x6d\xb2\x4e\x00\x58\xf9\x53\x3b\x63\xd6\x94\xf1\x4f\x9d\x4f\x0a\x88\x63\x98\x90\x59\x37\x90\x57\x79\xfb\x4e\xea\x80\xf0\x75\x91\x6c\x82\x5b\x9c\x59\xe8\x5f\x5d\x69\x05\x86\x81\x50\x1a\x5d\xf2\x4e\x59\x77\xe3\x4e\xe5\x82\x7a\x62\x91\x66\x13\x90\x91\x5c\x79\x4e\xbf\x5f\x79\x81\xc6\x90\x38\x80\x84\x75\xab\x4e\xa6\x88\xd4\x61\x0f\x6b\xc5\x5f\xc6\x4e\x49\x76\xca\x6e\xa2\x8b\xe3\x8b\xae\x8c\x0a\x8b\xd1\x5f\x02\x7f\xfc\x7f\xcc\x7e\xce\x83\x35\x83\x6b\x56\xe0\x6b\xb7\x97\xf3\x96\x34\x59\xfb\x54\x1f\x94\xf6\x6d\xeb\x5b\xc5\x99\x6e\x5c\x39\x5f\x15\x96\x90\x00\x00\x00\x00", /* 5a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x70\x82\xf1\x6a\x31\x5a\x74\x9e\x70\x5e\x94\x7f\x28\x83\xb9\x84\x24\x84\x25\x83\x67\x87\x47\x8f\xce\x8d\x62\x76\xc8\x5f\x71\x98\x96\x78\x6c\x66\x20\x54\xdf\x62\xe5\x4f\x63\x81\xc3\x75\xc8\x5e\xb8\x96\xcd\x8e\x0a\x86\xf9\x54\x8f\x6c\xf3\x6d\x8c\x6c\x38\x60\x7f\x52\xc7\x75\x28\x5e\x7d\x4f\x18\x60\xa0\x5f\xe7\x5c\x24\x75\x31\x90\xae\x94\xc0\x72\xb9\x6c\xb9\x6e\x38\x91\x49\x67\x09\x53\xcb\x53\xf3\x4f\x51\x91\xc9\x8b\xf1\x53\xc8\x5e\x7c\x8f\xc2\x6d\xe4\x4e\x8e\x76\xc2\x69\x86\x86\x5e\x61\x1a\x82\x06", /* 5a80 */ "\x00\x00\x4f\x59\x4f\xde\x90\x3e\x9c\x7c\x61\x09\x6e\x1d\x6e\x14\x96\x85\x4e\x88\x5a\x31\x96\xe8\x4e\x0e\x5c\x7f\x79\xb9\x5b\x87\x8b\xed\x7f\xbd\x73\x89\x57\xdf\x82\x8b\x90\xc1\x54\x01\x90\x47\x55\xbb\x5c\xea\x5f\xa1\x61\x08\x6b\x32\x72\xf1\x80\xb2\x8a\x89\x6d\x74\x5b\xd3\x88\xd5\x98\x84\x8c\x6b\x9a\x6d\x9e\x33\x6e\x0a\x51\xa4\x51\x43\x57\xa3\x88\x81\x53\x9f\x63\xf4\x8f\x95\x56\xed\x54\x58\x57\x06\x73\x3f\x6e\x90\x7f\x18\x8f\xdc\x82\xd1\x61\x3f\x60\x28\x96\x62\x66\xf0\x7e\xa6\x8d\x8a\x8d\xc3\x94\xa5\x5c\xb3\x7c\xa4\x67\x08\x60\xa6\x96\x05\x80\x18\x4e\x91\x90\xe7\x53\x00\x96\x68\x51\x41\x8f\xd0\x85\x74\x91\x5d\x66\x55\x97\xf5\x5b\x55\x53\x1d\x78\x38\x67\x42\x68\x3d\x54\xc9\x70\x7e\x5b\xb0\x8f\x7d\x51\x8d\x57\x28\x54\xb1\x65\x12\x66\x82\x8d\x5e\x8d\x43\x81\x0f\x84\x6c\x90\x6d\x7c\xdf\x51\xff\x85\xfb\x67\xa3\x65\xe9\x6f\xa1\x86\xa4\x8e\x81\x56\x6a\x90\x20\x76\x82\x70\x76\x71\xe5\x8d\x23\x62\xe9\x52\x19\x6c\xfd\x8d\x3c\x60\x0e\x58\x9e\x61\x8e\x66\xfe\x8d\x60\x62\x4e\x55\xb3\x6e\x23\x67\x2d\x8f\x67\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\xe1\x95\xf8\x77\x28\x68\x05\x69\xa8\x54\x8b\x4e\x4d\x70\xb8\x8b\xc8\x64\x58\x65\x8b\x5b\x85\x7a\x84\x50\x3a\x5b\xe8\x77\xbb\x6b\xe1\x8a\x79\x7c\x98\x6c\xbe\x76\xcf\x65\xa9\x8f\x97\x5d\x2d\x5c\x55\x86\x38\x68\x08\x53\x60\x62\x18\x7a\xd9\x6e\x5b\x7e\xfd\x6a\x1f\x7a\xe0\x5f\x70\x6f\x33\x5f\x20\x63\x8c\x6d\xa8\x67\x56\x4e\x08\x5e\x10\x8d\x26\x4e\xd7\x80\xc0\x76\x34\x96\x9c\x62\xdb\x66\x2d\x62\x7e\x6c\xbc\x8d\x75\x71\x67\x7f\x69\x51\x46\x80\x87\x53\xec\x90\x6e\x62\x98\x54\xf2\x86\xf0\x8f\x99\x80\x05", /* 5b80 */ "\x00\x00\x95\x17\x85\x17\x8f\xd9\x6d\x59\x73\xcd\x65\x9f\x77\x1f\x75\x04\x78\x27\x81\xfb\x8d\x1e\x94\x88\x4f\xa6\x67\x95\x75\xb9\x8b\xca\x97\x07\x63\x2f\x95\x47\x96\x35\x84\xb8\x63\x23\x77\x41\x5f\x81\x72\xf0\x4e\x89\x60\x14\x65\x74\x62\xef\x6b\x63\x65\x3f\x5e\x27\x75\xc7\x90\xd1\x8b\xc1\x82\x9d\x67\x9d\x65\x2f\x54\x31\x87\x18\x77\xe5\x80\xa2\x81\x02\x6c\x41\x4e\x4b\x7e\xc7\x80\x4c\x76\xf4\x69\x0d\x6b\x96\x62\x67\x50\x3c\x4f\x84\x57\x40\x63\x07\x6b\x62\x8d\xbe\x53\xea\x65\xe8\x7e\xb8\x5f\xd7\x63\x1a\x63\xb7\x81\xf3\x81\xf4\x7f\x6e\x5e\x1c\x5c\xd9\x52\x36\x66\x7a\x79\xe9\x7a\x1a\x8d\x28\x70\x99\x75\xd4\x6e\xde\x6c\xbb\x7a\x92\x4e\x2d\x76\xc5\x5f\xe0\x94\x9f\x88\x77\x7e\xc8\x79\xcd\x80\xbf\x91\xcd\x4e\xf2\x4f\x17\x82\x1f\x54\x68\x5d\xde\x6d\x32\x8b\xcc\x7c\xa5\x8f\x74\x80\x98\x5e\x1a\x54\x92\x76\xb1\x5b\x99\x66\x3c\x9a\xa4\x73\xe0\x68\x2a\x86\xdb\x67\x31\x73\x2a\x8b\xf8\x8b\xdb\x90\x10\x7a\xf9\x70\xdb\x71\x6e\x62\xc4\x77\xa9\x56\x31\x4e\x3b\x84\x57\x67\xf1\x52\xa9\x86\xc0\x8d\x2e\x94\xf8\x7b\x51\x00\x00\x00\x00", /* 5c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x4f\x6c\xe8\x79\x5d\x9a\x7b\x62\x93\x72\x2a\x62\xfd\x4e\x13\x78\x16\x8f\x6c\x64\xb0\x8d\x5a\x7b\xc6\x68\x69\x5e\x84\x88\xc5\x59\x86\x64\x9e\x58\xee\x72\xb6\x69\x0e\x95\x25\x8f\xfd\x8d\x58\x57\x60\x7f\x00\x8c\x06\x51\xc6\x63\x49\x62\xd9\x53\x53\x68\x4c\x74\x22\x83\x01\x91\x4c\x55\x44\x77\x40\x70\x7c\x6d\x4a\x51\x79\x54\xa8\x8d\x44\x59\xff\x6e\xcb\x6d\xc4\x5b\x5c\x7d\x2b\x4e\xd4\x7c\x7d\x6e\xd3\x5b\x50\x81\xea\x6e\x0d\x5b\x57\x9b\x03\x68\xd5\x8e\x2a\x5b\x97\x7e\xfc\x60\x3b\x7e\xb5\x90\xb9\x8d\x70", /* 5c80 */ "\x00\x00\x59\x4f\x63\xcd\x79\xdf\x8d\xb3\x53\x52\x65\xcf\x79\x56\x8b\xc5\x96\x3b\x7e\xc4\x94\xbb\x7e\x82\x56\x34\x91\x89\x67\x00\x7f\x6a\x5c\x0a\x90\x75\x66\x28\x5d\xe6\x4f\x50\x67\xde\x50\x5a\x4f\x5c\x57\x50\x5e\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x8d\x4e\x0c\x51\x40\x4e\x10\x5e\xff\x53\x45\x4e\x15\x4e\x98\x4e\x1e\x9b\x32\x5b\x6c\x56\x69\x4e\x28\x79\xba\x4e\x3f\x53\x15\x4e\x47\x59\x2d\x72\x3b\x53\x6e\x6c\x10\x56\xdf\x80\xe4\x99\x97\x6b\xd3\x77\x7e\x9f\x17\x4e\x36\x4e\x9f\x9f\x10\x4e\x5c\x4e\x69\x4e\x93\x82\x88\x5b\x5b\x55\x6c\x56\x0f\x4e\xc4\x53\x8d\x53\x9d\x53\xa3\x53\xa5\x53\xae\x97\x65\x8d\x5d\x53\x1a\x53\xf5\x53\x26\x53\x2e\x53\x3e\x8d\x5c\x53\x66\x53\x63\x52\x02\x52\x08\x52\x0e\x52\x2d\x52\x33\x52\x3f\x52\x40\x52\x4c\x52\x5e\x52\x61\x52\x5c\x84\xaf\x52\x7d\x52\x82\x52\x81\x52\x90\x52\x93\x51\x82\x7f\x54\x4e\xbb\x4e\xc3\x4e\xc9\x4e\xc2\x4e\xe8\x4e\xe1\x4e\xeb\x4e\xde\x4f\x1b\x4e\xf3\x4f\x22\x4f\x64\x4e\xf5\x4f\x25\x4f\x27\x4f\x09\x4f\x2b\x4f\x5e\x4f\x67\x65\x38\x4f\x5a\x4f\x5d\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x5f\x4f\x57\x4f\x32\x4f\x3d\x4f\x76\x4f\x74\x4f\x91\x4f\x89\x4f\x83\x4f\x8f\x4f\x7e\x4f\x7b\x4f\xaa\x4f\x7c\x4f\xac\x4f\x94\x4f\xe6\x4f\xe8\x4f\xea\x4f\xc5\x4f\xda\x4f\xe3\x4f\xdc\x4f\xd1\x4f\xdf\x4f\xf8\x50\x29\x50\x4c\x4f\xf3\x50\x2c\x50\x0f\x50\x2e\x50\x2d\x4f\xfe\x50\x1c\x50\x0c\x50\x25\x50\x28\x50\x7e\x50\x43\x50\x55\x50\x48\x50\x4e\x50\x6c\x50\x7b\x50\xa5\x50\xa7\x50\xa9\x50\xba\x50\xd6\x51\x06\x50\xed\x50\xec\x50\xe6\x50\xee\x51\x07\x51\x0b\x4e\xdd\x6c\x3d\x4f\x58\x4f\x65\x4f\xce\x9f\xa0", /* 5d80 */ "\x00\x00\x6c\x46\x7c\x74\x51\x6e\x5d\xfd\x9e\xc9\x99\x98\x51\x81\x59\x14\x52\xf9\x53\x0d\x8a\x07\x53\x10\x51\xeb\x59\x19\x51\x55\x4e\xa0\x51\x56\x4e\xb3\x88\x6e\x88\xa4\x4e\xb5\x81\x14\x88\xd2\x79\x80\x5b\x34\x88\x03\x7f\xb8\x51\xab\x51\xb1\x51\xbd\x51\xbc\x51\xc7\x51\x96\x51\xa2\x51\xa5\x8b\xa0\x8b\xa6\x8b\xa7\x8b\xaa\x8b\xb4\x8b\xb5\x8b\xb7\x8b\xc2\x8b\xc3\x8b\xcb\x8b\xcf\x8b\xce\x8b\xd2\x8b\xd3\x8b\xd4\x8b\xd6\x8b\xd8\x8b\xd9\x8b\xdc\x8b\xdf\x8b\xe0\x8b\xe4\x8b\xe8\x8b\xe9\x8b\xee\x8b\xf0\x8b\xf3\x8b\xf6\x8b\xf9\x8b\xfc\x8b\xff\x8c\x00\x8c\x02\x8c\x04\x8c\x07\x8c\x0c\x8c\x0f\x8c\x11\x8c\x12\x8c\x14\x8c\x15\x8c\x16\x8c\x19\x8c\x1b\x8c\x18\x8c\x1d\x8c\x1f\x8c\x20\x8c\x21\x8c\x25\x8c\x27\x8c\x2a\x8c\x2b\x8c\x2e\x8c\x2f\x8c\x32\x8c\x33\x8c\x35\x8c\x36\x53\x69\x53\x7a\x96\x1d\x96\x22\x96\x21\x96\x31\x96\x2a\x96\x3d\x96\x3c\x96\x42\x96\x49\x96\x54\x96\x5f\x96\x67\x96\x6c\x96\x72\x96\x74\x96\x88\x96\x8d\x96\x97\x96\xb0\x90\x97\x90\x9b\x90\x9d\x90\x99\x90\xac\x90\xa1\x90\xb4\x90\xb3\x90\xb6\x90\xba\x00\x00\x00\x00", /* 5e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xb8\x90\xb0\x90\xcf\x90\xc5\x90\xbe\x90\xd0\x90\xc4\x90\xc7\x90\xd3\x90\xe6\x90\xe2\x90\xdc\x90\xd7\x90\xdb\x90\xeb\x90\xef\x90\xfe\x91\x04\x91\x22\x91\x1e\x91\x23\x91\x31\x91\x2f\x91\x39\x91\x43\x91\x46\x52\x0d\x59\x42\x52\xa2\x52\xac\x52\xad\x52\xbe\x54\xff\x52\xd0\x52\xd6\x52\xf0\x53\xdf\x71\xee\x77\xcd\x5e\xf4\x51\xf5\x51\xfc\x9b\x2f\x53\xb6\x5f\x01\x75\x5a\x5d\xef\x57\x4c\x57\xa9\x57\xa1\x58\x7e\x58\xbc\x58\xc5\x58\xd1\x57\x29\x57\x2c\x57\x2a\x57\x33\x57\x39\x57\x2e\x57\x2f\x57\x5c\x57\x3b", /* 5e80 */ "\x00\x00\x57\x42\x57\x69\x57\x85\x57\x6b\x57\x86\x57\x7c\x57\x7b\x57\x68\x57\x6d\x57\x76\x57\x73\x57\xad\x57\xa4\x57\x8c\x57\xb2\x57\xcf\x57\xa7\x57\xb4\x57\x93\x57\xa0\x57\xd5\x57\xd8\x57\xda\x57\xd9\x57\xd2\x57\xb8\x57\xf4\x57\xef\x57\xf8\x57\xe4\x57\xdd\x58\x0b\x58\x0d\x57\xfd\x57\xed\x58\x00\x58\x1e\x58\x19\x58\x44\x58\x20\x58\x65\x58\x6c\x58\x81\x58\x89\x58\x9a\x58\x80\x99\xa8\x9f\x19\x61\xff\x82\x79\x82\x7d\x82\x7f\x82\x8f\x82\x8a\x82\xa8\x82\x84\x82\x8e\x82\x91\x82\x97\x82\x99\x82\xab\x82\xb8\x82\xbe\x82\xb0\x82\xc8\x82\xca\x82\xe3\x82\x98\x82\xb7\x82\xae\x82\xcb\x82\xcc\x82\xc1\x82\xa9\x82\xb4\x82\xa1\x82\xaa\x82\x9f\x82\xc4\x82\xce\x82\xa4\x82\xe1\x83\x09\x82\xf7\x82\xe4\x83\x0f\x83\x07\x82\xdc\x82\xf4\x82\xd2\x82\xd8\x83\x0c\x82\xfb\x82\xd3\x83\x11\x83\x1a\x83\x06\x83\x14\x83\x15\x82\xe0\x82\xd5\x83\x1c\x83\x51\x83\x5b\x83\x5c\x83\x08\x83\x92\x83\x3c\x83\x34\x83\x31\x83\x9b\x83\x5e\x83\x2f\x83\x4f\x83\x47\x83\x43\x83\x5f\x83\x40\x83\x17\x83\x60\x83\x2d\x83\x3a\x83\x33\x83\x66\x83\x65\x00\x00\x00\x00", /* 5f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x68\x83\x1b\x83\x69\x83\x6c\x83\x6a\x83\x6d\x83\x6e\x83\xb0\x83\x78\x83\xb3\x83\xb4\x83\xa0\x83\xaa\x83\x93\x83\x9c\x83\x85\x83\x7c\x83\xb6\x83\xa9\x83\x7d\x83\xb8\x83\x7b\x83\x98\x83\x9e\x83\xa8\x83\xba\x83\xbc\x83\xc1\x84\x01\x83\xe5\x83\xd8\x58\x07\x84\x18\x84\x0b\x83\xdd\x83\xfd\x83\xd6\x84\x1c\x84\x38\x84\x11\x84\x06\x83\xd4\x83\xdf\x84\x0f\x84\x03\x83\xf8\x83\xf9\x83\xea\x83\xc5\x83\xc0\x84\x26\x83\xf0\x83\xe1\x84\x5c\x84\x51\x84\x5a\x84\x59\x84\x73\x84\x87\x84\x88\x84\x7a\x84\x89\x84\x78", /* 5f80 */ "\x00\x00\x84\x3c\x84\x46\x84\x69\x84\x76\x84\x8c\x84\x8e\x84\x31\x84\x6d\x84\xc1\x84\xcd\x84\xd0\x84\xe6\x84\xbd\x84\xd3\x84\xca\x84\xbf\x84\xba\x84\xe0\x84\xa1\x84\xb9\x84\xb4\x84\x97\x84\xe5\x84\xe3\x85\x0c\x75\x0d\x85\x38\x84\xf0\x85\x39\x85\x1f\x85\x3a\x85\x56\x85\x3b\x84\xff\x84\xfc\x85\x59\x85\x48\x85\x68\x85\x64\x85\x5e\x85\x7a\x77\xa2\x85\x43\x85\x72\x85\x7b\x85\xa4\x85\xa8\x85\x87\x85\x8f\x85\x79\x85\xae\x85\x9c\x85\x85\x85\xb9\x85\xb7\x85\xb0\x85\xd3\x85\xc1\x85\xdc\x85\xff\x86\x27\x86\x05\x86\x29\x86\x16\x86\x3c\x5e\xfe\x5f\x08\x59\x3c\x59\x41\x80\x37\x59\x55\x59\x5a\x59\x58\x53\x0f\x5c\x22\x5c\x25\x5c\x2c\x5c\x34\x62\x4c\x62\x6a\x62\x9f\x62\xbb\x62\xca\x62\xda\x62\xd7\x62\xee\x63\x22\x62\xf6\x63\x39\x63\x4b\x63\x43\x63\xad\x63\xf6\x63\x71\x63\x7a\x63\x8e\x63\xb4\x63\x6d\x63\xac\x63\x8a\x63\x69\x63\xae\x63\xbc\x63\xf2\x63\xf8\x63\xe0\x63\xff\x63\xc4\x63\xde\x63\xce\x64\x52\x63\xc6\x63\xbe\x64\x45\x64\x41\x64\x0b\x64\x1b\x64\x20\x64\x0c\x64\x26\x64\x21\x64\x5e\x64\x84\x64\x6d\x64\x96\x00\x00\x00\x00", /* 6000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7a\x64\xb7\x64\xb8\x64\x99\x64\xba\x64\xc0\x64\xd0\x64\xd7\x64\xe4\x64\xe2\x65\x09\x65\x25\x65\x2e\x5f\x0b\x5f\xd2\x75\x19\x5f\x11\x53\x5f\x53\xf1\x53\xfd\x53\xe9\x53\xe8\x53\xfb\x54\x12\x54\x16\x54\x06\x54\x4b\x54\x52\x54\x53\x54\x54\x54\x56\x54\x43\x54\x21\x54\x57\x54\x59\x54\x23\x54\x32\x54\x82\x54\x94\x54\x77\x54\x71\x54\x64\x54\x9a\x54\x9b\x54\x84\x54\x76\x54\x66\x54\x9d\x54\xd0\x54\xad\x54\xc2\x54\xb4\x54\xd2\x54\xa7\x54\xa6\x54\xd3\x54\xd4\x54\x72\x54\xa3\x54\xd5\x54\xbb\x54\xbf\x54\xcc", /* 6080 */ "\x00\x00\x54\xd9\x54\xda\x54\xdc\x54\xa9\x54\xaa\x54\xa4\x54\xdd\x54\xcf\x54\xde\x55\x1b\x54\xe7\x55\x20\x54\xfd\x55\x14\x54\xf3\x55\x22\x55\x23\x55\x0f\x55\x11\x55\x27\x55\x2a\x55\x67\x55\x8f\x55\xb5\x55\x49\x55\x6d\x55\x41\x55\x55\x55\x3f\x55\x50\x55\x3c\x55\x37\x55\x56\x55\x75\x55\x76\x55\x77\x55\x33\x55\x30\x55\x5c\x55\x8b\x55\xd2\x55\x83\x55\xb1\x55\xb9\x55\x88\x55\x81\x55\x9f\x55\x7e\x55\xd6\x55\x91\x55\x7b\x55\xdf\x55\xbd\x55\xbe\x55\x94\x55\x99\x55\xea\x55\xf7\x55\xc9\x56\x1f\x55\xd1\x55\xeb\x55\xec\x55\xd4\x55\xe6\x55\xdd\x55\xc4\x55\xef\x55\xe5\x55\xf2\x55\xf3\x55\xcc\x55\xcd\x55\xe8\x55\xf5\x55\xe4\x8f\x94\x56\x1e\x56\x08\x56\x0c\x56\x01\x56\x24\x56\x23\x55\xfe\x56\x00\x56\x27\x56\x2d\x56\x58\x56\x39\x56\x57\x56\x2c\x56\x4d\x56\x62\x56\x59\x56\x5c\x56\x4c\x56\x54\x56\x86\x56\x64\x56\x71\x56\x6b\x56\x7b\x56\x7c\x56\x85\x56\x93\x56\xaf\x56\xd4\x56\xd7\x56\xdd\x56\xe1\x56\xf5\x56\xeb\x56\xf9\x56\xff\x57\x04\x57\x0a\x57\x09\x57\x1c\x5e\x0f\x5e\x19\x5e\x14\x5e\x11\x5e\x31\x5e\x3b\x5e\x3c\x00\x00\x00\x00", /* 6100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x37\x5e\x44\x5e\x54\x5e\x5b\x5e\x5e\x5e\x61\x5c\x8c\x5c\x7a\x5c\x8d\x5c\x90\x5c\x96\x5c\x88\x5c\x98\x5c\x99\x5c\x91\x5c\x9a\x5c\x9c\x5c\xb5\x5c\xa2\x5c\xbd\x5c\xac\x5c\xab\x5c\xb1\x5c\xa3\x5c\xc1\x5c\xb7\x5c\xc4\x5c\xd2\x5c\xe4\x5c\xcb\x5c\xe5\x5d\x02\x5d\x03\x5d\x27\x5d\x26\x5d\x2e\x5d\x24\x5d\x1e\x5d\x06\x5d\x1b\x5d\x58\x5d\x3e\x5d\x34\x5d\x3d\x5d\x6c\x5d\x5b\x5d\x6f\x5d\x5d\x5d\x6b\x5d\x4b\x5d\x4a\x5d\x69\x5d\x74\x5d\x82\x5d\x99\x5d\x9d\x8c\x73\x5d\xb7\x5d\xc5\x5f\x73\x5f\x77\x5f\x82\x5f\x87", /* 6180 */ "\x00\x00\x5f\x89\x5f\x8c\x5f\x95\x5f\x99\x5f\x9c\x5f\xa8\x5f\xad\x5f\xb5\x5f\xbc\x88\x62\x5f\x61\x72\xad\x72\xb0\x72\xb4\x72\xb7\x72\xb8\x72\xc3\x72\xc1\x72\xce\x72\xcd\x72\xd2\x72\xe8\x72\xef\x72\xe9\x72\xf2\x72\xf4\x72\xf7\x73\x01\x72\xf3\x73\x03\x72\xfa\x72\xfb\x73\x17\x73\x13\x73\x21\x73\x0a\x73\x1e\x73\x1d\x73\x15\x73\x22\x73\x39\x73\x25\x73\x2c\x73\x38\x73\x31\x73\x50\x73\x4d\x73\x57\x73\x60\x73\x6c\x73\x6f\x73\x7e\x82\x1b\x59\x25\x98\xe7\x59\x24\x59\x02\x99\x63\x99\x67\x99\x68\x99\x69\x99\x6a\x99\x6b\x99\x6c\x99\x74\x99\x77\x99\x7d\x99\x80\x99\x84\x99\x87\x99\x8a\x99\x8d\x99\x90\x99\x91\x99\x93\x99\x94\x99\x95\x5e\x80\x5e\x91\x5e\x8b\x5e\x96\x5e\xa5\x5e\xa0\x5e\xb9\x5e\xb5\x5e\xbe\x5e\xb3\x8d\x53\x5e\xd2\x5e\xd1\x5e\xdb\x5e\xe8\x5e\xea\x81\xba\x5f\xc4\x5f\xc9\x5f\xd6\x5f\xcf\x60\x03\x5f\xee\x60\x04\x5f\xe1\x5f\xe4\x5f\xfe\x60\x05\x60\x06\x5f\xea\x5f\xed\x5f\xf8\x60\x19\x60\x35\x60\x26\x60\x1b\x60\x0f\x60\x0d\x60\x29\x60\x2b\x60\x0a\x60\x3f\x60\x21\x60\x78\x60\x79\x60\x7b\x60\x7a\x60\x42\x00\x00\x00\x00", /* 6200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6a\x60\x7d\x60\x96\x60\x9a\x60\xad\x60\x9d\x60\x83\x60\x92\x60\x8c\x60\x9b\x60\xec\x60\xbb\x60\xb1\x60\xdd\x60\xd8\x60\xc6\x60\xda\x60\xb4\x61\x20\x61\x26\x61\x15\x61\x23\x60\xf4\x61\x00\x61\x0e\x61\x2b\x61\x4a\x61\x75\x61\xac\x61\x94\x61\xa7\x61\xb7\x61\xd4\x61\xf5\x5f\xdd\x96\xb3\x95\xe9\x95\xeb\x95\xf1\x95\xf3\x95\xf5\x95\xf6\x95\xfc\x95\xfe\x96\x03\x96\x04\x96\x06\x96\x08\x96\x0a\x96\x0b\x96\x0c\x96\x0d\x96\x0f\x96\x12\x96\x15\x96\x16\x96\x17\x96\x19\x96\x1a\x4e\x2c\x72\x3f\x62\x15\x6c\x35", /* 6280 */ "\x00\x00\x6c\x54\x6c\x5c\x6c\x4a\x6c\xa3\x6c\x85\x6c\x90\x6c\x94\x6c\x8c\x6c\x68\x6c\x69\x6c\x74\x6c\x76\x6c\x86\x6c\xa9\x6c\xd0\x6c\xd4\x6c\xad\x6c\xf7\x6c\xf8\x6c\xf1\x6c\xd7\x6c\xb2\x6c\xe0\x6c\xd6\x6c\xfa\x6c\xeb\x6c\xee\x6c\xb1\x6c\xd3\x6c\xef\x6c\xfe\x6d\x39\x6d\x27\x6d\x0c\x6d\x43\x6d\x48\x6d\x07\x6d\x04\x6d\x19\x6d\x0e\x6d\x2b\x6d\x4d\x6d\x2e\x6d\x35\x6d\x1a\x6d\x4f\x6d\x52\x6d\x54\x6d\x33\x6d\x91\x6d\x6f\x6d\x9e\x6d\xa0\x6d\x5e\x6d\x93\x6d\x94\x6d\x5c\x6d\x60\x6d\x7c\x6d\x63\x6e\x1a\x6d\xc7\x6d\xc5\x6d\xde\x6e\x0e\x6d\xbf\x6d\xe0\x6e\x11\x6d\xe6\x6d\xdd\x6d\xd9\x6e\x16\x6d\xab\x6e\x0c\x6d\xae\x6e\x2b\x6e\x6e\x6e\x4e\x6e\x6b\x6e\xb2\x6e\x5f\x6e\x86\x6e\x53\x6e\x54\x6e\x32\x6e\x25\x6e\x44\x6e\xdf\x6e\xb1\x6e\x98\x6e\xe0\x6f\x2d\x6e\xe2\x6e\xa5\x6e\xa7\x6e\xbd\x6e\xbb\x6e\xb7\x6e\xd7\x6e\xb4\x6e\xcf\x6e\x8f\x6e\xc2\x6e\x9f\x6f\x62\x6f\x46\x6f\x47\x6f\x24\x6f\x15\x6e\xf9\x6f\x2f\x6f\x36\x6f\x4b\x6f\x74\x6f\x2a\x6f\x09\x6f\x29\x6f\x89\x6f\x8d\x6f\x8c\x6f\x78\x6f\x72\x6f\x7c\x6f\x7a\x6f\xd1\x00\x00\x00\x00", /* 6300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xc9\x6f\xa7\x6f\xb9\x6f\xb6\x6f\xc2\x6f\xe1\x6f\xee\x6f\xde\x6f\xe0\x6f\xef\x70\x1a\x70\x23\x70\x1b\x70\x39\x70\x35\x70\x4f\x70\x5e\x5b\x80\x5b\x84\x5b\x95\x5b\x93\x5b\xa5\x5b\xb8\x75\x2f\x9a\x9e\x64\x34\x5b\xe4\x5b\xee\x89\x30\x5b\xf0\x8e\x47\x8b\x07\x8f\xb6\x8f\xd3\x8f\xd5\x8f\xe5\x8f\xee\x8f\xe4\x8f\xe9\x8f\xe6\x8f\xf3\x8f\xe8\x90\x05\x90\x04\x90\x0b\x90\x26\x90\x11\x90\x0d\x90\x16\x90\x21\x90\x35\x90\x36\x90\x2d\x90\x2f\x90\x44\x90\x51\x90\x52\x90\x50\x90\x68\x90\x58\x90\x62\x90\x5b\x66\xb9", /* 6380 */ "\x00\x00\x90\x74\x90\x7d\x90\x82\x90\x88\x90\x83\x90\x8b\x5f\x50\x5f\x57\x5f\x56\x5f\x58\x5c\x3b\x54\xab\x5c\x50\x5c\x59\x5b\x71\x5c\x63\x5c\x66\x7f\xbc\x5f\x2a\x5f\x29\x5f\x2d\x82\x74\x5f\x3c\x9b\x3b\x5c\x6e\x59\x81\x59\x83\x59\x8d\x59\xa9\x59\xaa\x59\xa3\x59\x97\x59\xca\x59\xab\x59\x9e\x59\xa4\x59\xd2\x59\xb2\x59\xaf\x59\xd7\x59\xbe\x5a\x05\x5a\x06\x59\xdd\x5a\x08\x59\xe3\x59\xd8\x59\xf9\x5a\x0c\x5a\x09\x5a\x32\x5a\x34\x5a\x11\x5a\x23\x5a\x13\x5a\x40\x5a\x67\x5a\x4a\x5a\x55\x5a\x3c\x5a\x62\x5a\x75\x80\xec\x5a\xaa\x5a\x9b\x5a\x77\x5a\x7a\x5a\xbe\x5a\xeb\x5a\xb2\x5a\xd2\x5a\xd4\x5a\xb8\x5a\xe0\x5a\xe3\x5a\xf1\x5a\xd6\x5a\xe6\x5a\xd8\x5a\xdc\x5b\x09\x5b\x17\x5b\x16\x5b\x32\x5b\x37\x5b\x40\x5c\x15\x5c\x1c\x5b\x5a\x5b\x65\x5b\x73\x5b\x51\x5b\x53\x5b\x62\x9a\x75\x9a\x77\x9a\x78\x9a\x7a\x9a\x7f\x9a\x7d\x9a\x80\x9a\x81\x9a\x85\x9a\x88\x9a\x8a\x9a\x90\x9a\x92\x9a\x93\x9a\x96\x9a\x98\x9a\x9b\x9a\x9c\x9a\x9d\x9a\x9f\x9a\xa0\x9a\xa2\x9a\xa3\x9a\xa5\x9a\xa7\x7e\x9f\x7e\xa1\x7e\xa3\x7e\xa5\x7e\xa8\x7e\xa9\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xad\x7e\xb0\x7e\xbe\x7e\xc0\x7e\xc1\x7e\xc2\x7e\xc9\x7e\xcb\x7e\xcc\x7e\xd0\x7e\xd4\x7e\xd7\x7e\xdb\x7e\xe0\x7e\xe1\x7e\xe8\x7e\xeb\x7e\xee\x7e\xef\x7e\xf1\x7e\xf2\x7f\x0d\x7e\xf6\x7e\xfa\x7e\xfb\x7e\xfe\x7f\x01\x7f\x02\x7f\x03\x7f\x07\x7f\x08\x7f\x0b\x7f\x0c\x7f\x0f\x7f\x11\x7f\x12\x7f\x17\x7f\x19\x7f\x1c\x7f\x1b\x7f\x1f\x7f\x21\x7f\x22\x7f\x23\x7f\x24\x7f\x25\x7f\x26\x7f\x27\x7f\x2a\x7f\x2b\x7f\x2c\x7f\x2d\x7f\x2f\x7f\x30\x7f\x31\x7f\x32\x7f\x33\x7f\x35\x5e\x7a\x75\x7f\x5d\xdb\x75\x3e\x90\x95", /* 6480 */ "\x00\x00\x73\x8e\x73\x91\x73\xae\x73\xa2\x73\x9f\x73\xcf\x73\xc2\x73\xd1\x73\xb7\x73\xb3\x73\xc0\x73\xc9\x73\xc8\x73\xe5\x73\xd9\x98\x7c\x74\x0a\x73\xe9\x73\xe7\x73\xde\x73\xba\x73\xf2\x74\x0f\x74\x2a\x74\x5b\x74\x26\x74\x25\x74\x28\x74\x30\x74\x2e\x74\x2c\x74\x1b\x74\x1a\x74\x41\x74\x5c\x74\x57\x74\x55\x74\x59\x74\x77\x74\x6d\x74\x7e\x74\x9c\x74\x8e\x74\x80\x74\x81\x74\x87\x74\x8b\x74\x9e\x74\xa8\x74\xa9\x74\x90\x74\xa7\x74\xd2\x74\xba\x97\xea\x97\xeb\x97\xec\x67\x4c\x67\x53\x67\x5e\x67\x48\x67\x69\x67\xa5\x67\x87\x67\x6a\x67\x73\x67\x98\x67\xa7\x67\x75\x67\xa8\x67\x9e\x67\xad\x67\x8b\x67\x77\x67\x7c\x67\xf0\x68\x09\x67\xd8\x68\x0a\x67\xe9\x67\xb0\x68\x0c\x67\xd9\x67\xb5\x67\xda\x67\xb3\x67\xdd\x68\x00\x67\xc3\x67\xb8\x67\xe2\x68\x0e\x67\xc1\x67\xfd\x68\x32\x68\x33\x68\x60\x68\x61\x68\x4e\x68\x62\x68\x44\x68\x64\x68\x83\x68\x1d\x68\x55\x68\x66\x68\x41\x68\x67\x68\x40\x68\x3e\x68\x4a\x68\x49\x68\x29\x68\xb5\x68\x8f\x68\x74\x68\x77\x68\x93\x68\x6b\x68\xc2\x69\x6e\x68\xfc\x69\x1f\x69\x20\x68\xf9\x00\x00\x00\x00", /* 6500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x24\x68\xf0\x69\x0b\x69\x01\x69\x57\x68\xe3\x69\x10\x69\x71\x69\x39\x69\x60\x69\x42\x69\x5d\x69\x84\x69\x6b\x69\x80\x69\x98\x69\x78\x69\x34\x69\xcc\x69\x87\x69\x88\x69\xce\x69\x89\x69\x66\x69\x63\x69\x79\x69\x9b\x69\xa7\x69\xbb\x69\xab\x69\xad\x69\xd4\x69\xb1\x69\xc1\x69\xca\x69\xdf\x69\x95\x69\xe0\x69\x8d\x69\xff\x6a\x2f\x69\xed\x6a\x17\x6a\x18\x6a\x65\x69\xf2\x6a\x44\x6a\x3e\x6a\xa0\x6a\x50\x6a\x5b\x6a\x35\x6a\x8e\x6a\x79\x6a\x3d\x6a\x28\x6a\x58\x6a\x7c\x6a\x91\x6a\x90\x6a\xa9\x6a\x97\x6a\xab", /* 6580 */ "\x00\x00\x73\x37\x73\x52\x6b\x81\x6b\x82\x6b\x87\x6b\x84\x6b\x92\x6b\x93\x6b\x8d\x6b\x9a\x6b\x9b\x6b\xa1\x6b\xaa\x8f\x6b\x8f\x6d\x8f\x71\x8f\x72\x8f\x73\x8f\x75\x8f\x76\x8f\x78\x8f\x77\x8f\x79\x8f\x7a\x8f\x7c\x8f\x7e\x8f\x81\x8f\x82\x8f\x84\x8f\x87\x8f\x8b\x8f\x8d\x8f\x8e\x8f\x8f\x8f\x98\x8f\x9a\x8e\xce\x62\x0b\x62\x17\x62\x1b\x62\x1f\x62\x22\x62\x21\x62\x25\x62\x24\x62\x2c\x81\xe7\x74\xef\x74\xf4\x74\xff\x75\x0f\x75\x11\x75\x13\x65\x34\x65\xee\x65\xef\x65\xf0\x66\x0a\x66\x19\x67\x72\x66\x03\x66\x15\x66\x00\x70\x85\x66\xf7\x66\x1d\x66\x34\x66\x31\x66\x36\x66\x35\x80\x06\x66\x5f\x66\x54\x66\x41\x66\x4f\x66\x56\x66\x61\x66\x57\x66\x77\x66\x84\x66\x8c\x66\xa7\x66\x9d\x66\xbe\x66\xdb\x66\xdc\x66\xe6\x66\xe9\x8d\x32\x8d\x33\x8d\x36\x8d\x3b\x8d\x3d\x8d\x40\x8d\x45\x8d\x46\x8d\x48\x8d\x49\x8d\x47\x8d\x4d\x8d\x55\x8d\x59\x89\xc7\x89\xca\x89\xcb\x89\xcc\x89\xce\x89\xcf\x89\xd0\x89\xd1\x72\x6e\x72\x9f\x72\x5d\x72\x66\x72\x6f\x72\x7e\x72\x7f\x72\x84\x72\x8b\x72\x8d\x72\x8f\x72\x92\x63\x08\x63\x32\x63\xb0\x00\x00\x00\x00", /* 6600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x3f\x64\xd8\x80\x04\x6b\xea\x6b\xf3\x6b\xfd\x6b\xf5\x6b\xf9\x6c\x05\x6c\x07\x6c\x06\x6c\x0d\x6c\x15\x6c\x18\x6c\x19\x6c\x1a\x6c\x21\x6c\x29\x6c\x24\x6c\x2a\x6c\x32\x65\x35\x65\x55\x65\x6b\x72\x4d\x72\x52\x72\x56\x72\x30\x86\x62\x52\x16\x80\x9f\x80\x9c\x80\x93\x80\xbc\x67\x0a\x80\xbd\x80\xb1\x80\xab\x80\xad\x80\xb4\x80\xb7\x80\xe7\x80\xe8\x80\xe9\x80\xea\x80\xdb\x80\xc2\x80\xc4\x80\xd9\x80\xcd\x80\xd7\x67\x10\x80\xdd\x80\xeb\x80\xf1\x80\xf4\x80\xed\x81\x0d\x81\x0e\x80\xf2\x80\xfc\x67\x15\x81\x12", /* 6680 */ "\x00\x00\x8c\x5a\x81\x36\x81\x1e\x81\x2c\x81\x18\x81\x32\x81\x48\x81\x4c\x81\x53\x81\x74\x81\x59\x81\x5a\x81\x71\x81\x60\x81\x69\x81\x7c\x81\x7d\x81\x6d\x81\x67\x58\x4d\x5a\xb5\x81\x88\x81\x82\x81\x91\x6e\xd5\x81\xa3\x81\xaa\x81\xcc\x67\x26\x81\xca\x81\xbb\x81\xc1\x81\xa6\x6b\x24\x6b\x37\x6b\x39\x6b\x43\x6b\x46\x6b\x59\x98\xd1\x98\xd2\x98\xd3\x98\xd5\x98\xd9\x98\xda\x6b\xb3\x5f\x40\x6b\xc2\x89\xf3\x65\x90\x9f\x51\x65\x93\x65\xbc\x65\xc6\x65\xc4\x65\xc3\x65\xcc\x65\xce\x65\xd2\x65\xd6\x70\x80\x70\x9c\x70\x96\x70\x9d\x70\xbb\x70\xc0\x70\xb7\x70\xab\x70\xb1\x70\xe8\x70\xca\x71\x10\x71\x13\x71\x16\x71\x2f\x71\x31\x71\x73\x71\x5c\x71\x68\x71\x45\x71\x72\x71\x4a\x71\x78\x71\x7a\x71\x98\x71\xb3\x71\xb5\x71\xa8\x71\xa0\x71\xe0\x71\xd4\x71\xe7\x71\xf9\x72\x1d\x72\x28\x70\x6c\x71\x18\x71\x66\x71\xb9\x62\x3e\x62\x3d\x62\x43\x62\x48\x62\x49\x79\x3b\x79\x40\x79\x46\x79\x49\x79\x5b\x79\x5c\x79\x53\x79\x5a\x79\x62\x79\x57\x79\x60\x79\x6f\x79\x67\x79\x7a\x79\x85\x79\x8a\x79\x9a\x79\xa7\x79\xb3\x5f\xd1\x5f\xd0\x00\x00\x00\x00", /* 6700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x3c\x60\x5d\x60\x5a\x60\x67\x60\x41\x60\x59\x60\x63\x60\xab\x61\x06\x61\x0d\x61\x5d\x61\xa9\x61\x9d\x61\xcb\x61\xd1\x62\x06\x80\x80\x80\x7f\x6c\x93\x6c\xf6\x6d\xfc\x77\xf6\x77\xf8\x78\x00\x78\x09\x78\x17\x78\x18\x78\x11\x65\xab\x78\x2d\x78\x1c\x78\x1d\x78\x39\x78\x3a\x78\x3b\x78\x1f\x78\x3c\x78\x25\x78\x2c\x78\x23\x78\x29\x78\x4e\x78\x6d\x78\x56\x78\x57\x78\x26\x78\x50\x78\x47\x78\x4c\x78\x6a\x78\x9b\x78\x93\x78\x9a\x78\x87\x78\x9c\x78\xa1\x78\xa3\x78\xb2\x78\xb9\x78\xa5\x78\xd4\x78\xd9\x78\xc9", /* 6780 */ "\x00\x00\x78\xec\x78\xf2\x79\x05\x78\xf4\x79\x13\x79\x24\x79\x1e\x79\x34\x9f\x9b\x9e\xf9\x9e\xfb\x9e\xfc\x76\xf1\x77\x04\x77\x0d\x76\xf9\x77\x07\x77\x08\x77\x1a\x77\x22\x77\x19\x77\x2d\x77\x26\x77\x35\x77\x38\x77\x50\x77\x51\x77\x47\x77\x43\x77\x5a\x77\x68\x77\x62\x77\x65\x77\x7f\x77\x8d\x77\x7d\x77\x80\x77\x8c\x77\x91\x77\x9f\x77\xa0\x77\xb0\x77\xb5\x77\xbd\x75\x3a\x75\x40\x75\x4e\x75\x4b\x75\x48\x75\x5b\x75\x72\x75\x79\x75\x83\x7f\x58\x7f\x61\x7f\x5f\x8a\x48\x7f\x68\x7f\x74\x7f\x71\x7f\x79\x7f\x81\x7f\x7e\x76\xcd\x76\xe5\x88\x32\x94\x85\x94\x86\x94\x87\x94\x8b\x94\x8a\x94\x8c\x94\x8d\x94\x8f\x94\x90\x94\x94\x94\x97\x94\x95\x94\x9a\x94\x9b\x94\x9c\x94\xa3\x94\xa4\x94\xab\x94\xaa\x94\xad\x94\xac\x94\xaf\x94\xb0\x94\xb2\x94\xb4\x94\xb6\x94\xb7\x94\xb8\x94\xb9\x94\xba\x94\xbc\x94\xbd\x94\xbf\x94\xc4\x94\xc8\x94\xc9\x94\xca\x94\xcb\x94\xcc\x94\xcd\x94\xce\x94\xd0\x94\xd1\x94\xd2\x94\xd5\x94\xd6\x94\xd7\x94\xd9\x94\xd8\x94\xdb\x94\xde\x94\xdf\x94\xe0\x94\xe2\x94\xe4\x94\xe5\x94\xe7\x94\xe8\x94\xea\x00\x00\x00\x00", /* 6800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\xe9\x94\xeb\x94\xee\x94\xef\x94\xf3\x94\xf4\x94\xf5\x94\xf7\x94\xf9\x94\xfc\x94\xfd\x94\xff\x95\x03\x95\x02\x95\x06\x95\x07\x95\x09\x95\x0a\x95\x0d\x95\x0e\x95\x0f\x95\x12\x95\x13\x95\x14\x95\x15\x95\x16\x95\x18\x95\x1b\x95\x1d\x95\x1e\x95\x1f\x95\x22\x95\x2a\x95\x2b\x95\x29\x95\x2c\x95\x31\x95\x32\x95\x34\x95\x36\x95\x37\x95\x38\x95\x3c\x95\x3e\x95\x3f\x95\x42\x95\x35\x95\x44\x95\x45\x95\x46\x95\x49\x95\x4c\x95\x4e\x95\x4f\x95\x52\x95\x53\x95\x54\x95\x56\x95\x57\x95\x58\x95\x59\x95\x5b\x95\x5e", /* 6880 */ "\x00\x00\x95\x5f\x95\x5d\x95\x61\x95\x62\x95\x64\x95\x65\x95\x66\x95\x67\x95\x68\x95\x69\x95\x6a\x95\x6b\x95\x6c\x95\x6f\x95\x71\x95\x72\x95\x73\x95\x3a\x77\xe7\x77\xec\x96\xc9\x79\xd5\x79\xed\x79\xe3\x79\xeb\x7a\x06\x5d\x47\x7a\x03\x7a\x02\x7a\x1e\x7a\x14\x7a\x39\x7a\x37\x7a\x51\x9e\xcf\x99\xa5\x7a\x70\x76\x88\x76\x8e\x76\x93\x76\x99\x76\xa4\x74\xde\x74\xe0\x75\x2c\x9e\x20\x9e\x22\x9e\x28\x9e\x29\x9e\x2a\x9e\x2b\x9e\x2c\x9e\x32\x9e\x31\x9e\x36\x9e\x38\x9e\x37\x9e\x39\x9e\x3a\x9e\x3e\x9e\x41\x9e\x42\x9e\x44\x9e\x46\x9e\x47\x9e\x48\x9e\x49\x9e\x4b\x9e\x4c\x9e\x4e\x9e\x51\x9e\x55\x9e\x57\x9e\x5a\x9e\x5b\x9e\x5c\x9e\x5e\x9e\x63\x9e\x66\x9e\x67\x9e\x68\x9e\x69\x9e\x6a\x9e\x6b\x9e\x6c\x9e\x71\x9e\x6d\x9e\x73\x75\x92\x75\x94\x75\x96\x75\xa0\x75\x9d\x75\xac\x75\xa3\x75\xb3\x75\xb4\x75\xb8\x75\xc4\x75\xb1\x75\xb0\x75\xc3\x75\xc2\x75\xd6\x75\xcd\x75\xe3\x75\xe8\x75\xe6\x75\xe4\x75\xeb\x75\xe7\x76\x03\x75\xf1\x75\xfc\x75\xff\x76\x10\x76\x00\x76\x05\x76\x0c\x76\x17\x76\x0a\x76\x25\x76\x18\x76\x15\x76\x19\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x1b\x76\x3c\x76\x22\x76\x20\x76\x40\x76\x2d\x76\x30\x76\x3f\x76\x35\x76\x43\x76\x3e\x76\x33\x76\x4d\x76\x5e\x76\x54\x76\x5c\x76\x56\x76\x6b\x76\x6f\x7f\xca\x7a\xe6\x7a\x78\x7a\x79\x7a\x80\x7a\x86\x7a\x88\x7a\x95\x7a\xa6\x7a\xa0\x7a\xac\x7a\xa8\x7a\xad\x7a\xb3\x88\x64\x88\x69\x88\x72\x88\x7d\x88\x7f\x88\x82\x88\xa2\x88\xc6\x88\xb7\x88\xbc\x88\xc9\x88\xe2\x88\xce\x88\xe3\x88\xe5\x88\xf1\x89\x1a\x88\xfc\x88\xe8\x88\xfe\x88\xf0\x89\x21\x89\x19\x89\x13\x89\x1b\x89\x0a\x89\x34\x89\x2b\x89\x36\x89\x41", /* 6980 */ "\x00\x00\x89\x66\x89\x7b\x75\x8b\x80\xe5\x76\xb2\x76\xb4\x77\xdc\x80\x12\x80\x14\x80\x16\x80\x1c\x80\x20\x80\x22\x80\x25\x80\x26\x80\x27\x80\x29\x80\x28\x80\x31\x80\x0b\x80\x35\x80\x43\x80\x46\x80\x4d\x80\x52\x80\x69\x80\x71\x89\x83\x98\x78\x98\x80\x98\x83\x98\x89\x98\x8c\x98\x8d\x98\x8f\x98\x94\x98\x9a\x98\x9b\x98\x9e\x98\x9f\x98\xa1\x98\xa2\x98\xa5\x98\xa6\x86\x4d\x86\x54\x86\x6c\x86\x6e\x86\x7f\x86\x7a\x86\x7c\x86\x7b\x86\xa8\x86\x8d\x86\x8b\x86\xac\x86\x9d\x86\xa7\x86\xa3\x86\xaa\x86\x93\x86\xa9\x86\xb6\x86\xc4\x86\xb5\x86\xce\x86\xb0\x86\xba\x86\xb1\x86\xaf\x86\xc9\x86\xcf\x86\xb4\x86\xe9\x86\xf1\x86\xf2\x86\xed\x86\xf3\x86\xd0\x87\x13\x86\xde\x86\xf4\x86\xdf\x86\xd8\x86\xd1\x87\x03\x87\x07\x86\xf8\x87\x08\x87\x0a\x87\x0d\x87\x09\x87\x23\x87\x3b\x87\x1e\x87\x25\x87\x2e\x87\x1a\x87\x3e\x87\x48\x87\x34\x87\x31\x87\x29\x87\x37\x87\x3f\x87\x82\x87\x22\x87\x7d\x87\x7e\x87\x7b\x87\x60\x87\x70\x87\x4c\x87\x6e\x87\x8b\x87\x53\x87\x63\x87\x7c\x87\x64\x87\x59\x87\x65\x87\x93\x87\xaf\x87\xa8\x87\xd2\x00\x00\x00\x00", /* 6a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\xc6\x87\x88\x87\x85\x87\xad\x87\x97\x87\x83\x87\xab\x87\xe5\x87\xac\x87\xb5\x87\xb3\x87\xcb\x87\xd3\x87\xbd\x87\xd1\x87\xc0\x87\xca\x87\xdb\x87\xea\x87\xe0\x87\xee\x88\x16\x88\x13\x87\xfe\x88\x0a\x88\x1b\x88\x21\x88\x39\x88\x3c\x7f\x36\x7f\x42\x7f\x44\x7f\x45\x82\x10\x7a\xfa\x7a\xfd\x7b\x08\x7b\x03\x7b\x04\x7b\x15\x7b\x0a\x7b\x2b\x7b\x0f\x7b\x47\x7b\x38\x7b\x2a\x7b\x19\x7b\x2e\x7b\x31\x7b\x20\x7b\x25\x7b\x24\x7b\x33\x7b\x3e\x7b\x1e\x7b\x58\x7b\x5a\x7b\x45\x7b\x75\x7b\x4c\x7b\x5d\x7b\x60\x7b\x6e", /* 6a80 */ "\x00\x00\x7b\x7b\x7b\x62\x7b\x72\x7b\x71\x7b\x90\x7b\xa6\x7b\xa7\x7b\xb8\x7b\xac\x7b\x9d\x7b\xa8\x7b\x85\x7b\xaa\x7b\x9c\x7b\xa2\x7b\xab\x7b\xb4\x7b\xd1\x7b\xc1\x7b\xcc\x7b\xdd\x7b\xda\x7b\xe5\x7b\xe6\x7b\xea\x7c\x0c\x7b\xfe\x7b\xfc\x7c\x0f\x7c\x16\x7c\x0b\x7c\x1f\x7c\x2a\x7c\x26\x7c\x38\x7c\x41\x7c\x40\x81\xfe\x82\x01\x82\x02\x82\x04\x81\xec\x88\x44\x82\x21\x82\x22\x82\x23\x82\x2d\x82\x2f\x82\x28\x82\x2b\x82\x38\x82\x3b\x82\x33\x82\x34\x82\x3e\x82\x44\x82\x49\x82\x4b\x82\x4f\x82\x5a\x82\x5f\x82\x68\x88\x7e\x88\x85\x88\x88\x88\xd8\x88\xdf\x89\x5e\x7f\x9d\x7f\x9f\x7f\xa7\x7f\xaf\x7f\xb0\x7f\xb2\x7c\x7c\x65\x49\x7c\x91\x7c\x9d\x7c\x9c\x7c\x9e\x7c\xa2\x7c\xb2\x7c\xbc\x7c\xbd\x7c\xc1\x7c\xc7\x7c\xcc\x7c\xcd\x7c\xc8\x7c\xc5\x7c\xd7\x7c\xe8\x82\x6e\x66\xa8\x7f\xbf\x7f\xce\x7f\xd5\x7f\xe5\x7f\xe1\x7f\xe6\x7f\xe9\x7f\xee\x7f\xf3\x7c\xf8\x7d\x77\x7d\xa6\x7d\xae\x7e\x47\x7e\x9b\x9e\xb8\x9e\xb4\x8d\x73\x8d\x84\x8d\x94\x8d\x91\x8d\xb1\x8d\x67\x8d\x6d\x8c\x47\x8c\x49\x91\x4a\x91\x50\x91\x4e\x91\x4f\x91\x64\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x62\x91\x61\x91\x70\x91\x69\x91\x6f\x91\x7d\x91\x7e\x91\x72\x91\x74\x91\x79\x91\x8c\x91\x85\x91\x90\x91\x8d\x91\x91\x91\xa2\x91\xa3\x91\xaa\x91\xad\x91\xae\x91\xaf\x91\xb5\x91\xb4\x91\xba\x8c\x55\x9e\x7e\x8d\xb8\x8d\xeb\x8e\x05\x8e\x59\x8e\x69\x8d\xb5\x8d\xbf\x8d\xbc\x8d\xba\x8d\xc4\x8d\xd6\x8d\xd7\x8d\xda\x8d\xde\x8d\xce\x8d\xcf\x8d\xdb\x8d\xc6\x8d\xec\x8d\xf7\x8d\xf8\x8d\xe3\x8d\xf9\x8d\xfb\x8d\xe4\x8e\x09\x8d\xfd\x8e\x14\x8e\x1d\x8e\x1f\x8e\x2c\x8e\x2e\x8e\x23\x8e\x2f\x8e\x3a\x8e\x40\x8e\x39", /* 6b80 */ "\x00\x00\x8e\x35\x8e\x3d\x8e\x31\x8e\x49\x8e\x41\x8e\x42\x8e\x51\x8e\x52\x8e\x4a\x8e\x70\x8e\x76\x8e\x7c\x8e\x6f\x8e\x74\x8e\x85\x8e\x8f\x8e\x94\x8e\x90\x8e\x9c\x8e\x9e\x8c\x78\x8c\x82\x8c\x8a\x8c\x85\x8c\x98\x8c\x94\x65\x9b\x89\xd6\x89\xde\x89\xda\x89\xdc\x89\xe5\x89\xeb\x89\xef\x8a\x3e\x8b\x26\x97\x53\x96\xe9\x96\xf3\x96\xef\x97\x06\x97\x01\x97\x08\x97\x0f\x97\x0e\x97\x2a\x97\x2d\x97\x30\x97\x3e\x9f\x80\x9f\x83\x9f\x85\x9f\x86\x9f\x87\x9f\x88\x9f\x89\x9f\x8a\x9f\x8c\x9e\xfe\x9f\x0b\x9f\x0d\x96\xb9\x96\xbc\x96\xbd\x96\xce\x96\xd2\x77\xbf\x96\xe0\x92\x8e\x92\xae\x92\xc8\x93\x3e\x93\x6a\x93\xca\x93\x8f\x94\x3e\x94\x6b\x9c\x7f\x9c\x82\x9c\x85\x9c\x86\x9c\x87\x9c\x88\x7a\x23\x9c\x8b\x9c\x8e\x9c\x90\x9c\x91\x9c\x92\x9c\x94\x9c\x95\x9c\x9a\x9c\x9b\x9c\x9e\x9c\x9f\x9c\xa0\x9c\xa1\x9c\xa2\x9c\xa3\x9c\xa5\x9c\xa6\x9c\xa7\x9c\xa8\x9c\xa9\x9c\xab\x9c\xad\x9c\xae\x9c\xb0\x9c\xb1\x9c\xb2\x9c\xb3\x9c\xb4\x9c\xb5\x9c\xb6\x9c\xb7\x9c\xba\x9c\xbb\x9c\xbc\x9c\xbd\x9c\xc4\x9c\xc5\x9c\xc6\x9c\xc7\x9c\xca\x9c\xcb\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xcc\x9c\xcd\x9c\xce\x9c\xcf\x9c\xd0\x9c\xd3\x9c\xd4\x9c\xd5\x9c\xd7\x9c\xd8\x9c\xd9\x9c\xdc\x9c\xdd\x9c\xdf\x9c\xe2\x97\x7c\x97\x85\x97\x91\x97\x92\x97\x94\x97\xaf\x97\xab\x97\xa3\x97\xb2\x97\xb4\x9a\xb1\x9a\xb0\x9a\xb7\x9e\x58\x9a\xb6\x9a\xba\x9a\xbc\x9a\xc1\x9a\xc0\x9a\xc5\x9a\xc2\x9a\xcb\x9a\xcc\x9a\xd1\x9b\x45\x9b\x43\x9b\x47\x9b\x49\x9b\x48\x9b\x4d\x9b\x51\x98\xe8\x99\x0d\x99\x2e\x99\x55\x99\x54\x9a\xdf\x9a\xe1\x9a\xe6\x9a\xef\x9a\xeb\x9a\xfb\x9a\xed\x9a\xf9\x9b\x08\x9b\x0f\x9b\x13\x9b\x1f", /* 6c80 */ "\x00\x00\x9b\x23\x9e\xbd\x9e\xbe\x7e\x3b\x9e\x82\x9e\x87\x9e\x88\x9e\x8b\x9e\x92\x93\xd6\x9e\x9d\x9e\x9f\x9e\xdb\x9e\xdc\x9e\xdd\x9e\xe0\x9e\xdf\x9e\xe2\x9e\xe9\x9e\xe7\x9e\xe5\x9e\xea\x9e\xef\x9f\x22\x9f\x2c\x9f\x2f\x9f\x39\x9f\x37\x9f\x3d\x9f\x3e\x9f\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d00 */ NULL, /* 6d80 */ NULL, /* 6e00 */ NULL, /* 6e80 */ NULL, /* 6f00 */ NULL, /* 6f80 */ NULL, /* 7000 */ NULL, /* 7080 */ NULL, /* 7100 */ NULL, /* 7180 */ NULL, /* 7200 */ NULL, /* 7280 */ NULL, /* 7300 */ NULL, /* 7380 */ NULL, /* 7400 */ NULL, /* 7480 */ NULL, /* 7500 */ NULL, /* 7580 */ NULL, /* 7600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xe0\x02\xe0\x03\xe0\x04\xe0\x05\xe0\x06\xe0\x07\xe0\x08\xe0\x09\xe0\x0a\xe0\x0b\xe0\x0c\xe0\x0d\xe0\x0e\xe0\x0f\xe0\x10\xe0\x11\xe0\x12\xe0\x13\xe0\x14\xe0\x15\xe0\x16\xe0\x17\xe0\x18\xe0\x19\xe0\x1a\xe0\x1b\xe0\x1c\xe0\x1d\xe0\x1e\xe0\x1f\xe0\x20\xe0\x21\xe0\x22\xe0\x23\xe0\x24\xe0\x25\xe0\x26\xe0\x27\xe0\x28\xe0\x29\xe0\x2a\xe0\x2b\xe0\x2c\xe0\x2d\xe0\x2e\xe0\x2f\xe0\x30\xe0\x31\xe0\x32\xe0\x33\xe0\x34\xe0\x35\xe0\x36\xe0\x37\xe0\x38\xe0\x39\xe0\x3a\xe0\x3b\xe0\x3c\xe0\x3d\xe0\x3e", /* 7680 */ "\x00\x00\xe0\x3f\xe0\x40\xe0\x41\xe0\x42\xe0\x43\xe0\x44\xe0\x45\xe0\x46\xe0\x47\xe0\x48\xe0\x49\xe0\x4a\xe0\x4b\xe0\x4c\xe0\x4d\xe0\x4e\xe0\x4f\xe0\x50\xe0\x51\xe0\x52\xe0\x53\xe0\x54\xe0\x55\xe0\x56\xe0\x57\xe0\x58\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xe0\x5d\xe0\x5e\xe0\x5f\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xe0\x64\xe0\x65\xe0\x66\xe0\x67\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x7f\xe0\x80\xe0\x81\xe0\x82\xe0\x83\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xe0\x8f\xe0\x90\xe0\x91\xe0\x92\xe0\x93\xe0\x94\xe0\x95\xe0\x96\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xe0\xa0\xe0\xa1\xe0\xa2\xe0\xa3\xe0\xa4\xe0\xa5\xe0\xa6\xe0\xa7\xe0\xa8\xe0\xa9\xe0\xaa\xe0\xab\xe0\xac\xe0\xad\xe0\xae\xe0\xaf\xe0\xb0\xe0\xb1\xe0\xb2\xe0\xb3\xe0\xb4\xe0\xb5\xe0\xb6\xe0\xb7\xe0\xb8\xe0\xb9\xe0\xba\xe0\xbb\x00\x00\x00\x00", /* 7700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbc\xe0\xbd\xe0\xbe\xe0\xbf\xe0\xc0\xe0\xc1\xe0\xc2\xe0\xc3\xe0\xc4\xe0\xc5\xe0\xc6\xe0\xc7\xe0\xc8\xe0\xc9\xe0\xca\xe0\xcb\xe0\xcc\xe0\xcd\xe0\xce\xe0\xcf\xe0\xd0\xe0\xd1\xe0\xd2\xe0\xd3\xe0\xd4\xe0\xd5\xe0\xd6\xe0\xd7\xe0\xd8\xe0\xd9\xe0\xda\xe0\xdb\xe0\xdc\xe0\xdd\xe0\xde\xe0\xdf\xe0\xe0\xe0\xe1\xe0\xe2\xe0\xe3\xe0\xe4\xe0\xe5\xe0\xe6\xe0\xe7\xe0\xe8\xe0\xe9\xe0\xea\xe0\xeb\xe0\xec\xe0\xed\xe0\xee\xe0\xef\xe0\xf0\xe0\xf1\xe0\xf2\xe0\xf3\xe0\xf4\xe0\xf5\xe0\xf6\xe0\xf7\xe0\xf8\xe0\xf9\xe0\xfa", /* 7780 */ "\x00\x00\xe0\xfb\xe0\xfc\xe0\xfd\xe0\xfe\xe0\xff\xe1\x00\xe1\x01\xe1\x02\xe1\x03\xe1\x04\xe1\x05\xe1\x06\xe1\x07\xe1\x08\xe1\x09\xe1\x0a\xe1\x0b\xe1\x0c\xe1\x0d\xe1\x0e\xe1\x0f\xe1\x10\xe1\x11\xe1\x12\xe1\x13\xe1\x14\xe1\x15\xe1\x16\xe1\x17\xe1\x18\xe1\x19\xe1\x1a\xe1\x1b\xe1\x1c\xe1\x1d\xe1\x1e\xe1\x1f\xe1\x20\xe1\x21\xe1\x22\xe1\x23\xe1\x24\xe1\x25\xe1\x26\xe1\x27\xe1\x28\xe1\x29\xe1\x2a\xe1\x2b\xe1\x2c\xe1\x2d\xe1\x2e\xe1\x2f\xe1\x30\xe1\x31\xe1\x32\xe1\x33\xe1\x34\xe1\x35\xe1\x36\xe1\x37\xe1\x38\xe1\x39\xe1\x3a\xe1\x3b\xe1\x3c\xe1\x3d\xe1\x3e\xe1\x3f\xe1\x40\xe1\x41\xe1\x42\xe1\x43\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xe1\x48\xe1\x49\xe1\x4a\xe1\x4b\xe1\x4c\xe1\x4d\xe1\x4e\xe1\x4f\xe1\x50\xe1\x51\xe1\x52\xe1\x53\xe1\x54\xe1\x55\xe1\x56\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xe1\x5c\xe1\x5d\xe1\x5e\xe1\x5f\xe1\x60\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xe1\x74\xe1\x75\xe1\x76\xe1\x77\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x78\xe1\x79\xe1\x7a\xe1\x7b\xe1\x7c\xe1\x7d\xe1\x7e\xe1\x7f\xe1\x80\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xe1\x8b\xe1\x8c\xe1\x8d\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe1\xa1\xe1\xa2\xe1\xa3\xe1\xa4\xe1\xa5\xe1\xa6\xe1\xa7\xe1\xa8\xe1\xa9\xe1\xaa\xe1\xab\xe1\xac\xe1\xad\xe1\xae\xe1\xaf\xe1\xb0\xe1\xb1\xe1\xb2\xe1\xb3\xe1\xb4\xe1\xb5\xe1\xb6", /* 7880 */ "\x00\x00\xe1\xb7\xe1\xb8\xe1\xb9\xe1\xba\xe1\xbb\xe1\xbc\xe1\xbd\xe1\xbe\xe1\xbf\xe1\xc0\xe1\xc1\xe1\xc2\xe1\xc3\xe1\xc4\xe1\xc5\xe1\xc6\xe1\xc7\xe1\xc8\xe1\xc9\xe1\xca\xe1\xcb\xe1\xcc\xe1\xcd\xe1\xce\xe1\xcf\xe1\xd0\xe1\xd1\xe1\xd2\xe1\xd3\xe1\xd4\xe1\xd5\xe1\xd6\xe1\xd7\xe1\xd8\xe1\xd9\xe1\xda\xe1\xdb\xe1\xdc\xe1\xdd\xe1\xde\xe1\xdf\xe1\xe0\xe1\xe1\xe1\xe2\xe1\xe3\xe1\xe4\xe1\xe5\xe1\xe6\xe1\xe7\xe1\xe8\xe1\xe9\xe1\xea\xe1\xeb\xe1\xec\xe1\xed\xe1\xee\xe1\xef\xe1\xf0\xe1\xf1\xe1\xf2\xe1\xf3\xe1\xf4\xe1\xf5\xe1\xf6\xe1\xf7\xe1\xf8\xe1\xf9\xe1\xfa\xe1\xfb\xe1\xfc\xe1\xfd\xe1\xfe\xe1\xff\xe2\x00\xe2\x01\xe2\x02\xe2\x03\xe2\x04\xe2\x05\xe2\x06\xe2\x07\xe2\x08\xe2\x09\xe2\x0a\xe2\x0b\xe2\x0c\xe2\x0d\xe2\x0e\xe2\x0f\xe2\x10\xe2\x11\xe2\x12\xe2\x13\xe2\x14\xe2\x15\xe2\x16\xe2\x17\xe2\x18\xe2\x19\xe2\x1a\xe2\x1b\xe2\x1c\xe2\x1d\xe2\x1e\xe2\x1f\xe2\x20\xe2\x21\xe2\x22\xe2\x23\xe2\x24\xe2\x25\xe2\x26\xe2\x27\xe2\x28\xe2\x29\xe2\x2a\xe2\x2b\xe2\x2c\xe2\x2d\xe2\x2e\xe2\x2f\xe2\x30\xe2\x31\xe2\x32\xe2\x33\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x34\xe2\x35\xe2\x36\xe2\x37\xe2\x38\xe2\x39\xe2\x3a\xe2\x3b\xe2\x3c\xe2\x3d\xe2\x3e\xe2\x3f\xe2\x40\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72", /* 7980 */ "\x00\x00\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x7f\xe2\x80\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe2\xa1\xe2\xa2\xe2\xa3\xe2\xa4\xe2\xa5\xe2\xa6\xe2\xa7\xe2\xa8\xe2\xa9\xe2\xaa\xe2\xab\xe2\xac\xe2\xad\xe2\xae\xe2\xaf\xe2\xb0\xe2\xb1\xe2\xb2\xe2\xb3\xe2\xb4\xe2\xb5\xe2\xb6\xe2\xb7\xe2\xb8\xe2\xb9\xe2\xba\xe2\xbb\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1\xe2\xc2\xe2\xc3\xe2\xc4\xe2\xc5\xe2\xc6\xe2\xc7\xe2\xc8\xe2\xc9\xe2\xca\xe2\xcb\xe2\xcc\xe2\xcd\xe2\xce\xe2\xcf\xe2\xd0\xe2\xd1\xe2\xd2\xe2\xd3\xe2\xd4\xe2\xd5\xe2\xd6\xe2\xd7\xe2\xd8\xe2\xd9\xe2\xda\xe2\xdb\xe2\xdc\xe2\xdd\xe2\xde\xe2\xdf\xe2\xe0\xe2\xe1\xe2\xe2\xe2\xe3\xe2\xe4\xe2\xe5\xe2\xe6\xe2\xe7\xe2\xe8\xe2\xe9\xe2\xea\xe2\xeb\xe2\xec\xe2\xed\xe2\xee\xe2\xef\x00\x00\x00\x00", /* 7a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xf0\xe2\xf1\xe2\xf2\xe2\xf3\xe2\xf4\xe2\xf5\xe2\xf6\xe2\xf7\xe2\xf8\xe2\xf9\xe2\xfa\xe2\xfb\xe2\xfc\xe2\xfd\xe2\xfe\xe2\xff\xe3\x00\xe3\x01\xe3\x02\xe3\x03\xe3\x04\xe3\x05\xe3\x06\xe3\x07\xe3\x08\xe3\x09\xe3\x0a\xe3\x0b\xe3\x0c\xe3\x0d\xe3\x0e\xe3\x0f\xe3\x10\xe3\x11\xe3\x12\xe3\x13\xe3\x14\xe3\x15\xe3\x16\xe3\x17\xe3\x18\xe3\x19\xe3\x1a\xe3\x1b\xe3\x1c\xe3\x1d\xe3\x1e\xe3\x1f\xe3\x20\xe3\x21\xe3\x22\xe3\x23\xe3\x24\xe3\x25\xe3\x26\xe3\x27\xe3\x28\xe3\x29\xe3\x2a\xe3\x2b\xe3\x2c\xe3\x2d\xe3\x2e", /* 7a80 */ "\x00\x00\xe3\x2f\xe3\x30\xe3\x31\xe3\x32\xe3\x33\xe3\x34\xe3\x35\xe3\x36\xe3\x37\xe3\x38\xe3\x39\xe3\x3a\xe3\x3b\xe3\x3c\xe3\x3d\xe3\x3e\xe3\x3f\xe3\x40\xe3\x41\xe3\x42\xe3\x43\xe3\x44\xe3\x45\xe3\x46\xe3\x47\xe3\x48\xe3\x49\xe3\x4a\xe3\x4b\xe3\x4c\xe3\x4d\xe3\x4e\xe3\x4f\xe3\x50\xe3\x51\xe3\x52\xe3\x53\xe3\x54\xe3\x55\xe3\x56\xe3\x57\xe3\x58\xe3\x59\xe3\x5a\xe3\x5b\xe3\x5c\xe3\x5d\xe3\x5e\xe3\x5f\xe3\x60\xe3\x61\xe3\x62\xe3\x63\xe3\x64\xe3\x65\xe3\x66\xe3\x67\xe3\x68\xe3\x69\xe3\x6a\xe3\x6b\xe3\x6c\xe3\x6d\xe3\x6e\xe3\x6f\xe3\x70\xe3\x71\xe3\x72\xe3\x73\xe3\x74\xe3\x75\xe3\x76\xe3\x77\xe3\x78\xe3\x79\xe3\x7a\xe3\x7b\xe3\x7c\xe3\x7d\xe3\x7e\xe3\x7f\xe3\x80\xe3\x81\xe3\x82\xe3\x83\xe3\x84\xe3\x85\xe3\x86\xe3\x87\xe3\x88\xe3\x89\xe3\x8a\xe3\x8b\xe3\x8c\xe3\x8d\xe3\x8e\xe3\x8f\xe3\x90\xe3\x91\xe3\x92\xe3\x93\xe3\x94\xe3\x95\xe3\x96\xe3\x97\xe3\x98\xe3\x99\xe3\x9a\xe3\x9b\xe3\x9c\xe3\x9d\xe3\x9e\xe3\x9f\xe3\xa0\xe3\xa1\xe3\xa2\xe3\xa3\xe3\xa4\xe3\xa5\xe3\xa6\xe3\xa7\xe3\xa8\xe3\xa9\xe3\xaa\xe3\xab\x00\x00\x00\x00", /* 7b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xac\xe3\xad\xe3\xae\xe3\xaf\xe3\xb0\xe3\xb1\xe3\xb2\xe3\xb3\xe3\xb4\xe3\xb5\xe3\xb6\xe3\xb7\xe3\xb8\xe3\xb9\xe3\xba\xe3\xbb\xe3\xbc\xe3\xbd\xe3\xbe\xe3\xbf\xe3\xc0\xe3\xc1\xe3\xc2\xe3\xc3\xe3\xc4\xe3\xc5\xe3\xc6\xe3\xc7\xe3\xc8\xe3\xc9\xe3\xca\xe3\xcb\xe3\xcc\xe3\xcd\xe3\xce\xe3\xcf\xe3\xd0\xe3\xd1\xe3\xd2\xe3\xd3\xe3\xd4\xe3\xd5\xe3\xd6\xe3\xd7\xe3\xd8\xe3\xd9\xe3\xda\xe3\xdb\xe3\xdc\xe3\xdd\xe3\xde\xe3\xdf\xe3\xe0\xe3\xe1\xe3\xe2\xe3\xe3\xe3\xe4\xe3\xe5\xe3\xe6\xe3\xe7\xe3\xe8\xe3\xe9\xe3\xea", /* 7b80 */ "\x00\x00\xe3\xeb\xe3\xec\xe3\xed\xe3\xee\xe3\xef\xe3\xf0\xe3\xf1\xe3\xf2\xe3\xf3\xe3\xf4\xe3\xf5\xe3\xf6\xe3\xf7\xe3\xf8\xe3\xf9\xe3\xfa\xe3\xfb\xe3\xfc\xe3\xfd\xe3\xfe\xe3\xff\xe4\x00\xe4\x01\xe4\x02\xe4\x03\xe4\x04\xe4\x05\xe4\x06\xe4\x07\xe4\x08\xe4\x09\xe4\x0a\xe4\x0b\xe4\x0c\xe4\x0d\xe4\x0e\xe4\x0f\xe4\x10\xe4\x11\xe4\x12\xe4\x13\xe4\x14\xe4\x15\xe4\x16\xe4\x17\xe4\x18\xe4\x19\xe4\x1a\xe4\x1b\xe4\x1c\xe4\x1d\xe4\x1e\xe4\x1f\xe4\x20\xe4\x21\xe4\x22\xe4\x23\xe4\x24\xe4\x25\xe4\x26\xe4\x27\xe4\x28\xe4\x29\xe4\x2a\xe4\x2b\xe4\x2c\xe4\x2d\xe4\x2e\xe4\x2f\xe4\x30\xe4\x31\xe4\x32\xe4\x33\xe4\x34\xe4\x35\xe4\x36\xe4\x37\xe4\x38\xe4\x39\xe4\x3a\xe4\x3b\xe4\x3c\xe4\x3d\xe4\x3e\xe4\x3f\xe4\x40\xe4\x41\xe4\x42\xe4\x43\xe4\x44\xe4\x45\xe4\x46\xe4\x47\xe4\x48\xe4\x49\xe4\x4a\xe4\x4b\xe4\x4c\xe4\x4d\xe4\x4e\xe4\x4f\xe4\x50\xe4\x51\xe4\x52\xe4\x53\xe4\x54\xe4\x55\xe4\x56\xe4\x57\xe4\x58\xe4\x59\xe4\x5a\xe4\x5b\xe4\x5c\xe4\x5d\xe4\x5e\xe4\x5f\xe4\x60\xe4\x61\xe4\x62\xe4\x63\xe4\x64\xe4\x65\xe4\x66\xe4\x67\x00\x00\x00\x00", /* 7c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x68\xe4\x69\xe4\x6a\xe4\x6b\xe4\x6c\xe4\x6d\xe4\x6e\xe4\x6f\xe4\x70\xe4\x71\xe4\x72\xe4\x73\xe4\x74\xe4\x75\xe4\x76\xe4\x77\xe4\x78\xe4\x79\xe4\x7a\xe4\x7b\xe4\x7c\xe4\x7d\xe4\x7e\xe4\x7f\xe4\x80\xe4\x81\xe4\x82\xe4\x83\xe4\x84\xe4\x85\xe4\x86\xe4\x87\xe4\x88\xe4\x89\xe4\x8a\xe4\x8b\xe4\x8c\xe4\x8d\xe4\x8e\xe4\x8f\xe4\x90\xe4\x91\xe4\x92\xe4\x93\xe4\x94\xe4\x95\xe4\x96\xe4\x97\xe4\x98\xe4\x99\xe4\x9a\xe4\x9b\xe4\x9c\xe4\x9d\xe4\x9e\xe4\x9f\xe4\xa0\xe4\xa1\xe4\xa2\xe4\xa3\xe4\xa4\xe4\xa5\xe4\xa6", /* 7c80 */ "\x00\x00\xe4\xa7\xe4\xa8\xe4\xa9\xe4\xaa\xe4\xab\xe4\xac\xe4\xad\xe4\xae\xe4\xaf\xe4\xb0\xe4\xb1\xe4\xb2\xe4\xb3\xe4\xb4\xe4\xb5\xe4\xb6\xe4\xb7\xe4\xb8\xe4\xb9\xe4\xba\xe4\xbb\xe4\xbc\xe4\xbd\xe4\xbe\xe4\xbf\xe4\xc0\xe4\xc1\xe4\xc2\xe4\xc3\xe4\xc4\xe4\xc5\xe4\xc6\xe4\xc7\xe4\xc8\xe4\xc9\xe4\xca\xe4\xcb\xe4\xcc\xe4\xcd\xe4\xce\xe4\xcf\xe4\xd0\xe4\xd1\xe4\xd2\xe4\xd3\xe4\xd4\xe4\xd5\xe4\xd6\xe4\xd7\xe4\xd8\xe4\xd9\xe4\xda\xe4\xdb\xe4\xdc\xe4\xdd\xe4\xde\xe4\xdf\xe4\xe0\xe4\xe1\xe4\xe2\xe4\xe3\xe4\xe4\xe4\xe5\xe4\xe6\xe4\xe7\xe4\xe8\xe4\xe9\xe4\xea\xe4\xeb\xe4\xec\xe4\xed\xe4\xee\xe4\xef\xe4\xf0\xe4\xf1\xe4\xf2\xe4\xf3\xe4\xf4\xe4\xf5\xe4\xf6\xe4\xf7\xe4\xf8\xe4\xf9\xe4\xfa\xe4\xfb\xe4\xfc\xe4\xfd\xe4\xfe\xe4\xff\xe5\x00\xe5\x01\xe5\x02\xe5\x03\xe5\x04\xe5\x05\xe5\x06\xe5\x07\xe5\x08\xe5\x09\xe5\x0a\xe5\x0b\xe5\x0c\xe5\x0d\xe5\x0e\xe5\x0f\xe5\x10\xe5\x11\xe5\x12\xe5\x13\xe5\x14\xe5\x15\xe5\x16\xe5\x17\xe5\x18\xe5\x19\xe5\x1a\xe5\x1b\xe5\x1c\xe5\x1d\xe5\x1e\xe5\x1f\xe5\x20\xe5\x21\xe5\x22\xe5\x23\x00\x00\x00\x00", /* 7d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x24\xe5\x25\xe5\x26\xe5\x27\xe5\x28\xe5\x29\xe5\x2a\xe5\x2b\xe5\x2c\xe5\x2d\xe5\x2e\xe5\x2f\xe5\x30\xe5\x31\xe5\x32\xe5\x33\xe5\x34\xe5\x35\xe5\x36\xe5\x37\xe5\x38\xe5\x39\xe5\x3a\xe5\x3b\xe5\x3c\xe5\x3d\xe5\x3e\xe5\x3f\xe5\x40\xe5\x41\xe5\x42\xe5\x43\xe5\x44\xe5\x45\xe5\x46\xe5\x47\xe5\x48\xe5\x49\xe5\x4a\xe5\x4b\xe5\x4c\xe5\x4d\xe5\x4e\xe5\x4f\xe5\x50\xe5\x51\xe5\x52\xe5\x53\xe5\x54\xe5\x55\xe5\x56\xe5\x57\xe5\x58\xe5\x59\xe5\x5a\xe5\x5b\xe5\x5c\xe5\x5d\xe5\x5e\xe5\x5f\xe5\x60\xe5\x61\xe5\x62", /* 7d80 */ "\x00\x00\xe5\x63\xe5\x64\xe5\x65\xe5\x66\xe5\x67\xe5\x68\xe5\x69\xe5\x6a\xe5\x6b\xe5\x6c\xe5\x6d\xe5\x6e\xe5\x6f\xe5\x70\xe5\x71\xe5\x72\xe5\x73\xe5\x74\xe5\x75\xe5\x76\xe5\x77\xe5\x78\xe5\x79\xe5\x7a\xe5\x7b\xe5\x7c\xe5\x7d\xe5\x7e\xe5\x7f\xe5\x80\xe5\x81\xe5\x82\xe5\x83\xe5\x84\xe5\x85\xe5\x86\xe5\x87\xe5\x88\xe5\x89\xe5\x8a\xe5\x8b\xe5\x8c\xe5\x8d\xe5\x8e\xe5\x8f\xe5\x90\xe5\x91\xe5\x92\xe5\x93\xe5\x94\xe5\x95\xe5\x96\xe5\x97\xe5\x98\xe5\x99\xe5\x9a\xe5\x9b\xe5\x9c\xe5\x9d\xe5\x9e\xe5\x9f\xe5\xa0\xe5\xa1\xe5\xa2\xe5\xa3\xe5\xa4\xe5\xa5\xe5\xa6\xe5\xa7\xe5\xa8\xe5\xa9\xe5\xaa\xe5\xab\xe5\xac\xe5\xad\xe5\xae\xe5\xaf\xe5\xb0\xe5\xb1\xe5\xb2\xe5\xb3\xe5\xb4\xe5\xb5\xe5\xb6\xe5\xb7\xe5\xb8\xe5\xb9\xe5\xba\xe5\xbb\xe5\xbc\xe5\xbd\xe5\xbe\xe5\xbf\xe5\xc0\xe5\xc1\xe5\xc2\xe5\xc3\xe5\xc4\xe5\xc5\xe5\xc6\xe5\xc7\xe5\xc8\xe5\xc9\xe5\xca\xe5\xcb\xe5\xcc\xe5\xcd\xe5\xce\xe5\xcf\xe5\xd0\xe5\xd1\xe5\xd2\xe5\xd3\xe5\xd4\xe5\xd5\xe5\xd6\xe5\xd7\xe5\xd8\xe5\xd9\xe5\xda\xe5\xdb\xe5\xdc\xe5\xdd\xe5\xde\xe5\xdf\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xe0\xe5\xe1\xe5\xe2\xe5\xe3\xe5\xe4\xe5\xe5\xe5\xe6\xe5\xe7\xe5\xe8\xe5\xe9\xe5\xea\xe5\xeb\xe5\xec\xe5\xed\xe5\xee\xe5\xef\xe5\xf0\xe5\xf1\xe5\xf2\xe5\xf3\xe5\xf4\xe5\xf5\xe5\xf6\xe5\xf7\xe5\xf8\xe5\xf9\xe5\xfa\xe5\xfb\xe5\xfc\xe5\xfd\xe5\xfe\xe5\xff\xe6\x00\xe6\x01\xe6\x02\xe6\x03\xe6\x04\xe6\x05\xe6\x06\xe6\x07\xe6\x08\xe6\x09\xe6\x0a\xe6\x0b\xe6\x0c\xe6\x0d\xe6\x0e\xe6\x0f\xe6\x10\xe6\x11\xe6\x12\xe6\x13\xe6\x14\xe6\x15\xe6\x16\xe6\x17\xe6\x18\xe6\x19\xe6\x1a\xe6\x1b\xe6\x1c\xe6\x1d\xe6\x1e", /* 7e80 */ "\x00\x00\xe6\x1f\xe6\x20\xe6\x21\xe6\x22\xe6\x23\xe6\x24\xe6\x25\xe6\x26\xe6\x27\xe6\x28\xe6\x29\xe6\x2a\xe6\x2b\xe6\x2c\xe6\x2d\xe6\x2e\xe6\x2f\xe6\x30\xe6\x31\xe6\x32\xe6\x33\xe6\x34\xe6\x35\xe6\x36\xe6\x37\xe6\x38\xe6\x39\xe6\x3a\xe6\x3b\xe6\x3c\xe6\x3d\xe6\x3e\xe6\x3f\xe6\x40\xe6\x41\xe6\x42\xe6\x43\xe6\x44\xe6\x45\xe6\x46\xe6\x47\xe6\x48\xe6\x49\xe6\x4a\xe6\x4b\xe6\x4c\xe6\x4d\xe6\x4e\xe6\x4f\xe6\x50\xe6\x51\xe6\x52\xe6\x53\xe6\x54\xe6\x55\xe6\x56\xe6\x57\xe6\x58\xe6\x59\xe6\x5a\xe6\x5b\xe6\x5c\xe6\x5d\xe6\x5e\xe6\x5f\xe6\x60\xe6\x61\xe6\x62\xe6\x63\xe6\x64\xe6\x65\xe6\x66\xe6\x67\xe6\x68\xe6\x69\xe6\x6a\xe6\x6b\xe6\x6c\xe6\x6d\xe6\x6e\xe6\x6f\xe6\x70\xe6\x71\xe6\x72\xe6\x73\xe6\x74\xe6\x75\xe6\x76\xe6\x77\xe6\x78\xe6\x79\xe6\x7a\xe6\x7b\xe6\x7c\xe6\x7d\xe6\x7e\xe6\x7f\xe6\x80\xe6\x81\xe6\x82\xe6\x83\xe6\x84\xe6\x85\xe6\x86\xe6\x87\xe6\x88\xe6\x89\xe6\x8a\xe6\x8b\xe6\x8c\xe6\x8d\xe6\x8e\xe6\x8f\xe6\x90\xe6\x91\xe6\x92\xe6\x93\xe6\x94\xe6\x95\xe6\x96\xe6\x97\xe6\x98\xe6\x99\xe6\x9a\xe6\x9b\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x9c\xe6\x9d\xe6\x9e\xe6\x9f\xe6\xa0\xe6\xa1\xe6\xa2\xe6\xa3\xe6\xa4\xe6\xa5\xe6\xa6\xe6\xa7\xe6\xa8\xe6\xa9\xe6\xaa\xe6\xab\xe6\xac\xe6\xad\xe6\xae\xe6\xaf\xe6\xb0\xe6\xb1\xe6\xb2\xe6\xb3\xe6\xb4\xe6\xb5\xe6\xb6\xe6\xb7\xe6\xb8\xe6\xb9\xe6\xba\xe6\xbb\xe6\xbc\xe6\xbd\xe6\xbe\xe6\xbf\xe6\xc0\xe6\xc1\xe6\xc2\xe6\xc3\xe6\xc4\xe6\xc5\xe6\xc6\xe6\xc7\xe6\xc8\xe6\xc9\xe6\xca\xe6\xcb\xe6\xcc\xe6\xcd\xe6\xce\xe6\xcf\xe6\xd0\xe6\xd1\xe6\xd2\xe6\xd3\xe6\xd4\xe6\xd5\xe6\xd6\xe6\xd7\xe6\xd8\xe6\xd9\xe6\xda", /* 7f80 */ "\x00\x00\xe6\xdb\xe6\xdc\xe6\xdd\xe6\xde\xe6\xdf\xe6\xe0\xe6\xe1\xe6\xe2\xe6\xe3\xe6\xe4\xe6\xe5\xe6\xe6\xe6\xe7\xe6\xe8\xe6\xe9\xe6\xea\xe6\xeb\xe6\xec\xe6\xed\xe6\xee\xe6\xef\xe6\xf0\xe6\xf1\xe6\xf2\xe6\xf3\xe6\xf4\xe6\xf5\xe6\xf6\xe6\xf7\xe6\xf8\xe6\xf9\xe6\xfa\xe6\xfb\xe6\xfc\xe6\xfd\xe6\xfe\xe6\xff\xe7\x00\xe7\x01\xe7\x02\xe7\x03\xe7\x04\xe7\x05\xe7\x06\xe7\x07\xe7\x08\xe7\x09\xe7\x0a\xe7\x0b\xe7\x0c\xe7\x0d\xe7\x0e\xe7\x0f\xe7\x10\xe7\x11\xe7\x12\xe7\x13\xe7\x14\xe7\x15\xe7\x16\xe7\x17\xe7\x18\xe7\x19\xe7\x1a\xe7\x1b\xe7\x1c\xe7\x1d\xe7\x1e\xe7\x1f\xe7\x20\xe7\x21\xe7\x22\xe7\x23\xe7\x24\xe7\x25\xe7\x26\xe7\x27\xe7\x28\xe7\x29\xe7\x2a\xe7\x2b\xe7\x2c\xe7\x2d\xe7\x2e\xe7\x2f\xe7\x30\xe7\x31\xe7\x32\xe7\x33\xe7\x34\xe7\x35\xe7\x36\xe7\x37\xe7\x38\xe7\x39\xe7\x3a\xe7\x3b\xe7\x3c\xe7\x3d\xe7\x3e\xe7\x3f\xe7\x40\xe7\x41\xe7\x42\xe7\x43\xe7\x44\xe7\x45\xe7\x46\xe7\x47\xe7\x48\xe7\x49\xe7\x4a\xe7\x4b\xe7\x4c\xe7\x4d\xe7\x4e\xe7\x4f\xe7\x50\xe7\x51\xe7\x52\xe7\x53\xe7\x54\xe7\x55\xe7\x56\xe7\x57\x00\x00\x00\x00", /* 8000 */ NULL, /* 8080 */ NULL, /* 8100 */ NULL, /* 8180 */ NULL, /* 8200 */ NULL, /* 8280 */ NULL, /* 8300 */ NULL, /* 8380 */ NULL, /* 8400 */ NULL, /* 8480 */ NULL, /* 8500 */ NULL, /* 8580 */ NULL, /* 8600 */ NULL, /* 8680 */ NULL, /* 8700 */ NULL, /* 8780 */ NULL, /* 8800 */ NULL, /* 8880 */ NULL, /* 8900 */ NULL, /* 8980 */ NULL, /* 8a00 */ NULL, /* 8a80 */ NULL, /* 8b00 */ NULL, /* 8b80 */ NULL, /* 8c00 */ NULL, /* 8c80 */ NULL, /* 8d00 */ NULL, /* 8d80 */ NULL, /* 8e00 */ NULL, /* 8e80 */ NULL, /* 8f00 */ NULL, /* 8f80 */ NULL, /* 9000 */ NULL, /* 9080 */ NULL, /* 9100 */ NULL, /* 9180 */ NULL, /* 9200 */ NULL, /* 9280 */ NULL, /* 9300 */ NULL, /* 9380 */ NULL, /* 9400 */ NULL, /* 9480 */ NULL, /* 9500 */ NULL, /* 9580 */ NULL, /* 9600 */ NULL, /* 9680 */ NULL, /* 9700 */ NULL, /* 9780 */ NULL, /* 9800 */ NULL, /* 9880 */ NULL, /* 9900 */ NULL, /* 9980 */ NULL, /* 9a00 */ NULL, /* 9a80 */ NULL, /* 9b00 */ NULL, /* 9b80 */ NULL, /* 9c00 */ NULL, /* 9c80 */ NULL, /* 9d00 */ NULL, /* 9d80 */ NULL, /* 9e00 */ NULL, /* 9e80 */ NULL, /* 9f00 */ NULL, /* 9f80 */ NULL, /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ NULL, /* e080 */ NULL, /* e100 */ NULL, /* e180 */ NULL, /* e200 */ NULL, /* e280 */ NULL, /* e300 */ NULL, /* e380 */ NULL, /* e400 */ NULL, /* e480 */ NULL, /* e500 */ NULL, /* e580 */ NULL, /* e600 */ NULL, /* e680 */ NULL, /* e700 */ NULL, /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ NULL, /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ NULL, /* ff80 */ NULL } }, { "cp937", "0x03a70343" /* 935, 835 */, /* Unicode to EBCDIC DBCS translation table for ibm-937_P110-1999 */ { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6a\x44\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\xa1\x44\xed\x44\x4b\x00\x00\x00\x00\x44\xee\x00\x00\x43\x79\x46\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x53\x00\x00\x45\x51\x45\x52\x45\x54\x00\x00\x47\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x61\x41\x62\x41\x63\x41\x64\x41\x65\x41\x66\x41\x67\x41\x68\x41\x69\x41\x6a\x41\x6b\x41\x6c\x41\x6d\x41\x6e\x41\x6f\x41\x70\x41\x71\x00\x00\x41\x72\x41\x73\x41\x74\x41\x75\x41\x76\x41\x77\x41\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x41\x41\x42\x41\x43\x41\x44\x41\x45\x41\x46\x41\x47\x41\x48\x41\x49\x41\x4a\x41\x4b\x41\x4c\x41\x4d\x41\x4e\x41\x4f\x41\x50\x41\x51\x00\x00\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x41\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\x41\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xc0\x41\xc1\x41\xc2\x41\xc3\x41\xc4\x41\xc5\x41\xc7\x41\xc8\x41\xc9\x41\xca\x41\xcb\x41\xcc\x41\xcd\x41\xce\x41\xcf\x41\xd0\x41\xd1\x41\xd2\x41\xd3\x41\xd4\x41\xd5\x41\xd6\x41\xd7\x41\xd8\x41\xd9\x41\xda\x41\xdb\x41\xdc\x41\xdd\x41\xde\x41\xdf\x41\xe0\x41\x80\x41\x81\x41\x82\x41\x83\x41\x84\x41\x85\x41\x87\x41\x88\x41\x89\x41\x8a\x41\x8b\x41\x8c\x41\x8d\x41\x8e\x41\x8f\x41\x90\x41\x91\x41\x92\x41\x93\x41\x94\x41\x95\x41\x96\x41\x97\x41\x98\x41\x99\x41\x9a\x41\x9b\x41\x9c\x41\x9d\x41\x9e\x41\x9f\x41\xa0\x00\x00\x41\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x5a\x00\x00\x00\x00\x44\x4a\x44\x4a\x00\x00\x00\x00\x00\x00\x44\x61\x44\x71\x00\x00\x00\x00\x44\x62\x44\x72\x00\x00\x00\x00\x43\x77\x43\x78\x00\x00\x00\x00\x00\x00\x44\x7e\x44\x7f\x43\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x73\x00\x00\x44\x50\x44\xef\x00\x00\x42\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6b\x00\x00\x00\x00\x42\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ NULL, /* 2100 */ "\x00\x00\x00\x00\x00\x00\x44\x4e\x00\x00\x46\xbb\x00\x00\x00\x00\x00\x00\x46\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xf1\x41\xf2\x41\xf3\x41\xf4\x41\xf5\x41\xf6\x41\xf7\x41\xf8\x41\xf9\x41\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xb1\x41\xb2\x41\xb3\x41\xb4\x41\xb5\x41\xb6\x41\xb7\x41\xb8\x41\xb9\x41\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xf1\x44\xf2\x44\xf0\x44\xf3\x00\x00\x00\x00\x46\xd4\x46\xd5\x46\xd7\x46\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xef\x46\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x6e\x00\x00\x43\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x43\x70\x00\x00\x43\x4e\x43\x71\x00\x00\x00\x00\x00\x00\x43\x4f\x43\x64\x00\x00\x00\x00\x43\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xda\x00\x00\x00\x00\x00\x00\x00\x00\x46\xc5\x00\x00\x00\x00\x43\x61\x44\x4d\x46\xcc\x46\xcb\x00\x00\x00\x00\x42\x4f\x00\x00\x44\x7c\x00\x00\x43\x6c\x43\x6d\x46\xc8\x46\xc9\x46\xd0\x43\x63\x00\x00\x46\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x68\x44\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xa1\x43\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x4c\x46\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x44\x67\x44\x77\x00\x00\x00\x00\x43\x5d\x43\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x43\x68\x43\x69\x00\x00\x00\x00\x43\x66\x43\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xd2\x00\x00\x00\x00\x00\x00\x46\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ "\x47\x81\x47\x82\x47\x83\x47\x84\x47\x85\x47\x86\x47\x87\x47\x88\x47\x89\x47\x8a\x47\x8b\x47\x8c\x47\x8d\x47\x8e\x47\x8f\x47\x90\x47\x91\x47\x92\x47\x93\x47\x94\x47\x95\x47\x96\x47\x97\x47\x98\x47\x99\x47\x9a\x47\x9b\x47\x9c\x47\x9d\x47\x9e\x47\x9f\x47\xa0\x00\x00\x47\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x41\x46\x42\x46\x43\x46\x44\x46\x45\x46\x46\x46\x47\x46\x48\x46\x49\x46\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x51\x46\x52\x46\x53\x46\x54\x46\x55\x46\x56\x46\x57\x46\x58\x46\x59\x46\x5a\x00\x00\x00\x00", /* 2480 */ NULL, /* 2500 */ "\x46\x75\x43\xb7\x46\x76\x43\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x78\x00\x00\x00\x00\x43\xb9\x46\x79\x00\x00\x00\x00\x43\xe1\x46\x7a\x00\x00\x00\x00\x43\xe3\x46\x7b\x00\x00\x00\x00\x43\xe2\x46\x73\x43\xee\x00\x00\x00\x00\x43\xe9\x00\x00\x00\x00\x43\xe4\x46\x72\x43\xf0\x00\x00\x00\x00\x43\xeb\x00\x00\x00\x00\x43\xe6\x46\x71\x00\x00\x00\x00\x43\xea\x43\xef\x00\x00\x00\x00\x43\xe5\x46\x70\x00\x00\x00\x00\x43\xec\x43\xf1\x00\x00\x00\x00\x43\xe7\x46\x6f\x00\x00\x00\x00\x43\xed\x00\x00\x00\x00\x43\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x46\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x82\x00\x00\x00\x00\x46\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x83\x00\x00\x00\x00\x46\x7c\x46\x7d\x46\x7f\x46\x7e\x46\x89\x46\x8a\x46\x8b\x46\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\x46\x60\x46\x61\x46\x62\x46\x63\x46\x64\x46\x65\x46\x66\x46\x67\x46\x6e\x46\x6d\x46\x6c\x46\x6b\x46\x6a\x46\x69\x46\x68\x00\x00\x00\x00\x00\x00\x00\x00\x46\x74\x46\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xea\x44\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe3\x44\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xec\x44\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe8\x44\xe7\x00\x00\x00\x00\x00\x00\x44\xe0\x00\x00\x00\x00\x44\xe4\x44\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x85\x46\x86\x46\x88\x46\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe6\x44\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x79\x00\x00\x44\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x76\x00\x00\x00\x00\x43\x75\x00\x00\x43\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ "\x40\x40\x43\x44\x43\x41\x46\xb9\x00\x00\x44\x5d\x44\x5e\x44\x5f\x44\x64\x44\x74\x44\x65\x44\x75\x43\x42\x43\x43\x44\x42\x44\x43\x44\x66\x44\x76\x44\x6c\x44\x7d\x44\x63\x44\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xe9\x46\xea\x00\x00\x00\x00\x45\x41\x45\x42\x45\x43\x45\x44\x45\x45\x45\x46\x45\x47\x45\x48\x45\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x47\x44\x81\x44\x48\x44\x82\x44\x49\x44\x83\x44\x51\x44\x84\x44\x52\x44\x85\x44\x86\x44\xc0\x44\x87\x44\xc1\x44\x88\x44\xc2\x44\x89\x44\xc3\x44\x8a\x44\xc4\x44\x8c\x44\xc5\x44\x8d\x44\xc6\x44\x8e\x44\xc7\x44\x8f\x44\xc8\x44\x90\x44\xc9\x44\x91\x44\xca\x44\x92\x44\xcb\x44\x56\x44\x93\x44\xcc\x44\x94\x44\xcd\x44\x95\x44\xce\x44\x96\x44\x97\x44\x98\x44\x99\x44\x9a\x44\x9d\x44\xcf\x44\xd5\x44\x9e\x44\xd0\x44\xd6\x44\x9f\x44\xd1\x44\xd7\x44\xa2\x44\xd2\x44\xd8\x44\xa3\x44\xd3\x44\xd9\x44\xa4\x44\xa5", /* 3080 */ "\x44\xa6\x44\xa7\x44\xa8\x44\x53\x44\xa9\x44\x54\x44\xaa\x44\x55\x44\xac\x44\xad\x44\xae\x44\xaf\x44\xba\x44\xbb\x44\x57\x44\xbc\x44\xda\x44\xdb\x44\x46\x44\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xbe\x43\xbf\x44\xdc\x44\xdd\x00\x00\x00\x00\x43\x47\x43\x81\x43\x48\x43\x82\x43\x49\x43\x83\x43\x51\x43\x84\x43\x52\x43\x85\x43\x86\x43\xc0\x43\x87\x43\xc1\x43\x88\x43\xc2\x43\x89\x43\xc3\x43\x8a\x43\xc4\x43\x8c\x43\xc5\x43\x8d\x43\xc6\x43\x8e\x43\xc7\x43\x8f\x43\xc8\x43\x90\x43\xc9\x43\x91\x43\xca\x43\x92\x43\xcb\x43\x56\x43\x93\x43\xcc\x43\x94\x43\xcd\x43\x95\x43\xce\x43\x96\x43\x97\x43\x98\x43\x99\x43\x9a\x43\x9d\x43\xcf\x43\xd5\x43\x9e\x43\xd0\x43\xd6\x43\x9f\x43\xd1\x43\xd7\x43\xa2\x43\xd2\x43\xd8\x43\xa3\x43\xd3\x43\xd9\x43\xa4\x43\xa5\x43\xa6\x43\xa7\x43\xa8\x43\x53\x43\xa9\x43\x54\x43\xaa\x43\x55\x43\xac\x43\xad\x43\xae\x43\xaf\x43\xba\x43\xbb\x43\x57\x43\xbc\x43\xda\x43\xdb\x43\x46\x43\xbd\x43\xd4\x43\x59\x43\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x58\x43\xdc\x43\xdd\x00\x00", /* 3100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x56\x45\x57\x45\x58\x45\x59\x45\x5a\x45\x5b\x45\x5c\x45\x5d\x45\x5e\x45\x5f\x45\x60\x45\x61\x45\x62\x45\x63\x45\x64\x45\x65\x45\x66\x45\x67\x45\x68\x45\x69\x45\x6a\x45\x6b\x45\x6c\x45\x6d\x45\x6e\x45\x6f\x45\x70\x45\x71\x45\x72\x45\x73\x45\x74\x45\x75\x45\x76\x45\x77\x45\x78\x45\x79\x45\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3180 */ NULL, /* 3200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3300 */ NULL, /* 3380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xe2\x46\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xdd\x46\xde\x46\xdf\x00\x00\x00\x00\x46\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xe0\x00\x00\x00\x00\x46\xcf\x46\xce\x00\x00\x00\x00\x46\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ NULL, /* 4080 */ NULL, /* 4100 */ NULL, /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ NULL, /* 4380 */ NULL, /* 4400 */ NULL, /* 4480 */ NULL, /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ NULL, /* 4680 */ NULL, /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ NULL, /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ NULL, /* 4c80 */ NULL, /* 4d00 */ NULL, /* 4d80 */ NULL, /* 4e00 */ "\x4c\x41\x4c\x43\x00\x00\x4c\x44\x00\x00\x00\x00\x00\x00\x69\x46\x4c\x57\x4c\x55\x4c\x58\x4c\x56\x69\x47\x4c\x83\x69\x50\x69\x4e\x4c\x82\x4c\x81\x00\x00\x00\x00\x4c\xe1\x4c\xe0\x4c\xdf\x00\x00\x4c\xe2\x4c\xde\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xa1\x4d\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xe3\x00\x00\x48\x42\x00\x00\x00\x00\x4c\x59\x00\x00\x4c\x84\x69\x51\x00\x00\x4c\x85\x69\x64\x4e\x8c\x6b\x52\x00\x00\x00\x00\x48\x43\x00\x00\x4c\x5a\x4c\x86\x00\x00\x4c\xe3\x69\x65\x00\x00\x00\x00\x48\x44\x00\x00\x00\x00\x69\x41\x4c\x45\x00\x00\x4c\x5c\x00\x00\x69\x48\x4c\x5d\x00\x00\x00\x00\x4c\x87\x00\x00\x4c\xe4\x4c\xe6\x4c\xe5\x00\x00\x00\x00\x4d\xa3\x4d\xa4\x00\x00\x00\x00\x4f\xe4\x00\x00\x53\xfd\x4c\x42\x00\x00\x00\x00\x69\x42\x4c\x46\x4c\x5f\x4c\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x92\x72\x6f", /* 4e80 */ "\x00\x00\x00\x00\x5b\xa9\x79\x77\x79\x78\x48\x46\x4c\x47\x00\x00\x4c\x89\x00\x00\x00\x00\x4f\xe6\x4c\x48\x69\x49\x4c\x60\x00\x00\x00\x00\x4c\x8a\x4c\x8c\x69\x52\x4c\x8d\x4c\x8b\x00\x00\x00\x00\x00\x00\x4d\xa6\x00\x00\x4f\xe7\x00\x00\x00\x00\x4f\xe8\x51\xe6\x48\x48\x4c\x61\x4c\x8e\x00\x00\x4d\xa7\x4d\xa9\x4d\xa8\x00\x00\x4e\x8d\x00\x00\x00\x00\x4f\xe9\x4f\xea\x51\xe7\x51\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x54\x41\x00\x00\x00\x00\x79\x79\x00\x00\x00\x00\x8f\x66\x4c\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x90\x4c\x8f\x69\x53\x4c\x91\x4c\x97\x00\x00\x4c\x92\x4c\x93\x69\x55\x69\x54\x4c\x95\x4c\x96\x00\x00\x4c\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xe9\x4c\xea\x4c\xeb\x4c\xec\x4c\xe8\x4c\xef\x69\x6b\x00\x00\x69\x67\x69\x6a\x4c\xf0\x4d\x43\x00\x00\x69\x69\x00\x00\x4c\xed\x4c\xee\x4c\xe7\x00\x00\x00\x00\x69\x66\x69\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xb6\x69\x90\x4d\xb3\x4d\xb7\x69\x9a\x69\x8e\x4d\xb4\x69\x92\x00\x00\x00\x00\x00\x00\x4d\xb5\x00\x00\x4d\xb8\x00\x00\x4d\xaa", /* 4f00 */ "\x69\x91\x4d\xb9\x69\x95\x00\x00\x69\x99\x69\x96\x00\x00\x00\x00\x69\x93\x4d\xab\x4d\xad\x4d\xba\x00\x00\x4d\xaf\x69\x8b\x4d\xb2\x4d\xb0\x4d\xb1\x69\x9b\x69\x98\x69\x8f\x4d\xae\x00\x00\x00\x00\x69\x8c\x4d\xac\x00\x00\x00\x00\x00\x00\x69\x94\x00\x00\x00\x00\x00\x00\x00\x00\x69\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x8d\x6a\x48\x00\x00\x4e\xa3\x4e\x96\x00\x00\x00\x00\x6a\x49\x4e\x93\x00\x00\x4e\xa5\x00\x00\x4e\x9b\x00\x00\x4e\x9a\x69\xfa\x4e\x9e\x4e\x99\x6a\x42\x6a\x4a\x00\x00\x6a\x46\x00\x00\x4e\x9c\x00\x00\x00\x00\x4e\x9f\x4e\x90\x4e\xa8\x69\xfc\x00\x00\x00\x00\x6b\x5e\x4e\x8e\x4e\xa4\x4e\x8f\x4e\x97\x4e\x98\x6a\x44\x69\xfd\x4e\x9d\x4e\x95\x69\xf9\x4e\x91\x6a\x47\x4e\xa6\x4e\xa9\x4e\x94\x4e\xa1\x4e\xa7\x4e\x92\x6a\x45\x4e\xa2\x6a\x4b\x69\xfb\x4e\xa0\x6a\x41\x00\x00\x00\x00\x6a\x43\x00\x00\x4f\xf8\x6b\x60\x6b\x6c\x4f\xf0\x00\x00\x6b\x6d\x4f\xeb\x4f\xf5\x00\x00\x00\x00\x4f\xee\x6b\x5a\x4f\xf6\x6b\x59\x6b\x5d\x6b\x64\x6b\x62\x50\x41\x4f\xf9\x6b\x54\x6b\x56\x4f\xfb\x4f\xef", /* 4f80 */ "\x6b\x57\x6b\x63\x6b\x6a\x4f\xf4\x6b\x5c\x6b\x55\x4f\xf3\x6b\x58\x4f\xf7\x6b\x5b\x00\x00\x4f\xf2\x00\x00\x4f\xed\x00\x00\x4f\xfc\x6b\x65\x4f\xfd\x6b\x69\x00\x00\x6b\x67\x6b\x6b\x4f\xfa\x6b\x5f\x6b\x53\x00\x00\x6b\x61\x4f\xf1\x6b\x66\x4f\xec\x6b\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xf7\x51\xeb\x00\x00\x00\x00\x6d\x43\x6d\x4b\x00\x00\x51\xea\x51\xf2\x52\x41\x00\x00\x6d\x51\x6d\x4f\x6d\x4a\x00\x00\x00\x00\x00\x00\x51\xec\x6d\x50\x6d\x46\x51\xfa\x51\xf1\x51\xf9\x6d\x41\x00\x00\x6d\x4d\x00\x00\x6d\x44\x51\xf5\x6d\x45\x00\x00\x6c\xfd\x51\xfc\x51\xef\x51\xf8\x51\xee\x00\x00\x6d\x42\x6d\x47\x00\x00\x6d\x4e\x51\xf6\x51\xf3\x6d\x49\x51\xfb\x6d\x4c\x6d\x48\x51\xf0\x51\xfd\x51\xf4\x51\xed\x51\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x52\x00\x00\x54\x5b\x54\x45\x00\x00\x54\x55\x00\x00\x54\x5a\x6f\x93\x6f\x92\x6f\x97\x6f\x98\x54\x48\x00\x00\x54\x51\x00\x00\x00\x00\x00\x00\x54\x5e\x00\x00", /* 5000 */ "\x54\x52\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x8c\x54\x4b\x6f\x8d\x00\x00\x54\x60\x00\x00\x54\x57\x54\x42\x54\x43\x6f\xa0\x56\xa3\x00\x00\x54\x50\x54\x4f\x6f\x8e\x54\x53\x72\x7f\x54\x4a\x6f\x99\x54\x59\x54\x58\x54\x4e\x6f\x91\x6f\x9a\x00\x00\x6f\x8b\x54\x4d\x6f\x9b\x54\x56\x6f\x8f\x54\x44\x00\x00\x54\x47\x54\x46\x6f\x9c\x54\x54\x54\x49\x54\x5d\x54\x5f\x6f\x96\x54\x5c\x00\x00\x6f\x9e\x6f\x90\x6f\x9f\x00\x00\x6f\x94\x00\x00\x6f\x9d\x00\x00\x6f\x95\x00\x00\x00\x00\x00\x00\x00\x00\x54\x4c\x00\x00\x00\x00\x00\x00\x72\x88\x72\x7b\x00\x00\x56\x97\x00\x00\x72\x81\x72\x87\x56\x96\x72\x79\x56\x9a\x72\x7d\x72\x76\x56\x98\x72\x7a\x56\x9d\x56\xa2\x00\x00\x72\x8c\x00\x00\x72\x75\x00\x00\x56\x9e\x00\x00\x72\x8b\x00\x00\x00\x00\x56\x99\x72\x7c\x56\x95\x72\x77\x72\x73\x72\x82\x72\x74\x72\x72\x72\x7e\x72\x85\x72\x86\x56\x9b\x00\x00\x00\x00\x75\xc0\x72\x83\x72\x71\x72\x84\x00\x00\x56\xa5\x72\x89\x56\xa4\x72\x70\x00\x00\x72\x78\x72\x8a\x56\xa0\x56\x9f\x56\x9c\x56\xa1\x00\x00\x00\x00\x56\x93\x00\x00\x00\x00\x56\x94\x00\x00\x00\x00", /* 5080 */ "\x59\x4e\x00\x00\x75\xc3\x75\xbc\x00\x00\x59\x4b\x00\x00\x75\xc4\x00\x00\x00\x00\x00\x00\x75\xba\x75\xbd\x59\x4a\x75\xbe\x00\x00\x00\x00\x59\x4d\x75\xc2\x00\x00\x75\xb8\x75\xb7\x59\x4f\x00\x00\x59\x50\x59\x4c\x59\x51\x75\xb6\x75\xc1\x75\xbf\x75\xb9\x00\x00\x00\x00\x00\x00\x59\x49\x75\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xb0\x5b\xaa\x79\x7d\x5b\xb3\x79\x84\x79\x87\x5b\xac\x5b\xad\x79\x81\x5b\xab\x79\x8a\x5b\xb1\x79\x8b\x00\x00\x79\x86\x5b\xb2\x00\x00\x79\x7a\x5b\xaf\x79\x7b\x00\x00\x79\x85\x79\x83\x00\x00\x79\x7e\x5b\xae\x79\x7c\x5b\xb4\x79\x82\x79\x89\x79\x7f\x79\x88\x00\x00\x00\x00\x5d\xfb\x5d\xf8\x00\x00\x5d\xf9\x00\x00\x7d\x43\x7c\xf8\x5d\xf7\x5d\xf4\x7c\xf9\x00\x00\x00\x00\x5d\xf6\x7c\xfc\x00\x00\x7d\x41\x00\x00\x00\x00\x7d\x48\x00\x00\x00\x00\x7d\x47\x7d\x42\x5d\xf3\x7c\xf7\x5d\xf1\x7c\xfa\x5d\xfc\x7c\xfd\x00\x00\x7d\x44\x5d\xf5\x5d\xf2\x7d\x46\x7d\x45\x5d\xfa\x00\x00\x7c\xfb\x00\x00\x60\x42\x80\x76\x00\x00\x80\x73\x60\x43\x00\x00\x60\x41\x00\x00\x80\x7a\x80\x77\x80\x70", /* 5100 */ "\x5f\xfd\x00\x00\x60\x44\x80\x71\x5f\xfc\x60\x47\x80\x74\x80\x75\x60\x45\x60\x46\x80\x7b\x80\x78\x80\x79\x00\x00\x00\x00\x00\x00\x62\x53\x83\xc3\x62\x50\x83\xc0\x62\x52\x62\x54\x00\x00\x83\xc1\x62\x51\x00\x00\x83\xc2\x00\x00\x83\xbf\x00\x00\x00\x00\x63\xc0\x86\xc8\x63\xc1\x86\xc6\x00\x00\x86\xc7\x86\xc5\x86\xc4\x00\x00\x00\x00\x86\xc9\x63\xbf\x00\x00\x00\x00\x89\x65\x89\x66\x00\x00\x80\x72\x89\x64\x63\xc2\x66\x4b\x8b\x5a\x8b\x5b\x00\x00\x67\x83\x67\x84\x8e\x70\x8e\x6f\x67\xd7\x67\xd6\x90\x41\x00\x00\x4c\x4a\x4c\x62\x4c\x99\x00\x00\x4c\x98\x4c\xf2\x4c\xf1\x4d\xbd\x4d\xbc\x4d\xbe\x4d\xbb\x00\x00\x4e\xab\x4e\xaa\x4e\xac\x00\x00\x00\x00\x00\x00\x00\x00\x50\x43\x00\x00\x50\x42\x50\x44\x00\x00\x52\x42\x00\x00\x46\xf1\x6f\xa1\x46\xf2\x56\xa6\x46\xf4\x46\xf3\x75\xc5\x00\x00\x46\xf5\x5d\xfd\x46\xf6\x00\x00\x4c\x4b\x00\x00\x4c\x9a\x4d\xbf\x50\x45\x00\x00\x4c\x4c\x4c\x9d\x4c\x9b\x4c\x9c\x00\x00\x00\x00\x4d\xc0\x00\x00\x00\x00\x00\x00\x4e\xad\x50\x47\x50\x46\x50\x48\x00\x00\x00\x00\x00\x00\x54\x61\x00\x00\x00\x00\x00\x00", /* 5180 */ "\x62\x55\x00\x00\x48\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4f\x00\x00\x4c\xf3\x4c\xf4\x00\x00\x00\x00\x4d\xc1\x00\x00\x6a\x4c\x00\x00\x52\x44\x52\x43\x6f\xa3\x6f\xa2\x56\xa7\x48\x4e\x4c\x9e\x69\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x6e\x00\x00\x52\x45\x00\x00\x54\x64\x00\x00\x54\x62\x54\x63\x00\x00\x00\x00\x00\x00\x00\x00\x62\x56\x48\x4f\x4c\xf5\x00\x00\x00\x00\x00\x00\x4d\xc2\x69\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xae\x4e\xaf\x00\x00\x6a\x4d\x00\x00\x00\x00\x6b\x6f\x50\x49\x6b\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xa5\x6f\xa6\x54\x67\x00\x00\x6f\xa7\x00\x00\x6f\xa4\x54\x68\x54\x66\x54\x65\x6f\xa8\x00\x00\x72\x8d\x00\x00\x00\x00\x00\x00\x75\xc6\x00\x00\x00\x00\x79\x8c\x7d\x49\x00\x00\x00\x00\x00\x00\x60\x48\x62\x57\x83\xc4\x00\x00\x4c\x4d\x4c\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xa8\x59\x53\x00\x00\x5e\x41\x00\x00\x69\x43\x4c\x9f\x00\x00\x4c\xf8\x4c\xf6\x4c\xf7\x00\x00\x00\x00\x50\x4a\x00\x00\x00\x00", /* 5200 */ "\x4c\x4e\x4c\x4f\x00\x00\x4c\x63\x00\x00\x00\x00\x4c\xa0\x4c\xa1\x4c\xa2\x69\x9e\x4c\xf9\x00\x00\x69\x6c\x00\x00\x4d\xc6\x00\x00\x69\x9f\x4d\xc4\x4d\xc5\x69\x9d\x00\x00\x00\x00\x4d\xc7\x4d\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x4e\x51\xce\x6a\x4f\x00\x00\x00\x00\x6a\x50\x00\x00\x00\x00\x4e\xb1\x4e\xb0\x00\x00\x00\x00\x4e\xb4\x4e\xb2\x4e\xb3\x00\x00\x00\x00\x00\x00\x50\x50\x00\x00\x50\x4f\x6b\x75\x6b\x72\x6b\x73\x00\x00\x6b\x71\x50\x51\x50\x4d\x50\x4c\x00\x00\x50\x4e\x50\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x52\x00\x00\x52\x47\x6d\x53\x00\x00\x6b\x74\x52\x4c\x00\x00\x6d\x54\x52\x48\x52\x4b\x52\x4a\x52\x49\x52\x46\x00\x00\x00\x00\x00\x00\x6f\xab\x00\x00\x54\x6b\x6f\xae\x54\x69\x00\x00\x00\x00\x00\x00\x6f\xaa\x54\x6c\x54\x6a\x54\x6d\x6f\xac\x6f\xad\x00\x00\x6f\xa9\x6f\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x57\x56\xa9\x72\x8e\x72\x90\x72\x8f\x72\x91\x56\xaa\x00\x00\x00\x00\x59\x54\x00\x00\x59\x55\x59\x56\x00\x00\x5b\xb6\x79\x8e\x00\x00\x79\x8d\x79\x8f\x79\x90\x5b\xb7\x00\x00\x5b\xb5", /* 5280 */ "\x7d\x4a\x7d\x4b\x5e\x43\x5e\x42\x7e\xe2\x00\x00\x00\x00\x60\x49\x60\x4a\x60\x4b\x60\x4d\x80\x7c\x80\x7d\x60\x4c\x00\x00\x00\x00\x00\x00\x62\x58\x00\x00\x62\x59\x00\x00\x00\x00\x8b\x5c\x8e\x72\x8e\x71\x90\x42\x00\x00\x4c\x50\x00\x00\x00\x00\x00\x00\x4c\xfb\x4c\xfa\x00\x00\x00\x00\x4d\xc8\x00\x00\x00\x00\x69\xa0\x00\x00\x00\x00\x4e\xb6\x4e\xb7\x4e\xb5\x4e\xb8\x6a\x51\x6a\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x54\x6b\x76\x00\x00\x50\x53\x00\x00\x6d\x55\x52\x50\x6d\x56\x52\x4f\x00\x00\x00\x00\x00\x00\x52\x4d\x00\x00\x52\x4e\x00\x00\x00\x00\x00\x00\x6f\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x56\xab\x72\x93\x00\x00\x56\xae\x72\x92\x57\xaa\x56\xad\x56\xac\x00\x00\x59\x5a\x00\x00\x59\x59\x59\x58\x5b\xb8\x00\x00\x00\x00\x5b\xbb\x5b\xbc\x5b\xba\x00\x00\x5b\xb9\x00\x00\x00\x00\x7d\x4c\x00\x00\x7d\x4d\x00\x00\x00\x00\x00\x00\x80\x7f\x60\x4e\x80\x7e\x00\x00\x62\x5a\x86\xca\x63\xc3\x00\x00\x8b\x5d\x66\xdf\x48\x54\x4c\x64\x4c\xa3\x69\x57\x00\x00\x4c\xa4\x4c\xa5", /* 5300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xfc\x4c\xfd\x00\x00\x4d\xc9\x6a\x53\x6b\x77\x6b\x78\x00\x00\x52\x51\x6f\xb1\x56\xb0\x56\xaf\x75\xc8\x75\xc7\x00\x00\x00\x00\x4c\x51\x4c\xa6\x4d\x41\x00\x00\x56\xb1\x69\x44\x00\x00\x69\x6d\x4d\x42\x00\x00\x69\xa2\x4d\xcb\x4d\xca\x69\xa1\x4e\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x6e\x00\x00\x00\x00\x72\x94\x00\x00\x5b\xbd\x7d\x4e\x5e\x44\x00\x00\x00\x00\x83\xc5\x00\x00\x00\x00\x8c\xeb\x48\x57\x4c\xa7\x00\x00\x00\x00\x6b\x79\x6d\x57\x56\xb4\x56\xb2\x56\xb3\x4c\x52\x00\x00\x4c\x65\x45\x4b\x4c\xaa\x00\x00\x4c\xa9\x4c\xa8\x4d\x45\x4d\x44\x00\x00\x69\x6e\x69\xa3\x00\x00\x00\x00\x00\x00\x50\x58\x50\x55\x50\x57\x50\x56\x00\x00\x00\x00\x52\x52\x00\x00\x00\x00\x59\x5b\x00\x00\x4c\x53\x00\x00\x4c\xab\x00\x00\x4d\x47\x4d\x46\x00\x00\x6a\x54\x00\x00\x00\x00\x50\x59\x00\x00\x00\x00\x48\x5a\x00\x00\x00\x00\x69\x58\x00\x00\x4d\x49\x4d\x48\x4d\xcc\x4d\xcd\x6a\x55\x4e\xba\x00\x00\x4e\xbb\x00\x00\x50\x5a\x50\x5b\x50\x5c\x00\x00\x52\x53\x6d\x58\x00\x00\x00\x00\x54\x6f", /* 5380 */ "\x00\x00\x00\x00\x69\x45\x00\x00\x4c\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xa4\x00\x00\x00\x00\x00\x00\x6a\x56\x6a\x57\x00\x00\x00\x00\x6b\x7a\x00\x00\x6b\x7b\x00\x00\x6d\x5a\x6d\x59\x6d\x5c\x6d\x5b\x52\x54\x00\x00\x72\x95\x54\x71\x6f\xb2\x54\x70\x00\x00\x00\x00\x00\x00\x00\x00\x75\xc9\x59\x5c\x00\x00\x75\xca\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x4f\x5e\x45\x00\x00\x00\x00\x00\x00\x00\x00\x60\x4f\x00\x00\x8b\x5e\x00\x00\x48\x5c\x00\x00\x00\x00\x69\x59\x00\x00\x4d\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x54\x4c\x66\x4c\xae\x4c\xad\x00\x00\x4c\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x5e\x00\x00\x50\x5d\x50\x5f\x00\x00\x00\x00\x00\x00\x52\x55\x00\x00\x00\x00\x00\x00\x54\x72\x00\x00\x83\xc6\x65\x5a\x4c\x67\x4d\x4c\x4d\x5b\x4d\x56\x00\x00\x4d\x51\x4d\x50\x4d\x57\x4d\x55\x4d\x4e\x4d\x5c\x4d\x4f\x4d\x4b\x4d\x5a\x4d\x59\x4d\x58\x4d\x4d\x00\x00\x4d\x54\x00\x00\x00\x00\x4d\x53\x00\x00\x00\x00\x4d\x5d\x4d\x52\x00\x00\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x4d\xd3\x00\x00\x4d\xd9\x4d\xd5\x00\x00\x4d\xdb\x69\xa5\x4d\xd8\x4d\xce\x4d\xd1\x4d\xd4\x4d\xd0\x4d\xd7\x4d\xda\x4d\xcf\x4d\xd2\x4d\xd6\x4d\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x60\x6a\x5d\x00\x00\x4e\xc8\x6a\x5e\x4e\xbc\x4e\xbe\x4e\xd6\x4e\xd1\x00\x00\x00\x00\x00\x00\x6a\x65\x6a\x5f\x4e\xc0\x4e\xc2\x6a\x64\x4e\xc9\x6a\x5a\x4e\xd5\x4e\xd7\x4e\xbd\x4e\xce\x00\x00\x6a\x58\x4e\xd4\x00\x00\x4e\xc5\x00\x00\x4e\xcf\x4e\xd0\x6a\x59\x4e\xcd\x4e\xcb\x00\x00\x4e\xcc\x4e\xd2\x6a\x61\x4e\xbf\x00\x00\x4e\xd3\x6a\x63\x4e\xc7\x4e\xc4\x00\x00\x6a\x5c\x4e\xc3\x6a\x66\x4e\xc6\x00\x00\x4e\xca\x00\x00\x00\x00\x00\x00\x4e\xc1\x6a\x62\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x8d\x6b\x8c\x50\x71\x6b\x8f\x6b\x91\x6b\x86\x6b\x89\x6b\x90\x50\x72\x00\x00\x00\x00\x6b\x83\x6b\x87\x00\x00\x00\x00\x6b\x8b\x6d\x6b\x50\x6d\x6d\x6f\x50\x60\x6b\x88\x50\x61\x50\x6e\x50\x67\x50\x63\x00\x00\x6b\x84\x50\x66\x50\x6b\x50\x74\x6b\x85\x6b\x7d", /* 5480 */ "\x50\x65\x6b\x7e\x6b\x81\x00\x00\x50\x68\x00\x00\x50\x6a\x6b\x7c\x6b\x82\x00\x00\x00\x00\x50\x73\x50\x6f\x6b\x8a\x50\x75\x00\x00\x50\x6c\x6b\x7f\x50\x69\x00\x00\x00\x00\x50\x64\x50\x62\x00\x00\x6b\x8e\x00\x00\x50\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x6a\x6d\x5e\x6d\x6d\x00\x00\x00\x00\x6d\x60\x52\x5c\x52\x6a\x52\x58\x52\x69\x52\x61\x52\x66\x52\x56\x6d\x5f\x6d\x65\x52\x65\x6d\x71\x52\x67\x00\x00\x52\x5d\x00\x00\x00\x00\x6d\x67\x6d\x64\x52\x5b\x00\x00\x6d\x5d\x52\x68\x6d\x6c\x52\x60\x6d\x6e\x52\x6b\x52\x57\x52\x62\x52\x5f\x6d\x62\x52\x63\x6d\x68\x6d\x69\x52\x5e\x52\x64\x52\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x52\x59\x6d\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x70\x00\x00\x6f\xc6\x54\x7f\x6f\xb4\x00\x00\x6f\xb9\x54\x78\x54\x84\x6f\xb7\x54\x73\x54\x7d\x54\x83\x6f\xbe\x00\x00\x54\x7e\x54\x82\x00\x00\x00\x00\x6f\xc1\x54\x79\x6f\xb8\x00\x00\x00\x00\x00\x00\x6f\xc4\x6f\xc5\x00\x00\x54\x7b\x6f\xc3\x54\x77\x54\x87\x00\x00\x6f\xbb", /* 5500 */ "\x00\x00\x54\x75\x00\x00\x6f\xc8\x6f\xbc\x6f\xc0\x54\x7a\x54\x86\x6f\xbd\x54\x81\x6f\xc2\x6f\xc9\x72\xa4\x00\x00\x6f\xc7\x54\x88\x54\x74\x6f\xbf\x6f\xb6\x00\x00\x54\x7c\x00\x00\x00\x00\x6f\xb5\x00\x00\x00\x00\x6f\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xb3\x54\x85\x00\x00\x00\x00\x72\x9c\x00\x00\x56\xc8\x72\xaa\x56\xc6\x56\xc3\x72\xa1\x56\xbf\x72\xa5\x56\xca\x72\x9b\x72\xa0\x72\x9f\x54\x76\x56\xc5\x72\xa8\x00\x00\x72\xab\x72\x98\x00\x00\x59\x6e\x00\x00\x72\xac\x56\xcb\x00\x00\x56\xbd\x56\xba\x72\xa3\x56\xb7\x00\x00\x72\xa9\x00\x00\x56\xbe\x72\xad\x00\x00\x72\x99\x72\xa7\x56\xc1\x72\x9a\x72\x9d\x72\xa2\x00\x00\x00\x00\x56\xc2\x56\xc0\x56\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x56\xc7\x00\x00\x56\xbb\x57\x97\x00\x00\x56\xbc\x72\x9e\x56\xc9\x56\xc4\x72\xa6\x56\xb9\x00\x00\x00\x00\x00\x00\x56\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x96\x72\x97\x75\xcf\x00\x00\x00\x00\x00\x00\x59\x5d\x59\x60\x75\xda\x59\x74\x75\xdd", /* 5580 */ "\x59\x5e\x75\xd6\x59\x64\x59\x6a\x5a\xc2\x00\x00\x00\x00\x59\x68\x75\xd3\x59\x75\x59\x61\x59\x69\x75\xdb\x79\x9e\x75\xe0\x75\xd4\x00\x00\x75\xcb\x75\xd8\x75\xd2\x59\x67\x75\xde\x00\x00\x00\x00\x59\x63\x59\x77\x59\x70\x00\x00\x59\x65\x59\x62\x00\x00\x59\x6d\x00\x00\x75\xdf\x75\xd1\x75\xd7\x75\xd9\x75\xcd\x75\xdc\x59\x5f\x75\xcc\x00\x00\x59\x66\x59\x76\x59\x72\x75\xce\x59\x6c\x00\x00\x00\x00\x59\x73\x59\x6f\x59\x6b\x00\x00\x75\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x71\x00\x00\x00\x00\x00\x00\x79\x9c\x79\x98\x00\x00\x79\xa7\x79\x91\x79\x9a\x5b\xcb\x5b\xcc\x5b\xc4\x79\xa3\x5b\xce\x79\x96\x79\x95\x79\x93\x79\xa5\x5b\xc2\x79\x9f\x79\x94\x5b\xc5\x79\x9d\x5b\xc0\x79\x99\x79\xa0\x79\xa2\x00\x00\x00\x00\x79\xa6\x5b\xc9\x79\x92\x5b\xc3\x79\x97\x00\x00\x5b\xbe\x00\x00\x5b\xca\x79\xa1\x5b\xc6\x5b\xc7\x5b\xcd\x5b\xc1\x46\xf7\x5b\xbf\x79\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xc8\x00\x00\x00\x00\x79\xa4\x00\x00\x00\x00\x00\x00\x5e\x55\x5e\x50\x00\x00\x7d\x5e\x7d\x5a\x00\x00\x7d\x54\x5e\x4a\x5e\x46\x7d\x5d", /* 5600 */ "\x5e\x47\x7d\x57\x7d\x59\x00\x00\x7d\x5c\x00\x00\x5e\x4c\x00\x00\x5e\x53\x5e\x4d\x00\x00\x00\x00\x7d\x52\x5e\x4e\x5e\x4f\x7d\x55\x5e\x54\x00\x00\x7d\x53\x7d\x58\x5e\x4b\x7d\x51\x5e\x51\x5e\x49\x00\x00\x00\x00\x00\x00\x5e\x48\x7d\x56\x7d\x5b\x00\x00\x5e\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x50\x00\x00\x60\x56\x80\x91\x00\x00\x80\x8e\x00\x00\x60\x50\x60\x5c\x60\x5d\x00\x00\x60\x53\x80\x8c\x60\x55\x80\x84\x60\x5b\x00\x00\x80\x90\x60\x52\x80\x92\x60\x51\x00\x00\x80\x8d\x80\x8f\x60\x54\x80\x8b\x80\x85\x80\x82\x00\x00\x00\x00\x75\xd0\x80\x88\x00\x00\x80\x81\x80\x87\x80\x86\x00\x00\x80\x83\x00\x00\x60\x58\x00\x00\x00\x00\x00\x00\x00\x00\x60\x57\x00\x00\x00\x00\x00\x00\x60\x59\x80\x89\x62\x5b\x80\x8a\x00\x00\x00\x00\x00\x00\x83\xcf\x00\x00\x83\xc8\x00\x00\x62\x67\x83\xcc\x62\x5f\x62\x63\x83\xcb\x00\x00\x62\x62\x62\x5e\x62\x61\x62\x5c\x62\x66\x83\xcd\x83\xc9\x62\x65\x83\xc7\x62\x64\x83\xce\x83\xca\x60\x5a\x00\x00\x62\x68\x83\xd0\x62\x60\x62\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x86\xd1\x86\xd3", /* 5680 */ "\x63\xc5\x86\xd4\x86\xd2\x86\xd0\x86\xcf\x63\xc7\x86\xce\x63\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x86\xcc\x86\xcd\x63\xc4\x63\xc9\x63\xc6\x00\x00\x00\x00\x86\xcb\x00\x00\x65\x5b\x00\x00\x89\x69\x89\x67\x89\x6c\x89\x6a\x00\x00\x89\x68\x89\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x4c\x8b\x61\x8b\x62\x66\xe0\x00\x00\x8b\x63\x8b\x5f\x8b\x64\x8b\x60\x65\x5c\x00\x00\x00\x00\x00\x00\x8c\xec\x8c\xee\x66\xe3\x8c\xed\x66\xe2\x66\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x66\xe4\x8e\x74\x8e\x75\x00\x00\x67\x86\x67\x85\x67\x87\x8e\x73\x00\x00\x8f\x68\x8f\x67\x00\x00\x67\xd8\x67\xda\x67\xd9\x8f\x69\x68\x54\x90\xb5\x00\x00\x00\x00\x00\x00\x68\x7d\x00\x00\x90\xb4\x90\xfd\x00\x00\x00\x00\x69\x4a\x00\x00\x00\x00\x4d\x5f\x4d\x5e\x00\x00\x4d\xdf\x4d\xde\x69\xa7\x4d\xdd\x69\xa6\x00\x00\x00\x00\x4e\xda\x6a\x69\x00\x00\x6a\x68\x00\x00\x00\x00\x4e\xd8\x4e\xdb\x00\x00\x00\x00\x6a\x67\x00\x00\x4e\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x92\x00\x00\x6b\x93\x50\x76\x00\x00\x00\x00\x00\x00\x00\x00\x52\x6c", /* 5700 */ "\x00\x00\x6f\xca\x6f\xcb\x54\x89\x54\x8a\x00\x00\x00\x00\x72\xaf\x56\xcd\x56\xcf\x72\xae\x56\xce\x75\xe1\x59\x78\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xcf\x5b\xd0\x79\xa8\x00\x00\x5e\x57\x00\x00\x5e\x56\x00\x00\x80\x93\x83\xd2\x83\xd1\x00\x00\x91\x7c\x4c\x68\x69\x5a\x00\x00\x69\x6f\x69\x70\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe2\x4d\xe6\x69\xa9\x00\x00\x4d\xe4\x4d\xe3\x69\xa8\x4d\xe5\x4d\xe1\x00\x00\x00\x00\x4d\xe0\x69\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xe5\x00\x00\x00\x00\x4e\xe2\x00\x00\x4e\xde\x6a\x6a\x00\x00\x00\x00\x00\x00\x6a\x6b\x00\x00\x4e\xe0\x00\x00\x6a\x6d\x4e\xdc\x6a\x6e\x6a\x6c\x4e\xdf\x4e\xe1\x4e\xe4\x4e\xe3\x4e\xdd\x6a\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7b\x6b\xa0\x00\x00\x50\x7d\x00\x00\x50\x7c\x00\x00\x6b\xa1\x50\x7a\x50\x79\x6b\x97\x00\x00\x6b\x96\x00\x00\x6b\x94\x6b\x99\x6b\x98\x6b\x95\x6b\x9e\x6b\x9f\x6b\x9c\x6b\x9a\x50\x78\x00\x00\x00\x00\x00\x00\x6b\x9d\x50\x7e\x6b\xa2\x00\x00\x00\x00", /* 5780 */ "\x6b\x9b\x00\x00\x52\x6d\x50\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x6e\x6d\x76\x00\x00\x00\x00\x6d\x7c\x00\x00\x00\x00\x00\x00\x52\x74\x6d\x7a\x6d\x81\x00\x00\x6d\x77\x6d\x7b\x6d\x7d\x6d\x7f\x6d\x79\x00\x00\x6d\x78\x6d\x73\x6d\x74\x52\x6f\x00\x00\x52\x71\x52\x70\x6d\x75\x6d\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x72\x6f\xd5\x00\x00\x6f\xd4\x6f\xd9\x6f\xd0\x00\x00\x6f\xd3\x6f\xd2\x00\x00\x6f\xd6\x00\x00\x6f\xda\x54\x8b\x54\x8e\x00\x00\x00\x00\x6f\xd1\x6f\xd7\x00\x00\x00\x00\x00\x00\x54\x8d\x6f\xcc\x00\x00\x52\x72\x72\xbd\x6f\xd8\x00\x00\x6f\xcf\x00\x00\x54\x8c\x6f\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\xb4\x00\x00\x00\x00\x56\xd0\x56\xd4\x72\xc4\x72\xb2\x72\xc0\x56\xd5\x72\xc2\x00\x00\x72\xc8\x00\x00\x72\xcc\x00\x00\x00\x00\x72\xc3\x72\xb7\x72\xbf\x00\x00\x72\xcd\x72\xcb\x72\xc1\x72\xbc\x72\xb5\x75\xe9\x72\xb3\x56\xd9\x72\xba\x56\xda\x56\xd6\x72\xb0\x72\xc6\x72\xb8\x00\x00\x00\x00", /* 5800 */ "\x72\xb6\x72\xc9\x56\xd7\x00\x00\x72\xcf\x56\xd1\x56\xd3\x72\xbe\x72\xb9\x54\x8f\x56\xd2\x72\xbb\x72\xca\x72\xce\x72\xc5\x00\x00\x72\xc7\x00\x00\x00\x00\x00\x00\x72\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x75\xe4\x00\x00\x75\xed\x75\xec\x59\x81\x75\xe5\x00\x00\x59\x82\x59\x7f\x00\x00\x75\xe7\x59\x7c\x75\xeb\x00\x00\x75\xe6\x75\xe8\x75\xe2\x59\x7a\x00\x00\x75\xf5\x75\xf4\x75\xf1\x59\x79\x59\x7d\x59\x7e\x6f\xcd\x75\xee\x59\x7b\x56\xd8\x75\xf0\x75\xe3\x75\xf3\x75\xf2\x00\x00\x75\xf6\x00\x00\x79\xb6\x00\x00\x75\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xea\x79\xae\x5b\xda\x5b\xdd\x5b\xd8\x79\xad\x79\xb1\x79\xac\x00\x00\x5b\xd2\x5b\xdc\x79\xa9\x5b\xd6\x79\xb0\x00\x00\x5b\xd4\x5b\xd3\x79\xb3\x5b\xd5\x79\xb5\x00\x00\x79\xb2\x5b\xd1\x00\x00\x00\x00\x00\x00\x5b\xdb\x79\xb7\x79\xab\x79\xb4\x00\x00\x00\x00\x79\xaa\x00\x00\x00\x00\x5b\xd7\x00\x00\x5b\xd9\x00\x00\x79\xaf\x00\x00\x79\xb8\x00\x00\x00\x00\x7d\x66\x5e\x58\x7d\x6c\x00\x00\x00\x00\x5e\x5d\x7d\x68\x7d\x6f\x7d\x60\x5e\x5f\x5e\x59\x7d\x65", /* 5880 */ "\x60\x5e\x7d\x64\x7d\x6d\x5e\x5a\x00\x00\x5e\x5e\x7d\x63\x7d\x69\x7d\x6e\x7d\x5f\x5e\x5c\x7d\x67\x00\x00\x00\x00\x7d\x6b\x7d\x71\x7d\x61\x7d\x6a\x00\x00\x5e\x5b\x7d\x70\x00\x00\x00\x00\x00\x00\x7d\x62\x00\x00\x00\x00\x00\x00\x60\x62\x80\x95\x60\x60\x60\x5f\x80\x97\x80\x9c\x00\x00\x80\x98\x00\x00\x80\x9b\x60\x65\x00\x00\x62\x4e\x60\x64\x00\x00\x80\x94\x80\x9a\x00\x00\x60\x63\x80\x99\x00\x00\x80\x96\x00\x00\x60\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\xd7\x00\x00\x83\xd9\x83\xd4\x62\x6a\x83\xd6\x00\x00\x62\x69\x83\xd8\x00\x00\x00\x00\x62\x6c\x83\xda\x62\x6b\x83\xd3\x83\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x63\xcd\x86\xd7\x00\x00\x63\xcc\x86\xd8\x63\xcb\x86\xd6\x63\xca\x86\xd5\x00\x00\x65\x5e\x65\x5d\x8b\x65\x8b\x67\x00\x00\x8b\x66\x66\x4d\x66\x4e\x00\x00\x00\x00\x66\x4f\x8c\xef\x66\xe5\x00\x00\x00\x00\x90\x44\x90\x43\x68\x7e\x00\x00\x4c\x69\x4c\xb0\x00\x00\x00\x00\x4e\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x82\x00\x00\x00\x00\x00\x00\x00\x00\x59\x83\x59\x84\x00\x00\x79\xb9\x5e\x60\x7d\x72\x80\x9d", /* 5900 */ "\x00\x00\x00\x00\x00\x00\x69\x5b\x00\x00\x00\x00\x6a\x70\x00\x00\x00\x00\x00\x00\x48\x62\x00\x00\x6b\xa3\x6d\x83\x6f\xdb\x54\x90\x00\x00\x00\x00\x8b\x68\x00\x00\x67\x88\x4c\x6a\x4d\x60\x69\x71\x00\x00\x4d\xe7\x4d\xe8\x00\x00\x50\x7f\x00\x00\x00\x00\x00\x00\x56\xdb\x00\x00\x5e\x62\x00\x00\x5e\x63\x5e\x61\x00\x00\x4c\x6b\x00\x00\x4c\xb1\x4c\xb3\x4c\xb2\x69\x5c\x4c\xb4\x4d\x61\x69\x72\x00\x00\x4d\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xe9\x4d\xea\x00\x00\x00\x00\x00\x00\x69\xab\x00\x00\x4e\xe7\x00\x00\x6a\x71\x00\x00\x00\x00\x00\x00\x50\x84\x6b\xa4\x00\x00\x50\x82\x50\x83\x50\x81\x6f\xdc\x00\x00\x00\x00\x00\x00\x52\x78\x52\x77\x52\x79\x52\x76\x00\x00\x6d\x84\x50\x85\x52\x75\x00\x00\x54\x91\x54\x92\x00\x00\x54\x93\x00\x00\x72\xd0\x00\x00\x00\x00\x00\x00\x59\x85\x75\xf7\x56\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x5b\xde\x00\x00\x5e\x65\x5e\x64\x7d\x73\x00\x00\x60\x66\x62\x6d\x00\x00\x89\x6d\x8f\x6a\x90\x45\x4c\x6c\x4d\x63\x00\x00\x4d\x64\x69\xb1\x4d\xec\x4d\xef\x00\x00\x69\xaf\x69\xad\x4d\xee\x69\xb0\x69\xb2", /* 5980 */ "\x69\xac\x4d\xf1\x4d\xf0\x4d\xed\x4d\xeb\x69\xae\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xf2\x00\x00\x00\x00\x4e\xef\x6a\x76\x6a\x79\x6a\x78\x00\x00\x4e\xe9\x4e\xf1\x00\x00\x00\x00\x4e\xee\x6a\x75\x6a\x73\x4e\xed\x00\x00\x00\x00\x00\x00\x4e\xe8\x4e\xeb\x00\x00\x6a\x74\x6a\x7b\x6a\x77\x4e\xec\x4e\xf0\x4e\xf3\x6a\x72\x6a\x7a\x4e\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x8a\x50\x92\x00\x00\x6b\xb0\x6b\xa9\x50\x93\x6b\xb4\x6b\xa5\x6b\xac\x00\x00\x00\x00\x50\x89\x6b\xa6\x50\x87\x6b\xad\x6b\xb1\x50\x86\x00\x00\x6b\xb2\x6b\xab\x00\x00\x6b\xae\x00\x00\x50\x95\x50\x8c\x6b\xb5\x6b\xb3\x00\x00\x50\x91\x50\x8f\x6b\xaa\x50\x8e\x6b\xa8\x6b\xa7\x50\x8d\x50\x8b\x50\x94\x50\x90\x50\x88\x00\x00\x6b\xaf\x00\x00\x52\x7b\x00\x00\x52\x83\x6d\x92\x52\x7a\x6d\x8a\x6d\x86\x00\x00\x6d\x96\x6d\x85\x00\x00\x52\x7d\x6d\x8f\x52\x81\x52\x84\x00\x00\x52\x7e\x6d\x93\x52\x82\x00\x00\x54\x9a\x6d\x99\x6d\x87\x00\x00\x00\x00\x6d\x89\x6d\x90\x6d\x94\x6d\x98\x6d\x95\x6d\x8e\x6d\x91\x00\x00\x00\x00\x6d\x8b\x52\x86\x6d\x8d\x6d\x8c\x6d\x97\x52\x7c", /* 5a00 */ "\x6d\x88\x52\x85\x00\x00\x52\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xa0\x6f\xe4\x00\x00\x54\x9f\x00\x00\x00\x00\x6f\xe2\x00\x00\x54\x94\x00\x00\x54\x99\x00\x00\x6f\xe1\x6f\xde\x6f\xe3\x54\x95\x6f\xdd\x00\x00\x54\x98\x54\x96\x00\x00\x6f\xe5\x54\x97\x54\x9b\x00\x00\x00\x00\x54\x9c\x00\x00\x54\x9e\x00\x00\x00\x00\x00\x00\x54\x9d\x00\x00\x00\x00\x00\x00\x6f\xdf\x6f\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xe6\x00\x00\x72\xd7\x56\xdd\x76\x48\x72\xd6\x72\xe9\x00\x00\x00\x00\x56\xe3\x00\x00\x72\xe7\x00\x00\x56\xe2\x56\xde\x72\xf0\x72\xe0\x72\xe3\x00\x00\x56\xe6\x72\xed\x72\xe5\x56\xdf\x56\xe7\x00\x00\x72\xea\x72\xe8\x00\x00\x00\x00\x72\xd9\x72\xee\x72\xe2\x72\xdd\x00\x00\x72\xd3\x72\xef\x72\xdf\x72\xd2\x00\x00\x56\xe5\x72\xe4\x72\xf1\x72\xe1\x72\xd5\x72\xda\x72\xd1\x00\x00\x56\xe4\x00\x00\x72\xde\x72\xdb\x56\xe0\x72\xd4\x00\x00\x72\xec\x56\xe1\x00\x00\x72\xdc\x72\xd8\x00\x00\x00\x00\x72\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x86\x76\x41\x00\x00\x75\xfb\x76\x4f\x76\x43\x76\x50\x00\x00\x59\x88", /* 5a80 */ "\x00\x00\x00\x00\x00\x00\x76\x4c\x76\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x4a\x76\x4d\x76\x51\x00\x00\x72\xe6\x76\x53\x79\xcd\x00\x00\x59\x89\x76\x54\x75\xf9\x76\x46\x00\x00\x76\x4b\x00\x00\x00\x00\x59\x87\x59\x8a\x76\x52\x76\x55\x75\xfd\x75\xfa\x00\x00\x00\x00\x75\xfc\x00\x00\x00\x00\x76\x44\x76\x42\x59\x8b\x00\x00\x76\x4e\x00\x00\x00\x00\x76\x45\x00\x00\x76\x47\x75\xf8\x79\xc1\x79\xbf\x5b\xe7\x5b\xe5\x79\xc9\x79\xc0\x79\xca\x79\xc6\x79\xbe\x79\xcc\x79\xbd\x79\xc4\x5b\xe4\x5b\xe3\x5b\xe2\x79\xc2\x79\xc7\x5b\xdf\x5b\xe6\x00\x00\x79\xbb\x00\x00\x79\xc5\x79\xba\x79\xc3\x5b\xe0\x79\xc8\x79\xbc\x5b\xe1\x79\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x77\x5e\x6a\x5e\x69\x5e\x6b\x7d\x84\x7d\x79\x7d\x7f\x7d\x74\x7d\x83\x7d\x82\x7d\x86\x7d\x7e\x5e\x66\x7d\x7d\x5e\x6c\x00\x00\x7d\x76\x5e\x67\x00\x00\x7d\x85\x5e\x68\x7d\x78\x7d\x7b\x7d\x81\x7d\x7a\x7d\x75\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x7c\x80\x9f\x60\x6a\x80\xa2\x80\xa1\x80\xa4\x80\xa6\x00\x00\x60\x68\x00\x00\x80\xa0\x00\x00\x80\x9e", /* 5b00 */ "\x00\x00\x80\xa7\x80\xa5\x80\xa3\x00\x00\x80\xa9\x00\x00\x80\xa8\x60\x6c\x60\x67\x00\x00\x60\x69\x60\x6b\x00\x00\x00\x00\x80\xaa\x83\xe1\x00\x00\x00\x00\x83\xe0\x83\xdf\x00\x00\x83\xe2\x83\xdb\x00\x00\x83\xdc\x83\xe4\x83\xdd\x00\x00\x62\x6e\x83\xe6\x00\x00\x83\xe5\x83\xde\x00\x00\x86\xdc\x63\xd0\x86\xda\x86\xdf\x86\xde\x83\xe3\x00\x00\x63\xcf\x00\x00\x86\xdd\x86\xd9\x86\xe1\x86\xe0\x63\xce\x00\x00\x86\xdb\x00\x00\x62\x6f\x00\x00\x00\x00\x00\x00\x65\x5f\x00\x00\x00\x00\x00\x00\x89\x6e\x8b\x69\x8b\x6a\x8b\x6b\x66\xe6\x00\x00\x00\x00\x66\xe7\x00\x00\x8c\xf0\x00\x00\x8e\x77\x8e\x76\x00\x00\x00\x00\x8f\x6b\x8f\x6c\x90\x46\x90\xb6\x00\x00\x4c\x6d\x4c\x6e\x00\x00\x4c\x6f\x4c\xb5\x4d\x65\x69\xb3\x4d\xf2\x4d\xf3\x00\x00\x4e\xf6\x4e\xf7\x4e\xf5\x4e\xf4\x00\x00\x50\x96\x00\x00\x00\x00\x6b\xb6\x50\x98\x50\x97\x6b\xb7\x00\x00\x00\x00\x00\x00\x52\x87\x00\x00\x54\xa1\x6f\xe7\x00\x00\x72\xf3\x00\x00\x56\xe8\x59\x8d\x72\xf2\x59\x8c\x00\x00\x5e\x6d\x00\x00\x7d\x87\x62\x70\x00\x00\x63\xd1\x86\xe2\x00\x00\x66\xe8\x00\x00\x67\xdb", /* 5b80 */ "\x48\x67\x69\x73\x00\x00\x4d\x66\x69\x74\x4d\xf6\x00\x00\x4d\xf4\x4d\xf5\x4d\xf7\x00\x00\x4e\xf9\x4e\xf8\x00\x00\x6a\x7c\x4e\xfa\x00\x00\x00\x00\x6a\x7d\x6b\xb8\x00\x00\x6b\xb9\x00\x00\x50\x99\x50\x9b\x50\x9d\x50\x9a\x50\x9e\x50\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x8b\x52\x88\x52\x8a\x52\x8c\x52\x89\x6f\xe8\x6d\x9a\x00\x00\x00\x00\x00\x00\x6f\xea\x6f\xe9\x54\xa7\x00\x00\x54\xa3\x00\x00\x00\x00\x54\xa4\x54\xa6\x54\xa8\x54\xa5\x00\x00\x54\xaa\x54\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xed\x72\xf5\x72\xf4\x56\xec\x00\x00\x56\xeb\x56\xea\x56\xee\x56\xe9\x00\x00\x00\x00\x76\x5b\x76\x58\x59\x8f\x76\x57\x76\x5c\x00\x00\x59\x91\x76\x5a\x59\x8e\x59\x90\x76\x59\x00\x00\x79\xce\x00\x00\x79\xcf\x79\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6e\x5e\x76\x7d\x88\x5e\x70\x5e\x74\x7d\x89\x5e\x75\x5e\x71\x5e\x72\x5e\x6f\x5e\x73\x60\x6f\x76\x56\x60\x70\x60\x6e\x00\x00\x60\x6d\x83\xe7\x62\x71\x86\xe3\x86\xe4\x00\x00\x00\x00\x66\x50\x66\xe9\x00\x00\x4c\x70\x00\x00\x4d\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5c00 */ "\x00\x00\x52\x8d\x00\x00\x6f\xeb\x54\xab\x00\x00\x00\x00\x56\xf1\x56\xf0\x56\xef\x59\x92\x59\x93\x76\x5d\x5e\x77\x62\x72\x4c\x71\x69\x5d\x4c\xb6\x69\x75\x00\x00\x00\x00\x69\xb4\x4d\xf9\x00\x00\x00\x00\x00\x00\x50\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x79\xd1\x00\x00\x00\x00\x4c\x72\x00\x00\x4c\xb7\x69\xb5\x00\x00\x00\x00\x6a\x7e\x00\x00\x6a\x7f\x00\x00\x4e\xfb\x00\x00\x00\x00\x00\x00\x76\x5e\x59\x94\x00\x00\x79\xd2\x00\x00\x00\x00\x00\x00\x63\xd2\x4c\x73\x4c\x88\x4c\xb8\x69\x76\x4d\x67\x00\x00\x4f\x42\x4f\x41\x4e\xfc\x4e\xfd\x00\x00\x00\x00\x6b\xba\x50\xa1\x50\xa2\x6b\xbb\x50\xa0\x00\x00\x00\x00\x52\x91\x6d\x9b\x52\x90\x52\x8e\x52\x8f\x54\xae\x54\xac\x00\x00\x00\x00\x6f\xed\x54\xad\x6f\xec\x00\x00\x54\xa2\x72\xf6\x00\x00\x00\x00\x56\xf3\x56\xf4\x00\x00\x00\x00\x56\xf2\x00\x00\x5e\x78\x7d\x8a\x60\x71\x60\x72\x00\x00\x80\xab\x63\xd3\x89\x6f\x89\x70\x00\x00\x67\x89\x90\xb7\x69\x4c\x4c\xb9\x00\x00\x4c\x74\x00\x00\x69\x78\x69\x77\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xfa\x69\xb7\x69\xb8\x69\xb6\x00\x00\x69\xb9\x00\x00", /* 5c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x88\x00\x00\x6a\x83\x6a\x85\x6a\x87\x6a\x84\x4f\x46\x6a\x81\x00\x00\x6a\x82\x4f\x43\x4f\x44\x6a\x86\x6a\x89\x4f\x45\x6a\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xc9\x00\x00\x6b\xc3\x6b\xbe\x50\xa4\x6b\xc6\x6b\xc4\x6b\xbd\x6b\xca\x6b\xcd\x6b\xc8\x6b\xc1\x50\xa6\x6b\xc7\x50\xa7\x6b\xc2\x6b\xc5\x6b\xbc\x6b\xc0\x6b\xcc\x50\xa8\x00\x00\x50\xa9\x00\x00\x6b\xbf\x6b\xcb\x50\xa3\x50\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\xac\x6d\xa5\x6d\xab\x6d\xa4\x6d\xa6\x6d\xa0\x6d\x9e\x00\x00\x6d\xad\x6d\xaa\x6d\x9c\x00\x00\x52\x93\x6d\xa8\x6d\xa9\x00\x00\x6d\xa7\x6d\x9f\x6d\x9d\x52\x92\x6d\xa3\x6d\xa1\x00\x00\x00\x00\x6d\xa2\x6d\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xb3\x00\x00\x54\xb2\x00\x00\x6f\xee\x54\xaf\x6f\xf0\x00\x00\x54\xb4\x6f\xf1\x00\x00\x00\x00\x54\xb7\x00\x00\x54\xb5\x6f\xf2\x6d\xaf\x6f\xf4\x00\x00\x54\xb1\x00\x00\x54\xb0\x00\x00\x6f\xef", /* 5d00 */ "\x6f\xf3\x54\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x56\xf6\x56\xf5\x00\x00\x00\x00\x00\x00\x72\xf8\x72\xfc\x73\x41\x56\xf7\x73\x44\x00\x00\x56\xfb\x73\x46\x00\x00\x56\xfd\x00\x00\x56\xf9\x57\x44\x00\x00\x57\x41\x72\xfa\x56\xf8\x00\x00\x72\xf9\x72\xf7\x73\x48\x72\xfb\x00\x00\x56\xfa\x73\x47\x57\x42\x73\x43\x73\x42\x57\x43\x72\xfd\x56\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x73\x49\x00\x00\x73\x45\x76\x6d\x76\x74\x76\x69\x59\x97\x76\x65\x76\x75\x76\x5f\x76\x72\x76\x70\x76\x6a\x00\x00\x76\x73\x76\x6c\x00\x00\x76\x64\x76\x76\x76\x62\x76\x6f\x76\x60\x00\x00\x76\x77\x00\x00\x59\x98\x00\x00\x76\x71\x79\xd5\x76\x63\x59\x95\x00\x00\x76\x67\x00\x00\x59\x96\x76\x66\x76\x6b\x00\x00\x00\x00\x76\x68\x00\x00\x00\x00\x00\x00\x76\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x79\xd9\x00\x00\x00\x00\x00\x00\x79\xdc\x79\xd4\x00\x00\x79\xd6\x00\x00\x79\xdb\x79\xda\x5b\xe8\x00\x00\x76\x61\x79\xd8\x00\x00\x00\x00\x5b\xe9\x00\x00\x79\xd3\x79\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x91\x00\x00\x7d\x98\x7d\x8f\x00\x00\x7d\x96\x7d\x8d\x7d\x95\x7d\x99", /* 5d80 */ "\x7d\x8c\x7d\x90\x7d\x8b\x00\x00\x5e\x79\x00\x00\x7d\x8e\x5e\x7a\x7d\x94\x7d\x93\x7d\x92\x00\x00\x00\x00\x7d\x97\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaf\x80\xb1\x60\x74\x80\xb2\x00\x00\x80\xad\x00\x00\x80\xac\x80\xb6\x00\x00\x80\xb4\x60\x73\x80\xb7\x80\xae\x80\xb3\x80\xb5\x80\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x83\xeb\x83\xf0\x83\xea\x83\xef\x00\x00\x83\xe8\x83\xf2\x83\xee\x83\xf3\x83\xed\x83\xe9\x83\xf1\x00\x00\x83\xf4\x83\xec\x00\x00\x86\xe5\x63\xd7\x00\x00\x63\xd5\x00\x00\x63\xd4\x63\xd6\x00\x00\x00\x00\x89\x71\x00\x00\x8a\xc0\x8b\x6c\x00\x00\x00\x00\x8c\xf1\x8c\xf2\x00\x00\x66\xea\x00\x00\x8e\x78\x00\x00\x67\x8a\x00\x00\x8e\x79\x00\x00\x8f\x6e\x67\xdd\x00\x00\x67\xdc\x8f\x6d\x68\x55\x00\x00\x90\x47\x00\x00\x00\x00\x48\x6e\x00\x00\x4c\x75\x4d\xfb\x69\xba\x6a\x8b\x4f\xd5\x57\x45\x00\x00\x00\x00\x4c\x76\x4d\x6a\x4d\x69\x4d\x68\x00\x00\x00\x00\x4f\x47\x00\x00\x00\x00\x54\xb8\x00\x00\x79\xdd\x4c\x77\x4c\x78\x4c\x79\x4c\xba\x00\x00\x00\x00\x52\x94\x00\x00\x6d\xb0\x00\x00\x00\x00\x00\x00\x59\x99\x4c\x7a\x69\x5e", /* 5e00 */ "\x00\x00\x00\x00\x4d\x6b\x4d\x6c\x69\x79\x00\x00\x4d\xfc\x00\x00\x00\x00\x00\x00\x6a\x8c\x00\x00\x4f\x48\x00\x00\x6a\x8d\x00\x00\x00\x00\x50\xaf\x00\x00\x00\x00\x6b\xcf\x50\xad\x50\xac\x6b\xce\x50\xaa\x6b\xd0\x50\xab\x50\xae\x00\x00\x52\x95\x00\x00\x52\x97\x6d\xb4\x6d\xb1\x6d\xb2\x6d\xb3\x6d\xb5\x52\x96\x00\x00\x00\x00\x6f\xf6\x6f\xf5\x00\x00\x54\xba\x00\x00\x54\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x48\x73\x4b\x00\x00\x57\x47\x57\x49\x57\x46\x00\x00\x00\x00\x00\x00\x00\x00\x59\x9b\x73\x4a\x00\x00\x59\x9c\x76\x79\x00\x00\x59\x9d\x76\x78\x59\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x79\xe0\x79\xe2\x5b\xea\x79\xe1\x79\xdf\x79\xde\x00\x00\x00\x00\x00\x00\x7d\x9c\x5e\x7f\x5e\x7d\x00\x00\x5e\x7e\x7d\x9a\x7d\x9b\x00\x00\x5e\x7b\x80\xbb\x80\xb9\x00\x00\x60\x76\x80\xba\x60\x77\x60\x75\x5e\x7c\x00\x00\x00\x00\x83\xf7\x83\xf5\x83\xf6\x80\xb8\x86\xe7\x63\xd8\x86\xe6\x89\x72\x89\x73\x83\xf8\x8b\x6d\x00\x00\x4c\x7b\x4d\x6d\x4e\x41\x69\xbb\x4d\xfd\x00\x00\x50\xb0\x5b\xeb\x48\x73\x4c\xbb\x4d\x6e\x52\x98\x59\x9e\x48\x74", /* 5e80 */ "\x69\x7a\x00\x00\x69\x7b\x00\x00\x69\xbc\x00\x00\x00\x00\x4f\x4a\x6a\x91\x6a\x8f\x4f\x4b\x6a\x8e\x6a\x90\x6a\x92\x00\x00\x4f\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xb4\x50\xb5\x50\xb2\x00\x00\x00\x00\x50\xb1\x6d\xb9\x50\xb3\x00\x00\x00\x00\x00\x00\x52\x99\x00\x00\x6d\xb8\x6d\xba\x6d\xb7\x6d\xbb\x52\x9a\x54\xbd\x6f\xf7\x00\x00\x6f\xf9\x54\xbb\x6f\xfa\x54\xbc\x6f\xf8\x00\x00\x6d\xb6\x73\x4c\x73\x4f\x73\x50\x73\x4d\x57\x4d\x57\x4c\x57\x4a\x57\x4b\x73\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x57\x4e\x00\x00\x00\x00\x59\xa0\x59\xa1\x00\x00\x59\xa2\x79\xe3\x79\xe5\x79\xe7\x5b\xed\x5b\xec\x59\x9f\x79\xe6\x79\xe4\x00\x00\x7d\xa0\x00\x00\x00\x00\x7d\x9e\x7d\xa4\x5e\x81\x7d\xa5\x7d\xa2\x5e\x82\x7d\x9f\x7d\x9d\x7d\xa3\x60\x79\x80\xbd\x7d\xa1\x60\x7b\x80\xbe\x60\x7a\x60\x7d\x80\xbf\x60\x78\x60\x7c\x00\x00\x83\xfd\x83\xfb\x83\xfa\x83\xfc\x83\xf9\x00\x00\x00\x00\x66\x52\x00\x00\x8c\xf3\x8c\xf4\x00\x00\x8e\x7a\x8f\x6f\x68\xa1\x48\x75\x00\x00\x50\xb6\x4f\x4c\x00\x00\x00\x00\x52\x9b\x00\x00\x00\x00\x00\x00\x4c\x7c\x4c\xbc", /* 5f00 */ "\x00\x00\x4d\x6f\x69\xbd\x00\x00\x4f\x4d\x6a\x93\x00\x00\x6d\xbc\x52\x9c\x00\x00\x5e\x83\x4c\x7d\x00\x00\x00\x00\x00\x00\x4e\x42\x00\x00\x00\x00\x5b\xee\x4c\x7e\x4c\xbd\x4c\xbe\x00\x00\x4d\x71\x4d\x70\x00\x00\x69\xbe\x4e\x43\x00\x00\x6a\x94\x00\x00\x4f\x4e\x00\x00\x00\x00\x6b\xd2\x6b\xd3\x6b\xd4\x00\x00\x50\xb7\x50\xb8\x6b\xd1\x50\xb9\x00\x00\x00\x00\x00\x00\x52\x9d\x6d\xbd\x00\x00\x6f\xfc\x54\xbe\x00\x00\x6f\xfb\x00\x00\x57\x4f\x73\x51\x57\x50\x73\x52\x00\x00\x00\x00\x00\x00\x59\xa3\x00\x00\x00\x00\x00\x00\x79\xe8\x00\x00\x00\x00\x7d\xa7\x7d\xa6\x00\x00\x5e\x84\x00\x00\x60\x7e\x80\xc0\x62\x73\x84\x41\x63\xd9\x00\x00\x67\xde\x90\x49\x48\x79\x00\x00\x00\x00\x00\x00\x6b\xd5\x00\x00\x6d\xbe\x57\x51\x76\x7a\x5b\xef\x00\x00\x00\x00\x00\x00\x65\x60\x65\x60\x00\x00\x00\x00\x48\x7a\x4f\x50\x00\x00\x4f\x4f\x52\x9e\x00\x00\x6f\xfd\x00\x00\x57\x53\x58\xa8\x57\x54\x57\x52\x59\xa4\x00\x00\x7d\xa8\x5e\x85\x60\x7f\x00\x00\x69\x4d\x69\xbf\x00\x00\x6a\x96\x4f\x51\x6a\x95\x4f\x52\x00\x00\x00\x00\x50\xbd\x6b\xd8\x6b\xd7\x50\xbc", /* 5f80 */ "\x50\xba\x50\xbb\x6b\xd6\x00\x00\x00\x00\x52\xa0\x6d\xbf\x52\xa3\x52\x9f\x52\xa5\x52\xa1\x52\xa2\x52\xa4\x00\x00\x00\x00\x00\x00\x54\xc1\x54\xc0\x54\xbf\x00\x00\x00\x00\x00\x00\x73\x54\x57\x55\x57\x58\x57\x56\x00\x00\x73\x53\x57\x5b\x00\x00\x57\x57\x73\x55\x57\x5a\x57\x59\x00\x00\x00\x00\x00\x00\x76\x7c\x76\x7b\x00\x00\x59\xa7\x59\xa5\x59\xa6\x76\x7d\x5b\xf0\x79\xea\x5b\xf1\x79\xe9\x00\x00\x00\x00\x80\xc1\x00\x00\x00\x00\x60\x82\x7d\xa9\x60\x81\x00\x00\x5e\x86\x00\x00\x86\xe9\x84\x42\x63\xda\x86\xe8\x8b\x6e\x8c\xf5\x8c\xf6\x00\x00\x4c\xbf\x00\x00\x4d\x72\x00\x00\x00\x00\x00\x00\x69\x7c\x00\x00\x00\x00\x4f\x54\x4f\x56\x00\x00\x69\xc2\x6a\x99\x6a\x98\x6a\x97\x00\x00\x69\xc1\x69\xc0\x4e\x45\x4f\x55\x4f\x53\x4e\x44\x00\x00\x00\x00\x00\x00\x50\xbe\x6b\xd9\x00\x00\x50\xbf\x6a\x9e\x00\x00\x6a\xa0\x6a\x9f\x6b\xda\x00\x00\x00\x00\x6a\x9b\x00\x00\x4f\x5a\x4f\x58\x00\x00\x6a\x9a\x6a\x9c\x6a\xa2\x00\x00\x4f\x57\x00\x00\x6a\x9d\x6a\xa6\x50\xc1\x00\x00\x6a\xa3\x4f\x59\x00\x00\x6a\xa1\x6a\xa4\x00\x00\x50\xc0\x00\x00\x50\xc2", /* 6000 */ "\x6a\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xee\x6b\xe1\x6b\xdf\x6b\xed\x6b\xe8\x52\xaa\x50\xc3\x6b\xe9\x6b\xec\x52\xa6\x6b\xeb\x50\xc4\x50\xc9\x50\xc7\x6b\xe2\x00\x00\x6b\xdd\x6b\xe4\x50\xce\x6b\xef\x52\xa7\x6b\xe5\x00\x00\x52\xa8\x50\xca\x6b\xe7\x00\x00\x6d\xce\x52\xa9\x6b\xdc\x50\xcb\x52\xab\x50\xcc\x50\xc8\x50\xcd\x6b\xe6\x6b\xdb\x6b\xea\x50\xc5\x00\x00\x00\x00\x6b\xde\x6b\xe3\x6b\xe0\x50\xc6\x00\x00\x6d\xc0\x00\x00\x6d\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\xcb\x70\x44\x6d\xcc\x52\xb1\x6d\xcf\x6d\xc5\x52\xb0\x6d\xc7\x00\x00\x6d\xc8\x00\x00\x00\x00\x6d\xca\x52\xac\x00\x00\x00\x00\x54\xc5\x00\x00\x00\x00\x6d\xc6\x6d\xc2\x54\xc6\x00\x00\x00\x00\x6d\xd0\x54\xc2\x70\x42\x6d\xc9\x00\x00\x70\x41\x6d\xc4\x6d\xcd\x00\x00\x00\x00\x52\xaf\x54\xc3\x52\xb5\x54\xc4\x6d\xd1\x70\x43\x52\xae\x54\xc8\x52\xb4\x52\xb3\x52\xb2\x54\xc7\x6d\xd2\x54\xc9\x52\xad\x00\x00\x6d\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x5c", /* 6080 */ "\x70\x47\x70\x49\x00\x00\x70\x4b\x54\xca\x54\xd0\x73\x58\x70\x4f\x70\x46\x57\x5e\x73\x56\x00\x00\x54\xcf\x54\xcd\x70\x51\x00\x00\x73\x57\x00\x00\x70\x48\x00\x00\x54\xce\x70\x4c\x54\xd1\x70\x4e\x00\x00\x00\x00\x54\xcc\x70\x4d\x70\x50\x70\x4a\x00\x00\x54\xcb\x57\x5f\x00\x00\x70\x45\x57\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x57\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x5a\x73\x63\x59\xaa\x00\x00\x57\x62\x57\x67\x59\xab\x73\x65\x57\x6e\x76\x7f\x73\x5b\x57\x66\x57\x69\x57\x64\x73\x59\x73\x67\x73\x6a\x76\x8f\x00\x00\x73\x68\x76\x84\x57\x65\x57\x6c\x57\x70\x73\x62\x76\x7e\x73\x66\x57\x61\x76\x81\x73\x69\x76\x83\x73\x5e\x00\x00\x59\xa8\x00\x00\x73\x5c\x73\x5d\x57\x6b\x00\x00\x00\x00\x57\x6a\x73\x60\x57\x6f\x73\x64\x57\x68\x73\x61\x00\x00\x57\x6d\x59\xac\x59\xa9\x76\x82\x00\x00\x73\x5f\x00\x00\x57\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xb1\x59\xb5\x76\x86\x5b\xf6\x59\xb3\x76\x8a\x59\xb7\x79\xeb\x76\x8c\x5b\xf8\x59\xaf\x59\xb2\x76\x8d\x00\x00\x76\x8e\x76\x94", /* 6100 */ "\x59\xb9\x5b\xf9\x00\x00\x76\x90\x76\x95\x76\x89\x5c\x46\x00\x00\x5b\xfa\x59\xb8\x76\x87\x76\x96\x00\x00\x5c\x45\x59\xb6\x5b\xf3\x76\x93\x00\x00\x59\xba\x76\x8b\x76\x85\x59\xb0\x76\x88\x00\x00\x76\x91\x00\x00\x5b\xf2\x5b\xf7\x59\xad\x76\x92\x00\x00\x5b\xf5\x00\x00\x00\x00\x00\x00\x59\xae\x00\x00\x00\x00\x00\x00\x5c\x44\x7d\xab\x79\xf6\x00\x00\x79\xee\x7d\xaa\x00\x00\x79\xf2\x79\xf4\x00\x00\x00\x00\x79\xf1\x00\x00\x5c\x43\x00\x00\x79\xf0\x5c\x47\x00\x00\x00\x00\x00\x00\x7d\xba\x00\x00\x00\x00\x5c\x42\x5e\x88\x79\xf7\x7d\xac\x00\x00\x00\x00\x5b\xfd\x79\xef\x79\xf3\x5e\x87\x5b\xf4\x79\xec\x79\xed\x5e\x89\x5b\xfc\x5c\x41\x5b\xfb\x79\xf5\x00\x00\x00\x00\x7d\xb0\x7d\xb1\x7d\xb6\x60\x87\x7d\xbd\x00\x00\x5e\x8f\x00\x00\x5e\x8e\x7d\xb8\x00\x00\x60\x86\x7d\xad\x5e\x8d\x00\x00\x7d\xbc\x5e\x8b\x5e\x8c\x00\x00\x7d\xb9\x80\xd2\x60\x84\x59\xb4\x00\x00\x7d\xbb\x60\x8b\x7d\xb3\x00\x00\x60\x85\x00\x00\x60\x8a\x7d\xae\x7d\xb2\x7d\xaf\x7d\xb5\x5e\x90\x60\x83\x5e\x8a\x00\x00\x80\xc4\x7d\xb7\x00\x00\x60\x89\x00\x00\x60\x8c\x00\x00", /* 6180 */ "\x7d\xb4\x00\x00\x60\x88\x80\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc8\x62\x77\x80\xc2\x84\x4e\x80\xd1\x60\x90\x00\x00\x60\x8e\x62\x75\x80\xce\x80\xca\x60\x94\x00\x00\x84\x45\x00\x00\x00\x00\x00\x00\x60\x92\x80\xc9\x00\x00\x84\x43\x00\x00\x80\xcd\x00\x00\x80\xd0\x80\xc7\x00\x00\x60\x93\x00\x00\x00\x00\x60\x8d\x84\x44\x62\x76\x80\xcf\x60\x8f\x60\x91\x80\xcc\x60\x95\x80\xcb\x80\xc6\x80\xc5\x62\x74\x80\xd3\x84\x47\x86\xeb\x62\x79\x00\x00\x84\x4d\x00\x00\x84\x4b\x00\x00\x86\xec\x00\x00\x62\x7a\x84\x4c\x00\x00\x84\x49\x63\xdc\x86\xea\x00\x00\x84\x46\x84\x48\x63\xdd\x62\x7c\x63\xdb\x62\x7b\x63\xdf\x84\x4a\x62\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x7c\x00\x00\x89\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\xf2\x89\x75\x86\xee\x00\x00\x00\x00\x65\x61\x86\xf0\x86\xef\x63\xde\x86\xed\x86\xf1\x89\x7d\x89\x79\x89\x7b\x00\x00\x89\x76\x89\x77\x00\x00\x89\x7a\x89\x78\x66\x53\x00\x00\x00\x00\x66\x56\x66\x55\x66\x54\x66\xeb\x8c\xf7\x66\xec\x8b\x6f\x67\x8b\x8e\x7b\x67\x8c\x67\xdf", /* 6200 */ "\x68\x56\x90\x4a\x00\x00\x90\x4b\x90\x4c\x00\x00\x00\x00\x91\xaa\x4c\xc0\x69\x7d\x4d\x73\x00\x00\x4e\x47\x4e\x48\x4e\x46\x00\x00\x4e\x49\x4f\x5c\x4f\x5b\x00\x00\x6b\xf0\x50\xd0\x50\xcf\x00\x00\x00\x00\x70\x52\x57\x71\x57\x72\x00\x00\x00\x00\x00\x00\x59\xbb\x79\xf8\x5c\x48\x5c\x49\x79\xfa\x79\xfc\x79\xfb\x00\x00\x7d\xbf\x00\x00\x7d\xbe\x5e\x91\x7d\xc0\x00\x00\x80\xd4\x60\x96\x00\x00\x62\x7d\x00\x00\x63\xe0\x65\x62\x63\xe1\x00\x00\x4c\xc1\x00\x00\x00\x00\x00\x00\x6a\xa7\x00\x00\x00\x00\x6b\xf1\x50\xd2\x50\xd1\x50\xd3\x52\xb6\x6d\xd3\x6d\xd4\x00\x00\x00\x00\x70\x53\x54\xd2\x57\x73\x59\xbc\x76\x97\x4c\xc2\x00\x00\x4c\x7f\x4c\xc3\x00\x00\x69\x7e\x4d\x77\x4d\x76\x4d\x74\x4d\x75\x00\x00\x00\x00\x00\x00\x4e\x4c\x69\xca\x69\xcc\x4e\x4b\x69\xc4\x00\x00\x69\xc5\x00\x00\x69\xcb\x69\xc7\x69\xc9\x4e\x4a\x69\xc6\x69\xc3\x69\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x63\x4f\x6c\x4f\x6a\x6a\xb1\x6a\xae\x6a\xb6\x4f\x68\x6a\xb7\x00\x00\x4f\x61\x6a\xb4\x00\x00\x4f\x67\x6a\xb0\x6a\xaf\x4f\x65\x6a\xb5\x4f\x66\x50\xd4", /* 6280 */ "\x4f\x60\x6a\xb2\x00\x00\x6a\xa8\x4f\x5d\x00\x00\x4f\x70\x6a\xad\x6a\xb3\x4f\x62\x4f\x64\x00\x00\x6a\xa9\x00\x00\x6a\xaa\x6a\xab\x00\x00\x4f\x6f\x4f\x69\x4f\x6e\x6a\xac\x4f\x6d\x4f\x5f\x4f\x5e\x4f\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xe2\x6b\xfd\x6b\xf6\x50\xdd\x50\xf0\x6b\xf2\x6b\xf9\x6b\xfb\x6c\x41\x50\xeb\x00\x00\x6b\xfa\x6b\xf3\x50\xe9\x6b\xf7\x00\x00\x6c\x42\x50\xda\x00\x00\x6b\xfc\x50\xe4\x50\xe3\x6b\xf5\x50\xd8\x00\x00\x00\x00\x50\xd9\x00\x00\x50\xd7\x00\x00\x50\xef\x50\xe7\x50\xe1\x50\xd5\x6b\xf8\x50\xe0\x50\xd6\x50\xe8\x50\xf1\x6d\xd5\x50\xe5\x6b\xf4\x50\xdb\x50\xde\x50\xdf\x00\x00\x50\xed\x50\xee\x50\xec\x50\xe6\x50\xea\x50\xdc\x52\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\xdb\x52\xc3\x52\xbb\x52\xbd\x52\xc2\x6d\xe7\x52\xc0\x70\x54\x54\xd3\x52\xc5\x6d\xd8\x6d\xe0\x52\xc1\x6d\xdf\x6d\xdc\x6d\xe4\x6d\xe6\x52\xba\x52\xbe\x52\xc4\x54\xd5", /* 6300 */ "\x6d\xe1\x52\xbc\x52\xc7\x6d\xda\x00\x00\x00\x00\x00\x00\x52\xbf\x54\xd4\x52\xb9\x00\x00\x6d\xd7\x6d\xde\x6d\xd6\x6d\xd9\x6d\xdd\x70\x55\x52\xc6\x00\x00\x6d\xe2\x6d\xe3\x6d\xe5\x52\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xe3\x70\x61\x54\xe1\x54\xe2\x70\x57\x70\x67\x00\x00\x54\xd8\x00\x00\x00\x00\x73\x6b\x70\x69\x70\x63\x00\x00\x70\x5a\x00\x00\x70\x6c\x70\x5d\x54\xde\x73\x83\x70\x60\x54\xe0\x54\xd7\x00\x00\x70\x6e\x70\x62\x54\xda\x70\x5b\x70\x58\x70\x59\x54\xdb\x70\x68\x70\x6f\x54\xdd\x70\x5f\x70\x5e\x54\xe5\x54\xe4\x54\xd6\x54\xdc\x54\xdf\x70\x6b\x00\x00\x00\x00\x70\x65\x54\xd9\x70\x56\x70\x6d\x70\x64\x70\x66\x70\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x6c\x00\x00\x57\x7b\x57\x90\x57\x8f\x00\x00\x57\x84\x00\x00\x73\x7e\x73\x7a\x73\x77\x73\x8a\x57\x7e\x57\x76\x00\x00\x00\x00\x73\x7c\x59\xcc\x57\x7a\x73\x85\x00\x00\x57\x91\x57\x8e\x73\x81\x73\x6f\x00\x00\x00\x00", /* 6380 */ "\x57\x8d\x73\x87\x73\x6e\x57\x82\x57\x86\x73\x86\x00\x00\x73\x78\x57\x87\x57\x81\x73\x6d\x00\x00\x59\xbe\x73\x89\x73\x76\x57\x8c\x73\x79\x73\x88\x57\x8b\x00\x00\x76\x98\x00\x00\x57\x77\x73\x74\x57\x7c\x57\x88\x00\x00\x57\x83\x73\x7d\x73\x73\x73\x71\x73\x84\x57\x74\x57\x89\x57\x78\x59\xbd\x73\x82\x57\x79\x00\x00\x57\x75\x57\x85\x57\x7f\x57\x7d\x73\x75\x57\x8a\x73\x72\x73\x7f\x73\x7b\x76\x9a\x76\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x70\x76\xaa\x00\x00\x59\xc0\x00\x00\x76\xb0\x76\x9f\x76\xad\x79\xfd\x59\xc3\x76\xb1\x76\xb4\x59\xc2\x76\xa2\x76\xb3\x76\xb2\x59\xc4\x76\x9b\x59\xbf\x59\xc7\x00\x00\x59\xc5\x76\xaf\x00\x00\x76\xa5\x59\xc9\x76\xb6\x76\xae\x76\xb7\x59\xd1\x59\xcf\x76\xac\x76\xab\x00\x00\x76\xa9\x76\xa3\x59\xc8\x00\x00\x59\xc6\x70\x5c\x76\x9c\x00\x00\x7a\x5e\x76\x9d\x59\xc1\x59\xce\x7a\x42\x00\x00\x59\xca\x59\xcb\x76\x9e\x76\xb5\x7a\x41\x76\xa6\x76\xa1\x59\xcd\x76\xa7\x76\xa4\x00\x00\x00\x00\x59\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x58\x00\x00\x00\x00\x7a\x45\x7a\x58\x7a\x5d\x7a\x51\x5c\x54\x7a\x62\x5c\x51\x7a\x43\x00\x00\x7a\x44\x5c\x4a\x5c\x53\x7a\x4b\x5c\x56\x5c\x57\x7a\x4c\x00\x00\x7a\x59\x7a\x5f\x5c\x52\x00\x00\x5c\x4c\x7a\x4a\x7a\x46\x7a\x61\x7a\x4f\x7a\x50\x7a\x47\x7a\x5b\x7a\x52\x7a\x5c\x7a\x54\x00\x00\x5c\x4d\x7d\xc1\x5c\x50\x5c\x4e\x7a\x60\x7a\x57\x7a\x53\x00\x00\x00\x00\x7a\x48\x5e\x9b\x7a\x56\x5c\x55\x7a\x4e\x00\x00\x7a\x4d\x00\x00\x00\x00\x00\x00\x5c\x4f\x5c\x4b\x7d\xd6\x7a\x5a\x7a\x55\x00\x00\x7a\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\xd1\x00\x00\x7d\xc2\x7d\xcd\x00\x00\x7d\xd4\x5e\x99\x59\xd0\x7d\xd2\x5e\x94\x00\x00\x00\x00\x00\x00\x5e\x93\x7d\xd9\x00\x00\x7d\xc3\x7d\xd0\x7d\xc4\x7d\xcf\x5e\x97\x7d\xd3\x76\xa8\x00\x00\x00\x00\x00\x00\x7d\xda\x7d\xcb\x5e\x9a\x80\xe2\x60\x97\x00\x00\x7d\xd8\x7d\xd7\x5e\x9c\x80\xd5\x60\x98\x80\xd6\x00\x00\x7d\xc7\x7d\xc8\x7d\xc5\x7d\xca\x7d\xc6\x7d\xdb\x5e\x96\x60\x99\x5e\x98\x5e\x9d\x00\x00\x7d\xc9\x00\x00\x7d\xd5", /* 6480 */ "\x00\x00\x00\x00\x7d\xce\x00\x00\x00\x00\x80\xd9\x00\x00\x5e\x92\x60\x9c\x84\x55\x80\xde\x80\xdd\x80\xdf\x00\x00\x00\x00\x80\xdc\x60\x9d\x68\xcb\x60\xa3\x60\xa0\x00\x00\x60\xa1\x80\xd7\x80\xda\x80\xe4\x60\xa9\x60\xa7\x00\x00\x80\xdb\x76\xa0\x60\x9a\x80\xe1\x80\xd8\x00\x00\x60\xaa\x80\xe0\x5e\x95\x60\x9f\x7d\xcc\x00\x00\x00\x00\x60\xa2\x00\x00\x60\xa6\x60\xa8\x60\xa5\x60\xa4\x00\x00\x60\x9e\x80\xe3\x60\x9b\x60\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x82\x62\x83\x84\x54\x62\x8c\x62\x89\x00\x00\x62\x7f\x62\x87\x84\x56\x62\x85\x62\x7e\x00\x00\x62\x86\x00\x00\x84\x53\x63\xe3\x62\x81\x00\x00\x62\x88\x63\xe2\x84\x52\x84\x51\x00\x00\x62\x8a\x00\x00\x62\x8b\x00\x00\x84\x50\x84\x4f\x63\xe4\x84\x59\x62\x84\x84\x57\x00\x00\x00\x00\x00\x00\x00\x00\x63\xe5\x00\x00\x63\xea\x86\xf5\x86\xf7\x00\x00\x63\xe7\x00\x00\x86\xf8\x86\xf4\x00\x00\x86\xf6\x63\xe8\x63\xeb\x00\x00\x86\xf3\x63\xe6\x63\xe9\x65\x64\x84\x58\x65\x63\x00\x00\x00\x00\x65\x69\x89\x82\x00\x00\x65\x67\x65\x68\x89\x85\x89\x81\x65\x65\x89\x7e", /* 6500 */ "\x66\x57\x89\x83\x00\x00\x89\x84\x89\x7f\x00\x00\x65\x66\x8b\x70\x00\x00\x8b\x73\x00\x00\x00\x00\x8b\x74\x8b\x72\x8b\x75\x66\x58\x8b\x71\x00\x00\x00\x00\x8c\xfb\x66\xee\x8c\xfa\x8c\xf9\x8c\xf8\x66\xed\x66\xef\x00\x00\x8e\x7c\x67\x8e\x67\x8d\x00\x00\x00\x00\x8f\x71\x8f\x70\x8f\x73\x68\x57\x67\xe0\x90\x4e\x8f\x72\x00\x00\x00\x00\x90\x4d\x68\x59\x68\x58\x68\x7f\x90\xb8\x91\x41\x4c\xc4\x00\x00\x00\x00\x76\xb8\x84\x5a\x48\x82\x00\x00\x4e\x4d\x6a\xb8\x4f\x73\x4f\x71\x00\x00\x4f\x72\x00\x00\x6c\x43\x50\xf2\x52\xc8\x00\x00\x6d\xe8\x00\x00\x6d\xe9\x00\x00\x52\xc9\x70\x71\x00\x00\x54\xe6\x54\xe7\x70\x70\x00\x00\x00\x00\x00\x00\x00\x00\x57\x98\x00\x00\x57\x94\x00\x00\x73\x8b\x57\x9b\x57\x9a\x57\x93\x57\x96\x57\x99\x57\x95\x00\x00\x00\x00\x76\xbc\x57\x92\x59\xd3\x00\x00\x00\x00\x00\x00\x59\xd5\x59\xd6\x76\xbb\x76\xbe\x59\xd4\x76\xb9\x76\xbd\x00\x00\x76\xba\x00\x00\x5c\x59\x00\x00\x00\x00\x7a\x63\x00\x00\x00\x00\x5e\x9e\x7d\xdc\x62\x8d\x60\xac\x80\xe5\x60\xad\x60\xae\x80\xe7\x80\xe6\x80\xe8\x84\x5c\x00\x00\x00\x00\x84\x5b", /* 6580 */ "\x86\xfa\x86\xf9\x63\xec\x63\xed\x8b\x76\x00\x00\x00\x00\x4c\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x76\xbf\x00\x00\x00\x00\x00\x00\x59\xd8\x59\xd7\x7a\x64\x00\x00\x89\x86\x67\x8f\x90\x4f\x4c\xc6\x00\x00\x54\xe8\x00\x00\x57\x9d\x57\x9c\x76\xc0\x76\xc1\x5c\x5a\x7d\xdd\x5e\x9f\x84\x5d\x00\x00\x4c\xc7\x4d\x78\x00\x00\x50\xf3\x6c\x44\x00\x00\x6d\xea\x52\xca\x57\x9e\x00\x00\x76\xc2\x59\xd9\x5c\x5b\x00\x00\x80\xe9\x80\xea\x00\x00\x00\x00\x86\xfb\x65\x6a\x91\x42\x4c\xc8\x00\x00\x6c\x45\x50\xf4\x52\xcb\x00\x00\x6d\xeb\x00\x00\x54\xe9\x70\x75\x70\x73\x70\x74\x54\xea\x70\x72\x00\x00\x00\x00\x00\x00\x00\x00\x57\xa0\x57\xa1\x73\x8c\x57\xa2\x57\x9f\x76\xc3\x00\x00\x76\xc4\x7a\x65\x00\x00\x00\x00\x5e\xa1\x5e\xa0\x00\x00\x00\x00\x86\xfc\x89\x87\x00\x00\x8b\x78\x8b\x77\x8c\xfc\x48\x87\x69\x5f\x52\xcc\x00\x00\x00\x00\x4c\xc9\x4d\x79\x00\x00\x4e\x4f\x4e\x4e\x00\x00\x00\x00\x4e\x50\x4e\x51\x69\xce\x69\xcd\x6a\xb9\x4f\x74\x6a\xbc\x6a\xbb\x6a\xba\x6a\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x50\xf5\x6c\x4b\x6c\x47\x6c\x50\x00\x00\x00\x00", /* 6600 */ "\x50\xfc\x00\x00\x50\xfa\x6c\x4c\x6c\x48\x6c\x4f\x50\xf9\x51\x43\x6c\x4a\x6c\x46\x51\x42\x6c\x4d\x50\xf8\x6c\x4e\x50\xfb\x50\xfd\x6c\x52\x6c\x51\x6c\x49\x50\xf7\x50\xf6\x51\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\xf0\x6d\xf6\x00\x00\x52\xd2\x52\xcf\x6d\xed\x6d\xf2\x00\x00\x52\xd5\x52\xcd\x6d\xf1\x52\xd0\x52\xd3\x00\x00\x00\x00\x6d\xf4\x00\x00\x52\xce\x6d\xf9\x52\xd1\x00\x00\x52\xd4\x6d\xee\x6d\xf3\x6d\xf7\x6d\xef\x6d\xec\x00\x00\x00\x00\x6d\xf8\x6d\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xf2\x54\xeb\x54\xee\x00\x00\x54\xf1\x00\x00\x70\x78\x00\x00\x54\xec\x70\x76\x00\x00\x54\xf0\x00\x00\x00\x00\x54\xed\x00\x00\x70\x79\x54\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x90\x57\xa4\x73\x8f\x73\x91\x57\xa3\x57\xa8\x70\x77\x00\x00\x73\x8e\x73\x92\x00\x00\x57\xa5\x73\x8d\x57\xa7\x00\x00\x57\xa6\x00\x00\x76\xcb\x00\x00\x76\xc6\x00\x00\x59\xda\x59\xde\x59\xdb\x76\xc9\x76\xcc\x00\x00\x59\xdc\x00\x00\x59\xdd\x59\xe2\x7a\x6e\x76\xca\x59\xe0\x76\xc7\x76\xc5\x00\x00\x59\xe1\x00\x00", /* 6680 */ "\x76\xc8\x00\x00\x00\x00\x00\x00\x5c\x61\x00\x00\x7a\x66\x5c\x5e\x5c\x5f\x5c\x5d\x7a\x6b\x7a\x6a\x7a\x67\x5c\x63\x00\x00\x00\x00\x7a\x69\x59\xdf\x00\x00\x00\x00\x7a\x6d\x7a\x68\x5c\x60\x5c\x5c\x5c\x62\x7a\x6c\x00\x00\x00\x00\x00\x00\x5e\xa4\x00\x00\x7d\xe0\x7d\xdf\x7d\xde\x5e\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\xa3\x80\xed\x80\xf0\x60\xb0\x00\x00\x00\x00\x60\xaf\x80\xf1\x80\xec\x60\xb2\x80\xee\x00\x00\x60\xb1\x80\xeb\x00\x00\x80\xef\x62\x93\x62\x90\x84\x66\x84\x65\x00\x00\x84\x64\x84\x5f\x00\x00\x84\x60\x00\x00\x00\x00\x00\x00\x62\x91\x00\x00\x62\x8e\x62\x92\x84\x5e\x62\x8f\x84\x61\x84\x62\x84\x67\x00\x00\x00\x00\x84\x63\x00\x00\x00\x00\x86\xfd\x00\x00\x00\x00\x00\x00\x63\xef\x00\x00\x89\x8a\x63\xee\x89\x88\x89\x89\x65\x6b\x66\x5a\x8b\x79\x00\x00\x66\x59\x00\x00\x00\x00\x8d\x41\x8d\x42\x00\x00\x66\xf0\x00\x00\x8c\xfd\x67\x90\x00\x00\x90\x50\x68\x5a\x90\xb9\x90\xba\x00\x00\x4c\xca\x00\x00\x4e\x52\x4e\x53\x4f\x75\x00\x00\x6c\x53\x52\xd6\x54\xf3\x57\xa9\x00\x00\x00\x00\x56\xb6\x00\x00\x59\xe3\x59\xe4", /* 6700 */ "\x59\x52\x76\xcd\x00\x00\x5c\x64\x7d\xe2\x7d\xe1\x00\x00\x00\x00\x4c\xcb\x4e\x54\x6c\x54\x51\x45\x00\x00\x51\x44\x00\x00\x6d\xfa\x6d\xfb\x00\x00\x70\x7a\x70\x7b\x54\xf4\x54\xf5\x00\x00\x54\xf6\x73\x93\x00\x00\x00\x00\x57\xab\x00\x00\x59\xe6\x00\x00\x59\xe5\x7a\x6f\x7b\xc2\x7d\xe3\x84\x68\x00\x00\x00\x00\x65\x6c\x66\xf1\x4c\xcc\x00\x00\x4d\x7c\x4d\x7d\x4d\x7b\x4d\x7e\x4d\x7a\x00\x00\x00\x00\x4e\x57\x00\x00\x69\xd6\x4e\x56\x4e\x58\x00\x00\x00\x00\x69\xd1\x69\xd0\x69\xd3\x69\xd2\x69\xd5\x4e\x55\x69\xcf\x69\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xbe\x4f\x7f\x6a\xbf\x6a\xc3\x4f\x7e\x00\x00\x6a\xc7\x6a\xc2\x6a\xc5\x4f\x77\x4f\x78\x4f\x79\x4f\x7a\x00\x00\x4f\x82\x00\x00\x6a\xc1\x4f\x7c\x4f\x83\x00\x00\x6a\xc0\x6a\xc6\x00\x00\x4f\x7b\x6a\xc4\x4f\x7d\x4f\x76\x4f\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x5a\x00\x00\x6c\x56\x51\x46\x00\x00\x51\x50\x51\x51\x51\x49\x51\x5b\x51\x4b\x6c\x5e\x51\x56\x6c\x59\x51\x4c\x6c\x68\x6c\x69\x6c\x61\x6c\x5a\x51\x59\x6c\x66\x51\x54\x51\x52", /* 6780 */ "\x00\x00\x6c\x67\x00\x00\x6c\x65\x6c\x5d\x6c\x55\x6c\x5c\x51\x4d\x00\x00\x51\x53\x00\x00\x51\x47\x6c\x60\x6c\x5f\x6c\x57\x00\x00\x51\x55\x6c\x63\x6c\x58\x51\x58\x6c\x6a\x51\x48\x00\x00\x51\x4f\x6c\x5b\x6c\x64\x51\x57\x00\x00\x51\x4a\x51\x4e\x00\x00\x6c\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x5e\x52\xde\x52\xeb\x00\x00\x6e\x59\x6e\x4f\x52\xe4\x6e\x4d\x52\xdd\x6e\x48\x52\xe7\x6e\x55\x6e\x42\x6e\x44\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x47\x6d\xfc\x6e\x54\x6e\x64\x52\xe2\x6e\x49\x6e\x5b\x00\x00\x6e\x41\x6e\x62\x6e\x63\x6e\x66\x6e\x5d\x6e\x4e\x6e\x56\x52\xe8\x52\xdb\x52\xe3\x52\xef\x52\xd8\x52\xda\x00\x00\x00\x00\x00\x00\x6e\x46\x52\xec\x52\xe5\x6e\x60\x6e\x43\x52\xee\x52\xe9\x6e\x4c\x00\x00\x00\x00\x52\xed\x6e\x53\x6e\x4b\x52\xe6\x6e\x5f\x6e\x57\x00\x00\x52\xe0\x6e\x65\x6e\x4a\x52\xdc\x6e\x5c\x6e\x52\x52\xe1\x6e\x58\x52\xd9\x6d\xfd\x52\xea\x55\x48\x52\xdf\x6e\x51\x6e\x50\x6e\x45\x00\x00\x6e\x61\x00\x00\x6e\x5a\x00\x00\x00\x00\x52\xd7", /* 6800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x90\x55\x4f\x70\x91\x00\x00\x70\x85\x55\x44\x55\x50\x00\x00\x70\x7d\x00\x00\x70\x87\x70\x8f\x00\x00\x70\x7c\x70\x98\x54\xf7\x00\x00\x00\x00\x00\x00\x70\x97\x70\x92\x00\x00\x70\x93\x55\x42\x55\x4d\x70\x89\x00\x00\x70\x8a\x70\x94\x70\x8b\x00\x00\x70\x86\x70\x7f\x70\x81\x70\x8e\x70\x88\x00\x00\x00\x00\x54\xf8\x54\xfc\x70\x96\x70\x82\x55\x4b\x55\x47\x00\x00\x00\x00\x55\x4a\x55\x51\x54\xfd\x55\x4c\x70\x8d\x55\x4e\x54\xfa\x00\x00\x54\xf9\x70\x7e\x00\x00\x70\x83\x55\x45\x70\x95\x70\x8c\x70\x84\x55\x49\x55\x46\x00\x00\x54\xfb\x55\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\xa8\x00\x00\x73\x98\x73\x99\x73\x9d\x00\x00\x73\xac\x73\xa9\x00\x00\x73\xa2\x73\xa1\x57\xb2\x73\xa5\x73\xb4\x73\x94\x00\x00\x73\xb5\x73\xa7\x73\xb9\x73\xad\x57\xb1", /* 6880 */ "\x73\xab\x57\xac\x57\xc1\x57\xb7\x00\x00\x57\xbb\x57\xba\x73\x95\x00\x00\x73\xb2\x73\xb8\x73\xb0\x73\xb7\x00\x00\x00\x00\x73\xa4\x73\x96\x73\xb6\x73\xa6\x57\xaf\x57\xbc\x00\x00\x73\xaf\x57\xb5\x00\x00\x00\x00\x00\x00\x73\xae\x73\x97\x57\xbd\x00\x00\x57\xbf\x73\xb1\x57\xc0\x57\xae\x73\x9e\x73\xb3\x00\x00\x00\x00\x57\xb4\x57\xbe\x73\xa0\x73\xaa\x73\x9b\x73\x9f\x57\xb9\x73\x9a\x57\xad\x57\xb6\x57\xb3\x73\xa3\x55\x43\x76\xe4\x57\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xb8\x00\x00\x76\xe7\x76\xfd\x76\xf2\x59\xfa\x00\x00\x59\xf5\x76\xe1\x59\xf6\x76\xf1\x00\x00\x76\xea\x76\xf7\x59\xf2\x76\xcf\x76\xf9\x59\xe8\x76\xd7\x59\xeb\x59\xea\x00\x00\x59\xfb\x00\x00\x76\xd1\x76\xf3\x76\xf4\x59\xed\x59\xe9\x76\xdf\x00\x00\x59\xf4\x76\xda\x00\x00\x76\xf5\x59\xf0\x76\xed\x76\xfa\x76\xd4\x76\xd9\x76\xd3\x00\x00\x59\xef\x76\xe6\x7a\x86\x76\xd5\x59\xf3\x76\xde\x76\xf6\x59\xee\x76\xdb\x76\xd8\x76\xe9\x59\xf1\x59\xe7\x59\xfd\x76\xec\x76\xeb\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x76\xd0\x59\xec\x76\xf8\x76\xe0\x76\xe2\x00\x00\x76\xef\x76\xee\x76\xce\x59\xf7\x59\xf9\x76\xd6\x76\xdd\x76\xe5\x59\xf8\x76\xdc\x76\xe8\x76\xfb\x00\x00\x76\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x76\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x9a\x5c\x6c\x00\x00\x7a\x98\x7a\x83\x7a\x88\x7a\x81\x00\x00\x7a\x94\x7a\x72\x7a\x79\x00\x00\x7a\x92\x7a\x9c\x7a\x84\x00\x00\x7a\x76\x7a\x8a\x7a\x8f\x7a\x7a\x00\x00\x7a\x8c\x7a\x77\x00\x00\x00\x00\x7a\x7e\x7a\x7f\x5c\x6e\x7a\x93\x7a\x91\x00\x00\x7a\x73\x7a\x96\x00\x00\x7a\x97\x7a\x99\x5c\x72\x5c\x6a\x00\x00\x73\x9c\x7a\x7b\x7a\x8e\x7a\x7c\x5c\x67\x5c\x77\x7a\x95\x5c\x75\x5c\x71\x7a\x71\x5c\x69\x00\x00\x7a\x74\x5c\x76\x00\x00\x7a\x85\x7a\x70\x00\x00\x5c\x6f\x7a\x89\x7a\x78\x5c\x70\x7a\x82\x5c\x66\x59\xfc\x7a\x8b\x76\xe3\x7a\x75\x00\x00\x00\x00\x7a\x90\x5c\x6b\x7a\x8d\x5c\x68\x7a\x87\x5c\x73\x7a\x7d\x7a\x9b\x00\x00\x00\x00\x00\x00\x00\x00", /* 6980 */ "\x00\x00\x00\x00\x5c\x6d\x7b\x4e\x00\x00\x00\x00\x5c\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\xf1\x7d\xef\x00\x00\x7e\x48\x7d\xed\x00\x00\x7e\x42\x5c\x65\x5e\xa7\x7d\xe9\x7e\x47\x00\x00\x7d\xee\x7d\xfc\x5e\xac\x5e\xa5\x00\x00\x7e\x45\x00\x00\x7d\xe7\x7e\x44\x00\x00\x5e\xb7\x7d\xf8\x7e\x4b\x5e\xb5\x7d\xf0\x5e\xa6\x7d\xf2\x7e\x43\x5e\xaf\x7d\xeb\x5e\xb3\x5e\xa9\x7d\xf4\x7d\xea\x7d\xe4\x00\x00\x7e\x41\x5e\xb0\x7e\x4a\x7d\xe5\x5e\xad\x00\x00\x7d\xfa\x00\x00\x5e\xae\x7d\xec\x7d\xf7\x7d\xf3\x7d\xf5\x00\x00\x5e\xa8\x7e\x49\x5e\xb6\x7d\xf6\x00\x00\x7e\x4c\x00\x00\x00\x00\x7d\xe6\x7d\xfb\x5e\xab\x5e\xb4\x5e\xb2\x7d\xe8\x7d\xfd\x5e\xb1\x00\x00\x00\x00\x5e\xaa\x7d\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xfd\x00\x00\x80\xf9\x80\xf5\x81\x4c\x81\x49\x60\xb5\x00\x00\x00\x00\x81\x50\x80\xfc\x60\xc0\x81\x46\x00\x00\x00\x00\x80\xf8\x81\x45\x60\xbd\x81\x59\x00\x00\x81\x56\x81\x48\x80\xf6\x00\x00\x00\x00\x81\x4d\x81\x4f\x60\xb9\x81\x43\x80\xfb", /* 6a00 */ "\x80\xf2\x60\xb6\x60\xbe\x00\x00\x81\x52\x60\xbf\x80\xf3\x81\x58\x81\x4b\x81\x51\x60\xbc\x00\x00\x00\x00\x81\x4e\x00\x00\x81\x55\x00\x00\x60\xc1\x00\x00\x60\xbb\x81\x47\x80\xf7\x81\x5a\x80\xf4\x81\x53\x60\xb8\x00\x00\x81\x41\x00\x00\x81\x42\x60\xb7\x60\xb4\x80\xfa\x60\xba\x00\x00\x60\xb3\x00\x00\x81\x54\x81\x57\x81\x44\x84\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x6d\x00\x00\x84\x69\x62\xa0\x00\x00\x00\x00\x62\x95\x62\x9a\x62\x96\x84\x77\x84\x83\x62\x94\x84\x6f\x84\x78\x81\x4a\x84\x79\x00\x00\x00\x00\x62\x9b\x00\x00\x84\x89\x62\x9f\x62\xa2\x84\x6b\x00\x00\x62\x9e\x00\x00\x84\x87\x84\x88\x84\x7d\x84\x7c\x84\x74\x00\x00\x00\x00\x84\x7e\x84\x86\x84\x85\x00\x00\x62\x99\x62\x97\x84\x76\x84\x73\x00\x00\x84\x70\x84\x84\x62\xa1\x84\x82\x62\x9d\x62\x9c\x00\x00\x84\x7b\x00\x00\x84\x6a\x84\x6c\x84\x6e\x84\x81\x84\x7a\x62\x98\x00\x00\x84\x71\x00\x00\x84\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xf7\x87\x52", /* 6a80 */ "\x63\xf0\x87\x43\x00\x00\x87\x4e\x63\xf2\x87\x55\x00\x00\x87\x4a\x00\x00\x87\x45\x00\x00\x00\x00\x87\x56\x87\x41\x87\x4c\x00\x00\x63\xf9\x87\x51\x87\x57\x87\x4b\x63\xf1\x87\x4d\x87\x42\x63\xf8\x00\x00\x00\x00\x87\x54\x87\x47\x63\xf4\x00\x00\x87\x49\x87\x46\x63\xfa\x87\x48\x63\xf3\x63\xf6\x87\x50\x87\x44\x87\x53\x00\x00\x87\x4f\x00\x00\x00\x00\x00\x00\x65\x6e\x89\x95\x65\x73\x65\x74\x00\x00\x00\x00\x00\x00\x65\x6d\x89\x94\x00\x00\x89\x91\x89\x92\x65\x71\x89\x8c\x89\x90\x65\x70\x00\x00\x89\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x65\x72\x65\x6f\x00\x00\x89\x8b\x89\x8f\x89\x93\x00\x00\x00\x00\x00\x00\x8b\x7f\x8b\x7c\x8b\x86\x00\x00\x8b\x85\x8b\x83\x8b\x7d\x00\x00\x66\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x7e\x66\x5d\x63\xf5\x8b\x82\x66\x5c\x8b\x87\x8b\x81\x8b\x7b\x89\x8e\x00\x00\x00\x00\x00\x00\x66\x5b\x00\x00\x8b\x7a\x8d\x46\x00\x00\x8d\x45\x8b\x84\x66\xf2\x00\x00\x8d\x49\x8d\x4a\x8d\x44\x8d\x48\x00\x00\x8d\x43\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x81\x8d\x47\x67\x93\x67\x91\x8e\x7e\x00\x00\x00\x00\x00\x00", /* 6b00 */ "\x8e\x82\x00\x00\x8e\x7d\x8e\x7f\x67\x92\x00\x00\x00\x00\x00\x00\x8f\x75\x8f\x76\x67\xe1\x8f\x74\x00\x00\x00\x00\x00\x00\x90\x53\x68\x5b\x90\x51\x90\x52\x90\xbb\x00\x00\x00\x00\x68\xa2\x91\x45\x91\x43\x91\x44\x91\x46\x00\x00\x00\x00\x00\x00\x91\xab\x00\x00\x4c\xcd\x4e\x59\x00\x00\x51\x5c\x00\x00\x6c\x6b\x00\x00\x00\x00\x6e\x67\x00\x00\x00\x00\x00\x00\x70\x99\x70\x9b\x00\x00\x70\x9a\x00\x00\x70\x9c\x57\xc2\x73\xbb\x70\x9d\x00\x00\x73\xba\x73\xbc\x73\xbd\x77\x41\x5a\x42\x77\x42\x77\x44\x5a\x43\x5a\x41\x77\x43\x00\x00\x7a\xa2\x7a\xa0\x7a\x9f\x00\x00\x7a\x9e\x7a\x9d\x5c\x78\x7a\xa1\x5e\xb8\x7e\x4d\x7e\x4f\x5e\xb9\x7e\x4e\x60\xc3\x00\x00\x60\xc2\x81\x5b\x00\x00\x00\x00\x84\x8b\x84\x8a\x84\x8c\x00\x00\x00\x00\x62\xa3\x00\x00\x87\x58\x63\xfb\x00\x00\x89\x96\x65\x75\x8b\x88\x67\xe2\x4c\xce\x4d\x7f\x4e\x5a\x4f\x84\x51\x5d\x51\x5e\x00\x00\x00\x00\x52\xf0\x00\x00\x00\x00\x70\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x79\x00\x00\x00\x00\x00\x00\x81\xda\x62\xa4\x65\x76\x4c\xcf\x00\x00\x4e\x5b\x00\x00\x00\x00\x6c\x6d\x51\x5f", /* 6b80 */ "\x6c\x6c\x00\x00\x6e\x68\x52\xf1\x6e\x69\x00\x00\x52\xf2\x00\x00\x70\xa0\x55\x53\x55\x52\x00\x00\x73\xc2\x73\xc0\x73\xc1\x73\xbf\x00\x00\x73\xbe\x00\x00\x00\x00\x77\x45\x77\x48\x5a\x45\x77\x46\x5a\x44\x77\x47\x00\x00\x7a\xa3\x00\x00\x00\x00\x7e\x50\x7e\x51\x7e\x52\x00\x00\x81\x5e\x81\x5d\x60\xc4\x81\x5c\x81\x5f\x84\x8d\x00\x00\x00\x00\x84\x8e\x84\x8f\x00\x00\x87\x59\x63\xfc\x65\x77\x8b\x89\x00\x00\x67\x94\x69\x60\x00\x00\x52\xf3\x6e\x6a\x55\x54\x00\x00\x00\x00\x57\xc3\x00\x00\x5a\x46\x77\x49\x00\x00\x5c\x7b\x5c\x7a\x00\x00\x00\x00\x7e\x53\x7e\x54\x60\xc5\x60\xc6\x84\x91\x84\x90\x89\x97\x90\x54\x4c\xd0\x69\x61\x4d\x81\x00\x00\x4f\x85\x6a\xc8\x00\x00\x52\xf4\x5c\x7c\x4c\xd1\x00\x00\x6e\x6b\x52\xf5\x6e\x6c\x00\x00\x63\xfd\x4c\xd2\x00\x00\x00\x00\x6c\x6e\x00\x00\x6e\x6d\x00\x00\x70\xa5\x70\xa4\x70\xa2\x00\x00\x70\xa1\x70\xa6\x70\xa3\x00\x00\x00\x00\x57\xc4\x57\xc5\x00\x00\x00\x00\x5a\x47\x77\x4a\x00\x00\x77\x4b\x77\x4c\x00\x00\x00\x00\x00\x00\x7a\xa8\x7a\xa9\x7a\xa7\x00\x00\x7a\xa5\x7a\xa6\x5c\x7d\x7e\x55\x81\x62", /* 6c00 */ "\x81\x61\x81\x60\x81\x63\x84\x93\x84\x92\x62\xa5\x84\x94\x00\x00\x64\x41\x87\x5a\x00\x00\x89\x98\x8b\x8a\x8f\x77\x00\x00\x4c\xd3\x4d\x83\x4d\x82\x00\x00\x51\x60\x69\x62\x69\x7f\x4e\x5c\x00\x00\x69\xd7\x6a\xc9\x6a\xca\x51\x61\x00\x00\x6c\x6f\x00\x00\x52\xf6\x6e\x6e\x6e\x6f\x00\x00\x55\x55\x55\x59\x70\xa7\x55\x58\x55\x56\x55\x57\x00\x00\x73\xc3\x57\xc6\x5a\x4a\x00\x00\x5a\x48\x5a\x49\x77\x4d\x00\x00\x00\x00\x5e\xba\x4c\xd4\x00\x00\x69\x81\x00\x00\x4d\x84\x00\x00\x00\x00\x69\x84\x00\x00\x00\x00\x4d\x87\x69\x83\x4d\x86\x4d\x85\x4f\x86\x69\x82\x00\x00\x00\x00\x69\xd8\x00\x00\x00\x00\x00\x00\x69\xdc\x69\xde\x69\xdf\x4e\x66\x4e\x67\x69\xdb\x4e\x62\x00\x00\x69\xd9\x00\x00\x69\xdd\x4e\x63\x00\x00\x4e\x5e\x00\x00\x4e\x5f\x00\x00\x4e\x65\x69\xda\x4e\x5d\x4f\x87\x4e\x60\x4e\x61\x4e\x64\x00\x00\x00\x00\x00\x00\x6a\xdb\x6a\xd9\x6a\xcc\x4f\x93\x6a\xd3\x4f\x8e\x6a\xcd\x00\x00\x6a\xd5\x00\x00\x6a\xd2\x4f\x91\x6a\xd1\x4f\x98\x6a\xda\x4f\x9a\x00\x00\x4f\x9c\x00\x00\x6a\xcb\x00\x00\x4f\x8f\x6a\xdc\x00\x00\x4f\x96\x4f\x99\x00\x00", /* 6c80 */ "\x6c\x87\x4f\x89\x4f\xa0\x4f\x97\x6a\xce\x4f\x8c\x4f\x9b\x6a\xd6\x4f\x8a\x4f\x8b\x6c\x85\x6a\xcf\x4f\x92\x4f\x9d\x6a\xdd\x6a\xd0\x4f\x90\x00\x00\x4f\x95\x6c\x70\x4f\x9e\x6a\xd7\x4f\x94\x00\x00\x4f\x9f\x4f\x88\x6a\xd4\x4f\x8d\x6a\xd8\x6c\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x6d\x51\x7d\x6c\x77\x51\x74\x00\x00\x6c\x8d\x51\x65\x00\x00\x51\x68\x6c\x84\x00\x00\x6c\x75\x6c\x79\x51\x70\x51\x72\x6c\x7c\x51\x79\x51\x6b\x51\x69\x51\x6a\x51\x78\x6c\x89\x51\x73\x6c\x7b\x6c\x7d\x51\x71\x51\x76\x6c\x7e\x6c\x8c\x00\x00\x52\xf7\x51\x7c\x00\x00\x51\x66\x6c\x8b\x00\x00\x6c\x8f\x6c\x7a\x6c\x91\x6c\x82\x51\x6f\x6c\x76\x51\x6e\x51\x81\x51\x75\x00\x00\x6c\x74\x6e\x78\x51\x7b\x51\x7f\x6c\x83\x6c\x88\x00\x00\x51\x82\x51\x7a\x51\x6c\x51\x62\x00\x00\x51\x67\x00\x00\x6c\x78\x51\x63\x6c\x90\x00\x00\x6c\x72\x6c\x71\x6c\x7f\x6c\x73\x51\x7e\x55\x5a\x51\x77\x6c\x81\x51\x64\x00\x00\x53\x49\x00\x00\x00\x00\x00\x00\x6c\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d00 */ "\x6e\x7f\x6e\x83\x00\x00\x6e\x86\x6e\x7a\x00\x00\x00\x00\x6e\x89\x6e\x8c\x6e\x8e\x6e\x77\x52\xf8\x52\xfd\x70\xac\x53\x50\x6e\x87\x6e\x8f\x6e\x7e\x6e\x76\x00\x00\x00\x00\x00\x00\x70\xc7\x53\x43\x6e\x84\x6e\x7b\x6e\x7d\x53\x48\x00\x00\x6e\x81\x53\x42\x6e\x73\x6e\x8a\x00\x00\x6e\x8d\x00\x00\x00\x00\x52\xfc\x00\x00\x53\x4b\x6e\x70\x53\x4d\x52\xfa\x53\x51\x6e\x8b\x6e\x72\x53\x4e\x70\xc1\x6c\x8a\x53\x41\x52\xf9\x6e\x79\x6e\x71\x53\x4f\x53\x47\x6e\x85\x53\x4c\x53\x4a\x6e\x7c\x53\x44\x6e\x74\x53\x45\x53\x46\x6e\x75\x6e\x88\x52\xfb\x6e\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\xaf\x55\x62\x55\x67\x00\x00\x00\x00\x00\x00\x70\xb8\x70\xbe\x70\xba\x70\xad\x70\xb0\x70\xa9\x70\xaa\x55\x6e\x55\x5f\x70\xb9\x70\xc2\x55\x69\x55\x5b\x00\x00\x55\x64\x70\xb1\x55\x66\x70\xb2\x70\xbc\x00\x00\x00\x00\x00\x00\x55\x68\x70\xcb\x70\xab\x55\x61\x55\x60\x55\x6c\x70\xa8\x70\xc9\x70\xbd\x70\xca\x70\xc4\x70\xb6", /* 6d80 */ "\x70\xc5\x00\x00\x70\xbf\x70\xc8\x70\xc6\x55\x6d\x70\xb7\x55\x5e\x55\x5d\x55\x65\x55\x6b\x70\xc3\x55\x6a\x70\xb4\x57\xc7\x00\x00\x70\xcc\x70\xb3\x70\xae\x55\x63\x55\x6f\x55\x5c\x00\x00\x70\xbb\x70\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xe9\x73\xc5\x73\xc9\x00\x00\x57\xd6\x57\xd4\x00\x00\x00\x00\x57\xcb\x73\xc7\x73\xc6\x57\xdf\x00\x00\x73\xcc\x57\xd9\x00\x00\x73\xde\x73\xea\x57\xc8\x73\xdb\x73\xd4\x57\xeb\x73\xc4\x00\x00\x73\xe0\x00\x00\x57\xe8\x57\xdc\x57\xe7\x57\xd2\x73\xd0\x73\xe2\x73\xda\x57\xd3\x57\xcd\x73\xe8\x00\x00\x73\xe1\x73\xe3\x57\xd5\x57\xdd\x73\xe5\x73\xce\x73\xdf\x73\xd3\x73\xe7\x57\xe2\x57\xca\x57\xe0\x73\xd8\x73\xd6\x73\xd7\x57\xd7\x73\xd2\x73\xd1\x57\xcc\x73\xcb\x73\xe9\x57\xce\x73\xd5\x57\xec\x00\x00\x57\xe6\x73\xca\x57\xe3\x57\xe1\x57\xea\x73\xdc\x57\xe5\x70\xb5\x73\xdd\x57\xe4\x73\xe4\x57\xc9\x73\xd9\x57\xdb\x73\xcd\x57\xda\x00\x00\x57\xd8\x57\xd0\x57\xcf\x77\x4e\x73\xe6\x00\x00\x00\x00", /* 6e00 */ "\x73\xcf\x00\x00\x00\x00\x77\x63\x00\x00\x57\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x67\x57\xde\x5a\x55\x77\x5d\x5a\x63\x00\x00\x77\x51\x5a\x52\x5a\x4e\x77\x6f\x5a\x54\x5a\x58\x5a\x53\x5a\x5c\x77\x73\x77\x6a\x00\x00\x00\x00\x77\x58\x5a\x61\x5a\x5b\x77\x64\x5a\x4b\x77\x70\x77\x69\x5a\x4f\x77\x5e\x5a\x5e\x77\x7b\x77\x7c\x00\x00\x5a\x4c\x77\x6e\x5a\x60\x77\x62\x77\x54\x77\x55\x5a\x64\x77\x59\x77\x60\x77\x5a\x00\x00\x5a\x62\x5a\x6a\x77\x56\x77\x4f\x77\x50\x00\x00\x77\x52\x5a\x51\x77\x5f\x00\x00\x5a\x5f\x5a\x68\x00\x00\x00\x00\x77\x61\x77\x79\x77\x71\x5a\x4d\x77\x77\x5a\x59\x00\x00\x5a\x57\x00\x00\x77\x7d\x5a\x56\x77\x67\x77\x5b\x77\x65\x5a\x6d\x77\x6b\x77\x68\x77\x57\x5a\x69\x77\x75\x77\x72\x77\x7a\x5a\x50\x77\x66\x5a\x6c\x00\x00\x77\x6d\x00\x00\x00\x00\x5a\x5a\x5a\x5d\x00\x00\x77\x6c\x5a\x6b\x77\x5c\x73\xc8\x00\x00\x00\x00\x77\x76\x77\x74\x77\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6e80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x53\x5a\x66\x00\x00\x00\x00\x00\x00\x7a\xc8\x7a\xc7\x7a\xad\x5c\x84\x00\x00\x7a\xc6\x7a\xb0\x7a\xb1\x00\x00\x5c\x8e\x7a\xcf\x5c\x89\x7a\xc5\x00\x00\x7a\xaa\x5c\x8f\x5c\x85\x7a\xb9\x7a\xaf\x7a\xb2\x7a\xca\x5c\x7e\x7a\xd1\x7a\xc9\x5c\x88\x7a\xbe\x5c\x93\x00\x00\x00\x00\x5c\x92\x5c\x8c\x00\x00\x00\x00\x7a\xd0\x5c\x7f\x7a\xbc\x7a\xb3\x7a\xc0\x7a\xcc\x5c\x94\x00\x00\x5c\x82\x7a\xbb\x91\xc7\x7a\xb4\x5c\x8b\x00\x00\x5c\x8a\x7a\xb7\x7a\xc1\x7a\xcb\x7a\xae\x7a\xb8\x5c\x83\x7a\xc2\x5c\x90\x5c\x87\x7a\xb5\x5c\x86\x7a\xac\x7a\xba\x7a\xce\x5a\x65\x5e\xd6\x7a\xbd\x7e\x56\x7a\xbf\x7a\xcd\x5c\x8d\x7a\xb6\x5c\x81\x5c\x91\x60\xd8\x7a\xab\x00\x00\x7a\xc4\x00\x00\x00\x00\x00\x00\x7a\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x72\x5e\xd3\x7e\x67\x7e\x6c\x5e\xc8\x00\x00\x7e\x58\x5e\xd5\x00\x00\x5e\xbf\x7e\x57\x7e\x78\x5e\xd7\x7e\x5b\x7e\x6b\x00\x00\x7e\x5d\x7e\x7b\x7e\x77\x5e\xbd\x5e\xc7", /* 6f00 */ "\x81\x7d\x5e\xd4\x5e\xc5\x7e\x59\x00\x00\x7e\x76\x5e\xc9\x7e\x73\x7e\x81\x7e\x5f\x7e\x68\x00\x00\x00\x00\x7e\x7e\x7e\x74\x5e\xc4\x00\x00\x00\x00\x7e\x66\x5e\xbe\x5e\xbc\x5e\xce\x00\x00\x00\x00\x7e\x64\x7e\x61\x7e\x62\x00\x00\x7e\x7a\x00\x00\x7e\x7f\x7e\x7d\x5e\xc2\x7e\x82\x5e\xc6\x5e\xcd\x00\x00\x7e\x5a\x81\x65\x7e\x63\x00\x00\x5e\xc0\x5e\xd2\x5e\xcf\x5e\xc3\x7e\x6d\x7e\x5e\x5e\xd0\x7e\x6f\x5e\xca\x5e\xcc\x5e\xbb\x00\x00\x7e\x71\x7e\x69\x7e\x5c\x5e\xcb\x7e\x79\x7e\x7c\x7e\x65\x7e\x70\x00\x00\x5e\xc1\x60\xc7\x7e\x6e\x81\x64\x00\x00\x7e\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x60\x81\x6e\x81\x78\x60\xca\x81\x77\x81\x84\x60\xcc\x81\x75\x00\x00\x81\x79\x60\xd7\x00\x00\x81\x70\x60\xcf\x00\x00\x81\x7c\x84\x9c\x60\xdb\x60\xda\x81\x7e\x81\x6d\x81\x89\x60\xd5\x00\x00\x60\xcb\x81\x82\x00\x00\x81\x86\x81\x8b\x81\x7f\x81\x73\x60\xce\x60\xd1\x60\xd9\x60\xd4\x00\x00\x81\x76\x7e\x6a\x00\x00\x00\x00\x81\x72\x81\x8a\x60\xd0\x00\x00\x60\xd3\x81\x8c\x60\xc8\x81\x81\x81\x66\x81\x87", /* 6f80 */ "\x64\x4a\x00\x00\x81\x74\x00\x00\x60\xc9\x81\x6f\x60\xcd\x81\x67\x5e\xd1\x81\x6b\x00\x00\x81\x85\x81\x6c\x81\x6a\x60\xd2\x00\x00\x81\x83\x00\x00\x81\x69\x81\x7b\x81\x7a\x81\x88\x81\x71\x60\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x9f\x00\x00\x62\xb2\x62\xa8\x84\xab\x84\x97\x62\xaa\x84\xa3\x62\xb1\x62\xac\x84\xa1\x87\x5c\x84\xa7\x84\xad\x84\xa6\x84\x95\x84\xa4\x84\xaf\x84\xb1\x62\xa7\x84\xb0\x62\xad\x62\xb3\x00\x00\x62\xb0\x00\x00\x84\xaa\x62\xaf\x84\xa5\x00\x00\x84\x99\x84\x9e\x00\x00\x84\xa9\x62\xae\x62\xab\x62\xa6\x62\xa9\x84\x9d\x00\x00\x81\x68\x84\x98\x84\x9b\x84\xac\x84\xa0\x84\x96\x87\x5b\x84\xae\x84\x9a\x84\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x87\x5e\x64\x4e\x00\x00\x00\x00\x64\x42\x00\x00\x00\x00\x64\x46\x87\x60\x87\x66\x87\x64\x64\x44\x64\x45\x64\x4c\x87\x67\x87\x5f\x64\x47\x00\x00\x87\x63\x87\x62\x87\x68\x64\x4d\x00\x00\x64\x48\x64\x4b\x87\x61\x64\x4f\x64\x49\x64\x50\x64\x43\x87\x65\x00\x00\x87\x5d\x00\x00\x00\x00\x89\xa5\x00\x00\x00\x00\x65\x7c\x89\xa2\x89\xa4\x00\x00\x65\x7a\x89\xa0", /* 7000 */ "\x89\xa1\x89\x9c\x00\x00\x00\x00\x84\xa2\x89\x9d\x65\x7b\x89\x99\x00\x00\x65\x78\x89\xa6\x65\x79\x89\x9a\x89\x9b\x89\x9f\x65\x7e\x00\x00\x65\x7d\x00\x00\x00\x00\x89\x9e\x66\x64\x8b\x8e\x8b\x94\x66\x65\x8b\x8b\x66\x62\x66\x5f\x8b\x96\x66\x63\x00\x00\x66\x60\x8b\x8d\x8b\x90\x8b\x91\x8b\x92\x8b\x95\x00\x00\x89\xa3\x8b\x8c\x66\x61\x8b\x93\x8b\x97\x8b\x8f\x00\x00\x00\x00\x00\x00\x8d\x4d\x66\xf4\x8d\x50\x66\xf5\x8d\x58\x8d\x4f\x8d\x4c\x00\x00\x8d\x4e\x8d\x52\x8d\x55\x8d\x54\x8d\x57\x8d\x4b\x00\x00\x66\xf3\x8d\x53\x8d\x56\x8d\x59\x8d\x51\x8e\x83\x8e\x84\x8e\x88\x8e\x89\x00\x00\x8e\x86\x8e\x87\x8e\x85\x00\x00\x67\x95\x00\x00\x00\x00\x00\x00\x00\x00\x67\xe3\x8f\x7b\x00\x00\x00\x00\x8f\x78\x8f\x79\x8f\x7a\x67\xe4\x00\x00\x90\x56\x90\x55\x00\x00\x90\xbe\x68\x81\x90\xbc\x90\xbf\x90\xbd\x91\x47\x68\xa3\x68\xb1\x91\x93\x91\x7d\x00\x00\x91\x92\x91\xc0\x91\xc1\x4c\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x68\x69\xe0\x00\x00\x00\x00\x6a\xde\x00\x00\x4f\xa1\x00\x00\x4f\xa4\x00\x00\x6a\xdf\x00\x00\x4f\xa2\x4f\xa3\x00\x00\x00\x00", /* 7080 */ "\x00\x00\x00\x00\x6c\x9a\x6c\x9c\x6c\x97\x6c\x94\x6c\x96\x00\x00\x00\x00\x00\x00\x51\x86\x00\x00\x00\x00\x00\x00\x51\x84\x00\x00\x00\x00\x6c\x98\x51\x85\x6c\x95\x6c\x92\x51\x83\x6c\x99\x00\x00\x6c\x93\x51\x87\x6c\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x91\x00\x00\x6e\x95\x00\x00\x00\x00\x53\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x98\x00\x00\x53\x52\x53\x55\x53\x57\x53\x59\x53\x56\x6e\x94\x6e\x93\x00\x00\x53\x54\x6e\x96\x6e\x97\x00\x00\x6e\x90\x53\x58\x00\x00\x53\x53\x00\x00\x00\x00\x00\x00\x6e\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\xda\x70\xdb\x70\xdc\x55\x74\x00\x00\x55\x70\x70\xd1\x00\x00\x70\xd9\x70\xde\x55\x75\x00\x00\x70\xcf\x70\xd5\x70\xce\x70\xd8\x00\x00\x00\x00\x70\xd4\x55\x71\x55\x73\x70\xdd\x00\x00\x70\xcd\x70\xd0\x70\xd6\x00\x00\x70\xd7\x70\xdf\x70\xd3\x00\x00\x55\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xf1\x73\xf1\x00\x00\x00\x00\x73\xf3\x73\xef\x00\x00\x73\xfb\x73\xed\x73\xfa\x57\xed\x73\xeb\x77\x82\x73\xf5\x57\xf0\x00\x00\x73\xf6", /* 7100 */ "\x73\xf9\x00\x00\x73\xfd\x00\x00\x73\xf2\x00\x00\x73\xf7\x00\x00\x00\x00\x57\xee\x57\xef\x73\xfc\x73\xf0\x73\xec\x74\x41\x00\x00\x73\xf4\x00\x00\x00\x00\x73\xf8\x00\x00\x00\x00\x00\x00\x73\xee\x00\x00\x5a\x6e\x5a\x6f\x77\x8c\x5a\x75\x00\x00\x77\x7f\x77\x89\x77\x7e\x5a\x72\x77\x87\x77\x85\x00\x00\x77\x86\x5a\x70\x00\x00\x77\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x83\x77\x81\x5a\x71\x77\x84\x77\x88\x00\x00\x00\x00\x00\x00\x5a\x73\x00\x00\x00\x00\x00\x00\x77\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\xd7\x7a\xde\x7a\xe0\x7a\xe6\x00\x00\x5c\xa1\x7a\xd2\x00\x00\x5c\x99\x00\x00\x7a\xe1\x5c\x9e\x7a\xe7\x5c\x95\x00\x00\x7a\xe4\x00\x00\x7a\xd4\x7a\xe5\x7a\xd3\x00\x00\x5c\xa3\x00\x00\x7a\xdf\x5c\x96\x7a\xe8\x00\x00\x5c\x9b\x7a\xd8\x5c\xa0\x7a\xe3\x7a\xd6\x7a\xdd\x7a\xd9\x7a\xd5\x5c\x98\x5c\x9f\x5c\x9d\x5c\x9a\x5c\xa2\x5c\x97\x7a\xdc\x00\x00\x5c\x9c\x00\x00\x5a\x74\x00\x00\x7a\xe2\x00\x00\x7a\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\xdb\x00\x00\x00\x00\x7e\x8a\x00\x00\x5e\xda\x00\x00\x00\x00", /* 7180 */ "\x7e\x86\x7e\x8c\x7e\x88\x00\x00\x5e\xdc\x7e\x87\x7e\x8b\x7e\x83\x00\x00\x7e\x85\x5e\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x89\x7e\x84\x00\x00\x5e\xdd\x00\x00\x5e\xd8\x00\x00\x00\x00\x7e\x8d\x00\x00\x5e\xd9\x81\x92\x81\x8f\x81\x9b\x81\x95\x81\x97\x60\xdc\x81\x91\x81\x99\x00\x00\x00\x00\x81\x98\x81\x96\x00\x00\x81\x9c\x60\xdf\x81\x93\x81\x9a\x00\x00\x60\xdd\x00\x00\x00\x00\x81\x8e\x81\x90\x60\xde\x81\x8d\x81\x9d\x00\x00\x81\x94\x00\x00\x00\x00\x84\xb5\x62\xba\x00\x00\x00\x00\x84\xc0\x84\xbe\x62\xb4\x84\xb4\x84\xb7\x84\xb8\x84\xb3\x62\xbe\x62\xbf\x84\xb2\x84\xc1\x84\xbc\x62\xb8\x62\xb5\x84\xbb\x84\xb9\x00\x00\x00\x00\x62\xbb\x84\xbd\x62\xb6\x00\x00\x62\xb7\x00\x00\x84\xba\x62\xb9\x84\xb6\x00\x00\x84\xbf\x62\xbc\x84\xc2\x84\xc3\x62\xbd\x00\x00\x00\x00\x64\x52\x64\x59\x87\x69\x87\x6f\x00\x00\x87\x6d\x64\x55\x64\x54\x64\x51\x87\x6b\x00\x00\x00\x00\x00\x00\x64\x57\x64\x56\x64\x53\x00\x00\x87\x6e\x87\x6a\x87\x6c\x00\x00\x64\x58\x00\x00\x00\x00\x00\x00\x65\x83\x89\xa9\x00\x00\x65\x7f\x65\x81\x89\xab\x65\x82\x89\xa8", /* 7200 */ "\x00\x00\x89\xa7\x8b\x9b\x89\xaa\x00\x00\x8b\x9c\x66\x66\x8b\x9a\x00\x00\x00\x00\x8b\x99\x00\x00\x8b\x98\x66\x67\x00\x00\x00\x00\x66\xf6\x00\x00\x00\x00\x8d\x5a\x8d\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x8c\x8e\x8b\x67\x96\x00\x00\x8e\x8a\x8f\x7c\x8f\x7d\x00\x00\x00\x00\x90\x57\x90\xc0\x00\x00\x00\x00\x91\x48\x91\xac\x68\xc5\x91\xb6\x4c\xd6\x00\x00\x51\x88\x51\x89\x00\x00\x00\x00\x53\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x64\x5a\x4c\xd7\x00\x00\x51\x8a\x55\x76\x5c\xa4\x4c\xd8\x00\x00\x57\xf2\x5e\xde\x69\x63\x00\x00\x6e\x99\x70\xe0\x00\x00\x7e\x8e\x00\x00\x64\x5b\x4c\xd9\x51\x8b\x6e\x9a\x6e\x9b\x77\x8d\x5a\x76\x00\x00\x00\x00\x7a\xe9\x00\x00\x00\x00\x5c\xa5\x7e\x8f\x00\x00\x00\x00\x60\xe0\x00\x00\x66\x68\x4c\xda\x77\x8e\x4c\xdb\x00\x00\x4e\x6a\x69\xe1\x4e\x69\x4f\xa7\x4f\xa6\x4f\xa5\x6a\xe0\x00\x00\x00\x00\x00\x00\x51\x8c\x00\x00\x51\x8d\x6c\x9d\x00\x00\x6e\x9c\x00\x00\x6e\x9f\x53\x5d\x6e\x9d\x00\x00\x53\x5c\x6e\x9e\x53\x5e\x00\x00\x70\xe3\x70\xe2\x70\xe1\x55\x77\x00\x00\x74\x43\x74\x44\x57\xf3\x74\x42\x74\x45", /* 7280 */ "\x5a\x78\x57\xf4\x00\x00\x00\x00\x5a\x77\x77\x92\x77\x91\x00\x00\x77\x8f\x77\x90\x00\x00\x77\x93\x7a\xeb\x7a\xea\x7a\xee\x00\x00\x7a\xed\x7a\xec\x5e\xdf\x7e\x92\x00\x00\x7e\x91\x5e\xe0\x7e\x90\x81\x9e\x00\x00\x81\x9f\x60\xe1\x00\x00\x84\xc4\x84\xc5\x00\x00\x00\x00\x8b\xa1\x66\x69\x8b\xa0\x8b\x9f\x8b\x9d\x8b\x9e\x67\x97\x8d\x5c\x8f\x7e\x91\x49\x00\x00\x4c\xdc\x00\x00\x69\x85\x4d\x88\x69\x86\x00\x00\x00\x00\x00\x00\x69\xe2\x69\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xe6\x00\x00\x00\x00\x6a\xe2\x00\x00\x6a\xe1\x51\x8e\x6a\xe5\x4f\xa9\x6a\xe3\x4f\xa8\x6a\xe7\x6a\xe4\x00\x00\x00\x00\x6c\xa1\x6e\xa0\x6c\x9f\x6c\xa6\x00\x00\x51\x8f\x00\x00\x51\x92\x6c\xa7\x6c\xa3\x00\x00\x6c\xa4\x00\x00\x6c\x9e\x51\x91\x6c\xa0\x51\x90\x6c\xa5\x00\x00\x6c\xa2\x00\x00\x00\x00\x6e\xa4\x53\x60\x53\x61\x00\x00\x6e\xa7\x6e\xa1\x00\x00\x6e\xa6\x00\x00\x6e\xa2\x53\x5f\x6e\xa5\x6e\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\xe9\x70\xe6\x00\x00\x70\xe8\x55\x7c\x55\x7b\x55\x79\x70\xe5\x70\xea\x55\x78\x55\x7a\x70\xe7\x74\x4d", /* 7300 */ "\x70\xe4\x70\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x48\x74\x4c\x00\x00\x74\x4b\x77\x95\x77\xa0\x00\x00\x00\x00\x74\x4e\x00\x00\x74\x49\x77\x94\x57\xf8\x00\x00\x00\x00\x57\xf7\x74\x47\x74\x4a\x57\xf9\x00\x00\x57\xf6\x57\xf5\x74\x46\x74\x4f\x00\x00\x00\x00\x00\x00\x77\x97\x77\x9e\x00\x00\x5a\x7a\x77\x9d\x77\x9a\x00\x00\x5a\x7c\x00\x00\x00\x00\x00\x00\x77\x9c\x00\x00\x00\x00\x77\x96\x77\x98\x77\x9b\x77\x99\x5a\x7b\x77\x9f\x5a\x79\x5c\xa6\x00\x00\x00\x00\x7a\xf2\x7a\xf1\x7a\xef\x00\x00\x5c\xa9\x5c\xa8\x7a\xf3\x00\x00\x7a\xf0\x7e\x93\x5e\xe1\x5c\xa7\x00\x00\x00\x00\x00\x00\x7a\xf5\x7a\xf4\x00\x00\x7e\x96\x7e\x94\x60\xe2\x00\x00\x5e\xe2\x7e\x95\x81\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x60\xe3\x81\xa0\x81\xa9\x81\xa8\x81\xa6\x00\x00\x81\xa5\x81\xa2\x81\xa3\x81\xa4\x81\xa7\x81\xaa\x00\x00\x00\x00\x84\xca\x84\xc7\x84\xc8\x62\xc0\x84\xc6\x84\xcc\x84\xcb\x84\xc9\x00\x00\x87\x71\x87\x72\x64\x5c\x00\x00\x64\x5d\x87\x70\x00\x00\x65\x85\x89\xac\x65\x84\x66\x6a\x00\x00\x66\x6b\x66\xf7\x8d\x5e\x8d\x5d\x8e\x8d\x8f\x7f", /* 7380 */ "\x67\xe5\x90\x59\x90\x58\x90\x5a\x4d\x89\x6e\xa8\x55\x7d\x57\xfa\x74\x50\x4d\x8a\x69\x87\x4c\xdd\x00\x00\x00\x00\x69\xe4\x00\x00\x00\x00\x00\x00\x6a\xec\x6a\xea\x6a\xeb\x6a\xe8\x4f\xaa\x6a\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\xaf\x00\x00\x51\x95\x6c\xad\x6c\xa9\x6c\xac\x00\x00\x6c\xa8\x51\x97\x6c\xab\x00\x00\x51\x94\x51\x93\x00\x00\x51\x96\x6c\xae\x6c\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x53\x65\x53\x68\x6e\xb0\x6e\xaf\x6e\xae\x53\x62\x6e\xb7\x6e\xad\x00\x00\x53\x64\x70\xf0\x00\x00\x6e\xb4\x6e\xb2\x53\x67\x00\x00\x6e\xaa\x6e\xb5\x00\x00\x6e\xac\x6e\xb6\x6e\xb3\x6e\xab\x00\x00\x53\x63\x6e\xb8\x6e\xa9\x53\x66\x00\x00\x00\x00\x00\x00\x00\x00\x70\xf5\x70\xec\x70\xf7\x00\x00\x70\xef\x70\xfa\x70\xfb\x70\xed\x70\xf9\x70\xf6\x70\xf4\x70\xf8\x55\x84\x00\x00\x55\x82\x00\x00\x00\x00\x70\xf2\x00\x00\x70\xee\x00\x00\x70\xf1\x70\xfc\x70\xf3\x55\x83\x6e\xb1\x00\x00\x55\x7e\x55\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x5e\x74\x53\x74\x51\x00\x00\x74\x52\x00\x00\x74\x59\x00\x00\x74\x5a\x74\x56\x58\x42\x74\x5b", /* 7400 */ "\x74\x58\x74\x55\x00\x00\x57\xfd\x74\x54\x57\xfb\x58\x41\x74\x57\x74\x5f\x55\x7f\x57\xfc\x74\x5d\x74\x5c\x58\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xa5\x00\x00\x00\x00\x00\x00\x77\xa6\x5a\x87\x00\x00\x77\xac\x00\x00\x00\x00\x77\xae\x77\xa7\x5a\x81\x77\xab\x77\xaa\x5a\x82\x5a\x88\x00\x00\x5a\x89\x77\xad\x5a\x7e\x77\xa4\x77\xa2\x77\xa8\x77\xa1\x5a\x86\x77\xa3\x77\xa9\x77\xaf\x5a\x7f\x5a\x85\x5a\x83\x5a\x84\x00\x00\x00\x00\x00\x00\x5a\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb0\x7a\xfc\x5c\xaf\x7b\x43\x00\x00\x7a\xf6\x00\x00\x7b\x44\x00\x00\x00\x00\x00\x00\x7a\xf7\x7a\xf8\x00\x00\x7b\x45\x7b\x42\x7a\xfd\x7b\x41\x7a\xfa\x7a\xf9\x00\x00\x7b\x46\x5c\xac\x00\x00\x7a\xfb\x00\x00\x5c\xb1\x5c\xab\x5c\xb2\x5c\xb3\x00\x00\x5c\xae\x5c\xad\x00\x00\x00\x00\x7e\x97\x5e\xe4\x5e\xe3\x00\x00\x00\x00\x7e\x9c\x00\x00\x60\xe4\x5e\xe5\x00\x00\x00\x00\x5e\xe7\x7e\x9d\x5c\xaa\x5e\xe6\x7e\x99\x7e\x9b\x7e\x98\x00\x00\x7e\x9a\x00\x00\x00\x00\x00\x00\x81\xb4\x00\x00\x00\x00\x81\xb3\x81\xb0\x60\xe7\x84\xcd", /* 7480 */ "\x60\xe8\x81\xaf\x00\x00\x60\xe6\x00\x00\x81\xb1\x81\xae\x81\xab\x81\xb2\x81\xac\x81\xad\x60\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x87\x76\x00\x00\x84\xd1\x00\x00\x84\xd0\x84\xd2\x00\x00\x87\x73\x62\xc3\x00\x00\x84\xce\x00\x00\x62\xc1\x00\x00\x62\xc5\x62\xc4\x84\xcf\x84\xd3\x00\x00\x62\xc2\x00\x00\x87\x7a\x64\x60\x65\x86\x64\x61\x64\x5e\x87\x77\x87\x75\x00\x00\x87\x78\x00\x00\x87\x7b\x64\x5f\x87\x79\x87\x74\x00\x00\x00\x00\x89\xaf\x89\xb2\x8b\xa4\x89\xad\x00\x00\x8d\x5f\x89\xb3\x00\x00\x66\x6c\x89\xb1\x65\x87\x89\xae\x89\xb0\x89\xb4\x8b\xa5\x00\x00\x8b\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x66\x6d\x8b\xa2\x00\x00\x00\x00\x00\x00\x66\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x67\x99\x8f\x82\x67\x98\x8f\x84\x8f\x81\x8f\x83\x68\x5c\x90\xc1\x4d\x8b\x6c\xb0\x70\xfd\x71\x41\x58\x44\x7b\x47\x62\xc6\x66\x6e\x67\xe6\x90\xc2\x4d\x8c\x00\x00\x6c\xb1\x46\xf8\x00\x00\x00\x00\x6e\xb9\x00\x00\x6e\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x42\x71\x43\x58\x45\x58\x46\x00\x00\x00\x00\x00\x00\x77\xb0\x00\x00\x7b\x4a\x7b\x49\x7b\x48", /* 7500 */ "\x7e\x9e\x00\x00\x7e\x9f\x7e\xa0\x5e\xe8\x00\x00\x00\x00\x81\xb6\x81\xb5\x00\x00\x00\x00\x84\xd4\x62\xc7\x62\xc8\x00\x00\x87\x7f\x87\x7c\x87\x7d\x87\x7e\x89\xb6\x89\xb5\x65\x88\x8b\xa6\x8e\x8e\x4d\x8d\x00\x00\x53\x69\x00\x00\x58\x47\x7b\x4b\x00\x00\x4d\x8e\x00\x00\x71\x44\x58\x48\x00\x00\x00\x00\x5a\x8a\x5a\x8b\x00\x00\x4d\x8f\x4d\x90\x69\xe5\x4f\xac\x4f\xab\x53\x6a\x6e\xbb\x77\xb1\x4d\x91\x4d\x92\x4d\x93\x4d\x94\x00\x00\x00\x00\x00\x00\x4f\xad\x4f\xae\x6a\xee\x6a\xed\x00\x00\x00\x00\x51\x98\x6c\xb4\x6c\xb2\x6c\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\xbc\x6e\xbd\x00\x00\x00\x00\x53\x6e\x53\x6c\x00\x00\x53\x6d\x53\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x55\x85\x00\x00\x00\x00\x00\x00\x00\x00\x55\x89\x55\x88\x71\x45\x55\x87\x55\x86\x00\x00\x71\x46\x00\x00\x00\x00\x58\x4b\x74\x61\x74\x60\x58\x49\x58\x4a\x00\x00\x00\x00\x00\x00\x5a\x8d\x5a\x8c\x77\xb3\x00\x00\x00\x00\x77\xb2\x58\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xb4\x7b\x4d\x5c\xb5\x7b\x4c\x00\x00\x00\x00\x00\x00\x7e\xa1\x81\xb7\x60\xe9", /* 7580 */ "\x84\xd5\x00\x00\x00\x00\x00\x00\x87\x81\x00\x00\x66\x70\x66\x6f\x00\x00\x00\x00\x67\xe7\x4d\x95\x6c\xb5\x00\x00\x00\x00\x58\x4d\x7e\xa2\x5e\xe9\x48\xa8\x00\x00\x6a\xef\x6a\xf0\x00\x00\x00\x00\x6c\xb6\x51\x9a\x51\x9b\x00\x00\x00\x00\x51\x99\x00\x00\x00\x00\x00\x00\x00\x00\x53\x72\x53\x73\x53\x70\x53\x71\x00\x00\x6e\xbe\x00\x00\x00\x00\x6e\xbf\x53\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x71\x47\x00\x00\x55\x8d\x55\x8e\x00\x00\x58\x50\x71\x4d\x00\x00\x55\x93\x55\x91\x71\x4e\x71\x49\x55\x90\x55\x8f\x55\x8a\x71\x4c\x71\x4b\x71\x48\x55\x92\x00\x00\x71\x4a\x55\x8b\x00\x00\x55\x8c\x00\x00\x00\x00\x58\x51\x74\x65\x74\x66\x58\x52\x74\x62\x74\x64\x74\x68\x74\x67\x74\x63\x00\x00\x58\x4e\x58\x4f\x00\x00\x77\xbb\x5a\x92\x5a\x91\x77\xb5\x5a\x8f\x00\x00\x77\xb8\x5a\x93\x77\xb9\x5a\x94\x77\xb6\x5a\x8e\x5a\x90\x77\xba\x00\x00\x77\xb7\x77\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x5a\x00\x00\x7b\x4f\x5c\xb7\x5c\xba\x5c\xb9\x5c\xbe\x5c\xbd\x7b\x5b\x7b\x59\x7b\x52\x7b\x56\x7b\x55\x5c\xbb\x7b\x58\x7b\x54\x7b\x5c\x7b\x53\x5c\xbc", /* 7600 */ "\x5c\xb6\x5c\xb8\x00\x00\x7b\x51\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xa4\x5e\xed\x7e\xa8\x5e\xec\x7e\xa5\x5e\xeb\x00\x00\x7b\x50\x7b\x57\x7e\xa7\x00\x00\x5e\xee\x7e\xa9\x7e\xa6\x7e\xa3\x00\x00\x00\x00\x81\xba\x81\xbe\x81\xc0\x81\xbc\x81\xbb\x81\xb9\x60\xec\x60\xea\x60\xef\x60\xf0\x81\xbd\x60\xed\x81\xb8\x60\xee\x5e\xea\x81\xbf\x60\xeb\x00\x00\x00\x00\x00\x00\x84\xd7\x00\x00\x84\xd6\x84\xde\x84\xd8\x84\xdd\x84\xda\x62\xc9\x84\xdc\x00\x00\x00\x00\x62\xca\x00\x00\x62\xcb\x00\x00\x84\xdb\x84\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x64\x63\x87\x82\x00\x00\x00\x00\x64\x62\x87\x85\x87\x83\x87\x84\x00\x00\x00\x00\x64\x64\x00\x00\x00\x00\x00\x00\x89\xba\x00\x00\x65\x8b\x89\xbb\x00\x00\x00\x00\x65\x89\x89\xbc\x65\x8a\x89\xb9\x89\xbd\x00\x00\x89\xb7\x00\x00\x00\x00\x66\x71\x8b\xa7\x66\x72\x66\xf9\x00\x00\x89\xb8\x66\xfa\x00\x00\x00\x00\x00\x00\x67\x9a\x8e\x8f\x00\x00\x67\xe9\x8f\x85\x67\xe8\x00\x00\x90\x5b\x68\x82\x68\x83\x00\x00\x00\x00\x91\xbc\x48\xa9\x00\x00\x53\x74\x6e\xc0\x00\x00\x5a\x95\x5a\x96\x4d\x96\x4e\x6b\x69\xe6", /* 7680 */ "\x00\x00\x6a\xf1\x4f\xaf\x00\x00\x51\x9c\x00\x00\x53\x75\x53\x76\x53\x77\x74\x6a\x71\x4f\x55\x94\x00\x00\x00\x00\x58\x53\x74\x69\x00\x00\x00\x00\x77\xbd\x5a\x98\x00\x00\x77\xbc\x5a\x97\x00\x00\x00\x00\x7b\x5d\x60\xf1\x81\xc4\x81\xc1\x81\xc2\x81\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x86\x00\x00\x89\xbe\x00\x00\x00\x00\x00\x00\x8d\x61\x8d\x60\x00\x00\x8f\x86\x4d\x97\x6c\xb7\x55\x95\x00\x00\x00\x00\x00\x00\x5a\x99\x7b\x5e\x00\x00\x00\x00\x7e\xaa\x00\x00\x60\xf2\x84\xdf\x00\x00\x89\xbf\x8d\x62\x4d\x98\x00\x00\x00\x00\x51\x9d\x53\x7a\x6e\xc1\x53\x7b\x53\x79\x00\x00\x53\x78\x71\x50\x55\x96\x00\x00\x00\x00\x55\x97\x55\x98\x00\x00\x00\x00\x00\x00\x58\x55\x74\x6b\x58\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xbe\x58\x56\x5a\x9a\x7b\x5f\x5c\xbf\x5c\xc0\x00\x00\x5e\xef\x00\x00\x5e\xf0\x60\xf3\x62\xcd\x84\xe0\x62\xcc\x00\x00\x87\x87\x64\x65\x00\x00\x89\xc0\x8d\x63\x4d\x99\x4f\xb0\x6c\xba\x6c\xb9\x51\x9e\x6c\xb8\x51\x9f\x6c\xbb\x00\x00\x6e\xc7\x53\x7e\x53\x7d\x6e\xc9\x6e\xc8\x53\x83\x00\x00\x53\x82\x00\x00", /* 7700 */ "\x00\x00\x53\x7c\x00\x00\x6e\xc3\x6e\xc4\x6e\xc5\x00\x00\x53\x84\x6e\xc2\x53\x7f\x6e\xc6\x53\x81\x00\x00\x00\x00\x00\x00\x00\x00\x71\x53\x71\x57\x71\x55\x71\x54\x00\x00\x71\x58\x00\x00\x00\x00\x00\x00\x71\x59\x71\x5a\x71\x52\x00\x00\x71\x51\x00\x00\x55\x9a\x55\x9b\x00\x00\x71\x5b\x71\x56\x00\x00\x74\x74\x00\x00\x71\x5c\x55\x9c\x55\x99\x00\x00\x00\x00\x00\x00\x74\x6e\x00\x00\x74\x6d\x00\x00\x74\x6f\x74\x70\x74\x72\x74\x71\x74\x76\x58\x5a\x58\x57\x58\x5b\x74\x6c\x58\x5c\x74\x75\x58\x59\x74\x73\x58\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xc1\x77\xc3\x77\xbf\x77\xc0\x00\x00\x00\x00\x77\xc4\x77\xc6\x77\xc7\x77\xc2\x77\xc5\x5a\x9b\x00\x00\x00\x00\x7b\x63\x00\x00\x7b\x68\x7b\x60\x7b\x64\x00\x00\x00\x00\x7b\x69\x7b\x65\x5c\xc1\x5c\xc9\x00\x00\x5c\xc4\x7b\x61\x7b\x62\x5e\xf4\x5c\xcc\x5c\xc5\x00\x00\x5c\xca\x5c\xc3\x7b\x67\x5c\xcb\x7b\x66\x5c\xc7\x5c\xc2\x5c\xc8\x7b\x6a\x7e\xaf\x7e\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xc6\x00\x00\x00\x00\x7e\xac\x5e\xf2\x7e\xb2\x5e\xf3", /* 7780 */ "\x7e\xb0\x7e\xab\x7e\xae\x7e\xb3\x5e\xf1\x7e\xad\x00\x00\x60\xf5\x81\xc8\x81\xc7\x00\x00\x60\xf8\x60\xf6\x81\xc5\x60\xf4\x81\xc6\x00\x00\x60\xf7\x00\x00\x00\x00\x00\x00\x84\xe8\x00\x00\x84\xea\x00\x00\x84\xe9\x84\xe1\x84\xe5\x84\xe4\x84\xe2\x62\xcf\x62\xd0\x62\xce\x84\xe3\x84\xe6\x84\xe7\x00\x00\x62\xd1\x00\x00\x64\x6a\x87\x8f\x00\x00\x64\x67\x87\x89\x64\x69\x64\x6b\x00\x00\x00\x00\x64\x68\x87\x8e\x87\x8a\x64\x66\x87\x8d\x87\x88\x87\x8c\x87\x8b\x00\x00\x00\x00\x89\xc2\x65\x8e\x65\x8f\x65\x8c\x00\x00\x65\x8d\x00\x00\x00\x00\x89\xc1\x00\x00\x8b\xaa\x00\x00\x00\x00\x66\x73\x00\x00\x8b\xa8\x8b\xa9\x00\x00\x8d\x64\x8d\x67\x8d\x65\x8d\x66\x8e\x90\x00\x00\x00\x00\x67\x9b\x90\x5c\x90\xc3\x00\x00\x68\x84\x91\x4a\x91\x4b\x68\xb2\x4d\x9a\x53\x85\x00\x00\x77\xc8\x00\x00\x7b\x6b\x00\x00\x4d\x9b\x4f\xb1\x00\x00\x51\xa0\x00\x00\x6e\xca\x6e\xcb\x55\x9d\x00\x00\x00\x00\x77\xc9\x5a\x9c\x5c\xcd\x64\x6c\x87\x90\x8b\xab\x8d\x68\x4d\x9c\x00\x00\x00\x00\x00\x00\x6c\xc1\x6c\xbc\x6c\xbe\x6c\xc0\x6c\xbf\x6c\xbd\x51\xa1\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x53\x86\x6e\xd4\x00\x00\x6e\xcf\x6e\xcc\x00\x00\x00\x00\x6e\xd3\x00\x00\x00\x00\x53\x88\x53\x89\x6e\xd2\x6e\xd1\x6e\xd0\x6e\xcd\x6e\xce\x6e\xd5\x53\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xa1\x00\x00\x55\xa7\x55\xa6\x71\x65\x71\x5f\x71\x5d\x00\x00\x55\xa4\x74\x7d\x55\x9f\x71\x62\x71\x66\x71\x68\x71\x64\x71\x5e\x55\xa5\x71\x63\x71\x61\x55\x9e\x71\x69\x55\xa8\x71\x67\x55\xa2\x71\x60\x00\x00\x55\xa3\x55\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x5e\x00\x00\x74\x7e\x00\x00\x00\x00\x74\x77\x74\x79\x74\x7b\x00\x00\x74\x7c\x74\x7a\x58\x5f\x00\x00\x74\x7f\x00\x00\x74\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xcd\x5a\x9d\x77\xd5\x00\x00\x77\xca\x00\x00\x77\xd6\x00\x00\x77\xcb\x77\xcc\x00\x00\x00\x00\x77\xd4\x77\xd3\x77\xd0\x58\x5d\x5a\x9e\x77\xce\x77\xd1\x5a\x9f\x77\xd2\x77\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x76\x00\x00\x7b\x7a\x5c\xd4\x00\x00\x7e\xb9\x5c\xd7", /* 7880 */ "\x7b\x78\x00\x00\x00\x00\x7b\x75\x7b\x70\x7b\x72\x7b\x73\x7b\x6c\x00\x00\x5c\xd3\x00\x00\x00\x00\x5c\xd2\x00\x00\x5c\xce\x7b\x6f\x00\x00\x5c\xd5\x00\x00\x5c\xd6\x7b\x6e\x7b\x71\x7b\x79\x5c\xd0\x5c\xd1\x7b\x77\x7b\x6d\x00\x00\x00\x00\x00\x00\x7e\xbb\x5e\xf6\x7e\xbd\x7b\x74\x7e\xbf\x5e\xfa\x7e\xc0\x7e\xbc\x00\x00\x5e\xf7\x7e\xb8\x5e\xf9\x7e\xb5\x7e\xba\x7e\xbe\x7e\xb7\x00\x00\x00\x00\x5c\xcf\x00\x00\x7e\xb4\x5e\xf8\x7e\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xfb\x81\xca\x61\x42\x00\x00\x60\xfd\x00\x00\x00\x00\x5e\xf5\x00\x00\x81\xd1\x81\xd2\x60\xfa\x00\x00\x00\x00\x81\xd0\x81\xd3\x60\xfc\x60\xf9\x81\xcc\x81\xc9\x81\xce\x81\xcb\x61\x43\x81\xcd\x00\x00\x00\x00\x81\xcf\x61\x41\x00\x00\x00\x00\x00\x00\x00\x00\x62\xd3\x84\xf1\x00\x00\x84\xeb\x84\xef\x84\xf5\x84\xf6\x84\xf2\x84\xf3\x84\xf0\x00\x00\x84\xed\x00\x00\x62\xd5\x62\xd2\x84\xec\x84\xee\x00\x00\x62\xd4\x84\xf4\x00\x00\x64\x70\x00\x00\x00\x00\x87\x96\x87\x91\x64\x6f\x00\x00\x00\x00\x64\x6d\x00\x00\x87\x98\x64\x6e\x87\x94\x87\x95\x87\x92\x87\x99\x89\xc3", /* 7900 */ "\x00\x00\x64\x71\x87\x93\x00\x00\x87\x9a\x87\x97\x00\x00\x00\x00\x00\x00\x89\xc7\x00\x00\x00\x00\x89\xc4\x00\x00\x65\x90\x00\x00\x89\xc8\x89\xca\x89\xc9\x89\xc5\x89\xc6\x00\x00\x00\x00\x8b\xb0\x00\x00\x66\x74\x00\x00\x8b\xad\x8b\xaf\x8b\xac\x8b\xb1\x00\x00\x00\x00\x8b\xae\x00\x00\x8d\x6a\x8d\x6d\x8d\x69\x66\xfb\x8d\x6b\x8d\x6c\x8d\x6e\x66\xfc\x67\x41\x66\xfd\x8e\x91\x00\x00\x8e\x93\x00\x00\x8e\x92\x00\x00\x00\x00\x00\x00\x8f\x87\x00\x00\x00\x00\x90\xc4\x91\x4c\x4d\x9d\x00\x00\x00\x00\x6a\xf2\x51\xa2\x6c\xc3\x51\xa3\x51\xa4\x6c\xc2\x00\x00\x6e\xda\x6e\xd9\x53\x8a\x53\x8d\x53\x8c\x53\x8b\x6e\xd6\x6e\xd8\x6e\xd7\x00\x00\x00\x00\x71\x6c\x55\xaa\x71\x70\x71\x6f\x71\x6e\x71\x6a\x55\xa9\x55\xad\x55\xb0\x00\x00\x00\x00\x55\xb1\x71\x6b\x71\x6d\x55\xaf\x55\xae\x55\xac\x55\xab\x74\x87\x00\x00\x74\x85\x74\x81\x58\x60\x00\x00\x74\x82\x58\x61\x74\x83\x74\x84\x74\x86\x00\x00\x58\x62\x00\x00\x00\x00\x77\xda\x00\x00\x77\xd9\x77\xd8\x77\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x7e\x5c\xd8\x00\x00\x7b\x7b\x7b\x7d\x00\x00\x5c\xd9", /* 7980 */ "\x00\x00\x5c\xda\x7b\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xc9\x00\x00\x7e\xc2\x7e\xc3\x00\x00\x5e\xfd\x5e\xfb\x5e\xfc\x7e\xcb\x00\x00\x7e\xca\x7e\xc7\x7e\xc6\x7e\xc5\x7e\xc4\x7e\xc8\x7e\xc1\x00\x00\x81\xd4\x81\xd9\x81\xd7\x00\x00\x00\x00\x00\x00\x81\xd6\x81\xd5\x81\xd8\x00\x00\x84\xf7\x00\x00\x62\xd6\x64\x72\x87\x9c\x00\x00\x64\x73\x87\x9b\x89\xcc\x89\xcb\x65\x91\x00\x00\x8b\xb2\x66\x75\x8d\x6f\x67\xea\x8f\x88\x00\x00\x90\xc6\x90\xc5\x69\x88\x53\x8e\x53\x8f\x74\x88\x00\x00\x5c\xdc\x4d\x9e\x4f\xb4\x4f\xb3\x4f\xb2\x00\x00\x00\x00\x00\x00\x6c\xc4\x00\x00\x00\x00\x51\xa6\x51\xa5\x00\x00\x53\x92\x00\x00\x6e\xdc\x6e\xdf\x6e\xdd\x00\x00\x53\x90\x53\x91\x00\x00\x00\x00\x6e\xdb\x6e\xde\x00\x00\x55\xb8\x00\x00\x00\x00\x00\x00\x71\x77\x71\x79\x71\x78\x55\xb5\x71\x73\x00\x00\x00\x00\x55\xb3\x55\xb2\x00\x00\x55\xb6\x55\xb4\x00\x00\x55\xb7\x71\x76\x71\x71\x71\x72\x71\x75\x71\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x8b\x74\x8c\x74\x8a\x00\x00\x74\x89\x58\x63\x00\x00\x00\x00\x00\x00\x00\x00", /* 7a00 */ "\x5a\xa4\x00\x00\x77\xdb\x77\xdd\x77\xdf\x5a\xa3\x00\x00\x00\x00\x5a\xa1\x00\x00\x77\xdc\x5a\xa2\x77\xde\x5a\xa0\x00\x00\x00\x00\x7b\x89\x7b\x7f\x7b\x83\x7b\x87\x5c\xe0\x7b\x85\x00\x00\x7b\x84\x7b\x81\x7b\x82\x5c\xde\x7b\x88\x5c\xdd\x00\x00\x5c\xe2\x5c\xe1\x5c\xdf\x00\x00\x7b\x86\x00\x00\x00\x00\x00\x00\x7e\xd1\x00\x00\x7e\xd0\x00\x00\x00\x00\x7e\xcc\x00\x00\x00\x00\x5f\x41\x7e\xcf\x7e\xce\x5f\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x48\x00\x00\x81\xdb\x00\x00\x61\x49\x61\x45\x61\x47\x00\x00\x61\x44\x61\x46\x00\x00\x00\x00\x00\x00\x84\xf8\x00\x00\x62\xd9\x84\xfa\x84\xf9\x00\x00\x7e\xcd\x62\xdb\x62\xda\x62\xd7\x62\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\xa1\x00\x00\x87\x9f\x64\x74\x87\xa0\x00\x00\x87\xa2\x87\x9e\x87\x9d\x00\x00\x00\x00\x89\xcd\x65\x94\x65\x92\x65\x93\x00\x00\x00\x00\x00\x00\x00\x00\x8b\xb3\x8b\xb4\x66\x77\x00\x00\x66\x76\x8d\x71\x8d\x72\x8d\x70\x00\x00\x8f\x89\x8f\x8a\x00\x00\x00\x00\x4d\x9f\x69\xe7\x4f\xb5\x00\x00\x6c\xc5\x51\xa8\x51\xa7\x6c\xc6\x00\x00\x00\x00\x6e\xe1\x53\x93", /* 7a80 */ "\x6e\xe0\x53\x94\x00\x00\x00\x00\x55\xb9\x71\x7c\x71\x7a\x71\x81\x55\xba\x71\x7b\x71\x7f\x71\x7d\x71\x7e\x00\x00\x00\x00\x74\x8d\x74\x8f\x00\x00\x58\x64\x00\x00\x74\x8e\x58\x65\x5a\xa7\x5a\xa6\x5a\xa5\x77\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x8c\x5c\xe3\x5c\xe4\x00\x00\x7b\x8b\x7b\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xd2\x5f\x44\x5f\x43\x7e\xd3\x7e\xd4\x00\x00\x61\x4b\x61\x4a\x00\x00\x85\x41\x81\xdc\x81\xde\x81\xdd\x84\xfd\x84\xfb\x85\x42\x84\xfc\x00\x00\x62\xdc\x00\x00\x00\x00\x00\x00\x87\xa3\x64\x75\x87\xa4\x87\xa5\x00\x00\x00\x00\x65\x95\x65\x96\x00\x00\x67\x42\x00\x00\x00\x00\x68\x5d\x4d\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x82\x55\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xfd\x58\xfc\x00\x00\x00\x00\x5a\xa9\x77\xe2\x5a\xa8\x77\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x8d\x00\x00\x5f\x45\x7e\xd5\x5f\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x43\x8d\x73\x00\x00\x4e\x6c\x51\xa9\x6c\xc7\x00\x00\x53\x96\x00\x00\x53\x95", /* 7b00 */ "\x6e\xe3\x6e\xe4\x00\x00\x00\x00\x71\x84\x71\x86\x55\xbc\x00\x00\x71\x88\x71\x8b\x71\x89\x00\x00\x00\x00\x00\x00\x71\x8a\x71\x87\x71\x83\x55\xbd\x71\x8c\x71\x85\x00\x00\x00\x00\x00\x00\x00\x00\x74\x98\x58\x6b\x74\xa1\x58\x68\x00\x00\x74\x9a\x58\x6c\x00\x00\x58\x66\x00\x00\x74\x95\x74\xa2\x74\x96\x74\x93\x58\x6a\x00\x00\x58\x67\x00\x00\x74\x99\x74\x9c\x58\x69\x74\x9d\x58\x6d\x74\x9e\x74\x94\x74\x9b\x74\x9f\x74\x97\x74\x92\x74\x90\x00\x00\x00\x00\x74\xa0\x00\x00\x00\x00\x77\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x77\xe9\x00\x00\x00\x00\x00\x00\x77\xe5\x77\xeb\x5a\xac\x74\x91\x77\xe6\x5a\xaa\x77\xe3\x5a\xb1\x77\xe7\x5a\xb0\x77\xe8\x5a\xb2\x5a\xad\x5a\xb3\x5a\xae\x00\x00\x5a\xaf\x00\x00\x5a\xab\x00\x00\x77\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xe7\x7b\x98\x00\x00\x7b\x9b\x7b\x8f\x7b\x94\x7b\x8e\x5c\xe9\x00\x00\x7b\x92\x00\x00\x00\x00\x00\x00\x7b\x90\x5c\xe8\x00\x00\x7b\x97\x7b\x96\x7b\x93\x7b\x95\x7b\x91\x5f\x4a\x7b\x9a\x5c\xe5\x7b\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7b80 */ "\x00\x00\x00\x00\x7e\xe5\x00\x00\x5f\x51\x7e\xe0\x00\x00\x5f\x50\x7e\xd6\x00\x00\x7e\xd8\x5f\x49\x7e\xdd\x7e\xdc\x7e\xdf\x5f\x4e\x7e\xda\x7e\xd9\x00\x00\x00\x00\x5f\x4d\x5f\x48\x7e\xdb\x5f\x4b\x7e\xe1\x7e\xe3\x00\x00\x7e\xde\x7e\xd7\x5f\x4c\x00\x00\x00\x00\x61\x53\x5f\x47\x00\x00\x00\x00\x7e\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\xe2\x61\x4c\x00\x00\x81\xe4\x00\x00\x61\x4d\x00\x00\x00\x00\x61\x4f\x81\xe7\x00\x00\x81\xdf\x5f\x4f\x81\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x81\xe1\x00\x00\x5c\xe6\x61\x52\x00\x00\x00\x00\x61\x4e\x00\x00\x61\x50\x61\x51\x00\x00\x62\xdf\x81\xe6\x81\xe0\x61\x54\x00\x00\x81\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x4c\x85\x47\x00\x00\x00\x00\x85\x51\x62\xdd\x85\x49\x62\xe1\x85\x4f\x85\x46\x85\x43\x85\x52\x64\x7b\x62\xe2\x85\x4e\x85\x44\x62\xe0\x85\x48\x62\xe4\x85\x45\x85\x4a\x62\xe3\x85\x4d\x85\x50\x00\x00\x00\x00\x00\x00\x00\x00\x87\xb7\x87\xb8\x87\xa8\x87\xaf\x87\xad\x00\x00\x00\x00\x64\x79\x87\xb4\x85\x4b\x00\x00\x87\xab\x00\x00\x87\xb5\x64\x78\x87\xaa", /* 7c00 */ "\x87\xa9\x87\xb3\x87\xb0\x87\xb2\x00\x00\x87\xa6\x87\xb6\x64\x76\x00\x00\x87\xb1\x87\xba\x87\xae\x64\x7a\x64\x77\x87\xac\x87\xa7\x87\xb9\x62\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\xd0\x00\x00\x00\x00\x89\xce\x89\xd4\x65\x9a\x89\xd2\x89\xd1\x65\x9c\x89\xd7\x65\x9b\x00\x00\x89\xd8\x89\xd5\x65\x98\x89\xd6\x89\xcf\x65\x99\x65\x97\x8b\xb8\x89\xd3\x00\x00\x00\x00\x89\xd9\x00\x00\x00\x00\x8b\xb5\x00\x00\x00\x00\x00\x00\x66\x7c\x66\x7a\x8b\xb7\x00\x00\x8b\xb9\x8b\xb6\x66\x7b\x66\x78\x66\x79\x66\x7d\x00\x00\x00\x00\x67\x45\x00\x00\x8d\x78\x00\x00\x8d\x77\x8d\x75\x8d\x74\x8d\x76\x00\x00\x67\x44\x67\x46\x00\x00\x00\x00\x67\x9c\x00\x00\x00\x00\x8e\x95\x8e\x94\x00\x00\x00\x00\x8f\x8b\x00\x00\x8f\x8d\x8f\x8f\x8f\x8e\x8f\x8c\x00\x00\x00\x00\x67\xec\x67\xeb\x00\x00\x00\x00\x68\x5f\x68\x5e\x68\x60\x90\x5e\x90\x5d\x00\x00\x91\x4d\x90\xc7\x91\x4e\x68\xa4\x00\x00\x68\xa5\x91\x7e\x00\x00\x00\x00\x68\xca\x4e\x6d\x00\x00\x6c\xc8\x00\x00\x00\x00\x6e\xe6\x6e\xe7\x6e\xe5\x00\x00\x00\x00\x53\x97\x00\x00\x6e\xe8", /* 7c80 */ "\x6e\xe9\x6e\xea\x00\x00\x00\x00\x71\x8d\x71\x93\x00\x00\x00\x00\x71\x91\x55\xbe\x71\x8f\x00\x00\x71\x90\x71\x92\x00\x00\x00\x00\x00\x00\x71\x8e\x58\x6e\x00\x00\x74\xa3\x58\x70\x74\xa5\x58\x6f\x74\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xed\x5a\xb4\x00\x00\x77\xef\x77\xec\x74\xa6\x00\x00\x5a\xb5\x00\x00\x00\x00\x77\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x9e\x00\x00\x5c\xea\x7b\x9c\x5c\xeb\x7b\x9d\x5c\xec\x00\x00\x00\x00\x00\x00\x5f\x52\x7e\xe9\x7e\xe6\x7e\xe8\x5f\x53\x5f\x54\x7e\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\xe8\x00\x00\x00\x00\x81\xe9\x00\x00\x61\x55\x81\xeb\x81\xea\x00\x00\x46\xf9\x00\x00\x85\x56\x85\x57\x85\x53\x00\x00\x85\x54\x62\xe5\x62\xe6\x85\x55\x00\x00\x64\x82\x00\x00\x00\x00\x64\x7d\x64\x83\x64\x7e\x64\x81\x64\x7c\x00\x00\x64\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x65\x9d\x87\xbb\x00\x00\x8b\xbb\x00\x00\x8b\xba\x00\x00\x8d\x79\x67\x47\x67\x48\x8f\x91\x8e\x96\x00\x00\x8f\x90\x00\x00\x91\x4f\x91\x94\x4e\x6e\x00\x00\x00\x00\x4f\xb6\x00\x00\x6c\xc9\x51\xaa\x00\x00", /* 7d00 */ "\x53\x9a\x6e\xed\x53\x98\x6e\xeb\x53\x9d\x53\x99\x53\x9e\x53\x9c\x6e\xec\x53\x9b\x55\xc2\x55\xc1\x71\x9e\x55\xca\x71\x97\x71\x9d\x55\xc6\x71\x96\x71\x9c\x71\x9a\x55\xc5\x55\xc7\x71\x99\x55\xc0\x71\x98\x55\xcb\x55\xc8\x55\xcc\x55\xc9\x71\x95\x71\x94\x71\x9b\x55\xc3\x55\xbf\x55\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xb5\x74\xae\x00\x00\x5a\xba\x74\xad\x00\x00\x58\x74\x58\x7b\x58\x78\x58\x7e\x58\x7d\x58\x79\x00\x00\x74\xa7\x74\xaa\x00\x00\x74\xa9\x58\x75\x74\xab\x74\xb4\x58\x76\x74\xa8\x74\xb1\x74\xb2\x58\x77\x74\xaf\x58\x7c\x58\x72\x58\x7a\x74\xac\x58\x71\x74\xb0\x00\x00\x00\x00\x74\xb3\x00\x00\x00\x00\x00\x00\x78\x43\x77\xf7\x5a\xb7\x78\x41\x77\xfb\x77\xf3\x77\xfc\x5a\xb9\x77\xf4\x00\x00\x77\xf0\x00\x00\x00\x00\x5c\xf2\x77\xf9\x00\x00\x5a\xb6\x78\x42\x00\x00\x5a\xbd\x5a\xbf\x77\xf2\x00\x00\x00\x00\x5a\xbe\x77\xf5\x5a\xb8\x77\xfd\x77\xf6\x77\xfa\x00\x00\x77\xf8\x5a\xbb\x77\xf1\x5a\xc0\x58\x73\x5a\xbc\x5a\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\xee\x7b\xa5\x7b\xa7\x7b\xa9\x7b\xad\x00\x00\x7b\xa3", /* 7d80 */ "\x7b\xa1\x5c\xf0\x00\x00\x7b\xa8\x7b\xac\x7b\xa4\x7b\xa0\x00\x00\x7b\x9f\x00\x00\x00\x00\x00\x00\x7b\xaa\x7b\xa2\x7b\xa6\x5c\xf1\x00\x00\x5c\xef\x7b\xae\x5c\xed\x7b\xab\x00\x00\x7e\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x57\x7e\xf2\x61\x62\x7e\xfc\x5f\x5a\x7f\x43\x5f\x60\x7e\xed\x00\x00\x00\x00\x7e\xfd\x7e\xea\x00\x00\x7f\x42\x7e\xee\x00\x00\x5f\x67\x5f\x64\x7f\x41\x7e\xf8\x5f\x56\x5f\x5e\x5f\x5d\x00\x00\x5f\x5c\x5f\x62\x00\x00\x7e\xeb\x5f\x63\x7e\xf9\x5f\x5f\x5f\x55\x7e\xfb\x5f\x58\x5f\x59\x5f\x61\x7e\xf0\x7e\xef\x7e\xec\x00\x00\x7e\xf4\x7e\xf1\x7e\xf5\x5f\x66\x00\x00\x7f\x44\x5f\x5b\x7e\xf6\x7e\xf7\x00\x00\x7e\xf3\x00\x00\x00\x00\x00\x00\x5f\x65\x00\x00\x00\x00\x00\x00\x00\x00\x81\xf0\x61\x5a\x61\x63\x61\x5f\x81\xed\x00\x00\x61\x5c\x61\x60\x81\xf9\x61\x56\x81\xf1\x00\x00\x61\x5e\x00\x00\x00\x00\x81\xf4\x81\xef\x61\x5d\x61\x61\x81\xee\x00\x00\x61\x5b\x00\x00\x81\xf8\x61\x58\x81\xf7\x81\xf6\x61\x64\x80\xbc\x61\x57\x00\x00\x81\xf5\x81\xec\x00\x00\x61\x65\x81\xf3\x61\x59\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x81\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x62\xe9\x62\xee\x62\xe7\x85\x64\x85\x5b\x85\x67\x85\x5f\x85\x65\x62\xef\x62\xe8\x85\x58\x85\x5e\x85\x68\x85\x61\x85\x66\x85\x5a\x00\x00\x00\x00\x85\x62\x62\xea\x85\x60\x62\xed\x62\xec\x85\x5c\x85\x5d\x85\x59\x85\x63\x62\xeb\x85\x6a\x85\x69\x00\x00\x00\x00\x00\x00\x87\xc6\x87\xc2\x64\x8a\x00\x00\x87\xbc\x64\x84\x64\x94\x87\xc8\x64\x8c\x64\x88\x87\xbf\x64\x8f\x64\x92\x87\xca\x64\x87\x87\xc1\x64\x90\x87\xcc\x87\xc9\x87\xbd\x64\x8b\x64\x85\x64\x93\x87\xc4\x64\x8e\x87\xbe\x64\x89\x87\xcb\x64\x8d\x64\x86\x87\xc5\x64\x91\x87\xc3\x00\x00\x00\x00\x87\xc7\x00\x00\x00\x00\x00\x00\x89\xdb\x89\xe1\x65\xa3\x89\xe4\x65\x9e\x65\x9f\x89\xdc\x89\xe3\x89\xde\x65\xa4\x65\xa1\x00\x00\x89\xda\x00\x00\x65\xa0\x89\xe0\x89\xe2\x65\xa2\x89\xdf\x89\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x8b\xc5\x66\x82\x66\x83\x66\x7e\x00\x00\x66\x7f\x00\x00\x8b\xc1\x8b\xbf\x00\x00\x8b\xc3\x66\x85\x8b\xc4\x8b\xbd\x8b\xbc\x8b\xc0\x8b\xbe\x66\x81\x8b\xc2\x8d\x7a\x67\x4b\x67\x4a\x8d\x7b\x00\x00", /* 7e80 */ "\x8d\x7d\x8d\x7c\x67\x4c\x00\x00\x00\x00\x00\x00\x8e\x9b\x8e\x98\x8e\x99\x00\x00\x8e\x97\x8e\x9a\x67\x9e\x8e\x9c\x00\x00\x67\x9d\x00\x00\x8f\x92\x00\x00\x68\x61\x68\x63\x90\x5f\x68\x62\x90\xc8\x91\x51\x91\x53\x91\x50\x91\x52\x68\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x6f\x00\x00\x53\x9f\x70\xd2\x55\xcd\x00\x00\x00\x00\x58\x7f\x78\x44\x78\x45\x00\x00\x00\x00\x00\x00\x85\x6b\x64\x95\x87\xcd\x00\x00\x00\x00\x65\xa5\x00\x00\x8b\xc7\x8b\xc6\x67\x4d\x8e\x9d\x00\x00\x8f\x93\x68\x85\x69\xe8\x00\x00\x00\x00\x51\xab\x4f\xb7\x00\x00\x00\x00\x6e\xee\x00\x00\x00\x00\x71\xa4\x71\x9f\x71\xa3\x71\xa1\x55\xce\x71\xa2\x71\xa0\x00\x00\x74\xb6\x00\x00\x78\x46\x78\x47\x7b\xb1\x7b\xb2\x5c\xf4\x5c\xf5\x7b\xb0\x7b\xb3\x7b\xaf\x5c\xf3\x00\x00\x5f\x68\x00\x00\x5c\xf6\x7f\x45\x00\x00\x61\x66\x81\xfa\x61\x67\x00\x00\x62\xf0\x85\x6e\x85\x6c\x85\x6d\x87\xd0\x87\xcf\x87\xce", /* 7f80 */ "\x00\x00\x00\x00\x00\x00\x8b\xc8\x00\x00\x66\x84\x8b\xc9\x8f\x94\x68\x86\x90\xc9\x4e\x70\x51\xad\x51\xac\x6e\xf0\x53\xa0\x00\x00\x00\x00\x6e\xef\x71\xa6\x00\x00\x55\xcf\x74\xb7\x71\xa5\x00\x00\x00\x00\x00\x00\x58\x82\x74\xba\x74\xb8\x74\xb9\x58\x81\x00\x00\x78\x49\x78\x4a\x78\x48\x00\x00\x5c\xf9\x7b\xb5\x7b\xb4\x7b\xb6\x5c\xf8\x5c\xf7\x00\x00\x00\x00\x81\xfb\x81\xfd\x00\x00\x61\x68\x81\xfc\x85\x6f\x62\xf1\x89\xe6\x00\x00\x89\xe5\x66\x86\x8b\xca\x66\x88\x66\x87\x8d\x7e\x8e\x9e\x67\x9f\x4e\x71\x6e\xf1\x53\xa1\x71\xa9\x55\xd1\x71\xa8\x71\xa7\x00\x00\x55\xd0\x00\x00\x74\xc0\x00\x00\x74\xc2\x74\xbb\x74\xbc\x58\x83\x74\xbd\x58\x84\x74\xc1\x74\xbe\x74\xbf\x58\x85\x00\x00\x5a\xc3\x5a\xc4\x00\x00\x78\x4b\x00\x00\x00\x00\x00\x00\x7b\xb7\x7b\xb8\x00\x00\x7f\x49\x5f\x6b\x5f\x69\x5f\x6a\x7f\x46\x7f\x47\x00\x00\x7f\x48\x82\x45\x00\x00\x82\x46\x61\x69\x82\x43\x82\x42\x82\x44\x82\x41\x62\xf4\x85\x70\x62\xf2\x62\xf3\x87\xd2\x64\x96\x87\xd1\x89\x55\x00\x00\x89\xe7\x89\xe8\x65\xa6\x00\x00\x65\xa7\x64\x97\x8b\xcb\x8b\xcc\x8d\x7f", /* 8000 */ "\x67\x4e\x4e\x72\x00\x00\x4e\x73\x53\xa2\x51\xae\x55\xd2\x6e\xf2\x00\x00\x00\x00\x00\x00\x5a\xc5\x4e\x74\x53\xa4\x6e\xf3\x6e\xf4\x53\xa3\x53\xa5\x4e\x75\x00\x00\x6e\xf5\x55\xd4\x71\xaa\x55\xd6\x55\xd3\x55\xd5\x00\x00\x74\xc5\x58\x86\x00\x00\x74\xc4\x74\xc3\x00\x00\x7b\xb9\x00\x00\x00\x00\x7f\x4a\x00\x00\x61\x6a\x00\x00\x62\xf5\x85\x72\x85\x71\x00\x00\x87\xd3\x00\x00\x00\x00\x00\x00\x8e\x9f\x00\x00\x00\x00\x4e\x76\x6a\xf3\x6c\xca\x53\xa6\x6e\xf6\x00\x00\x71\xac\x00\x00\x00\x00\x00\x00\x55\xd7\x71\xab\x55\xd8\x00\x00\x00\x00\x00\x00\x74\xc7\x00\x00\x00\x00\x58\x88\x74\xc6\x74\xc8\x00\x00\x58\x87\x00\x00\x00\x00\x00\x00\x00\x00\x78\x4d\x78\x4e\x78\x4c\x5a\xc6\x00\x00\x00\x00\x00\x00\x5c\xfa\x00\x00\x5c\xfb\x00\x00\x5f\x6d\x00\x00\x7f\x4c\x7f\x4b\x5f\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x47\x00\x00\x00\x00\x82\x48\x00\x00\x00\x00\x00\x00\x00\x00\x85\x73\x00\x00\x00\x00\x64\x9b\x64\x9a\x64\x98\x64\x99\x64\x9c\x00\x00\x89\xe9\x65\xa9\x65\xa8\x8b\xcd\x8d\x81\x00\x00\x00\x00\x00\x00\x67\xee\x67\xed\x4e\x77", /* 8080 */ "\x00\x00\x00\x00\x70\x9f\x00\x00\x5c\xfd\x5a\xc7\x5c\xfc\x5f\x6e\x00\x00\x4e\x78\x69\x89\x4e\x79\x4e\x7a\x00\x00\x00\x00\x6c\xcb\x6a\xf6\x00\x00\x6a\xf7\x4f\xb9\x00\x00\x6a\xf4\x4f\xb8\x00\x00\x4f\xbb\x6a\xf5\x4f\xbd\x4f\xbc\x6a\xf8\x4f\xba\x00\x00\x00\x00\x00\x00\x51\xb3\x51\xb1\x6c\xcd\x00\x00\x51\xb0\x00\x00\x00\x00\x00\x00\x51\xb5\x51\xb7\x51\xb4\x00\x00\x6c\xd0\x6c\xcc\x51\xb8\x00\x00\x51\xb2\x4f\xbe\x00\x00\x51\xb6\x6c\xcf\x00\x00\x00\x00\x6c\xce\x00\x00\x51\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\xfc\x53\xaa\x53\xab\x6f\x41\x00\x00\x6e\xf8\x6e\xfb\x6f\x47\x6f\x45\x00\x00\x53\xac\x6f\x4b\x53\xaf\x6f\x48\x6e\xfd\x6e\xfa\x00\x00\x00\x00\x78\x50\x6f\x46\x53\xa7\x6f\x49\x6e\xf7\x6f\x43\x53\xa9\x53\xae\x6f\x44\x53\xb2\x53\xb0\x00\x00\x6e\xf9\x53\xad\x00\x00\x6f\x42\x53\xb1\x53\xa8\x6f\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xdd\x00\x00\x55\xe6\x55\xdb\x55\xd9\x71\xae\x55\xe1\x55\xde\x71\xb0\x00\x00\x00\x00\x55\xe0\x71\xaf\x71\xad\x71\xb2\x55\xe5\x55\xe3\x78\x4f\x00\x00", /* 8100 */ "\x71\xb3\x71\xb1\x55\xda\x00\x00\x00\x00\x55\xdc\x55\xdf\x00\x00\x55\xe2\x00\x00\x55\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xd2\x58\x8a\x00\x00\x74\xc9\x74\xcb\x00\x00\x74\xcc\x00\x00\x74\xd4\x74\xd0\x74\xce\x00\x00\x74\xd1\x74\xd5\x58\x8b\x58\x8f\x74\xca\x00\x00\x74\xd3\x00\x00\x58\x8d\x00\x00\x58\x8c\x74\xcf\x74\xcd\x00\x00\x58\x89\x58\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xcd\x78\x58\x00\x00\x00\x00\x78\x56\x5a\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x78\x51\x7b\xc7\x00\x00\x5a\xce\x78\x55\x00\x00\x00\x00\x78\x52\x5a\xca\x5a\xd0\x78\x57\x5a\xcc\x78\x54\x5f\x6f\x5a\xcb\x78\x53\x5a\xd1\x5a\xc9\x5a\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\xbf\x7b\xbd\x00\x00\x7b\xc3\x00\x00\x7b\xbb\x7b\xc8\x7b\xc0\x00\x00\x7b\xba\x5d\x44\x5d\x4a\x7b\xc5\x00\x00\x7b\xbe\x00\x00\x5d\x47\x00\x00\x00\x00\x5d\x45\x7b\xc6\x5d\x42\x5d\x41\x7b\xc1\x5d\x46\x5a\xd2\x00\x00\x7b\xc4\x7b\xbc\x5d\x43\x5d\x48\x5d\x49\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x74", /* 8180 */ "\x5f\x70\x00\x00\x5f\x75\x7f\x4f\x00\x00\x00\x00\x7f\x4e\x7f\x50\x5f\x72\x7f\x4d\x5f\x73\x7f\x53\x7f\x52\x7f\x51\x00\x00\x5f\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x4c\x00\x00\x82\x4f\x61\x70\x82\x4e\x61\x6f\x61\x6b\x61\x6c\x61\x6d\x82\x4b\x82\x4a\x61\x6e\x00\x00\x82\x4d\x82\x49\x00\x00\x00\x00\x85\x75\x85\x7f\x62\xf8\x62\xf7\x00\x00\x85\x79\x85\x7b\x00\x00\x85\x76\x00\x00\x85\x7a\x85\x74\x85\x7d\x62\xf6\x85\x7c\x85\x78\x00\x00\x85\x7e\x00\x00\x85\x77\x64\x9f\x87\xd4\x87\xda\x64\xa3\x64\xa5\x64\xa2\x64\xa1\x00\x00\x64\xa0\x64\x9e\x87\xd5\x87\xd8\x64\x9d\x87\xd9\x00\x00\x64\xa4\x87\xd7\x00\x00\x87\xd6\x65\xaa\x00\x00\x65\xab\x89\xec\x89\xea\x89\xeb\x00\x00\x00\x00\x8b\xcf\x00\x00\x8b\xce\x66\x89\x8d\x83\x67\x4f\x8d\x82\x00\x00\x8e\xa0\x8f\x95\x67\xef\x91\x54\x91\x55\x68\x64\x4e\x7b\x00\x00\x51\xb9\x78\x59\x5f\x76\x64\xa6\x87\xdb\x4e\x7c\x00\x00\x55\xe8\x55\xe7\x78\x5a\x00\x00\x00\x00\x00\x00\x85\x81\x4e\x7d\x53\xb3\x00\x00\x00\x00\x78\x5b\x78\x5c\x78\x5d\x5f\x77\x62\xf9\x4e\x7e\x00\x00\x51\xba\x6f\x4c", /* 8200 */ "\x55\xe9\x71\xb4\x58\x90\x00\x00\x78\x5e\x5d\x4b\x00\x00\x5f\x78\x62\xfa\x64\xa7\x65\xac\x8d\x84\x4e\x7f\x51\xbb\x00\x00\x00\x00\x55\xea\x74\xd6\x5a\xd3\x00\x00\x5f\x79\x7f\x54\x82\x50\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x81\x5a\xd4\x7b\xc9\x5f\x7a\x4e\x82\x6c\xd1\x6f\x4d\x53\xb4\x00\x00\x00\x00\x71\xb6\x00\x00\x00\x00\x55\xed\x00\x00\x55\xeb\x55\xec\x55\xee\x00\x00\x00\x00\x71\xb5\x00\x00\x00\x00\x74\xdb\x74\xd8\x74\xda\x58\x91\x58\x93\x58\x92\x74\xd7\x58\x94\x74\xd9\x00\x00\x78\x5f\x78\x60\x00\x00\x78\x61\x7b\xcc\x00\x00\x7b\xcd\x00\x00\x7b\xcb\x7b\xce\x00\x00\x5d\x4c\x00\x00\x7b\xca\x00\x00\x5f\x7b\x00\x00\x00\x00\x82\x55\x82\x51\x82\x54\x82\x56\x82\x53\x82\x52\x00\x00\x85\x82\x85\x83\x85\x84\x62\xfb\x62\xfc\x87\xdd\x87\xdc\x87\xde\x00\x00\x89\xee\x89\xed\x00\x00\x8b\xd1\x00\x00\x8b\xd2\x8b\xd0\x00\x00\x67\x50\x00\x00\x8d\x85\x8d\x86\x00\x00\x8f\x96\x90\x60\x90\xca\x4e\x83\x4f\xbf\x00\x00\x64\xa8\x4e\x84\x00\x00\x74\xdc\x78\x62\x00\x00\x68\x8d\x69\xe9\x00\x00\x00\x00\x00\x00\x69\xea\x69\xec\x4e\x85\x69\xed", /* 8280 */ "\x69\xeb\x00\x00\x00\x00\x6b\x43\x6b\x44\x6a\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x42\x4f\xc1\x00\x00\x4f\xc2\x6a\xfc\x6a\xfa\x6a\xf9\x6a\xfd\x4f\xc0\x6b\x41\x6f\x4e\x00\x00\x00\x00\x00\x00\x6c\xd6\x51\xbe\x6c\xd5\x6c\xd7\x00\x00\x51\xbd\x6c\xdc\x51\xc1\x6c\xd2\x6c\xe0\x6c\xe6\x51\xc8\x6c\xe3\x51\xc5\x00\x00\x6c\xd9\x6c\xdf\x6c\xe1\x00\x00\x6c\xd4\x51\xc4\x51\xbf\x6c\xda\x51\xc6\x51\xc9\x51\xc3\x00\x00\x51\xbc\x6c\xde\x6c\xd8\x6c\xe5\x51\xcb\x51\xc7\x51\xc2\x6c\xdd\x55\xef\x6c\xdb\x51\xc0\x51\xca\x00\x00\x6c\xd3\x00\x00\x6c\xe2\x6c\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xc5\x53\xbf\x53\xc7\x53\xc4\x6f\x55\x6f\x58\x53\xc0\x00\x00\x6f\x4f\x00\x00\x53\xb9\x53\xc3\x00\x00\x53\xc6\x53\xc8\x6f\x64\x6f\x5b\x00\x00\x53\xb8\x6f\x63\x53\xbc\x53\xba\x53\xb5\x6f\x53\x00\x00\x6f\x62\x6f\x57\x6f\x5a\x6f\x67\x00\x00\x53\xc9\x6f\x61\x53\xc1\x6f\x5c\x6f\x66\x6f\x59\x6f\x5d\x6f\x60\x00\x00\x00\x00\x6f\x51\x6f\x65\x6f\x5f\x00\x00\x00\x00\x6f\x50\x00\x00", /* 8300 */ "\x6f\x54\x53\xc2\x53\xbd\x53\xb6\x53\xbb\x53\xb7\x53\xca\x6f\x52\x71\xc7\x53\xbe\x00\x00\x00\x00\x6f\x5e\x6d\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\xca\x55\xfd\x00\x00\x71\xba\x00\x00\x71\xc5\x71\xc1\x00\x00\x71\xd4\x00\x00\x71\xcc\x00\x00\x71\xc2\x00\x00\x71\xcb\x71\xbc\x71\xc0\x71\xd7\x56\x43\x71\xcf\x71\xc6\x55\xf0\x71\xd5\x71\xb8\x00\x00\x71\xce\x00\x00\x56\x42\x55\xfa\x71\xb7\x55\xf8\x55\xf7\x55\xfc\x71\xcd\x55\xf4\x55\xfb\x6f\x56\x78\x63\x71\xc8\x00\x00\x00\x00\x71\xbe\x56\x41\x71\xbf\x71\xc3\x56\x44\x71\xb9\x71\xd1\x00\x00\x71\xd0\x71\xd8\x55\xf6\x55\xf3\x71\xd6\x71\xd2\x71\xc9\x71\xc4\x55\xf9\x55\xf5\x71\xbb\x55\xf1\x71\xd3\x55\xf2\x00\x00\x71\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xe2\x74\xe4\x74\xe9\x74\xfd\x58\xa2\x58\x98\x00\x00\x74\xe1\x58\xa3\x58\xa4\x74\xec\x74\xf3\x74\xf9", /* 8380 */ "\x00\x00\x74\xe6\x00\x00\x74\xed\x00\x00\x00\x00\x58\xa5\x74\xfb\x74\xf6\x58\xa0\x58\x9e\x74\xf2\x74\xee\x74\xe0\x58\x95\x74\xe5\x74\xdd\x00\x00\x58\x9d\x58\x9f\x74\xea\x74\xe7\x58\x9a\x74\xf7\x58\x97\x74\xe8\x75\x41\x74\xf0\x00\x00\x74\xef\x58\x96\x00\x00\x58\xa1\x00\x00\x58\x99\x74\xde\x74\xe3\x74\xf4\x74\xfa\x58\xa6\x74\xdf\x74\xeb\x74\xf1\x58\x9c\x00\x00\x00\x00\x74\xfc\x74\xf5\x74\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x9b\x00\x00\x78\x73\x78\x67\x5a\xdc\x78\x85\x78\x8d\x78\x90\x5a\xda\x78\x6f\x78\x89\x78\x70\x78\x7e\x5a\xe7\x78\x7a\x5a\xe4\x00\x00\x78\x7b\x78\x64\x00\x00\x78\x8a\x00\x00\x00\x00\x5a\xed\x78\x87\x78\x7c\x78\x92\x78\x77\x7b\xee\x00\x00\x78\x95\x5a\xeb\x78\x75\x78\x82\x5a\xee\x5a\xd9\x78\x79\x78\x93\x78\x72\x78\x6b\x78\x76\x00\x00\x78\x6a\x78\x68\x5a\xd5\x78\x8b\x78\x71\x78\x8e\x00\x00\x78\x8f\x5a\xdd\x5a\xe2\x5a\xde\x5a\xe6\x78\x86\x5a\xdf\x78\x7d\x78\x6d\x00\x00\x5a\xd7\x78\x65\x78\x88\x78\x91\x78\x6c\x5a\xe5\x78\x96\x78\x78", /* 8400 */ "\x00\x00\x78\x74\x00\x00\x5a\xd6\x5a\xea\x00\x00\x78\x84\x5a\xec\x00\x00\x78\x7f\x5a\xe1\x5a\xdb\x5a\xe3\x5a\xd8\x5a\xe9\x78\x81\x78\x6e\x78\x83\x78\x69\x78\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\xed\x00\x00\x7c\x46\x5c\xdb\x7b\xf2\x00\x00\x7b\xf0\x7b\xdb\x5d\x50\x7b\xeb\x7c\x42\x7b\xe7\x5d\x58\x7c\x41\x7b\xe5\x5a\xe8\x7b\xf5\x7b\xe6\x7b\xfc\x5d\x57\x5d\x4f\x00\x00\x7b\xd0\x7b\xd8\x00\x00\x7b\xf1\x7b\xe9\x7c\x45\x7b\xec\x5d\x5d\x7b\xfd\x00\x00\x5d\x54\x00\x00\x7b\xef\x7b\xf7\x7b\xdc\x7b\xf6\x00\x00\x7c\x4a\x7b\xd7\x7b\xf8\x00\x00\x7c\x48\x00\x00\x7b\xd1\x5a\xe0\x00\x00\x7b\xdf\x7b\xde\x5d\x56\x00\x00\x7b\xe2\x7b\xe4\x7b\xf3\x7c\x47\x5d\x59\x00\x00\x5d\x5a\x00\x00\x7b\xd6\x5d\x52\x7b\xda\x7c\x43\x5d\x5b\x00\x00\x5d\x53\x5d\x55\x5d\x5c\x7c\x49\x7b\xf9\x7b\xf4\x00\x00\x00\x00\x7b\xe1\x7b\xe0\x5d\x51\x7b\xd2\x5d\x4e\x7b\xea\x7b\xd3\x7b\xe8\x00\x00\x00\x00\x7b\xdd\x7c\x44\x00\x00", /* 8480 */ "\x00\x00\x00\x00\x5d\x4d\x00\x00\x00\x00\x00\x00\x7b\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\xd5\x7b\xfb\x7b\xd4\x5f\x89\x7f\x7c\x00\x00\x00\x00\x7f\x6b\x00\x00\x00\x00\x7f\x55\x7f\x73\x5f\x81\x7f\x64\x7f\x6e\x5f\x84\x7f\x67\x5f\x82\x7f\x58\x7f\x76\x7f\x57\x7f\x6a\x00\x00\x7f\x56\x00\x00\x00\x00\x7f\x68\x7f\x71\x7f\x6f\x7f\x63\x7f\x5e\x7f\x5c\x00\x00\x7f\x5d\x7f\x70\x7f\x7b\x7f\x65\x5f\x83\x00\x00\x7f\x60\x00\x00\x7f\x74\x00\x00\x5f\x86\x7f\x5f\x7f\x59\x7f\x69\x5f\x8a\x00\x00\x00\x00\x5f\x7d\x5f\x87\x7f\x61\x7f\x5b\x00\x00\x5f\x7f\x7b\xfa\x5f\x7e\x7f\x6c\x00\x00\x5f\x7c\x5f\x8c\x5f\x85\x7f\x6d\x7f\x62\x7f\x5a\x7f\x75\x7f\x66\x5f\x8b\x7f\x79\x5f\x88\x7f\x78\x00\x00\x7f\x72\x7f\x77\x00\x00\x00\x00\x00\x00\x7f\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x7e\x82\x7f\x82\x72\x82\x71\x82\x6d\x61\x7c\x00\x00\x61\x74\x82\x82\x82\x81\x7b\xcf\x82\x6a\x82\x6e\x82\x68\x00\x00\x82\x7b\x82\x6c\x00\x00\x82\x83\x82\x65\x82\x63\x82\x6f\x82\x79\x82\x74\x61\x7e", /* 8500 */ "\x82\x5a\x00\x00\x82\x78\x00\x00\x00\x00\x00\x00\x61\x7f\x7b\xe3\x82\x66\x82\x5d\x82\x60\x82\x87\x82\x67\x82\x5e\x82\x5c\x82\x59\x00\x00\x61\x78\x82\x70\x61\x77\x61\x7b\x82\x6b\x82\x73\x61\x71\x82\x84\x82\x88\x61\x73\x00\x00\x82\x62\x82\x76\x82\x7a\x82\x5f\x82\x85\x61\x7a\x00\x00\x61\x79\x82\x57\x61\x7d\x82\x7d\x82\x61\x82\x75\x82\x5b\x82\x69\x82\x64\x61\x75\x61\x76\x82\x77\x82\x89\x82\x86\x82\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x58\x00\x00\x61\x72\x85\x95\x00\x00\x85\x8c\x85\x8f\x00\x00\x63\x45\x85\x91\x85\x86\x85\x8d\x85\x93\x63\x42\x63\x46\x62\xfd\x00\x00\x00\x00\x85\x88\x85\x98\x00\x00\x00\x00\x85\x92\x00\x00\x85\x89\x85\xa1\x85\x9b\x85\x85\x87\xf1\x85\x8b\x63\x41\x00\x00\x85\x96\x00\x00\x85\xa0\x63\x49\x00\x00\x85\x9d\x85\x8a\x85\x90\x85\x94\x85\x8e\x85\xa2\x85\x9f\x85\x9c\x63\x43\x63\x44\x63\x48\x85\x87\x85\xa3\x63\x47\x85\x99\x00\x00\x00\x00\x85\x97\x00\x00\x00\x00\x00\x00\x85\x9a\x88\x41\x87\xeb\x87\xf0\x87\xfd\x87\xef\x87\xe7\x87\xec\x00\x00\x64\xab\x00\x00", /* 8580 */ "\x87\xe0\x87\xf8\x87\xfa\x87\xdf\x64\xaa\x87\xfc\x87\xf4\x64\xb1\x87\xfb\x87\xed\x64\xb3\x87\xe5\x85\x9e\x87\xf5\x87\xf2\x87\xe1\x88\x43\x64\xad\x00\x00\x00\x00\x64\xae\x87\xe3\x87\xf3\x00\x00\x88\x42\x87\xf6\x87\xe9\x64\xb0\x64\xac\x87\xf7\x87\xea\x88\x44\x87\xe4\x87\xee\x87\xf9\x87\xe6\x87\xe8\x00\x00\x65\xb5\x87\xe2\x64\xb2\x65\xae\x64\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x64\xaf\x65\xb2\x8a\x41\x00\x00\x89\xf4\x89\xef\x89\xf5\x8a\x42\x8a\x46\x8a\x45\x65\xb4\x65\xb3\x00\x00\x00\x00\x89\xf6\x8a\x47\x89\xf9\x89\xf1\x00\x00\x89\xf3\x89\xf2\x89\xf8\x89\xfd\x89\xf0\x89\xf7\x89\xfc\x65\xb1\x00\x00\x89\xfa\x00\x00\x65\xaf\x89\xfb\x65\xad\x65\xb0\x8b\xe2\x8a\x43\x00\x00\x00\x00\x66\x8d\x00\x00\x8b\xda\x8b\xde\x8b\xd6\x8b\xd9\x00\x00\x8b\xe1\x66\x8b\x8b\xe6\x8b\xdf\x00\x00\x8b\xd7\x8b\xe7\x8b\xe0\x66\x8e\x66\x8f\x8b\xe4\x00\x00\x8b\xd8\x66\x8a\x66\x8c\x8b\xd3\x8b\xdb\x8b\xd5\x00\x00\x8b\xe5\x8b\xe3\x8b\xd4\x8b\xdc\x00\x00\x00\x00\x00\x00\x8d\x8d\x66\x90\x8b\xdd\x67\x52\x67\x54\x67\x51\x00\x00\x8d\x92\x8d\x8a\x8d\x88", /* 8600 */ "\x8d\x8c\x8d\x89\x00\x00\x00\x00\x8d\x8e\x8d\x90\x67\x55\x67\x57\x00\x00\x8d\x8f\x67\x58\x67\x56\x8d\x91\x00\x00\x00\x00\x00\x00\x00\x00\x67\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xa0\x8e\xa1\x8e\xa7\x67\xa2\x8d\x8b\x8e\xa6\x00\x00\x8e\xad\x8e\xa4\x8e\xab\x8e\xaa\x8d\x87\x8e\xa5\x8a\x44\x8e\xae\x8e\xa3\x8e\xa8\x00\x00\x8e\xac\x8e\xa2\x00\x00\x8f\x9a\x67\xa1\x8e\xa9\x00\x00\x00\x00\x90\x65\x8f\x9b\x8f\x99\x8f\x97\x8f\x98\x8f\x9c\x00\x00\x68\x65\x90\x63\x90\x61\x90\x66\x90\x64\x00\x00\x90\x67\x68\x66\x90\x62\x00\x00\x00\x00\x90\xcb\x00\x00\x00\x00\x91\x56\x91\x57\x91\x58\x00\x00\x00\x00\x91\xb7\x91\xad\x69\xee\x51\xcc\x00\x00\x53\xcb\x00\x00\x71\xda\x71\xd9\x56\x45\x58\xa7\x75\x43\x00\x00\x00\x00\x75\x42\x00\x00\x5a\xef\x5d\x5f\x00\x00\x5d\x5e\x5d\x60\x00\x00\x7f\x7d\x82\x8a\x85\xa4\x85\xa6\x85\xa5\x00\x00\x64\xb4\x88\x45\x8a\x48\x91\x95\x4e\x86\x00\x00\x6c\xe9\x6c\xea\x6c\xe8\x6c\xe7\x51\xcd\x00\x00\x6f\x6b\x6f\x69\x00\x00\x00\x00\x6f\x68\x00\x00\x53\xcc\x53\xce\x53\xcd\x6f\x6a\x00\x00\x00\x00\x00\x00", /* 8680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\xe6\x71\xe3\x71\xe1\x00\x00\x00\x00\x56\x46\x71\xe4\x56\x4b\x71\xde\x71\xed\x00\x00\x71\xef\x71\xdf\x00\x00\x56\x48\x71\xf0\x71\xeb\x71\xdd\x71\xe2\x71\xec\x71\xe8\x71\xe5\x00\x00\x56\x4d\x71\xee\x71\xe0\x00\x00\x00\x00\x71\xe9\x71\xdb\x56\x4c\x56\x49\x71\xe7\x00\x00\x71\xea\x71\xdc\x56\x4a\x56\x47\x00\x00\x00\x00\x00\x00\x00\x00\x58\xb1\x75\x4a\x58\xb0\x00\x00\x75\x4d\x75\x50\x58\xad\x58\xab\x75\x45\x75\x4e\x75\x4c\x75\x49\x75\x51\x75\x52\x75\x54\x75\x55\x75\x44\x58\xaa\x75\x47\x75\x46\x75\x53\x58\xac\x75\x48\x58\xae\x58\xa9\x75\x4b\x58\xb2\x00\x00\x58\xaf\x75\x4f\x00\x00\x00\x00\x00\x00\x5a\xf6\x78\xa5\x00\x00\x78\x9a\x5a\xf3\x00\x00\x7c\x50\x78\xa3\x78\x97\x5a\xf1\x78\x9c\x5a\xf4\x78\xa0\x78\x9e\x5a\xf7\x5a\xf0\x00\x00\x00\x00\x78\x98\x78\x9b\x5a\xf5\x00\x00\x78\x99\x00\x00\x78\xa4\x78\xa2\x78\x9d\x78\x9f\x78\xa1\x5a\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x51\x7c\x57\x7c\x4d\x7c\x53\x5d\x61\x7c\x4f\x5d\x67\x00\x00\x00\x00\x5d\x66\x00\x00", /* 8700 */ "\x5d\x65\x7c\x56\x5d\x68\x5d\x69\x7c\x4c\x7c\x59\x5d\x6a\x5d\x64\x5d\x63\x7c\x55\x5d\x6b\x7c\x4b\x7c\x4e\x7c\x58\x7c\x54\x00\x00\x00\x00\x7f\x9e\x7f\x93\x5d\x62\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x93\x7f\x87\x7f\x9c\x7f\x88\x5f\x8e\x00\x00\x7f\x85\x00\x00\x7f\x8e\x7f\x86\x5f\x90\x7f\x7f\x7f\x9b\x5f\x91\x7f\x98\x7f\x99\x7f\x81\x5f\x96\x7f\x90\x00\x00\x7f\x8a\x7f\x91\x7f\x84\x00\x00\x7f\x9d\x7f\x95\x7f\x8f\x7f\x7e\x5f\x92\x7f\x96\x00\x00\x5f\x95\x7f\x9a\x00\x00\x7f\x94\x5f\x8f\x7f\x92\x00\x00\x7f\x8c\x5f\x8d\x7f\x83\x7f\x8b\x7f\x97\x7f\x89\x00\x00\x00\x00\x7f\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x8a\x7c\x52\x82\x9c\x82\xa5\x82\x9b\x82\x97\x82\x94\x61\x8b\x82\x92\x5f\x94\x82\x8b\x61\x89\x82\x91\x61\x88\x82\x96\x82\x93\x82\xa3\x82\x9e\x82\x98\x82\x9d\x61\x84\x82\x95\x82\xa8\x82\x8c\x82\x8d\x82\xa4\x61\x85\x82\xa9\x61\x87\x82\xaa\x82\x9a\x7f\x82\x82\xa0\x82\x99\x82\xa2\x82\x9f\x00\x00\x00\x00\x00\x00\x82\x90\x61\x82\x82\xa7\x61\x83\x82\x8e\x61\x86\x85\xb0\x82\xa1\x82\xa6\x00\x00\x00\x00\x00\x00\x00\x00", /* 8780 */ "\x00\x00\x85\xad\x61\x81\x63\x4a\x85\xb7\x85\xb3\x00\x00\x85\xb1\x85\xac\x85\xbb\x00\x00\x00\x00\x00\x00\x63\x4e\x00\x00\x85\xa8\x85\xb4\x85\xb5\x85\xab\x85\xaa\x85\xb8\x00\x00\x85\xae\x85\xa9\x85\xaf\x00\x00\x85\xba\x85\xa7\x85\xb9\x85\xb6\x63\x4c\x63\x4b\x00\x00\x00\x00\x63\x4d\x85\xb2\x8a\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x47\x64\xba\x88\x4b\x88\x48\x88\x4f\x88\x55\x88\x4a\x00\x00\x88\x5e\x64\xb7\x88\x58\x88\x4d\x88\x59\x88\x54\x88\x5b\x88\x4c\x64\xbc\x64\xbb\x88\x4e\x88\x5c\x88\x46\x88\x5a\x64\xb5\x00\x00\x88\x52\x88\x51\x88\x56\x88\x49\x64\xb9\x00\x00\x64\xbd\x88\x50\x88\x57\x64\xbe\x88\x53\x00\x00\x00\x00\x00\x00\x00\x00\x64\xb6\x64\xb8\x8a\x55\x8a\x53\x00\x00\x00\x00\x8a\x5a\x8a\x57\x8a\x5b\x00\x00\x8a\x4c\x8a\x54\x8a\x5f\x88\x5d\x8a\x50\x65\xb9\x82\x8f\x8a\x4b\x8a\x58\x8a\x52\x8a\x4f\x8a\x4a\x8a\x49\x8a\x5e\x00\x00\x8a\x4e\x8a\x4d\x65\xb7\x8a\x56\x00\x00\x65\xb6\x00\x00\x00\x00\x65\xb8\x8a\x51\x8a\x5d\x00\x00\x8b\xeb\x8b\xec\x00\x00\x66\x94\x8b\xe9\x66\x91\x8b\xf1\x00\x00\x66\x95\x8b\xf3", /* 8800 */ "\x8b\xe8\x8a\x5c\x8b\xf5\x8b\xea\x00\x00\x66\x92\x8b\xf0\x00\x00\x8b\xf2\x8b\xed\x8b\xf4\x8b\xef\x8b\xee\x66\x93\x00\x00\x00\x00\x8d\x94\x8d\x95\x00\x00\x8d\x97\x67\x59\x67\x5a\x8d\x98\x8d\x96\x00\x00\x8d\x93\x00\x00\x8e\xb1\x8e\xb4\x8e\xb0\x00\x00\x67\xa6\x8e\xb2\x67\xa5\x67\xa4\x67\xa3\x8e\xb3\x8f\xa1\x8f\x9f\x00\x00\x8f\x9e\x8e\xaf\x8f\xa0\x8e\xb5\x8f\x9d\x00\x00\x90\x6a\x90\x48\x90\x68\x68\x67\x90\x69\x90\x6b\x00\x00\x90\xce\x68\x87\x90\xcd\x90\xcc\x68\x88\x00\x00\x68\xa6\x91\x7f\x91\x97\x91\x96\x91\x98\x4e\x87\x6f\x6c\x00\x00\x71\xf1\x71\xf2\x00\x00\x00\x00\x00\x00\x78\xa6\x00\x00\x8e\xb6\x90\xcf\x4e\x88\x53\xcf\x6f\x6d\x00\x00\x00\x00\x00\x00\x75\x56\x58\xb3\x00\x00\x78\xa8\x78\xa7\x5a\xf8\x00\x00\x5d\x6c\x82\xab\x61\x8c\x00\x00\x61\x8d\x00\x00\x00\x00\x00\x00\x63\x4f\x68\x89\x4e\x89\x00\x00\x00\x00\x00\x00\x6f\x6e\x51\xcf\x6f\x70\x6f\x6f\x53\xd0\x00\x00\x71\xf3\x00\x00\x71\xfa\x56\x4e\x71\xf8\x71\xf6\x00\x00\x71\xfd\x71\xf4\x71\xf5\x56\x4f\x00\x00\x56\x53\x00\x00\x00\x00\x72\x41\x56\x52\x71\xfc\x71\xf9", /* 8880 */ "\x71\xf7\x56\x50\x56\x51\x71\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x58\xb5\x75\x57\x00\x00\x58\xba\x75\x67\x58\xb9\x75\x69\x00\x00\x00\x00\x75\x5d\x58\xb7\x75\x68\x00\x00\x75\x58\x58\xb8\x75\x64\x75\x60\x75\x62\x75\x5c\x75\x63\x00\x00\x00\x00\x58\xb4\x75\x5f\x00\x00\x75\x5e\x75\x5a\x00\x00\x75\x65\x00\x00\x00\x00\x75\x61\x75\x59\x00\x00\x75\x5b\x58\xb6\x75\x66\x00\x00\x00\x00\x00\x00\x00\x00\x5a\xfb\x78\xb3\x00\x00\x00\x00\x00\x00\x78\xaf\x78\xb1\x78\xac\x78\xab\x78\xa9\x00\x00\x78\xb0\x78\xb2\x78\xae\x00\x00\x78\xad\x5a\xf9\x5a\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\xb5\x5d\x74\x7c\x5b\x7c\x61\x7c\x5c\x7c\x5d\x00\x00\x7c\x62\x00\x00\x5d\x76\x00\x00\x5d\x6e\x5d\x75\x7c\x5a\x78\xaa\x5d\x71\x5d\x6f\x7c\x60\x7c\x5f\x5d\x70\x5d\x72\x7c\x5e\x5d\x6d\x00\x00\x5d\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa0\x5f\x9d\x00\x00\x00\x00\x7f\xab\x7f\xaa\x00\x00\x7f\xa5\x5f\x9f\x7f\xa9\x7f\xa1\x7f\xa2\x5f\x97\x5f\x99\x00\x00\x7f\xa7\x7f\x9f\x5f\x9b\x5f\x9a\x7f\xa3\x7f\xa8\x7f\xa6\x5f\x9c\x7f\xa4\x00\x00", /* 8900 */ "\x00\x00\x78\xb4\x5f\x98\x00\x00\x00\x00\x82\xac\x82\xb3\x61\x8f\x00\x00\x82\xb7\x61\x93\x82\xaf\x82\xad\x00\x00\x82\xb6\x00\x00\x61\x8e\x82\xb5\x61\x90\x61\x91\x82\xae\x61\x92\x82\xb4\x82\xb0\x82\xb1\x82\xb2\x5f\x9e\x00\x00\x00\x00\x00\x00\x85\xbc\x85\xc8\x00\x00\x63\x54\x85\xc3\x85\xc5\x00\x00\x63\x52\x85\xbd\x85\xc1\x00\x00\x85\xc4\x63\x50\x63\x53\x85\xc7\x85\xbf\x85\xc0\x85\xc6\x85\xbe\x85\xc2\x63\x51\x88\x60\x00\x00\x88\x5f\x64\xc0\x88\x65\x64\xc2\x00\x00\x00\x00\x64\xbf\x88\x61\x64\xc3\x88\x62\x00\x00\x00\x00\x88\x63\x88\x66\x00\x00\x64\xc1\x00\x00\x8a\x64\x00\x00\x00\x00\x8a\x67\x00\x00\x8a\x61\x8a\x63\x00\x00\x00\x00\x8a\x62\x8a\x65\x8a\x66\x88\x64\x8a\x60\x00\x00\x00\x00\x66\x98\x8b\xf9\x8b\xfc\x8c\x41\x8b\xf7\x8b\xf8\x8b\xfb\x8b\xfd\x66\x99\x66\x97\x66\x96\x8b\xfa\x8b\xf6\x8d\x99\x67\x5b\x00\x00\x8d\x9a\x00\x00\x00\x00\x8e\xb8\x67\xa7\x8e\xba\x67\xa8\x8e\xb7\x8e\xb9\x67\xf1\x00\x00\x8f\xa2\x67\xf0\x90\x6e\x90\x6d\x00\x00\x90\x6c\x00\x00\x00\x00\x91\x59\x91\x5a\x91\x5c\x91\x5b\x00\x00\x69\xef\x4e\x8a", /* 8980 */ "\x00\x00\x53\xd1\x75\x6a\x5a\xfc\x00\x00\x7c\x63\x65\xba\x00\x00\x8c\x42\x00\x00\x00\x00\x4f\xc3\x00\x00\x00\x00\x00\x00\x58\xbc\x00\x00\x00\x00\x00\x00\x58\xbb\x00\x00\x78\xb6\x5a\xfd\x78\xb8\x78\xb7\x00\x00\x00\x00\x7c\x64\x5d\x77\x7f\xac\x7f\xaf\x7f\xae\x00\x00\x7f\xad\x82\xb8\x82\xba\x82\xb9\x00\x00\x63\x56\x00\x00\x00\x00\x00\x00\x63\x55\x00\x00\x64\xc4\x88\x67\x88\x69\x88\x68\x00\x00\x00\x00\x65\xbb\x00\x00\x00\x00\x00\x00\x8c\x44\x8c\x43\x00\x00\x8d\x9b\x67\x5c\x00\x00\x00\x00\x67\xa9\x8f\xa4\x8f\xa3\x68\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xc4\x6f\x71\x53\xd2\x75\x6d\x75\x6b\x00\x00\x00\x00\x75\x6c\x78\xba\x78\xbb\x7c\x6b\x78\xb9\x00\x00\x7c\x65\x7c\x69\x7c\x68\x7c\x6a\x5d\x78\x7c\x67\x7c\x66\x7c\x6c\x00\x00\x7f\xb2\x7f\xb0\x00\x00\x7f\xb1\x82\xbd\x82\xbb\x00\x00\x00\x00\x82\xbc\x85\xc9\x88\x6a\x88\x6b\x65\xbc\x00\x00\x8c\x45\x8d\x9c\x67\x5d\x00\x00\x8e\xbb\x8f\xa5\x67\xf2\x00\x00\x90\x6f\x91\x5d", /* 8a00 */ "\x4f\xc5\x00\x00\x53\xd4\x53\xd5\x6f\x72\x00\x00\x00\x00\x6f\x73\x53\xd3\x00\x00\x56\x59\x00\x00\x56\x57\x00\x00\x56\x56\x56\x5d\x56\x55\x56\x5e\x72\x42\x56\x5b\x00\x00\x56\x58\x56\x5c\x56\x5a\x56\x54\x00\x00\x00\x00\x58\xc4\x00\x00\x58\xbe\x75\x71\x58\xc3\x00\x00\x00\x00\x58\xc5\x58\xbf\x00\x00\x58\xc0\x00\x00\x75\x6f\x00\x00\x00\x00\x58\xbd\x00\x00\x75\x70\x58\xc2\x00\x00\x00\x00\x75\x6e\x58\xc1\x00\x00\x00\x00\x5b\x4b\x00\x00\x5b\x4d\x00\x00\x00\x00\x78\xbe\x5b\x4c\x5b\x41\x5b\x45\x00\x00\x5d\x8c\x7c\x71\x78\xc0\x5b\x46\x00\x00\x00\x00\x78\xc3\x78\xc4\x5b\x4a\x00\x00\x78\xc6\x00\x00\x78\xc8\x00\x00\x78\xc9\x78\xbd\x78\xbc\x78\xca\x5b\x49\x78\xc7\x78\xc5\x00\x00\x5b\x47\x5b\x43\x5b\x4e\x78\xc1\x78\xc2\x78\xbf\x00\x00\x5b\x48\x00\x00\x00\x00\x5b\x44\x00\x00\x5b\x42\x7c\x70\x5d\x87\x5d\x82\x00\x00\x00\x00\x5d\x7c\x00\x00\x5d\x8d\x5d\x7d\x00\x00\x5d\x79\x5d\x89\x5d\x86\x5d\x88\x00\x00\x5d\x7e\x5d\x84\x5d\x7a\x5d\x7b\x7c\x78\x7c\x75\x7c\x6d\x7c\x72\x00\x00\x5d\x8a\x7c\x79\x5d\x8b\x5d\x81\x00\x00\x00\x00\x7c\x6f", /* 8a80 */ "\x00\x00\x7c\x77\x7c\x73\x7c\x76\x7c\x74\x5d\x85\x7c\x6e\x5d\x7f\x00\x00\x00\x00\x00\x00\x7f\xb5\x5f\xa1\x5f\xa4\x00\x00\x7f\xb7\x00\x00\x5f\xac\x7f\xb6\x5f\xa6\x00\x00\x61\x98\x7f\xb8\x00\x00\x5f\xab\x7f\xb4\x5f\xad\x00\x00\x00\x00\x00\x00\x5f\xa2\x00\x00\x5d\x83\x5f\xa5\x00\x00\x5f\xa3\x5f\xa7\x5f\xa9\x5f\xa0\x5f\xae\x5f\xaa\x00\x00\x5f\xa8\x7f\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x61\x9f\x00\x00\x61\x9b\x00\x00\x00\x00\x00\x00\x61\xa2\x00\x00\x82\xc0\x61\xa3\x82\xcc\x82\xc5\x61\x94\x82\xcd\x82\xc7\x61\x9e\x82\xc8\x00\x00\x61\x9d\x82\xcb\x61\x97\x82\xc9\x82\xbf\x61\x96\x85\xd4\x61\x9c\x00\x00\x61\x99\x00\x00\x61\xa1\x00\x00\x82\xbe\x00\x00\x82\xc2\x61\x95\x82\xc1\x82\xc3\x82\xc4\x61\xa0\x82\xc6\x82\xca\x82\xce\x00\x00\x61\xa4\x63\x5c\x85\xcf\x85\xd5\x85\xd2\x85\xca\x85\xd6\x85\xcb\x00\x00\x85\xd1\x00\x00\x63\x57\x63\x5d\x85\xd7\x00\x00\x00\x00\x63\x59\x00\x00\x63\x63\x63\x5e\x85\xd9\x85\xd3\x63\x5a\x85\xcc\x63\x64\x85\xcd\x85\xce\x63\x65\x63\x62\x61\x9a\x00\x00\x63\x58\x85\xda\x63\x66\x00\x00\x63\x5f\x85\xd8", /* 8b00 */ "\x63\x5b\x63\x60\x63\x61\x00\x00\x64\xcc\x88\x70\x88\x79\x88\x76\x88\x78\x00\x00\x64\xc9\x88\x71\x00\x00\x88\x77\x64\xc5\x88\x73\x64\xcd\x88\x6f\x88\x74\x88\x7b\x85\xd0\x88\x75\x88\x6e\x64\xc6\x88\x6d\x64\xc7\x88\x7c\x64\xc8\x88\x7a\x64\xcb\x88\x6c\x00\x00\x64\xca\x00\x00\x88\x72\x8a\x6a\x8a\x78\x8a\x73\x8a\x75\x8a\x69\x65\xbd\x00\x00\x8a\x68\x65\xc0\x65\xbf\x00\x00\x8a\x77\x8a\x6f\x8a\x6c\x8a\x72\x00\x00\x8a\x6b\x00\x00\x8a\x6d\x8a\x76\x8a\x74\x00\x00\x65\xbe\x8a\x7b\x8a\x79\x8a\x70\x8a\x7a\x8a\x71\x00\x00\x8c\x49\x66\x9a\x8c\x50\x00\x00\x00\x00\x8e\xbe\x66\xa1\x8a\x6e\x8c\x47\x66\x9d\x8c\x48\x8c\x4d\x00\x00\x00\x00\x66\x9f\x66\xa0\x8c\x46\x8c\x4f\x8c\x51\x8c\x4a\x8c\x4c\x8c\x4e\x8c\x4b\x8c\x52\x66\x9c\x66\xa2\x66\x9e\x00\x00\x66\x9b\x8d\x9f\x00\x00\x67\x62\x8d\x9d\x00\x00\x00\x00\x8d\xa1\x00\x00\x8d\xa2\x67\x60\x8d\xa3\x8d\xa0\x00\x00\x8d\x9e\x67\x63\x67\x5f\x8d\xa4\x00\x00\x67\x61\x67\x5e\x00\x00\x00\x00\x00\x00\x67\xaa\x00\x00\x00\x00\x67\xab\x8e\xbd\x8e\xbc\x8e\xbf\x8e\xc0\x00\x00\x67\xac\x8f\xa6\x8f\xab", /* 8b80 */ "\x67\xf3\x00\x00\x8f\xa8\x00\x00\x8f\xa7\x8f\xaa\x8f\xa9\x00\x00\x90\x73\x00\x00\x68\x68\x90\x72\x90\x70\x00\x00\x90\x71\x00\x00\x00\x00\x00\x00\x68\x8b\x68\x8a\x90\xd0\x90\xd1\x68\x8c\x00\x00\x91\x5e\x91\x5f\x68\xb3\x00\x00\x68\xb9\x00\x00\x91\x99\x91\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xc6\x00\x00\x75\x72\x00\x00\x75\x73\x7c\x7a\x7f\xb9\x82\xcf\x64\xcf\x00\x00\x64\xce\x8a\x7c\x8c\x53\x00\x00\x90\x74\x4f\xc7\x72\x43\x56\x5f\x58\xc6\x7c\x7c\x7c\x7b\x61\xa5\x82\xd0\x61\xa6\x88\x7d\x65\xc1\x00\x00\x00\x00\x00\x00\x68\xc2\x4f\xc8\x6c\xeb\x72\x44\x00\x00\x00\x00\x58\xc7\x00\x00\x75\x74\x75\x75\x00\x00\x78\xcb\x00\x00\x5b\x4f\x5d\x8e\x00\x00\x7c\x7e\x7c\x7d\x7c\x7f\x00\x00\x7f\xba\x7f\xbb\x5f\xaf\x63\x67\x61\xa7\x63\x68\x00\x00\x88\x82\x88\x7e\x88\x81\x88\x7f\x64\xd0\x00\x00\x8a\x7d\x8c\x55\x8c\x54\x6b\x45\x56\x61\x56\x60\x72\x45\x00\x00\x75\x76\x00\x00\x00\x00", /* 8c80 */ "\x78\xcd\x78\xcc\x5b\x50\x00\x00\x7c\x82\x7c\x83\x7c\x81\x00\x00\x00\x00\x5d\x90\x5d\x8f\x00\x00\x5f\xb1\x5f\xb0\x00\x00\x82\xd1\x85\xdd\x85\xdb\x85\xdc\x63\x69\x88\x84\x88\x83\x00\x00\x8a\x81\x8a\x7f\x8a\x7e\x8c\x56\x00\x00\x91\x9a\x4f\xc9\x53\xd6\x00\x00\x53\xd7\x56\x62\x56\x63\x72\x47\x72\x46\x75\x77\x00\x00\x58\xcd\x58\xcb\x58\xc8\x58\xcc\x58\xca\x58\xc9\x00\x00\x00\x00\x5b\x51\x78\xd0\x00\x00\x5d\x95\x5b\x53\x5b\x58\x78\xd2\x5b\x5a\x5b\x59\x5b\x5c\x78\xd1\x78\xce\x5b\x56\x5b\x52\x5b\x54\x78\xcf\x5b\x5b\x5b\x57\x5b\x55\x5d\x97\x5d\x96\x5d\x94\x5d\x98\x00\x00\x5d\x92\x5d\x93\x00\x00\x5d\x91\x00\x00\x7c\x84\x00\x00\x00\x00\x7f\xbd\x00\x00\x5f\xb3\x5f\xb4\x5f\xb2\x00\x00\x7f\xbc\x00\x00\x7f\xbe\x00\x00\x82\xd4\x82\xd6\x00\x00\x61\xb0\x82\xd7\x61\xa9\x82\xd3\x61\xa8\x61\xb2\x61\xae\x61\xaf\x61\xab\x82\xd2\x61\xaa\x82\xd8\x82\xd5\x00\x00\x61\xb1\x00\x00\x61\xac\x61\xad\x85\xdf\x00\x00\x85\xe1\x85\xe0\x00\x00\x85\xe2\x63\x6a\x85\xde\x00\x00\x00\x00\x64\xd4\x88\x85\x64\xd1\x64\xd5\x64\xd3\x64\xd2\x8a\x82\x00\x00", /* 8d00 */ "\x8a\x85\x00\x00\x8a\x84\x00\x00\x8a\x83\x65\xc2\x8c\x57\x8c\x58\x66\xa3\x8c\x59\x66\xa4\x00\x00\x00\x00\x67\x65\x00\x00\x67\x64\x8e\xc1\x00\x00\x00\x00\x67\xad\x8e\xc2\x8f\xac\x67\xf4\x67\xf5\x00\x00\x90\x75\x00\x00\x68\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xca\x00\x00\x58\xcf\x58\xce\x7c\x85\x7c\x86\x00\x00\x5f\xb5\x85\xe3\x61\xb3\x85\xe4\x88\x86\x4f\xcb\x00\x00\x6f\x74\x53\xd9\x53\xd8\x00\x00\x72\x48\x56\x64\x72\x49\x75\x7a\x00\x00\x75\x79\x00\x00\x75\x78\x00\x00\x00\x00", /* 8d80 */ "\x78\xd4\x5b\x5f\x00\x00\x00\x00\x78\xd3\x5b\x5e\x00\x00\x00\x00\x00\x00\x78\xd5\x5b\x5d\x00\x00\x7c\x88\x7c\x8b\x7c\x89\x7c\x8a\x7c\x8e\x7c\x87\x7c\x8f\x7c\x8c\x7c\x8d\x5f\xb7\x7f\xbf\x00\x00\x00\x00\x5f\xb6\x00\x00\x82\xdc\x82\xda\x00\x00\x00\x00\x61\xb4\x82\xd9\x82\xdb\x00\x00\x61\xb5\x00\x00\x85\xe5\x00\x00\x85\xe6\x64\xd6\x00\x00\x8c\x5b\x8c\x5d\x8c\x5a\x8c\x5c\x8d\xa5\x8e\xc3\x00\x00\x00\x00\x91\x81\x4f\xcc\x53\xda\x72\x4a\x72\x4c\x72\x4b\x00\x00\x75\x7d\x58\xd1\x00\x00\x75\x7b\x00\x00\x58\xd0\x75\x7e\x00\x00\x75\x7f\x75\x7c\x00\x00\x00\x00\x78\xe1\x5b\x67\x78\xd9\x78\xdf\x00\x00\x00\x00\x5b\x62\x5b\x65\x78\xd8\x5b\x60\x78\xdc\x7c\x95\x5b\x64\x00\x00\x78\xd7\x00\x00\x78\xdd\x78\xda\x78\xe0\x78\xd6\x78\xde\x5b\x63\x5b\x66\x78\xdb\x5b\x61\x00\x00\x5d\x9a\x7c\x91\x5d\x99\x7c\x98\x7c\x97\x5d\xa0\x00\x00\x5d\xa1\x7c\x99\x5d\x9b\x7c\x96\x5d\x9f\x7c\x9b\x7c\x92\x00\x00\x7c\x94\x5d\x9c\x7c\x90\x7c\x93\x7c\x9a\x5d\x9d\x7c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x9e\x00\x00\x5f\xb8\x7f\xc4\x7f\xca\x7f\xc2", /* 8e00 */ "\x7f\xcb\x00\x00\x7f\xc1\x7f\xc6\x7f\xcc\x7f\xc9\x7f\xc8\x7f\xc7\x00\x00\x7f\xc0\x7f\xc5\x00\x00\x00\x00\x7f\xc3\x00\x00\x61\xba\x61\xb7\x82\xe5\x82\xea\x82\xec\x82\xe9\x82\xe2\x82\xe4\x82\xee\x82\xeb\x82\xe6\x82\xef\x82\xe3\x82\xed\x61\xb8\x61\xbe\x61\xbc\x82\xdd\x61\xbd\x61\xb9\x82\xde\x82\xe0\x82\xdf\x82\xe7\x82\xe8\x00\x00\x61\xbb\x00\x00\x61\xb6\x00\x00\x00\x00\x82\xe1\x00\x00\x85\xf0\x63\x6c\x00\x00\x85\xe7\x63\x6d\x63\x70\x85\xec\x00\x00\x85\xe9\x63\x6f\x00\x00\x00\x00\x85\xed\x85\xee\x85\xe8\x85\xf1\x85\xea\x85\xef\x63\x6e\x00\x00\x63\x6b\x85\xeb\x00\x00\x88\x8c\x64\xd9\x64\xd7\x64\xda\x64\xd8\x88\x8b\x88\x88\x88\x87\x00\x00\x88\x8a\x00\x00\x00\x00\x88\x89\x8a\x93\x65\xc8\x8a\x8a\x8a\x89\x00\x00\x65\xc3\x8a\x8f\x8a\x8e\x8a\x86\x8a\x91\x8a\x8b\x65\xc7\x8a\x88\x8a\x90\x8a\x87\x65\xc4\x65\xc6\x8a\x8c\x65\xc5\x8a\x8d\x00\x00\x8a\x92\x8c\x61\x00\x00\x66\xa9\x8c\x5e\x00\x00\x8c\x62\x00\x00\x00\x00\x66\xa6\x8c\x60\x66\xab\x00\x00\x66\xa8\x00\x00\x8c\x5f\x00\x00\x66\xaa\x8c\x63\x66\xa5\x00\x00\x00\x00\x00\x00", /* 8e80 */ "\x00\x00\x67\x67\x67\x69\x00\x00\x8d\xa8\x67\x68\x8d\xa6\x66\xa7\x8d\xa7\x67\x66\x67\xae\x67\xb0\x8e\xc5\x67\xaf\x8e\xc4\x00\x00\x8f\xb1\x67\xf6\x8f\xb0\x67\xf7\x8f\xae\x8f\xad\x8f\xb2\x8f\xb3\x90\x76\x00\x00\x8f\xaf\x00\x00\x00\x00\x90\xd5\x90\xd2\x90\xd3\x90\xd4\x68\xa8\x00\x00\x91\x62\x91\x61\x91\x60\x91\x82\x00\x00\x91\xae\x91\x9b\x68\xba\x4f\xcd\x56\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xbf\x00\x00\x00\x00\x85\xf2\x00\x00\x00\x00\x65\xc9\x00\x00\x8c\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x9c\x4f\xce\x51\xd0\x53\xdc\x53\xdb\x00\x00\x56\x68\x00\x00\x72\x4d\x56\x66\x72\x4e\x56\x67\x00\x00\x00\x00\x75\x85\x75\x81\x00\x00\x00\x00\x58\xd2\x75\x84\x75\x83\x75\x82\x58\xd3\x75\x86\x75\x87\x00\x00\x00\x00\x00\x00\x78\xe8\x78\xe6\x78\xea\x78\xeb\x78\xf1\x00\x00\x78\xed\x78\xef\x00\x00\x78\xe7\x78\xe2\x00\x00\x78\xee\x00\x00\x00\x00\x78\xf0\x78\xe9\x78\xec\x78\xe3\x5b\x69\x78\xe5\x78\xe4\x5b\x68\x5b\x6a\x00\x00\x5d\xa5\x7c\x9e", /* 8f00 */ "\x7c\xa0\x7c\x9f\x7c\xa4\x5d\xa3\x00\x00\x7c\xa1\x7c\x9d\x7c\xa2\x7c\xa3\x5d\xa4\x5d\xa6\x7c\xa5\x00\x00\x7f\xd0\x7f\xcf\x00\x00\x7f\xcd\x7f\xce\x5f\xba\x5f\xbc\x5f\xb9\x5f\xbb\x82\xf6\x82\xf7\x82\xf2\x00\x00\x82\xf3\x61\xc1\x61\xc6\x61\xc0\x61\xc7\x61\xc2\x82\xf4\x00\x00\x00\x00\x82\xf5\x82\xf1\x61\xc8\x61\xc4\x00\x00\x00\x00\x61\xc3\x61\xc5\x00\x00\x82\xf0\x00\x00\x85\xf4\x63\x72\x00\x00\x00\x00\x85\xf6\x63\x74\x85\xf9\x85\xf5\x85\xf3\x85\xf8\x63\x73\x85\xf7\x00\x00\x63\x71\x00\x00\x00\x00\x64\xdc\x64\xdf\x88\x8e\x00\x00\x64\xdd\x88\x8d\x64\xdb\x64\xde\x8a\x94\x8a\x95\x8a\x96\x65\xca\x00\x00\x8a\x97\x00\x00\x65\xcb\x66\xad\x8c\x67\x8c\x68\x8c\x66\x8c\x65\x8c\x69\x66\xac\x8d\xac\x8d\xaa\x8d\xab\x8d\xad\x8d\xa9\x8d\xae\x8e\xc7\x00\x00\x8e\xc8\x8e\xc6\x67\xb1\x8f\xb4\x67\xf8\x8f\xb5\x90\x78\x90\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xcf\x5b\x6b\x00\x00\x00\x00\x5d\xa7\x00\x00\x00\x00\x00\x00\x5f\xbd\x00\x00\x00\x00\x63\x76\x00\x00\x63\x75\x00\x00\x00\x00\x00\x00\x00\x00\x66\xae\x67\x49\x67\xb2\x4f\xd0\x56\x69\x5d\xa8\x00\x00\x8c\x6a\x48\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x47\x00\x00\x00\x00\x4f\xd1\x00\x00\x4f\xd4\x4f\xd3\x4f\xd2\x00\x00\x00\x00\x6b\x46\x00\x00\x6c\xed\x00\x00\x6c\xef\x51\xd1\x00\x00\x00\x00\x51\xd3\x6c\xec\x6c\xee\x51\xd2\x6c\xf1\x6c\xf0\x6c\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x78\x6f\x76\x53\xdf\x6f\x75\x53\xe4\x53\xe1\x53\xde\x00\x00\x53\xe5\x00\x00\x53\xe0\x53\xe3\x00\x00\x53\xe2\x6f\x77\x00\x00\x53\xdd\x00\x00\x00\x00\x00\x00\x56\x6f\x72\x50\x72\x56\x56\x6c\x56\x73\x00\x00\x56\x6e\x72\x53\x72\x55\x56\x71\x72\x4f\x72\x52", /* 9000 */ "\x56\x6d\x56\x6a\x72\x51\x56\x70\x72\x54\x56\x72\x56\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x75\x89\x75\x8c\x58\xd5\x00\x00\x58\xdf\x58\xdb\x75\x8a\x00\x00\x00\x00\x58\xe3\x58\xdc\x58\xe1\x58\xd7\x00\x00\x58\xd4\x58\xd6\x58\xe2\x75\x8b\x58\xda\x58\xdd\x58\xd9\x58\xde\x75\x8d\x58\xe0\x58\xd8\x75\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\xf2\x5b\x6c\x78\xf4\x00\x00\x5b\x6e\x5b\x70\x00\x00\x78\xf3\x5b\x6d\x5b\x71\x00\x00\x5b\x6f\x00\x00\x00\x00\x00\x00\x5d\xae\x7c\xaa\x5d\xb6\x7c\xa7\x00\x00\x5d\xb7\x5d\xac\x00\x00\x7c\xa8\x00\x00\x00\x00\x5d\xb1\x00\x00\x7c\xa9\x5d\xaa\x5d\xa9\x00\x00\x5d\xb4\x5d\xb3\x5d\xb2\x5d\xb0\x5d\xb5\x7c\xa6\x5d\xab\x5d\xad\x5d\xaf\x00\x00\x00\x00\x5f\xbf\x5f\xc2\x00\x00\x5f\xc6\x5f\xc0\x5f\xc5\x5f\xc3\x00\x00\x5f\xbe\x00\x00\x5f\xc4\x5f\xc1\x00\x00\x00\x00\x00\x00\x82\xfb\x61\xcb\x61\xc9\x00\x00\x82\xfc\x00\x00\x61\xcc\x61\xca\x82\xfa\x82\xf9\x00\x00\x63\x7a\x82\xf8\x63\x78\x63\x77\x85\xfa\x61\xcd\x63\x79\x85\xfb\x63\x7c\x85\xfc\x63\x7b\x64\xe1\x88\x90\x64\xe0", /* 9080 */ "\x64\xe5\x64\xe3\x64\xe4\x65\xcd\x64\xe2\x88\x8f\x85\xfd\x65\xcc\x65\xce\x00\x00\x66\xaf\x66\xb0\x00\x00\x8d\xaf\x00\x00\x68\x6a\x68\x69\x4f\xd6\x00\x00\x00\x00\x69\xf4\x56\x74\x00\x00\x69\xf1\x69\xf2\x69\xf0\x00\x00\x69\xf3\x00\x00\x00\x00\x6b\x4b\x6b\x48\x6b\x4d\x6b\x49\x4f\xd7\x4f\xda\x00\x00\x6b\x4a\x4f\xd9\x6b\x4c\x00\x00\x00\x00\x4f\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x6c\xf5\x6c\xf7\x51\xd6\x6c\xf3\x6c\xf6\x6c\xf4\x51\xd4\x51\xd7\x00\x00\x51\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x7a\x6f\x7e\x6f\x7b\x00\x00\x53\xe8\x00\x00\x53\xe9\x00\x00\x6f\x7d\x00\x00\x6f\x7f\x6f\x82\x00\x00\x53\xe6\x6f\x81\x00\x00\x00\x00\x53\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x94\x6f\x7c\x72\x57\x72\x60\x72\x5e\x72\x59\x72\x5a\x72\x5f\x72\x61\x56\x76\x00\x00\x72\x5c\x72\x58\x56\x75\x56\x77\x72\x5b\x72\x62\x72\x5d\x00\x00\x00\x00\x58\xe4\x75\x97\x75\x8f\x75\x95\x75\x96\x58\xe5\x00\x00\x75\x8e\x75\x90\x6f\x79\x75\x92\x75\x93\x75\x91\x5b\x73\x00\x00\x00\x00\x00\x00\x78\xfb\x86\x41\x78\xfc\x78\xf9\x58\xe6\x5b\x75\x78\xf8", /* 9100 */ "\x79\x41\x78\xfd\x5b\x72\x79\x44\x78\xf7\x79\x43\x78\xf5\x79\x42\x78\xfa\x5b\x74\x00\x00\x7c\xb1\x00\x00\x7c\xac\x7c\xb2\x7c\xad\x7c\xab\x7c\xae\x5d\xb8\x00\x00\x7c\xb0\x00\x00\x7c\xaf\x5d\xb9\x5f\xc8\x5f\xc7\x7f\xd7\x7f\xda\x7f\xd2\x7f\xd6\x5f\xc9\x7f\xd5\x7f\xd3\x7f\xd9\x7f\xd4\x7f\xd1\x7f\xd8\x00\x00\x83\x45\x61\xd0\x8a\x98\x83\x42\x83\x43\x83\x41\x78\xf6\x61\xcf\x83\x46\x82\xfd\x61\xce\x61\xd1\x83\x44\x86\x42\x63\x7d\x86\x43\x86\x44\x00\x00\x88\x91\x64\xe6\x8a\x99\x8a\x9a\x00\x00\x00\x00\x8a\x9b\x8c\x6c\x8c\x6b\x8d\xb1\x00\x00\x8d\xb0\x8e\xca\x8e\xcb\x8e\xc9\x8f\xb6\x67\xf9\x4f\xdb\x53\xeb\x53\xea\x56\x7a\x56\x79\x72\x64\x72\x65\x72\x63\x00\x00\x56\x78\x75\x9b\x00\x00\x75\x9c\x75\x98\x58\xe7\x75\x99\x00\x00\x75\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x79\x47\x79\x49\x79\x45\x79\x48\x5b\x76\x79\x46\x5b\x77\x00\x00\x00\x00\x79\xf9\x5d\xbc\x5d\xbb\x00\x00\x5d\xba\x00\x00\x7c\xb3\x7c\xb4\x00\x00\x00\x00\x7f\xdc\x7f\xde\x5f\xcd\x5f\xca\x00\x00\x5f\xcc\x5f\xcb\x7f\xdd\x7f\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9180 */ "\x83\x4d\x83\x4a\x83\x4b\x61\xd5\x83\x4c\x83\x47\x83\x48\x61\xd2\x00\x00\x61\xd3\x83\x49\x61\xd4\x00\x00\x86\x48\x00\x00\x86\x49\x86\x46\x86\x47\x63\x7e\x86\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x95\x88\x92\x88\x94\x64\xe9\x88\x98\x64\xe8\x88\x96\x88\x99\x88\x97\x88\x93\x64\xe7\x00\x00\x8a\x9d\x00\x00\x8a\x9e\x8a\x9c\x00\x00\x8a\xa0\x65\xcf\x65\xd0\x8c\x6e\x66\xb2\x8a\x9f\x8c\x6d\x66\xb1\x8d\xb4\x8d\xb5\x67\x6a\x8d\xb3\x00\x00\x8d\xb2\x00\x00\x8e\xcc\x67\xb3\x00\x00\x90\x79\x90\xd7\x90\xd6\x00\x00\x68\x8f\x68\xa9\x90\xd8\x91\x83\x00\x00\x68\xbb\x4f\xdc\x51\xd8\x00\x00\x5d\xbd\x00\x00\x67\x6b\x4f\xdd\x53\xec\x58\xe8\x5b\x78\x65\xd1\x51\xd9\x00\x00\x6f\x84\x6f\x83\x72\x66\x00\x00\x56\x7d\x56\x7b\x56\x7f\x72\x68\x00\x00\x56\x7e\x56\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x72\x67\x58\xeb\x75\xa2\x00\x00\x58\xea\x58\xec\x75\xa7\x58\xee\x75\xa4\x75\xa5\x75\x9d\x58\xed\x75\xa8\x00\x00\x00\x00\x75\x9f\x00\x00\x75\xa0\x75\x9e\x58\xe9\x00\x00\x75\xa6\x75\xa1\x75\xa3\x00\x00\x00\x00\x00\x00\x79\x55\x00\x00\x79\x54", /* 9200 */ "\x79\x52\x79\x4a\x79\x59\x79\x4d\x79\x57\x79\x5e\x79\x56\x5b\x81\x00\x00\x5b\x7c\x79\x4b\x00\x00\x79\x51\x5b\x7e\x00\x00\x79\x50\x5b\x7f\x5b\x82\x79\x53\x00\x00\x5b\x79\x5b\x7a\x79\x5f\x79\x5d\x00\x00\x79\x5c\x79\x4e\x00\x00\x79\x5a\x00\x00\x5b\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x7b\x79\x5b\x79\x4c\x79\x4f\x79\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x44\x7c\xbe\x00\x00\x7c\xb7\x7c\xca\x7c\xd3\x7c\xba\x5d\xc8\x00\x00\x7c\xc7\x5d\xbe\x5d\xc0\x5d\xcc\x7c\xb8\x00\x00\x00\x00\x5d\xc1\x5d\xc3\x5d\xcd\x5d\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x5d\xcb\x7c\xc0\x00\x00\x7c\xb5\x5d\xc9\x7c\xbf\x5d\xc5\x7c\xd1\x5d\xca\x7c\xcf\x7c\xc3\x7c\xcd\x5d\xc7\x7c\xb6\x7c\xd0\x7c\xcb\x00\x00\x7c\xd2\x5d\xbf\x00\x00\x00\x00\x5d\xce\x5d\xc4\x00\x00\x00\x00\x7c\xbc\x00\x00\x7c\xc4\x7c\xc8\x00\x00\x7c\xcc\x5d\xc6\x7c\xbb\x7c\xb9\x7c\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x7c\xc2\x7c\xc1\x00\x00\x7c\xc6\x7c\xc9\x00\x00\x7c\xce\x00\x00\x00\x00\x00\x00\x7f\xe1\x00\x00\x5f\xce\x7f\xeb\x7f\xe3\x5f\xd3\x5f\xd7\x7f\xf4\x7f\xfc\x7f\xed", /* 9280 */ "\x5f\xcf\x00\x00\x7f\xf1\x7c\xbd\x00\x00\x5f\xd0\x7f\xf8\x7f\xfd\x7f\xf5\x00\x00\x7f\xf7\x80\x43\x7f\xf9\x7f\xe7\x7f\xf0\x00\x00\x00\x00\x5f\xd8\x00\x00\x5f\xd4\x7f\xe5\x7f\xf2\x5f\xd2\x7f\xec\x5f\xd1\x7f\xfa\x7f\xe9\x7f\xe2\x5f\xd5\x80\x42\x00\x00\x00\x00\x7f\xe4\x7f\xf6\x7f\xf3\x7f\xee\x7f\xe0\x7f\xdf\x7f\xe8\x7f\xfb\x5f\xd6\x80\x41\x7f\xe6\x7f\xea\x61\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\xe2\x61\xdd\x83\x6e\x83\x6b\x83\x53\x61\xd8\x00\x00\x00\x00\x00\x00\x61\xd7\x61\xde\x00\x00\x00\x00\x00\x00\x83\x51\x61\xdc\x83\x5d\x83\x4f\x83\x50\x61\xd6\x83\x6d\x61\xe0\x83\x60\x83\x65\x83\x5f\x86\x5b\x83\x5b\x83\x63\x83\x61\x83\x54\x83\x4e\x83\x69\x61\xdf\x83\x6a\x00\x00\x83\x64\x00\x00\x83\x59\x83\x57\x83\x52\x00\x00\x00\x00\x00\x00\x83\x5a\x83\x67\x83\x56\x83\x66\x83\x6c\x00\x00\x00\x00\x61\xdb\x00\x00\x83\x62\x83\x68\x83\x5e\x83\x58\x61\xd9\x00\x00\x00\x00\x00\x00\x7f\xef\x83\x5c\x61\xe1\x83\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x61\x63\x82\x86\x60\x86\x5d\x86\x70\x63\x86\x00\x00\x86\x6d\x86\x65", /* 9300 */ "\x86\x6f\x86\x56\x86\x63\x00\x00\x63\x88\x00\x00\x86\x4e\x00\x00\x86\x4c\x86\x6e\x00\x00\x86\x6c\x86\x6b\x86\x5a\x86\x59\x86\x4f\x63\x8a\x00\x00\x86\x55\x86\x5f\x86\x6a\x63\x8d\x86\x71\x00\x00\x64\xf1\x63\x8f\x63\x89\x86\x53\x00\x00\x86\x5c\x86\x4b\x86\x4d\x63\x7f\x63\x8c\x63\x85\x86\x54\x86\x64\x86\x5e\x63\x8b\x86\x4a\x64\xec\x86\x66\x86\x69\x63\x87\x00\x00\x86\x58\x63\x8e\x63\x84\x00\x00\x00\x00\x00\x00\x63\x83\x86\x62\x86\x68\x63\x81\x00\x00\x86\x51\x86\x67\x00\x00\x00\x00\x86\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x57\x88\x9f\x00\x00\x88\xa4\x64\xee\x64\xf0\x88\xaa\x64\xea\x88\xb9\x88\xb0\x88\xa5\x88\xa6\x88\xaf\x00\x00\x64\xf7\x88\xae\x88\x9e\x88\xad\x88\xa1\x88\xba\x64\xf6\x64\xf4\x88\xa2\x00\x00\x88\xb5\x00\x00\x88\xa7\x88\xb4\x00\x00\x88\xb6\x88\x9d\x64\xef\x00\x00\x88\xb7\x00\x00\x00\x00\x88\xab\x00\x00\x64\xf3\x88\xa8\x00\x00\x00\x00\x64\xf5\x88\xb1\x00\x00\x00\x00\x00\x00\x64\xed\x88\xa3\x88\xb2\x00\x00\x88\xac\x86\x50\x88\xb3\x88\xa0\x00\x00\x64\xf2\x00\x00", /* 9380 */ "\x88\xb8\x00\x00\x64\xeb\x88\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xae\x8a\xa7\x65\xd3\x00\x00\x8a\xa2\x8a\xb1\x8a\xa9\x88\xa9\x00\x00\x8a\xb3\x8a\xa3\x00\x00\x65\xd2\x8a\xad\x65\xd4\x65\xdc\x65\xda\x8a\xaf\x65\xdb\x8a\xa5\x00\x00\x8a\xa6\x8a\xab\x8a\xb0\x00\x00\x88\x9a\x65\xd5\x8a\xb8\x8a\xb5\x8a\xb9\x8a\xac\x8a\xa8\x8a\xb6\x8c\x79\x8a\xaa\x00\x00\x65\xd8\x00\x00\x65\xd7\x88\x9c\x65\xd9\x8a\xb2\x8a\xb4\x65\xd6\x8a\xb7\x8a\xa1\x00\x00\x8a\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x83\x00\x00\x8c\x72\x66\xb6\x8c\x81\x00\x00\x00\x00\x8c\x70\x66\xb7\x00\x00\x8c\x7b\x00\x00\x8c\x77\x66\xbc\x8c\x82\x8c\x71\x8c\x74\x66\xb4\x8c\x84\x00\x00\x8c\x7c\x8c\x7f\x66\xba\x66\xbf\x66\xbd\x8c\x78\x8c\x73\x00\x00\x66\xb8\x66\xb9\x8c\x6f\x66\xb5\x00\x00\x66\xb3\x66\xbb\x8c\x7e\x66\xbe\x00\x00\x8c\x7a\x8c\x85\x66\xc0\x00\x00\x00\x00\x00\x00\x8c\x76\x00\x00\x8c\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xc2\x8d\xd0\x8d\xc4\x8d\xcb\x8c\x75\x8d\xc9\x8d\xb8\x8d\xce\x67\x6e\x8d\xbc\x8d\xcd", /* 9400 */ "\x8d\xc3\x00\x00\x00\x00\x67\x6d\x00\x00\x00\x00\x8d\xd2\x8d\xc5\x00\x00\x8d\xca\x8d\xcc\x8d\xb6\x8d\xcf\x8d\xc1\x8d\xc6\x8d\xba\x8d\xbe\x8d\xd1\x8d\xc8\x8d\xb7\x8d\xbb\x8d\xbd\x8d\xc7\x00\x00\x67\x6c\x8d\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbf\x8e\xd0\x8e\xd5\x67\xba\x8e\xd7\x00\x00\x67\xb4\x00\x00\x8e\xd3\x8e\xd9\x67\xb9\x67\xb5\x00\x00\x67\xb6\x8e\xcf\x8e\xd6\x67\xb8\x8e\xd4\x67\xb7\x8e\xce\x8e\xd2\x8e\xd1\x00\x00\x8e\xcd\x8e\xd8\x00\x00\x00\x00\x00\x00\x67\xfa\x8f\xbd\x8f\xc0\x8f\xbc\x8f\xbe\x8f\xbf\x8f\xb9\x8f\xba\x8f\xb7\x00\x00\x00\x00\x8f\xbb\x8f\xb8\x67\xfb\x67\xfc\x00\x00\x00\x00\x90\x7b\x00\x00\x90\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x7c\x90\x7e\x00\x00\x68\x6c\x00\x00\x90\x7a\x68\x6b\x68\x6d\x00\x00\x00\x00\x00\x00\x90\xda\x90\xdb\x68\x90\x90\xd9\x00\x00\x91\x64\x91\x63\x91\x65\x68\xab\x91\x66\x68\xaa\x91\x67\x91\x84\x91\x87\x91\x86\x68\xb4\x91\x85\x00\x00\x00\x00\x00\x00\x68\xbe\x68\xbc\x68\xbd\x68\xc3", /* 9480 */ "\x91\xb0\x91\xb1\x91\xaf\x91\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xda\x00\x00\x00\x00\x75\xa9\x79\x60\x83\x6f\x8c\x86\x00\x00\x00\x00", /* 9580 */ "\x51\xdb\x00\x00\x53\xed\x56\x81\x00\x00\x00\x00\x75\xaa\x00\x00\x75\xab\x58\xef\x00\x00\x5b\x85\x79\x62\x79\x61\x5b\x89\x5b\x84\x79\x63\x5b\x86\x5b\x88\x5b\x87\x5b\x83\x00\x00\x00\x00\x00\x00\x5d\xcf\x00\x00\x00\x00\x7c\xd7\x7c\xd5\x00\x00\x7c\xd6\x7c\xd4\x00\x00\x5f\xd9\x00\x00\x5f\xdc\x5f\xde\x5f\xdd\x00\x00\x00\x00\x5f\xda\x5f\xdb\x00\x00\x83\x71\x83\x70\x61\xe3\x83\x72\x00\x00\x83\x73\x61\xe4\x00\x00\x00\x00\x00\x00\x86\x79\x86\x77\x88\xc0\x00\x00\x86\x75\x86\x76\x63\x90\x86\x72\x86\x7a\x86\x74\x86\x78\x88\xbc\x00\x00\x00\x00\x88\xbe\x00\x00\x88\xbf\x64\xfc\x88\xbb\x64\xfb\x88\xbd\x64\xf8\x64\xf9\x64\xfa\x86\x73\x00\x00\x00\x00\x65\xdf\x8a\xbc\x8a\xba\x8a\xbb\x65\xdd\x65\xe0\x65\xde\x00\x00\x00\x00\x00\x00\x8c\x87\x8c\x88\x66\xc1\x00\x00\x8d\xd3\x8d\xd5\x8d\xd4\x67\x6f\x67\xbb\x8e\xdc\x8e\xdb\x8e\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xdc\x00\x00\x69\x8a\x00\x00\x69\xf7\x4e\x8b\x69\xf5\x69\xf8\x69\xf6\x00\x00\x00\x00\x00\x00\x6b\x4f\x00\x00\x4f\xe1\x00\x00\x4f\xe2\x6b\x51\x4f\xdf\x6b\x50\x6b\x4e\x4f\xe0\x4f\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\xf8\x6c\xfb\x51\xdf\x6c\xfa\x6c\xf9\x00\x00\x51\xde\x51\xdd\x00\x00\x51\xe1\x6c\xfc\x51\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x89\x53\xef\x53\xf0\x53\xf1\x6f\x8a\x6f\x86\x53\xee\x6f\x87\x00\x00\x6f\x88\x6f\x85\x00\x00\x00\x00\x00\x00\x56\x88\x00\x00\x00\x00\x56\x85\x72\x69\x56\x86\x56\x89\x72\x6a\x00\x00\x56\x84\x56\x82\x56\x83\x56\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xf0\x75\xae\x58\xf8\x75\xad\x00\x00\x75\xb0\x58\xf4\x75\xaf\x5b\x91\x58\xf2\x58\xf5\x58\xf1\x58\xf6\x58\xf7\x58\xf3\x00\x00\x00\x00\x00\x00\x75\xac\x5b\x8d\x79\x65\x00\x00", /* 9680 */ "\x79\x69\x00\x00\x00\x00\x79\x68\x5b\x92\x5b\x8e\x5b\x8f\x79\x64\x79\x66\x79\x67\x5b\x8a\x5b\x8c\x00\x00\x5b\x90\x5b\x8b\x00\x00\x00\x00\x7c\xda\x7c\xd8\x7c\xd9\x5d\xd1\x5d\xd2\x00\x00\x7c\xdb\x5d\xd0\x5f\xdf\x00\x00\x5f\xe1\x5f\xe0\x00\x00\x80\x45\x00\x00\x00\x00\x80\x46\x83\x75\x00\x00\x83\x74\x00\x00\x00\x00\x63\x91\x63\x92\x86\x7b\x63\x93\x00\x00\x88\xc3\x00\x00\x88\xc1\x00\x00\x88\xc2\x64\xfd\x00\x00\x8a\xbd\x66\xc2\x00\x00\x48\xeb\x00\x00\x65\x41\x51\xe2\x00\x00\x56\x8a\x72\x6b\x00\x00\x00\x00\x75\xb1\x58\xf9\x5b\x93\x79\x6a\x79\x6c\x5b\x95\x5b\x94\x5b\x96\x5b\x97\x79\x6b\x5d\xd5\x5d\xd6\x5d\xd4\x5f\xe2\x5d\xd3\x7c\xdc\x00\x00\x00\x00\x00\x00\x5f\xe3\x83\x76\x86\x7c\x63\x94\x65\x42\x8a\xbe\x8a\xc2\x65\xe3\x8a\xbf\x65\xe4\x65\xe2\x8a\xc3\x65\xe5\x8a\xc1\x00\x00\x8c\x89\x65\xe1\x66\xc3\x00\x00\x90\xdc\x00\x00\x00\x00\x51\xe3\x58\xfb\x58\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x98\x79\x6e\x79\x6d\x5b\x99\x00\x00\x00\x00\x7c\xe0\x5d\xda\x5d\xd7\x7c\xdf\x5d\xd9\x7c\xdd\x5d\xd8\x00\x00\x7c\xde\x00\x00\x80\x47", /* 9700 */ "\x5f\xe4\x00\x00\x83\x79\x00\x00\x61\xe5\x83\x77\x61\xe6\x61\xe7\x83\x78\x61\xe8\x00\x00\x86\x7d\x00\x00\x63\x98\x63\x95\x63\x9a\x86\x7f\x63\x96\x86\x7e\x63\x99\x00\x00\x00\x00\x63\x97\x00\x00\x88\xc6\x88\xc8\x00\x00\x00\x00\x65\x43\x88\xc7\x65\x44\x88\xc5\x88\xc4\x00\x00\x8a\xc5\x8a\xc4\x65\xe6\x8a\xc6\x8c\x8e\x66\xc5\x8c\x8d\x8c\x8a\x66\xc4\x8c\x8b\x8c\x8c\x00\x00\x8d\xd6\x8d\xd7\x67\x70\x00\x00\x67\xbe\x00\x00\x00\x00\x8e\xdd\x00\x00\x00\x00\x67\xbc\x67\xbd\x8e\xde\x00\x00\x00\x00\x67\xfd\x68\x41\x8f\xc1\x00\x00\x00\x00\x68\x91\x90\xde\x68\x93\x00\x00\x90\xdd\x90\xdf\x68\x92\x91\x68\x00\x00\x91\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xe4\x00\x00\x00\x00\x00\x00\x5d\xdb\x00\x00\x80\x48\x00\x00\x83\x7a\x63\x9b\x63\x9c\x00\x00\x51\xe5\x00\x00\x61\xe9\x66\xc6\x53\xf2\x00\x00\x00\x00\x00\x00\x63\x9d\x00\x00\x68\x6e\x53\xf3\x75\xb2\x00\x00\x79\x6f\x00\x00\x79\x71\x00\x00\x79\x70\x00\x00\x7c\xe4\x7c\xe1\x5d\xdc\x00\x00\x5d\xdd\x7c\xe2\x7c\xe3\x00\x00\x80\x4a\x80\x4f\x5f\xe5\x80\x49\x80\x4b\x80\x52", /* 9780 */ "\x80\x4d\x80\x51\x80\x4e\x80\x4c\x80\x50\x5f\xe6\x00\x00\x00\x00\x83\x7d\x00\x00\x83\x7b\x61\xeb\x00\x00\x61\xea\x83\x7c\x61\xec\x00\x00\x00\x00\x00\x00\x00\x00\x86\x83\x00\x00\x00\x00\x86\x82\x63\x9e\x86\x81\x88\xc9\x00\x00\x88\xcb\x88\xcd\x88\xcc\x00\x00\x65\x45\x88\xca\x8a\xcd\x65\xe7\x8a\xcb\x8a\xce\x65\xe8\x00\x00\x8a\xc9\x00\x00\x8a\xcc\x8a\xca\x8a\xc7\x65\xe9\x8a\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x8f\x00\x00\x00\x00\x8c\x91\x8c\x90\x00\x00\x8d\xd8\x00\x00\x8d\xd9\x00\x00\x00\x00\x00\x00\x8e\xdf\x00\x00\x68\x43\x00\x00\x68\x42\x90\x7f\x90\x81\x68\x94\x90\xe0\x00\x00\x68\xb5\x00\x00\x53\xf4\x5b\x9a\x80\x54\x80\x53\x83\x7f\x83\x7e\x00\x00\x00\x00\x65\x46\x88\xcf\x88\xce\x8a\xd1\x8a\xcf\x8a\xd2\x8a\xd0\x00\x00\x00\x00\x66\xc7\x8c\x92\x8c\x93\x8c\x94\x00\x00\x8e\xe0\x00\x00\x8f\xc2\x00\x00\x90\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xf5\x00\x00\x00\x00\x86\x84\x88\xd0\x00\x00\x53\xf6\x00\x00\x00\x00\x5f\xe7\x00\x00\x86\x85\x65\xea\x8a\xd3\x66\xc8\x00\x00\x8d\xda\x8d\xdb\x67\xbf", /* 9800 */ "\x90\x82\x53\xf7\x59\x41\x59\x42\x75\xb3\x5b\x9b\x5b\x9c\x79\x72\x5b\x9d\x00\x00\x5d\xe1\x00\x00\x5d\xe3\x7c\xe6\x7c\xe7\x7c\xe5\x5d\xde\x5d\xdf\x5d\xe2\x5d\xe0\x00\x00\x00\x00\x80\x55\x5f\xe8\x5f\xe9\x00\x00\x00\x00\x83\x87\x61\xef\x83\x82\x83\x81\x00\x00\x83\x86\x61\xed\x00\x00\x00\x00\x63\xa5\x00\x00\x83\x83\x83\x88\x83\x85\x83\x84\x00\x00\x61\xee\x00\x00\x63\xa3\x00\x00\x86\x87\x63\x9f\x00\x00\x86\x88\x00\x00\x00\x00\x86\x86\x00\x00\x63\xa2\x63\xa0\x63\xa4\x00\x00\x63\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xd1\x00\x00\x88\xd6\x88\xd2\x88\xd5\x65\x47\x00\x00\x87\xc0\x88\xd4\x88\xd3\x00\x00\x65\xed\x65\xeb\x65\xee\x65\xec\x8a\xd4\x8a\xd5\x8a\xd6\x65\xef\x00\x00\x00\x00\x00\x00\x8c\x98\x66\xca\x8c\x96\x00\x00\x66\xcb\x8c\x95\x8c\x97\x66\xc9\x8d\xdf\x8d\xdc\x00\x00\x8d\xdd\x8d\xde\x8e\xe1\x67\xc1\x00\x00\x67\xc0\x00\x00\x8f\xc4\x8f\xc3\x68\x44\x00\x00\x00\x00\x00\x00\x68\x6f\x68\x95\x68\xac\x91\x69\x91\x9e\x91\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xf8\x79\x73\x00\x00\x00\x00\x7c\xe8\x80\x56\x80\x57\x5f\xea\x00\x00\x5f\xeb\x83\x89\x61\xf0\x00\x00\x00\x00\x65\x48\x00\x00\x8a\xd7\x00\x00\x65\xf0\x8c\x9b\x66\xcc\x8c\x9a\x8c\x9c\x8c\x99\x8e\xe4\x8d\xe0\x8d\xe1\x00\x00\x67\x71\x00\x00\x8e\xe3\x00\x00\x00\x00\x8e\xe2\x00\x00\x8f\xc5\x91\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xf9\x00\x00\x00\x00\x00\x00\x53\xfa\x00\x00\x00\x00\x56\x8b\x72\x6c\x00\x00\x75\xb4\x00\x00\x5b\x9e\x00\x00\x5b\xa1\x5b\x9f\x79\x74\x00\x00\x5b\xa3\x00\x00\x5b\xa0\x00\x00\x00\x00\x5b\xa2\x00\x00\x5d\xe5\x00\x00\x7c\xe9\x00\x00\x00\x00\x7c\xea\x83\x8b\x00\x00\x5d\xe4\x5d\xe6\x5d\xe7\x00\x00", /* 9900 */ "\x80\x59\x00\x00\x80\x58\x5f\xec\x00\x00\x5f\xed\x00\x00\x80\x5a\x83\x8a\x5f\xef\x61\xf1\x00\x00\x5f\xee\x00\x00\x00\x00\x00\x00\x63\xa6\x83\x8c\x61\xf3\x61\xf2\x83\x8d\x83\x90\x83\x8e\x83\x8f\x61\xf4\x00\x00\x63\xab\x63\xa9\x00\x00\x00\x00\x63\xa8\x86\x8a\x00\x00\x63\xaa\x00\x00\x00\x00\x86\x89\x88\xd7\x00\x00\x86\x8b\x63\xa7\x86\x8c\x88\xda\x88\xd8\x88\xd9\x88\xde\x65\xf4\x88\xdd\x88\xe0\x88\xdf\x88\xdc\x88\xdb\x00\x00\x65\x49\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xda\x00\x00\x8a\xd9\x65\xf3\x65\xf1\x65\xf2\x00\x00\x8a\xd8\x00\x00\x8c\x9f\x00\x00\x66\xcd\x00\x00\x8c\x9e\x8c\x9d\x66\xce\x00\x00\x8d\xe6\x8d\xe5\x00\x00\x8d\xe3\x00\x00\x8d\xe2\x67\x73\x67\x72\x8d\xe7\x8f\xc6\x68\x45\x8e\xe6\x67\xc2\x8e\xe5\x8d\xe4\x00\x00\x8f\xc7\x68\x70\x00\x00\x68\xad\x91\x6a\x00\x00\x91\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xfb\x75\xb5\x88\xe1\x53\xfc\x00\x00\x00\x00\x80\x5c\x80\x5b\x86\x8d\x00\x00\x00\x00\x88\xe3\x00\x00\x88\xe2\x00\x00\x65\xf5\x8c\xa0\x8c\xa1\x67\x74\x00\x00\x00\x00\x91\xa2\x56\x8c\x5b\xa5\x5b\xa4\x7c\xeb\x7c\xed\x5d\xe9\x7c\xec\x5d\xe8\x5d\xea\x7c\xee\x00\x00\x00\x00\x00\x00\x80\x5e\x80\x60\x80\x5f\x00\x00\x80\x62\x00\x00\x00\x00\x00\x00\x5f\xf0\x80\x61\x80\x5d\x00\x00\x00\x00\x00\x00\x80\x63\x00\x00\x83\x97\x00\x00\x83\x9a\x83\x9c\x83\x92\x83\x96\x83\x93\x61\xf6\x61\xf9\x61\xfb\x83\x94\x83\x95\x61\xfa\x83\x98\x83\x9b\x83\x99\x61\xfc\x00\x00\x61\xf8\x83\x91\x61\xf5\x00\x00\x61\xf7\x00\x00\x00\x00\x63\xad\x86\x93\x86\x91\x86\x90\x00\x00\x86\x96\x00\x00\x86\x95\x86\x94\x00\x00\x86\x8f\x63\xac\x86\x8e\x00\x00\x86\x92\x63\xae\x00\x00\x00\x00\x88\xe6\x00\x00\x88\xea\x88\xe7\x88\xe9\x88\xe8\x88\xe5\x88\xeb\x88\xee\x88\xec\x88\xed\x65\x4b", /* 9a00 */ "\x00\x00\x65\x4a\x88\xe4\x88\xef\x8a\xdf\x8a\xe2\x8a\xe4\x8a\xe3\x00\x00\x8a\xdd\x8a\xe1\x8a\xdc\x00\x00\x8a\xde\x65\xf6\x8a\xdb\x00\x00\x8a\xe0\x00\x00\x00\x00\x8c\xae\x8c\xa3\x66\xcf\x00\x00\x00\x00\x66\xd0\x8c\xa2\x8c\xa7\x8c\xad\x8c\xa5\x8c\xac\x00\x00\x8c\xa9\x00\x00\x8c\xa8\x8c\xab\x8c\xa6\x8c\xa4\x00\x00\x8c\xaa\x00\x00\x8d\xee\x8d\xec\x67\x75\x8d\xeb\x8d\xf1\x8d\xef\x00\x00\x67\x76\x8d\xea\x8d\xe8\x00\x00\x8d\xe9\x67\x78\x8d\xed\x67\x77\x8d\xf0\x8e\xe7\x8e\xed\x00\x00\x00\x00\x8e\xe8\x67\xc6\x8e\xee\x67\xc5\x8e\xec\x8e\xeb\x67\xc4\x8e\xea\x67\xc3\x8e\xe9\x00\x00\x8f\xcd\x8f\xcf\x8f\xce\x00\x00\x8f\xcb\x68\x47\x8f\xc8\x8f\xcc\x8f\xd1\x00\x00\x8f\xd0\x8f\xc9\x8f\xca\x68\x46\x90\x83\x68\x73\x00\x00\x90\x84\x68\x71\x68\x72\x00\x00\x00\x00\x90\xe2\x68\x96\x91\x88\x00\x00\x68\xb6\x00\x00\x91\xa3\x68\xb7\x91\xa4\x91\xa5\x91\xb3\x91\xb2\x68\xc6\x91\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x8d\x00\x00\x00\x00\x7c\xf0\x00\x00\x7c\xef\x00\x00\x5f\xf1\x5f\xf2\x80\x64\x00\x00\x83\x9d\x86\x99\x00\x00\x00\x00\x61\xfd\x63\xaf\x86\x97\x00\x00\x86\x9a\x63\xb0\x00\x00\x88\xf0\x86\x98\x8a\xe5\x65\xf7\x8c\xaf\x00\x00\x00\x00\x00\x00\x8d\xf4\x8d\xf2\x00\x00\x00\x00\x8d\xf3\x00\x00\x00\x00\x8e\xef\x00\x00\x67\xc7\x8f\xd2\x68\x76\x68\x48\x68\x74\x68\x75\x90\xe3\x68\xae\x00\x00\x56\x8e\x00\x00\x00\x00\x00\x00\x8a\xe6\x00\x00\x00\x00\x72\x6d\x00\x00\x5d\xeb\x00\x00\x80\x65\x00\x00\x00\x00\x5f\xf3\x80\x66\x00\x00\x00\x00\x00\x00\x83\x9f\x83\x9e\x63\xb2\x62\x41\x62\x42\x00\x00\x83\xa2\x83\xa1\x83\xa0\x00\x00\x00\x00\x86\x9b\x86\x9e\x00\x00\x86\x9d\x86\x9c\x63\xb1\x88\xf4\x88\xf2\x88\xf1\x00\x00", /* 9b00 */ "\x00\x00\x88\xf3\x00\x00\x65\xf8\x8a\xe8\x8a\xe9\x65\xf9\x00\x00\x8a\xe7\x00\x00\x8c\xb1\x8c\xb0\x8c\xb3\x66\xd1\x8c\xb2\x00\x00\x8d\xf5\x8d\xf7\x8d\xf6\x00\x00\x00\x00\x8e\xf0\x8e\xf3\x8e\xf1\x8e\xf2\x8f\xd3\x68\x49\x00\x00\x00\x00\x00\x00\x90\x85\x90\x86\x90\x87\x00\x00\x68\x97\x68\xaf\x91\xa6\x56\x8f\x00\x00\x62\x43\x63\xb3\x8a\xea\x00\x00\x8f\xd4\x00\x00\x00\x00\x91\xb4\x72\x6e\x00\x00\x68\xc7\x56\x90\x86\x9f\x00\x00\x8a\xeb\x00\x00\x8c\xb4\x00\x00\x00\x00\x8e\xf4\x8f\xd5\x56\x91\x00\x00\x80\x67\x80\x68\x00\x00\x5f\xf4\x5f\xf5\x83\xa4\x62\x45\x62\x44\x83\xa3\x00\x00\x88\xf5\x00\x00\x8a\xec\x8a\xee\x8a\xed\x65\xfc\x65\xfb\x65\xfa\x00\x00\x67\xc9\x8e\xf5\x00\x00\x67\xc8\x8f\xd7\x8f\xd6\x00\x00\x68\x98\x90\xe4\x59\x43\x7c\xf1\x00\x00\x00\x00\x00\x00\x80\x6b\x80\x69\x80\x6a\x00\x00\x00\x00\x83\xad\x00\x00\x83\xa8\x83\xa5\x83\xac\x00\x00\x00\x00\x00\x00\x83\xae\x00\x00\x00\x00\x62\x47\x83\xab\x83\xa7\x00\x00\x00\x00\x83\xa6\x83\xaa\x83\xa9\x62\x46\x00\x00\x00\x00\x86\xaa\x86\xa5\x86\xa3\x86\xac\x86\xa4\x00\x00", /* 9b80 */ "\x86\xa0\x00\x00\x86\xa6\x00\x00\x00\x00\x86\xa1\x89\x41\x86\xa2\x86\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\xa9\x63\xb4\x86\xa8\x86\xa7\x00\x00\x86\xab\x00\x00\x00\x00\x00\x00\x00\x00\x88\xf6\x88\xf9\x00\x00\x00\x00\x88\xf8\x00\x00\x89\x43\x88\xfb\x89\x42\x00\x00\x88\xfd\x88\xfc\x88\xfa\x00\x00\x88\xf7\x00\x00\x65\x4e\x65\x4d\x00\x00\x65\x4f\x65\x4c\x89\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xf4\x8a\xf7\x00\x00\x8a\xf5\x8a\xf9\x00\x00\x00\x00\x00\x00\x8a\xfa\x00\x00\x8a\xf2\x66\x44\x8a\xf3\x00\x00\x8a\xf1\x8a\xf8\x00\x00\x8a\xf0\x8a\xef\x66\x43\x66\x41\x65\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xf6\x8c\xbd\x8c\xc3\x66\xd4\x8c\xbe\x00\x00\x8c\xc1\x8c\xc5\x66\xd5\x8c\xc0\x00\x00\x8c\xb8\x00\x00\x8c\xb7\x8c\xc4\x8c\xbb\x00\x00\x8c\xb9\x8c\xc2\x8c\xba\x66\xd3\x66\xd2\x00\x00\x8c\xb5\x8c\xb6\x8c\xbf\x00\x00\x00\x00\x00\x00\x8c\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xfa\x8d\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x66\x42\x00\x00\x00\x00", /* 9c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xfb\x8e\x44\x8e\x42\x8d\xf9\x8e\x47\x00\x00\x8d\xf8\x00\x00\x67\x7a\x8e\x43\x00\x00\x00\x00\x00\x00\x8d\xfc\x67\x79\x8e\x46\x00\x00\x00\x00\x8e\x45\x00\x00\x00\x00\x00\x00\x00\x00\x8e\xf8\x8e\xf7\x00\x00\x00\x00\x00\x00\x8f\x41\x00\x00\x8e\xfa\x8e\xfd\x67\xcb\x00\x00\x00\x00\x8e\xfb\x8e\xfc\x00\x00\x8e\xf6\x8e\xf9\x67\xca\x00\x00\x00\x00\x00\x00\x68\x4b\x8f\xe2\x8f\xdd\x8f\xe1\x00\x00\x8f\xe4\x8f\xe0\x00\x00\x8f\xdc\x00\x00\x68\x4d\x8f\xdf\x8f\xe3\x68\x4c\x8f\xda\x8e\x41\x8f\xde\x00\x00\x00\x00\x8f\xdb\x00\x00\x8f\xd8\x00\x00\x8f\xd9\x68\x4a\x90\x8b\x90\x8d\x90\x90\x90\x8c\x90\x91\x00\x00\x90\x8a\x00\x00\x90\x88\x00\x00\x68\x77\x90\x8e\x68\x79\x68\x78\x90\x89\x90\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x90\xe9\x68\x99\x90\xea\x00\x00\x90\xe8\x90\xe5\x00\x00\x00\x00\x90\xe7\x90\xe6\x91\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x91\x6d\x91\x6c\x00\x00\x00\x00\x91\x8b\x00\x00\x91\x8a\x91\x89\x91\x8c\x00\x00\x68\xbf\x68\xc0\x91\xba\x91\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x44\x79\x75\x7c\xf4\x00\x00\x5d\xec\x7c\xf2\x00\x00\x00\x00\x7c\xf3\x00\x00\x00\x00\x00\x00\x80\x6c\x80\x6d\x5f\xf8\x5f\xf6\x80\x6e\x5f\xf7\x83\xb3\x00\x00\x83\xb6\x83\xb0\x83\xb7\x83\xaf\x83\xb1\x00\x00\x83\xb2", /* 9d00 */ "\x83\xb5\x00\x00\x00\x00\x62\x4a\x83\xba\x83\xb9\x62\x48\x83\xb4\x83\xb8\x62\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\xb7\x00\x00\x63\xb9\x00\x00\x86\xb2\x63\xb5\x00\x00\x86\xaf\x86\xb5\x86\xb8\x00\x00\x63\xba\x00\x00\x86\xb4\x86\xb1\x86\xb9\x86\xb0\x00\x00\x86\xb6\x63\xb6\x00\x00\x86\xae\x63\xb7\x00\x00\x63\xb8\x86\xb3\x00\x00\x00\x00\x00\x00\x89\x56\x89\x49\x89\x4a\x89\x4d\x89\x4b\x00\x00\x89\x45\x00\x00\x00\x00\x89\x48\x89\x52\x89\x4c\x00\x00\x00\x00\x65\x50\x00\x00\x89\x54\x89\x51\x65\x51\x89\x53\x89\x46\x89\x4f\x89\x50\x00\x00\x89\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x41\x8b\x43\x8b\x46\x00\x00\x00\x00\x8a\xfd\x00\x00\x66\x45\x8b\x48\x8a\xfc\x8b\x49\x00\x00\x8b\x45\x8b\x47\x8b\x4b\x8b\x44\x8b\x4c\x8b\x42\x8a\xfb\x66\x46\x00\x00\x8b\x4a\x66\x47\x66\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\x8c\xdf\x8c\xd6\x66\xd9\x8c\xd2\x66\xda\x00\x00\x00\x00\x8c\xdb\x8c\xd5\x8c\xcb\x66\xd8\x8c\xd8\x8c\xd3\x8c\xd4\x00\x00\x8c\xc6\x8c\xcd\x8c\xdc\x00\x00\x8c\xd9\x00\x00\x8c\xd1\x00\x00\x8c\xdd", /* 9d80 */ "\x8c\xcc\x8c\xc7\x8c\xda\x00\x00\x8c\xc9\x8c\xd7\x8c\xce\x8c\xde\x8c\xca\x66\xd6\x8c\xc8\x8c\xcf\x8c\xd0\x00\x00\x00\x00\x00\x00\x8e\x4e\x00\x00\x8e\x4c\x00\x00\x8e\x51\x00\x00\x8e\x5d\x8e\x54\x8e\x4d\x8e\x49\x8e\x56\x8e\x4f\x8e\x52\x8e\x4b\x8e\x59\x8e\x48\x8e\x50\x8e\x55\x8e\x57\x8e\x5a\x8e\x4a\x00\x00\x8e\x5e\x8e\x5f\x8e\x58\x8e\x5c\x8e\x53\x00\x00\x8f\x51\x8f\x54\x00\x00\x67\xcc\x00\x00\x8f\x53\x8f\x58\x8f\x56\x67\xcd\x8f\x4d\x8f\x43\x8f\x42\x67\xcf\x8f\x4f\x8f\x50\x8f\x4c\x8f\x44\x00\x00\x8f\x49\x8e\x5b\x00\x00\x8f\x45\x67\xce\x8f\x4b\x00\x00\x8f\x4a\x00\x00\x8f\x46\x8f\x52\x00\x00\x8f\x47\x8f\xe9\x8f\x55\x8f\x57\x8f\x4e\x8f\x48\x8f\xea\x8f\xec\x8f\xe6\x68\x4e\x00\x00\x8f\xf3\x8f\xf1\x68\x4f\x8f\xf0\x8f\xef\x8f\xe8\x8f\xe5\x8f\xeb\x8f\xf4\x8f\xe7\x8f\xed\x00\x00\x90\x9a\x90\x9f\x90\x95\x90\x98\x68\x7a\x90\x9c\x00\x00\x90\xa3\x8f\xee\x00\x00\x90\x96\x90\xa0\x90\xa4\x90\x9b\x90\x94\x90\x9e\x00\x00\x90\x9d\x90\xa2\x90\xa1\x8f\xf2\x90\x99\x90\x93\x90\x97\x68\x9a\x68\x9b\x90\x92\x00\x00\x90\xf5\x90\xec\x90\xf4", /* 9e00 */ "\x90\xf1\x90\xf2\x90\xeb\x90\xee\x90\xf6\x90\xf0\x90\xef\x90\xed\x00\x00\x90\xf3\x00\x00\x91\x6e\x00\x00\x91\x6f\x00\x00\x91\x71\x91\x70\x91\x73\x91\x72\x91\x8e\x91\x8d\x91\xa7\x00\x00\x91\xa8\x00\x00\x91\xb5\x68\xc4\x68\xc8\x00\x00\x91\xbf\x68\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x45\x00\x00\x00\x00\x00\x00\x67\x7b\x8f\x59\x00\x00\x68\x9c\x68\x9d\x00\x00\x59\x46", /* 9e80 */ "\x7c\xf5\x00\x00\x5d\xed\x83\xbb\x00\x00\x00\x00\x86\xbb\x86\xbc\x86\xba\x89\x58\x89\x57\x65\x52\x8b\x4e\x89\x59\x8b\x4d\x00\x00\x00\x00\x8c\xe1\x66\xdb\x66\xdd\x8c\xe0\x00\x00\x00\x00\x66\xdc\x00\x00\x8e\x60\x8e\x62\x8e\x61\x8f\x5a\x67\xd0\x00\x00\x68\x7b\x90\xf7\x91\x74\x00\x00\x00\x00\x91\xc2\x59\x47\x00\x00\x80\x6f\x00\x00\x62\x4b\x00\x00\x00\x00\x00\x00\x86\xbe\x86\xbd\x00\x00\x89\x5a\x00\x00\x00\x00\x00\x00\x66\xde\x67\x7c\x8f\xf5\x91\xbb\x00\x00\x00\x00\x00\x00\x59\x48\x5f\xf9\x00\x00\x62\x4c\x00\x00\x8c\xe2\x00\x00\x90\xa5\x5b\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x89\x5b\x00\x00\x00\x00\x00\x00\x68\xb0\x5b\xa7\x62\x4d\x65\x53\x90\xa6\x5b\xa8\x00\x00\x83\xbc\x63\xbc\x86\xbf\x86\xc0\x00\x00\x63\xbb\x00\x00\x89\x5c\x65\x57\x65\x55\x65\x56\x65\x54\x8b\x4f\x66\x48\x00\x00\x00\x00\x00\x00\x8e\x64\x8e\x63\x8e\x66\x8e\x65\x67\x7d\x00\x00\x00\x00\x8f\x5b\x00\x00\x8f\x5d\x8f\x5c\x67\xd1\x8f\xf6\x00\x00\x90\xa7\x90\xa8\x68\x7c\x91\x75\x91\x8f\x68\xc1\x00\x00\x79\x76\x86\xc1\x89\x5d\x8c\xe3\x7c\xf6\x00\x00\x89\x5e", /* 9f00 */ "\x8b\x51\x8b\x50\x00\x00\x00\x00\x00\x00\x00\x00\x90\xa9\x68\x9e\x00\x00\x91\x76\x91\x90\x00\x00\x00\x00\x00\x00\x5d\xee\x83\xbd\x83\xbe\x00\x00\x86\xc2\x5d\xef\x00\x00\x66\x49\x8b\x52\x00\x00\x8f\x5f\x67\xd2\x8f\x60\x8f\x5e\x90\xaa\x00\x00\x90\xf8\x00\x00\x5d\xf0\x00\x00\x89\x61\x89\x60\x89\x5f\x8b\x53\x00\x00\x00\x00\x8b\x57\x8b\x56\x8b\x55\x8b\x54\x66\x4a\x8c\xe4\x8e\x68\x67\x7e\x8e\x67\x8f\x61\x8f\xf9\x8f\xf8\x68\x50\x8f\xf7\x90\xad\x90\xac\x90\xab\x00\x00\x00\x00\x5f\xfa\x00\x00\x86\xc3\x65\x58\x00\x00\x8c\xe5\x8c\xe6\x8f\xfa\x90\xae\x00\x00\x00\x00\x90\xf9\x91\x77\x91\xa9\x91\xc4\x5f\xfb\x65\x59\x8b\x58\x8c\xe7\x8f\x62\x90\xaf\x00\x00\x00\x00\x62\x4f\x00\x00\x89\x62\x8b\x59\x8c\xe8\x8c\xe9\x8c\xea\x8e\x6d\x00\x00\x8e\x69\x67\xd3\x8e\x6c\x8e\x6b\x67\x7f\x8e\x6a\x67\x82\x00\x00\x67\x81\x8f\x64\x8f\x63\x67\xd4\x67\xd5\x00\x00\x00\x00\x68\x52\x8f\xfb\x68\x51\x00\x00\x90\xb2\x90\xb3\x90\xb1\x90\xb0\x68\xa0\x00\x00\x90\xfa\x90\xfb\x90\xfc\x68\x9f\x91\x78\x91\x7b\x91\x7a\x91\x79\x00\x00\x00\x00\x91\xc3\x00\x00", /* 9f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xbd\x00\x00\x00\x00\x66\x51\x8e\x6e\x8f\x65\x00\x00\x68\x53\x8f\xfc\x00\x00\x00\x00\x91\xc5\x00\x00\x00\x00\x00\x00\x63\xbe\x00\x00\x00\x00\x00\x00\x89\x63\x00\x00\x8f\xfd\x00\x00\x91\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ "\xc2\x41\xc2\x42\xc2\x43\xc2\x44\xc2\x45\xc2\x46\xc2\x47\xc2\x48\xc2\x49\xc2\x4a\xc2\x4b\xc2\x4c\xc2\x4d\xc2\x4e\xc2\x4f\xc2\x50\xc2\x51\xc2\x52\xc2\x53\xc2\x54\xc2\x55\xc2\x56\xc2\x57\xc2\x58\xc2\x59\xc2\x5a\xc2\x5b\xc2\x5c\xc2\x5d\xc2\x5e\xc2\x5f\xc2\x60\xc2\x61\xc2\x62\xc2\x63\xc2\x64\xc2\x65\xc2\x66\xc2\x67\xc2\x68\xc2\x69\xc2\x6a\xc2\x6b\xc2\x6c\xc2\x6d\xc2\x6e\xc2\x6f\xc2\x70\xc2\x71\xc2\x72\xc2\x73\xc2\x74\xc2\x75\xc2\x76\xc2\x77\xc2\x78\xc2\x79\xc2\x7a\xc2\x7b\xc2\x7c\xc2\x7d\xc2\x7e\xc2\x7f\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f\xc2\xa0\xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf\xc2\xc0\xc2\xc1", /* e080 */ "\xc2\xc2\xc2\xc3\xc2\xc4\xc2\xc5\xc2\xc6\xc2\xc7\xc2\xc8\xc2\xc9\xc2\xca\xc2\xcb\xc2\xcc\xc2\xcd\xc2\xce\xc2\xcf\xc2\xd0\xc2\xd1\xc2\xd2\xc2\xd3\xc2\xd4\xc2\xd5\xc2\xd6\xc2\xd7\xc2\xd8\xc2\xd9\xc2\xda\xc2\xdb\xc2\xdc\xc2\xdd\xc2\xde\xc2\xdf\xc2\xe0\xc2\xe1\xc2\xe2\xc2\xe3\xc2\xe4\xc2\xe5\xc2\xe6\xc2\xe7\xc2\xe8\xc2\xe9\xc2\xea\xc2\xeb\xc2\xec\xc2\xed\xc2\xee\xc2\xef\xc2\xf0\xc2\xf1\xc2\xf2\xc2\xf3\xc2\xf4\xc2\xf5\xc2\xf6\xc2\xf7\xc2\xf8\xc2\xf9\xc2\xfa\xc2\xfb\xc2\xfc\xc2\xfd\xc3\x41\xc3\x42\xc3\x43\xc3\x44\xc3\x45\xc3\x46\xc3\x47\xc3\x48\xc3\x49\xc3\x4a\xc3\x4b\xc3\x4c\xc3\x4d\xc3\x4e\xc3\x4f\xc3\x50\xc3\x51\xc3\x52\xc3\x53\xc3\x54\xc3\x55\xc3\x56\xc3\x57\xc3\x58\xc3\x59\xc3\x5a\xc3\x5b\xc3\x5c\xc3\x5d\xc3\x5e\xc3\x5f\xc3\x60\xc3\x61\xc3\x62\xc3\x63\xc3\x64\xc3\x65\xc3\x66\xc3\x67\xc3\x68\xc3\x69\xc3\x6a\xc3\x6b\xc3\x6c\xc3\x6d\xc3\x6e\xc3\x6f\xc3\x70\xc3\x71\xc3\x72\xc3\x73\xc3\x74\xc3\x75\xc3\x76\xc3\x77\xc3\x78\xc3\x79\xc3\x7a\xc3\x7b\xc3\x7c\xc3\x7d\xc3\x7e\xc3\x7f\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85", /* e100 */ "\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xc3\xc0\xc3\xc1\xc3\xc2\xc3\xc3\xc3\xc4\xc3\xc5\xc3\xc6\xc3\xc7\xc3\xc8\xc3\xc9\xc3\xca\xc3\xcb\xc3\xcc\xc3\xcd\xc3\xce\xc3\xcf\xc3\xd0\xc3\xd1\xc3\xd2\xc3\xd3\xc3\xd4\xc3\xd5\xc3\xd6\xc3\xd7\xc3\xd8\xc3\xd9\xc3\xda\xc3\xdb\xc3\xdc\xc3\xdd\xc3\xde\xc3\xdf\xc3\xe0\xc3\xe1\xc3\xe2\xc3\xe3\xc3\xe4\xc3\xe5\xc3\xe6\xc3\xe7\xc3\xe8\xc3\xe9\xc3\xea\xc3\xeb\xc3\xec\xc3\xed\xc3\xee\xc3\xef\xc3\xf0\xc3\xf1\xc3\xf2\xc3\xf3\xc3\xf4\xc3\xf5\xc3\xf6\xc3\xf7\xc3\xf8\xc3\xf9\xc3\xfa\xc3\xfb\xc3\xfc\xc3\xfd\xc4\x41\xc4\x42\xc4\x43\xc4\x44\xc4\x45\xc4\x46\xc4\x47\xc4\x48", /* e180 */ "\xc4\x49\xc4\x4a\xc4\x4b\xc4\x4c\xc4\x4d\xc4\x4e\xc4\x4f\xc4\x50\xc4\x51\xc4\x52\xc4\x53\xc4\x54\xc4\x55\xc4\x56\xc4\x57\xc4\x58\xc4\x59\xc4\x5a\xc4\x5b\xc4\x5c\xc4\x5d\xc4\x5e\xc4\x5f\xc4\x60\xc4\x61\xc4\x62\xc4\x63\xc4\x64\xc4\x65\xc4\x66\xc4\x67\xc4\x68\xc4\x69\xc4\x6a\xc4\x6b\xc4\x6c\xc4\x6d\xc4\x6e\xc4\x6f\xc4\x70\xc4\x71\xc4\x72\xc4\x73\xc4\x74\xc4\x75\xc4\x76\xc4\x77\xc4\x78\xc4\x79\xc4\x7a\xc4\x7b\xc4\x7c\xc4\x7d\xc4\x7e\xc4\x7f\xc4\x81\xc4\x82\xc4\x83\xc4\x84\xc4\x85\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc4\x8a\xc4\x8b\xc4\x8c\xc4\x8d\xc4\x8e\xc4\x8f\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xc4\x94\xc4\x95\xc4\x96\xc4\x97\xc4\x98\xc4\x99\xc4\x9a\xc4\x9b\xc4\x9c\xc4\x9d\xc4\x9e\xc4\x9f\xc4\xa0\xc4\xa1\xc4\xa2\xc4\xa3\xc4\xa4\xc4\xa5\xc4\xa6\xc4\xa7\xc4\xa8\xc4\xa9\xc4\xaa\xc4\xab\xc4\xac\xc4\xad\xc4\xae\xc4\xaf\xc4\xb0\xc4\xb1\xc4\xb2\xc4\xb3\xc4\xb4\xc4\xb5\xc4\xb6\xc4\xb7\xc4\xb8\xc4\xb9\xc4\xba\xc4\xbb\xc4\xbc\xc4\xbd\xc4\xbe\xc4\xbf\xc4\xc0\xc4\xc1\xc4\xc2\xc4\xc3\xc4\xc4\xc4\xc5\xc4\xc6\xc4\xc7\xc4\xc8\xc4\xc9", /* e200 */ "\xc4\xca\xc4\xcb\xc4\xcc\xc4\xcd\xc4\xce\xc4\xcf\xc4\xd0\xc4\xd1\xc4\xd2\xc4\xd3\xc4\xd4\xc4\xd5\xc4\xd6\xc4\xd7\xc4\xd8\xc4\xd9\xc4\xda\xc4\xdb\xc4\xdc\xc4\xdd\xc4\xde\xc4\xdf\xc4\xe0\xc4\xe1\xc4\xe2\xc4\xe3\xc4\xe4\xc4\xe5\xc4\xe6\xc4\xe7\xc4\xe8\xc4\xe9\xc4\xea\xc4\xeb\xc4\xec\xc4\xed\xc4\xee\xc4\xef\xc4\xf0\xc4\xf1\xc4\xf2\xc4\xf3\xc4\xf4\xc4\xf5\xc4\xf6\xc4\xf7\xc4\xf8\xc4\xf9\xc4\xfa\xc4\xfb\xc4\xfc\xc4\xfd\xc5\x41\xc5\x42\xc5\x43\xc5\x44\xc5\x45\xc5\x46\xc5\x47\xc5\x48\xc5\x49\xc5\x4a\xc5\x4b\xc5\x4c\xc5\x4d\xc5\x4e\xc5\x4f\xc5\x50\xc5\x51\xc5\x52\xc5\x53\xc5\x54\xc5\x55\xc5\x56\xc5\x57\xc5\x58\xc5\x59\xc5\x5a\xc5\x5b\xc5\x5c\xc5\x5d\xc5\x5e\xc5\x5f\xc5\x60\xc5\x61\xc5\x62\xc5\x63\xc5\x64\xc5\x65\xc5\x66\xc5\x67\xc5\x68\xc5\x69\xc5\x6a\xc5\x6b\xc5\x6c\xc5\x6d\xc5\x6e\xc5\x6f\xc5\x70\xc5\x71\xc5\x72\xc5\x73\xc5\x74\xc5\x75\xc5\x76\xc5\x77\xc5\x78\xc5\x79\xc5\x7a\xc5\x7b\xc5\x7c\xc5\x7d\xc5\x7e\xc5\x7f\xc5\x81\xc5\x82\xc5\x83\xc5\x84\xc5\x85\xc5\x86\xc5\x87\xc5\x88\xc5\x89\xc5\x8a\xc5\x8b\xc5\x8c\xc5\x8d", /* e280 */ "\xc5\x8e\xc5\x8f\xc5\x90\xc5\x91\xc5\x92\xc5\x93\xc5\x94\xc5\x95\xc5\x96\xc5\x97\xc5\x98\xc5\x99\xc5\x9a\xc5\x9b\xc5\x9c\xc5\x9d\xc5\x9e\xc5\x9f\xc5\xa0\xc5\xa1\xc5\xa2\xc5\xa3\xc5\xa4\xc5\xa5\xc5\xa6\xc5\xa7\xc5\xa8\xc5\xa9\xc5\xaa\xc5\xab\xc5\xac\xc5\xad\xc5\xae\xc5\xaf\xc5\xb0\xc5\xb1\xc5\xb2\xc5\xb3\xc5\xb4\xc5\xb5\xc5\xb6\xc5\xb7\xc5\xb8\xc5\xb9\xc5\xba\xc5\xbb\xc5\xbc\xc5\xbd\xc5\xbe\xc5\xbf\xc5\xc0\xc5\xc1\xc5\xc2\xc5\xc3\xc5\xc4\xc5\xc5\xc5\xc6\xc5\xc7\xc5\xc8\xc5\xc9\xc5\xca\xc5\xcb\xc5\xcc\xc5\xcd\xc5\xce\xc5\xcf\xc5\xd0\xc5\xd1\xc5\xd2\xc5\xd3\xc5\xd4\xc5\xd5\xc5\xd6\xc5\xd7\xc5\xd8\xc5\xd9\xc5\xda\xc5\xdb\xc5\xdc\xc5\xdd\xc5\xde\xc5\xdf\xc5\xe0\xc5\xe1\xc5\xe2\xc5\xe3\xc5\xe4\xc5\xe5\xc5\xe6\xc5\xe7\xc5\xe8\xc5\xe9\xc5\xea\xc5\xeb\xc5\xec\xc5\xed\xc5\xee\xc5\xef\xc5\xf0\xc5\xf1\xc5\xf2\xc5\xf3\xc5\xf4\xc5\xf5\xc5\xf6\xc5\xf7\xc5\xf8\xc5\xf9\xc5\xfa\xc5\xfb\xc5\xfc\xc5\xfd\xc6\x41\xc6\x42\xc6\x43\xc6\x44\xc6\x45\xc6\x46\xc6\x47\xc6\x48\xc6\x49\xc6\x4a\xc6\x4b\xc6\x4c\xc6\x4d\xc6\x4e\xc6\x4f\xc6\x50", /* e300 */ "\xc6\x51\xc6\x52\xc6\x53\xc6\x54\xc6\x55\xc6\x56\xc6\x57\xc6\x58\xc6\x59\xc6\x5a\xc6\x5b\xc6\x5c\xc6\x5d\xc6\x5e\xc6\x5f\xc6\x60\xc6\x61\xc6\x62\xc6\x63\xc6\x64\xc6\x65\xc6\x66\xc6\x67\xc6\x68\xc6\x69\xc6\x6a\xc6\x6b\xc6\x6c\xc6\x6d\xc6\x6e\xc6\x6f\xc6\x70\xc6\x71\xc6\x72\xc6\x73\xc6\x74\xc6\x75\xc6\x76\xc6\x77\xc6\x78\xc6\x79\xc6\x7a\xc6\x7b\xc6\x7c\xc6\x7d\xc6\x7e\xc6\x7f\xc6\x81\xc6\x82\xc6\x83\xc6\x84\xc6\x85\xc6\x86\xc6\x87\xc6\x88\xc6\x89\xc6\x8a\xc6\x8b\xc6\x8c\xc6\x8d\xc6\x8e\xc6\x8f\xc6\x90\xc6\x91\xc6\x92\xc6\x93\xc6\x94\xc6\x95\xc6\x96\xc6\x97\xc6\x98\xc6\x99\xc6\x9a\xc6\x9b\xc6\x9c\xc6\x9d\xc6\x9e\xc6\x9f\xc6\xa0\xc6\xa1\xc6\xa2\xc6\xa3\xc6\xa4\xc6\xa5\xc6\xa6\xc6\xa7\xc6\xa8\xc6\xa9\xc6\xaa\xc6\xab\xc6\xac\xc6\xad\xc6\xae\xc6\xaf\xc6\xb0\xc6\xb1\xc6\xb2\xc6\xb3\xc6\xb4\xc6\xb5\xc6\xb6\xc6\xb7\xc6\xb8\xc6\xb9\xc6\xba\xc6\xbb\xc6\xbc\xc6\xbd\xc6\xbe\xc6\xbf\xc6\xc0\xc6\xc1\xc6\xc2\xc6\xc3\xc6\xc4\xc6\xc5\xc6\xc6\xc6\xc7\xc6\xc8\xc6\xc9\xc6\xca\xc6\xcb\xc6\xcc\xc6\xcd\xc6\xce\xc6\xcf\xc6\xd0\xc6\xd1", /* e380 */ "\xc6\xd2\xc6\xd3\xc6\xd4\xc6\xd5\xc6\xd6\xc6\xd7\xc6\xd8\xc6\xd9\xc6\xda\xc6\xdb\xc6\xdc\xc6\xdd\xc6\xde\xc6\xdf\xc6\xe0\xc6\xe1\xc6\xe2\xc6\xe3\xc6\xe4\xc6\xe5\xc6\xe6\xc6\xe7\xc6\xe8\xc6\xe9\xc6\xea\xc6\xeb\xc6\xec\xc6\xed\xc6\xee\xc6\xef\xc6\xf0\xc6\xf1\xc6\xf2\xc6\xf3\xc6\xf4\xc6\xf5\xc6\xf6\xc6\xf7\xc6\xf8\xc6\xf9\xc6\xfa\xc6\xfb\xc6\xfc\xc6\xfd\xc7\x41\xc7\x42\xc7\x43\xc7\x44\xc7\x45\xc7\x46\xc7\x47\xc7\x48\xc7\x49\xc7\x4a\xc7\x4b\xc7\x4c\xc7\x4d\xc7\x4e\xc7\x4f\xc7\x50\xc7\x51\xc7\x52\xc7\x53\xc7\x54\xc7\x55\xc7\x56\xc7\x57\xc7\x58\xc7\x59\xc7\x5a\xc7\x5b\xc7\x5c\xc7\x5d\xc7\x5e\xc7\x5f\xc7\x60\xc7\x61\xc7\x62\xc7\x63\xc7\x64\xc7\x65\xc7\x66\xc7\x67\xc7\x68\xc7\x69\xc7\x6a\xc7\x6b\xc7\x6c\xc7\x6d\xc7\x6e\xc7\x6f\xc7\x70\xc7\x71\xc7\x72\xc7\x73\xc7\x74\xc7\x75\xc7\x76\xc7\x77\xc7\x78\xc7\x79\xc7\x7a\xc7\x7b\xc7\x7c\xc7\x7d\xc7\x7e\xc7\x7f\xc7\x81\xc7\x82\xc7\x83\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\x8d\xc7\x8e\xc7\x8f\xc7\x90\xc7\x91\xc7\x92\xc7\x93\xc7\x94\xc7\x95", /* e400 */ "\xc7\x96\xc7\x97\xc7\x98\xc7\x99\xc7\x9a\xc7\x9b\xc7\x9c\xc7\x9d\xc7\x9e\xc7\x9f\xc7\xa0\xc7\xa1\xc7\xa2\xc7\xa3\xc7\xa4\xc7\xa5\xc7\xa6\xc7\xa7\xc7\xa8\xc7\xa9\xc7\xaa\xc7\xab\xc7\xac\xc7\xad\xc7\xae\xc7\xaf\xc7\xb0\xc7\xb1\xc7\xb2\xc7\xb3\xc7\xb4\xc7\xb5\xc7\xb6\xc7\xb7\xc7\xb8\xc7\xb9\xc7\xba\xc7\xbb\xc7\xbc\xc7\xbd\xc7\xbe\xc7\xbf\xc7\xc0\xc7\xc1\xc7\xc2\xc7\xc3\xc7\xc4\xc7\xc5\xc7\xc6\xc7\xc7\xc7\xc8\xc7\xc9\xc7\xca\xc7\xcb\xc7\xcc\xc7\xcd\xc7\xce\xc7\xcf\xc7\xd0\xc7\xd1\xc7\xd2\xc7\xd3\xc7\xd4\xc7\xd5\xc7\xd6\xc7\xd7\xc7\xd8\xc7\xd9\xc7\xda\xc7\xdb\xc7\xdc\xc7\xdd\xc7\xde\xc7\xdf\xc7\xe0\xc7\xe1\xc7\xe2\xc7\xe3\xc7\xe4\xc7\xe5\xc7\xe6\xc7\xe7\xc7\xe8\xc7\xe9\xc7\xea\xc7\xeb\xc7\xec\xc7\xed\xc7\xee\xc7\xef\xc7\xf0\xc7\xf1\xc7\xf2\xc7\xf3\xc7\xf4\xc7\xf5\xc7\xf6\xc7\xf7\xc7\xf8\xc7\xf9\xc7\xfa\xc7\xfb\xc7\xfc\xc7\xfd\xc8\x41\xc8\x42\xc8\x43\xc8\x44\xc8\x45\xc8\x46\xc8\x47\xc8\x48\xc8\x49\xc8\x4a\xc8\x4b\xc8\x4c\xc8\x4d\xc8\x4e\xc8\x4f\xc8\x50\xc8\x51\xc8\x52\xc8\x53\xc8\x54\xc8\x55\xc8\x56\xc8\x57\xc8\x58", /* e480 */ "\xc8\x59\xc8\x5a\xc8\x5b\xc8\x5c\xc8\x5d\xc8\x5e\xc8\x5f\xc8\x60\xc8\x61\xc8\x62\xc8\x63\xc8\x64\xc8\x65\xc8\x66\xc8\x67\xc8\x68\xc8\x69\xc8\x6a\xc8\x6b\xc8\x6c\xc8\x6d\xc8\x6e\xc8\x6f\xc8\x70\xc8\x71\xc8\x72\xc8\x73\xc8\x74\xc8\x75\xc8\x76\xc8\x77\xc8\x78\xc8\x79\xc8\x7a\xc8\x7b\xc8\x7c\xc8\x7d\xc8\x7e\xc8\x7f\xc8\x81\xc8\x82\xc8\x83\xc8\x84\xc8\x85\xc8\x86\xc8\x87\xc8\x88\xc8\x89\xc8\x8a\xc8\x8b\xc8\x8c\xc8\x8d\xc8\x8e\xc8\x8f\xc8\x90\xc8\x91\xc8\x92\xc8\x93\xc8\x94\xc8\x95\xc8\x96\xc8\x97\xc8\x98\xc8\x99\xc8\x9a\xc8\x9b\xc8\x9c\xc8\x9d\xc8\x9e\xc8\x9f\xc8\xa0\xc8\xa1\xc8\xa2\xc8\xa3\xc8\xa4\xc8\xa5\xc8\xa6\xc8\xa7\xc8\xa8\xc8\xa9\xc8\xaa\xc8\xab\xc8\xac\xc8\xad\xc8\xae\xc8\xaf\xc8\xb0\xc8\xb1\xc8\xb2\xc8\xb3\xc8\xb4\xc8\xb5\xc8\xb6\xc8\xb7\xc8\xb8\xc8\xb9\xc8\xba\xc8\xbb\xc8\xbc\xc8\xbd\xc8\xbe\xc8\xbf\xc8\xc0\xc8\xc1\xc8\xc2\xc8\xc3\xc8\xc4\xc8\xc5\xc8\xc6\xc8\xc7\xc8\xc8\xc8\xc9\xc8\xca\xc8\xcb\xc8\xcc\xc8\xcd\xc8\xce\xc8\xcf\xc8\xd0\xc8\xd1\xc8\xd2\xc8\xd3\xc8\xd4\xc8\xd5\xc8\xd6\xc8\xd7\xc8\xd8\xc8\xd9", /* e500 */ "\xc8\xda\xc8\xdb\xc8\xdc\xc8\xdd\xc8\xde\xc8\xdf\xc8\xe0\xc8\xe1\xc8\xe2\xc8\xe3\xc8\xe4\xc8\xe5\xc8\xe6\xc8\xe7\xc8\xe8\xc8\xe9\xc8\xea\xc8\xeb\xc8\xec\xc8\xed\xc8\xee\xc8\xef\xc8\xf0\xc8\xf1\xc8\xf2\xc8\xf3\xc8\xf4\xc8\xf5\xc8\xf6\xc8\xf7\xc8\xf8\xc8\xf9\xc8\xfa\xc8\xfb\xc8\xfc\xc8\xfd\xc9\x41\xc9\x42\xc9\x43\xc9\x44\xc9\x45\xc9\x46\xc9\x47\xc9\x48\xc9\x49\xc9\x4a\xc9\x4b\xc9\x4c\xc9\x4d\xc9\x4e\xc9\x4f\xc9\x50\xc9\x51\xc9\x52\xc9\x53\xc9\x54\xc9\x55\xc9\x56\xc9\x57\xc9\x58\xc9\x59\xc9\x5a\xc9\x5b\xc9\x5c\xc9\x5d\xc9\x5e\xc9\x5f\xc9\x60\xc9\x61\xc9\x62\xc9\x63\xc9\x64\xc9\x65\xc9\x66\xc9\x67\xc9\x68\xc9\x69\xc9\x6a\xc9\x6b\xc9\x6c\xc9\x6d\xc9\x6e\xc9\x6f\xc9\x70\xc9\x71\xc9\x72\xc9\x73\xc9\x74\xc9\x75\xc9\x76\xc9\x77\xc9\x78\xc9\x79\xc9\x7a\xc9\x7b\xc9\x7c\xc9\x7d\xc9\x7e\xc9\x7f\xc9\x81\xc9\x82\xc9\x83\xc9\x84\xc9\x85\xc9\x86\xc9\x87\xc9\x88\xc9\x89\xc9\x8a\xc9\x8b\xc9\x8c\xc9\x8d\xc9\x8e\xc9\x8f\xc9\x90\xc9\x91\xc9\x92\xc9\x93\xc9\x94\xc9\x95\xc9\x96\xc9\x97\xc9\x98\xc9\x99\xc9\x9a\xc9\x9b\xc9\x9c\xc9\x9d", /* e580 */ "\xc9\x9e\xc9\x9f\xc9\xa0\xc9\xa1\xc9\xa2\xc9\xa3\xc9\xa4\xc9\xa5\xc9\xa6\xc9\xa7\xc9\xa8\xc9\xa9\xc9\xaa\xc9\xab\xc9\xac\xc9\xad\xc9\xae\xc9\xaf\xc9\xb0\xc9\xb1\xc9\xb2\xc9\xb3\xc9\xb4\xc9\xb5\xc9\xb6\xc9\xb7\xc9\xb8\xc9\xb9\xc9\xba\xc9\xbb\xc9\xbc\xc9\xbd\xc9\xbe\xc9\xbf\xc9\xc0\xc9\xc1\xc9\xc2\xc9\xc3\xc9\xc4\xc9\xc5\xc9\xc6\xc9\xc7\xc9\xc8\xc9\xc9\xc9\xca\xc9\xcb\xc9\xcc\xc9\xcd\xc9\xce\xc9\xcf\xc9\xd0\xc9\xd1\xc9\xd2\xc9\xd3\xc9\xd4\xc9\xd5\xc9\xd6\xc9\xd7\xc9\xd8\xc9\xd9\xc9\xda\xc9\xdb\xc9\xdc\xc9\xdd\xc9\xde\xc9\xdf\xc9\xe0\xc9\xe1\xc9\xe2\xc9\xe3\xc9\xe4\xc9\xe5\xc9\xe6\xc9\xe7\xc9\xe8\xc9\xe9\xc9\xea\xc9\xeb\xc9\xec\xc9\xed\xc9\xee\xc9\xef\xc9\xf0\xc9\xf1\xc9\xf2\xc9\xf3\xc9\xf4\xc9\xf5\xc9\xf6\xc9\xf7\xc9\xf8\xc9\xf9\xc9\xfa\xc9\xfb\xc9\xfc\xc9\xfd\xca\x41\xca\x42\xca\x43\xca\x44\xca\x45\xca\x46\xca\x47\xca\x48\xca\x49\xca\x4a\xca\x4b\xca\x4c\xca\x4d\xca\x4e\xca\x4f\xca\x50\xca\x51\xca\x52\xca\x53\xca\x54\xca\x55\xca\x56\xca\x57\xca\x58\xca\x59\xca\x5a\xca\x5b\xca\x5c\xca\x5d\xca\x5e\xca\x5f\xca\x60", /* e600 */ "\xca\x61\xca\x62\xca\x63\xca\x64\xca\x65\xca\x66\xca\x67\xca\x68\xca\x69\xca\x6a\xca\x6b\xca\x6c\xca\x6d\xca\x6e\xca\x6f\xca\x70\xca\x71\xca\x72\xca\x73\xca\x74\xca\x75\xca\x76\xca\x77\xca\x78\xca\x79\xca\x7a\xca\x7b\xca\x7c\xca\x7d\xca\x7e\xca\x7f\xca\x81\xca\x82\xca\x83\xca\x84\xca\x85\xca\x86\xca\x87\xca\x88\xca\x89\xca\x8a\xca\x8b\xca\x8c\xca\x8d\xca\x8e\xca\x8f\xca\x90\xca\x91\xca\x92\xca\x93\xca\x94\xca\x95\xca\x96\xca\x97\xca\x98\xca\x99\xca\x9a\xca\x9b\xca\x9c\xca\x9d\xca\x9e\xca\x9f\xca\xa0\xca\xa1\xca\xa2\xca\xa3\xca\xa4\xca\xa5\xca\xa6\xca\xa7\xca\xa8\xca\xa9\xca\xaa\xca\xab\xca\xac\xca\xad\xca\xae\xca\xaf\xca\xb0\xca\xb1\xca\xb2\xca\xb3\xca\xb4\xca\xb5\xca\xb6\xca\xb7\xca\xb8\xca\xb9\xca\xba\xca\xbb\xca\xbc\xca\xbd\xca\xbe\xca\xbf\xca\xc0\xca\xc1\xca\xc2\xca\xc3\xca\xc4\xca\xc5\xca\xc6\xca\xc7\xca\xc8\xca\xc9\xca\xca\xca\xcb\xca\xcc\xca\xcd\xca\xce\xca\xcf\xca\xd0\xca\xd1\xca\xd2\xca\xd3\xca\xd4\xca\xd5\xca\xd6\xca\xd7\xca\xd8\xca\xd9\xca\xda\xca\xdb\xca\xdc\xca\xdd\xca\xde\xca\xdf\xca\xe0\xca\xe1", /* e680 */ "\xca\xe2\xca\xe3\xca\xe4\xca\xe5\xca\xe6\xca\xe7\xca\xe8\xca\xe9\xca\xea\xca\xeb\xca\xec\xca\xed\xca\xee\xca\xef\xca\xf0\xca\xf1\xca\xf2\xca\xf3\xca\xf4\xca\xf5\xca\xf6\xca\xf7\xca\xf8\xca\xf9\xca\xfa\xca\xfb\xca\xfc\xca\xfd\xcb\x41\xcb\x42\xcb\x43\xcb\x44\xcb\x45\xcb\x46\xcb\x47\xcb\x48\xcb\x49\xcb\x4a\xcb\x4b\xcb\x4c\xcb\x4d\xcb\x4e\xcb\x4f\xcb\x50\xcb\x51\xcb\x52\xcb\x53\xcb\x54\xcb\x55\xcb\x56\xcb\x57\xcb\x58\xcb\x59\xcb\x5a\xcb\x5b\xcb\x5c\xcb\x5d\xcb\x5e\xcb\x5f\xcb\x60\xcb\x61\xcb\x62\xcb\x63\xcb\x64\xcb\x65\xcb\x66\xcb\x67\xcb\x68\xcb\x69\xcb\x6a\xcb\x6b\xcb\x6c\xcb\x6d\xcb\x6e\xcb\x6f\xcb\x70\xcb\x71\xcb\x72\xcb\x73\xcb\x74\xcb\x75\xcb\x76\xcb\x77\xcb\x78\xcb\x79\xcb\x7a\xcb\x7b\xcb\x7c\xcb\x7d\xcb\x7e\xcb\x7f\xcb\x81\xcb\x82\xcb\x83\xcb\x84\xcb\x85\xcb\x86\xcb\x87\xcb\x88\xcb\x89\xcb\x8a\xcb\x8b\xcb\x8c\xcb\x8d\xcb\x8e\xcb\x8f\xcb\x90\xcb\x91\xcb\x92\xcb\x93\xcb\x94\xcb\x95\xcb\x96\xcb\x97\xcb\x98\xcb\x99\xcb\x9a\xcb\x9b\xcb\x9c\xcb\x9d\xcb\x9e\xcb\x9f\xcb\xa0\xcb\xa1\xcb\xa2\xcb\xa3\xcb\xa4\xcb\xa5", /* e700 */ "\xcb\xa6\xcb\xa7\xcb\xa8\xcb\xa9\xcb\xaa\xcb\xab\xcb\xac\xcb\xad\xcb\xae\xcb\xaf\xcb\xb0\xcb\xb1\xcb\xb2\xcb\xb3\xcb\xb4\xcb\xb5\xcb\xb6\xcb\xb7\xcb\xb8\xcb\xb9\xcb\xba\xcb\xbb\xcb\xbc\xcb\xbd\xcb\xbe\xcb\xbf\xcb\xc0\xcb\xc1\xcb\xc2\xcb\xc3\xcb\xc4\xcb\xc5\xcb\xc6\xcb\xc7\xcb\xc8\xcb\xc9\xcb\xca\xcb\xcb\xcb\xcc\xcb\xcd\xcb\xce\xcb\xcf\xcb\xd0\xcb\xd1\xcb\xd2\xcb\xd3\xcb\xd4\xcb\xd5\xcb\xd6\xcb\xd7\xcb\xd8\xcb\xd9\xcb\xda\xcb\xdb\xcb\xdc\xcb\xdd\xcb\xde\xcb\xdf\xcb\xe0\xcb\xe1\xcb\xe2\xcb\xe3\xcb\xe4\xcb\xe5\xcb\xe6\xcb\xe7\xcb\xe8\xcb\xe9\xcb\xea\xcb\xeb\xcb\xec\xcb\xed\xcb\xee\xcb\xef\xcb\xf0\xcb\xf1\xcb\xf2\xcb\xf3\xcb\xf4\xcb\xf5\xcb\xf6\xcb\xf7\xcb\xf8\xcb\xf9\xcb\xfa\xcb\xfb\xcb\xfc\xcb\xfd\xcc\x41\xcc\x42\xcc\x43\xcc\x44\xcc\x45\xcc\x46\xcc\x47\xcc\x48\xcc\x49\xcc\x4a\xcc\x4b\xcc\x4c\xcc\x4d\xcc\x4e\xcc\x4f\xcc\x50\xcc\x51\xcc\x52\xcc\x53\xcc\x54\xcc\x55\xcc\x56\xcc\x57\xcc\x58\xcc\x59\xcc\x5a\xcc\x5b\xcc\x5c\xcc\x5d\xcc\x5e\xcc\x5f\xcc\x60\xcc\x61\xcc\x62\xcc\x63\xcc\x64\xcc\x65\xcc\x66\xcc\x67\xcc\x68", /* e780 */ "\xcc\x69\xcc\x6a\xcc\x6b\xcc\x6c\xcc\x6d\xcc\x6e\xcc\x6f\xcc\x70\xcc\x71\xcc\x72\xcc\x73\xcc\x74\xcc\x75\xcc\x76\xcc\x77\xcc\x78\xcc\x79\xcc\x7a\xcc\x7b\xcc\x7c\xcc\x7d\xcc\x7e\xcc\x7f\xcc\x81\xcc\x82\xcc\x83\xcc\x84\xcc\x85\xcc\x86\xcc\x87\xcc\x88\xcc\x89\xcc\x8a\xcc\x8b\xcc\x8c\xcc\x8d\xcc\x8e\xcc\x8f\xcc\x90\xcc\x91\xcc\x92\xcc\x93\xcc\x94\xcc\x95\xcc\x96\xcc\x97\xcc\x98\xcc\x99\xcc\x9a\xcc\x9b\xcc\x9c\xcc\x9d\xcc\x9e\xcc\x9f\xcc\xa0\xcc\xa1\xcc\xa2\xcc\xa3\xcc\xa4\xcc\xa5\xcc\xa6\xcc\xa7\xcc\xa8\xcc\xa9\xcc\xaa\xcc\xab\xcc\xac\xcc\xad\xcc\xae\xcc\xaf\xcc\xb0\xcc\xb1\xcc\xb2\xcc\xb3\xcc\xb4\xcc\xb5\xcc\xb6\xcc\xb7\xcc\xb8\xcc\xb9\xcc\xba\xcc\xbb\xcc\xbc\xcc\xbd\xcc\xbe\xcc\xbf\xcc\xc0\xcc\xc1\xcc\xc2\xcc\xc3\xcc\xc4\xcc\xc5\xcc\xc6\xcc\xc7\xcc\xc8\xcc\xc9\xcc\xca\xcc\xcb\xcc\xcc\xcc\xcd\xcc\xce\xcc\xcf\xcc\xd0\xcc\xd1\xcc\xd2\xcc\xd3\xcc\xd4\xcc\xd5\xcc\xd6\xcc\xd7\xcc\xd8\xcc\xd9\xcc\xda\xcc\xdb\xcc\xdc\xcc\xdd\xcc\xde\xcc\xdf\xcc\xe0\xcc\xe1\xcc\xe2\xcc\xe3\xcc\xe4\xcc\xe5\xcc\xe6\xcc\xe7\xcc\xe8\xcc\xe9", /* e800 */ "\xcc\xea\xcc\xeb\xcc\xec\xcc\xed\xcc\xee\xcc\xef\xcc\xf0\xcc\xf1\xcc\xf2\xcc\xf3\xcc\xf4\xcc\xf5\xcc\xf6\xcc\xf7\xcc\xf8\xcc\xf9\xcc\xfa\xcc\xfb\xcc\xfc\xcc\xfd\xcd\x41\xcd\x42\xcd\x43\xcd\x44\xcd\x45\xcd\x46\xcd\x47\xcd\x48\xcd\x49\xcd\x4a\xcd\x4b\xcd\x4c\xcd\x4d\xcd\x4e\xcd\x4f\xcd\x50\xcd\x51\xcd\x52\xcd\x53\xcd\x54\xcd\x55\xcd\x56\xcd\x57\xcd\x58\xcd\x59\xcd\x5a\xcd\x5b\xcd\x5c\xcd\x5d\xcd\x5e\xcd\x5f\xcd\x60\xcd\x61\xcd\x62\xcd\x63\xcd\x64\xcd\x65\xcd\x66\xcd\x67\xcd\x68\xcd\x69\xcd\x6a\xcd\x6b\xcd\x6c\xcd\x6d\xcd\x6e\xcd\x6f\xcd\x70\xcd\x71\xcd\x72\xcd\x73\xcd\x74\xcd\x75\xcd\x76\xcd\x77\xcd\x78\xcd\x79\xcd\x7a\xcd\x7b\xcd\x7c\xcd\x7d\xcd\x7e\xcd\x7f\xcd\x81\xcd\x82\xcd\x83\xcd\x84\xcd\x85\xcd\x86\xcd\x87\xcd\x88\xcd\x89\xcd\x8a\xcd\x8b\xcd\x8c\xcd\x8d\xcd\x8e\xcd\x8f\xcd\x90\xcd\x91\xcd\x92\xcd\x93\xcd\x94\xcd\x95\xcd\x96\xcd\x97\xcd\x98\xcd\x99\xcd\x9a\xcd\x9b\xcd\x9c\xcd\x9d\xcd\x9e\xcd\x9f\xcd\xa0\xcd\xa1\xcd\xa2\xcd\xa3\xcd\xa4\xcd\xa5\xcd\xa6\xcd\xa7\xcd\xa8\xcd\xa9\xcd\xaa\xcd\xab\xcd\xac\xcd\xad", /* e880 */ "\xcd\xae\xcd\xaf\xcd\xb0\xcd\xb1\xcd\xb2\xcd\xb3\xcd\xb4\xcd\xb5\xcd\xb6\xcd\xb7\xcd\xb8\xcd\xb9\xcd\xba\xcd\xbb\xcd\xbc\xcd\xbd\xcd\xbe\xcd\xbf\xcd\xc0\xcd\xc1\xcd\xc2\xcd\xc3\xcd\xc4\xcd\xc5\xcd\xc6\xcd\xc7\xcd\xc8\xcd\xc9\xcd\xca\xcd\xcb\xcd\xcc\xcd\xcd\xcd\xce\xcd\xcf\xcd\xd0\xcd\xd1\xcd\xd2\xcd\xd3\xcd\xd4\xcd\xd5\xcd\xd6\xcd\xd7\xcd\xd8\xcd\xd9\xcd\xda\xcd\xdb\xcd\xdc\xcd\xdd\xcd\xde\xcd\xdf\xcd\xe0\xcd\xe1\xcd\xe2\xcd\xe3\xcd\xe4\xcd\xe5\xcd\xe6\xcd\xe7\xcd\xe8\xcd\xe9\xcd\xea\xcd\xeb\xcd\xec\xcd\xed\xcd\xee\xcd\xef\xcd\xf0\xcd\xf1\xcd\xf2\xcd\xf3\xcd\xf4\xcd\xf5\xcd\xf6\xcd\xf7\xcd\xf8\xcd\xf9\xcd\xfa\xcd\xfb\xcd\xfc\xcd\xfd\xce\x41\xce\x42\xce\x43\xce\x44\xce\x45\xce\x46\xce\x47\xce\x48\xce\x49\xce\x4a\xce\x4b\xce\x4c\xce\x4d\xce\x4e\xce\x4f\xce\x50\xce\x51\xce\x52\xce\x53\xce\x54\xce\x55\xce\x56\xce\x57\xce\x58\xce\x59\xce\x5a\xce\x5b\xce\x5c\xce\x5d\xce\x5e\xce\x5f\xce\x60\xce\x61\xce\x62\xce\x63\xce\x64\xce\x65\xce\x66\xce\x67\xce\x68\xce\x69\xce\x6a\xce\x6b\xce\x6c\xce\x6d\xce\x6e\xce\x6f\xce\x70", /* e900 */ "\xce\x71\xce\x72\xce\x73\xce\x74\xce\x75\xce\x76\xce\x77\xce\x78\xce\x79\xce\x7a\xce\x7b\xce\x7c\xce\x7d\xce\x7e\xce\x7f\xce\x81\xce\x82\xce\x83\xce\x84\xce\x85\xce\x86\xce\x87\xce\x88\xce\x89\xce\x8a\xce\x8b\xce\x8c\xce\x8d\xce\x8e\xce\x8f\xce\x90\xce\x91\xce\x92\xce\x93\xce\x94\xce\x95\xce\x96\xce\x97\xce\x98\xce\x99\xce\x9a\xce\x9b\xce\x9c\xce\x9d\xce\x9e\xce\x9f\xce\xa0\xce\xa1\xce\xa2\xce\xa3\xce\xa4\xce\xa5\xce\xa6\xce\xa7\xce\xa8\xce\xa9\xce\xaa\xce\xab\xce\xac\xce\xad\xce\xae\xce\xaf\xce\xb0\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xce\xb5\xce\xb6\xce\xb7\xce\xb8\xce\xb9\xce\xba\xce\xbb\xce\xbc\xce\xbd\xce\xbe\xce\xbf\xce\xc0\xce\xc1\xce\xc2\xce\xc3\xce\xc4\xce\xc5\xce\xc6\xce\xc7\xce\xc8\xce\xc9\xce\xca\xce\xcb\xce\xcc\xce\xcd\xce\xce\xce\xcf\xce\xd0\xce\xd1\xce\xd2\xce\xd3\xce\xd4\xce\xd5\xce\xd6\xce\xd7\xce\xd8\xce\xd9\xce\xda\xce\xdb\xce\xdc\xce\xdd\xce\xde\xce\xdf\xce\xe0\xce\xe1\xce\xe2\xce\xe3\xce\xe4\xce\xe5\xce\xe6\xce\xe7\xce\xe8\xce\xe9\xce\xea\xce\xeb\xce\xec\xce\xed\xce\xee\xce\xef\xce\xf0\xce\xf1", /* e980 */ "\xce\xf2\xce\xf3\xce\xf4\xce\xf5\xce\xf6\xce\xf7\xce\xf8\xce\xf9\xce\xfa\xce\xfb\xce\xfc\xce\xfd\xcf\x41\xcf\x42\xcf\x43\xcf\x44\xcf\x45\xcf\x46\xcf\x47\xcf\x48\xcf\x49\xcf\x4a\xcf\x4b\xcf\x4c\xcf\x4d\xcf\x4e\xcf\x4f\xcf\x50\xcf\x51\xcf\x52\xcf\x53\xcf\x54\xcf\x55\xcf\x56\xcf\x57\xcf\x58\xcf\x59\xcf\x5a\xcf\x5b\xcf\x5c\xcf\x5d\xcf\x5e\xcf\x5f\xcf\x60\xcf\x61\xcf\x62\xcf\x63\xcf\x64\xcf\x65\xcf\x66\xcf\x67\xcf\x68\xcf\x69\xcf\x6a\xcf\x6b\xcf\x6c\xcf\x6d\xcf\x6e\xcf\x6f\xcf\x70\xcf\x71\xcf\x72\xcf\x73\xcf\x74\xcf\x75\xcf\x76\xcf\x77\xcf\x78\xcf\x79\xcf\x7a\xcf\x7b\xcf\x7c\xcf\x7d\xcf\x7e\xcf\x7f\xcf\x81\xcf\x82\xcf\x83\xcf\x84\xcf\x85\xcf\x86\xcf\x87\xcf\x88\xcf\x89\xcf\x8a\xcf\x8b\xcf\x8c\xcf\x8d\xcf\x8e\xcf\x8f\xcf\x90\xcf\x91\xcf\x92\xcf\x93\xcf\x94\xcf\x95\xcf\x96\xcf\x97\xcf\x98\xcf\x99\xcf\x9a\xcf\x9b\xcf\x9c\xcf\x9d\xcf\x9e\xcf\x9f\xcf\xa0\xcf\xa1\xcf\xa2\xcf\xa3\xcf\xa4\xcf\xa5\xcf\xa6\xcf\xa7\xcf\xa8\xcf\xa9\xcf\xaa\xcf\xab\xcf\xac\xcf\xad\xcf\xae\xcf\xaf\xcf\xb0\xcf\xb1\xcf\xb2\xcf\xb3\xcf\xb4\xcf\xb5", /* ea00 */ "\xcf\xb6\xcf\xb7\xcf\xb8\xcf\xb9\xcf\xba\xcf\xbb\xcf\xbc\xcf\xbd\xcf\xbe\xcf\xbf\xcf\xc0\xcf\xc1\xcf\xc2\xcf\xc3\xcf\xc4\xcf\xc5\xcf\xc6\xcf\xc7\xcf\xc8\xcf\xc9\xcf\xca\xcf\xcb\xcf\xcc\xcf\xcd\xcf\xce\xcf\xcf\xcf\xd0\xcf\xd1\xcf\xd2\xcf\xd3\xcf\xd4\xcf\xd5\xcf\xd6\xcf\xd7\xcf\xd8\xcf\xd9\xcf\xda\xcf\xdb\xcf\xdc\xcf\xdd\xcf\xde\xcf\xdf\xcf\xe0\xcf\xe1\xcf\xe2\xcf\xe3\xcf\xe4\xcf\xe5\xcf\xe6\xcf\xe7\xcf\xe8\xcf\xe9\xcf\xea\xcf\xeb\xcf\xec\xcf\xed\xcf\xee\xcf\xef\xcf\xf0\xcf\xf1\xcf\xf2\xcf\xf3\xcf\xf4\xcf\xf5\xcf\xf6\xcf\xf7\xcf\xf8\xcf\xf9\xcf\xfa\xcf\xfb\xcf\xfc\xcf\xfd\xd0\x41\xd0\x42\xd0\x43\xd0\x44\xd0\x45\xd0\x46\xd0\x47\xd0\x48\xd0\x49\xd0\x4a\xd0\x4b\xd0\x4c\xd0\x4d\xd0\x4e\xd0\x4f\xd0\x50\xd0\x51\xd0\x52\xd0\x53\xd0\x54\xd0\x55\xd0\x56\xd0\x57\xd0\x58\xd0\x59\xd0\x5a\xd0\x5b\xd0\x5c\xd0\x5d\xd0\x5e\xd0\x5f\xd0\x60\xd0\x61\xd0\x62\xd0\x63\xd0\x64\xd0\x65\xd0\x66\xd0\x67\xd0\x68\xd0\x69\xd0\x6a\xd0\x6b\xd0\x6c\xd0\x6d\xd0\x6e\xd0\x6f\xd0\x70\xd0\x71\xd0\x72\xd0\x73\xd0\x74\xd0\x75\xd0\x76\xd0\x77\xd0\x78", /* ea80 */ "\xd0\x79\xd0\x7a\xd0\x7b\xd0\x7c\xd0\x7d\xd0\x7e\xd0\x7f\xd0\x81\xd0\x82\xd0\x83\xd0\x84\xd0\x85\xd0\x86\xd0\x87\xd0\x88\xd0\x89\xd0\x8a\xd0\x8b\xd0\x8c\xd0\x8d\xd0\x8e\xd0\x8f\xd0\x90\xd0\x91\xd0\x92\xd0\x93\xd0\x94\xd0\x95\xd0\x96\xd0\x97\xd0\x98\xd0\x99\xd0\x9a\xd0\x9b\xd0\x9c\xd0\x9d\xd0\x9e\xd0\x9f\xd0\xa0\xd0\xa1\xd0\xa2\xd0\xa3\xd0\xa4\xd0\xa5\xd0\xa6\xd0\xa7\xd0\xa8\xd0\xa9\xd0\xaa\xd0\xab\xd0\xac\xd0\xad\xd0\xae\xd0\xaf\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4\xd0\xb5\xd0\xb6\xd0\xb7\xd0\xb8\xd0\xb9\xd0\xba\xd0\xbb\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xbf\xd0\xc0\xd0\xc1\xd0\xc2\xd0\xc3\xd0\xc4\xd0\xc5\xd0\xc6\xd0\xc7\xd0\xc8\xd0\xc9\xd0\xca\xd0\xcb\xd0\xcc\xd0\xcd\xd0\xce\xd0\xcf\xd0\xd0\xd0\xd1\xd0\xd2\xd0\xd3\xd0\xd4\xd0\xd5\xd0\xd6\xd0\xd7\xd0\xd8\xd0\xd9\xd0\xda\xd0\xdb\xd0\xdc\xd0\xdd\xd0\xde\xd0\xdf\xd0\xe0\xd0\xe1\xd0\xe2\xd0\xe3\xd0\xe4\xd0\xe5\xd0\xe6\xd0\xe7\xd0\xe8\xd0\xe9\xd0\xea\xd0\xeb\xd0\xec\xd0\xed\xd0\xee\xd0\xef\xd0\xf0\xd0\xf1\xd0\xf2\xd0\xf3\xd0\xf4\xd0\xf5\xd0\xf6\xd0\xf7\xd0\xf8\xd0\xf9", /* eb00 */ "\xd0\xfa\xd0\xfb\xd0\xfc\xd0\xfd\xd1\x41\xd1\x42\xd1\x43\xd1\x44\xd1\x45\xd1\x46\xd1\x47\xd1\x48\xd1\x49\xd1\x4a\xd1\x4b\xd1\x4c\xd1\x4d\xd1\x4e\xd1\x4f\xd1\x50\xd1\x51\xd1\x52\xd1\x53\xd1\x54\xd1\x55\xd1\x56\xd1\x57\xd1\x58\xd1\x59\xd1\x5a\xd1\x5b\xd1\x5c\xd1\x5d\xd1\x5e\xd1\x5f\xd1\x60\xd1\x61\xd1\x62\xd1\x63\xd1\x64\xd1\x65\xd1\x66\xd1\x67\xd1\x68\xd1\x69\xd1\x6a\xd1\x6b\xd1\x6c\xd1\x6d\xd1\x6e\xd1\x6f\xd1\x70\xd1\x71\xd1\x72\xd1\x73\xd1\x74\xd1\x75\xd1\x76\xd1\x77\xd1\x78\xd1\x79\xd1\x7a\xd1\x7b\xd1\x7c\xd1\x7d\xd1\x7e\xd1\x7f\xd1\x81\xd1\x82\xd1\x83\xd1\x84\xd1\x85\xd1\x86\xd1\x87\xd1\x88\xd1\x89\xd1\x8a\xd1\x8b\xd1\x8c\xd1\x8d\xd1\x8e\xd1\x8f\xd1\x90\xd1\x91\xd1\x92\xd1\x93\xd1\x94\xd1\x95\xd1\x96\xd1\x97\xd1\x98\xd1\x99\xd1\x9a\xd1\x9b\xd1\x9c\xd1\x9d\xd1\x9e\xd1\x9f\xd1\xa0\xd1\xa1\xd1\xa2\xd1\xa3\xd1\xa4\xd1\xa5\xd1\xa6\xd1\xa7\xd1\xa8\xd1\xa9\xd1\xaa\xd1\xab\xd1\xac\xd1\xad\xd1\xae\xd1\xaf\xd1\xb0\xd1\xb1\xd1\xb2\xd1\xb3\xd1\xb4\xd1\xb5\xd1\xb6\xd1\xb7\xd1\xb8\xd1\xb9\xd1\xba\xd1\xbb\xd1\xbc\xd1\xbd", /* eb80 */ "\xd1\xbe\xd1\xbf\xd1\xc0\xd1\xc1\xd1\xc2\xd1\xc3\xd1\xc4\xd1\xc5\xd1\xc6\xd1\xc7\xd1\xc8\xd1\xc9\xd1\xca\xd1\xcb\xd1\xcc\xd1\xcd\xd1\xce\xd1\xcf\xd1\xd0\xd1\xd1\xd1\xd2\xd1\xd3\xd1\xd4\xd1\xd5\xd1\xd6\xd1\xd7\xd1\xd8\xd1\xd9\xd1\xda\xd1\xdb\xd1\xdc\xd1\xdd\xd1\xde\xd1\xdf\xd1\xe0\xd1\xe1\xd1\xe2\xd1\xe3\xd1\xe4\xd1\xe5\xd1\xe6\xd1\xe7\xd1\xe8\xd1\xe9\xd1\xea\xd1\xeb\xd1\xec\xd1\xed\xd1\xee\xd1\xef\xd1\xf0\xd1\xf1\xd1\xf2\xd1\xf3\xd1\xf4\xd1\xf5\xd1\xf6\xd1\xf7\xd1\xf8\xd1\xf9\xd1\xfa\xd1\xfb\xd1\xfc\xd1\xfd\xd2\x41\xd2\x42\xd2\x43\xd2\x44\xd2\x45\xd2\x46\xd2\x47\xd2\x48\xd2\x49\xd2\x4a\xd2\x4b\xd2\x4c\xd2\x4d\xd2\x4e\xd2\x4f\xd2\x50\xd2\x51\xd2\x52\xd2\x53\xd2\x54\xd2\x55\xd2\x56\xd2\x57\xd2\x58\xd2\x59\xd2\x5a\xd2\x5b\xd2\x5c\xd2\x5d\xd2\x5e\xd2\x5f\xd2\x60\xd2\x61\xd2\x62\xd2\x63\xd2\x64\xd2\x65\xd2\x66\xd2\x67\xd2\x68\xd2\x69\xd2\x6a\xd2\x6b\xd2\x6c\xd2\x6d\xd2\x6e\xd2\x6f\xd2\x70\xd2\x71\xd2\x72\xd2\x73\xd2\x74\xd2\x75\xd2\x76\xd2\x77\xd2\x78\xd2\x79\xd2\x7a\xd2\x7b\xd2\x7c\xd2\x7d\xd2\x7e\xd2\x7f\xd2\x81", /* ec00 */ "\xd2\x82\xd2\x83\xd2\x84\xd2\x85\xd2\x86\xd2\x87\xd2\x88\xd2\x89\xd2\x8a\xd2\x8b\xd2\x8c\xd2\x8d\xd2\x8e\xd2\x8f\xd2\x90\xd2\x91\xd2\x92\xd2\x93\xd2\x94\xd2\x95\xd2\x96\xd2\x97\xd2\x98\xd2\x99\xd2\x9a\xd2\x9b\xd2\x9c\xd2\x9d\xd2\x9e\xd2\x9f\xd2\xa0\xd2\xa1\xd2\xa2\xd2\xa3\xd2\xa4\xd2\xa5\xd2\xa6\xd2\xa7\xd2\xa8\xd2\xa9\xd2\xaa\xd2\xab\xd2\xac\xd2\xad\xd2\xae\xd2\xaf\xd2\xb0\xd2\xb1\xd2\xb2\xd2\xb3\xd2\xb4\xd2\xb5\xd2\xb6\xd2\xb7\xd2\xb8\xd2\xb9\xd2\xba\xd2\xbb\xd2\xbc\xd2\xbd\xd2\xbe\xd2\xbf\xd2\xc0\xd2\xc1\xd2\xc2\xd2\xc3\xd2\xc4\xd2\xc5\xd2\xc6\xd2\xc7\xd2\xc8\xd2\xc9\xd2\xca\xd2\xcb\xd2\xcc\xd2\xcd\xd2\xce\xd2\xcf\xd2\xd0\xd2\xd1\xd2\xd2\xd2\xd3\xd2\xd4\xd2\xd5\xd2\xd6\xd2\xd7\xd2\xd8\xd2\xd9\xd2\xda\xd2\xdb\xd2\xdc\xd2\xdd\xd2\xde\xd2\xdf\xd2\xe0\xd2\xe1\xd2\xe2\xd2\xe3\xd2\xe4\xd2\xe5\xd2\xe6\xd2\xe7\xd2\xe8\xd2\xe9\xd2\xea\xd2\xeb\xd2\xec\xd2\xed\xd2\xee\xd2\xef\xd2\xf0\xd2\xf1\xd2\xf2\xd2\xf3\xd2\xf4\xd2\xf5\xd2\xf6\xd2\xf7\xd2\xf8\xd2\xf9\xd2\xfa\xd2\xfb\xd2\xfc\xd2\xfd\xd3\x41\xd3\x42\xd3\x43\xd3\x44", /* ec80 */ "\xd3\x45\xd3\x46\xd3\x47\xd3\x48\xd3\x49\xd3\x4a\xd3\x4b\xd3\x4c\xd3\x4d\xd3\x4e\xd3\x4f\xd3\x50\xd3\x51\xd3\x52\xd3\x53\xd3\x54\xd3\x55\xd3\x56\xd3\x57\xd3\x58\xd3\x59\xd3\x5a\xd3\x5b\xd3\x5c\xd3\x5d\xd3\x5e\xd3\x5f\xd3\x60\xd3\x61\xd3\x62\xd3\x63\xd3\x64\xd3\x65\xd3\x66\xd3\x67\xd3\x68\xd3\x69\xd3\x6a\xd3\x6b\xd3\x6c\xd3\x6d\xd3\x6e\xd3\x6f\xd3\x70\xd3\x71\xd3\x72\xd3\x73\xd3\x74\xd3\x75\xd3\x76\xd3\x77\xd3\x78\xd3\x79\xd3\x7a\xd3\x7b\xd3\x7c\xd3\x7d\xd3\x7e\xd3\x7f\xd3\x81\xd3\x82\xd3\x83\xd3\x84\xd3\x85\xd3\x86\xd3\x87\xd3\x88\xd3\x89\xd3\x8a\xd3\x8b\xd3\x8c\xd3\x8d\xd3\x8e\xd3\x8f\xd3\x90\xd3\x91\xd3\x92\xd3\x93\xd3\x94\xd3\x95\xd3\x96\xd3\x97\xd3\x98\xd3\x99\xd3\x9a\xd3\x9b\xd3\x9c\xd3\x9d\xd3\x9e\xd3\x9f\xd3\xa0\xd3\xa1\xd3\xa2\xd3\xa3\xd3\xa4\xd3\xa5\xd3\xa6\xd3\xa7\xd3\xa8\xd3\xa9\xd3\xaa\xd3\xab\xd3\xac\xd3\xad\xd3\xae\xd3\xaf\xd3\xb0\xd3\xb1\xd3\xb2\xd3\xb3\xd3\xb4\xd3\xb5\xd3\xb6\xd3\xb7\xd3\xb8\xd3\xb9\xd3\xba\xd3\xbb\xd3\xbc\xd3\xbd\xd3\xbe\xd3\xbf\xd3\xc0\xd3\xc1\xd3\xc2\xd3\xc3\xd3\xc4\xd3\xc5", /* ed00 */ "\xd3\xc6\xd3\xc7\xd3\xc8\xd3\xc9\xd3\xca\xd3\xcb\xd3\xcc\xd3\xcd\xd3\xce\xd3\xcf\xd3\xd0\xd3\xd1\xd3\xd2\xd3\xd3\xd3\xd4\xd3\xd5\xd3\xd6\xd3\xd7\xd3\xd8\xd3\xd9\xd3\xda\xd3\xdb\xd3\xdc\xd3\xdd\xd3\xde\xd3\xdf\xd3\xe0\xd3\xe1\xd3\xe2\xd3\xe3\xd3\xe4\xd3\xe5\xd3\xe6\xd3\xe7\xd3\xe8\xd3\xe9\xd3\xea\xd3\xeb\xd3\xec\xd3\xed\xd3\xee\xd3\xef\xd3\xf0\xd3\xf1\xd3\xf2\xd3\xf3\xd3\xf4\xd3\xf5\xd3\xf6\xd3\xf7\xd3\xf8\xd3\xf9\xd3\xfa\xd3\xfb\xd3\xfc\xd3\xfd\xd4\x41\xd4\x42\xd4\x43\xd4\x44\xd4\x45\xd4\x46\xd4\x47\xd4\x48\xd4\x49\xd4\x4a\xd4\x4b\xd4\x4c\xd4\x4d\xd4\x4e\xd4\x4f\xd4\x50\xd4\x51\xd4\x52\xd4\x53\xd4\x54\xd4\x55\xd4\x56\xd4\x57\xd4\x58\xd4\x59\xd4\x5a\xd4\x5b\xd4\x5c\xd4\x5d\xd4\x5e\xd4\x5f\xd4\x60\xd4\x61\xd4\x62\xd4\x63\xd4\x64\xd4\x65\xd4\x66\xd4\x67\xd4\x68\xd4\x69\xd4\x6a\xd4\x6b\xd4\x6c\xd4\x6d\xd4\x6e\xd4\x6f\xd4\x70\xd4\x71\xd4\x72\xd4\x73\xd4\x74\xd4\x75\xd4\x76\xd4\x77\xd4\x78\xd4\x79\xd4\x7a\xd4\x7b\xd4\x7c\xd4\x7d\xd4\x7e\xd4\x7f\xd4\x81\xd4\x82\xd4\x83\xd4\x84\xd4\x85\xd4\x86\xd4\x87\xd4\x88\xd4\x89", /* ed80 */ "\xd4\x8a\xd4\x8b\xd4\x8c\xd4\x8d\xd4\x8e\xd4\x8f\xd4\x90\xd4\x91\xd4\x92\xd4\x93\xd4\x94\xd4\x95\xd4\x96\xd4\x97\xd4\x98\xd4\x99\xd4\x9a\xd4\x9b\xd4\x9c\xd4\x9d\xd4\x9e\xd4\x9f\xd4\xa0\xd4\xa1\xd4\xa2\xd4\xa3\xd4\xa4\xd4\xa5\xd4\xa6\xd4\xa7\xd4\xa8\xd4\xa9\xd4\xaa\xd4\xab\xd4\xac\xd4\xad\xd4\xae\xd4\xaf\xd4\xb0\xd4\xb1\xd4\xb2\xd4\xb3\xd4\xb4\xd4\xb5\xd4\xb6\xd4\xb7\xd4\xb8\xd4\xb9\xd4\xba\xd4\xbb\xd4\xbc\xd4\xbd\xd4\xbe\xd4\xbf\xd4\xc0\xd4\xc1\xd4\xc2\xd4\xc3\xd4\xc4\xd4\xc5\xd4\xc6\xd4\xc7\xd4\xc8\xd4\xc9\xd4\xca\xd4\xcb\xd4\xcc\xd4\xcd\xd4\xce\xd4\xcf\xd4\xd0\xd4\xd1\xd4\xd2\xd4\xd3\xd4\xd4\xd4\xd5\xd4\xd6\xd4\xd7\xd4\xd8\xd4\xd9\xd4\xda\xd4\xdb\xd4\xdc\xd4\xdd\xd4\xde\xd4\xdf\xd4\xe0\xd4\xe1\xd4\xe2\xd4\xe3\xd4\xe4\xd4\xe5\xd4\xe6\xd4\xe7\xd4\xe8\xd4\xe9\xd4\xea\xd4\xeb\xd4\xec\xd4\xed\xd4\xee\xd4\xef\xd4\xf0\xd4\xf1\xd4\xf2\xd4\xf3\xd4\xf4\xd4\xf5\xd4\xf6\xd4\xf7\xd4\xf8\xd4\xf9\xd4\xfa\xd4\xfb\xd4\xfc\xd4\xfd\xd5\x41\xd5\x42\xd5\x43\xd5\x44\xd5\x45\xd5\x46\xd5\x47\xd5\x48\xd5\x49\xd5\x4a\xd5\x4b\xd5\x4c", /* ee00 */ "\xd5\x4d\xd5\x4e\xd5\x4f\xd5\x50\xd5\x51\xd5\x52\xd5\x53\xd5\x54\xd5\x55\xd5\x56\xd5\x57\xd5\x58\xd5\x59\xd5\x5a\xd5\x5b\xd5\x5c\xd5\x5d\xd5\x5e\xd5\x5f\xd5\x60\xd5\x61\xd5\x62\xd5\x63\xd5\x64\xd5\x65\xd5\x66\xd5\x67\xd5\x68\xd5\x69\xd5\x6a\xd5\x6b\xd5\x6c\xd5\x6d\xd5\x6e\xd5\x6f\xd5\x70\xd5\x71\xd5\x72\xd5\x73\xd5\x74\xd5\x75\xd5\x76\xd5\x77\xd5\x78\xd5\x79\xd5\x7a\xd5\x7b\xd5\x7c\xd5\x7d\xd5\x7e\xd5\x7f\xd5\x81\xd5\x82\xd5\x83\xd5\x84\xd5\x85\xd5\x86\xd5\x87\xd5\x88\xd5\x89\xd5\x8a\xd5\x8b\xd5\x8c\xd5\x8d\xd5\x8e\xd5\x8f\xd5\x90\xd5\x91\xd5\x92\xd5\x93\xd5\x94\xd5\x95\xd5\x96\xd5\x97\xd5\x98\xd5\x99\xd5\x9a\xd5\x9b\xd5\x9c\xd5\x9d\xd5\x9e\xd5\x9f\xd5\xa0\xd5\xa1\xd5\xa2\xd5\xa3\xd5\xa4\xd5\xa5\xd5\xa6\xd5\xa7\xd5\xa8\xd5\xa9\xd5\xaa\xd5\xab\xd5\xac\xd5\xad\xd5\xae\xd5\xaf\xd5\xb0\xd5\xb1\xd5\xb2\xd5\xb3\xd5\xb4\xd5\xb5\xd5\xb6\xd5\xb7\xd5\xb8\xd5\xb9\xd5\xba\xd5\xbb\xd5\xbc\xd5\xbd\xd5\xbe\xd5\xbf\xd5\xc0\xd5\xc1\xd5\xc2\xd5\xc3\xd5\xc4\xd5\xc5\xd5\xc6\xd5\xc7\xd5\xc8\xd5\xc9\xd5\xca\xd5\xcb\xd5\xcc\xd5\xcd", /* ee80 */ "\xd5\xce\xd5\xcf\xd5\xd0\xd5\xd1\xd5\xd2\xd5\xd3\xd5\xd4\xd5\xd5\xd5\xd6\xd5\xd7\xd5\xd8\xd5\xd9\xd5\xda\xd5\xdb\xd5\xdc\xd5\xdd\xd5\xde\xd5\xdf\xd5\xe0\xd5\xe1\xd5\xe2\xd5\xe3\xd5\xe4\xd5\xe5\xd5\xe6\xd5\xe7\xd5\xe8\xd5\xe9\xd5\xea\xd5\xeb\xd5\xec\xd5\xed\xd5\xee\xd5\xef\xd5\xf0\xd5\xf1\xd5\xf2\xd5\xf3\xd5\xf4\xd5\xf5\xd5\xf6\xd5\xf7\xd5\xf8\xd5\xf9\xd5\xfa\xd5\xfb\xd5\xfc\xd5\xfd\xd6\x41\xd6\x42\xd6\x43\xd6\x44\xd6\x45\xd6\x46\xd6\x47\xd6\x48\xd6\x49\xd6\x4a\xd6\x4b\xd6\x4c\xd6\x4d\xd6\x4e\xd6\x4f\xd6\x50\xd6\x51\xd6\x52\xd6\x53\xd6\x54\xd6\x55\xd6\x56\xd6\x57\xd6\x58\xd6\x59\xd6\x5a\xd6\x5b\xd6\x5c\xd6\x5d\xd6\x5e\xd6\x5f\xd6\x60\xd6\x61\xd6\x62\xd6\x63\xd6\x64\xd6\x65\xd6\x66\xd6\x67\xd6\x68\xd6\x69\xd6\x6a\xd6\x6b\xd6\x6c\xd6\x6d\xd6\x6e\xd6\x6f\xd6\x70\xd6\x71\xd6\x72\xd6\x73\xd6\x74\xd6\x75\xd6\x76\xd6\x77\xd6\x78\xd6\x79\xd6\x7a\xd6\x7b\xd6\x7c\xd6\x7d\xd6\x7e\xd6\x7f\xd6\x81\xd6\x82\xd6\x83\xd6\x84\xd6\x85\xd6\x86\xd6\x87\xd6\x88\xd6\x89\xd6\x8a\xd6\x8b\xd6\x8c\xd6\x8d\xd6\x8e\xd6\x8f\xd6\x90\xd6\x91", /* ef00 */ "\xd6\x92\xd6\x93\xd6\x94\xd6\x95\xd6\x96\xd6\x97\xd6\x98\xd6\x99\xd6\x9a\xd6\x9b\xd6\x9c\xd6\x9d\xd6\x9e\xd6\x9f\xd6\xa0\xd6\xa1\xd6\xa2\xd6\xa3\xd6\xa4\xd6\xa5\xd6\xa6\xd6\xa7\xd6\xa8\xd6\xa9\xd6\xaa\xd6\xab\xd6\xac\xd6\xad\xd6\xae\xd6\xaf\xd6\xb0\xd6\xb1\xd6\xb2\xd6\xb3\xd6\xb4\xd6\xb5\xd6\xb6\xd6\xb7\xd6\xb8\xd6\xb9\xd6\xba\xd6\xbb\xd6\xbc\xd6\xbd\xd6\xbe\xd6\xbf\xd6\xc0\xd6\xc1\xd6\xc2\xd6\xc3\xd6\xc4\xd6\xc5\xd6\xc6\xd6\xc7\xd6\xc8\xd6\xc9\xd6\xca\xd6\xcb\xd6\xcc\xd6\xcd\xd6\xce\xd6\xcf\xd6\xd0\xd6\xd1\xd6\xd2\xd6\xd3\xd6\xd4\xd6\xd5\xd6\xd6\xd6\xd7\xd6\xd8\xd6\xd9\xd6\xda\xd6\xdb\xd6\xdc\xd6\xdd\xd6\xde\xd6\xdf\xd6\xe0\xd6\xe1\xd6\xe2\xd6\xe3\xd6\xe4\xd6\xe5\xd6\xe6\xd6\xe7\xd6\xe8\xd6\xe9\xd6\xea\xd6\xeb\xd6\xec\xd6\xed\xd6\xee\xd6\xef\xd6\xf0\xd6\xf1\xd6\xf2\xd6\xf3\xd6\xf4\xd6\xf5\xd6\xf6\xd6\xf7\xd6\xf8\xd6\xf9\xd6\xfa\xd6\xfb\xd6\xfc\xd6\xfd\xd7\x41\xd7\x42\xd7\x43\xd7\x44\xd7\x45\xd7\x46\xd7\x47\xd7\x48\xd7\x49\xd7\x4a\xd7\x4b\xd7\x4c\xd7\x4d\xd7\x4e\xd7\x4f\xd7\x50\xd7\x51\xd7\x52\xd7\x53\xd7\x54", /* ef80 */ "\xd7\x55\xd7\x56\xd7\x57\xd7\x58\xd7\x59\xd7\x5a\xd7\x5b\xd7\x5c\xd7\x5d\xd7\x5e\xd7\x5f\xd7\x60\xd7\x61\xd7\x62\xd7\x63\xd7\x64\xd7\x65\xd7\x66\xd7\x67\xd7\x68\xd7\x69\xd7\x6a\xd7\x6b\xd7\x6c\xd7\x6d\xd7\x6e\xd7\x6f\xd7\x70\xd7\x71\xd7\x72\xd7\x73\xd7\x74\xd7\x75\xd7\x76\xd7\x77\xd7\x78\xd7\x79\xd7\x7a\xd7\x7b\xd7\x7c\xd7\x7d\xd7\x7e\xd7\x7f\xd7\x81\xd7\x82\xd7\x83\xd7\x84\xd7\x85\xd7\x86\xd7\x87\xd7\x88\xd7\x89\xd7\x8a\xd7\x8b\xd7\x8c\xd7\x8d\xd7\x8e\xd7\x8f\xd7\x90\xd7\x91\xd7\x92\xd7\x93\xd7\x94\xd7\x95\xd7\x96\xd7\x97\xd7\x98\xd7\x99\xd7\x9a\xd7\x9b\xd7\x9c\xd7\x9d\xd7\x9e\xd7\x9f\xd7\xa0\xd7\xa1\xd7\xa2\xd7\xa3\xd7\xa4\xd7\xa5\xd7\xa6\xd7\xa7\xd7\xa8\xd7\xa9\xd7\xaa\xd7\xab\xd7\xac\xd7\xad\xd7\xae\xd7\xaf\xd7\xb0\xd7\xb1\xd7\xb2\xd7\xb3\xd7\xb4\xd7\xb5\xd7\xb6\xd7\xb7\xd7\xb8\xd7\xb9\xd7\xba\xd7\xbb\xd7\xbc\xd7\xbd\xd7\xbe\xd7\xbf\xd7\xc0\xd7\xc1\xd7\xc2\xd7\xc3\xd7\xc4\xd7\xc5\xd7\xc6\xd7\xc7\xd7\xc8\xd7\xc9\xd7\xca\xd7\xcb\xd7\xcc\xd7\xcd\xd7\xce\xd7\xcf\xd7\xd0\xd7\xd1\xd7\xd2\xd7\xd3\xd7\xd4\xd7\xd5", /* f000 */ "\xd7\xd6\xd7\xd7\xd7\xd8\xd7\xd9\xd7\xda\xd7\xdb\xd7\xdc\xd7\xdd\xd7\xde\xd7\xdf\xd7\xe0\xd7\xe1\xd7\xe2\xd7\xe3\xd7\xe4\xd7\xe5\xd7\xe6\xd7\xe7\xd7\xe8\xd7\xe9\xd7\xea\xd7\xeb\xd7\xec\xd7\xed\xd7\xee\xd7\xef\xd7\xf0\xd7\xf1\xd7\xf2\xd7\xf3\xd7\xf4\xd7\xf5\xd7\xf6\xd7\xf7\xd7\xf8\xd7\xf9\xd7\xfa\xd7\xfb\xd7\xfc\xd7\xfd\xd8\x41\xd8\x42\xd8\x43\xd8\x44\xd8\x45\xd8\x46\xd8\x47\xd8\x48\xd8\x49\xd8\x4a\xd8\x4b\xd8\x4c\xd8\x4d\xd8\x4e\xd8\x4f\xd8\x50\xd8\x51\xd8\x52\xd8\x53\xd8\x54\xd8\x55\xd8\x56\xd8\x57\xd8\x58\xd8\x59\xd8\x5a\xd8\x5b\xd8\x5c\xd8\x5d\xd8\x5e\xd8\x5f\xd8\x60\xd8\x61\xd8\x62\xd8\x63\xd8\x64\xd8\x65\xd8\x66\xd8\x67\xd8\x68\xd8\x69\xd8\x6a\xd8\x6b\xd8\x6c\xd8\x6d\xd8\x6e\xd8\x6f\xd8\x70\xd8\x71\xd8\x72\xd8\x73\xd8\x74\xd8\x75\xd8\x76\xd8\x77\xd8\x78\xd8\x79\xd8\x7a\xd8\x7b\xd8\x7c\xd8\x7d\xd8\x7e\xd8\x7f\xd8\x81\xd8\x82\xd8\x83\xd8\x84\xd8\x85\xd8\x86\xd8\x87\xd8\x88\xd8\x89\xd8\x8a\xd8\x8b\xd8\x8c\xd8\x8d\xd8\x8e\xd8\x8f\xd8\x90\xd8\x91\xd8\x92\xd8\x93\xd8\x94\xd8\x95\xd8\x96\xd8\x97\xd8\x98\xd8\x99", /* f080 */ "\xd8\x9a\xd8\x9b\xd8\x9c\xd8\x9d\xd8\x9e\xd8\x9f\xd8\xa0\xd8\xa1\xd8\xa2\xd8\xa3\xd8\xa4\xd8\xa5\xd8\xa6\xd8\xa7\xd8\xa8\xd8\xa9\xd8\xaa\xd8\xab\xd8\xac\xd8\xad\xd8\xae\xd8\xaf\xd8\xb0\xd8\xb1\xd8\xb2\xd8\xb3\xd8\xb4\xd8\xb5\xd8\xb6\xd8\xb7\xd8\xb8\xd8\xb9\xd8\xba\xd8\xbb\xd8\xbc\xd8\xbd\xd8\xbe\xd8\xbf\xd8\xc0\xd8\xc1\xd8\xc2\xd8\xc3\xd8\xc4\xd8\xc5\xd8\xc6\xd8\xc7\xd8\xc8\xd8\xc9\xd8\xca\xd8\xcb\xd8\xcc\xd8\xcd\xd8\xce\xd8\xcf\xd8\xd0\xd8\xd1\xd8\xd2\xd8\xd3\xd8\xd4\xd8\xd5\xd8\xd6\xd8\xd7\xd8\xd8\xd8\xd9\xd8\xda\xd8\xdb\xd8\xdc\xd8\xdd\xd8\xde\xd8\xdf\xd8\xe0\xd8\xe1\xd8\xe2\xd8\xe3\xd8\xe4\xd8\xe5\xd8\xe6\xd8\xe7\xd8\xe8\xd8\xe9\xd8\xea\xd8\xeb\xd8\xec\xd8\xed\xd8\xee\xd8\xef\xd8\xf0\xd8\xf1\xd8\xf2\xd8\xf3\xd8\xf4\xd8\xf5\xd8\xf6\xd8\xf7\xd8\xf8\xd8\xf9\xd8\xfa\xd8\xfb\xd8\xfc\xd8\xfd\xd9\x41\xd9\x42\xd9\x43\xd9\x44\xd9\x45\xd9\x46\xd9\x47\xd9\x48\xd9\x49\xd9\x4a\xd9\x4b\xd9\x4c\xd9\x4d\xd9\x4e\xd9\x4f\xd9\x50\xd9\x51\xd9\x52\xd9\x53\xd9\x54\xd9\x55\xd9\x56\xd9\x57\xd9\x58\xd9\x59\xd9\x5a\xd9\x5b\xd9\x5c", /* f100 */ "\xd9\x5d\xd9\x5e\xd9\x5f\xd9\x60\xd9\x61\xd9\x62\xd9\x63\xd9\x64\xd9\x65\xd9\x66\xd9\x67\xd9\x68\xd9\x69\xd9\x6a\xd9\x6b\xd9\x6c\xd9\x6d\xd9\x6e\xd9\x6f\xd9\x70\xd9\x71\xd9\x72\xd9\x73\xd9\x74\xd9\x75\xd9\x76\xd9\x77\xd9\x78\xd9\x79\xd9\x7a\xd9\x7b\xd9\x7c\xd9\x7d\xd9\x7e\xd9\x7f\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x88\xd9\x89\xd9\x8a\xd9\x8b\xd9\x8c\xd9\x8d\xd9\x8e\xd9\x8f\xd9\x90\xd9\x91\xd9\x92\xd9\x93\xd9\x94\xd9\x95\xd9\x96\xd9\x97\xd9\x98\xd9\x99\xd9\x9a\xd9\x9b\xd9\x9c\xd9\x9d\xd9\x9e\xd9\x9f\xd9\xa0\xd9\xa1\xd9\xa2\xd9\xa3\xd9\xa4\xd9\xa5\xd9\xa6\xd9\xa7\xd9\xa8\xd9\xa9\xd9\xaa\xd9\xab\xd9\xac\xd9\xad\xd9\xae\xd9\xaf\xd9\xb0\xd9\xb1\xd9\xb2\xd9\xb3\xd9\xb4\xd9\xb5\xd9\xb6\xd9\xb7\xd9\xb8\xd9\xb9\xd9\xba\xd9\xbb\xd9\xbc\xd9\xbd\xd9\xbe\xd9\xbf\xd9\xc0\xd9\xc1\xd9\xc2\xd9\xc3\xd9\xc4\xd9\xc5\xd9\xc6\xd9\xc7\xd9\xc8\xd9\xc9\xd9\xca\xd9\xcb\xd9\xcc\xd9\xcd\xd9\xce\xd9\xcf\xd9\xd0\xd9\xd1\xd9\xd2\xd9\xd3\xd9\xd4\xd9\xd5\xd9\xd6\xd9\xd7\xd9\xd8\xd9\xd9\xd9\xda\xd9\xdb\xd9\xdc\xd9\xdd", /* f180 */ "\xd9\xde\xd9\xdf\xd9\xe0\xd9\xe1\xd9\xe2\xd9\xe3\xd9\xe4\xd9\xe5\xd9\xe6\xd9\xe7\xd9\xe8\xd9\xe9\xd9\xea\xd9\xeb\xd9\xec\xd9\xed\xd9\xee\xd9\xef\xd9\xf0\xd9\xf1\xd9\xf2\xd9\xf3\xd9\xf4\xd9\xf5\xd9\xf6\xd9\xf7\xd9\xf8\xd9\xf9\xd9\xfa\xd9\xfb\xd9\xfc\xd9\xfd\xda\x41\xda\x42\xda\x43\xda\x44\xda\x45\xda\x46\xda\x47\xda\x48\xda\x49\xda\x4a\xda\x4b\xda\x4c\xda\x4d\xda\x4e\xda\x4f\xda\x50\xda\x51\xda\x52\xda\x53\xda\x54\xda\x55\xda\x56\xda\x57\xda\x58\xda\x59\xda\x5a\xda\x5b\xda\x5c\xda\x5d\xda\x5e\xda\x5f\xda\x60\xda\x61\xda\x62\xda\x63\xda\x64\xda\x65\xda\x66\xda\x67\xda\x68\xda\x69\xda\x6a\xda\x6b\xda\x6c\xda\x6d\xda\x6e\xda\x6f\xda\x70\xda\x71\xda\x72\xda\x73\xda\x74\xda\x75\xda\x76\xda\x77\xda\x78\xda\x79\xda\x7a\xda\x7b\xda\x7c\xda\x7d\xda\x7e\xda\x7f\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87\xda\x88\xda\x89\xda\x8a\xda\x8b\xda\x8c\xda\x8d\xda\x8e\xda\x8f\xda\x90\xda\x91\xda\x92\xda\x93\xda\x94\xda\x95\xda\x96\xda\x97\xda\x98\xda\x99\xda\x9a\xda\x9b\xda\x9c\xda\x9d\xda\x9e\xda\x9f\xda\xa0\xda\xa1", /* f200 */ "\xda\xa2\xda\xa3\xda\xa4\xda\xa5\xda\xa6\xda\xa7\xda\xa8\xda\xa9\xda\xaa\xda\xab\xda\xac\xda\xad\xda\xae\xda\xaf\xda\xb0\xda\xb1\xda\xb2\xda\xb3\xda\xb4\xda\xb5\xda\xb6\xda\xb7\xda\xb8\xda\xb9\xda\xba\xda\xbb\xda\xbc\xda\xbd\xda\xbe\xda\xbf\xda\xc0\xda\xc1\xda\xc2\xda\xc3\xda\xc4\xda\xc5\xda\xc6\xda\xc7\xda\xc8\xda\xc9\xda\xca\xda\xcb\xda\xcc\xda\xcd\xda\xce\xda\xcf\xda\xd0\xda\xd1\xda\xd2\xda\xd3\xda\xd4\xda\xd5\xda\xd6\xda\xd7\xda\xd8\xda\xd9\xda\xda\xda\xdb\xda\xdc\xda\xdd\xda\xde\xda\xdf\xda\xe0\xda\xe1\xda\xe2\xda\xe3\xda\xe4\xda\xe5\xda\xe6\xda\xe7\xda\xe8\xda\xe9\xda\xea\xda\xeb\xda\xec\xda\xed\xda\xee\xda\xef\xda\xf0\xda\xf1\xda\xf2\xda\xf3\xda\xf4\xda\xf5\xda\xf6\xda\xf7\xda\xf8\xda\xf9\xda\xfa\xda\xfb\xda\xfc\xda\xfd\xdb\x41\xdb\x42\xdb\x43\xdb\x44\xdb\x45\xdb\x46\xdb\x47\xdb\x48\xdb\x49\xdb\x4a\xdb\x4b\xdb\x4c\xdb\x4d\xdb\x4e\xdb\x4f\xdb\x50\xdb\x51\xdb\x52\xdb\x53\xdb\x54\xdb\x55\xdb\x56\xdb\x57\xdb\x58\xdb\x59\xdb\x5a\xdb\x5b\xdb\x5c\xdb\x5d\xdb\x5e\xdb\x5f\xdb\x60\xdb\x61\xdb\x62\xdb\x63\xdb\x64", /* f280 */ "\xdb\x65\xdb\x66\xdb\x67\xdb\x68\xdb\x69\xdb\x6a\xdb\x6b\xdb\x6c\xdb\x6d\xdb\x6e\xdb\x6f\xdb\x70\xdb\x71\xdb\x72\xdb\x73\xdb\x74\xdb\x75\xdb\x76\xdb\x77\xdb\x78\xdb\x79\xdb\x7a\xdb\x7b\xdb\x7c\xdb\x7d\xdb\x7e\xdb\x7f\xdb\x81\xdb\x82\xdb\x83\xdb\x84\xdb\x85\xdb\x86\xdb\x87\xdb\x88\xdb\x89\xdb\x8a\xdb\x8b\xdb\x8c\xdb\x8d\xdb\x8e\xdb\x8f\xdb\x90\xdb\x91\xdb\x92\xdb\x93\xdb\x94\xdb\x95\xdb\x96\xdb\x97\xdb\x98\xdb\x99\xdb\x9a\xdb\x9b\xdb\x9c\xdb\x9d\xdb\x9e\xdb\x9f\xdb\xa0\xdb\xa1\xdb\xa2\xdb\xa3\xdb\xa4\xdb\xa5\xdb\xa6\xdb\xa7\xdb\xa8\xdb\xa9\xdb\xaa\xdb\xab\xdb\xac\xdb\xad\xdb\xae\xdb\xaf\xdb\xb0\xdb\xb1\xdb\xb2\xdb\xb3\xdb\xb4\xdb\xb5\xdb\xb6\xdb\xb7\xdb\xb8\xdb\xb9\xdb\xba\xdb\xbb\xdb\xbc\xdb\xbd\xdb\xbe\xdb\xbf\xdb\xc0\xdb\xc1\xdb\xc2\xdb\xc3\xdb\xc4\xdb\xc5\xdb\xc6\xdb\xc7\xdb\xc8\xdb\xc9\xdb\xca\xdb\xcb\xdb\xcc\xdb\xcd\xdb\xce\xdb\xcf\xdb\xd0\xdb\xd1\xdb\xd2\xdb\xd3\xdb\xd4\xdb\xd5\xdb\xd6\xdb\xd7\xdb\xd8\xdb\xd9\xdb\xda\xdb\xdb\xdb\xdc\xdb\xdd\xdb\xde\xdb\xdf\xdb\xe0\xdb\xe1\xdb\xe2\xdb\xe3\xdb\xe4\xdb\xe5", /* f300 */ "\xdb\xe6\xdb\xe7\xdb\xe8\xdb\xe9\xdb\xea\xdb\xeb\xdb\xec\xdb\xed\xdb\xee\xdb\xef\xdb\xf0\xdb\xf1\xdb\xf2\xdb\xf3\xdb\xf4\xdb\xf5\xdb\xf6\xdb\xf7\xdb\xf8\xdb\xf9\xdb\xfa\xdb\xfb\xdb\xfc\xdb\xfd\xdc\x41\xdc\x42\xdc\x43\xdc\x44\xdc\x45\xdc\x46\xdc\x47\xdc\x48\xdc\x49\xdc\x4a\xdc\x4b\xdc\x4c\xdc\x4d\xdc\x4e\xdc\x4f\xdc\x50\xdc\x51\xdc\x52\xdc\x53\xdc\x54\xdc\x55\xdc\x56\xdc\x57\xdc\x58\xdc\x59\xdc\x5a\xdc\x5b\xdc\x5c\xdc\x5d\xdc\x5e\xdc\x5f\xdc\x60\xdc\x61\xdc\x62\xdc\x63\xdc\x64\xdc\x65\xdc\x66\xdc\x67\xdc\x68\xdc\x69\xdc\x6a\xdc\x6b\xdc\x6c\xdc\x6d\xdc\x6e\xdc\x6f\xdc\x70\xdc\x71\xdc\x72\xdc\x73\xdc\x74\xdc\x75\xdc\x76\xdc\x77\xdc\x78\xdc\x79\xdc\x7a\xdc\x7b\xdc\x7c\xdc\x7d\xdc\x7e\xdc\x7f\xdc\x81\xdc\x82\xdc\x83\xdc\x84\xdc\x85\xdc\x86\xdc\x87\xdc\x88\xdc\x89\xdc\x8a\xdc\x8b\xdc\x8c\xdc\x8d\xdc\x8e\xdc\x8f\xdc\x90\xdc\x91\xdc\x92\xdc\x93\xdc\x94\xdc\x95\xdc\x96\xdc\x97\xdc\x98\xdc\x99\xdc\x9a\xdc\x9b\xdc\x9c\xdc\x9d\xdc\x9e\xdc\x9f\xdc\xa0\xdc\xa1\xdc\xa2\xdc\xa3\xdc\xa4\xdc\xa5\xdc\xa6\xdc\xa7\xdc\xa8\xdc\xa9", /* f380 */ "\xdc\xaa\xdc\xab\xdc\xac\xdc\xad\xdc\xae\xdc\xaf\xdc\xb0\xdc\xb1\xdc\xb2\xdc\xb3\xdc\xb4\xdc\xb5\xdc\xb6\xdc\xb7\xdc\xb8\xdc\xb9\xdc\xba\xdc\xbb\xdc\xbc\xdc\xbd\xdc\xbe\xdc\xbf\xdc\xc0\xdc\xc1\xdc\xc2\xdc\xc3\xdc\xc4\xdc\xc5\xdc\xc6\xdc\xc7\xdc\xc8\xdc\xc9\xdc\xca\xdc\xcb\xdc\xcc\xdc\xcd\xdc\xce\xdc\xcf\xdc\xd0\xdc\xd1\xdc\xd2\xdc\xd3\xdc\xd4\xdc\xd5\xdc\xd6\xdc\xd7\xdc\xd8\xdc\xd9\xdc\xda\xdc\xdb\xdc\xdc\xdc\xdd\xdc\xde\xdc\xdf\xdc\xe0\xdc\xe1\xdc\xe2\xdc\xe3\xdc\xe4\xdc\xe5\xdc\xe6\xdc\xe7\xdc\xe8\xdc\xe9\xdc\xea\xdc\xeb\xdc\xec\xdc\xed\xdc\xee\xdc\xef\xdc\xf0\xdc\xf1\xdc\xf2\xdc\xf3\xdc\xf4\xdc\xf5\xdc\xf6\xdc\xf7\xdc\xf8\xdc\xf9\xdc\xfa\xdc\xfb\xdc\xfc\xdc\xfd\xdd\x41\xdd\x42\xdd\x43\xdd\x44\xdd\x45\xdd\x46\xdd\x47\xdd\x48\xdd\x49\xdd\x4a\xdd\x4b\xdd\x4c\xdd\x4d\xdd\x4e\xdd\x4f\xdd\x50\xdd\x51\xdd\x52\xdd\x53\xdd\x54\xdd\x55\xdd\x56\xdd\x57\xdd\x58\xdd\x59\xdd\x5a\xdd\x5b\xdd\x5c\xdd\x5d\xdd\x5e\xdd\x5f\xdd\x60\xdd\x61\xdd\x62\xdd\x63\xdd\x64\xdd\x65\xdd\x66\xdd\x67\xdd\x68\xdd\x69\xdd\x6a\xdd\x6b\xdd\x6c", /* f400 */ "\xdd\x6d\xdd\x6e\xdd\x6f\xdd\x70\xdd\x71\xdd\x72\xdd\x73\xdd\x74\xdd\x75\xdd\x76\xdd\x77\xdd\x78\xdd\x79\xdd\x7a\xdd\x7b\xdd\x7c\xdd\x7d\xdd\x7e\xdd\x7f\xdd\x81\xdd\x82\xdd\x83\xdd\x84\xdd\x85\xdd\x86\xdd\x87\xdd\x88\xdd\x89\xdd\x8a\xdd\x8b\xdd\x8c\xdd\x8d\xdd\x8e\xdd\x8f\xdd\x90\xdd\x91\xdd\x92\xdd\x93\xdd\x94\xdd\x95\xdd\x96\xdd\x97\xdd\x98\xdd\x99\xdd\x9a\xdd\x9b\xdd\x9c\xdd\x9d\xdd\x9e\xdd\x9f\xdd\xa0\xdd\xa1\xdd\xa2\xdd\xa3\xdd\xa4\xdd\xa5\xdd\xa6\xdd\xa7\xdd\xa8\xdd\xa9\xdd\xaa\xdd\xab\xdd\xac\xdd\xad\xdd\xae\xdd\xaf\xdd\xb0\xdd\xb1\xdd\xb2\xdd\xb3\xdd\xb4\xdd\xb5\xdd\xb6\xdd\xb7\xdd\xb8\xdd\xb9\xdd\xba\xdd\xbb\xdd\xbc\xdd\xbd\xdd\xbe\xdd\xbf\xdd\xc0\xdd\xc1\xdd\xc2\xdd\xc3\xdd\xc4\xdd\xc5\xdd\xc6\xdd\xc7\xdd\xc8\xdd\xc9\xdd\xca\xdd\xcb\xdd\xcc\xdd\xcd\xdd\xce\xdd\xcf\xdd\xd0\xdd\xd1\xdd\xd2\xdd\xd3\xdd\xd4\xdd\xd5\xdd\xd6\xdd\xd7\xdd\xd8\xdd\xd9\xdd\xda\xdd\xdb\xdd\xdc\xdd\xdd\xdd\xde\xdd\xdf\xdd\xe0\xdd\xe1\xdd\xe2\xdd\xe3\xdd\xe4\xdd\xe5\xdd\xe6\xdd\xe7\xdd\xe8\xdd\xe9\xdd\xea\xdd\xeb\xdd\xec\xdd\xed", /* f480 */ "\xdd\xee\xdd\xef\xdd\xf0\xdd\xf1\xdd\xf2\xdd\xf3\xdd\xf4\xdd\xf5\xdd\xf6\xdd\xf7\xdd\xf8\xdd\xf9\xdd\xfa\xdd\xfb\xdd\xfc\xdd\xfd\xde\x41\xde\x42\xde\x43\xde\x44\xde\x45\xde\x46\xde\x47\xde\x48\xde\x49\xde\x4a\xde\x4b\xde\x4c\xde\x4d\xde\x4e\xde\x4f\xde\x50\xde\x51\xde\x52\xde\x53\xde\x54\xde\x55\xde\x56\xde\x57\xde\x58\xde\x59\xde\x5a\xde\x5b\xde\x5c\xde\x5d\xde\x5e\xde\x5f\xde\x60\xde\x61\xde\x62\xde\x63\xde\x64\xde\x65\xde\x66\xde\x67\xde\x68\xde\x69\xde\x6a\xde\x6b\xde\x6c\xde\x6d\xde\x6e\xde\x6f\xde\x70\xde\x71\xde\x72\xde\x73\xde\x74\xde\x75\xde\x76\xde\x77\xde\x78\xde\x79\xde\x7a\xde\x7b\xde\x7c\xde\x7d\xde\x7e\xde\x7f\xde\x81\xde\x82\xde\x83\xde\x84\xde\x85\xde\x86\xde\x87\xde\x88\xde\x89\xde\x8a\xde\x8b\xde\x8c\xde\x8d\xde\x8e\xde\x8f\xde\x90\xde\x91\xde\x92\xde\x93\xde\x94\xde\x95\xde\x96\xde\x97\xde\x98\xde\x99\xde\x9a\xde\x9b\xde\x9c\xde\x9d\xde\x9e\xde\x9f\xde\xa0\xde\xa1\xde\xa2\xde\xa3\xde\xa4\xde\xa5\xde\xa6\xde\xa7\xde\xa8\xde\xa9\xde\xaa\xde\xab\xde\xac\xde\xad\xde\xae\xde\xaf\xde\xb0\xde\xb1", /* f500 */ "\xde\xb2\xde\xb3\xde\xb4\xde\xb5\xde\xb6\xde\xb7\xde\xb8\xde\xb9\xde\xba\xde\xbb\xde\xbc\xde\xbd\xde\xbe\xde\xbf\xde\xc0\xde\xc1\xde\xc2\xde\xc3\xde\xc4\xde\xc5\xde\xc6\xde\xc7\xde\xc8\xde\xc9\xde\xca\xde\xcb\xde\xcc\xde\xcd\xde\xce\xde\xcf\xde\xd0\xde\xd1\xde\xd2\xde\xd3\xde\xd4\xde\xd5\xde\xd6\xde\xd7\xde\xd8\xde\xd9\xde\xda\xde\xdb\xde\xdc\xde\xdd\xde\xde\xde\xdf\xde\xe0\xde\xe1\xde\xe2\xde\xe3\xde\xe4\xde\xe5\xde\xe6\xde\xe7\xde\xe8\xde\xe9\xde\xea\xde\xeb\xde\xec\xde\xed\xde\xee\xde\xef\xde\xf0\xde\xf1\xde\xf2\xde\xf3\xde\xf4\xde\xf5\xde\xf6\xde\xf7\xde\xf8\xde\xf9\xde\xfa\xde\xfb\xde\xfc\xde\xfd\xdf\x41\xdf\x42\xdf\x43\xdf\x44\xdf\x45\xdf\x46\xdf\x47\xdf\x48\xdf\x49\xdf\x4a\xdf\x4b\xdf\x4c\xdf\x4d\xdf\x4e\xdf\x4f\xdf\x50\xdf\x51\xdf\x52\xdf\x53\xdf\x54\xdf\x55\xdf\x56\xdf\x57\xdf\x58\xdf\x59\xdf\x5a\xdf\x5b\xdf\x5c\xdf\x5d\xdf\x5e\xdf\x5f\xdf\x60\xdf\x61\xdf\x62\xdf\x63\xdf\x64\xdf\x65\xdf\x66\xdf\x67\xdf\x68\xdf\x69\xdf\x6a\xdf\x6b\xdf\x6c\xdf\x6d\xdf\x6e\xdf\x6f\xdf\x70\xdf\x71\xdf\x72\xdf\x73\xdf\x74", /* f580 */ "\xdf\x75\xdf\x76\xdf\x77\xdf\x78\xdf\x79\xdf\x7a\xdf\x7b\xdf\x7c\xdf\x7d\xdf\x7e\xdf\x7f\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xdf\x8b\xdf\x8c\xdf\x8d\xdf\x8e\xdf\x8f\xdf\x90\xdf\x91\xdf\x92\xdf\x93\xdf\x94\xdf\x95\xdf\x96\xdf\x97\xdf\x98\xdf\x99\xdf\x9a\xdf\x9b\xdf\x9c\xdf\x9d\xdf\x9e\xdf\x9f\xdf\xa0\xdf\xa1\xdf\xa2\xdf\xa3\xdf\xa4\xdf\xa5\xdf\xa6\xdf\xa7\xdf\xa8\xdf\xa9\xdf\xaa\xdf\xab\xdf\xac\xdf\xad\xdf\xae\xdf\xaf\xdf\xb0\xdf\xb1\xdf\xb2\xdf\xb3\xdf\xb4\xdf\xb5\xdf\xb6\xdf\xb7\xdf\xb8\xdf\xb9\xdf\xba\xdf\xbb\xdf\xbc\xdf\xbd\xdf\xbe\xdf\xbf\xdf\xc0\xdf\xc1\xdf\xc2\xdf\xc3\xdf\xc4\xdf\xc5\xdf\xc6\xdf\xc7\xdf\xc8\xdf\xc9\xdf\xca\xdf\xcb\xdf\xcc\xdf\xcd\xdf\xce\xdf\xcf\xdf\xd0\xdf\xd1\xdf\xd2\xdf\xd3\xdf\xd4\xdf\xd5\xdf\xd6\xdf\xd7\xdf\xd8\xdf\xd9\xdf\xda\xdf\xdb\xdf\xdc\xdf\xdd\xdf\xde\xdf\xdf\xdf\xe0\xdf\xe1\xdf\xe2\xdf\xe3\xdf\xe4\xdf\xe5\xdf\xe6\xdf\xe7\xdf\xe8\xdf\xe9\xdf\xea\xdf\xeb\xdf\xec\xdf\xed\xdf\xee\xdf\xef\xdf\xf0\xdf\xf1\xdf\xf2\xdf\xf3\xdf\xf4\xdf\xf5", /* f600 */ "\xdf\xf6\xdf\xf7\xdf\xf8\xdf\xf9\xdf\xfa\xdf\xfb\xdf\xfc\xdf\xfd\xe0\x41\xe0\x42\xe0\x43\xe0\x44\xe0\x45\xe0\x46\xe0\x47\xe0\x48\xe0\x49\xe0\x4a\xe0\x4b\xe0\x4c\xe0\x4d\xe0\x4e\xe0\x4f\xe0\x50\xe0\x51\xe0\x52\xe0\x53\xe0\x54\xe0\x55\xe0\x56\xe0\x57\xe0\x58\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xe0\x5d\xe0\x5e\xe0\x5f\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xe0\x64\xe0\x65\xe0\x66\xe0\x67\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x7f\xe0\x81\xe0\x82\xe0\x83\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xe0\x8f\xe0\x90\xe0\x91\xe0\x92\xe0\x93\xe0\x94\xe0\x95\xe0\x96\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xe0\xa0\xe0\xa1\xe0\xa2\xe0\xa3\xe0\xa4\xe0\xa5\xe0\xa6\xe0\xa7\xe0\xa8\xe0\xa9\xe0\xaa\xe0\xab\xe0\xac\xe0\xad\xe0\xae\xe0\xaf\xe0\xb0\xe0\xb1\xe0\xb2\xe0\xb3\xe0\xb4\xe0\xb5\xe0\xb6\xe0\xb7\xe0\xb8\xe0\xb9", /* f680 */ "\xe0\xba\xe0\xbb\xe0\xbc\xe0\xbd\xe0\xbe\xe0\xbf\xe0\xc0\xe0\xc1\xe0\xc2\xe0\xc3\xe0\xc4\xe0\xc5\xe0\xc6\xe0\xc7\xe0\xc8\xe0\xc9\xe0\xca\xe0\xcb\xe0\xcc\xe0\xcd\xe0\xce\xe0\xcf\xe0\xd0\xe0\xd1\xe0\xd2\xe0\xd3\xe0\xd4\xe0\xd5\xe0\xd6\xe0\xd7\xe0\xd8\xe0\xd9\xe0\xda\xe0\xdb\xe0\xdc\xe0\xdd\xe0\xde\xe0\xdf\xe0\xe0\xe0\xe1\xe0\xe2\xe0\xe3\xe0\xe4\xe0\xe5\xe0\xe6\xe0\xe7\xe0\xe8\xe0\xe9\xe0\xea\xe0\xeb\xe0\xec\xe0\xed\xe0\xee\xe0\xef\xe0\xf0\xe0\xf1\xe0\xf2\xe0\xf3\xe0\xf4\xe0\xf5\xe0\xf6\xe0\xf7\xe0\xf8\xe0\xf9\xe0\xfa\xe0\xfb\xe0\xfc\xe0\xfd\xe1\x41\xe1\x42\xe1\x43\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xe1\x48\xe1\x49\xe1\x4a\xe1\x4b\xe1\x4c\xe1\x4d\xe1\x4e\xe1\x4f\xe1\x50\xe1\x51\xe1\x52\xe1\x53\xe1\x54\xe1\x55\xe1\x56\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xe1\x5c\xe1\x5d\xe1\x5e\xe1\x5f\xe1\x60\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xe1\x74\xe1\x75\xe1\x76\xe1\x77\xe1\x78\xe1\x79\xe1\x7a\xe1\x7b\xe1\x7c", /* f700 */ "\xe1\x7d\xe1\x7e\xe1\x7f\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xe1\x8b\xe1\x8c\xe1\x8d\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe1\xa1\xe1\xa2\xe1\xa3\xe1\xa4\xe1\xa5\xe1\xa6\xe1\xa7\xe1\xa8\xe1\xa9\xe1\xaa\xe1\xab\xe1\xac\xe1\xad\xe1\xae\xe1\xaf\xe1\xb0\xe1\xb1\xe1\xb2\xe1\xb3\xe1\xb4\xe1\xb5\xe1\xb6\xe1\xb7\xe1\xb8\xe1\xb9\xe1\xba\xe1\xbb\xe1\xbc\xe1\xbd\xe1\xbe\xe1\xbf\xe1\xc0\xe1\xc1\xe1\xc2\xe1\xc3\xe1\xc4\xe1\xc5\xe1\xc6\xe1\xc7\xe1\xc8\xe1\xc9\xe1\xca\xe1\xcb\xe1\xcc\xe1\xcd\xe1\xce\xe1\xcf\xe1\xd0\xe1\xd1\xe1\xd2\xe1\xd3\xe1\xd4\xe1\xd5\xe1\xd6\xe1\xd7\xe1\xd8\xe1\xd9\xe1\xda\xe1\xdb\xe1\xdc\xe1\xdd\xe1\xde\xe1\xdf\xe1\xe0\xe1\xe1\xe1\xe2\xe1\xe3\xe1\xe4\xe1\xe5\xe1\xe6\xe1\xe7\xe1\xe8\xe1\xe9\xe1\xea\xe1\xeb\xe1\xec\xe1\xed\xe1\xee\xe1\xef\xe1\xf0\xe1\xf1\xe1\xf2\xe1\xf3\xe1\xf4\xe1\xf5\xe1\xf6\xe1\xf7\xe1\xf8\xe1\xf9\xe1\xfa\xe1\xfb\xe1\xfc\xe1\xfd", /* f780 */ "\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x7f\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe2\xa1\xe2\xa2\xe2\xa3\xe2\xa4\xe2\xa5\xe2\xa6\xe2\xa7\xe2\xa8\xe2\xa9\xe2\xaa\xe2\xab\xe2\xac\xe2\xad\xe2\xae\xe2\xaf\xe2\xb0\xe2\xb1\xe2\xb2\xe2\xb3\xe2\xb4\xe2\xb5\xe2\xb6\xe2\xb7\xe2\xb8\xe2\xb9\xe2\xba\xe2\xbb\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1", /* f800 */ "\xe2\xc2\xe2\xc3\xe2\xc4\xe2\xc5\xe2\xc6\xe2\xc7\xe2\xc8\xe2\xc9\xe2\xca\xe2\xcb\xe2\xcc\xe2\xcd\xe2\xce\xe2\xcf\xe2\xd0\xe2\xd1\xe2\xd2\xe2\xd3\xe2\xd4\xe2\xd5\xe2\xd6\xe2\xd7\xe2\xd8\xe2\xd9\xe2\xda\xe2\xdb\xe2\xdc\xe2\xdd\xe2\xde\xe2\xdf\xe2\xe0\xe2\xe1\xe2\xe2\xe2\xe3\xe2\xe4\xe2\xe5\xe2\xe6\xe2\xe7\xe2\xe8\xe2\xe9\xe2\xea\xe2\xeb\xe2\xec\xe2\xed\xe2\xee\xe2\xef\xe2\xf0\xe2\xf1\xe2\xf2\xe2\xf3\xe2\xf4\xe2\xf5\xe2\xf6\xe2\xf7\xe2\xf8\xe2\xf9\xe2\xfa\xe2\xfb\xe2\xfc\xe2\xfd\x00\x00\x00\x00\x44\x5c\x46\xa8\x46\xa9\x46\xaa\x46\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4b\x7a\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x41\x46\xa7\x47\x49\x46\xb6\x46\xbc\x46\xac\x46\xad\x46\xae\x46\xaf\x46\xb0\x46\xb1\x46\xa4\x46\xa5\x46\xb2\x46\xb3\x46\xb4\x46\xb5\x46\xa0\x46\xa1\x46\xa2\x46\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x46\xbe\x46\xbf\x46\xc2\x46\xc3\x46\xc0\x46\xc1\x46\xbd\x47\x42\x47\x43\x47\x44\x00\x00\x47\x45\x47\x46\x47\x47\x47\x48\x47\x4a\x47\x4b\x47\x4c\x47\x4d\x47\x4e\x47\x4f\x47\x50\x47\x53\x47\x54\x46\xc4\x47\x55\x47\x56\x47\x57\x47\x58\x47\x59\x00\x00\x47\x5a\x47\x5b\x47\x5c\x47\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fe80 */ NULL, /* ff00 */ "\x00\x00\x42\x5a\x42\x7f\x42\x7b\x42\xe0\x42\x6c\x42\x50\x42\x7d\x42\x4d\x42\x5d\x46\xb8\x42\x4e\x42\x6b\x42\x60\x42\x4b\x42\x61\x42\xf0\x42\xf1\x42\xf2\x42\xf3\x42\xf4\x42\xf5\x42\xf6\x42\xf7\x42\xf8\x42\xf9\x42\x7a\x42\x5e\x42\x4c\x42\x7e\x42\x6e\x42\x6f\x42\x7c\x42\xc1\x42\xc2\x42\xc3\x42\xc4\x42\xc5\x42\xc6\x42\xc7\x42\xc8\x42\xc9\x42\xd1\x42\xd2\x42\xd3\x42\xd4\x42\xd5\x42\xd6\x42\xd7\x42\xd8\x42\xd9\x42\xe2\x42\xe3\x42\xe4\x42\xe5\x42\xe6\x42\xe7\x42\xe8\x42\xe9\x44\x44\x43\xe0\x44\x45\x44\x70\x42\x6d\x00\x00\x42\x81\x42\x82\x42\x83\x42\x84\x42\x85\x42\x86\x42\x87\x42\x88\x42\x89\x42\x91\x42\x92\x42\x93\x42\x94\x42\x95\x42\x96\x42\x97\x42\x98\x42\x99\x42\xa2\x42\xa3\x42\xa4\x42\xa5\x42\xa6\x42\xa7\x42\xa8\x42\xa9\x42\xc0\x42\x4f\x42\xd0\x43\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4a\x42\x4a\x42\x5f\x47\x51\x42\x6a\x42\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, /* EBCDIC DBCS to Unicode translation table for ibm-937_P110-1999 */ { /* 0000 */ NULL, /* 0080 */ NULL, /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ NULL, /* 0300 */ NULL, /* 0380 */ NULL, /* 0400 */ NULL, /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ NULL, /* 2080 */ NULL, /* 2100 */ NULL, /* 2180 */ NULL, /* 2200 */ NULL, /* 2280 */ NULL, /* 2300 */ NULL, /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ NULL, /* 2580 */ NULL, /* 2600 */ NULL, /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ NULL, /* 3080 */ NULL, /* 3100 */ NULL, /* 3180 */ NULL, /* 3200 */ NULL, /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4080 */ NULL, /* 4100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4180 */ "\x04\x30\x04\x31\x04\x32\x04\x33\x04\x34\x04\x35\x04\x51\x04\x36\x04\x37\x04\x38\x04\x39\x04\x3a\x04\x3b\x04\x3c\x04\x3d\x04\x3e\x04\x3f\x04\x40\x04\x41\x04\x42\x04\x43\x04\x44\x04\x45\x04\x46\x04\x47\x04\x48\x04\x49\x04\x4a\x04\x4b\x04\x4c\x04\x4d\x04\x4e\x04\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x70\x21\x71\x21\x72\x21\x73\x21\x74\x21\x75\x21\x76\x21\x77\x21\x78\x21\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x01\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04\x20\x04\x21\x04\x22\x04\x23\x04\x24\x04\x25\x04\x26\x04\x27\x04\x28\x04\x29\x04\x2a\x04\x2b\x04\x2c\x04\x2d\x04\x2e\x04\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x60\x21\x61\x21\x62\x21\x63\x21\x64\x21\x65\x21\x66\x21\x67\x21\x68\x21\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe1\xff\x0e\xff\x1c\xff\x08\xff\x0b\xff\x5c\xff\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x01\xff\xe5\x27\x3d\xff\x09\xff\x1b\xff\xe2\xff\x0d\xff\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe4\xff\x0c\xff\x05\xff\x3f\xff\x1e\xff\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x35\xff\x1a\xff\x03\xff\x20\xff\x07\xff\x1d\xff\x02", /* 4280 */ "\x00\x00\xff\x41\xff\x42\xff\x43\xff\x44\xff\x45\xff\x46\xff\x47\xff\x48\xff\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x4a\xff\x4b\xff\x4c\xff\x4d\xff\x4e\xff\x4f\xff\x50\xff\x51\xff\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x3e\xff\x53\xff\x54\xff\x55\xff\x56\xff\x57\xff\x58\xff\x59\xff\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5b\xff\x21\xff\x22\xff\x23\xff\x24\xff\x25\xff\x26\xff\x27\xff\x28\xff\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5d\xff\x2a\xff\x2b\xff\x2c\xff\x2d\xff\x2e\xff\x2f\xff\x30\xff\x31\xff\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\xff\x33\xff\x34\xff\x35\xff\x36\xff\x37\xff\x38\xff\x39\xff\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x10\xff\x11\xff\x12\xff\x13\xff\x14\xff\x15\xff\x16\xff\x17\xff\x18\xff\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x02\x30\x0c\x30\x0d\x30\x01\x20\x27\x30\xf2\x30\xa1\x30\xa3\x30\xa5\xff\xe0\x00\x00\x00\x00\x23\x12\x22\x02\x22\x07\x00\x00\x30\xa7\x30\xa9\x30\xe3\x30\xe5\x30\xe7\x30\xc3\x30\xee\x30\xfc\x30\xf5\x30\xf6\x00\x00\x00\x00\x22\x6a\x22\x6b\x00\x00\x22\x3d\x22\x1d\x00\x00\x22\x2c\x22\x08\x22\x0b\x22\x86\x22\x87\x22\x82\x22\x83\x00\x00\x00\x00\x22\x27\x22\x28\x21\xd2\x21\xd4\x22\x00\x22\x03\x21\x2b\x20\x30\x26\x6f\x26\x6d\x26\x6a\x20\x20\x20\x21\x00\xb6\x25\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4380 */ "\x00\x00\x30\xa2\x30\xa4\x30\xa6\x30\xa8\x30\xaa\x30\xab\x30\xad\x30\xaf\x30\xb1\x30\xb3\x00\x00\x30\xb5\x30\xb7\x30\xb9\x30\xbb\x30\xbd\x30\xbf\x30\xc1\x30\xc4\x30\xc6\x30\xc8\x30\xca\x30\xcb\x30\xcc\x30\xcd\x30\xce\x00\x00\x00\x00\x30\xcf\x30\xd2\x30\xd5\x00\x00\xff\x5e\x30\xd8\x30\xdb\x30\xde\x30\xdf\x30\xe0\x30\xe1\x30\xe2\x30\xe4\x30\xe6\x00\x00\x30\xe8\x30\xe9\x30\xea\x30\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x01\x25\x03\x25\x0f\x30\xec\x30\xed\x30\xef\x30\xf3\x30\x9b\x30\x9c\x30\xac\x30\xae\x30\xb0\x30\xb2\x30\xb4\x30\xb6\x30\xb8\x30\xba\x30\xbc\x30\xbe\x30\xc0\x30\xc2\x30\xc5\x30\xc7\x30\xc9\x30\xd0\x30\xd3\x30\xd6\x30\xd9\x30\xdc\x30\xf4\x30\xd1\x30\xd4\x30\xd7\x30\xda\x30\xdd\x30\xf0\x30\xf1\x30\xfd\x30\xfe\x00\x00\x00\x00\xff\x3c\x25\x13\x25\x1b\x25\x17\x25\x23\x25\x33\x25\x2b\x25\x3b\x25\x4b\x25\x20\x25\x2f\x25\x28\x25\x37\x25\x3f\x25\x1d\x25\x30\x25\x25\x25\x38\x25\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x0e\x30\x0f\xff\x3b\xff\x3d\x30\x92\x30\x41\x30\x43\x30\x45\x20\x14\x00\xb1\x22\x60\x22\x1e\x21\x03\x00\x00\x20\x32\x30\x47\x30\x49\x30\x83\x30\x85\x30\x87\x30\x63\x30\x8e\x00\x00\x00\x00\x20\x10\x02\xba\xf8\x3e\x30\x05\x30\x06\x30\x07\x00\xa8\x20\x18\x20\x1c\x30\x14\x30\x08\x30\x0a\x30\x10\x22\x66\x22\x34\x26\x42\x00\xa7\x20\x3b\x30\x12\x32\x31\x21\x16\x21\x21\xff\x3e\x20\x19\x20\x1d\x30\x15\x30\x09\x30\x0b\x30\x11\x22\x67\x22\x35\x26\x40\x00\xd7\x00\xf7\x22\x25\x30\x13\x20\x25\x20\x26", /* 4480 */ "\x00\x00\x30\x42\x30\x44\x30\x46\x30\x48\x30\x4a\x30\x4b\x30\x4d\x30\x4f\x30\x51\x30\x53\x00\x00\x30\x55\x30\x57\x30\x59\x30\x5b\x30\x5d\x30\x5f\x30\x61\x30\x64\x30\x66\x30\x68\x30\x6a\x30\x6b\x30\x6c\x30\x6d\x30\x6e\x00\x00\x00\x00\x30\x6f\x30\x72\x30\x75\x00\x00\x00\x00\x30\x78\x30\x7b\x30\x7e\x30\x7f\x30\x80\x30\x81\x30\x82\x30\x84\x30\x86\x00\x00\x30\x88\x30\x89\x30\x8a\x30\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x8c\x30\x8d\x30\x8f\x30\x93\x00\x00\x00\x00\x30\x4c\x30\x4e\x30\x50\x30\x52\x30\x54\x30\x56\x30\x58\x30\x5a\x30\x5c\x30\x5e\x30\x60\x30\x62\x30\x65\x30\x67\x30\x69\x30\x70\x30\x73\x30\x76\x30\x79\x30\x7c\x00\x00\x30\x71\x30\x74\x30\x77\x30\x7a\x30\x7d\x30\x90\x30\x91\x30\x9d\x30\x9e\x00\x00\x00\x00\x25\xcb\x25\xcf\x25\xb3\x25\xb2\x25\xce\x26\x06\x26\x05\x25\xc7\x25\xc6\x25\xa1\x25\xa0\x25\xbd\x25\xbc\x00\xb0\x00\xb4\x20\x33\x21\x92\x21\x90\x21\x91\x21\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x21\x30\x22\x30\x23\x30\x24\x30\x25\x30\x26\x30\x27\x30\x28\x30\x29\x53\x41\x53\x44\x53\x45\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc9\x02\xca\x02\xc7\x02\xcb\x02\xd9\x31\x05\x31\x06\x31\x07\x31\x08\x31\x09\x31\x0a\x31\x0b\x31\x0c\x31\x0d\x31\x0e\x31\x0f\x31\x10\x31\x11\x31\x12\x31\x13\x31\x14\x31\x15\x31\x16\x31\x17\x31\x18\x31\x19\x31\x1a\x31\x1b\x31\x1c\x31\x1d\x31\x1e\x31\x1f\x31\x20\x31\x21\x31\x22\x31\x23\x31\x24\x31\x25\x31\x26\x31\x27\x31\x28\x31\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4580 */ NULL, /* 4600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x60\x24\x61\x24\x62\x24\x63\x24\x64\x24\x65\x24\x66\x24\x67\x24\x68\x24\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x74\x24\x75\x24\x76\x24\x77\x24\x78\x24\x79\x24\x7a\x24\x7b\x24\x7c\x24\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x81\x25\x82\x25\x83\x25\x84\x25\x85\x25\x86\x25\x87\x25\x88\x25\x8f\x25\x8e\x25\x8d\x25\x8c\x25\x8b\x25\x8a\x25\x89\x25\x3c\x25\x34\x25\x2c\x25\x24\x25\x1c\x25\x94\x25\x00\x25\x02\x25\x95\x25\x0c\x25\x10\x25\x14\x25\x18\x25\x6d\x25\x6e\x25\x70\x25\x6f", /* 4680 */ "\x00\x00\x25\x50\x25\x5e\x25\x6a\x25\x61\x25\xe2\x25\xe3\x25\xe5\x25\xe4\x25\x71\x25\x72\x25\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x41\xfe\x42\xfe\x43\xfe\x44\xfe\x3b\xfe\x3c\x00\x00\xfe\x31\xf8\x3f\xf8\x40\xf8\x41\xf8\x42\xfe\x35\xfe\x36\xfe\x37\xfe\x38\xfe\x39\xfe\x3a\xfe\x3d\xfe\x3e\xfe\x3f\xfe\x40\xfe\x33\x25\x74\xff\x0a\x30\x03\x32\xa3\x21\x05\xfe\x34\xfe\x4f\xfe\x49\xfe\x4a\xfe\x4d\xfe\x4e\xfe\x4b\xfe\x4c\xfe\x61\x22\x1a\x22\x52\x22\x61\x22\x29\x22\x2a\x22\xa5\x22\x20\x22\x1f\x22\xbf\x33\xd2\x33\xd1\x22\x2b\x22\x2e\x22\x95\x22\x99\x21\x96\x21\x97\x21\x99\x21\x98\x00\x00\x00\x00\x22\x15\x21\x09\x33\xd5\x33\x9c\x33\x9d\x33\x9e\x33\xce\x33\xa1\x33\x8e\x33\x8f\x33\xc4\x00\xb7\x00\x00\x00\x00\x00\x00\x30\x1d\x30\x1e\x00\x00\x00\x00\x00\x00\x21\xe7\x21\xb8\x21\xb9\x51\x59\x51\x5b\x51\x5e\x51\x5d\x51\x61\x51\x63\x55\xe7\x74\xe9\x7c\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x30\xfe\x50\xfe\x51\xfe\x52\xfe\x54\xfe\x55\xfe\x56\xfe\x57\xfe\x32\xfe\x58\xfe\x59\xfe\x5a\xfe\x5b\xfe\x5c\xfe\x5d\xfe\x5e\xff\xe3\x02\xcd\xfe\x5f\xfe\x60\xfe\x62\xfe\x63\xfe\x64\xfe\x65\xfe\x66\xfe\x68\xfe\x69\xfe\x6a\xfe\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4780 */ "\x00\x00\x24\x00\x24\x01\x24\x02\x24\x03\x24\x04\x24\x05\x24\x06\x24\x07\x24\x08\x24\x09\x24\x0a\x24\x0b\x24\x0c\x24\x0d\x24\x0e\x24\x0f\x24\x10\x24\x11\x24\x12\x24\x13\x24\x14\x24\x15\x24\x16\x24\x17\x24\x18\x24\x19\x24\x1a\x24\x1b\x24\x1c\x24\x1d\x24\x1e\x24\x1f\x24\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4e\x28\x4e\x36\x4e\x3f\x4e\x59\x4e\x85\x4e\x8c\x4e\xa0\x4e\xba\x51\x3f\x51\x65\x51\x6b\x51\x82\x51\x96\x51\xab\x51\xe0\x51\xf5\x52\x00\x52\x9b\x52\xf9\x53\x15\x53\x1a\x53\x38\x53\x41\x53\x5c\x53\x69\x53\x82\x53\xb6\x53\xc8\x53\xe3\x56\xd7\x57\x1f\x58\xeb\x59\x0a\x59\x15\x59\x27\x59\x73\x5b\x50\x5b\x80\x5b\xf8\x5c\x0f\x5c\x22\x5c\x38\x5c\x6e\x5c\x71\x5d\xdb\x5d\xe5\x5d\xf1\x5d\xfe\x5e\x72\x5e\x7a\x5e\x7f\x5e\xf4\x5e\xfe\x5f\x0b\x5f\x13\x5f\x50\x5f\x61\x5f\x73\x5f\xc3\x62\x08\x62\x36\x62\x4b", /* 4880 */ "\x00\x00\x65\x2f\x65\x34\x65\x87\x65\x97\x65\xa4\x65\xb9\x65\xe0\x65\xe5\x66\xf0\x67\x08\x67\x28\x6b\x20\x6b\x62\x6b\x79\x6b\xb3\x6b\xcb\x6b\xd4\x6b\xdb\x6c\x0f\x6c\x14\x6c\x34\x70\x6b\x72\x2a\x72\x36\x72\x3b\x72\x3f\x72\x47\x72\x59\x72\x5b\x72\xac\x73\x84\x73\x89\x74\xdc\x74\xe6\x75\x18\x75\x1f\x75\x28\x75\x30\x75\x8b\x75\x92\x76\x76\x76\x7d\x76\xae\x76\xbf\x76\xee\x77\xdb\x77\xe2\x77\xf3\x79\x3a\x79\xb8\x79\xbe\x7a\x74\x7a\xcb\x7a\xf9\x7c\x73\x7c\xf8\x7f\x36\x7f\x51\x7f\x8a\x7f\xbd\x80\x01\x80\x0c\x80\x12\x80\x33\x80\x7f\x80\x89\x81\xe3\x81\xea\x81\xf3\x81\xfc\x82\x0c\x82\x1b\x82\x1f\x82\x6e\x82\x72\x82\x78\x86\x4d\x86\x6b\x88\x40\x88\x4c\x88\x63\x89\x7e\x89\x8b\x89\xd2\x8a\x00\x8c\x37\x8c\x46\x8c\x55\x8c\x78\x8c\x9d\x8d\x64\x8d\x70\x8d\xb3\x8e\xab\x8e\xca\x8f\x9b\x8f\xb0\x8f\xb5\x90\x91\x91\x49\x91\xc6\x91\xcc\x91\xd1\x95\x77\x95\x80\x96\x1c\x96\xb6\x96\xb9\x96\xe8\x97\x52\x97\x5e\x97\x62\x97\x69\x97\xcb\x97\xed\x97\xf3\x98\x01\x98\xa8\x98\xdb\x98\xdf\x99\x96\x99\x99\x99\xac\x9a\xa8\x9a\xd8\x00\x00\x00\x00", /* 4900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xdf\x9b\x25\x9b\x2f\x9b\x32\x9b\x3c\x9b\x5a\x9c\xe5\x9e\x75\x9e\x7f\x9e\xa5\x9e\xbb\x9e\xc3\x9e\xcd\x9e\xd1\x9e\xf9\x9e\xfd\x9f\x0e\x9f\x13\x9f\x20\x9f\x3b\x9f\x4a\x9f\x52\x9f\x8d\x9f\x9c\x9f\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4e\x59\x4e\x01\x4e\x03\x4e\x43\x4e\x5d\x4e\x86\x4e\x8c\x4e\xba\x51\x3f\x51\x65\x51\x6b\x51\xe0\x52\x00\x52\x01\x52\x9b\x53\x15\x53\x41\x53\x5c\x53\xc8\x4e\x09\x4e\x0b\x4e\x08\x4e\x0a\x4e\x2b\x4e\x38\x51\xe1\x4e\x45\x4e\x48\x4e\x5f\x4e\x5e\x4e\x8e\x4e\xa1\x51\x40\x52\x03\x52\xfa\x53\x43\x53\xc9\x53\xe3\x57\x1f\x58\xeb\x59\x15\x59\x27\x59\x73\x5b\x50\x5b\x51\x5b\x53\x5b\xf8\x5c\x0f\x5c\x22\x5c\x38\x5c\x71\x5d\xdd\x5d\xe5\x5d\xf1\x5d\xf2\x5d\xf3\x5d\xfe\x5e\x72\x5e\xfe\x5f\x0b\x5f\x13\x62\x4d", /* 4c80 */ "\x00\x00\x4e\x11\x4e\x10\x4e\x0d\x4e\x2d\x4e\x30\x4e\x39\x4e\x4b\x5c\x39\x4e\x88\x4e\x91\x4e\x95\x4e\x92\x4e\x94\x4e\xa2\x4e\xc1\x4e\xc0\x4e\xc3\x4e\xc6\x4e\xc7\x4e\xcd\x4e\xca\x4e\xcb\x4e\xc4\x51\x43\x51\x41\x51\x67\x51\x6d\x51\x6e\x51\x6c\x51\x97\x51\xf6\x52\x06\x52\x07\x52\x08\x52\xfb\x52\xfe\x52\xff\x53\x16\x53\x39\x53\x48\x53\x47\x53\x45\x53\x5e\x53\x84\x53\xcb\x53\xca\x53\xcd\x58\xec\x59\x29\x59\x2b\x59\x2a\x59\x2d\x5b\x54\x5c\x11\x5c\x24\x5c\x3a\x5c\x6f\x5d\xf4\x5e\x7b\x5e\xff\x5f\x14\x5f\x15\x5f\xc3\x62\x08\x62\x36\x62\x4b\x62\x4e\x65\x2f\x65\x87\x65\x97\x65\xa4\x65\xb9\x65\xe5\x66\xf0\x67\x08\x67\x28\x6b\x20\x6b\x62\x6b\x79\x6b\xcb\x6b\xd4\x6b\xdb\x6c\x0f\x6c\x34\x70\x6b\x72\x2a\x72\x36\x72\x3b\x72\x47\x72\x59\x72\x5b\x72\xac\x73\x8b\x4e\x19\x4e\x16\x4e\x15\x4e\x14\x4e\x18\x4e\x3b\x4e\x4d\x4e\x4f\x4e\x4e\x4e\xe5\x4e\xd8\x4e\xd4\x4e\xd5\x4e\xd6\x4e\xd7\x4e\xe3\x4e\xe4\x4e\xd9\x4e\xde\x51\x45\x51\x44\x51\x89\x51\x8a\x51\xac\x51\xf9\x51\xfa\x51\xf8\x52\x0a\x52\xa0\x52\x9f\x53\x05\x53\x06\x00\x00\x00\x00", /* 4d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x17\x53\x1d\x4e\xdf\x53\x4a\x53\x49\x53\x61\x53\x60\x53\x6f\x53\x6e\x53\xbb\x53\xef\x53\xe4\x53\xf3\x53\xec\x53\xee\x53\xe9\x53\xe8\x53\xfc\x53\xf8\x53\xf5\x53\xeb\x53\xe6\x53\xea\x53\xf2\x53\xf1\x53\xf0\x53\xe5\x53\xed\x53\xfb\x56\xdb\x56\xda\x59\x16\x59\x2e\x59\x31\x59\x74\x59\x76\x5b\x55\x5b\x83\x5c\x3c\x5d\xe8\x5d\xe7\x5d\xe6\x5e\x02\x5e\x03\x5e\x73\x5e\x7c\x5f\x01\x5f\x18\x5f\x17\x5f\xc5\x62\x0a\x62\x53\x62\x54\x62\x52\x62\x51\x65\xa5\x65\xe6\x67\x2e\x67\x2c\x67\x2a\x67\x2b\x67\x2d\x6b\x63", /* 4d80 */ "\x00\x00\x6b\xcd\x6c\x11\x6c\x10\x6c\x38\x6c\x41\x6c\x40\x6c\x3e\x72\xaf\x73\x84\x73\x89\x74\xdc\x74\xe6\x75\x18\x75\x1f\x75\x28\x75\x29\x75\x30\x75\x31\x75\x32\x75\x33\x75\x8b\x76\x7d\x76\xae\x76\xbf\x76\xee\x77\xdb\x77\xe2\x77\xf3\x79\x3a\x79\xbe\x7a\x74\x7a\xcb\x4e\x1e\x4e\x1f\x4e\x52\x4e\x53\x4e\x69\x4e\x99\x4e\xa4\x4e\xa6\x4e\xa5\x4e\xff\x4f\x09\x4f\x19\x4f\x0a\x4f\x15\x4f\x0d\x4f\x10\x4f\x11\x4f\x0f\x4e\xf2\x4e\xf6\x4e\xfb\x4e\xf0\x4e\xf3\x4e\xfd\x4f\x01\x4f\x0b\x51\x49\x51\x47\x51\x46\x51\x48\x51\x68\x51\x71\x51\x8d\x51\xb0\x52\x17\x52\x11\x52\x12\x52\x0e\x52\x16\x52\xa3\x53\x08\x53\x21\x53\x20\x53\x70\x53\x71\x54\x09\x54\x0f\x54\x0c\x54\x0a\x54\x10\x54\x01\x54\x0b\x54\x04\x54\x11\x54\x0d\x54\x08\x54\x03\x54\x0e\x54\x06\x54\x12\x56\xe0\x56\xde\x56\xdd\x57\x33\x57\x30\x57\x28\x57\x2d\x57\x2c\x57\x2f\x57\x29\x59\x19\x59\x1a\x59\x37\x59\x38\x59\x84\x59\x78\x59\x83\x59\x7d\x59\x79\x59\x82\x59\x81\x5b\x57\x5b\x58\x5b\x87\x5b\x88\x5b\x85\x5b\x89\x5b\xfa\x5c\x16\x5c\x79\x5d\xde\x5e\x06\x5e\x76\x00\x00\x00\x00", /* 4e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x74\x5f\x0f\x5f\x1b\x5f\xd9\x5f\xd6\x62\x0e\x62\x0c\x62\x0d\x62\x10\x62\x63\x62\x5b\x62\x58\x65\x36\x65\xe9\x65\xe8\x65\xec\x65\xed\x66\xf2\x66\xf3\x67\x09\x67\x3d\x67\x34\x67\x31\x67\x35\x6b\x21\x6b\x64\x6b\x7b\x6c\x16\x6c\x5d\x6c\x57\x6c\x59\x6c\x5f\x6c\x60\x6c\x50\x6c\x55\x6c\x61\x6c\x5b\x6c\x4d\x6c\x4e\x70\x70\x72\x5f\x72\x5d\x76\x7e\x7a\xf9\x7c\x73\x7c\xf8\x7f\x36\x7f\x8a\x7f\xbd\x80\x01\x80\x03\x80\x0c\x80\x12\x80\x33\x80\x7f\x80\x89\x80\x8b\x80\x8c\x81\xe3\x81\xea\x81\xf3\x81\xfc\x82\x0c", /* 4e80 */ "\x00\x00\x82\x1b\x82\x1f\x82\x6e\x82\x72\x82\x7e\x86\x6b\x88\x40\x88\x4c\x88\x63\x89\x7f\x96\x21\x4e\x32\x4e\xa8\x4f\x4d\x4f\x4f\x4f\x47\x4f\x57\x4f\x5e\x4f\x34\x4f\x5b\x4f\x55\x4f\x30\x4f\x50\x4f\x51\x4f\x3d\x4f\x3a\x4f\x38\x4f\x43\x4f\x54\x4f\x3c\x4f\x46\x4f\x63\x4f\x5c\x4f\x60\x4f\x2f\x4f\x4e\x4f\x36\x4f\x59\x4f\x5d\x4f\x48\x4f\x5a\x51\x4c\x51\x4b\x51\x4d\x51\x75\x51\xb6\x51\xb7\x52\x25\x52\x24\x52\x29\x52\x2a\x52\x28\x52\xab\x52\xa9\x52\xaa\x52\xac\x53\x23\x53\x73\x53\x75\x54\x1d\x54\x2d\x54\x1e\x54\x3e\x54\x26\x54\x4e\x54\x27\x54\x46\x54\x43\x54\x33\x54\x48\x54\x42\x54\x1b\x54\x29\x54\x4a\x54\x39\x54\x3b\x54\x38\x54\x2e\x54\x35\x54\x36\x54\x20\x54\x3c\x54\x40\x54\x31\x54\x2b\x54\x1f\x54\x2c\x56\xea\x56\xf0\x56\xe4\x56\xeb\x57\x4a\x57\x51\x57\x40\x57\x4d\x57\x47\x57\x4e\x57\x3e\x57\x50\x57\x4f\x57\x3b\x58\xef\x59\x3e\x59\x9d\x59\x92\x59\xa8\x59\x9e\x59\xa3\x59\x99\x59\x96\x59\x8d\x59\xa4\x59\x93\x59\x8a\x59\xa5\x5b\x5d\x5b\x5c\x5b\x5a\x5b\x5b\x5b\x8c\x5b\x8b\x5b\x8f\x5c\x2c\x5c\x40\x5c\x41\x00\x00\x00\x00", /* 4f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x3f\x5c\x3e\x5c\x90\x5c\x91\x5c\x94\x5c\x8c\x5d\xeb\x5e\x0c\x5e\x8f\x5e\x87\x5e\x8a\x5e\xf7\x5f\x04\x5f\x1f\x5f\x64\x5f\x62\x5f\x77\x5f\x79\x5f\xd8\x5f\xcc\x5f\xd7\x5f\xcd\x5f\xf1\x5f\xeb\x5f\xf8\x5f\xea\x62\x12\x62\x11\x62\x84\x62\x97\x62\x96\x62\x80\x62\x76\x62\x89\x62\x6d\x62\x8a\x62\x7c\x62\x7e\x62\x79\x62\x73\x62\x92\x62\x6f\x62\x98\x62\x6e\x62\x95\x62\x93\x62\x91\x62\x86\x65\x39\x65\x3b\x65\x38\x65\xf1\x66\xf4\x67\x5f\x67\x4e\x67\x4f\x67\x50\x67\x51\x67\x5c\x67\x56\x67\x5e\x67\x49\x67\x46", /* 4f80 */ "\x00\x00\x67\x60\x67\x53\x67\x57\x6b\x65\x6b\xcf\x6c\x42\x6c\x5e\x6c\x99\x6c\x81\x6c\x88\x6c\x89\x6c\x85\x6c\x9b\x6c\x6a\x6c\x7a\x6c\x90\x6c\x70\x6c\x8c\x6c\x68\x6c\x96\x6c\x92\x6c\x7d\x6c\x83\x6c\x72\x6c\x7e\x6c\x74\x6c\x86\x6c\x76\x6c\x8d\x6c\x94\x6c\x98\x6c\x82\x70\x76\x70\x7c\x70\x7d\x70\x78\x72\x62\x72\x61\x72\x60\x72\xc4\x72\xc2\x73\x96\x75\x2c\x75\x2b\x75\x37\x75\x38\x76\x82\x76\xef\x77\xe3\x79\xc1\x79\xc0\x79\xbf\x7a\x76\x7c\xfb\x7f\x55\x80\x96\x80\x93\x80\x9d\x80\x98\x80\x9b\x80\x9a\x80\xb2\x82\x6f\x82\x92\x82\x8b\x82\x8d\x89\x8b\x89\xd2\x8a\x00\x8c\x37\x8c\x46\x8c\x55\x8c\x9d\x8d\x64\x8d\x70\x8d\xb3\x8e\xab\x8e\xca\x8f\x9b\x8f\xb0\x8f\xc2\x8f\xc6\x8f\xc5\x8f\xc4\x5d\xe1\x90\x91\x90\xa2\x90\xaa\x90\xa6\x90\xa3\x91\x49\x91\xc6\x91\xcc\x96\x32\x96\x2e\x96\x31\x96\x2a\x96\x2c\x4e\x26\x4e\x56\x4e\x73\x4e\x8b\x4e\x9b\x4e\x9e\x4e\xab\x4e\xac\x4f\x6f\x4f\x9d\x4f\x8d\x4f\x73\x4f\x7f\x4f\x6c\x4f\x9b\x4f\x8b\x4f\x86\x4f\x83\x4f\x70\x4f\x75\x4f\x88\x4f\x69\x4f\x7b\x4f\x96\x4f\x7e\x4f\x8f\x4f\x91\x00\x00\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x7a\x51\x54\x51\x52\x51\x55\x51\x69\x51\x77\x51\x76\x51\x78\x51\xbd\x51\xfd\x52\x3b\x52\x38\x52\x37\x52\x3a\x52\x30\x52\x2e\x52\x36\x52\x41\x52\xbe\x52\xbb\x53\x52\x53\x54\x53\x53\x53\x51\x53\x66\x53\x77\x53\x78\x53\x79\x53\xd6\x53\xd4\x53\xd7\x54\x73\x54\x75\x54\x96\x54\x78\x54\x95\x54\x80\x54\x7b\x54\x77\x54\x84\x54\x92\x54\x86\x54\x7c\x54\x90\x54\x71\x54\x76\x54\x8c\x54\x9a\x54\x62\x54\x68\x54\x8b\x54\x7d\x54\x8e\x56\xfa\x57\x83\x57\x77\x57\x6a\x57\x69\x57\x61\x57\x66\x57\x64\x57\x7c\x59\x1c", /* 5080 */ "\x00\x00\x59\x49\x59\x47\x59\x48\x59\x44\x59\x54\x59\xbe\x59\xbb\x59\xd4\x59\xb9\x59\xae\x59\xd1\x59\xc6\x59\xd0\x59\xcd\x59\xcb\x59\xd3\x59\xca\x59\xaf\x59\xb3\x59\xd2\x59\xc5\x5b\x5f\x5b\x64\x5b\x63\x5b\x97\x5b\x9a\x5b\x98\x5b\x9c\x5b\x99\x5b\x9b\x5c\x1a\x5c\x48\x5c\x45\x5c\x46\x5c\xb7\x5c\xa1\x5c\xb8\x5c\xa9\x5c\xab\x5c\xb1\x5c\xb3\x5e\x18\x5e\x1a\x5e\x16\x5e\x15\x5e\x1b\x5e\x11\x5e\x78\x5e\x9a\x5e\x97\x5e\x9c\x5e\x95\x5e\x96\x5e\xf6\x5f\x26\x5f\x27\x5f\x29\x5f\x80\x5f\x81\x5f\x7f\x5f\x7c\x5f\xdd\x5f\xe0\x5f\xfd\x5f\xf5\x5f\xff\x60\x0f\x60\x14\x60\x2f\x60\x35\x60\x16\x60\x2a\x60\x15\x60\x21\x60\x27\x60\x29\x60\x2b\x60\x1b\x62\x16\x62\x15\x62\x3f\x62\x3e\x62\x40\x62\x7f\x62\xc9\x62\xcc\x62\xc4\x62\xbf\x62\xc2\x62\xb9\x62\xd2\x62\xdb\x62\xab\x62\xd3\x62\xd4\x62\xcb\x62\xc8\x62\xa8\x62\xbd\x62\xbc\x62\xd0\x62\xd9\x62\xc7\x62\xcd\x62\xb5\x62\xda\x62\xb1\x62\xd8\x62\xd6\x62\xd7\x62\xc6\x62\xac\x62\xce\x65\x3e\x65\xa7\x65\xbc\x65\xfa\x66\x14\x66\x13\x66\x0c\x66\x06\x66\x02\x66\x0e\x66\x00\x66\x0f\x00\x00\x00\x00", /* 5100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x15\x66\x0a\x66\x07\x67\x0d\x67\x0b\x67\x6d\x67\x8b\x67\x95\x67\x71\x67\x9c\x67\x73\x67\x77\x67\x87\x67\x9d\x67\x97\x67\x6f\x67\x70\x67\x7f\x67\x89\x67\x7e\x67\x90\x67\x75\x67\x9a\x67\x93\x67\x7c\x67\x6a\x67\x72\x6b\x23\x6b\x66\x6b\x67\x6b\x7f\x6c\x13\x6c\x1b\x6c\xe3\x6c\xe8\x6c\xf3\x6c\xb1\x6c\xcc\x6c\xe5\x6c\xb3\x6c\xbd\x6c\xbe\x6c\xbc\x6c\xe2\x6c\xab\x6c\xd5\x6c\xd3\x6c\xb8\x6c\xc4\x6c\xb9\x6c\xc1\x6c\xae\x6c\xd7\x6c\xc5\x6c\xf1\x6c\xbf\x6c\xbb\x6c\xe1\x6c\xdb\x6c\xca\x6c\xac\x6c\xef\x6c\xdc", /* 5180 */ "\x00\x00\x6c\xd6\x6c\xe0\x70\x95\x70\x8e\x70\x92\x70\x8a\x70\x99\x72\x2c\x72\x2d\x72\x38\x72\x48\x72\x67\x72\x69\x72\xc0\x72\xce\x72\xd9\x72\xd7\x72\xd0\x73\xa9\x73\xa8\x73\x9f\x73\xab\x73\xa5\x75\x3d\x75\x9d\x75\x99\x75\x9a\x76\x84\x76\xc2\x76\xf2\x76\xf4\x77\xe5\x77\xfd\x79\x3e\x79\x40\x79\x41\x79\xc9\x79\xc8\x7a\x7a\x7a\x79\x7a\xfa\x7c\xfe\x7f\x54\x7f\x8c\x7f\x8b\x80\x05\x80\xba\x80\xa5\x80\xa2\x80\xb1\x80\xa1\x80\xab\x80\xa9\x80\xb4\x80\xaa\x80\xaf\x81\xe5\x81\xfe\x82\x0d\x82\xb3\x82\x9d\x82\x99\x82\xad\x82\xbd\x82\x9f\x82\xb9\x82\xb1\x82\xac\x82\xa5\x82\xaf\x82\xb8\x82\xa3\x82\xb0\x82\xbe\x82\xb7\x86\x4e\x86\x71\x52\x1d\x88\x68\x8e\xcb\x8f\xce\x8f\xd4\x8f\xd1\x90\xb5\x90\xb8\x90\xb1\x90\xb6\x91\xc7\x91\xd1\x95\x77\x95\x80\x96\x1c\x96\x40\x96\x3f\x96\x3b\x96\x44\x96\x42\x96\xb9\x96\xe8\x97\x52\x97\x5e\x4e\x9f\x4e\xad\x4e\xae\x4f\xe1\x4f\xb5\x4f\xaf\x4f\xbf\x4f\xe0\x4f\xd1\x4f\xcf\x4f\xdd\x4f\xc3\x4f\xb6\x4f\xd8\x4f\xdf\x4f\xca\x4f\xd7\x4f\xae\x4f\xd0\x4f\xc4\x4f\xc2\x4f\xda\x4f\xce\x4f\xde\x00\x00\x00\x00", /* 5200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xb7\x51\x57\x51\x92\x51\x91\x51\xa0\x52\x4e\x52\x43\x52\x4a\x52\x4d\x52\x4c\x52\x4b\x52\x47\x52\xc7\x52\xc9\x52\xc3\x52\xc1\x53\x0d\x53\x57\x53\x7b\x53\x9a\x53\xdb\x54\xac\x54\xc0\x54\xa8\x54\xce\x54\xc9\x54\xb8\x54\xa6\x54\xb3\x54\xc7\x54\xc2\x54\xbd\x54\xaa\x54\xc1\x54\xc4\x54\xc8\x54\xaf\x54\xab\x54\xb1\x54\xbb\x54\xa9\x54\xa7\x54\xbf\x56\xff\x57\x82\x57\x8b\x57\xa0\x57\xa3\x57\xa2\x57\xce\x57\xae\x57\x93\x59\x55\x59\x51\x59\x4f\x59\x4e\x59\x50\x59\xdc\x59\xd8\x59\xff\x59\xe3\x59\xe8\x5a\x03", /* 5280 */ "\x00\x00\x59\xe5\x59\xea\x59\xda\x59\xe6\x5a\x01\x59\xfb\x5b\x69\x5b\xa3\x5b\xa6\x5b\xa4\x5b\xa2\x5b\xa5\x5c\x01\x5c\x4e\x5c\x4f\x5c\x4d\x5c\x4b\x5c\xd9\x5c\xd2\x5d\xf7\x5e\x1d\x5e\x25\x5e\x1f\x5e\x7d\x5e\xa0\x5e\xa6\x5e\xfa\x5f\x08\x5f\x2d\x5f\x65\x5f\x88\x5f\x85\x5f\x8a\x5f\x8b\x5f\x87\x5f\x8c\x5f\x89\x60\x12\x60\x1d\x60\x20\x60\x25\x60\x0e\x60\x28\x60\x4d\x60\x70\x60\x68\x60\x62\x60\x46\x60\x43\x60\x6c\x60\x6b\x60\x6a\x60\x64\x62\x41\x62\xdc\x63\x16\x63\x09\x62\xfc\x62\xed\x63\x01\x62\xee\x62\xfd\x63\x07\x62\xf1\x62\xf7\x62\xef\x62\xec\x62\xfe\x62\xf4\x63\x11\x63\x02\x65\x3f\x65\x45\x65\xab\x65\xbd\x65\xe2\x66\x25\x66\x2d\x66\x20\x66\x27\x66\x2f\x66\x1f\x66\x28\x66\x31\x66\x24\x66\xf7\x67\xff\x67\xd3\x67\xf1\x67\xd4\x67\xd0\x67\xec\x67\xb6\x67\xaf\x67\xf5\x67\xe9\x67\xef\x67\xc4\x67\xd1\x67\xb4\x67\xda\x67\xe5\x67\xb8\x67\xcf\x67\xde\x67\xf3\x67\xb0\x67\xd9\x67\xe2\x67\xdd\x67\xd2\x6b\x6a\x6b\x83\x6b\x86\x6b\xb5\x6b\xd2\x6b\xd7\x6c\x1f\x6c\xc9\x6d\x0b\x6d\x32\x6d\x2a\x6d\x41\x6d\x25\x6d\x0c\x00\x00\x00\x00", /* 5300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x31\x6d\x1e\x6d\x17\x6d\x3b\x6d\x3d\x6d\x3e\x6d\x36\x6d\x1b\x6c\xf5\x6d\x39\x6d\x27\x6d\x38\x6d\x29\x6d\x2e\x6d\x35\x6d\x0e\x6d\x2b\x70\xab\x70\xba\x70\xb3\x70\xac\x70\xaf\x70\xad\x70\xb8\x70\xae\x70\xa4\x72\x30\x72\x72\x72\x6f\x72\x74\x72\xe9\x72\xe0\x72\xe1\x73\xb7\x73\xca\x73\xbb\x73\xb2\x73\xcd\x73\xc0\x73\xb3\x75\x1a\x75\x2d\x75\x4f\x75\x4c\x75\x4e\x75\x4b\x75\xab\x75\xa4\x75\xa5\x75\xa2\x75\xa3\x76\x78\x76\x86\x76\x87\x76\x88\x76\xc8\x76\xc6\x76\xc3\x76\xc5\x77\x01\x76\xf9\x76\xf8\x77\x09", /* 5380 */ "\x00\x00\x77\x0b\x76\xfe\x76\xfc\x77\x07\x77\xdc\x78\x02\x78\x14\x78\x0c\x78\x0d\x79\x46\x79\x49\x79\x48\x79\x47\x79\xb9\x79\xba\x79\xd1\x79\xd2\x79\xcb\x7a\x7f\x7a\x81\x7a\xff\x7a\xfd\x7c\x7d\x7d\x02\x7d\x05\x7d\x00\x7d\x09\x7d\x07\x7d\x04\x7d\x06\x7f\x38\x7f\x8e\x7f\xbf\x80\x04\x80\x10\x80\x0d\x80\x11\x80\x36\x80\xd6\x80\xe5\x80\xda\x80\xc3\x80\xc4\x80\xcc\x80\xe1\x80\xdb\x80\xce\x80\xde\x80\xe4\x80\xdd\x81\xf4\x82\x22\x82\xe7\x83\x03\x83\x05\x82\xe3\x82\xdb\x82\xe6\x83\x04\x82\xe5\x83\x02\x83\x09\x82\xd2\x82\xd7\x82\xf1\x83\x01\x82\xdc\x82\xd4\x82\xd1\x82\xde\x82\xd3\x82\xdf\x82\xef\x83\x06\x86\x50\x86\x79\x86\x7b\x86\x7a\x88\x4d\x88\x6b\x89\x81\x89\xd4\x8a\x08\x8a\x02\x8a\x03\x8c\x9e\x8c\xa0\x8d\x74\x8d\x73\x8d\xb4\x8e\xcd\x8e\xcc\x8f\xf0\x8f\xe6\x8f\xe2\x8f\xea\x8f\xe5\x8f\xed\x8f\xeb\x8f\xe4\x8f\xe8\x90\xca\x90\xce\x90\xc1\x90\xc3\x91\x4b\x91\x4a\x91\xcd\x95\x82\x96\x50\x96\x4b\x96\x4c\x96\x4d\x97\x62\x97\x69\x97\xcb\x97\xed\x97\xf3\x98\x01\x98\xa8\x98\xdb\x98\xdf\x99\x96\x99\x99\x4e\x58\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xb3\x50\x0c\x50\x0d\x50\x23\x4f\xef\x50\x26\x50\x25\x4f\xf8\x50\x29\x50\x16\x50\x06\x50\x3c\x50\x1f\x50\x1a\x50\x12\x50\x11\x4f\xfa\x50\x00\x50\x14\x50\x28\x4f\xf1\x50\x21\x50\x0b\x50\x19\x50\x18\x4f\xf3\x4f\xee\x50\x2d\x50\x2a\x4f\xfe\x50\x2b\x50\x09\x51\x7c\x51\xa4\x51\xa5\x51\xa2\x51\xcd\x51\xcc\x51\xc6\x51\xcb\x52\x56\x52\x5c\x52\x54\x52\x5b\x52\x5d\x53\x2a\x53\x7f\x53\x9f\x53\x9d\x53\xdf\x54\xe8\x55\x10\x55\x01\x55\x37\x54\xfc\x54\xe5\x54\xf2\x55\x06\x54\xfa\x55\x14\x54\xe9\x54\xed\x54\xe1", /* 5480 */ "\x00\x00\x55\x09\x54\xee\x54\xea\x54\xe6\x55\x27\x55\x07\x54\xfd\x55\x0f\x57\x03\x57\x04\x57\xc2\x57\xd4\x57\xcb\x57\xc3\x58\x09\x59\x0f\x59\x57\x59\x58\x59\x5a\x5a\x11\x5a\x18\x5a\x1c\x5a\x1f\x5a\x1b\x5a\x13\x59\xec\x5a\x20\x5a\x23\x5a\x29\x5a\x25\x5a\x0c\x5a\x09\x5b\x6b\x5c\x58\x5b\xb0\x5b\xb3\x5b\xb6\x5b\xb4\x5b\xae\x5b\xb5\x5b\xb9\x5b\xb8\x5c\x04\x5c\x51\x5c\x55\x5c\x50\x5c\xed\x5c\xfd\x5c\xfb\x5c\xea\x5c\xe8\x5c\xf0\x5c\xf6\x5d\x01\x5c\xf4\x5d\xee\x5e\x2d\x5e\x2b\x5e\xab\x5e\xad\x5e\xa7\x5f\x31\x5f\x92\x5f\x91\x5f\x90\x60\x59\x60\x63\x60\x65\x60\x50\x60\x55\x60\x6d\x60\x69\x60\x6f\x60\x84\x60\x9f\x60\x9a\x60\x8d\x60\x94\x60\x8c\x60\x85\x60\x96\x62\x47\x62\xf3\x63\x08\x62\xff\x63\x4e\x63\x3e\x63\x2f\x63\x55\x63\x42\x63\x46\x63\x4f\x63\x49\x63\x3a\x63\x50\x63\x3d\x63\x2a\x63\x2b\x63\x28\x63\x4d\x63\x4c\x65\x48\x65\x49\x65\x99\x65\xc1\x65\xc5\x66\x42\x66\x49\x66\x4f\x66\x43\x66\x52\x66\x4c\x66\x45\x66\x41\x66\xf8\x67\x14\x67\x15\x67\x17\x68\x21\x68\x38\x68\x48\x68\x46\x68\x53\x68\x39\x68\x42\x00\x00\x00\x00", /* 5500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x54\x68\x29\x68\xb3\x68\x17\x68\x4c\x68\x51\x68\x3d\x67\xf4\x68\x50\x68\x40\x68\x3c\x68\x43\x68\x2a\x68\x45\x68\x13\x68\x18\x68\x41\x6b\x8a\x6b\x89\x6b\xb7\x6c\x23\x6c\x27\x6c\x28\x6c\x26\x6c\x24\x6c\xf0\x6d\x6a\x6d\x95\x6d\x88\x6d\x87\x6d\x66\x6d\x78\x6d\x77\x6d\x59\x6d\x93\x6d\x6c\x6d\x89\x6d\x6e\x6d\x5a\x6d\x74\x6d\x69\x6d\x8c\x6d\x8a\x6d\x79\x6d\x85\x6d\x65\x6d\x94\x70\xca\x70\xd8\x70\xe4\x70\xd9\x70\xc8\x70\xcf\x72\x39\x72\x79\x72\xfc\x72\xf9\x72\xfd\x72\xf8\x72\xf7\x73\x86\x73\xed\x74\x09", /* 5580 */ "\x00\x00\x73\xee\x73\xe0\x73\xea\x73\xde\x75\x54\x75\x5d\x75\x5c\x75\x5a\x75\x59\x75\xbe\x75\xc5\x75\xc7\x75\xb2\x75\xb3\x75\xbd\x75\xbc\x75\xb9\x75\xc2\x75\xb8\x76\x8b\x76\xb0\x76\xca\x76\xcd\x76\xce\x77\x29\x77\x1f\x77\x20\x77\x28\x77\xe9\x78\x30\x78\x27\x78\x38\x78\x1d\x78\x34\x78\x37\x78\x25\x78\x2d\x78\x20\x78\x1f\x78\x32\x79\x55\x79\x50\x79\x60\x79\x5f\x79\x56\x79\x5e\x79\x5d\x79\x57\x79\x5a\x79\xe4\x79\xe3\x79\xe7\x79\xdf\x79\xe6\x79\xe9\x79\xd8\x7a\x84\x7a\x88\x7a\xd9\x7b\x06\x7b\x11\x7c\x89\x7d\x21\x7d\x17\x7d\x0b\x7d\x0a\x7d\x20\x7d\x22\x7d\x14\x7d\x10\x7d\x15\x7d\x1a\x7d\x1c\x7d\x0d\x7d\x19\x7d\x1b\x7f\x3a\x7f\x5f\x7f\x94\x7f\xc5\x7f\xc1\x80\x06\x80\x18\x80\x15\x80\x19\x80\x17\x80\x3d\x80\x3f\x80\xf1\x81\x02\x80\xf0\x81\x05\x80\xed\x80\xf4\x81\x06\x80\xf8\x80\xf3\x81\x08\x80\xfd\x81\x0a\x80\xfc\x80\xef\x81\xed\x81\xec\x82\x00\x82\x10\x82\x2a\x82\x2b\x82\x28\x82\x2c\x82\xbb\x83\x2b\x83\x52\x83\x54\x83\x4a\x83\x38\x83\x50\x83\x49\x83\x35\x83\x34\x83\x4f\x83\x32\x83\x39\x83\x36\x83\x17\x00\x00\x00\x00", /* 5600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x40\x83\x31\x83\x28\x83\x43\x86\x54\x86\x8a\x86\xaa\x86\x93\x86\xa4\x86\xa9\x86\x8c\x86\xa3\x86\x9c\x88\x70\x88\x77\x88\x81\x88\x82\x88\x7d\x88\x79\x8a\x18\x8a\x10\x8a\x0e\x8a\x0c\x8a\x15\x8a\x0a\x8a\x17\x8a\x13\x8a\x16\x8a\x0f\x8a\x11\x8c\x48\x8c\x7a\x8c\x79\x8c\xa1\x8c\xa2\x8d\x77\x8e\xac\x8e\xd2\x8e\xd4\x8e\xcf\x8f\xb1\x90\x01\x90\x06\x8f\xf7\x90\x00\x8f\xfa\x8f\xf4\x90\x03\x8f\xfd\x90\x05\x8f\xf8\x90\x95\x90\xe1\x90\xdd\x90\xe2\x91\x52\x91\x4d\x91\x4c\x91\xd8\x91\xdd\x91\xd7\x91\xdc\x91\xd9", /* 5680 */ "\x00\x00\x95\x83\x96\x62\x96\x63\x96\x61\x96\x5b\x96\x5d\x96\x64\x96\x58\x96\x5e\x96\xbb\x98\xe2\x99\xac\x9a\xa8\x9a\xd8\x9b\x25\x9b\x32\x9b\x3c\x4e\x7e\x50\x7a\x50\x7d\x50\x5c\x50\x47\x50\x43\x50\x4c\x50\x5a\x50\x49\x50\x65\x50\x76\x50\x4e\x50\x55\x50\x75\x50\x74\x50\x77\x50\x4f\x50\x0f\x50\x6f\x50\x6d\x51\x5c\x51\x95\x51\xf0\x52\x6a\x52\x6f\x52\xd2\x52\xd9\x52\xd8\x52\xd5\x53\x10\x53\x0f\x53\x19\x53\x3f\x53\x40\x53\x3e\x53\xc3\x66\xfc\x55\x46\x55\x6a\x55\x66\x55\x44\x55\x5e\x55\x61\x55\x43\x55\x4a\x55\x31\x55\x56\x55\x4f\x55\x55\x55\x2f\x55\x64\x55\x38\x55\x2e\x55\x5c\x55\x2c\x55\x63\x55\x33\x55\x41\x55\x57\x57\x08\x57\x0b\x57\x09\x57\xdf\x58\x05\x58\x0a\x58\x06\x57\xe0\x57\xe4\x57\xfa\x58\x02\x58\x35\x57\xf7\x57\xf9\x59\x20\x59\x62\x5a\x36\x5a\x41\x5a\x49\x5a\x66\x5a\x6a\x5a\x40\x5a\x3c\x5a\x62\x5a\x5a\x5a\x46\x5a\x4a\x5b\x70\x5b\xc7\x5b\xc5\x5b\xc4\x5b\xc2\x5b\xbf\x5b\xc6\x5c\x09\x5c\x08\x5c\x07\x5c\x60\x5c\x5c\x5c\x5d\x5d\x07\x5d\x06\x5d\x0e\x5d\x1b\x5d\x16\x5d\x22\x5d\x11\x5d\x29\x5d\x14\x00\x00\x00\x00", /* 5700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x19\x5d\x24\x5d\x27\x5d\x17\x5d\xe2\x5e\x38\x5e\x36\x5e\x33\x5e\x37\x5e\xb7\x5e\xb8\x5e\xb6\x5e\xb5\x5e\xbe\x5f\x35\x5f\x37\x5f\x57\x5f\x6c\x5f\x69\x5f\x6b\x5f\x97\x5f\x99\x5f\x9e\x5f\x98\x5f\xa1\x5f\xa0\x5f\x9c\x60\x7f\x60\xa3\x60\x89\x60\xa0\x60\xa8\x60\xcb\x60\xb4\x60\xe6\x60\xbd\x60\xc5\x60\xbb\x60\xb5\x60\xdc\x60\xbc\x60\xd8\x60\xd5\x60\xc6\x60\xdf\x60\xb8\x60\xda\x60\xc7\x62\x1a\x62\x1b\x62\x48\x63\xa0\x63\xa7\x63\x72\x63\x96\x63\xa2\x63\xa5\x63\x77\x63\x67\x63\x98\x63\xaa\x63\x71\x63\xa9", /* 5780 */ "\x00\x00\x63\x89\x63\x83\x63\x9b\x63\x6b\x63\xa8\x63\x84\x63\x88\x63\x99\x63\xa1\x63\xac\x63\x92\x63\x8f\x63\x80\x63\x7b\x63\x69\x63\x68\x63\x7a\x65\x5d\x65\x56\x65\x51\x65\x59\x65\x57\x55\x5f\x65\x4f\x65\x58\x65\x55\x65\x54\x65\x9c\x65\x9b\x65\xac\x65\xcf\x65\xcb\x65\xcc\x65\xce\x66\x5d\x66\x5a\x66\x64\x66\x68\x66\x66\x66\x5e\x66\xf9\x52\xd7\x67\x1b\x68\x81\x68\xaf\x68\xa2\x68\x93\x68\xb5\x68\x7f\x68\x76\x68\xb1\x68\xa7\x68\x97\x68\xb0\x68\x83\x68\xc4\x68\xad\x68\x86\x68\x85\x68\x94\x68\x9d\x68\xa8\x68\x9f\x68\xa1\x68\x82\x6b\x32\x6b\xba\x6b\xeb\x6b\xec\x6c\x2b\x6d\x8e\x6d\xbc\x6d\xf3\x6d\xd9\x6d\xb2\x6d\xe1\x6d\xcc\x6d\xe4\x6d\xfb\x6d\xfa\x6e\x05\x6d\xc7\x6d\xcb\x6d\xaf\x6d\xd1\x6d\xae\x6d\xde\x6d\xf9\x6d\xb8\x6d\xf7\x6d\xf5\x6d\xc5\x6d\xd2\x6e\x1a\x6d\xb5\x6d\xda\x6d\xeb\x6d\xd8\x6d\xea\x6d\xf1\x6d\xee\x6d\xe8\x6d\xc6\x6d\xc4\x6d\xaa\x6d\xec\x6d\xbf\x6d\xe6\x70\xf9\x71\x09\x71\x0a\x70\xfd\x70\xef\x72\x3d\x72\x7d\x72\x81\x73\x1c\x73\x1b\x73\x16\x73\x13\x73\x19\x73\x87\x74\x05\x74\x0a\x74\x03\x00\x00\x00\x00", /* 5800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x06\x73\xfe\x74\x0d\x74\xe0\x74\xf6\x74\xf7\x75\x1c\x75\x22\x75\x65\x75\x66\x75\x62\x75\x70\x75\x8f\x75\xd4\x75\xd5\x75\xb5\x75\xca\x75\xcd\x76\x8e\x76\xd4\x76\xd2\x76\xdb\x77\x37\x77\x3e\x77\x3c\x77\x36\x77\x38\x77\x3a\x78\x6b\x78\x43\x78\x4e\x79\x65\x79\x68\x79\x6d\x79\xfb\x7a\x92\x7a\x95\x7b\x20\x7b\x28\x7b\x1b\x7b\x2c\x7b\x26\x7b\x19\x7b\x1e\x7b\x2e\x7c\x92\x7c\x97\x7c\x95\x7d\x46\x7d\x43\x7d\x71\x7d\x2e\x7d\x39\x7d\x3c\x7d\x40\x7d\x30\x7d\x33\x7d\x44\x7d\x2f\x7d\x42\x7d\x32\x7d\x31\x7f\x3d", /* 5880 */ "\x00\x00\x7f\x9e\x7f\x9a\x7f\xcc\x7f\xce\x7f\xd2\x80\x1c\x80\x4a\x80\x46\x81\x2f\x81\x16\x81\x23\x81\x2b\x81\x29\x81\x30\x81\x24\x82\x02\x82\x35\x82\x37\x82\x36\x82\x39\x83\x8e\x83\x9e\x83\x98\x83\x78\x83\xa2\x83\x96\x83\xbd\x83\xab\x83\x92\x83\x8a\x83\x93\x83\x89\x83\xa0\x83\x77\x83\x7b\x83\x7c\x83\x86\x83\xa7\x86\x55\x5f\x6a\x86\xc7\x86\xc0\x86\xb6\x86\xc4\x86\xb5\x86\xc6\x86\xcb\x86\xb1\x86\xaf\x86\xc9\x88\x53\x88\x9e\x88\x88\x88\xab\x88\x92\x88\x96\x88\x8d\x88\x8b\x89\x93\x89\x8f\x8a\x2a\x8a\x1d\x8a\x23\x8a\x25\x8a\x31\x8a\x2d\x8a\x1f\x8a\x1b\x8a\x22\x8c\x49\x8c\x5a\x8c\xa9\x8c\xac\x8c\xab\x8c\xa8\x8c\xaa\x8c\xa7\x8d\x67\x8d\x66\x8d\xbe\x8d\xba\x8e\xdb\x8e\xdf\x90\x19\x90\x0d\x90\x1a\x90\x17\x90\x23\x90\x1f\x90\x1d\x90\x10\x90\x15\x90\x1e\x90\x20\x90\x0f\x90\x22\x90\x16\x90\x1b\x90\x14\x90\xe8\x90\xed\x90\xfd\x91\x57\x91\xce\x91\xf5\x91\xe6\x91\xe3\x91\xe7\x91\xed\x91\xe9\x95\x89\x96\x6a\x96\x75\x96\x73\x96\x78\x96\x70\x96\x74\x96\x76\x96\x77\x96\x6c\x96\xc0\x96\xea\x96\xe9\x7a\xe0\x7a\xdf\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x02\x98\x03\x9b\x5a\x9c\xe5\x9e\x75\x9e\x7f\x9e\xa5\x9e\xbb\x50\xa2\x50\x8d\x50\x85\x50\x99\x50\x91\x50\x80\x50\x96\x50\x98\x50\x9a\x67\x00\x51\xf1\x52\x72\x52\x74\x52\x75\x52\x69\x52\xde\x52\xdd\x52\xdb\x53\x5a\x53\xa5\x55\x7b\x55\x80\x55\xa7\x55\x7c\x55\x8a\x55\x9d\x55\x98\x55\x82\x55\x9c\x55\xaa\x55\x94\x55\x87\x55\x8b\x55\x83\x55\xb3\x55\xae\x55\x9f\x55\x3e\x55\xb2\x55\x9a\x55\xbb\x55\xac\x55\xb1\x55\x7e\x55\x89\x55\xab\x55\x99\x57\x0d\x58\x2f\x58\x2a\x58\x34\x58\x24\x58\x30\x58\x31\x58\x21", /* 5980 */ "\x00\x00\x58\x1d\x58\x20\x58\xf9\x58\xfa\x59\x60\x5a\x77\x5a\x9a\x5a\x7f\x5a\x92\x5a\x9b\x5a\xa7\x5b\x73\x5b\x71\x5b\xd2\x5b\xcc\x5b\xd3\x5b\xd0\x5c\x0a\x5c\x0b\x5c\x31\x5d\x4c\x5d\x50\x5d\x34\x5d\x47\x5d\xfd\x5e\x45\x5e\x3d\x5e\x40\x5e\x43\x5e\x7e\x5e\xca\x5e\xc1\x5e\xc2\x5e\xc4\x5f\x3c\x5f\x6d\x5f\xa9\x5f\xaa\x5f\xa8\x60\xd1\x60\xe1\x60\xb2\x60\xb6\x60\xe0\x61\x1c\x61\x23\x60\xfa\x61\x15\x60\xf0\x60\xfb\x60\xf4\x61\x68\x60\xf1\x61\x0e\x60\xf6\x61\x09\x61\x00\x61\x12\x62\x1f\x62\x49\x63\xa3\x63\x8c\x63\xcf\x63\xc0\x63\xe9\x63\xc9\x63\xc6\x63\xcd\x63\xd2\x63\xe3\x63\xd0\x63\xe1\x63\xd6\x63\xed\x63\xee\x63\x76\x63\xf4\x63\xea\x63\xdb\x64\x52\x63\xda\x63\xf9\x65\x5e\x65\x66\x65\x62\x65\x63\x65\x91\x65\x90\x65\xaf\x66\x6e\x66\x70\x66\x74\x66\x76\x66\x6f\x66\x91\x66\x7a\x66\x7e\x66\x77\x66\xfe\x66\xff\x67\x1f\x67\x1d\x68\xfa\x68\xd5\x68\xe0\x68\xd8\x68\xd7\x69\x05\x68\xdf\x68\xf5\x68\xee\x68\xe7\x68\xf9\x68\xd2\x68\xf2\x68\xe3\x68\xcb\x68\xcd\x69\x0d\x69\x12\x69\x0e\x68\xc9\x68\xda\x69\x6e\x68\xfb\x00\x00\x00\x00", /* 5a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x3e\x6b\x3a\x6b\x3d\x6b\x98\x6b\x96\x6b\xbc\x6b\xef\x6c\x2e\x6c\x2f\x6c\x2c\x6e\x2f\x6e\x38\x6e\x54\x6e\x21\x6e\x32\x6e\x67\x6e\x4a\x6e\x20\x6e\x25\x6e\x23\x6e\x1b\x6e\x5b\x6e\x58\x6e\x24\x6e\x56\x6e\x6e\x6e\x2d\x6e\x26\x6e\x6f\x6e\x34\x6e\x4d\x6e\x3a\x6e\x2c\x6e\x43\x6e\x1d\x6e\x3e\x6e\xcb\x6e\x89\x6e\x19\x6e\x4e\x6e\x63\x6e\x44\x6e\x72\x6e\x69\x6e\x5f\x71\x19\x71\x1a\x71\x26\x71\x30\x71\x21\x71\x36\x71\x6e\x71\x1c\x72\x4c\x72\x84\x72\x80\x73\x36\x73\x25\x73\x34\x73\x29\x74\x3a\x74\x2a\x74\x33", /* 5a80 */ "\x00\x00\x74\x22\x74\x25\x74\x35\x74\x36\x74\x34\x74\x2f\x74\x1b\x74\x26\x74\x28\x75\x25\x75\x26\x75\x6b\x75\x6a\x75\xe2\x75\xdb\x75\xe3\x75\xd9\x75\xd8\x75\xde\x75\xe0\x76\x7b\x76\x7c\x76\x96\x76\x93\x76\xb4\x76\xdc\x77\x4f\x77\xed\x78\x5d\x78\x6c\x78\x6f\x7a\x0d\x7a\x08\x7a\x0b\x7a\x05\x7a\x00\x7a\x98\x7a\x97\x7a\x96\x7a\xe5\x7a\xe3\x7b\x49\x7b\x56\x7b\x46\x7b\x50\x7b\x52\x7b\x54\x7b\x4d\x7b\x4b\x7b\x4f\x7b\x51\x7c\x9f\x7c\xa5\x7d\x5e\x7d\x50\x7d\x68\x7d\x55\x7d\x2b\x7d\x6e\x7d\x72\x7d\x61\x7d\x66\x7d\x62\x7d\x70\x7d\x73\x55\x84\x7f\xd4\x7f\xd5\x80\x0b\x80\x52\x80\x85\x81\x55\x81\x54\x81\x4b\x81\x51\x81\x4e\x81\x39\x81\x46\x81\x3e\x81\x4c\x81\x53\x81\x74\x82\x12\x82\x1c\x83\xe9\x84\x03\x83\xf8\x84\x0d\x83\xe0\x83\xc5\x84\x0b\x83\xc1\x83\xef\x83\xf1\x83\xf4\x84\x57\x84\x0a\x83\xf0\x84\x0c\x83\xcc\x83\xfd\x83\xf2\x83\xca\x84\x38\x84\x0e\x84\x04\x83\xdc\x84\x07\x83\xd4\x83\xdf\x86\x5b\x86\xdf\x86\xd9\x86\xed\x86\xd4\x86\xdb\x86\xe4\x86\xd0\x86\xde\x88\x57\x88\xc1\x88\xc2\x88\xb1\x89\x83\x89\x96\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x3b\x8a\x60\x8a\x55\x8a\x5e\x8a\x3c\x8a\x41\x8a\x54\x8a\x5b\x8a\x50\x8a\x46\x8a\x34\x8a\x3a\x8a\x36\x8a\x56\x8c\x61\x8c\x82\x8c\xaf\x8c\xbc\x8c\xb3\x8c\xbd\x8c\xc1\x8c\xbb\x8c\xc0\x8c\xb4\x8c\xb7\x8c\xb6\x8c\xbf\x8c\xb8\x8d\x8a\x8d\x85\x8d\x81\x8d\xce\x8d\xdd\x8d\xcb\x8d\xda\x8d\xd1\x8d\xcc\x8d\xdb\x8d\xc6\x8e\xfb\x8e\xf8\x8e\xfc\x8f\x9c\x90\x2e\x90\x35\x90\x31\x90\x38\x90\x32\x90\x36\x91\x02\x90\xf5\x91\x09\x90\xfe\x91\x63\x91\x65\x91\xcf\x92\x14\x92\x15\x92\x23\x92\x09\x92\x1e\x92\x0d\x92\x10", /* 5b80 */ "\x00\x00\x92\x07\x92\x11\x95\x94\x95\x8f\x95\x8b\x95\x91\x95\x93\x95\x92\x95\x8e\x96\x8a\x96\x8e\x96\x8b\x96\x7d\x96\x85\x96\x86\x96\x8d\x96\x72\x96\x84\x96\xc1\x96\xc5\x96\xc4\x96\xc6\x96\xc7\x96\xef\x96\xf2\x97\xcc\x98\x05\x98\x06\x98\x08\x98\xe7\x98\xea\x98\xef\x98\xe9\x98\xf2\x98\xed\x99\xae\x99\xad\x9e\xc3\x9e\xcd\x9e\xd1\x4e\x82\x50\xad\x50\xb5\x50\xb2\x50\xb3\x50\xc5\x50\xbe\x50\xac\x50\xb7\x50\xbb\x50\xaf\x50\xc7\x52\x7f\x52\x77\x52\x7d\x52\xdf\x52\xe6\x52\xe4\x52\xe2\x52\xe3\x53\x2f\x55\xdf\x55\xe8\x55\xd3\x55\xe6\x55\xce\x55\xdc\x55\xc7\x55\xd1\x55\xe3\x55\xe4\x55\xef\x55\xda\x55\xe1\x55\xc5\x55\xc6\x55\xe5\x55\xc9\x57\x12\x57\x13\x58\x5e\x58\x51\x58\x58\x58\x57\x58\x5a\x58\x54\x58\x6b\x58\x4c\x58\x6d\x58\x4a\x58\x62\x58\x52\x58\x4b\x59\x67\x5a\xc1\x5a\xc9\x5a\xcc\x5a\xbe\x5a\xbd\x5a\xbc\x5a\xb3\x5a\xc2\x5a\xb2\x5d\x69\x5d\x6f\x5e\x4c\x5e\x79\x5e\xc9\x5e\xc8\x5f\x12\x5f\x59\x5f\xac\x5f\xae\x61\x1a\x61\x0f\x61\x48\x61\x1f\x60\xf3\x61\x1b\x60\xf9\x61\x01\x61\x08\x61\x4e\x61\x4c\x61\x44\x00\x00\x00\x00", /* 5c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x4d\x61\x3e\x61\x34\x61\x27\x61\x0d\x61\x06\x61\x37\x62\x21\x62\x22\x64\x13\x64\x3e\x64\x1e\x64\x2a\x64\x2d\x64\x3d\x64\x2c\x64\x0f\x64\x1c\x64\x14\x64\x0d\x64\x36\x64\x16\x64\x17\x64\x06\x65\x6c\x65\x9f\x65\xb0\x66\x97\x66\x89\x66\x87\x66\x88\x66\x96\x66\x84\x66\x98\x66\x8d\x67\x03\x69\x94\x69\x6d\x69\x5a\x69\x77\x69\x60\x69\x54\x69\x75\x69\x30\x69\x82\x69\x4a\x69\x68\x69\x6b\x69\x5e\x69\x53\x69\x79\x69\x86\x69\x5d\x69\x63\x69\x5b\x6b\x47\x6b\x72\x6b\xc0\x6b\xbf\x6b\xd3\x6b\xfd\x6e\xa2\x6e\xaf", /* 5c80 */ "\x00\x00\x6e\xd3\x6e\xb6\x6e\xc2\x6e\x90\x6e\x9d\x6e\xc7\x6e\xc5\x6e\xa5\x6e\x98\x6e\xbc\x6e\xba\x6e\xab\x6e\xd1\x6e\x96\x6e\x9c\x6e\xc4\x6e\xd4\x6e\xaa\x6e\xa7\x6e\xb4\x71\x4e\x71\x59\x71\x69\x71\x64\x71\x49\x71\x67\x71\x5c\x71\x6c\x71\x66\x71\x4c\x71\x65\x71\x5e\x71\x46\x71\x68\x71\x56\x72\x3a\x72\x52\x73\x37\x73\x45\x73\x3f\x73\x3e\x74\x6f\x74\x5a\x74\x55\x74\x5f\x74\x5e\x74\x41\x74\x3f\x74\x59\x74\x5b\x74\x5c\x75\x76\x75\x78\x76\x00\x75\xf0\x76\x01\x75\xf2\x75\xf1\x75\xfa\x75\xff\x75\xf4\x75\xf3\x76\xde\x76\xdf\x77\x5b\x77\x6b\x77\x66\x77\x5e\x77\x63\x77\x79\x77\x6a\x77\x6c\x77\x5c\x77\x65\x77\x68\x77\x62\x77\xee\x78\x8e\x78\xb0\x78\x97\x78\x98\x78\x8c\x78\x89\x78\x7c\x78\x91\x78\x93\x78\x7f\x79\x7a\x79\x7f\x79\x81\x84\x2c\x79\xbd\x7a\x1c\x7a\x1a\x7a\x20\x7a\x14\x7a\x1f\x7a\x1e\x7a\x9f\x7a\xa0\x7b\x77\x7b\xc0\x7b\x60\x7b\x6e\x7b\x67\x7c\xb1\x7c\xb3\x7c\xb5\x7d\x93\x7d\x79\x7d\x91\x7d\x81\x7d\x8f\x7d\x5b\x7f\x6e\x7f\x69\x7f\x6a\x7f\x72\x7f\xa9\x7f\xa8\x7f\xa4\x80\x56\x80\x58\x80\x86\x80\x84\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x71\x81\x70\x81\x78\x81\x65\x81\x6e\x81\x73\x81\x6b\x81\x79\x81\x7a\x81\x66\x82\x05\x82\x47\x84\x82\x84\x77\x84\x3d\x84\x31\x84\x75\x84\x66\x84\x6b\x84\x49\x84\x6c\x84\x5b\x84\x3c\x84\x35\x84\x61\x84\x63\x84\x69\x84\x6d\x84\x46\x86\x5e\x86\x5c\x86\x5f\x86\xf9\x87\x13\x87\x08\x87\x07\x87\x00\x86\xfe\x86\xfb\x87\x02\x87\x03\x87\x06\x87\x0a\x88\x59\x88\xdf\x88\xd4\x88\xd9\x88\xdc\x88\xd8\x88\xdd\x88\xe1\x88\xca\x88\xd5\x88\xd2\x89\x9c\x89\xe3\x8a\x6b\x8a\x72\x8a\x73\x8a\x66\x8a\x69\x8a\x70\x8a\x87", /* 5d80 */ "\x00\x00\x8a\x7c\x8a\x63\x8a\xa0\x8a\x71\x8a\x85\x8a\x6d\x8a\x62\x8a\x6e\x8a\x6c\x8a\x79\x8a\x7b\x8a\x3e\x8a\x68\x8c\x62\x8c\x8a\x8c\x89\x8c\xca\x8c\xc7\x8c\xc8\x8c\xc4\x8c\xb2\x8c\xc3\x8c\xc2\x8c\xc5\x8d\xe1\x8d\xdf\x8d\xe8\x8d\xef\x8d\xf3\x8d\xfa\x8d\xea\x8d\xe4\x8d\xe6\x8e\xb2\x8f\x03\x8f\x09\x8e\xfe\x8f\x0a\x8f\x9f\x8f\xb2\x90\x4b\x90\x4a\x90\x53\x90\x42\x90\x54\x90\x3c\x90\x55\x90\x50\x90\x47\x90\x4f\x90\x4e\x90\x4d\x90\x51\x90\x3e\x90\x41\x91\x12\x91\x17\x91\x6c\x91\x6a\x91\x69\x91\xc9\x92\x37\x92\x57\x92\x38\x92\x3d\x92\x40\x92\x3e\x92\x5b\x92\x4b\x92\x64\x92\x51\x92\x34\x92\x49\x92\x4d\x92\x45\x92\x39\x92\x3f\x92\x5a\x95\x98\x96\x98\x96\x94\x96\x95\x96\xcd\x96\xcb\x96\xc9\x96\xca\x96\xf7\x96\xfb\x96\xf9\x96\xf6\x97\x56\x97\x74\x97\x76\x98\x10\x98\x11\x98\x13\x98\x0a\x98\x12\x98\x0c\x98\xfc\x98\xf4\x98\xfd\x98\xfe\x99\xb3\x99\xb1\x99\xb4\x9a\xe1\x9c\xe9\x9e\x82\x9f\x0e\x9f\x13\x9f\x20\x50\xe7\x50\xee\x50\xe5\x50\xd6\x50\xed\x50\xda\x50\xd5\x50\xcf\x50\xd1\x50\xf1\x50\xce\x50\xe9\x51\x62\x00\x00\x00\x00", /* 5e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xf3\x52\x83\x52\x82\x53\x31\x53\xad\x55\xfe\x56\x00\x56\x1b\x56\x17\x55\xfd\x56\x14\x56\x06\x56\x09\x56\x0d\x56\x0e\x55\xf7\x56\x16\x56\x1f\x56\x08\x56\x10\x55\xf6\x57\x18\x57\x16\x58\x75\x58\x7e\x58\x83\x58\x93\x58\x8a\x58\x79\x58\x85\x58\x7d\x58\xfd\x59\x25\x59\x22\x59\x24\x59\x6a\x59\x69\x5a\xe1\x5a\xe6\x5a\xe9\x5a\xd7\x5a\xd6\x5a\xd8\x5a\xe3\x5b\x75\x5b\xde\x5b\xe7\x5b\xe1\x5b\xe5\x5b\xe6\x5b\xe8\x5b\xe2\x5b\xe4\x5b\xdf\x5c\x0d\x5c\x62\x5d\x84\x5d\x87\x5e\x5b\x5e\x63\x5e\x55\x5e\x57\x5e\x54", /* 5e80 */ "\x00\x00\x5e\xd3\x5e\xd6\x5f\x0a\x5f\x46\x5f\x70\x5f\xb9\x61\x47\x61\x3f\x61\x4b\x61\x77\x61\x62\x61\x63\x61\x5f\x61\x5a\x61\x58\x61\x75\x62\x2a\x64\x87\x64\x58\x64\x54\x64\xa4\x64\x78\x64\x5f\x64\x7a\x64\x51\x64\x67\x64\x34\x64\x6d\x64\x7b\x65\x72\x65\xa1\x65\xd7\x65\xd6\x66\xa2\x66\xa8\x66\x9d\x69\x9c\x69\xa8\x69\x95\x69\xc1\x69\xae\x69\xd3\x69\xcb\x69\x9b\x69\xb7\x69\xbb\x69\xab\x69\xb4\x69\xd0\x69\xcd\x69\xad\x69\xcc\x69\xa6\x69\xc3\x69\xa3\x6b\x49\x6b\x4c\x6c\x33\x6f\x33\x6f\x14\x6e\xfe\x6f\x13\x6e\xf4\x6f\x29\x6f\x3e\x6f\x20\x6f\x2c\x6f\x0f\x6f\x02\x6f\x22\x6e\xff\x6e\xef\x6f\x06\x6f\x31\x6f\x38\x6f\x32\x6f\x23\x6f\x15\x6f\x2b\x6f\x2f\x6f\x88\x6f\x2a\x6e\xec\x6f\x01\x6e\xf2\x6e\xcc\x6e\xf7\x71\x94\x71\x99\x71\x7d\x71\x8a\x71\x84\x71\x92\x72\x3e\x72\x92\x72\x96\x73\x44\x73\x50\x74\x64\x74\x63\x74\x6a\x74\x70\x74\x6d\x75\x04\x75\x91\x76\x27\x76\x0d\x76\x0b\x76\x09\x76\x13\x76\xe1\x76\xe3\x77\x84\x77\x7d\x77\x7f\x77\x61\x78\xc1\x78\x9f\x78\xa7\x78\xb3\x78\xa9\x78\xa3\x79\x8e\x79\x8f\x79\x8d\x00\x00\x00\x00", /* 5f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x2e\x7a\x31\x7a\xaa\x7a\xa9\x7a\xed\x7a\xef\x7b\xa1\x7b\x95\x7b\x8b\x7b\x75\x7b\x97\x7b\x9d\x7b\x94\x7b\x8f\x7b\xb8\x7b\x87\x7b\x84\x7c\xb9\x7c\xbd\x7c\xbe\x7d\xbb\x7d\xb0\x7d\x9c\x7d\xbd\x7d\xbe\x7d\xa0\x7d\xca\x7d\xb4\x7d\xb2\x7d\xb1\x7d\xba\x7d\xa2\x7d\xbf\x7d\xb5\x7d\xb8\x7d\xad\x7d\xd2\x7d\xc7\x7d\xac\x7f\x70\x7f\xe0\x7f\xe1\x7f\xdf\x80\x5e\x80\x5a\x80\x87\x81\x50\x81\x80\x81\x8f\x81\x88\x81\x8a\x81\x7f\x81\x82\x81\xe7\x81\xfa\x82\x07\x82\x14\x82\x1e\x82\x4b\x84\xc9\x84\xbf\x84\xc6\x84\xc4", /* 5f80 */ "\x00\x00\x84\x99\x84\x9e\x84\xb2\x84\x9c\x84\xcb\x84\xb8\x84\xc0\x84\xd3\x84\x90\x84\xbc\x84\xd1\x84\xca\x87\x3f\x87\x1c\x87\x3b\x87\x22\x87\x25\x87\x34\x87\x18\x87\x55\x87\x37\x87\x29\x88\xf3\x89\x02\x88\xf4\x88\xf9\x88\xf8\x88\xfd\x88\xe8\x89\x1a\x88\xef\x8a\xa6\x8a\x8c\x8a\x9e\x8a\xa3\x8a\x8d\x8a\xa1\x8a\x93\x8a\xa4\x8a\xaa\x8a\xa5\x8a\xa8\x8a\x98\x8a\x91\x8a\x9a\x8a\xa7\x8c\x6a\x8c\x8d\x8c\x8c\x8c\xd3\x8c\xd1\x8c\xd2\x8d\x6b\x8d\x99\x8d\x95\x8d\xfc\x8f\x14\x8f\x12\x8f\x15\x8f\x13\x8f\xa3\x90\x60\x90\x58\x90\x5c\x90\x63\x90\x59\x90\x5e\x90\x62\x90\x5d\x90\x5b\x91\x19\x91\x18\x91\x1e\x91\x75\x91\x78\x91\x77\x91\x74\x92\x78\x92\x80\x92\x85\x92\x98\x92\x96\x92\x7b\x92\x93\x92\x9c\x92\xa8\x92\x7c\x92\x91\x95\xa1\x95\xa8\x95\xa9\x95\xa3\x95\xa5\x95\xa4\x96\x99\x96\x9c\x96\x9b\x96\xcc\x96\xd2\x97\x00\x97\x7c\x97\x85\x97\xf6\x98\x17\x98\x18\x98\xaf\x98\xb1\x99\x03\x99\x05\x99\x0c\x99\x09\x99\xc1\x9a\xaf\x9a\xb0\x9a\xe6\x9b\x41\x9b\x42\x9c\xf4\x9c\xf6\x9c\xf3\x9e\xbc\x9f\x3b\x9f\x4a\x51\x04\x51\x00\x00\x00\x00\x00", /* 6000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xfb\x50\xf5\x50\xf9\x51\x02\x51\x08\x51\x09\x51\x05\x51\xdc\x52\x87\x52\x88\x52\x89\x52\x8d\x52\x8a\x52\xf0\x53\xb2\x56\x2e\x56\x3b\x56\x39\x56\x32\x56\x3f\x56\x34\x56\x29\x56\x53\x56\x4e\x56\x57\x56\x74\x56\x36\x56\x2f\x56\x30\x58\x80\x58\x9f\x58\x9e\x58\xb3\x58\x9c\x58\xae\x58\xa9\x58\xa6\x59\x6d\x5b\x09\x5a\xfb\x5b\x0b\x5a\xf5\x5b\x0c\x5b\x08\x5b\xee\x5b\xec\x5b\xe9\x5b\xeb\x5c\x64\x5c\x65\x5d\x9d\x5d\x94\x5e\x62\x5e\x5f\x5e\x61\x5e\xe2\x5e\xda\x5e\xdf\x5e\xdd\x5e\xe3\x5e\xe0\x5f\x48\x5f\x71", /* 6080 */ "\x00\x00\x5f\xb7\x5f\xb5\x61\x76\x61\x67\x61\x6e\x61\x5d\x61\x55\x61\x82\x61\x7c\x61\x70\x61\x6b\x61\x7e\x61\xa7\x61\x90\x61\xab\x61\x8e\x61\xac\x61\x9a\x61\xa4\x61\x94\x61\xae\x62\x2e\x64\x69\x64\x6f\x64\x79\x64\x9e\x64\xb2\x64\x88\x64\x90\x64\xb0\x64\xa5\x64\x93\x64\x95\x64\xa9\x64\x92\x64\xae\x64\xad\x64\xab\x64\x9a\x64\xac\x64\x99\x64\xa2\x64\xb3\x65\x75\x65\x77\x65\x78\x66\xae\x66\xab\x66\xb4\x66\xb1\x6a\x23\x6a\x1f\x69\xe8\x6a\x01\x6a\x1e\x6a\x19\x69\xfd\x6a\x21\x6a\x13\x6a\x0a\x69\xf3\x6a\x02\x6a\x05\x69\xed\x6a\x11\x6b\x50\x6b\x4e\x6b\xa4\x6b\xc5\x6b\xc6\x6f\x3f\x6f\x7c\x6f\x84\x6f\x51\x6f\x66\x6f\x54\x6f\x86\x6f\x6d\x6f\x5b\x6f\x78\x6f\x6e\x6f\x8e\x6f\x7a\x6f\x70\x6f\x64\x6f\x97\x6f\x58\x6e\xd5\x6f\x6f\x6f\x60\x6f\x5f\x71\x9f\x71\xac\x71\xb1\x71\xa8\x72\x56\x72\x9b\x73\x4e\x73\x57\x74\x69\x74\x8b\x74\x83\x74\x7e\x74\x80\x75\x7f\x76\x20\x76\x29\x76\x1f\x76\x24\x76\x26\x76\x21\x76\x22\x76\x9a\x76\xba\x76\xe4\x77\x8e\x77\x87\x77\x8c\x77\x91\x77\x8b\x78\xcb\x78\xc5\x78\xba\x78\xca\x78\xbe\x00\x00\x00\x00", /* 6100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\xd5\x78\xbc\x78\xd0\x7a\x3f\x7a\x3c\x7a\x40\x7a\x3d\x7a\x37\x7a\x3b\x7a\xaf\x7a\xae\x7b\xad\x7b\xb1\x7b\xc4\x7b\xb4\x7b\xc6\x7b\xc7\x7b\xc1\x7b\xa0\x7b\xcc\x7c\xca\x7d\xe0\x7d\xf4\x7d\xef\x7d\xfb\x7d\xd8\x7d\xec\x7d\xdd\x7d\xe8\x7d\xe3\x7d\xda\x7d\xde\x7d\xe9\x7d\x9e\x7d\xd9\x7d\xf2\x7d\xf9\x7f\x75\x7f\x77\x7f\xaf\x7f\xe9\x80\x26\x81\x9b\x81\x9c\x81\x9d\x81\xa0\x81\x9a\x81\x98\x85\x17\x85\x3d\x85\x1a\x84\xee\x85\x2c\x85\x2d\x85\x13\x85\x11\x85\x23\x85\x21\x85\x14\x84\xec\x85\x25\x84\xff\x85\x06", /* 6180 */ "\x00\x00\x87\x82\x87\x74\x87\x76\x87\x60\x87\x66\x87\x78\x87\x68\x87\x59\x87\x57\x87\x4c\x87\x53\x88\x5b\x88\x5d\x89\x10\x89\x07\x89\x12\x89\x13\x89\x15\x89\x0a\x8a\xbc\x8a\xd2\x8a\xc7\x8a\xc4\x8a\x95\x8a\xcb\x8a\xf8\x8a\xb2\x8a\xc9\x8a\xc2\x8a\xbf\x8a\xb0\x8a\xd6\x8a\xcd\x8a\xb6\x8a\xb9\x8a\xdb\x8c\x4c\x8c\x4e\x8c\x6c\x8c\xe0\x8c\xde\x8c\xe6\x8c\xe4\x8c\xec\x8c\xed\x8c\xe2\x8c\xe3\x8c\xdc\x8c\xea\x8c\xe1\x8d\x6d\x8d\x9f\x8d\xa3\x8e\x2b\x8e\x10\x8e\x1d\x8e\x22\x8e\x0f\x8e\x29\x8e\x1f\x8e\x21\x8e\x1e\x8e\xba\x8f\x1d\x8f\x1b\x8f\x1f\x8f\x29\x8f\x26\x8f\x2a\x8f\x1c\x8f\x1e\x8f\x25\x90\x69\x90\x6e\x90\x68\x90\x6d\x90\x77\x91\x30\x91\x2d\x91\x27\x91\x31\x91\x87\x91\x89\x91\x8b\x91\x83\x92\xc5\x92\xbb\x92\xb7\x92\xea\x92\xac\x92\xe4\x92\xc1\x92\xb3\x92\xbc\x92\xd2\x92\xc7\x92\xf0\x92\xb2\x95\xad\x95\xb1\x97\x04\x97\x06\x97\x07\x97\x09\x97\x60\x97\x8d\x97\x8b\x97\x8f\x98\x21\x98\x2b\x98\x1c\x98\xb3\x99\x0a\x99\x13\x99\x12\x99\x18\x99\xdd\x99\xd0\x99\xdf\x99\xdb\x99\xd1\x99\xd5\x99\xd2\x99\xd9\x9a\xb7\x00\x00\x00\x00", /* 6200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xee\x9a\xef\x9b\x27\x9b\x45\x9b\x44\x9b\x77\x9b\x6f\x9d\x06\x9d\x09\x9d\x03\x9e\xa9\x9e\xbe\x9e\xce\x58\xa8\x9f\x52\x51\x12\x51\x18\x51\x14\x51\x10\x51\x15\x51\x80\x51\xaa\x51\xdd\x52\x91\x52\x93\x52\xf3\x56\x59\x56\x6b\x56\x79\x56\x69\x56\x64\x56\x78\x56\x6a\x56\x68\x56\x65\x56\x71\x56\x6f\x56\x6c\x56\x62\x56\x76\x58\xc1\x58\xbe\x58\xc7\x58\xc5\x59\x6e\x5b\x1d\x5b\x34\x5b\x78\x5b\xf0\x5c\x0e\x5f\x4a\x61\xb2\x61\x91\x61\xa9\x61\x8a\x61\xcd\x61\xb6\x61\xbe\x61\xca\x61\xc8\x62\x30\x64\xc5\x64\xc1", /* 6280 */ "\x00\x00\x64\xcb\x64\xbb\x64\xbc\x64\xda\x64\xc4\x64\xc7\x64\xc2\x64\xcd\x64\xbf\x64\xd2\x64\xd4\x64\xbe\x65\x74\x66\xc6\x66\xc9\x66\xb9\x66\xc4\x66\xc7\x66\xb8\x6a\x3d\x6a\x38\x6a\x3a\x6a\x59\x6a\x6b\x6a\x58\x6a\x39\x6a\x44\x6a\x62\x6a\x61\x6a\x4b\x6a\x47\x6a\x35\x6a\x5f\x6a\x48\x6b\x59\x6b\x77\x6c\x05\x6f\xc2\x6f\xb1\x6f\xa1\x6f\xc3\x6f\xa4\x6f\xc1\x6f\xa7\x6f\xb3\x6f\xc0\x6f\xb9\x6f\xb6\x6f\xa6\x6f\xa0\x6f\xb4\x71\xbe\x71\xc9\x71\xd0\x71\xd2\x71\xc8\x71\xd5\x71\xb9\x71\xce\x71\xd9\x71\xdc\x71\xc3\x71\xc4\x73\x68\x74\x9c\x74\xa3\x74\x98\x74\x9f\x74\x9e\x74\xe2\x75\x0c\x75\x0d\x76\x34\x76\x38\x76\x3a\x76\xe7\x76\xe5\x77\xa0\x77\x9e\x77\x9f\x77\xa5\x78\xe8\x78\xda\x78\xec\x78\xe7\x79\xa6\x7a\x4d\x7a\x4e\x7a\x46\x7a\x4c\x7a\x4b\x7a\xba\x7b\xd9\x7c\x11\x7b\xc9\x7b\xe4\x7b\xdb\x7b\xe1\x7b\xe9\x7b\xe6\x7c\xd5\x7c\xd6\x7e\x0a\x7e\x11\x7e\x08\x7e\x1b\x7e\x23\x7e\x1e\x7e\x1d\x7e\x09\x7e\x10\x7f\x79\x7f\xb2\x7f\xf0\x7f\xf1\x7f\xee\x80\x28\x81\xb3\x81\xa9\x81\xa8\x81\xfb\x82\x08\x82\x58\x82\x59\x85\x4a\x00\x00\x00\x00", /* 6300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x59\x85\x48\x85\x68\x85\x69\x85\x43\x85\x49\x85\x6d\x85\x6a\x85\x5e\x87\x83\x87\x9f\x87\x9e\x87\xa2\x87\x8d\x88\x61\x89\x2a\x89\x32\x89\x25\x89\x2b\x89\x21\x89\xaa\x89\xa6\x8a\xe6\x8a\xfa\x8a\xeb\x8a\xf1\x8b\x00\x8a\xdc\x8a\xe7\x8a\xee\x8a\xfe\x8b\x01\x8b\x02\x8a\xf7\x8a\xed\x8a\xf3\x8a\xf6\x8a\xfc\x8c\x6b\x8c\x6d\x8c\x93\x8c\xf4\x8e\x44\x8e\x31\x8e\x34\x8e\x42\x8e\x39\x8e\x35\x8f\x3b\x8f\x2f\x8f\x38\x8f\x33\x8f\xa8\x8f\xa6\x90\x75\x90\x74\x90\x78\x90\x72\x90\x7c\x90\x7a\x91\x34\x91\x92\x93\x20", /* 6380 */ "\x00\x00\x93\x36\x92\xf8\x93\x33\x93\x2f\x93\x22\x92\xfc\x93\x2b\x93\x04\x93\x1a\x93\x10\x93\x26\x93\x21\x93\x15\x93\x2e\x93\x19\x95\xbb\x96\xa7\x96\xa8\x96\xaa\x96\xd5\x97\x0e\x97\x11\x97\x16\x97\x0d\x97\x13\x97\x0f\x97\x5b\x97\x5c\x97\x66\x97\x98\x98\x30\x98\x38\x98\x3b\x98\x37\x98\x2d\x98\x39\x98\x24\x99\x10\x99\x28\x99\x1e\x99\x1b\x99\x21\x99\x1a\x99\xed\x99\xe2\x99\xf1\x9a\xb8\x9a\xbc\x9a\xfb\x9a\xed\x9b\x28\x9b\x91\x9d\x15\x9d\x23\x9d\x26\x9d\x28\x9d\x12\x9d\x1b\x9e\xd8\x9e\xd4\x9f\x8d\x9f\x9c\x51\x2a\x51\x1f\x51\x21\x51\x32\x52\xf5\x56\x8e\x56\x80\x56\x90\x56\x85\x56\x87\x56\x8f\x58\xd5\x58\xd3\x58\xd1\x58\xce\x5b\x30\x5b\x2a\x5b\x24\x5b\x7a\x5c\x37\x5c\x68\x5d\xbc\x5d\xba\x5d\xbd\x5d\xb8\x5e\x6b\x5f\x4c\x5f\xbd\x61\xc9\x61\xc2\x61\xc7\x61\xe6\x61\xcb\x62\x32\x62\x34\x64\xce\x64\xca\x64\xd8\x64\xe0\x64\xf0\x64\xe6\x64\xec\x64\xf1\x64\xe2\x64\xed\x65\x82\x65\x83\x66\xd9\x66\xd6\x6a\x80\x6a\x94\x6a\x84\x6a\xa2\x6a\x9c\x6a\xdb\x6a\xa3\x6a\x7e\x6a\x97\x6a\x90\x6a\xa0\x6b\x5c\x6b\xae\x6b\xda\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x08\x6f\xd8\x6f\xf1\x6f\xdf\x6f\xe0\x6f\xdb\x6f\xe4\x6f\xeb\x6f\xef\x6f\x80\x6f\xec\x6f\xe1\x6f\xe9\x6f\xd5\x6f\xee\x6f\xf0\x71\xe7\x71\xdf\x71\xee\x71\xe6\x71\xe5\x71\xed\x71\xec\x71\xf4\x71\xe0\x72\x35\x72\x46\x73\x70\x73\x72\x74\xa9\x74\xb0\x74\xa6\x74\xa8\x76\x46\x76\x42\x76\x4c\x76\xea\x77\xb3\x77\xaa\x77\xb0\x77\xac\x77\xa7\x77\xad\x77\xef\x78\xf7\x78\xfa\x78\xf4\x78\xef\x79\x01\x79\xa7\x79\xaa\x7a\x57\x7a\xbf\x7c\x07\x7c\x0d\x7b\xfe\x7b\xf7\x7c\x0c\x7b\xe0\x7c\xe0\x7c\xdc\x7c\xde\x7c\xe2", /* 6480 */ "\x00\x00\x7c\xdf\x7c\xd9\x7c\xdd\x7e\x2e\x7e\x3e\x7e\x46\x7e\x37\x7e\x32\x7e\x43\x7e\x2b\x7e\x3d\x7e\x31\x7e\x45\x7e\x41\x7e\x34\x7e\x39\x7e\x48\x7e\x35\x7e\x3f\x7e\x2f\x7f\x44\x7f\xf3\x7f\xfc\x80\x71\x80\x72\x80\x70\x80\x6f\x80\x73\x81\xc6\x81\xc3\x81\xba\x81\xc2\x81\xc0\x81\xbf\x81\xbd\x81\xc9\x81\xbe\x81\xe8\x82\x09\x82\x71\x85\xaa\x85\x84\x85\x7e\x85\x9c\x85\x91\x85\x94\x85\xaf\x85\x9b\x85\x87\x85\xa8\x85\x8a\x86\x67\x87\xc0\x87\xd1\x87\xb3\x87\xd2\x87\xc6\x87\xab\x87\xbb\x87\xba\x87\xc8\x87\xcb\x89\x3b\x89\x36\x89\x44\x89\x38\x89\x3d\x89\xac\x8b\x0e\x8b\x17\x8b\x19\x8b\x1b\x8b\x0a\x8b\x20\x8b\x1d\x8b\x04\x8b\x10\x8c\x41\x8c\x3f\x8c\x73\x8c\xfa\x8c\xfd\x8c\xfc\x8c\xf8\x8c\xfb\x8d\xa8\x8e\x49\x8e\x4b\x8e\x48\x8e\x4a\x8f\x44\x8f\x3e\x8f\x42\x8f\x45\x8f\x3f\x90\x7f\x90\x7d\x90\x84\x90\x81\x90\x82\x90\x80\x91\x39\x91\xa3\x91\x9e\x91\x9c\x93\x4d\x93\x82\x93\x28\x93\x75\x93\x4a\x93\x65\x93\x4b\x93\x18\x93\x7e\x93\x6c\x93\x5b\x93\x70\x93\x5a\x93\x54\x95\xca\x95\xcb\x95\xcc\x95\xc8\x95\xc6\x96\xb1\x00\x00\x00\x00", /* 6500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xb8\x96\xd6\x97\x1c\x97\x1e\x97\xa0\x97\xd3\x98\x46\x98\xb6\x99\x35\x9a\x01\x99\xff\x9b\xae\x9b\xab\x9b\xaa\x9b\xad\x9d\x3b\x9d\x3f\x9e\x8b\x9e\xcf\x9e\xde\x9e\xdc\x9e\xdd\x9e\xdb\x9f\x3e\x9f\x4b\x53\xe2\x56\x95\x56\xae\x58\xd9\x58\xd8\x5b\x38\x5f\x5e\x61\xe3\x62\x33\x64\xf4\x64\xf2\x64\xfe\x65\x06\x64\xfa\x64\xfb\x64\xf7\x65\xb7\x66\xdc\x67\x26\x6a\xb3\x6a\xac\x6a\xc3\x6a\xbb\x6a\xb8\x6a\xc2\x6a\xae\x6a\xaf\x6b\x5f\x6b\x78\x6b\xaf\x70\x09\x70\x0b\x6f\xfe\x70\x06\x6f\xfa\x70\x11\x70\x0f\x71\xfb", /* 6580 */ "\x00\x00\x71\xfc\x71\xfe\x71\xf8\x73\x77\x73\x75\x74\xa7\x74\xbf\x75\x15\x76\x56\x76\x58\x76\x52\x77\xbd\x77\xbf\x77\xbb\x77\xbc\x79\x0e\x79\xae\x7a\x61\x7a\x62\x7a\x60\x7a\xc4\x7a\xc5\x7c\x2b\x7c\x27\x7c\x2a\x7c\x1e\x7c\x23\x7c\x21\x7c\xe7\x7e\x54\x7e\x55\x7e\x5e\x7e\x5a\x7e\x61\x7e\x52\x7e\x59\x7f\x48\x7f\xf9\x7f\xfb\x80\x77\x80\x76\x81\xcd\x81\xcf\x82\x0a\x85\xcf\x85\xa9\x85\xcd\x85\xd0\x85\xc9\x85\xb0\x85\xba\x85\xb9\x85\xa6\x87\xef\x87\xec\x87\xf2\x87\xe0\x89\x86\x89\xb2\x89\xf4\x8b\x28\x8b\x39\x8b\x2c\x8b\x2b\x8c\x50\x8d\x05\x8e\x59\x8e\x63\x8e\x66\x8e\x64\x8e\x5f\x8e\x55\x8e\xc0\x8f\x49\x8f\x4d\x90\x87\x90\x83\x90\x88\x91\xab\x91\xac\x91\xd0\x93\x94\x93\x8a\x93\x96\x93\xa2\x93\xb3\x93\xae\x93\xac\x93\xb0\x93\x98\x93\x9a\x93\x97\x95\xd4\x95\xd6\x95\xd0\x95\xd5\x96\xe2\x96\xdc\x96\xd9\x96\xdb\x96\xde\x97\x24\x97\xa3\x97\xa6\x97\xad\x97\xf9\x98\x4d\x98\x4f\x98\x4c\x98\x4e\x98\x53\x98\xba\x99\x3e\x99\x3f\x99\x3d\x99\x2e\x99\xa5\x9a\x0e\x9a\xc1\x9b\x03\x9b\x06\x9b\x4f\x9b\x4e\x9b\x4d\x9b\xca\x00\x00\x00\x00", /* 6600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xc9\x9b\xfd\x9b\xc8\x9b\xc0\x9d\x51\x9d\x5d\x9d\x60\x9e\xe0\x9f\x15\x9f\x2c\x51\x33\x56\xa5\x58\xde\x58\xdf\x58\xe2\x5b\xf5\x9f\x90\x5e\xec\x61\xf2\x61\xf7\x61\xf6\x61\xf5\x65\x00\x65\x0f\x66\xe0\x66\xdd\x6a\xe5\x6a\xdd\x6a\xda\x6a\xd3\x70\x1b\x70\x1f\x70\x28\x70\x1a\x70\x1d\x70\x15\x70\x18\x72\x06\x72\x0d\x72\x58\x72\xa2\x73\x78\x73\x7a\x74\xbd\x74\xca\x74\xe3\x75\x87\x75\x86\x76\x5f\x76\x61\x77\xc7\x79\x19\x79\xb1\x7a\x6b\x7a\x69\x7c\x3e\x7c\x3f\x7c\x38\x7c\x3d\x7c\x37\x7c\x40\x7e\x6b\x7e\x6d", /* 6680 */ "\x00\x00\x7e\x79\x7e\x69\x7e\x6a\x7f\x85\x7e\x73\x7f\xb6\x7f\xb9\x7f\xb8\x81\xd8\x85\xe9\x85\xdd\x85\xea\x85\xd5\x85\xe4\x85\xe5\x85\xf7\x87\xfb\x88\x05\x88\x0d\x87\xf9\x87\xfe\x89\x60\x89\x5f\x89\x56\x89\x5e\x8b\x41\x8b\x5c\x8b\x58\x8b\x49\x8b\x5a\x8b\x4e\x8b\x4f\x8b\x46\x8b\x59\x8d\x08\x8d\x0a\x8e\x7c\x8e\x72\x8e\x87\x8e\x76\x8e\x6c\x8e\x7a\x8e\x74\x8f\x54\x8f\x4e\x8f\xad\x90\x8a\x90\x8b\x91\xb1\x91\xae\x93\xe1\x93\xd1\x93\xdf\x93\xc3\x93\xc8\x93\xdc\x93\xdd\x93\xd6\x93\xe2\x93\xcd\x93\xd8\x93\xe4\x93\xd7\x93\xe8\x95\xdc\x96\xb4\x96\xe3\x97\x2a\x97\x27\x97\x61\x97\xdc\x97\xfb\x98\x5e\x98\x58\x98\x5b\x98\xbc\x99\x45\x99\x49\x9a\x16\x9a\x19\x9b\x0d\x9b\xe8\x9b\xe7\x9b\xd6\x9b\xdb\x9d\x89\x9d\x61\x9d\x72\x9d\x6a\x9d\x6c\x9e\x92\x9e\x97\x9e\x93\x9e\xb4\x52\xf8\x56\xa8\x56\xb7\x56\xb6\x56\xb4\x56\xbc\x58\xe4\x5b\x40\x5b\x43\x5b\x7d\x5b\xf6\x5d\xc9\x61\xf8\x61\xfa\x65\x18\x65\x14\x65\x19\x66\xe6\x67\x27\x6a\xec\x70\x3e\x70\x30\x70\x32\x72\x10\x73\x7b\x74\xcf\x76\x62\x76\x65\x79\x26\x79\x2a\x79\x2c\x00\x00\x00\x00", /* 6700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x2b\x7a\xc7\x7a\xf6\x7c\x4c\x7c\x43\x7c\x4d\x7c\xef\x7c\xf0\x8f\xae\x7e\x7d\x7e\x7c\x7e\x82\x7f\x4c\x80\x00\x81\xda\x82\x66\x85\xfb\x85\xf9\x86\x11\x85\xfa\x86\x06\x86\x0b\x86\x07\x86\x0a\x88\x14\x88\x15\x89\x64\x89\xba\x89\xf8\x8b\x70\x8b\x6c\x8b\x66\x8b\x6f\x8b\x5f\x8b\x6b\x8d\x0f\x8d\x0d\x8e\x89\x8e\x81\x8e\x85\x8e\x82\x91\xb4\x91\xcb\x94\x18\x94\x03\x93\xfd\x95\xe1\x97\x30\x98\xc4\x99\x52\x99\x51\x99\xa8\x9a\x2b\x9a\x30\x9a\x37\x9a\x35\x9c\x13\x9c\x0d\x9e\x79\x9e\xb5\x9e\xe8\x9f\x2f\x9f\x5f", /* 6780 */ "\x00\x00\x9f\x63\x9f\x61\x51\x37\x51\x38\x56\xc1\x56\xc0\x56\xc2\x59\x14\x5c\x6c\x5d\xcd\x61\xfc\x61\xfe\x65\x1d\x65\x1c\x65\x95\x66\xe9\x6a\xfb\x6b\x04\x6a\xfa\x6b\xb2\x70\x4c\x72\x1b\x72\xa7\x74\xd6\x74\xd4\x76\x69\x77\xd3\x7c\x50\x7e\x8f\x7e\x8c\x7f\xbc\x86\x17\x86\x2d\x86\x1a\x88\x23\x88\x22\x88\x21\x88\x1f\x89\x6a\x89\x6c\x89\xbd\x8b\x74\x8b\x77\x8b\x7d\x8d\x13\x8e\x8a\x8e\x8d\x8e\x8b\x8f\x5f\x8f\xaf\x91\xba\x94\x2e\x94\x33\x94\x35\x94\x3a\x94\x38\x94\x32\x94\x2b\x95\xe2\x97\x38\x97\x39\x97\x32\x97\xff\x98\x67\x98\x65\x99\x57\x9a\x45\x9a\x43\x9a\x40\x9a\x3e\x9a\xcf\x9b\x54\x9b\x51\x9c\x2d\x9c\x25\x9d\xaf\x9d\xb4\x9d\xc2\x9d\xb8\x9e\x9d\x9e\xef\x9f\x19\x9f\x5c\x9f\x66\x9f\x67\x51\x3c\x51\x3b\x56\xc8\x56\xca\x56\xc9\x5b\x7f\x5d\xd4\x5d\xd2\x5f\x4e\x61\xff\x65\x24\x6b\x0a\x6b\x61\x70\x51\x70\x58\x73\x80\x74\xe4\x75\x8a\x76\x6e\x76\x6c\x79\xb3\x7c\x60\x7c\x5f\x80\x7e\x80\x7d\x81\xdf\x89\x72\x89\x6f\x89\xfc\x8b\x80\x8d\x16\x8d\x17\x8e\x91\x8e\x93\x8f\x61\x91\x48\x94\x44\x94\x51\x94\x52\x97\x3d\x00\x00\x00\x00", /* 6800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x3e\x97\xc3\x97\xc1\x98\x6b\x99\x55\x9a\x55\x9a\x4d\x9a\xd2\x9b\x1a\x9c\x49\x9c\x31\x9c\x3e\x9c\x3b\x9d\xd3\x9d\xd7\x9f\x34\x9f\x6c\x9f\x6a\x9f\x94\x56\xcc\x5d\xd6\x62\x00\x65\x23\x65\x2b\x65\x2a\x66\xec\x6b\x10\x74\xda\x7a\xca\x7c\x64\x7c\x63\x7c\x65\x7e\x93\x7e\x96\x7e\x94\x81\xe2\x86\x38\x86\x3f\x88\x31\x8b\x8a\x90\x90\x90\x8f\x94\x63\x94\x60\x94\x64\x97\x68\x98\x6f\x99\x5c\x9a\x5a\x9a\x5b\x9a\x57\x9a\xd3\x9a\xd4\x9a\xd1\x9c\x54\x9c\x57\x9c\x56\x9d\xe5\x9e\x9f\x9e\xf4\x56\xd1\x58\xe9\x65\x2c", /* 6880 */ "\x00\x00\x70\x5e\x76\x71\x76\x72\x77\xd7\x7f\x50\x7f\x88\x88\x36\x88\x39\x88\x62\x8b\x93\x8b\x92\x8b\x96\x82\x77\x8d\x1b\x91\xc0\x94\x6a\x97\x42\x97\x48\x97\x44\x97\xc6\x98\x70\x9a\x5f\x9b\x22\x9b\x58\x9c\x5f\x9d\xf9\x9d\xfa\x9e\x7c\x9e\x7d\x9f\x07\x9f\x77\x9f\x72\x5e\xf3\x6b\x16\x70\x63\x7c\x6c\x7c\x6e\x88\x3b\x89\xc0\x8e\xa1\x91\xc1\x94\x72\x94\x70\x98\x71\x99\x5e\x9a\xd6\x9b\x23\x9e\xcc\x70\x64\x77\xda\x8b\x9a\x94\x77\x97\xc9\x9a\x62\x9a\x65\x7e\x9c\x8b\x9c\x8e\xaa\x91\xc5\x94\x7d\x94\x7e\x94\x7c\x9c\x77\x9c\x78\x9e\xf7\x8c\x54\x94\x7f\x9e\x1a\x72\x28\x9a\x6a\x9b\x31\x9e\x1b\x9e\x1e\x7c\x72\x64\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x42\x4e\x5c\x51\xf5\x53\x1a\x53\x82\x4e\x07\x4e\x0c\x4e\x47\x4e\x8d\x56\xd7\xfa\x0c\x5c\x6e\x5f\x73\x4e\x0f\x51\x87\x4e\x0e\x4e\x2e\x4e\x93\x4e\xc2\x4e\xc9\x4e\xc8\x51\x98\x52\xfc\x53\x6c\x53\xb9\x57\x20\x59\x03\x59\x2c\x5c\x10\x5d\xff\x65\xe1\x6b\xb3\x6b\xcc\x6c\x14\x72\x3f\x4e\x31\x4e\x3c\x4e\xe8\x4e\xdc\x4e\xe9\x4e\xe1\x4e\xdd\x4e\xda\x52\x0c\x53\x1c\x53\x4c\x57\x22\x57\x23\x59\x17\x59\x2f\x5b\x81\x5b\x84\x5c\x12\x5c\x3b\x5c\x74\x5c\x73\x5e\x04\x5e\x80\x5e\x82\x5f\xc9\x62\x09\x62\x50\x6c\x15", /* 6980 */ "\x00\x00\x6c\x36\x6c\x43\x6c\x3f\x6c\x3b\x72\xae\x72\xb0\x73\x8a\x79\xb8\x80\x8a\x96\x1e\x4f\x0e\x4f\x18\x4f\x2c\x4e\xf5\x4f\x14\x4e\xf1\x4f\x00\x4e\xf7\x4f\x08\x4f\x1d\x4f\x02\x4f\x05\x4f\x22\x4f\x13\x4f\x04\x4e\xf4\x4f\x12\x51\xb1\x52\x13\x52\x09\x52\x10\x52\xa6\x53\x22\x53\x1f\x53\x4d\x53\x8a\x54\x07\x56\xe1\x56\xdf\x57\x2e\x57\x2a\x57\x34\x59\x3c\x59\x80\x59\x7c\x59\x85\x59\x7b\x59\x7e\x59\x77\x59\x7f\x5b\x56\x5c\x15\x5c\x25\x5c\x7c\x5c\x7a\x5c\x7b\x5c\x7e\x5d\xdf\x5e\x75\x5e\x84\x5f\x02\x5f\x1a\x5f\x74\x5f\xd5\x5f\xd4\x5f\xcf\x62\x65\x62\x5c\x62\x5e\x62\x64\x62\x61\x62\x66\x62\x62\x62\x59\x62\x60\x62\x5a\x65\xef\x65\xee\x67\x3e\x67\x39\x67\x38\x67\x3b\x67\x3a\x67\x3f\x67\x3c\x67\x33\x6c\x18\x6c\x46\x6c\x52\x6c\x5c\x6c\x4f\x6c\x4a\x6c\x54\x6c\x4b\x6c\x4c\x70\x71\x72\x5e\x72\xb4\x72\xb5\x73\x8e\x75\x2a\x76\x7f\x7a\x75\x7f\x51\x82\x78\x82\x7c\x82\x80\x82\x7d\x82\x7f\x86\x4d\x89\x7e\x90\x99\x90\x97\x90\x98\x90\x9b\x90\x94\x96\x22\x96\x24\x96\x20\x96\x23\x4f\x56\x4f\x3b\x4f\x62\x4f\x49\x4f\x53\x00\x00\x00\x00", /* 6a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x64\x4f\x3e\x4f\x67\x4f\x52\x4f\x5f\x4f\x41\x4f\x58\x4f\x2d\x4f\x33\x4f\x3f\x4f\x61\x51\x8f\x51\xb9\x52\x1c\x52\x1e\x52\x21\x52\xad\x52\xae\x53\x09\x53\x63\x53\x72\x53\x8e\x53\x8f\x54\x30\x54\x37\x54\x2a\x54\x54\x54\x45\x54\x19\x54\x1c\x54\x25\x54\x18\x54\x3d\x54\x4f\x54\x41\x54\x28\x54\x24\x54\x47\x56\xee\x56\xe7\x56\xe5\x57\x41\x57\x45\x57\x4c\x57\x49\x57\x4b\x57\x52\x59\x06\x59\x40\x59\xa6\x59\x98\x59\xa0\x59\x97\x59\x8e\x59\xa2\x59\x90\x59\x8f\x59\xa7\x59\xa1\x5b\x8e\x5b\x92\x5c\x28\x5c\x2a", /* 6a80 */ "\x00\x00\x5c\x8d\x5c\x8f\x5c\x88\x5c\x8b\x5c\x89\x5c\x92\x5c\x8a\x5c\x86\x5c\x93\x5c\x95\x5d\xe0\x5e\x0a\x5e\x0e\x5e\x8b\x5e\x89\x5e\x8c\x5e\x88\x5e\x8d\x5f\x05\x5f\x1d\x5f\x78\x5f\x76\x5f\xd2\x5f\xd1\x5f\xd0\x5f\xed\x5f\xe8\x5f\xee\x5f\xf3\x5f\xe1\x5f\xe4\x5f\xe3\x5f\xfa\x5f\xef\x5f\xf7\x5f\xfb\x60\x00\x5f\xf4\x62\x3a\x62\x83\x62\x8c\x62\x8e\x62\x8f\x62\x94\x62\x87\x62\x71\x62\x7b\x62\x7a\x62\x70\x62\x81\x62\x88\x62\x77\x62\x7d\x62\x72\x62\x74\x65\x37\x65\xf0\x65\xf4\x65\xf3\x65\xf2\x65\xf5\x67\x45\x67\x47\x67\x59\x67\x55\x67\x4c\x67\x48\x67\x5d\x67\x4d\x67\x5a\x67\x4b\x6b\xd0\x6c\x19\x6c\x1a\x6c\x78\x6c\x67\x6c\x6b\x6c\x84\x6c\x8b\x6c\x8f\x6c\x71\x6c\x6f\x6c\x69\x6c\x9a\x6c\x6d\x6c\x87\x6c\x95\x6c\x9c\x6c\x66\x6c\x73\x6c\x65\x6c\x7b\x6c\x8e\x70\x74\x70\x7a\x72\x63\x72\xbf\x72\xbd\x72\xc3\x72\xc6\x72\xc1\x72\xba\x72\xc5\x73\x95\x73\x97\x73\x93\x73\x94\x73\x92\x75\x3a\x75\x39\x75\x94\x75\x95\x76\x81\x79\x3d\x80\x34\x80\x95\x80\x99\x80\x90\x80\x92\x80\x9c\x82\x90\x82\x8f\x82\x85\x82\x8e\x82\x91\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x93\x82\x8a\x82\x83\x82\x84\x8c\x78\x8f\xc9\x8f\xbf\x90\x9f\x90\xa1\x90\xa5\x90\x9e\x90\xa7\x90\xa0\x96\x30\x96\x28\x96\x2f\x96\x2d\x4e\x33\x4f\x98\x4f\x7c\x4f\x85\x4f\x7d\x4f\x80\x4f\x87\x4f\x76\x4f\x74\x4f\x89\x4f\x84\x4f\x77\x4f\x4c\x4f\x97\x4f\x6a\x4f\x9a\x4f\x79\x4f\x81\x4f\x78\x4f\x90\x4f\x9c\x4f\x94\x4f\x9e\x4f\x92\x4f\x82\x4f\x95\x4f\x6b\x4f\x6e\x51\x9e\x51\xbc\x51\xbe\x52\x35\x52\x32\x52\x33\x52\x46\x52\x31\x52\xbc\x53\x0a\x53\x0b\x53\x3c\x53\x92\x53\x94\x54\x87\x54\x7f\x54\x81\x54\x91", /* 6b80 */ "\x00\x00\x54\x82\x54\x88\x54\x6b\x54\x7a\x54\x7e\x54\x65\x54\x6c\x54\x74\x54\x66\x54\x8d\x54\x6f\x54\x61\x54\x60\x54\x98\x54\x63\x54\x67\x54\x64\x56\xf7\x56\xf9\x57\x6f\x57\x72\x57\x6d\x57\x6b\x57\x71\x57\x70\x57\x76\x57\x80\x57\x75\x57\x7b\x57\x73\x57\x74\x57\x62\x57\x68\x57\x7d\x59\x0c\x59\x45\x59\xb5\x59\xba\x59\xcf\x59\xce\x59\xb2\x59\xcc\x59\xc1\x59\xb6\x59\xbc\x59\xc3\x59\xd6\x59\xb1\x59\xbd\x59\xc0\x59\xc8\x59\xb4\x59\xc7\x5b\x62\x5b\x65\x5b\x93\x5b\x95\x5c\x44\x5c\x47\x5c\xae\x5c\xa4\x5c\xa0\x5c\xb5\x5c\xaf\x5c\xa8\x5c\xac\x5c\x9f\x5c\xa3\x5c\xad\x5c\xa2\x5c\xaa\x5c\xa7\x5c\x9d\x5c\xa5\x5c\xb6\x5c\xb0\x5c\xa6\x5e\x17\x5e\x14\x5e\x19\x5f\x28\x5f\x22\x5f\x23\x5f\x24\x5f\x54\x5f\x82\x5f\x7e\x5f\x7d\x5f\xde\x5f\xe5\x60\x2d\x60\x26\x60\x19\x60\x32\x60\x0b\x60\x34\x60\x0a\x60\x17\x60\x33\x60\x1a\x60\x1e\x60\x2c\x60\x22\x60\x0d\x60\x10\x60\x2e\x60\x13\x60\x11\x60\x0c\x60\x09\x60\x1c\x62\x14\x62\x3d\x62\xad\x62\xb4\x62\xd1\x62\xbe\x62\xaa\x62\xb6\x62\xca\x62\xae\x62\xb3\x62\xaf\x62\xbb\x62\xa9\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xb0\x62\xb8\x65\x3d\x65\xa8\x65\xbb\x66\x09\x65\xfc\x66\x04\x66\x12\x66\x08\x65\xfb\x66\x03\x66\x0b\x66\x0d\x66\x05\x65\xfd\x66\x11\x66\x10\x66\xf6\x67\x0a\x67\x85\x67\x6c\x67\x8e\x67\x92\x67\x76\x67\x7b\x67\x98\x67\x86\x67\x84\x67\x74\x67\x8d\x67\x8c\x67\x7a\x67\x9f\x67\x91\x67\x99\x67\x83\x67\x7d\x67\x81\x67\x78\x67\x79\x67\x94\x6b\x25\x6b\x80\x6b\x7e\x6b\xde\x6c\x1d\x6c\x93\x6c\xec\x6c\xeb\x6c\xee\x6c\xd9\x6c\xb6\x6c\xd4\x6c\xad\x6c\xe7\x6c\xb7\x6c\xd0\x6c\xc2\x6c\xba\x6c\xc3\x6c\xc6\x6c\xed", /* 6c80 */ "\x00\x00\x6c\xf2\x6c\xd2\x6c\xdd\x6c\xb4\x6c\x8a\x6c\x9d\x6c\x80\x6c\xde\x6c\xc0\x6d\x30\x6c\xcd\x6c\xc7\x6c\xb0\x6c\xf9\x6c\xcf\x6c\xe9\x6c\xd1\x70\x94\x70\x98\x70\x85\x70\x93\x70\x86\x70\x84\x70\x91\x70\x96\x70\x82\x70\x9a\x70\x83\x72\x6a\x72\xd6\x72\xcb\x72\xd8\x72\xc9\x72\xdc\x72\xd2\x72\xd4\x72\xda\x72\xcc\x72\xd1\x73\xa4\x73\xa1\x73\xad\x73\xa6\x73\xa2\x73\xa0\x73\xac\x73\x9d\x74\xdd\x74\xe8\x75\x3f\x75\x40\x75\x3e\x75\x8c\x75\x98\x76\xaf\x76\xf3\x76\xf1\x76\xf0\x76\xf5\x77\xf8\x77\xfc\x77\xf9\x77\xfb\x77\xfa\x77\xf7\x79\x42\x79\x3f\x79\xc5\x7a\x78\x7a\x7b\x7a\xfb\x7c\x75\x7c\xfd\x80\x35\x80\x8f\x80\xae\x80\xa3\x80\xb8\x80\xb5\x80\xad\x82\x20\x82\xa0\x82\xc0\x82\xab\x82\x9a\x82\x98\x82\x9b\x82\xb5\x82\xa7\x82\xae\x82\xbc\x82\x9e\x82\xba\x82\xb4\x82\xa8\x82\xa1\x82\xa9\x82\xc2\x82\xa4\x82\xc3\x82\xb6\x82\xa2\x86\x70\x86\x6f\x86\x6d\x86\x6e\x8c\x56\x8f\xd2\x8f\xcb\x8f\xd3\x8f\xcd\x8f\xd6\x8f\xd5\x8f\xd7\x90\xb2\x90\xb4\x90\xaf\x90\xb3\x90\xb0\x96\x39\x96\x3d\x96\x3c\x96\x3a\x96\x43\x4f\xcd\x00\x00\x00\x00", /* 6d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xc5\x4f\xd3\x4f\xb2\x4f\xc9\x4f\xcb\x4f\xc1\x4f\xd4\x4f\xdc\x4f\xd9\x4f\xbb\x4f\xb3\x4f\xdb\x4f\xc7\x4f\xd6\x4f\xba\x4f\xc0\x4f\xb9\x4f\xec\x52\x44\x52\x49\x52\xc0\x52\xc2\x53\x3d\x53\x7c\x53\x97\x53\x96\x53\x99\x53\x98\x54\xba\x54\xa1\x54\xad\x54\xa5\x54\xcf\x54\xc3\x83\x0d\x54\xb7\x54\xae\x54\xd6\x54\xb6\x54\xc5\x54\xc6\x54\xa0\x54\x70\x54\xbc\x54\xa2\x54\xbe\x54\x72\x54\xde\x54\xb0\x57\xb5\x57\x9e\x57\x9f\x57\xa4\x57\x8c\x57\x97\x57\x9d\x57\x9b\x57\x94\x57\x98\x57\x8f\x57\x99\x57\xa5\x57\x9a", /* 6d80 */ "\x00\x00\x57\x95\x58\xf4\x59\x0d\x59\x53\x59\xe1\x59\xde\x59\xee\x5a\x00\x59\xf1\x59\xdd\x59\xfa\x59\xfd\x59\xfc\x59\xf6\x59\xe4\x59\xf2\x59\xf7\x59\xdb\x59\xe9\x59\xf3\x59\xf5\x59\xe0\x59\xfe\x59\xf4\x59\xed\x5b\xa8\x5c\x4c\x5c\xd0\x5c\xd8\x5c\xcc\x5c\xd7\x5c\xcb\x5c\xdb\x5c\xde\x5c\xda\x5c\xc9\x5c\xc7\x5c\xca\x5c\xd6\x5c\xd3\x5c\xd4\x5c\xcf\x5c\xc8\x5c\xc6\x5c\xce\x5c\xdf\x5c\xf8\x5d\xf9\x5e\x21\x5e\x22\x5e\x23\x5e\x20\x5e\x24\x5e\xb0\x5e\xa4\x5e\xa2\x5e\x9b\x5e\xa3\x5e\xa5\x5f\x07\x5f\x2e\x5f\x56\x5f\x86\x60\x37\x60\x39\x60\x54\x60\x72\x60\x5e\x60\x45\x60\x53\x60\x47\x60\x49\x60\x5b\x60\x4c\x60\x40\x60\x42\x60\x5f\x60\x24\x60\x44\x60\x58\x60\x66\x60\x6e\x62\x42\x62\x43\x62\xcf\x63\x0d\x63\x0b\x62\xf5\x63\x0e\x63\x03\x62\xeb\x62\xf9\x63\x0f\x63\x0c\x62\xf8\x62\xf6\x63\x00\x63\x13\x63\x14\x62\xfa\x63\x15\x62\xfb\x62\xf0\x65\x41\x65\x43\x65\xaa\x65\xbf\x66\x36\x66\x21\x66\x32\x66\x35\x66\x1c\x66\x26\x66\x22\x66\x33\x66\x2b\x66\x3a\x66\x1d\x66\x34\x66\x39\x66\x2e\x67\x0f\x67\x10\x67\xc1\x67\xf2\x00\x00\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xc8\x67\xba\x67\xdc\x67\xbb\x67\xf8\x67\xd8\x67\xc0\x67\xb7\x67\xc5\x67\xeb\x67\xe4\x67\xdf\x67\xb5\x67\xcd\x67\xb3\x67\xf7\x67\xf6\x67\xee\x67\xe3\x67\xc2\x67\xb9\x67\xce\x67\xe7\x67\xf0\x67\xb2\x67\xfc\x67\xc6\x67\xed\x67\xcc\x67\xae\x67\xe6\x67\xdb\x67\xfa\x67\xc9\x67\xca\x67\xc3\x67\xea\x67\xcb\x6b\x28\x6b\x82\x6b\x84\x6b\xb6\x6b\xd6\x6b\xd8\x6b\xe0\x6c\x20\x6c\x21\x6d\x28\x6d\x34\x6d\x2d\x6d\x1f\x6d\x3c\x6d\x3f\x6d\x12\x6d\x0a\x6c\xda\x6d\x33\x6d\x04\x6d\x19\x6d\x3a\x6d\x1a\x6d\x11\x6d\x00", /* 6e80 */ "\x00\x00\x6d\x1d\x6d\x42\x6d\x01\x6d\x18\x6d\x37\x6d\x03\x6d\x0f\x6d\x40\x6d\x07\x6d\x20\x6d\x2c\x6d\x08\x6d\x22\x6d\x09\x6d\x10\x70\xb7\x70\x9f\x70\xbe\x70\xb1\x70\xb0\x70\xa1\x70\xb4\x70\xb5\x70\xa9\x72\x41\x72\x49\x72\x4a\x72\x6c\x72\x70\x72\x73\x72\x6e\x72\xca\x72\xe4\x72\xe8\x72\xeb\x72\xdf\x72\xea\x72\xe6\x72\xe3\x73\x85\x73\xcc\x73\xc2\x73\xc8\x73\xc5\x73\xb9\x73\xb6\x73\xb5\x73\xb4\x73\xeb\x73\xbf\x73\xc7\x73\xbe\x73\xc3\x73\xc6\x73\xb8\x73\xcb\x74\xec\x74\xee\x75\x2e\x75\x47\x75\x48\x75\xa7\x75\xaa\x76\x79\x76\xc4\x77\x08\x77\x03\x77\x04\x77\x05\x77\x0a\x76\xf7\x76\xfb\x76\xfa\x77\xe7\x77\xe8\x78\x06\x78\x11\x78\x12\x78\x05\x78\x10\x78\x0f\x78\x0e\x78\x09\x78\x03\x78\x13\x79\x4a\x79\x4c\x79\x4b\x79\x45\x79\x44\x79\xd5\x79\xcd\x79\xcf\x79\xd6\x79\xce\x7a\x80\x7a\x7e\x7a\xd1\x7b\x00\x7b\x01\x7c\x7a\x7c\x78\x7c\x79\x7c\x7f\x7c\x80\x7c\x81\x7d\x03\x7d\x08\x7d\x01\x7f\x58\x7f\x91\x7f\x8d\x7f\xbe\x80\x07\x80\x0e\x80\x0f\x80\x14\x80\x37\x80\xd8\x80\xc7\x80\xe0\x80\xd1\x80\xc8\x80\xc2\x80\xd0\x00\x00\x00\x00", /* 6f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc5\x80\xe3\x80\xd9\x80\xdc\x80\xca\x80\xd5\x80\xc9\x80\xcf\x80\xd7\x80\xe6\x80\xcd\x81\xff\x82\x21\x82\x94\x82\xd9\x82\xfe\x82\xf9\x83\x07\x82\xe8\x83\x00\x82\xd5\x83\x3a\x82\xeb\x82\xd6\x82\xf4\x82\xec\x82\xe1\x82\xf2\x82\xf5\x83\x0c\x82\xfb\x82\xf6\x82\xf0\x82\xea\x82\xe4\x82\xe0\x82\xfa\x82\xf3\x82\xed\x86\x77\x86\x74\x86\x7c\x86\x73\x88\x41\x88\x4e\x88\x67\x88\x6a\x88\x69\x89\xd3\x8a\x04\x8a\x07\x8d\x72\x8f\xe3\x8f\xe1\x8f\xee\x8f\xe0\x90\xf1\x90\xbd\x90\xbf\x90\xd5\x90\xc5\x90\xbe\x90\xc7", /* 6f80 */ "\x00\x00\x90\xcb\x90\xc8\x91\xd4\x91\xd3\x96\x54\x96\x4f\x96\x51\x96\x53\x96\x4a\x96\x4e\x50\x1e\x50\x05\x50\x07\x50\x13\x50\x22\x50\x30\x50\x1b\x4f\xf5\x4f\xf4\x50\x33\x50\x37\x50\x2c\x4f\xf6\x4f\xf7\x50\x17\x50\x1c\x50\x20\x50\x27\x50\x35\x50\x2f\x50\x31\x50\x0e\x51\x5a\x51\x94\x51\x93\x51\xca\x51\xc4\x51\xc5\x51\xc8\x51\xce\x52\x61\x52\x5a\x52\x52\x52\x5e\x52\x5f\x52\x55\x52\x62\x52\xcd\x53\x0e\x53\x9e\x55\x26\x54\xe2\x55\x17\x55\x12\x54\xe7\x54\xf3\x54\xe4\x55\x1a\x54\xff\x55\x04\x55\x08\x54\xeb\x55\x11\x55\x05\x54\xf1\x55\x0a\x54\xfb\x54\xf7\x54\xf8\x54\xe0\x55\x0e\x55\x03\x55\x0b\x57\x01\x57\x02\x57\xcc\x58\x32\x57\xd5\x57\xd2\x57\xba\x57\xc6\x57\xbd\x57\xbc\x57\xb8\x57\xb6\x57\xbf\x57\xc7\x57\xd0\x57\xb9\x57\xc1\x59\x0e\x59\x4a\x5a\x19\x5a\x16\x5a\x2d\x5a\x2e\x5a\x15\x5a\x0f\x5a\x17\x5a\x0a\x5a\x1e\x5a\x33\x5b\x6c\x5b\xa7\x5b\xad\x5b\xac\x5c\x03\x5c\x56\x5c\x54\x5c\xec\x5c\xff\x5c\xee\x5c\xf1\x5c\xf7\x5d\x00\x5c\xf9\x5e\x29\x5e\x28\x5e\xa8\x5e\xae\x5e\xaa\x5e\xac\x5f\x33\x5f\x30\x5f\x67\x00\x00\x00\x00", /* 7000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x5d\x60\x5a\x60\x67\x60\x41\x60\xa2\x60\x88\x60\x80\x60\x92\x60\x81\x60\x9d\x60\x83\x60\x95\x60\x9b\x60\x97\x60\x87\x60\x9c\x60\x8e\x62\x19\x62\x46\x62\xf2\x63\x10\x63\x56\x63\x2c\x63\x44\x63\x45\x63\x36\x63\x43\x63\xe4\x63\x39\x63\x4b\x63\x4a\x63\x3c\x63\x29\x63\x41\x63\x34\x63\x58\x63\x54\x63\x59\x63\x2d\x63\x47\x63\x33\x63\x5a\x63\x51\x63\x38\x63\x57\x63\x40\x63\x48\x65\x4a\x65\x46\x65\xc6\x65\xc3\x65\xc4\x65\xc2\x66\x4a\x66\x5f\x66\x47\x66\x51\x67\x12\x67\x13\x68\x1f\x68\x1a\x68\x49\x68\x32", /* 7080 */ "\x00\x00\x68\x33\x68\x3b\x68\x4b\x68\x4f\x68\x16\x68\x31\x68\x1c\x68\x35\x68\x2b\x68\x2d\x68\x2f\x68\x4e\x68\x44\x68\x34\x68\x1d\x68\x12\x68\x14\x68\x26\x68\x28\x68\x2e\x68\x4d\x68\x3a\x68\x25\x68\x20\x6b\x2c\x6b\x2f\x6b\x2d\x6b\x31\x6b\x34\x6b\x6d\x80\x82\x6b\x88\x6b\xe6\x6b\xe4\x6b\xe8\x6b\xe3\x6b\xe2\x6b\xe7\x6c\x25\x6d\x7a\x6d\x63\x6d\x64\x6d\x76\x6d\x0d\x6d\x61\x6d\x92\x6d\x58\x6d\x62\x6d\x6d\x6d\x6f\x6d\x91\x6d\x8d\x6d\xef\x6d\x7f\x6d\x86\x6d\x5e\x6d\x67\x6d\x60\x6d\x97\x6d\x70\x6d\x7c\x6d\x5f\x6d\x82\x6d\x98\x6d\x2f\x6d\x68\x6d\x8b\x6d\x7e\x6d\x80\x6d\x84\x6d\x16\x6d\x83\x6d\x7b\x6d\x7d\x6d\x75\x6d\x90\x70\xdc\x70\xd3\x70\xd1\x70\xdd\x70\xcb\x7f\x39\x70\xe2\x70\xd7\x70\xd2\x70\xde\x70\xe0\x70\xd4\x70\xcd\x70\xc5\x70\xc6\x70\xc7\x70\xda\x70\xce\x70\xe1\x72\x42\x72\x78\x72\x77\x72\x76\x73\x00\x72\xfa\x72\xf4\x72\xfe\x72\xf6\x72\xf3\x72\xfb\x73\x01\x73\xd3\x73\xd9\x73\xe5\x73\xd6\x73\xbc\x73\xe7\x73\xe3\x73\xe9\x73\xdc\x73\xd2\x73\xdb\x73\xd4\x73\xdd\x73\xda\x73\xd7\x73\xd8\x73\xe8\x74\xde\x00\x00\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xdf\x74\xf4\x74\xf5\x75\x21\x75\x5b\x75\x5f\x75\xb0\x75\xc1\x75\xbb\x75\xc4\x75\xc0\x75\xbf\x75\xb6\x75\xba\x76\x8a\x76\xc9\x77\x1d\x77\x1b\x77\x10\x77\x13\x77\x12\x77\x23\x77\x11\x77\x15\x77\x19\x77\x1a\x77\x22\x77\x27\x78\x23\x78\x2c\x78\x22\x78\x35\x78\x2f\x78\x28\x78\x2e\x78\x2b\x78\x21\x78\x29\x78\x33\x78\x2a\x78\x31\x79\x54\x79\x5b\x79\x4f\x79\x5c\x79\x53\x79\x52\x79\x51\x79\xeb\x79\xec\x79\xe0\x79\xee\x79\xed\x79\xea\x79\xdc\x79\xde\x79\xdd\x7a\x86\x7a\x89\x7a\x85\x7a\x8b\x7a\x8c\x7a\x8a", /* 7180 */ "\x00\x00\x7a\x87\x7a\xd8\x7b\x10\x7b\x04\x7b\x13\x7b\x05\x7b\x0f\x7b\x08\x7b\x0a\x7b\x0e\x7b\x09\x7b\x12\x7c\x84\x7c\x91\x7c\x8a\x7c\x8c\x7c\x88\x7c\x8d\x7c\x85\x7d\x1e\x7d\x1d\x7d\x11\x7d\x0e\x7d\x18\x7d\x16\x7d\x13\x7d\x1f\x7d\x12\x7d\x0f\x7d\x0c\x7f\x5c\x7f\x61\x7f\x5e\x7f\x60\x7f\x5d\x7f\x5b\x7f\x96\x7f\x92\x7f\xc3\x7f\xc2\x7f\xc0\x80\x16\x80\x3e\x80\x39\x80\xfa\x80\xf2\x80\xf9\x80\xf5\x81\x01\x80\xfb\x81\x00\x82\x01\x82\x2f\x82\x25\x83\x33\x83\x2d\x83\x44\x83\x19\x83\x51\x83\x25\x83\x56\x83\x3f\x83\x41\x83\x26\x83\x1c\x83\x22\x83\x42\x83\x4e\x83\x1b\x83\x2a\x83\x08\x83\x3c\x83\x4d\x83\x16\x83\x24\x83\x20\x83\x37\x83\x2f\x83\x29\x83\x47\x83\x45\x83\x4c\x83\x53\x83\x1e\x83\x2c\x83\x4b\x83\x27\x83\x48\x86\x53\x86\x52\x86\xa2\x86\xa8\x86\x96\x86\x8d\x86\x91\x86\x9e\x86\x87\x86\x97\x86\x86\x86\x8b\x86\x9a\x86\x85\x86\xa5\x86\x99\x86\xa1\x86\xa7\x86\x95\x86\x98\x86\x8e\x86\x9d\x86\x90\x86\x94\x88\x43\x88\x44\x88\x6d\x88\x75\x88\x76\x88\x72\x88\x80\x88\x71\x88\x7f\x88\x6f\x88\x83\x88\x7e\x88\x74\x00\x00\x00\x00", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x7c\x8a\x12\x8c\x47\x8c\x57\x8c\x7b\x8c\xa4\x8c\xa3\x8d\x76\x8d\x78\x8d\xb5\x8d\xb7\x8d\xb6\x8e\xd1\x8e\xd3\x8f\xfe\x8f\xf5\x90\x02\x8f\xff\x8f\xfb\x90\x04\x8f\xfc\x8f\xf6\x90\xd6\x90\xe0\x90\xd9\x90\xda\x90\xe3\x90\xdf\x90\xe5\x90\xd8\x90\xdb\x90\xd7\x90\xdc\x90\xe4\x91\x50\x91\x4e\x91\x4f\x91\xd5\x91\xe2\x91\xda\x96\x5c\x96\x5f\x96\xbc\x98\xe3\x9a\xdf\x9b\x2f\x4e\x7f\x50\x70\x50\x6a\x50\x61\x50\x5e\x50\x60\x50\x53\x50\x4b\x50\x5d\x50\x72\x50\x48\x50\x4d\x50\x41\x50\x5b\x50\x4a\x50\x62\x50\x15", /* 7280 */ "\x00\x00\x50\x45\x50\x5f\x50\x69\x50\x6b\x50\x63\x50\x64\x50\x46\x50\x40\x50\x6e\x50\x73\x50\x57\x50\x51\x51\xd0\x52\x6b\x52\x6d\x52\x6c\x52\x6e\x52\xd6\x52\xd3\x53\x2d\x53\x9c\x55\x75\x55\x76\x55\x3c\x55\x4d\x55\x50\x55\x34\x55\x2a\x55\x51\x55\x62\x55\x36\x55\x35\x55\x30\x55\x52\x55\x45\x55\x0c\x55\x32\x55\x65\x55\x4e\x55\x39\x55\x48\x55\x2d\x55\x3b\x55\x40\x55\x4b\x57\x0a\x57\x07\x57\xfb\x58\x14\x57\xe2\x57\xf6\x57\xdc\x57\xf4\x58\x00\x57\xed\x57\xfd\x58\x08\x57\xf8\x58\x0b\x57\xf3\x57\xcf\x58\x07\x57\xee\x57\xe3\x57\xf2\x57\xe5\x57\xec\x57\xe1\x58\x0e\x57\xfc\x58\x10\x57\xe7\x58\x01\x58\x0c\x57\xf1\x57\xe9\x57\xf0\x58\x0d\x58\x04\x59\x5c\x5a\x60\x5a\x58\x5a\x55\x5a\x67\x5a\x5e\x5a\x38\x5a\x35\x5a\x6d\x5a\x50\x5a\x5f\x5a\x65\x5a\x6c\x5a\x53\x5a\x64\x5a\x57\x5a\x43\x5a\x5d\x5a\x52\x5a\x44\x5a\x5b\x5a\x48\x5a\x8e\x5a\x3e\x5a\x4d\x5a\x39\x5a\x4c\x5a\x70\x5a\x69\x5a\x47\x5a\x51\x5a\x56\x5a\x42\x5a\x5c\x5b\x72\x5b\x6e\x5b\xc1\x5b\xc0\x5c\x59\x5d\x1e\x5d\x0b\x5d\x1d\x5d\x1a\x5d\x20\x5d\x0c\x5d\x28\x00\x00\x00\x00", /* 7300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x0d\x5d\x26\x5d\x25\x5d\x0f\x5d\x30\x5d\x12\x5d\x23\x5d\x1f\x5d\x2e\x5e\x3e\x5e\x34\x5e\xb1\x5e\xb4\x5e\xb9\x5e\xb2\x5e\xb3\x5f\x36\x5f\x38\x5f\x9b\x5f\x96\x5f\x9f\x60\x8a\x60\x90\x60\x86\x60\xbe\x60\xb0\x60\xba\x60\xd3\x60\xd4\x60\xcf\x60\xe4\x60\xd9\x60\xdd\x60\xc8\x60\xb1\x60\xdb\x60\xb7\x60\xca\x60\xbf\x60\xc3\x60\xcd\x60\xc0\x63\x32\x63\x65\x63\x8a\x63\x82\x63\x7d\x63\xbd\x63\x9e\x63\xad\x63\x9d\x63\x97\x63\xab\x63\x8e\x63\x6f\x63\x87\x63\x90\x63\x6e\x63\xaf\x63\x75\x63\x9c\x63\x6d\x63\xae", /* 7380 */ "\x00\x00\x63\x7c\x63\xa4\x63\x3b\x63\x9f\x63\x78\x63\x85\x63\x81\x63\x91\x63\x8d\x63\x70\x65\x53\x65\xcd\x66\x65\x66\x61\x66\x5b\x66\x59\x66\x5c\x66\x62\x67\x18\x68\x79\x68\x87\x68\x90\x68\x9c\x68\x6d\x68\x6e\x68\xae\x68\xab\x69\x56\x68\x6f\x68\xa3\x68\xac\x68\xa9\x68\x75\x68\x74\x68\xb2\x68\x8f\x68\x77\x68\x92\x68\x7c\x68\x6b\x68\x72\x68\xaa\x68\x80\x68\x71\x68\x7e\x68\x9b\x68\x96\x68\x8b\x68\xa0\x68\x89\x68\xa4\x68\x78\x68\x7b\x68\x91\x68\x8c\x68\x8a\x68\x7d\x6b\x36\x6b\x33\x6b\x37\x6b\x38\x6b\x91\x6b\x8f\x6b\x8d\x6b\x8e\x6b\x8c\x6c\x2a\x6d\xc0\x6d\xab\x6d\xb4\x6d\xb3\x6e\x74\x6d\xac\x6d\xe9\x6d\xe2\x6d\xb7\x6d\xf6\x6d\xd4\x6e\x00\x6d\xc8\x6d\xe0\x6d\xdf\x6d\xd6\x6d\xbe\x6d\xe5\x6d\xdc\x6d\xdd\x6d\xdb\x6d\xf4\x6d\xca\x6d\xbd\x6d\xed\x6d\xf0\x6d\xba\x6d\xd5\x6d\xc2\x6d\xcf\x6d\xc9\x6d\xd0\x6d\xf2\x6d\xd3\x6d\xfd\x6d\xd7\x6d\xcd\x6d\xe3\x6d\xbb\x70\xfa\x71\x0d\x70\xf7\x71\x17\x70\xf4\x71\x0c\x70\xf0\x71\x04\x70\xf3\x71\x10\x70\xfc\x70\xff\x71\x06\x71\x13\x71\x00\x70\xf8\x70\xf6\x71\x0b\x71\x02\x00\x00\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x0e\x72\x7e\x72\x7b\x72\x7c\x72\x7f\x73\x1d\x73\x17\x73\x07\x73\x11\x73\x18\x73\x0a\x73\x08\x72\xff\x73\x0f\x73\x1e\x73\x88\x73\xf6\x73\xf8\x73\xf5\x74\x04\x74\x01\x73\xfd\x74\x07\x74\x00\x73\xfa\x73\xfc\x73\xff\x74\x0c\x74\x0b\x73\xf4\x74\x08\x75\x64\x75\x63\x75\xce\x75\xd2\x75\xcf\x75\xcb\x75\xcc\x75\xd1\x75\xd0\x76\x8f\x76\x89\x76\xd3\x77\x39\x77\x2f\x77\x2d\x77\x31\x77\x32\x77\x34\x77\x33\x77\x3d\x77\x25\x77\x3b\x77\x35\x78\x48\x78\x52\x78\x49\x78\x4d\x78\x4a\x78\x4c\x78\x26\x78\x45\x78\x50", /* 7480 */ "\x00\x00\x79\x64\x79\x67\x79\x69\x79\x6a\x79\x63\x79\x6b\x79\x61\x79\xbb\x79\xfa\x79\xf8\x79\xf6\x79\xf7\x7a\x8f\x7a\x94\x7a\x90\x7b\x35\x7b\x47\x7b\x34\x7b\x25\x7b\x30\x7b\x22\x7b\x24\x7b\x33\x7b\x18\x7b\x2a\x7b\x1d\x7b\x31\x7b\x2b\x7b\x2d\x7b\x2f\x7b\x32\x7b\x38\x7b\x1a\x7b\x23\x7c\x94\x7c\x98\x7c\x96\x7c\xa3\x7d\x35\x7d\x3d\x7d\x38\x7d\x36\x7d\x3a\x7d\x45\x7d\x2c\x7d\x29\x7d\x41\x7d\x47\x7d\x3e\x7d\x3f\x7d\x4a\x7d\x3b\x7d\x28\x7f\x63\x7f\x95\x7f\x9c\x7f\x9d\x7f\x9b\x7f\xca\x7f\xcb\x7f\xcd\x7f\xd0\x7f\xd1\x7f\xc7\x7f\xcf\x7f\xc9\x80\x1f\x80\x1e\x80\x1b\x80\x47\x80\x43\x80\x48\x81\x18\x81\x25\x81\x19\x81\x1b\x81\x2d\x81\x1f\x81\x2c\x81\x1e\x81\x21\x81\x15\x81\x27\x81\x1d\x81\x22\x82\x11\x82\x38\x82\x33\x82\x3a\x82\x34\x82\x32\x82\x74\x83\x90\x83\xa3\x83\xa8\x83\x8d\x83\x7a\x83\x73\x83\xa4\x83\x74\x83\x8f\x83\x81\x83\x95\x83\x99\x83\x75\x83\x94\x83\xa9\x83\x7d\x83\x83\x83\x8c\x83\x9d\x83\x9b\x83\xaa\x83\x8b\x83\x7e\x83\xa5\x83\xaf\x83\x88\x83\x97\x83\xb0\x83\x7f\x83\xa6\x83\x87\x83\xae\x83\x76\x00\x00\x00\x00", /* 7500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x9a\x86\x59\x86\x56\x86\xbf\x86\xb7\x86\xc2\x86\xc1\x86\xc5\x86\xba\x86\xb0\x86\xc8\x86\xb9\x86\xb3\x86\xb8\x86\xcc\x86\xb4\x86\xbb\x86\xbc\x86\xc3\x86\xbd\x86\xbe\x88\x52\x88\x89\x88\x95\x88\xa8\x88\xa2\x88\xaa\x88\x9a\x88\x91\x88\xa1\x88\x9f\x88\x98\x88\xa7\x88\x99\x88\x9b\x88\x97\x88\xa4\x88\xac\x88\x8c\x88\x93\x88\x8e\x89\x82\x89\xd6\x89\xd9\x89\xd5\x8a\x30\x8a\x27\x8a\x2c\x8a\x1e\x8c\x39\x8c\x3b\x8c\x5c\x8c\x5d\x8c\x7d\x8c\xa5\x8d\x7d\x8d\x7b\x8d\x79\x8d\xbc\x8d\xc2\x8d\xb9\x8d\xbf\x8d\xc1", /* 7580 */ "\x00\x00\x8e\xd8\x8e\xde\x8e\xdd\x8e\xdc\x8e\xd7\x8e\xe0\x8e\xe1\x90\x24\x90\x0b\x90\x11\x90\x1c\x90\x0c\x90\x21\x90\xef\x90\xea\x90\xf0\x90\xf4\x90\xf2\x90\xf3\x90\xd4\x90\xeb\x90\xec\x90\xe9\x91\x56\x91\x58\x91\x5a\x91\x53\x91\x55\x91\xec\x91\xf4\x91\xf1\x91\xf3\x91\xf8\x91\xe4\x91\xf9\x91\xea\x91\xeb\x91\xf7\x91\xe8\x91\xee\x95\x7a\x95\x86\x95\x88\x96\x7c\x96\x6d\x96\x6b\x96\x71\x96\x6f\x96\xbf\x97\x6a\x98\x04\x98\xe5\x99\x97\x50\x9b\x50\x95\x50\x94\x50\x9e\x50\x8b\x50\xa3\x50\x83\x50\x8c\x50\x8e\x50\x9d\x50\x68\x50\x9c\x50\x92\x50\x82\x50\x87\x51\x5f\x51\xd4\x53\x12\x53\x11\x53\xa4\x53\xa7\x55\x91\x55\xa8\x55\xa5\x55\xad\x55\x77\x56\x45\x55\xa2\x55\x93\x55\x88\x55\x8f\x55\xb5\x55\x81\x55\xa3\x55\x92\x55\xa4\x55\x7d\x55\x8c\x55\xa6\x55\x7f\x55\x95\x55\xa1\x55\x8e\x57\x0c\x58\x29\x58\x37\x58\x19\x58\x1e\x58\x27\x58\x23\x58\x28\x57\xf5\x58\x48\x58\x25\x58\x1c\x58\x1b\x58\x33\x58\x3f\x58\x36\x58\x2e\x58\x39\x58\x38\x58\x2d\x58\x2c\x58\x3b\x59\x61\x5a\xaf\x5a\x94\x5a\x9f\x5a\x7a\x5a\xa2\x5a\x9e\x00\x00\x00\x00", /* 7600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x78\x5a\xa6\x5a\x7c\x5a\xa5\x5a\xac\x5a\x95\x5a\xae\x5a\x37\x5a\x84\x5a\x8a\x5a\x97\x5a\x83\x5a\x8b\x5a\xa9\x5a\x7b\x5a\x7d\x5a\x8c\x5a\x9c\x5a\x8f\x5a\x93\x5a\x9d\x5b\xea\x5b\xcd\x5b\xcb\x5b\xd4\x5b\xd1\x5b\xca\x5b\xce\x5c\x0c\x5c\x30\x5d\x37\x5d\x43\x5d\x6b\x5d\x41\x5d\x4b\x5d\x3f\x5d\x35\x5d\x51\x5d\x4e\x5d\x55\x5d\x33\x5d\x3a\x5d\x52\x5d\x3d\x5d\x31\x5d\x59\x5d\x42\x5d\x39\x5d\x49\x5d\x38\x5d\x3c\x5d\x32\x5d\x36\x5d\x40\x5d\x45\x5e\x44\x5e\x41\x5f\x58\x5f\xa6\x5f\xa5\x5f\xab\x60\xc9\x60\xb9", /* 7680 */ "\x00\x00\x60\xcc\x60\xe2\x60\xce\x60\xc4\x61\x14\x60\xf2\x61\x0a\x61\x16\x61\x05\x60\xf5\x61\x13\x60\xf8\x60\xfc\x60\xfe\x60\xc1\x61\x03\x61\x18\x61\x1d\x61\x10\x60\xff\x61\x04\x61\x0b\x62\x4a\x63\x94\x63\xb1\x63\xb0\x63\xce\x63\xe5\x63\xe8\x63\xef\x63\xc3\x64\x9d\x63\xf3\x63\xca\x63\xe0\x63\xf6\x63\xd5\x63\xf2\x63\xf5\x64\x61\x63\xdf\x63\xbe\x63\xdd\x63\xdc\x63\xc4\x63\xd8\x63\xd3\x63\xc2\x63\xc7\x63\xcc\x63\xcb\x63\xc8\x63\xf0\x63\xd7\x63\xd9\x65\x32\x65\x67\x65\x6a\x65\x64\x65\x5c\x65\x68\x65\x65\x65\x8c\x65\x9d\x65\x9e\x65\xae\x65\xd0\x65\xd2\x66\x7c\x66\x6c\x66\x7b\x66\x80\x66\x71\x66\x79\x66\x6a\x66\x72\x67\x01\x69\x0c\x68\xd3\x69\x04\x68\xdc\x69\x2a\x68\xec\x68\xea\x68\xf1\x69\x0f\x68\xd6\x68\xf7\x68\xeb\x68\xe4\x68\xf6\x69\x13\x69\x10\x68\xf3\x68\xe1\x69\x07\x68\xcc\x69\x08\x69\x70\x68\xb4\x69\x11\x68\xef\x68\xc6\x69\x14\x68\xf8\x68\xd0\x68\xfd\x68\xfc\x68\xe8\x69\x0b\x69\x0a\x69\x17\x68\xce\x68\xc8\x68\xdd\x68\xde\x68\xe6\x68\xf4\x68\xd1\x69\x06\x68\xd4\x68\xe9\x69\x15\x69\x25\x68\xc7\x00\x00\x00\x00", /* 7700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x39\x6b\x3b\x6b\x3f\x6b\x3c\x6b\x94\x6b\x97\x6b\x99\x6b\x95\x6b\xbd\x6b\xf0\x6b\xf2\x6b\xf3\x6c\x30\x6d\xfc\x6e\x46\x6e\x47\x6e\x1f\x6e\x49\x6e\x88\x6e\x3c\x6e\x3d\x6e\x45\x6e\x62\x6e\x2b\x6e\x3f\x6e\x41\x6e\x5d\x6e\x73\x6e\x1c\x6e\x33\x6e\x4b\x6e\x40\x6e\x51\x6e\x3b\x6e\x03\x6e\x2e\x6e\x5e\x6e\x68\x6e\x5c\x6e\x61\x6e\x31\x6e\x28\x6e\x60\x6e\x71\x6e\x6b\x6e\x39\x6e\x22\x6e\x30\x6e\x53\x6e\x65\x6e\x27\x6e\x78\x6e\x64\x6e\x77\x6e\x55\x6e\x79\x6e\x52\x6e\x66\x6e\x35\x6e\x36\x6e\x5a\x71\x20\x71\x1e", /* 7780 */ "\x00\x00\x71\x2f\x70\xfb\x71\x2e\x71\x31\x71\x23\x71\x25\x71\x22\x71\x32\x71\x1f\x71\x28\x71\x3a\x71\x1b\x72\x4b\x72\x5a\x72\x88\x72\x89\x72\x86\x72\x85\x72\x8b\x73\x12\x73\x0b\x73\x30\x73\x22\x73\x31\x73\x33\x73\x27\x73\x32\x73\x2d\x73\x26\x73\x23\x73\x35\x73\x0c\x74\x2e\x74\x2c\x74\x30\x74\x2b\x74\x16\x74\x1a\x74\x21\x74\x2d\x74\x31\x74\x24\x74\x23\x74\x1d\x74\x29\x74\x20\x74\x32\x74\xfb\x75\x2f\x75\x6f\x75\x6c\x75\xe7\x75\xda\x75\xe1\x75\xe6\x75\xdd\x75\xdf\x75\xe4\x75\xd7\x76\x95\x76\x92\x76\xda\x77\x46\x77\x47\x77\x44\x77\x4d\x77\x45\x77\x4a\x77\x4e\x77\x4b\x77\x4c\x77\xde\x77\xec\x78\x60\x78\x64\x78\x65\x78\x5c\x78\x6d\x78\x71\x78\x6a\x78\x6e\x78\x70\x78\x69\x78\x68\x78\x5e\x78\x62\x79\x74\x79\x73\x79\x72\x79\x70\x7a\x02\x7a\x0a\x7a\x03\x7a\x0c\x7a\x04\x7a\x99\x7a\xe6\x7a\xe4\x7b\x4a\x7b\x3b\x7b\x44\x7b\x48\x7b\x4c\x7b\x4e\x7b\x40\x7b\x58\x7b\x45\x7c\xa2\x7c\x9e\x7c\xa8\x7c\xa1\x7d\x58\x7d\x6f\x7d\x63\x7d\x53\x7d\x56\x7d\x67\x7d\x6a\x7d\x4f\x7d\x6d\x7d\x5c\x7d\x6b\x7d\x52\x7d\x54\x7d\x69\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x51\x7d\x5f\x7d\x4e\x7f\x3e\x7f\x3f\x7f\x65\x7f\x66\x7f\xa2\x7f\xa0\x7f\xa1\x7f\xd7\x80\x51\x80\x4f\x80\x50\x80\xfe\x80\xd4\x81\x43\x81\x4a\x81\x52\x81\x4f\x81\x47\x81\x3d\x81\x4d\x81\x3a\x81\xe6\x81\xee\x81\xf7\x81\xf8\x81\xf9\x82\x04\x82\x3c\x82\x3d\x82\x3f\x82\x75\x83\x3b\x83\xcf\x83\xf9\x84\x23\x83\xc0\x83\xe8\x84\x12\x83\xe7\x83\xe4\x83\xfc\x83\xf6\x84\x10\x83\xc6\x83\xc8\x83\xeb\x83\xe3\x83\xbf\x84\x01\x83\xdd\x83\xe5\x83\xd8\x83\xff\x83\xe1\x83\xcb\x83\xce\x83\xd6\x83\xf5\x83\xc9\x84\x09", /* 7880 */ "\x00\x00\x84\x0f\x83\xde\x84\x11\x84\x06\x83\xc2\x83\xf3\x83\xd5\x83\xfa\x83\xc7\x83\xd1\x83\xea\x84\x13\x83\xc3\x83\xec\x83\xee\x83\xc4\x83\xfb\x83\xd7\x83\xe2\x84\x1b\x83\xdb\x83\xfe\x86\xd8\x86\xe2\x86\xe6\x86\xd3\x86\xe3\x86\xda\x86\xea\x86\xdd\x86\xeb\x86\xdc\x86\xec\x86\xe9\x86\xd7\x86\xe8\x86\xd1\x88\x48\x88\x56\x88\x55\x88\xba\x88\xd7\x88\xb9\x88\xb8\x88\xc0\x88\xbe\x88\xb6\x88\xbc\x88\xb7\x88\xbd\x88\xb2\x89\x01\x88\xc9\x89\x95\x89\x98\x89\x97\x89\xdd\x89\xda\x89\xdb\x8a\x4e\x8a\x4d\x8a\x39\x8a\x59\x8a\x40\x8a\x57\x8a\x58\x8a\x44\x8a\x45\x8a\x52\x8a\x48\x8a\x51\x8a\x4a\x8a\x4c\x8a\x4f\x8c\x5f\x8c\x81\x8c\x80\x8c\xba\x8c\xbe\x8c\xb0\x8c\xb9\x8c\xb5\x8d\x84\x8d\x80\x8d\x89\x8d\xd8\x8d\xd3\x8d\xcd\x8d\xc7\x8d\xd6\x8d\xdc\x8d\xcf\x8d\xd5\x8d\xd9\x8d\xc8\x8d\xd7\x8d\xc5\x8e\xef\x8e\xf7\x8e\xfa\x8e\xf9\x8e\xe6\x8e\xee\x8e\xe5\x8e\xf5\x8e\xe7\x8e\xe8\x8e\xf6\x8e\xeb\x8e\xf1\x8e\xec\x8e\xf4\x8e\xe9\x90\x2d\x90\x34\x90\x2f\x91\x06\x91\x2c\x91\x04\x90\xff\x90\xfc\x91\x08\x90\xf9\x90\xfb\x91\x01\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x91\x07\x91\x05\x91\x03\x91\x61\x91\x64\x91\x5f\x91\x62\x91\x60\x92\x01\x92\x0a\x92\x25\x92\x03\x92\x1a\x92\x26\x92\x0f\x92\x0c\x92\x00\x92\x12\x91\xff\x91\xfd\x92\x06\x92\x04\x92\x27\x92\x02\x92\x1c\x92\x24\x92\x19\x92\x17\x92\x05\x92\x16\x95\x7b\x95\x8d\x95\x8c\x95\x90\x96\x87\x96\x7e\x96\x88\x96\x89\x96\x83\x96\x80\x96\xc2\x96\xc8\x96\xc3\x96\xf1\x96\xf0\x97\x6c\x97\x70\x97\x6e\x98\x07\x98\xa9\x98\xeb\x9c\xe6\x9e\xf9\x4e\x83\x4e\x84\x4e\xb6\x50\xbd\x50\xbf\x50\xc6\x50\xae\x50\xc4\x50\xca", /* 7980 */ "\x00\x00\x50\xb4\x50\xc8\x50\xc2\x50\xb0\x50\xc1\x50\xba\x50\xb1\x50\xcb\x50\xc9\x50\xb6\x50\xb8\x51\xd7\x52\x7a\x52\x78\x52\x7b\x52\x7c\x55\xc3\x55\xdb\x55\xcc\x55\xd0\x55\xcb\x55\xca\x55\xdd\x55\xc0\x55\xd4\x55\xc4\x55\xe9\x55\xbf\x55\xd2\x55\x8d\x55\xcf\x55\xd5\x55\xe2\x55\xd6\x55\xc8\x55\xf2\x55\xcd\x55\xd9\x55\xc2\x57\x14\x58\x53\x58\x68\x58\x64\x58\x4f\x58\x4d\x58\x49\x58\x6f\x58\x55\x58\x4e\x58\x5d\x58\x59\x58\x65\x58\x5b\x58\x3d\x58\x63\x58\x71\x58\xfc\x5a\xc7\x5a\xc4\x5a\xcb\x5a\xba\x5a\xb8\x5a\xb1\x5a\xb5\x5a\xb0\x5a\xbf\x5a\xc8\x5a\xbb\x5a\xc6\x5a\xb7\x5a\xc0\x5a\xca\x5a\xb4\x5a\xb6\x5a\xcd\x5a\xb9\x5a\x90\x5b\xd6\x5b\xd8\x5b\xd9\x5c\x1f\x5c\x33\x5d\x71\x5d\x63\x5d\x4a\x5d\x65\x5d\x72\x5d\x6c\x5d\x5e\x5d\x68\x5d\x67\x5d\x62\x5d\xf0\x5e\x4f\x5e\x4e\x5e\x4a\x5e\x4d\x5e\x4b\x5e\xc5\x5e\xcc\x5e\xc6\x5e\xcb\x5e\xc7\x5f\x40\x5f\xaf\x5f\xad\x60\xf7\x61\x49\x61\x4a\x61\x2b\x61\x45\x61\x36\x61\x32\x61\x2e\x61\x46\x61\x2f\x61\x4f\x61\x29\x61\x40\x62\x20\x91\x68\x62\x23\x62\x25\x62\x24\x63\xc5\x00\x00\x00\x00", /* 7a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xf1\x63\xeb\x64\x10\x64\x12\x64\x09\x64\x20\x64\x24\x64\x33\x64\x43\x64\x1f\x64\x15\x64\x18\x64\x39\x64\x37\x64\x22\x64\x23\x64\x0c\x64\x26\x64\x30\x64\x28\x64\x41\x64\x35\x64\x2f\x64\x0a\x64\x1a\x64\x40\x64\x25\x64\x27\x64\x0b\x63\xe7\x64\x1b\x64\x2e\x64\x21\x64\x0e\x65\x6f\x65\x92\x65\xd3\x66\x86\x66\x8c\x66\x95\x66\x90\x66\x8b\x66\x8a\x66\x99\x66\x94\x66\x78\x67\x20\x69\x66\x69\x5f\x69\x38\x69\x4e\x69\x62\x69\x71\x69\x3f\x69\x45\x69\x6a\x69\x39\x69\x42\x69\x57\x69\x59\x69\x7a\x69\x48\x69\x49", /* 7a80 */ "\x00\x00\x69\x35\x69\x6c\x69\x33\x69\x3d\x69\x65\x68\xf0\x69\x78\x69\x34\x69\x69\x69\x40\x69\x6f\x69\x44\x69\x76\x69\x58\x69\x41\x69\x74\x69\x4c\x69\x3b\x69\x4b\x69\x37\x69\x5c\x69\x4f\x69\x51\x69\x32\x69\x52\x69\x2f\x69\x7b\x69\x3c\x6b\x46\x6b\x45\x6b\x43\x6b\x42\x6b\x48\x6b\x41\x6b\x9b\xfa\x0d\x6b\xfb\x6b\xfc\x6b\xf9\x6b\xf7\x6b\xf8\x6e\x9b\x6e\xd6\x6e\xc8\x6e\x8f\x6e\xc0\x6e\x9f\x6e\x93\x6e\x94\x6e\xa0\x6e\xb1\x6e\xb9\x6e\xc6\x6e\xd2\x6e\xbd\x6e\xc1\x6e\x9e\x6e\xc9\x6e\xb7\x6e\xb0\x6e\xcd\x6e\xa6\x6e\xcf\x6e\xb2\x6e\xbe\x6e\xc3\x6e\xdc\x6e\xd8\x6e\x99\x6e\x92\x6e\x8e\x6e\x8d\x6e\xa4\x6e\xa1\x6e\xbf\x6e\xb3\x6e\xd0\x6e\xca\x6e\x97\x6e\xae\x6e\xa3\x71\x47\x71\x54\x71\x52\x71\x63\x71\x60\x71\x41\x71\x5d\x71\x62\x71\x72\x71\x78\x71\x6a\x71\x61\x71\x42\x71\x58\x71\x43\x71\x4b\x71\x70\x71\x5f\x71\x50\x71\x53\x71\x44\x71\x4d\x71\x5a\x72\x4f\x72\x8d\x72\x8c\x72\x91\x72\x90\x72\x8e\x73\x3c\x73\x42\x73\x3b\x73\x3a\x73\x40\x73\x4a\x73\x49\x74\x44\x74\x4a\x74\x4b\x74\x52\x74\x51\x74\x57\x74\x40\x74\x4f\x00\x00\x00\x00", /* 7b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x50\x74\x4e\x74\x42\x74\x46\x74\x4d\x74\x54\x74\xe1\x74\xff\x74\xfe\x74\xfd\x75\x1d\x75\x79\x75\x77\x69\x83\x75\xef\x76\x0f\x76\x03\x75\xf7\x75\xfe\x75\xfc\x75\xf9\x75\xf8\x76\x10\x75\xfb\x75\xf6\x75\xed\x75\xf5\x75\xfd\x76\x99\x76\xb5\x76\xdd\x77\x55\x77\x5f\x77\x60\x77\x52\x77\x56\x77\x5a\x77\x69\x77\x67\x77\x54\x77\x59\x77\x6d\x77\xe0\x78\x87\x78\x9a\x78\x94\x78\x8f\x78\x84\x78\x95\x78\x85\x78\x86\x78\xa1\x78\x83\x78\x79\x78\x99\x78\x80\x78\x96\x78\x7b\x79\x7c\x79\x82\x79\x7d\x79\x79\x7a\x11", /* 7b80 */ "\x00\x00\x7a\x18\x7a\x19\x7a\x12\x7a\x17\x7a\x15\x7a\x22\x7a\x13\x7a\x1b\x7a\x10\x7a\xa3\x7a\xa2\x7a\x9e\x7a\xeb\x7b\x66\x7b\x64\x7b\x6d\x7b\x74\x7b\x69\x7b\x72\x7b\x65\x7b\x73\x7b\x71\x7b\x70\x7b\x61\x7b\x78\x7b\x76\x7b\x63\x7c\xb2\x7c\xb4\x7c\xaf\x7d\x88\x7d\x86\x7d\x80\x7d\x8d\x7d\x7f\x7d\x85\x7d\x7a\x7d\x8e\x7d\x7b\x7d\x83\x7d\x7c\x7d\x8c\x7d\x94\x7d\x84\x7d\x7d\x7d\x92\x7f\x6d\x7f\x6b\x7f\x67\x7f\x68\x7f\x6c\x7f\xa6\x7f\xa5\x7f\xa7\x7f\xdb\x7f\xdc\x80\x21\x81\x64\x81\x60\x81\x77\x81\x5c\x81\x69\x81\x5b\x81\x62\x81\x72\x67\x21\x81\x5e\x81\x76\x81\x67\x81\x6f\x81\x44\x81\x61\x82\x1d\x82\x49\x82\x44\x82\x40\x82\x42\x82\x45\x84\xf1\x84\x3f\x84\x56\x84\x76\x84\x79\x84\x8f\x84\x8d\x84\x65\x84\x51\x84\x40\x84\x86\x84\x67\x84\x30\x84\x4d\x84\x7d\x84\x5a\x84\x59\x84\x74\x84\x73\x84\x5d\x85\x07\x84\x5e\x84\x37\x84\x3a\x84\x34\x84\x7a\x84\x43\x84\x78\x84\x32\x84\x45\x84\x29\x83\xd9\x84\x4b\x84\x2f\x84\x42\x84\x2d\x84\x5f\x84\x70\x84\x39\x84\x4e\x84\x4c\x84\x52\x84\x6f\x84\xc5\x84\x8e\x84\x3b\x84\x47\x00\x00\x00\x00", /* 7c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x36\x84\x33\x84\x68\x84\x7e\x84\x44\x84\x2b\x84\x60\x84\x54\x84\x6e\x84\x50\x87\x0b\x87\x04\x86\xf7\x87\x0c\x86\xfa\x86\xd6\x86\xf5\x87\x4d\x86\xf8\x87\x0e\x87\x09\x87\x01\x86\xf6\x87\x0d\x87\x05\x88\xd6\x88\xcb\x88\xcd\x88\xce\x88\xde\x88\xdb\x88\xda\x88\xcc\x88\xd0\x89\x85\x89\x9b\x89\xdf\x89\xe5\x89\xe4\x89\xe1\x89\xe0\x89\xe2\x89\xdc\x89\xe6\x8a\x76\x8a\x86\x8a\x7f\x8a\x61\x8a\x3f\x8a\x77\x8a\x82\x8a\x84\x8a\x75\x8a\x83\x8a\x81\x8a\x74\x8a\x7a\x8c\x3c\x8c\x4b\x8c\x4a\x8c\x65\x8c\x64\x8c\x66", /* 7c80 */ "\x00\x00\x8c\x86\x8c\x84\x8c\x85\x8c\xcc\x8d\x68\x8d\x69\x8d\x91\x8d\x8c\x8d\x8e\x8d\x8f\x8d\x8d\x8d\x93\x8d\x94\x8d\x90\x8d\x92\x8d\xf0\x8d\xe0\x8d\xec\x8d\xf1\x8d\xee\x8d\xd0\x8d\xe9\x8d\xe3\x8d\xe2\x8d\xe7\x8d\xf2\x8d\xeb\x8d\xf4\x8f\x06\x8e\xff\x8f\x01\x8f\x00\x8f\x05\x8f\x07\x8f\x08\x8f\x02\x8f\x0b\x90\x52\x90\x3f\x90\x44\x90\x49\x90\x3d\x91\x10\x91\x0d\x91\x0f\x91\x11\x91\x16\x91\x14\x91\x0b\x91\x0e\x91\x6e\x91\x6f\x92\x48\x92\x52\x92\x30\x92\x3a\x92\x66\x92\x33\x92\x65\x92\x5e\x92\x83\x92\x2e\x92\x4a\x92\x46\x92\x6d\x92\x6c\x92\x4f\x92\x60\x92\x67\x92\x6f\x92\x36\x92\x61\x92\x70\x92\x31\x92\x54\x92\x63\x92\x50\x92\x72\x92\x4e\x92\x53\x92\x4c\x92\x56\x92\x32\x95\x9f\x95\x9c\x95\x9e\x95\x9b\x96\x92\x96\x93\x96\x91\x96\x97\x96\xce\x96\xfa\x96\xfd\x96\xf8\x96\xf5\x97\x73\x97\x77\x97\x78\x97\x72\x98\x0f\x98\x0d\x98\x0e\x98\xac\x98\xf6\x98\xf9\x99\xaf\x99\xb2\x99\xb0\x99\xb5\x9a\xad\x9a\xab\x9b\x5b\x9c\xea\x9c\xed\x9c\xe7\x9e\x80\x9e\xfd\x50\xe6\x50\xd4\x50\xd7\x50\xe8\x50\xf3\x50\xdb\x50\xea\x00\x00\x00\x00", /* 7d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xdd\x50\xe4\x50\xd3\x50\xec\x50\xf0\x50\xef\x50\xe3\x50\xe0\x51\xd8\x52\x80\x52\x81\x52\xe9\x52\xeb\x53\x30\x53\xac\x56\x27\x56\x15\x56\x0c\x56\x12\x55\xfc\x56\x0f\x56\x1c\x56\x01\x56\x13\x56\x02\x55\xfa\x56\x1d\x56\x04\x55\xff\x55\xf9\x58\x89\x58\x7c\x58\x90\x58\x98\x58\x86\x58\x81\x58\x7f\x58\x74\x58\x8b\x58\x7a\x58\x87\x58\x91\x58\x8e\x58\x76\x58\x82\x58\x88\x58\x7b\x58\x94\x58\x8f\x58\xfe\x59\x6b\x5a\xdc\x5a\xee\x5a\xe5\x5a\xd5\x5a\xea\x5a\xda\x5a\xed\x5a\xeb\x5a\xf3\x5a\xe2\x5a\xe0\x5a\xdb", /* 7d80 */ "\x00\x00\x5a\xec\x5a\xde\x5a\xdd\x5a\xd9\x5a\xe8\x5a\xdf\x5b\x77\x5b\xe0\x5b\xe3\x5c\x63\x5d\x82\x5d\x80\x5d\x7d\x5d\x86\x5d\x7a\x5d\x81\x5d\x77\x5d\x8a\x5d\x89\x5d\x88\x5d\x7e\x5d\x7c\x5d\x8d\x5d\x79\x5d\x7f\x5e\x58\x5e\x59\x5e\x53\x5e\xd8\x5e\xd1\x5e\xd7\x5e\xce\x5e\xdc\x5e\xd5\x5e\xd9\x5e\xd2\x5e\xd4\x5f\x44\x5f\x43\x5f\x6f\x5f\xb6\x61\x2c\x61\x28\x61\x41\x61\x5e\x61\x71\x61\x73\x61\x52\x61\x53\x61\x72\x61\x6c\x61\x80\x61\x74\x61\x54\x61\x7a\x61\x5b\x61\x65\x61\x3b\x61\x6a\x61\x61\x61\x56\x62\x29\x62\x27\x62\x2b\x64\x2b\x64\x4d\x64\x5b\x64\x5d\x64\x74\x64\x76\x64\x72\x64\x73\x64\x7d\x64\x75\x64\x66\x64\xa6\x64\x4e\x64\x82\x64\x5e\x64\x5c\x64\x4b\x64\x53\x64\x60\x64\x50\x64\x7f\x64\x3f\x64\x6c\x64\x6b\x64\x59\x64\x65\x64\x77\x65\x73\x65\xa0\x66\xa1\x66\xa0\x66\x9f\x67\x05\x67\x04\x67\x22\x69\xb1\x69\xb6\x69\xc9\x69\xa0\x69\xce\x69\x96\x69\xb0\x69\xac\x69\xbc\x69\x91\x69\x99\x69\x8e\x69\xa7\x69\x8d\x69\xa9\x69\xbe\x69\xaf\x69\xbf\x69\xc4\x69\xbd\x69\xa4\x69\xd4\x69\xb9\x69\xca\x69\x9a\x69\xcf\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\xb3\x69\x93\x69\xaa\x69\xa1\x69\x9e\x69\xd9\x69\x97\x69\x90\x69\xc2\x69\xb5\x69\xa5\x69\xc6\x6b\x4a\x6b\x4d\x6b\x4b\x6b\x9e\x6b\x9f\x6b\xa0\x6b\xc3\x6b\xc4\x6b\xfe\x6e\xce\x6e\xf5\x6e\xf1\x6f\x03\x6f\x25\x6e\xf8\x6f\x37\x6e\xfb\x6f\x2e\x6f\x09\x6f\x4e\x6f\x19\x6f\x1a\x6f\x27\x6f\x18\x6f\x3b\x6f\x12\x6e\xed\x6f\x0a\x6f\x36\x6f\x73\x6e\xf9\x6e\xee\x6f\x2d\x6f\x40\x6f\x30\x6f\x3c\x6f\x35\x6e\xeb\x6f\x07\x6f\x0e\x6f\x43\x6f\x05\x6e\xfd\x6e\xf6\x6f\x39\x6f\x1c\x6e\xfc\x6f\x3a\x6f\x1f\x6f\x0d\x6f\x1e", /* 7e80 */ "\x00\x00\x6f\x08\x6f\x21\x71\x87\x71\x90\x71\x89\x71\x80\x71\x85\x71\x82\x71\x8f\x71\x7b\x71\x86\x71\x81\x71\x97\x72\x44\x72\x53\x72\x97\x72\x95\x72\x93\x73\x43\x73\x4d\x73\x51\x73\x4c\x74\x62\x74\x73\x74\x71\x74\x75\x74\x72\x74\x67\x74\x6e\x75\x00\x75\x02\x75\x03\x75\x7d\x75\x90\x76\x16\x76\x08\x76\x0c\x76\x15\x76\x11\x76\x0a\x76\x14\x76\xb8\x77\x81\x77\x7c\x77\x85\x77\x82\x77\x6e\x77\x80\x77\x6f\x77\x7e\x77\x83\x78\xb2\x78\xaa\x78\xb4\x78\xad\x78\xa8\x78\x7e\x78\xab\x78\x9e\x78\xa5\x78\xa0\x78\xac\x78\xa2\x78\xa4\x79\x98\x79\x8a\x79\x8b\x79\x96\x79\x95\x79\x94\x79\x93\x79\x97\x79\x88\x79\x92\x79\x90\x7a\x2b\x7a\x4a\x7a\x30\x7a\x2f\x7a\x28\x7a\x26\x7a\xa8\x7a\xab\x7a\xac\x7a\xee\x7b\x88\x7b\x9c\x7b\x8a\x7b\x91\x7b\x90\x7b\x96\x7b\x8d\x7b\x8c\x7b\x9b\x7b\x8e\x7b\x85\x7b\x98\x52\x84\x7b\x99\x7b\xa4\x7b\x82\x7c\xbb\x7c\xbf\x7c\xbc\x7c\xba\x7d\xa7\x7d\xb7\x7d\xc2\x7d\xa3\x7d\xaa\x7d\xc1\x7d\xc0\x7d\xc5\x7d\x9d\x7d\xce\x7d\xc4\x7d\xc6\x7d\xcb\x7d\xcc\x7d\xaf\x7d\xb9\x7d\x96\x7d\xbc\x7d\x9f\x7d\xa6\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\xae\x7d\xa9\x7d\xa1\x7d\xc9\x7f\x73\x7f\xe2\x7f\xe3\x7f\xe5\x7f\xde\x80\x24\x80\x5d\x80\x5c\x81\x89\x81\x86\x81\x83\x81\x87\x81\x8d\x81\x8c\x81\x8b\x82\x15\x84\x97\x84\xa4\x84\xa1\x84\x9f\x84\xba\x84\xce\x84\xc2\x84\xac\x84\xae\x84\xab\x84\xb9\x84\xb4\x84\xc1\x84\xcd\x84\xaa\x84\x9a\x84\xb1\x84\xd0\x84\x9d\x84\xa7\x84\xbb\x84\xa2\x84\x94\x84\xc7\x84\xcc\x84\x9b\x84\xa9\x84\xaf\x84\xa8\x84\xd6\x84\x98\x84\xb6\x84\xcf\x84\xa0\x84\xd7\x84\xd4\x84\xd2\x84\xdb\x84\xb0\x84\x91\x86\x61\x87\x33\x87\x23", /* 7f80 */ "\x00\x00\x87\x28\x87\x6b\x87\x40\x87\x2e\x87\x1e\x87\x21\x87\x19\x87\x1b\x87\x43\x87\x2c\x87\x41\x87\x3e\x87\x46\x87\x20\x87\x32\x87\x2a\x87\x2d\x87\x3c\x87\x12\x87\x3a\x87\x31\x87\x35\x87\x42\x87\x26\x87\x27\x87\x38\x87\x24\x87\x1a\x87\x30\x87\x11\x88\xf7\x88\xe7\x88\xf1\x88\xf2\x88\xfa\x88\xfe\x88\xee\x88\xfc\x88\xf6\x88\xfb\x88\xf0\x88\xec\x88\xeb\x89\x9d\x89\xa1\x89\x9f\x89\x9e\x89\xe9\x89\xeb\x89\xe8\x8a\xab\x8a\x99\x8a\x8b\x8a\x92\x8a\x8f\x8a\x96\x8c\x3d\x8c\x68\x8c\x69\x8c\xd5\x8c\xcf\x8c\xd7\x8d\x96\x8e\x09\x8e\x02\x8d\xff\x8e\x0d\x8d\xfd\x8e\x0a\x8e\x03\x8e\x07\x8e\x06\x8e\x05\x8d\xfe\x8e\x00\x8e\x04\x8f\x10\x8f\x11\x8f\x0e\x8f\x0d\x91\x23\x91\x1c\x91\x20\x91\x22\x91\x1f\x91\x1d\x91\x1a\x91\x24\x91\x21\x91\x1b\x91\x7a\x91\x72\x91\x79\x91\x73\x92\xa5\x92\xa4\x92\x76\x92\x9b\x92\x7a\x92\xa0\x92\x94\x92\xaa\x92\x8d\x92\xa6\x92\x9a\x92\xab\x92\x79\x92\x97\x92\x7f\x92\xa3\x92\xee\x92\x8e\x92\x82\x92\x95\x92\xa2\x92\x7d\x92\x88\x92\xa1\x92\x8a\x92\x86\x92\x8c\x92\x99\x92\xa7\x92\x7e\x92\x87\x00\x00\x00\x00", /* 8000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\xa9\x92\x9d\x92\x8b\x92\x2d\x96\x9e\x96\xa1\x96\xff\x97\x58\x97\x7d\x97\x7a\x97\x7e\x97\x83\x97\x80\x97\x82\x97\x7b\x97\x84\x97\x81\x97\x7f\x97\xce\x97\xcd\x98\x16\x98\xad\x98\xae\x99\x02\x99\x00\x99\x07\x99\x9d\x99\x9c\x99\xc3\x99\xb9\x99\xbb\x99\xba\x99\xc2\x99\xbd\x99\xc7\x9a\xb1\x9a\xe3\x9a\xe7\x9b\x3e\x9b\x3f\x9b\x60\x9b\x61\x9b\x5f\x9c\xf1\x9c\xf2\x9c\xf5\x9e\xa7\x50\xff\x51\x03\x51\x30\x50\xf8\x51\x06\x51\x07\x50\xf6\x50\xfe\x51\x0b\x51\x0c\x50\xfd\x51\x0a\x52\x8b\x52\x8c\x52\xf1\x52\xef", /* 8080 */ "\x00\x00\x56\x48\x56\x42\x56\x4c\x56\x35\x56\x41\x56\x4a\x56\x49\x56\x46\x56\x58\x56\x5a\x56\x40\x56\x33\x56\x3d\x56\x2c\x56\x3e\x56\x38\x56\x2a\x56\x3a\x57\x1a\x58\xab\x58\x9d\x58\xb1\x58\xa0\x58\xa3\x58\xaf\x58\xac\x58\xa5\x58\xa1\x58\xff\x5a\xff\x5a\xf4\x5a\xfd\x5a\xf7\x5a\xf6\x5b\x03\x5a\xf8\x5b\x02\x5a\xf9\x5b\x01\x5b\x07\x5b\x05\x5b\x0f\x5c\x67\x5d\x99\x5d\x97\x5d\x9f\x5d\x92\x5d\xa2\x5d\x93\x5d\x95\x5d\xa0\x5d\x9c\x5d\xa1\x5d\x9a\x5d\x9e\x5e\x69\x5e\x5d\x5e\x60\x5e\x5c\x7d\xf3\x5e\xdb\x5e\xde\x5e\xe1\x5f\x49\x5f\xb2\x61\x8b\x61\x83\x61\x79\x61\xb1\x61\xb0\x61\xa2\x61\x89\x61\x9b\x61\x93\x61\xaf\x61\xad\x61\x9f\x61\x92\x61\xaa\x61\xa1\x61\x8d\x61\x66\x61\xb3\x62\x2d\x64\x6e\x64\x70\x64\x96\x64\xa0\x64\x85\x64\x97\x64\x9c\x64\x8f\x64\x8b\x64\x8a\x64\x8c\x64\xa3\x64\x9f\x64\x68\x64\xb1\x64\x98\x65\x76\x65\x7a\x65\x79\x65\x7b\x65\xb2\x65\xb3\x66\xb5\x66\xb0\x66\xa9\x66\xb2\x66\xb7\x66\xaa\x66\xaf\x6a\x00\x6a\x06\x6a\x17\x69\xe5\x69\xf8\x6a\x15\x69\xf1\x69\xe4\x6a\x20\x69\xff\x69\xec\x69\xe2\x00\x00\x00\x00", /* 8100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x1b\x6a\x1d\x69\xfe\x6a\x27\x69\xf2\x69\xee\x6a\x14\x69\xf7\x69\xe7\x6a\x40\x6a\x08\x69\xe6\x69\xfb\x6a\x0d\x69\xfc\x69\xeb\x6a\x09\x6a\x04\x6a\x18\x6a\x25\x6a\x0f\x69\xf6\x6a\x26\x6a\x07\x69\xf4\x6a\x16\x6b\x51\x6b\xa5\x6b\xa3\x6b\xa2\x6b\xa6\x6c\x01\x6c\x00\x6b\xff\x6c\x02\x6f\x41\x6f\x26\x6f\x7e\x6f\x87\x6f\xc6\x6f\x92\x6f\x8d\x6f\x89\x6f\x8c\x6f\x62\x6f\x4f\x6f\x85\x6f\x5a\x6f\x96\x6f\x76\x6f\x6c\x6f\x82\x6f\x55\x6f\x72\x6f\x52\x6f\x50\x6f\x57\x6f\x94\x6f\x93\x6f\x5d\x6f\x00\x6f\x61\x6f\x6b", /* 8180 */ "\x00\x00\x6f\x7d\x6f\x67\x6f\x90\x6f\x53\x6f\x8b\x6f\x69\x6f\x7f\x6f\x95\x6f\x63\x6f\x77\x6f\x6a\x6f\x7b\x71\xb2\x71\xaf\x71\x9b\x71\xb0\x71\xa0\x71\x9a\x71\xa9\x71\xb5\x71\x9d\x71\xa5\x71\x9e\x71\xa4\x71\xa1\x71\xaa\x71\x9c\x71\xa7\x71\xb3\x72\x98\x72\x9a\x73\x58\x73\x52\x73\x5e\x73\x5f\x73\x60\x73\x5d\x73\x5b\x73\x61\x73\x5a\x73\x59\x73\x62\x74\x87\x74\x89\x74\x8a\x74\x86\x74\x81\x74\x7d\x74\x85\x74\x88\x74\x7c\x74\x79\x75\x08\x75\x07\x75\x7e\x76\x25\x76\x1e\x76\x19\x76\x1d\x76\x1c\x76\x23\x76\x1a\x76\x28\x76\x1b\x76\x9c\x76\x9d\x76\x9e\x76\x9b\x77\x8d\x77\x8f\x77\x89\x77\x88\x78\xcd\x78\xbb\x78\xcf\x78\xcc\x78\xd1\x78\xce\x78\xd4\x78\xc8\x78\xc3\x78\xc4\x78\xc9\x79\x9a\x79\xa1\x79\xa0\x79\x9c\x79\xa2\x79\x9b\x6b\x76\x7a\x39\x7a\xb2\x7a\xb4\x7a\xb3\x7b\xb7\x7b\xcb\x7b\xbe\x7b\xac\x7b\xce\x7b\xaf\x7b\xb9\x7b\xca\x7b\xb5\x7c\xc5\x7c\xc8\x7c\xcc\x7c\xcb\x7d\xf7\x7d\xdb\x7d\xea\x7d\xe7\x7d\xd7\x7d\xe1\x7e\x03\x7d\xfa\x7d\xe6\x7d\xf6\x7d\xf1\x7d\xf0\x7d\xee\x7d\xdf\x7f\x76\x7f\xac\x7f\xb0\x7f\xad\x00\x00\x00\x00", /* 8200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xed\x7f\xeb\x7f\xea\x7f\xec\x7f\xe6\x7f\xe8\x80\x64\x80\x67\x81\xa3\x81\x9f\x81\x9e\x81\x95\x81\xa2\x81\x99\x81\x97\x82\x16\x82\x4f\x82\x53\x82\x52\x82\x50\x82\x4e\x82\x51\x85\x24\x85\x3b\x85\x0f\x85\x00\x85\x29\x85\x0e\x85\x09\x85\x0d\x85\x1f\x85\x0a\x85\x27\x85\x1c\x84\xfb\x85\x2b\x84\xfa\x85\x08\x85\x0c\x84\xf4\x85\x2a\x84\xf2\x85\x15\x84\xf7\x84\xeb\x84\xf3\x84\xfc\x85\x12\x84\xea\x84\xe9\x85\x16\x84\xfe\x85\x28\x85\x1d\x85\x2e\x85\x02\x84\xfd\x85\x1e\x84\xf6\x85\x31\x85\x26\x84\xe7\x84\xe8", /* 8280 */ "\x00\x00\x84\xf0\x84\xef\x84\xf9\x85\x18\x85\x20\x85\x30\x85\x0b\x85\x19\x85\x2f\x86\x62\x87\x56\x87\x63\x87\x64\x87\x77\x87\xe1\x87\x73\x87\x58\x87\x54\x87\x5b\x87\x52\x87\x61\x87\x5a\x87\x51\x87\x5e\x87\x6d\x87\x6a\x87\x50\x87\x4e\x87\x5f\x87\x5d\x87\x6f\x87\x6c\x87\x7a\x87\x6e\x87\x5c\x87\x65\x87\x4f\x87\x7b\x87\x75\x87\x62\x87\x67\x87\x69\x88\x5a\x89\x05\x89\x0c\x89\x14\x89\x0b\x89\x17\x89\x18\x89\x19\x89\x06\x89\x16\x89\x11\x89\x0e\x89\x09\x89\xa2\x89\xa4\x89\xa3\x89\xed\x89\xf0\x89\xec\x8a\xcf\x8a\xc6\x8a\xb8\x8a\xd3\x8a\xd1\x8a\xd4\x8a\xd5\x8a\xbb\x8a\xd7\x8a\xbe\x8a\xc0\x8a\xc5\x8a\xd8\x8a\xc3\x8a\xba\x8a\xbd\x8a\xd9\x8c\x3e\x8c\x4d\x8c\x8f\x8c\xe5\x8c\xdf\x8c\xd9\x8c\xe8\x8c\xda\x8c\xdd\x8c\xe7\x8d\xa0\x8d\x9c\x8d\xa1\x8d\x9b\x8e\x20\x8e\x23\x8e\x25\x8e\x24\x8e\x2e\x8e\x15\x8e\x1b\x8e\x16\x8e\x11\x8e\x19\x8e\x26\x8e\x27\x8e\x14\x8e\x12\x8e\x18\x8e\x13\x8e\x1c\x8e\x17\x8e\x1a\x8f\x2c\x8f\x24\x8f\x18\x8f\x1a\x8f\x20\x8f\x23\x8f\x16\x8f\x17\x90\x73\x90\x70\x90\x6f\x90\x67\x90\x6b\x91\x2f\x00\x00\x00\x00", /* 8300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x2b\x91\x29\x91\x2a\x91\x32\x91\x26\x91\x2e\x91\x85\x91\x86\x91\x8a\x91\x81\x91\x82\x91\x84\x91\x80\x92\xd0\x92\xc3\x92\xc4\x92\xc0\x92\xd9\x92\xb6\x92\xcf\x92\xf1\x92\xdf\x92\xd8\x92\xe9\x92\xd7\x92\xdd\x92\xcc\x92\xef\x92\xc2\x92\xe8\x92\xca\x92\xc8\x92\xce\x92\xe6\x92\xcd\x92\xd5\x92\xc9\x92\xe0\x92\xde\x92\xe7\x92\xd1\x92\xd3\x92\xb5\x92\xe1\x92\xc6\x92\xb4\x95\x7c\x95\xac\x95\xab\x95\xae\x95\xb0\x96\xa4\x96\xa2\x96\xd3\x97\x05\x97\x08\x97\x02\x97\x5a\x97\x8a\x97\x8e\x97\x88\x97\xd0\x97\xcf", /* 8380 */ "\x00\x00\x98\x1e\x98\x1d\x98\x26\x98\x29\x98\x28\x98\x20\x98\x1b\x98\x27\x98\xb2\x99\x08\x98\xfa\x99\x11\x99\x14\x99\x16\x99\x17\x99\x15\x99\xdc\x99\xcd\x99\xcf\x99\xd3\x99\xd4\x99\xce\x99\xc9\x99\xd6\x99\xd8\x99\xcb\x99\xd7\x99\xcc\x9a\xb3\x9a\xec\x9a\xeb\x9a\xf3\x9a\xf2\x9a\xf1\x9b\x46\x9b\x43\x9b\x67\x9b\x74\x9b\x71\x9b\x66\x9b\x76\x9b\x75\x9b\x70\x9b\x68\x9b\x64\x9b\x6c\x9c\xfc\x9c\xfa\x9c\xfd\x9c\xff\x9c\xf7\x9d\x07\x9d\x00\x9c\xf9\x9c\xfb\x9d\x08\x9d\x05\x9d\x04\x9e\x83\x9e\xd3\x9f\x0f\x9f\x10\x51\x1c\x51\x13\x51\x17\x51\x1a\x51\x11\x51\xde\x53\x34\x53\xe1\x56\x70\x56\x60\x56\x6e\x56\x73\x56\x66\x56\x63\x56\x6d\x56\x72\x56\x5e\x56\x77\x57\x1c\x57\x1b\x58\xc8\x58\xbd\x58\xc9\x58\xbf\x58\xba\x58\xc2\x58\xbc\x58\xc6\x5b\x17\x5b\x19\x5b\x1b\x5b\x21\x5b\x14\x5b\x13\x5b\x10\x5b\x16\x5b\x28\x5b\x1a\x5b\x20\x5b\x1e\x5b\xef\x5d\xac\x5d\xb1\x5d\xa9\x5d\xa7\x5d\xb5\x5d\xb0\x5d\xae\x5d\xaa\x5d\xa8\x5d\xb2\x5d\xad\x5d\xaf\x5d\xb4\x5e\x67\x5e\x68\x5e\x66\x5e\x6f\x5e\xe9\x5e\xe7\x5e\xe6\x5e\xe8\x5e\xe5\x00\x00\x00\x00", /* 8400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x4b\x5f\xbc\x61\x9d\x61\xa8\x61\x96\x61\xc5\x61\xb4\x61\xc6\x61\xc1\x61\xcc\x61\xba\x61\xbf\x61\xb8\x61\x8c\x64\xd7\x64\xd6\x64\xd0\x64\xcf\x64\xc9\x64\xbd\x64\x89\x64\xc3\x64\xdb\x64\xf3\x64\xd9\x65\x33\x65\x7f\x65\x7c\x65\xa2\x66\xc8\x66\xbe\x66\xc0\x66\xca\x66\xcb\x66\xcf\x66\xbd\x66\xbb\x66\xba\x66\xcc\x67\x23\x6a\x34\x6a\x66\x6a\x49\x6a\x67\x6a\x32\x6a\x68\x6a\x3e\x6a\x5d\x6a\x6d\x6a\x76\x6a\x5b\x6a\x51\x6a\x28\x6a\x5a\x6a\x3b\x6a\x3f\x6a\x41\x6a\x6a\x6a\x64\x6a\x50\x6a\x4f\x6a\x54\x6a\x6f", /* 8480 */ "\x00\x00\x6a\x69\x6a\x60\x6a\x3c\x6a\x5e\x6a\x56\x6a\x55\x6a\x4d\x6a\x4e\x6a\x46\x6b\x55\x6b\x54\x6b\x56\x6b\xa7\x6b\xaa\x6b\xab\x6b\xc8\x6b\xc7\x6c\x04\x6c\x03\x6c\x06\x6f\xad\x6f\xcb\x6f\xa3\x6f\xc7\x6f\xbc\x6f\xce\x6f\xc8\x6f\x5e\x6f\xc4\x6f\xbd\x6f\x9e\x6f\xca\x6f\xa8\x70\x04\x6f\xa5\x6f\xae\x6f\xba\x6f\xac\x6f\xaa\x6f\xcf\x6f\xbf\x6f\xb8\x6f\xa2\x6f\xc9\x6f\xab\x6f\xcd\x6f\xaf\x6f\xb2\x6f\xb0\x71\xc5\x71\xc2\x71\xbf\x71\xb8\x71\xd6\x71\xc0\x71\xc1\x71\xcb\x71\xd4\x71\xca\x71\xc7\x71\xcf\x71\xbd\x71\xd8\x71\xbc\x71\xc6\x71\xda\x71\xdb\x72\x9d\x72\x9e\x73\x69\x73\x66\x73\x67\x73\x6c\x73\x65\x73\x6b\x73\x6a\x74\x7f\x74\x9a\x74\xa0\x74\x94\x74\x92\x74\x95\x74\xa1\x75\x0b\x75\x80\x76\x2f\x76\x2d\x76\x31\x76\x3d\x76\x33\x76\x3c\x76\x35\x76\x32\x76\x30\x76\xbb\x76\xe6\x77\x9a\x77\x9d\x77\xa1\x77\x9c\x77\x9b\x77\xa2\x77\xa3\x77\x95\x77\x99\x77\x97\x78\xdd\x78\xe9\x78\xe5\x78\xea\x78\xde\x78\xe3\x78\xdb\x78\xe1\x78\xe2\x78\xed\x78\xdf\x78\xe0\x79\xa4\x7a\x44\x7a\x48\x7a\x47\x7a\xb6\x7a\xb8\x7a\xb5\x00\x00\x00\x00", /* 8500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\xb1\x7a\xb7\x7b\xde\x7b\xe3\x7b\xe7\x7b\xdd\x7b\xd5\x7b\xe5\x7b\xda\x7b\xe8\x7b\xf9\x7b\xd4\x7b\xea\x7b\xe2\x7b\xdc\x7b\xeb\x7b\xd8\x7b\xdf\x7c\xd2\x7c\xd4\x7c\xd7\x7c\xd0\x7c\xd1\x7e\x12\x7e\x21\x7e\x17\x7e\x0c\x7e\x1f\x7e\x20\x7e\x13\x7e\x0e\x7e\x1c\x7e\x15\x7e\x1a\x7e\x22\x7e\x0b\x7e\x0f\x7e\x16\x7e\x0d\x7e\x14\x7e\x25\x7e\x24\x7f\x43\x7f\x7b\x7f\x7c\x7f\x7a\x7f\xb1\x7f\xef\x80\x2a\x80\x29\x80\x6c\x81\xb1\x81\xa6\x81\xae\x81\xb9\x81\xb5\x81\xab\x81\xb0\x81\xac\x81\xb4\x81\xb2\x81\xb7\x81\xa7", /* 8580 */ "\x00\x00\x81\xf2\x82\x55\x82\x56\x82\x57\x85\x56\x85\x45\x85\x6b\x85\x4d\x85\x53\x85\x61\x85\x58\x85\x40\x85\x46\x85\x64\x85\x41\x85\x62\x85\x44\x85\x51\x85\x47\x85\x63\x85\x3e\x85\x5b\x85\x71\x85\x4e\x85\x6e\x85\x75\x85\x55\x85\x67\x85\x60\x85\x8c\x85\x66\x85\x5d\x85\x54\x85\x65\x85\x6c\x86\x63\x86\x65\x86\x64\x87\x9b\x87\x8f\x87\x97\x87\x93\x87\x92\x87\x88\x87\x81\x87\x96\x87\x98\x87\x79\x87\x87\x87\xa3\x87\x85\x87\x90\x87\x91\x87\x9d\x87\x84\x87\x94\x87\x9c\x87\x9a\x87\x89\x89\x1e\x89\x26\x89\x30\x89\x2d\x89\x2e\x89\x27\x89\x31\x89\x22\x89\x29\x89\x23\x89\x2f\x89\x2c\x89\x1f\x89\xf1\x8a\xe0\x8a\xe2\x8a\xf2\x8a\xf4\x8a\xf5\x8a\xdd\x8b\x14\x8a\xe4\x8a\xdf\x8a\xf0\x8a\xc8\x8a\xde\x8a\xe1\x8a\xe8\x8a\xff\x8a\xef\x8a\xfb\x8c\x91\x8c\x92\x8c\x90\x8c\xf5\x8c\xee\x8c\xf1\x8c\xf0\x8c\xf3\x8d\x6c\x8d\x6e\x8d\xa5\x8d\xa7\x8e\x33\x8e\x3e\x8e\x38\x8e\x40\x8e\x45\x8e\x36\x8e\x3c\x8e\x3d\x8e\x41\x8e\x30\x8e\x3f\x8e\xbd\x8f\x36\x8f\x2e\x8f\x35\x8f\x32\x8f\x39\x8f\x37\x8f\x34\x90\x76\x90\x79\x90\x7b\x90\x86\x00\x00\x00\x00", /* 8600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xfa\x91\x33\x91\x35\x91\x36\x91\x93\x91\x90\x91\x91\x91\x8d\x91\x8f\x93\x27\x93\x1e\x93\x08\x93\x1f\x93\x06\x93\x0f\x93\x7a\x93\x38\x93\x3c\x93\x1b\x93\x23\x93\x12\x93\x01\x93\x46\x93\x2d\x93\x0e\x93\x0d\x92\xcb\x93\x1d\x92\xfa\x93\x25\x93\x13\x92\xf9\x92\xf7\x93\x34\x93\x02\x93\x24\x92\xff\x93\x29\x93\x39\x93\x35\x93\x2a\x93\x14\x93\x0c\x93\x0b\x92\xfe\x93\x09\x93\x00\x92\xfb\x93\x16\x95\xbc\x95\xcd\x95\xbe\x95\xb9\x95\xba\x95\xb6\x95\xbf\x95\xb5\x95\xbd\x96\xa9\x96\xd4\x97\x0b\x97\x12\x97\x10", /* 8680 */ "\x00\x00\x97\x99\x97\x97\x97\x94\x97\xf0\x97\xf8\x98\x35\x98\x2f\x98\x32\x99\x24\x99\x1f\x99\x27\x99\x29\x99\x9e\x99\xee\x99\xec\x99\xe5\x99\xe4\x99\xf0\x99\xe3\x99\xea\x99\xe9\x99\xe7\x9a\xb9\x9a\xbf\x9a\xb4\x9a\xbb\x9a\xf6\x9a\xfa\x9a\xf9\x9a\xf7\x9b\x33\x9b\x80\x9b\x85\x9b\x87\x9b\x7c\x9b\x7e\x9b\x7b\x9b\x82\x9b\x93\x9b\x92\x9b\x90\x9b\x7a\x9b\x95\x9b\x7d\x9b\x88\x9d\x25\x9d\x17\x9d\x20\x9d\x1e\x9d\x14\x9d\x29\x9d\x1d\x9d\x18\x9d\x22\x9d\x10\x9d\x19\x9d\x1f\x9e\x88\x9e\x86\x9e\x87\x9e\xae\x9e\xad\x9e\xd5\x9e\xd6\x9e\xfa\x9f\x12\x9f\x3d\x51\x26\x51\x25\x51\x22\x51\x24\x51\x20\x51\x29\x52\xf4\x56\x93\x56\x8c\x56\x8d\x56\x86\x56\x84\x56\x83\x56\x7e\x56\x82\x56\x7f\x56\x81\x58\xd6\x58\xd4\x58\xcf\x58\xd2\x5b\x2d\x5b\x25\x5b\x32\x5b\x23\x5b\x2c\x5b\x27\x5b\x26\x5b\x2f\x5b\x2e\x5b\x7b\x5b\xf1\x5b\xf2\x5d\xb7\x5e\x6c\x5e\x6a\x5f\xbe\x5f\xbb\x61\xc3\x61\xb5\x61\xbc\x61\xe7\x61\xe0\x61\xe5\x61\xe4\x61\xe8\x61\xde\x64\xef\x64\xe9\x64\xe3\x64\xeb\x64\xe4\x64\xe8\x65\x81\x65\x80\x65\xb6\x65\xda\x66\xd2\x00\x00\x00\x00", /* 8700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x8d\x6a\x96\x6a\x81\x6a\xa5\x6a\x89\x6a\x9f\x6a\x9b\x6a\xa1\x6a\x9e\x6a\x87\x6a\x93\x6a\x8e\x6a\x95\x6a\x83\x6a\xa8\x6a\xa4\x6a\x91\x6a\x7f\x6a\xa6\x6a\x9a\x6a\x85\x6a\x8c\x6a\x92\x6b\x5b\x6b\xad\x6c\x09\x6f\xcc\x6f\xa9\x6f\xf4\x6f\xd4\x6f\xe3\x6f\xdc\x6f\xed\x6f\xe7\x6f\xe6\x6f\xde\x6f\xf2\x6f\xdd\x6f\xe2\x6f\xe8\x71\xe1\x71\xf1\x71\xe8\x71\xf2\x71\xe4\x71\xf0\x71\xe2\x73\x73\x73\x6e\x73\x6f\x74\x97\x74\xb2\x74\xab\x74\x90\x74\xaa\x74\xad\x74\xb1\x74\xa5\x74\xaf\x75\x10\x75\x11\x75\x12\x75\x0f", /* 8780 */ "\x00\x00\x75\x84\x76\x43\x76\x48\x76\x49\x76\x47\x76\xa4\x76\xe9\x77\xb5\x77\xab\x77\xb2\x77\xb7\x77\xb6\x77\xb4\x77\xb1\x77\xa8\x77\xf0\x78\xf3\x78\xfd\x79\x02\x78\xfb\x78\xfc\x78\xf2\x79\x05\x78\xf9\x78\xfe\x79\x04\x79\xab\x79\xa8\x7a\x5c\x7a\x5b\x7a\x56\x7a\x58\x7a\x54\x7a\x5a\x7a\xbe\x7a\xc0\x7a\xc1\x7c\x05\x7c\x0f\x7b\xf2\x7c\x00\x7b\xff\x7b\xfb\x7c\x0e\x7b\xf4\x7c\x0b\x7b\xf3\x7c\x02\x7c\x09\x7c\x03\x7c\x01\x7b\xf8\x7b\xfd\x7c\x06\x7b\xf0\x7b\xf1\x7c\x10\x7c\x0a\x7c\xe8\x7e\x2d\x7e\x3c\x7e\x42\x7e\x33\x98\x48\x7e\x38\x7e\x2a\x7e\x49\x7e\x40\x7e\x47\x7e\x29\x7e\x4c\x7e\x30\x7e\x3b\x7e\x36\x7e\x44\x7e\x3a\x7f\x45\x7f\x7f\x7f\x7e\x7f\x7d\x7f\xf4\x7f\xf2\x80\x2c\x81\xbb\x81\xc4\x81\xcc\x81\xca\x81\xc5\x81\xc7\x81\xbc\x81\xe9\x82\x5b\x82\x5a\x82\x5c\x85\x83\x85\x80\x85\x8f\x85\xa7\x85\x95\x85\xa0\x85\x8b\x85\xa3\x85\x7b\x85\xa4\x85\x9a\x85\x9e\x85\x77\x85\x7c\x85\x89\x85\xa1\x85\x7a\x85\x78\x85\x57\x85\x8e\x85\x96\x85\x86\x85\x8d\x85\x99\x85\x9d\x85\x81\x85\xa2\x85\x82\x85\x88\x85\x85\x85\x79\x00\x00\x00\x00", /* 8800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x76\x85\x98\x85\x90\x85\x9f\x86\x68\x87\xbe\x87\xaa\x87\xad\x87\xc5\x87\xb0\x87\xac\x87\xb9\x87\xb5\x87\xbc\x87\xae\x87\xc9\x87\xc3\x87\xc2\x87\xcc\x87\xb7\x87\xaf\x87\xc4\x87\xca\x87\xb4\x87\xb6\x87\xbf\x87\xb8\x87\xbd\x87\xde\x87\xb2\x89\x35\x89\x33\x89\x3c\x89\x3e\x89\x41\x89\x52\x89\x37\x89\x42\x89\xad\x89\xaf\x89\xae\x89\xf2\x89\xf3\x8b\x1e\x8b\x18\x8b\x16\x8b\x11\x8b\x05\x8b\x0b\x8b\x22\x8b\x0f\x8b\x12\x8b\x15\x8b\x07\x8b\x0d\x8b\x08\x8b\x06\x8b\x1c\x8b\x13\x8b\x1a\x8c\x4f\x8c\x70\x8c\x72", /* 8880 */ "\x00\x00\x8c\x71\x8c\x6f\x8c\x95\x8c\x94\x8c\xf9\x8d\x6f\x8e\x4e\x8e\x4d\x8e\x53\x8e\x50\x8e\x4c\x8e\x47\x8f\x43\x8f\x40\x90\x85\x90\x7e\x91\x38\x91\x9a\x91\xa2\x91\x9b\x91\x99\x91\x9f\x91\xa1\x91\x9d\x91\xa0\x93\xa1\x93\x83\x93\xaf\x93\x64\x93\x56\x93\x47\x93\x7c\x93\x58\x93\x5c\x93\x76\x93\x49\x93\x50\x93\x51\x93\x60\x93\x6d\x93\x8f\x93\x4c\x93\x6a\x93\x79\x93\x57\x93\x55\x93\x52\x93\x4f\x93\x71\x93\x77\x93\x7b\x93\x61\x93\x5e\x93\x63\x93\x67\x93\x80\x93\x4e\x93\x59\x95\xc7\x95\xc0\x95\xc9\x95\xc3\x95\xc5\x95\xb7\x96\xae\x96\xb0\x96\xac\x97\x20\x97\x1f\x97\x18\x97\x1d\x97\x19\x97\x9a\x97\xa1\x97\x9c\x97\x9e\x97\x9d\x97\xd5\x97\xd4\x97\xf1\x98\x41\x98\x44\x98\x4a\x98\x49\x98\x45\x98\x43\x99\x25\x99\x2b\x99\x2c\x99\x2a\x99\x33\x99\x32\x99\x2f\x99\x2d\x99\x31\x99\x30\x99\x98\x99\xa3\x99\xa1\x9a\x02\x99\xfa\x99\xf4\x99\xf7\x99\xf9\x99\xf8\x99\xf6\x99\xfb\x99\xfd\x99\xfe\x99\xfc\x9a\x03\x9a\xbe\x9a\xfe\x9a\xfd\x9b\x01\x9a\xfc\x9b\x48\x9b\x9a\x9b\xa8\x9b\x9e\x9b\x9b\x9b\xa6\x9b\xa1\x9b\xa5\x9b\xa4\x00\x00\x00\x00", /* 8900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x86\x9b\xa2\x9b\xa0\x9b\xaf\x9d\x33\x9d\x41\x9d\x67\x9d\x36\x9d\x2e\x9d\x2f\x9d\x31\x9d\x38\x9d\x30\x9d\x45\x9d\x42\x9d\x43\x9d\x3e\x9d\x37\x9d\x40\x9d\x3d\x7f\xf5\x9d\x2d\x9e\x8a\x9e\x89\x9e\x8d\x9e\xb0\x9e\xc8\x9e\xda\x9e\xfb\x9e\xff\x9f\x24\x9f\x23\x9f\x22\x9f\x54\x9f\xa0\x51\x31\x51\x2d\x51\x2e\x56\x98\x56\x9c\x56\x97\x56\x9a\x56\x9d\x56\x99\x59\x70\x5b\x3c\x5c\x69\x5c\x6a\x5d\xc0\x5e\x6d\x5e\x6e\x61\xd8\x61\xdf\x61\xed\x61\xee\x61\xf1\x61\xea\x61\xf0\x61\xeb\x61\xd6\x61\xe9\x64\xff\x65\x04", /* 8980 */ "\x00\x00\x64\xfd\x64\xf8\x65\x01\x65\x03\x64\xfc\x65\x94\x65\xdb\x66\xda\x66\xdb\x66\xd8\x6a\xc5\x6a\xb9\x6a\xbd\x6a\xe1\x6a\xc6\x6a\xba\x6a\xb6\x6a\xb7\x6a\xc7\x6a\xb4\x6a\xad\x6b\x5e\x6b\xc9\x6c\x0b\x70\x07\x70\x0c\x70\x0d\x70\x01\x70\x05\x70\x14\x70\x0e\x6f\xff\x70\x00\x6f\xfb\x70\x26\x6f\xfc\x6f\xf7\x70\x0a\x72\x01\x71\xff\x71\xf9\x72\x03\x71\xfd\x73\x76\x74\xb8\x74\xc0\x74\xb5\x74\xc1\x74\xbe\x74\xb6\x74\xbb\x74\xc2\x75\x14\x75\x13\x76\x5c\x76\x64\x76\x59\x76\x50\x76\x53\x76\x57\x76\x5a\x76\xa6\x76\xbd\x76\xec\x77\xc2\x77\xba\x78\xff\x79\x0c\x79\x13\x79\x14\x79\x09\x79\x10\x79\x12\x79\x11\x79\xad\x79\xac\x7a\x5f\x7c\x1c\x7c\x29\x7c\x19\x7c\x20\x7c\x1f\x7c\x2d\x7c\x1d\x7c\x26\x7c\x28\x7c\x22\x7c\x25\x7c\x30\x7e\x5c\x7e\x50\x7e\x56\x7e\x63\x7e\x58\x7e\x62\x7e\x5f\x7e\x51\x7e\x60\x7e\x57\x7e\x53\x7f\xb5\x7f\xb3\x7f\xf7\x7f\xf8\x80\x75\x81\xd1\x81\xd2\x81\xd0\x82\x5f\x82\x5e\x85\xb4\x85\xc6\x85\xc0\x85\xc3\x85\xc2\x85\xb3\x85\xb5\x85\xbd\x85\xc7\x85\xc4\x85\xbf\x85\xcb\x85\xce\x85\xc8\x85\xc5\x00\x00\x00\x00", /* 8a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\xb1\x85\xb6\x85\xd2\x86\x24\x85\xb8\x85\xb7\x85\xbe\x86\x69\x87\xe7\x87\xe6\x87\xe2\x87\xdb\x87\xeb\x87\xea\x87\xe5\x87\xdf\x87\xf3\x87\xe4\x87\xd4\x87\xdc\x87\xd3\x87\xed\x87\xd8\x87\xe3\x87\xa4\x87\xd7\x87\xd9\x88\x01\x87\xf4\x87\xe8\x87\xdd\x89\x53\x89\x4b\x89\x4f\x89\x4c\x89\x46\x89\x50\x89\x51\x89\x49\x8b\x2a\x8b\x27\x8b\x23\x8b\x33\x8b\x30\x8b\x35\x8b\x47\x8b\x2f\x8b\x3c\x8b\x3e\x8b\x31\x8b\x25\x8b\x37\x8b\x26\x8b\x36\x8b\x2e\x8b\x24\x8b\x3b\x8b\x3d\x8b\x3a\x8c\x42\x8c\x75\x8c\x99\x8c\x98", /* 8a80 */ "\x00\x00\x8c\x97\x8c\xfe\x8d\x04\x8d\x02\x8d\x00\x8e\x5c\x8e\x62\x8e\x60\x8e\x57\x8e\x56\x8e\x5e\x8e\x65\x8e\x67\x8e\x5b\x8e\x5a\x8e\x61\x8e\x5d\x8e\x69\x8e\x54\x8f\x46\x8f\x47\x8f\x48\x8f\x4b\x91\x28\x91\x3a\x91\x3b\x91\x3e\x91\xa8\x91\xa5\x91\xa7\x91\xaf\x91\xaa\x93\xb5\x93\x8c\x93\x92\x93\xb7\x93\x9b\x93\x9d\x93\x89\x93\xa7\x93\x8e\x93\xaa\x93\x9e\x93\xa6\x93\x95\x93\x88\x93\x99\x93\x9f\x93\x8d\x93\xb1\x93\x91\x93\xb2\x93\xa4\x93\xa8\x93\xb4\x93\xa3\x93\xa5\x95\xd2\x95\xd3\x95\xd1\x96\xb3\x96\xd7\x96\xda\x5d\xc2\x96\xdf\x96\xd8\x96\xdd\x97\x23\x97\x22\x97\x25\x97\xac\x97\xae\x97\xa8\x97\xab\x97\xa4\x97\xaa\x97\xa2\x97\xa5\x97\xd7\x97\xd9\x97\xd6\x97\xd8\x97\xfa\x98\x50\x98\x51\x98\x52\x98\xb8\x99\x41\x99\x3c\x99\x3a\x9a\x0f\x9a\x0b\x9a\x09\x9a\x0d\x9a\x04\x9a\x11\x9a\x0a\x9a\x05\x9a\x07\x9a\x06\x9a\xc0\x9a\xdc\x9b\x08\x9b\x04\x9b\x05\x9b\x29\x9b\x35\x9b\x4a\x9b\x4c\x9b\x4b\x9b\xc7\x9b\xc6\x9b\xc3\x9b\xbf\x9b\xc1\x9b\xb5\x9b\xb8\x9b\xd3\x9b\xb6\x9b\xc4\x9b\xb9\x9b\xbd\x9d\x5c\x9d\x53\x9d\x4f\x00\x00\x00\x00", /* 8b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x4a\x9d\x5b\x9d\x4b\x9d\x59\x9d\x56\x9d\x4c\x9d\x57\x9d\x52\x9d\x54\x9d\x5f\x9d\x58\x9d\x5a\x9e\x8e\x9e\x8c\x9e\xdf\x9f\x01\x9f\x00\x9f\x16\x9f\x25\x9f\x2b\x9f\x2a\x9f\x29\x9f\x28\x9f\x4c\x9f\x55\x51\x34\x51\x35\x52\x96\x52\xf7\x53\xb4\x56\xab\x56\xad\x56\xa6\x56\xa7\x56\xaa\x56\xac\x58\xda\x58\xdd\x58\xdb\x59\x12\x5b\x3d\x5b\x3e\x5b\x3f\x5d\xc3\x5e\x70\x5f\xbf\x61\xfb\x65\x07\x65\x10\x65\x0d\x65\x09\x65\x0c\x65\x0e\x65\x84\x65\xde\x65\xdd\x66\xde\x6a\xe7\x6a\xe0\x6a\xcc\x6a\xd1\x6a\xd9\x6a\xcb", /* 8b80 */ "\x00\x00\x6a\xdf\x6a\xdc\x6a\xd0\x6a\xeb\x6a\xcf\x6a\xcd\x6a\xde\x6b\x60\x6b\xb0\x6c\x0c\x70\x19\x70\x27\x70\x20\x70\x16\x70\x2b\x70\x21\x70\x22\x70\x23\x70\x29\x70\x17\x70\x24\x70\x1c\x70\x2a\x72\x0c\x72\x0a\x72\x07\x72\x02\x72\x05\x72\xa5\x72\xa6\x72\xa4\x72\xa3\x72\xa1\x74\xcb\x74\xc5\x74\xb7\x74\xc3\x75\x16\x76\x60\x77\xc9\x77\xca\x77\xc4\x77\xf1\x79\x1d\x79\x1b\x79\x21\x79\x1c\x79\x17\x79\x1e\x79\xb0\x7a\x67\x7a\x68\x7c\x33\x7c\x3c\x7c\x39\x7c\x2c\x7c\x3b\x7c\xec\x7c\xea\x7e\x76\x7e\x75\x7e\x78\x7e\x70\x7e\x77\x7e\x6f\x7e\x7a\x7e\x72\x7e\x74\x7e\x68\x7f\x4b\x7f\x4a\x7f\x83\x7f\x86\x7f\xb7\x7f\xfd\x7f\xfe\x80\x78\x81\xd7\x81\xd5\x82\x64\x82\x61\x82\x63\x85\xeb\x85\xf1\x85\xed\x85\xd9\x85\xe1\x85\xe8\x85\xda\x85\xd7\x85\xec\x85\xf2\x85\xf8\x85\xd8\x85\xdf\x85\xe3\x85\xdc\x85\xd1\x85\xf0\x85\xe6\x85\xef\x85\xde\x85\xe2\x88\x00\x87\xfa\x88\x03\x87\xf6\x87\xf7\x88\x09\x88\x0c\x88\x0b\x88\x06\x87\xfc\x88\x08\x87\xff\x88\x0a\x88\x02\x89\x62\x89\x5a\x89\x5b\x89\x57\x89\x61\x89\x5c\x89\x58\x89\x5d\x00\x00\x00\x00", /* 8c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x59\x89\x88\x89\xb7\x89\xb6\x89\xf6\x8b\x50\x8b\x48\x8b\x4a\x8b\x40\x8b\x53\x8b\x56\x8b\x54\x8b\x4b\x8b\x55\x8b\x51\x8b\x42\x8b\x52\x8b\x57\x8c\x43\x8c\x77\x8c\x76\x8c\x9a\x8d\x06\x8d\x07\x8d\x09\x8d\xac\x8d\xaa\x8d\xad\x8d\xab\x8e\x6d\x8e\x78\x8e\x73\x8e\x6a\x8e\x6f\x8e\x7b\x8e\xc2\x8f\x52\x8f\x51\x8f\x4f\x8f\x50\x8f\x53\x8f\xb4\x91\x40\x91\x3f\x91\xb0\x91\xad\x93\xde\x93\xc7\x93\xcf\x93\xc2\x93\xda\x93\xd0\x93\xf9\x93\xec\x93\xcc\x93\xd9\x93\xa9\x93\xe6\x93\xca\x93\xd4\x93\xee\x93\xe3\x93\xd5", /* 8c80 */ "\x00\x00\x93\xc4\x93\xce\x93\xc0\x93\xd2\x93\xe7\x95\x7d\x95\xda\x95\xdb\x96\xe1\x97\x29\x97\x2b\x97\x2c\x97\x28\x97\x26\x97\xb3\x97\xb7\x97\xb6\x97\xdd\x97\xde\x97\xdf\x98\x5c\x98\x59\x98\x5d\x98\x57\x98\xbf\x98\xbd\x98\xbb\x98\xbe\x99\x48\x99\x47\x99\x43\x99\xa6\x99\xa7\x9a\x1a\x9a\x15\x9a\x25\x9a\x1d\x9a\x24\x9a\x1b\x9a\x22\x9a\x20\x9a\x27\x9a\x23\x9a\x1e\x9a\x1c\x9a\x14\x9a\xc2\x9b\x0b\x9b\x0a\x9b\x0e\x9b\x0c\x9b\x37\x9b\xea\x9b\xeb\x9b\xe0\x9b\xde\x9b\xe4\x9b\xe6\x9b\xe2\x9b\xf0\x9b\xd4\x9b\xd7\x9b\xec\x9b\xdc\x9b\xd9\x9b\xe5\x9b\xd5\x9b\xe1\x9b\xda\x9d\x77\x9d\x81\x9d\x8a\x9d\x84\x9d\x88\x9d\x71\x9d\x80\x9d\x78\x9d\x86\x9d\x8b\x9d\x8c\x9d\x7d\x9d\x6b\x9d\x74\x9d\x75\x9d\x70\x9d\x69\x9d\x85\x9d\x73\x9d\x7b\x9d\x82\x9d\x6f\x9d\x79\x9d\x7f\x9d\x87\x9d\x68\x9e\x94\x9e\x91\x9e\xc0\x9e\xfc\x9f\x2d\x9f\x40\x9f\x41\x9f\x4d\x9f\x56\x9f\x57\x9f\x58\x53\x37\x56\xb2\x56\xb5\x56\xb3\x58\xe3\x5b\x45\x5d\xc6\x5d\xc7\x5e\xee\x5e\xef\x5f\xc0\x5f\xc1\x61\xf9\x65\x17\x65\x16\x65\x15\x65\x13\x65\xdf\x66\xe8\x00\x00\x00\x00", /* 8d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xe3\x66\xe4\x6a\xf3\x6a\xf0\x6a\xea\x6a\xe8\x6a\xf9\x6a\xf1\x6a\xee\x6a\xef\x70\x3c\x70\x35\x70\x2f\x70\x37\x70\x34\x70\x31\x70\x42\x70\x38\x70\x3f\x70\x3a\x70\x39\x70\x40\x70\x3b\x70\x33\x70\x41\x72\x13\x72\x14\x72\xa8\x73\x7d\x73\x7c\x74\xba\x76\xab\x76\xaa\x76\xbe\x76\xed\x77\xcc\x77\xce\x77\xcf\x77\xcd\x77\xf2\x79\x25\x79\x23\x79\x27\x79\x28\x79\x24\x79\x29\x79\xb2\x7a\x6e\x7a\x6c\x7a\x6d\x7a\xf7\x7c\x49\x7c\x48\x7c\x4a\x7c\x47\x7c\x45\x7c\xee\x7e\x7b\x7e\x7e\x7e\x81\x7e\x80\x7f\xba\x7f\xff", /* 8d80 */ "\x00\x00\x80\x79\x81\xdb\x81\xd9\x82\x0b\x82\x68\x82\x69\x86\x22\x85\xff\x86\x01\x85\xfe\x86\x1b\x86\x00\x85\xf6\x86\x04\x86\x09\x86\x05\x86\x0c\x85\xfd\x88\x19\x88\x10\x88\x11\x88\x17\x88\x13\x88\x16\x89\x63\x89\x66\x89\xb9\x89\xf7\x8b\x60\x8b\x6a\x8b\x5d\x8b\x68\x8b\x63\x8b\x65\x8b\x67\x8b\x6d\x8d\xae\x8e\x86\x8e\x88\x8e\x84\x8f\x59\x8f\x56\x8f\x57\x8f\x55\x8f\x58\x8f\x5a\x90\x8d\x91\x43\x91\x41\x91\xb7\x91\xb5\x91\xb2\x91\xb3\x94\x0b\x94\x13\x93\xfb\x94\x20\x94\x0f\x94\x14\x93\xfe\x94\x15\x94\x10\x94\x28\x94\x19\x94\x0d\x93\xf5\x94\x00\x93\xf7\x94\x07\x94\x0e\x94\x16\x94\x12\x93\xfa\x94\x09\x93\xf8\x94\x0a\x93\xff\x93\xfc\x94\x0c\x93\xf6\x94\x11\x94\x06\x95\xde\x95\xe0\x95\xdf\x97\x2e\x97\x2f\x97\xb9\x97\xbb\x97\xfd\x97\xfe\x98\x60\x98\x62\x98\x63\x98\x5f\x98\xc1\x98\xc2\x99\x50\x99\x4e\x99\x59\x99\x4c\x99\x4b\x99\x53\x9a\x32\x9a\x34\x9a\x31\x9a\x2c\x9a\x2a\x9a\x36\x9a\x29\x9a\x2e\x9a\x38\x9a\x2d\x9a\xc7\x9a\xca\x9a\xc6\x9b\x10\x9b\x12\x9b\x11\x9c\x0b\x9c\x08\x9b\xf7\x9c\x05\x9c\x12\x9b\xf8\x00\x00\x00\x00", /* 8e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x40\x9c\x07\x9c\x0e\x9c\x06\x9c\x17\x9c\x14\x9c\x09\x9d\x9f\x9d\x99\x9d\xa4\x9d\x9d\x9d\x92\x9d\x98\x9d\x90\x9d\x9b\x9d\xa0\x9d\x94\x9d\x9c\x9d\xaa\x9d\x97\x9d\xa1\x9d\x9a\x9d\xa2\x9d\xa8\x9d\x9e\x9d\xa3\x9d\xbf\x9d\xa9\x9d\x96\x9d\xa6\x9d\xa7\x9e\x99\x9e\x9b\x9e\x9a\x9e\xe5\x9e\xe4\x9e\xe7\x9e\xe6\x9f\x30\x9f\x2e\x9f\x5b\x9f\x60\x9f\x5e\x9f\x5d\x9f\x59\x9f\x91\x51\x3a\x51\x39\x52\x98\x52\x97\x56\xc3\x56\xbd\x56\xbe\x5b\x48\x5b\x47\x5d\xcb\x5d\xcf\x5e\xf1\x61\xfd\x65\x1b\x6b\x02\x6a\xfc\x6b\x03", /* 8e80 */ "\x00\x00\x6a\xf8\x6b\x00\x70\x43\x70\x44\x70\x4a\x70\x48\x70\x49\x70\x45\x70\x46\x72\x1d\x72\x1a\x72\x19\x73\x7e\x75\x17\x76\x6a\x77\xd0\x79\x2d\x79\x31\x79\x2f\x7c\x54\x7c\x53\x7c\xf2\x7e\x8a\x7e\x87\x7e\x88\x7e\x8b\x7e\x86\x7e\x8d\x7f\x4d\x7f\xbb\x80\x30\x81\xdd\x86\x18\x86\x2a\x86\x26\x86\x1f\x86\x23\x86\x1c\x86\x19\x86\x27\x86\x2e\x86\x21\x86\x20\x86\x29\x86\x1e\x86\x25\x88\x29\x88\x1d\x88\x1b\x88\x20\x88\x24\x88\x1c\x88\x2b\x88\x4a\x89\x6d\x89\x69\x89\x6e\x89\x6b\x89\xfa\x8b\x79\x8b\x78\x8b\x45\x8b\x7a\x8b\x7b\x8d\x10\x8d\x14\x8d\xaf\x8e\x8e\x8e\x8c\x8f\x5e\x8f\x5b\x8f\x5d\x91\x46\x91\x44\x91\x45\x91\xb9\x94\x3f\x94\x3b\x94\x36\x94\x29\x94\x3d\x94\x3c\x94\x30\x94\x39\x94\x2a\x94\x37\x94\x2c\x94\x40\x94\x31\x95\xe5\x95\xe4\x95\xe3\x97\x35\x97\x3a\x97\xbf\x97\xe1\x98\x64\x98\xc9\x98\xc6\x98\xc0\x99\x58\x99\x56\x9a\x39\x9a\x3d\x9a\x46\x9a\x44\x9a\x42\x9a\x41\x9a\x3a\x9a\x3f\x9a\xcd\x9b\x15\x9b\x17\x9b\x18\x9b\x16\x9b\x3a\x9b\x52\x9c\x2b\x9c\x1d\x9c\x1c\x9c\x2c\x9c\x23\x9c\x28\x9c\x29\x9c\x24\x00\x00\x00\x00", /* 8f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x21\x9d\xb7\x9d\xb6\x9d\xbc\x9d\xc1\x9d\xc7\x9d\xca\x9d\xcf\x9d\xbe\x9d\xc5\x9d\xc3\x9d\xbb\x9d\xb5\x9d\xce\x9d\xb9\x9d\xba\x9d\xac\x9d\xc8\x9d\xb1\x9d\xad\x9d\xcc\x9d\xb3\x9d\xcd\x9d\xb2\x9e\x7a\x9e\x9c\x9e\xeb\x9e\xee\x9e\xed\x9f\x1b\x9f\x18\x9f\x1a\x9f\x31\x9f\x4e\x9f\x65\x9f\x64\x9f\x92\x4e\xb9\x56\xc6\x56\xc5\x56\xcb\x59\x71\x5b\x4b\x5b\x4c\x5d\xd5\x5d\xd1\x5e\xf2\x65\x21\x65\x20\x65\x26\x65\x22\x6b\x0b\x6b\x08\x6b\x09\x6c\x0d\x70\x55\x70\x56\x70\x57\x70\x52\x72\x1e\x72\x1f\x72\xa9\x73\x7f", /* 8f80 */ "\x00\x00\x74\xd8\x74\xd5\x74\xd9\x74\xd7\x76\x6d\x76\xad\x79\x35\x79\xb4\x7a\x70\x7a\x71\x7c\x57\x7c\x5c\x7c\x59\x7c\x5b\x7c\x5a\x7c\xf4\x7c\xf1\x7e\x91\x7f\x4f\x7f\x87\x81\xde\x82\x6b\x86\x34\x86\x35\x86\x33\x86\x2c\x86\x32\x86\x36\x88\x2c\x88\x28\x88\x26\x88\x2a\x88\x25\x89\x71\x89\xbf\x89\xbe\x89\xfb\x8b\x7e\x8b\x84\x8b\x82\x8b\x86\x8b\x85\x8b\x7f\x8d\x15\x8e\x95\x8e\x94\x8e\x9a\x8e\x92\x8e\x90\x8e\x96\x8e\x97\x8f\x60\x8f\x62\x91\x47\x94\x4c\x94\x50\x94\x4a\x94\x4b\x94\x4f\x94\x47\x94\x45\x94\x48\x94\x49\x94\x46\x97\x3f\x97\xe3\x98\x6a\x98\x69\x98\xcb\x99\x54\x99\x5b\x9a\x4e\x9a\x53\x9a\x54\x9a\x4c\x9a\x4f\x9a\x48\x9a\x4a\x9a\x49\x9a\x52\x9a\x50\x9a\xd0\x9b\x19\x9b\x2b\x9b\x3b\x9b\x56\x9b\x55\x9c\x46\x9c\x48\x9c\x3f\x9c\x44\x9c\x39\x9c\x33\x9c\x41\x9c\x3c\x9c\x37\x9c\x34\x9c\x32\x9c\x3d\x9c\x36\x9d\xdb\x9d\xd2\x9d\xde\x9d\xda\x9d\xcb\x9d\xd0\x9d\xdc\x9d\xd1\x9d\xdf\x9d\xe9\x9d\xd9\x9d\xd8\x9d\xd6\x9d\xf5\x9d\xd5\x9d\xdd\x9e\xb6\x9e\xf0\x9f\x35\x9f\x33\x9f\x32\x9f\x42\x9f\x6b\x9f\x95\x9f\xa2\x00\x00\x00\x00", /* 9000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x3d\x52\x99\x58\xe8\x58\xe7\x59\x72\x5b\x4d\x5d\xd8\x88\x2f\x5f\x4f\x62\x01\x62\x03\x62\x04\x65\x29\x65\x25\x65\x96\x66\xeb\x6b\x11\x6b\x12\x6b\x0f\x6b\xca\x70\x5b\x70\x5a\x72\x22\x73\x82\x73\x81\x73\x83\x76\x70\x77\xd4\x7c\x67\x7c\x66\x7e\x95\x82\x6c\x86\x3a\x86\x40\x86\x39\x86\x3c\x86\x31\x86\x3b\x86\x3e\x88\x30\x88\x32\x88\x2e\x88\x33\x89\x76\x89\x74\x89\x73\x89\xfe\x8b\x8c\x8b\x8e\x8b\x8b\x8b\x88\x8c\x45\x8d\x19\x8e\x98\x8f\x64\x8f\x63\x91\xbc\x94\x62\x94\x55\x94\x5d\x94\x57\x94\x5e\x97\xc4", /* 9080 */ "\x00\x00\x97\xc5\x98\x00\x9a\x56\x9a\x59\x9b\x1e\x9b\x1f\x9b\x20\x9c\x52\x9c\x58\x9c\x50\x9c\x4a\x9c\x4d\x9c\x4b\x9c\x55\x9c\x59\x9c\x4c\x9c\x4e\x9d\xfb\x9d\xf7\x9d\xef\x9d\xe3\x9d\xeb\x9d\xf8\x9d\xe4\x9d\xf6\x9d\xe1\x9d\xee\x9d\xe6\x9d\xf2\x9d\xf0\x9d\xe2\x9d\xec\x9d\xf4\x9d\xf3\x9d\xe8\x9d\xed\x9e\xc2\x9e\xd0\x9e\xf2\x9e\xf3\x9f\x06\x9f\x1c\x9f\x38\x9f\x37\x9f\x36\x9f\x43\x9f\x4f\x9f\x71\x9f\x70\x9f\x6e\x9f\x6f\x56\xd3\x56\xcd\x5b\x4e\x5c\x6d\x65\x2d\x66\xed\x66\xee\x6b\x13\x70\x5f\x70\x61\x70\x5d\x70\x60\x72\x23\x74\xdb\x74\xe5\x77\xd5\x79\x38\x79\xb7\x79\xb6\x7c\x6a\x7e\x97\x7f\x89\x82\x6d\x86\x43\x88\x38\x88\x37\x88\x35\x88\x4b\x8b\x94\x8b\x95\x8e\x9e\x8e\x9f\x8e\xa0\x8e\x9d\x91\xbe\x91\xbd\x91\xc2\x94\x6b\x94\x68\x94\x69\x96\xe5\x97\x46\x97\x43\x97\x47\x97\xc7\x97\xe5\x9a\x5e\x9a\xd5\x9b\x59\x9c\x63\x9c\x67\x9c\x66\x9c\x62\x9c\x5e\x9c\x60\x9e\x02\x9d\xfe\x9e\x07\x9e\x03\x9e\x06\x9e\x05\x9e\x00\x9e\x01\x9e\x09\x9d\xff\x9d\xfd\x9e\x04\x9e\xa0\x9f\x1e\x9f\x46\x9f\x74\x9f\x75\x9f\x76\x56\xd4\x00\x00\x00\x00", /* 9100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x2e\x65\xb8\x6b\x18\x6b\x19\x6b\x17\x6b\x1a\x70\x62\x72\x26\x72\xaa\x77\xd8\x77\xd9\x79\x39\x7c\x69\x7c\x6b\x7c\xf6\x7e\x9a\x7e\x98\x7e\x9b\x7e\x99\x81\xe0\x81\xe1\x86\x46\x86\x47\x86\x48\x89\x79\x89\x7a\x89\x7c\x89\x7b\x89\xff\x8b\x98\x8b\x99\x8e\xa5\x8e\xa4\x8e\xa3\x94\x6e\x94\x6d\x94\x6f\x94\x71\x94\x73\x97\x49\x98\x72\x99\x5f\x9c\x68\x9c\x6e\x9c\x6d\x9e\x0b\x9e\x0d\x9e\x10\x9e\x0f\x9e\x12\x9e\x11\x9e\xa1\x9e\xf5\x9f\x09\x9f\x47\x9f\x78\x9f\x7b\x9f\x7a\x9f\x79\x57\x1e\x70\x66\x7c\x6f\x88\x3c", /* 9180 */ "\x00\x00\x8d\xb2\x8e\xa6\x91\xc3\x94\x74\x94\x78\x94\x76\x94\x75\x9a\x60\x9c\x74\x9c\x73\x9c\x71\x9c\x75\x9e\x14\x9e\x13\x9e\xf6\x9f\x0a\x9f\xa4\x70\x68\x70\x65\x7c\xf7\x86\x6a\x88\x3e\x88\x3d\x88\x3f\x8b\x9e\x8c\x9c\x8e\xa9\x8e\xc9\x97\x4b\x98\x73\x98\x74\x98\xcc\x99\x61\x99\xab\x9a\x64\x9a\x66\x9a\x67\x9b\x24\x9e\x15\x9e\x17\x9f\x48\x62\x07\x6b\x1e\x72\x27\x86\x4c\x8e\xa8\x94\x82\x94\x80\x94\x81\x9a\x69\x9a\x68\x9b\x2e\x9e\x19\x72\x29\x86\x4b\x8b\x9f\x94\x83\x9c\x79\x9e\xb7\x76\x75\x9a\x6b\x9c\x7a\x9e\x1d\x70\x69\x70\x6a\x9e\xa4\x9f\x7e\x9f\x49\x9f\x98\x69\x1e\x6e\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9200 */ NULL, /* 9280 */ NULL, /* 9300 */ NULL, /* 9380 */ NULL, /* 9400 */ NULL, /* 9480 */ NULL, /* 9500 */ NULL, /* 9580 */ NULL, /* 9600 */ NULL, /* 9680 */ NULL, /* 9700 */ NULL, /* 9780 */ NULL, /* 9800 */ NULL, /* 9880 */ NULL, /* 9900 */ NULL, /* 9980 */ NULL, /* 9a00 */ NULL, /* 9a80 */ NULL, /* 9b00 */ NULL, /* 9b80 */ NULL, /* 9c00 */ NULL, /* 9c80 */ NULL, /* 9d00 */ NULL, /* 9d80 */ NULL, /* 9e00 */ NULL, /* 9e80 */ NULL, /* 9f00 */ NULL, /* 9f80 */ NULL, /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xe0\x02\xe0\x03\xe0\x04\xe0\x05\xe0\x06\xe0\x07\xe0\x08\xe0\x09\xe0\x0a\xe0\x0b\xe0\x0c\xe0\x0d\xe0\x0e\xe0\x0f\xe0\x10\xe0\x11\xe0\x12\xe0\x13\xe0\x14\xe0\x15\xe0\x16\xe0\x17\xe0\x18\xe0\x19\xe0\x1a\xe0\x1b\xe0\x1c\xe0\x1d\xe0\x1e\xe0\x1f\xe0\x20\xe0\x21\xe0\x22\xe0\x23\xe0\x24\xe0\x25\xe0\x26\xe0\x27\xe0\x28\xe0\x29\xe0\x2a\xe0\x2b\xe0\x2c\xe0\x2d\xe0\x2e\xe0\x2f\xe0\x30\xe0\x31\xe0\x32\xe0\x33\xe0\x34\xe0\x35\xe0\x36\xe0\x37\xe0\x38\xe0\x39\xe0\x3a\xe0\x3b\xe0\x3c\xe0\x3d\xe0\x3e", /* c280 */ "\x00\x00\xe0\x3f\xe0\x40\xe0\x41\xe0\x42\xe0\x43\xe0\x44\xe0\x45\xe0\x46\xe0\x47\xe0\x48\xe0\x49\xe0\x4a\xe0\x4b\xe0\x4c\xe0\x4d\xe0\x4e\xe0\x4f\xe0\x50\xe0\x51\xe0\x52\xe0\x53\xe0\x54\xe0\x55\xe0\x56\xe0\x57\xe0\x58\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xe0\x5d\xe0\x5e\xe0\x5f\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xe0\x64\xe0\x65\xe0\x66\xe0\x67\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x7f\xe0\x80\xe0\x81\xe0\x82\xe0\x83\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xe0\x8f\xe0\x90\xe0\x91\xe0\x92\xe0\x93\xe0\x94\xe0\x95\xe0\x96\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xe0\xa0\xe0\xa1\xe0\xa2\xe0\xa3\xe0\xa4\xe0\xa5\xe0\xa6\xe0\xa7\xe0\xa8\xe0\xa9\xe0\xaa\xe0\xab\xe0\xac\xe0\xad\xe0\xae\xe0\xaf\xe0\xb0\xe0\xb1\xe0\xb2\xe0\xb3\xe0\xb4\xe0\xb5\xe0\xb6\xe0\xb7\xe0\xb8\xe0\xb9\xe0\xba\xe0\xbb\x00\x00\x00\x00", /* c300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbc\xe0\xbd\xe0\xbe\xe0\xbf\xe0\xc0\xe0\xc1\xe0\xc2\xe0\xc3\xe0\xc4\xe0\xc5\xe0\xc6\xe0\xc7\xe0\xc8\xe0\xc9\xe0\xca\xe0\xcb\xe0\xcc\xe0\xcd\xe0\xce\xe0\xcf\xe0\xd0\xe0\xd1\xe0\xd2\xe0\xd3\xe0\xd4\xe0\xd5\xe0\xd6\xe0\xd7\xe0\xd8\xe0\xd9\xe0\xda\xe0\xdb\xe0\xdc\xe0\xdd\xe0\xde\xe0\xdf\xe0\xe0\xe0\xe1\xe0\xe2\xe0\xe3\xe0\xe4\xe0\xe5\xe0\xe6\xe0\xe7\xe0\xe8\xe0\xe9\xe0\xea\xe0\xeb\xe0\xec\xe0\xed\xe0\xee\xe0\xef\xe0\xf0\xe0\xf1\xe0\xf2\xe0\xf3\xe0\xf4\xe0\xf5\xe0\xf6\xe0\xf7\xe0\xf8\xe0\xf9\xe0\xfa", /* c380 */ "\x00\x00\xe0\xfb\xe0\xfc\xe0\xfd\xe0\xfe\xe0\xff\xe1\x00\xe1\x01\xe1\x02\xe1\x03\xe1\x04\xe1\x05\xe1\x06\xe1\x07\xe1\x08\xe1\x09\xe1\x0a\xe1\x0b\xe1\x0c\xe1\x0d\xe1\x0e\xe1\x0f\xe1\x10\xe1\x11\xe1\x12\xe1\x13\xe1\x14\xe1\x15\xe1\x16\xe1\x17\xe1\x18\xe1\x19\xe1\x1a\xe1\x1b\xe1\x1c\xe1\x1d\xe1\x1e\xe1\x1f\xe1\x20\xe1\x21\xe1\x22\xe1\x23\xe1\x24\xe1\x25\xe1\x26\xe1\x27\xe1\x28\xe1\x29\xe1\x2a\xe1\x2b\xe1\x2c\xe1\x2d\xe1\x2e\xe1\x2f\xe1\x30\xe1\x31\xe1\x32\xe1\x33\xe1\x34\xe1\x35\xe1\x36\xe1\x37\xe1\x38\xe1\x39\xe1\x3a\xe1\x3b\xe1\x3c\xe1\x3d\xe1\x3e\xe1\x3f\xe1\x40\xe1\x41\xe1\x42\xe1\x43\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xe1\x48\xe1\x49\xe1\x4a\xe1\x4b\xe1\x4c\xe1\x4d\xe1\x4e\xe1\x4f\xe1\x50\xe1\x51\xe1\x52\xe1\x53\xe1\x54\xe1\x55\xe1\x56\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xe1\x5c\xe1\x5d\xe1\x5e\xe1\x5f\xe1\x60\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xe1\x74\xe1\x75\xe1\x76\xe1\x77\x00\x00\x00\x00", /* c400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x78\xe1\x79\xe1\x7a\xe1\x7b\xe1\x7c\xe1\x7d\xe1\x7e\xe1\x7f\xe1\x80\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xe1\x8b\xe1\x8c\xe1\x8d\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe1\xa1\xe1\xa2\xe1\xa3\xe1\xa4\xe1\xa5\xe1\xa6\xe1\xa7\xe1\xa8\xe1\xa9\xe1\xaa\xe1\xab\xe1\xac\xe1\xad\xe1\xae\xe1\xaf\xe1\xb0\xe1\xb1\xe1\xb2\xe1\xb3\xe1\xb4\xe1\xb5\xe1\xb6", /* c480 */ "\x00\x00\xe1\xb7\xe1\xb8\xe1\xb9\xe1\xba\xe1\xbb\xe1\xbc\xe1\xbd\xe1\xbe\xe1\xbf\xe1\xc0\xe1\xc1\xe1\xc2\xe1\xc3\xe1\xc4\xe1\xc5\xe1\xc6\xe1\xc7\xe1\xc8\xe1\xc9\xe1\xca\xe1\xcb\xe1\xcc\xe1\xcd\xe1\xce\xe1\xcf\xe1\xd0\xe1\xd1\xe1\xd2\xe1\xd3\xe1\xd4\xe1\xd5\xe1\xd6\xe1\xd7\xe1\xd8\xe1\xd9\xe1\xda\xe1\xdb\xe1\xdc\xe1\xdd\xe1\xde\xe1\xdf\xe1\xe0\xe1\xe1\xe1\xe2\xe1\xe3\xe1\xe4\xe1\xe5\xe1\xe6\xe1\xe7\xe1\xe8\xe1\xe9\xe1\xea\xe1\xeb\xe1\xec\xe1\xed\xe1\xee\xe1\xef\xe1\xf0\xe1\xf1\xe1\xf2\xe1\xf3\xe1\xf4\xe1\xf5\xe1\xf6\xe1\xf7\xe1\xf8\xe1\xf9\xe1\xfa\xe1\xfb\xe1\xfc\xe1\xfd\xe1\xfe\xe1\xff\xe2\x00\xe2\x01\xe2\x02\xe2\x03\xe2\x04\xe2\x05\xe2\x06\xe2\x07\xe2\x08\xe2\x09\xe2\x0a\xe2\x0b\xe2\x0c\xe2\x0d\xe2\x0e\xe2\x0f\xe2\x10\xe2\x11\xe2\x12\xe2\x13\xe2\x14\xe2\x15\xe2\x16\xe2\x17\xe2\x18\xe2\x19\xe2\x1a\xe2\x1b\xe2\x1c\xe2\x1d\xe2\x1e\xe2\x1f\xe2\x20\xe2\x21\xe2\x22\xe2\x23\xe2\x24\xe2\x25\xe2\x26\xe2\x27\xe2\x28\xe2\x29\xe2\x2a\xe2\x2b\xe2\x2c\xe2\x2d\xe2\x2e\xe2\x2f\xe2\x30\xe2\x31\xe2\x32\xe2\x33\x00\x00\x00\x00", /* c500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x34\xe2\x35\xe2\x36\xe2\x37\xe2\x38\xe2\x39\xe2\x3a\xe2\x3b\xe2\x3c\xe2\x3d\xe2\x3e\xe2\x3f\xe2\x40\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72", /* c580 */ "\x00\x00\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x7f\xe2\x80\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe2\xa1\xe2\xa2\xe2\xa3\xe2\xa4\xe2\xa5\xe2\xa6\xe2\xa7\xe2\xa8\xe2\xa9\xe2\xaa\xe2\xab\xe2\xac\xe2\xad\xe2\xae\xe2\xaf\xe2\xb0\xe2\xb1\xe2\xb2\xe2\xb3\xe2\xb4\xe2\xb5\xe2\xb6\xe2\xb7\xe2\xb8\xe2\xb9\xe2\xba\xe2\xbb\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1\xe2\xc2\xe2\xc3\xe2\xc4\xe2\xc5\xe2\xc6\xe2\xc7\xe2\xc8\xe2\xc9\xe2\xca\xe2\xcb\xe2\xcc\xe2\xcd\xe2\xce\xe2\xcf\xe2\xd0\xe2\xd1\xe2\xd2\xe2\xd3\xe2\xd4\xe2\xd5\xe2\xd6\xe2\xd7\xe2\xd8\xe2\xd9\xe2\xda\xe2\xdb\xe2\xdc\xe2\xdd\xe2\xde\xe2\xdf\xe2\xe0\xe2\xe1\xe2\xe2\xe2\xe3\xe2\xe4\xe2\xe5\xe2\xe6\xe2\xe7\xe2\xe8\xe2\xe9\xe2\xea\xe2\xeb\xe2\xec\xe2\xed\xe2\xee\xe2\xef\x00\x00\x00\x00", /* c600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xf0\xe2\xf1\xe2\xf2\xe2\xf3\xe2\xf4\xe2\xf5\xe2\xf6\xe2\xf7\xe2\xf8\xe2\xf9\xe2\xfa\xe2\xfb\xe2\xfc\xe2\xfd\xe2\xfe\xe2\xff\xe3\x00\xe3\x01\xe3\x02\xe3\x03\xe3\x04\xe3\x05\xe3\x06\xe3\x07\xe3\x08\xe3\x09\xe3\x0a\xe3\x0b\xe3\x0c\xe3\x0d\xe3\x0e\xe3\x0f\xe3\x10\xe3\x11\xe3\x12\xe3\x13\xe3\x14\xe3\x15\xe3\x16\xe3\x17\xe3\x18\xe3\x19\xe3\x1a\xe3\x1b\xe3\x1c\xe3\x1d\xe3\x1e\xe3\x1f\xe3\x20\xe3\x21\xe3\x22\xe3\x23\xe3\x24\xe3\x25\xe3\x26\xe3\x27\xe3\x28\xe3\x29\xe3\x2a\xe3\x2b\xe3\x2c\xe3\x2d\xe3\x2e", /* c680 */ "\x00\x00\xe3\x2f\xe3\x30\xe3\x31\xe3\x32\xe3\x33\xe3\x34\xe3\x35\xe3\x36\xe3\x37\xe3\x38\xe3\x39\xe3\x3a\xe3\x3b\xe3\x3c\xe3\x3d\xe3\x3e\xe3\x3f\xe3\x40\xe3\x41\xe3\x42\xe3\x43\xe3\x44\xe3\x45\xe3\x46\xe3\x47\xe3\x48\xe3\x49\xe3\x4a\xe3\x4b\xe3\x4c\xe3\x4d\xe3\x4e\xe3\x4f\xe3\x50\xe3\x51\xe3\x52\xe3\x53\xe3\x54\xe3\x55\xe3\x56\xe3\x57\xe3\x58\xe3\x59\xe3\x5a\xe3\x5b\xe3\x5c\xe3\x5d\xe3\x5e\xe3\x5f\xe3\x60\xe3\x61\xe3\x62\xe3\x63\xe3\x64\xe3\x65\xe3\x66\xe3\x67\xe3\x68\xe3\x69\xe3\x6a\xe3\x6b\xe3\x6c\xe3\x6d\xe3\x6e\xe3\x6f\xe3\x70\xe3\x71\xe3\x72\xe3\x73\xe3\x74\xe3\x75\xe3\x76\xe3\x77\xe3\x78\xe3\x79\xe3\x7a\xe3\x7b\xe3\x7c\xe3\x7d\xe3\x7e\xe3\x7f\xe3\x80\xe3\x81\xe3\x82\xe3\x83\xe3\x84\xe3\x85\xe3\x86\xe3\x87\xe3\x88\xe3\x89\xe3\x8a\xe3\x8b\xe3\x8c\xe3\x8d\xe3\x8e\xe3\x8f\xe3\x90\xe3\x91\xe3\x92\xe3\x93\xe3\x94\xe3\x95\xe3\x96\xe3\x97\xe3\x98\xe3\x99\xe3\x9a\xe3\x9b\xe3\x9c\xe3\x9d\xe3\x9e\xe3\x9f\xe3\xa0\xe3\xa1\xe3\xa2\xe3\xa3\xe3\xa4\xe3\xa5\xe3\xa6\xe3\xa7\xe3\xa8\xe3\xa9\xe3\xaa\xe3\xab\x00\x00\x00\x00", /* c700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xac\xe3\xad\xe3\xae\xe3\xaf\xe3\xb0\xe3\xb1\xe3\xb2\xe3\xb3\xe3\xb4\xe3\xb5\xe3\xb6\xe3\xb7\xe3\xb8\xe3\xb9\xe3\xba\xe3\xbb\xe3\xbc\xe3\xbd\xe3\xbe\xe3\xbf\xe3\xc0\xe3\xc1\xe3\xc2\xe3\xc3\xe3\xc4\xe3\xc5\xe3\xc6\xe3\xc7\xe3\xc8\xe3\xc9\xe3\xca\xe3\xcb\xe3\xcc\xe3\xcd\xe3\xce\xe3\xcf\xe3\xd0\xe3\xd1\xe3\xd2\xe3\xd3\xe3\xd4\xe3\xd5\xe3\xd6\xe3\xd7\xe3\xd8\xe3\xd9\xe3\xda\xe3\xdb\xe3\xdc\xe3\xdd\xe3\xde\xe3\xdf\xe3\xe0\xe3\xe1\xe3\xe2\xe3\xe3\xe3\xe4\xe3\xe5\xe3\xe6\xe3\xe7\xe3\xe8\xe3\xe9\xe3\xea", /* c780 */ "\x00\x00\xe3\xeb\xe3\xec\xe3\xed\xe3\xee\xe3\xef\xe3\xf0\xe3\xf1\xe3\xf2\xe3\xf3\xe3\xf4\xe3\xf5\xe3\xf6\xe3\xf7\xe3\xf8\xe3\xf9\xe3\xfa\xe3\xfb\xe3\xfc\xe3\xfd\xe3\xfe\xe3\xff\xe4\x00\xe4\x01\xe4\x02\xe4\x03\xe4\x04\xe4\x05\xe4\x06\xe4\x07\xe4\x08\xe4\x09\xe4\x0a\xe4\x0b\xe4\x0c\xe4\x0d\xe4\x0e\xe4\x0f\xe4\x10\xe4\x11\xe4\x12\xe4\x13\xe4\x14\xe4\x15\xe4\x16\xe4\x17\xe4\x18\xe4\x19\xe4\x1a\xe4\x1b\xe4\x1c\xe4\x1d\xe4\x1e\xe4\x1f\xe4\x20\xe4\x21\xe4\x22\xe4\x23\xe4\x24\xe4\x25\xe4\x26\xe4\x27\xe4\x28\xe4\x29\xe4\x2a\xe4\x2b\xe4\x2c\xe4\x2d\xe4\x2e\xe4\x2f\xe4\x30\xe4\x31\xe4\x32\xe4\x33\xe4\x34\xe4\x35\xe4\x36\xe4\x37\xe4\x38\xe4\x39\xe4\x3a\xe4\x3b\xe4\x3c\xe4\x3d\xe4\x3e\xe4\x3f\xe4\x40\xe4\x41\xe4\x42\xe4\x43\xe4\x44\xe4\x45\xe4\x46\xe4\x47\xe4\x48\xe4\x49\xe4\x4a\xe4\x4b\xe4\x4c\xe4\x4d\xe4\x4e\xe4\x4f\xe4\x50\xe4\x51\xe4\x52\xe4\x53\xe4\x54\xe4\x55\xe4\x56\xe4\x57\xe4\x58\xe4\x59\xe4\x5a\xe4\x5b\xe4\x5c\xe4\x5d\xe4\x5e\xe4\x5f\xe4\x60\xe4\x61\xe4\x62\xe4\x63\xe4\x64\xe4\x65\xe4\x66\xe4\x67\x00\x00\x00\x00", /* c800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x68\xe4\x69\xe4\x6a\xe4\x6b\xe4\x6c\xe4\x6d\xe4\x6e\xe4\x6f\xe4\x70\xe4\x71\xe4\x72\xe4\x73\xe4\x74\xe4\x75\xe4\x76\xe4\x77\xe4\x78\xe4\x79\xe4\x7a\xe4\x7b\xe4\x7c\xe4\x7d\xe4\x7e\xe4\x7f\xe4\x80\xe4\x81\xe4\x82\xe4\x83\xe4\x84\xe4\x85\xe4\x86\xe4\x87\xe4\x88\xe4\x89\xe4\x8a\xe4\x8b\xe4\x8c\xe4\x8d\xe4\x8e\xe4\x8f\xe4\x90\xe4\x91\xe4\x92\xe4\x93\xe4\x94\xe4\x95\xe4\x96\xe4\x97\xe4\x98\xe4\x99\xe4\x9a\xe4\x9b\xe4\x9c\xe4\x9d\xe4\x9e\xe4\x9f\xe4\xa0\xe4\xa1\xe4\xa2\xe4\xa3\xe4\xa4\xe4\xa5\xe4\xa6", /* c880 */ "\x00\x00\xe4\xa7\xe4\xa8\xe4\xa9\xe4\xaa\xe4\xab\xe4\xac\xe4\xad\xe4\xae\xe4\xaf\xe4\xb0\xe4\xb1\xe4\xb2\xe4\xb3\xe4\xb4\xe4\xb5\xe4\xb6\xe4\xb7\xe4\xb8\xe4\xb9\xe4\xba\xe4\xbb\xe4\xbc\xe4\xbd\xe4\xbe\xe4\xbf\xe4\xc0\xe4\xc1\xe4\xc2\xe4\xc3\xe4\xc4\xe4\xc5\xe4\xc6\xe4\xc7\xe4\xc8\xe4\xc9\xe4\xca\xe4\xcb\xe4\xcc\xe4\xcd\xe4\xce\xe4\xcf\xe4\xd0\xe4\xd1\xe4\xd2\xe4\xd3\xe4\xd4\xe4\xd5\xe4\xd6\xe4\xd7\xe4\xd8\xe4\xd9\xe4\xda\xe4\xdb\xe4\xdc\xe4\xdd\xe4\xde\xe4\xdf\xe4\xe0\xe4\xe1\xe4\xe2\xe4\xe3\xe4\xe4\xe4\xe5\xe4\xe6\xe4\xe7\xe4\xe8\xe4\xe9\xe4\xea\xe4\xeb\xe4\xec\xe4\xed\xe4\xee\xe4\xef\xe4\xf0\xe4\xf1\xe4\xf2\xe4\xf3\xe4\xf4\xe4\xf5\xe4\xf6\xe4\xf7\xe4\xf8\xe4\xf9\xe4\xfa\xe4\xfb\xe4\xfc\xe4\xfd\xe4\xfe\xe4\xff\xe5\x00\xe5\x01\xe5\x02\xe5\x03\xe5\x04\xe5\x05\xe5\x06\xe5\x07\xe5\x08\xe5\x09\xe5\x0a\xe5\x0b\xe5\x0c\xe5\x0d\xe5\x0e\xe5\x0f\xe5\x10\xe5\x11\xe5\x12\xe5\x13\xe5\x14\xe5\x15\xe5\x16\xe5\x17\xe5\x18\xe5\x19\xe5\x1a\xe5\x1b\xe5\x1c\xe5\x1d\xe5\x1e\xe5\x1f\xe5\x20\xe5\x21\xe5\x22\xe5\x23\x00\x00\x00\x00", /* c900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x24\xe5\x25\xe5\x26\xe5\x27\xe5\x28\xe5\x29\xe5\x2a\xe5\x2b\xe5\x2c\xe5\x2d\xe5\x2e\xe5\x2f\xe5\x30\xe5\x31\xe5\x32\xe5\x33\xe5\x34\xe5\x35\xe5\x36\xe5\x37\xe5\x38\xe5\x39\xe5\x3a\xe5\x3b\xe5\x3c\xe5\x3d\xe5\x3e\xe5\x3f\xe5\x40\xe5\x41\xe5\x42\xe5\x43\xe5\x44\xe5\x45\xe5\x46\xe5\x47\xe5\x48\xe5\x49\xe5\x4a\xe5\x4b\xe5\x4c\xe5\x4d\xe5\x4e\xe5\x4f\xe5\x50\xe5\x51\xe5\x52\xe5\x53\xe5\x54\xe5\x55\xe5\x56\xe5\x57\xe5\x58\xe5\x59\xe5\x5a\xe5\x5b\xe5\x5c\xe5\x5d\xe5\x5e\xe5\x5f\xe5\x60\xe5\x61\xe5\x62", /* c980 */ "\x00\x00\xe5\x63\xe5\x64\xe5\x65\xe5\x66\xe5\x67\xe5\x68\xe5\x69\xe5\x6a\xe5\x6b\xe5\x6c\xe5\x6d\xe5\x6e\xe5\x6f\xe5\x70\xe5\x71\xe5\x72\xe5\x73\xe5\x74\xe5\x75\xe5\x76\xe5\x77\xe5\x78\xe5\x79\xe5\x7a\xe5\x7b\xe5\x7c\xe5\x7d\xe5\x7e\xe5\x7f\xe5\x80\xe5\x81\xe5\x82\xe5\x83\xe5\x84\xe5\x85\xe5\x86\xe5\x87\xe5\x88\xe5\x89\xe5\x8a\xe5\x8b\xe5\x8c\xe5\x8d\xe5\x8e\xe5\x8f\xe5\x90\xe5\x91\xe5\x92\xe5\x93\xe5\x94\xe5\x95\xe5\x96\xe5\x97\xe5\x98\xe5\x99\xe5\x9a\xe5\x9b\xe5\x9c\xe5\x9d\xe5\x9e\xe5\x9f\xe5\xa0\xe5\xa1\xe5\xa2\xe5\xa3\xe5\xa4\xe5\xa5\xe5\xa6\xe5\xa7\xe5\xa8\xe5\xa9\xe5\xaa\xe5\xab\xe5\xac\xe5\xad\xe5\xae\xe5\xaf\xe5\xb0\xe5\xb1\xe5\xb2\xe5\xb3\xe5\xb4\xe5\xb5\xe5\xb6\xe5\xb7\xe5\xb8\xe5\xb9\xe5\xba\xe5\xbb\xe5\xbc\xe5\xbd\xe5\xbe\xe5\xbf\xe5\xc0\xe5\xc1\xe5\xc2\xe5\xc3\xe5\xc4\xe5\xc5\xe5\xc6\xe5\xc7\xe5\xc8\xe5\xc9\xe5\xca\xe5\xcb\xe5\xcc\xe5\xcd\xe5\xce\xe5\xcf\xe5\xd0\xe5\xd1\xe5\xd2\xe5\xd3\xe5\xd4\xe5\xd5\xe5\xd6\xe5\xd7\xe5\xd8\xe5\xd9\xe5\xda\xe5\xdb\xe5\xdc\xe5\xdd\xe5\xde\xe5\xdf\x00\x00\x00\x00", /* ca00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xe0\xe5\xe1\xe5\xe2\xe5\xe3\xe5\xe4\xe5\xe5\xe5\xe6\xe5\xe7\xe5\xe8\xe5\xe9\xe5\xea\xe5\xeb\xe5\xec\xe5\xed\xe5\xee\xe5\xef\xe5\xf0\xe5\xf1\xe5\xf2\xe5\xf3\xe5\xf4\xe5\xf5\xe5\xf6\xe5\xf7\xe5\xf8\xe5\xf9\xe5\xfa\xe5\xfb\xe5\xfc\xe5\xfd\xe5\xfe\xe5\xff\xe6\x00\xe6\x01\xe6\x02\xe6\x03\xe6\x04\xe6\x05\xe6\x06\xe6\x07\xe6\x08\xe6\x09\xe6\x0a\xe6\x0b\xe6\x0c\xe6\x0d\xe6\x0e\xe6\x0f\xe6\x10\xe6\x11\xe6\x12\xe6\x13\xe6\x14\xe6\x15\xe6\x16\xe6\x17\xe6\x18\xe6\x19\xe6\x1a\xe6\x1b\xe6\x1c\xe6\x1d\xe6\x1e", /* ca80 */ "\x00\x00\xe6\x1f\xe6\x20\xe6\x21\xe6\x22\xe6\x23\xe6\x24\xe6\x25\xe6\x26\xe6\x27\xe6\x28\xe6\x29\xe6\x2a\xe6\x2b\xe6\x2c\xe6\x2d\xe6\x2e\xe6\x2f\xe6\x30\xe6\x31\xe6\x32\xe6\x33\xe6\x34\xe6\x35\xe6\x36\xe6\x37\xe6\x38\xe6\x39\xe6\x3a\xe6\x3b\xe6\x3c\xe6\x3d\xe6\x3e\xe6\x3f\xe6\x40\xe6\x41\xe6\x42\xe6\x43\xe6\x44\xe6\x45\xe6\x46\xe6\x47\xe6\x48\xe6\x49\xe6\x4a\xe6\x4b\xe6\x4c\xe6\x4d\xe6\x4e\xe6\x4f\xe6\x50\xe6\x51\xe6\x52\xe6\x53\xe6\x54\xe6\x55\xe6\x56\xe6\x57\xe6\x58\xe6\x59\xe6\x5a\xe6\x5b\xe6\x5c\xe6\x5d\xe6\x5e\xe6\x5f\xe6\x60\xe6\x61\xe6\x62\xe6\x63\xe6\x64\xe6\x65\xe6\x66\xe6\x67\xe6\x68\xe6\x69\xe6\x6a\xe6\x6b\xe6\x6c\xe6\x6d\xe6\x6e\xe6\x6f\xe6\x70\xe6\x71\xe6\x72\xe6\x73\xe6\x74\xe6\x75\xe6\x76\xe6\x77\xe6\x78\xe6\x79\xe6\x7a\xe6\x7b\xe6\x7c\xe6\x7d\xe6\x7e\xe6\x7f\xe6\x80\xe6\x81\xe6\x82\xe6\x83\xe6\x84\xe6\x85\xe6\x86\xe6\x87\xe6\x88\xe6\x89\xe6\x8a\xe6\x8b\xe6\x8c\xe6\x8d\xe6\x8e\xe6\x8f\xe6\x90\xe6\x91\xe6\x92\xe6\x93\xe6\x94\xe6\x95\xe6\x96\xe6\x97\xe6\x98\xe6\x99\xe6\x9a\xe6\x9b\x00\x00\x00\x00", /* cb00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x9c\xe6\x9d\xe6\x9e\xe6\x9f\xe6\xa0\xe6\xa1\xe6\xa2\xe6\xa3\xe6\xa4\xe6\xa5\xe6\xa6\xe6\xa7\xe6\xa8\xe6\xa9\xe6\xaa\xe6\xab\xe6\xac\xe6\xad\xe6\xae\xe6\xaf\xe6\xb0\xe6\xb1\xe6\xb2\xe6\xb3\xe6\xb4\xe6\xb5\xe6\xb6\xe6\xb7\xe6\xb8\xe6\xb9\xe6\xba\xe6\xbb\xe6\xbc\xe6\xbd\xe6\xbe\xe6\xbf\xe6\xc0\xe6\xc1\xe6\xc2\xe6\xc3\xe6\xc4\xe6\xc5\xe6\xc6\xe6\xc7\xe6\xc8\xe6\xc9\xe6\xca\xe6\xcb\xe6\xcc\xe6\xcd\xe6\xce\xe6\xcf\xe6\xd0\xe6\xd1\xe6\xd2\xe6\xd3\xe6\xd4\xe6\xd5\xe6\xd6\xe6\xd7\xe6\xd8\xe6\xd9\xe6\xda", /* cb80 */ "\x00\x00\xe6\xdb\xe6\xdc\xe6\xdd\xe6\xde\xe6\xdf\xe6\xe0\xe6\xe1\xe6\xe2\xe6\xe3\xe6\xe4\xe6\xe5\xe6\xe6\xe6\xe7\xe6\xe8\xe6\xe9\xe6\xea\xe6\xeb\xe6\xec\xe6\xed\xe6\xee\xe6\xef\xe6\xf0\xe6\xf1\xe6\xf2\xe6\xf3\xe6\xf4\xe6\xf5\xe6\xf6\xe6\xf7\xe6\xf8\xe6\xf9\xe6\xfa\xe6\xfb\xe6\xfc\xe6\xfd\xe6\xfe\xe6\xff\xe7\x00\xe7\x01\xe7\x02\xe7\x03\xe7\x04\xe7\x05\xe7\x06\xe7\x07\xe7\x08\xe7\x09\xe7\x0a\xe7\x0b\xe7\x0c\xe7\x0d\xe7\x0e\xe7\x0f\xe7\x10\xe7\x11\xe7\x12\xe7\x13\xe7\x14\xe7\x15\xe7\x16\xe7\x17\xe7\x18\xe7\x19\xe7\x1a\xe7\x1b\xe7\x1c\xe7\x1d\xe7\x1e\xe7\x1f\xe7\x20\xe7\x21\xe7\x22\xe7\x23\xe7\x24\xe7\x25\xe7\x26\xe7\x27\xe7\x28\xe7\x29\xe7\x2a\xe7\x2b\xe7\x2c\xe7\x2d\xe7\x2e\xe7\x2f\xe7\x30\xe7\x31\xe7\x32\xe7\x33\xe7\x34\xe7\x35\xe7\x36\xe7\x37\xe7\x38\xe7\x39\xe7\x3a\xe7\x3b\xe7\x3c\xe7\x3d\xe7\x3e\xe7\x3f\xe7\x40\xe7\x41\xe7\x42\xe7\x43\xe7\x44\xe7\x45\xe7\x46\xe7\x47\xe7\x48\xe7\x49\xe7\x4a\xe7\x4b\xe7\x4c\xe7\x4d\xe7\x4e\xe7\x4f\xe7\x50\xe7\x51\xe7\x52\xe7\x53\xe7\x54\xe7\x55\xe7\x56\xe7\x57\x00\x00\x00\x00", /* cc00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x58\xe7\x59\xe7\x5a\xe7\x5b\xe7\x5c\xe7\x5d\xe7\x5e\xe7\x5f\xe7\x60\xe7\x61\xe7\x62\xe7\x63\xe7\x64\xe7\x65\xe7\x66\xe7\x67\xe7\x68\xe7\x69\xe7\x6a\xe7\x6b\xe7\x6c\xe7\x6d\xe7\x6e\xe7\x6f\xe7\x70\xe7\x71\xe7\x72\xe7\x73\xe7\x74\xe7\x75\xe7\x76\xe7\x77\xe7\x78\xe7\x79\xe7\x7a\xe7\x7b\xe7\x7c\xe7\x7d\xe7\x7e\xe7\x7f\xe7\x80\xe7\x81\xe7\x82\xe7\x83\xe7\x84\xe7\x85\xe7\x86\xe7\x87\xe7\x88\xe7\x89\xe7\x8a\xe7\x8b\xe7\x8c\xe7\x8d\xe7\x8e\xe7\x8f\xe7\x90\xe7\x91\xe7\x92\xe7\x93\xe7\x94\xe7\x95\xe7\x96", /* cc80 */ "\x00\x00\xe7\x97\xe7\x98\xe7\x99\xe7\x9a\xe7\x9b\xe7\x9c\xe7\x9d\xe7\x9e\xe7\x9f\xe7\xa0\xe7\xa1\xe7\xa2\xe7\xa3\xe7\xa4\xe7\xa5\xe7\xa6\xe7\xa7\xe7\xa8\xe7\xa9\xe7\xaa\xe7\xab\xe7\xac\xe7\xad\xe7\xae\xe7\xaf\xe7\xb0\xe7\xb1\xe7\xb2\xe7\xb3\xe7\xb4\xe7\xb5\xe7\xb6\xe7\xb7\xe7\xb8\xe7\xb9\xe7\xba\xe7\xbb\xe7\xbc\xe7\xbd\xe7\xbe\xe7\xbf\xe7\xc0\xe7\xc1\xe7\xc2\xe7\xc3\xe7\xc4\xe7\xc5\xe7\xc6\xe7\xc7\xe7\xc8\xe7\xc9\xe7\xca\xe7\xcb\xe7\xcc\xe7\xcd\xe7\xce\xe7\xcf\xe7\xd0\xe7\xd1\xe7\xd2\xe7\xd3\xe7\xd4\xe7\xd5\xe7\xd6\xe7\xd7\xe7\xd8\xe7\xd9\xe7\xda\xe7\xdb\xe7\xdc\xe7\xdd\xe7\xde\xe7\xdf\xe7\xe0\xe7\xe1\xe7\xe2\xe7\xe3\xe7\xe4\xe7\xe5\xe7\xe6\xe7\xe7\xe7\xe8\xe7\xe9\xe7\xea\xe7\xeb\xe7\xec\xe7\xed\xe7\xee\xe7\xef\xe7\xf0\xe7\xf1\xe7\xf2\xe7\xf3\xe7\xf4\xe7\xf5\xe7\xf6\xe7\xf7\xe7\xf8\xe7\xf9\xe7\xfa\xe7\xfb\xe7\xfc\xe7\xfd\xe7\xfe\xe7\xff\xe8\x00\xe8\x01\xe8\x02\xe8\x03\xe8\x04\xe8\x05\xe8\x06\xe8\x07\xe8\x08\xe8\x09\xe8\x0a\xe8\x0b\xe8\x0c\xe8\x0d\xe8\x0e\xe8\x0f\xe8\x10\xe8\x11\xe8\x12\xe8\x13\x00\x00\x00\x00", /* cd00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x14\xe8\x15\xe8\x16\xe8\x17\xe8\x18\xe8\x19\xe8\x1a\xe8\x1b\xe8\x1c\xe8\x1d\xe8\x1e\xe8\x1f\xe8\x20\xe8\x21\xe8\x22\xe8\x23\xe8\x24\xe8\x25\xe8\x26\xe8\x27\xe8\x28\xe8\x29\xe8\x2a\xe8\x2b\xe8\x2c\xe8\x2d\xe8\x2e\xe8\x2f\xe8\x30\xe8\x31\xe8\x32\xe8\x33\xe8\x34\xe8\x35\xe8\x36\xe8\x37\xe8\x38\xe8\x39\xe8\x3a\xe8\x3b\xe8\x3c\xe8\x3d\xe8\x3e\xe8\x3f\xe8\x40\xe8\x41\xe8\x42\xe8\x43\xe8\x44\xe8\x45\xe8\x46\xe8\x47\xe8\x48\xe8\x49\xe8\x4a\xe8\x4b\xe8\x4c\xe8\x4d\xe8\x4e\xe8\x4f\xe8\x50\xe8\x51\xe8\x52", /* cd80 */ "\x00\x00\xe8\x53\xe8\x54\xe8\x55\xe8\x56\xe8\x57\xe8\x58\xe8\x59\xe8\x5a\xe8\x5b\xe8\x5c\xe8\x5d\xe8\x5e\xe8\x5f\xe8\x60\xe8\x61\xe8\x62\xe8\x63\xe8\x64\xe8\x65\xe8\x66\xe8\x67\xe8\x68\xe8\x69\xe8\x6a\xe8\x6b\xe8\x6c\xe8\x6d\xe8\x6e\xe8\x6f\xe8\x70\xe8\x71\xe8\x72\xe8\x73\xe8\x74\xe8\x75\xe8\x76\xe8\x77\xe8\x78\xe8\x79\xe8\x7a\xe8\x7b\xe8\x7c\xe8\x7d\xe8\x7e\xe8\x7f\xe8\x80\xe8\x81\xe8\x82\xe8\x83\xe8\x84\xe8\x85\xe8\x86\xe8\x87\xe8\x88\xe8\x89\xe8\x8a\xe8\x8b\xe8\x8c\xe8\x8d\xe8\x8e\xe8\x8f\xe8\x90\xe8\x91\xe8\x92\xe8\x93\xe8\x94\xe8\x95\xe8\x96\xe8\x97\xe8\x98\xe8\x99\xe8\x9a\xe8\x9b\xe8\x9c\xe8\x9d\xe8\x9e\xe8\x9f\xe8\xa0\xe8\xa1\xe8\xa2\xe8\xa3\xe8\xa4\xe8\xa5\xe8\xa6\xe8\xa7\xe8\xa8\xe8\xa9\xe8\xaa\xe8\xab\xe8\xac\xe8\xad\xe8\xae\xe8\xaf\xe8\xb0\xe8\xb1\xe8\xb2\xe8\xb3\xe8\xb4\xe8\xb5\xe8\xb6\xe8\xb7\xe8\xb8\xe8\xb9\xe8\xba\xe8\xbb\xe8\xbc\xe8\xbd\xe8\xbe\xe8\xbf\xe8\xc0\xe8\xc1\xe8\xc2\xe8\xc3\xe8\xc4\xe8\xc5\xe8\xc6\xe8\xc7\xe8\xc8\xe8\xc9\xe8\xca\xe8\xcb\xe8\xcc\xe8\xcd\xe8\xce\xe8\xcf\x00\x00\x00\x00", /* ce00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\xd0\xe8\xd1\xe8\xd2\xe8\xd3\xe8\xd4\xe8\xd5\xe8\xd6\xe8\xd7\xe8\xd8\xe8\xd9\xe8\xda\xe8\xdb\xe8\xdc\xe8\xdd\xe8\xde\xe8\xdf\xe8\xe0\xe8\xe1\xe8\xe2\xe8\xe3\xe8\xe4\xe8\xe5\xe8\xe6\xe8\xe7\xe8\xe8\xe8\xe9\xe8\xea\xe8\xeb\xe8\xec\xe8\xed\xe8\xee\xe8\xef\xe8\xf0\xe8\xf1\xe8\xf2\xe8\xf3\xe8\xf4\xe8\xf5\xe8\xf6\xe8\xf7\xe8\xf8\xe8\xf9\xe8\xfa\xe8\xfb\xe8\xfc\xe8\xfd\xe8\xfe\xe8\xff\xe9\x00\xe9\x01\xe9\x02\xe9\x03\xe9\x04\xe9\x05\xe9\x06\xe9\x07\xe9\x08\xe9\x09\xe9\x0a\xe9\x0b\xe9\x0c\xe9\x0d\xe9\x0e", /* ce80 */ "\x00\x00\xe9\x0f\xe9\x10\xe9\x11\xe9\x12\xe9\x13\xe9\x14\xe9\x15\xe9\x16\xe9\x17\xe9\x18\xe9\x19\xe9\x1a\xe9\x1b\xe9\x1c\xe9\x1d\xe9\x1e\xe9\x1f\xe9\x20\xe9\x21\xe9\x22\xe9\x23\xe9\x24\xe9\x25\xe9\x26\xe9\x27\xe9\x28\xe9\x29\xe9\x2a\xe9\x2b\xe9\x2c\xe9\x2d\xe9\x2e\xe9\x2f\xe9\x30\xe9\x31\xe9\x32\xe9\x33\xe9\x34\xe9\x35\xe9\x36\xe9\x37\xe9\x38\xe9\x39\xe9\x3a\xe9\x3b\xe9\x3c\xe9\x3d\xe9\x3e\xe9\x3f\xe9\x40\xe9\x41\xe9\x42\xe9\x43\xe9\x44\xe9\x45\xe9\x46\xe9\x47\xe9\x48\xe9\x49\xe9\x4a\xe9\x4b\xe9\x4c\xe9\x4d\xe9\x4e\xe9\x4f\xe9\x50\xe9\x51\xe9\x52\xe9\x53\xe9\x54\xe9\x55\xe9\x56\xe9\x57\xe9\x58\xe9\x59\xe9\x5a\xe9\x5b\xe9\x5c\xe9\x5d\xe9\x5e\xe9\x5f\xe9\x60\xe9\x61\xe9\x62\xe9\x63\xe9\x64\xe9\x65\xe9\x66\xe9\x67\xe9\x68\xe9\x69\xe9\x6a\xe9\x6b\xe9\x6c\xe9\x6d\xe9\x6e\xe9\x6f\xe9\x70\xe9\x71\xe9\x72\xe9\x73\xe9\x74\xe9\x75\xe9\x76\xe9\x77\xe9\x78\xe9\x79\xe9\x7a\xe9\x7b\xe9\x7c\xe9\x7d\xe9\x7e\xe9\x7f\xe9\x80\xe9\x81\xe9\x82\xe9\x83\xe9\x84\xe9\x85\xe9\x86\xe9\x87\xe9\x88\xe9\x89\xe9\x8a\xe9\x8b\x00\x00\x00\x00", /* cf00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x8c\xe9\x8d\xe9\x8e\xe9\x8f\xe9\x90\xe9\x91\xe9\x92\xe9\x93\xe9\x94\xe9\x95\xe9\x96\xe9\x97\xe9\x98\xe9\x99\xe9\x9a\xe9\x9b\xe9\x9c\xe9\x9d\xe9\x9e\xe9\x9f\xe9\xa0\xe9\xa1\xe9\xa2\xe9\xa3\xe9\xa4\xe9\xa5\xe9\xa6\xe9\xa7\xe9\xa8\xe9\xa9\xe9\xaa\xe9\xab\xe9\xac\xe9\xad\xe9\xae\xe9\xaf\xe9\xb0\xe9\xb1\xe9\xb2\xe9\xb3\xe9\xb4\xe9\xb5\xe9\xb6\xe9\xb7\xe9\xb8\xe9\xb9\xe9\xba\xe9\xbb\xe9\xbc\xe9\xbd\xe9\xbe\xe9\xbf\xe9\xc0\xe9\xc1\xe9\xc2\xe9\xc3\xe9\xc4\xe9\xc5\xe9\xc6\xe9\xc7\xe9\xc8\xe9\xc9\xe9\xca", /* cf80 */ "\x00\x00\xe9\xcb\xe9\xcc\xe9\xcd\xe9\xce\xe9\xcf\xe9\xd0\xe9\xd1\xe9\xd2\xe9\xd3\xe9\xd4\xe9\xd5\xe9\xd6\xe9\xd7\xe9\xd8\xe9\xd9\xe9\xda\xe9\xdb\xe9\xdc\xe9\xdd\xe9\xde\xe9\xdf\xe9\xe0\xe9\xe1\xe9\xe2\xe9\xe3\xe9\xe4\xe9\xe5\xe9\xe6\xe9\xe7\xe9\xe8\xe9\xe9\xe9\xea\xe9\xeb\xe9\xec\xe9\xed\xe9\xee\xe9\xef\xe9\xf0\xe9\xf1\xe9\xf2\xe9\xf3\xe9\xf4\xe9\xf5\xe9\xf6\xe9\xf7\xe9\xf8\xe9\xf9\xe9\xfa\xe9\xfb\xe9\xfc\xe9\xfd\xe9\xfe\xe9\xff\xea\x00\xea\x01\xea\x02\xea\x03\xea\x04\xea\x05\xea\x06\xea\x07\xea\x08\xea\x09\xea\x0a\xea\x0b\xea\x0c\xea\x0d\xea\x0e\xea\x0f\xea\x10\xea\x11\xea\x12\xea\x13\xea\x14\xea\x15\xea\x16\xea\x17\xea\x18\xea\x19\xea\x1a\xea\x1b\xea\x1c\xea\x1d\xea\x1e\xea\x1f\xea\x20\xea\x21\xea\x22\xea\x23\xea\x24\xea\x25\xea\x26\xea\x27\xea\x28\xea\x29\xea\x2a\xea\x2b\xea\x2c\xea\x2d\xea\x2e\xea\x2f\xea\x30\xea\x31\xea\x32\xea\x33\xea\x34\xea\x35\xea\x36\xea\x37\xea\x38\xea\x39\xea\x3a\xea\x3b\xea\x3c\xea\x3d\xea\x3e\xea\x3f\xea\x40\xea\x41\xea\x42\xea\x43\xea\x44\xea\x45\xea\x46\xea\x47\x00\x00\x00\x00", /* d000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x48\xea\x49\xea\x4a\xea\x4b\xea\x4c\xea\x4d\xea\x4e\xea\x4f\xea\x50\xea\x51\xea\x52\xea\x53\xea\x54\xea\x55\xea\x56\xea\x57\xea\x58\xea\x59\xea\x5a\xea\x5b\xea\x5c\xea\x5d\xea\x5e\xea\x5f\xea\x60\xea\x61\xea\x62\xea\x63\xea\x64\xea\x65\xea\x66\xea\x67\xea\x68\xea\x69\xea\x6a\xea\x6b\xea\x6c\xea\x6d\xea\x6e\xea\x6f\xea\x70\xea\x71\xea\x72\xea\x73\xea\x74\xea\x75\xea\x76\xea\x77\xea\x78\xea\x79\xea\x7a\xea\x7b\xea\x7c\xea\x7d\xea\x7e\xea\x7f\xea\x80\xea\x81\xea\x82\xea\x83\xea\x84\xea\x85\xea\x86", /* d080 */ "\x00\x00\xea\x87\xea\x88\xea\x89\xea\x8a\xea\x8b\xea\x8c\xea\x8d\xea\x8e\xea\x8f\xea\x90\xea\x91\xea\x92\xea\x93\xea\x94\xea\x95\xea\x96\xea\x97\xea\x98\xea\x99\xea\x9a\xea\x9b\xea\x9c\xea\x9d\xea\x9e\xea\x9f\xea\xa0\xea\xa1\xea\xa2\xea\xa3\xea\xa4\xea\xa5\xea\xa6\xea\xa7\xea\xa8\xea\xa9\xea\xaa\xea\xab\xea\xac\xea\xad\xea\xae\xea\xaf\xea\xb0\xea\xb1\xea\xb2\xea\xb3\xea\xb4\xea\xb5\xea\xb6\xea\xb7\xea\xb8\xea\xb9\xea\xba\xea\xbb\xea\xbc\xea\xbd\xea\xbe\xea\xbf\xea\xc0\xea\xc1\xea\xc2\xea\xc3\xea\xc4\xea\xc5\xea\xc6\xea\xc7\xea\xc8\xea\xc9\xea\xca\xea\xcb\xea\xcc\xea\xcd\xea\xce\xea\xcf\xea\xd0\xea\xd1\xea\xd2\xea\xd3\xea\xd4\xea\xd5\xea\xd6\xea\xd7\xea\xd8\xea\xd9\xea\xda\xea\xdb\xea\xdc\xea\xdd\xea\xde\xea\xdf\xea\xe0\xea\xe1\xea\xe2\xea\xe3\xea\xe4\xea\xe5\xea\xe6\xea\xe7\xea\xe8\xea\xe9\xea\xea\xea\xeb\xea\xec\xea\xed\xea\xee\xea\xef\xea\xf0\xea\xf1\xea\xf2\xea\xf3\xea\xf4\xea\xf5\xea\xf6\xea\xf7\xea\xf8\xea\xf9\xea\xfa\xea\xfb\xea\xfc\xea\xfd\xea\xfe\xea\xff\xeb\x00\xeb\x01\xeb\x02\xeb\x03\x00\x00\x00\x00", /* d100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x04\xeb\x05\xeb\x06\xeb\x07\xeb\x08\xeb\x09\xeb\x0a\xeb\x0b\xeb\x0c\xeb\x0d\xeb\x0e\xeb\x0f\xeb\x10\xeb\x11\xeb\x12\xeb\x13\xeb\x14\xeb\x15\xeb\x16\xeb\x17\xeb\x18\xeb\x19\xeb\x1a\xeb\x1b\xeb\x1c\xeb\x1d\xeb\x1e\xeb\x1f\xeb\x20\xeb\x21\xeb\x22\xeb\x23\xeb\x24\xeb\x25\xeb\x26\xeb\x27\xeb\x28\xeb\x29\xeb\x2a\xeb\x2b\xeb\x2c\xeb\x2d\xeb\x2e\xeb\x2f\xeb\x30\xeb\x31\xeb\x32\xeb\x33\xeb\x34\xeb\x35\xeb\x36\xeb\x37\xeb\x38\xeb\x39\xeb\x3a\xeb\x3b\xeb\x3c\xeb\x3d\xeb\x3e\xeb\x3f\xeb\x40\xeb\x41\xeb\x42", /* d180 */ "\x00\x00\xeb\x43\xeb\x44\xeb\x45\xeb\x46\xeb\x47\xeb\x48\xeb\x49\xeb\x4a\xeb\x4b\xeb\x4c\xeb\x4d\xeb\x4e\xeb\x4f\xeb\x50\xeb\x51\xeb\x52\xeb\x53\xeb\x54\xeb\x55\xeb\x56\xeb\x57\xeb\x58\xeb\x59\xeb\x5a\xeb\x5b\xeb\x5c\xeb\x5d\xeb\x5e\xeb\x5f\xeb\x60\xeb\x61\xeb\x62\xeb\x63\xeb\x64\xeb\x65\xeb\x66\xeb\x67\xeb\x68\xeb\x69\xeb\x6a\xeb\x6b\xeb\x6c\xeb\x6d\xeb\x6e\xeb\x6f\xeb\x70\xeb\x71\xeb\x72\xeb\x73\xeb\x74\xeb\x75\xeb\x76\xeb\x77\xeb\x78\xeb\x79\xeb\x7a\xeb\x7b\xeb\x7c\xeb\x7d\xeb\x7e\xeb\x7f\xeb\x80\xeb\x81\xeb\x82\xeb\x83\xeb\x84\xeb\x85\xeb\x86\xeb\x87\xeb\x88\xeb\x89\xeb\x8a\xeb\x8b\xeb\x8c\xeb\x8d\xeb\x8e\xeb\x8f\xeb\x90\xeb\x91\xeb\x92\xeb\x93\xeb\x94\xeb\x95\xeb\x96\xeb\x97\xeb\x98\xeb\x99\xeb\x9a\xeb\x9b\xeb\x9c\xeb\x9d\xeb\x9e\xeb\x9f\xeb\xa0\xeb\xa1\xeb\xa2\xeb\xa3\xeb\xa4\xeb\xa5\xeb\xa6\xeb\xa7\xeb\xa8\xeb\xa9\xeb\xaa\xeb\xab\xeb\xac\xeb\xad\xeb\xae\xeb\xaf\xeb\xb0\xeb\xb1\xeb\xb2\xeb\xb3\xeb\xb4\xeb\xb5\xeb\xb6\xeb\xb7\xeb\xb8\xeb\xb9\xeb\xba\xeb\xbb\xeb\xbc\xeb\xbd\xeb\xbe\xeb\xbf\x00\x00\x00\x00", /* d200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xc0\xeb\xc1\xeb\xc2\xeb\xc3\xeb\xc4\xeb\xc5\xeb\xc6\xeb\xc7\xeb\xc8\xeb\xc9\xeb\xca\xeb\xcb\xeb\xcc\xeb\xcd\xeb\xce\xeb\xcf\xeb\xd0\xeb\xd1\xeb\xd2\xeb\xd3\xeb\xd4\xeb\xd5\xeb\xd6\xeb\xd7\xeb\xd8\xeb\xd9\xeb\xda\xeb\xdb\xeb\xdc\xeb\xdd\xeb\xde\xeb\xdf\xeb\xe0\xeb\xe1\xeb\xe2\xeb\xe3\xeb\xe4\xeb\xe5\xeb\xe6\xeb\xe7\xeb\xe8\xeb\xe9\xeb\xea\xeb\xeb\xeb\xec\xeb\xed\xeb\xee\xeb\xef\xeb\xf0\xeb\xf1\xeb\xf2\xeb\xf3\xeb\xf4\xeb\xf5\xeb\xf6\xeb\xf7\xeb\xf8\xeb\xf9\xeb\xfa\xeb\xfb\xeb\xfc\xeb\xfd\xeb\xfe", /* d280 */ "\x00\x00\xeb\xff\xec\x00\xec\x01\xec\x02\xec\x03\xec\x04\xec\x05\xec\x06\xec\x07\xec\x08\xec\x09\xec\x0a\xec\x0b\xec\x0c\xec\x0d\xec\x0e\xec\x0f\xec\x10\xec\x11\xec\x12\xec\x13\xec\x14\xec\x15\xec\x16\xec\x17\xec\x18\xec\x19\xec\x1a\xec\x1b\xec\x1c\xec\x1d\xec\x1e\xec\x1f\xec\x20\xec\x21\xec\x22\xec\x23\xec\x24\xec\x25\xec\x26\xec\x27\xec\x28\xec\x29\xec\x2a\xec\x2b\xec\x2c\xec\x2d\xec\x2e\xec\x2f\xec\x30\xec\x31\xec\x32\xec\x33\xec\x34\xec\x35\xec\x36\xec\x37\xec\x38\xec\x39\xec\x3a\xec\x3b\xec\x3c\xec\x3d\xec\x3e\xec\x3f\xec\x40\xec\x41\xec\x42\xec\x43\xec\x44\xec\x45\xec\x46\xec\x47\xec\x48\xec\x49\xec\x4a\xec\x4b\xec\x4c\xec\x4d\xec\x4e\xec\x4f\xec\x50\xec\x51\xec\x52\xec\x53\xec\x54\xec\x55\xec\x56\xec\x57\xec\x58\xec\x59\xec\x5a\xec\x5b\xec\x5c\xec\x5d\xec\x5e\xec\x5f\xec\x60\xec\x61\xec\x62\xec\x63\xec\x64\xec\x65\xec\x66\xec\x67\xec\x68\xec\x69\xec\x6a\xec\x6b\xec\x6c\xec\x6d\xec\x6e\xec\x6f\xec\x70\xec\x71\xec\x72\xec\x73\xec\x74\xec\x75\xec\x76\xec\x77\xec\x78\xec\x79\xec\x7a\xec\x7b\x00\x00\x00\x00", /* d300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x7c\xec\x7d\xec\x7e\xec\x7f\xec\x80\xec\x81\xec\x82\xec\x83\xec\x84\xec\x85\xec\x86\xec\x87\xec\x88\xec\x89\xec\x8a\xec\x8b\xec\x8c\xec\x8d\xec\x8e\xec\x8f\xec\x90\xec\x91\xec\x92\xec\x93\xec\x94\xec\x95\xec\x96\xec\x97\xec\x98\xec\x99\xec\x9a\xec\x9b\xec\x9c\xec\x9d\xec\x9e\xec\x9f\xec\xa0\xec\xa1\xec\xa2\xec\xa3\xec\xa4\xec\xa5\xec\xa6\xec\xa7\xec\xa8\xec\xa9\xec\xaa\xec\xab\xec\xac\xec\xad\xec\xae\xec\xaf\xec\xb0\xec\xb1\xec\xb2\xec\xb3\xec\xb4\xec\xb5\xec\xb6\xec\xb7\xec\xb8\xec\xb9\xec\xba", /* d380 */ "\x00\x00\xec\xbb\xec\xbc\xec\xbd\xec\xbe\xec\xbf\xec\xc0\xec\xc1\xec\xc2\xec\xc3\xec\xc4\xec\xc5\xec\xc6\xec\xc7\xec\xc8\xec\xc9\xec\xca\xec\xcb\xec\xcc\xec\xcd\xec\xce\xec\xcf\xec\xd0\xec\xd1\xec\xd2\xec\xd3\xec\xd4\xec\xd5\xec\xd6\xec\xd7\xec\xd8\xec\xd9\xec\xda\xec\xdb\xec\xdc\xec\xdd\xec\xde\xec\xdf\xec\xe0\xec\xe1\xec\xe2\xec\xe3\xec\xe4\xec\xe5\xec\xe6\xec\xe7\xec\xe8\xec\xe9\xec\xea\xec\xeb\xec\xec\xec\xed\xec\xee\xec\xef\xec\xf0\xec\xf1\xec\xf2\xec\xf3\xec\xf4\xec\xf5\xec\xf6\xec\xf7\xec\xf8\xec\xf9\xec\xfa\xec\xfb\xec\xfc\xec\xfd\xec\xfe\xec\xff\xed\x00\xed\x01\xed\x02\xed\x03\xed\x04\xed\x05\xed\x06\xed\x07\xed\x08\xed\x09\xed\x0a\xed\x0b\xed\x0c\xed\x0d\xed\x0e\xed\x0f\xed\x10\xed\x11\xed\x12\xed\x13\xed\x14\xed\x15\xed\x16\xed\x17\xed\x18\xed\x19\xed\x1a\xed\x1b\xed\x1c\xed\x1d\xed\x1e\xed\x1f\xed\x20\xed\x21\xed\x22\xed\x23\xed\x24\xed\x25\xed\x26\xed\x27\xed\x28\xed\x29\xed\x2a\xed\x2b\xed\x2c\xed\x2d\xed\x2e\xed\x2f\xed\x30\xed\x31\xed\x32\xed\x33\xed\x34\xed\x35\xed\x36\xed\x37\x00\x00\x00\x00", /* d400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x38\xed\x39\xed\x3a\xed\x3b\xed\x3c\xed\x3d\xed\x3e\xed\x3f\xed\x40\xed\x41\xed\x42\xed\x43\xed\x44\xed\x45\xed\x46\xed\x47\xed\x48\xed\x49\xed\x4a\xed\x4b\xed\x4c\xed\x4d\xed\x4e\xed\x4f\xed\x50\xed\x51\xed\x52\xed\x53\xed\x54\xed\x55\xed\x56\xed\x57\xed\x58\xed\x59\xed\x5a\xed\x5b\xed\x5c\xed\x5d\xed\x5e\xed\x5f\xed\x60\xed\x61\xed\x62\xed\x63\xed\x64\xed\x65\xed\x66\xed\x67\xed\x68\xed\x69\xed\x6a\xed\x6b\xed\x6c\xed\x6d\xed\x6e\xed\x6f\xed\x70\xed\x71\xed\x72\xed\x73\xed\x74\xed\x75\xed\x76", /* d480 */ "\x00\x00\xed\x77\xed\x78\xed\x79\xed\x7a\xed\x7b\xed\x7c\xed\x7d\xed\x7e\xed\x7f\xed\x80\xed\x81\xed\x82\xed\x83\xed\x84\xed\x85\xed\x86\xed\x87\xed\x88\xed\x89\xed\x8a\xed\x8b\xed\x8c\xed\x8d\xed\x8e\xed\x8f\xed\x90\xed\x91\xed\x92\xed\x93\xed\x94\xed\x95\xed\x96\xed\x97\xed\x98\xed\x99\xed\x9a\xed\x9b\xed\x9c\xed\x9d\xed\x9e\xed\x9f\xed\xa0\xed\xa1\xed\xa2\xed\xa3\xed\xa4\xed\xa5\xed\xa6\xed\xa7\xed\xa8\xed\xa9\xed\xaa\xed\xab\xed\xac\xed\xad\xed\xae\xed\xaf\xed\xb0\xed\xb1\xed\xb2\xed\xb3\xed\xb4\xed\xb5\xed\xb6\xed\xb7\xed\xb8\xed\xb9\xed\xba\xed\xbb\xed\xbc\xed\xbd\xed\xbe\xed\xbf\xed\xc0\xed\xc1\xed\xc2\xed\xc3\xed\xc4\xed\xc5\xed\xc6\xed\xc7\xed\xc8\xed\xc9\xed\xca\xed\xcb\xed\xcc\xed\xcd\xed\xce\xed\xcf\xed\xd0\xed\xd1\xed\xd2\xed\xd3\xed\xd4\xed\xd5\xed\xd6\xed\xd7\xed\xd8\xed\xd9\xed\xda\xed\xdb\xed\xdc\xed\xdd\xed\xde\xed\xdf\xed\xe0\xed\xe1\xed\xe2\xed\xe3\xed\xe4\xed\xe5\xed\xe6\xed\xe7\xed\xe8\xed\xe9\xed\xea\xed\xeb\xed\xec\xed\xed\xed\xee\xed\xef\xed\xf0\xed\xf1\xed\xf2\xed\xf3\x00\x00\x00\x00", /* d500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\xf4\xed\xf5\xed\xf6\xed\xf7\xed\xf8\xed\xf9\xed\xfa\xed\xfb\xed\xfc\xed\xfd\xed\xfe\xed\xff\xee\x00\xee\x01\xee\x02\xee\x03\xee\x04\xee\x05\xee\x06\xee\x07\xee\x08\xee\x09\xee\x0a\xee\x0b\xee\x0c\xee\x0d\xee\x0e\xee\x0f\xee\x10\xee\x11\xee\x12\xee\x13\xee\x14\xee\x15\xee\x16\xee\x17\xee\x18\xee\x19\xee\x1a\xee\x1b\xee\x1c\xee\x1d\xee\x1e\xee\x1f\xee\x20\xee\x21\xee\x22\xee\x23\xee\x24\xee\x25\xee\x26\xee\x27\xee\x28\xee\x29\xee\x2a\xee\x2b\xee\x2c\xee\x2d\xee\x2e\xee\x2f\xee\x30\xee\x31\xee\x32", /* d580 */ "\x00\x00\xee\x33\xee\x34\xee\x35\xee\x36\xee\x37\xee\x38\xee\x39\xee\x3a\xee\x3b\xee\x3c\xee\x3d\xee\x3e\xee\x3f\xee\x40\xee\x41\xee\x42\xee\x43\xee\x44\xee\x45\xee\x46\xee\x47\xee\x48\xee\x49\xee\x4a\xee\x4b\xee\x4c\xee\x4d\xee\x4e\xee\x4f\xee\x50\xee\x51\xee\x52\xee\x53\xee\x54\xee\x55\xee\x56\xee\x57\xee\x58\xee\x59\xee\x5a\xee\x5b\xee\x5c\xee\x5d\xee\x5e\xee\x5f\xee\x60\xee\x61\xee\x62\xee\x63\xee\x64\xee\x65\xee\x66\xee\x67\xee\x68\xee\x69\xee\x6a\xee\x6b\xee\x6c\xee\x6d\xee\x6e\xee\x6f\xee\x70\xee\x71\xee\x72\xee\x73\xee\x74\xee\x75\xee\x76\xee\x77\xee\x78\xee\x79\xee\x7a\xee\x7b\xee\x7c\xee\x7d\xee\x7e\xee\x7f\xee\x80\xee\x81\xee\x82\xee\x83\xee\x84\xee\x85\xee\x86\xee\x87\xee\x88\xee\x89\xee\x8a\xee\x8b\xee\x8c\xee\x8d\xee\x8e\xee\x8f\xee\x90\xee\x91\xee\x92\xee\x93\xee\x94\xee\x95\xee\x96\xee\x97\xee\x98\xee\x99\xee\x9a\xee\x9b\xee\x9c\xee\x9d\xee\x9e\xee\x9f\xee\xa0\xee\xa1\xee\xa2\xee\xa3\xee\xa4\xee\xa5\xee\xa6\xee\xa7\xee\xa8\xee\xa9\xee\xaa\xee\xab\xee\xac\xee\xad\xee\xae\xee\xaf\x00\x00\x00\x00", /* d600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\xb0\xee\xb1\xee\xb2\xee\xb3\xee\xb4\xee\xb5\xee\xb6\xee\xb7\xee\xb8\xee\xb9\xee\xba\xee\xbb\xee\xbc\xee\xbd\xee\xbe\xee\xbf\xee\xc0\xee\xc1\xee\xc2\xee\xc3\xee\xc4\xee\xc5\xee\xc6\xee\xc7\xee\xc8\xee\xc9\xee\xca\xee\xcb\xee\xcc\xee\xcd\xee\xce\xee\xcf\xee\xd0\xee\xd1\xee\xd2\xee\xd3\xee\xd4\xee\xd5\xee\xd6\xee\xd7\xee\xd8\xee\xd9\xee\xda\xee\xdb\xee\xdc\xee\xdd\xee\xde\xee\xdf\xee\xe0\xee\xe1\xee\xe2\xee\xe3\xee\xe4\xee\xe5\xee\xe6\xee\xe7\xee\xe8\xee\xe9\xee\xea\xee\xeb\xee\xec\xee\xed\xee\xee", /* d680 */ "\x00\x00\xee\xef\xee\xf0\xee\xf1\xee\xf2\xee\xf3\xee\xf4\xee\xf5\xee\xf6\xee\xf7\xee\xf8\xee\xf9\xee\xfa\xee\xfb\xee\xfc\xee\xfd\xee\xfe\xee\xff\xef\x00\xef\x01\xef\x02\xef\x03\xef\x04\xef\x05\xef\x06\xef\x07\xef\x08\xef\x09\xef\x0a\xef\x0b\xef\x0c\xef\x0d\xef\x0e\xef\x0f\xef\x10\xef\x11\xef\x12\xef\x13\xef\x14\xef\x15\xef\x16\xef\x17\xef\x18\xef\x19\xef\x1a\xef\x1b\xef\x1c\xef\x1d\xef\x1e\xef\x1f\xef\x20\xef\x21\xef\x22\xef\x23\xef\x24\xef\x25\xef\x26\xef\x27\xef\x28\xef\x29\xef\x2a\xef\x2b\xef\x2c\xef\x2d\xef\x2e\xef\x2f\xef\x30\xef\x31\xef\x32\xef\x33\xef\x34\xef\x35\xef\x36\xef\x37\xef\x38\xef\x39\xef\x3a\xef\x3b\xef\x3c\xef\x3d\xef\x3e\xef\x3f\xef\x40\xef\x41\xef\x42\xef\x43\xef\x44\xef\x45\xef\x46\xef\x47\xef\x48\xef\x49\xef\x4a\xef\x4b\xef\x4c\xef\x4d\xef\x4e\xef\x4f\xef\x50\xef\x51\xef\x52\xef\x53\xef\x54\xef\x55\xef\x56\xef\x57\xef\x58\xef\x59\xef\x5a\xef\x5b\xef\x5c\xef\x5d\xef\x5e\xef\x5f\xef\x60\xef\x61\xef\x62\xef\x63\xef\x64\xef\x65\xef\x66\xef\x67\xef\x68\xef\x69\xef\x6a\xef\x6b\x00\x00\x00\x00", /* d700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x6c\xef\x6d\xef\x6e\xef\x6f\xef\x70\xef\x71\xef\x72\xef\x73\xef\x74\xef\x75\xef\x76\xef\x77\xef\x78\xef\x79\xef\x7a\xef\x7b\xef\x7c\xef\x7d\xef\x7e\xef\x7f\xef\x80\xef\x81\xef\x82\xef\x83\xef\x84\xef\x85\xef\x86\xef\x87\xef\x88\xef\x89\xef\x8a\xef\x8b\xef\x8c\xef\x8d\xef\x8e\xef\x8f\xef\x90\xef\x91\xef\x92\xef\x93\xef\x94\xef\x95\xef\x96\xef\x97\xef\x98\xef\x99\xef\x9a\xef\x9b\xef\x9c\xef\x9d\xef\x9e\xef\x9f\xef\xa0\xef\xa1\xef\xa2\xef\xa3\xef\xa4\xef\xa5\xef\xa6\xef\xa7\xef\xa8\xef\xa9\xef\xaa", /* d780 */ "\x00\x00\xef\xab\xef\xac\xef\xad\xef\xae\xef\xaf\xef\xb0\xef\xb1\xef\xb2\xef\xb3\xef\xb4\xef\xb5\xef\xb6\xef\xb7\xef\xb8\xef\xb9\xef\xba\xef\xbb\xef\xbc\xef\xbd\xef\xbe\xef\xbf\xef\xc0\xef\xc1\xef\xc2\xef\xc3\xef\xc4\xef\xc5\xef\xc6\xef\xc7\xef\xc8\xef\xc9\xef\xca\xef\xcb\xef\xcc\xef\xcd\xef\xce\xef\xcf\xef\xd0\xef\xd1\xef\xd2\xef\xd3\xef\xd4\xef\xd5\xef\xd6\xef\xd7\xef\xd8\xef\xd9\xef\xda\xef\xdb\xef\xdc\xef\xdd\xef\xde\xef\xdf\xef\xe0\xef\xe1\xef\xe2\xef\xe3\xef\xe4\xef\xe5\xef\xe6\xef\xe7\xef\xe8\xef\xe9\xef\xea\xef\xeb\xef\xec\xef\xed\xef\xee\xef\xef\xef\xf0\xef\xf1\xef\xf2\xef\xf3\xef\xf4\xef\xf5\xef\xf6\xef\xf7\xef\xf8\xef\xf9\xef\xfa\xef\xfb\xef\xfc\xef\xfd\xef\xfe\xef\xff\xf0\x00\xf0\x01\xf0\x02\xf0\x03\xf0\x04\xf0\x05\xf0\x06\xf0\x07\xf0\x08\xf0\x09\xf0\x0a\xf0\x0b\xf0\x0c\xf0\x0d\xf0\x0e\xf0\x0f\xf0\x10\xf0\x11\xf0\x12\xf0\x13\xf0\x14\xf0\x15\xf0\x16\xf0\x17\xf0\x18\xf0\x19\xf0\x1a\xf0\x1b\xf0\x1c\xf0\x1d\xf0\x1e\xf0\x1f\xf0\x20\xf0\x21\xf0\x22\xf0\x23\xf0\x24\xf0\x25\xf0\x26\xf0\x27\x00\x00\x00\x00", /* d800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x28\xf0\x29\xf0\x2a\xf0\x2b\xf0\x2c\xf0\x2d\xf0\x2e\xf0\x2f\xf0\x30\xf0\x31\xf0\x32\xf0\x33\xf0\x34\xf0\x35\xf0\x36\xf0\x37\xf0\x38\xf0\x39\xf0\x3a\xf0\x3b\xf0\x3c\xf0\x3d\xf0\x3e\xf0\x3f\xf0\x40\xf0\x41\xf0\x42\xf0\x43\xf0\x44\xf0\x45\xf0\x46\xf0\x47\xf0\x48\xf0\x49\xf0\x4a\xf0\x4b\xf0\x4c\xf0\x4d\xf0\x4e\xf0\x4f\xf0\x50\xf0\x51\xf0\x52\xf0\x53\xf0\x54\xf0\x55\xf0\x56\xf0\x57\xf0\x58\xf0\x59\xf0\x5a\xf0\x5b\xf0\x5c\xf0\x5d\xf0\x5e\xf0\x5f\xf0\x60\xf0\x61\xf0\x62\xf0\x63\xf0\x64\xf0\x65\xf0\x66", /* d880 */ "\x00\x00\xf0\x67\xf0\x68\xf0\x69\xf0\x6a\xf0\x6b\xf0\x6c\xf0\x6d\xf0\x6e\xf0\x6f\xf0\x70\xf0\x71\xf0\x72\xf0\x73\xf0\x74\xf0\x75\xf0\x76\xf0\x77\xf0\x78\xf0\x79\xf0\x7a\xf0\x7b\xf0\x7c\xf0\x7d\xf0\x7e\xf0\x7f\xf0\x80\xf0\x81\xf0\x82\xf0\x83\xf0\x84\xf0\x85\xf0\x86\xf0\x87\xf0\x88\xf0\x89\xf0\x8a\xf0\x8b\xf0\x8c\xf0\x8d\xf0\x8e\xf0\x8f\xf0\x90\xf0\x91\xf0\x92\xf0\x93\xf0\x94\xf0\x95\xf0\x96\xf0\x97\xf0\x98\xf0\x99\xf0\x9a\xf0\x9b\xf0\x9c\xf0\x9d\xf0\x9e\xf0\x9f\xf0\xa0\xf0\xa1\xf0\xa2\xf0\xa3\xf0\xa4\xf0\xa5\xf0\xa6\xf0\xa7\xf0\xa8\xf0\xa9\xf0\xaa\xf0\xab\xf0\xac\xf0\xad\xf0\xae\xf0\xaf\xf0\xb0\xf0\xb1\xf0\xb2\xf0\xb3\xf0\xb4\xf0\xb5\xf0\xb6\xf0\xb7\xf0\xb8\xf0\xb9\xf0\xba\xf0\xbb\xf0\xbc\xf0\xbd\xf0\xbe\xf0\xbf\xf0\xc0\xf0\xc1\xf0\xc2\xf0\xc3\xf0\xc4\xf0\xc5\xf0\xc6\xf0\xc7\xf0\xc8\xf0\xc9\xf0\xca\xf0\xcb\xf0\xcc\xf0\xcd\xf0\xce\xf0\xcf\xf0\xd0\xf0\xd1\xf0\xd2\xf0\xd3\xf0\xd4\xf0\xd5\xf0\xd6\xf0\xd7\xf0\xd8\xf0\xd9\xf0\xda\xf0\xdb\xf0\xdc\xf0\xdd\xf0\xde\xf0\xdf\xf0\xe0\xf0\xe1\xf0\xe2\xf0\xe3\x00\x00\x00\x00", /* d900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xe4\xf0\xe5\xf0\xe6\xf0\xe7\xf0\xe8\xf0\xe9\xf0\xea\xf0\xeb\xf0\xec\xf0\xed\xf0\xee\xf0\xef\xf0\xf0\xf0\xf1\xf0\xf2\xf0\xf3\xf0\xf4\xf0\xf5\xf0\xf6\xf0\xf7\xf0\xf8\xf0\xf9\xf0\xfa\xf0\xfb\xf0\xfc\xf0\xfd\xf0\xfe\xf0\xff\xf1\x00\xf1\x01\xf1\x02\xf1\x03\xf1\x04\xf1\x05\xf1\x06\xf1\x07\xf1\x08\xf1\x09\xf1\x0a\xf1\x0b\xf1\x0c\xf1\x0d\xf1\x0e\xf1\x0f\xf1\x10\xf1\x11\xf1\x12\xf1\x13\xf1\x14\xf1\x15\xf1\x16\xf1\x17\xf1\x18\xf1\x19\xf1\x1a\xf1\x1b\xf1\x1c\xf1\x1d\xf1\x1e\xf1\x1f\xf1\x20\xf1\x21\xf1\x22", /* d980 */ "\x00\x00\xf1\x23\xf1\x24\xf1\x25\xf1\x26\xf1\x27\xf1\x28\xf1\x29\xf1\x2a\xf1\x2b\xf1\x2c\xf1\x2d\xf1\x2e\xf1\x2f\xf1\x30\xf1\x31\xf1\x32\xf1\x33\xf1\x34\xf1\x35\xf1\x36\xf1\x37\xf1\x38\xf1\x39\xf1\x3a\xf1\x3b\xf1\x3c\xf1\x3d\xf1\x3e\xf1\x3f\xf1\x40\xf1\x41\xf1\x42\xf1\x43\xf1\x44\xf1\x45\xf1\x46\xf1\x47\xf1\x48\xf1\x49\xf1\x4a\xf1\x4b\xf1\x4c\xf1\x4d\xf1\x4e\xf1\x4f\xf1\x50\xf1\x51\xf1\x52\xf1\x53\xf1\x54\xf1\x55\xf1\x56\xf1\x57\xf1\x58\xf1\x59\xf1\x5a\xf1\x5b\xf1\x5c\xf1\x5d\xf1\x5e\xf1\x5f\xf1\x60\xf1\x61\xf1\x62\xf1\x63\xf1\x64\xf1\x65\xf1\x66\xf1\x67\xf1\x68\xf1\x69\xf1\x6a\xf1\x6b\xf1\x6c\xf1\x6d\xf1\x6e\xf1\x6f\xf1\x70\xf1\x71\xf1\x72\xf1\x73\xf1\x74\xf1\x75\xf1\x76\xf1\x77\xf1\x78\xf1\x79\xf1\x7a\xf1\x7b\xf1\x7c\xf1\x7d\xf1\x7e\xf1\x7f\xf1\x80\xf1\x81\xf1\x82\xf1\x83\xf1\x84\xf1\x85\xf1\x86\xf1\x87\xf1\x88\xf1\x89\xf1\x8a\xf1\x8b\xf1\x8c\xf1\x8d\xf1\x8e\xf1\x8f\xf1\x90\xf1\x91\xf1\x92\xf1\x93\xf1\x94\xf1\x95\xf1\x96\xf1\x97\xf1\x98\xf1\x99\xf1\x9a\xf1\x9b\xf1\x9c\xf1\x9d\xf1\x9e\xf1\x9f\x00\x00\x00\x00", /* da00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xa0\xf1\xa1\xf1\xa2\xf1\xa3\xf1\xa4\xf1\xa5\xf1\xa6\xf1\xa7\xf1\xa8\xf1\xa9\xf1\xaa\xf1\xab\xf1\xac\xf1\xad\xf1\xae\xf1\xaf\xf1\xb0\xf1\xb1\xf1\xb2\xf1\xb3\xf1\xb4\xf1\xb5\xf1\xb6\xf1\xb7\xf1\xb8\xf1\xb9\xf1\xba\xf1\xbb\xf1\xbc\xf1\xbd\xf1\xbe\xf1\xbf\xf1\xc0\xf1\xc1\xf1\xc2\xf1\xc3\xf1\xc4\xf1\xc5\xf1\xc6\xf1\xc7\xf1\xc8\xf1\xc9\xf1\xca\xf1\xcb\xf1\xcc\xf1\xcd\xf1\xce\xf1\xcf\xf1\xd0\xf1\xd1\xf1\xd2\xf1\xd3\xf1\xd4\xf1\xd5\xf1\xd6\xf1\xd7\xf1\xd8\xf1\xd9\xf1\xda\xf1\xdb\xf1\xdc\xf1\xdd\xf1\xde", /* da80 */ "\x00\x00\xf1\xdf\xf1\xe0\xf1\xe1\xf1\xe2\xf1\xe3\xf1\xe4\xf1\xe5\xf1\xe6\xf1\xe7\xf1\xe8\xf1\xe9\xf1\xea\xf1\xeb\xf1\xec\xf1\xed\xf1\xee\xf1\xef\xf1\xf0\xf1\xf1\xf1\xf2\xf1\xf3\xf1\xf4\xf1\xf5\xf1\xf6\xf1\xf7\xf1\xf8\xf1\xf9\xf1\xfa\xf1\xfb\xf1\xfc\xf1\xfd\xf1\xfe\xf1\xff\xf2\x00\xf2\x01\xf2\x02\xf2\x03\xf2\x04\xf2\x05\xf2\x06\xf2\x07\xf2\x08\xf2\x09\xf2\x0a\xf2\x0b\xf2\x0c\xf2\x0d\xf2\x0e\xf2\x0f\xf2\x10\xf2\x11\xf2\x12\xf2\x13\xf2\x14\xf2\x15\xf2\x16\xf2\x17\xf2\x18\xf2\x19\xf2\x1a\xf2\x1b\xf2\x1c\xf2\x1d\xf2\x1e\xf2\x1f\xf2\x20\xf2\x21\xf2\x22\xf2\x23\xf2\x24\xf2\x25\xf2\x26\xf2\x27\xf2\x28\xf2\x29\xf2\x2a\xf2\x2b\xf2\x2c\xf2\x2d\xf2\x2e\xf2\x2f\xf2\x30\xf2\x31\xf2\x32\xf2\x33\xf2\x34\xf2\x35\xf2\x36\xf2\x37\xf2\x38\xf2\x39\xf2\x3a\xf2\x3b\xf2\x3c\xf2\x3d\xf2\x3e\xf2\x3f\xf2\x40\xf2\x41\xf2\x42\xf2\x43\xf2\x44\xf2\x45\xf2\x46\xf2\x47\xf2\x48\xf2\x49\xf2\x4a\xf2\x4b\xf2\x4c\xf2\x4d\xf2\x4e\xf2\x4f\xf2\x50\xf2\x51\xf2\x52\xf2\x53\xf2\x54\xf2\x55\xf2\x56\xf2\x57\xf2\x58\xf2\x59\xf2\x5a\xf2\x5b\x00\x00\x00\x00", /* db00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x5c\xf2\x5d\xf2\x5e\xf2\x5f\xf2\x60\xf2\x61\xf2\x62\xf2\x63\xf2\x64\xf2\x65\xf2\x66\xf2\x67\xf2\x68\xf2\x69\xf2\x6a\xf2\x6b\xf2\x6c\xf2\x6d\xf2\x6e\xf2\x6f\xf2\x70\xf2\x71\xf2\x72\xf2\x73\xf2\x74\xf2\x75\xf2\x76\xf2\x77\xf2\x78\xf2\x79\xf2\x7a\xf2\x7b\xf2\x7c\xf2\x7d\xf2\x7e\xf2\x7f\xf2\x80\xf2\x81\xf2\x82\xf2\x83\xf2\x84\xf2\x85\xf2\x86\xf2\x87\xf2\x88\xf2\x89\xf2\x8a\xf2\x8b\xf2\x8c\xf2\x8d\xf2\x8e\xf2\x8f\xf2\x90\xf2\x91\xf2\x92\xf2\x93\xf2\x94\xf2\x95\xf2\x96\xf2\x97\xf2\x98\xf2\x99\xf2\x9a", /* db80 */ "\x00\x00\xf2\x9b\xf2\x9c\xf2\x9d\xf2\x9e\xf2\x9f\xf2\xa0\xf2\xa1\xf2\xa2\xf2\xa3\xf2\xa4\xf2\xa5\xf2\xa6\xf2\xa7\xf2\xa8\xf2\xa9\xf2\xaa\xf2\xab\xf2\xac\xf2\xad\xf2\xae\xf2\xaf\xf2\xb0\xf2\xb1\xf2\xb2\xf2\xb3\xf2\xb4\xf2\xb5\xf2\xb6\xf2\xb7\xf2\xb8\xf2\xb9\xf2\xba\xf2\xbb\xf2\xbc\xf2\xbd\xf2\xbe\xf2\xbf\xf2\xc0\xf2\xc1\xf2\xc2\xf2\xc3\xf2\xc4\xf2\xc5\xf2\xc6\xf2\xc7\xf2\xc8\xf2\xc9\xf2\xca\xf2\xcb\xf2\xcc\xf2\xcd\xf2\xce\xf2\xcf\xf2\xd0\xf2\xd1\xf2\xd2\xf2\xd3\xf2\xd4\xf2\xd5\xf2\xd6\xf2\xd7\xf2\xd8\xf2\xd9\xf2\xda\xf2\xdb\xf2\xdc\xf2\xdd\xf2\xde\xf2\xdf\xf2\xe0\xf2\xe1\xf2\xe2\xf2\xe3\xf2\xe4\xf2\xe5\xf2\xe6\xf2\xe7\xf2\xe8\xf2\xe9\xf2\xea\xf2\xeb\xf2\xec\xf2\xed\xf2\xee\xf2\xef\xf2\xf0\xf2\xf1\xf2\xf2\xf2\xf3\xf2\xf4\xf2\xf5\xf2\xf6\xf2\xf7\xf2\xf8\xf2\xf9\xf2\xfa\xf2\xfb\xf2\xfc\xf2\xfd\xf2\xfe\xf2\xff\xf3\x00\xf3\x01\xf3\x02\xf3\x03\xf3\x04\xf3\x05\xf3\x06\xf3\x07\xf3\x08\xf3\x09\xf3\x0a\xf3\x0b\xf3\x0c\xf3\x0d\xf3\x0e\xf3\x0f\xf3\x10\xf3\x11\xf3\x12\xf3\x13\xf3\x14\xf3\x15\xf3\x16\xf3\x17\x00\x00\x00\x00", /* dc00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x18\xf3\x19\xf3\x1a\xf3\x1b\xf3\x1c\xf3\x1d\xf3\x1e\xf3\x1f\xf3\x20\xf3\x21\xf3\x22\xf3\x23\xf3\x24\xf3\x25\xf3\x26\xf3\x27\xf3\x28\xf3\x29\xf3\x2a\xf3\x2b\xf3\x2c\xf3\x2d\xf3\x2e\xf3\x2f\xf3\x30\xf3\x31\xf3\x32\xf3\x33\xf3\x34\xf3\x35\xf3\x36\xf3\x37\xf3\x38\xf3\x39\xf3\x3a\xf3\x3b\xf3\x3c\xf3\x3d\xf3\x3e\xf3\x3f\xf3\x40\xf3\x41\xf3\x42\xf3\x43\xf3\x44\xf3\x45\xf3\x46\xf3\x47\xf3\x48\xf3\x49\xf3\x4a\xf3\x4b\xf3\x4c\xf3\x4d\xf3\x4e\xf3\x4f\xf3\x50\xf3\x51\xf3\x52\xf3\x53\xf3\x54\xf3\x55\xf3\x56", /* dc80 */ "\x00\x00\xf3\x57\xf3\x58\xf3\x59\xf3\x5a\xf3\x5b\xf3\x5c\xf3\x5d\xf3\x5e\xf3\x5f\xf3\x60\xf3\x61\xf3\x62\xf3\x63\xf3\x64\xf3\x65\xf3\x66\xf3\x67\xf3\x68\xf3\x69\xf3\x6a\xf3\x6b\xf3\x6c\xf3\x6d\xf3\x6e\xf3\x6f\xf3\x70\xf3\x71\xf3\x72\xf3\x73\xf3\x74\xf3\x75\xf3\x76\xf3\x77\xf3\x78\xf3\x79\xf3\x7a\xf3\x7b\xf3\x7c\xf3\x7d\xf3\x7e\xf3\x7f\xf3\x80\xf3\x81\xf3\x82\xf3\x83\xf3\x84\xf3\x85\xf3\x86\xf3\x87\xf3\x88\xf3\x89\xf3\x8a\xf3\x8b\xf3\x8c\xf3\x8d\xf3\x8e\xf3\x8f\xf3\x90\xf3\x91\xf3\x92\xf3\x93\xf3\x94\xf3\x95\xf3\x96\xf3\x97\xf3\x98\xf3\x99\xf3\x9a\xf3\x9b\xf3\x9c\xf3\x9d\xf3\x9e\xf3\x9f\xf3\xa0\xf3\xa1\xf3\xa2\xf3\xa3\xf3\xa4\xf3\xa5\xf3\xa6\xf3\xa7\xf3\xa8\xf3\xa9\xf3\xaa\xf3\xab\xf3\xac\xf3\xad\xf3\xae\xf3\xaf\xf3\xb0\xf3\xb1\xf3\xb2\xf3\xb3\xf3\xb4\xf3\xb5\xf3\xb6\xf3\xb7\xf3\xb8\xf3\xb9\xf3\xba\xf3\xbb\xf3\xbc\xf3\xbd\xf3\xbe\xf3\xbf\xf3\xc0\xf3\xc1\xf3\xc2\xf3\xc3\xf3\xc4\xf3\xc5\xf3\xc6\xf3\xc7\xf3\xc8\xf3\xc9\xf3\xca\xf3\xcb\xf3\xcc\xf3\xcd\xf3\xce\xf3\xcf\xf3\xd0\xf3\xd1\xf3\xd2\xf3\xd3\x00\x00\x00\x00", /* dd00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\xd4\xf3\xd5\xf3\xd6\xf3\xd7\xf3\xd8\xf3\xd9\xf3\xda\xf3\xdb\xf3\xdc\xf3\xdd\xf3\xde\xf3\xdf\xf3\xe0\xf3\xe1\xf3\xe2\xf3\xe3\xf3\xe4\xf3\xe5\xf3\xe6\xf3\xe7\xf3\xe8\xf3\xe9\xf3\xea\xf3\xeb\xf3\xec\xf3\xed\xf3\xee\xf3\xef\xf3\xf0\xf3\xf1\xf3\xf2\xf3\xf3\xf3\xf4\xf3\xf5\xf3\xf6\xf3\xf7\xf3\xf8\xf3\xf9\xf3\xfa\xf3\xfb\xf3\xfc\xf3\xfd\xf3\xfe\xf3\xff\xf4\x00\xf4\x01\xf4\x02\xf4\x03\xf4\x04\xf4\x05\xf4\x06\xf4\x07\xf4\x08\xf4\x09\xf4\x0a\xf4\x0b\xf4\x0c\xf4\x0d\xf4\x0e\xf4\x0f\xf4\x10\xf4\x11\xf4\x12", /* dd80 */ "\x00\x00\xf4\x13\xf4\x14\xf4\x15\xf4\x16\xf4\x17\xf4\x18\xf4\x19\xf4\x1a\xf4\x1b\xf4\x1c\xf4\x1d\xf4\x1e\xf4\x1f\xf4\x20\xf4\x21\xf4\x22\xf4\x23\xf4\x24\xf4\x25\xf4\x26\xf4\x27\xf4\x28\xf4\x29\xf4\x2a\xf4\x2b\xf4\x2c\xf4\x2d\xf4\x2e\xf4\x2f\xf4\x30\xf4\x31\xf4\x32\xf4\x33\xf4\x34\xf4\x35\xf4\x36\xf4\x37\xf4\x38\xf4\x39\xf4\x3a\xf4\x3b\xf4\x3c\xf4\x3d\xf4\x3e\xf4\x3f\xf4\x40\xf4\x41\xf4\x42\xf4\x43\xf4\x44\xf4\x45\xf4\x46\xf4\x47\xf4\x48\xf4\x49\xf4\x4a\xf4\x4b\xf4\x4c\xf4\x4d\xf4\x4e\xf4\x4f\xf4\x50\xf4\x51\xf4\x52\xf4\x53\xf4\x54\xf4\x55\xf4\x56\xf4\x57\xf4\x58\xf4\x59\xf4\x5a\xf4\x5b\xf4\x5c\xf4\x5d\xf4\x5e\xf4\x5f\xf4\x60\xf4\x61\xf4\x62\xf4\x63\xf4\x64\xf4\x65\xf4\x66\xf4\x67\xf4\x68\xf4\x69\xf4\x6a\xf4\x6b\xf4\x6c\xf4\x6d\xf4\x6e\xf4\x6f\xf4\x70\xf4\x71\xf4\x72\xf4\x73\xf4\x74\xf4\x75\xf4\x76\xf4\x77\xf4\x78\xf4\x79\xf4\x7a\xf4\x7b\xf4\x7c\xf4\x7d\xf4\x7e\xf4\x7f\xf4\x80\xf4\x81\xf4\x82\xf4\x83\xf4\x84\xf4\x85\xf4\x86\xf4\x87\xf4\x88\xf4\x89\xf4\x8a\xf4\x8b\xf4\x8c\xf4\x8d\xf4\x8e\xf4\x8f\x00\x00\x00\x00", /* de00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x90\xf4\x91\xf4\x92\xf4\x93\xf4\x94\xf4\x95\xf4\x96\xf4\x97\xf4\x98\xf4\x99\xf4\x9a\xf4\x9b\xf4\x9c\xf4\x9d\xf4\x9e\xf4\x9f\xf4\xa0\xf4\xa1\xf4\xa2\xf4\xa3\xf4\xa4\xf4\xa5\xf4\xa6\xf4\xa7\xf4\xa8\xf4\xa9\xf4\xaa\xf4\xab\xf4\xac\xf4\xad\xf4\xae\xf4\xaf\xf4\xb0\xf4\xb1\xf4\xb2\xf4\xb3\xf4\xb4\xf4\xb5\xf4\xb6\xf4\xb7\xf4\xb8\xf4\xb9\xf4\xba\xf4\xbb\xf4\xbc\xf4\xbd\xf4\xbe\xf4\xbf\xf4\xc0\xf4\xc1\xf4\xc2\xf4\xc3\xf4\xc4\xf4\xc5\xf4\xc6\xf4\xc7\xf4\xc8\xf4\xc9\xf4\xca\xf4\xcb\xf4\xcc\xf4\xcd\xf4\xce", /* de80 */ "\x00\x00\xf4\xcf\xf4\xd0\xf4\xd1\xf4\xd2\xf4\xd3\xf4\xd4\xf4\xd5\xf4\xd6\xf4\xd7\xf4\xd8\xf4\xd9\xf4\xda\xf4\xdb\xf4\xdc\xf4\xdd\xf4\xde\xf4\xdf\xf4\xe0\xf4\xe1\xf4\xe2\xf4\xe3\xf4\xe4\xf4\xe5\xf4\xe6\xf4\xe7\xf4\xe8\xf4\xe9\xf4\xea\xf4\xeb\xf4\xec\xf4\xed\xf4\xee\xf4\xef\xf4\xf0\xf4\xf1\xf4\xf2\xf4\xf3\xf4\xf4\xf4\xf5\xf4\xf6\xf4\xf7\xf4\xf8\xf4\xf9\xf4\xfa\xf4\xfb\xf4\xfc\xf4\xfd\xf4\xfe\xf4\xff\xf5\x00\xf5\x01\xf5\x02\xf5\x03\xf5\x04\xf5\x05\xf5\x06\xf5\x07\xf5\x08\xf5\x09\xf5\x0a\xf5\x0b\xf5\x0c\xf5\x0d\xf5\x0e\xf5\x0f\xf5\x10\xf5\x11\xf5\x12\xf5\x13\xf5\x14\xf5\x15\xf5\x16\xf5\x17\xf5\x18\xf5\x19\xf5\x1a\xf5\x1b\xf5\x1c\xf5\x1d\xf5\x1e\xf5\x1f\xf5\x20\xf5\x21\xf5\x22\xf5\x23\xf5\x24\xf5\x25\xf5\x26\xf5\x27\xf5\x28\xf5\x29\xf5\x2a\xf5\x2b\xf5\x2c\xf5\x2d\xf5\x2e\xf5\x2f\xf5\x30\xf5\x31\xf5\x32\xf5\x33\xf5\x34\xf5\x35\xf5\x36\xf5\x37\xf5\x38\xf5\x39\xf5\x3a\xf5\x3b\xf5\x3c\xf5\x3d\xf5\x3e\xf5\x3f\xf5\x40\xf5\x41\xf5\x42\xf5\x43\xf5\x44\xf5\x45\xf5\x46\xf5\x47\xf5\x48\xf5\x49\xf5\x4a\xf5\x4b\x00\x00\x00\x00", /* df00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x4c\xf5\x4d\xf5\x4e\xf5\x4f\xf5\x50\xf5\x51\xf5\x52\xf5\x53\xf5\x54\xf5\x55\xf5\x56\xf5\x57\xf5\x58\xf5\x59\xf5\x5a\xf5\x5b\xf5\x5c\xf5\x5d\xf5\x5e\xf5\x5f\xf5\x60\xf5\x61\xf5\x62\xf5\x63\xf5\x64\xf5\x65\xf5\x66\xf5\x67\xf5\x68\xf5\x69\xf5\x6a\xf5\x6b\xf5\x6c\xf5\x6d\xf5\x6e\xf5\x6f\xf5\x70\xf5\x71\xf5\x72\xf5\x73\xf5\x74\xf5\x75\xf5\x76\xf5\x77\xf5\x78\xf5\x79\xf5\x7a\xf5\x7b\xf5\x7c\xf5\x7d\xf5\x7e\xf5\x7f\xf5\x80\xf5\x81\xf5\x82\xf5\x83\xf5\x84\xf5\x85\xf5\x86\xf5\x87\xf5\x88\xf5\x89\xf5\x8a", /* df80 */ "\x00\x00\xf5\x8b\xf5\x8c\xf5\x8d\xf5\x8e\xf5\x8f\xf5\x90\xf5\x91\xf5\x92\xf5\x93\xf5\x94\xf5\x95\xf5\x96\xf5\x97\xf5\x98\xf5\x99\xf5\x9a\xf5\x9b\xf5\x9c\xf5\x9d\xf5\x9e\xf5\x9f\xf5\xa0\xf5\xa1\xf5\xa2\xf5\xa3\xf5\xa4\xf5\xa5\xf5\xa6\xf5\xa7\xf5\xa8\xf5\xa9\xf5\xaa\xf5\xab\xf5\xac\xf5\xad\xf5\xae\xf5\xaf\xf5\xb0\xf5\xb1\xf5\xb2\xf5\xb3\xf5\xb4\xf5\xb5\xf5\xb6\xf5\xb7\xf5\xb8\xf5\xb9\xf5\xba\xf5\xbb\xf5\xbc\xf5\xbd\xf5\xbe\xf5\xbf\xf5\xc0\xf5\xc1\xf5\xc2\xf5\xc3\xf5\xc4\xf5\xc5\xf5\xc6\xf5\xc7\xf5\xc8\xf5\xc9\xf5\xca\xf5\xcb\xf5\xcc\xf5\xcd\xf5\xce\xf5\xcf\xf5\xd0\xf5\xd1\xf5\xd2\xf5\xd3\xf5\xd4\xf5\xd5\xf5\xd6\xf5\xd7\xf5\xd8\xf5\xd9\xf5\xda\xf5\xdb\xf5\xdc\xf5\xdd\xf5\xde\xf5\xdf\xf5\xe0\xf5\xe1\xf5\xe2\xf5\xe3\xf5\xe4\xf5\xe5\xf5\xe6\xf5\xe7\xf5\xe8\xf5\xe9\xf5\xea\xf5\xeb\xf5\xec\xf5\xed\xf5\xee\xf5\xef\xf5\xf0\xf5\xf1\xf5\xf2\xf5\xf3\xf5\xf4\xf5\xf5\xf5\xf6\xf5\xf7\xf5\xf8\xf5\xf9\xf5\xfa\xf5\xfb\xf5\xfc\xf5\xfd\xf5\xfe\xf5\xff\xf6\x00\xf6\x01\xf6\x02\xf6\x03\xf6\x04\xf6\x05\xf6\x06\xf6\x07\x00\x00\x00\x00", /* e000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x08\xf6\x09\xf6\x0a\xf6\x0b\xf6\x0c\xf6\x0d\xf6\x0e\xf6\x0f\xf6\x10\xf6\x11\xf6\x12\xf6\x13\xf6\x14\xf6\x15\xf6\x16\xf6\x17\xf6\x18\xf6\x19\xf6\x1a\xf6\x1b\xf6\x1c\xf6\x1d\xf6\x1e\xf6\x1f\xf6\x20\xf6\x21\xf6\x22\xf6\x23\xf6\x24\xf6\x25\xf6\x26\xf6\x27\xf6\x28\xf6\x29\xf6\x2a\xf6\x2b\xf6\x2c\xf6\x2d\xf6\x2e\xf6\x2f\xf6\x30\xf6\x31\xf6\x32\xf6\x33\xf6\x34\xf6\x35\xf6\x36\xf6\x37\xf6\x38\xf6\x39\xf6\x3a\xf6\x3b\xf6\x3c\xf6\x3d\xf6\x3e\xf6\x3f\xf6\x40\xf6\x41\xf6\x42\xf6\x43\xf6\x44\xf6\x45\xf6\x46", /* e080 */ "\x00\x00\xf6\x47\xf6\x48\xf6\x49\xf6\x4a\xf6\x4b\xf6\x4c\xf6\x4d\xf6\x4e\xf6\x4f\xf6\x50\xf6\x51\xf6\x52\xf6\x53\xf6\x54\xf6\x55\xf6\x56\xf6\x57\xf6\x58\xf6\x59\xf6\x5a\xf6\x5b\xf6\x5c\xf6\x5d\xf6\x5e\xf6\x5f\xf6\x60\xf6\x61\xf6\x62\xf6\x63\xf6\x64\xf6\x65\xf6\x66\xf6\x67\xf6\x68\xf6\x69\xf6\x6a\xf6\x6b\xf6\x6c\xf6\x6d\xf6\x6e\xf6\x6f\xf6\x70\xf6\x71\xf6\x72\xf6\x73\xf6\x74\xf6\x75\xf6\x76\xf6\x77\xf6\x78\xf6\x79\xf6\x7a\xf6\x7b\xf6\x7c\xf6\x7d\xf6\x7e\xf6\x7f\xf6\x80\xf6\x81\xf6\x82\xf6\x83\xf6\x84\xf6\x85\xf6\x86\xf6\x87\xf6\x88\xf6\x89\xf6\x8a\xf6\x8b\xf6\x8c\xf6\x8d\xf6\x8e\xf6\x8f\xf6\x90\xf6\x91\xf6\x92\xf6\x93\xf6\x94\xf6\x95\xf6\x96\xf6\x97\xf6\x98\xf6\x99\xf6\x9a\xf6\x9b\xf6\x9c\xf6\x9d\xf6\x9e\xf6\x9f\xf6\xa0\xf6\xa1\xf6\xa2\xf6\xa3\xf6\xa4\xf6\xa5\xf6\xa6\xf6\xa7\xf6\xa8\xf6\xa9\xf6\xaa\xf6\xab\xf6\xac\xf6\xad\xf6\xae\xf6\xaf\xf6\xb0\xf6\xb1\xf6\xb2\xf6\xb3\xf6\xb4\xf6\xb5\xf6\xb6\xf6\xb7\xf6\xb8\xf6\xb9\xf6\xba\xf6\xbb\xf6\xbc\xf6\xbd\xf6\xbe\xf6\xbf\xf6\xc0\xf6\xc1\xf6\xc2\xf6\xc3\x00\x00\x00\x00", /* e100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xc4\xf6\xc5\xf6\xc6\xf6\xc7\xf6\xc8\xf6\xc9\xf6\xca\xf6\xcb\xf6\xcc\xf6\xcd\xf6\xce\xf6\xcf\xf6\xd0\xf6\xd1\xf6\xd2\xf6\xd3\xf6\xd4\xf6\xd5\xf6\xd6\xf6\xd7\xf6\xd8\xf6\xd9\xf6\xda\xf6\xdb\xf6\xdc\xf6\xdd\xf6\xde\xf6\xdf\xf6\xe0\xf6\xe1\xf6\xe2\xf6\xe3\xf6\xe4\xf6\xe5\xf6\xe6\xf6\xe7\xf6\xe8\xf6\xe9\xf6\xea\xf6\xeb\xf6\xec\xf6\xed\xf6\xee\xf6\xef\xf6\xf0\xf6\xf1\xf6\xf2\xf6\xf3\xf6\xf4\xf6\xf5\xf6\xf6\xf6\xf7\xf6\xf8\xf6\xf9\xf6\xfa\xf6\xfb\xf6\xfc\xf6\xfd\xf6\xfe\xf6\xff\xf7\x00\xf7\x01\xf7\x02", /* e180 */ "\x00\x00\xf7\x03\xf7\x04\xf7\x05\xf7\x06\xf7\x07\xf7\x08\xf7\x09\xf7\x0a\xf7\x0b\xf7\x0c\xf7\x0d\xf7\x0e\xf7\x0f\xf7\x10\xf7\x11\xf7\x12\xf7\x13\xf7\x14\xf7\x15\xf7\x16\xf7\x17\xf7\x18\xf7\x19\xf7\x1a\xf7\x1b\xf7\x1c\xf7\x1d\xf7\x1e\xf7\x1f\xf7\x20\xf7\x21\xf7\x22\xf7\x23\xf7\x24\xf7\x25\xf7\x26\xf7\x27\xf7\x28\xf7\x29\xf7\x2a\xf7\x2b\xf7\x2c\xf7\x2d\xf7\x2e\xf7\x2f\xf7\x30\xf7\x31\xf7\x32\xf7\x33\xf7\x34\xf7\x35\xf7\x36\xf7\x37\xf7\x38\xf7\x39\xf7\x3a\xf7\x3b\xf7\x3c\xf7\x3d\xf7\x3e\xf7\x3f\xf7\x40\xf7\x41\xf7\x42\xf7\x43\xf7\x44\xf7\x45\xf7\x46\xf7\x47\xf7\x48\xf7\x49\xf7\x4a\xf7\x4b\xf7\x4c\xf7\x4d\xf7\x4e\xf7\x4f\xf7\x50\xf7\x51\xf7\x52\xf7\x53\xf7\x54\xf7\x55\xf7\x56\xf7\x57\xf7\x58\xf7\x59\xf7\x5a\xf7\x5b\xf7\x5c\xf7\x5d\xf7\x5e\xf7\x5f\xf7\x60\xf7\x61\xf7\x62\xf7\x63\xf7\x64\xf7\x65\xf7\x66\xf7\x67\xf7\x68\xf7\x69\xf7\x6a\xf7\x6b\xf7\x6c\xf7\x6d\xf7\x6e\xf7\x6f\xf7\x70\xf7\x71\xf7\x72\xf7\x73\xf7\x74\xf7\x75\xf7\x76\xf7\x77\xf7\x78\xf7\x79\xf7\x7a\xf7\x7b\xf7\x7c\xf7\x7d\xf7\x7e\xf7\x7f\x00\x00\x00\x00", /* e200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x80\xf7\x81\xf7\x82\xf7\x83\xf7\x84\xf7\x85\xf7\x86\xf7\x87\xf7\x88\xf7\x89\xf7\x8a\xf7\x8b\xf7\x8c\xf7\x8d\xf7\x8e\xf7\x8f\xf7\x90\xf7\x91\xf7\x92\xf7\x93\xf7\x94\xf7\x95\xf7\x96\xf7\x97\xf7\x98\xf7\x99\xf7\x9a\xf7\x9b\xf7\x9c\xf7\x9d\xf7\x9e\xf7\x9f\xf7\xa0\xf7\xa1\xf7\xa2\xf7\xa3\xf7\xa4\xf7\xa5\xf7\xa6\xf7\xa7\xf7\xa8\xf7\xa9\xf7\xaa\xf7\xab\xf7\xac\xf7\xad\xf7\xae\xf7\xaf\xf7\xb0\xf7\xb1\xf7\xb2\xf7\xb3\xf7\xb4\xf7\xb5\xf7\xb6\xf7\xb7\xf7\xb8\xf7\xb9\xf7\xba\xf7\xbb\xf7\xbc\xf7\xbd\xf7\xbe", /* e280 */ "\x00\x00\xf7\xbf\xf7\xc0\xf7\xc1\xf7\xc2\xf7\xc3\xf7\xc4\xf7\xc5\xf7\xc6\xf7\xc7\xf7\xc8\xf7\xc9\xf7\xca\xf7\xcb\xf7\xcc\xf7\xcd\xf7\xce\xf7\xcf\xf7\xd0\xf7\xd1\xf7\xd2\xf7\xd3\xf7\xd4\xf7\xd5\xf7\xd6\xf7\xd7\xf7\xd8\xf7\xd9\xf7\xda\xf7\xdb\xf7\xdc\xf7\xdd\xf7\xde\xf7\xdf\xf7\xe0\xf7\xe1\xf7\xe2\xf7\xe3\xf7\xe4\xf7\xe5\xf7\xe6\xf7\xe7\xf7\xe8\xf7\xe9\xf7\xea\xf7\xeb\xf7\xec\xf7\xed\xf7\xee\xf7\xef\xf7\xf0\xf7\xf1\xf7\xf2\xf7\xf3\xf7\xf4\xf7\xf5\xf7\xf6\xf7\xf7\xf7\xf8\xf7\xf9\xf7\xfa\xf7\xfb\xf7\xfc\xf7\xfd\xf7\xfe\xf7\xff\xf8\x00\xf8\x01\xf8\x02\xf8\x03\xf8\x04\xf8\x05\xf8\x06\xf8\x07\xf8\x08\xf8\x09\xf8\x0a\xf8\x0b\xf8\x0c\xf8\x0d\xf8\x0e\xf8\x0f\xf8\x10\xf8\x11\xf8\x12\xf8\x13\xf8\x14\xf8\x15\xf8\x16\xf8\x17\xf8\x18\xf8\x19\xf8\x1a\xf8\x1b\xf8\x1c\xf8\x1d\xf8\x1e\xf8\x1f\xf8\x20\xf8\x21\xf8\x22\xf8\x23\xf8\x24\xf8\x25\xf8\x26\xf8\x27\xf8\x28\xf8\x29\xf8\x2a\xf8\x2b\xf8\x2c\xf8\x2d\xf8\x2e\xf8\x2f\xf8\x30\xf8\x31\xf8\x32\xf8\x33\xf8\x34\xf8\x35\xf8\x36\xf8\x37\xf8\x38\xf8\x39\xf8\x3a\xf8\x3b\x00\x00\x00\x00", /* e300 */ NULL, /* e380 */ NULL, /* e400 */ NULL, /* e480 */ NULL, /* e500 */ NULL, /* e580 */ NULL, /* e600 */ NULL, /* e680 */ NULL, /* e700 */ NULL, /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ NULL, /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ NULL, /* ff80 */ NULL } }, { "cp1388", "0x03a90345" /* 937, 837 */, /* Unicode to EBCDIC DBCS translation table for ibm-1388_P103-2001 */ { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x88\x00\x00\x00\x00\x44\x6a\x44\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xed\x44\x4b\x00\x00\x00\x00\x44\x50\x00\x00\x00\x00\x43\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x44\x46\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x48\x46\x46\x46\x5a\x00\x00\x46\x4c\x46\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x46\x50\x46\x4e\x00\x00\x00\x00\x00\x00\x44\x7b\x00\x00\x46\x54\x46\x52\x00\x00\x46\x59\x00\x00\x00\x00\x00\x00", /* 0100 */ "\x00\x00\x46\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5d\x00\x00\x00\x00\x00\x00\x46\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x46\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x43\x00\x00\x46\x4b\x00\x00\x46\x4f\x00\x00\x46\x53\x00\x00\x46\x55\x00\x00\x46\x56\x00\x00\x46\x57\x00\x00\x46\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x46\x00\x00\x45\x45\xcd\x41\xcd\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x61\x41\x62\x41\x63\x41\x64\x41\x65\x41\x66\x41\x67\x41\x68\x41\x69\x41\x6a\x41\x6b\x41\x6c\x41\x6d\x41\x6e\x41\x6f\x41\x70\x41\x71\x00\x00\x41\x72\x41\x73\x41\x74\x41\x75\x41\x76\x41\x77\x41\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x41\x41\x42\x41\x43\x41\x44\x41\x45\x41\x46\x41\x47\x41\x48\x41\x49\x41\x4a\x41\x4b\x41\x4c\x41\x4d\x41\x4e\x41\x4f\x41\x50\x41\x51\x00\x00\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x41\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\x41\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xc0\x41\xc1\x41\xc2\x41\xc3\x41\xc4\x41\xc5\x41\xc7\x41\xc8\x41\xc9\x41\xca\x41\xcb\x41\xcc\x41\xcd\x41\xce\x41\xcf\x41\xd0\x41\xd1\x41\xd2\x41\xd3\x41\xd4\x41\xd5\x41\xd6\x41\xd7\x41\xd8\x41\xd9\x41\xda\x41\xdb\x41\xdc\x41\xdd\x41\xde\x41\xdf\x41\xe0\x41\x80\x41\x81\x41\x82\x41\x83\x41\x84\x41\x85\x41\x87\x41\x88\x41\x89\x41\x8a\x41\x8b\x41\x8c\x41\x8d\x41\x8e\x41\x8f\x41\x90\x41\x91\x41\x92\x41\x93\x41\x94\x41\x95\x41\x96\x41\x97\x41\x98\x41\x99\x41\x9a\x41\x9b\x41\x9c\x41\x9d\x41\x9e\x41\x9f\x41\xa0\x00\x00\x41\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ "\x47\x5d\x47\x5e\x47\x5f\x47\x60\x47\x61\x47\x62\x47\x63\x47\x64\x47\x65\x47\x66\x47\x67\x47\x68\x47\x69\x47\x6a\x47\x6b\x47\x6c\x47\x6d\x47\x6e\x47\x6f\x47\x70\x47\x71\x47\x72\x47\x73\x47\x74\x47\x75\x47\x76\x47\x77\x47\x78\x47\x79\x47\x7a\x47\x7b\x47\x7c\x47\x7d\x47\x7e\x47\x7f\x47\x80\x47\x81\x47\x82\x47\x83\x47\x84\x47\x85\x47\x86\x47\x87\x47\x88\x47\x89\x47\x8a\x47\x8b\x47\x8c\x47\x8d\x47\x8e\x47\x8f\x47\x90\x47\x91\x47\x92\x47\x93\x47\x94\x47\x95\x47\x96\x47\x97\x47\x98\x47\x99\x47\x9a\x47\x9b\x47\x9c\x47\x9d\x47\x9e\x47\x9f\x47\xa0\x47\xa1\x47\xa2\x47\xa3\x47\xa4\x47\xa5\x47\xa6\x47\xa7\x47\xa8\x47\xa9\x47\xaa\x47\xab\x47\xac\x47\xad\x47\xae\x47\xaf\x47\xb0\x47\xb1\x47\xb2\x47\xb3\x47\xb4\x47\xb5\x47\xb6\x47\xb7\x47\xb8\x47\xb9\x47\xba\x47\xbb\x47\xbc\x47\xbd\x47\xbe\x47\xbf\x47\xc0\x47\xc1\x47\xc2\x47\xc3\x47\xc4\x47\xc5\x47\xc6\x47\xc7\x47\xc8\x47\xc9\x47\xca\x47\xcb\x47\xcc\x47\xcd\x47\xce\x47\xcf\x47\xd0\x47\xd1\x47\xd2\x47\xd3\x47\xd4\x47\xd5\x47\xd6\x47\xd7\x47\xd8\x47\xd9\x47\xda\x47\xdb\x47\xdc", /* 0680 */ "\x47\xdd\x47\xde\x47\xdf\x47\xe0\x47\xe1\x47\xe2\x47\xe3\x47\xe4\x47\xe5\x47\xe6\x47\xe7\x47\xe8\x47\xe9\x47\xea\x47\xeb\x47\xec\x47\xed\x47\xee\x47\xef\x47\xf0\x47\xf1\x47\xf2\x47\xf3\x47\xf4\x47\xf5\x47\xf6\x47\xf7\x47\xf8\x47\xf9\x47\xfa\x47\xfb\x47\xfc\x47\xfd\x47\xfe\x48\x41\x48\x42\x48\x43\x48\x44\x48\x45\x48\x46\x48\x47\x48\x48\x48\x49\x48\x4a\x48\x4b\x48\x4c\x48\x4d\x48\x4e\x48\x4f\x48\x50\x48\x51\x48\x52\x48\x53\x48\x54\x48\x55\x48\x56\x48\x57\x48\x58\x48\x59\x48\x5a\x48\x5b\x48\x5c\x48\x5d\x48\x5e\x48\x5f\x48\x60\x48\x61\x48\x62\x48\x63\x48\x64\x48\x65\x48\x66\x48\x67\x48\x68\x48\x69\x48\x6a\x48\x6b\x48\x6c\x48\x6d\x48\x6e\x48\x6f\x48\x70\x48\x71\x48\x72\x48\x73\x48\x74\x48\x75\x48\x76\x48\x77\x48\x78\x48\x79\x48\x7a\x48\x7b\x48\x7c\x48\x7d\x48\x7e\x48\x7f\x48\x80\x48\x81\x48\x82\x48\x83\x48\x84\x48\x85\x48\x86\x48\x87\x48\x88\x48\x89\x48\x8a\x48\x8b\x48\x8c\x48\x8d\x48\x8e\x48\x8f\x48\x90\x48\x91\x48\x92\x48\x93\x48\x94\x48\x95\x48\x96\x48\x97\x48\x98\x48\x99\x48\x9a\x48\x9b\x48\x9c\x48\x9d\x48\x9e", /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ "\x6d\x41\x6d\x42\x6d\x43\x6d\x44\x6d\x45\x6d\x46\x6d\x47\x6d\x48\x6d\x49\x6d\x4a\x6d\x4b\x6d\x4c\x6d\x4d\x6d\x4e\x6d\x4f\x6d\x50\x6d\x51\x6d\x52\x6d\x53\x6d\x54\x6d\x55\x6d\x56\x6d\x57\x6d\x58\x6d\x59\x6d\x5a\x6d\x5b\x6d\x5c\x6d\x5d\x6d\x5e\x6d\x5f\x6d\x60\x6d\x61\x6d\x62\x6d\x63\x6d\x64\x6d\x65\x6d\x66\x6d\x67\x6d\x68\x6d\x69\x6d\x6a\x6d\x6b\x6d\x6c\x6d\x6d\x6d\x6e\x6d\x6f\x6d\x70\x6d\x71\x6d\x72\x6d\x73\x6d\x74\x6d\x75\x6d\x76\x6d\x77\x6d\x78\x6d\x79\x6d\x7a\x6d\x7b\x6d\x7c\x6d\x7d\x6d\x7e\x6d\x7f\x6d\x80\x6d\x81\x6d\x82\x6d\x83\x6d\x84\x6d\x85\x6d\x86\x6d\x87\x6d\x88\x6d\x89\x6d\x8a\x6d\x8b\x6d\x8c\x6d\x8d\x6d\x8e\x6d\x8f\x6d\x90\x6d\x91\x6d\x92\x6d\x93\x6d\x94\x6d\x95\x6d\x96\x6d\x97\x6d\x98\x6d\x99\x6d\x9a\x6d\x9b\x6d\x9c\x6d\x9d\x6d\x9e\x6d\x9f\x6d\xa0\x6d\xa1\x6d\xa2\x6d\xa3\x6d\xa4\x6d\xa5\x6d\xa6\x6d\xa7\x6d\xa8\x6d\xa9\x6d\xaa\x6d\xab\x6d\xac\x6d\xad\x6d\xae\x6d\xaf\x6d\xb0\x6d\xb1\x6d\xb2\x6d\xb3\x6d\xb4\x6d\xb5\x6d\xb6\x6d\xb7\x6d\xb8\x6d\xb9\x6d\xba\x6d\xbb\x6d\xbc\x6d\xbd\x6d\xbe\x6d\xbf\x6d\xc0", /* 0f80 */ "\x6d\xc1\x6d\xc2\x6d\xc3\x6d\xc4\x6d\xc5\x6d\xc6\x6d\xc7\x6d\xc8\x6d\xc9\x6d\xca\x6d\xcb\x6d\xcc\x6d\xcd\x6d\xce\x6d\xcf\x6d\xd0\x6d\xd1\x6d\xd2\x6d\xd3\x6d\xd4\x6d\xd5\x6d\xd6\x6d\xd7\x6d\xd8\x6d\xd9\x6d\xda\x6d\xdb\x6d\xdc\x6d\xdd\x6d\xde\x6d\xdf\x6d\xe0\x6d\xe1\x6d\xe2\x6d\xe3\x6d\xe4\x6d\xe5\x6d\xe6\x6d\xe7\x6d\xe8\x6d\xe9\x6d\xea\x6d\xeb\x6d\xec\x6d\xed\x6d\xee\x6d\xef\x6d\xf0\x6d\xf1\x6d\xf2\x6d\xf3\x6d\xf4\x6d\xf5\x6d\xf6\x6d\xf7\x6d\xf8\x6d\xf9\x6d\xfa\x6d\xfb\x6d\xfc\x6d\xfd\x6d\xfe\x6e\x41\x6e\x42\x6e\x43\x6e\x44\x6e\x45\x6e\x46\x6e\x47\x6e\x48\x6e\x49\x6e\x4a\x6e\x4b\x6e\x4c\x6e\x4d\x6e\x4e\x6e\x4f\x6e\x50\x6e\x51\x6e\x52\x6e\x53\x6e\x54\x6e\x55\x6e\x56\x6e\x57\x6e\x58\x6e\x59\x6e\x5a\x6e\x5b\x6e\x5c\x6e\x5d\x6e\x5e\x6e\x5f\x6e\x60\x6e\x61\x6e\x62\x6e\x63\x6e\x64\x6e\x65\x6e\x66\x6e\x67\x6e\x68\x6e\x69\x6e\x6a\x6e\x6b\x6e\x6c\x6e\x6d\x6e\x6e\x6e\x6f\x6e\x70\x6e\x71\x6e\x72\x6e\x73\x6e\x74\x6e\x75\x6e\x76\x6e\x77\x6e\x78\x6e\x79\x6e\x7a\x6e\x7b\x6e\x7c\x6e\x7d\x6e\x7e\x6e\x7f\x6e\x80\x6e\x81\x6e\x82", /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ "\x6e\x83\x6e\x84\x6e\x85\x6e\x86\x6e\x87\x6e\x88\x6e\x89\x6e\x8a\x6e\x8b\x6e\x8c\x6e\x8d\x6e\x8e\x6e\x8f\x6e\x90\x6e\x91\x6e\x92\x6e\x93\x6e\x94\x6e\x95\x6e\x96\x6e\x97\x6e\x98\x6e\x99\x6e\x9a\x6e\x9b\x6e\x9c\x6e\x9d\x6e\x9e\x6e\x9f\x6e\xa0\x6e\xa1\x6e\xa2\x6e\xa3\x6e\xa4\x6e\xa5\x6e\xa6\x6e\xa7\x6e\xa8\x6e\xa9\x6e\xaa\x6e\xab\x6e\xac\x6e\xad\x6e\xae\x6e\xaf\x6e\xb0\x6e\xb1\x6e\xb2\x6e\xb3\x6e\xb4\x6e\xb5\x6e\xb6\x6e\xb7\x6e\xb8\x6e\xb9\x6e\xba\x6e\xbb\x6e\xbc\x6e\xbd\x6e\xbe\x6e\xbf\x6e\xc0\x6e\xc1\x6e\xc2\x6e\xc3\x6e\xc4\x6e\xc5\x6e\xc6\x6e\xc7\x6e\xc8\x6e\xc9\x6e\xca\x6e\xcb\x6e\xcc\x6e\xcd\x6e\xce\x6e\xcf\x6e\xd0\x6e\xd1\x6e\xd2\x6e\xd3\x6e\xd4\x6e\xd5\x6e\xd6\x6e\xd7\x6e\xd8\x6e\xd9\x6e\xda\x6e\xdb\x6e\xdc\x6e\xdd\x6e\xde\x6e\xdf\x6e\xe0\x6e\xe1\x6e\xe2\x6e\xe3\x6e\xe4\x6e\xe5\x6e\xe6\x6e\xe7\x6e\xe8\x6e\xe9\x6e\xea\x6e\xeb\x6e\xec\x6e\xed\x6e\xee\x6e\xef\x6e\xf0\x6e\xf1\x6e\xf2\x6e\xf3\x6e\xf4\x6e\xf5\x6e\xf6\x6e\xf7\x6e\xf8\x6e\xf9\x6e\xfa\x6e\xfb\x6e\xfc\x6e\xfd\x6e\xfe\x6f\x41\x6f\x42\x6f\x43\x6f\x44", /* 1880 */ "\x6f\x45\x6f\x46\x6f\x47\x6f\x48\x6f\x49\x6f\x4a\x6f\x4b\x6f\x4c\x6f\x4d\x6f\x4e\x6f\x4f\x6f\x50\x6f\x51\x6f\x52\x6f\x53\x6f\x54\x6f\x55\x6f\x56\x6f\x57\x6f\x58\x6f\x59\x6f\x5a\x6f\x5b\x6f\x5c\x6f\x5d\x6f\x5e\x6f\x5f\x6f\x60\x6f\x61\x6f\x62\x6f\x63\x6f\x64\x6f\x65\x6f\x66\x6f\x67\x6f\x68\x6f\x69\x6f\x6a\x6f\x6b\x6f\x6c\x6f\x6d\x6f\x6e\x6f\x6f\x6f\x70\x6f\x71\x6f\x72\x6f\x73\x6f\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x5a\x00\x00\x00\x00\xcd\x44\xcd\x45\x44\x4a\x44\x7c\x00\x00\x44\x61\x44\x71\x00\x00\x00\x00\x44\x62\x44\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7e\x44\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x8b\x00\x00\x44\xee\x44\xef\x00\x00\xcd\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2100 */ "\x00\x00\x00\x00\x00\x00\x44\x4e\x00\x00\xcd\x47\x00\x00\x00\x00\x00\x00\xcd\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\xf1\x41\xf2\x41\xf3\x41\xf4\x41\xf5\x41\xf6\x41\xf7\x41\xf8\x41\xf9\x41\xfa\x41\xfb\x41\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x41\xb1\x41\xb2\x41\xb3\x41\xb4\x41\xb5\x41\xb6\x41\xb7\x41\xb8\x41\xb9\x41\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xf1\x44\xf2\x44\xf0\x44\xf3\x00\x00\x00\x00\xcd\x49\xcd\x4a\xcd\x4b\xcd\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x66\x00\x00\x45\x65\x00\x00\x00\x00\x00\x00\xcd\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6b\x00\x00\x00\x00\x45\x77\x44\x4d\xcd\x4e\x45\x6e\x00\x00\x00\x00\xcd\x4f\x00\x00\x45\x6d\x00\x00\x45\x63\x45\x64\x45\x68\x45\x67\x45\x71\x00\x00\x00\x00\x45\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x68\x44\x78\x45\x62\x45\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x75\x00\x00\x00\x00\x00\x00\x45\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x4c\x45\x73\x00\x00\x00\x00\x44\x67\x44\x77\xcd\x51\xcd\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x79\x45\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x90\x00\x00\x00\x00\x00\x00\x45\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xe1\x45\xe2\x45\xe3\x45\xe4\x45\xe5\x45\xe6\x45\xe7\x45\xe8\x45\xe9\x45\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xc5\x45\xc6\x45\xc7\x45\xc8\x45\xc9\x45\xca\x45\xcb\x45\xcc\x45\xcd\x45\xce\x45\xcf\x45\xd0", /* 2480 */ "\x45\xd1\x45\xd2\x45\xd3\x45\xd4\x45\xd5\x45\xd6\x45\xd7\x45\xd8\x45\xb1\x45\xb2\x45\xb3\x45\xb4\x45\xb5\x45\xb6\x45\xb7\x45\xb8\x45\xb9\x45\xba\x45\xbb\x45\xbc\x45\xbd\x45\xbe\x45\xbf\x45\xc0\x45\xc1\x45\xc2\x45\xc3\x45\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2500 */ "\x46\xa4\x46\xa5\x46\xa6\x46\xa7\x46\xa8\x46\xa9\x46\xaa\x46\xab\x46\xac\x46\xad\x46\xae\x46\xaf\x46\xb0\x46\xb1\x46\xb2\x46\xb3\x46\xb4\x46\xb5\x46\xb6\x46\xb7\x46\xb8\x46\xb9\x46\xba\x46\xbb\x46\xbc\x46\xbd\x46\xbe\x46\xbf\x46\xc0\x46\xc1\x46\xc2\x46\xc3\x46\xc4\x46\xc5\x46\xc6\x46\xc7\x46\xc8\x46\xc9\x46\xca\x46\xcb\x46\xcc\x46\xcd\x46\xce\x46\xcf\x46\xd0\x46\xd1\x46\xd2\x46\xd3\x46\xd4\x46\xd5\x46\xd6\x46\xd7\x46\xd8\x46\xd9\x46\xda\x46\xdb\x46\xdc\x46\xdd\x46\xde\x46\xdf\x46\xe0\x46\xe1\x46\xe2\x46\xe3\x46\xe4\x46\xe5\x46\xe6\x46\xe7\x46\xe8\x46\xe9\x46\xea\x46\xeb\x46\xec\x46\xed\x46\xee\x46\xef\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x54\xcd\x55\xcd\x56\xcd\x57\xcd\x58\xcd\x59\xcd\x5a\xcd\x5b\xcd\x5c\xcd\x5d\xcd\x5e\xcd\x5f\xcd\x60\xcd\x61\xcd\x62\xcd\x63\xcd\x64\xcd\x65\xcd\x66\xcd\x67\xcd\x68\xcd\x69\xcd\x6a\xcd\x6b\xcd\x6c\xcd\x6d\xcd\x6e\xcd\x6f\xcd\x70\xcd\x71\xcd\x72\xcd\x73\xcd\x74\xcd\x75\xcd\x76\xcd\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\xcd\x78\xcd\x79\xcd\x7a\xcd\x7b\xcd\x7c\xcd\x7d\xcd\x7e\xcd\x7f\xcd\x81\xcd\x82\xcd\x83\xcd\x84\xcd\x85\xcd\x86\xcd\x87\x00\x00\x00\x00\x00\x00\xcd\x88\xcd\x89\xcd\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xea\x44\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe3\x44\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xec\x44\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe8\x44\xe7\x00\x00\x00\x00\x00\x00\x44\xe0\x00\x00\x00\x00\x44\xe4\x44\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x8b\xcd\x8c\xcd\x8d\xcd\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xe6\x44\xe5\x00\x00\x00\x00\xcd\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x79\x00\x00\x44\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ "\x00\x00\xce\x56\x00\x00\x00\x00\xce\x5a\x00\x00\x00\x00\x00\x00\xce\x5d\x00\x00\x00\x00\xce\x5e\xce\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x71\x00\x00\x00\x00\xce\x74\x00\x00\x00\x00\x00\x00\xce\x77\x00\x00\x00\x00\x00\x00\x00\x00\xce\x79\x00\x00\x00\x00\xce\x7a\xce\x7b\x00\x00\x00\x00\x00\x00\xce\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2f00 */ NULL, /* 2f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xca\xcd\xcb\xcd\xcc\xcd\xcd\xcd\xce\xcd\xcf\xcd\xd0\xcd\xd1\xcd\xd2\xcd\xd3\xcd\xd4\xcd\xd5\x00\x00\x00\x00\x00\x00\x00\x00", /* 3000 */ "\x40\x40\x43\x44\x43\x41\x44\x5b\x00\x00\x44\x5d\x44\x5e\x44\x5f\x44\x64\x44\x74\x44\x65\x44\x75\x43\x42\x43\x43\x44\x42\x44\x43\x44\x66\x44\x76\x44\x6c\x44\x7d\x44\x63\x44\x73\x45\x5b\x45\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x91\xcd\x92\x00\x00\x00\x00\xcd\x93\xcd\x94\xcd\x95\xcd\x96\xcd\x97\xcd\x98\xcd\x99\xcd\x9a\xcd\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xc9\x00\x00\x00\x00\x44\x47\x44\x81\x44\x48\x44\x82\x44\x49\x44\x83\x44\x51\x44\x84\x44\x52\x44\x85\x44\x86\x44\xc0\x44\x87\x44\xc1\x44\x88\x44\xc2\x44\x89\x44\xc3\x44\x8a\x44\xc4\x44\x8c\x44\xc5\x44\x8d\x44\xc6\x44\x8e\x44\xc7\x44\x8f\x44\xc8\x44\x90\x44\xc9\x44\x91\x44\xca\x44\x92\x44\xcb\x44\x56\x44\x93\x44\xcc\x44\x94\x44\xcd\x44\x95\x44\xce\x44\x96\x44\x97\x44\x98\x44\x99\x44\x9a\x44\x9d\x44\xcf\x44\xd5\x44\x9e\x44\xd0\x44\xd6\x44\x9f\x44\xd1\x44\xd7\x44\xa2\x44\xd2\x44\xd8\x44\xa3\x44\xd3\x44\xd9\x44\xa4\x44\xa5", /* 3080 */ "\x44\xa6\x44\xa7\x44\xa8\x44\x53\x44\xa9\x44\x54\x44\xaa\x44\x55\x44\xac\x44\xad\x44\xae\x44\xaf\x44\xba\x44\xbb\x44\x57\x44\xbc\x44\xda\x44\xdb\x44\x46\x44\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xbe\x43\xbf\x44\xdc\x44\xdd\x00\x00\x00\x00\x43\x47\x43\x81\x43\x48\x43\x82\x43\x49\x43\x83\x43\x51\x43\x84\x43\x52\x43\x85\x43\x86\x43\xc0\x43\x87\x43\xc1\x43\x88\x43\xc2\x43\x89\x43\xc3\x43\x8a\x43\xc4\x43\x8c\x43\xc5\x43\x8d\x43\xc6\x43\x8e\x43\xc7\x43\x8f\x43\xc8\x43\x90\x43\xc9\x43\x91\x43\xca\x43\x92\x43\xcb\x43\x56\x43\x93\x43\xcc\x43\x94\x43\xcd\x43\x95\x43\xce\x43\x96\x43\x97\x43\x98\x43\x99\x43\x9a\x43\x9d\x43\xcf\x43\xd5\x43\x9e\x43\xd0\x43\xd6\x43\x9f\x43\xd1\x43\xd7\x43\xa2\x43\xd2\x43\xd8\x43\xa3\x43\xd3\x43\xd9\x43\xa4\x43\xa5\x43\xa6\x43\xa7\x43\xa8\x43\x53\x43\xa9\x43\x54\x43\xaa\x43\x55\x43\xac\x43\xad\x43\xae\x43\xaf\x43\xba\x43\xbb\x43\x57\x43\xbc\x43\xda\x43\xdb\x43\x46\x43\xbd\x43\xd4\x43\x59\x43\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x43\x45\x43\x58\x43\xdc\x43\xdd\x00\x00", /* 3100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x65\x46\x66\x46\x67\x46\x68\x46\x69\x46\x6a\x46\x6b\x46\x6c\x46\x6d\x46\x6e\x46\x6f\x46\x70\x46\x71\x46\x72\x46\x73\x46\x74\x46\x75\x46\x76\x46\x77\x46\x78\x46\x79\x46\x7a\x46\x7b\x46\x7c\x46\x7d\x46\x7e\x46\x7f\x46\x80\x46\x81\x46\x82\x46\x83\x46\x84\x46\x85\x46\x86\x46\x87\x46\x88\x46\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3180 */ NULL, /* 3200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xf1\x45\xf2\x45\xf3\x45\xf4\x45\xf5\x45\xf6\x45\xf7\x45\xf8\x45\xf9\x45\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3300 */ NULL, /* 3380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x9d\xcd\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x9f\xcd\xa0\xcd\xa1\x00\x00\x00\x00\xcd\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xa4\x00\x00\x00\x00\xcd\xa5\xcd\xa6\x00\x00\x00\x00\xcd\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3400 */ "\xcf\x41\xcf\x42\xcf\x43\xcf\x44\xcf\x45\xcf\x46\xcf\x47\xcf\x48\xcf\x49\xcf\x4a\xcf\x4b\xcf\x4c\xcf\x4d\xcf\x4e\xcf\x4f\xcf\x50\xcf\x51\xcf\x52\xcf\x53\xcf\x54\xcf\x55\xcf\x56\xcf\x57\xcf\x58\xcf\x59\xcf\x5a\xcf\x5b\xcf\x5c\xcf\x5d\xcf\x5e\xcf\x5f\xcf\x60\xcf\x61\xcf\x62\xcf\x63\xcf\x64\xcf\x65\xcf\x66\xcf\x67\xcf\x68\xcf\x69\xcf\x6a\xcf\x6b\xcf\x6c\xcf\x6d\xcf\x6e\xcf\x6f\xcf\x70\xcf\x71\xcf\x72\xcf\x73\xcf\x74\xcf\x75\xcf\x76\xcf\x77\xcf\x78\xcf\x79\xcf\x7a\xcf\x7b\xcf\x7c\xcf\x7d\xcf\x7e\xcf\x7f\xcf\x80\xcf\x81\xcf\x82\xcf\x83\xcf\x84\xcf\x85\xcf\x86\xcf\x87\xce\x5c\xcf\x88\xcf\x89\xcf\x8a\xcf\x8b\xcf\x8c\xcf\x8d\xcf\x8e\xcf\x8f\xcf\x90\xcf\x91\xcf\x92\xcf\x93\xcf\x94\xcf\x95\xcf\x96\xcf\x97\xcf\x98\xcf\x99\xcf\x9a\xcf\x9b\xcf\x9c\xcf\x9d\xcf\x9e\xcf\x9f\xcf\xa0\xcf\xa1\xcf\xa2\xcf\xa3\xcf\xa4\xcf\xa5\xcf\xa6\xcf\xa7\xcf\xa8\xcf\xa9\xcf\xaa\xcf\xab\xcf\xac\xcf\xad\xcf\xae\xcf\xaf\xcf\xb0\xcf\xb1\xcf\xb2\xce\x5b\xcf\xb3\xcf\xb4\xcf\xb5\xcf\xb6\xcf\xb7\xcf\xb8\xcf\xb9\xcf\xba\xcf\xbb\xcf\xbc\xcf\xbd\xcf\xbe", /* 3480 */ "\xcf\xbf\xcf\xc0\xcf\xc1\xcf\xc2\xcf\xc3\xcf\xc4\xcf\xc5\xcf\xc6\xcf\xc7\xcf\xc8\xcf\xc9\xcf\xca\xcf\xcb\xcf\xcc\xcf\xcd\xcf\xce\xcf\xcf\xcf\xd0\xcf\xd1\xcf\xd2\xcf\xd3\xcf\xd4\xcf\xd5\xcf\xd6\xcf\xd7\xcf\xd8\xcf\xd9\xcf\xda\xcf\xdb\xcf\xdc\xcf\xdd\xcf\xde\xcf\xdf\xcf\xe0\xcf\xe1\xcf\xe2\xcf\xe3\xcf\xe4\xcf\xe5\xcf\xe6\xcf\xe7\xcf\xe8\xcf\xe9\xcf\xea\xcf\xeb\xcf\xec\xcf\xed\xcf\xee\xcf\xef\xcf\xf0\xcf\xf1\xcf\xf2\xcf\xf3\xcf\xf4\xcf\xf5\xcf\xf6\xcf\xf7\xcf\xf8\xcf\xf9\xcf\xfa\xcf\xfb\xcf\xfc\xcf\xfd\xcf\xfe\xd0\x41\xd0\x42\xd0\x43\xd0\x44\xd0\x45\xd0\x46\xd0\x47\xd0\x48\xd0\x49\xd0\x4a\xd0\x4b\xd0\x4c\xd0\x4d\xd0\x4e\xd0\x4f\xd0\x50\xd0\x51\xd0\x52\xd0\x53\xd0\x54\xd0\x55\xd0\x56\xd0\x57\xd0\x58\xd0\x59\xd0\x5a\xd0\x5b\xd0\x5c\xd0\x5d\xd0\x5e\xd0\x5f\xd0\x60\xd0\x61\xd0\x62\xd0\x63\xd0\x64\xd0\x65\xd0\x66\xd0\x67\xd0\x68\xd0\x69\xd0\x6a\xd0\x6b\xd0\x6c\xd0\x6d\xd0\x6e\xd0\x6f\xd0\x70\xd0\x71\xd0\x72\xd0\x73\xd0\x74\xd0\x75\xd0\x76\xd0\x77\xd0\x78\xd0\x79\xd0\x7a\xd0\x7b\xd0\x7c\xd0\x7d\xd0\x7e\xd0\x7f\xd0\x80", /* 3500 */ "\xd0\x81\xd0\x82\xd0\x83\xd0\x84\xd0\x85\xd0\x86\xd0\x87\xd0\x88\xd0\x89\xd0\x8a\xd0\x8b\xd0\x8c\xd0\x8d\xd0\x8e\xd0\x8f\xd0\x90\xd0\x91\xd0\x92\xd0\x93\xd0\x94\xd0\x95\xd0\x96\xd0\x97\xd0\x98\xd0\x99\xd0\x9a\xd0\x9b\xd0\x9c\xd0\x9d\xd0\x9e\xd0\x9f\xd0\xa0\xd0\xa1\xd0\xa2\xd0\xa3\xd0\xa4\xd0\xa5\xd0\xa6\xd0\xa7\xd0\xa8\xd0\xa9\xd0\xaa\xd0\xab\xd0\xac\xd0\xad\xd0\xae\xd0\xaf\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4\xd0\xb5\xd0\xb6\xd0\xb7\xd0\xb8\xd0\xb9\xd0\xba\xd0\xbb\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xbf\xd0\xc0\xd0\xc1\xd0\xc2\xd0\xc3\xd0\xc4\xd0\xc5\xd0\xc6\xd0\xc7\xd0\xc8\xd0\xc9\xd0\xca\xd0\xcb\xd0\xcc\xd0\xcd\xd0\xce\xd0\xcf\xd0\xd0\xd0\xd1\xd0\xd2\xd0\xd3\xd0\xd4\xd0\xd5\xd0\xd6\xd0\xd7\xd0\xd8\xd0\xd9\xd0\xda\xd0\xdb\xd0\xdc\xd0\xdd\xd0\xde\xd0\xdf\xd0\xe0\xd0\xe1\xd0\xe2\xd0\xe3\xd0\xe4\xd0\xe5\xd0\xe6\xd0\xe7\xd0\xe8\xd0\xe9\xd0\xea\xd0\xeb\xd0\xec\xd0\xed\xd0\xee\xd0\xef\xd0\xf0\xd0\xf1\xd0\xf2\xd0\xf3\xd0\xf4\xd0\xf5\xd0\xf6\xd0\xf7\xd0\xf8\xd0\xf9\xd0\xfa\xd0\xfb\xd0\xfc\xd0\xfd\xd0\xfe\xd1\x41\xd1\x42", /* 3580 */ "\xd1\x43\xd1\x44\xd1\x45\xd1\x46\xd1\x47\xd1\x48\xd1\x49\xd1\x4a\xd1\x4b\xd1\x4c\xd1\x4d\xd1\x4e\xd1\x4f\xd1\x50\xd1\x51\xd1\x52\xd1\x53\xd1\x54\xd1\x55\xd1\x56\xd1\x57\xd1\x58\xd1\x59\xd1\x5a\xd1\x5b\xd1\x5c\xd1\x5d\xd1\x5e\xd1\x5f\xd1\x60\xce\x60\xd1\x61\xd1\x62\xd1\x63\xd1\x64\xd1\x65\xd1\x66\xd1\x67\xd1\x68\xd1\x69\xd1\x6a\xd1\x6b\xd1\x6c\xd1\x6d\xd1\x6e\xd1\x6f\xd1\x70\xd1\x71\xd1\x72\xd1\x73\xd1\x74\xd1\x75\xd1\x76\xd1\x77\xd1\x78\xd1\x79\xd1\x7a\xd1\x7b\xd1\x7c\xd1\x7d\xd1\x7e\xd1\x7f\xd1\x80\xd1\x81\xd1\x82\xd1\x83\xd1\x84\xd1\x85\xd1\x86\xd1\x87\xd1\x88\xd1\x89\xd1\x8a\xd1\x8b\xd1\x8c\xd1\x8d\xd1\x8e\xd1\x8f\xd1\x90\xd1\x91\xd1\x92\xd1\x93\xd1\x94\xd1\x95\xd1\x96\xd1\x97\xd1\x98\xd1\x99\xd1\x9a\xd1\x9b\xd1\x9c\xd1\x9d\xd1\x9e\xd1\x9f\xd1\xa0\xd1\xa1\xd1\xa2\xd1\xa3\xd1\xa4\xd1\xa5\xd1\xa6\xd1\xa7\xd1\xa8\xd1\xa9\xd1\xaa\xd1\xab\xd1\xac\xd1\xad\xd1\xae\xd1\xaf\xd1\xb0\xd1\xb1\xd1\xb2\xd1\xb3\xd1\xb4\xd1\xb5\xd1\xb6\xd1\xb7\xd1\xb8\xd1\xb9\xd1\xba\xd1\xbb\xd1\xbc\xd1\xbd\xd1\xbe\xd1\xbf\xd1\xc0\xd1\xc1", /* 3600 */ "\xd1\xc2\xd1\xc3\xd1\xc4\xd1\xc5\xd1\xc6\xd1\xc7\xd1\xc8\xd1\xc9\xd1\xca\xd1\xcb\xd1\xcc\xd1\xcd\xd1\xce\xd1\xcf\xce\x62\xd1\xd0\xd1\xd1\xd1\xd2\xd1\xd3\xd1\xd4\xd1\xd5\xd1\xd6\xd1\xd7\xd1\xd8\xd1\xd9\xd1\xda\xce\x61\xd1\xdb\xd1\xdc\xd1\xdd\xd1\xde\xd1\xdf\xd1\xe0\xd1\xe1\xd1\xe2\xd1\xe3\xd1\xe4\xd1\xe5\xd1\xe6\xd1\xe7\xd1\xe8\xd1\xe9\xd1\xea\xd1\xeb\xd1\xec\xd1\xed\xd1\xee\xd1\xef\xd1\xf0\xd1\xf1\xd1\xf2\xd1\xf3\xd1\xf4\xd1\xf5\xd1\xf6\xd1\xf7\xd1\xf8\xd1\xf9\xd1\xfa\xd1\xfb\xd1\xfc\xd1\xfd\xd1\xfe\xd2\x41\xd2\x42\xd2\x43\xd2\x44\xd2\x45\xd2\x46\xd2\x47\xd2\x48\xd2\x49\xd2\x4a\xd2\x4b\xd2\x4c\xd2\x4d\xd2\x4e\xd2\x4f\xd2\x50\xd2\x51\xd2\x52\xd2\x53\xd2\x54\xd2\x55\xd2\x56\xd2\x57\xd2\x58\xd2\x59\xd2\x5a\xd2\x5b\xd2\x5c\xd2\x5d\xd2\x5e\xd2\x5f\xd2\x60\xd2\x61\xd2\x62\xd2\x63\xd2\x64\xd2\x65\xd2\x66\xd2\x67\xd2\x68\xd2\x69\xd2\x6a\xd2\x6b\xd2\x6c\xd2\x6d\xd2\x6e\xd2\x6f\xd2\x70\xd2\x71\xd2\x72\xd2\x73\xd2\x74\xd2\x75\xd2\x76\xd2\x77\xd2\x78\xd2\x79\xd2\x7a\xd2\x7b\xd2\x7c\xd2\x7d\xd2\x7e\xd2\x7f\xd2\x80\xd2\x81", /* 3680 */ "\xd2\x82\xd2\x83\xd2\x84\xd2\x85\xd2\x86\xd2\x87\xd2\x88\xd2\x89\xd2\x8a\xd2\x8b\xd2\x8c\xd2\x8d\xd2\x8e\xd2\x8f\xd2\x90\xd2\x91\xd2\x92\xd2\x93\xd2\x94\xd2\x95\xd2\x96\xd2\x97\xd2\x98\xd2\x99\xd2\x9a\xd2\x9b\xd2\x9c\xd2\x9d\xd2\x9e\xd2\x9f\xd2\xa0\xd2\xa1\xd2\xa2\xd2\xa3\xd2\xa4\xd2\xa5\xd2\xa6\xd2\xa7\xd2\xa8\xd2\xa9\xd2\xaa\xd2\xab\xd2\xac\xd2\xad\xd2\xae\xd2\xaf\xd2\xb0\xd2\xb1\xd2\xb2\xd2\xb3\xd2\xb4\xd2\xb5\xd2\xb6\xd2\xb7\xd2\xb8\xd2\xb9\xd2\xba\xd2\xbb\xd2\xbc\xd2\xbd\xd2\xbe\xd2\xbf\xd2\xc0\xd2\xc1\xd2\xc2\xd2\xc3\xd2\xc4\xd2\xc5\xd2\xc6\xd2\xc7\xd2\xc8\xd2\xc9\xd2\xca\xd2\xcb\xd2\xcc\xd2\xcd\xd2\xce\xd2\xcf\xd2\xd0\xd2\xd1\xd2\xd2\xd2\xd3\xd2\xd4\xd2\xd5\xd2\xd6\xd2\xd7\xd2\xd8\xd2\xd9\xd2\xda\xd2\xdb\xd2\xdc\xd2\xdd\xd2\xde\xd2\xdf\xd2\xe0\xd2\xe1\xd2\xe2\xd2\xe3\xd2\xe4\xd2\xe5\xd2\xe6\xd2\xe7\xd2\xe8\xd2\xe9\xd2\xea\xd2\xeb\xd2\xec\xd2\xed\xd2\xee\xd2\xef\xd2\xf0\xd2\xf1\xd2\xf2\xd2\xf3\xd2\xf4\xd2\xf5\xd2\xf6\xd2\xf7\xd2\xf8\xd2\xf9\xd2\xfa\xd2\xfb\xd2\xfc\xd2\xfd\xd2\xfe\xd3\x41\xd3\x42\xd3\x43", /* 3700 */ "\xd3\x44\xd3\x45\xd3\x46\xd3\x47\xd3\x48\xd3\x49\xd3\x4a\xd3\x4b\xd3\x4c\xd3\x4d\xd3\x4e\xd3\x4f\xd3\x50\xd3\x51\xd3\x52\xd3\x53\xd3\x54\xd3\x55\xd3\x56\xd3\x57\xd3\x58\xd3\x59\xd3\x5a\xd3\x5b\xd3\x5c\xd3\x5d\xd3\x5e\xd3\x5f\xd3\x60\xd3\x61\xd3\x62\xd3\x63\xd3\x64\xd3\x65\xd3\x66\xd3\x67\xd3\x68\xd3\x69\xd3\x6a\xd3\x6b\xd3\x6c\xd3\x6d\xd3\x6e\xd3\x6f\xd3\x70\xd3\x71\xd3\x72\xd3\x73\xd3\x74\xd3\x75\xd3\x76\xd3\x77\xd3\x78\xd3\x79\xd3\x7a\xd3\x7b\xd3\x7c\xd3\x7d\xd3\x7e\xd3\x7f\xd3\x80\xd3\x81\xd3\x82\xd3\x83\xd3\x84\xd3\x85\xd3\x86\xd3\x87\xd3\x88\xd3\x89\xd3\x8a\xd3\x8b\xd3\x8c\xd3\x8d\xd3\x8e\xd3\x8f\xd3\x90\xd3\x91\xd3\x92\xd3\x93\xd3\x94\xd3\x95\xd3\x96\xd3\x97\xd3\x98\xd3\x99\xd3\x9a\xd3\x9b\xd3\x9c\xd3\x9d\xd3\x9e\xd3\x9f\xd3\xa0\xd3\xa1\xd3\xa2\xd3\xa3\xd3\xa4\xd3\xa5\xd3\xa6\xd3\xa7\xd3\xa8\xd3\xa9\xd3\xaa\xd3\xab\xd3\xac\xd3\xad\xd3\xae\xd3\xaf\xd3\xb0\xd3\xb1\xd3\xb2\xd3\xb3\xd3\xb4\xd3\xb5\xd3\xb6\xd3\xb7\xd3\xb8\xd3\xb9\xd3\xba\xd3\xbb\xd3\xbc\xd3\xbd\xd3\xbe\xd3\xbf\xd3\xc0\xd3\xc1\xd3\xc2\xd3\xc3", /* 3780 */ "\xd3\xc4\xd3\xc5\xd3\xc6\xd3\xc7\xd3\xc8\xd3\xc9\xd3\xca\xd3\xcb\xd3\xcc\xd3\xcd\xd3\xce\xd3\xcf\xd3\xd0\xd3\xd1\xd3\xd2\xd3\xd3\xd3\xd4\xd3\xd5\xd3\xd6\xd3\xd7\xd3\xd8\xd3\xd9\xd3\xda\xd3\xdb\xd3\xdc\xd3\xdd\xd3\xde\xd3\xdf\xd3\xe0\xd3\xe1\xd3\xe2\xd3\xe3\xd3\xe4\xd3\xe5\xd3\xe6\xd3\xe7\xd3\xe8\xd3\xe9\xd3\xea\xd3\xeb\xd3\xec\xd3\xed\xd3\xee\xd3\xef\xd3\xf0\xd3\xf1\xd3\xf2\xd3\xf3\xd3\xf4\xd3\xf5\xd3\xf6\xd3\xf7\xd3\xf8\xd3\xf9\xd3\xfa\xd3\xfb\xd3\xfc\xd3\xfd\xd3\xfe\xd4\x41\xd4\x42\xd4\x43\xd4\x44\xd4\x45\xd4\x46\xd4\x47\xd4\x48\xd4\x49\xd4\x4a\xd4\x4b\xd4\x4c\xd4\x4d\xd4\x4e\xd4\x4f\xd4\x50\xd4\x51\xd4\x52\xd4\x53\xd4\x54\xd4\x55\xd4\x56\xd4\x57\xd4\x58\xd4\x59\xd4\x5a\xd4\x5b\xd4\x5c\xd4\x5d\xd4\x5e\xd4\x5f\xd4\x60\xd4\x61\xd4\x62\xd4\x63\xd4\x64\xd4\x65\xd4\x66\xd4\x67\xd4\x68\xd4\x69\xd4\x6a\xd4\x6b\xd4\x6c\xd4\x6d\xd4\x6e\xd4\x6f\xd4\x70\xd4\x71\xd4\x72\xd4\x73\xd4\x74\xd4\x75\xd4\x76\xd4\x77\xd4\x78\xd4\x79\xd4\x7a\xd4\x7b\xd4\x7c\xd4\x7d\xd4\x7e\xd4\x7f\xd4\x80\xd4\x81\xd4\x82\xd4\x83\xd4\x84\xd4\x85", /* 3800 */ "\xd4\x86\xd4\x87\xd4\x88\xd4\x89\xd4\x8a\xd4\x8b\xd4\x8c\xd4\x8d\xd4\x8e\xd4\x8f\xd4\x90\xd4\x91\xd4\x92\xd4\x93\xd4\x94\xd4\x95\xd4\x96\xd4\x97\xd4\x98\xd4\x99\xd4\x9a\xd4\x9b\xd4\x9c\xd4\x9d\xd4\x9e\xd4\x9f\xd4\xa0\xd4\xa1\xd4\xa2\xd4\xa3\xd4\xa4\xd4\xa5\xd4\xa6\xd4\xa7\xd4\xa8\xd4\xa9\xd4\xaa\xd4\xab\xd4\xac\xd4\xad\xd4\xae\xd4\xaf\xd4\xb0\xd4\xb1\xd4\xb2\xd4\xb3\xd4\xb4\xd4\xb5\xd4\xb6\xd4\xb7\xd4\xb8\xd4\xb9\xd4\xba\xd4\xbb\xd4\xbc\xd4\xbd\xd4\xbe\xd4\xbf\xd4\xc0\xd4\xc1\xd4\xc2\xd4\xc3\xd4\xc4\xd4\xc5\xd4\xc6\xd4\xc7\xd4\xc8\xd4\xc9\xd4\xca\xd4\xcb\xd4\xcc\xd4\xcd\xd4\xce\xd4\xcf\xd4\xd0\xd4\xd1\xd4\xd2\xd4\xd3\xd4\xd4\xd4\xd5\xd4\xd6\xd4\xd7\xd4\xd8\xd4\xd9\xd4\xda\xd4\xdb\xd4\xdc\xd4\xdd\xd4\xde\xd4\xdf\xd4\xe0\xd4\xe1\xd4\xe2\xd4\xe3\xd4\xe4\xd4\xe5\xd4\xe6\xd4\xe7\xd4\xe8\xd4\xe9\xd4\xea\xd4\xeb\xd4\xec\xd4\xed\xd4\xee\xd4\xef\xd4\xf0\xd4\xf1\xd4\xf2\xd4\xf3\xd4\xf4\xd4\xf5\xd4\xf6\xd4\xf7\xd4\xf8\xd4\xf9\xd4\xfa\xd4\xfb\xd4\xfc\xd4\xfd\xd4\xfe\xd5\x41\xd5\x42\xd5\x43\xd5\x44\xd5\x45\xd5\x46\xd5\x47", /* 3880 */ "\xd5\x48\xd5\x49\xd5\x4a\xd5\x4b\xd5\x4c\xd5\x4d\xd5\x4e\xd5\x4f\xd5\x50\xd5\x51\xd5\x52\xd5\x53\xd5\x54\xd5\x55\xd5\x56\xd5\x57\xd5\x58\xd5\x59\xd5\x5a\xd5\x5b\xd5\x5c\xd5\x5d\xd5\x5e\xd5\x5f\xd5\x60\xd5\x61\xd5\x62\xd5\x63\xd5\x64\xd5\x65\xd5\x66\xd5\x67\xd5\x68\xd5\x69\xd5\x6a\xd5\x6b\xd5\x6c\xd5\x6d\xd5\x6e\xd5\x6f\xd5\x70\xd5\x71\xd5\x72\xd5\x73\xd5\x74\xd5\x75\xd5\x76\xd5\x77\xd5\x78\xd5\x79\xd5\x7a\xd5\x7b\xd5\x7c\xd5\x7d\xd5\x7e\xd5\x7f\xd5\x80\xd5\x81\xd5\x82\xd5\x83\xd5\x84\xd5\x85\xd5\x86\xd5\x87\xd5\x88\xd5\x89\xd5\x8a\xd5\x8b\xd5\x8c\xd5\x8d\xd5\x8e\xd5\x8f\xd5\x90\xd5\x91\xd5\x92\xd5\x93\xd5\x94\xd5\x95\xd5\x96\xd5\x97\xd5\x98\xd5\x99\xd5\x9a\xd5\x9b\xd5\x9c\xd5\x9d\xd5\x9e\xd5\x9f\xd5\xa0\xd5\xa1\xd5\xa2\xd5\xa3\xd5\xa4\xd5\xa5\xd5\xa6\xd5\xa7\xd5\xa8\xd5\xa9\xd5\xaa\xd5\xab\xd5\xac\xd5\xad\xd5\xae\xd5\xaf\xd5\xb0\xd5\xb1\xd5\xb2\xd5\xb3\xd5\xb4\xd5\xb5\xd5\xb6\xd5\xb7\xd5\xb8\xd5\xb9\xd5\xba\xd5\xbb\xd5\xbc\xd5\xbd\xd5\xbe\xd5\xbf\xd5\xc0\xd5\xc1\xd5\xc2\xd5\xc3\xd5\xc4\xd5\xc5\xd5\xc6\xd5\xc7", /* 3900 */ "\xd5\xc8\xd5\xc9\xd5\xca\xd5\xcb\xd5\xcc\xd5\xcd\xd5\xce\xd5\xcf\xd5\xd0\xd5\xd1\xd5\xd2\xd5\xd3\xd5\xd4\xd5\xd5\xd5\xd6\xd5\xd7\xd5\xd8\xd5\xd9\xd5\xda\xd5\xdb\xd5\xdc\xd5\xdd\xd5\xde\xd5\xdf\xce\x66\xd5\xe0\xd5\xe1\xd5\xe2\xd5\xe3\xd5\xe4\xd5\xe5\xd5\xe6\xd5\xe7\xd5\xe8\xd5\xe9\xd5\xea\xd5\xeb\xd5\xec\xd5\xed\xd5\xee\xd5\xef\xd5\xf0\xd5\xf1\xd5\xf2\xd5\xf3\xd5\xf4\xd5\xf5\xd5\xf6\xd5\xf7\xd5\xf8\xd5\xf9\xd5\xfa\xd5\xfb\xd5\xfc\xd5\xfd\xd5\xfe\xd6\x41\xd6\x42\xd6\x43\xd6\x44\xd6\x45\xd6\x46\xd6\x47\xd6\x48\xd6\x49\xd6\x4a\xd6\x4b\xd6\x4c\xd6\x4d\xd6\x4e\xd6\x4f\xd6\x50\xd6\x51\xd6\x52\xd6\x53\xd6\x54\xd6\x55\xd6\x56\xd6\x57\xd6\x58\xd6\x59\xd6\x5a\xd6\x5b\xd6\x5c\xd6\x5d\xd6\x5e\xd6\x5f\xd6\x60\xd6\x61\xd6\x62\xd6\x63\xd6\x64\xd6\x65\xd6\x66\xd6\x67\xd6\x68\xd6\x69\xd6\x6a\xd6\x6b\xd6\x6c\xd6\x6d\xd6\x6e\xd6\x6f\xd6\x70\xd6\x71\xd6\x72\xd6\x73\xd6\x74\xd6\x75\xd6\x76\xce\x65\xd6\x77\xd6\x78\xd6\x79\xd6\x7a\xd6\x7b\xd6\x7c\xd6\x7d\xd6\x7e\xd6\x7f\xd6\x80\xd6\x81\xd6\x82\xd6\x83\xd6\x84\xd6\x85\xd6\x86\xd6\x87", /* 3980 */ "\xd6\x88\xd6\x89\xd6\x8a\xd6\x8b\xd6\x8c\xd6\x8d\xd6\x8e\xd6\x8f\xd6\x90\xd6\x91\xd6\x92\xd6\x93\xd6\x94\xd6\x95\xd6\x96\xd6\x97\xd6\x98\xd6\x99\xd6\x9a\xd6\x9b\xd6\x9c\xd6\x9d\xd6\x9e\xd6\x9f\xd6\xa0\xd6\xa1\xd6\xa2\xd6\xa3\xd6\xa4\xd6\xa5\xd6\xa6\xd6\xa7\xd6\xa8\xd6\xa9\xd6\xaa\xd6\xab\xd6\xac\xd6\xad\xd6\xae\xd6\xaf\xd6\xb0\xd6\xb1\xd6\xb2\xd6\xb3\xd6\xb4\xd6\xb5\xd6\xb6\xd6\xb7\xd6\xb8\xd6\xb9\xd6\xba\xd6\xbb\xd6\xbc\xd6\xbd\xd6\xbe\xd6\xbf\xd6\xc0\xd6\xc1\xd6\xc2\xd6\xc3\xd6\xc4\xd6\xc5\xd6\xc6\xd6\xc7\xd6\xc8\xd6\xc9\xd6\xca\xd6\xcb\xd6\xcc\xd6\xcd\xd6\xce\xd6\xcf\xd6\xd0\xd6\xd1\xd6\xd2\xd6\xd3\xd6\xd4\xd6\xd5\xd6\xd6\xce\x68\xce\x6b\xd6\xd7\xd6\xd8\xd6\xd9\xd6\xda\xd6\xdb\xd6\xdc\xd6\xdd\xd6\xde\xd6\xdf\xd6\xe0\xd6\xe1\xd6\xe2\xd6\xe3\xd6\xe4\xce\x69\xd6\xe5\xd6\xe6\xd6\xe7\xd6\xe8\xd6\xe9\xd6\xea\xd6\xeb\xd6\xec\xd6\xed\xd6\xee\xd6\xef\xd6\xf0\xd6\xf1\xd6\xf2\xd6\xf3\xd6\xf4\xd6\xf5\xd6\xf6\xd6\xf7\xd6\xf8\xd6\xf9\xd6\xfa\xd6\xfb\xd6\xfc\xd6\xfd\xd6\xfe\xd7\x41\xd7\x42\xd7\x43\xd7\x44\xd7\x45\xd7\x46", /* 3a00 */ "\xd7\x47\xd7\x48\xd7\x49\xd7\x4a\xd7\x4b\xd7\x4c\xd7\x4d\xd7\x4e\xd7\x4f\xd7\x50\xd7\x51\xd7\x52\xd7\x53\xd7\x54\xd7\x55\xd7\x56\xd7\x57\xd7\x58\xd7\x59\xd7\x5a\xd7\x5b\xd7\x5c\xd7\x5d\xd7\x5e\xd7\x5f\xd7\x60\xd7\x61\xd7\x62\xd7\x63\xd7\x64\xd7\x65\xd7\x66\xd7\x67\xd7\x68\xd7\x69\xd7\x6a\xd7\x6b\xd7\x6c\xd7\x6d\xd7\x6e\xd7\x6f\xd7\x70\xd7\x71\xd7\x72\xd7\x73\xd7\x74\xd7\x75\xd7\x76\xd7\x77\xd7\x78\xd7\x79\xd7\x7a\xd7\x7b\xd7\x7c\xd7\x7d\xd7\x7e\xd7\x7f\xd7\x80\xd7\x81\xd7\x82\xd7\x83\xd7\x84\xd7\x85\xd7\x86\xd7\x87\xd7\x88\xd7\x89\xd7\x8a\xd7\x8b\xd7\x8c\xd7\x8d\xd7\x8e\xd7\x8f\xd7\x90\xd7\x91\xd7\x92\xd7\x93\xd7\x94\xd7\x95\xd7\x96\xd7\x97\xd7\x98\xd7\x99\xd7\x9a\xd7\x9b\xd7\x9c\xd7\x9d\xd7\x9e\xd7\x9f\xd7\xa0\xd7\xa1\xd7\xa2\xd7\xa3\xd7\xa4\xd7\xa5\xd7\xa6\xd7\xa7\xd7\xa8\xd7\xa9\xd7\xaa\xd7\xab\xd7\xac\xd7\xad\xd7\xae\xd7\xaf\xd7\xb0\xd7\xb1\xd7\xb2\xd7\xb3\xd7\xb4\xd7\xb5\xd7\xb6\xd7\xb7\xd7\xb8\xd7\xb9\xce\x6a\xd7\xba\xd7\xbb\xd7\xbc\xd7\xbd\xd7\xbe\xd7\xbf\xd7\xc0\xd7\xc1\xd7\xc2\xd7\xc3\xd7\xc4\xd7\xc5", /* 3a80 */ "\xd7\xc6\xd7\xc7\xd7\xc8\xd7\xc9\xd7\xca\xd7\xcb\xd7\xcc\xd7\xcd\xd7\xce\xd7\xcf\xd7\xd0\xd7\xd1\xd7\xd2\xd7\xd3\xd7\xd4\xd7\xd5\xd7\xd6\xd7\xd7\xd7\xd8\xd7\xd9\xd7\xda\xd7\xdb\xd7\xdc\xd7\xdd\xd7\xde\xd7\xdf\xd7\xe0\xd7\xe1\xd7\xe2\xd7\xe3\xd7\xe4\xd7\xe5\xd7\xe6\xd7\xe7\xd7\xe8\xd7\xe9\xd7\xea\xd7\xeb\xd7\xec\xd7\xed\xd7\xee\xd7\xef\xd7\xf0\xd7\xf1\xd7\xf2\xd7\xf3\xd7\xf4\xd7\xf5\xd7\xf6\xd7\xf7\xd7\xf8\xd7\xf9\xd7\xfa\xd7\xfb\xd7\xfc\xd7\xfd\xd7\xfe\xd8\x41\xd8\x42\xd8\x43\xd8\x44\xd8\x45\xd8\x46\xd8\x47\xd8\x48\xd8\x49\xd8\x4a\xd8\x4b\xd8\x4c\xd8\x4d\xd8\x4e\xd8\x4f\xd8\x50\xd8\x51\xd8\x52\xd8\x53\xd8\x54\xd8\x55\xd8\x56\xd8\x57\xd8\x58\xd8\x59\xd8\x5a\xd8\x5b\xd8\x5c\xd8\x5d\xd8\x5e\xd8\x5f\xd8\x60\xd8\x61\xd8\x62\xd8\x63\xd8\x64\xd8\x65\xd8\x66\xd8\x67\xd8\x68\xd8\x69\xd8\x6a\xd8\x6b\xd8\x6c\xd8\x6d\xd8\x6e\xd8\x6f\xd8\x70\xd8\x71\xd8\x72\xd8\x73\xd8\x74\xd8\x75\xd8\x76\xd8\x77\xd8\x78\xd8\x79\xd8\x7a\xd8\x7b\xd8\x7c\xd8\x7d\xd8\x7e\xd8\x7f\xd8\x80\xd8\x81\xd8\x82\xd8\x83\xd8\x84\xd8\x85\xd8\x86\xd8\x87", /* 3b00 */ "\xd8\x88\xd8\x89\xd8\x8a\xd8\x8b\xd8\x8c\xd8\x8d\xd8\x8e\xd8\x8f\xd8\x90\xd8\x91\xd8\x92\xd8\x93\xd8\x94\xd8\x95\xd8\x96\xd8\x97\xd8\x98\xd8\x99\xd8\x9a\xd8\x9b\xd8\x9c\xd8\x9d\xd8\x9e\xd8\x9f\xd8\xa0\xd8\xa1\xd8\xa2\xd8\xa3\xd8\xa4\xd8\xa5\xd8\xa6\xd8\xa7\xd8\xa8\xd8\xa9\xd8\xaa\xd8\xab\xd8\xac\xd8\xad\xd8\xae\xd8\xaf\xd8\xb0\xd8\xb1\xd8\xb2\xd8\xb3\xd8\xb4\xd8\xb5\xd8\xb6\xd8\xb7\xd8\xb8\xd8\xb9\xd8\xba\xd8\xbb\xd8\xbc\xd8\xbd\xd8\xbe\xd8\xbf\xd8\xc0\xd8\xc1\xd8\xc2\xd8\xc3\xd8\xc4\xd8\xc5\xd8\xc6\xd8\xc7\xd8\xc8\xd8\xc9\xd8\xca\xd8\xcb\xd8\xcc\xd8\xcd\xd8\xce\xd8\xcf\xd8\xd0\xd8\xd1\xd8\xd2\xd8\xd3\xd8\xd4\xd8\xd5\xce\x6e\xd8\xd6\xd8\xd7\xd8\xd8\xd8\xd9\xd8\xda\xd8\xdb\xd8\xdc\xd8\xdd\xd8\xde\xd8\xdf\xd8\xe0\xd8\xe1\xd8\xe2\xd8\xe3\xd8\xe4\xd8\xe5\xd8\xe6\xd8\xe7\xd8\xe8\xd8\xe9\xd8\xea\xd8\xeb\xd8\xec\xd8\xed\xd8\xee\xd8\xef\xd8\xf0\xd8\xf1\xd8\xf2\xd8\xf3\xd8\xf4\xd8\xf5\xd8\xf6\xd8\xf7\xd8\xf8\xd8\xf9\xd8\xfa\xd8\xfb\xd8\xfc\xd8\xfd\xd8\xfe\xd9\x41\xd9\x42\xd9\x43\xd9\x44\xd9\x45\xd9\x46\xd9\x47\xd9\x48", /* 3b80 */ "\xd9\x49\xd9\x4a\xd9\x4b\xd9\x4c\xd9\x4d\xd9\x4e\xd9\x4f\xd9\x50\xd9\x51\xd9\x52\xd9\x53\xd9\x54\xd9\x55\xd9\x56\xd9\x57\xd9\x58\xd9\x59\xd9\x5a\xd9\x5b\xd9\x5c\xd9\x5d\xd9\x5e\xd9\x5f\xd9\x60\xd9\x61\xd9\x62\xd9\x63\xd9\x64\xd9\x65\xd9\x66\xd9\x67\xd9\x68\xd9\x69\xd9\x6a\xd9\x6b\xd9\x6c\xd9\x6d\xd9\x6e\xd9\x6f\xd9\x70\xd9\x71\xd9\x72\xd9\x73\xd9\x74\xd9\x75\xd9\x76\xd9\x77\xd9\x78\xd9\x79\xd9\x7a\xd9\x7b\xd9\x7c\xd9\x7d\xd9\x7e\xd9\x7f\xd9\x80\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x88\xd9\x89\xd9\x8a\xd9\x8b\xd9\x8c\xd9\x8d\xd9\x8e\xd9\x8f\xd9\x90\xd9\x91\xd9\x92\xd9\x93\xd9\x94\xd9\x95\xd9\x96\xd9\x97\xd9\x98\xd9\x99\xd9\x9a\xd9\x9b\xd9\x9c\xd9\x9d\xd9\x9e\xd9\x9f\xd9\xa0\xd9\xa1\xd9\xa2\xd9\xa3\xd9\xa4\xd9\xa5\xd9\xa6\xd9\xa7\xd9\xa8\xd9\xa9\xd9\xaa\xd9\xab\xd9\xac\xd9\xad\xd9\xae\xd9\xaf\xd9\xb0\xd9\xb1\xd9\xb2\xd9\xb3\xd9\xb4\xd9\xb5\xd9\xb6\xd9\xb7\xd9\xb8\xd9\xb9\xd9\xba\xd9\xbb\xd9\xbc\xd9\xbd\xd9\xbe\xd9\xbf\xd9\xc0\xd9\xc1\xd9\xc2\xd9\xc3\xd9\xc4\xd9\xc5\xd9\xc6\xd9\xc7\xd9\xc8", /* 3c00 */ "\xd9\xc9\xd9\xca\xd9\xcb\xd9\xcc\xd9\xcd\xd9\xce\xd9\xcf\xd9\xd0\xd9\xd1\xd9\xd2\xd9\xd3\xd9\xd4\xd9\xd5\xd9\xd6\xd9\xd7\xd9\xd8\xd9\xd9\xd9\xda\xd9\xdb\xd9\xdc\xd9\xdd\xd9\xde\xd9\xdf\xd9\xe0\xd9\xe1\xd9\xe2\xd9\xe3\xd9\xe4\xd9\xe5\xd9\xe6\xd9\xe7\xd9\xe8\xd9\xe9\xd9\xea\xd9\xeb\xd9\xec\xd9\xed\xd9\xee\xd9\xef\xd9\xf0\xd9\xf1\xd9\xf2\xd9\xf3\xd9\xf4\xd9\xf5\xd9\xf6\xd9\xf7\xd9\xf8\xd9\xf9\xd9\xfa\xd9\xfb\xd9\xfc\xd9\xfd\xd9\xfe\xda\x41\xda\x42\xda\x43\xda\x44\xda\x45\xda\x46\xda\x47\xda\x48\xda\x49\xda\x4a\xda\x4b\xda\x4c\xda\x4d\xda\x4e\xda\x4f\xda\x50\xda\x51\xda\x52\xda\x53\xda\x54\xda\x55\xda\x56\xda\x57\xda\x58\xda\x59\xda\x5a\xda\x5b\xda\x5c\xda\x5d\xda\x5e\xda\x5f\xda\x60\xda\x61\xda\x62\xda\x63\xda\x64\xda\x65\xda\x66\xda\x67\xda\x68\xda\x69\xda\x6a\xda\x6b\xda\x6c\xda\x6d\xda\x6e\xda\x6f\xda\x70\xda\x71\xda\x72\xda\x73\xda\x74\xda\x75\xda\x76\xda\x77\xda\x78\xce\x6f\xda\x79\xda\x7a\xda\x7b\xda\x7c\xda\x7d\xda\x7e\xda\x7f\xda\x80\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87\xda\x88\xda\x89", /* 3c80 */ "\xda\x8a\xda\x8b\xda\x8c\xda\x8d\xda\x8e\xda\x8f\xda\x90\xda\x91\xda\x92\xda\x93\xda\x94\xda\x95\xda\x96\xda\x97\xda\x98\xda\x99\xda\x9a\xda\x9b\xda\x9c\xda\x9d\xda\x9e\xda\x9f\xda\xa0\xda\xa1\xda\xa2\xda\xa3\xda\xa4\xda\xa5\xda\xa6\xda\xa7\xda\xa8\xda\xa9\xda\xaa\xda\xab\xda\xac\xda\xad\xda\xae\xda\xaf\xda\xb0\xda\xb1\xda\xb2\xda\xb3\xda\xb4\xda\xb5\xda\xb6\xda\xb7\xda\xb8\xda\xb9\xda\xba\xda\xbb\xda\xbc\xda\xbd\xda\xbe\xda\xbf\xda\xc0\xda\xc1\xda\xc2\xda\xc3\xda\xc4\xda\xc5\xda\xc6\xda\xc7\xda\xc8\xda\xc9\xda\xca\xda\xcb\xda\xcc\xda\xcd\xda\xce\xda\xcf\xda\xd0\xda\xd1\xda\xd2\xda\xd3\xda\xd4\xda\xd5\xda\xd6\xda\xd7\xda\xd8\xda\xd9\xda\xda\xda\xdb\xda\xdc\xda\xdd\xda\xde\xda\xdf\xda\xe0\xda\xe1\xda\xe2\xda\xe3\xda\xe4\xda\xe5\xda\xe6\xda\xe7\xda\xe8\xda\xe9\xce\x70\xda\xea\xda\xeb\xda\xec\xda\xed\xda\xee\xda\xef\xda\xf0\xda\xf1\xda\xf2\xda\xf3\xda\xf4\xda\xf5\xda\xf6\xda\xf7\xda\xf8\xda\xf9\xda\xfa\xda\xfb\xda\xfc\xda\xfd\xda\xfe\xdb\x41\xdb\x42\xdb\x43\xdb\x44\xdb\x45\xdb\x46\xdb\x47\xdb\x48\xdb\x49\xdb\x4a", /* 3d00 */ "\xdb\x4b\xdb\x4c\xdb\x4d\xdb\x4e\xdb\x4f\xdb\x50\xdb\x51\xdb\x52\xdb\x53\xdb\x54\xdb\x55\xdb\x56\xdb\x57\xdb\x58\xdb\x59\xdb\x5a\xdb\x5b\xdb\x5c\xdb\x5d\xdb\x5e\xdb\x5f\xdb\x60\xdb\x61\xdb\x62\xdb\x63\xdb\x64\xdb\x65\xdb\x66\xdb\x67\xdb\x68\xdb\x69\xdb\x6a\xdb\x6b\xdb\x6c\xdb\x6d\xdb\x6e\xdb\x6f\xdb\x70\xdb\x71\xdb\x72\xdb\x73\xdb\x74\xdb\x75\xdb\x76\xdb\x77\xdb\x78\xdb\x79\xdb\x7a\xdb\x7b\xdb\x7c\xdb\x7d\xdb\x7e\xdb\x7f\xdb\x80\xdb\x81\xdb\x82\xdb\x83\xdb\x84\xdb\x85\xdb\x86\xdb\x87\xdb\x88\xdb\x89\xdb\x8a\xdb\x8b\xdb\x8c\xdb\x8d\xdb\x8e\xdb\x8f\xdb\x90\xdb\x91\xdb\x92\xdb\x93\xdb\x94\xdb\x95\xdb\x96\xdb\x97\xdb\x98\xdb\x99\xdb\x9a\xdb\x9b\xdb\x9c\xdb\x9d\xdb\x9e\xdb\x9f\xdb\xa0\xdb\xa1\xdb\xa2\xdb\xa3\xdb\xa4\xdb\xa5\xdb\xa6\xdb\xa7\xdb\xa8\xdb\xa9\xdb\xaa\xdb\xab\xdb\xac\xdb\xad\xdb\xae\xdb\xaf\xdb\xb0\xdb\xb1\xdb\xb2\xdb\xb3\xdb\xb4\xdb\xb5\xdb\xb6\xdb\xb7\xdb\xb8\xdb\xb9\xdb\xba\xdb\xbb\xdb\xbc\xdb\xbd\xdb\xbe\xdb\xbf\xdb\xc0\xdb\xc1\xdb\xc2\xdb\xc3\xdb\xc4\xdb\xc5\xdb\xc6\xdb\xc7\xdb\xc8\xdb\xc9\xdb\xca", /* 3d80 */ "\xdb\xcb\xdb\xcc\xdb\xcd\xdb\xce\xdb\xcf\xdb\xd0\xdb\xd1\xdb\xd2\xdb\xd3\xdb\xd4\xdb\xd5\xdb\xd6\xdb\xd7\xdb\xd8\xdb\xd9\xdb\xda\xdb\xdb\xdb\xdc\xdb\xdd\xdb\xde\xdb\xdf\xdb\xe0\xdb\xe1\xdb\xe2\xdb\xe3\xdb\xe4\xdb\xe5\xdb\xe6\xdb\xe7\xdb\xe8\xdb\xe9\xdb\xea\xdb\xeb\xdb\xec\xdb\xed\xdb\xee\xdb\xef\xdb\xf0\xdb\xf1\xdb\xf2\xdb\xf3\xdb\xf4\xdb\xf5\xdb\xf6\xdb\xf7\xdb\xf8\xdb\xf9\xdb\xfa\xdb\xfb\xdb\xfc\xdb\xfd\xdb\xfe\xdc\x41\xdc\x42\xdc\x43\xdc\x44\xdc\x45\xdc\x46\xdc\x47\xdc\x48\xdc\x49\xdc\x4a\xdc\x4b\xdc\x4c\xdc\x4d\xdc\x4e\xdc\x4f\xdc\x50\xdc\x51\xdc\x52\xdc\x53\xdc\x54\xdc\x55\xdc\x56\xdc\x57\xdc\x58\xdc\x59\xdc\x5a\xdc\x5b\xdc\x5c\xdc\x5d\xdc\x5e\xdc\x5f\xdc\x60\xdc\x61\xdc\x62\xdc\x63\xdc\x64\xdc\x65\xdc\x66\xdc\x67\xdc\x68\xdc\x69\xdc\x6a\xdc\x6b\xdc\x6c\xdc\x6d\xdc\x6e\xdc\x6f\xdc\x70\xdc\x71\xdc\x72\xdc\x73\xdc\x74\xdc\x75\xdc\x76\xdc\x77\xdc\x78\xdc\x79\xdc\x7a\xdc\x7b\xdc\x7c\xdc\x7d\xdc\x7e\xdc\x7f\xdc\x80\xdc\x81\xdc\x82\xdc\x83\xdc\x84\xdc\x85\xdc\x86\xdc\x87\xdc\x88\xdc\x89\xdc\x8a\xdc\x8b\xdc\x8c", /* 3e00 */ "\xdc\x8d\xdc\x8e\xdc\x8f\xdc\x90\xdc\x91\xdc\x92\xdc\x93\xdc\x94\xdc\x95\xdc\x96\xdc\x97\xdc\x98\xdc\x99\xdc\x9a\xdc\x9b\xdc\x9c\xdc\x9d\xdc\x9e\xdc\x9f\xdc\xa0\xdc\xa1\xdc\xa2\xdc\xa3\xdc\xa4\xdc\xa5\xdc\xa6\xdc\xa7\xdc\xa8\xdc\xa9\xdc\xaa\xdc\xab\xdc\xac\xdc\xad\xdc\xae\xdc\xaf\xdc\xb0\xdc\xb1\xdc\xb2\xdc\xb3\xdc\xb4\xdc\xb5\xdc\xb6\xdc\xb7\xdc\xb8\xdc\xb9\xdc\xba\xdc\xbb\xdc\xbc\xdc\xbd\xdc\xbe\xdc\xbf\xdc\xc0\xdc\xc1\xdc\xc2\xdc\xc3\xdc\xc4\xdc\xc5\xdc\xc6\xdc\xc7\xdc\xc8\xdc\xc9\xdc\xca\xdc\xcb\xdc\xcc\xdc\xcd\xdc\xce\xdc\xcf\xdc\xd0\xdc\xd1\xdc\xd2\xdc\xd3\xdc\xd4\xdc\xd5\xdc\xd6\xdc\xd7\xdc\xd8\xdc\xd9\xdc\xda\xdc\xdb\xdc\xdc\xdc\xdd\xdc\xde\xdc\xdf\xdc\xe0\xdc\xe1\xdc\xe2\xdc\xe3\xdc\xe4\xdc\xe5\xdc\xe6\xdc\xe7\xdc\xe8\xdc\xe9\xdc\xea\xdc\xeb\xdc\xec\xdc\xed\xdc\xee\xdc\xef\xdc\xf0\xdc\xf1\xdc\xf2\xdc\xf3\xdc\xf4\xdc\xf5\xdc\xf6\xdc\xf7\xdc\xf8\xdc\xf9\xdc\xfa\xdc\xfb\xdc\xfc\xdc\xfd\xdc\xfe\xdd\x41\xdd\x42\xdd\x43\xdd\x44\xdd\x45\xdd\x46\xdd\x47\xdd\x48\xdd\x49\xdd\x4a\xdd\x4b\xdd\x4c\xdd\x4d\xdd\x4e", /* 3e80 */ "\xdd\x4f\xdd\x50\xdd\x51\xdd\x52\xdd\x53\xdd\x54\xdd\x55\xdd\x56\xdd\x57\xdd\x58\xdd\x59\xdd\x5a\xdd\x5b\xdd\x5c\xdd\x5d\xdd\x5e\xdd\x5f\xdd\x60\xdd\x61\xdd\x62\xdd\x63\xdd\x64\xdd\x65\xdd\x66\xdd\x67\xdd\x68\xdd\x69\xdd\x6a\xdd\x6b\xdd\x6c\xdd\x6d\xdd\x6e\xdd\x6f\xdd\x70\xdd\x71\xdd\x72\xdd\x73\xdd\x74\xdd\x75\xdd\x76\xdd\x77\xdd\x78\xdd\x79\xdd\x7a\xdd\x7b\xdd\x7c\xdd\x7d\xdd\x7e\xdd\x7f\xdd\x80\xdd\x81\xdd\x82\xdd\x83\xdd\x84\xdd\x85\xdd\x86\xdd\x87\xdd\x88\xdd\x89\xdd\x8a\xdd\x8b\xdd\x8c\xdd\x8d\xdd\x8e\xdd\x8f\xdd\x90\xdd\x91\xdd\x92\xdd\x93\xdd\x94\xdd\x95\xdd\x96\xdd\x97\xdd\x98\xdd\x99\xdd\x9a\xdd\x9b\xdd\x9c\xdd\x9d\xdd\x9e\xdd\x9f\xdd\xa0\xdd\xa1\xdd\xa2\xdd\xa3\xdd\xa4\xdd\xa5\xdd\xa6\xdd\xa7\xdd\xa8\xdd\xa9\xdd\xaa\xdd\xab\xdd\xac\xdd\xad\xdd\xae\xdd\xaf\xdd\xb0\xdd\xb1\xdd\xb2\xdd\xb3\xdd\xb4\xdd\xb5\xdd\xb6\xdd\xb7\xdd\xb8\xdd\xb9\xdd\xba\xdd\xbb\xdd\xbc\xdd\xbd\xdd\xbe\xdd\xbf\xdd\xc0\xdd\xc1\xdd\xc2\xdd\xc3\xdd\xc4\xdd\xc5\xdd\xc6\xdd\xc7\xdd\xc8\xdd\xc9\xdd\xca\xdd\xcb\xdd\xcc\xdd\xcd\xdd\xce", /* 3f00 */ "\xdd\xcf\xdd\xd0\xdd\xd1\xdd\xd2\xdd\xd3\xdd\xd4\xdd\xd5\xdd\xd6\xdd\xd7\xdd\xd8\xdd\xd9\xdd\xda\xdd\xdb\xdd\xdc\xdd\xdd\xdd\xde\xdd\xdf\xdd\xe0\xdd\xe1\xdd\xe2\xdd\xe3\xdd\xe4\xdd\xe5\xdd\xe6\xdd\xe7\xdd\xe8\xdd\xe9\xdd\xea\xdd\xeb\xdd\xec\xdd\xed\xdd\xee\xdd\xef\xdd\xf0\xdd\xf1\xdd\xf2\xdd\xf3\xdd\xf4\xdd\xf5\xdd\xf6\xdd\xf7\xdd\xf8\xdd\xf9\xdd\xfa\xdd\xfb\xdd\xfc\xdd\xfd\xdd\xfe\xde\x41\xde\x42\xde\x43\xde\x44\xde\x45\xde\x46\xde\x47\xde\x48\xde\x49\xde\x4a\xde\x4b\xde\x4c\xde\x4d\xde\x4e\xde\x4f\xde\x50\xde\x51\xde\x52\xde\x53\xde\x54\xde\x55\xde\x56\xde\x57\xde\x58\xde\x59\xde\x5a\xde\x5b\xde\x5c\xde\x5d\xde\x5e\xde\x5f\xde\x60\xde\x61\xde\x62\xde\x63\xde\x64\xde\x65\xde\x66\xde\x67\xde\x68\xde\x69\xde\x6a\xde\x6b\xde\x6c\xde\x6d\xde\x6e\xde\x6f\xde\x70\xde\x71\xde\x72\xde\x73\xde\x74\xde\x75\xde\x76\xde\x77\xde\x78\xde\x79\xde\x7a\xde\x7b\xde\x7c\xde\x7d\xde\x7e\xde\x7f\xde\x80\xde\x81\xde\x82\xde\x83\xde\x84\xde\x85\xde\x86\xde\x87\xde\x88\xde\x89\xde\x8a\xde\x8b\xde\x8c\xde\x8d\xde\x8e\xde\x8f\xde\x90", /* 3f80 */ "\xde\x91\xde\x92\xde\x93\xde\x94\xde\x95\xde\x96\xde\x97\xde\x98\xde\x99\xde\x9a\xde\x9b\xde\x9c\xde\x9d\xde\x9e\xde\x9f\xde\xa0\xde\xa1\xde\xa2\xde\xa3\xde\xa4\xde\xa5\xde\xa6\xde\xa7\xde\xa8\xde\xa9\xde\xaa\xde\xab\xde\xac\xde\xad\xde\xae\xde\xaf\xde\xb0\xde\xb1\xde\xb2\xde\xb3\xde\xb4\xde\xb5\xde\xb6\xde\xb7\xde\xb8\xde\xb9\xde\xba\xde\xbb\xde\xbc\xde\xbd\xde\xbe\xde\xbf\xde\xc0\xde\xc1\xde\xc2\xde\xc3\xde\xc4\xde\xc5\xde\xc6\xde\xc7\xde\xc8\xde\xc9\xde\xca\xde\xcb\xde\xcc\xde\xcd\xde\xce\xde\xcf\xde\xd0\xde\xd1\xde\xd2\xde\xd3\xde\xd4\xde\xd5\xde\xd6\xde\xd7\xde\xd8\xde\xd9\xde\xda\xde\xdb\xde\xdc\xde\xdd\xde\xde\xde\xdf\xde\xe0\xde\xe1\xde\xe2\xde\xe3\xde\xe4\xde\xe5\xde\xe6\xde\xe7\xde\xe8\xde\xe9\xde\xea\xde\xeb\xde\xec\xde\xed\xde\xee\xde\xef\xde\xf0\xde\xf1\xde\xf2\xde\xf3\xde\xf4\xde\xf5\xde\xf6\xde\xf7\xde\xf8\xde\xf9\xde\xfa\xde\xfb\xde\xfc\xde\xfd\xde\xfe\xdf\x41\xdf\x42\xdf\x43\xdf\x44\xdf\x45\xdf\x46\xdf\x47\xdf\x48\xdf\x49\xdf\x4a\xdf\x4b\xdf\x4c\xdf\x4d\xdf\x4e\xdf\x4f\xdf\x50\xdf\x51\xdf\x52", /* 4000 */ "\xdf\x53\xdf\x54\xdf\x55\xdf\x56\xdf\x57\xdf\x58\xdf\x59\xdf\x5a\xdf\x5b\xdf\x5c\xdf\x5d\xdf\x5e\xdf\x5f\xdf\x60\xdf\x61\xdf\x62\xdf\x63\xdf\x64\xdf\x65\xdf\x66\xdf\x67\xdf\x68\xdf\x69\xdf\x6a\xdf\x6b\xdf\x6c\xdf\x6d\xdf\x6e\xdf\x6f\xdf\x70\xdf\x71\xdf\x72\xdf\x73\xdf\x74\xdf\x75\xdf\x76\xdf\x77\xdf\x78\xdf\x79\xdf\x7a\xdf\x7b\xdf\x7c\xdf\x7d\xdf\x7e\xdf\x7f\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xdf\x8b\xdf\x8c\xdf\x8d\xdf\x8e\xdf\x8f\xdf\x90\xdf\x91\xdf\x92\xdf\x93\xdf\x94\xdf\x95\xdf\x96\xdf\x97\xdf\x98\xdf\x99\xdf\x9a\xdf\x9b\xdf\x9c\xdf\x9d\xdf\x9e\xdf\x9f\xdf\xa0\xdf\xa1\xdf\xa2\xdf\xa3\xdf\xa4\xdf\xa5\xdf\xa6\xdf\xa7\xdf\xa8\xce\x75\xdf\xa9\xdf\xaa\xdf\xab\xdf\xac\xdf\xad\xdf\xae\xdf\xaf\xdf\xb0\xdf\xb1\xdf\xb2\xdf\xb3\xdf\xb4\xdf\xb5\xdf\xb6\xdf\xb7\xdf\xb8\xdf\xb9\xdf\xba\xdf\xbb\xdf\xbc\xdf\xbd\xdf\xbe\xdf\xbf\xdf\xc0\xdf\xc1\xdf\xc2\xdf\xc3\xdf\xc4\xdf\xc5\xdf\xc6\xdf\xc7\xdf\xc8\xdf\xc9\xdf\xca\xdf\xcb\xdf\xcc\xdf\xcd\xdf\xce\xdf\xcf\xdf\xd0\xdf\xd1", /* 4080 */ "\xdf\xd2\xdf\xd3\xdf\xd4\xdf\xd5\xdf\xd6\xdf\xd7\xdf\xd8\xdf\xd9\xdf\xda\xdf\xdb\xdf\xdc\xdf\xdd\xdf\xde\xdf\xdf\xdf\xe0\xdf\xe1\xdf\xe2\xdf\xe3\xdf\xe4\xdf\xe5\xdf\xe6\xdf\xe7\xdf\xe8\xdf\xe9\xdf\xea\xdf\xeb\xdf\xec\xdf\xed\xdf\xee\xdf\xef\xdf\xf0\xdf\xf1\xdf\xf2\xdf\xf3\xdf\xf4\xdf\xf5\xdf\xf6\xdf\xf7\xdf\xf8\xdf\xf9\xdf\xfa\xdf\xfb\xdf\xfc\xdf\xfd\xdf\xfe\xe0\x41\xe0\x42\xe0\x43\xe0\x44\xe0\x45\xe0\x46\xe0\x47\xe0\x48\xe0\x49\xe0\x4a\xe0\x4b\xe0\x4c\xe0\x4d\xe0\x4e\xe0\x4f\xe0\x50\xe0\x51\xe0\x52\xe0\x53\xe0\x54\xe0\x55\xe0\x56\xe0\x57\xe0\x58\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xe0\x5d\xe0\x5e\xe0\x5f\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xe0\x64\xe0\x65\xe0\x66\xe0\x67\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x7f\xe0\x80\xe0\x81\xe0\x82\xe0\x83\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xe0\x8f\xe0\x90\xe0\x91\xe0\x92\xe0\x93", /* 4100 */ "\xe0\x94\xe0\x95\xe0\x96\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xe0\xa0\xe0\xa1\xe0\xa2\xe0\xa3\xe0\xa4\xe0\xa5\xe0\xa6\xe0\xa7\xe0\xa8\xe0\xa9\xe0\xaa\xe0\xab\xe0\xac\xe0\xad\xe0\xae\xe0\xaf\xe0\xb0\xe0\xb1\xe0\xb2\xe0\xb3\xe0\xb4\xe0\xb5\xe0\xb6\xe0\xb7\xe0\xb8\xe0\xb9\xe0\xba\xe0\xbb\xe0\xbc\xe0\xbd\xe0\xbe\xe0\xbf\xe0\xc0\xe0\xc1\xe0\xc2\xe0\xc3\xe0\xc4\xe0\xc5\xe0\xc6\xe0\xc7\xe0\xc8\xe0\xc9\xe0\xca\xe0\xcb\xe0\xcc\xe0\xcd\xe0\xce\xe0\xcf\xe0\xd0\xe0\xd1\xe0\xd2\xe0\xd3\xe0\xd4\xe0\xd5\xe0\xd6\xe0\xd7\xe0\xd8\xe0\xd9\xe0\xda\xe0\xdb\xe0\xdc\xe0\xdd\xe0\xde\xe0\xdf\xe0\xe0\xe0\xe1\xe0\xe2\xe0\xe3\xe0\xe4\xe0\xe5\xe0\xe6\xe0\xe7\xe0\xe8\xe0\xe9\xe0\xea\xe0\xeb\xe0\xec\xe0\xed\xe0\xee\xe0\xef\xe0\xf0\xe0\xf1\xe0\xf2\xce\x76\xe0\xf3\xe0\xf4\xe0\xf5\xe0\xf6\xe0\xf7\xe0\xf8\xe0\xf9\xe0\xfa\xe0\xfb\xe0\xfc\xe0\xfd\xe0\xfe\xe1\x41\xe1\x42\xe1\x43\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xe1\x48\xe1\x49\xe1\x4a\xe1\x4b\xe1\x4c\xe1\x4d\xe1\x4e\xe1\x4f\xe1\x50\xe1\x51\xe1\x52\xe1\x53\xe1\x54", /* 4180 */ "\xe1\x55\xe1\x56\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xe1\x5c\xe1\x5d\xe1\x5e\xe1\x5f\xe1\x60\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xe1\x74\xe1\x75\xe1\x76\xe1\x77\xe1\x78\xe1\x79\xe1\x7a\xe1\x7b\xe1\x7c\xe1\x7d\xe1\x7e\xe1\x7f\xe1\x80\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xe1\x8b\xe1\x8c\xe1\x8d\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe1\xa1\xe1\xa2\xe1\xa3\xe1\xa4\xe1\xa5\xe1\xa6\xe1\xa7\xe1\xa8\xe1\xa9\xe1\xaa\xe1\xab\xe1\xac\xe1\xad\xe1\xae\xe1\xaf\xe1\xb0\xe1\xb1\xe1\xb2\xe1\xb3\xe1\xb4\xe1\xb5\xe1\xb6\xe1\xb7\xe1\xb8\xe1\xb9\xe1\xba\xe1\xbb\xe1\xbc\xe1\xbd\xe1\xbe\xe1\xbf\xe1\xc0\xe1\xc1\xe1\xc2\xe1\xc3\xe1\xc4\xe1\xc5\xe1\xc6\xe1\xc7\xe1\xc8\xe1\xc9\xe1\xca\xe1\xcb\xe1\xcc\xe1\xcd\xe1\xce\xe1\xcf\xe1\xd0\xe1\xd1\xe1\xd2\xe1\xd3\xe1\xd4", /* 4200 */ "\xe1\xd5\xe1\xd6\xe1\xd7\xe1\xd8\xe1\xd9\xe1\xda\xe1\xdb\xe1\xdc\xe1\xdd\xe1\xde\xe1\xdf\xe1\xe0\xe1\xe1\xe1\xe2\xe1\xe3\xe1\xe4\xe1\xe5\xe1\xe6\xe1\xe7\xe1\xe8\xe1\xe9\xe1\xea\xe1\xeb\xe1\xec\xe1\xed\xe1\xee\xe1\xef\xe1\xf0\xe1\xf1\xe1\xf2\xe1\xf3\xe1\xf4\xe1\xf5\xe1\xf6\xe1\xf7\xe1\xf8\xe1\xf9\xe1\xfa\xe1\xfb\xe1\xfc\xe1\xfd\xe1\xfe\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x7f\xe2\x80\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96", /* 4280 */ "\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe2\xa1\xe2\xa2\xe2\xa3\xe2\xa4\xe2\xa5\xe2\xa6\xe2\xa7\xe2\xa8\xe2\xa9\xe2\xaa\xe2\xab\xe2\xac\xe2\xad\xe2\xae\xe2\xaf\xe2\xb0\xe2\xb1\xe2\xb2\xe2\xb3\xe2\xb4\xe2\xb5\xe2\xb6\xe2\xb7\xe2\xb8\xe2\xb9\xe2\xba\xe2\xbb\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1\xe2\xc2\xe2\xc3\xe2\xc4\xe2\xc5\xe2\xc6\xe2\xc7\xe2\xc8\xe2\xc9\xe2\xca\xe2\xcb\xe2\xcc\xe2\xcd\xe2\xce\xe2\xcf\xe2\xd0\xe2\xd1\xe2\xd2\xe2\xd3\xe2\xd4\xe2\xd5\xe2\xd6\xe2\xd7\xe2\xd8\xe2\xd9\xe2\xda\xe2\xdb\xe2\xdc\xe2\xdd\xe2\xde\xe2\xdf\xe2\xe0\xe2\xe1\xe2\xe2\xe2\xe3\xe2\xe4\xe2\xe5\xe2\xe6\xe2\xe7\xe2\xe8\xe2\xe9\xe2\xea\xe2\xeb\xe2\xec\xe2\xed\xe2\xee\xe2\xef\xe2\xf0\xe2\xf1\xe2\xf2\xe2\xf3\xe2\xf4\xe2\xf5\xe2\xf6\xe2\xf7\xe2\xf8\xe2\xf9\xe2\xfa\xe2\xfb\xe2\xfc\xe2\xfd\xe2\xfe\xe3\x41\xe3\x42\xe3\x43\xe3\x44\xe3\x45\xe3\x46\xe3\x47\xe3\x48\xe3\x49\xe3\x4a\xe3\x4b\xe3\x4c\xe3\x4d\xe3\x4e\xe3\x4f\xe3\x50\xe3\x51\xe3\x52\xe3\x53\xe3\x54\xe3\x55\xe3\x56\xe3\x57\xe3\x58", /* 4300 */ "\xe3\x59\xe3\x5a\xe3\x5b\xe3\x5c\xe3\x5d\xe3\x5e\xe3\x5f\xe3\x60\xe3\x61\xe3\x62\xe3\x63\xe3\x64\xe3\x65\xe3\x66\xe3\x67\xe3\x68\xe3\x69\xe3\x6a\xe3\x6b\xe3\x6c\xe3\x6d\xe3\x6e\xe3\x6f\xe3\x70\xe3\x71\xe3\x72\xe3\x73\xe3\x74\xe3\x75\xe3\x76\xe3\x77\xe3\x78\xe3\x79\xe3\x7a\xe3\x7b\xe3\x7c\xe3\x7d\xe3\x7e\xe3\x7f\xe3\x80\xe3\x81\xe3\x82\xe3\x83\xe3\x84\xe3\x85\xe3\x86\xe3\x87\xe3\x88\xe3\x89\xe3\x8a\xe3\x8b\xe3\x8c\xe3\x8d\xe3\x8e\xe3\x8f\xce\x78\xe3\x90\xe3\x91\xe3\x92\xe3\x93\xe3\x94\xe3\x95\xe3\x96\xe3\x97\xe3\x98\xe3\x99\xe3\x9a\xe3\x9b\xe3\x9c\xe3\x9d\xe3\x9e\xe3\x9f\xe3\xa0\xe3\xa1\xe3\xa2\xe3\xa3\xe3\xa4\xe3\xa5\xe3\xa6\xe3\xa7\xe3\xa8\xe3\xa9\xe3\xaa\xe3\xab\xe3\xac\xe3\xad\xe3\xae\xe3\xaf\xe3\xb0\xe3\xb1\xe3\xb2\xe3\xb3\xe3\xb4\xe3\xb5\xe3\xb6\xe3\xb7\xe3\xb8\xe3\xb9\xe3\xba\xe3\xbb\xe3\xbc\xe3\xbd\xe3\xbe\xe3\xbf\xe3\xc0\xe3\xc1\xe3\xc2\xe3\xc3\xe3\xc4\xe3\xc5\xe3\xc6\xe3\xc7\xe3\xc8\xe3\xc9\xe3\xca\xe3\xcb\xe3\xcc\xe3\xcd\xe3\xce\xe3\xcf\xe3\xd0\xe3\xd1\xe3\xd2\xe3\xd3\xe3\xd4\xe3\xd5\xe3\xd6\xe3\xd7", /* 4380 */ "\xe3\xd8\xe3\xd9\xe3\xda\xe3\xdb\xe3\xdc\xe3\xdd\xe3\xde\xe3\xdf\xe3\xe0\xe3\xe1\xe3\xe2\xe3\xe3\xe3\xe4\xe3\xe5\xe3\xe6\xe3\xe7\xe3\xe8\xe3\xe9\xe3\xea\xe3\xeb\xe3\xec\xe3\xed\xe3\xee\xe3\xef\xe3\xf0\xe3\xf1\xe3\xf2\xe3\xf3\xe3\xf4\xe3\xf5\xe3\xf6\xe3\xf7\xe3\xf8\xe3\xf9\xe3\xfa\xe3\xfb\xe3\xfc\xe3\xfd\xe3\xfe\xe4\x41\xe4\x42\xe4\x43\xe4\x44\xe4\x45\xce\x7e\xe4\x46\xe4\x47\xe4\x48\xe4\x49\xce\x7d\xe4\x4a\xe4\x4b\xe4\x4c\xe4\x4d\xe4\x4e\xe4\x4f\xe4\x50\xe4\x51\xe4\x52\xe4\x53\xe4\x54\xe4\x55\xe4\x56\xe4\x57\xe4\x58\xe4\x59\xe4\x5a\xe4\x5b\xe4\x5c\xe4\x5d\xe4\x5e\xe4\x5f\xe4\x60\xe4\x61\xe4\x62\xe4\x63\xe4\x64\xe4\x65\xe4\x66\xe4\x67\xe4\x68\xe4\x69\xe4\x6a\xe4\x6b\xe4\x6c\xe4\x6d\xe4\x6e\xe4\x6f\xe4\x70\xe4\x71\xe4\x72\xe4\x73\xe4\x74\xce\x81\xe4\x75\xe4\x76\xe4\x77\xe4\x78\xe4\x79\xe4\x7a\xe4\x7b\xe4\x7c\xe4\x7d\xe4\x7e\xe4\x7f\xe4\x80\xe4\x81\xe4\x82\xe4\x83\xe4\x84\xe4\x85\xe4\x86\xe4\x87\xe4\x88\xe4\x89\xe4\x8a\xe4\x8b\xe4\x8c\xe4\x8d\xe4\x8e\xe4\x8f\xe4\x90\xe4\x91\xe4\x92\xe4\x93\xe4\x94\xe4\x95\xe4\x96", /* 4400 */ "\xe4\x97\xe4\x98\xe4\x99\xe4\x9a\xe4\x9b\xe4\x9c\xe4\x9d\xe4\x9e\xe4\x9f\xe4\xa0\xe4\xa1\xe4\xa2\xe4\xa3\xe4\xa4\xe4\xa5\xe4\xa6\xe4\xa7\xe4\xa8\xe4\xa9\xe4\xaa\xe4\xab\xe4\xac\xe4\xad\xe4\xae\xe4\xaf\xe4\xb0\xe4\xb1\xe4\xb2\xe4\xb3\xe4\xb4\xe4\xb5\xe4\xb6\xe4\xb7\xe4\xb8\xe4\xb9\xe4\xba\xe4\xbb\xe4\xbc\xe4\xbd\xe4\xbe\xe4\xbf\xe4\xc0\xe4\xc1\xe4\xc2\xe4\xc3\xe4\xc4\xe4\xc5\xe4\xc6\xe4\xc7\xe4\xc8\xe4\xc9\xe4\xca\xe4\xcb\xe4\xcc\xe4\xcd\xe4\xce\xe4\xcf\xe4\xd0\xe4\xd1\xe4\xd2\xe4\xd3\xe4\xd4\xe4\xd5\xe4\xd6\xe4\xd7\xe4\xd8\xe4\xd9\xe4\xda\xe4\xdb\xe4\xdc\xe4\xdd\xe4\xde\xe4\xdf\xe4\xe0\xe4\xe1\xe4\xe2\xe4\xe3\xe4\xe4\xe4\xe5\xe4\xe6\xe4\xe7\xe4\xe8\xe4\xe9\xe4\xea\xe4\xeb\xe4\xec\xe4\xed\xe4\xee\xe4\xef\xe4\xf0\xe4\xf1\xe4\xf2\xe4\xf3\xe4\xf4\xe4\xf5\xe4\xf6\xe4\xf7\xe4\xf8\xe4\xf9\xe4\xfa\xe4\xfb\xe4\xfc\xe4\xfd\xe4\xfe\xe5\x41\xe5\x42\xe5\x43\xe5\x44\xe5\x45\xe5\x46\xe5\x47\xe5\x48\xe5\x49\xe5\x4a\xe5\x4b\xe5\x4c\xe5\x4d\xe5\x4e\xe5\x4f\xe5\x50\xe5\x51\xe5\x52\xe5\x53\xe5\x54\xe5\x55\xe5\x56\xe5\x57\xe5\x58", /* 4480 */ "\xe5\x59\xe5\x5a\xe5\x5b\xe5\x5c\xe5\x5d\xe5\x5e\xe5\x5f\xe5\x60\xe5\x61\xe5\x62\xe5\x63\xe5\x64\xe5\x65\xe5\x66\xe5\x67\xe5\x68\xe5\x69\xe5\x6a\xe5\x6b\xe5\x6c\xe5\x6d\xe5\x6e\xe5\x6f\xe5\x70\xe5\x71\xe5\x72\xe5\x73\xe5\x74\xe5\x75\xe5\x76\xe5\x77\xe5\x78\xe5\x79\xe5\x7a\xe5\x7b\xe5\x7c\xe5\x7d\xe5\x7e\xe5\x7f\xe5\x80\xe5\x81\xe5\x82\xe5\x83\xe5\x84\xe5\x85\xe5\x86\xe5\x87\xe5\x88\xe5\x89\xe5\x8a\xe5\x8b\xe5\x8c\xe5\x8d\xe5\x8e\xe5\x8f\xe5\x90\xe5\x91\xe5\x92\xe5\x93\xe5\x94\xe5\x95\xe5\x96\xe5\x97\xe5\x98\xe5\x99\xe5\x9a\xe5\x9b\xe5\x9c\xe5\x9d\xe5\x9e\xe5\x9f\xe5\xa0\xe5\xa1\xe5\xa2\xe5\xa3\xe5\xa4\xe5\xa5\xe5\xa6\xe5\xa7\xe5\xa8\xe5\xa9\xe5\xaa\xe5\xab\xe5\xac\xe5\xad\xe5\xae\xce\x82\xe5\xaf\xe5\xb0\xe5\xb1\xe5\xb2\xe5\xb3\xe5\xb4\xe5\xb5\xe5\xb6\xe5\xb7\xe5\xb8\xe5\xb9\xe5\xba\xe5\xbb\xe5\xbc\xe5\xbd\xe5\xbe\xe5\xbf\xe5\xc0\xe5\xc1\xe5\xc2\xe5\xc3\xe5\xc4\xe5\xc5\xe5\xc6\xe5\xc7\xe5\xc8\xe5\xc9\xe5\xca\xe5\xcb\xe5\xcc\xe5\xcd\xe5\xce\xe5\xcf\xe5\xd0\xe5\xd1\xe5\xd2\xe5\xd3\xe5\xd4\xe5\xd5\xe5\xd6\xe5\xd7", /* 4500 */ "\xe5\xd8\xe5\xd9\xe5\xda\xe5\xdb\xe5\xdc\xe5\xdd\xe5\xde\xe5\xdf\xe5\xe0\xe5\xe1\xe5\xe2\xe5\xe3\xe5\xe4\xe5\xe5\xe5\xe6\xe5\xe7\xe5\xe8\xe5\xe9\xe5\xea\xe5\xeb\xe5\xec\xe5\xed\xe5\xee\xe5\xef\xe5\xf0\xe5\xf1\xe5\xf2\xe5\xf3\xe5\xf4\xe5\xf5\xe5\xf6\xe5\xf7\xe5\xf8\xe5\xf9\xe5\xfa\xe5\xfb\xe5\xfc\xe5\xfd\xe5\xfe\xe6\x41\xe6\x42\xe6\x43\xe6\x44\xe6\x45\xe6\x46\xe6\x47\xe6\x48\xe6\x49\xe6\x4a\xe6\x4b\xe6\x4c\xe6\x4d\xe6\x4e\xe6\x4f\xe6\x50\xe6\x51\xe6\x52\xe6\x53\xe6\x54\xe6\x55\xe6\x56\xe6\x57\xe6\x58\xe6\x59\xe6\x5a\xe6\x5b\xe6\x5c\xe6\x5d\xe6\x5e\xe6\x5f\xe6\x60\xe6\x61\xe6\x62\xe6\x63\xe6\x64\xe6\x65\xe6\x66\xe6\x67\xe6\x68\xe6\x69\xe6\x6a\xe6\x6b\xe6\x6c\xe6\x6d\xe6\x6e\xe6\x6f\xe6\x70\xe6\x71\xe6\x72\xe6\x73\xe6\x74\xe6\x75\xe6\x76\xe6\x77\xe6\x78\xe6\x79\xe6\x7a\xe6\x7b\xe6\x7c\xe6\x7d\xe6\x7e\xe6\x7f\xe6\x80\xe6\x81\xe6\x82\xe6\x83\xe6\x84\xe6\x85\xe6\x86\xe6\x87\xe6\x88\xe6\x89\xe6\x8a\xe6\x8b\xe6\x8c\xe6\x8d\xe6\x8e\xe6\x8f\xe6\x90\xe6\x91\xe6\x92\xe6\x93\xe6\x94\xe6\x95\xe6\x96\xe6\x97\xe6\x98\xe6\x99", /* 4580 */ "\xe6\x9a\xe6\x9b\xe6\x9c\xe6\x9d\xe6\x9e\xe6\x9f\xe6\xa0\xe6\xa1\xe6\xa2\xe6\xa3\xe6\xa4\xe6\xa5\xe6\xa6\xe6\xa7\xe6\xa8\xe6\xa9\xe6\xaa\xe6\xab\xe6\xac\xe6\xad\xe6\xae\xe6\xaf\xe6\xb0\xe6\xb1\xe6\xb2\xe6\xb3\xe6\xb4\xe6\xb5\xe6\xb6\xe6\xb7\xe6\xb8\xe6\xb9\xe6\xba\xe6\xbb\xe6\xbc\xe6\xbd\xe6\xbe\xe6\xbf\xe6\xc0\xe6\xc1\xe6\xc2\xe6\xc3\xe6\xc4\xe6\xc5\xe6\xc6\xe6\xc7\xe6\xc8\xe6\xc9\xe6\xca\xe6\xcb\xe6\xcc\xe6\xcd\xe6\xce\xe6\xcf\xe6\xd0\xe6\xd1\xe6\xd2\xe6\xd3\xe6\xd4\xe6\xd5\xe6\xd6\xe6\xd7\xe6\xd8\xe6\xd9\xe6\xda\xe6\xdb\xe6\xdc\xe6\xdd\xe6\xde\xe6\xdf\xe6\xe0\xe6\xe1\xe6\xe2\xe6\xe3\xe6\xe4\xe6\xe5\xe6\xe6\xe6\xe7\xe6\xe8\xe6\xe9\xe6\xea\xe6\xeb\xe6\xec\xe6\xed\xe6\xee\xe6\xef\xe6\xf0\xe6\xf1\xe6\xf2\xe6\xf3\xe6\xf4\xe6\xf5\xe6\xf6\xe6\xf7\xe6\xf8\xe6\xf9\xe6\xfa\xe6\xfb\xe6\xfc\xe6\xfd\xe6\xfe\xe7\x41\xe7\x42\xe7\x43\xe7\x44\xe7\x45\xe7\x46\xe7\x47\xe7\x48\xe7\x49\xe7\x4a\xe7\x4b\xe7\x4c\xe7\x4d\xe7\x4e\xe7\x4f\xe7\x50\xe7\x51\xe7\x52\xe7\x53\xe7\x54\xe7\x55\xe7\x56\xe7\x57\xe7\x58\xe7\x59\xe7\x5a\xe7\x5b", /* 4600 */ "\xe7\x5c\xe7\x5d\xe7\x5e\xe7\x5f\xe7\x60\xe7\x61\xe7\x62\xe7\x63\xe7\x64\xe7\x65\xe7\x66\xe7\x67\xe7\x68\xe7\x69\xe7\x6a\xe7\x6b\xe7\x6c\xe7\x6d\xe7\x6e\xe7\x6f\xe7\x70\xe7\x71\xe7\x72\xe7\x73\xe7\x74\xe7\x75\xe7\x76\xe7\x77\xe7\x78\xe7\x79\xe7\x7a\xe7\x7b\xe7\x7c\xe7\x7d\xe7\x7e\xe7\x7f\xe7\x80\xe7\x81\xe7\x82\xe7\x83\xe7\x84\xe7\x85\xe7\x86\xe7\x87\xe7\x88\xe7\x89\xe7\x8a\xe7\x8b\xe7\x8c\xe7\x8d\xe7\x8e\xe7\x8f\xe7\x90\xe7\x91\xe7\x92\xe7\x93\xe7\x94\xe7\x95\xe7\x96\xe7\x97\xe7\x98\xe7\x99\xe7\x9a\xe7\x9b\xe7\x9c\xe7\x9d\xe7\x9e\xe7\x9f\xe7\xa0\xe7\xa1\xe7\xa2\xe7\xa3\xe7\xa4\xe7\xa5\xe7\xa6\xe7\xa7\xce\x84\xe7\xa8\xe7\xa9\xe7\xaa\xe7\xab\xe7\xac\xe7\xad\xe7\xae\xe7\xaf\xe7\xb0\xe7\xb1\xe7\xb2\xe7\xb3\xe7\xb4\xe7\xb5\xe7\xb6\xe7\xb7\xe7\xb8\xe7\xb9\xe7\xba\xe7\xbb\xce\x83\xe7\xbc\xe7\xbd\xe7\xbe\xe7\xbf\xe7\xc0\xe7\xc1\xe7\xc2\xe7\xc3\xe7\xc4\xe7\xc5\xe7\xc6\xe7\xc7\xe7\xc8\xe7\xc9\xe7\xca\xe7\xcb\xe7\xcc\xe7\xcd\xe7\xce\xe7\xcf\xe7\xd0\xe7\xd1\xe7\xd2\xe7\xd3\xe7\xd4\xe7\xd5\xe7\xd6\xe7\xd7\xe7\xd8\xe7\xd9", /* 4680 */ "\xe7\xda\xe7\xdb\xe7\xdc\xe7\xdd\xe7\xde\xe7\xdf\xe7\xe0\xe7\xe1\xe7\xe2\xe7\xe3\xe7\xe4\xe7\xe5\xe7\xe6\xe7\xe7\xe7\xe8\xe7\xe9\xe7\xea\xe7\xeb\xe7\xec\xe7\xed\xe7\xee\xe7\xef\xe7\xf0\xe7\xf1\xe7\xf2\xe7\xf3\xe7\xf4\xe7\xf5\xe7\xf6\xe7\xf7\xe7\xf8\xe7\xf9\xe7\xfa\xe7\xfb\xe7\xfc\xe7\xfd\xe7\xfe\xe8\x41\xe8\x42\xe8\x43\xe8\x44\xe8\x45\xe8\x46\xe8\x47\xe8\x48\xe8\x49\xe8\x4a\xe8\x4b\xe8\x4c\xe8\x4d\xe8\x4e\xe8\x4f\xe8\x50\xe8\x51\xe8\x52\xe8\x53\xe8\x54\xe8\x55\xe8\x56\xe8\x57\xe8\x58\xe8\x59\xe8\x5a\xe8\x5b\xe8\x5c\xe8\x5d\xe8\x5e\xe8\x5f\xe8\x60\xe8\x61\xe8\x62\xe8\x63\xe8\x64\xe8\x65\xe8\x66\xe8\x67\xe8\x68\xe8\x69\xe8\x6a\xe8\x6b\xe8\x6c\xe8\x6d\xe8\x6e\xe8\x6f\xe8\x70\xe8\x71\xe8\x72\xe8\x73\xe8\x74\xe8\x75\xe8\x76\xe8\x77\xe8\x78\xe8\x79\xe8\x7a\xe8\x7b\xe8\x7c\xe8\x7d\xe8\x7e\xe8\x7f\xe8\x80\xe8\x81\xe8\x82\xe8\x83\xe8\x84\xe8\x85\xe8\x86\xe8\x87\xe8\x88\xe8\x89\xe8\x8a\xe8\x8b\xe8\x8c\xe8\x8d\xe8\x8e\xe8\x8f\xe8\x90\xe8\x91\xe8\x92\xe8\x93\xe8\x94\xe8\x95\xe8\x96\xe8\x97\xe8\x98\xe8\x99\xe8\x9a\xe8\x9b", /* 4700 */ "\xe8\x9c\xe8\x9d\xe8\x9e\xe8\x9f\xe8\xa0\xe8\xa1\xe8\xa2\xe8\xa3\xe8\xa4\xe8\xa5\xe8\xa6\xe8\xa7\xe8\xa8\xe8\xa9\xe8\xaa\xe8\xab\xe8\xac\xe8\xad\xe8\xae\xe8\xaf\xe8\xb0\xe8\xb1\xe8\xb2\xe8\xb3\xe8\xb4\xe8\xb5\xe8\xb6\xe8\xb7\xe8\xb8\xe8\xb9\xe8\xba\xe8\xbb\xe8\xbc\xe8\xbd\xe8\xbe\xce\x86\xe8\xbf\xe8\xc0\xe8\xc1\xe8\xc2\xe8\xc3\xce\x87\xe8\xc4\xe8\xc5\xe8\xc6\xe8\xc7\xe8\xc8\xe8\xc9\xe8\xca\xe8\xcb\xe8\xcc\xe8\xcd\xe8\xce\xe8\xcf\xe8\xd0\xe8\xd1\xe8\xd2\xe8\xd3\xe8\xd4\xe8\xd5\xe8\xd6\xe8\xd7\xe8\xd8\xe8\xd9\xe8\xda\xe8\xdb\xe8\xdc\xe8\xdd\xe8\xde\xe8\xdf\xe8\xe0\xe8\xe1\xe8\xe2\xe8\xe3\xe8\xe4\xe8\xe5\xe8\xe6\xe8\xe7\xe8\xe8\xe8\xe9\xe8\xea\xe8\xeb\xe8\xec\xe8\xed\xe8\xee\xe8\xef\xe8\xf0\xe8\xf1\xe8\xf2\xe8\xf3\xe8\xf4\xe8\xf5\xe8\xf6\xe8\xf7\xe8\xf8\xe8\xf9\xe8\xfa\xe8\xfb\xe8\xfc\xe8\xfd\xe8\xfe\xe9\x41\xe9\x42\xe9\x43\xe9\x44\xe9\x45\xe9\x46\xe9\x47\xe9\x48\xe9\x49\xe9\x4a\xe9\x4b\xe9\x4c\xe9\x4d\xe9\x4e\xe9\x4f\xe9\x50\xe9\x51\xe9\x52\xe9\x53\xe9\x54\xe9\x55\xe9\x56\xe9\x57\xce\x88\xe9\x58\xe9\x59\xe9\x5a", /* 4780 */ "\xe9\x5b\xe9\x5c\xe9\x5d\xe9\x5e\xe9\x5f\xe9\x60\xe9\x61\xe9\x62\xe9\x63\xe9\x64\xe9\x65\xe9\x66\xe9\x67\xce\x89\xe9\x68\xe9\x69\xe9\x6a\xe9\x6b\xe9\x6c\xe9\x6d\xe9\x6e\xe9\x6f\xe9\x70\xe9\x71\xe9\x72\xe9\x73\xe9\x74\xe9\x75\xe9\x76\xe9\x77\xe9\x78\xe9\x79\xe9\x7a\xe9\x7b\xe9\x7c\xe9\x7d\xe9\x7e\xe9\x7f\xe9\x80\xe9\x81\xe9\x82\xe9\x83\xe9\x84\xe9\x85\xe9\x86\xe9\x87\xe9\x88\xe9\x89\xe9\x8a\xe9\x8b\xe9\x8c\xe9\x8d\xe9\x8e\xe9\x8f\xe9\x90\xe9\x91\xe9\x92\xe9\x93\xe9\x94\xe9\x95\xe9\x96\xe9\x97\xe9\x98\xe9\x99\xe9\x9a\xe9\x9b\xe9\x9c\xe9\x9d\xe9\x9e\xe9\x9f\xe9\xa0\xe9\xa1\xe9\xa2\xe9\xa3\xe9\xa4\xe9\xa5\xe9\xa6\xe9\xa7\xe9\xa8\xe9\xa9\xe9\xaa\xe9\xab\xe9\xac\xe9\xad\xe9\xae\xe9\xaf\xe9\xb0\xe9\xb1\xe9\xb2\xe9\xb3\xe9\xb4\xe9\xb5\xe9\xb6\xe9\xb7\xe9\xb8\xe9\xb9\xe9\xba\xe9\xbb\xe9\xbc\xe9\xbd\xe9\xbe\xe9\xbf\xe9\xc0\xe9\xc1\xe9\xc2\xe9\xc3\xe9\xc4\xe9\xc5\xe9\xc6\xe9\xc7\xe9\xc8\xe9\xc9\xe9\xca\xe9\xcb\xe9\xcc\xe9\xcd\xe9\xce\xe9\xcf\xe9\xd0\xe9\xd1\xe9\xd2\xe9\xd3\xe9\xd4\xe9\xd5\xe9\xd6\xe9\xd7\xe9\xd8\xe9\xd9", /* 4800 */ "\xe9\xda\xe9\xdb\xe9\xdc\xe9\xdd\xe9\xde\xe9\xdf\xe9\xe0\xe9\xe1\xe9\xe2\xe9\xe3\xe9\xe4\xe9\xe5\xe9\xe6\xe9\xe7\xe9\xe8\xe9\xe9\xe9\xea\xe9\xeb\xe9\xec\xe9\xed\xe9\xee\xe9\xef\xe9\xf0\xe9\xf1\xe9\xf2\xe9\xf3\xe9\xf4\xe9\xf5\xe9\xf6\xe9\xf7\xe9\xf8\xe9\xf9\xe9\xfa\xe9\xfb\xe9\xfc\xe9\xfd\xe9\xfe\xea\x41\xea\x42\xea\x43\xea\x44\xea\x45\xea\x46\xea\x47\xea\x48\xea\x49\xea\x4a\xea\x4b\xea\x4c\xea\x4d\xea\x4e\xea\x4f\xea\x50\xea\x51\xea\x52\xea\x53\xea\x54\xea\x55\xea\x56\xea\x57\xea\x58\xea\x59\xea\x5a\xea\x5b\xea\x5c\xea\x5d\xea\x5e\xea\x5f\xea\x60\xea\x61\xea\x62\xea\x63\xea\x64\xea\x65\xea\x66\xea\x67\xea\x68\xea\x69\xea\x6a\xea\x6b\xea\x6c\xea\x6d\xea\x6e\xea\x6f\xea\x70\xea\x71\xea\x72\xea\x73\xea\x74\xea\x75\xea\x76\xea\x77\xea\x78\xea\x79\xea\x7a\xea\x7b\xea\x7c\xea\x7d\xea\x7e\xea\x7f\xea\x80\xea\x81\xea\x82\xea\x83\xea\x84\xea\x85\xea\x86\xea\x87\xea\x88\xea\x89\xea\x8a\xea\x8b\xea\x8c\xea\x8d\xea\x8e\xea\x8f\xea\x90\xea\x91\xea\x92\xea\x93\xea\x94\xea\x95\xea\x96\xea\x97\xea\x98\xea\x99\xea\x9a\xea\x9b", /* 4880 */ "\xea\x9c\xea\x9d\xea\x9e\xea\x9f\xea\xa0\xea\xa1\xea\xa2\xea\xa3\xea\xa4\xea\xa5\xea\xa6\xea\xa7\xea\xa8\xea\xa9\xea\xaa\xea\xab\xea\xac\xea\xad\xea\xae\xea\xaf\xea\xb0\xea\xb1\xea\xb2\xea\xb3\xea\xb4\xea\xb5\xea\xb6\xea\xb7\xea\xb8\xea\xb9\xea\xba\xea\xbb\xea\xbc\xea\xbd\xea\xbe\xea\xbf\xea\xc0\xea\xc1\xea\xc2\xea\xc3\xea\xc4\xea\xc5\xea\xc6\xea\xc7\xea\xc8\xea\xc9\xea\xca\xea\xcb\xea\xcc\xea\xcd\xea\xce\xea\xcf\xea\xd0\xea\xd1\xea\xd2\xea\xd3\xea\xd4\xea\xd5\xea\xd6\xea\xd7\xea\xd8\xea\xd9\xea\xda\xea\xdb\xea\xdc\xea\xdd\xea\xde\xea\xdf\xea\xe0\xea\xe1\xea\xe2\xea\xe3\xea\xe4\xea\xe5\xea\xe6\xea\xe7\xea\xe8\xea\xe9\xea\xea\xea\xeb\xea\xec\xea\xed\xea\xee\xea\xef\xea\xf0\xea\xf1\xea\xf2\xea\xf3\xea\xf4\xea\xf5\xea\xf6\xea\xf7\xea\xf8\xea\xf9\xea\xfa\xea\xfb\xea\xfc\xea\xfd\xea\xfe\xeb\x41\xeb\x42\xeb\x43\xeb\x44\xeb\x45\xeb\x46\xeb\x47\xeb\x48\xeb\x49\xeb\x4a\xeb\x4b\xeb\x4c\xeb\x4d\xeb\x4e\xeb\x4f\xeb\x50\xeb\x51\xeb\x52\xeb\x53\xeb\x54\xeb\x55\xeb\x56\xeb\x57\xeb\x58\xeb\x59\xeb\x5a\xeb\x5b\xeb\x5c\xeb\x5d", /* 4900 */ "\xeb\x5e\xeb\x5f\xeb\x60\xeb\x61\xeb\x62\xeb\x63\xeb\x64\xeb\x65\xeb\x66\xeb\x67\xeb\x68\xeb\x69\xeb\x6a\xeb\x6b\xeb\x6c\xeb\x6d\xeb\x6e\xeb\x6f\xeb\x70\xeb\x71\xeb\x72\xeb\x73\xeb\x74\xeb\x75\xeb\x76\xeb\x77\xeb\x78\xeb\x79\xeb\x7a\xeb\x7b\xeb\x7c\xeb\x7d\xeb\x7e\xeb\x7f\xeb\x80\xeb\x81\xeb\x82\xeb\x83\xeb\x84\xeb\x85\xeb\x86\xeb\x87\xeb\x88\xeb\x89\xeb\x8a\xeb\x8b\xeb\x8c\xeb\x8d\xeb\x8e\xeb\x8f\xeb\x90\xeb\x91\xeb\x92\xeb\x93\xeb\x94\xeb\x95\xeb\x96\xeb\x97\xeb\x98\xeb\x99\xeb\x9a\xeb\x9b\xeb\x9c\xeb\x9d\xeb\x9e\xeb\x9f\xeb\xa0\xeb\xa1\xeb\xa2\xeb\xa3\xeb\xa4\xce\x8b\xeb\xa5\xeb\xa6\xeb\xa7\xeb\xa8\xeb\xa9\xeb\xaa\xeb\xab\xeb\xac\xeb\xad\xeb\xae\xeb\xaf\xeb\xb0\xeb\xb1\xeb\xb2\xeb\xb3\xeb\xb4\xeb\xb5\xeb\xb6\xeb\xb7\xeb\xb8\xeb\xb9\xeb\xba\xeb\xbb\xeb\xbc\xeb\xbd\xeb\xbe\xeb\xbf\xeb\xc0\xeb\xc1\xeb\xc2\xeb\xc3\xeb\xc4\xeb\xc5\xeb\xc6\xeb\xc7\xeb\xc8\xeb\xc9\xeb\xca\xeb\xcb\xeb\xcc\xeb\xcd\xeb\xce\xeb\xcf\xeb\xd0\xeb\xd1\xeb\xd2\xeb\xd3\xeb\xd4\xeb\xd5\xeb\xd6\xce\x8c\xeb\xd7\xeb\xd8\xce\x8d\xeb\xd9\xeb\xda", /* 4980 */ "\xeb\xdb\xeb\xdc\xce\x8e\xce\x8f\xeb\xdd\xce\x90\xce\x91\xeb\xde\xeb\xdf\xeb\xe0\xeb\xe1\xeb\xe2\xeb\xe3\xeb\xe4\xeb\xe5\xeb\xe6\xeb\xe7\xeb\xe8\xeb\xe9\xeb\xea\xeb\xeb\xeb\xec\xeb\xed\xeb\xee\xeb\xef\xeb\xf0\xeb\xf1\xce\x93\xeb\xf2\xeb\xf3\xeb\xf4\xce\x92\xeb\xf5\xeb\xf6\xeb\xf7\xeb\xf8\xeb\xf9\xeb\xfa\xeb\xfb\xeb\xfc\xeb\xfd\xeb\xfe\xec\x41\xec\x42\xec\x43\xec\x44\xec\x45\xec\x46\xec\x47\xec\x48\xec\x49\xec\x4a\xec\x4b\xec\x4c\xce\x95\xce\x94\xec\x4d\xec\x4e\xec\x4f\xec\x50\xec\x51\xec\x52\xec\x53\xec\x54\xec\x55\xec\x56\xec\x57\xec\x58\xec\x59\xec\x5a\xec\x5b\xec\x5c\xec\x5d\xec\x5e\xec\x5f\xec\x60\xec\x61\xec\x62\xec\x63\xec\x64\xec\x65\xec\x66\xec\x67\xec\x68\xec\x69\xec\x6a\xec\x6b\xec\x6c\xec\x6d\xec\x6e\xec\x6f\xec\x70\xec\x71\xec\x72\xec\x73\xec\x74\xec\x75\xec\x76\xec\x77\xec\x78\xec\x79\xec\x7a\xec\x7b\xec\x7c\xec\x7d\xec\x7e\xec\x7f\xec\x80\xec\x81\xec\x82\xec\x83\xec\x84\xec\x85\xec\x86\xec\x87\xec\x88\xec\x89\xec\x8a\xec\x8b\xec\x8c\xec\x8d\xec\x8e\xec\x8f\xec\x90\xec\x91\xec\x92\xec\x93\xec\x94", /* 4a00 */ "\xec\x95\xec\x96\xec\x97\xec\x98\xec\x99\xec\x9a\xec\x9b\xec\x9c\xec\x9d\xec\x9e\xec\x9f\xec\xa0\xec\xa1\xec\xa2\xec\xa3\xec\xa4\xec\xa5\xec\xa6\xec\xa7\xec\xa8\xec\xa9\xec\xaa\xec\xab\xec\xac\xec\xad\xec\xae\xec\xaf\xec\xb0\xec\xb1\xec\xb2\xec\xb3\xec\xb4\xec\xb5\xec\xb6\xec\xb7\xec\xb8\xec\xb9\xec\xba\xec\xbb\xec\xbc\xec\xbd\xec\xbe\xec\xbf\xec\xc0\xec\xc1\xec\xc2\xec\xc3\xec\xc4\xec\xc5\xec\xc6\xec\xc7\xec\xc8\xec\xc9\xec\xca\xec\xcb\xec\xcc\xec\xcd\xec\xce\xec\xcf\xec\xd0\xec\xd1\xec\xd2\xec\xd3\xec\xd4\xec\xd5\xec\xd6\xec\xd7\xec\xd8\xec\xd9\xec\xda\xec\xdb\xec\xdc\xec\xdd\xec\xde\xec\xdf\xec\xe0\xec\xe1\xec\xe2\xec\xe3\xec\xe4\xec\xe5\xec\xe6\xec\xe7\xec\xe8\xec\xe9\xec\xea\xec\xeb\xec\xec\xec\xed\xec\xee\xec\xef\xec\xf0\xec\xf1\xec\xf2\xec\xf3\xec\xf4\xec\xf5\xec\xf6\xec\xf7\xec\xf8\xec\xf9\xec\xfa\xec\xfb\xec\xfc\xec\xfd\xec\xfe\xed\x41\xed\x42\xed\x43\xed\x44\xed\x45\xed\x46\xed\x47\xed\x48\xed\x49\xed\x4a\xed\x4b\xed\x4c\xed\x4d\xed\x4e\xed\x4f\xed\x50\xed\x51\xed\x52\xed\x53\xed\x54\xed\x55\xed\x56", /* 4a80 */ "\xed\x57\xed\x58\xed\x59\xed\x5a\xed\x5b\xed\x5c\xed\x5d\xed\x5e\xed\x5f\xed\x60\xed\x61\xed\x62\xed\x63\xed\x64\xed\x65\xed\x66\xed\x67\xed\x68\xed\x69\xed\x6a\xed\x6b\xed\x6c\xed\x6d\xed\x6e\xed\x6f\xed\x70\xed\x71\xed\x72\xed\x73\xed\x74\xed\x75\xed\x76\xed\x77\xed\x78\xed\x79\xed\x7a\xed\x7b\xed\x7c\xed\x7d\xed\x7e\xed\x7f\xed\x80\xed\x81\xed\x82\xed\x83\xed\x84\xed\x85\xed\x86\xed\x87\xed\x88\xed\x89\xed\x8a\xed\x8b\xed\x8c\xed\x8d\xed\x8e\xed\x8f\xed\x90\xed\x91\xed\x92\xed\x93\xed\x94\xed\x95\xed\x96\xed\x97\xed\x98\xed\x99\xed\x9a\xed\x9b\xed\x9c\xed\x9d\xed\x9e\xed\x9f\xed\xa0\xed\xa1\xed\xa2\xed\xa3\xed\xa4\xed\xa5\xed\xa6\xed\xa7\xed\xa8\xed\xa9\xed\xaa\xed\xab\xed\xac\xed\xad\xed\xae\xed\xaf\xed\xb0\xed\xb1\xed\xb2\xed\xb3\xed\xb4\xed\xb5\xed\xb6\xed\xb7\xed\xb8\xed\xb9\xed\xba\xed\xbb\xed\xbc\xed\xbd\xed\xbe\xed\xbf\xed\xc0\xed\xc1\xed\xc2\xed\xc3\xed\xc4\xed\xc5\xed\xc6\xed\xc7\xed\xc8\xed\xc9\xed\xca\xed\xcb\xed\xcc\xed\xcd\xed\xce\xed\xcf\xed\xd0\xed\xd1\xed\xd2\xed\xd3\xed\xd4\xed\xd5\xed\xd6", /* 4b00 */ "\xed\xd7\xed\xd8\xed\xd9\xed\xda\xed\xdb\xed\xdc\xed\xdd\xed\xde\xed\xdf\xed\xe0\xed\xe1\xed\xe2\xed\xe3\xed\xe4\xed\xe5\xed\xe6\xed\xe7\xed\xe8\xed\xe9\xed\xea\xed\xeb\xed\xec\xed\xed\xed\xee\xed\xef\xed\xf0\xed\xf1\xed\xf2\xed\xf3\xed\xf4\xed\xf5\xed\xf6\xed\xf7\xed\xf8\xed\xf9\xed\xfa\xed\xfb\xed\xfc\xed\xfd\xed\xfe\xee\x41\xee\x42\xee\x43\xee\x44\xee\x45\xee\x46\xee\x47\xee\x48\xee\x49\xee\x4a\xee\x4b\xee\x4c\xee\x4d\xee\x4e\xee\x4f\xee\x50\xee\x51\xee\x52\xee\x53\xee\x54\xee\x55\xee\x56\xee\x57\xee\x58\xee\x59\xee\x5a\xee\x5b\xee\x5c\xee\x5d\xee\x5e\xee\x5f\xee\x60\xee\x61\xee\x62\xee\x63\xee\x64\xee\x65\xee\x66\xee\x67\xee\x68\xee\x69\xee\x6a\xee\x6b\xee\x6c\xee\x6d\xee\x6e\xee\x6f\xee\x70\xee\x71\xee\x72\xee\x73\xee\x74\xee\x75\xee\x76\xee\x77\xee\x78\xee\x79\xee\x7a\xee\x7b\xee\x7c\xee\x7d\xee\x7e\xee\x7f\xee\x80\xee\x81\xee\x82\xee\x83\xee\x84\xee\x85\xee\x86\xee\x87\xee\x88\xee\x89\xee\x8a\xee\x8b\xee\x8c\xee\x8d\xee\x8e\xee\x8f\xee\x90\xee\x91\xee\x92\xee\x93\xee\x94\xee\x95\xee\x96\xee\x97\xee\x98", /* 4b80 */ "\xee\x99\xee\x9a\xee\x9b\xee\x9c\xee\x9d\xee\x9e\xee\x9f\xee\xa0\xee\xa1\xee\xa2\xee\xa3\xee\xa4\xee\xa5\xee\xa6\xee\xa7\xee\xa8\xee\xa9\xee\xaa\xee\xab\xee\xac\xee\xad\xee\xae\xee\xaf\xee\xb0\xee\xb1\xee\xb2\xee\xb3\xee\xb4\xee\xb5\xee\xb6\xee\xb7\xee\xb8\xee\xb9\xee\xba\xee\xbb\xee\xbc\xee\xbd\xee\xbe\xee\xbf\xee\xc0\xee\xc1\xee\xc2\xee\xc3\xee\xc4\xee\xc5\xee\xc6\xee\xc7\xee\xc8\xee\xc9\xee\xca\xee\xcb\xee\xcc\xee\xcd\xee\xce\xee\xcf\xee\xd0\xee\xd1\xee\xd2\xee\xd3\xee\xd4\xee\xd5\xee\xd6\xee\xd7\xee\xd8\xee\xd9\xee\xda\xee\xdb\xee\xdc\xee\xdd\xee\xde\xee\xdf\xee\xe0\xee\xe1\xee\xe2\xee\xe3\xee\xe4\xee\xe5\xee\xe6\xee\xe7\xee\xe8\xee\xe9\xee\xea\xee\xeb\xee\xec\xee\xed\xee\xee\xee\xef\xee\xf0\xee\xf1\xee\xf2\xee\xf3\xee\xf4\xee\xf5\xee\xf6\xee\xf7\xee\xf8\xee\xf9\xee\xfa\xee\xfb\xee\xfc\xee\xfd\xee\xfe\xef\x41\xef\x42\xef\x43\xef\x44\xef\x45\xef\x46\xef\x47\xef\x48\xef\x49\xef\x4a\xef\x4b\xef\x4c\xef\x4d\xef\x4e\xef\x4f\xef\x50\xef\x51\xef\x52\xef\x53\xef\x54\xef\x55\xef\x56\xef\x57\xef\x58\xef\x59\xef\x5a", /* 4c00 */ "\xef\x5b\xef\x5c\xef\x5d\xef\x5e\xef\x5f\xef\x60\xef\x61\xef\x62\xef\x63\xef\x64\xef\x65\xef\x66\xef\x67\xef\x68\xef\x69\xef\x6a\xef\x6b\xef\x6c\xef\x6d\xef\x6e\xef\x6f\xef\x70\xef\x71\xef\x72\xef\x73\xef\x74\xef\x75\xef\x76\xef\x77\xef\x78\xef\x79\xef\x7a\xef\x7b\xef\x7c\xef\x7d\xef\x7e\xef\x7f\xef\x80\xef\x81\xef\x82\xef\x83\xef\x84\xef\x85\xef\x86\xef\x87\xef\x88\xef\x89\xef\x8a\xef\x8b\xef\x8c\xef\x8d\xef\x8e\xef\x8f\xef\x90\xef\x91\xef\x92\xef\x93\xef\x94\xef\x95\xef\x96\xef\x97\xef\x98\xef\x99\xef\x9a\xef\x9b\xef\x9c\xef\x9d\xef\x9e\xef\x9f\xef\xa0\xef\xa1\xef\xa2\xef\xa3\xef\xa4\xef\xa5\xef\xa6\xef\xa7\xef\xa8\xef\xa9\xef\xaa\xef\xab\xef\xac\xef\xad\xef\xae\xef\xaf\xef\xb0\xef\xb1\xef\xb2\xef\xb3\xef\xb4\xef\xb5\xef\xb6\xef\xb7\xef\xb8\xef\xb9\xef\xba\xef\xbb\xef\xbc\xef\xbd\xef\xbe\xef\xbf\xef\xc0\xef\xc1\xef\xc2\xef\xc3\xef\xc4\xef\xc5\xef\xc6\xef\xc7\xef\xc8\xef\xc9\xef\xca\xef\xcb\xef\xcc\xef\xcd\xef\xce\xef\xcf\xef\xd0\xef\xd1\xce\x9c\xef\xd2\xef\xd3\xef\xd4\xef\xd5\xef\xd6\xef\xd7\xef\xd8\xef\xd9", /* 4c80 */ "\xef\xda\xef\xdb\xef\xdc\xef\xdd\xef\xde\xef\xdf\xef\xe0\xef\xe1\xef\xe2\xef\xe3\xef\xe4\xef\xe5\xef\xe6\xef\xe7\xef\xe8\xef\xe9\xef\xea\xef\xeb\xef\xec\xef\xed\xef\xee\xef\xef\xef\xf0\xef\xf1\xef\xf2\xef\xf3\xef\xf4\xef\xf5\xef\xf6\xef\xf7\xef\xf8\xce\x99\xce\x9a\xce\x9b\xce\x9d\xce\x98\xef\xf9\xef\xfa\xef\xfb\xef\xfc\xef\xfd\xef\xfe\xf6\x41\xf6\x42\xf6\x43\xf6\x44\xf6\x45\xf6\x46\xf6\x47\xf6\x48\xf6\x49\xf6\x4a\xf6\x4b\xf6\x4c\xf6\x4d\xf6\x4e\xf6\x4f\xf6\x50\xf6\x51\xf6\x52\xf6\x53\xf6\x54\xf6\x55\xf6\x56\xf6\x57\xf6\x58\xf6\x59\xf6\x5a\xf6\x5b\xf6\x5c\xf6\x5d\xf6\x5e\xf6\x5f\xf6\x60\xf6\x61\xf6\x62\xf6\x63\xf6\x64\xf6\x65\xf6\x66\xf6\x67\xf6\x68\xf6\x69\xf6\x6a\xf6\x6b\xf6\x6c\xf6\x6d\xf6\x6e\xf6\x6f\xf6\x70\xf6\x71\xf6\x72\xf6\x73\xf6\x74\xf6\x75\xf6\x76\xf6\x77\xf6\x78\xf6\x79\xf6\x7a\xf6\x7b\xf6\x7c\xf6\x7d\xf6\x7e\xf6\x7f\xf6\x80\xf6\x81\xf6\x82\xf6\x83\xf6\x84\xf6\x85\xf6\x86\xf6\x87\xf6\x88\xf6\x89\xf6\x8a\xf6\x8b\xf6\x8c\xf6\x8d\xf6\x8e\xf6\x8f\xf6\x90\xf6\x91\xf6\x92\xf6\x93\xf6\x94\xf6\x95\xf6\x96", /* 4d00 */ "\xf6\x97\xf6\x98\xf6\x99\xf6\x9a\xf6\x9b\xf6\x9c\xf6\x9d\xf6\x9e\xf6\x9f\xf6\xa0\xf6\xa1\xf6\xa2\xf6\xa3\xf6\xa4\xf6\xa5\xf6\xa6\xf6\xa7\xf6\xa8\xf6\xa9\xce\x9e\xce\x9f\xce\xa0\xce\xa1\xce\xa2\xce\xa3\xce\xa4\xf6\xaa\xf6\xab\xf6\xac\xf6\xad\xf6\xae\xf6\xaf\xf6\xb0\xf6\xb1\xf6\xb2\xf6\xb3\xf6\xb4\xf6\xb5\xf6\xb6\xf6\xb7\xf6\xb8\xf6\xb9\xf6\xba\xf6\xbb\xf6\xbc\xf6\xbd\xf6\xbe\xf6\xbf\xf6\xc0\xf6\xc1\xf6\xc2\xf6\xc3\xf6\xc4\xf6\xc5\xf6\xc6\xf6\xc7\xf6\xc8\xf6\xc9\xf6\xca\xf6\xcb\xf6\xcc\xf6\xcd\xf6\xce\xf6\xcf\xf6\xd0\xf6\xd1\xf6\xd2\xf6\xd3\xf6\xd4\xf6\xd5\xf6\xd6\xf6\xd7\xf6\xd8\xf6\xd9\xf6\xda\xf6\xdb\xf6\xdc\xf6\xdd\xf6\xde\xf6\xdf\xf6\xe0\xf6\xe1\xf6\xe2\xf6\xe3\xf6\xe4\xf6\xe5\xf6\xe6\xf6\xe7\xf6\xe8\xf6\xe9\xf6\xea\xf6\xeb\xf6\xec\xf6\xed\xf6\xee\xf6\xef\xf6\xf0\xf6\xf1\xf6\xf2\xf6\xf3\xf6\xf4\xf6\xf5\xf6\xf6\xf6\xf7\xf6\xf8\xf6\xf9\xf6\xfa\xf6\xfb\xf6\xfc\xf6\xfd\xf6\xfe\xf7\x41\xf7\x42\xf7\x43\xf7\x44\xf7\x45\xf7\x46\xf7\x47\xf7\x48\xf7\x49\xf7\x4a\xf7\x4b\xf7\x4c\xf7\x4d\xf7\x4e\xf7\x4f\xf7\x50\xf7\x51", /* 4d80 */ "\xf7\x52\xf7\x53\xf7\x54\xf7\x55\xf7\x56\xf7\x57\xf7\x58\xf7\x59\xf7\x5a\xf7\x5b\xf7\x5c\xf7\x5d\xf7\x5e\xf7\x5f\xf7\x60\xf7\x61\xf7\x62\xf7\x63\xf7\x64\xf7\x65\xf7\x66\xf7\x67\xf7\x68\xf7\x69\xf7\x6a\xf7\x6b\xf7\x6c\xf7\x6d\xf7\x6e\xf7\x6f\xf7\x70\xf7\x71\xf7\x72\xf7\x73\xf7\x74\xf7\x75\xf7\x76\xf7\x77\xf7\x78\xf7\x79\xf7\x7a\xf7\x7b\xf7\x7c\xf7\x7d\xf7\x7e\xf7\x7f\xce\xa5\xf7\x80\xf7\x81\xf7\x82\xf7\x83\xf7\x84\xf7\x85\xf7\x86\xf7\x87\xf7\x88\xf7\x89\xf7\x8a\xf7\x8b\xf7\x8c\xf7\x8d\xf7\x8e\xf7\x8f\xf7\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4e00 */ "\x59\xba\x4b\xa0\x81\x41\x53\xde\x81\x42\x81\x43\x81\x44\x57\x93\x5b\x69\x54\xfc\x55\x6f\x58\x62\x5c\xa1\x49\xba\x5a\x8c\x81\x45\x5c\xa3\x4a\x94\x81\x46\x5c\x48\x54\x72\x5c\xa6\x55\xbf\x81\x47\x54\x91\x49\x9c\x59\xb4\x4a\xd3\x4b\xaa\x56\x5f\x5c\xa8\x81\x48\x81\x49\x81\x4a\x4b\xa9\x81\x4b\x51\x5d\x59\x6f\x81\x4c\x55\x45\x5c\xac\x81\x4d\x4c\xf5\x59\x5e\x62\x7c\x5b\xcf\x81\x4e\x81\x4f\x4c\x82\x81\x50\x4a\xad\x81\x51\x51\x79\x81\x52\x5c\xbb\x81\x53\x57\x89\x4b\x44\x57\xa9\x5b\xf6\x81\x54\x50\xf5\x4f\xd8\x5c\xae\x81\x55\x81\x56\x81\x57\x52\xca\x81\x58\x4f\xc2\x81\x59\x5c\xb0\x52\x54\x59\xe4\x81\x5a\x5b\xad\x57\xd9\x5b\x47\x4d\xf4\x4c\x46\x50\xd5\x81\x5b\x53\xb8\x53\x72\x54\x67\x81\x5c\x4d\x74\x81\x5d\x4a\x6b\x59\xd1\x81\x5e\x81\x5f\x5c\xbe\x4f\xc4\x53\xf1\x59\xb1\x58\x50\x58\x88\x81\x60\x81\x61\x81\x62\x81\x63\x55\xe8\x81\x64\x81\x65\x5c\xbf\x81\x66\x81\x67\x81\x68\x81\x69\x81\x6a\x81\x6b\x51\xf1\x51\xd1\x81\x6c\x54\xe8\x81\x6d\x81\x6e\x81\x6f\x81\x70\x81\x71\x81\x72\x81\x73\x81\x74\x81\x75\x81\x76\x54\x4c\x81\x77", /* 4e80 */ "\x81\x78\x81\x79\x81\x7a\x81\x7b\x81\x7c\x81\x7d\x51\x6b\x81\x7e\x5a\x89\x5b\x9a\x81\x7f\x55\xc1\x4b\xfd\x5c\xa0\x5a\x7a\x50\x98\x81\x81\x5a\xc5\x4e\x45\x5c\xc0\x57\xe4\x4f\xad\x81\x82\x81\x83\x5c\xa7\x81\x84\x59\x67\x58\xa8\x81\x85\x81\x86\x81\x87\x5c\xbc\x5d\x90\x57\x97\x50\x5a\x81\x88\x4f\x5b\x4d\xa4\x59\xdf\x49\xf9\x4d\xdf\x52\xb5\x81\x89\x58\x8e\x4f\xa8\x57\x44\x51\x61\x81\x8a\x81\x8b\x81\x8c\x54\x77\x5d\x92\x81\x8d\x5d\x95\x81\x8e\x81\x8f\x81\x90\x81\x91\x54\xca\x5c\xe8\x81\x92\x81\x93\x81\x94\x59\xd9\x55\xb1\x54\xc9\x5c\xeb\x5c\xe9\x5c\xc5\x4f\x97\x53\xcc\x4a\x91\x81\x95\x5c\xea\x4f\x92\x4f\x8a\x81\x96\x54\xd3\x4a\xd2\x81\x97\x81\x98\x51\xd7\x81\x99\x49\xd5\x5c\x70\x55\xca\x56\x9c\x5b\x6c\x4c\xb5\x58\x69\x81\x9a\x81\x9b\x81\x9c\x5d\x7a\x5c\xef\x54\x4a\x81\x9d\x5c\xed\x81\x9e\x4a\xf9\x51\x8f\x59\xd3\x81\x9f\x81\xa0\x5c\xec\x81\xa1\x59\xc6\x5c\xee\x52\x67\x81\xa2\x81\xa3\x81\xa4\x59\x97\x81\xa5\x5b\xd8\x5c\xf1\x81\xa6\x5c\xf4\x4e\xfd\x4e\xda\x81\xa7\x81\xa8\x81\xa9\x54\xcd\x81\xaa\x4c\x7d\x81\xab\x4c\x62", /* 4f00 */ "\x81\xac\x53\xf2\x81\xad\x81\xae\x81\xaf\x81\xb0\x81\xb1\x81\xb2\x81\xb3\x5c\xf7\x59\xc0\x81\xb4\x81\xb5\x57\xe8\x4e\xbe\x4c\x9d\x4c\x45\x58\xdc\x81\xb6\x81\xb7\x81\xb8\x81\xb9\x81\xba\x5b\xd9\x5a\x65\x4e\x90\x4e\x82\x5c\xf0\x81\xbb\x81\xbc\x55\x41\x57\xaf\x4a\xaa\x81\xbd\x5c\xf2\x81\xbe\x55\x6b\x5c\xf5\x51\xd6\x5c\xf6\x81\xbf\x81\xc0\x57\xb0\x5c\xf8\x81\xc1\x81\xc2\x81\xc3\x49\xad\x4d\x60\x81\xc4\x5d\x43\x81\xc5\x48\xe8\x81\xc6\x51\x87\x81\xc7\x55\x8d\x81\xc8\x56\x65\x81\xc9\x56\x66\x5d\x44\x81\xca\x81\xcb\x81\xcc\x81\xcd\x81\xce\x4b\x89\x81\xcf\x81\xd0\x4b\x4b\x81\xd1\x81\xd2\x81\xd3\x81\xd4\x81\xd5\x81\xd6\x57\xba\x4b\x6d\x5c\x41\x5c\x95\x5a\x73\x81\xd7\x56\xe4\x81\xd8\x4d\xcd\x81\xd9\x5d\x42\x5d\x7c\x5a\x81\x5c\xfc\x4c\x91\x5c\x98\x5c\xfd\x5c\xf9\x5d\x41\x52\xe2\x81\xda\x81\xdb\x5a\x56\x5c\xf3\x5d\x7d\x81\xdc\x5c\xfa\x81\xdd\x53\x86\x81\xde\x81\xdf\x50\xcf\x81\xe0\x81\xe1\x59\x91\x48\xda\x81\xe2\x81\xe3\x4e\xd0\x5d\x46\x81\xe4\x5d\x45\x81\xe5\x81\xe6\x81\xe7\x81\xe8\x5d\x4c\x5d\x4e\x81\xe9\x5d\x4b\x55\xb8", /* 4f80 */ "\x81\xea\x81\xeb\x81\xec\x5d\x49\x5b\xb5\x81\xed\x81\xee\x81\xef\x4a\x7e\x5d\x48\x81\xf0\x50\xfc\x81\xf1\x55\xcb\x81\xf2\x5d\x4a\x81\xf3\x5d\x47\x81\xf4\x81\xf5\x5d\x50\x81\xf6\x81\xf7\x4b\xb0\x81\xf8\x81\xf9\x81\xfa\x4d\x49\x81\xfb\x59\xbf\x81\xfc\x81\xfd\x58\x60\x82\x41\x82\x42\x51\xc1\x82\x43\x4f\x64\x5b\x8d\x49\xdf\x54\x68\x50\x8c\x5d\x4d\x82\x44\x5d\x4f\x82\x45\x57\xe9\x4d\xed\x82\x46\x82\x47\x82\x48\x82\x49\x82\x4a\x54\x76\x82\x4b\x82\x4c\x82\x4d\x82\x4e\x82\x4f\x82\x50\x82\x51\x82\x52\x82\x53\x49\x84\x82\x54\x82\x55\x82\x56\x4a\xd8\x4b\xec\x5d\x54\x82\x57\x82\x58\x82\x59\x82\x5a\x50\x41\x82\x5b\x82\x5c\x82\x5d\x5d\x7e\x54\x6e\x50\xfd\x5d\x58\x82\x5e\x82\x5f\x82\x60\x82\x61\x82\x62\x56\x77\x4c\x9e\x82\x63\x5d\x55\x82\x64\x5d\x57\x49\x43\x5a\x82\x5d\x59\x82\x65\x58\xc4\x82\x66\x5d\x56\x82\x67\x82\x68\x5d\x51\x82\x69\x5d\x52\x51\x49\x5d\x53\x82\x6a\x82\x6b\x4e\xf2\x58\xdd\x4c\xa8\x82\x6c\x4f\xe2\x82\x6d\x5d\x5d\x82\x6e\x82\x6f\x82\x70\x82\x71\x5d\x5a\x82\x72\x48\xb2\x82\x73\x82\x74\x82\x75\x5d\x62\x82\x76", /* 5000 */ "\x82\x77\x82\x78\x82\x79\x82\x7a\x82\x7b\x82\x7c\x82\x7d\x82\x7e\x82\x7f\x82\x81\x82\x82\x82\x83\x5d\x64\x49\x56\x82\x84\x5d\x5f\x82\x85\x82\x86\x4b\x59\x82\x87\x4f\xf2\x82\x88\x82\x89\x82\x8a\x56\xc7\x4d\xf1\x59\xcf\x82\x8b\x5d\x63\x82\x8c\x82\x8d\x4f\x89\x82\x8e\x4a\x4b\x82\x8f\x82\x90\x82\x91\x5d\x65\x4f\xea\x82\x92\x5d\x66\x5d\x5b\x52\xde\x82\x93\x5d\x5e\x5d\x61\x5d\x60\x82\x94\x82\x95\x82\x96\x82\x97\x82\x98\x82\x99\x82\x9a\x82\x9b\x82\x9c\x82\x9d\x82\x9e\x5b\x4e\x82\x9f\x5b\xb4\x82\xa0\x54\x84\x82\xa1\x82\xa2\x82\xa3\x82\xa4\x5d\x68\x82\xa5\x82\xa6\x82\xa7\x4e\xd8\x5d\x6a\x82\xa8\x82\xa9\x82\xaa\x5d\x5c\x82\xab\x5d\x6b\x53\xaa\x82\xac\x82\xad\x82\xae\x82\xaf\x82\xb0\x5d\x69\x82\xb1\x82\xb2\x82\xb3\x82\xb4\x5c\x97\x82\xb5\x57\x43\x82\xb6\x82\xb7\x82\xb8\x82\xb9\x82\xba\x82\xbb\x82\xbc\x82\xbd\x4f\x41\x82\xbe\x82\xbf\x82\xc0\x82\xc1\x82\xc2\x82\xc3\x5d\x6c\x82\xc4\x82\xc5\x82\xc6\x82\xc7\x82\xc8\x82\xc9\x82\xca\x82\xcb\x82\xcc\x53\x5c\x57\x55\x82\xcd\x82\xce\x82\xcf\x5d\x6d\x82\xd0\x82\xd1\x5d\x67\x4a\x45", /* 5080 */ "\x50\x9f\x82\xd2\x82\xd3\x82\xd4\x82\xd5\x4c\xb4\x82\xd6\x82\xd7\x50\xfb\x82\xd8\x82\xd9\x82\xda\x82\xdb\x48\xf7\x82\xdc\x82\xdd\x82\xde\x82\xdf\x82\xe0\x82\xe1\x82\xe2\x82\xe3\x82\xe4\x82\xe5\x82\xe6\x82\xe7\x82\xe8\x82\xe9\x82\xea\x82\xeb\x82\xec\x82\xed\x82\xee\x82\xef\x82\xf0\x4a\xf5\x82\xf1\x5d\x6e\x82\xf2\x5d\x6f\x4a\xa1\x5d\x70\x82\xf3\x82\xf4\x4a\xde\x82\xf5\x82\xf6\x82\xf7\x82\xf8\x82\xf9\x48\xc0\x82\xfa\x82\xfb\x82\xfc\x82\xfd\x83\x41\x83\x42\x83\x43\x5d\x71\x55\x55\x83\x44\x83\x45\x83\x46\x83\x47\x83\x48\x83\x49\x83\x4a\x83\x4b\x83\x4c\x83\x4d\x83\x4e\x83\x4f\x83\x50\x83\x51\x83\x52\x83\x53\x83\x54\x83\x55\x83\x56\x58\x92\x83\x57\x83\x58\x83\x59\x83\x5a\x83\x5b\x83\x5c\x5d\x72\x83\x5d\x83\x5e\x83\x5f\x51\x65\x83\x60\x83\x61\x83\x62\x83\x63\x83\x64\x83\x65\x83\x66\x83\x67\x83\x68\x83\x69\x83\x6a\x5d\x76\x55\x4e\x83\x6b\x83\x6c\x83\x6d\x83\x6e\x5d\x75\x5d\x74\x5d\x77\x83\x6f\x83\x70\x83\x71\x83\x72\x56\x7b\x83\x73\x4f\x49\x83\x74\x83\x75\x83\x76\x83\x77\x83\x78\x53\xa6\x83\x79\x83\x7a\x83\x7b\x83\x7c", /* 5100 */ "\x83\x7d\x83\x7e\x83\x7f\x83\x81\x83\x82\x83\x83\x5d\x73\x5d\x78\x83\x84\x83\x85\x83\x86\x5d\x79\x83\x87\x83\x88\x83\x89\x83\x8a\x83\x8b\x83\x8c\x54\xe4\x83\x8d\x83\x8e\x83\x8f\x83\x90\x83\x91\x83\x92\x83\x93\x83\x94\x83\x95\x83\x96\x83\x97\x83\x98\x83\x99\x83\x9a\x50\xdb\x83\x9b\x83\x9c\x83\x9d\x83\x9e\x83\x9f\x83\xa0\x83\xa1\x83\xa2\x83\xa3\x83\xa4\x83\xa5\x83\xa6\x83\xa7\x83\xa8\x83\xa9\x83\xaa\x83\xab\x83\xac\x83\xad\x83\xae\x83\xaf\x83\xb0\x83\xb1\x83\xb2\x83\xb3\x83\xb4\x83\xb5\x83\xb6\x83\xb7\x4b\xf8\x5c\xa2\x5a\xc9\x83\xb8\x5a\xa9\x58\xd5\x4a\x85\x5b\x77\x83\xb9\x58\x68\x4d\x83\x83\xba\x50\x6b\x83\xbb\x52\x83\x83\xbc\x83\xbd\x83\xbe\x4b\xd1\x83\xbf\x83\xc0\x57\x63\x5d\x8f\x5d\x91\x83\xc1\x83\xc2\x83\xc3\x4b\x53\x83\xc4\x4b\xb4\x83\xc5\x83\xc6\x83\xc7\x83\xc8\x83\xc9\x4f\xa3\x83\xca\x83\xcb\x54\xea\x83\xcc\x83\xcd\x54\xaa\x83\xce\x83\xcf\x48\xca\x4d\x4b\x51\x9a\x5d\x83\x83\xd0\x50\xbb\x4d\x52\x83\xd1\x4d\x78\x58\xca\x49\x99\x53\xe3\x4f\xde\x4b\x85\x5c\x68\x83\xd2\x59\x99\x4e\xe5\x55\xdd\x83\xd3\x83\xd4", /* 5180 */ "\x4e\xbc\x5d\x87\x5c\xe6\x83\xd5\x83\xd6\x52\xd9\x83\xd7\x83\xd8\x4c\xd3\x54\xbc\x83\xd9\x83\xda\x49\xe0\x5a\xd8\x83\xdb\x83\xdc\x83\xdd\x83\xde\x52\x50\x83\xdf\x83\xe0\x52\x82\x5d\xa1\x54\xde\x83\xe1\x58\xb3\x83\xe2\x4f\xfb\x53\x49\x83\xe3\x83\xe4\x83\xe5\x4d\x7a\x83\xe6\x5d\xa2\x83\xe7\x5a\xa8\x5d\xa3\x83\xe8\x83\xe9\x83\xea\x83\xeb\x83\xec\x5d\x9c\x4b\xab\x83\xed\x83\xee\x4c\x8c\x49\x9a\x5d\x9d\x4a\x86\x4f\xf5\x83\xef\x50\x97\x59\xb0\x50\xe3\x83\xf0\x83\xf1\x83\xf2\x4b\xb2\x5d\x9f\x5d\x9e\x83\xf3\x83\xf4\x4f\xba\x83\xf5\x83\xf6\x83\xf7\x53\xdf\x83\xf8\x5c\x5c\x5d\xa0\x83\xf9\x51\x59\x83\xfa\x4b\x93\x51\x89\x83\xfb\x83\xfc\x4e\xf4\x83\xfd\x4a\xd4\x84\x41\x84\x42\x84\x43\x84\x44\x84\x45\x84\x46\x84\x47\x84\x48\x84\x49\x51\x7d\x84\x4a\x52\xfc\x84\x4b\x84\x4c\x4e\xb7\x4c\x52\x84\x4d\x84\x4e\x4c\x90\x84\x4f\x84\x50\x84\x51\x84\x52\x84\x53\x84\x54\x5d\x8d\x84\x55\x53\xbd\x84\x56\x50\x4d\x4e\x6b\x84\x57\x84\x58\x4b\x6a\x84\x59\x5e\x69\x58\xd6\x84\x5a\x57\x59\x48\xbb\x4a\x97\x4e\x98\x5e\x6a\x4d\xae\x84\x5b\x5a\xe3", /* 5200 */ "\x4b\x56\x4b\x94\x5c\xd5\x54\xcf\x84\x5c\x84\x5d\x4c\x76\x54\x70\x5c\xd6\x84\x5e\x50\x4f\x84\x5f\x84\x60\x5e\x5b\x5c\xd7\x84\x61\x84\x62\x58\xcb\x4e\x4e\x84\x63\x84\x64\x84\x65\x66\x5e\x51\x70\x51\x96\x5a\xf1\x4c\xd4\x4a\xb3\x84\x66\x4a\x96\x84\x67\x84\x68\x55\x5e\x84\x69\x84\x6a\x84\x6b\x53\x70\x84\x6c\x84\x6d\x84\x6e\x53\x79\x50\xfa\x84\x6f\x49\x91\x84\x70\x5c\xd8\x4d\x6e\x84\x71\x4b\x5d\x84\x72\x84\x73\x5c\xd9\x84\x74\x84\x75\x5b\xc5\x56\x42\x54\xae\x55\x52\x4a\xcb\x50\x6c\x84\x76\x4d\x95\x84\x77\x5c\xda\x5c\xdb\x4b\xe6\x4e\xc0\x56\xe9\x84\x78\x84\x79\x84\x7a\x84\x7b\x84\x7c\x84\x7d\x58\x98\x84\x7e\x5c\xdc\x54\x50\x84\x7f\x84\x81\x4d\x70\x4f\x43\x84\x82\x84\x83\x56\xdd\x84\x84\x53\xc9\x84\x85\x84\x86\x84\x87\x84\x88\x84\x89\x5c\xdf\x84\x8a\x5c\xdd\x84\x8b\x84\x8c\x5c\xde\x84\x8d\x84\x8e\x84\x8f\x48\xfd\x84\x90\x4f\xe6\x84\x91\x55\xa2\x4e\xf3\x84\x92\x84\x93\x84\x94\x84\x95\x4c\xb0\x84\x96\x84\x97\x4c\xed\x84\x98\x84\x99\x84\x9a\x84\x9b\x84\x9c\x84\x9d\x84\x9e\x84\x9f\x84\xa0\x84\xa1\x5c\xe1\x84\xa2\x4f\x6b", /* 5280 */ "\x84\xa3\x5c\xe3\x5c\xe2\x84\xa4\x84\xa5\x84\xa6\x84\xa7\x84\xa8\x53\x9d\x84\xa9\x84\xaa\x84\xab\x84\xac\x84\xad\x84\xae\x84\xaf\x5c\xe4\x84\xb0\x84\xb1\x5c\xe5\x84\xb2\x84\xb3\x84\xb4\x84\xb5\x84\xb6\x84\xb7\x84\xb8\x51\x46\x84\xb9\x54\xaf\x48\xeb\x4d\x46\x4e\xd2\x57\xf0\x5e\x5d\x51\x73\x84\xba\x84\xbb\x84\xbc\x84\xbd\x4b\xae\x5b\xf9\x53\x4c\x4f\x79\x5e\x5e\x5e\x5f\x84\xbe\x84\xbf\x84\xc0\x50\xf7\x4f\xa1\x50\xcc\x84\xc1\x84\xc2\x84\xc3\x84\xc4\x84\xc5\x84\xc6\x84\xc7\x84\xc8\x84\xc9\x84\xca\x5e\x60\x55\xc5\x84\xcb\x84\xcc\x84\xcd\x49\xa9\x84\xce\x84\xcf\x84\xd0\x5a\x62\x84\xd1\x52\x84\x84\xd2\x59\x4b\x84\xd3\x84\xd4\x84\xd5\x84\xd6\x5e\x62\x84\xd7\x50\xd4\x84\xd8\x84\xd9\x84\xda\x5e\x63\x84\xdb\x50\x51\x84\xdc\x84\xdd\x84\xde\x84\xdf\x84\xe0\x84\xe1\x52\xbb\x84\xe2\x84\xe3\x84\xe4\x84\xe5\x54\x7a\x84\xe6\x84\xe7\x84\xe8\x84\xe9\x84\xea\x84\xeb\x84\xec\x84\xed\x84\xee\x84\xef\x84\xf0\x5e\x64\x84\xf1\x84\xf2\x84\xf3\x84\xf4\x84\xf5\x84\xf6\x84\xf7\x84\xf8\x5d\x89\x55\x77\x84\xf9\x84\xfa\x84\xfb\x4d\x54\x57\xef", /* 5300 */ "\x5a\xc7\x84\xfc\x84\xfd\x85\x41\x85\x42\x48\xfb\x4a\xd1\x85\x43\x58\xd8\x85\x44\x85\x45\x85\x46\x85\x47\x5d\x8a\x85\x48\x5f\xca\x5d\x8c\x85\x49\x85\x4a\x85\x4b\x85\x4c\x5c\xaf\x4e\x4f\x49\x51\x85\x4d\x4a\x77\x5c\xcd\x85\x4e\x85\x4f\x5a\xd0\x85\x50\x85\x51\x4f\x53\x50\x90\x85\x52\x58\x5b\x85\x53\x85\x54\x5c\xcf\x85\x55\x85\x56\x85\x57\x4c\x6b\x85\x58\x85\x59\x85\x5a\x5c\xd0\x85\x5b\x85\x5c\x85\x5d\x85\x5e\x85\x5f\x85\x60\x85\x61\x85\x62\x85\x63\x85\x64\x53\xa4\x54\x99\x59\xbc\x85\x65\x85\x66\x5c\xd1\x52\xe3\x85\x67\x55\xad\x85\x68\x54\x47\x85\x69\x5c\xa5\x85\x6a\x55\x9e\x57\xe6\x4e\x7c\x48\xea\x85\x6b\x85\x6c\x85\x6d\x4e\x4a\x58\xac\x85\x6e\x49\x50\x5c\x85\x5c\x5f\x85\x6f\x4b\x45\x51\xf3\x52\xce\x85\x70\x85\x71\x49\xa8\x85\x72\x49\xb6\x85\x73\x49\x86\x60\x52\x5b\x5c\x50\x48\x51\xab\x5c\xd4\x51\xb0\x85\x74\x5c\xd3\x57\xd3\x85\x75\x5d\xdf\x85\x76\x57\xbf\x85\x77\x85\x78\x5c\xb3\x52\x4e\x5a\x41\x57\xa2\x85\x79\x4e\xb3\x54\xb3\x51\xd0\x85\x7a\x4f\xec\x58\xb5\x85\x7b\x5d\xe0\x85\x7c\x85\x7d\x85\x7e\x85\x7f\x54\x85", /* 5380 */ "\x85\x81\x85\x82\x4a\x47\x85\x83\x4b\xf1\x56\xfb\x50\xf9\x85\x84\x85\x85\x50\xf6\x85\x86\x59\x59\x59\x82\x5c\xc6\x85\x87\x85\x88\x85\x89\x85\x8a\x85\x8b\x85\x8c\x85\x8d\x49\xdd\x85\x8e\x85\x8f\x50\xe4\x85\x90\x4d\xf0\x85\x91\x85\x92\x5c\xc7\x85\x93\x5a\xac\x85\x94\x85\x95\x58\x82\x5c\xc8\x85\x96\x5c\xc9\x58\x63\x85\x97\x4a\x99\x4f\xc6\x85\x98\x85\x99\x85\x9a\x85\x9b\x5c\xca\x85\x9c\x85\x9d\x85\x9e\x85\x9f\x85\xa0\x85\xa1\x85\xa2\x5e\x6c\x85\xa3\x85\xa4\x85\xa5\x85\xa6\x54\xa4\x85\xa7\x85\xa8\x85\xa9\x58\x78\x85\xaa\x54\xfd\x49\xcd\x85\xab\x85\xac\x85\xad\x85\xae\x85\xaf\x5a\x76\x49\xe5\x4e\xaf\x5a\x71\x56\x4b\x4c\x54\x85\xb0\x85\xb1\x85\xb2\x4c\x42\x85\xb3\x85\xb4\x55\xe4\x85\xb5\x54\xa0\x55\xdb\x49\x85\x58\xef\x85\xb6\x53\x71\x85\xb7\x85\xb8\x85\xb9\x5e\x65\x4b\x9f\x85\xba\x85\xbb\x50\x7a\x4d\x65\x4f\xe3\x51\x8e\x85\xbc\x60\x56\x60\x55\x5b\xba\x4f\x70\x5b\x79\x48\xc7\x4b\xa2\x50\x69\x56\xa7\x60\x53\x55\xb6\x5a\x72\x85\xbd\x5c\xce\x59\xb5\x4d\xc4\x56\x5e\x56\xbd\x85\xbe\x60\x57\x4b\x91\x60\x54\x85\xbf\x85\xc0", /* 5400 */ "\x85\xc1\x5a\x96\x85\xc2\x4a\x74\x4c\xf6\x85\xc3\x60\x5a\x85\xc4\x4d\xce\x4e\xa9\x4b\x96\x85\xc5\x57\x4c\x52\x9c\x4d\xf2\x50\xf3\x57\x62\x58\x93\x60\x58\x58\x65\x85\xc6\x51\xbf\x60\x59\x51\xef\x85\xc7\x85\xc8\x85\xc9\x4f\xfc\x85\xca\x51\x7f\x57\x6c\x59\xf6\x4c\x6d\x60\x61\x85\xcb\x60\x64\x85\xcc\x85\xcd\x4c\x92\x48\xc8\x4b\xd5\x4c\x74\x85\xce\x4d\xab\x56\xfc\x50\x74\x56\x51\x53\xf3\x85\xcf\x5b\xa7\x60\x65\x85\xd0\x57\xe1\x4a\x53\x85\xd1\x85\xd2\x57\xfb\x4a\xb4\x85\xd3\x57\xc6\x4d\xef\x85\xd4\x57\xe0\x85\xd5\x59\x5d\x85\xd6\x85\xd7\x60\x60\x85\xd8\x85\xd9\x4a\xf3\x85\xda\x4a\x6a\x85\xdb\x4c\xe5\x60\x5b\x85\xdc\x85\xdd\x85\xde\x85\xdf\x52\xc4\x85\xe0\x60\x5c\x60\x5d\x60\x5e\x53\x5b\x60\x5f\x60\x62\x5a\xb0\x60\x63\x85\xe1\x54\x5a\x57\xd7\x85\xe2\x85\xe3\x85\xe4\x85\xe5\x85\xe6\x52\xd7\x85\xe7\x60\x6a\x85\xe8\x60\x6f\x85\xe9\x5b\xdb\x85\xea\x85\xeb\x85\xec\x85\xed\x85\xee\x85\xef\x85\xf0\x85\xf1\x60\x69\x60\x7a\x57\xb5\x85\xf2\x4d\xc6\x60\x6e\x60\x68\x53\x7e\x85\xf3\x85\xf4\x55\x8c\x4d\xf3\x52\x9d\x85\xf5\x85\xf6", /* 5480 */ "\x4f\xd6\x85\xf7\x60\x66\x85\xf8\x60\x6d\x85\xf9\x53\x78\x85\xfa\x85\xfb\x85\xfc\x85\xfd\x5b\x46\x4d\xcc\x86\x41\x4f\xcb\x5a\x5d\x4c\xbf\x86\x42\x5b\xe3\x86\x43\x60\x67\x4d\x5e\x50\x47\x86\x44\x86\x45\x51\x9d\x60\x6b\x60\x6c\x86\x46\x60\x70\x86\x47\x86\x48\x86\x49\x86\x4a\x86\x4b\x60\x7b\x60\x86\x86\x4c\x60\x77\x60\x76\x5c\x69\x60\x84\x60\x85\x63\x8c\x59\xa6\x60\x72\x86\x4d\x50\x49\x86\x4e\x5a\xda\x86\x4f\x50\x68\x60\x74\x86\x50\x86\x51\x86\x52\x58\x6c\x86\x53\x86\x54\x60\x7d\x86\x55\x59\x6a\x86\x56\x60\x7e\x48\xa6\x53\xb6\x60\x73\x86\x57\x4d\xe4\x86\x58\x4b\xde\x57\x7b\x4d\x9f\x5a\xd4\x86\x59\x86\x5a\x60\x7f\x58\x8d\x48\xa4\x60\x88\x60\x71\x59\x66\x60\x75\x60\x78\x60\x79\x60\x7c\x86\x5b\x4e\x49\x86\x5c\x60\x81\x60\x82\x86\x5d\x60\x83\x60\x87\x60\x89\x5a\x54\x86\x5e\x86\x5f\x86\x60\x86\x61\x86\x62\x4c\xe6\x53\x56\x60\x8b\x55\x7a\x51\x48\x52\xc3\x86\x63\x86\x64\x50\x7e\x58\x99\x86\x65\x86\x66\x86\x67\x5b\x7c\x60\x8f\x86\x68\x86\x69\x86\x6a\x86\x6b\x86\x6c\x86\x6d\x49\xb7\x86\x6e\x4d\xde\x60\x8d\x86\x6f\x5e\x61", /* 5500 */ "\x86\x70\x59\x85\x86\x71\x86\x72\x86\x73\x86\x74\x56\x95\x4a\xbc\x86\x75\x48\xa5\x86\x76\x86\x77\x86\x78\x86\x79\x86\x7a\x60\x92\x56\xc5\x60\x93\x86\x7b\x86\x7c\x60\x8e\x86\x7d\x86\x7e\x86\x7f\x86\x81\x86\x82\x86\x83\x60\x8a\x86\x84\x86\x85\x86\x86\x86\x87\x60\x8c\x86\x88\x60\x90\x60\x91\x4e\x5d\x86\x89\x86\x8a\x60\x94\x86\x8b\x86\x8c\x60\x95\x86\x8d\x4e\x43\x86\x8e\x55\xda\x57\xa7\x60\xa6\x4a\x4a\x86\x8f\x60\xa5\x86\x90\x86\x91\x86\x92\x60\xa0\x86\x93\x86\x94\x86\x95\x86\x96\x60\x9f\x86\x97\x57\x79\x60\x9d\x86\x98\x60\x9b\x86\x99\x50\x70\x5c\x64\x86\x9a\x55\x6c\x86\x9b\x86\x9c\x60\x99\x48\xa0\x86\x9d\x86\x9e\x86\x9f\x86\xa0\x86\xa1\x60\x9e\x86\xa2\x86\xa3\x86\xa4\x86\xa5\x60\x9c\x60\xa1\x86\xa6\x86\xa7\x86\xa8\x86\xa9\x86\xaa\x60\xa7\x86\xab\x86\xac\x86\xad\x86\xae\x4c\x68\x86\xaf\x86\xb0\x53\xa0\x55\x56\x50\xb1\x60\x96\x86\xb1\x86\xb2\x53\x5e\x86\xb3\x5c\xc3\x60\x9a\x52\xf5\x86\xb4\x86\xb5\x86\xb6\x86\xb7\x86\xb8\x86\xb9\x60\xa2\x60\xa3\x60\xa4\x58\xa4\x86\xba\x86\xbb\x60\xb3\x56\xe3\x86\xbc\x60\xb0\x86\xbd", /* 5580 */ "\x50\x46\x60\xae\x57\xb8\x60\xaa\x55\x66\x86\xbe\x86\xbf\x50\xad\x60\xad\x4d\xec\x4d\xaf\x60\xa8\x86\xc0\x86\xc1\x86\xc2\x60\x97\x86\xc3\x60\xb2\x86\xc4\x86\xc5\x60\xb7\x86\xc6\x86\xc7\x86\xc8\x4a\xac\x60\xb8\x86\xc9\x86\xca\x58\x52\x4d\xc7\x86\xcb\x60\xaf\x86\xcc\x86\xcd\x86\xce\x86\xcf\x86\xd0\x86\xd1\x86\xd2\x58\xf9\x86\xd3\x86\xd4\x86\xd5\x86\xd6\x86\xd7\x86\xd8\x86\xd9\x86\xda\x86\xdb\x60\xab\x86\xdc\x5a\xfa\x86\xdd\x60\x98\x86\xde\x53\x88\x86\xdf\x60\xac\x86\xe0\x5a\x98\x86\xe1\x60\xb5\x60\xb6\x86\xe2\x86\xe3\x86\xe4\x86\xe5\x86\xe6\x60\xc3\x58\xe0\x86\xe7\x86\xe8\x86\xe9\x60\xbb\x86\xea\x86\xeb\x60\xc8\x60\xc9\x86\xec\x86\xed\x86\xee\x60\xbd\x60\xa9\x55\x44\x60\xc0\x86\xef\x60\xb1\x86\xf0\x86\xf1\x86\xf2\x86\xf3\x86\xf4\x55\xc7\x60\xc2\x86\xf5\x60\xb4\x86\xf6\x57\xca\x86\xf7\x56\x63\x60\xcc\x60\xc5\x60\xc1\x86\xf8\x60\xca\x86\xf9\x60\xb9\x60\xbe\x60\xbf\x86\xfa\x86\xfb\x60\xc4\x86\xfc\x86\xfd\x60\xc6\x60\xc7\x87\x41\x60\xcb\x87\x42\x60\xba\x87\x43\x87\x44\x87\x45\x87\x46\x87\x47\x56\x74\x60\xd4\x87\x48", /* 5600 */ "\x60\xd5\x60\xd1\x87\x49\x87\x4a\x87\x4b\x87\x4c\x87\x4d\x87\x4e\x60\xcf\x4e\xcd\x87\x4f\x87\x50\x60\xd0\x87\x51\x4c\xc1\x5c\xc4\x87\x52\x87\x53\x87\x54\x87\x55\x87\x56\x87\x57\x87\x58\x87\x59\x58\xe9\x87\x5a\x87\x5b\x51\xee\x87\x5c\x87\x5d\x60\xce\x60\xbc\x87\x5e\x87\x5f\x87\x60\x60\xd3\x60\xd2\x87\x61\x87\x62\x60\xd6\x87\x63\x87\x64\x87\x65\x87\x66\x60\xdb\x60\xd7\x87\x67\x87\x68\x87\x69\x5b\xf5\x4a\x50\x87\x6a\x5c\x8d\x87\x6b\x56\x5b\x87\x6c\x87\x6d\x60\xd9\x87\x6e\x57\xfa\x87\x6f\x87\x70\x87\x71\x4d\xd8\x87\x72\x87\x73\x87\x74\x87\x75\x87\x76\x87\x77\x87\x78\x87\x79\x87\x7a\x87\x7b\x87\x7c\x87\x7d\x60\xe0\x60\xdc\x59\xac\x87\x7e\x87\x7f\x87\x81\x87\x82\x87\x83\x60\xe1\x87\x84\x87\x85\x60\xda\x60\xd8\x60\xde\x87\x86\x87\x87\x60\xdf\x87\x88\x87\x89\x87\x8a\x87\x8b\x87\x8c\x60\xdd\x87\x8d\x60\xe3\x87\x8e\x87\x8f\x87\x90\x53\xf6\x5c\xab\x5a\xea\x60\xe5\x55\xc8\x87\x91\x87\x92\x87\x93\x87\x94\x60\xe4\x87\x95\x87\x96\x87\x97\x87\x98\x4c\xc0\x87\x99\x87\x9a\x87\x9b\x87\x9c\x60\xe6\x60\xe7\x87\x9d\x87\x9e\x87\x9f", /* 5680 */ "\x87\xa0\x87\xa1\x87\xa2\x87\xa3\x87\xa4\x60\xe8\x60\xe2\x87\xa5\x87\xa6\x87\xa7\x87\xa8\x87\xa9\x87\xaa\x87\xab\x4d\xbe\x56\xe6\x87\xac\x87\xad\x87\xae\x60\xe9\x87\xaf\x87\xb0\x87\xb1\x87\xb2\x87\xb3\x87\xb4\x87\xb5\x87\xb6\x87\xb7\x87\xb8\x87\xb9\x87\xba\x87\xbb\x87\xbc\x87\xbd\x58\x9a\x87\xbe\x87\xbf\x87\xc0\x87\xc1\x87\xc2\x87\xc3\x87\xc4\x87\xc5\x87\xc6\x87\xc7\x87\xc8\x60\xea\x87\xc9\x87\xca\x87\xcb\x87\xcc\x87\xcd\x87\xce\x87\xcf\x54\xc1\x87\xd0\x87\xd1\x87\xd2\x87\xd3\x4f\x60\x87\xd4\x87\xd5\x87\xd6\x87\xd7\x87\xd8\x87\xd9\x87\xda\x87\xdb\x87\xdc\x87\xdd\x87\xde\x87\xdf\x87\xe0\x52\xd1\x87\xe1\x87\xe2\x87\xe3\x87\xe4\x87\xe5\x87\xe6\x87\xe7\x87\xe8\x87\xe9\x60\xeb\x87\xea\x87\xeb\x60\xec\x87\xec\x87\xed\x54\x95\x56\x64\x87\xee\x60\xed\x4e\x78\x5c\xb5\x59\xf1\x60\xee\x57\x65\x87\xef\x4b\xd9\x87\xf0\x87\xf1\x87\xf2\x87\xf3\x87\xf4\x87\xf5\x60\xf0\x87\xf6\x5a\xaf\x87\xf7\x87\xf8\x50\xa6\x4a\xd0\x87\xf9\x87\xfa\x57\xa6\x60\xef\x87\xfb\x87\xfc\x87\xfd\x60\xf1\x4d\x6c\x88\x41\x88\x42\x4d\x9b\x57\x5c\x60\xf2", /* 5700 */ "\x88\x43\x88\x44\x88\x45\x53\xd3\x60\xf3\x88\x46\x5a\xb1\x88\x47\x54\xa5\x60\xf5\x60\xf4\x88\x48\x88\x49\x88\x4a\x88\x4b\x88\x4c\x88\x4d\x88\x4e\x88\x4f\x88\x50\x88\x51\x88\x52\x88\x53\x88\x54\x88\x55\x88\x56\x88\x57\x88\x58\x60\xf6\x88\x59\x88\x5a\x57\x61\x88\x5b\x88\x5c\x88\x5d\x55\xa4\x88\x5e\x88\x5f\x88\x60\x88\x61\x5a\xd9\x5e\x77\x5e\x79\x88\x62\x5e\x78\x4d\x88\x5e\x7c\x5e\x7d\x4b\x78\x88\x63\x88\x64\x5e\x7a\x88\x65\x88\x66\x88\x67\x88\x68\x88\x69\x5e\x7b\x4a\x41\x5e\x7f\x88\x6a\x88\x6b\x4e\x99\x88\x6c\x5b\xb6\x88\x6d\x5e\x81\x88\x6e\x88\x6f\x88\x70\x88\x71\x4f\xf8\x88\x72\x88\x73\x4c\x5b\x88\x74\x5e\x70\x56\xad\x50\x52\x4e\x55\x5c\x99\x50\x73\x88\x75\x88\x76\x88\x77\x88\x78\x88\x79\x50\x8a\x88\x7a\x88\x7b\x4e\xe0\x56\xb2\x5e\x7e\x48\xd2\x57\xea\x4c\x78\x5c\x59\x53\xc1\x88\x7c\x88\x7d\x50\xa3\x88\x7e\x56\xb8\x88\x7f\x5e\x88\x5e\x82\x53\xb9\x5e\x84\x88\x81\x5e\x89\x88\x82\x53\x98\x88\x83\x88\x84\x88\x85\x5e\x8b\x88\x86\x88\x87\x5e\x8a\x50\x60\x88\x88\x88\x89\x88\x8a\x5e\x87\x5e\x86\x88\x8b\x88\x8c\x88\x8d", /* 5780 */ "\x88\x8e\x88\x8f\x4a\xb8\x50\xab\x51\xa1\x5e\x83\x5e\x85\x88\x90\x88\x91\x88\x92\x88\x93\x58\xcc\x5e\x8e\x88\x94\x88\x95\x88\x96\x88\x97\x88\x98\x50\xdc\x5e\x93\x88\x99\x88\x9a\x88\x9b\x88\x9c\x88\x9d\x88\x9e\x88\x9f\x4b\xe1\x88\xa0\x88\xa1\x88\xa2\x88\xa3\x5e\x94\x5e\x72\x4d\x58\x5a\xaa\x5e\x8d\x88\xa4\x50\x71\x5e\x91\x88\xa5\x5e\x71\x88\xa6\x4b\x87\x88\xa7\x5e\x8c\x50\x86\x88\xa8\x88\xa9\x88\xaa\x5e\x8f\x88\xab\x5e\x92\x88\xac\x88\xad\x88\xae\x5e\x9a\x88\xaf\x88\xb0\x88\xb1\x88\xb2\x88\xb3\x88\xb4\x88\xb5\x88\xb6\x88\xb7\x4d\x41\x48\xa2\x88\xb8\x88\xb9\x88\xba\x88\xbb\x88\xbc\x88\xbd\x88\xbe\x51\xf0\x88\xbf\x88\xc0\x4a\x67\x5e\x90\x88\xc1\x88\xc2\x5e\x99\x88\xc3\x53\xd1\x5e\x95\x88\xc4\x88\xc5\x5e\x96\x5e\x98\x5e\x97\x88\xc6\x88\xc7\x5e\x9f\x88\xc8\x5a\x93\x49\xb9\x88\xc9\x88\xca\x88\xcb\x5e\x9e\x88\xcc\x88\xcd\x88\xce\x88\xcf\x88\xd0\x88\xd1\x88\xd2\x88\xd3\x5e\xa3\x88\xd4\x5e\x9c\x88\xd5\x88\xd6\x88\xd7\x88\xd8\x5e\x9b\x88\xd9\x88\xda\x88\xdb\x5e\x9d\x53\x81\x4e\x9a\x88\xdc\x88\xdd\x5e\xa2\x88\xde\x88\xdf", /* 5800 */ "\x5e\xa4\x88\xe0\x56\xc2\x88\xe1\x88\xe2\x88\xe3\x4b\xd0\x5f\x60\x88\xe4\x88\xe5\x88\xe6\x5e\xa0\x88\xe7\x5e\xa1\x88\xe8\x88\xe9\x88\xea\x54\x55\x88\xeb\x88\xec\x88\xed\x4b\xe8\x88\xee\x88\xef\x88\xf0\x5e\xa6\x88\xf1\x88\xf2\x88\xf3\x88\xf4\x5e\xa5\x88\xf5\x5e\xa8\x49\x44\x88\xf6\x88\xf7\x4b\x6c\x88\xf8\x88\xf9\x88\xfa\x88\xfb\x88\xfc\x50\x50\x88\xfd\x89\x41\x89\x42\x89\x43\x89\x44\x59\x7f\x89\x45\x89\x46\x89\x47\x89\x48\x4b\xc1\x89\x49\x89\x4a\x89\x4b\x89\x4c\x89\x4d\x89\x4e\x89\x4f\x89\x50\x89\x51\x89\x52\x89\x53\x89\x54\x89\x55\x89\x56\x5e\xa7\x89\x57\x89\x58\x89\x59\x89\x5a\x89\x5b\x89\x5c\x89\x5d\x56\x9b\x66\x94\x89\x5e\x89\x5f\x89\x60\x56\x7c\x89\x61\x89\x62\x56\x9f\x89\x63\x89\x64\x89\x65\x56\xc0\x89\x66\x89\x67\x89\x68\x89\x69\x89\x6a\x54\xfa\x89\x6b\x89\x6c\x89\x6d\x89\x6e\x89\x6f\x89\x70\x5e\xa9\x89\x71\x89\x72\x89\x73\x89\x74\x89\x75\x56\xed\x5e\xaa\x89\x76\x89\x77\x89\x78\x89\x79\x89\x7a\x89\x7b\x89\x7c\x89\x7d\x89\x7e\x89\x7f\x89\x81\x89\x82\x89\x83\x89\x84\x89\x85\x89\x86\x89\x87\x5e\x73\x89\x88", /* 5880 */ "\x5e\xae\x5e\xab\x89\x89\x4f\xb2\x89\x8a\x55\xfa\x89\x8b\x89\x8c\x89\x8d\x5e\xac\x89\x8e\x89\x8f\x89\x90\x89\x91\x89\x92\x89\x93\x89\x94\x89\x95\x55\x6a\x52\xb8\x89\x96\x89\x97\x89\x98\x89\x99\x89\x9a\x54\x5d\x5e\xad\x89\x9b\x89\x9c\x89\x9d\x5a\xf5\x58\xe5\x89\x9e\x89\x9f\x89\xa0\x89\xa1\x89\xa2\x89\xa3\x89\xa4\x89\xa5\x52\xaa\x4b\xd4\x89\xa6\x89\xa7\x89\xa8\x89\xa9\x89\xaa\x89\xab\x89\xac\x89\xad\x89\xae\x89\xaf\x89\xb0\x89\xb1\x89\xb2\x89\xb3\x89\xb4\x89\xb5\x89\xb6\x89\xb7\x5e\x74\x89\xb8\x89\xb9\x89\xba\x89\xbb\x49\x7a\x89\xbc\x89\xbd\x89\xbe\x5e\x75\x89\xbf\x89\xc0\x89\xc1\x89\xc2\x89\xc3\x89\xc4\x89\xc5\x89\xc6\x89\xc7\x89\xc8\x89\xc9\x5e\x76\x89\xca\x89\xcb\x89\xcc\x4d\xbd\x89\xcd\x89\xce\x89\xcf\x89\xd0\x89\xd1\x89\xd2\x89\xd3\x89\xd4\x89\xd5\x89\xd6\x89\xd7\x89\xd8\x89\xd9\x89\xda\x54\xbf\x89\xdb\x89\xdc\x89\xdd\x89\xde\x89\xdf\x89\xe0\x55\xbe\x54\xc8\x89\xe1\x5c\x53\x89\xe2\x55\x9a\x89\xe3\x89\xe4\x50\x67\x89\xe5\x89\xe6\x4d\xf7\x89\xe7\x89\xe8\x59\xbb\x89\xe9\x89\xea\x89\xeb\x89\xec\x89\xed\x89\xee", /* 5900 */ "\x89\xef\x89\xf0\x61\xb9\x89\xf1\x4a\xa5\x89\xf2\x89\xf3\x49\x58\x89\xf4\x89\xf5\x89\xf6\x89\xf7\x89\xf8\x4c\xb3\x89\xf9\x58\x64\x89\xfa\x89\xfb\x89\xfc\x89\xfd\x5d\x88\x58\x46\x57\x83\x8a\x41\x8a\x42\x5d\x8e\x4b\xdf\x8a\x43\x59\xb8\x8a\x44\x8a\x45\x4d\x5b\x8a\x46\x8a\x47\x8a\x48\x8a\x49\x61\xb8\x61\xb6\x8a\x4a\x4a\xf2\x8a\x4b\x56\xeb\x56\xaa\x4c\x93\x8a\x4c\x5c\xb1\x59\x8c\x4d\xba\x8a\x4d\x55\xa6\x8a\x4e\x8a\x4f\x57\x57\x8a\x50\x8a\x51\x59\xc3\x50\x85\x4e\xcf\x4b\xe0\x8a\x52\x5f\xc4\x8a\x53\x8a\x54\x8a\x55\x8a\x56\x5f\xc5\x5e\x5c\x8a\x57\x59\x79\x8a\x58\x8a\x59\x53\xe5\x52\xcd\x4c\x8f\x8a\x5a\x4c\x7c\x8a\x5b\x8a\x5c\x50\x9d\x5c\x81\x8a\x5d\x53\xf4\x8a\x5e\x8a\x5f\x49\x5c\x5f\xc7\x4f\x51\x56\xd6\x5f\xc9\x8a\x60\x5f\xc8\x8a\x61\x8a\x62\x8a\x63\x8a\x64\x8a\x65\x4b\x8d\x8a\x66\x55\x7d\x8a\x67\x8a\x68\x48\xc1\x8a\x69\x8a\x6a\x8a\x6b\x8a\x6c\x8a\x6d\x8a\x6e\x8a\x6f\x8a\x70\x8a\x71\x8a\x72\x8a\x73\x8a\x74\x8a\x75\x53\x4e\x53\x4b\x8a\x76\x52\xcb\x8a\x77\x4e\xe8\x56\x9e\x8a\x78\x8a\x79\x8a\x7a\x4d\xc2\x8a\x7b\x8a\x7c", /* 5980 */ "\x8a\x7d\x63\x9a\x54\xe6\x63\x9b\x57\x9e\x8a\x7e\x5c\x51\x4c\xbd\x51\xe7\x8a\x7f\x54\xd0\x8a\x81\x8a\x82\x63\x9c\x8a\x83\x8a\x84\x8a\x85\x8a\x86\x4b\xc9\x4e\xca\x8a\x87\x8a\x88\x59\x9e\x63\xa0\x8a\x89\x52\x8f\x8a\x8a\x8a\x8b\x8a\x8c\x8a\x8d\x63\xa3\x8a\x8e\x8a\x8f\x8a\x90\x8a\x91\x63\x9f\x63\xa4\x57\x77\x8a\x92\x8a\x93\x4c\x61\x63\x9d\x63\x9e\x63\xa2\x8a\x94\x8a\x95\x52\xdc\x63\xa7\x8a\x96\x8a\x97\x63\xa6\x8a\x98\x8a\x99\x8a\x9a\x8a\x9b\x8a\x9c\x8a\x9d\x52\x63\x8a\x9e\x53\xdd\x8a\x9f\x8a\xa0\x63\xa9\x8a\xa1\x8a\xa2\x8a\xa3\x8a\xa4\x8a\xa5\x8a\xa6\x8a\xa7\x52\xb6\x8a\xa8\x8a\xa9\x8a\xaa\x63\xa1\x55\xbb\x8a\xab\x8a\xac\x8a\xad\x8a\xae\x4f\x84\x4d\x63\x63\xa5\x58\xd4\x57\xae\x8a\xaf\x8a\xb0\x63\xa8\x63\xaf\x8a\xb1\x59\xa5\x8a\xb2\x4f\x4a\x63\xac\x8a\xb3\x8a\xb4\x8a\xb5\x8a\xb6\x8a\xb7\x63\xae\x8a\xb8\x50\xd0\x8a\xb9\x8a\xba\x59\xcb\x8a\xbb\x8a\xbc\x8a\xbd\x4e\xa6\x8a\xbe\x8a\xbf\x8a\xc0\x8a\xc1\x8a\xc2\x8a\xc3\x8a\xc4\x8a\xc5\x8a\xc6\x8a\xc7\x8a\xc8\x8a\xc9\x63\xb0\x8a\xca\x59\xf5\x8a\xcb\x8a\xcc\x8a\xcd\x5c\x6b", /* 5a00 */ "\x8a\xce\x57\x9f\x8a\xcf\x57\x7e\x51\xa5\x63\xaa\x63\xab\x4f\x5f\x63\xad\x63\xb2\x8a\xd0\x8a\xd1\x63\xb1\x8a\xd2\x8a\xd3\x8a\xd4\x8a\xd5\x63\xb5\x8a\xd6\x63\xb7\x8a\xd7\x8a\xd8\x8a\xd9\x8a\xda\x52\xee\x8a\xdb\x8a\xdc\x8a\xdd\x52\xc7\x8a\xde\x8a\xdf\x4f\xe9\x55\x90\x8a\xe0\x8a\xe1\x63\xb6\x8a\xe2\x4b\xef\x8a\xe3\x8a\xe4\x8a\xe5\x52\x85\x8a\xe6\x8a\xe7\x8a\xe8\x8a\xe9\x8a\xea\x8a\xeb\x8a\xec\x5a\x8a\x63\xb3\x8a\xed\x63\xb4\x8a\xee\x54\xa1\x8a\xef\x8a\xf0\x8a\xf1\x8a\xf2\x8a\xf3\x63\xbc\x8a\xf4\x8a\xf5\x8a\xf6\x63\xb8\x8a\xf7\x8a\xf8\x8a\xf9\x8a\xfa\x8a\xfb\x53\xc4\x8a\xfc\x8a\xfd\x57\x92\x63\xba\x8b\x41\x8b\x42\x8b\x43\x8b\x44\x8b\x45\x8b\x46\x8b\x47\x8b\x48\x8b\x49\x8b\x4a\x63\xbb\x8b\x4b\x8b\x4c\x8b\x4d\x8b\x4e\x4e\x8a\x8b\x4f\x8b\x50\x8b\x51\x8b\x52\x8b\x53\x8b\x54\x8b\x55\x63\xbd\x8b\x56\x8b\x57\x8b\x58\x8b\x59\x63\xb9\x8b\x5a\x8b\x5b\x50\xb6\x8b\x5c\x8b\x5d\x8b\x5e\x8b\x5f\x8b\x60\x8b\x61\x8b\x62\x8b\x63\x8b\x64\x5a\x44\x63\xbe\x55\x95\x63\xc2\x8b\x65\x8b\x66\x63\xc3\x8b\x67\x8b\x68\x8b\x69\x8b\x6a\x58\xf5", /* 5a80 */ "\x8b\x6b\x8b\x6c\x8b\x6d\x8b\x6e\x8b\x6f\x8b\x70\x8b\x71\x8b\x72\x8b\x73\x8b\x74\x8b\x75\x8b\x76\x8b\x77\x8b\x78\x8b\x79\x8b\x7a\x8b\x7b\x8b\x7c\x52\x5d\x8b\x7d\x8b\x7e\x8b\x7f\x8b\x81\x8b\x82\x8b\x83\x8b\x84\x52\x64\x63\xc1\x8b\x85\x8b\x86\x8b\x87\x8b\x88\x8b\x89\x8b\x8a\x8b\x8b\x8b\x8c\x8b\x8d\x8b\x8e\x8b\x8f\x8b\x90\x8b\x91\x8b\x92\x63\xc0\x8b\x93\x8b\x94\x8b\x95\x8b\x96\x8b\x97\x8b\x98\x8b\x99\x63\xc6\x58\x51\x8b\x9a\x66\x95\x8b\x9b\x8b\x9c\x63\xc9\x8b\x9d\x8b\x9e\x8b\x9f\x8b\xa0\x8b\xa1\x63\xc4\x8b\xa2\x8b\xa3\x4e\xdd\x55\x49\x8b\xa4\x8b\xa5\x8b\xa6\x8b\xa7\x8b\xa8\x8b\xa9\x4e\xb4\x8b\xaa\x8b\xab\x58\x73\x8b\xac\x8b\xad\x8b\xae\x8b\xaf\x8b\xb0\x63\xc7\x8b\xb1\x63\xc8\x8b\xb2\x63\xcd\x8b\xb3\x63\xcf\x8b\xb4\x8b\xb5\x8b\xb6\x63\xd0\x8b\xb7\x8b\xb8\x8b\xb9\x63\xca\x4b\x75\x8b\xba\x63\xcb\x8b\xbb\x8b\xbc\x63\xce\x8b\xbd\x8b\xbe\x52\xda\x8b\xbf\x63\xc5\x8b\xc0\x8b\xc1\x8b\xc2\x8b\xc3\x8b\xc4\x63\xcc\x8b\xc5\x8b\xc6\x8b\xc7\x8b\xc8\x8b\xc9\x8b\xca\x8b\xcb\x8b\xcc\x8b\xcd\x8b\xce\x8b\xcf\x8b\xd0\x8b\xd1\x8b\xd2", /* 5b00 */ "\x8b\xd3\x8b\xd4\x8b\xd5\x8b\xd6\x8b\xd7\x8b\xd8\x8b\xd9\x8b\xda\x8b\xdb\x63\xd1\x8b\xdc\x8b\xdd\x8b\xde\x8b\xdf\x8b\xe0\x8b\xe1\x8b\xe2\x8b\xe3\x8b\xe4\x8b\xe5\x8b\xe6\x8b\xe7\x63\xd3\x63\xd2\x8b\xe8\x8b\xe9\x8b\xea\x8b\xeb\x8b\xec\x8b\xed\x8b\xee\x8b\xef\x8b\xf0\x8b\xf1\x8b\xf2\x8b\xf3\x8b\xf4\x8b\xf5\x8b\xf6\x8b\xf7\x8b\xf8\x8b\xf9\x8b\xfa\x8b\xfb\x8b\xfc\x8b\xfd\x8c\x41\x8c\x42\x8c\x43\x8c\x44\x63\xd4\x8c\x45\x5d\x99\x8c\x46\x8c\x47\x63\xd5\x8c\x48\x8c\x49\x8c\x4a\x8c\x4b\x8c\x4c\x8c\x4d\x8c\x4e\x8c\x4f\x63\xd6\x8c\x50\x8c\x51\x8c\x52\x8c\x53\x8c\x54\x8c\x55\x8c\x56\x8c\x57\x8c\x58\x8c\x59\x8c\x5a\x8c\x5b\x8c\x5c\x8c\x5d\x8c\x5e\x5c\x73\x63\xdc\x8c\x5f\x63\xdd\x50\x77\x5a\xcf\x8c\x60\x5c\x76\x4a\xe5\x56\x90\x63\xd9\x5c\xc2\x5c\x6e\x58\xa1\x8c\x61\x52\x6f\x8c\x62\x8c\x63\x63\xde\x4e\xbd\x4d\x62\x63\xda\x59\x47\x8c\x64\x8c\x65\x4d\xa1\x51\xce\x8c\x66\x5c\xaa\x8c\x67\x8c\x68\x8c\x69\x55\xea\x63\x8f\x8c\x6a\x63\xdb\x8c\x6b\x4c\x96\x8c\x6c\x8c\x6d\x8c\x6e\x8c\x6f\x54\xe5\x8c\x70\x8c\x71\x52\xf4\x8c\x72\x8c\x73", /* 5b80 */ "\x63\x52\x52\xfd\x8c\x74\x56\x9d\x63\x53\x5b\x4c\x8c\x75\x5a\x8f\x55\xd7\x48\xb1\x8c\x76\x56\x6e\x57\x8b\x8c\x77\x8c\x78\x4d\xe9\x8c\x79\x8c\x7a\x8c\x7b\x63\x55\x8c\x7c\x63\x54\x8c\x7d\x5c\x7a\x4d\x79\x5b\xe5\x4b\xa7\x57\x91\x59\xca\x49\x46\x55\xb4\x8c\x7e\x4a\x89\x55\x94\x50\x6d\x58\xfa\x55\xd1\x63\x56\x4e\x62\x8c\x7f\x8c\x81\x8c\x82\x58\x7c\x4d\x4c\x8c\x83\x8c\x84\x8c\x85\x8c\x86\x5a\xd6\x8c\x87\x8c\x88\x4d\xa5\x59\x88\x58\x9d\x4e\xd1\x8c\x89\x63\x57\x54\xdc\x8c\x8a\x8c\x8b\x8c\x8c\x50\x8e\x49\x97\x56\x7e\x8c\x8d\x8c\x8e\x4e\xc4\x8c\x8f\x4e\xc3\x59\xf9\x52\x7c\x50\x7c\x8c\x90\x8c\x91\x8c\x92\x8c\x93\x4c\xba\x8c\x94\x8c\x95\x8c\x96\x52\x62\x8c\x97\x4d\xad\x5a\xa1\x8c\x98\x8c\x99\x8c\x9a\x8c\x9b\x8c\x9c\x8c\x9d\x8c\x9e\x8c\x9f\x8c\xa0\x54\x7e\x52\xae\x49\xeb\x8c\xa1\x4d\x71\x8c\xa2\x8c\xa3\x63\x5b\x51\x68\x8c\xa4\x8c\xa5\x5b\x4f\x8c\xa6\x8c\xa7\x8c\xa8\x8c\xa9\x8c\xaa\x63\x5c\x8c\xab\x63\x5e\x8c\xac\x8c\xad\x8c\xae\x8c\xaf\x8c\xb0\x8c\xb1\x8c\xb2\x4a\xe6\x4b\xd3\x56\x62\x59\x50\x4b\x5c\x8c\xb3\x8c\xb4\x55\xd8", /* 5c00 */ "\x8c\xb5\x4c\x83\x8c\xb6\x8c\xb7\x55\x85\x8c\xb8\x4f\x4b\x8c\xb9\x8c\xba\x57\xbd\x5c\x91\x8c\xbb\x8c\xbc\x8c\xbd\x8c\xbe\x58\xa0\x8c\xbf\x55\x79\x8c\xc0\x8c\xc1\x4b\xfa\x63\xd7\x4e\xe1\x8c\xc2\x4a\x5e\x8c\xc3\x55\x70\x8c\xc4\x63\xd8\x4a\x42\x8c\xc5\x8c\xc6\x8c\xc7\x8c\xc8\x5f\xcb\x8c\xc9\x5a\x68\x5f\xcc\x8c\xca\x59\xa1\x8c\xcb\x8c\xcc\x8c\xcd\x8c\xce\x5f\xcd\x8c\xcf\x8c\xd0\x8c\xd1\x8c\xd2\x4f\xcc\x8c\xd3\x8c\xd4\x5f\xce\x8c\xd5\x8c\xd6\x8c\xd7\x55\xab\x59\xfb\x4a\x7f\x63\x8b\x52\xe0\x4f\xa0\x57\xb1\x52\xf1\x4f\xd5\x53\xa7\x49\xe2\x8c\xd8\x8c\xd9\x4f\xd2\x8c\xda\x8c\xdb\x54\x9d\x56\xea\x4f\x8d\x57\xdc\x8c\xdc\x8c\xdd\x55\xb9\x53\xc0\x63\x8d\x58\xbb\x8c\xde\x8c\xdf\x8c\xe0\x5b\x59\x8c\xe1\x8c\xe2\x8c\xe3\x63\x8e\x8c\xe4\x8c\xe5\x8c\xe6\x8c\xe7\x55\xf3\x8c\xe8\x57\x60\x51\xc4\x8c\xe9\x63\x90\x8c\xea\x51\xc3\x63\x91\x8c\xeb\x8c\xec\x8c\xed\x8c\xee\x8c\xef\x8c\xf0\x8c\xf1\x63\x99\x57\x6d\x8c\xf2\x55\x5d\x8c\xf3\x8c\xf4\x8c\xf5\x8c\xf6\x8c\xf7\x8c\xf8\x8c\xf9\x59\xd8\x61\x48\x8c\xfa\x8c\xfb\x8c\xfc\x8c\xfd\x5a\x8d", /* 5c80 */ "\x8d\x41\x56\x8b\x53\xf0\x8d\x42\x8d\x43\x8d\x44\x8d\x45\x8d\x46\x61\x4c\x8d\x47\x8d\x48\x8d\x49\x61\x47\x61\x49\x8d\x4a\x8d\x4b\x61\x4a\x61\x4f\x8d\x4c\x8d\x4d\x49\xec\x8d\x4e\x61\x4b\x4c\xd9\x61\x4d\x61\x4e\x61\x50\x4b\x5a\x61\x51\x8d\x4f\x8d\x50\x8d\x51\x8d\x52\x8d\x53\x61\x53\x61\x58\x8d\x54\x8d\x55\x8d\x56\x8d\x57\x8d\x58\x59\x72\x8d\x59\x61\x56\x61\x55\x51\x8c\x8d\x5a\x8d\x5b\x8d\x5c\x61\x57\x8d\x5d\x5a\xbf\x8d\x5e\x61\x52\x8d\x5f\x61\x5a\x48\xb5\x8d\x60\x8d\x61\x8d\x62\x8d\x63\x61\x54\x8d\x64\x50\x9a\x8d\x65\x61\x59\x8d\x66\x8d\x67\x61\x5b\x8d\x68\x8d\x69\x8d\x6a\x8d\x6b\x8d\x6c\x8d\x6d\x61\x5e\x8d\x6e\x8d\x6f\x8d\x70\x8d\x71\x8d\x72\x8d\x73\x61\x5c\x8d\x74\x8d\x75\x8d\x76\x8d\x77\x8d\x78\x8d\x79\x5b\xc4\x8d\x7a\x8d\x7b\x8d\x7c\x8d\x7d\x8d\x7e\x8d\x7f\x8d\x81\x58\x5f\x8d\x82\x8d\x83\x61\x5d\x61\x5f\x51\xcc\x8d\x84\x4b\xea\x8d\x85\x5a\x99\x8d\x86\x8d\x87\x54\x6d\x8d\x88\x8d\x89\x4c\x86\x8d\x8a\x8d\x8b\x8d\x8c\x8d\x8d\x8d\x8e\x8d\x8f\x8d\x90\x8d\x91\x8d\x92\x8d\x93\x4f\xfd\x8d\x94\x8d\x95\x8d\x96\x8d\x97", /* 5d00 */ "\x8d\x98\x8d\x99\x61\x60\x61\x61\x8d\x9a\x8d\x9b\x61\x67\x4a\x88\x8d\x9c\x8d\x9d\x8d\x9e\x8d\x9f\x8d\xa0\x8d\xa1\x53\xe8\x8d\xa2\x8d\xa3\x8d\xa4\x8d\xa5\x8d\xa6\x4a\xdd\x8d\xa7\x59\x62\x8d\xa8\x8d\xa9\x8d\xaa\x8d\xab\x61\x68\x8d\xac\x8d\xad\x61\x66\x8d\xae\x8d\xaf\x8d\xb0\x8d\xb1\x8d\xb2\x61\x65\x8d\xb3\x61\x63\x61\x62\x8d\xb4\x49\x60\x8d\xb5\x8d\xb6\x8d\xb7\x5b\x58\x61\x64\x8d\xb8\x8d\xb9\x8d\xba\x8d\xbb\x8d\xbc\x61\x6b\x8d\xbd\x8d\xbe\x8d\xbf\x8d\xc0\x8d\xc1\x8d\xc2\x8d\xc3\x8d\xc4\x61\x6c\x61\x6a\x8d\xc5\x8d\xc6\x8d\xc7\x8d\xc8\x8d\xc9\x8d\xca\x8d\xcb\x8d\xcc\x68\x9b\x8d\xcd\x8d\xce\x61\x73\x61\x72\x54\x56\x8d\xcf\x8d\xd0\x8d\xd1\x8d\xd2\x8d\xd3\x8d\xd4\x8d\xd5\x8d\xd6\x8d\xd7\x8d\xd8\x8d\xd9\x61\x69\x8d\xda\x8d\xdb\x61\x6e\x8d\xdc\x61\x70\x8d\xdd\x8d\xde\x8d\xdf\x8d\xe0\x8d\xe1\x8d\xe2\x8d\xe3\x8d\xe4\x8d\xe5\x8d\xe6\x8d\xe7\x61\x74\x8d\xe8\x61\x71\x61\x6d\x8d\xe9\x8d\xea\x61\x6f\x8d\xeb\x8d\xec\x8d\xed\x8d\xee\x61\x75\x8d\xef\x8d\xf0\x8d\xf1\x8d\xf2\x8d\xf3\x8d\xf4\x8d\xf5\x8d\xf6\x8d\xf7\x8d\xf8\x8d\xf9", /* 5d80 */ "\x8d\xfa\x8d\xfb\x61\x76\x8d\xfc\x8d\xfd\x8e\x41\x8e\x42\x8e\x43\x8e\x44\x8e\x45\x8e\x46\x8e\x47\x8e\x48\x8e\x49\x8e\x4a\x8e\x4b\x8e\x4c\x8e\x4d\x8e\x4e\x8e\x4f\x8e\x50\x8e\x51\x8e\x52\x8e\x53\x8e\x54\x61\x77\x8e\x55\x8e\x56\x8e\x57\x61\x78\x8e\x58\x8e\x59\x8e\x5a\x8e\x5b\x8e\x5c\x8e\x5d\x8e\x5e\x8e\x5f\x8e\x60\x8e\x61\x8e\x62\x8e\x63\x8e\x64\x8e\x65\x8e\x66\x8e\x67\x8e\x68\x8e\x69\x8e\x6a\x8e\x6b\x8e\x6c\x8e\x6d\x8e\x6e\x8e\x6f\x8e\x70\x61\x7a\x8e\x71\x8e\x72\x8e\x73\x8e\x74\x8e\x75\x8e\x76\x8e\x77\x8e\x78\x8e\x79\x8e\x7a\x8e\x7b\x8e\x7c\x8e\x7d\x61\x7b\x8e\x7e\x8e\x7f\x8e\x81\x8e\x82\x8e\x83\x8e\x84\x8e\x85\x57\xa0\x8e\x86\x8e\x87\x8e\x88\x8e\x89\x8e\x8a\x8e\x8b\x8e\x8c\x8e\x8d\x8e\x8e\x8e\x8f\x8e\x90\x8e\x91\x8e\x92\x64\x7d\x8e\x93\x4a\xa7\x5b\xdc\x8e\x94\x8e\x95\x59\x52\x4a\x52\x8e\x96\x8e\x97\x4d\x44\x5c\x94\x54\x69\x4f\xdd\x4d\x4e\x8e\x98\x57\xd6\x8e\x99\x8e\x9a\x49\xed\x5e\x6f\x8e\x9b\x4e\xb9\x59\xd0\x56\x68\x48\xcc\x8e\x9c\x8e\x9d\x58\x90\x8e\x9e\x8e\x9f\x8e\xa0\x8e\xa1\x8e\xa2\x5d\x84\x4f\x8e\x8e\xa3", /* 5e00 */ "\x8e\xa4\x49\x72\x55\xcf\x49\xbb\x8e\xa5\x56\x47\x4c\x4b\x8e\xa6\x55\xa5\x8e\xa7\x8e\xa8\x8e\xa9\x58\x43\x8e\xaa\x8e\xab\x60\xf7\x5b\x6a\x60\xfa\x8e\xac\x8e\xad\x60\xf9\x53\x61\x56\xfa\x8e\xae\x51\x51\x60\xf8\x5b\xe2\x49\xae\x5b\xc3\x4b\x7b\x8e\xaf\x8e\xb0\x8e\xb1\x8e\xb2\x8e\xb3\x8e\xb4\x8e\xb5\x8e\xb6\x4a\xf7\x5b\xa0\x8e\xb7\x8e\xb8\x8e\xb9\x8e\xba\x8e\xbb\x58\x4f\x48\xee\x8e\xbc\x8e\xbd\x60\xfb\x8e\xbe\x8e\xbf\x8e\xc0\x8e\xc1\x8e\xc2\x61\x41\x4a\x43\x8e\xc3\x8e\xc4\x60\xfc\x60\xfd\x52\x51\x8e\xc5\x8e\xc6\x8e\xc7\x8e\xc8\x52\x7d\x8e\xc9\x61\x42\x4c\x9a\x8e\xca\x8e\xcb\x8e\xcc\x8e\xcd\x8e\xce\x8e\xcf\x4e\x6f\x8e\xd0\x8e\xd1\x8e\xd2\x8e\xd3\x8e\xd4\x8e\xd5\x8e\xd6\x61\x43\x52\xba\x8e\xd7\x8e\xd8\x8e\xd9\x8e\xda\x8e\xdb\x61\x44\x8e\xdc\x8e\xdd\x61\x45\x8e\xde\x8e\xdf\x61\x46\x4a\xb0\x8e\xe0\x8e\xe1\x8e\xe2\x8e\xe3\x8e\xe4\x8e\xe5\x8e\xe6\x8e\xe7\x8e\xe8\x8e\xe9\x8e\xea\x8e\xeb\x8e\xec\x8e\xed\x8e\xee\x4c\xc8\x53\xbc\x52\xe9\x8e\xef\x49\xa1\x8e\xf0\x58\xd1\x8e\xf1\x64\x7b\x4e\x63\x5a\x77\x5a\x64\x8e\xf2\x4d\x84", /* 5e80 */ "\x61\xce\x8e\xf3\x8e\xf4\x8e\xf5\x5c\x4f\x8e\xf6\x54\x8d\x49\x73\x8e\xf7\x8e\xf8\x4a\xb1\x61\xd0\x8e\xf9\x8e\xfa\x8e\xfb\x58\xf1\x51\xad\x61\xcf\x8e\xfc\x50\x83\x5a\x46\x4b\x77\x61\xd1\x4b\x8b\x8e\xfd\x52\x8e\x4c\xfc\x8f\x41\x4c\xad\x8f\x42\x53\x73\x4c\x6f\x61\xd3\x8f\x43\x8f\x44\x8f\x45\x8f\x46\x61\xd2\x4b\xc7\x5c\x9a\x8f\x47\x8f\x48\x8f\x49\x8f\x4a\x8f\x4b\x57\x45\x8f\x4c\x8f\x4d\x8f\x4e\x8f\x4f\x8f\x50\x61\xd7\x8f\x51\x61\xd5\x55\xfb\x50\x55\x5a\x59\x61\xd4\x8f\x52\x8f\x53\x8f\x54\x8f\x55\x61\xd6\x8f\x56\x8f\x57\x8f\x58\x8f\x59\x8f\x5a\x8f\x5b\x8f\x5c\x8f\x5d\x8f\x5e\x8f\x5f\x51\x4e\x50\xc7\x8f\x60\x8f\x61\x8f\x62\x8f\x63\x8f\x64\x8f\x65\x61\xda\x61\xd9\x50\xa9\x8f\x66\x8f\x67\x51\x6e\x8f\x68\x8f\x69\x8f\x6a\x8f\x6b\x61\xdb\x8f\x6c\x8f\x6d\x8f\x6e\x8f\x6f\x8f\x70\x8f\x71\x8f\x72\x8f\x73\x8f\x74\x8f\x75\x8f\x76\x8f\x77\x61\xdc\x8f\x78\x61\xdd\x8f\x79\x8f\x7a\x8f\x7b\x8f\x7c\x8f\x7d\x8f\x7e\x8f\x7f\x8f\x81\x8f\x82\x5e\x68\x8f\x83\x59\x73\x57\x42\x8f\x84\x8f\x85\x4f\x48\x8f\x86\x8f\x87\x8f\x88\x5f\xc2\x5c\xa4", /* 5f00 */ "\x50\x4a\x5e\x6d\x59\xeb\x53\xf9\x53\x4a\x8f\x89\x8f\x8a\x8f\x8b\x5f\xc3\x8f\x8c\x49\x77\x60\x4e\x8f\x8d\x8f\x8e\x8f\x8f\x55\xbc\x8f\x90\x60\x51\x8f\x91\x4d\x4d\x8f\x92\x59\xfc\x8f\x93\x4c\xa4\x4d\xea\x8f\x94\x8f\x95\x4a\x7a\x8f\x96\x8f\x97\x8f\x98\x4b\x7c\x5b\x65\x8f\x99\x8f\x9a\x8f\x9b\x8f\x9c\x52\x76\x58\x72\x4e\x41\x8f\x9d\x63\x94\x63\x93\x8f\x9e\x8f\x9f\x63\x95\x8f\xa0\x57\x85\x8f\xa1\x54\xf4\x8f\xa2\x8f\xa3\x8f\xa4\x8f\xa5\x8f\xa6\x8f\xa7\x8f\xa8\x4b\x4f\x54\x5f\x8f\xa9\x63\x97\x8f\xaa\x8f\xab\x8f\xac\x66\xaf\x8f\xad\x8f\xae\x8f\xaf\x8f\xb0\x8f\xb1\x8f\xb2\x8f\xb3\x8f\xb4\x8f\xb5\x8f\xb6\x8f\xb7\x8f\xb8\x8f\xb9\x8f\xba\x8f\xbb\x63\x87\x8f\xbc\x4d\x8a\x4b\x51\x8f\xbd\x51\xbb\x63\x89\x63\x88\x63\x8a\x8f\xbe\x8f\xbf\x8f\xc0\x8f\xc1\x59\xcc\x8f\xc2\x8f\xc3\x8f\xc4\x61\x8b\x58\xcd\x8f\xc5\x57\x4e\x8f\xc6\x59\x86\x8f\xc7\x8f\xc8\x49\xc9\x49\x8c\x8f\xc9\x49\x93\x53\x8e\x8f\xca\x8f\xcb\x5b\x63\x5a\x50\x8f\xcc\x61\x7c\x8f\xcd\x8f\xce\x8f\xcf\x61\x7d\x8f\xd0\x59\xda\x8f\xd1\x4a\x59\x49\x6b\x8f\xd2\x8f\xd3\x8f\xd4", /* 5f80 */ "\x57\x9a\x5b\x98\x61\x7e\x8f\xd5\x4f\xb5\x4a\xfc\x8f\xd6\x61\x7f\x4d\xdb\x61\x81\x4e\x52\x51\xc8\x61\x82\x8f\xd7\x8f\xd8\x8f\xd9\x58\xeb\x8f\xda\x57\x5d\x8f\xdb\x8f\xdc\x61\x83\x8f\xdd\x4b\x63\x53\x67\x61\x84\x8f\xde\x8f\xdf\x61\x85\x8f\xe0\x8f\xe1\x8f\xe2\x8f\xe3\x5a\x9a\x8f\xe4\x8f\xe5\x8f\xe6\x8f\xe7\x8f\xe8\x8f\xe9\x61\x86\x8f\xea\x59\x4d\x8f\xeb\x8f\xec\x61\x87\x57\xa1\x8f\xed\x8f\xee\x8f\xef\x8f\xf0\x8f\xf1\x8f\xf2\x61\x88\x8f\xf3\x4b\x62\x8f\xf4\x8f\xf5\x8f\xf6\x8f\xf7\x61\x89\x4e\x75\x8f\xf8\x8f\xf9\x8f\xfa\x8f\xfb\x8f\xfc\x58\xc3\x61\xdf\x49\x78\x59\xe3\x8f\xfd\x90\x41\x61\xe0\x90\x42\x90\x43\x4e\xc8\x54\xcb\x90\x44\x61\xe2\x66\xfd\x66\xfc\x60\x4f\x90\x45\x90\x46\x90\x47\x61\xe1\x5b\xbd\x57\x9d\x52\x46\x90\x48\x90\x49\x90\x4a\x62\x63\x90\x4b\x90\x4c\x5b\xd1\x61\xe6\x90\x4d\x90\x4e\x61\xe7\x90\x4f\x90\x50\x5a\x67\x90\x51\x90\x52\x61\xeb\x50\x8d\x90\x53\x61\xec\x61\xe4\x90\x54\x90\x55\x4a\x60\x90\x56\x90\x57\x90\x58\x52\xed\x90\x59\x90\x5a\x61\xed\x90\x5b\x90\x5c\x58\xc2\x90\x5d\x4d\xf5\x61\xe8\x4c\x7e", /* 6000 */ "\x4e\x53\x56\xab\x56\x6b\x61\xe3\x61\xe5\x61\xe9\x61\xea\x90\x5e\x90\x5f\x90\x60\x61\xf6\x90\x61\x90\x62\x61\xf3\x5a\xf4\x61\xf2\x90\x63\x90\x64\x53\x4d\x90\x65\x5b\x9b\x53\x62\x49\xbf\x90\x66\x90\x67\x61\xee\x90\x68\x61\xf1\x51\x4f\x56\x5c\x90\x69\x90\x6a\x4b\x41\x61\xf8\x90\x6b\x90\x6c\x90\x6d\x4e\xb0\x61\xf0\x58\xd3\x5a\xb8\x61\xf4\x4d\x76\x61\xf5\x90\x6e\x90\x6f\x90\x70\x54\x73\x90\x71\x90\x72\x90\x73\x90\x74\x90\x75\x61\xef\x90\x76\x90\x77\x90\x78\x90\x79\x90\x7a\x5c\x7c\x67\x41\x90\x7b\x90\x7c\x61\xf7\x90\x7d\x67\x45\x61\xfd\x55\xd0\x90\x7e\x90\x7f\x90\x81\x90\x82\x90\x83\x90\x84\x90\x85\x51\x55\x90\x86\x4e\x70\x90\x87\x90\x88\x50\x76\x90\x89\x4d\xe2\x90\x8a\x90\x8b\x56\x41\x90\x8c\x90\x8d\x90\x8e\x67\x46\x67\x43\x90\x8f\x90\x90\x67\x42\x90\x91\x90\x92\x90\x93\x90\x94\x4e\x76\x67\x47\x58\xf3\x90\x95\x90\x96\x67\x44\x4d\xdd\x4b\xf6\x62\x41\x4b\xb1\x56\xf0\x4d\x47\x90\x97\x58\x42\x54\x41\x90\x98\x90\x99\x50\x72\x90\x9a\x90\x9b\x4b\xf0\x90\x9c\x61\xf9\x61\xfa\x61\xfc\x61\xfb\x52\xd4\x62\x42\x90\x9d\x5a\x61", /* 6080 */ "\x90\x9e\x90\x9f\x90\xa0\x62\x47\x54\x64\x90\xa1\x90\xa2\x90\xa3\x90\xa4\x58\x44\x90\xa5\x90\xa6\x62\x49\x4d\xb6\x90\xa7\x90\xa8\x90\xa9\x90\xaa\x62\x48\x90\xab\x4e\x7a\x90\xac\x62\x43\x90\xad\x90\xae\x90\xaf\x62\x44\x62\x4a\x90\xb0\x62\x46\x90\xb1\x57\xf1\x5a\x66\x90\xb2\x90\xb3\x4e\x5c\x90\xb4\x90\xb5\x5a\xc2\x90\xb6\x52\xf9\x90\xb7\x90\xb8\x67\x48\x58\xfb\x62\x45\x90\xb9\x52\x96\x90\xba\x62\x4d\x49\x4f\x90\xbb\x62\x52\x90\xbc\x90\xbd\x90\xbe\x4e\xc1\x90\xbf\x90\xc0\x62\x4c\x4b\x5f\x90\xc1\x90\xc2\x90\xc3\x90\xc4\x90\xc5\x90\xc6\x90\xc7\x90\xc8\x54\x8a\x62\x50\x90\xc9\x90\xca\x90\xcb\x4f\xa9\x57\x90\x90\xcc\x90\xcd\x90\xce\x90\xcf\x90\xd0\x4e\x94\x90\xd1\x90\xd2\x90\xd3\x56\xe7\x90\xd4\x90\xd5\x62\x4f\x90\xd6\x62\x51\x90\xd7\x58\x47\x62\x4e\x90\xd8\x57\xa8\x4e\x7d\x90\xd9\x90\xda\x90\xdb\x90\xdc\x90\xdd\x4b\x8c\x4f\xe4\x49\xd1\x4a\x6d\x90\xde\x49\x59\x62\x4b\x49\xd0\x4b\x4c\x4d\x7f\x4b\xe7\x90\xdf\x90\xe0\x58\x8c\x62\x57\x90\xe1\x4e\x6c\x90\xe2\x90\xe3\x54\xc6\x58\xc9\x90\xe4\x90\xe5\x90\xe6\x90\xe7\x90\xe8", /* 6100 */ "\x62\x58\x4a\x8f\x90\xe9\x90\xea\x90\xeb\x90\xec\x67\x49\x90\xed\x5a\x9b\x5a\x85\x90\xee\x90\xef\x90\xf0\x67\x4a\x62\x59\x59\xe1\x90\xf1\x90\xf2\x90\xf3\x90\xf4\x90\xf5\x62\x55\x90\xf6\x90\xf7\x90\xf8\x90\xf9\x5a\x7e\x90\xfa\x90\xfb\x90\xfc\x90\xfd\x4c\xcf\x62\x53\x91\x41\x91\x42\x62\x56\x4c\x7f\x91\x43\x62\x54\x50\xa1\x91\x44\x91\x45\x91\x46\x62\x5a\x91\x47\x91\x48\x91\x49\x91\x4a\x91\x4b\x91\x4c\x91\x4d\x91\x4e\x91\x4f\x91\x50\x91\x51\x91\x52\x91\x53\x91\x54\x91\x55\x91\x56\x91\x57\x91\x58\x91\x59\x5a\xb7\x91\x5a\x91\x5b\x91\x5c\x91\x5d\x91\x5e\x91\x5f\x91\x60\x91\x61\x4a\xc7\x91\x62\x62\x5b\x91\x63\x4e\x65\x91\x64\x55\x98\x91\x65\x91\x66\x55\x86\x91\x67\x91\x68\x91\x69\x52\xbc\x91\x6a\x91\x6b\x91\x6c\x91\x6d\x91\x6e\x91\x6f\x91\x70\x67\x4b\x91\x71\x91\x72\x91\x73\x91\x74\x51\xfc\x91\x75\x91\x76\x91\x77\x91\x78\x4e\x7b\x50\x4e\x91\x79\x91\x7a\x91\x7b\x91\x7c\x91\x7d\x91\x7e\x91\x7f\x57\xbe\x91\x81\x91\x82\x91\x83\x91\x84\x62\x5c\x91\x85\x50\x56\x91\x86\x91\x87\x91\x88\x91\x89\x91\x8a\x91\x8b\x91\x8c\x91\x8d", /* 6180 */ "\x91\x8e\x91\x8f\x91\x90\x91\x91\x91\x92\x91\x93\x91\x94\x91\x95\x91\x96\x91\x97\x91\x98\x49\x90\x91\x99\x91\x9a\x5a\xf6\x91\x9b\x91\x9c\x91\x9d\x91\x9e\x91\x9f\x62\x5e\x91\xa0\x91\xa1\x91\xa2\x91\xa3\x91\xa4\x91\xa5\x91\xa6\x91\xa7\x67\x4d\x91\xa8\x91\xa9\x91\xaa\x91\xab\x91\xac\x91\xad\x91\xae\x91\xaf\x91\xb0\x62\x5f\x4d\xa8\x67\x4c\x91\xb1\x91\xb2\x62\x5d\x91\xb3\x91\xb4\x91\xb5\x91\xb6\x91\xb7\x91\xb8\x91\xb9\x91\xba\x91\xbb\x91\xbc\x62\x60\x91\xbd\x91\xbe\x91\xbf\x91\xc0\x91\xc1\x91\xc2\x4d\xb5\x91\xc3\x91\xc4\x91\xc5\x4b\xad\x91\xc6\x91\xc7\x91\xc8\x91\xc9\x91\xca\x58\xb7\x91\xcb\x48\xc2\x67\x4e\x91\xcc\x91\xcd\x91\xce\x91\xcf\x91\xd0\x67\x4f\x50\xc0\x91\xd1\x62\x61\x91\xd2\x91\xd3\x91\xd4\x91\xd5\x91\xd6\x91\xd7\x91\xd8\x91\xd9\x91\xda\x91\xdb\x91\xdc\x91\xdd\x91\xde\x91\xdf\x91\xe0\x91\xe1\x91\xe2\x53\x53\x91\xe3\x91\xe4\x91\xe5\x91\xe6\x91\xe7\x91\xe8\x91\xe9\x91\xea\x91\xeb\x91\xec\x91\xed\x91\xee\x91\xef\x91\xf0\x62\x62\x91\xf1\x91\xf2\x91\xf3\x91\xf4\x91\xf5\x91\xf6\x91\xf7\x91\xf8\x91\xf9\x5e\xb1", /* 6200 */ "\x91\xfa\x91\xfb\x91\xfc\x91\xfd\x92\x41\x92\x42\x67\x50\x92\x43\x4c\xe9\x92\x44\x57\xeb\x65\xa6\x58\xe6\x55\xf8\x54\xd5\x58\x57\x4a\x69\x57\xd1\x4f\x85\x92\x45\x92\x46\x62\x7e\x4e\x93\x65\xa7\x5b\x5d\x92\x47\x53\xdc\x65\xa8\x92\x48\x92\x49\x92\x4a\x65\xa9\x92\x4b\x65\xab\x65\xaa\x92\x4c\x65\xad\x65\xac\x92\x4d\x92\x4e\x92\x4f\x92\x50\x4f\x78\x92\x51\x65\xae\x92\x52\x51\xbd\x92\x53\x92\x54\x92\x55\x92\x56\x4a\xc0\x4a\xf6\x92\x57\x92\x58\x4e\x47\x92\x59\x92\x5a\x92\x5b\x92\x5c\x92\x5d\x66\xe5\x66\xe4\x4c\x5f\x56\x9a\x49\x83\x92\x5e\x66\xe6\x92\x5f\x92\x60\x92\x61\x55\x68\x66\xe7\x66\xe8\x92\x62\x55\xd5\x5f\xcf\x49\xc4\x5a\xf9\x92\x63\x92\x64\x53\xca\x48\xc6\x4a\xf1\x54\xd2\x92\x65\x92\x66\x92\x67\x57\x70\x92\x68\x92\x69\x50\x58\x92\x6a\x92\x6b\x92\x6c\x92\x6d\x92\x6e\x92\x6f\x92\x70\x50\x7b\x92\x71\x92\x72\x54\x44\x5b\xb3\x92\x73\x50\xa8\x5f\xd0\x55\x48\x59\x90\x53\x44\x48\xe6\x4a\x56\x54\xc4\x92\x74\x92\x75\x48\xe1\x92\x76\x92\x77\x4c\x97\x92\x78\x92\x79\x53\x9b\x92\x7a\x92\x7b\x4b\xf2\x92\x7c\x5b\x72\x4a\x70", /* 6280 */ "\x4e\xbb\x92\x7d\x92\x7e\x92\x7f\x4a\x4d\x92\x81\x92\x82\x92\x83\x92\x84\x4f\xf0\x48\xd0\x92\x85\x92\x86\x92\x87\x92\x88\x92\x89\x92\x8a\x59\xd5\x55\xe2\x5c\x45\x92\x8b\x57\x56\x4b\xb5\x50\x59\x5b\x7b\x92\x8c\x4c\xa6\x53\x77\x92\x8d\x92\x8e\x92\x8f\x5f\xd1\x50\x79\x51\xd4\x54\x60\x92\x90\x4e\x44\x49\x48\x92\x91\x92\x92\x53\x8b\x92\x93\x92\x94\x53\x9c\x56\xa6\x92\x95\x92\x96\x92\x97\x92\x98\x49\x47\x92\x99\x92\x9a\x92\x9b\x4b\x76\x92\x9c\x92\x9d\x92\x9e\x52\xa7\x92\x9f\x5f\xd2\x59\x5a\x4a\x8a\x92\xa0\x52\x93\x92\xa1\x92\xa2\x4c\x98\x92\xa3\x5b\xf3\x4b\x43\x49\xef\x52\xb3\x52\xe8\x50\xac\x5f\xd3\x92\xa4\x48\xe7\x53\x64\x51\x81\x92\xa5\x4d\x75\x92\xa6\x4f\xdb\x57\x78\x48\xcd\x92\xa7\x57\x6f\x5f\xd5\x4f\xcf\x5c\x5e\x5f\xd4\x5b\x70\x48\xdc\x92\xa8\x92\xa9\x52\xe1\x92\xaa\x92\xab\x51\xa2\x4e\xef\x92\xac\x5a\x55\x50\xb8\x53\x41\x49\xa5\x5a\xf0\x92\xad\x92\xae\x50\xa7\x55\xc2\x5f\xd6\x5b\x9d\x92\xaf\x4d\x50\x92\xb0\x54\xac\x56\x49\x92\xb1\x5f\xd8\x50\x5d\x92\xb2\x92\xb3\x92\xb4\x92\xb5\x53\xb3\x5c\x47\x55\xaf\x52\xc2", /* 6300 */ "\x92\xb6\x4a\x76\x4d\x72\x92\xb7\x92\xb8\x92\xb9\x92\xba\x5b\xb7\x65\xfb\x48\xb3\x92\xbb\x92\xbc\x92\xbd\x92\xbe\x50\x87\x92\xbf\x92\xc0\x56\xf3\x92\xc1\x92\xc2\x92\xc3\x92\xc4\x57\x7a\x92\xc5\x92\xc6\x92\xc7\x5b\xbe\x51\xcd\x92\xc8\x57\xcd\x56\xa1\x58\xad\x52\xd2\x4b\x52\x5f\xd7\x5b\x96\x4e\xb6\x4e\x73\x92\xc9\x92\xca\x48\xa3\x92\xcb\x53\x52\x4a\xeb\x92\xcc\x92\xcd\x92\xce\x5b\x92\x92\xcf\x92\xd0\x65\xfc\x92\xd1\x92\xd2\x92\xd3\x92\xd4\x92\xd5\x92\xd6\x5f\xd9\x57\x46\x92\xd7\x92\xd8\x57\x8d\x92\xd9\x92\xda\x92\xdb\x92\xdc\x57\xe5\x5f\xdb\x92\xdd\x57\x51\x50\xa5\x92\xde\x92\xdf\x5c\x5d\x92\xe0\x5f\xda\x48\xc5\x4d\xb3\x55\x73\x52\xf2\x4f\xe7\x92\xe1\x92\xe2\x92\xe3\x92\xe4\x49\xb5\x92\xe5\x92\xe6\x92\xe7\x92\xe8\x92\xe9\x92\xea\x92\xeb\x92\xec\x50\xcb\x56\x91\x92\xed\x4e\xf0\x4e\x5b\x4b\x57\x92\xee\x92\xef\x92\xf0\x53\x96\x92\xf1\x5f\xe5\x92\xf2\x92\xf3\x92\xf4\x5f\xe2\x4f\xdc\x92\xf5\x92\xf6\x5f\xde\x92\xf7\x92\xf8\x92\xf9\x92\xfa\x4a\xb6\x4f\x7d\x92\xfb\x92\xfc\x5f\xdf\x52\xec\x92\xfd\x93\x41\x93\x42\x93\x43", /* 6380 */ "\x58\x66\x93\x44\x4b\x81\x93\x45\x93\x46\x93\x47\x93\x48\x4b\xdd\x55\xd9\x4b\x95\x5f\xe4\x93\x49\x5b\x66\x93\x4a\x5f\xe0\x56\xcc\x53\xfd\x93\x4b\x53\x65\x93\x4c\x93\x4d\x93\x4e\x59\xb3\x93\x4f\x4f\xf1\x93\x50\x93\x51\x93\x52\x93\x53\x93\x54\x93\x55\x93\x56\x51\xd2\x93\x57\x56\xbc\x4a\x58\x93\x58\x4f\x73\x93\x59\x50\x78\x57\x66\x59\x7a\x4a\xea\x93\x5a\x5f\xe3\x5f\xdc\x5f\xe6\x93\x5b\x65\xfd\x93\x5c\x93\x5d\x51\xaf\x5f\xe1\x93\x5e\x93\x5f\x5b\xbf\x4b\x47\x93\x60\x49\xf3\x93\x61\x5f\xe7\x93\x62\x5f\xf1\x93\x63\x93\x64\x93\x65\x93\x66\x93\x67\x5f\xec\x93\x68\x5f\xf0\x93\x69\x93\x6a\x54\xdf\x93\x6b\x93\x6c\x93\x6d\x5c\x82\x5f\xee\x52\x89\x56\xe0\x93\x6e\x49\xe4\x93\x6f\x93\x70\x93\x71\x59\xbd\x93\x72\x93\x73\x93\x74\x93\x75\x93\x76\x93\x77\x93\x78\x5f\xed\x93\x79\x5f\xea\x57\xd4\x93\x7a\x4a\xa6\x93\x7b\x93\x7c\x93\x7d\x93\x7e\x93\x7f\x50\x4b\x4f\xbd\x93\x81\x93\x82\x4f\x72\x93\x83\x93\x84\x93\x85\x93\x86\x5f\xe8\x93\x87\x5a\xad\x93\x88\x5f\xdd\x93\x89\x5f\xe9\x93\x8a\x93\x8b\x93\x8c\x93\x8d\x50\xbe\x93\x8e\x5f\xeb", /* 6400 */ "\x49\xf2\x4c\xe8\x51\xa6\x93\x8f\x93\x90\x4f\x61\x93\x91\x93\x92\x93\x93\x93\x94\x93\x95\x5f\xf4\x5f\xf7\x93\x96\x93\x97\x49\xaa\x4a\xa3\x93\x98\x93\x99\x4a\xe9\x55\x46\x93\x9a\x93\x9b\x93\x9c\x93\x9d\x93\x9e\x93\x9f\x5f\xf5\x56\x71\x93\xa0\x4c\xe2\x93\xa1\x5f\xf6\x5f\xf9\x93\xa2\x93\xa3\x93\xa4\x93\xa5\x5f\xf8\x93\xa6\x93\xa7\x93\xa8\x56\xc1\x93\xa9\x48\xe0\x4a\xed\x93\xaa\x93\xab\x93\xac\x93\xad\x93\xae\x93\xaf\x63\x5a\x93\xb0\x93\xb1\x93\xb2\x93\xb3\x93\xb4\x58\xae\x93\xb5\x93\xb6\x49\xea\x93\xb7\x66\x41\x93\xb8\x5f\xf3\x93\xb9\x93\xba\x55\x84\x5f\xf2\x48\xd9\x59\xa0\x49\x98\x93\xbb\x56\xae\x93\xbc\x93\xbd\x93\xbe\x93\xbf\x93\xc0\x93\xc1\x93\xc2\x5f\xef\x93\xc3\x56\x44\x93\xc4\x93\xc5\x93\xc6\x5b\x4a\x93\xc7\x93\xc8\x93\xc9\x93\xca\x93\xcb\x5f\xfa\x93\xcc\x93\xcd\x93\xce\x93\xcf\x93\xd0\x93\xd1\x93\xd2\x93\xd3\x4a\xdc\x93\xd4\x52\xa5\x93\xd5\x93\xd6\x93\xd7\x5f\xfc\x93\xd8\x93\xd9\x93\xda\x93\xdb\x93\xdc\x93\xdd\x93\xde\x93\xdf\x93\xe0\x93\xe1\x52\x9f\x52\xa0\x60\x41\x93\xe2\x93\xe3\x93\xe4\x93\xe5\x93\xe6", /* 6480 */ "\x93\xe7\x93\xe8\x51\x6c\x93\xe9\x5f\xfb\x4f\xee\x93\xea\x53\xb1\x93\xeb\x93\xec\x93\xed\x93\xee\x93\xef\x93\xf0\x93\xf1\x93\xf2\x93\xf3\x4a\x65\x54\xf5\x93\xf4\x93\xf5\x56\x5a\x5f\xfd\x93\xf6\x93\xf7\x60\x44\x93\xf8\x93\xf9\x93\xfa\x93\xfb\x5c\x52\x93\xfc\x93\xfd\x94\x41\x94\x42\x94\x43\x4a\x57\x94\x44\x94\x45\x94\x46\x94\x47\x51\x63\x94\x48\x94\x49\x54\x6b\x49\xa4\x4a\xe8\x94\x4a\x5c\x4b\x94\x4b\x94\x4c\x94\x4d\x94\x4e\x52\xeb\x94\x4f\x60\x42\x60\x43\x94\x50\x60\x45\x94\x51\x4d\xb2\x94\x52\x94\x53\x94\x54\x60\x46\x94\x55\x50\xdd\x94\x56\x94\x57\x55\x63\x94\x58\x94\x59\x94\x5a\x94\x5b\x94\x5c\x94\x5d\x94\x5e\x49\xd8\x54\x87\x94\x5f\x60\x47\x94\x60\x54\x7c\x94\x61\x94\x62\x94\x63\x94\x64\x60\x48\x66\x42\x94\x65\x94\x66\x94\x67\x94\x68\x94\x69\x56\x73\x94\x6a\x94\x6b\x94\x6c\x60\x4a\x94\x6d\x60\x49\x94\x6e\x49\xc0\x94\x6f\x94\x70\x94\x71\x94\x72\x94\x73\x94\x74\x94\x75\x94\x76\x94\x77\x94\x78\x94\x79\x94\x7a\x94\x7b\x94\x7c\x94\x7d\x94\x7e\x94\x7f\x94\x81\x94\x82\x94\x83\x94\x84\x94\x85\x94\x86\x94\x87\x94\x88", /* 6500 */ "\x53\x6a\x94\x89\x94\x8a\x94\x8b\x94\x8c\x94\x8d\x94\x8e\x94\x8f\x94\x90\x60\x4b\x94\x91\x94\x92\x94\x93\x94\x94\x94\x95\x94\x96\x94\x97\x94\x98\x5a\xdb\x94\x99\x94\x9a\x94\x9b\x94\x9c\x94\x9d\x54\xc0\x94\x9e\x94\x9f\x94\xa0\x94\xa1\x94\xa2\x94\xa3\x94\xa4\x94\xa5\x94\xa6\x94\xa7\x94\xa8\x94\xa9\x60\x4c\x94\xaa\x94\xab\x94\xac\x94\xad\x94\xae\x4f\xef\x94\xaf\x94\xb0\x60\x4d\x5b\xa6\x94\xb1\x94\xb2\x94\xb3\x94\xb4\x65\xb6\x66\x56\x55\xd4\x94\xb5\x5c\xfb\x4c\xc3\x94\xb6\x4d\x45\x94\xb7\x94\xb8\x4c\x65\x5b\x9f\x94\xb9\x94\xba\x94\xbb\x94\xbc\x94\xbd\x4d\x6a\x94\xbe\x94\xbf\x58\xa6\x6a\xcc\x94\xc0\x94\xc1\x4b\x70\x94\xc2\x94\xc3\x52\x95\x94\xc4\x4f\xc7\x94\xc5\x94\xc6\x94\xc7\x66\x57\x48\xbc\x94\xc8\x94\xc9\x4f\x6c\x94\xca\x51\x52\x94\xcb\x49\x76\x4a\x48\x94\xcc\x94\xcd\x94\xce\x4c\xd1\x55\x42\x94\xcf\x94\xd0\x4b\xd7\x94\xd1\x94\xd2\x94\xd3\x94\xd4\x66\x58\x4f\xb3\x94\xd5\x94\xd6\x94\xd7\x55\xfc\x94\xd8\x54\x63\x94\xd9\x5b\x9c\x94\xda\x94\xdb\x4c\x94\x94\xdc\x94\xdd\x94\xde\x94\xdf\x94\xe0\x94\xe1\x94\xe2\x94\xe3", /* 6580 */ "\x94\xe4\x94\xe5\x94\xe6\x94\xe7\x94\xe8\x94\xe9\x94\xea\x57\xc3\x94\xeb\x94\xec\x94\xed\x5b\x4b\x49\x94\x94\xee\x94\xef\x94\xf0\x66\xb2\x48\xde\x94\xf1\x66\xb4\x94\xf2\x94\xf3\x94\xf4\x4b\xb6\x94\xf5\x51\x6f\x94\xf6\x6b\x9b\x58\xb0\x94\xf7\x94\xf8\x5b\x86\x94\xf9\x57\xd2\x94\xfa\x94\xfb\x4f\x90\x4a\x83\x94\xfc\x4c\xaa\x94\xfd\x5b\x56\x95\x41\x67\x5d\x95\x42\x4b\xce\x95\x43\x56\x59\x58\xc1\x95\x44\x95\x45\x95\x46\x95\x47\x95\x48\x95\x49\x95\x4a\x95\x4b\x4c\x5d\x95\x4c\x95\x4d\x66\xb5\x55\xa8\x95\x4e\x95\x4f\x95\x50\x53\x74\x95\x51\x66\xb8\x66\xb7\x51\xc2\x66\xb6\x95\x52\x95\x53\x95\x54\x95\x55\x58\xfc\x66\xb9\x95\x56\x66\xba\x5c\x86\x95\x57\x95\x58\x66\xbb\x95\x59\x95\x5a\x95\x5b\x66\xbc\x53\xeb\x95\x5c\x95\x5d\x95\x5e\x95\x5f\x95\x60\x95\x61\x95\x62\x95\x63\x57\xdd\x95\x64\x4e\xc7\x95\x65\x95\x66\x54\xd4\x4b\x49\x4f\xc8\x5b\xbb\x5a\xe6\x95\x67\x95\x68\x59\x4e\x58\xf0\x65\xb7\x65\xb8\x65\xb9\x4d\xb4\x95\x69\x95\x6a\x95\x6b\x95\x6c\x55\xb0\x50\x96\x95\x6d\x95\x6e\x57\x9b\x95\x6f\x95\x70\x95\x71\x95\x72\x95\x73", /* 6600 */ "\x65\xbf\x95\x74\x48\xb9\x65\xbd\x95\x75\x95\x76\x50\xa4\x95\x77\x95\x78\x95\x79\x65\xba\x95\x7a\x49\xfc\x95\x7b\x52\x98\x4e\x89\x95\x7c\x95\x7d\x95\x7e\x59\xd6\x57\xf3\x65\xbe\x95\x7f\x95\x81\x95\x82\x65\xbb\x95\x83\x95\x84\x95\x85\x65\xc2\x95\x86\x58\xc6\x5a\x53\x95\x87\x95\x88\x95\x89\x95\x8a\x4a\xb9\x95\x8b\x52\x61\x5c\x93\x95\x8c\x95\x8d\x95\x8e\x95\x8f\x5b\x71\x95\x90\x55\xc6\x95\x91\x65\xc4\x95\x92\x95\x93\x65\xc3\x65\xc6\x65\xc5\x95\x94\x95\x95\x95\x96\x95\x97\x95\x98\x5b\xe6\x95\x99\x58\x74\x95\x9a\x95\x9b\x65\xca\x95\x9c\x4e\x6e\x95\x9d\x95\x9e\x95\x9f\x95\xa0\x95\xa1\x95\xa2\x95\xa3\x4f\x9b\x55\x6e\x95\xa4\x95\xa5\x65\xcb\x95\xa6\x95\xa7\x55\x59\x58\x9f\x65\xc9\x5a\xcd\x65\xcc\x65\xce\x95\xa8\x95\xa9\x57\x8e\x95\xaa\x95\xab\x95\xac\x95\xad\x65\xc8\x95\xae\x65\xcd\x95\xaf\x95\xb0\x57\xed\x95\xb1\x4e\x7e\x95\xb2\x4a\x5f\x95\xb3\x95\xb4\x95\xb5\x95\xb6\x95\xb7\x53\xd4\x4f\xaf\x57\xf9\x95\xb8\x95\xb9\x95\xba\x54\x88\x95\xbb\x4f\xa6\x65\xcf\x95\xbc\x95\xbd\x5b\xc6\x95\xbe\x95\xbf\x95\xc0\x51\x60\x95\xc1", /* 6680 */ "\x95\xc2\x95\xc3\x5a\xdc\x95\xc4\x65\xd0\x95\xc5\x95\xc6\x58\x5e\x95\xc7\x95\xc8\x95\xc9\x95\xca\x65\xd1\x95\xcb\x95\xcc\x95\xcd\x95\xce\x55\xed\x95\xcf\x95\xd0\x95\xd1\x95\xd2\x53\x4f\x48\xb4\x95\xd3\x95\xd4\x95\xd5\x95\xd6\x95\xd7\x65\xd3\x95\xd8\x95\xd9\x95\xda\x95\xdb\x95\xdc\x95\xdd\x95\xde\x95\xdf\x95\xe0\x65\xd2\x6a\xde\x95\xe1\x95\xe2\x95\xe3\x95\xe4\x95\xe5\x52\xb9\x95\xe6\x95\xe7\x95\xe8\x95\xe9\x95\xea\x49\x49\x95\xeb\x95\xec\x95\xed\x95\xee\x63\x7f\x95\xef\x95\xf0\x95\xf1\x95\xf2\x65\xd4\x95\xf3\x95\xf4\x95\xf5\x95\xf6\x95\xf7\x95\xf8\x95\xf9\x95\xfa\x95\xfb\x95\xfc\x95\xfd\x96\x41\x96\x42\x96\x43\x96\x44\x96\x45\x96\x46\x96\x47\x96\x48\x96\x49\x96\x4a\x96\x4b\x96\x4c\x96\x4d\x96\x4e\x96\x4f\x55\xee\x96\x50\x65\xd5\x65\xd6\x53\xd7\x96\x51\x96\x52\x96\x53\x96\x54\x96\x55\x96\x56\x96\x57\x96\x58\x65\xd7\x96\x59\x96\x5a\x65\xd8\x96\x5b\x96\x5c\x96\x5d\x96\x5e\x96\x5f\x96\x60\x5a\xba\x96\x61\x54\x9b\x59\xb6\x4c\xfb\x96\x62\x96\x63\x65\xc1\x96\x64\x49\xdb\x96\x65\x96\x66\x51\xfb\x96\x67\x5a\xf7\x56\xe5", /* 6700 */ "\x5c\x8f\x96\x68\x96\x69\x96\x6a\x96\x6b\x96\x6c\x96\x6d\x96\x6e\x5a\xc1\x5a\x70\x66\x63\x53\x94\x96\x6f\x4c\x9f\x96\x70\x96\x71\x66\x74\x96\x72\x96\x73\x96\x74\x56\x57\x66\x7e\x96\x75\x50\xc9\x96\x76\x96\x77\x96\x78\x57\x9c\x96\x79\x4a\x4f\x96\x7a\x53\xd9\x96\x7b\x96\x7c\x96\x7d\x96\x7e\x96\x7f\x96\x81\x66\x9d\x96\x82\x52\xbd\x96\x83\x57\xb3\x52\xa8\x49\x5e\x5a\xfc\x96\x84\x55\xf4\x96\x85\x5b\xeb\x96\x86\x96\x87\x53\xd2\x4b\xe3\x96\x88\x96\x89\x96\x8a\x96\x8b\x4e\x9b\x96\x8c\x96\x8d\x58\xdf\x96\x8e\x96\x8f\x55\x51\x96\x90\x5a\xd2\x54\xa7\x96\x91\x96\x92\x4c\xca\x96\x93\x64\xbd\x55\x5c\x96\x94\x96\x95\x64\xba\x96\x96\x50\xed\x58\xd2\x49\xc3\x4a\xe4\x96\x97\x64\xbb\x96\x98\x96\x99\x5b\x68\x96\x9a\x96\x9b\x96\x9c\x96\x9d\x96\x9e\x4b\xc4\x96\x9f\x64\xbc\x55\xf7\x4c\xdb\x56\xf4\x96\xa0\x96\xa1\x96\xa2\x50\xb3\x96\xa3\x96\xa4\x59\x8f\x64\xbe\x64\xc1\x96\xa5\x96\xa6\x4d\xbb\x96\xa7\x49\x4d\x4f\x7c\x96\xa8\x65\xbc\x64\xc2\x96\xa9\x64\xc5\x96\xaa\x64\xca\x96\xab\x96\xac\x96\xad\x96\xae\x64\xcb\x96\xaf\x56\x69\x48\xe4", /* 6780 */ "\x96\xb0\x4e\xaa\x96\xb1\x96\xb2\x4d\x59\x96\xb3\x96\xb4\x64\xc0\x96\xb5\x57\x98\x96\xb6\x64\xc9\x96\xb7\x96\xb8\x96\xb9\x96\xba\x57\xf5\x96\xbb\x96\xbc\x96\xbd\x96\xbe\x5b\x8e\x96\xbf\x51\x76\x64\xc3\x96\xc0\x52\x56\x96\xc1\x4d\x9c\x5b\xa5\x64\xc7\x96\xc2\x96\xc3\x96\xc4\x55\xdf\x5a\xe5\x96\xc5\x64\xbf\x96\xc6\x64\xc4\x64\xc6\x96\xc7\x54\x59\x4c\x84\x96\xc8\x64\xc8\x96\xc9\x50\x7d\x64\xd1\x96\xca\x96\xcb\x64\xd6\x96\xcc\x64\xd4\x4e\xdb\x4e\xce\x64\xda\x96\xcd\x96\xce\x96\xcf\x96\xd0\x96\xd1\x96\xd2\x96\xd3\x96\xd4\x64\xdd\x96\xd5\x64\xd9\x49\x9b\x96\xd6\x96\xd7\x96\xd8\x96\xd9\x96\xda\x96\xdb\x96\xdc\x96\xdd\x96\xde\x96\xdf\x48\xd7\x52\xb2\x4c\xcb\x53\xe1\x54\xbd\x54\xe0\x96\xe0\x96\xe1\x96\xe2\x64\xce\x64\xd3\x64\xd5\x96\xe3\x4d\x92\x64\xd7\x5c\x96\x96\xe4\x52\xfa\x96\xe5\x64\xdb\x96\xe6\x96\xe7\x49\xe8\x96\xe8\x96\xe9\x96\xea\x64\xd0\x96\xeb\x96\xec\x4e\xec\x96\xed\x96\xee\x50\x62\x64\xcc\x5b\xf8\x96\xef\x51\x99\x49\xf0\x96\xf0\x96\xf1\x96\xf2\x96\xf3\x96\xf4\x96\xf5\x96\xf6\x96\xf7\x64\xde\x96\xf8\x55\xc0", /* 6800 */ "\x64\xd8\x96\xf9\x96\xfa\x96\xfb\x96\xfc\x5b\x44\x96\xfd\x49\x8b\x5b\x5b\x64\xcd\x64\xcf\x4b\xaf\x64\xd2\x97\x41\x64\xdc\x50\xb7\x97\x42\x55\xf6\x97\x43\x56\x48\x97\x44\x97\x45\x53\xdb\x50\xf4\x97\x46\x97\x47\x97\x48\x97\x49\x97\x4a\x64\xe8\x97\x4b\x97\x4c\x97\x4d\x58\xa2\x97\x4e\x97\x4f\x97\x50\x97\x51\x97\x52\x97\x53\x97\x54\x64\xf1\x5b\xe9\x97\x55\x97\x56\x97\x57\x97\x58\x97\x59\x97\x5a\x97\x5b\x64\xdf\x64\xe0\x97\x5c\x97\x5d\x97\x5e\x59\x9a\x4d\xca\x4c\xf8\x97\x5f\x97\x60\x4c\xf0\x5a\xd3\x64\xee\x97\x61\x64\xed\x64\xeb\x4d\x91\x56\xd1\x64\xe5\x57\xa5\x50\x93\x97\x62\x48\xb7\x64\xf0\x64\xef\x97\x63\x5c\x60\x97\x64\x64\xe3\x97\x65\x57\x49\x55\x43\x97\x66\x4e\x58\x4f\x7b\x64\xe9\x97\x67\x97\x68\x97\x69\x97\x6a\x97\x6b\x97\x6c\x97\x6d\x97\x6e\x97\x6f\x97\x70\x64\xe1\x64\xe2\x64\xe4\x4b\x55\x64\xe6\x54\x65\x64\xea\x64\xec\x4f\x50\x5c\x4e\x97\x71\x64\xf7\x97\x72\x97\x73\x97\x74\x97\x75\x97\x76\x97\x77\x97\x78\x97\x79\x64\xf4\x97\x7a\x57\x50\x64\xf5\x97\x7b\x97\x7c\x97\x7d\x97\x7e\x97\x7f\x97\x81\x97\x82\x97\x83", /* 6880 */ "\x97\x84\x51\x5a\x97\x85\x64\xe7\x97\x86\x52\x57\x48\xef\x97\x87\x97\x88\x97\x89\x97\x8a\x97\x8b\x97\x8c\x97\x8d\x97\x8e\x64\xf3\x97\x8f\x97\x90\x97\x91\x64\xf6\x97\x92\x97\x93\x97\x94\x4d\x43\x97\x95\x97\x96\x97\x97\x97\x98\x97\x99\x97\x9a\x97\x9b\x97\x9c\x97\x9d\x97\x9e\x55\x72\x97\x9f\x97\xa0\x97\xa1\x52\x6e\x57\xdf\x50\xe5\x97\xa2\x97\xa3\x97\xa4\x97\xa5\x56\x94\x97\xa6\x56\xdc\x58\xb4\x97\xa7\x97\xa8\x55\xe0\x97\xa9\x64\xf2\x97\xaa\x97\xab\x97\xac\x97\xad\x97\xae\x97\xaf\x97\xb0\x97\xb1\x97\xb2\x97\xb3\x4e\xeb\x97\xb4\x64\xf8\x97\xb5\x97\xb6\x97\xb7\x97\xb8\x97\xb9\x97\xba\x52\x7e\x97\xbb\x53\xe4\x97\xbc\x4d\x98\x97\xbd\x97\xbe\x97\xbf\x97\xc0\x48\xf3\x97\xc1\x97\xc2\x5c\x78\x97\xc3\x97\xc4\x4e\xab\x97\xc5\x53\x90\x97\xc6\x97\xc7\x97\xc8\x97\xc9\x97\xca\x56\xc3\x97\xcb\x97\xcc\x65\x46\x97\xcd\x97\xce\x97\xcf\x97\xd0\x97\xd1\x97\xd2\x97\xd3\x97\xd4\x97\xd5\x97\xd6\x55\x4d\x97\xd7\x65\x42\x50\xe1\x97\xd8\x97\xd9\x97\xda\x50\x63\x97\xdb\x97\xdc\x97\xdd\x64\xfd\x4d\x77\x97\xde\x64\xfa\x97\xdf\x97\xe0\x97\xe1", /* 6900 */ "\x97\xe2\x65\x44\x97\xe3\x97\xe4\x97\xe5\x59\xcd\x97\xe6\x97\xe7\x97\xe8\x97\xe9\x97\xea\x65\x43\x97\xeb\x5b\xb1\x5c\x55\x97\xec\x65\x47\x97\xed\x4f\x57\x97\xee\x97\xef\x97\xf0\x97\xf1\x97\xf2\x97\xf3\x97\xf4\x97\xf5\x97\xf6\x97\xf7\x97\xf8\x97\xf9\x64\xfb\x64\xfc\x97\xfa\x97\xfb\x97\xfc\x65\x41\x97\xfd\x98\x41\x98\x42\x98\x43\x98\x44\x98\x45\x98\x46\x98\x47\x57\x76\x98\x48\x98\x49\x59\xab\x98\x4a\x98\x4b\x98\x4c\x65\x52\x98\x4d\x98\x4e\x98\x4f\x98\x50\x65\x49\x98\x51\x98\x52\x98\x53\x4a\xa9\x98\x54\x4a\xba\x98\x55\x98\x56\x65\x4b\x98\x57\x98\x58\x98\x59\x98\x5a\x98\x5b\x98\x5c\x98\x5d\x98\x5e\x98\x5f\x98\x60\x98\x61\x98\x62\x98\x63\x98\x64\x98\x65\x98\x66\x98\x67\x58\xa7\x98\x68\x98\x69\x65\x45\x98\x6a\x98\x6b\x4a\x9f\x98\x6c\x98\x6d\x65\x4c\x50\xe2\x98\x6e\x65\x4a\x98\x6f\x98\x70\x65\x59\x98\x71\x98\x72\x65\x58\x98\x73\x98\x74\x98\x75\x98\x76\x65\x4e\x98\x77\x98\x78\x64\xf9\x98\x79\x98\x7a\x65\x48\x98\x7b\x98\x7c\x98\x7d\x98\x7e\x98\x7f\x50\x4c\x65\x51\x65\x5a\x98\x81\x98\x82\x51\xa4\x98\x83\x98\x84\x98\x85", /* 6980 */ "\x65\x4f\x98\x86\x4c\xc4\x98\x87\x65\x4d\x98\x88\x5a\x7c\x65\x54\x65\x55\x65\x57\x98\x89\x98\x8a\x98\x8b\x65\x67\x98\x8c\x98\x8d\x98\x8e\x98\x8f\x98\x90\x98\x91\x50\xc5\x65\x65\x98\x92\x98\x93\x65\x50\x98\x94\x98\x95\x65\x5b\x48\xf0\x98\x96\x98\x97\x98\x98\x98\x99\x98\x9a\x98\x9b\x98\x9c\x98\x9d\x98\x9e\x98\x9f\x65\x5c\x5b\x45\x98\xa0\x98\xa1\x65\x5e\x98\xa2\x65\x5f\x98\xa3\x98\xa4\x98\xa5\x65\x61\x98\xa6\x98\xa7\x51\x92\x98\xa8\x98\xa9\x54\xb5\x98\xaa\x98\xab\x98\xac\x65\x5d\x98\xad\x98\xae\x98\xaf\x98\xb0\x98\xb1\x65\x62\x98\xb2\x98\xb3\x98\xb4\x98\xb5\x98\xb6\x98\xb7\x98\xb8\x98\xb9\x65\x63\x98\xba\x65\x53\x98\xbb\x65\x56\x98\xbc\x4e\x51\x98\xbd\x98\xbe\x98\xbf\x65\x60\x98\xc0\x98\xc1\x98\xc2\x98\xc3\x98\xc4\x98\xc5\x4e\xf6\x98\xc6\x98\xc7\x98\xc8\x65\x64\x65\x66\x98\xc9\x98\xca\x98\xcb\x98\xcc\x98\xcd\x98\xce\x98\xcf\x98\xd0\x98\xd1\x98\xd2\x98\xd3\x98\xd4\x65\x6a\x98\xd5\x98\xd6\x98\xd7\x98\xd8\x65\x6e\x98\xd9\x98\xda\x98\xdb\x98\xdc\x98\xdd\x98\xde\x98\xdf\x98\xe0\x98\xe1\x98\xe2\x49\xda\x98\xe3\x65\x68", /* 6a00 */ "\x98\xe4\x98\xe5\x98\xe6\x98\xe7\x98\xe8\x98\xe9\x98\xea\x98\xeb\x98\xec\x98\xed\x4c\x4e\x98\xee\x98\xef\x98\xf0\x98\xf1\x98\xf2\x98\xf3\x98\xf4\x98\xf5\x98\xf6\x98\xf7\x98\xf8\x98\xf9\x65\x6b\x65\x6c\x98\xfa\x98\xfb\x98\xfc\x98\xfd\x99\x41\x99\x42\x5b\x61\x99\x43\x52\xa2\x99\x44\x99\x45\x99\x46\x99\x47\x99\x48\x99\x49\x65\x78\x99\x4a\x4d\xe0\x99\x4b\x99\x4c\x99\x4d\x99\x4e\x65\x69\x99\x4f\x5a\x43\x99\x50\x99\x51\x99\x52\x65\x74\x99\x53\x99\x54\x99\x55\x99\x56\x99\x57\x99\x58\x99\x59\x65\x77\x65\x70\x99\x5a\x99\x5b\x99\x5c\x99\x5d\x99\x5e\x65\x6f\x99\x5f\x99\x60\x54\x61\x99\x61\x99\x62\x99\x63\x99\x64\x99\x65\x99\x66\x99\x67\x99\x68\x65\x72\x99\x69\x99\x6a\x99\x6b\x99\x6c\x99\x6d\x99\x6e\x99\x6f\x65\x79\x4a\x68\x99\x70\x65\x73\x99\x71\x99\x72\x99\x73\x99\x74\x99\x75\x58\x91\x99\x76\x99\x77\x99\x78\x65\x6d\x99\x79\x99\x7a\x99\x7b\x99\x7c\x99\x7d\x99\x7e\x99\x7f\x99\x81\x99\x82\x99\x83\x99\x84\x4a\x98\x99\x85\x99\x86\x99\x87\x99\x88\x99\x89\x99\x8a\x99\x8b\x65\x76\x99\x8c\x99\x8d\x65\x7a\x99\x8e\x99\x8f\x99\x90", /* 6a80 */ "\x56\xb3\x99\x91\x99\x92\x99\x93\x58\x4d\x99\x94\x99\x95\x99\x96\x99\x97\x99\x98\x99\x99\x99\x9a\x99\x9b\x99\x9c\x65\x75\x99\x9d\x65\x7c\x65\x7b\x99\x9e\x99\x9f\x99\xa0\x99\xa1\x99\xa2\x65\x7e\x99\xa3\x99\xa4\x99\xa5\x99\xa6\x99\xa7\x99\xa8\x99\xa9\x99\xaa\x65\x71\x99\xab\x99\xac\x99\xad\x99\xae\x99\xaf\x99\xb0\x99\xb1\x99\xb2\x65\x7d\x99\xb3\x65\x7f\x52\x6a\x99\xb4\x99\xb5\x99\xb6\x99\xb7\x99\xb8\x99\xb9\x99\xba\x99\xbb\x99\xbc\x99\xbd\x99\xbe\x99\xbf\x99\xc0\x99\xc1\x99\xc2\x99\xc3\x99\xc4\x99\xc5\x99\xc6\x99\xc7\x99\xc8\x99\xc9\x99\xca\x99\xcb\x99\xcc\x99\xcd\x99\xce\x99\xcf\x99\xd0\x99\xd1\x99\xd2\x99\xd3\x99\xd4\x99\xd5\x99\xd6\x99\xd7\x99\xd8\x99\xd9\x99\xda\x99\xdb\x99\xdc\x99\xdd\x99\xde\x99\xdf\x99\xe0\x99\xe1\x99\xe2\x99\xe3\x99\xe4\x99\xe5\x99\xe6\x99\xe7\x99\xe8\x99\xe9\x99\xea\x99\xeb\x99\xec\x99\xed\x99\xee\x99\xef\x99\xf0\x99\xf1\x99\xf2\x99\xf3\x99\xf4\x99\xf5\x99\xf6\x99\xf7\x99\xf8\x99\xf9\x99\xfa\x99\xfb\x99\xfc\x99\xfd\x9a\x41\x9a\x42\x9a\x43\x9a\x44\x9a\x45\x9a\x46\x9a\x47\x9a\x48\x9a\x49", /* 6b00 */ "\x9a\x4a\x9a\x4b\x9a\x4c\x9a\x4d\x9a\x4e\x9a\x4f\x9a\x50\x9a\x51\x9a\x52\x9a\x53\x9a\x54\x9a\x55\x9a\x56\x9a\x57\x9a\x58\x9a\x59\x9a\x5a\x9a\x5b\x9a\x5c\x9a\x5d\x9a\x5e\x9a\x5f\x9a\x60\x9a\x61\x9a\x62\x9a\x63\x9a\x64\x9a\x65\x9a\x66\x9a\x67\x9a\x68\x9a\x69\x54\x57\x4a\xcd\x4e\x56\x58\xbf\x66\xa2\x9a\x6a\x9a\x6b\x53\x57\x9a\x6c\x9a\x6d\x9a\x6e\x9a\x6f\x9a\x70\x9a\x71\x9a\x72\x9a\x73\x9a\x74\x9a\x75\x5a\x9c\x9a\x76\x9a\x77\x9a\x78\x9a\x79\x66\xa3\x9a\x7a\x66\xa4\x53\xda\x9a\x7b\x9a\x7c\x9a\x7d\x50\x8f\x9a\x7e\x9a\x7f\x9a\x81\x9a\x82\x66\xa5\x9a\x83\x9a\x84\x66\xa6\x58\xa9\x9a\x85\x54\x58\x9a\x86\x9a\x87\x4c\xe7\x9a\x88\x9a\x89\x9a\x8a\x9a\x8b\x9a\x8c\x9a\x8d\x9a\x8e\x9a\x8f\x9a\x90\x9a\x91\x9a\x92\x9a\x93\x66\xa7\x9a\x94\x9a\x95\x9a\x96\x9a\x97\x9a\x98\x9a\x99\x9a\x9a\x9a\x9b\x5b\xb8\x5b\x9e\x4a\xca\x49\xbc\x57\xe3\x53\xe6\x9a\x9c\x9a\x9d\x57\x82\x9a\x9e\x9a\x9f\x9a\xa0\x9a\xa1\x9a\xa2\x9a\xa3\x9a\xa4\x9a\xa5\x9a\xa6\x9a\xa7\x9a\xa8\x9a\xa9\x9a\xaa\x9a\xab\x4a\xf4\x9a\xac\x56\x60\x4e\xde\x9a\xad\x9a\xae\x9a\xaf", /* 6b80 */ "\x9a\xb0\x65\x83\x65\x84\x59\x8b\x65\x86\x9a\xb1\x4a\xf8\x65\x85\x9a\xb2\x59\x53\x55\xe1\x49\xcf\x9a\xb3\x65\x89\x9a\xb4\x9a\xb5\x9a\xb6\x9a\xb7\x65\x87\x65\x88\x9a\xb8\x9a\xb9\x5b\xb2\x9a\xba\x9a\xbb\x9a\xbc\x65\x8a\x65\x8b\x9a\xbd\x9a\xbe\x9a\xbf\x9a\xc0\x9a\xc1\x65\x8c\x9a\xc2\x9a\xc3\x9a\xc4\x9a\xc5\x9a\xc6\x9a\xc7\x9a\xc8\x9a\xc9\x65\x8d\x9a\xca\x9a\xcb\x9a\xcc\x9a\xcd\x9a\xce\x9a\xcf\x9a\xd0\x9a\xd1\x66\xae\x53\x59\x4b\xcd\x9a\xd2\x59\xf2\x9a\xd3\x9a\xd4\x9a\xd5\x9a\xd6\x9a\xd7\x9a\xd8\x9a\xd9\x4b\x8f\x9a\xda\x4e\x79\x66\xb0\x9a\xdb\x9a\xdc\x59\xe2\x9a\xdd\x9a\xde\x9a\xdf\x9a\xe0\x9a\xe1\x57\xe2\x9a\xe2\x52\xb7\x9a\xe3\x52\x5f\x9a\xe4\x9a\xe5\x4b\xbd\x5c\xb8\x49\x68\x49\x6f\x49\x71\x53\x9f\x9a\xe6\x49\x70\x9a\xe7\x52\x4b\x9a\xe8\x9a\xe9\x9a\xea\x9a\xeb\x9a\xec\x5b\x51\x9a\xed\x9a\xee\x9a\xef\x9a\xf0\x9a\xf1\x9a\xf2\x9a\xf3\x9a\xf4\x66\x44\x4d\xc0\x9a\xf5\x9a\xf6\x9a\xf7\x56\xb9\x9a\xf8\x9a\xf9\x9a\xfa\x66\x45\x9a\xfb\x66\x47\x9a\xfc\x9a\xfd\x9b\x41\x66\x48\x9b\x42\x9b\x43\x9b\x44\x66\x46\x9b\x45\x9b\x46", /* 6c00 */ "\x9b\x47\x9b\x48\x9b\x49\x9b\x4a\x9b\x4b\x66\x49\x66\x4b\x66\x4a\x9b\x4c\x9b\x4d\x9b\x4e\x9b\x4f\x9b\x50\x66\x4c\x9b\x51\x55\xce\x5c\xb4\x52\x92\x9b\x52\x52\x45\x53\xf7\x66\x4d\x52\xc9\x9b\x53\x66\x4e\x66\x4f\x66\x50\x4c\x75\x9b\x54\x9b\x55\x9b\x56\x4c\x9b\x9b\x57\x66\x51\x54\x83\x9b\x58\x66\x53\x9b\x59\x4d\xa3\x59\x96\x48\xb0\x66\x52\x66\x54\x9b\x5a\x9b\x5b\x9b\x5c\x4b\x4a\x51\xc7\x54\x89\x9b\x5d\x66\x55\x9b\x5e\x56\x4e\x62\x7f\x9b\x5f\x9b\x60\x5a\x60\x9b\x61\x9b\x62\x9b\x63\x9b\x64\x5d\x7b\x9b\x65\x9b\x66\x57\x41\x5b\xac\x54\x94\x9b\x67\x9b\x68\x9b\x69\x5d\x81\x4e\x84\x9b\x6a\x4d\xb9\x62\x83\x9b\x6b\x9b\x6c\x9b\x6d\x9b\x6e\x9b\x6f\x58\x4b\x9b\x70\x9b\x71\x9b\x72\x62\x81\x55\x67\x9b\x73\x4d\xb8\x9b\x74\x9b\x75\x9b\x76\x59\x54\x62\x82\x54\xe9\x4d\x4f\x4f\x4d\x4a\x78\x57\xda\x9b\x77\x9b\x78\x56\xbf\x9b\x79\x9b\x7a\x9b\x7b\x62\x89\x62\x8a\x57\x95\x9b\x7c\x9b\x7d\x9b\x7e\x9b\x7f\x9b\x81\x56\xac\x9b\x82\x4e\xb2\x9b\x83\x62\x8b\x9b\x84\x62\x8c\x9b\x85\x9b\x86\x58\xd9\x9b\x87\x9b\x88\x9b\x89\x53\xfa\x4c\x7a\x9b\x8a", /* 6c80 */ "\x9b\x8b\x54\x7f\x59\xc9\x57\xd5\x9b\x8c\x62\x85\x62\x8d\x9b\x8d\x55\x93\x4a\x61\x9b\x8e\x9b\x8f\x62\x88\x9b\x90\x9b\x91\x53\xe2\x62\x86\x9b\x92\x9b\x93\x67\x53\x62\x87\x9b\x94\x9b\x95\x9b\x96\x9b\x97\x55\x53\x9b\x98\x53\x87\x9b\x99\x9b\x9a\x9b\x9b\x4d\x55\x9b\x9c\x52\x5b\x9b\x9d\x62\x84\x53\x5d\x51\x44\x51\xd8\x49\xd6\x9b\x9e\x62\x8e\x4e\x46\x52\xac\x9b\x9f\x62\x91\x4f\xd9\x9b\xa0\x9b\xa1\x62\x9c\x62\x96\x4d\xd2\x9b\xa2\x9b\xa3\x9b\xa4\x9b\xa5\x4c\x70\x5a\x6d\x9b\xa6\x5b\xcd\x5b\x73\x4d\x61\x5b\x54\x59\x78\x9b\xa7\x9b\xa8\x9b\xa9\x9b\xaa\x58\xb8\x54\x97\x9b\xab\x9b\xac\x9b\xad\x54\xa9\x49\xb3\x9b\xae\x52\x7a\x9b\xaf\x9b\xb0\x9b\xb1\x62\x8f\x9b\xb2\x9b\xb3\x62\x9d\x62\x90\x4c\x48\x62\x98\x62\x95\x9b\xb4\x9b\xb5\x9b\xb6\x4c\x5a\x9b\xb7\x9b\xb8\x53\x42\x9b\xb9\x62\x97\x53\x7d\x49\xa7\x53\xfb\x9b\xba\x52\xdf\x9b\xbb\x9b\xbc\x5c\x42\x9b\xbd\x50\xe0\x62\x9a\x9b\xbe\x9b\xbf\x62\x9b\x62\x9e\x56\xa8\x62\x94\x9b\xc0\x5a\x5e\x9b\xc1\x49\x63\x67\x54\x62\x92\x62\x93\x9b\xc2\x62\x99\x58\xb9\x53\xc2\x5a\xf2\x62\x9f\x9b\xc3", /* 6d00 */ "\x9b\xc4\x4f\x81\x9b\xc5\x9b\xc6\x62\xa6\x9b\xc7\x9b\xc8\x62\xa5\x9b\xc9\x9b\xca\x9b\xcb\x59\x94\x62\xa2\x9b\xcc\x62\xa8\x9b\xcd\x9b\xce\x9b\xcf\x54\xf6\x9b\xd0\x9b\xd1\x9b\xd2\x9b\xd3\x58\x54\x9b\xd4\x62\xa7\x62\xad\x51\xe4\x9b\xd5\x9b\xd6\x4b\xb3\x9b\xd7\x9b\xd8\x9b\xd9\x9b\xda\x9b\xdb\x9b\xdc\x4f\x93\x9b\xdd\x62\xa1\x9b\xde\x9b\xdf\x4d\xe8\x62\xa9\x9b\xe0\x9b\xe1\x62\xab\x9b\xe2\x9b\xe3\x4b\xfc\x5b\xdd\x62\xb1\x9b\xe4\x62\xac\x9b\xe5\x9b\xe6\x9b\xe7\x62\xa0\x9b\xe8\x4e\x8f\x57\x7d\x54\x42\x53\x69\x9b\xe9\x9b\xea\x51\x98\x9b\xeb\x62\xa3\x9b\xec\x54\x53\x4f\x4c\x4f\x5d\x62\xa4\x9b\xed\x5c\x67\x49\xe1\x9b\xee\x62\xaa\x4e\xc2\x62\xae\x9b\xef\x4e\x8c\x62\xaf\x53\x48\x62\xb0\x9b\xf0\x9b\xf1\x9b\xf2\x9b\xf3\x5b\x84\x50\x43\x9b\xf4\x62\xb9\x9b\xf5\x62\xb6\x9b\xf6\x62\xba\x9b\xf7\x9b\xf8\x62\xbc\x9b\xf9\x9b\xfa\x53\xd5\x9b\xfb\x9b\xfc\x4d\xc5\x50\xca\x9b\xfd\x9c\x41\x9c\x42\x4c\xa0\x62\xb3\x9c\x43\x9c\x44\x9c\x45\x9c\x46\x5a\xa0\x9c\x47\x9c\x48\x4d\xa2\x4f\x9f\x9c\x49\x9c\x4a\x9c\x4b\x62\xbb\x9c\x4c\x9c\x4d\x9c\x4e", /* 6d80 */ "\x9c\x4f\x9c\x50\x57\x5f\x9c\x51\x9c\x52\x52\xf8\x9c\x53\x9c\x54\x58\x9c\x55\x87\x9c\x55\x9c\x56\x5a\x5f\x9c\x57\x58\x71\x9c\x58\x9c\x59\x62\xb2\x9c\x5a\x62\xb7\x62\xb8\x56\xe8\x9c\x5b\x9c\x5c\x9c\x5d\x9c\x5e\x9c\x5f\x56\xcd\x9c\x60\x50\xd3\x62\xb4\x51\x50\x62\xb5\x57\xcf\x9c\x61\x4e\x61\x4b\x73\x9c\x62\x54\xf2\x4f\x47\x5b\x67\x55\x4c\x4c\xa1\x62\xc9\x9c\x63\x9c\x64\x62\xcb\x59\x64\x9c\x65\x9c\x66\x59\xb9\x9c\x67\x9c\x68\x4d\xac\x9c\x69\x9c\x6a\x4d\xd3\x9c\x6b\x9c\x6c\x9c\x6d\x9c\x6e\x9c\x6f\x9c\x70\x62\xc2\x4b\x8e\x9c\x71\x9c\x72\x9c\x73\x5c\x6d\x62\xbf\x58\x9e\x62\xbe\x9c\x74\x9c\x75\x9c\x76\x51\x7c\x56\xc9\x9c\x77\x9c\x78\x9c\x79\x9c\x7a\x55\xe6\x9c\x7b\x9c\x7c\x9c\x7d\x9c\x7e\x52\xd6\x9c\x7f\x56\xd3\x62\xc7\x9c\x81\x9c\x82\x9c\x83\x62\xc6\x62\xc0\x9c\x84\x62\xc3\x4b\x4d\x9c\x85\x9c\x86\x5a\x79\x9c\x87\x62\xc5\x9c\x88\x9c\x89\x9c\x8a\x9c\x8b\x59\xf8\x4a\xe2\x9c\x8c\x4e\x54\x9c\x8d\x9c\x8e\x55\x8f\x9c\x8f\x4a\xbd\x9c\x90\x9c\x91\x9c\x92\x4e\x8d\x9c\x93\x59\x6d\x9c\x94\x56\xec\x67\x55\x9c\x95\x9c\x96\x9c\x97", /* 6e00 */ "\x9c\x98\x9c\x99\x9c\x9a\x9c\x9b\x9c\x9c\x54\x86\x9c\x9d\x9c\x9e\x9c\x9f\x9c\xa0\x5a\xa7\x9c\xa1\x62\xca\x5c\x75\x62\xc1\x9c\xa2\x4f\x45\x62\xc4\x9c\xa3\x9c\xa4\x5a\x87\x9c\xa5\x62\xc8\x55\x99\x9c\xa6\x9c\xa7\x62\xbd\x9c\xa8\x9c\xa9\x5a\x86\x9c\xaa\x9c\xab\x54\x9f\x4b\xc8\x9c\xac\x5a\xfb\x49\xb2\x62\xd6\x9c\xad\x9c\xae\x9c\xaf\x57\xc1\x9c\xb0\x62\xcc\x9c\xb1\x57\xbb\x9c\xb2\x4c\xda\x9c\xb3\x9c\xb4\x62\xd5\x9c\xb5\x50\x6a\x9c\xb6\x9c\xb7\x9c\xb8\x5a\x6e\x9c\xb9\x52\x8d\x9c\xba\x9c\xbb\x9c\xbc\x9c\xbd\x9c\xbe\x9c\xbf\x9c\xc0\x9c\xc1\x53\x68\x62\xd7\x9c\xc2\x9c\xc3\x9c\xc4\x9c\xc5\x9c\xc6\x9c\xc7\x9c\xc8\x9c\xc9\x57\x64\x62\xce\x9c\xca\x9c\xcb\x9c\xcc\x9c\xcd\x62\xd3\x62\xd4\x9c\xce\x4d\xfd\x9c\xcf\x58\x87\x9c\xd0\x9c\xd1\x5b\x5f\x9c\xd2\x9c\xd3\x9c\xd4\x62\xd1\x9c\xd5\x9c\xd6\x9c\xd7\x9c\xd8\x9c\xd9\x9c\xda\x9c\xdb\x9c\xdc\x9c\xdd\x9c\xde\x9c\xdf\x62\xcf\x9c\xe0\x9c\xe1\x62\xcd\x9c\xe2\x9c\xe3\x9c\xe4\x9c\xe5\x9c\xe6\x9c\xe7\x9c\xe8\x9c\xe9\x9c\xea\x9c\xeb\x9c\xec\x9c\xed\x9c\xee\x9c\xef\x9c\xf0\x57\x86\x55\xa9", /* 6e80 */ "\x9c\xf1\x9c\xf2\x9c\xf3\x50\xa2\x9c\xf4\x4f\x46\x62\xd2\x9c\xf5\x9c\xf6\x4c\xc7\x9c\xf7\x9c\xf8\x9c\xf9\x9c\xfa\x9c\xfb\x62\xe6\x5a\xb3\x9c\xfc\x9c\xfd\x9d\x41\x9d\x42\x9d\x43\x9d\x44\x9d\x45\x62\xda\x9d\x46\x9d\x47\x9d\x48\x51\x90\x9d\x49\x9d\x4a\x62\xe8\x9d\x4b\x9d\x4c\x59\xe6\x9d\x4d\x9d\x4e\x62\xde\x9d\x4f\x62\xdf\x9d\x50\x9d\x51\x58\x4a\x9d\x52\x9d\x53\x9d\x54\x9d\x55\x56\x7d\x9d\x56\x62\xd9\x62\xd0\x9d\x57\x62\xe4\x9d\x58\x54\xdb\x62\xe2\x9d\x59\x9d\x5a\x52\xe6\x62\xe1\x9d\x5b\x62\xe0\x9d\x5c\x9d\x5d\x9d\x5e\x4a\x9d\x62\xe7\x9d\x5f\x9d\x60\x9d\x61\x9d\x62\x4b\x82\x9d\x63\x9d\x64\x9d\x65\x5c\x6c\x9d\x66\x9d\x67\x9d\x68\x62\xe5\x9d\x69\x4e\x4c\x9d\x6a\x5c\x72\x56\xce\x66\x99\x9d\x6b\x62\xe3\x9d\x6c\x9d\x6d\x4d\x97\x9d\x6e\x9d\x6f\x9d\x70\x5b\xcc\x62\xd8\x62\xdb\x51\xf9\x62\xdd\x9d\x71\x51\xca\x50\xc3\x51\xcf\x9d\x72\x49\x96\x56\xb1\x9d\x73\x9d\x74\x9d\x75\x9d\x76\x9d\x77\x9d\x78\x9d\x79\x9d\x7a\x9d\x7b\x9d\x7c\x4b\x6e\x9d\x7d\x9d\x7e\x9d\x7f\x9d\x81\x62\xee\x9d\x82\x9d\x83\x9d\x84\x9d\x85\x9d\x86\x9d\x87", /* 6f00 */ "\x9d\x88\x9d\x89\x53\xae\x9d\x8a\x9d\x8b\x9d\x8c\x53\xe0\x9d\x8d\x9d\x8e\x62\xf4\x9d\x8f\x9d\x90\x9d\x91\x9d\x92\x9d\x93\x51\xa8\x9d\x94\x9d\x95\x9d\x96\x50\xeb\x59\x7d\x62\xed\x9d\x97\x9d\x98\x9d\x99\x9d\x9a\x9d\x9b\x9d\x9c\x9d\x9d\x9d\x9e\x9d\x9f\x9d\xa0\x52\xad\x9d\xa1\x9d\xa2\x9d\xa3\x62\xec\x9d\xa4\x9d\xa5\x9d\xa6\x9d\xa7\x62\xf5\x62\xf3\x51\xfd\x9d\xa8\x62\xdc\x9d\xa9\x62\xef\x9d\xaa\x55\xfd\x9d\xab\x5b\x64\x9d\xac\x9d\xad\x62\xf0\x9d\xae\x9d\xaf\x9d\xb0\x9d\xb1\x9d\xb2\x9d\xb3\x9d\xb4\x59\x9b\x9d\xb5\x9d\xb6\x9d\xb7\x9d\xb8\x9d\xb9\x9d\xba\x9d\xbb\x62\xea\x62\xeb\x9d\xbc\x9d\xbd\x9d\xbe\x62\xf1\x9d\xbf\x57\xaa\x9d\xc0\x9d\xc1\x9d\xc2\x9d\xc3\x9d\xc4\x9d\xc5\x9d\xc6\x9d\xc7\x9d\xc8\x9d\xc9\x53\x6b\x9d\xca\x9d\xcb\x9d\xcc\x54\x51\x9d\xcd\x51\xb9\x9d\xce\x9d\xcf\x9d\xd0\x62\xe9\x9d\xd1\x9d\xd2\x9d\xd3\x51\x6a\x9d\xd4\x9d\xd5\x9d\xd6\x9d\xd7\x9d\xd8\x9d\xd9\x56\xb5\x4a\x51\x9d\xda\x9d\xdb\x9d\xdc\x62\xfa\x9d\xdd\x62\xf2\x9d\xde\x9d\xdf\x9d\xe0\x62\xf9\x9d\xe1\x62\xfc\x9d\xe2\x62\xfb\x9d\xe3\x9d\xe4\x9d\xe5", /* 6f80 */ "\x9d\xe6\x9d\xe7\x9d\xe8\x9d\xe9\x4a\x6e\x9d\xea\x9d\xeb\x9d\xec\x4a\x5a\x62\xf6\x9d\xed\x9d\xee\x62\xf8\x62\xf7\x53\x8d\x9d\xef\x9d\xf0\x9d\xf1\x9d\xf2\x9d\xf3\x9d\xf4\x9d\xf5\x9d\xf6\x9d\xf7\x9d\xf8\x9d\xf9\x9d\xfa\x9d\xfb\x50\xbc\x9d\xfc\x9d\xfd\x9e\x41\x9e\x42\x5a\xe7\x9e\x43\x9e\x44\x9e\x45\x9e\x46\x9e\x47\x63\x42\x9e\x48\x9e\x49\x9e\x4a\x9e\x4b\x9e\x4c\x9e\x4d\x9e\x4e\x9e\x4f\x9e\x50\x9e\x51\x9e\x52\x48\xc3\x9e\x53\x9e\x54\x63\x44\x9e\x55\x9e\x56\x63\x43\x9e\x57\x9e\x58\x9e\x59\x9e\x5a\x9e\x5b\x9e\x5c\x4e\xa3\x9e\x5d\x63\x45\x9e\x5e\x9e\x5f\x9e\x60\x9e\x61\x9e\x62\x9e\x63\x63\x41\x9e\x64\x9e\x65\x9e\x66\x9e\x67\x9e\x68\x9e\x69\x9e\x6a\x62\xfd\x49\x95\x9e\x6b\x9e\x6c\x9e\x6d\x9e\x6e\x9e\x6f\x9e\x70\x9e\x71\x9e\x72\x9e\x73\x9e\x74\x9e\x75\x63\x48\x9e\x76\x63\x49\x63\x46\x9e\x77\x9e\x78\x9e\x79\x9e\x7a\x9e\x7b\x9e\x7c\x9e\x7d\x9e\x7e\x9e\x7f\x9e\x81\x9e\x82\x9e\x83\x63\x47\x63\x4a\x9e\x84\x9e\x85\x9e\x86\x9e\x87\x9e\x88\x9e\x89\x9e\x8a\x9e\x8b\x9e\x8c\x9e\x8d\x9e\x8e\x9e\x8f\x9e\x90\x9e\x91\x9e\x92\x9e\x93", /* 7000 */ "\x9e\x94\x9e\x95\x9e\x96\x9e\x97\x9e\x98\x9e\x99\x9e\x9a\x9e\x9b\x9e\x9c\x9e\x9d\x9e\x9e\x9e\x9f\x9e\xa0\x9e\xa1\x9e\xa2\x9e\xa3\x9e\xa4\x53\xd8\x9e\xa5\x9e\xa6\x9e\xa7\x9e\xa8\x9e\xa9\x9e\xaa\x9e\xab\x9e\xac\x63\x4b\x63\x4d\x9e\xad\x9e\xae\x9e\xaf\x9e\xb0\x9e\xb1\x9e\xb2\x9e\xb3\x63\x4c\x9e\xb4\x9e\xb5\x9e\xb6\x9e\xb7\x9e\xb8\x9e\xb9\x9e\xba\x9e\xbb\x9e\xbc\x9e\xbd\x9e\xbe\x9e\xbf\x9e\xc0\x9e\xc1\x9e\xc2\x9e\xc3\x9e\xc4\x63\x4f\x9e\xc5\x9e\xc6\x9e\xc7\x63\x4e\x9e\xc8\x9e\xc9\x9e\xca\x9e\xcb\x9e\xcc\x9e\xcd\x9e\xce\x9e\xcf\x9e\xd0\x9e\xd1\x9e\xd2\x9e\xd3\x9e\xd4\x9e\xd5\x9e\xd6\x9e\xd7\x9e\xd8\x9e\xd9\x4d\x81\x9e\xda\x9e\xdb\x63\x50\x9e\xdc\x9e\xdd\x9e\xde\x9e\xdf\x9e\xe0\x9e\xe1\x9e\xe2\x9e\xe3\x9e\xe4\x9e\xe5\x9e\xe6\x9e\xe7\x9e\xe8\x9e\xe9\x63\x51\x9e\xea\x9e\xeb\x9e\xec\x9e\xed\x9e\xee\x9e\xef\x9e\xf0\x9e\xf1\x9e\xf2\x9e\xf3\x9e\xf4\x9e\xf5\x4e\x91\x66\xe0\x52\x91\x9e\xf6\x4b\x66\x4e\x72\x9e\xf7\x9e\xf8\x9e\xf9\x9e\xfa\x51\x8a\x5a\xed\x9e\xfb\x4f\xc3\x9e\xfc\x9e\xfd\x9f\x41\x5c\x66\x9f\x42\x5a\xd5\x49\xd2", /* 7080 */ "\x66\xbd\x9f\x43\x9f\x44\x9f\x45\x9f\x46\x65\xc0\x9f\x47\x9f\x48\x9f\x49\x51\xae\x4a\xb5\x9f\x4a\x9f\x4b\x9f\x4c\x59\x77\x9f\x4d\x9f\x4e\x9f\x4f\x4a\x54\x9f\x50\x54\xb1\x50\x5b\x66\xbf\x9f\x51\x9f\x52\x5b\xca\x9f\x53\x9f\x54\x66\xbe\x66\xc0\x9f\x55\x9f\x56\x9f\x57\x9f\x58\x9f\x59\x9f\x5a\x9f\x5b\x9f\x5c\x9f\x5d\x9f\x5e\x9f\x5f\x9f\x60\x9f\x61\x66\xc4\x4f\xe5\x56\xbe\x53\x7a\x4f\xbb\x9f\x62\x66\xc5\x9f\x63\x49\x9f\x9f\x64\x9f\x65\x9f\x66\x66\xc3\x5b\x48\x4b\x84\x9f\x67\x66\xc1\x51\x56\x4a\x84\x9f\x68\x9f\x69\x66\xc2\x56\x58\x50\xc2\x56\xfd\x9f\x6a\x9f\x6b\x9f\x6c\x9f\x6d\x51\x72\x9f\x6e\x66\xc7\x9f\x6f\x9f\x70\x9f\x71\x9f\x72\x9f\x73\x9f\x74\x9f\x75\x9f\x76\x9f\x77\x9f\x78\x9f\x79\x9f\x7a\x9f\x7b\x4d\xe5\x50\xd2\x9f\x7c\x5b\xf1\x9f\x7d\x9f\x7e\x9f\x7f\x59\x6c\x9f\x81\x9f\x82\x9f\x83\x9f\x84\x50\x5e\x9f\x85\x4c\x53\x55\x75\x66\xc6\x4e\x83\x9f\x86\x56\xcb\x4f\x9e\x54\xc7\x9f\x87\x58\x49\x9f\x88\x9f\x89\x9f\x8a\x9f\x8b\x9f\x8c\x9f\x8d\x9f\x8e\x57\x8a\x9f\x8f\x53\x8c\x9f\x90\x9f\x91\x9f\x92\x4c\x8a\x9f\x93\x9f\x94", /* 7100 */ "\x9f\x95\x9f\x96\x9f\x97\x9f\x98\x9f\x99\x9f\x9a\x9f\x9b\x9f\x9c\x9f\x9d\x59\x69\x4d\xb7\x9f\x9e\x9f\x9f\x9f\xa0\x9f\xa1\x9f\xa2\x66\xc8\x9f\xa3\x9f\xa4\x66\xc9\x9f\xa5\x4e\x60\x66\xca\x9f\xa6\x66\xe1\x49\x5a\x4c\x79\x9f\xa7\x9f\xa8\x9f\xa9\x9f\xaa\x9f\xab\x9f\xac\x9f\xad\x9f\xae\x9f\xaf\x9f\xb0\x9f\xb1\x4f\x59\x9f\xb2\x9f\xb3\x9f\xb4\x9f\xb5\x9f\xb6\x9f\xb7\x9f\xb8\x9f\xb9\x66\xcb\x59\x87\x66\xcc\x9f\xba\x9f\xbb\x9f\xbc\x9f\xbd\x54\xba\x9f\xbe\x9f\xbf\x9f\xc0\x9f\xc1\x9f\xc2\x9f\xc3\x9f\xc4\x9f\xc5\x9f\xc6\x9f\xc7\x9f\xc8\x9f\xc9\x9f\xca\x9f\xcb\x66\xd0\x9f\xcc\x9f\xcd\x9f\xce\x9f\xcf\x66\xd2\x9f\xd0\x4e\x6d\x9f\xd1\x4e\xe4\x9f\xd2\x9f\xd3\x9f\xd4\x9f\xd5\x9f\xd6\x9f\xd7\x9f\xd8\x9f\xd9\x9f\xda\x9f\xdb\x9f\xdc\x9f\xdd\x9f\xde\x66\xce\x9f\xdf\x55\x57\x9f\xe0\x9f\xe1\x9f\xe2\x9f\xe3\x9f\xe4\x52\x5a\x9f\xe5\x66\xe2\x5b\x75\x66\xcf\x9f\xe6\x9f\xe7\x9f\xe8\x9f\xe9\x9f\xea\x5b\xf2\x9f\xeb\x9f\xec\x9f\xed\x66\xd1\x66\xcd\x9f\xee\x9f\xef\x9f\xf0\x9f\xf1\x66\xd3\x9f\xf2\x66\xd4\x9f\xf3\x9f\xf4\x55\x5f\x9f\xf5\x9f\xf6", /* 7180 */ "\x9f\xf7\x9f\xf8\x9f\xf9\x9f\xfa\x58\x48\x9f\xfb\x9f\xfc\x9f\xfd\xa0\x41\xa0\x42\x58\xdb\xa0\x43\xa0\x44\xa0\x45\xa0\x46\x59\x4c\xa0\x47\xa0\x48\xa0\x49\xa0\x4a\x54\xda\xa0\x4b\xa0\x4c\xa0\x4d\x66\xd5\x57\xf4\xa0\x4e\xa0\x4f\xa0\x50\xa0\x51\xa0\x52\x55\xeb\x66\xd9\xa0\x53\xa0\x54\xa0\x55\xa0\x56\xa0\x57\xa0\x58\xa0\x59\x66\xd8\xa0\x5a\xa0\x5b\xa0\x5c\x48\xbd\xa0\x5d\xa0\x5e\xa0\x5f\xa0\x60\xa0\x61\xa0\x62\x66\xd6\xa0\x63\x66\xd7\xa0\x64\xa0\x65\xa0\x66\x66\xe3\xa0\x67\xa0\x68\xa0\x69\xa0\x6a\xa0\x6b\xa0\x6c\xa0\x6d\xa0\x6e\xa0\x6f\x54\xbb\xa0\x70\xa0\x71\xa0\x72\xa0\x73\xa0\x74\xa0\x75\xa0\x76\xa0\x77\xa0\x78\xa0\x79\x51\x67\xa0\x7a\xa0\x7b\xa0\x7c\xa0\x7d\xa0\x7e\x66\xdb\x59\x81\xa0\x7f\xa0\x81\xa0\x82\xa0\x83\xa0\x84\xa0\x85\xa0\x86\xa0\x87\xa0\x88\xa0\x89\x66\xda\xa0\x8a\xa0\x8b\xa0\x8c\xa0\x8d\x5a\xee\xa0\x8e\x66\xdc\xa0\x8f\xa0\x90\xa0\x91\xa0\x92\xa0\x93\xa0\x94\x5e\x66\xa0\x95\xa0\x96\xa0\x97\xa0\x98\xa0\x99\xa0\x9a\xa0\x9b\xa0\x9c\xa0\x9d\xa0\x9e\x66\xdd\xa0\x9f\xa0\xa0\xa0\xa1\xa0\xa2\xa0\xa3\xa0\xa4", /* 7200 */ "\xa0\xa5\xa0\xa6\xa0\xa7\xa0\xa8\xa0\xa9\xa0\xaa\x49\x4c\xa0\xab\xa0\xac\xa0\xad\xa0\xae\xa0\xaf\xa0\xb0\xa0\xb1\xa0\xb2\xa0\xb3\xa0\xb4\xa0\xb5\xa0\xb6\xa0\xb7\xa0\xb8\xa0\xb9\xa0\xba\xa0\xbb\xa0\xbc\xa0\xbd\xa0\xbe\xa0\xbf\xa0\xc0\x66\xde\xa0\xc1\xa0\xc2\xa0\xc3\xa0\xc4\xa0\xc5\xa0\xc6\xa0\xc7\xa0\xc8\xa0\xc9\xa0\xca\x66\xdf\xa0\xcb\x5c\x46\xa0\xcc\x53\x60\xa0\xcd\xa0\xce\xa0\xcf\x66\x5c\x48\xad\xa0\xd0\xa0\xd1\xa0\xd2\x4f\xf3\x4c\xb7\x59\xae\x48\xd5\x4b\x9a\xa0\xd3\x5c\xb2\xa0\xd4\x56\x4c\xa0\xd5\x62\x7d\xa0\xd6\xa0\xd7\xa0\xd8\xa0\xd9\xa0\xda\xa0\xdb\xa0\xdc\x53\xab\x48\xe5\xa0\xdd\xa0\xde\xa0\xdf\x53\x66\x66\x59\xa0\xe0\xa0\xe1\xa0\xe2\xa0\xe3\x66\x5a\xa0\xe4\xa0\xe5\xa0\xe6\x66\x5b\xa0\xe7\xa0\xe8\x59\x60\xa0\xe9\x53\x43\xa0\xea\x65\xf1\xa0\xeb\x52\xb1\xa0\xec\x52\xb4\x50\xcd\xa0\xed\xa0\xee\xa0\xef\x65\xf2\x52\xc0\xa0\xf0\x57\xee\xa0\xf1\xa0\xf2\xa0\xf3\xa0\xf4\x65\xef\x65\xf3\xa0\xf5\xa0\xf6\x55\x9d\xa0\xf7\xa0\xf8\x54\x43\xa0\xf9\xa0\xfa\xa0\xfb\x56\xd7\x57\xfd\xa0\xfc\xa0\xfd\xa1\x41\x65\xf4\x65\xf5", /* 7280 */ "\x58\x4c\x50\xe6\xa1\x42\xa1\x43\x65\xf6\xa1\x44\xa1\x45\xa1\x46\xa1\x47\xa1\x48\x4b\xbe\x65\xf7\xa1\x49\x65\xf8\xa1\x4a\x65\xf9\xa1\x4b\xa1\x4c\x65\xfa\xa1\x4d\xa1\x4e\xa1\x4f\xa1\x50\xa1\x51\xa1\x52\xa1\x53\xa1\x54\xa1\x55\xa1\x56\xa1\x57\xa1\x58\x65\xf0\xa1\x59\xa1\x5a\xa1\x5b\xa1\x5c\xa1\x5d\xa1\x5e\xa1\x5f\xa1\x60\xa1\x61\xa1\x62\xa1\x63\xa1\x64\x54\xad\x61\x8c\xa1\x65\x4c\x58\x61\x8d\xa1\x66\xa1\x67\xa1\x68\x61\x8e\xa1\x69\x5c\x54\x61\x8f\x61\x90\x5a\x6c\xa1\x6a\xa1\x6b\xa1\x6c\xa1\x6d\xa1\x6e\xa1\x6f\xa1\x70\x61\x92\x50\x92\x61\x91\x4b\x72\xa1\x71\xa1\x72\xa1\x73\x49\x57\xa1\x74\xa1\x75\xa1\x76\xa1\x77\x61\x94\x61\x93\xa1\x78\x4d\xfb\xa1\x79\x61\x95\xa1\x7a\xa1\x7b\xa1\x7c\xa1\x7d\x4d\x57\xa1\x7e\x4f\xd0\xa1\x7f\xa1\x81\xa1\x82\xa1\x83\x52\xfb\xa1\x84\x4d\xdc\x4f\x66\xa1\x85\xa1\x86\xa1\x87\xa1\x88\xa1\x89\xa1\x8a\x61\x96\x61\x98\xa1\x8b\xa1\x8c\x4b\xbf\x58\x61\x55\xa7\x61\x97\x5b\x99\x5a\x9d\x61\x99\x61\x9d\x61\x9a\xa1\x8d\xa1\x8e\x61\x9b\x50\xe9\xa1\x8f\x61\x9f\x61\xa0\x50\xc6\xa1\x90\xa1\x91\xa1\x92", /* 7300 */ "\xa1\x93\x61\x9c\xa1\x94\x61\x9e\xa1\x95\xa1\x96\xa1\x97\xa1\x98\xa1\x99\xa1\x9a\x61\xa4\xa1\x9b\xa1\x9c\xa1\x9d\x51\x74\xa1\x9e\xa1\x9f\xa1\xa0\xa1\xa1\x61\xa2\xa1\xa2\x61\xa7\x49\xfd\x61\xa1\xa1\xa3\xa1\xa4\xa1\xa5\x52\x6d\x49\xc1\x61\xa6\x61\xa5\xa1\xa6\xa1\xa7\x61\xa3\x61\xa8\xa1\xa8\xa1\xa9\x61\xaa\xa1\xaa\xa1\xab\xa1\xac\x58\xc8\x5b\xec\x52\x48\x61\xab\xa1\xad\x58\x77\xa1\xae\xa1\xaf\x61\xad\xa1\xb0\xa1\xb1\x4d\xee\xa1\xb2\xa1\xb3\x65\x81\x61\xac\x61\xa9\xa1\xb4\xa1\xb5\xa1\xb6\xa1\xb7\x4e\x4b\x5a\xb2\xa1\xb8\xa1\xb9\xa1\xba\xa1\xbb\xa1\xbc\xa1\xbd\xa1\xbe\xa1\xbf\xa1\xc0\xa1\xc1\xa1\xc2\xa1\xc3\xa1\xc4\x61\xaf\xa1\xc5\xa1\xc6\x61\xae\xa1\xc7\x65\x82\xa1\xc8\xa1\xc9\xa1\xca\xa1\xcb\x61\xb0\xa1\xcc\xa1\xcd\xa1\xce\xa1\xcf\xa1\xd0\xa1\xd1\xa1\xd2\xa1\xd3\x61\xb1\xa1\xd4\xa1\xd5\xa1\xd6\xa1\xd7\xa1\xd8\xa1\xd9\xa1\xda\xa1\xdb\xa1\xdc\xa1\xdd\xa1\xde\x61\xb2\x56\xa0\xa1\xdf\x61\xb3\xa1\xe0\xa1\xe1\xa1\xe2\xa1\xe3\xa1\xe4\xa1\xe5\xa1\xe6\xa1\xe7\xa1\xe8\xa1\xe9\xa1\xea\xa1\xeb\xa1\xec\xa1\xed\x61\xb4\xa1\xee", /* 7380 */ "\xa1\xef\xa1\xf0\xa1\xf1\xa1\xf2\x58\xfd\xa1\xf3\xa1\xf4\x51\xc9\xa1\xf5\x5a\x92\xa1\xf6\x57\x96\xa1\xf7\xa1\xf8\x64\x81\xa1\xf9\xa1\xfa\x64\x82\xa1\xfb\xa1\xfc\xa1\xfd\xa2\x41\x4f\xc0\xa2\x42\xa2\x43\xa2\x44\xa2\x45\x51\xe9\xa2\x46\xa2\x47\xa2\x48\x64\x85\xa2\x49\xa2\x4a\x64\x84\xa2\x4b\xa2\x4c\xa2\x4d\xa2\x4e\xa2\x4f\xa2\x50\x57\x87\xa2\x51\x52\x55\xa2\x52\xa2\x53\x64\x83\x4e\x57\x58\x76\xa2\x54\x51\x82\x64\x8a\xa2\x55\xa2\x56\xa2\x57\x64\x89\xa2\x58\xa2\x59\x64\x95\x49\xa2\xa2\x5a\xa2\x5b\xa2\x5c\xa2\x5d\x64\x8b\xa2\x5e\x64\x87\xa2\x5f\xa2\x60\xa2\x61\xa2\x62\xa2\x63\x64\x8d\x64\x8c\x55\x5a\xa2\x64\xa2\x65\x5b\x85\xa2\x66\x64\x86\x4c\x49\x64\x88\xa2\x67\xa2\x68\xa2\x69\xa2\x6a\xa2\x6b\xa2\x6c\xa2\x6d\x64\x8f\xa2\x6e\xa2\x6f\xa2\x70\xa2\x71\x64\x94\xa2\x72\x5b\xe8\xa2\x73\xa2\x74\xa2\x75\xa2\x76\x64\x8e\xa2\x77\x64\x93\xa2\x78\x64\x92\xa2\x79\xa2\x7a\xa2\x7b\x48\xdf\xa2\x7c\xa2\x7d\xa2\x7e\xa2\x7f\x64\x96\xa2\x81\xa2\x82\xa2\x83\xa2\x84\xa2\x85\xa2\x86\xa2\x87\xa2\x88\xa2\x89\xa2\x8a\xa2\x8b\xa2\x8c\xa2\x8d", /* 7400 */ "\xa2\x8e\xa2\x8f\xa2\x90\x54\x93\xa2\x91\x50\xc4\x50\xec\xa2\x92\xa2\x93\x51\x91\x64\x91\xa2\x94\xa2\x95\xa2\x96\xa2\x97\x64\x97\x56\x97\xa2\x98\xa2\x99\xa2\x9a\xa2\x9b\xa2\x9c\xa2\x9d\xa2\x9e\xa2\x9f\xa2\xa0\x64\xa1\x64\xa0\xa2\xa1\xa2\xa2\xa2\xa3\xa2\xa4\xa2\xa5\xa2\xa6\x5c\x61\xa2\xa7\xa2\xa8\x64\x9b\x64\x9a\xa2\xa9\x64\x9c\xa2\xaa\x64\x98\xa2\xab\x64\x9f\xa2\xac\x64\x9e\xa2\xad\x64\x9d\xa2\xae\xa2\xaf\x51\x75\x54\x79\x53\x9e\x53\x63\xa2\xb0\xa2\xb1\xa2\xb2\xa2\xb3\xa2\xb4\x54\x8e\xa2\xb5\xa2\xb6\xa2\xb7\xa2\xb8\x64\xa2\xa2\xb9\xa2\xba\xa2\xbb\xa2\xbc\xa2\xbd\xa2\xbe\xa2\xbf\xa2\xc0\xa2\xc1\xa2\xc2\xa2\xc3\xa2\xc4\xa2\xc5\xa2\xc6\xa2\xc7\xa2\xc8\xa2\xc9\xa2\xca\xa2\xcb\x64\xa5\xa2\xcc\x64\xa4\xa2\xcd\x64\xa6\x4d\xf6\x64\x99\x64\xa3\xa2\xce\x54\xef\x55\x4a\xa2\xcf\xa2\xd0\xa2\xd1\xa2\xd2\xa2\xd3\xa2\xd4\xa2\xd5\xa2\xd6\xa2\xd7\xa2\xd8\xa2\xd9\xa2\xda\xa2\xdb\x64\xa8\xa2\xdc\xa2\xdd\x4d\x86\xa2\xde\xa2\xdf\xa2\xe0\xa2\xe1\xa2\xe2\x59\x9f\x64\xa7\xa2\xe3\xa2\xe4\xa2\xe5\xa2\xe6\xa2\xe7\xa2\xe8\x64\xa9\xa2\xe9", /* 7480 */ "\x64\xac\x64\xad\xa2\xea\x51\x47\xa2\xeb\xa2\xec\xa2\xed\x64\xae\xa2\xee\xa2\xef\xa2\xf0\x64\xaf\xa2\xf1\xa2\xf2\x64\xab\xa2\xf3\x64\xb3\xa2\xf4\xa2\xf5\xa2\xf6\xa2\xf7\xa2\xf8\xa2\xf9\xa2\xfa\xa2\xfb\xa2\xfc\xa2\xfd\xa3\x41\x64\xaa\xa3\x42\x64\xb0\xa3\x43\xa3\x44\xa3\x45\xa3\x46\xa3\x47\xa3\x48\xa3\x49\xa3\x4a\x64\xb4\x64\xb1\x64\xb2\xa3\x4b\xa3\x4c\xa3\x4d\xa3\x4e\xa3\x4f\xa3\x50\xa3\x51\xa3\x52\xa3\x53\xa3\x54\xa3\x55\xa3\x56\xa3\x57\xa3\x58\xa3\x59\xa3\x5a\x64\xb6\xa3\x5b\xa3\x5c\xa3\x5d\xa3\x5e\xa3\x5f\xa3\x60\xa3\x61\xa3\x62\xa3\x63\xa3\x64\xa3\x65\xa3\x66\xa3\x67\xa3\x68\xa3\x69\xa3\x6a\xa3\x6b\xa3\x6c\xa3\x6d\xa3\x6e\xa3\x6f\xa3\x70\xa3\x71\x64\xb5\xa3\x72\xa3\x73\xa3\x74\xa3\x75\xa3\x76\xa3\x77\xa3\x78\xa3\x79\xa3\x7a\x4d\x6f\xa3\x7b\x68\xab\xa3\x7c\x68\xac\xa3\x7d\x53\xaf\x48\xe9\x54\xbe\xa3\x7e\x57\x7f\xa3\x7f\xa3\x81\xa3\x82\xa3\x83\xa3\x84\xa3\x85\xa3\x86\x57\xcc\x65\xb0\xa3\x87\xa3\x88\xa3\x89\xa3\x8a\x65\xb1\xa3\x8b\x53\xbe\x4a\xc8\xa3\x8c\xa3\x8d\xa3\x8e\xa3\x8f\xa3\x90\xa3\x91\xa3\x92\x65\xb2", /* 7500 */ "\xa3\x93\xa3\x94\xa3\x95\xa3\x96\x5b\x88\xa3\x97\xa3\x98\xa3\x99\xa3\x9a\xa3\x9b\xa3\x9c\xa3\x9d\xa3\x9e\x5f\x9a\xa3\x9f\x65\xb3\xa3\xa0\x65\xb4\xa3\xa1\x65\xb5\xa3\xa2\xa3\xa3\xa3\xa4\xa3\xa5\x4c\xc9\x60\x50\x55\x96\xa3\xa6\x56\xef\xa3\xa7\xa3\xa8\x55\x9b\xa3\xa9\xa3\xaa\xa3\xab\xa3\xac\xa3\xad\x55\x9c\xa3\xae\xa3\xaf\x5a\x63\x56\x46\xa3\xb0\x4c\xa5\x68\xad\x49\x62\xa3\xb1\x63\x58\x56\xee\x5a\x69\x4e\xd6\x55\x8b\xa3\xb2\x4b\x88\xa3\xb3\x52\xcf\x4b\x8a\xa3\xb4\x67\xad\x4e\x4d\xa3\xb5\xa3\xb6\x64\x7e\xa3\xb7\x67\xae\xa3\xb8\xa3\xb9\xa3\xba\xa3\xbb\x4a\x49\xa3\xbc\xa3\xbd\x67\xb1\xa3\xbe\xa3\xbf\x67\xb0\x4f\x88\xa3\xc0\x67\xaf\x57\xb6\xa3\xc1\xa3\xc2\xa3\xc3\xa3\xc4\x53\x6f\xa3\xc5\xa3\xc6\xa3\xc7\xa3\xc8\x51\x95\x5e\x6e\x67\xb2\x58\xf2\xa3\xc9\xa3\xca\xa3\xcb\xa3\xcc\xa3\xcd\xa3\xce\xa3\xcf\xa3\xd0\x51\xd3\x53\xe7\xa3\xd1\xa3\xd2\xa3\xd3\x4c\x4c\xa3\xd4\xa3\xd5\xa3\xd6\xa3\xd7\xa3\xd8\xa3\xd9\xa3\xda\x67\xb3\xa3\xdb\x4a\x8c\xa3\xdc\xa3\xdd\xa3\xde\x4e\x9c\x67\xb4\xa3\xdf\xa3\xe0\xa3\xe1\xa3\xe2\xa3\xe3\x64\x7c", /* 7580 */ "\xa3\xe4\xa3\xe5\xa3\xe6\x67\xb5\xa3\xe7\xa3\xe8\x4f\x4e\xa3\xe9\xa3\xea\xa3\xeb\xa3\xec\x69\x83\xa3\xed\xa3\xee\xa3\xef\x55\xe7\xa3\xf0\x59\xc8\x68\xd9\xa3\xf1\x68\xda\xa3\xf2\x68\xdb\x51\x66\xa3\xf3\x4c\xec\x4f\xcd\xa3\xf4\xa3\xf5\x68\xdd\xa3\xf6\x53\x51\x68\xdc\x59\x92\xa3\xf7\x68\xdf\x48\xcb\x4f\x8b\xa3\xf8\xa3\xf9\xa3\xfa\xa3\xfb\xa3\xfc\x59\xde\x68\xde\xa3\xfd\x4a\xae\x4c\x89\x68\xe5\x68\xe4\x53\xa2\x68\xe0\x68\xe1\x4a\xc2\xa4\x41\xa4\x42\x68\xe2\x5b\x8f\xa4\x43\xa4\x44\x56\xda\x4f\xd1\x4e\xb1\xa4\x45\xa4\x46\xa4\x47\x68\xe7\x68\xe6\x68\xe3\x49\xa0\xa4\x48\x5b\xa1\x5a\x58\x4f\xb6\x54\xab\xa4\x49\xa4\x4a\x68\xe9\xa4\x4b\xa4\x4c\xa4\x4d\xa4\x4e\x59\x98\xa4\x4f\x5b\xcb\x4d\xda\x68\xe8\xa4\x50\x4b\xba\xa4\x51\xa4\x52\x57\x54\xa4\x53\xa4\x54\x53\xa5\xa4\x55\xa4\x56\xa4\x57\x51\x41\x68\xea\x68\xed\xa4\x58\x68\xec\x68\xef\x68\xeb\xa4\x59\x4e\x5e\x68\xee\xa4\x5a\xa4\x5b\xa4\x5c\xa4\x5d\x56\xb4\x68\xf1\xa4\x5e\xa4\x5f\x4a\x75\xa4\x60\xa4\x61\xa4\x62\xa4\x63\x49\x74\xa4\x64\xa4\x65\x68\xf2\xa4\x66\xa4\x67\x68\xf3", /* 7600 */ "\x68\xf5\x4a\xe0\xa4\x68\x68\xf0\xa4\x69\x68\xf6\xa4\x6a\xa4\x6b\xa4\x6c\xa4\x6d\x68\xf9\xa4\x6e\x68\xf7\xa4\x6f\xa4\x70\xa4\x71\x68\xf4\xa4\x72\xa4\x73\xa4\x74\xa4\x75\x68\xfc\xa4\x76\x68\xf8\x68\xfb\x68\xfd\xa4\x77\x69\x41\xa4\x78\xa4\x79\xa4\x7a\x57\xc0\x69\x44\xa4\x7b\x69\x43\xa4\x7c\x51\x97\x68\xfa\x55\xdc\xa4\x7d\xa4\x7e\x4a\xf0\x49\x92\x56\xb0\xa4\x7f\x69\x46\xa4\x81\xa4\x82\x69\x47\xa4\x83\xa4\x84\x69\x4c\x5b\x6e\x69\x49\xa4\x85\xa4\x86\x54\xb2\xa4\x87\xa4\x88\xa4\x89\x69\x42\xa4\x8a\x69\x4b\x69\x48\x69\x45\xa4\x8b\xa4\x8c\x69\x4a\xa4\x8d\xa4\x8e\xa4\x8f\xa4\x90\xa4\x91\xa4\x92\xa4\x93\xa4\x94\x48\xa8\x69\x4d\xa4\x95\xa4\x96\xa4\x97\xa4\x98\xa4\x99\xa4\x9a\x69\x4f\xa4\x9b\x69\x51\xa4\x9c\xa4\x9d\xa4\x9e\xa4\x9f\xa4\xa0\x69\x50\xa4\xa1\x69\x4e\xa4\xa2\xa4\xa3\xa4\xa4\xa4\xa5\x59\x42\xa4\xa6\xa4\xa7\xa4\xa8\xa4\xa9\xa4\xaa\xa4\xab\xa4\xac\x69\x52\xa4\xad\xa4\xae\xa4\xaf\x69\x53\xa4\xb0\xa4\xb1\xa4\xb2\xa4\xb3\xa4\xb4\xa4\xb5\xa4\xb6\xa4\xb7\x4d\x90\xa4\xb8\xa4\xb9\x4b\x67\xa4\xba\x48\xd6\x48\xd8\xa4\xbb", /* 7680 */ "\xa4\xbc\xa4\xbd\x5a\xec\xa4\xbe\x4b\x64\xa4\xbf\x4f\x74\x4e\x6a\x68\xa6\xa4\xc0\xa4\xc1\x4c\xdd\xa4\xc2\xa4\xc3\x68\xa7\xa4\xc4\xa4\xc5\x48\xa7\xa4\xc6\x68\xa8\xa4\xc7\xa4\xc8\x57\x8f\xa4\xc9\xa4\xca\x68\xa9\xa4\xcb\xa4\xcc\xa4\xcd\xa4\xce\xa4\xcf\xa4\xd0\xa4\xd1\xa4\xd2\xa4\xd3\xa4\xd4\x68\xaa\xa4\xd5\xa4\xd6\xa4\xd7\xa4\xd8\xa4\xd9\xa4\xda\xa4\xdb\xa4\xdc\xa4\xdd\x53\xa3\xa4\xde\xa4\xdf\x5b\xe4\x69\x85\xa4\xe0\x69\x86\xa4\xe1\xa4\xe2\xa4\xe3\xa4\xe4\xa4\xe5\xa4\xe6\xa4\xe7\xa4\xe8\xa4\xe9\xa4\xea\x52\x94\xa4\xeb\xa4\xec\x5a\x7b\xa4\xed\xa4\xee\x5b\xd0\x53\x89\xa4\xef\x5a\x4f\xa4\xf0\x59\xe5\xa4\xf1\xa4\xf2\x67\xc0\x48\xba\x5b\x55\x59\x6e\x4e\xdf\x4d\xcf\xa4\xf3\x50\x99\xa4\xf4\x4c\xc6\x4b\x61\x53\x6c\xa4\xf5\xa4\xf6\x55\xa1\xa4\xf7\xa4\xf8\xa4\xf9\x52\x6b\xa4\xfa\xa4\xfb\xa4\xfc\xa4\xfd\xa5\x41\x67\xc1\xa5\x42\xa5\x43\xa5\x44\xa5\x45\xa5\x46\xa5\x47\xa5\x48\xa5\x49\x52\xbe\x4b\xa1\xa5\x4a\x67\x8d\x52\x44\xa5\x4b\x5b\xb0\xa5\x4c\xa5\x4d\xa5\x4e\x58\x81\x67\x90\xa5\x4f\xa5\x50\x53\x6e\xa5\x51\x4b\xdb\xa5\x52", /* 7700 */ "\xa5\x53\x55\xa0\xa5\x54\xa5\x55\x67\x8e\xa5\x56\xa5\x57\x67\x91\x67\x92\x52\x5c\xa5\x58\x50\x54\xa5\x59\x67\x8f\xa5\x5a\xa5\x5b\xa5\x5c\xa5\x5d\xa5\x5e\xa5\x5f\xa5\x60\xa5\x61\xa5\x62\xa5\x63\xa5\x64\x67\x95\x67\x93\xa5\x65\xa5\x66\xa5\x67\xa5\x68\x5b\x87\x52\x7f\xa5\x69\x67\x94\xa5\x6a\xa5\x6b\xa5\x6c\x67\x97\xa5\x6d\x5b\x43\x59\x43\xa5\x6e\xa5\x6f\xa5\x70\x67\x96\xa5\x71\x52\x70\xa5\x72\xa5\x73\xa5\x74\xa5\x75\xa5\x76\x67\x98\x50\x95\x4f\xeb\x67\x99\xa5\x77\x56\xf6\xa5\x78\x59\x7b\xa5\x79\xa5\x7a\xa5\x7b\x5c\x65\x5b\x97\xa5\x7c\x67\x9d\xa5\x7d\xa5\x7e\xa5\x7f\x67\x9c\xa5\x81\xa5\x82\xa5\x83\xa5\x84\xa5\x85\xa5\x86\xa5\x87\xa5\x88\x67\x9a\x67\x9b\xa5\x89\xa5\x8a\xa5\x8b\xa5\x8c\xa5\x8d\xa5\x8e\xa5\x8f\xa5\x90\x67\x9e\x4f\xa5\xa5\x91\xa5\x92\xa5\x93\xa5\x94\xa5\x95\x56\x4f\x67\xa0\x4b\xbc\xa5\x96\x67\xa1\x52\xbf\xa5\x97\x67\x9f\xa5\x98\xa5\x99\x4f\x7e\x49\xc6\xa5\x9a\xa5\x9b\xa5\x9c\xa5\x9d\xa5\x9e\xa5\x9f\xa5\xa0\xa5\xa1\xa5\xa2\xa5\xa3\xa5\xa4\xa5\xa5\x4b\xc2\xa5\xa6\xa5\xa7\xa5\xa8\x67\xa4\x5c\xb9\x67\xa2", /* 7780 */ "\x67\xa5\xa5\xa9\xa5\xaa\xa5\xab\x52\x8a\x4a\x93\xa5\xac\xa5\xad\xa5\xae\xa5\xaf\xa5\xb0\xa5\xb1\x67\xa6\x67\xa3\x58\x59\xa5\xb2\xa5\xb3\x67\xa7\x51\xf6\xa5\xb4\xa5\xb5\xa5\xb6\xa5\xb7\xa5\xb8\xa5\xb9\xa5\xba\xa5\xbb\xa5\xbc\xa5\xbd\xa5\xbe\xa5\xbf\x67\xa8\x67\xa9\xa5\xc0\x5f\xaa\xa5\xc1\xa5\xc2\x53\xb2\xa5\xc3\x54\x66\xa5\xc4\x5b\xf4\x4b\x69\xa5\xc5\x56\x52\xa5\xc6\xa5\xc7\xa5\xc8\x67\xaa\xa5\xc9\xa5\xca\x57\x4b\xa5\xcb\x67\xab\xa5\xcc\xa5\xcd\xa5\xce\xa5\xcf\xa5\xd0\x5b\x50\xa5\xd1\x67\xac\xa5\xd2\x6b\xc3\xa5\xd3\xa5\xd4\xa5\xd5\xa5\xd6\xa5\xd7\xa5\xd8\xa5\xd9\xa5\xda\xa5\xdb\xa5\xdc\xa5\xdd\xa5\xde\xa5\xdf\x5e\x67\xa5\xe0\xa5\xe1\xa5\xe2\xa5\xe3\xa5\xe4\xa5\xe5\xa5\xe6\xa5\xe7\xa5\xe8\x4a\xa2\xa5\xe9\xa5\xea\xa5\xeb\x52\x4c\x69\x87\xa5\xec\xa5\xed\xa5\xee\xa5\xef\xa5\xf0\x55\xb7\x59\xd2\xa5\xf1\x5b\xa9\xa5\xf2\x68\x93\xa5\xf3\x4f\xd7\xa5\xf4\x4f\x63\x68\x94\x4b\xcb\x48\xaa\xa5\xf5\xa5\xf6\xa5\xf7\xa5\xf8\x55\xae\xa5\xf9\xa5\xfa\x67\x56\xa5\xfb\x67\x57\xa5\xfc\xa5\xfd\xa6\x41\xa6\x42\x57\xf8\x4c\x4f\x50\x94", /* 7800 */ "\x67\x58\x51\xea\x55\x50\xa6\x43\xa6\x44\xa6\x45\xa6\x46\xa6\x47\xa6\x48\x67\x59\xa6\x49\xa6\x4a\x53\xf5\x50\x53\xa6\x4b\xa6\x4c\xa6\x4d\x67\x5c\x53\x99\xa6\x4e\x59\x70\xa6\x4f\x5c\x49\x67\x5a\x67\x5b\xa6\x50\x59\x83\xa6\x51\x67\x5f\x67\x60\xa6\x52\x67\x64\xa6\x53\xa6\x54\xa6\x55\x67\x68\xa6\x56\x67\x66\x67\x6e\x5b\x89\xa6\x57\x67\x69\xa6\x58\xa6\x59\x67\x67\x67\x5e\xa6\x5a\xa6\x5b\x53\x8a\xa6\x5c\xa6\x5d\xa6\x5e\x53\xc5\xa6\x5f\xa6\x60\x55\x8a\x5a\xd1\x67\x61\x67\x62\x67\x63\x67\x65\xa6\x61\x50\xf8\xa6\x62\x4a\xa0\xa6\x63\xa6\x64\xa6\x65\xa6\x66\x4d\x89\xa6\x67\x67\x70\xa6\x68\xa6\x69\xa6\x6a\xa6\x6b\x67\x71\xa6\x6c\x67\x6a\xa6\x6d\x67\x6f\xa6\x6e\x57\xf7\xa6\x6f\xa6\x70\x56\x56\x67\x6c\x67\x6d\xa6\x71\xa6\x72\xa6\x73\xa6\x74\xa6\x75\x58\x96\xa6\x76\xa6\x77\xa6\x78\xa6\x79\xa6\x7a\xa6\x7b\xa6\x7c\xa6\x7d\xa6\x7e\xa6\x7f\xa6\x81\xa6\x82\x67\x72\x51\x93\x5a\x52\x67\x6b\x54\xb6\xa6\x83\xa6\x84\xa6\x85\xa6\x86\xa6\x87\xa6\x88\xa6\x89\xa6\x8a\x4e\xee\xa6\x8b\xa6\x8c\xa6\x8d\xa6\x8e\x53\x91\xa6\x8f\xa6\x90\xa6\x91", /* 7880 */ "\xa6\x92\xa6\x93\xa6\x94\xa6\x95\xa6\x96\xa6\x97\xa6\x98\x67\x76\xa6\x99\x4b\x90\xa6\x9a\xa6\x9b\x51\xb4\x48\xac\x56\x8a\xa6\x9c\xa6\x9d\x49\x4e\xa6\x9e\x67\x74\xa6\x9f\xa6\xa0\xa6\xa1\x57\x8c\x4b\x83\xa6\xa2\x67\x75\x67\x73\x67\x77\xa6\xa3\xa6\xa4\x4b\x9b\xa6\xa5\x67\x78\xa6\xa6\x67\x79\xa6\xa7\x67\x7c\xa6\xa8\x49\x6c\xa6\xa9\xa6\xaa\xa6\xab\xa6\xac\xa6\xad\xa6\xae\xa6\xaf\xa6\xb0\x53\x97\x4e\xed\x67\x7a\x56\xbb\x49\xe9\xa6\xb1\xa6\xb2\xa6\xb3\xa6\xb4\x67\x7b\xa6\xb5\xa6\xb6\xa6\xb7\xa6\xb8\x52\xea\xa6\xb9\xa6\xba\x4a\xc4\xa6\xbb\xa6\xbc\xa6\xbd\x48\xf4\xa6\xbe\xa6\xbf\xa6\xc0\x67\x7f\x50\xd9\x4a\xe7\xa6\xc1\xa6\xc2\xa6\xc3\xa6\xc4\x53\x6d\xa6\xc5\xa6\xc6\xa6\xc7\x67\x7d\x50\x64\xa6\xc8\xa6\xc9\xa6\xca\x67\x7e\xa6\xcb\xa6\xcc\xa6\xcd\xa6\xce\xa6\xcf\xa6\xd0\xa6\xd1\xa6\xd2\xa6\xd3\xa6\xd4\xa6\xd5\xa6\xd6\xa6\xd7\xa6\xd8\x52\xa4\xa6\xd9\xa6\xda\xa6\xdb\x67\x81\xa6\xdc\xa6\xdd\xa6\xde\xa6\xdf\xa6\xe0\x67\x82\xa6\xe1\x67\x84\xa6\xe2\xa6\xe3\x51\x77\xa6\xe4\xa6\xe5\x4e\x67\xa6\xe6\xa6\xe7\xa6\xe8\xa6\xe9\xa6\xea", /* 7900 */ "\xa6\xeb\x4f\x58\xa6\xec\xa6\xed\xa6\xee\x67\x83\xa6\xef\xa6\xf0\xa6\xf1\xa6\xf2\xa6\xf3\xa6\xf4\xa6\xf5\xa6\xf6\xa6\xf7\xa6\xf8\xa6\xf9\xa6\xfa\xa6\xfb\x67\x85\xa6\xfc\xa6\xfd\xa7\x41\xa7\x42\xa7\x43\xa7\x44\xa7\x45\xa7\x46\xa7\x47\xa7\x48\x67\x87\xa7\x49\xa7\x4a\xa7\x4b\xa7\x4c\xa7\x4d\x67\x86\xa7\x4e\xa7\x4f\xa7\x50\xa7\x51\xa7\x52\xa7\x53\xa7\x54\xa7\x55\xa7\x56\xa7\x57\xa7\x58\xa7\x59\xa7\x5a\xa7\x5b\xa7\x5c\x67\x88\xa7\x5d\xa7\x5e\xa7\x5f\xa7\x60\xa7\x61\x55\xbd\x66\xe9\x50\xf0\xa7\x62\x55\x88\xa7\x63\x66\xea\x53\xed\xa7\x64\xa7\x65\xa7\x66\xa7\x67\x66\xeb\xa7\x68\x53\xec\x66\xec\xa7\x69\xa7\x6a\xa7\x6b\xa7\x6c\xa7\x6d\xa7\x6e\xa7\x6f\xa7\x70\xa7\x71\x66\xef\xa7\x72\xa7\x73\x5c\x87\x66\xf2\xa7\x74\xa7\x75\x66\xf0\x66\xed\x66\xee\x5c\x43\x55\x92\x56\x8f\x66\xf3\xa7\x76\x66\xf1\xa7\x77\xa7\x78\x58\x8a\xa7\x79\x66\xf5\x53\xb0\xa7\x7a\xa7\x7b\xa7\x7c\xa7\x7d\x4e\xbf\xa7\x7e\x66\xf4\xa7\x7f\xa7\x81\xa7\x82\xa7\x83\xa7\x84\xa7\x85\xa7\x86\x4b\x5b\x4e\x97\xa7\x87\x66\xf6\xa7\x88\xa7\x89\xa7\x8a\xa7\x8b\xa7\x8c", /* 7980 */ "\x5d\x98\x4f\x9c\xa7\x8d\xa7\x8e\x51\xba\x66\xf7\xa7\x8f\xa7\x90\xa7\x91\xa7\x92\x66\xf8\xa7\x93\xa7\x94\xa7\x95\xa7\x96\x4c\xa2\xa7\x97\xa7\x98\xa7\x99\xa7\x9a\xa7\x9b\xa7\x9c\xa7\x9d\xa7\x9e\xa7\x9f\xa7\xa0\x66\xf9\xa7\xa1\xa7\xa2\xa7\xa3\xa7\xa4\xa7\xa5\xa7\xa6\xa7\xa7\xa7\xa8\xa7\xa9\xa7\xaa\xa7\xab\xa7\xac\x66\xfa\xa7\xad\xa7\xae\xa7\xaf\xa7\xb0\xa7\xb1\xa7\xb2\xa7\xb3\xa7\xb4\xa7\xb5\xa7\xb6\xa7\xb7\x66\xfb\xa7\xb8\xa7\xb9\xa7\xba\xa7\xbb\xa7\xbc\x5a\x8e\x5c\xad\x50\xea\xa7\xbd\x54\x7d\x4d\xcb\xa7\xbe\x58\xe2\x56\x5d\xa7\xbf\x57\x5a\xa7\xc0\xa7\xc1\x4c\xd0\xa7\xc2\xa7\xc3\x49\x9d\xa7\xc4\x54\x90\xa7\xc5\x5b\xd5\xa7\xc6\xa7\xc7\xa7\xc8\x50\x66\x52\x8c\xa7\xc9\xa7\xca\x68\x96\xa7\xcb\xa7\xcc\x52\x78\xa7\xcd\xa7\xce\xa7\xcf\xa7\xd0\xa7\xd1\xa7\xd2\x5c\x83\xa7\xd3\xa7\xd4\xa7\xd5\x68\x98\x4a\x73\xa7\xd6\x54\x78\x59\x8e\xa7\xd7\x5b\xc7\xa7\xd8\x68\x99\xa7\xd9\x68\x97\xa7\xda\x4e\x9e\x4a\x66\xa7\xdb\xa7\xdc\xa7\xdd\xa7\xde\xa7\xdf\xa7\xe0\xa7\xe1\x4f\x75\xa7\xe2\xa7\xe3\x59\xc5\xa7\xe4\x4e\x81\xa7\xe5\xa7\xe6", /* 7a00 */ "\x58\x41\xa7\xe7\x68\x9d\x68\x9c\xa7\xe8\xa7\xe9\x68\x9a\xa7\xea\xa7\xeb\xa7\xec\xa7\xed\x4a\x6c\xa7\xee\x55\x74\x56\x50\xa7\xef\xa7\xf0\xa7\xf1\xa7\xf2\xa7\xf3\x68\x9f\xa7\xf4\xa7\xf5\x48\xdd\xa7\xf6\xa7\xf7\x5b\xc8\xa7\xf8\xa7\xf9\xa7\xfa\x68\x9e\xa7\xfb\x4a\x8e\xa7\xfc\xa7\xfd\x6b\xd4\xa8\x41\xa8\x42\xa8\x43\xa8\x44\xa8\x45\xa8\x46\xa8\x47\xa8\x48\xa8\x49\xa8\x4a\xa8\x4b\xa8\x4c\xa8\x4d\xa8\x4e\xa8\x4f\x57\xc7\xa8\x50\xa8\x51\xa8\x52\x68\xa1\xa8\x53\x68\xa0\xa8\x54\x4b\x5e\x4e\xd9\x4e\x9d\xa8\x55\x4c\xe4\xa8\x56\xa8\x57\xa8\x58\xa8\x59\xa8\x5a\xa8\x5b\x52\xc1\xa8\x5c\xa8\x5d\xa8\x5e\xa8\x5f\xa8\x60\xa8\x61\xa8\x62\xa8\x63\xa8\x64\xa8\x65\x68\xa2\xa8\x66\xa8\x67\xa8\x68\xa8\x69\xa8\x6a\x56\x8c\xa8\x6b\xa8\x6c\xa8\x6d\xa8\x6e\xa8\x6f\xa8\x70\xa8\x71\xa8\x72\xa8\x73\xa8\x74\xa8\x75\xa8\x76\xa8\x77\xa8\x78\xa8\x79\xa8\x7a\xa8\x7b\xa8\x7c\xa8\x7d\xa8\x7e\xa8\x7f\xa8\x81\xa8\x82\xa8\x83\x68\xa5\xa8\x84\xa8\x85\xa8\x86\x59\x48\xa8\x87\x4f\xbe\x54\x8f\x69\x56\x69\x57\x50\x75\xa8\x88\xa8\x89\xa8\x8a\xa8\x8b\x4a\xa8", /* 7a80 */ "\x69\x58\x57\x5b\xa8\x8c\x54\x74\x5b\x4d\xa8\x8d\x69\x59\xa8\x8e\x69\x5a\xa8\x8f\xa8\x90\xa8\x91\xa8\x92\x54\x6f\xa8\x93\xa8\x94\xa8\x95\x59\xa3\x5b\xce\xa8\x96\xa8\x97\x69\x5b\x4f\x71\x4a\xaf\x4f\xbc\xa8\x98\xa8\x99\xa8\x9a\x4a\xdb\x57\xd0\xa8\x9b\x50\x7f\x69\x5d\xa8\x9c\xa8\x9d\xa8\x9e\xa8\x9f\x50\x9b\x69\x5c\xa8\xa0\x69\x5f\xa8\xa1\xa8\xa2\xa8\xa3\x69\x5e\x69\x60\xa8\xa4\xa8\xa5\xa8\xa6\xa8\xa7\xa8\xa8\x69\x61\xa8\xa9\xa8\xaa\xa8\xab\xa8\xac\xa8\xad\xa8\xae\xa8\xaf\xa8\xb0\xa8\xb1\xa8\xb2\xa8\xb3\x51\x9f\xa8\xb4\xa8\xb5\xa8\xb6\xa8\xb7\xa8\xb8\xa8\xb9\xa8\xba\xa8\xbb\xa8\xbc\xa8\xbd\xa8\xbe\x51\x42\xa8\xbf\xa8\xc0\xa8\xc1\xa8\xc2\xa8\xc3\xa8\xc4\xa8\xc5\xa8\xc6\xa8\xc7\xa8\xc8\x55\xf9\xa8\xc9\xa8\xca\x5b\x5e\xa8\xcb\xa8\xcc\xa8\xcd\xa8\xce\x4f\xb9\x4f\xb8\x5b\x62\xa8\xcf\xa8\xd0\x50\x42\xa8\xd1\x57\x4f\x69\x55\xa8\xd2\xa8\xd3\xa8\xd4\xa8\xd5\xa8\xd6\xa8\xd7\x4f\x7f\xa8\xd8\x4b\xca\xa8\xd9\xa8\xda\xa8\xdb\xa8\xdc\xa8\xdd\xa8\xde\xa8\xdf\xa8\xe0\xa8\xe1\x5b\xf0\x6a\x63\xa8\xe2\xa8\xe3\x6a\x64\xa8\xe4\x4c\xcc", /* 7b00 */ "\xa8\xe5\xa8\xe6\xa8\xe7\x6a\x66\x6a\x67\xa8\xe8\x48\xc9\xa8\xe9\x6a\x65\xa8\xea\x6a\x69\x56\x92\xa8\xeb\xa8\xec\xa8\xed\x6a\x6b\xa8\xee\x58\xa5\xa8\xef\xa8\xf0\x49\x6a\x6a\x68\xa8\xf1\xa8\xf2\xa8\xf3\x6a\x6f\xa8\xf4\x4b\x71\xa8\xf5\xa8\xf6\x6a\x77\xa8\xf7\x6a\x72\xa8\xf8\xa8\xf9\xa8\xfa\x6a\x74\x6a\x73\x4c\x9c\xa8\xfb\x49\x5f\xa8\xfc\x6a\x6e\x6a\x6a\x4b\x7a\xa8\xfd\x6a\x70\xa9\x41\xa9\x42\x6a\x71\xa9\x43\x6a\x75\xa9\x44\xa9\x45\xa9\x46\xa9\x47\x6a\x6d\xa9\x48\x4e\xe2\xa9\x49\x51\x9e\xa9\x4a\x6a\x76\xa9\x4b\xa9\x4c\xa9\x4d\xa9\x4e\xa9\x4f\xa9\x50\x6a\x7a\xa9\x51\x6a\x6c\xa9\x52\x4b\x68\xa9\x53\x4f\x8f\x6a\x7c\xa9\x54\xa9\x55\x4c\x44\x50\x91\x5b\xfd\x57\x52\xa9\x56\x4a\xef\xa9\x57\x49\xde\xa9\x58\x6a\x78\xa9\x59\x6a\x79\x55\x58\xa9\x5a\x6a\x7d\xa9\x5b\xa9\x5c\x6a\x7e\xa9\x5d\x6a\x82\xa9\x5e\xa9\x5f\xa9\x60\xa9\x61\xa9\x62\xa9\x63\xa9\x64\xa9\x65\xa9\x66\xa9\x67\xa9\x68\x6a\x7f\xa9\x69\xa9\x6a\x6a\x84\x6a\x83\xa9\x6b\xa9\x6c\x6a\x7b\xa9\x6d\x50\x8b\xa9\x6e\x4a\x90\xa9\x6f\x6a\x81\xa9\x70\xa9\x71\x54\x49\xa9\x72", /* 7b80 */ "\x4e\xf1\xa9\x73\xa9\x74\xa9\x75\xa9\x76\x6a\x8c\xa9\x77\xa9\x78\xa9\x79\xa9\x7a\xa9\x7b\xa9\x7c\xa9\x7d\x4d\x5f\xa9\x7e\xa9\x7f\x6a\x85\xa9\x81\xa9\x82\xa9\x83\x49\xac\x4e\x9f\xa9\x84\x56\x84\xa9\x85\xa9\x86\xa9\x87\xa9\x88\x6a\x8e\x6a\x8a\xa9\x89\xa9\x8a\xa9\x8b\x4d\x7c\x6a\x8f\xa9\x8c\xa9\x8d\xa9\x8e\x6a\x86\x6a\x87\x6a\x8b\x51\xe0\x6a\x8d\x6a\x90\x6a\x89\x4e\xfc\xa9\x8f\xa9\x90\xa9\x91\x58\x85\xa9\x92\xa9\x93\x6a\x91\xa9\x94\xa9\x95\xa9\x96\x6a\x88\xa9\x97\xa9\x98\xa9\x99\xa9\x9a\xa9\x9b\xa9\x9c\xa9\x9d\xa9\x9e\x6a\x93\xa9\x9f\xa9\xa0\xa9\xa1\xa9\xa2\x5c\x4d\x53\xa9\xa9\xa3\xa9\xa4\xa9\xa5\xa9\xa6\x6a\x94\xa9\xa7\xa9\xa8\xa9\xa9\xa9\xaa\x6a\x92\xa9\xab\x51\xa7\xa9\xac\xa9\xad\xa9\xae\xa9\xaf\xa9\xb0\x4c\xdc\x6a\x96\xa9\xb1\xa9\xb2\x6a\x95\xa9\xb3\xa9\xb4\xa9\xb5\x4a\xda\xa9\xb6\xa9\xb7\xa9\xb8\x6a\x97\x6a\x98\xa9\xb9\xa9\xba\xa9\xbb\x6a\x99\xa9\xbc\xa9\xbd\xa9\xbe\x50\xb9\xa9\xbf\xa9\xc0\x50\xe8\xa9\xc1\xa9\xc2\xa9\xc3\xa9\xc4\xa9\xc5\x53\x92\xa9\xc6\xa9\xc7\xa9\xc8\xa9\xc9\x6a\x9c\xa9\xca\x6a\x9b\xa9\xcb", /* 7c00 */ "\xa9\xcc\xa9\xcd\xa9\xce\xa9\xcf\xa9\xd0\xa9\xd1\xa9\xd2\x4a\xd7\xa9\xd3\xa9\xd4\xa9\xd5\x6a\x9f\x6a\x9a\xa9\xd6\xa9\xd7\x6a\x9d\xa9\xd8\xa9\xd9\xa9\xda\xa9\xdb\xa9\xdc\xa9\xdd\x6a\x9e\xa9\xde\xa9\xdf\xa9\xe0\xa9\xe1\xa9\xe2\xa9\xe3\xa9\xe4\xa9\xe5\x6a\xa0\xa9\xe6\xa9\xe7\xa9\xe8\xa9\xe9\xa9\xea\xa9\xeb\x6a\xa2\x4e\x69\xa9\xec\xa9\xed\x6a\xa1\xa9\xee\xa9\xef\xa9\xf0\xa9\xf1\xa9\xf2\xa9\xf3\xa9\xf4\xa9\xf5\xa9\xf6\xa9\xf7\xa9\xf8\xa9\xf9\xa9\xfa\x6a\xa3\xa9\xfb\xa9\xfc\xa9\xfd\xaa\x41\xaa\x42\xaa\x43\x49\xbd\x6a\xa5\x6a\xa4\xaa\x44\xaa\x45\xaa\x46\xaa\x47\xaa\x48\xaa\x49\xaa\x4a\xaa\x4b\xaa\x4c\xaa\x4d\xaa\x4e\x4e\xad\xaa\x4f\xaa\x50\xaa\x51\xaa\x52\xaa\x53\xaa\x54\xaa\x55\xaa\x56\xaa\x57\xaa\x58\xaa\x59\xaa\x5a\xaa\x5b\xaa\x5c\xaa\x5d\xaa\x5e\xaa\x5f\xaa\x60\xaa\x61\xaa\x62\xaa\x63\xaa\x64\xaa\x65\xaa\x66\xaa\x67\xaa\x68\xaa\x69\xaa\x6a\xaa\x6b\xaa\x6c\xaa\x6d\xaa\x6e\xaa\x6f\xaa\x70\xaa\x71\xaa\x72\xaa\x73\x52\x77\x5d\x82\xaa\x74\xaa\x75\xaa\x76\xaa\x77\xaa\x78\xaa\x79\x50\xdf\x6a\xcb\x5c\x71\xaa\x7a\xaa\x7b", /* 7c80 */ "\xaa\x7c\xaa\x7d\xaa\x7e\xaa\x7f\xaa\x81\xaa\x82\xaa\x83\xaa\x84\xaa\x85\x4c\x7b\xaa\x86\xaa\x87\xaa\x88\xaa\x89\xaa\x8a\xaa\x8b\xaa\x8c\x6a\xcd\x51\x43\xaa\x8d\xaa\x8e\x53\xc8\xaa\x8f\x4a\xd5\x5b\x53\xaa\x90\xaa\x91\xaa\x92\x6a\xcf\x6a\xce\x6a\xd0\x56\x7a\xaa\x93\xaa\x94\x6a\xd1\xaa\x95\x5a\xc0\x5b\xdf\xaa\x96\xaa\x97\xaa\x98\xaa\x99\x4c\x81\xaa\x9a\xaa\x9b\xaa\x9c\x51\x58\xaa\x9d\xaa\x9e\x51\x5b\x6a\xd2\x4f\xab\xaa\x9f\xaa\xa0\xaa\xa1\xaa\xa2\xaa\xa3\x4a\xe1\xaa\xa4\xaa\xa5\x6a\xd3\x6a\xd4\x4f\xaa\xaa\xa6\xaa\xa7\x6a\xd5\xaa\xa8\xaa\xa9\xaa\xaa\x6a\xda\xaa\xab\x6a\xd6\x6a\xd9\xaa\xac\x4d\xfc\xaa\xad\x6a\xd7\x6a\xd8\xaa\xae\xaa\xaf\xaa\xb0\xaa\xb1\xaa\xb2\xaa\xb3\xaa\xb4\x4c\xe1\x56\xc6\x6a\xdb\xaa\xb5\x49\xd9\xaa\xb6\xaa\xb7\x52\x73\xaa\xb8\xaa\xb9\x5a\xe2\x50\x57\xaa\xba\xaa\xbb\xaa\xbc\xaa\xbd\xaa\xbe\xaa\xbf\xaa\xc0\x6a\xdc\xaa\xc1\xaa\xc2\xaa\xc3\xaa\xc4\xaa\xc5\xaa\xc6\x53\x54\xaa\xc7\xaa\xc8\xaa\xc9\xaa\xca\xaa\xcb\xaa\xcc\xaa\xcd\xaa\xce\x6a\xe8\xaa\xcf\xaa\xd0\x58\x55\xaa\xd1\xaa\xd2\xaa\xd3\xaa\xd4", /* 7d00 */ "\xaa\xd5\xaa\xd6\xaa\xd7\xaa\xd8\xaa\xd9\xaa\xda\xaa\xdb\xaa\xdc\xaa\xdd\xaa\xde\x57\xc8\xaa\xdf\xaa\xe0\xaa\xe1\xaa\xe2\xaa\xe3\xaa\xe4\xaa\xe5\xaa\xe6\xaa\xe7\xaa\xe8\xaa\xe9\xaa\xea\xaa\xeb\xaa\xec\xaa\xed\xaa\xee\xaa\xef\xaa\xf0\xaa\xf1\xaa\xf2\xaa\xf3\x56\x78\xaa\xf4\x56\x98\xaa\xf5\xaa\xf6\xaa\xf7\xaa\xf8\x4f\x95\xaa\xf9\xaa\xfa\xaa\xfb\x5c\x6f\xaa\xfc\xaa\xfd\xab\x41\x50\xda\xab\x42\xab\x43\xab\x44\xab\x45\xab\x46\xab\x47\xab\x48\xab\x49\xab\x4a\xab\x4b\xab\x4c\xab\x4d\xab\x4e\xab\x4f\xab\x50\xab\x51\xab\x52\xab\x53\xab\x54\xab\x55\xab\x56\xab\x57\xab\x58\xab\x59\xab\x5a\xab\x5b\xab\x5c\xab\x5d\xab\x5e\xab\x5f\xab\x60\xab\x61\xab\x62\xab\x63\xab\x64\xab\x65\xab\x66\xab\x67\xab\x68\xab\x69\xab\x6a\xab\x6b\xab\x6c\xab\x6d\xab\x6e\xab\x6f\xab\x70\xab\x71\xab\x72\xab\x73\xab\x74\xab\x75\xab\x76\xab\x77\xab\x78\xab\x79\xab\x7a\xab\x7b\xab\x7c\xab\x7d\xab\x7e\xab\x7f\x58\xf4\xab\x81\xab\x82\xab\x83\xab\x84\xab\x85\xab\x86\xab\x87\xab\x88\x6a\xe9\xab\x89\xab\x8a\xab\x8b\xab\x8c\xab\x8d\xab\x8e\xab\x8f\xab\x90", /* 7d80 */ "\xab\x91\xab\x92\xab\x93\xab\x94\xab\x95\xab\x96\xab\x97\xab\x98\xab\x99\xab\x9a\xab\x9b\xab\x9c\xab\x9d\xab\x9e\xab\x9f\xab\xa0\xab\xa1\xab\xa2\xab\xa3\xab\xa4\xab\xa5\xab\xa6\xab\xa7\xab\xa8\xab\xa9\xab\xaa\xab\xab\xab\xac\xab\xad\xab\xae\xab\xaf\xab\xb0\xab\xb1\xab\xb2\xab\xb3\xab\xb4\xab\xb5\xab\xb6\x6a\xea\xab\xb7\xab\xb8\xab\xb9\xab\xba\xab\xbb\xab\xbc\xab\xbd\x6a\xeb\xab\xbe\xab\xbf\xab\xc0\xab\xc1\xab\xc2\xab\xc3\xab\xc4\xab\xc5\xab\xc6\xab\xc7\xab\xc8\xab\xc9\xab\xca\xab\xcb\xab\xcc\xab\xcd\xab\xce\xab\xcf\xab\xd0\xab\xd1\xab\xd2\xab\xd3\xab\xd4\xab\xd5\xab\xd6\xab\xd7\xab\xd8\xab\xd9\xab\xda\xab\xdb\xab\xdc\xab\xdd\xab\xde\xab\xdf\xab\xe0\xab\xe1\xab\xe2\xab\xe3\xab\xe4\xab\xe5\xab\xe6\xab\xe7\xab\xe8\xab\xe9\xab\xea\xab\xeb\xab\xec\xab\xed\xab\xee\xab\xef\xab\xf0\xab\xf1\xab\xf2\xab\xf3\xab\xf4\xab\xf5\xab\xf6\xab\xf7\xab\xf8\xab\xf9\xab\xfa\xab\xfb\xab\xfc\xab\xfd\xac\x41\xac\x42\xac\x43\xac\x44\xac\x45\xac\x46\xac\x47\xac\x48\xac\x49\xac\x4a\xac\x4b\xac\x4c\xac\x4d\xac\x4e\xac\x4f\xac\x50\xac\x51", /* 7e00 */ "\xac\x52\xac\x53\xac\x54\xac\x55\xac\x56\xac\x57\xac\x58\xac\x59\xac\x5a\xac\x5b\xac\x5c\xac\x5d\xac\x5e\xac\x5f\xac\x60\xac\x61\xac\x62\xac\x63\xac\x64\xac\x65\xac\x66\xac\x67\xac\x68\xac\x69\xac\x6a\xac\x6b\xac\x6c\xac\x6d\xac\x6e\xac\x6f\xac\x70\xac\x71\xac\x72\xac\x73\xac\x74\xac\x75\xac\x76\xac\x77\xac\x78\xac\x79\xac\x7a\xac\x7b\xac\x7c\xac\x7d\xac\x7e\xac\x7f\xac\x81\xac\x82\xac\x83\xac\x84\xac\x85\xac\x86\xac\x87\xac\x88\xac\x89\xac\x8a\xac\x8b\xac\x8c\xac\x8d\x6c\x84\xac\x8e\xac\x8f\xac\x90\xac\x91\xac\x92\x4c\x51\xac\x93\xac\x94\xac\x95\xac\x96\xac\x97\x6a\xec\xac\x98\xac\x99\xac\x9a\xac\x9b\xac\x9c\xac\x9d\xac\x9e\xac\x9f\xac\xa0\xac\xa1\xac\xa2\xac\xa3\xac\xa4\xac\xa5\xac\xa6\xac\xa7\xac\xa8\xac\xa9\xac\xaa\xac\xab\xac\xac\xac\xad\xac\xae\xac\xaf\xac\xb0\xac\xb1\xac\xb2\xac\xb3\xac\xb4\xac\xb5\xac\xb6\xac\xb7\xac\xb8\xac\xb9\xac\xba\xac\xbb\xac\xbc\xac\xbd\xac\xbe\xac\xbf\xac\xc0\xac\xc1\xac\xc2\xac\xc3\xac\xc4\xac\xc5\xac\xc6\xac\xc7\xac\xc8\xac\xc9\xac\xca\xac\xcb\xac\xcc\xac\xcd\xac\xce\xac\xcf", /* 7e80 */ "\xac\xd0\xac\xd1\x5c\x8c\xac\xd2\xac\xd3\xac\xd4\xac\xd5\xac\xd6\xac\xd7\xac\xd8\xac\xd9\xac\xda\xac\xdb\xac\xdc\xac\xdd\xac\xde\xac\xdf\xac\xe0\xac\xe1\xac\xe2\xac\xe3\xac\xe4\xac\xe5\xac\xe6\xac\xe7\xac\xe8\xac\xe9\x6a\xed\xac\xea\xac\xeb\xac\xec\x63\xf8\x4f\xbf\x63\xf9\x4d\xeb\x63\xfa\x58\x6b\x63\xfb\x5a\xbb\x4e\xb5\x63\xfc\x63\xfd\x4e\xcc\x54\xd1\x57\xb2\x64\x41\xac\xed\x4a\xbe\x64\x42\x55\x54\x4c\xd8\x52\xc8\xac\xee\x5c\x7d\x51\xd9\x4c\x77\x5b\xbc\x57\xc5\x4c\x64\xac\xef\xac\xf0\x53\x46\x64\x43\x58\x7f\x64\x44\x64\x45\x64\x46\x51\x57\x5c\x8a\x55\x91\x58\x58\x5b\xae\x5b\xd4\x64\x47\x48\xec\x64\x48\x64\x49\x55\x7c\x59\xee\x4f\xac\x64\x4a\x48\xf2\x54\xdd\x4f\x82\x64\x4b\x54\xc5\xac\xf1\x64\x4c\x4e\x87\x4c\xf7\x59\x44\x64\x4d\x51\xe6\x4f\xf7\x4f\x6a\x57\x53\x64\x4e\x64\x4f\x4f\xed\x58\xe4\xac\xf2\x56\x88\x56\xcf\x4e\xcb\x64\x50\x4e\xa7\x58\xf6\x64\x51\xac\xf3\x58\xf7\x64\x52\x64\x53\x4a\xc1\x64\x54\x64\x55\x55\x9f\x57\xab\x52\x81\x64\x57\x49\x61\x4a\x92\xac\xf4\x64\x58\x64\x59\x5c\x7b\x5b\x60\x64\x5a\x51\xcb", /* 7f00 */ "\x5c\x5a\x64\x5b\x64\x5c\x64\x5d\x4e\xe9\x52\x86\x50\xc1\x64\x5e\x64\x5f\x4e\xa8\xac\xf5\x64\x60\x64\x61\x64\x56\x4b\xcf\x64\x62\xac\xf6\x64\x63\x64\x64\x4e\x5a\x4b\x7e\x51\xc5\x49\x81\x64\x65\x5a\xb4\x64\x66\x4c\xbe\x64\x68\x64\x67\x4c\x8d\xac\xf7\x64\x69\x49\xf7\x64\x6a\x64\x6b\x64\x6c\x64\x6d\x64\x6e\x64\x6f\x64\x70\x5a\x47\x56\x96\x64\x71\x64\x72\x64\x73\x64\x74\x55\x69\x64\x75\x64\x76\x64\x77\x64\x78\x64\x79\x4f\x69\x64\x7a\x6a\x5e\xac\xf8\x4c\xd6\xac\xf9\x54\xb0\xac\xfa\xac\xfb\xac\xfc\xac\xfd\xad\x41\xad\x42\xad\x43\x6a\x5f\xad\x44\x6a\x60\x6a\x61\xad\x45\xad\x46\xad\x47\xad\x48\xad\x49\xad\x4a\xad\x4b\xad\x4c\xad\x4d\xad\x4e\x4d\x7e\x57\x99\xad\x4f\xad\x50\x5c\xe7\x4d\xb0\xad\x51\x51\xdd\x67\xb6\xad\x52\x4c\x43\xad\x53\xad\x54\xad\x55\xad\x56\x67\xb8\xad\x57\x67\xb7\x48\xd4\xad\x58\xad\x59\xad\x5a\xad\x5b\xad\x5c\x67\xba\x5b\x76\x5c\x90\xad\x5d\xad\x5e\xad\x5f\x5b\xc2\xad\x60\xad\x61\x67\xbc\x55\xef\xad\x62\x67\xbb\xad\x63\xad\x64\xad\x65\xad\x66\x67\xbd\xad\x67\xad\x68\xad\x69\xad\x6a\x67\xbf\xad\x6b", /* 7f80 */ "\xad\x6c\x67\xbe\xad\x6d\xad\x6e\xad\x6f\xad\x70\xad\x71\xad\x72\xad\x73\xad\x74\x59\x93\xad\x75\x54\x5c\xad\x76\x52\x60\xad\x77\xad\x78\xad\x79\xad\x7a\xad\x7b\x4c\xe0\xad\x7c\xad\x7d\xad\x7e\xad\x7f\xad\x81\x51\x88\xad\x82\xad\x83\x6a\xc5\x58\xde\x6a\xc6\xad\x84\x58\x7b\xad\x85\xad\x86\x54\xb9\xad\x87\xad\x88\x6a\xc7\xad\x89\xad\x8a\xad\x8b\xad\x8c\xad\x8d\xad\x8e\xad\x8f\x6a\xc8\x6a\xc9\xad\x90\x6a\xca\xad\x91\xad\x92\xad\x93\xad\x94\xad\x95\x5d\x9b\x4c\xfd\xad\x96\xad\x97\x63\x92\x5a\x91\xad\x98\x6a\xdf\xad\x99\x57\xcb\xad\x9a\xad\x9b\xad\x9c\x4a\x82\xad\x9d\xad\x9e\xad\x9f\xad\xa0\x69\x54\xad\xa1\x59\xed\xad\xa2\x6a\xe0\xad\xa3\xad\xa4\xad\xa5\xad\xa6\xad\xa7\x58\x89\x6a\xe1\xad\xa8\xad\xa9\x54\x6c\xad\xaa\xad\xab\xad\xac\xad\xad\xad\xae\xad\xaf\x4b\x74\x4a\xe3\x6a\xe3\xad\xb0\xad\xb1\xad\xb2\x6a\xe2\x6a\xe4\xad\xb3\xad\xb4\x6a\xe5\xad\xb5\xad\xb6\xad\xb7\xad\xb8\x6a\xe6\xad\xb9\x4d\xb1\x48\xbe\xad\xba\x6a\xe7\xad\xbb\xad\xbc\xad\xbd\xad\xbe\xad\xbf\xad\xc0\xad\xc1\x4c\x4d\x59\xec\xad\xc2\xad\xc3\xad\xc4", /* 8000 */ "\x59\xaa\x50\xce\xad\xc5\x50\x5c\x66\x43\x5b\x7f\x65\xc7\xad\xc6\xad\xc7\xad\xc8\xad\xc9\x69\x94\x4b\xf7\x56\x43\xad\xca\xad\xcb\x52\xcc\xad\xcc\x69\x88\xad\xcd\x69\x89\x4c\xfa\x69\x8a\x4d\xc3\x5a\xc4\x48\xd1\xad\xce\xad\xcf\x69\x8b\xad\xd0\xad\xd1\xad\xd2\x69\x8c\xad\xd3\x69\x8d\xad\xd4\xad\xd5\x69\x8e\x69\x8f\x69\x90\x69\x92\x69\x91\x53\x75\xad\xd6\xad\xd7\xad\xd8\xad\xd9\xad\xda\xad\xdb\x69\x93\xad\xdc\x4b\xf9\xad\xdd\x69\x95\x59\xad\x5f\xc6\x56\x6a\xad\xde\xad\xdf\x4a\x7c\xad\xe0\x4b\x42\xad\xe1\x4d\x42\xad\xe2\xad\xe3\x52\xf3\x69\x96\xad\xe4\xad\xe5\x69\x97\xad\xe6\xad\xe7\xad\xe8\x51\x64\x51\x9c\x5b\xaf\x69\x98\xad\xe9\xad\xea\xad\xeb\xad\xec\x69\x99\xad\xed\x51\x4a\xad\xee\xad\xef\xad\xf0\x53\xb7\xad\xf1\x4f\xda\xad\xf2\xad\xf3\xad\xf4\xad\xf5\xad\xf6\xad\xf7\xad\xf8\xad\xf9\xad\xfa\xad\xfb\xad\xfc\xad\xfd\xae\x41\xae\x42\x69\x9a\x4a\xce\xae\x43\xae\x44\xae\x45\xae\x46\xae\x47\xae\x48\x69\x9b\xae\x49\xae\x4a\xae\x4b\xae\x4c\xae\x4d\xae\x4e\xae\x4f\xae\x50\xae\x51\xae\x52\xae\x53\xae\x54\xae\x55\x67\x52", /* 8080 */ "\x67\x51\xae\x56\xae\x57\x56\x81\x59\xdd\xae\x58\x56\x61\x5b\x78\xae\x59\x54\xe1\xae\x5a\x50\xde\x4e\xa0\xae\x5b\xae\x5c\xae\x5d\xae\x5e\xae\x5f\xae\x60\x66\x61\xae\x61\xae\x62\x58\xa3\xae\x63\x5b\xe1\xae\x64\x4b\xc6\x4c\xd7\x66\x60\x4c\xcd\xae\x65\x66\x5f\x4a\x46\x4d\x69\x5b\xaa\xae\x66\x4c\x95\x4c\x6a\xae\x67\xae\x68\xae\x69\x4e\xe6\x4c\x5e\x66\x66\xae\x6a\x66\x67\x48\xb8\x50\x6f\xae\x6b\x66\x65\x5a\x9e\xae\x6c\x66\x68\xae\x6d\xae\x6e\x66\x69\xae\x6f\xae\x70\x4c\x6e\xae\x71\x66\x62\x66\x64\x55\x97\x5b\xd6\x5b\x6d\x58\xb1\x66\x6f\x57\xb7\x66\x70\xae\x72\x4b\x48\xae\x73\xae\x74\xae\x75\xae\x76\xae\x77\x49\x53\x66\x72\x56\xa4\xae\x78\xae\x79\xae\x7a\xae\x7b\xae\x7c\xae\x7d\xae\x7e\x53\x76\x66\x73\xae\x7f\x66\x71\x53\x7f\x66\x6e\x55\xa3\x66\x75\x48\xfa\xae\x81\xae\x82\x4d\xf9\xae\x83\xae\x84\x5c\xb6\x69\x84\xae\x85\x66\x6a\x66\x6b\x66\x6c\x66\x6d\x66\x76\x63\xbf\x66\x79\xae\x86\x50\x89\x59\xc7\x66\x77\x66\x7c\x4c\xeb\x66\x78\xae\x87\x4f\x5a\xae\x88\x58\xd7\xae\x89\x48\xb6\xae\x8a\x66\x7d\x52\xdb\xae\x8b\xae\x8c", /* 8100 */ "\xae\x8d\xae\x8e\x5b\xab\xae\x8f\xae\x90\xae\x91\x4a\xdf\xae\x92\xae\x93\x51\xf5\x4e\xb8\xae\x94\xae\x95\x66\x7a\x66\x7b\x5a\xdf\x53\xe9\x52\xd3\x66\x7f\x53\x47\x5d\x96\xae\x96\x49\xb0\xae\x97\x66\x85\xae\x98\x4f\x65\xae\x99\xae\x9a\xae\x9b\x66\x83\xae\x9c\xae\x9d\xae\x9e\xae\x9f\xae\xa0\xae\xa1\xae\xa2\xae\xa3\xae\xa4\xae\xa5\xae\xa6\xae\xa7\xae\xa8\x66\x84\xae\xa9\xae\xaa\x4c\xab\xae\xab\x57\x71\x66\x86\xae\xac\xae\xad\xae\xae\x66\x82\xae\xaf\x51\x53\xae\xb0\xae\xb1\xae\xb2\xae\xb3\xae\xb4\x53\xa1\xae\xb5\xae\xb6\xae\xb7\xae\xb8\xae\xb9\xae\xba\xae\xbb\x56\xf2\xae\xbc\x66\x87\xae\xbd\x50\xaf\x59\xb7\x66\x88\xae\xbe\xae\xbf\xae\xc0\x4c\xae\x4c\xac\xae\xc1\x66\x89\x54\x5b\x57\x94\xae\xc2\xae\xc3\xae\xc4\x66\x8b\x66\x8c\xae\xc5\xae\xc6\xae\xc7\xae\xc8\xae\xc9\x66\x8e\xae\xca\xae\xcb\xae\xcc\xae\xcd\x58\xc7\xae\xce\x66\x93\xae\xcf\x66\x8f\xae\xd0\xae\xd1\xae\xd2\x66\x92\x54\xf8\xae\xd3\x59\x9d\x66\x8d\xae\xd4\xae\xd5\x66\x8a\xae\xd6\xae\xd7\xae\xd8\xae\xd9\x4c\xb8\x58\x79\x52\xe4\x66\x90\x66\x91\x56\xd9\x57\x68", /* 8180 */ "\x48\xf1\xae\xda\x66\x97\xae\xdb\xae\xdc\xae\xdd\xae\xde\xae\xdf\x66\x96\xae\xe0\x49\xb1\xae\xe1\xae\xe2\xae\xe3\xae\xe4\x4c\xdf\xae\xe5\x66\x98\xae\xe6\xae\xe7\xae\xe8\xae\xe9\xae\xea\xae\xeb\x49\x8d\xae\xec\xae\xed\x56\xc4\x52\xa3\x58\x45\xae\xee\xae\xef\xae\xf0\xae\xf1\xae\xf2\x66\x9a\xae\xf3\xae\xf4\x66\xa1\xae\xf5\x53\x93\xae\xf6\x66\x9b\xae\xf7\xae\xf8\xae\xf9\xae\xfa\xae\xfb\xae\xfc\xae\xfd\xaf\x41\x55\x65\xaf\x42\xaf\x43\xaf\x44\xaf\x45\xaf\x46\xaf\x47\x61\xde\x66\x9f\xaf\x48\xaf\x49\xaf\x4a\xaf\x4b\x57\x6e\x66\xa0\x49\x7b\x5a\x57\xaf\x4c\xaf\x4d\x59\xdb\xaf\x4e\xaf\x4f\xaf\x50\x66\x9e\xaf\x51\x66\x9c\xaf\x52\xaf\x53\xaf\x54\xaf\x55\xaf\x56\xaf\x57\xaf\x58\xaf\x59\xaf\x5a\xaf\x5b\xaf\x5c\xaf\x5d\xaf\x5e\xaf\x5f\xaf\x60\xaf\x61\xaf\x62\xaf\x63\xaf\x64\xaf\x65\xaf\x66\xaf\x67\x4a\x5c\xaf\x68\xaf\x69\xaf\x6a\x65\xaf\xaf\x6b\xaf\x6c\x5c\x74\xaf\x6d\x6a\xaa\x4a\x95\xaf\x6e\xaf\x6f\xaf\x70\xaf\x71\xaf\x72\x5b\xc0\x5b\xc1\xaf\x73\xaf\x74\xaf\x75\xaf\x76\xaf\x77\xaf\x78\x5b\x8a\x4f\xc9\xaf\x79\x6a\xa6\xaf\x7a", /* 8200 */ "\x59\xa7\x6a\xa7\x6a\xa8\xaf\x7b\x6a\xa9\x4f\xca\x5a\x7f\xaf\x7c\xaf\x7d\xaf\x7e\xaf\x7f\xaf\x81\x55\x81\x55\x82\xaf\x82\xaf\x83\x6a\x62\xaf\x84\x55\xe5\xaf\x85\x56\xf1\xaf\x86\xaf\x87\xaf\x88\xaf\x89\xaf\x8a\xaf\x8b\x61\xb5\x56\x54\xaf\x8c\x57\xe7\x5b\xda\xaf\x8d\x6a\xac\x6a\xad\x6a\xae\xaf\x8e\xaf\x8f\xaf\x90\xaf\x91\x6a\xb1\xaf\x92\x4d\xbc\x6a\xb2\x48\xe2\x6a\xaf\xaf\x93\x6a\xb0\x4f\x42\x49\xd4\xaf\x94\x6a\xb5\x6a\xb6\x4b\xe5\x49\xaf\x58\x6f\x6a\xb3\x4a\xab\xaf\x95\x6a\xb4\xaf\x96\xaf\x97\x6a\xb7\xaf\x98\xaf\x99\xaf\x9a\xaf\x9b\xaf\x9c\x6a\xb8\xaf\x9d\xaf\x9e\x57\x47\xaf\x9f\x6a\xb9\xaf\xa0\x6a\xba\xaf\xa1\xaf\xa2\xaf\xa3\x6a\xbb\xaf\xa4\xaf\xa5\xaf\xa6\xaf\xa7\xaf\xa8\xaf\xa9\xaf\xaa\xaf\xab\x56\x72\xaf\xac\x6a\xbc\xaf\xad\xaf\xae\xaf\xaf\xaf\xb0\x6a\xbd\xaf\xb1\xaf\xb2\xaf\xb3\xaf\xb4\xaf\xb5\xaf\xb6\xaf\xb7\xaf\xb8\x6a\xbe\xaf\xb9\xaf\xba\xaf\xbb\xaf\xbc\xaf\xbd\x6a\xdd\x51\x5c\x4e\xe7\xaf\xbe\x55\x4b\x59\x7e\x63\x96\xaf\xbf\xaf\xc0\xaf\xc1\xaf\xc2\x5e\xb2\x59\xd4\xaf\xc3\xaf\xc4\x5e\xb3\x48\xab\x5e\xb4", /* 8280 */ "\xaf\xc5\xaf\xc6\x4f\x7a\xaf\xc7\x5e\xb8\xaf\xc8\xaf\xc9\xaf\xca\x5c\xc1\xaf\xcb\x5e\xb6\x5a\x94\xaf\xcc\x55\x76\x5e\xb9\x5e\xb5\xaf\xcd\x5e\xba\x52\x42\xaf\xce\xaf\xcf\xaf\xd0\xaf\xd1\x5e\xbb\x5e\xc4\x5e\xbc\xaf\xd2\xaf\xd3\x57\xde\x5b\xa4\xaf\xd4\x5e\xce\xaf\xd5\x5e\xcc\xaf\xd6\xaf\xd7\x5e\xd1\x4f\x87\x51\xaa\xaf\xd8\x5e\xb7\x5e\xca\x5e\xcd\x5e\xbd\x4c\x72\x48\xc4\x5e\xc6\x58\xbd\x5e\xc0\x4e\x48\xaf\xd9\x4c\x5c\x5e\xcb\xaf\xda\xaf\xdb\x5e\xc5\x5e\xbe\x54\x7b\xaf\xdc\xaf\xdd\xaf\xde\x59\x5f\x5e\xbf\xaf\xdf\xaf\xe0\x5e\xc9\xaf\xe1\xaf\xe2\x5e\xcf\xaf\xe3\xaf\xe4\x57\xac\x5e\xc1\xaf\xe5\x5e\xc2\x5e\xc7\x5e\xc8\x49\xd3\x5e\xd0\x56\x75\xaf\xe6\x5a\xb6\x5e\xda\x5e\xde\x56\xa5\x5e\xe5\xaf\xe7\x52\x88\x5e\xdb\xaf\xe8\xaf\xe9\x50\x61\x5e\xd8\xaf\xea\x48\xf9\x4d\x56\x5e\xe4\x5e\xd2\xaf\xeb\x5e\xc3\x5e\xd5\x54\xf3\x50\x81\xaf\xec\xaf\xed\xaf\xee\xaf\xef\x55\x5b\xaf\xf0\xaf\xf1\xaf\xf2\x49\x5d\xaf\xf3\x5a\x42\xaf\xf4\xaf\xf5\x5e\xd9\xaf\xf6\xaf\xf7\x5e\xd4\xaf\xf8\x53\xba\xaf\xf9\x5e\xdd\xaf\xfa\xaf\xfb\xaf\xfc\xaf\xfd", /* 8300 */ "\xb0\x41\x5c\x62\x52\x4f\x4c\x56\x54\x71\x52\x49\x5e\xe1\x5e\xd7\x5e\xea\x5e\xd3\xb0\x42\xb0\x43\x5e\xdc\xb0\x44\x4f\xa4\x5e\xd6\xb0\x45\x5e\xdf\xb0\x46\xb0\x47\x5e\xe2\x5e\xe3\xb0\x48\x5e\xf7\xb0\x49\xb0\x4a\x5e\xe0\x5f\x42\x5e\xe6\xb0\x4b\xb0\x4c\xb0\x4d\xb0\x4e\xb0\x4f\xb0\x50\xb0\x51\xb0\x52\xb0\x53\xb0\x54\x4e\xea\x4a\xc3\xb0\x55\xb0\x56\x52\x43\x49\xe6\x5e\xf9\xb0\x57\x5e\xf1\xb0\x58\x5e\xee\xb0\x59\x5e\xfb\x5e\xed\x59\xef\x49\xe7\xb0\x5a\x54\xd6\x54\xe2\x5e\xfa\xb0\x5b\x5e\xec\xb0\x5c\xb0\x5d\xb0\x5e\x5e\xf6\xb0\x5f\xb0\x60\x5e\xf4\xb0\x61\xb0\x62\x4f\xa2\x5e\xf3\xb0\x63\x49\xdc\xb0\x64\xb0\x65\xb0\x66\xb0\x67\xb0\x68\x5e\xf2\x4e\xf5\x5e\xe7\x4e\x64\xb0\x69\x50\xf2\xb0\x6a\xb0\x6b\xb0\x6c\xb0\x6d\xb0\x6e\x4e\xd3\x5e\xe8\x5e\xe9\xb0\x6f\x5e\xf0\x5e\xf5\x5e\xf8\x4b\x54\xb0\x70\x54\xd8\x4e\x88\x5e\xfd\x5e\xfc\x5a\x4b\x5f\x41\x5f\x43\x5f\x45\x59\xf0\x5f\x44\x5f\x46\x5f\x47\x59\xa8\xb0\x71\xb0\x72\xb0\x73\xb0\x74\xb0\x75\xb0\x76\xb0\x77\x4d\xc8\x5f\x49\xb0\x78\xb0\x79\x5f\x56\x5f\x51\x5f\x54\xb0\x7a\xb0\x7b", /* 8380 */ "\xb0\x7c\xb0\x7d\xb0\x7e\xb0\x7f\xb0\x81\x5f\x50\x53\xcd\xb0\x82\xb0\x83\x50\xf1\xb0\x84\xb0\x85\xb0\x86\xb0\x87\x55\x4f\xb0\x88\xb0\x89\xb0\x8a\x5e\xeb\x5f\x4e\xb0\x8b\xb0\x8c\xb0\x8d\xb0\x8e\x5f\x57\xb0\x8f\xb0\x90\x5e\xef\x5f\x4f\xb0\x91\x5f\x58\xb0\x92\x5f\x4c\xb0\x93\xb0\x94\xb0\x95\xb0\x96\xb0\x97\xb0\x98\xb0\x99\x5f\x59\x5f\x53\x5f\x4d\x52\xa9\xb0\x9a\xb0\x9b\xb0\x9c\xb0\x9d\x5f\x48\x50\xb2\x51\x4b\x5f\x4a\x5f\x4b\xb0\x9e\x5f\x52\x4e\x92\x5f\x55\x5a\x48\x5f\x5a\xb0\x9f\x5f\x5b\x52\x47\xb0\xa0\xb0\xa1\x5f\x72\x5f\x5c\xb0\xa2\xb0\xa3\xb0\xa4\x5f\x71\xb0\xa5\x4d\x5d\xb0\xa6\xb0\xa7\x4f\xd4\xb0\xa8\x4f\xf9\xb0\xa9\xb0\xaa\x4d\xc9\xb0\xab\xb0\xac\xb0\xad\xb0\xae\x5f\x6a\xb0\xaf\x5f\x65\xb0\xb0\x5f\x5f\xb0\xb1\xb0\xb2\xb0\xb3\x49\xca\x5f\x63\xb0\xb4\x5f\x6b\x49\xa3\x5f\x75\xb0\xb5\xb0\xb6\xb0\xb7\x5f\x5e\xb0\xb8\xb0\xb9\xb0\xba\x53\xcf\x5f\x70\xb0\xbb\xb0\xbc\xb0\xbd\xb0\xbe\xb0\xbf\x5f\x74\x51\x83\x4c\x66\xb0\xc0\xb0\xc1\xb0\xc2\xb0\xc3\xb0\xc4\x5f\x6e\x5f\x6f\xb0\xc5\xb0\xc6\xb0\xc7\x5f\x64\xb0\xc8\xb0\xc9", /* 8400 */ "\xb0\xca\x5f\x5d\xb0\xcb\x5f\x6d\x56\xd0\xb0\xcc\x5f\x69\xb0\xcd\xb0\xce\xb0\xcf\xb0\xd0\x5f\x62\x52\x68\x53\xbb\x57\xad\x5f\x6c\xb0\xd1\x5f\x68\xb0\xd2\xb0\xd3\xb0\xd4\xb0\xd5\xb0\xd6\xb0\xd7\x5f\x61\xb0\xd8\xb0\xd9\xb0\xda\x5f\x66\x51\xdb\xb0\xdb\xb0\xdc\xb0\xdd\xb0\xde\xb0\xdf\xb0\xe0\x5a\x49\x5a\x4a\x5f\x73\x58\x95\x54\xf7\xb0\xe1\xb0\xe2\xb0\xe3\xb0\xe4\xb0\xe5\xb0\xe6\xb0\xe7\xb0\xe8\x5f\x87\xb0\xe9\xb0\xea\xb0\xeb\xb0\xec\xb0\xed\xb0\xee\x5f\x67\xb0\xef\xb0\xf0\xb0\xf1\x5f\x81\x51\xe3\xb0\xf2\xb0\xf3\xb0\xf4\xb0\xf5\xb0\xf6\xb0\xf7\xb0\xf8\xb0\xf9\x5f\x82\xb0\xfa\xb0\xfb\xb0\xfc\xb0\xfd\xb1\x41\xb1\x42\xb1\x43\xb1\x44\xb1\x45\xb1\x46\x5f\x77\xb1\x47\xb1\x48\xb1\x49\xb1\x4a\xb1\x4b\x5b\xf7\xb1\x4c\x5f\x79\x5f\x78\x4c\xef\x5f\x76\xb1\x4d\xb1\x4e\xb1\x4f\xb1\x50\x53\xce\xb1\x51\x4b\xac\xb1\x52\xb1\x53\xb1\x54\xb1\x55\xb1\x56\x5f\x83\xb1\x57\x4d\xf8\x5a\xe0\x5f\x88\xb1\x58\xb1\x59\xb1\x5a\x4a\xcf\xb1\x5b\x5f\x7a\xb1\x5c\x50\x9c\x5f\x84\xb1\x5d\x5f\x7f\xb1\x5e\x5f\x7d\xb1\x5f\xb1\x60\xb1\x61\xb1\x62\xb1\x63", /* 8480 */ "\xb1\x64\xb1\x65\x4b\x79\xb1\x66\xb1\x67\xb1\x68\xb1\x69\x5f\x7b\x5f\x7c\x5f\x7e\xb1\x6a\x4f\x4f\x5f\x85\xb1\x6b\x5f\x86\xb1\x6c\xb1\x6d\xb1\x6e\xb1\x6f\xb1\x70\xb1\x71\xb1\x72\xb1\x73\x5f\x96\xb1\x74\x52\x69\xb1\x75\xb1\x76\x56\x83\xb1\x77\xb1\x78\xb1\x79\xb1\x7a\x5f\x93\xb1\x7b\xb1\x7c\xb1\x7d\xb1\x7e\xb1\x7f\xb1\x81\xb1\x82\xb1\x83\xb1\x84\xb1\x85\xb1\x86\xb1\x87\xb1\x88\x5c\xe0\xb1\x89\xb1\x8a\x53\xd0\xb1\x8b\x5f\x95\xb1\x8c\xb1\x8d\xb1\x8e\x5b\x95\x5f\x94\x5f\x91\xb1\x8f\xb1\x90\x5f\x8d\xb1\x91\x5f\x90\xb1\x92\x5f\x89\xb1\x93\xb1\x94\x58\xed\xb1\x95\xb1\x96\xb1\x97\xb1\x98\x54\xd7\x5f\x8f\xb1\x99\xb1\x9a\x5f\x8a\xb1\x9b\xb1\x9c\x5f\x8b\x56\x93\xb1\x9d\x5f\x8e\xb1\x9e\xb1\x9f\x49\x6d\xb1\xa0\xb1\xa1\xb1\xa2\xb1\xa3\xb1\xa4\xb1\xa5\x50\xb5\xb1\xa6\x4e\xba\x5f\x92\xb1\xa7\xb1\xa8\x5f\x98\xb1\xa9\x5f\x97\x5f\x8c\xb1\xaa\xb1\xab\xb1\xac\xb1\xad\xb1\xae\x53\x8f\xb1\xaf\xb1\xb0\xb1\xb1\x5f\x9c\xb1\xb2\xb1\xb3\xb1\xb4\xb1\xb5\xb1\xb6\xb1\xb7\xb1\xb8\xb1\xb9\xb1\xba\xb1\xbb\xb1\xbc\x5f\xa3\xb1\xbd\xb1\xbe\x5f\xa2", /* 8500 */ "\xb1\xbf\xb1\xc0\xb1\xc1\xb1\xc2\xb1\xc3\xb1\xc4\xb1\xc5\xb1\xc6\xb1\xc7\xb1\xc8\xb1\xc9\xb1\xca\x5f\x99\xb1\xcb\xb1\xcc\xb1\xcd\xb1\xce\x52\x90\xb1\xcf\x51\xfa\xb1\xd0\xb1\xd1\xb1\xd2\x5b\x82\xb1\xd3\xb1\xd4\x57\xb4\xb1\xd5\xb1\xd6\xb1\xd7\xb1\xd8\x5f\x9e\xb1\xd9\x49\xcb\xb1\xda\xb1\xdb\xb1\xdc\xb1\xdd\xb1\xde\xb1\xdf\xb1\xe0\xb1\xe1\xb1\xe2\x52\xe7\x55\xde\xb1\xe3\xb1\xe4\xb1\xe5\xb1\xe6\xb1\xe7\xb1\xe8\xb1\xe9\xb1\xea\xb1\xeb\xb1\xec\x54\x5e\x5f\x9b\x5f\x9d\x5f\x9f\x5f\xa1\x48\xa9\x49\x6e\xb1\xed\xb1\xee\xb1\xef\xb1\xf0\xb1\xf1\x5f\xab\xb1\xf2\xb1\xf3\xb1\xf4\xb1\xf5\x5f\xa5\x4f\x56\x54\xee\xb1\xf6\xb1\xf7\xb1\xf8\xb1\xf9\xb1\xfa\xb1\xfb\xb1\xfc\xb1\xfd\xb2\x41\xb2\x42\xb2\x43\x5f\xa0\xb2\x44\xb2\x45\x5f\xa4\xb2\x46\xb2\x47\xb2\x48\xb2\x49\x5f\xa8\xb2\x4a\xb2\x4b\xb2\x4c\xb2\x4d\xb2\x4e\x5f\xa7\xb2\x4f\xb2\x50\xb2\x51\x5f\xa6\xb2\x52\xb2\x53\xb2\x54\xb2\x55\xb2\x56\xb2\x57\xb2\x58\xb2\x59\xb2\x5a\x5f\xac\xb2\x5b\x5a\xcb\xb2\x5c\xb2\x5d\xb2\x5e\xb2\x5f\x5f\xb2\x5f\xa9\x5f\xad\xb2\x60\xb2\x61\x50\xd8\xb2\x62", /* 8580 */ "\xb2\x63\xb2\x64\xb2\x65\xb2\x66\x49\x41\x5f\xb5\xb2\x67\x5f\xb0\xb2\x68\xb2\x69\xb2\x6a\xb2\x6b\xb2\x6c\xb2\x6d\xb2\x6e\x5f\xb1\xb2\x6f\xb2\x70\xb2\x71\xb2\x72\xb2\x73\xb2\x74\xb2\x75\xb2\x76\xb2\x77\xb2\x78\xb2\x79\x59\x46\x5f\xb4\xb2\x7a\xb2\x7b\xb2\x7c\xb2\x7d\xb2\x7e\xb2\x7f\xb2\x81\x5f\xae\xb2\x82\xb2\x83\xb2\x84\x5f\xaf\xb2\x85\x58\xbc\xb2\x86\xb2\x87\xb2\x88\x5f\xb3\x55\xec\x5f\xb8\xb2\x89\xb2\x8a\xb2\x8b\xb2\x8c\xb2\x8d\xb2\x8e\x5f\xb7\xb2\x8f\x5f\xb6\xb2\x90\xb2\x91\xb2\x92\xb2\x93\xb2\x94\xb2\x95\xb2\x96\x5f\xba\xb2\x97\xb2\x98\xb2\x99\xb2\x9a\xb2\x9b\xb2\x9c\xb2\x9d\x4f\x86\xb2\x9e\xb2\x9f\xb2\xa0\xb2\xa1\xb2\xa2\x49\xd7\x52\x8b\xb2\xa3\xb2\xa4\x5f\xb9\xb2\xa5\x53\x5a\xb2\xa6\xb2\xa7\xb2\xa8\xb2\xa9\xb2\xaa\xb2\xab\x5f\xbb\xb2\xac\xb2\xad\xb2\xae\xb2\xaf\xb2\xb0\xb2\xb1\xb2\xb2\x56\xd8\xb2\xb3\xb2\xb4\xb2\xb5\xb2\xb6\x4c\x4a\xb2\xb7\xb2\xb8\xb2\xb9\xb2\xba\xb2\xbb\xb2\xbc\xb2\xbd\xb2\xbe\xb2\xbf\xb2\xc0\xb2\xc1\xb2\xc2\xb2\xc3\xb2\xc4\xb2\xc5\xb2\xc6\xb2\xc7\x5a\xe4\xb2\xc8\xb2\xc9\xb2\xca\x5f\xbc", /* 8600 */ "\xb2\xcb\xb2\xcc\xb2\xcd\xb2\xce\xb2\xcf\x5f\xbe\xb2\xd0\xb2\xd1\xb2\xd2\xb2\xd3\xb2\xd4\xb2\xd5\xb2\xd6\xb2\xd7\xb2\xd8\xb2\xd9\xb2\xda\x52\xa1\xb2\xdb\xb2\xdc\xb2\xdd\xb2\xde\x5f\xc0\xb2\xdf\xb2\xe0\xb2\xe1\xb2\xe2\xb2\xe3\xb2\xe4\xb2\xe5\xb2\xe6\xb2\xe7\xb2\xe8\xb2\xe9\xb2\xea\xb2\xeb\xb2\xec\xb2\xed\xb2\xee\x5f\xbd\xb2\xef\x5f\xbf\xb2\xf0\xb2\xf1\xb2\xf2\xb2\xf3\xb2\xf4\xb2\xf5\xb2\xf6\xb2\xf7\xb2\xf8\xb2\xf9\xb2\xfa\xb2\xfb\xb2\xfc\xb2\xfd\x5b\x5a\xb3\x41\xb3\x42\xb3\x43\x5f\xc1\xb3\x44\xb3\x45\xb3\x46\xb3\x47\xb3\x48\xb3\x49\xb3\x4a\xb3\x4b\xb3\x4c\xb3\x4d\xb3\x4e\xb3\x4f\xb3\x50\xb3\x51\xb3\x52\xb3\x53\x69\xad\x4e\x42\x51\xb1\x53\x50\x51\xc6\xb3\x54\xb3\x55\x69\xae\xb3\x56\xb3\x57\xb3\x58\xb3\x59\xb3\x5a\x58\xe8\xb3\x5b\xb3\x5c\xb3\x5d\x5a\x7d\xb3\x5e\xb3\x5f\xb3\x60\x66\x5d\xb3\x61\xb3\x62\xb3\x63\xb3\x64\xb3\x65\xb3\x66\xb3\x67\xb3\x68\x4a\x87\x69\xaf\xb3\x69\x69\xb0\xb3\x6a\xb3\x6b\x55\xac\xb3\x6c\xb3\x6d\xb3\x6e\xb3\x6f\xb3\x70\xb3\x71\xb3\x72\x4d\xe6\x69\xb2\x69\xb4\x69\xb3\x56\x85\x58\x5a\x69\xb1", /* 8680 */ "\x55\xb3\x59\xce\x51\xeb\xb3\x73\xb3\x74\xb3\x75\xb3\x76\xb3\x77\xb3\x78\xb3\x79\x57\xc2\x69\xb7\x48\xf5\x69\xb6\xb3\x7a\xb3\x7b\xb3\x7c\xb3\x7d\xb3\x7e\x69\xbd\xb3\x7f\x49\xce\xb3\x81\xb3\x82\xb3\x83\xb3\x84\xb3\x85\xb3\x86\x59\x61\x69\xb9\xb3\x87\xb3\x88\xb3\x89\xb3\x8a\xb3\x8b\x69\xbb\x5a\xe8\xb3\x8c\xb3\x8d\x69\xba\x69\xb5\x69\xbe\x69\xbc\xb3\x8e\x69\xb8\xb3\x8f\xb3\x90\x69\xc6\x69\xc3\x69\xc5\xb3\x91\xb3\x92\x69\xc9\x69\xc1\x69\xbf\xb3\x93\xb3\x94\xb3\x95\x69\xc4\xb3\x96\xb3\x97\xb3\x98\xb3\x99\xb3\x9a\x5b\xfa\xb3\x9b\xb3\x9c\xb3\x9d\x69\xc0\xb3\x9e\x54\x9a\x55\x7f\xb3\x9f\x69\xc7\x4d\x66\x4b\x50\xb3\xa0\xb3\xa1\x69\xc2\x69\xc8\x69\xcf\x69\xd5\xb3\xa2\xb3\xa3\x4e\x77\xb3\xa4\xb3\xa5\xb3\xa6\x69\xd4\x57\x7c\xb3\xa7\x5b\xea\xb3\xa8\xb3\xa9\x69\xd1\x69\xd3\xb3\xaa\xb3\xab\xb3\xac\xb3\xad\x4c\xf1\xb3\xae\xb3\xaf\xb3\xb0\xb3\xb1\x69\xca\xb3\xb2\xb3\xb3\xb3\xb4\x69\xcd\x51\xf8\xb3\xb5\x5b\x7d\x69\xcb\x69\xcc\x69\xce\x69\xd2\xb3\xb6\xb3\xb7\xb3\xb8\x69\xd8\x5a\x5c\xb3\xb9\xb3\xba\xb3\xbb\xb3\xbc\x4b\xe9\xb3\xbd", /* 8700 */ "\x55\xf0\xb3\xbe\x4c\x85\x69\xd6\xb3\xbf\xb3\xc0\xb3\xc1\x69\xd7\x69\xd9\x69\xdc\x69\xda\xb3\xc2\xb3\xc3\x69\xdb\xb3\xc4\xb3\xc5\xb3\xc6\xb3\xc7\x59\x71\x69\xd0\xb3\xc8\x57\x69\xb3\xc9\x57\xce\x5b\xa8\xb3\xca\x69\xe2\xb3\xcb\x52\x7b\xb3\xcc\x69\xdf\xb3\xcd\xb3\xce\x50\xae\x69\xeb\x69\xdd\xb3\xcf\x69\xe0\xb3\xd0\xb3\xd1\xb3\xd2\x69\xe7\xb3\xd3\xb3\xd4\xb3\xd5\xb3\xd6\x69\xe1\xb3\xd7\xb3\xd8\x69\xe6\xb3\xd9\xb3\xda\x69\xe5\xb3\xdb\xb3\xdc\x69\xe8\xb3\xdd\xb3\xde\xb3\xdf\x69\xde\xb3\xe0\xb3\xe1\x69\xe3\x69\xe9\xb3\xe2\xb3\xe3\xb3\xe4\xb3\xe5\xb3\xe6\xb3\xe7\xb3\xe8\x5a\x4c\x69\xe4\x49\xf4\xb3\xe9\xb3\xea\x69\xf1\xb3\xeb\x58\xaa\xb3\xec\xb3\xed\xb3\xee\xb3\xef\x69\xf4\xb3\xf0\xb3\xf1\xb3\xf2\x4e\x68\xb3\xf3\x69\xf8\xb3\xf4\xb3\xf5\xb3\xf6\xb3\xf7\xb3\xf8\xb3\xf9\x69\xef\xb3\xfa\xb3\xfb\x69\xf5\x69\xf7\x69\xf9\xb3\xfc\xb3\xfd\xb4\x41\xb4\x42\xb4\x43\xb4\x44\xb4\x45\xb4\x46\x69\xf2\xb4\x47\x69\xf0\xb4\x48\xb4\x49\xb4\x4a\x4d\xfa\xb4\x4b\x4b\x9c\xb4\x4c\xb4\x4d\xb4\x4e\xb4\x4f\x69\xee\x69\xf6\x69\xec\x69\xed\xb4\x50", /* 8780 */ "\xb4\x51\xb4\x52\x69\xea\x6a\x46\xb4\x53\x6a\x43\xb4\x54\xb4\x55\x6a\x42\xb4\x56\xb4\x57\x69\xf3\xb4\x58\x54\xd9\xb4\x59\xb4\x5a\xb4\x5b\xb4\x5c\xb4\x5d\x69\xfa\xb4\x5e\xb4\x5f\xb4\x60\x6a\x45\xb4\x61\xb4\x62\xb4\x63\xb4\x64\xb4\x65\xb4\x66\xb4\x67\x52\x99\xb4\x68\xb4\x69\xb4\x6a\xb4\x6b\xb4\x6c\xb4\x6d\xb4\x6e\xb4\x6f\x69\xfc\xb4\x70\xb4\x71\x6a\x47\x6a\x49\x6a\x44\xb4\x72\x69\xfb\xb4\x73\xb4\x74\xb4\x75\x6a\x4b\xb4\x76\x6a\x4a\xb4\x77\xb4\x78\xb4\x79\xb4\x7a\x51\xdc\xb4\x7b\xb4\x7c\x6a\x4e\xb4\x7d\xb4\x7e\x6a\x50\xb4\x7f\xb4\x81\xb4\x82\xb4\x83\xb4\x84\x6a\x41\xb4\x85\xb4\x86\xb4\x87\x6a\x51\x6a\x4c\xb4\x88\xb4\x89\xb4\x8a\xb4\x8b\xb4\x8c\x6a\x4f\x69\xfd\x6a\x4d\xb4\x8d\xb4\x8e\xb4\x8f\xb4\x90\xb4\x91\xb4\x92\xb4\x93\x6a\x52\xb4\x94\xb4\x95\xb4\x96\xb4\x97\x6a\x54\xb4\x98\xb4\x99\xb4\x9a\xb4\x9b\x6a\x48\xb4\x9c\xb4\x9d\xb4\x9e\xb4\x9f\x6a\x53\xb4\xa0\xb4\xa1\xb4\xa2\x6a\x55\xb4\xa3\xb4\xa4\xb4\xa5\xb4\xa6\xb4\xa7\xb4\xa8\xb4\xa9\xb4\xaa\xb4\xab\xb4\xac\x58\xb6\xb4\xad\xb4\xae\xb4\xaf\xb4\xb0\x6a\x58\xb4\xb1", /* 8800 */ "\xb4\xb2\xb4\xb3\xb4\xb4\x5d\x9a\xb4\xb5\xb4\xb6\xb4\xb7\xb4\xb8\xb4\xb9\xb4\xba\x6a\x59\xb4\xbb\xb4\xbc\xb4\xbd\xb4\xbe\xb4\xbf\xb4\xc0\xb4\xc1\xb4\xc2\x6a\x57\xb4\xc3\x54\xe3\x6a\x56\xb4\xc4\xb4\xc5\xb4\xc6\xb4\xc7\x6a\x5a\xb4\xc8\xb4\xc9\xb4\xca\xb4\xcb\xb4\xcc\x6a\x5b\x4a\xbf\xb4\xcd\xb4\xce\xb4\xcf\xb4\xd0\xb4\xd1\xb4\xd2\xb4\xd3\xb4\xd4\xb4\xd5\xb4\xd6\xb4\xd7\xb4\xd8\xb4\xd9\xb4\xda\xb4\xdb\x67\xc2\xb4\xdc\xb4\xdd\xb4\xde\xb4\xdf\xb4\xe0\xb4\xe1\x6a\x5c\xb4\xe2\xb4\xe3\x6a\x5d\xb4\xe4\xb4\xe5\xb4\xe6\x59\x4a\xb4\xe7\xb4\xe8\xb4\xe9\x6a\xab\x58\xc5\xb4\xea\xb4\xeb\xb4\xec\xb4\xed\xb4\xee\xb4\xef\x58\xcf\x59\x7c\xb4\xf0\xb4\xf1\xb4\xf2\xb4\xf3\xb4\xf4\xb4\xf5\x58\x6e\xb4\xf6\xb4\xf7\x4f\x76\xb4\xf8\x59\x63\xb4\xf9\xb4\xfa\xb4\xfb\xb4\xfc\xb4\xfd\xb5\x41\xb5\x42\x4d\xe1\x61\x8a\x59\xc1\x69\x62\x49\xb8\xb5\x43\xb5\x44\x49\x8e\x69\x63\xb5\x45\x55\x60\x4a\x64\xb5\x46\x5d\x93\xb5\x47\x56\x45\xb5\x48\x69\x64\xb5\x49\xb5\x4a\xb5\x4b\xb5\x4c\x5b\xd3\xb5\x4d\xb5\x4e\xb5\x4f\xb5\x50\xb5\x51\x69\x65\x6a\xbf\x69\x66", /* 8880 */ "\xb5\x52\x5a\xab\x69\x67\xb5\x53\x48\xbf\x6a\xc0\xb5\x54\xb5\x55\x6a\xc1\xb5\x56\xb5\x57\x4a\xfb\xb5\x58\x53\x7b\xb5\x59\xb5\x5a\xb5\x5b\xb5\x5c\x56\xba\xb5\x5d\xb5\x5e\xb5\x5f\x58\xe3\xb5\x60\xb5\x61\xb5\x62\xb5\x63\xb5\x64\x57\x81\xb5\x65\xb5\x66\xb5\x67\xb5\x68\xb5\x69\x69\x68\xb5\x6a\x5d\x94\xb5\x6b\xb5\x6c\xb5\x6d\xb5\x6e\xb5\x6f\xb5\x70\x49\x5b\xb5\x71\x58\x4e\xb5\x72\xb5\x73\xb5\x74\x4c\xa3\xb5\x75\xb5\x76\xb5\x77\xb5\x78\xb5\x79\x69\x6a\xb5\x7a\xb5\x7b\xb5\x7c\xb5\x7d\x69\x6b\xb5\x7e\xb5\x7f\xb5\x81\xb5\x82\x49\xc2\x51\x71\xb5\x83\xb5\x84\x5c\x50\x69\x69\xb5\x85\xb5\x86\x69\x6c\xb5\x87\xb5\x88\xb5\x89\xb5\x8a\x69\x6e\xb5\x8b\xb5\x8c\xb5\x8d\x5d\x97\xb5\x8e\x59\xe0\x5a\xa2\xb5\x8f\xb5\x90\x6a\xc2\x54\xb8\xb5\x91\xb5\x92\xb5\x93\xb5\x94\xb5\x95\x6a\xc3\xb5\x96\xb5\x97\x69\x6d\x69\x6f\x50\x84\x69\x70\xb5\x98\xb5\x99\x69\x74\xb5\x9a\xb5\x9b\xb5\x9c\xb5\x9d\xb5\x9e\xb5\x9f\xb5\xa0\x69\x76\x69\x71\xb5\xa1\x55\x71\x53\x82\xb5\xa2\xb5\xa3\xb5\xa4\x51\xe2\x4d\x9d\xb5\xa5\xb5\xa6\x69\x73\xb5\xa7\x69\x75\xb5\xa8", /* 8900 */ "\xb5\xa9\xb5\xaa\x4d\x73\xb5\xab\xb5\xac\xb5\xad\xb5\xae\xb5\xaf\xb5\xb0\xb5\xb1\x69\x7b\xb5\xb2\xb5\xb3\xb5\xb4\xb5\xb5\xb5\xb6\x4d\xd5\xb5\xb7\x48\xfc\x69\x79\xb5\xb8\xb5\xb9\xb5\xba\xb5\xbb\xb5\xbc\x69\x78\x69\x72\x69\x7a\xb5\xbd\xb5\xbe\xb5\xbf\xb5\xc0\xb5\xc1\x69\x77\xb5\xc2\xb5\xc3\xb5\xc4\x54\xeb\xb5\xc5\xb5\xc6\xb5\xc7\xb5\xc8\x57\x6a\x69\x7d\xb5\xc9\xb5\xca\xb5\xcb\xb5\xcc\x63\x5d\xb5\xcd\xb5\xce\xb5\xcf\x69\x7c\xb5\xd0\x69\x7e\xb5\xd1\xb5\xd2\xb5\xd3\xb5\xd4\xb5\xd5\xb5\xd6\xb5\xd7\xb5\xd8\xb5\xd9\xb5\xda\x69\x7f\xb5\xdb\xb5\xdc\x58\x86\xb5\xdd\xb5\xde\xb5\xdf\xb5\xe0\xb5\xe1\xb5\xe2\xb5\xe3\xb5\xe4\xb5\xe5\xb5\xe6\xb5\xe7\xb5\xe8\xb5\xe9\xb5\xea\xb5\xeb\xb5\xec\xb5\xed\xb5\xee\xb5\xef\xb5\xf0\xb5\xf1\xb5\xf2\xb5\xf3\xb5\xf4\xb5\xf5\x6a\xc4\x4f\x94\xb5\xf6\xb5\xf7\xb5\xf8\xb5\xf9\xb5\xfa\xb5\xfb\x69\x81\xb5\xfc\xb5\xfd\xb6\x41\xb6\x42\xb6\x43\xb6\x44\xb6\x45\xb6\x46\xb6\x47\xb6\x48\xb6\x49\xb6\x4a\xb6\x4b\xb6\x4c\xb6\x4d\xb6\x4e\xb6\x4f\xb6\x50\xb6\x51\xb6\x52\x69\x82\xb6\x53\xb6\x54\xb6\x55\x57\xf6", /* 8980 */ "\xb6\x56\x59\xa9\xb6\x57\x69\x9c\xb6\x58\xb6\x59\x4c\xb1\xb6\x5a\xb6\x5b\xb6\x5c\xb6\x5d\xb6\x5e\xb6\x5f\xb6\x60\xb6\x61\xb6\x62\xb6\x63\xb6\x64\xb6\x65\xb6\x66\xb6\x67\xb6\x68\xb6\x69\xb6\x6a\xb6\x6b\xb6\x6c\xb6\x6d\xb6\x6e\xb6\x6f\xb6\x70\xb6\x71\xb6\x72\xb6\x73\xb6\x74\xb6\x75\xb6\x76\xb6\x77\xb6\x78\xb6\x79\xb6\x7a\xb6\x7b\xb6\x7c\xb6\x7d\xb6\x7e\xb6\x7f\xb6\x81\xb6\x82\xb6\x83\xb6\x84\xb6\x85\xb6\x86\xb6\x87\xb6\x88\xb6\x89\xb6\x8a\xb6\x8b\xb6\x8c\xb6\x8d\xb6\x8e\xb6\x8f\xb6\x90\xb6\x91\xb6\x92\xb6\x93\xb6\x94\x4e\xfa\x4d\x7b\xb6\x95\x4d\x87\x52\x79\x55\xd2\x65\xe7\x50\xbf\x4f\xf4\x65\xe8\x65\xe9\x65\xea\xb6\x96\x65\xeb\x65\xec\x65\xed\x65\xee\x4f\x67\xb6\x97\xb6\x98\xb6\x99\x6b\x9c\xb6\x9a\xb6\x9b\xb6\x9c\x6b\x9e\xb6\x9d\x6b\x9f\xb6\x9e\x6b\x9d\xb6\x9f\xb6\xa0\xb6\xa1\xb6\xa2\x4f\x83\xb6\xa3\x6b\xa0\x4a\xa4\xb6\xa4\xb6\xa5\xb6\xa6\xb6\xa7\x6b\xa1\xb6\xa8\xb6\xa9\xb6\xaa\x6b\xa2\xb6\xab\xb6\xac\xb6\xad\x66\xb1\xb6\xae\xb6\xaf\xb6\xb0\xb6\xb1\xb6\xb2\xb6\xb3\xb6\xb4\xb6\xb5\xb6\xb6\xb6\xb7\xb6\xb8\xb6\xb9", /* 8a00 */ "\x59\x74\xb6\xba\xb6\xbb\xb6\xbc\xb6\xbd\xb6\xbe\xb6\xbf\x5d\x8b\xb6\xc0\xb6\xc1\xb6\xc2\xb6\xc3\xb6\xc4\xb6\xc5\xb6\xc6\xb6\xc7\xb6\xc8\xb6\xc9\xb6\xca\xb6\xcb\xb6\xcc\xb6\xcd\xb6\xce\xb6\xcf\xb6\xd0\xb6\xd1\xb6\xd2\xb6\xd3\xb6\xd4\xb6\xd5\xb6\xd6\xb6\xd7\xb6\xd8\xb6\xd9\xb6\xda\xb6\xdb\xb6\xdc\xb6\xdd\xb6\xde\xb6\xdf\xb6\xe0\xb6\xe1\xb6\xe2\xb6\xe3\xb6\xe4\xb6\xe5\xb6\xe6\xb6\xe7\xb6\xe8\xb6\xe9\xb6\xea\xb6\xeb\xb6\xec\xb6\xed\xb6\xee\xb6\xef\xb6\xf0\xb6\xf1\xb6\xf2\xb6\xf3\xb6\xf4\xb6\xf5\x6b\xa3\xb6\xf6\xb6\xf7\xb6\xf8\xb6\xf9\xb6\xfa\xb6\xfb\xb6\xfc\xb6\xfd\xb7\x41\x67\xb9\xb7\x42\xb7\x43\xb7\x44\xb7\x45\xb7\x46\xb7\x47\xb7\x48\xb7\x49\xb7\x4a\xb7\x4b\xb7\x4c\xb7\x4d\xb7\x4e\xb7\x4f\xb7\x50\xb7\x51\xb7\x52\xb7\x53\xb7\x54\xb7\x55\xb7\x56\xb7\x57\xb7\x58\xb7\x59\xb7\x5a\xb7\x5b\xb7\x5c\xb7\x5d\xb7\x5e\xb7\x5f\xb7\x60\xb7\x61\xb7\x62\xb7\x63\xb7\x64\xb7\x65\xb7\x66\xb7\x67\xb7\x68\xb7\x69\xb7\x6a\xb7\x6b\xb7\x6c\xb7\x6d\xb7\x6e\xb7\x6f\xb7\x70\xb7\x71\x5b\x52\xb7\x72\xb7\x73\xb7\x74\xb7\x75\xb7\x76\xb7\x77", /* 8a80 */ "\xb7\x78\xb7\x79\xb7\x7a\xb7\x7b\xb7\x7c\xb7\x7d\xb7\x7e\xb7\x7f\xb7\x81\x5a\x9f\x56\xdb\xb7\x82\xb7\x83\xb7\x84\xb7\x85\xb7\x86\xb7\x87\xb7\x88\xb7\x89\x55\xc3\xb7\x8a\xb7\x8b\xb7\x8c\xb7\x8d\xb7\x8e\xb7\x8f\xb7\x90\xb7\x91\xb7\x92\xb7\x93\xb7\x94\xb7\x95\xb7\x96\xb7\x97\xb7\x98\xb7\x99\xb7\x9a\xb7\x9b\xb7\x9c\xb7\x9d\xb7\x9e\xb7\x9f\xb7\xa0\xb7\xa1\xb7\xa2\xb7\xa3\xb7\xa4\xb7\xa5\xb7\xa6\xb7\xa7\xb7\xa8\xb7\xa9\xb7\xaa\xb7\xab\xb7\xac\xb7\xad\xb7\xae\xb7\xaf\xb7\xb0\xb7\xb1\xb7\xb2\xb7\xb3\xb7\xb4\xb7\xb5\xb7\xb6\xb7\xb7\xb7\xb8\xb7\xb9\xb7\xba\xb7\xbb\xb7\xbc\xb7\xbd\xb7\xbe\xb7\xbf\xb7\xc0\xb7\xc1\xb7\xc2\xb7\xc3\xb7\xc4\xb7\xc5\xb7\xc6\xb7\xc7\xb7\xc8\xb7\xc9\xb7\xca\xb7\xcb\xb7\xcc\xb7\xcd\xb7\xce\xb7\xcf\xb7\xd0\xb7\xd1\xb7\xd2\xb7\xd3\xb7\xd4\xb7\xd5\xb7\xd6\xb7\xd7\xb7\xd8\xb7\xd9\xb7\xda\xb7\xdb\xb7\xdc\xb7\xdd\xb7\xde\xb7\xdf\xb7\xe0\xb7\xe1\xb7\xe2\xb7\xe3\xb7\xe4\xb7\xe5\xb7\xe6\xb7\xe7\xb7\xe8\xb7\xe9\xb7\xea\xb7\xeb\xb7\xec\xb7\xed\xb7\xee\xb7\xef\xb7\xf0\xb7\xf1\xb7\xf2\xb7\xf3\xb7\xf4\xb7\xf5", /* 8b00 */ "\xb7\xf6\xb7\xf7\xb7\xf8\xb7\xf9\xb7\xfa\xb7\xfb\xb7\xfc\x63\x60\xb7\xfd\xb8\x41\xb8\x42\xb8\x43\xb8\x44\xb8\x45\xb8\x46\xb8\x47\xb8\x48\xb8\x49\xb8\x4a\xb8\x4b\xb8\x4c\xb8\x4d\xb8\x4e\xb8\x4f\xb8\x50\xb8\x51\xb8\x52\xb8\x53\xb8\x54\xb8\x55\xb8\x56\xb8\x57\xb8\x58\xb8\x59\xb8\x5a\xb8\x5b\xb8\x5c\xb8\x5d\x6b\xa4\xb8\x5e\xb8\x5f\xb8\x60\xb8\x61\xb8\x62\xb8\x63\xb8\x64\xb8\x65\xb8\x66\xb8\x67\xb8\x68\xb8\x69\xb8\x6a\xb8\x6b\xb8\x6c\xb8\x6d\xb8\x6e\xb8\x6f\xb8\x70\xb8\x71\xb8\x72\xb8\x73\xb8\x74\xb8\x75\xb8\x76\xb8\x77\xb8\x78\xb8\x79\xb8\x7a\xb8\x7b\xb8\x7c\xb8\x7d\xb8\x7e\xb8\x7f\xb8\x81\xb8\x82\xb8\x83\xb8\x84\xb8\x85\xb8\x86\xb8\x87\xb8\x88\xb8\x89\xb8\x8a\xb8\x8b\xb8\x8c\xb8\x8d\xb8\x8e\xb8\x8f\xb8\x90\xb8\x91\xb8\x92\xb8\x93\xb8\x94\xb8\x95\xb8\x96\xb8\x97\xb8\x98\xb8\x99\xb8\x9a\xb8\x9b\xb8\x9c\xb8\x9d\x4f\xae\xb8\x9e\xb8\x9f\xb8\xa0\xb8\xa1\xb8\xa2\x53\xa8\xb8\xa3\xb8\xa4\xb8\xa5\xb8\xa6\xb8\xa7\xb8\xa8\xb8\xa9\xb8\xaa\xb8\xab\xb8\xac\xb8\xad\xb8\xae\xb8\xaf\xb8\xb0\xb8\xb1\xb8\xb2\xb8\xb3\xb8\xb4\xb8\xb5", /* 8b80 */ "\xb8\xb6\xb8\xb7\xb8\xb8\xb8\xb9\xb8\xba\xb8\xbb\xb8\xbc\xb8\xbd\xb8\xbe\xb8\xbf\xb8\xc0\xb8\xc1\xb8\xc2\xb8\xc3\xb8\xc4\xb8\xc5\xb8\xc6\xb8\xc7\xb8\xc8\xb8\xc9\xb8\xca\xb8\xcb\xb8\xcc\xb8\xcd\xb8\xce\xb8\xcf\xb8\xd0\xb8\xd1\xb8\xd2\xb8\xd3\xb8\xd4\xb8\xd5\x5d\xa4\x4e\xc5\x4b\xa8\x4c\xbb\x54\xce\x4e\xa4\x5d\xa5\x5d\xa6\x56\xd5\x54\xc2\x5d\xa7\x53\xfc\xb8\xd6\x59\x55\x59\xe8\x59\x56\x4e\xc6\xb8\xd7\x4f\x52\x4e\x85\x5d\xa8\x5d\xa9\x59\x68\x5d\xaa\x58\xec\x4b\xee\x51\xda\xb8\xd8\x56\x6f\x4c\x8e\x55\x89\x4c\x63\x4f\xf6\x5b\xa3\x5d\xab\x5d\xac\x53\xbf\x5c\x88\x55\xb5\xb8\xd9\x5b\x49\x56\x7f\x5b\x90\x5d\xad\x5b\xde\x4a\xc9\x5d\xaf\x5d\xae\xb8\xda\x59\xea\x5d\xb0\x5d\xb1\x5d\xb2\x55\xd3\x5d\xb3\x55\xaa\x5d\xb4\x5d\xb5\x4a\x6f\x5b\xee\x5d\xb6\x4e\x50\x4b\x4e\x5d\xb7\x5d\xb8\x4d\x8f\x59\x4f\x59\xe7\x5d\xb9\x4c\xc2\x58\x8b\x49\xee\x5d\xba\x5d\xbb\xb8\xdb\x4f\x8c\x57\xdb\x5a\x90\x5d\xbc\x57\xf2\x5d\xbd\x5a\x75\x4e\x86\x5d\xbe\x56\x55\x56\x70\x5d\xbf\x54\x8c\x5b\xed\x5d\xc0\x53\x55\x4b\xc0\x5d\xc1\x4c\x6c\x50\x6e\x5d\xc2", /* 8c00 */ "\x5d\xc3\x56\x4d\x5d\xc4\x4b\x98\x5d\xc5\x51\x62\x5c\x5b\x5d\xc6\x56\xb7\xb8\xdc\x59\xe9\x52\xb0\x5d\xc7\x4b\x9e\x4e\x71\x5d\xc8\x58\xb2\x5d\xc9\x5d\xca\x57\xbc\x5d\xcb\x5d\xcc\x5d\xcd\x49\xf6\x5d\xd0\x5d\xce\x59\x89\x5d\xcf\x52\x75\x5d\xd1\xb8\xdd\x5d\xd2\x5d\xd3\x5d\xd4\x58\xba\x59\xa4\x48\xf8\x5d\xd5\x54\x4b\x5d\xd6\x4f\x98\x52\x41\x5d\xd7\x5d\xd8\x52\x9e\x56\xb6\x5d\xd9\x5d\xda\x50\xbd\x53\xd6\x5d\xdb\x5d\xdc\x54\x54\x5d\xdd\x5d\xde\x4d\x68\xb8\xde\xb8\xdf\xb8\xe0\xb8\xe1\xb8\xe2\xb8\xe3\xb8\xe4\xb8\xe5\xb8\xe6\x4e\x8e\xb8\xe7\xb8\xe8\xb8\xe9\xb8\xea\x4b\xb8\x6a\xf7\xb8\xeb\x6a\xf8\xb8\xec\xb8\xed\x57\x84\xb8\xee\xb8\xef\xb8\xf0\xb8\xf1\xb8\xf2\xb8\xf3\xb8\xf4\xb8\xf5\x6b\x59\xb8\xf6\xb8\xf7\xb8\xf8\xb8\xf9\x66\x81\xb8\xfa\xb8\xfb\xb8\xfc\xb8\xfd\xb9\x41\xb9\x42\x58\x94\x4e\x5f\xb9\x43\xb9\x44\xb9\x45\xb9\x46\xb9\x47\xb9\x48\xb9\x49\x4d\xbf\x5a\xa4\xb9\x4a\xb9\x4b\xb9\x4c\xb9\x4d\xb9\x4e\xb9\x4f\xb9\x50\x61\x79\xb9\x51\xb9\x52\xb9\x53\xb9\x54\x6b\x95\x49\x4a\x49\xf1\xb9\x55\xb9\x56\xb9\x57\xb9\x58\xb9\x59", /* 8c80 */ "\xb9\x5a\xb9\x5b\x6b\x96\xb9\x5c\xb9\x5d\x6b\x98\xb9\x5e\xb9\x5f\xb9\x60\x4d\xd0\x6b\x97\xb9\x61\x52\x52\xb9\x62\xb9\x63\xb9\x64\xb9\x65\xb9\x66\xb9\x67\xb9\x68\x6b\x9a\xb9\x69\xb9\x6a\xb9\x6b\x6b\x99\xb9\x6c\xb9\x6d\xb9\x6e\xb9\x6f\xb9\x70\xb9\x71\xb9\x72\xb9\x73\xb9\x74\xb9\x75\xb9\x76\xb9\x77\xb9\x78\xb9\x79\xb9\x7a\xb9\x7b\xb9\x7c\xb9\x7d\xb9\x7e\xb9\x7f\xb9\x81\xb9\x82\xb9\x83\xb9\x84\xb9\x85\xb9\x86\xb9\x87\xb9\x88\xb9\x89\xb9\x8a\xb9\x8b\xb9\x8c\xb9\x8d\xb9\x8e\xb9\x8f\xb9\x90\xb9\x91\xb9\x92\xb9\x93\xb9\x94\xb9\x95\xb9\x96\xb9\x97\xb9\x98\xb9\x99\xb9\x9a\xb9\x9b\xb9\x9c\xb9\x9d\xb9\x9e\xb9\x9f\xb9\xa0\xb9\xa1\xb9\xa2\xb9\xa3\xb9\xa4\xb9\xa5\xb9\xa6\xb9\xa7\xb9\xa8\xb9\xa9\xb9\xaa\xb9\xab\xb9\xac\xb9\xad\xb9\xae\xb9\xaf\xb9\xb0\xb9\xb1\xb9\xb2\xb9\xb3\xb9\xb4\xb9\xb5\xb9\xb6\xb9\xb7\xb9\xb8\xb9\xb9\xb9\xba\xb9\xbb\xb9\xbc\xb9\xbd\xb9\xbe\xb9\xbf\xb9\xc0\xb9\xc1\xb9\xc2\xb9\xc3\xb9\xc4\xb9\xc5\xb9\xc6\xb9\xc7\xb9\xc8\xb9\xc9\xb9\xca\xb9\xcb\xb9\xcc\xb9\xcd\xb9\xce\xb9\xcf\xb9\xd0\xb9\xd1\xb9\xd2\xb9\xd3", /* 8d00 */ "\xb9\xd4\xb9\xd5\xb9\xd6\xb9\xd7\xb9\xd8\xb9\xd9\xb9\xda\xb9\xdb\xb9\xdc\xb9\xdd\xb9\xde\xb9\xdf\xb9\xe0\xb9\xe1\xb9\xe2\xb9\xe3\xb9\xe4\xb9\xe5\xb9\xe6\xb9\xe7\xb9\xe8\xb9\xe9\xb9\xea\xb9\xeb\xb9\xec\xb9\xed\xb9\xee\xb9\xef\xb9\xf0\x49\x54\x5b\x8b\x4c\xb9\xb9\xf1\x4d\x51\x49\xc5\x5a\xef\x58\x6d\x48\xdb\x5b\x6b\x4e\x96\x5b\xc9\x4c\x57\x56\xaf\x53\xb5\x49\x82\x4d\x5a\x5b\xfb\x4d\x82\x4c\x41\x4e\xf9\x65\xd9\x65\xda\x56\xf8\x4d\x94\x65\xdb\x4a\xfa\x52\x53\x4c\x71\x4d\xd7\x65\xdc\x5a\xf3\x65\xdd\x4e\xd5\x4e\x7f\x65\xde\x51\x7e\x51\xb7\x5a\xde\x5c\x6a\x65\xdf\x65\xe0\x65\xe3\x65\xe1\x65\xe2\x55\x7e\x4c\xb2\x4b\xc3\x65\xe4\x55\xe9\x55\x6d\x4a\xcc\xb9\xf2\xb9\xf3\x61\xd8\x53\x83\x65\xe5\x50\xb4\xb9\xf4\x5c\x58\x65\xe6\x5c\x4c\x54\xfb\x5c\xd2\x5c\xcc\x5a\xdd\xb9\xf5\x5a\xf8\x55\x64\x5a\x4e\x4c\xd2\x4a\x81\xb9\xf6\x55\x83\x6a\xf5\xb9\xf7\xb9\xf8\xb9\xf9\x4d\xd4\xb9\xfa\x6a\xf6\xb9\xfb\xb9\xfc\x5c\x7f\xb9\xfd\xba\x41\x6a\xf0\x4c\xaf\x5b\x74\x4c\xce\x53\xef\xba\x42\xba\x43\xba\x44\xba\x45\xba\x46\xba\x47\xba\x48\xba\x49", /* 8d80 */ "\xba\x4a\x4a\x63\xba\x4b\xba\x4c\x6a\xf1\x4a\x4c\xba\x4d\xba\x4e\xba\x4f\xba\x50\x5a\xbc\x54\x98\xba\x51\xba\x52\xba\x53\xba\x54\xba\x55\x6a\xf3\xba\x56\xba\x57\x6a\xf2\xba\x58\xba\x59\xba\x5a\xba\x5b\xba\x5c\xba\x5d\xba\x5e\xba\x5f\xba\x60\xba\x61\x56\xca\xba\x62\xba\x63\xba\x64\x54\xa3\xba\x65\xba\x66\xba\x67\xba\x68\xba\x69\xba\x6a\xba\x6b\xba\x6c\xba\x6d\xba\x6e\xba\x6f\xba\x70\xba\x71\x6a\xf4\xba\x72\x5c\x84\x53\x5f\x6b\x60\xba\x73\xba\x74\x6b\x5b\xba\x75\x6b\x63\xba\x76\x6b\x62\xba\x77\x5b\xb9\x6b\x61\xba\x78\xba\x79\xba\x7a\x5a\xbd\x6b\x64\xba\x7b\x6b\x6c\xba\x7c\xba\x7d\xba\x7e\xba\x7f\x48\xce\x4b\x99\xba\x81\x6b\x69\x6b\x6a\xba\x82\x53\x7c\xba\x83\xba\x84\xba\x85\xba\x86\x6b\x65\x6b\x66\xba\x87\xba\x88\x6b\x67\x6b\x6b\xba\x89\x4f\xdf\x6b\x68\x4c\xf9\xba\x8a\xba\x8b\xba\x8c\x6b\x70\x6b\x73\xba\x8d\xba\x8e\xba\x8f\x50\x88\xba\x90\x4d\x93\x6b\x5c\x6b\x6d\xba\x91\xba\x92\x51\xb6\xba\x93\xba\x94\xba\x95\x56\xf7\xba\x96\x4e\xf8\xba\x97\x6b\x6e\x6b\x6f\x6b\x71\x4b\xe4\x6b\x72\xba\x98\x6b\x75\xba\x99\xba\x9a", /* 8e00 */ "\xba\x9b\xba\x9c\xba\x9d\xba\x9e\xba\x9f\x6b\x5d\xba\xa0\xba\xa1\xba\xa2\x6b\x74\x5a\x5b\xba\xa3\x4a\x8d\xba\xa4\xba\xa5\x56\xa3\xba\xa6\xba\xa7\xba\xa8\xba\xa9\x6b\x76\xba\xaa\xba\xab\xba\xac\xba\xad\xba\xae\xba\xaf\xba\xb0\xba\xb1\x6b\x77\x4f\xe0\x6b\x78\xba\xb2\xba\xb3\x56\xde\x6b\x7b\xba\xb4\xba\xb5\xba\xb6\xba\xb7\xba\xb8\x49\xc7\x5c\x79\xba\xb9\x6b\x79\xba\xba\x6b\x7a\x6b\x7c\xba\xbb\x6b\x83\xba\xbc\xba\xbd\xba\xbe\x6b\x81\xba\xbf\xba\xc0\xba\xc1\x6b\x7f\x6b\x7d\xba\xc2\xba\xc3\x6b\x82\xba\xc4\xba\xc5\x6b\x7e\x6b\x85\x6b\x86\xba\xc6\x56\xe2\xba\xc7\xba\xc8\x63\x5f\x4b\x58\x6b\x84\x6b\x89\x56\xa2\xba\xc9\xba\xca\xba\xcb\xba\xcc\xba\xcd\x6b\x87\x6b\x88\xba\xce\xba\xcf\xba\xd0\xba\xd1\xba\xd2\xba\xd3\x6b\x5e\xba\xd4\xba\xd5\xba\xd6\xba\xd7\xba\xd8\xba\xd9\xba\xda\xba\xdb\xba\xdc\xba\xdd\xba\xde\xba\xdf\x49\x64\xba\xe0\xba\xe1\x6b\x5f\xba\xe2\xba\xe3\x4b\x65\x49\xe3\xba\xe4\x6b\x8d\x6b\x8a\xba\xe5\x4b\xd6\xba\xe6\x6b\x8e\xba\xe7\x6b\x8b\xba\xe8\xba\xe9\xba\xea\xba\xeb\xba\xec\x6b\x8c\xba\xed\xba\xee\x4a\xd9", /* 8e80 */ "\xba\xef\x5a\xe9\xba\xf0\xba\xf1\xba\xf2\x6b\x8f\xba\xf3\x4a\x9a\xba\xf4\xba\xf5\xba\xf6\xba\xf7\xba\xf8\xba\xf9\xba\xfa\x6b\x90\x6b\x92\xba\xfb\xba\xfc\xba\xfd\x6b\x91\xbb\x41\xbb\x42\xbb\x43\xbb\x44\xbb\x45\xbb\x46\xbb\x47\x6b\x93\xbb\x48\x6b\x94\xbb\x49\xbb\x4a\xbb\x4b\xbb\x4c\xbb\x4d\xbb\x4e\xbb\x4f\xbb\x50\xbb\x51\xbb\x52\xbb\x53\xbb\x54\x55\x8e\x4d\x4a\xbb\x55\xbb\x56\x54\x9c\xbb\x57\xbb\x58\x4b\xe2\xbb\x59\xbb\x5a\xbb\x5b\xbb\x5c\xbb\x5d\xbb\x5e\xbb\x5f\x56\xc8\xbb\x60\xbb\x61\xbb\x62\xbb\x63\xbb\x64\xbb\x65\xbb\x66\xbb\x67\xbb\x68\xbb\x69\xbb\x6a\xbb\x6b\xbb\x6c\xbb\x6d\xbb\x6e\xbb\x6f\xbb\x70\xbb\x71\xbb\x72\x65\xa5\xbb\x73\xbb\x74\xbb\x75\xbb\x76\xbb\x77\xbb\x78\xbb\x79\xbb\x7a\xbb\x7b\xbb\x7c\xbb\x7d\xbb\x7e\xbb\x7f\xbb\x81\xbb\x82\xbb\x83\xbb\x84\xbb\x85\xbb\x86\xbb\x87\xbb\x88\xbb\x89\xbb\x8a\xbb\x8b\xbb\x8c\xbb\x8d\xbb\x8e\xbb\x8f\xbb\x90\xbb\x91\xbb\x92\xbb\x93\xbb\x94\xbb\x95\xbb\x96\xbb\x97\xbb\x98\xbb\x99\xbb\x9a\xbb\x9b\xbb\x9c\xbb\x9d\xbb\x9e\xbb\x9f\xbb\xa0\xbb\xa1\xbb\xa2\xbb\xa3\xbb\xa4", /* 8f00 */ "\xbb\xa5\xbb\xa6\xbb\xa7\xbb\xa8\xbb\xa9\xbb\xaa\xbb\xab\xbb\xac\xbb\xad\xbb\xae\xbb\xaf\xbb\xb0\xbb\xb1\xbb\xb2\xbb\xb3\xbb\xb4\xbb\xb5\xbb\xb6\xbb\xb7\xbb\xb8\xbb\xb9\xbb\xba\xbb\xbb\xbb\xbc\xbb\xbd\xbb\xbe\xbb\xbf\xbb\xc0\xbb\xc1\xbb\xc2\xbb\xc3\xbb\xc4\xbb\xc5\xbb\xc6\xbb\xc7\xbb\xc8\xbb\xc9\xbb\xca\xbb\xcb\xbb\xcc\xbb\xcd\xbb\xce\xbb\xcf\xbb\xd0\xbb\xd1\xbb\xd2\xbb\xd3\xbb\xd4\xbb\xd5\xbb\xd6\xbb\xd7\xbb\xd8\xbb\xd9\xbb\xda\xbb\xdb\xbb\xdc\xbb\xdd\xbb\xde\xbb\xdf\xbb\xe0\xbb\xe1\xbb\xe2\xbb\xe3\xbb\xe4\xbb\xe5\xbb\xe6\xbb\xe7\xbb\xe8\xbb\xe9\xbb\xea\xbb\xeb\xbb\xec\xbb\xed\xbb\xee\xbb\xef\xbb\xf0\xbb\xf1\xbb\xf2\xbb\xf3\xbb\xf4\xbb\xf5\xbb\xf6\xbb\xf7\xbb\xf8\xbb\xf9\xbb\xfa\xbb\xfb\xbb\xfc\xbb\xfd\xbc\x41\xbc\x42\xbc\x43\xbc\x44\xbc\x45\xbc\x46\xbc\x47\xbc\x48\xbc\x49\xbc\x4a\xbc\x4b\xbc\x4c\xbc\x4d\x4a\x55\x5a\xfd\x4d\x8d\x58\xf8\xbc\x4e\x65\x8e\x5c\x4a\x65\x8f\x51\xd5\x54\xec\x4d\xe3\x65\x90\x65\x91\x65\x92\x5b\xe0\x65\x93\x65\x94\x65\x96\x65\x95\x65\x97\x65\x98\x54\x82\x65\x99\x5a\xd7\x65\x9a\x4f\x6e", /* 8f80 */ "\xbc\x4f\x65\x9b\x65\x9c\x4f\x6f\x65\x9d\x4c\xa7\x51\x5e\x65\x9e\x49\x52\x4e\x74\x4d\x96\x65\x9f\xbc\x50\x65\xa0\x65\xa1\x65\xa2\x4c\x99\x4e\xac\xbc\x51\x55\xe3\x60\xcd\x5a\xae\x58\x5d\x5b\x57\x65\xa3\x5b\x7e\x65\xa4\x58\xc0\x4d\x5c\xbc\x52\x4a\xc6\x49\x79\xbc\x53\xbc\x54\xbc\x55\x50\xb0\xbc\x56\xbc\x57\xbc\x58\xbc\x59\x49\x87\x49\x88\xbc\x5a\x49\x89\xbc\x5b\xbc\x5c\xbc\x5d\xbc\x5e\x4a\x5d\x54\xe7\xbc\x5f\xbc\x60\xbc\x61\xbc\x62\x63\x61\xbc\x63\xbc\x64\x49\x7f\xbc\x65\xbc\x66\xbc\x67\x51\x69\x4a\xee\xbc\x68\xbc\x69\x54\x48\x5a\x78\xbc\x6a\x53\xf8\x59\x58\xbc\x6b\x4d\x9e\x51\xf4\xbc\x6c\xbc\x6d\xbc\x6e\xbc\x6f\xbc\x70\x5a\x4d\xbc\x71\x5a\xca\x4f\x9d\xbc\x72\x63\x62\x4c\x55\x63\x63\xbc\x73\xbc\x74\x4e\x59\x5b\x83\xbc\x75\x4f\x99\x5a\xb5\x57\xa4\x51\x4c\x4a\x79\xbc\x76\xbc\x77\x56\xf5\xbc\x78\x63\x66\x63\x64\x63\x68\xbc\x79\x63\x6a\x63\x67\x4b\x6f\x53\xc7\xbc\x7a\x4b\x9d\x63\x65\xbc\x7b\x55\xf5\xbc\x7c\xbc\x7d\x63\x69\xbc\x7e\xbc\x7f\xbc\x81\x52\x74\x49\x65\x4e\xa2\xbc\x82\xbc\x83\xbc\x84\x5c\x57\xbc\x85\xbc\x86", /* 9000 */ "\x57\x6b\x56\x6d\x55\xc9\x56\xd2\x63\x6c\x63\x6b\x52\xe5\xbc\x87\xbc\x88\x59\x41\x59\x57\x63\x6d\xbc\x89\x63\x70\xbc\x8a\x57\x58\x5b\xef\x63\x6f\x4b\x7d\xbc\x8b\x57\x5e\xbc\x8c\x63\x71\x4b\xb9\xbc\x8d\xbc\x8e\x57\x48\x4d\x85\xbc\x8f\x55\xc4\x4a\x71\x56\x79\x5a\xeb\x63\x72\x4c\x8b\xbc\x90\xbc\x91\xbc\x92\x63\x6e\xbc\x93\xbc\x94\xbc\x95\xbc\x96\xbc\x97\xbc\x98\x63\x75\x4a\xfd\x63\x76\xbc\x99\xbc\x9a\xbc\x9b\xbc\x9c\xbc\x9d\x63\x73\x63\x74\xbc\x9e\x59\xdc\xbc\x9f\xbc\xa0\x51\xde\x49\x66\xbc\xa1\x5a\x83\xbc\xa2\xbc\xa3\x4b\xdc\x56\x8d\xbc\xa4\x63\x77\xbc\xa5\xbc\xa6\x5a\x97\xbc\xa7\xbc\xa8\xbc\xa9\xbc\xaa\xbc\xab\x49\x8a\xbc\xac\x4b\xf3\x63\x7a\x63\x78\x63\x79\x4b\x60\xbc\xad\xbc\xae\xbc\xaf\x59\xc4\x63\x7c\xbc\xb0\xbc\xb1\x63\x7e\xbc\xb2\xbc\xb3\xbc\xb4\xbc\xb5\xbc\xb6\xbc\xb7\x63\x7d\x54\x52\xbc\xb8\x59\xa2\xbc\xb9\xbc\xba\x63\x7b\xbc\xbb\xbc\xbc\xbc\xbd\xbc\xbe\x5a\xe1\x5b\x7a\xbc\xbf\xbc\xc0\xbc\xc1\xbc\xc2\xbc\xc3\x63\x81\x5c\x92\xbc\xc4\xbc\xc5\xbc\xc6\xbc\xc7\xbc\xc8\xbc\xc9\xbc\xca\x63\x82\xbc\xcb\x49\x7c", /* 9080 */ "\x59\x9c\xbc\xcc\x63\x83\x63\x85\xbc\xcd\xbc\xce\xbc\xcf\xbc\xd0\x63\x84\xbc\xd1\xbc\xd2\x63\x86\xbc\xd3\xbc\xd4\xbc\xd5\xbc\xd6\xbc\xd7\x59\xd7\xbc\xd8\x4b\x6b\xbc\xd9\x64\x7f\xbc\xda\x5d\xf4\xbc\xdb\x5d\xf7\xbc\xdc\x5d\xf5\xbc\xdd\x5d\xf6\xbc\xde\xbc\xdf\xbc\xe0\x5d\xf9\x58\xce\x52\xc6\xbc\xe1\xbc\xe2\x48\xed\xbc\xe3\xbc\xe4\xbc\xe5\x58\xaf\xbc\xe6\x5d\xf8\xbc\xe7\x5a\x6a\x4d\xa9\x5e\x42\x54\x92\xbc\xe8\x5d\xfb\x5d\xfa\x55\x7b\x5d\xfc\xbc\xe9\x5e\x41\x5c\x7e\x5d\xfd\x51\x7a\xbc\xea\xbc\xeb\x5e\x45\xbc\xec\xbc\xed\x5a\x95\xbc\xee\xbc\xef\x5e\x47\x5e\x44\xbc\xf0\x5e\x48\xbc\xf1\xbc\xf2\x4f\x5c\xbc\xf3\xbc\xf4\xbc\xf5\x50\xc8\x5e\x43\x5e\x46\x5b\xa2\xbc\xf6\x5e\x49\xbc\xf7\xbc\xf8\xbc\xf9\x5e\x4d\xbc\xfa\xbc\xfb\xbc\xfc\x5e\x4e\x5e\x4c\x4d\xc1\xbc\xfd\xbd\x41\xbd\x42\x50\x44\x5e\x4b\xbd\x43\xbd\x44\xbd\x45\x5e\x4a\x5a\xc6\x49\xbe\xbd\x46\xbd\x47\x5e\x4f\xbd\x48\x4d\x9a\xbd\x49\x5e\x50\xbd\x4a\xbd\x4b\xbd\x4c\xbd\x4d\x4a\x5b\xbd\x4e\xbd\x4f\xbd\x50\x4b\x46\xbd\x51\xbd\x52\xbd\x53\xbd\x54\x4b\xbb\x5e\x51\xbd\x55", /* 9100 */ "\xbd\x56\xbd\x57\x4b\xf4\xbd\x58\x5e\x52\xbd\x59\xbd\x5a\xbd\x5b\xbd\x5c\xbd\x5d\xbd\x5e\xbd\x5f\xbd\x60\xbd\x61\xbd\x62\xbd\x63\xbd\x64\xbd\x65\xbd\x66\xbd\x67\xbd\x68\xbd\x69\xbd\x6a\xbd\x6b\xbd\x6c\x49\x69\xbd\x6d\xbd\x6e\xbd\x6f\xbd\x70\x5e\x54\xbd\x71\xbd\x72\xbd\x73\x5e\x53\x5e\x55\xbd\x74\xbd\x75\xbd\x76\xbd\x77\xbd\x78\xbd\x79\xbd\x7a\xbd\x7b\xbd\x7c\xbd\x7d\xbd\x7e\x5e\x57\xbd\x7f\x5e\x56\xbd\x81\xbd\x82\xbd\x83\xbd\x84\xbd\x85\xbd\x86\xbd\x87\x5e\x58\xbd\x88\xbd\x89\xbd\x8a\xbd\x8b\xbd\x8c\xbd\x8d\xbd\x8e\xbd\x8f\xbd\x90\x5e\x59\xbd\x91\xbd\x92\x5e\x5a\xbd\x93\xbd\x94\x5a\x6f\x6a\xf9\x54\x96\x5c\x63\x53\x85\x6a\xfb\x6a\xfc\x6a\xfa\xbd\x95\x4f\xc5\xbd\x96\xbd\x97\xbd\x98\xbd\x99\x58\xee\xbd\x9a\xbd\x9b\x4c\x73\xbd\x9c\xbd\x9d\x5a\xcc\x56\xa9\xbd\x9e\xbd\x9f\x6b\x42\x6b\x41\x4d\xa7\x6a\xfd\x56\x76\xbd\xa0\xbd\xa1\xbd\xa2\x6b\x44\x50\xd1\xbd\xa3\x4a\x8b\xbd\xa4\x57\x4a\x6b\x45\x6b\x43\x4f\x54\x6b\x48\xbd\xa5\x6b\x49\x4f\x6d\x52\x58\x50\x82\x56\x82\x6b\x4a\xbd\xa6\xbd\xa7\xbd\xa8\x6b\x46\x6b\x47\x52\xef", /* 9180 */ "\xbd\xa9\xbd\xaa\xbd\xab\xbd\xac\xbd\xad\x6b\x4c\xbd\xae\x4a\xbb\xbd\xaf\x5c\x8e\xbd\xb0\x4a\xd6\x6b\x4b\x6b\x4e\xbd\xb1\xbd\xb2\x6b\x4d\x6b\x4f\x58\xd0\xbd\xb3\xbd\xb4\xbd\xb5\xbd\xb6\xbd\xb7\xbd\xb8\xbd\xb9\x52\x71\x54\xa8\xbd\xba\xbd\xbb\xbd\xbc\xbd\xbd\xbd\xbe\xbd\xbf\x6b\x50\x6b\x51\xbd\xc0\xbd\xc1\xbd\xc2\xbd\xc3\xbd\xc4\xbd\xc5\x6b\x52\xbd\xc6\xbd\xc7\x6b\x53\x6b\x54\x6b\x55\xbd\xc8\xbd\xc9\xbd\xca\xbd\xcb\x6b\x57\x6b\x56\xbd\xcc\xbd\xcd\xbd\xce\xbd\xcf\x6b\x58\xbd\xd0\xbd\xd1\xbd\xd2\xbd\xd3\xbd\xd4\xbd\xd5\xbd\xd6\xbd\xd7\xbd\xd8\xbd\xd9\xbd\xda\xbd\xdb\x49\xc8\xbd\xdc\x5a\x74\x55\xcc\xbd\xdd\x50\xee\x5b\xd7\x59\xaf\x51\x5f\xbd\xde\x4f\x91\xbd\xdf\xbd\xe0\xbd\xe1\xbd\xe2\xbd\xe3\xbd\xe4\xbd\xe5\xbd\xe6\xbd\xe7\xbd\xe8\x4c\xa9\xbd\xe9\xbd\xea\xbd\xeb\xbd\xec\xbd\xed\xbd\xee\xbd\xef\xbd\xf0\xbd\xf1\xbd\xf2\xbd\xf3\xbd\xf4\xbd\xf5\xbd\xf6\xbd\xf7\xbd\xf8\xbd\xf9\xbd\xfa\xbd\xfb\xbd\xfc\xbd\xfd\xbe\x41\xbe\x42\xbe\x43\xbe\x44\xbe\x45\xbe\x46\xbe\x47\xbe\x48\xbe\x49\xbe\x4a\xbe\x4b\xbe\x4c\xbe\x4d\xbe\x4e", /* 9200 */ "\xbe\x4f\xbe\x50\xbe\x51\xbe\x52\xbe\x53\xbe\x54\xbe\x55\xbe\x56\xbe\x57\xbe\x58\xbe\x59\xbe\x5a\xbe\x5b\xbe\x5c\xbe\x5d\xbe\x5e\xbe\x5f\xbe\x60\xbe\x61\xbe\x62\xbe\x63\xbe\x64\xbe\x65\xbe\x66\xbe\x67\xbe\x68\xbe\x69\xbe\x6a\xbe\x6b\xbe\x6c\xbe\x6d\xbe\x6e\xbe\x6f\xbe\x70\xbe\x71\xbe\x72\xbe\x73\xbe\x74\xbe\x75\xbe\x76\xbe\x77\xbe\x78\xbe\x79\xbe\x7a\xbe\x7b\xbe\x7c\xbe\x7d\xbe\x7e\xbe\x7f\xbe\x81\xbe\x82\xbe\x83\xbe\x84\xbe\x85\xbe\x86\xbe\x87\xbe\x88\xbe\x89\xbe\x8a\xbe\x8b\xbe\x8c\xbe\x8d\xbe\x8e\xbe\x8f\xbe\x90\xbe\x91\xbe\x92\xbe\x93\xbe\x94\xbe\x95\xbe\x96\xbe\x97\xbe\x98\xbe\x99\xbe\x9a\xbe\x9b\xbe\x9c\xbe\x9d\xbe\x9e\xbe\x9f\xbe\xa0\xbe\xa1\xbe\xa2\xbe\xa3\xbe\xa4\xbe\xa5\xbe\xa6\xbe\xa7\xbe\xa8\xbe\xa9\xbe\xaa\xbe\xab\xbe\xac\xbe\xad\xbe\xae\xbe\xaf\xbe\xb0\xbe\xb1\xbe\xb2\xbe\xb3\xbe\xb4\xbe\xb5\xbe\xb6\xbe\xb7\xbe\xb8\xbe\xb9\xbe\xba\xbe\xbb\xbe\xbc\xbe\xbd\xbe\xbe\xbe\xbf\xbe\xc0\xbe\xc1\xbe\xc2\xbe\xc3\x4e\xf7\xbe\xc4\xbe\xc5\xbe\xc6\xbe\xc7\xbe\xc8\xbe\xc9\xbe\xca\xbe\xcb\xbe\xcc\xbe\xcd\xbe\xce", /* 9280 */ "\xbe\xcf\xbe\xd0\xbe\xd1\xbe\xd2\xbe\xd3\xbe\xd4\xbe\xd5\xbe\xd6\xbe\xd7\xbe\xd8\xbe\xd9\xbe\xda\xbe\xdb\xbe\xdc\x6b\xc5\xbe\xdd\xbe\xde\xbe\xdf\xbe\xe0\xbe\xe1\xbe\xe2\xbe\xe3\xbe\xe4\xbe\xe5\xbe\xe6\xbe\xe7\xbe\xe8\xbe\xe9\xbe\xea\xbe\xeb\xbe\xec\xbe\xed\xbe\xee\xbe\xef\xbe\xf0\xbe\xf1\xbe\xf2\xbe\xf3\xbe\xf4\xbe\xf5\xbe\xf6\xbe\xf7\xbe\xf8\xbe\xf9\xbe\xfa\xbe\xfb\x6b\xc6\xbe\xfc\xbe\xfd\xbf\x41\xbf\x42\xbf\x43\xbf\x44\xbf\x45\xbf\x46\xbf\x47\xbf\x48\xbf\x49\xbf\x4a\xbf\x4b\xbf\x4c\xbf\x4d\xbf\x4e\xbf\x4f\xbf\x50\xbf\x51\xbf\x52\xbf\x53\xbf\x54\xbf\x55\xbf\x56\xbf\x57\x6b\xc7\xbf\x58\xbf\x59\xbf\x5a\xbf\x5b\xbf\x5c\xbf\x5d\xbf\x5e\xbf\x5f\xbf\x60\xbf\x61\xbf\x62\xbf\x63\xbf\x64\xbf\x65\xbf\x66\xbf\x67\xbf\x68\xbf\x69\xbf\x6a\xbf\x6b\xbf\x6c\xbf\x6d\xbf\x6e\xbf\x6f\xbf\x70\xbf\x71\xbf\x72\xbf\x73\xbf\x74\xbf\x75\xbf\x76\xbf\x77\xbf\x78\xbf\x79\xbf\x7a\xbf\x7b\xbf\x7c\xbf\x7d\xbf\x7e\xbf\x7f\xbf\x81\xbf\x82\xbf\x83\xbf\x84\xbf\x85\xbf\x86\xbf\x87\xbf\x88\xbf\x89\xbf\x8a\xbf\x8b\xbf\x8c\xbf\x8d\xbf\x8e\xbf\x8f", /* 9300 */ "\xbf\x90\xbf\x91\xbf\x92\xbf\x93\xbf\x94\xbf\x95\xbf\x96\xbf\x97\xbf\x98\xbf\x99\xbf\x9a\xbf\x9b\xbf\x9c\xbf\x9d\xbf\x9e\xbf\x9f\xbf\xa0\xbf\xa1\xbf\xa2\xbf\xa3\xbf\xa4\xbf\xa5\xbf\xa6\xbf\xa7\xbf\xa8\xbf\xa9\xbf\xaa\xbf\xab\xbf\xac\xbf\xad\xbf\xae\xbf\xaf\xbf\xb0\xbf\xb1\xbf\xb2\xbf\xb3\xbf\xb4\xbf\xb5\xbf\xb6\xbf\xb7\xbf\xb8\xbf\xb9\xbf\xba\xbf\xbb\xbf\xbc\xbf\xbd\xbf\xbe\xbf\xbf\xbf\xc0\xbf\xc1\xbf\xc2\xbf\xc3\xbf\xc4\xbf\xc5\xbf\xc6\xbf\xc7\xbf\xc8\xbf\xc9\xbf\xca\xbf\xcb\xbf\xcc\xbf\xcd\x6b\xc8\xbf\xce\xbf\xcf\xbf\xd0\xbf\xd1\xbf\xd2\xbf\xd3\xbf\xd4\xbf\xd5\xbf\xd6\xbf\xd7\xbf\xd8\xbf\xd9\xbf\xda\xbf\xdb\xbf\xdc\xbf\xdd\xbf\xde\xbf\xdf\xbf\xe0\xbf\xe1\xbf\xe2\xbf\xe3\xbf\xe4\xbf\xe5\xbf\xe6\xbf\xe7\xbf\xe8\xbf\xe9\xbf\xea\xbf\xeb\xbf\xec\xbf\xed\xbf\xee\xbf\xef\xbf\xf0\xbf\xf1\xbf\xf2\xbf\xf3\xbf\xf4\xbf\xf5\xbf\xf6\xbf\xf7\xbf\xf8\x6b\xc9\xbf\xf9\xbf\xfa\xbf\xfb\xbf\xfc\xbf\xfd\xc0\x41\xc0\x42\xc0\x43\xc0\x44\xc0\x45\xc0\x46\xc0\x47\xc0\x48\xc0\x49\xc0\x4a\xc0\x4b\xc0\x4c\xc0\x4d\xc0\x4e\xc0\x4f\xc0\x50", /* 9380 */ "\xc0\x51\xc0\x52\xc0\x53\xc0\x54\xc0\x55\xc0\x56\xc0\x57\xc0\x58\xc0\x59\xc0\x5a\xc0\x5b\xc0\x5c\xc0\x5d\xc0\x5e\xc0\x5f\x6b\xcb\xc0\x60\xc0\x61\xc0\x62\xc0\x63\xc0\x64\xc0\x65\xc0\x66\xc0\x67\xc0\x68\xc0\x69\xc0\x6a\xc0\x6b\xc0\x6c\xc0\x6d\xc0\x6e\xc0\x6f\xc0\x70\xc0\x71\xc0\x72\xc0\x73\xc0\x74\xc0\x75\xc0\x76\xc0\x77\xc0\x78\xc0\x79\xc0\x7a\xc0\x7b\xc0\x7c\xc0\x7d\xc0\x7e\xc0\x7f\xc0\x81\xc0\x82\xc0\x83\xc0\x84\xc0\x85\xc0\x86\xc0\x87\xc0\x88\xc0\x89\xc0\x8a\xc0\x8b\xc0\x8c\xc0\x8d\xc0\x8e\xc0\x8f\xc0\x90\xc0\x91\xc0\x92\xc0\x93\xc0\x94\xc0\x95\xc0\x96\xc0\x97\xc0\x98\xc0\x99\xc0\x9a\x6b\xca\xc0\x9b\xc0\x9c\xc0\x9d\xc0\x9e\xc0\x9f\xc0\xa0\xc0\xa1\xc0\xa2\xc0\xa3\xc0\xa4\xc0\xa5\x6c\x8a\xc0\xa6\xc0\xa7\xc0\xa8\xc0\xa9\xc0\xaa\xc0\xab\xc0\xac\xc0\xad\xc0\xae\xc0\xaf\xc0\xb0\xc0\xb1\xc0\xb2\xc0\xb3\xc0\xb4\xc0\xb5\xc0\xb6\xc0\xb7\xc0\xb8\xc0\xb9\xc0\xba\xc0\xbb\xc0\xbc\xc0\xbd\xc0\xbe\xc0\xbf\xc0\xc0\xc0\xc1\xc0\xc2\xc0\xc3\xc0\xc4\xc0\xc5\xc0\xc6\xc0\xc7\xc0\xc8\xc0\xc9\xc0\xca\xc0\xcb\xc0\xcc\xc0\xcd\xc0\xce", /* 9400 */ "\xc0\xcf\xc0\xd0\xc0\xd1\xc0\xd2\xc0\xd3\xc0\xd4\xc0\xd5\xc0\xd6\xc0\xd7\xc0\xd8\xc0\xd9\xc0\xda\xc0\xdb\xc0\xdc\xc0\xdd\xc0\xde\xc0\xdf\xc0\xe0\xc0\xe1\xc0\xe2\xc0\xe3\xc0\xe4\xc0\xe5\xc0\xe6\xc0\xe7\xc0\xe8\xc0\xe9\xc0\xea\xc0\xeb\xc0\xec\xc0\xed\xc0\xee\xc0\xef\xc0\xf0\xc0\xf1\xc0\xf2\xc0\xf3\xc0\xf4\xc0\xf5\xc0\xf6\xc0\xf7\xc0\xf8\xc0\xf9\xc0\xfa\xc0\xfb\xc0\xfc\xc0\xfd\xc1\x41\xc1\x42\xc1\x43\xc1\x44\xc1\x45\xc1\x46\xc1\x47\xc1\x48\xc1\x49\xc1\x4a\xc1\x4b\xc1\x4c\xc1\x4d\xc1\x4e\xc1\x4f\x6b\xcc\xc1\x50\xc1\x51\xc1\x52\xc1\x53\xc1\x54\xc1\x55\xc1\x56\xc1\x57\xc1\x58\xc1\x59\xc1\x5a\xc1\x5b\xc1\x5c\xc1\x5d\xc1\x5e\xc1\x5f\xc1\x60\xc1\x61\xc1\x62\xc1\x63\xc1\x64\xc1\x65\xc1\x66\xc1\x67\xc1\x68\xc1\x69\xc1\x6a\xc1\x6b\xc1\x6c\xc1\x6d\xc1\x6e\xc1\x6f\xc1\x70\xc1\x71\xc1\x72\xc1\x73\xc1\x74\xc1\x75\xc1\x76\xc1\x77\xc1\x78\xc1\x79\xc1\x7a\xc1\x7b\x6b\xcd\xc1\x7c\xc1\x7d\xc1\x7e\xc1\x7f\xc1\x81\xc1\x82\xc1\x83\xc1\x84\xc1\x85\xc1\x86\xc1\x87\xc1\x88\xc1\x89\xc1\x8a\xc1\x8b\xc1\x8c\xc1\x8d\xc1\x8e\xc1\x8f\xc1\x90", /* 9480 */ "\xc1\x91\xc1\x92\xc1\x93\xc1\x94\xc1\x95\x67\xc3\x67\xc4\x67\xc5\x5b\x8c\x4b\xa3\x67\xc7\x67\xc6\x67\xc8\x67\xc9\x54\x45\x67\xca\x67\xcb\xc1\x96\x4c\x50\x4b\x97\x67\xcc\x67\xce\xc1\x97\x67\xcd\xc1\x98\x4c\xc5\x67\xcf\x67\xd0\x67\xd1\x4b\xda\x4a\x4e\x5b\xd2\x52\xc5\x49\x55\x4c\xd5\x67\xd2\x67\xd3\x5a\xbe\x54\x75\x4f\xfa\x57\xd8\x4d\x53\x67\xd5\x67\xd4\x67\xd7\x67\xd6\x53\x45\x67\xd8\x67\xd9\x54\x4e\x67\xda\x54\x4f\x67\xdb\x49\xa6\x67\xdc\x67\xdd\x67\xde\x67\xdf\x67\xe0\x5c\x8b\x67\xe1\x67\xe2\x4e\xd7\x67\xe3\x5a\x6b\x56\xf9\x49\xab\x51\x86\x67\xe4\x54\x46\x52\x4d\xc1\x99\x67\xe5\x67\xe6\x67\xe7\x67\xe8\x67\xe9\x67\xea\x67\xeb\xc1\x9a\x67\xec\x67\xed\x67\xee\xc1\x9b\xc1\x9c\x67\xef\x67\xf0\x67\xf1\x67\xf3\x67\xf2\xc1\x9d\x67\xf4\x57\x4d\x51\xc0\x67\xf5\x67\xf6\x67\xf7\x5b\x41\x67\xf8\x58\x53\x67\xf9\x67\xfa\xc1\x9e\x67\xfb\x67\xfc\x68\x41\x67\xfd\x68\x42\x4c\xf4\x52\x9b\x68\x43\x68\x44\x4f\x62\x59\xbe\x49\xf8\x68\x45\x68\x46\x68\x47\x59\xf7\x68\x48\x5b\xfc\x68\x49\x53\xcb\xc1\x9f\x68\x4a\x68\x4b\x51\x54\x68\x4c", /* 9500 */ "\x58\x9b\x56\x99\x68\x4e\x68\x4d\x4a\x9b\x4d\x99\x68\x4f\x68\x50\x58\xe1\x68\x51\x68\x52\x4c\x87\x58\xbe\x68\x53\x68\x54\x68\x55\x54\xf0\x56\xdf\x68\x56\x68\x57\x68\x58\x68\x59\x68\x5a\x5b\x81\x68\x5b\x4a\xec\x52\x4a\x68\x5c\xc1\xa0\x68\x5d\x68\x5e\x68\x5f\xc1\xa1\x57\xfc\x68\x60\x51\xdf\x4a\xb7\x5c\x56\x4f\x96\xc1\xa2\x58\x67\x68\x63\x68\x61\x68\x62\x68\x64\x4b\xa6\x4e\xfb\x4f\xe1\x52\x6c\x68\x65\x68\x66\xc1\xa3\x68\x67\x68\x6f\x68\x68\x68\x69\x68\x6a\x54\x62\x68\x92\x4b\xcc\x68\x6b\xc1\xa4\x68\x6c\x68\x6d\x4b\xc5\x52\x5e\x68\x6e\xc1\xa5\x68\x70\x68\x71\x68\x72\x5b\x93\xc1\xa6\x68\x73\x52\xf6\xc1\xa7\x68\x74\x52\xf7\x68\x75\x68\x76\x4c\xe3\x48\xf6\x68\x77\x68\x78\x68\x79\xc1\xa8\x68\x7a\x68\x7b\x68\x7c\x68\x7d\xc1\xa9\x68\x7e\x4f\xb4\x68\x82\x68\x7f\x68\x81\xc1\xaa\x68\x83\x68\x84\x51\x6d\x68\x85\x68\x86\x68\x87\x68\x88\x68\x89\x68\x8a\x68\x8b\x68\x8c\x68\x8d\x50\xd7\xc1\xab\x68\x8e\x51\x4d\x68\x8f\x68\x90\x68\x91\xc1\xac\xc1\xad\x58\x83\xc1\xae\xc1\xaf\xc1\xb0\xc1\xb1\xc1\xb2\xc1\xb3\xc1\xb4\xc1\xb5\x4a\x44", /* 9580 */ "\xc1\xb6\xc1\xb7\xc1\xb8\xc1\xb9\xc1\xba\xc1\xbb\xc1\xbc\xc1\xbd\xc1\xbe\xc1\xbf\xc1\xc0\xc1\xc1\xc1\xc2\xc1\xc3\xc1\xc4\xc1\xc5\xc1\xc6\xc1\xc7\xc1\xc8\xc1\xc9\xc1\xca\xc1\xcb\xc1\xcc\xc1\xcd\xc1\xce\xc1\xcf\xc1\xd0\xc1\xd1\xc1\xd2\xc1\xd3\xc1\xd4\xc1\xd5\xc1\xd6\xc1\xd7\xc1\xd8\xc1\xd9\xc1\xda\xc1\xdb\xc1\xdc\xc1\xdd\xc1\xde\xc1\xdf\xc1\xe0\xc1\xe1\xc1\xe2\xc1\xe3\xc1\xe4\xc1\xe5\xc1\xe6\xc1\xe7\xc1\xe8\xc1\xe9\xc1\xea\xc1\xeb\xc1\xec\xc1\xed\xc1\xee\xc1\xef\xc1\xf0\xc1\xf1\xc1\xf2\xc1\xf3\xc1\xf4\xc1\xf5\xc1\xf6\xc1\xf7\xc1\xf8\xc1\xf9\xc1\xfa\xc1\xfb\xc1\xfc\xc1\xfd\xc2\x41\xc2\x42\xc2\x43\xc2\x44\xc2\x45\xc2\x46\xc2\x47\xc2\x48\xc2\x49\xc2\x4a\xc2\x4b\xc2\x4c\xc2\x4d\xc2\x4e\xc2\x4f\xc2\x50\xc2\x51\xc2\x52\xc2\x53\xc2\x54\xc2\x55\xc2\x56\xc2\x57\xc2\x58\xc2\x59\xc2\x5a\xc2\x5b\xc2\x5c\xc2\x5d\xc2\x5e\xc2\x5f\xc2\x60\x52\x65\x62\x65\x55\x61\x62\x66\xc2\x61\x49\x75\x57\xc9\x4a\xb2\x54\xf1\x62\x67\x58\x70\x62\x68\x4e\xe3\x62\x69\x62\x6a\x52\x66\x5b\x42\x52\xd5\x4d\x8c\x57\xc4\x62\x6b\x52\x97\x62\x6c\xc2\x62", /* 9600 */ "\x4c\x47\x4c\xf2\x4d\xd1\x62\x6d\x62\x6e\x5a\xc3\x62\x6f\xc2\x63\x62\x70\x59\x6b\x62\x71\x62\x72\x62\x73\x62\x74\x59\x76\x62\x75\x49\xfa\x50\xba\x62\x76\xc2\x64\x50\xaa\x62\x77\x62\x78\x62\x79\xc2\x65\x62\x7a\x62\x7b\xc2\x66\x4c\xb6\x5d\xe1\xc2\x67\x4b\xd2\xc2\x68\x5d\xe3\x5d\xe2\xc2\x69\xc2\x6a\xc2\x6b\xc2\x6c\xc2\x6d\xc2\x6e\xc2\x6f\x5d\xe5\xc2\x70\xc2\x71\xc2\x72\x54\xed\xc2\x73\xc2\x74\x5d\xe4\x4c\x60\x59\x95\x59\xf4\x5b\x94\x4f\x77\xc2\x75\xc2\x76\xc2\x77\xc2\x78\x5c\x89\x5d\xe7\x5d\xe6\xc2\x79\x48\xa1\x57\x73\xc2\x7a\x5d\xe8\xc2\x7b\x4c\xbc\x4e\xc9\x51\xbc\x51\xa3\x4a\x62\x5d\xe9\xc2\x7c\x51\xa9\x52\xaf\x4f\x55\xc2\x7d\xc2\x7e\x58\x7e\xc2\x7f\xc2\x81\xc2\x82\x5d\xea\x55\x62\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\x49\x7d\xc2\x88\xc2\x89\xc2\x8a\x5d\xeb\xc2\x8b\x4b\xb7\x5a\xb9\xc2\x8c\x4a\x9e\xc2\x8d\xc2\x8e\x5d\xec\x5a\xc8\x58\x75\x53\x84\xc2\x8f\x5d\xed\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\x5d\xee\xc2\x95\x5d\xef\x51\x8b\x56\xd4\x58\x7d\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d", /* 9680 */ "\xc2\x9e\xc2\x9f\xc2\xa0\xc2\xa1\xc2\xa2\x5a\x88\x51\xa0\xc2\xa3\x5d\xf0\xc2\xa4\xc2\xa5\x56\x86\xc2\xa6\x5d\xf1\xc2\xa7\x56\x87\x59\xfd\xc2\xa8\xc2\xa9\xc2\xaa\x4c\xf3\xc2\xab\xc2\xac\x5d\xf2\x48\xae\x58\x56\xc2\xad\xc2\xae\x5b\x6f\xc2\xaf\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\x56\x8e\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf\xc2\xc0\x5d\xf3\xc2\xc1\xc2\xc2\x62\x64\xc2\xc3\xc2\xc4\x51\x45\xc2\xc5\xc2\xc6\x6b\xbe\xc2\xc7\xc2\xc8\x6b\xbf\x6b\xc0\x52\xd0\xc2\xc9\x54\xb7\x59\x84\xc2\xca\xc2\xcb\x58\xda\x59\x65\x4e\xae\x4d\x6d\xc2\xcc\x68\x95\xc2\xcd\xc2\xce\x4a\xc5\x5a\x5a\x6b\xc1\x4a\x9c\xc2\xcf\xc2\xd0\x6b\xc2\xc2\xd1\xc2\xd2\x4b\x92\xc2\xd3\xc2\xd4\xc2\xd5\xc2\xd6\xc2\xd7\xc2\xd8\xc2\xd9\xc2\xda\xc2\xdb\xc2\xdc\x6b\xc4\xc2\xdd\xc2\xde\xc2\xdf\xc2\xe0\xc2\xe1\xc2\xe2\xc2\xe3\x5a\x8b\x6b\xa6\x59\x49\xc2\xe4\xc2\xe5\xc2\xe6\xc2\xe7\x6b\xa8\xc2\xe8\xc2\xe9\xc2\xea\x6b\xa7\xc2\xeb\xc2\xec\x51\x84\x50\xd6\xc2\xed\x49\x42\xc2\xee\xc2\xef\xc2\xf0\xc2\xf1\x57\xec\xc2\xf2", /* 9700 */ "\x58\xe7\x6b\xaa\xc2\xf3\xc2\xf4\x58\x97\xc2\xf5\x6b\xa9\x5b\x91\x6b\xab\x52\x59\xc2\xf6\xc2\xf7\xc2\xf8\x4e\x95\x6b\xad\x6b\xac\xc2\xf9\xc2\xfa\xc2\xfb\x52\xdd\xc2\xfc\xc2\xfd\x51\x78\xc3\x41\xc3\x42\xc3\x43\xc3\x44\xc3\x45\x56\x4a\xc3\x46\x58\x5c\xc3\x47\xc3\x48\xc3\x49\xc3\x4a\xc3\x4b\xc3\x4c\xc3\x4d\xc3\x4e\xc3\x4f\xc3\x50\xc3\x51\x6b\xae\xc3\x52\xc3\x53\x6b\xaf\xc3\x54\xc3\x55\x6b\xb0\xc3\x56\x51\xb5\xc3\x57\xc3\x58\xc3\x59\xc3\x5a\xc3\x5b\x48\xd3\x53\x9a\xc3\x5c\xc3\x5d\xc3\x5e\xc3\x5f\x6b\xb1\xc3\x60\xc3\x61\xc3\x62\xc3\x63\xc3\x64\xc3\x65\xc3\x66\xc3\x67\xc3\x68\xc3\x69\xc3\x6a\xc3\x6b\xc3\x6c\xc3\x6d\xc3\x6e\xc3\x6f\xc3\x70\xc3\x71\xc3\x72\x54\x81\x6b\xa5\xc3\x73\xc3\x74\x4f\xb7\xc3\x75\xc3\x76\x4f\xb1\xc3\x77\x4b\x86\xc3\x78\xc3\x79\x4c\x67\xc3\x7a\x50\x5f\x52\x72\x52\x87\xc3\x7b\xc3\x7c\x5c\xcb\xc3\x7d\xc3\x7e\xc3\x7f\x4c\xee\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\x4f\x9a\x59\x45\xc3\x8a\x48\xcf\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\x6c\x50\xc3\x90\xc3\x91\xc3\x92", /* 9780 */ "\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\x6c\x51\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\x58\xab\xc3\x9d\x48\xaf\xc3\x9e\xc3\x9f\xc3\xa0\x6c\x52\x6c\x53\xc3\xa1\x6c\x54\xc3\xa2\xc3\xa3\xc3\xa4\x54\x6a\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\x4f\xce\xc3\xac\xc3\xad\x6c\x57\xc3\xae\xc3\xaf\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\x6c\x56\xc3\xb5\x49\x7e\xc3\xb6\x6c\x55\xc3\xb7\xc3\xb8\x6c\x58\xc3\xb9\x6c\x59\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xc3\xc0\xc3\xc1\xc3\xc2\xc3\xc3\xc3\xc4\xc3\xc5\xc3\xc6\xc3\xc7\xc3\xc8\xc3\xc9\xc3\xca\xc3\xcb\xc3\xcc\xc3\xcd\xc3\xce\xc3\xcf\xc3\xd0\xc3\xd1\xc3\xd2\xc3\xd3\xc3\xd4\xc3\xd5\xc3\xd6\xc3\xd7\xc3\xd8\xc3\xd9\xc3\xda\xc3\xdb\xc3\xdc\xc3\xdd\xc3\xde\xc3\xdf\xc3\xe0\xc3\xe1\xc3\xe2\xc3\xe3\xc3\xe4\xc3\xe5\xc3\xe6\xc3\xe7\xc3\xe8\xc3\xe9\xc3\xea\x57\xa3\x54\xcc\xc3\xeb\x4d\xaa\x64\xb7\x64\xb8\x64\xb9\x4f\xc1\xc3\xec\xc3\xed\xc3\xee\xc3\xef\xc3\xf0\x59\xf3\xc3\xf1\x5a\xce\x55\x78\xc3\xf2\xc3\xf3\xc3\xf4\xc3\xf5\xc3\xf6\xc3\xf7\xc3\xf8\xc3\xf9\xc3\xfa", /* 9800 */ "\xc3\xfb\xc3\xfc\xc3\xfd\xc4\x41\xc4\x42\xc4\x43\xc4\x44\xc4\x45\xc4\x46\xc4\x47\xc4\x48\xc4\x49\xc4\x4a\xc4\x4b\xc4\x4c\xc4\x4d\xc4\x4e\xc4\x4f\xc4\x50\xc4\x51\xc4\x52\xc4\x53\xc4\x54\xc4\x55\xc4\x56\xc4\x57\xc4\x58\xc4\x59\xc4\x5a\xc4\x5b\xc4\x5c\xc4\x5d\xc4\x5e\xc4\x5f\xc4\x60\xc4\x61\xc4\x62\xc4\x63\xc4\x64\xc4\x65\xc4\x66\xc4\x67\xc4\x68\xc4\x69\xc4\x6a\xc4\x6b\xc4\x6c\xc4\x6d\xc4\x6e\xc4\x6f\xc4\x70\xc4\x71\xc4\x72\xc4\x73\xc4\x74\xc4\x75\xc4\x76\xc4\x77\xc4\x78\xc4\x79\xc4\x7a\xc4\x7b\xc4\x7c\xc4\x7d\xc4\x7e\xc4\x7f\xc4\x81\xc4\x82\xc4\x83\xc4\x84\xc4\x85\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc4\x8a\xc4\x8b\xc4\x8c\xc4\x8d\xc4\x8e\xc4\x8f\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xc4\x94\xc4\x95\xc4\x96\xc4\x97\xc4\x98\xc4\x99\xc4\x9a\xc4\x9b\xc4\x9c\xc4\x9d\xc4\x9e\xc4\x9f\xc4\xa0\xc4\xa1\xc4\xa2\xc4\xa3\xc4\xa4\xc4\xa5\xc4\xa6\xc4\xa7\xc4\xa8\xc4\xa9\xc4\xaa\xc4\xab\xc4\xac\xc4\xad\xc4\xae\xc4\xaf\xc4\xb0\xc4\xb1\xc4\xb2\xc4\xb3\x59\xb2\x4b\xa4\x54\x8b\x69\x9d\x58\x8f\x56\x53\x58\xea\x64\x90\x57\x88\x4d\x6b\x4b\xd8", /* 9880 */ "\x69\x9e\x48\xe3\x56\x6c\x69\x9f\x5a\xa3\x51\xac\x51\x8d\x53\xc3\x4f\xb0\x69\xa0\x4e\xd4\xc4\xb4\x69\xa1\x69\xa2\xc4\xb5\x69\xa3\x59\xc2\x53\xb4\xc4\xb6\x57\x67\x69\xa4\xc4\xb7\x5a\x51\x50\x65\x56\xe1\xc4\xb8\x69\xa5\x69\xa6\x59\x75\x4b\xed\x69\xa7\x69\xa8\x4b\x7f\x69\xa9\x69\xaa\xc4\xb9\x49\xfb\x69\xab\x69\xac\x54\xa6\xc4\xba\xc4\xbb\xc4\xbc\xc4\xbd\xc4\xbe\xc4\xbf\xc4\xc0\xc4\xc1\xc4\xc2\xc4\xc3\xc4\xc4\xc4\xc5\xc4\xc6\xc4\xc7\xc4\xc8\xc4\xc9\xc4\xca\xc4\xcb\xc4\xcc\xc4\xcd\xc4\xce\xc4\xcf\xc4\xd0\xc4\xd1\xc4\xd2\xc4\xd3\xc4\xd4\xc4\xd5\xc4\xd6\xc4\xd7\xc4\xd8\xc4\xd9\xc4\xda\xc4\xdb\xc4\xdc\xc4\xdd\xc4\xde\xc4\xdf\x4c\x88\xc4\xe0\xc4\xe1\x66\xa8\x66\xa9\x66\xaa\xc4\xe2\x66\xab\xc4\xe3\xc4\xe4\x53\xad\x66\xac\x66\xad\xc4\xe5\xc4\xe6\xc4\xe7\x4c\x69\x55\xb2\xc4\xe8\xc4\xe9\xc4\xea\xc4\xeb\xc4\xec\xc4\xed\xc4\xee\x61\xb7\x6c\x6f\xc4\xef\xc4\xf0\xc4\xf1\xc4\xf2\xc4\xf3\xc4\xf4\xc4\xf5\xc4\xf6\xc4\xf7\xc4\xf8\xc4\xf9\xc4\xfa\xc4\xfb\xc4\xfc\xc4\xfd\xc5\x41\xc5\x42\xc5\x43\xc5\x44\xc5\x45\xc5\x46\xc5\x47\xc5\x48", /* 9900 */ "\xc5\x49\xc5\x4a\xc5\x4b\xc5\x4c\xc5\x4d\xc5\x4e\xc5\x4f\xc5\x50\xc5\x51\xc5\x52\xc5\x53\xc5\x54\xc5\x55\x6c\x70\xc5\x56\xc5\x57\x49\xcc\xc5\x58\xc5\x59\xc5\x5a\xc5\x5b\xc5\x5c\xc5\x5d\xc5\x5e\xc5\x5f\xc5\x60\xc5\x61\xc5\x62\xc5\x63\xc5\x64\xc5\x65\xc5\x66\xc5\x67\xc5\x68\xc5\x69\xc5\x6a\xc5\x6b\xc5\x6c\xc5\x6d\xc5\x6e\xc5\x6f\xc5\x70\xc5\x71\xc5\x72\xc5\x73\xc5\x74\x6c\x71\xc5\x75\xc5\x76\xc5\x77\xc5\x78\xc5\x79\xc5\x7a\xc5\x7b\xc5\x7c\xc5\x7d\xc5\x7e\xc5\x7f\xc5\x81\xc5\x82\xc5\x83\xc5\x84\xc5\x85\xc5\x86\xc5\x87\xc5\x88\xc5\x89\xc5\x8a\xc5\x8b\xc5\x8c\xc5\x8d\xc5\x8e\xc5\x8f\xc5\x90\xc5\x91\xc5\x92\xc5\x93\xc5\x94\xc5\x95\xc5\x96\xc5\x97\xc5\x98\xc5\x99\xc5\x9a\x6c\x73\x6c\x72\xc5\x9b\xc5\x9c\xc5\x9d\xc5\x9e\xc5\x9f\xc5\xa0\xc5\xa1\xc5\xa2\xc5\xa3\xc5\xa4\xc5\xa5\xc5\xa6\xc5\xa7\x61\xba\xc5\xa8\x4e\xa1\xc5\xa9\x61\xbb\x61\xbc\x61\xbd\x61\xbe\x61\xbf\x61\xc0\x4c\x59\x59\xfa\x4f\x44\x55\xcd\x49\x45\x56\x67\xc5\xaa\x61\xc1\x4b\xfb\x54\xc3\x61\xc2\xc5\xab\xc5\xac\x4f\x68\xc5\xad\x49\x9e\x61\xc3\xc5\xae\x4b\xf5", /* 9980 */ "\x61\xc4\x52\xd8\xc5\xaf\xc5\xb0\x61\xc5\x58\x7a\x4d\x7d\x61\xc6\x50\xa0\xc5\xb1\x61\xc7\x49\xf5\xc5\xb2\x61\xc8\xc5\xb3\x51\x94\x61\xc9\x61\xca\x51\xf7\x61\xcb\x61\xcc\x61\xcd\x55\xd6\x5c\xb7\x5d\x86\x58\x84\xc5\xb4\xc5\xb5\xc5\xb6\xc5\xb7\xc5\xb8\xc5\xb9\xc5\xba\xc5\xbb\xc5\xbc\xc5\xbd\xc5\xbe\x68\xa4\xc5\xbf\xc5\xc0\x5e\xaf\xc5\xc1\xc5\xc2\xc5\xc3\xc5\xc4\xc5\xc5\xc5\xc6\xc5\xc7\xc5\xc8\xc5\xc9\xc5\xca\xc5\xcb\xc5\xcc\xc5\xcd\xc5\xce\xc5\xcf\xc5\xd0\xc5\xd1\xc5\xd2\xc5\xd3\xc5\xd4\xc5\xd5\xc5\xd6\xc5\xd7\xc5\xd8\xc5\xd9\xc5\xda\xc5\xdb\xc5\xdc\xc5\xdd\xc5\xde\xc5\xdf\xc5\xe0\xc5\xe1\xc5\xe2\xc5\xe3\xc5\xe4\xc5\xe5\xc5\xe6\xc5\xe7\xc5\xe8\xc5\xe9\xc5\xea\xc5\xeb\xc5\xec\xc5\xed\xc5\xee\xc5\xef\xc5\xf0\xc5\xf1\xc5\xf2\xc5\xf3\xc5\xf4\xc5\xf5\xc5\xf6\xc5\xf7\xc5\xf8\xc5\xf9\xc5\xfa\xc5\xfb\xc5\xfc\xc5\xfd\xc6\x41\xc6\x42\xc6\x43\xc6\x44\xc6\x45\xc6\x46\xc6\x47\xc6\x48\xc6\x49\xc6\x4a\xc6\x4b\xc6\x4c\xc6\x4d\xc6\x4e\xc6\x4f\xc6\x50\xc6\x51\xc6\x52\xc6\x53\xc6\x54\xc6\x55\xc6\x56\xc6\x57\xc6\x58\xc6\x59\xc6\x5a", /* 9a00 */ "\xc6\x5b\xc6\x5c\xc6\x5d\xc6\x5e\xc6\x5f\xc6\x60\xc6\x61\xc6\x62\xc6\x63\xc6\x64\xc6\x65\xc6\x66\xc6\x67\xc6\x68\xc6\x69\xc6\x6a\xc6\x6b\xc6\x6c\xc6\x6d\xc6\x6e\xc6\x6f\xc6\x70\xc6\x71\xc6\x72\xc6\x73\xc6\x74\xc6\x75\xc6\x76\xc6\x77\xc6\x78\xc6\x79\xc6\x7a\xc6\x7b\xc6\x7c\xc6\x7d\xc6\x7e\xc6\x7f\xc6\x81\xc6\x82\xc6\x83\xc6\x84\xc6\x85\xc6\x86\xc6\x87\xc6\x88\xc6\x89\xc6\x8a\xc6\x8b\xc6\x8c\xc6\x8d\xc6\x8e\xc6\x8f\xc6\x90\xc6\x91\xc6\x92\xc6\x93\xc6\x94\xc6\x95\xc6\x96\xc6\x97\xc6\x98\xc6\x99\xc6\x9a\xc6\x9b\xc6\x9c\xc6\x9d\xc6\x9e\xc6\x9f\xc6\xa0\xc6\xa1\xc6\xa2\xc6\xa3\xc6\xa4\xc6\xa5\xc6\xa6\xc6\xa7\xc6\xa8\xc6\xa9\xc6\xaa\xc6\xab\xc6\xac\xc6\xad\xc6\xae\xc6\xaf\xc6\xb0\xc6\xb1\xc6\xb2\xc6\xb3\xc6\xb4\xc6\xb5\xc6\xb6\xc6\xb7\xc6\xb8\xc6\xb9\xc6\xba\xc6\xbb\xc6\xbc\xc6\xbd\xc6\xbe\xc6\xbf\xc6\xc0\xc6\xc1\xc6\xc2\xc6\xc3\xc6\xc4\xc6\xc5\xc6\xc6\xc6\xc7\x51\xec\x5a\xa5\x57\x74\x59\x51\x4a\x7b\x54\x9e\xc6\xc8\x49\xb4\x51\xbe\x63\xdf\x55\xba\x63\xe0\x63\xe1\x4f\xd3\x63\xe2\x5c\x44\x57\x75\x63\xe4\x4e\xdc\x63\xe3", /* 9a80 */ "\x63\xe5\x63\xe6\x51\xed\xc6\xc9\x4f\x5e\x63\xe7\x51\xe5\x4d\xa6\x63\xe8\xc6\xca\x63\xe9\x4a\x72\x59\x8a\xc6\xcb\xc6\xcc\x50\x45\x63\xea\x53\xee\x63\xeb\x63\xec\xc6\xcd\xc6\xce\x63\xed\x53\xac\x63\xee\xc6\xcf\x55\x47\x63\xef\x63\xf0\x63\xf1\x63\x59\x63\xf2\x63\xf3\x51\xe1\x63\xf4\x63\xf5\x5b\xe7\x63\xf6\xc6\xd0\x63\xf7\x4d\x67\xc6\xd1\xc6\xd2\xc6\xd3\xc6\xd4\xc6\xd5\xc6\xd6\xc6\xd7\x6c\x5b\x6c\x5a\xc6\xd8\xc6\xd9\xc6\xda\xc6\xdb\x6c\x5e\x6c\x5c\x4d\xa0\xc6\xdc\x6c\x5f\xc6\xdd\x6c\x60\xc6\xde\xc6\xdf\xc6\xe0\x6c\x62\x6c\x61\x6c\x64\xc6\xe1\xc6\xe2\x6c\x63\xc6\xe3\xc6\xe4\xc6\xe5\xc6\xe6\xc6\xe7\x6c\x65\x6c\x66\xc6\xe8\xc6\xe9\xc6\xea\xc6\xeb\x6c\x67\xc6\xec\x56\x89\xc6\xed\xc6\xee\xc6\xef\xc6\xf0\x4c\xde\xc6\xf1\xc6\xf2\xc6\xf3\xc6\xf4\xc6\xf5\xc6\xf6\x6c\x74\xc6\xf7\x6c\x75\xc6\xf8\xc6\xf9\xc6\xfa\xc6\xfb\x6c\x76\xc6\xfc\xc6\xfd\xc7\x41\xc7\x42\x6c\x78\xc7\x43\x6c\x7a\xc7\x44\x6c\x77\xc7\x45\xc7\x46\xc7\x47\xc7\x48\xc7\x49\xc7\x4a\xc7\x4b\xc7\x4c\xc7\x4d\x6c\x7b\xc7\x4e\x6c\x79\xc7\x4f\xc7\x50\xc7\x51\xc7\x52", /* 9b00 */ "\xc7\x53\xc7\x54\xc7\x55\x5c\x77\xc7\x56\xc7\x57\xc7\x58\xc7\x59\x6c\x7c\xc7\x5a\xc7\x5b\xc7\x5c\xc7\x5d\xc7\x5e\xc7\x5f\x6c\x7d\xc7\x60\xc7\x61\xc7\x62\x6c\x7e\xc7\x63\xc7\x64\xc7\x65\xc7\x66\xc7\x67\xc7\x68\xc7\x69\xc7\x6a\xc7\x6b\xc7\x6c\xc7\x6d\x6c\x7f\xc7\x6e\xc7\x6f\xc7\x70\x6c\x81\xc7\x71\xc7\x72\xc7\x73\xc7\x74\xc7\x75\xc7\x76\xc7\x77\xc7\x78\xc7\x79\xc7\x7a\xc7\x7b\x5e\x6b\xc7\x7c\xc7\x7d\x5c\xa9\xc7\x7e\xc7\x7f\xc7\x81\xc7\x82\xc7\x83\xc7\x84\xc7\x85\xc7\x86\x63\x98\x4d\x8e\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\x50\x9e\x4e\x8b\x6c\x69\x53\xc6\x6c\x68\xc7\x8b\x6c\x6a\x6c\x6c\x6c\x6b\xc7\x8c\xc7\x8d\xc7\x8e\x6c\x6d\xc7\x8f\x57\xb9\xc7\x90\x6c\x6e\xc7\x91\xc7\x92\x52\xa6\xc7\x93\xc7\x94\xc7\x95\xc7\x96\xc7\x97\xc7\x98\xc7\x99\xc7\x9a\xc7\x9b\xc7\x9c\xc7\x9d\xc7\x9e\xc7\x9f\xc7\xa0\xc7\xa1\xc7\xa2\xc7\xa3\xc7\xa4\xc7\xa5\xc7\xa6\xc7\xa7\xc7\xa8\xc7\xa9\xc7\xaa\xc7\xab\xc7\xac\xc7\xad\xc7\xae\xc7\xaf\xc7\xb0\xc7\xb1\xc7\xb2\xc7\xb3\xc7\xb4\xc7\xb5\xc7\xb6\xc7\xb7\xc7\xb8\xc7\xb9\xc7\xba\xc7\xbb\xc7\xbc\xc7\xbd", /* 9b80 */ "\xc7\xbe\xc7\xbf\xc7\xc0\xc7\xc1\xc7\xc2\xc7\xc3\xc7\xc4\xc7\xc5\xc7\xc6\xc7\xc7\xc7\xc8\xc7\xc9\xc7\xca\xc7\xcb\xc7\xcc\xc7\xcd\xc7\xce\xc7\xcf\xc7\xd0\xc7\xd1\xc7\xd2\xc7\xd3\xc7\xd4\xc7\xd5\xc7\xd6\xc7\xd7\xc7\xd8\xc7\xd9\xc7\xda\xc7\xdb\xc7\xdc\xc7\xdd\xc7\xde\xc7\xdf\xc7\xe0\xc7\xe1\xc7\xe2\xc7\xe3\xc7\xe4\xc7\xe5\xc7\xe6\xc7\xe7\xc7\xe8\xc7\xe9\xc7\xea\xc7\xeb\xc7\xec\xc7\xed\xc7\xee\xc7\xef\xc7\xf0\xc7\xf1\xc7\xf2\xc7\xf3\xc7\xf4\xc7\xf5\xc7\xf6\xc7\xf7\xc7\xf8\xc7\xf9\xc7\xfa\xc7\xfb\xc7\xfc\xc7\xfd\xc8\x41\xc8\x42\xc8\x43\xc8\x44\xc8\x45\xc8\x46\xc8\x47\xc8\x48\xc8\x49\xc8\x4a\xc8\x4b\xc8\x4c\xc8\x4d\xc8\x4e\xc8\x4f\xc8\x50\xc8\x51\xc8\x52\xc8\x53\xc8\x54\xc8\x55\xc8\x56\xc8\x57\xc8\x58\xc8\x59\xc8\x5a\xc8\x5b\xc8\x5c\xc8\x5d\xc8\x5e\xc8\x5f\xc8\x60\xc8\x61\xc8\x62\xc8\x63\xc8\x64\xc8\x65\xc8\x66\xc8\x67\xc8\x68\xc8\x69\xc8\x6a\xc8\x6b\xc8\x6c\xc8\x6d\xc8\x6e\xc8\x6f\xc8\x70\xc8\x71\xc8\x72\xc8\x73\xc8\x74\xc8\x75\xc8\x76\xc8\x77\xc8\x78\xc8\x79\xc8\x7a\xc8\x7b\xc8\x7c\xc8\x7d\xc8\x7e\xc8\x7f\xc8\x81", /* 9c00 */ "\xc8\x82\xc8\x83\xc8\x84\xc8\x85\xc8\x86\xc8\x87\xc8\x88\xc8\x89\xc8\x8a\xc8\x8b\xc8\x8c\xc8\x8d\xc8\x8e\xc8\x8f\xc8\x90\xc8\x91\xc8\x92\xc8\x93\xc8\x94\xc8\x95\xc8\x96\xc8\x97\xc8\x98\xc8\x99\xc8\x9a\xc8\x9b\xc8\x9c\xc8\x9d\xc8\x9e\xc8\x9f\xc8\xa0\xc8\xa1\xc8\xa2\xc8\xa3\xc8\xa4\xc8\xa5\xc8\xa6\xc8\xa7\xc8\xa8\xc8\xa9\xc8\xaa\xc8\xab\xc8\xac\xc8\xad\xc8\xae\xc8\xaf\xc8\xb0\xc8\xb1\xc8\xb2\xc8\xb3\xc8\xb4\xc8\xb5\xc8\xb6\xc8\xb7\xc8\xb8\xc8\xb9\xc8\xba\xc8\xbb\xc8\xbc\xc8\xbd\xc8\xbe\xc8\xbf\xc8\xc0\xc8\xc1\xc8\xc2\xc8\xc3\xc8\xc4\xc8\xc5\xc8\xc6\xc8\xc7\xc8\xc8\xc8\xc9\xc8\xca\xc8\xcb\xc8\xcc\xc8\xcd\xc8\xce\xc8\xcf\xc8\xd0\xc8\xd1\xc8\xd2\xc8\xd3\xc8\xd4\xc8\xd5\xc8\xd6\xc8\xd7\xc8\xd8\xc8\xd9\xc8\xda\xc8\xdb\xc8\xdc\xc8\xdd\xc8\xde\xc8\xdf\xc8\xe0\xc8\xe1\xc8\xe2\xc8\xe3\xc8\xe4\xc8\xe5\xc8\xe6\xc8\xe7\xc8\xe8\xc8\xe9\xc8\xea\xc8\xeb\xc8\xec\xc8\xed\xc8\xee\xc8\xef\xc8\xf0\xc8\xf1\xc8\xf2\xc8\xf3\xc8\xf4\xc8\xf5\xc8\xf6\xc8\xf7\xc8\xf8\xc8\xf9\xc8\xfa\xc8\xfb\xc8\xfc\xc8\xfd\x5a\x84\xc9\x41\xc9\x42\x6b\xce", /* 9c80 */ "\xc9\x43\x51\xb2\x6b\xcf\xc9\x44\xc9\x45\x6b\xd0\x6b\xd1\x6b\xd2\x6b\xd3\xc9\x46\xc9\x47\x6b\xd5\xc9\x48\x49\x4b\x6b\xd6\xc9\x49\x6b\xd7\x6b\xd8\x6b\xd9\xc9\x4a\x6b\xda\x6b\xdb\xc9\x4b\xc9\x4c\xc9\x4d\xc9\x4e\x6b\xdc\x6b\xdd\x58\x6a\xc9\x4f\x6b\xde\x6b\xdf\x6b\xe0\x6b\xe1\x6b\xe2\x6b\xe3\x50\xef\x6b\xe4\x6b\xe5\x6b\xe6\x6b\xe7\x6b\xe8\xc9\x50\x6b\xe9\xc9\x51\x6b\xea\x6b\xeb\xc9\x52\x6b\xec\x6b\xed\x6b\xee\x6b\xef\x6b\xf0\x6b\xf1\x6b\xf2\x6b\xf3\x4f\xa7\xc9\x53\x6b\xf4\x6b\xf5\x6b\xf6\x6b\xf7\xc9\x54\xc9\x55\xc9\x56\xc9\x57\xc9\x58\x54\xf9\x6b\xf8\x6b\xf9\x6b\xfa\x6b\xfb\xc9\x59\xc9\x5a\x6b\xfc\x6b\xfd\x6c\x41\x6c\x42\x6c\x43\x6c\x44\x6c\x45\xc9\x5b\xc9\x5c\x6c\x46\x6c\x47\x6c\x48\x49\x8f\x6c\x49\x6c\x4a\x6c\x4b\xc9\x5d\xc9\x5e\x6c\x4c\x6c\x4d\x51\x7b\x6c\x4e\xc9\x5f\xc9\x60\x6c\x4f\xc9\x61\xc9\x62\xc9\x63\xc9\x64\xc9\x65\xc9\x66\xc9\x67\xc9\x68\xc9\x69\xc9\x6a\xc9\x6b\xc9\x6c\xc9\x6d\xc9\x6e\xc9\x6f\xc9\x70\xc9\x71\xc9\x72\xc9\x73\xc9\x74\xc9\x75\xc9\x76\xc9\x77\xc9\x78\xc9\x79\xc9\x7a\xc9\x7b\xc9\x7c\xc9\x7d", /* 9d00 */ "\xc9\x7e\xc9\x7f\xc9\x81\xc9\x82\xc9\x83\xc9\x84\xc9\x85\xc9\x86\xc9\x87\xc9\x88\xc9\x89\xc9\x8a\xc9\x8b\xc9\x8c\xc9\x8d\xc9\x8e\xc9\x8f\xc9\x90\xc9\x91\xc9\x92\xc9\x93\xc9\x94\xc9\x95\xc9\x96\xc9\x97\xc9\x98\xc9\x99\xc9\x9a\xc9\x9b\xc9\x9c\xc9\x9d\xc9\x9e\xc9\x9f\xc9\xa0\xc9\xa1\xc9\xa2\xc9\xa3\xc9\xa4\xc9\xa5\xc9\xa6\xc9\xa7\xc9\xa8\xc9\xa9\xc9\xaa\xc9\xab\xc9\xac\xc9\xad\xc9\xae\xc9\xaf\xc9\xb0\xc9\xb1\xc9\xb2\xc9\xb3\xc9\xb4\xc9\xb5\xc9\xb6\xc9\xb7\xc9\xb8\xc9\xb9\xc9\xba\xc9\xbb\xc9\xbc\xc9\xbd\xc9\xbe\xc9\xbf\xc9\xc0\xc9\xc1\xc9\xc2\xc9\xc3\xc9\xc4\xc9\xc5\xc9\xc6\xc9\xc7\xc9\xc8\xc9\xc9\xc9\xca\xc9\xcb\xc9\xcc\xc9\xcd\xc9\xce\xc9\xcf\xc9\xd0\xc9\xd1\xc9\xd2\xc9\xd3\xc9\xd4\xc9\xd5\xc9\xd6\xc9\xd7\xc9\xd8\xc9\xd9\xc9\xda\xc9\xdb\xc9\xdc\xc9\xdd\xc9\xde\xc9\xdf\xc9\xe0\xc9\xe1\xc9\xe2\xc9\xe3\xc9\xe4\xc9\xe5\xc9\xe6\xc9\xe7\xc9\xe8\xc9\xe9\xc9\xea\xc9\xeb\xc9\xec\xc9\xed\xc9\xee\xc9\xef\xc9\xf0\xc9\xf1\xc9\xf2\xc9\xf3\xc9\xf4\xc9\xf5\xc9\xf6\xc9\xf7\xc9\xf8\xc9\xf9\xc9\xfa\xc9\xfb\xc9\xfc\xc9\xfd\xca\x41", /* 9d80 */ "\xca\x42\xca\x43\xca\x44\xca\x45\xca\x46\xca\x47\xca\x48\xca\x49\xca\x4a\xca\x4b\xca\x4c\xca\x4d\xca\x4e\xca\x4f\xca\x50\xca\x51\xca\x52\xca\x53\xca\x54\xca\x55\xca\x56\xca\x57\xca\x58\xca\x59\xca\x5a\xca\x5b\xca\x5c\xca\x5d\xca\x5e\xca\x5f\xca\x60\xca\x61\xca\x62\xca\x63\xca\x64\xca\x65\xca\x66\xca\x67\xca\x68\xca\x69\xca\x6a\xca\x6b\xca\x6c\xca\x6d\xca\x6e\xca\x6f\xca\x70\xca\x71\xca\x72\xca\x73\xca\x74\xca\x75\xca\x76\xca\x77\xca\x78\xca\x79\xca\x7a\xca\x7b\xca\x7c\xca\x7d\xca\x7e\xca\x7f\xca\x81\xca\x82\xca\x83\xca\x84\xca\x85\xca\x86\xca\x87\xca\x88\xca\x89\xca\x8a\xca\x8b\xca\x8c\xca\x8d\xca\x8e\xca\x8f\xca\x90\xca\x91\xca\x92\xca\x93\xca\x94\xca\x95\xca\x96\xca\x97\xca\x98\xca\x99\xca\x9a\xca\x9b\xca\x9c\xca\x9d\xca\x9e\xca\x9f\xca\xa0\xca\xa1\xca\xa2\xca\xa3\xca\xa4\xca\xa5\xca\xa6\xca\xa7\xca\xa8\xca\xa9\xca\xaa\xca\xab\xca\xac\xca\xad\xca\xae\xca\xaf\xca\xb0\xca\xb1\xca\xb2\xca\xb3\xca\xb4\xca\xb5\xca\xb6\xca\xb7\xca\xb8\xca\xb9\xca\xba\xca\xbb\xca\xbc\xca\xbd\xca\xbe\xca\xbf\xca\xc0\xca\xc1\xca\xc2", /* 9e00 */ "\xca\xc3\xca\xc4\xca\xc5\xca\xc6\xca\xc7\xca\xc8\xca\xc9\xca\xca\xca\xcb\xca\xcc\xca\xcd\xca\xce\xca\xcf\xca\xd0\xca\xd1\xca\xd2\xca\xd3\xca\xd4\xca\xd5\xca\xd6\xca\xd7\xca\xd8\xca\xd9\xca\xda\xca\xdb\xca\xdc\xca\xdd\xca\xde\xca\xdf\xca\xe0\xca\xe1\x52\xf0\x68\xae\x4e\xa5\x68\xaf\x52\x9a\xca\xe2\x53\x58\x59\x5b\xca\xe3\x68\xb0\x68\xb1\x68\xb2\x68\xb3\x68\xb4\x59\x5c\xca\xe4\x59\x8d\xca\xe5\x68\xb6\x68\xb5\x5a\xa6\xca\xe6\x57\x72\x68\xb7\x68\xb9\x68\xb8\x68\xba\x68\xbb\xca\xe7\xca\xe8\x4c\xea\x68\xbc\x4d\xe7\xca\xe9\x68\xbd\x68\xbe\x4f\xe8\x68\xbf\x4b\xeb\x68\xc0\x68\xc1\x68\xc2\x68\xc3\x54\xb4\x68\xc4\x68\xc5\xca\xea\x68\xc6\x53\x95\xca\xeb\x68\xc7\xca\xec\xca\xed\xca\xee\x68\xc8\xca\xef\x68\xc9\x6c\x5d\xca\xf0\x68\xca\x68\xcb\x68\xcc\xca\xf1\x68\xcd\xca\xf2\xca\xf3\xca\xf4\xca\xf5\x68\xce\x4d\xd6\xca\xf6\x68\xcf\x68\xd0\x68\xd1\x68\xd2\x68\xd3\x68\xd4\x68\xd5\x68\xd7\xca\xf7\xca\xf8\x5a\x45\x68\xd6\xca\xf9\x68\xd8\xca\xfa\xca\xfb\xca\xfc\xca\xfd\xcb\x41\xcb\x42\xcb\x43\xcb\x44\xcb\x45\xcb\x46\x6b\x5a\x51\xb8", /* 9e80 */ "\xcb\x47\xcb\x48\x6c\x85\xcb\x49\xcb\x4a\xcb\x4b\xcb\x4c\x6c\x86\x6c\x87\xcb\x4d\xcb\x4e\x6c\x88\xcb\x4f\xcb\x50\xcb\x51\xcb\x52\xcb\x53\xcb\x54\x6c\x89\x51\xb3\xcb\x55\xcb\x56\xcb\x57\xcb\x58\xcb\x59\xcb\x5a\xcb\x5b\xcb\x5c\xcb\x5d\x6c\x8b\xcb\x5e\x6c\x8c\xcb\x5f\xcb\x60\xcb\x61\xcb\x62\xcb\x63\xcb\x64\x51\xf2\xcb\x65\xcb\x66\xcb\x67\xcb\x68\xcb\x69\xcb\x6a\xcb\x6b\xcb\x6c\xcb\x6d\xcb\x6e\xcb\x6f\xcb\x70\xcb\x71\x6a\xef\xcb\x72\xcb\x73\xcb\x74\x6a\xee\xcb\x75\xcb\x76\x51\xe8\xcb\x77\x6c\x82\x6c\x83\xcb\x78\xcb\x79\xcb\x7a\xcb\x7b\xcb\x7c\x4e\x66\xcb\x7d\xcb\x7e\xcb\x7f\xcb\x81\x5d\x85\xcb\x82\xcb\x83\xcb\x84\x55\xf1\x50\xe7\x68\xa3\xcb\x85\x4d\xd9\xcb\x86\xcb\x87\x54\x4d\xcb\x88\xcb\x89\xcb\x8a\x52\xab\xcb\x8b\xcb\x8c\x6c\x8d\x6c\x8e\x6c\x8f\xcb\x8d\x6c\x91\x6c\x90\xcb\x8e\x6c\x92\xcb\x8f\xcb\x90\x6c\x95\xcb\x91\x6c\x94\xcb\x92\x6c\x93\x6c\x96\xcb\x93\xcb\x94\xcb\x95\xcb\x96\x6c\x97\xcb\x97\xcb\x98\xcb\x99\xcb\x9a\xcb\x9b\xcb\x9c\xcb\x9d\xcb\x9e\xcb\x9f\x67\x8a\xcb\xa0\x67\x8b\x67\x8c\xcb\xa1\x6b\xbb\xcb\xa2", /* 9f00 */ "\xcb\xa3\xcb\xa4\xcb\xa5\xcb\xa6\xcb\xa7\xcb\xa8\xcb\xa9\xcb\xaa\xcb\xab\xcb\xac\xcb\xad\x6b\xbc\xcb\xae\x6b\xbd\x4b\xa5\xcb\xaf\x5c\xbd\xcb\xb0\xcb\xb1\x4d\x64\xcb\xb2\xcb\xb3\xcb\xb4\x5c\xba\xcb\xb5\x5e\xb0\xcb\xb6\xcb\xb7\xcb\xb8\xcb\xb9\xcb\xba\xcb\xbb\x55\xf2\xcb\xbc\x6c\x98\xcb\xbd\xcb\xbe\xcb\xbf\xcb\xc0\xcb\xc1\xcb\xc2\xcb\xc3\xcb\xc4\xcb\xc5\x6c\x99\xcb\xc6\xcb\xc7\x6c\x9a\xcb\xc8\xcb\xc9\xcb\xca\xcb\xcb\xcb\xcc\xcb\xcd\xcb\xce\x6c\x9c\xcb\xcf\x6c\x9b\xcb\xd0\x49\x67\xcb\xd1\x6c\x9d\x6c\x9e\xcb\xd2\xcb\xd3\xcb\xd4\xcb\xd5\xcb\xd6\x6c\x9f\xcb\xd7\xcb\xd8\xcb\xd9\xcb\xda\xcb\xdb\xcb\xdc\xcb\xdd\xcb\xde\xcb\xdf\xcb\xe0\xcb\xe1\x53\xea\x66\xb3\xcb\xe2\xcb\xe3\xcb\xe4\xcb\xe5\xcb\xe6\xcb\xe7\xcb\xe8\xcb\xe9\xcb\xea\xcb\xeb\xcb\xec\xcb\xed\xcb\xee\xcb\xef\xcb\xf0\xcb\xf1\xcb\xf2\xcb\xf3\xcb\xf4\xcb\xf5\xcb\xf6\xcb\xf7\xcb\xf8\xcb\xf9\xcb\xfa\xcb\xfb\xcb\xfc\xcb\xfd\xcc\x41\xcc\x42\xcc\x43\xcc\x44\xcc\x45\xcc\x46\xcc\x47\xcc\x48\xcc\x49\xcc\x4a\xcc\x4b\xcc\x4c\xcc\x4d\xcc\x4e\xcc\x4f\xcc\x50\xcc\x51\x4a\x7d", /* 9f80 */ "\x6b\xb2\xcc\x52\xcc\x53\x6b\xb3\x51\x85\x6b\xb4\x6b\xb5\x6b\xb6\x6b\xb7\x6b\xb8\x6b\xb9\x54\xa2\x6b\xba\xcc\x54\xcc\x55\xcc\x56\xcc\x57\xcc\x58\xcc\x59\xcc\x5a\xcc\x5b\xcc\x5c\xcc\x5d\xcc\x5e\xcc\x5f\x51\x9b\x4d\x48\x67\x89\xcc\x60\xcc\x61\xcc\x62\x4d\x8b\x5d\x7f\xcc\x63\xcc\x64\xcc\x65\xcc\x66\xcc\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ "\x6f\x75\x6f\x76\x6f\x77\x6f\x78\x6f\x79\x6f\x7a\x6f\x7b\x6f\x7c\x6f\x7d\x6f\x7e\x6f\x7f\x6f\x80\x6f\x81\x6f\x82\x6f\x83\x6f\x84\x6f\x85\x6f\x86\x6f\x87\x6f\x88\x6f\x89\x6f\x8a\x6f\x8b\x6f\x8c\x6f\x8d\x6f\x8e\x6f\x8f\x6f\x90\x6f\x91\x6f\x92\x6f\x93\x6f\x94\x6f\x95\x6f\x96\x6f\x97\x6f\x98\x6f\x99\x6f\x9a\x6f\x9b\x6f\x9c\x6f\x9d\x6f\x9e\x6f\x9f\x6f\xa0\x6f\xa1\x6f\xa2\x6f\xa3\x6f\xa4\x6f\xa5\x6f\xa6\x6f\xa7\x6f\xa8\x6f\xa9\x6f\xaa\x6f\xab\x6f\xac\x6f\xad\x6f\xae\x6f\xaf\x6f\xb0\x6f\xb1\x6f\xb2\x6f\xb3\x6f\xb4\x6f\xb5\x6f\xb6\x6f\xb7\x6f\xb8\x6f\xb9\x6f\xba\x6f\xbb\x6f\xbc\x6f\xbd\x6f\xbe\x6f\xbf\x6f\xc0\x6f\xc1\x6f\xc2\x6f\xc3\x6f\xc4\x6f\xc5\x6f\xc6\x6f\xc7\x6f\xc8\x6f\xc9\x6f\xca\x6f\xcb\x6f\xcc\x6f\xcd\x6f\xce\x6f\xcf\x6f\xd0\x6f\xd1\x6f\xd2\x6f\xd3\x6f\xd4\x6f\xd5\x6f\xd6\x6f\xd7\x6f\xd8\x6f\xd9\x6f\xda\x6f\xdb\x6f\xdc\x6f\xdd\x6f\xde\x6f\xdf\x6f\xe0\x6f\xe1\x6f\xe2\x6f\xe3\x6f\xe4\x6f\xe5\x6f\xe6\x6f\xe7\x6f\xe8\x6f\xe9\x6f\xea\x6f\xeb\x6f\xec\x6f\xed\x6f\xee\x6f\xef\x6f\xf0\x6f\xf1\x6f\xf2\x6f\xf3\x6f\xf4", /* a080 */ "\x6f\xf5\x6f\xf6\x6f\xf7\x6f\xf8\x6f\xf9\x6f\xfa\x6f\xfb\x6f\xfc\x6f\xfd\x6f\xfe\x70\x41\x70\x42\x70\x43\x70\x44\x70\x45\x70\x46\x70\x47\x70\x48\x70\x49\x70\x4a\x70\x4b\x70\x4c\x70\x4d\x70\x4e\x70\x4f\x70\x50\x70\x51\x70\x52\x70\x53\x70\x54\x70\x55\x70\x56\x70\x57\x70\x58\x70\x59\x70\x5a\x70\x5b\x70\x5c\x70\x5d\x70\x5e\x70\x5f\x70\x60\x70\x61\x70\x62\x70\x63\x70\x64\x70\x65\x70\x66\x70\x67\x70\x68\x70\x69\x70\x6a\x70\x6b\x70\x6c\x70\x6d\x70\x6e\x70\x6f\x70\x70\x70\x71\x70\x72\x70\x73\x70\x74\x70\x75\x70\x76\x70\x77\x70\x78\x70\x79\x70\x7a\x70\x7b\x70\x7c\x70\x7d\x70\x7e\x70\x7f\x70\x80\x70\x81\x70\x82\x70\x83\x70\x84\x70\x85\x70\x86\x70\x87\x70\x88\x70\x89\x70\x8a\x70\x8b\x70\x8c\x70\x8d\x70\x8e\x70\x8f\x70\x90\x70\x91\x70\x92\x70\x93\x70\x94\x70\x95\x70\x96\x70\x97\x70\x98\x70\x99\x70\x9a\x70\x9b\x70\x9c\x70\x9d\x70\x9e\x70\x9f\x70\xa0\x70\xa1\x70\xa2\x70\xa3\x70\xa4\x70\xa5\x70\xa6\x70\xa7\x70\xa8\x70\xa9\x70\xaa\x70\xab\x70\xac\x70\xad\x70\xae\x70\xaf\x70\xb0\x70\xb1\x70\xb2\x70\xb3\x70\xb4\x70\xb5\x70\xb6", /* a100 */ "\x70\xb7\x70\xb8\x70\xb9\x70\xba\x70\xbb\x70\xbc\x70\xbd\x70\xbe\x70\xbf\x70\xc0\x70\xc1\x70\xc2\x70\xc3\x70\xc4\x70\xc5\x70\xc6\x70\xc7\x70\xc8\x70\xc9\x70\xca\x70\xcb\x70\xcc\x70\xcd\x70\xce\x70\xcf\x70\xd0\x70\xd1\x70\xd2\x70\xd3\x70\xd4\x70\xd5\x70\xd6\x70\xd7\x70\xd8\x70\xd9\x70\xda\x70\xdb\x70\xdc\x70\xdd\x70\xde\x70\xdf\x70\xe0\x70\xe1\x70\xe2\x70\xe3\x70\xe4\x70\xe5\x70\xe6\x70\xe7\x70\xe8\x70\xe9\x70\xea\x70\xeb\x70\xec\x70\xed\x70\xee\x70\xef\x70\xf0\x70\xf1\x70\xf2\x70\xf3\x70\xf4\x70\xf5\x70\xf6\x70\xf7\x70\xf8\x70\xf9\x70\xfa\x70\xfb\x70\xfc\x70\xfd\x70\xfe\x71\x41\x71\x42\x71\x43\x71\x44\x71\x45\x71\x46\x71\x47\x71\x48\x71\x49\x71\x4a\x71\x4b\x71\x4c\x71\x4d\x71\x4e\x71\x4f\x71\x50\x71\x51\x71\x52\x71\x53\x71\x54\x71\x55\x71\x56\x71\x57\x71\x58\x71\x59\x71\x5a\x71\x5b\x71\x5c\x71\x5d\x71\x5e\x71\x5f\x71\x60\x71\x61\x71\x62\x71\x63\x71\x64\x71\x65\x71\x66\x71\x67\x71\x68\x71\x69\x71\x6a\x71\x6b\x71\x6c\x71\x6d\x71\x6e\x71\x6f\x71\x70\x71\x71\x71\x72\x71\x73\x71\x74\x71\x75\x71\x76\x71\x77\x71\x78", /* a180 */ "\x71\x79\x71\x7a\x71\x7b\x71\x7c\x71\x7d\x71\x7e\x71\x7f\x71\x80\x71\x81\x71\x82\x71\x83\x71\x84\x71\x85\x71\x86\x71\x87\x71\x88\x71\x89\x71\x8a\x71\x8b\x71\x8c\x71\x8d\x71\x8e\x71\x8f\x71\x90\x71\x91\x71\x92\x71\x93\x71\x94\x71\x95\x71\x96\x71\x97\x71\x98\x71\x99\x71\x9a\x71\x9b\x71\x9c\x71\x9d\x71\x9e\x71\x9f\x71\xa0\x71\xa1\x71\xa2\x71\xa3\x71\xa4\x71\xa5\x71\xa6\x71\xa7\x71\xa8\x71\xa9\x71\xaa\x71\xab\x71\xac\x71\xad\x71\xae\x71\xaf\x71\xb0\x71\xb1\x71\xb2\x71\xb3\x71\xb4\x71\xb5\x71\xb6\x71\xb7\x71\xb8\x71\xb9\x71\xba\x71\xbb\x71\xbc\x71\xbd\x71\xbe\x71\xbf\x71\xc0\x71\xc1\x71\xc2\x71\xc3\x71\xc4\x71\xc5\x71\xc6\x71\xc7\x71\xc8\x71\xc9\x71\xca\x71\xcb\x71\xcc\x71\xcd\x71\xce\x71\xcf\x71\xd0\x71\xd1\x71\xd2\x71\xd3\x71\xd4\x71\xd5\x71\xd6\x71\xd7\x71\xd8\x71\xd9\x71\xda\x71\xdb\x71\xdc\x71\xdd\x71\xde\x71\xdf\x71\xe0\x71\xe1\x71\xe2\x71\xe3\x71\xe4\x71\xe5\x71\xe6\x71\xe7\x71\xe8\x71\xe9\x71\xea\x71\xeb\x71\xec\x71\xed\x71\xee\x71\xef\x71\xf0\x71\xf1\x71\xf2\x71\xf3\x71\xf4\x71\xf5\x71\xf6\x71\xf7\x71\xf8", /* a200 */ "\x71\xf9\x71\xfa\x71\xfb\x71\xfc\x71\xfd\x71\xfe\x72\x41\x72\x42\x72\x43\x72\x44\x72\x45\x72\x46\x72\x47\x72\x48\x72\x49\x72\x4a\x72\x4b\x72\x4c\x72\x4d\x72\x4e\x72\x4f\x72\x50\x72\x51\x72\x52\x72\x53\x72\x54\x72\x55\x72\x56\x72\x57\x72\x58\x72\x59\x72\x5a\x72\x5b\x72\x5c\x72\x5d\x72\x5e\x72\x5f\x72\x60\x72\x61\x72\x62\x72\x63\x72\x64\x72\x65\x72\x66\x72\x67\x72\x68\x72\x69\x72\x6a\x72\x6b\x72\x6c\x72\x6d\x72\x6e\x72\x6f\x72\x70\x72\x71\x72\x72\x72\x73\x72\x74\x72\x75\x72\x76\x72\x77\x72\x78\x72\x79\x72\x7a\x72\x7b\x72\x7c\x72\x7d\x72\x7e\x72\x7f\x72\x80\x72\x81\x72\x82\x72\x83\x72\x84\x72\x85\x72\x86\x72\x87\x72\x88\x72\x89\x72\x8a\x72\x8b\x72\x8c\x72\x8d\x72\x8e\x72\x8f\x72\x90\x72\x91\x72\x92\x72\x93\x72\x94\x72\x95\x72\x96\x72\x97\x72\x98\x72\x99\x72\x9a\x72\x9b\x72\x9c\x72\x9d\x72\x9e\x72\x9f\x72\xa0\x72\xa1\x72\xa2\x72\xa3\x72\xa4\x72\xa5\x72\xa6\x72\xa7\x72\xa8\x72\xa9\x72\xaa\x72\xab\x72\xac\x72\xad\x72\xae\x72\xaf\x72\xb0\x72\xb1\x72\xb2\x72\xb3\x72\xb4\x72\xb5\x72\xb6\x72\xb7\x72\xb8\x72\xb9\x72\xba", /* a280 */ "\x72\xbb\x72\xbc\x72\xbd\x72\xbe\x72\xbf\x72\xc0\x72\xc1\x72\xc2\x72\xc3\x72\xc4\x72\xc5\x72\xc6\x72\xc7\x72\xc8\x72\xc9\x72\xca\x72\xcb\x72\xcc\x72\xcd\x72\xce\x72\xcf\x72\xd0\x72\xd1\x72\xd2\x72\xd3\x72\xd4\x72\xd5\x72\xd6\x72\xd7\x72\xd8\x72\xd9\x72\xda\x72\xdb\x72\xdc\x72\xdd\x72\xde\x72\xdf\x72\xe0\x72\xe1\x72\xe2\x72\xe3\x72\xe4\x72\xe5\x72\xe6\x72\xe7\x72\xe8\x72\xe9\x72\xea\x72\xeb\x72\xec\x72\xed\x72\xee\x72\xef\x72\xf0\x72\xf1\x72\xf2\x72\xf3\x72\xf4\x72\xf5\x72\xf6\x72\xf7\x72\xf8\x72\xf9\x72\xfa\x72\xfb\x72\xfc\x72\xfd\x72\xfe\x73\x41\x73\x42\x73\x43\x73\x44\x73\x45\x73\x46\x73\x47\x73\x48\x73\x49\x73\x4a\x73\x4b\x73\x4c\x73\x4d\x73\x4e\x73\x4f\x73\x50\x73\x51\x73\x52\x73\x53\x73\x54\x73\x55\x73\x56\x73\x57\x73\x58\x73\x59\x73\x5a\x73\x5b\x73\x5c\x73\x5d\x73\x5e\x73\x5f\x73\x60\x73\x61\x73\x62\x73\x63\x73\x64\x73\x65\x73\x66\x73\x67\x73\x68\x73\x69\x73\x6a\x73\x6b\x73\x6c\x73\x6d\x73\x6e\x73\x6f\x73\x70\x73\x71\x73\x72\x73\x73\x73\x74\x73\x75\x73\x76\x73\x77\x73\x78\x73\x79\x73\x7a\x73\x7b\x73\x7c", /* a300 */ "\x73\x7d\x73\x7e\x73\x7f\x73\x80\x73\x81\x73\x82\x73\x83\x73\x84\x73\x85\x73\x86\x73\x87\x73\x88\x73\x89\x73\x8a\x73\x8b\x73\x8c\x73\x8d\x73\x8e\x73\x8f\x73\x90\x73\x91\x73\x92\x73\x93\x73\x94\x73\x95\x73\x96\x73\x97\x73\x98\x73\x99\x73\x9a\x73\x9b\x73\x9c\x73\x9d\x73\x9e\x73\x9f\x73\xa0\x73\xa1\x73\xa2\x73\xa3\x73\xa4\x73\xa5\x73\xa6\x73\xa7\x73\xa8\x73\xa9\x73\xaa\x73\xab\x73\xac\x73\xad\x73\xae\x73\xaf\x73\xb0\x73\xb1\x73\xb2\x73\xb3\x73\xb4\x73\xb5\x73\xb6\x73\xb7\x73\xb8\x73\xb9\x73\xba\x73\xbb\x73\xbc\x73\xbd\x73\xbe\x73\xbf\x73\xc0\x73\xc1\x73\xc2\x73\xc3\x73\xc4\x73\xc5\x73\xc6\x73\xc7\x73\xc8\x73\xc9\x73\xca\x73\xcb\x73\xcc\x73\xcd\x73\xce\x73\xcf\x73\xd0\x73\xd1\x73\xd2\x73\xd3\x73\xd4\x73\xd5\x73\xd6\x73\xd7\x73\xd8\x73\xd9\x73\xda\x73\xdb\x73\xdc\x73\xdd\x73\xde\x73\xdf\x73\xe0\x73\xe1\x73\xe2\x73\xe3\x73\xe4\x73\xe5\x73\xe6\x73\xe7\x73\xe8\x73\xe9\x73\xea\x73\xeb\x73\xec\x73\xed\x73\xee\x73\xef\x73\xf0\x73\xf1\x73\xf2\x73\xf3\x73\xf4\x73\xf5\x73\xf6\x73\xf7\x73\xf8\x73\xf9\x73\xfa\x73\xfb\x73\xfc", /* a380 */ "\x73\xfd\x73\xfe\x74\x41\x74\x42\x74\x43\x74\x44\x74\x45\x74\x46\x74\x47\x74\x48\x74\x49\x74\x4a\x74\x4b\x74\x4c\x74\x4d\x74\x4e\x74\x4f\x74\x50\x74\x51\x74\x52\x74\x53\x74\x54\x74\x55\x74\x56\x74\x57\x74\x58\x74\x59\x74\x5a\x74\x5b\x74\x5c\x74\x5d\x74\x5e\x74\x5f\x74\x60\x74\x61\x74\x62\x74\x63\x74\x64\x74\x65\x74\x66\x74\x67\x74\x68\x74\x69\x74\x6a\x74\x6b\x74\x6c\x74\x6d\x74\x6e\x74\x6f\x74\x70\x74\x71\x74\x72\x74\x73\x74\x74\x74\x75\x74\x76\x74\x77\x74\x78\x74\x79\x74\x7a\x74\x7b\x74\x7c\x74\x7d\x74\x7e\x74\x7f\x74\x80\x74\x81\x74\x82\x74\x83\x74\x84\x74\x85\x74\x86\x74\x87\x74\x88\x74\x89\x74\x8a\x74\x8b\x74\x8c\x74\x8d\x74\x8e\x74\x8f\x74\x90\x74\x91\x74\x92\x74\x93\x74\x94\x74\x95\x74\x96\x74\x97\x74\x98\x74\x99\x74\x9a\x74\x9b\x74\x9c\x74\x9d\x74\x9e\x74\x9f\x74\xa0\x74\xa1\x74\xa2\x74\xa3\x74\xa4\x74\xa5\x74\xa6\x74\xa7\x74\xa8\x74\xa9\x74\xaa\x74\xab\x74\xac\x74\xad\x74\xae\x74\xaf\x74\xb0\x74\xb1\x74\xb2\x74\xb3\x74\xb4\x74\xb5\x74\xb6\x74\xb7\x74\xb8\x74\xb9\x74\xba\x74\xbb\x74\xbc\x74\xbd\x74\xbe", /* a400 */ "\x74\xbf\x74\xc0\x74\xc1\x74\xc2\x74\xc3\x74\xc4\x74\xc5\x74\xc6\x74\xc7\x74\xc8\x74\xc9\x74\xca\x74\xcb\x74\xcc\x74\xcd\x74\xce\x74\xcf\x74\xd0\x74\xd1\x74\xd2\x74\xd3\x74\xd4\x74\xd5\x74\xd6\x74\xd7\x74\xd8\x74\xd9\x74\xda\x74\xdb\x74\xdc\x74\xdd\x74\xde\x74\xdf\x74\xe0\x74\xe1\x74\xe2\x74\xe3\x74\xe4\x74\xe5\x74\xe6\x74\xe7\x74\xe8\x74\xe9\x74\xea\x74\xeb\x74\xec\x74\xed\x74\xee\x74\xef\x74\xf0\x74\xf1\x74\xf2\x74\xf3\x74\xf4\x74\xf5\x74\xf6\x74\xf7\x74\xf8\x74\xf9\x74\xfa\x74\xfb\x74\xfc\x74\xfd\x74\xfe\x75\x41\x75\x42\x75\x43\x75\x44\x75\x45\x75\x46\x75\x47\x75\x48\x75\x49\x75\x4a\x75\x4b\x75\x4c\x75\x4d\x75\x4e\x75\x4f\x75\x50\x75\x51\x75\x52\x75\x53\x75\x54\x75\x55\x75\x56\x75\x57\x75\x58\x75\x59\x75\x5a\x75\x5b\x75\x5c\x75\x5d\x75\x5e\x75\x5f\x75\x60\x75\x61\x75\x62\x75\x63\x75\x64\x75\x65\x75\x66\x75\x67\x75\x68\x75\x69\x75\x6a\x75\x6b\x75\x6c\x75\x6d\x75\x6e\x75\x6f\x75\x70\x75\x71\x75\x72\x75\x73\x75\x74\x75\x75\x75\x76\x75\x77\x75\x78\x75\x79\x75\x7a\x75\x7b\x75\x7c\x75\x7d\x75\x7e\x75\x7f\x75\x80", /* a480 */ "\x75\x81\x75\x82\x75\x83\x75\x84\x75\x85\x75\x86\x75\x87\x75\x88\x75\x89\x75\x8a\x75\x8b\x75\x8c\x75\x8d\x75\x8e\x75\x8f\x75\x90\x75\x91\x75\x92\x75\x93\x75\x94\x75\x95\x75\x96\x75\x97\x75\x98\x75\x99\x75\x9a\x75\x9b\x75\x9c\x75\x9d\x75\x9e\x75\x9f\x75\xa0\x75\xa1\x75\xa2\x75\xa3\x75\xa4\x75\xa5\x75\xa6\x75\xa7\x75\xa8\x75\xa9\x75\xaa\x75\xab\x75\xac\x75\xad\x75\xae\x75\xaf\x75\xb0\x75\xb1\x75\xb2\x75\xb3\x75\xb4\x75\xb5\x75\xb6\x75\xb7\x75\xb8\x75\xb9\x75\xba\x75\xbb\x75\xbc\x75\xbd\x75\xbe\x75\xbf\x75\xc0\x75\xc1\x75\xc2\x75\xc3\x75\xc4\x75\xc5\x75\xc6\x75\xc7\x75\xc8\x75\xc9\x75\xca\x75\xcb\x75\xcc\x75\xcd\x75\xce\x75\xcf\x75\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ "\x76\x41\x76\x42\x76\x43\x76\x44\x76\x45\x76\x46\x76\x47\x76\x48\x76\x49\x76\x4a\x76\x4b\x76\x4c\x76\x4d\x76\x4e\x76\x4f\x76\x50\x76\x51\x76\x52\x76\x53\x76\x54\x76\x55\x76\x56\x76\x57\x76\x58\x76\x59\x76\x5a\x76\x5b\x76\x5c\x76\x5d\x76\x5e\x76\x5f\x76\x60\x76\x61\x76\x62\x76\x63\x76\x64\x76\x65\x76\x66\x76\x67\x76\x68\x76\x69\x76\x6a\x76\x6b\x76\x6c\x76\x6d\x76\x6e\x76\x6f\x76\x70\x76\x71\x76\x72\x76\x73\x76\x74\x76\x75\x76\x76\x76\x77\x76\x78\x76\x79\x76\x7a\x76\x7b\x76\x7c\x76\x7d\x76\x7e\x76\x7f\x76\x81\x76\x82\x76\x83\x76\x84\x76\x85\x76\x86\x76\x87\x76\x88\x76\x89\x76\x8a\x76\x8b\x76\x8c\x76\x8d\x76\x8e\x76\x8f\x76\x90\x76\x91\x76\x92\x76\x93\x76\x94\x76\x95\x76\x96\x76\x97\x76\x98\x76\x99\x76\x9a\x76\x9b\x76\x9c\x76\x9d\x76\x9e\x76\x9f\x76\xa0\x76\xa1\x76\xa2\x76\xa3\x76\xa4\x76\xa5\x76\xa6\x76\xa7\x76\xa8\x76\xa9\x76\xaa\x76\xab\x76\xac\x76\xad\x76\xae\x76\xaf\x76\xb0\x76\xb1\x76\xb2\x76\xb3\x76\xb4\x76\xb5\x76\xb6\x76\xb7\x76\xb8\x76\xb9\x76\xba\x76\xbb\x76\xbc\x76\xbd\x76\xbe\x76\xbf\x76\xc0\x76\xc1", /* e080 */ "\x76\xc2\x76\xc3\x76\xc4\x76\xc5\x76\xc6\x76\xc7\x76\xc8\x76\xc9\x76\xca\x76\xcb\x76\xcc\x76\xcd\x76\xce\x76\xcf\x76\xd0\x76\xd1\x76\xd2\x76\xd3\x76\xd4\x76\xd5\x76\xd6\x76\xd7\x76\xd8\x76\xd9\x76\xda\x76\xdb\x76\xdc\x76\xdd\x76\xde\x76\xdf\x76\xe0\x76\xe1\x76\xe2\x76\xe3\x76\xe4\x76\xe5\x76\xe6\x76\xe7\x76\xe8\x76\xe9\x76\xea\x76\xeb\x76\xec\x76\xed\x76\xee\x76\xef\x76\xf0\x76\xf1\x76\xf2\x76\xf3\x76\xf4\x76\xf5\x76\xf6\x76\xf7\x76\xf8\x76\xf9\x76\xfa\x76\xfb\x76\xfc\x76\xfd\x77\x41\x77\x42\x77\x43\x77\x44\x77\x45\x77\x46\x77\x47\x77\x48\x77\x49\x77\x4a\x77\x4b\x77\x4c\x77\x4d\x77\x4e\x77\x4f\x77\x50\x77\x51\x77\x52\x77\x53\x77\x54\x77\x55\x77\x56\x77\x57\x77\x58\x77\x59\x77\x5a\x77\x5b\x77\x5c\x77\x5d\x77\x5e\x77\x5f\x77\x60\x77\x61\x77\x62\x77\x63\x77\x64\x77\x65\x77\x66\x77\x67\x77\x68\x77\x69\x77\x6a\x77\x6b\x77\x6c\x77\x6d\x77\x6e\x77\x6f\x77\x70\x77\x71\x77\x72\x77\x73\x77\x74\x77\x75\x77\x76\x77\x77\x77\x78\x77\x79\x77\x7a\x77\x7b\x77\x7c\x77\x7d\x77\x7e\x77\x7f\x77\x81\x77\x82\x77\x83\x77\x84\x77\x85", /* e100 */ "\x77\x86\x77\x87\x77\x88\x77\x89\x77\x8a\x77\x8b\x77\x8c\x77\x8d\x77\x8e\x77\x8f\x77\x90\x77\x91\x77\x92\x77\x93\x77\x94\x77\x95\x77\x96\x77\x97\x77\x98\x77\x99\x77\x9a\x77\x9b\x77\x9c\x77\x9d\x77\x9e\x77\x9f\x77\xa0\x77\xa1\x77\xa2\x77\xa3\x77\xa4\x77\xa5\x77\xa6\x77\xa7\x77\xa8\x77\xa9\x77\xaa\x77\xab\x77\xac\x77\xad\x77\xae\x77\xaf\x77\xb0\x77\xb1\x77\xb2\x77\xb3\x77\xb4\x77\xb5\x77\xb6\x77\xb7\x77\xb8\x77\xb9\x77\xba\x77\xbb\x77\xbc\x77\xbd\x77\xbe\x77\xbf\x77\xc0\x77\xc1\x77\xc2\x77\xc3\x77\xc4\x77\xc5\x77\xc6\x77\xc7\x77\xc8\x77\xc9\x77\xca\x77\xcb\x77\xcc\x77\xcd\x77\xce\x77\xcf\x77\xd0\x77\xd1\x77\xd2\x77\xd3\x77\xd4\x77\xd5\x77\xd6\x77\xd7\x77\xd8\x77\xd9\x77\xda\x77\xdb\x77\xdc\x77\xdd\x77\xde\x77\xdf\x77\xe0\x77\xe1\x77\xe2\x77\xe3\x77\xe4\x77\xe5\x77\xe6\x77\xe7\x77\xe8\x77\xe9\x77\xea\x77\xeb\x77\xec\x77\xed\x77\xee\x77\xef\x77\xf0\x77\xf1\x77\xf2\x77\xf3\x77\xf4\x77\xf5\x77\xf6\x77\xf7\x77\xf8\x77\xf9\x77\xfa\x77\xfb\x77\xfc\x77\xfd\x78\x41\x78\x42\x78\x43\x78\x44\x78\x45\x78\x46\x78\x47\x78\x48", /* e180 */ "\x78\x49\x78\x4a\x78\x4b\x78\x4c\x78\x4d\x78\x4e\x78\x4f\x78\x50\x78\x51\x78\x52\x78\x53\x78\x54\x78\x55\x78\x56\x78\x57\x78\x58\x78\x59\x78\x5a\x78\x5b\x78\x5c\x78\x5d\x78\x5e\x78\x5f\x78\x60\x78\x61\x78\x62\x78\x63\x78\x64\x78\x65\x78\x66\x78\x67\x78\x68\x78\x69\x78\x6a\x78\x6b\x78\x6c\x78\x6d\x78\x6e\x78\x6f\x78\x70\x78\x71\x78\x72\x78\x73\x78\x74\x78\x75\x78\x76\x78\x77\x78\x78\x78\x79\x78\x7a\x78\x7b\x78\x7c\x78\x7d\x78\x7e\x78\x7f\x78\x81\x78\x82\x78\x83\x78\x84\x78\x85\x78\x86\x78\x87\x78\x88\x78\x89\x78\x8a\x78\x8b\x78\x8c\x78\x8d\x78\x8e\x78\x8f\x78\x90\x78\x91\x78\x92\x78\x93\x78\x94\x78\x95\x78\x96\x78\x97\x78\x98\x78\x99\x78\x9a\x78\x9b\x78\x9c\x78\x9d\x78\x9e\x78\x9f\x78\xa0\x78\xa1\x78\xa2\x78\xa3\x78\xa4\x78\xa5\x78\xa6\x78\xa7\x78\xa8\x78\xa9\x78\xaa\x78\xab\x78\xac\x78\xad\x78\xae\x78\xaf\x78\xb0\x78\xb1\x78\xb2\x78\xb3\x78\xb4\x78\xb5\x78\xb6\x78\xb7\x78\xb8\x78\xb9\x78\xba\x78\xbb\x78\xbc\x78\xbd\x78\xbe\x78\xbf\x78\xc0\x78\xc1\x78\xc2\x78\xc3\x78\xc4\x78\xc5\x78\xc6\x78\xc7\x78\xc8\x78\xc9", /* e200 */ "\x78\xca\x78\xcb\x78\xcc\x78\xcd\x78\xce\x78\xcf\x78\xd0\x78\xd1\x78\xd2\x78\xd3\x78\xd4\x78\xd5\x78\xd6\x78\xd7\x78\xd8\x78\xd9\x78\xda\x78\xdb\x78\xdc\x78\xdd\x78\xde\x78\xdf\x78\xe0\x78\xe1\x78\xe2\x78\xe3\x78\xe4\x78\xe5\x78\xe6\x78\xe7\x78\xe8\x78\xe9\x78\xea\x78\xeb\x78\xec\x78\xed\x78\xee\x78\xef\x78\xf0\x78\xf1\x78\xf2\x78\xf3\x78\xf4\x78\xf5\x78\xf6\x78\xf7\x78\xf8\x78\xf9\x78\xfa\x78\xfb\x78\xfc\x78\xfd\x79\x41\x79\x42\x79\x43\x79\x44\x79\x45\x79\x46\x79\x47\x79\x48\x79\x49\x79\x4a\x79\x4b\x79\x4c\x79\x4d\x79\x4e\x79\x4f\x79\x50\x79\x51\x79\x52\x79\x53\x79\x54\x79\x55\x79\x56\x79\x57\x79\x58\x79\x59\x79\x5a\x79\x5b\x79\x5c\x79\x5d\x79\x5e\x79\x5f\x79\x60\x79\x61\x79\x62\x79\x63\x79\x64\x79\x65\x79\x66\x79\x67\x79\x68\x79\x69\x79\x6a\x79\x6b\x79\x6c\x79\x6d\x79\x6e\x79\x6f\x79\x70\x79\x71\x79\x72\x79\x73\x79\x74\x79\x75\x79\x76\x79\x77\x79\x78\x79\x79\x79\x7a\x79\x7b\x79\x7c\x79\x7d\x79\x7e\x79\x7f\x79\x81\x79\x82\x79\x83\x79\x84\x79\x85\x79\x86\x79\x87\x79\x88\x79\x89\x79\x8a\x79\x8b\x79\x8c\x79\x8d", /* e280 */ "\x79\x8e\x79\x8f\x79\x90\x79\x91\x79\x92\x79\x93\x79\x94\x79\x95\x79\x96\x79\x97\x79\x98\x79\x99\x79\x9a\x79\x9b\x79\x9c\x79\x9d\x79\x9e\x79\x9f\x79\xa0\x79\xa1\x79\xa2\x79\xa3\x79\xa4\x79\xa5\x79\xa6\x79\xa7\x79\xa8\x79\xa9\x79\xaa\x79\xab\x79\xac\x79\xad\x79\xae\x79\xaf\x79\xb0\x79\xb1\x79\xb2\x79\xb3\x79\xb4\x79\xb5\x79\xb6\x79\xb7\x79\xb8\x79\xb9\x79\xba\x79\xbb\x79\xbc\x79\xbd\x79\xbe\x79\xbf\x79\xc0\x79\xc1\x79\xc2\x79\xc3\x79\xc4\x79\xc5\x79\xc6\x79\xc7\x79\xc8\x79\xc9\x79\xca\x79\xcb\x79\xcc\x79\xcd\x79\xce\x79\xcf\x79\xd0\x79\xd1\x79\xd2\x79\xd3\x79\xd4\x79\xd5\x79\xd6\x79\xd7\x79\xd8\x79\xd9\x79\xda\x79\xdb\x79\xdc\x79\xdd\x79\xde\x79\xdf\x79\xe0\x79\xe1\x79\xe2\x79\xe3\x79\xe4\x79\xe5\x79\xe6\x79\xe7\x79\xe8\x79\xe9\x79\xea\x79\xeb\x79\xec\x79\xed\x79\xee\x79\xef\x79\xf0\x79\xf1\x79\xf2\x79\xf3\x79\xf4\x79\xf5\x79\xf6\x79\xf7\x79\xf8\x79\xf9\x79\xfa\x79\xfb\x79\xfc\x79\xfd\x7a\x41\x7a\x42\x7a\x43\x7a\x44\x7a\x45\x7a\x46\x7a\x47\x7a\x48\x7a\x49\x7a\x4a\x7a\x4b\x7a\x4c\x7a\x4d\x7a\x4e\x7a\x4f\x7a\x50", /* e300 */ "\x7a\x51\x7a\x52\x7a\x53\x7a\x54\x7a\x55\x7a\x56\x7a\x57\x7a\x58\x7a\x59\x7a\x5a\x7a\x5b\x7a\x5c\x7a\x5d\x7a\x5e\x7a\x5f\x7a\x60\x7a\x61\x7a\x62\x7a\x63\x7a\x64\x7a\x65\x7a\x66\x7a\x67\x7a\x68\x7a\x69\x7a\x6a\x7a\x6b\x7a\x6c\x7a\x6d\x7a\x6e\x7a\x6f\x7a\x70\x7a\x71\x7a\x72\x7a\x73\x7a\x74\x7a\x75\x7a\x76\x7a\x77\x7a\x78\x7a\x79\x7a\x7a\x7a\x7b\x7a\x7c\x7a\x7d\x7a\x7e\x7a\x7f\x7a\x81\x7a\x82\x7a\x83\x7a\x84\x7a\x85\x7a\x86\x7a\x87\x7a\x88\x7a\x89\x7a\x8a\x7a\x8b\x7a\x8c\x7a\x8d\x7a\x8e\x7a\x8f\x7a\x90\x7a\x91\x7a\x92\x7a\x93\x7a\x94\x7a\x95\x7a\x96\x7a\x97\x7a\x98\x7a\x99\x7a\x9a\x7a\x9b\x7a\x9c\x7a\x9d\x7a\x9e\x7a\x9f\x7a\xa0\x7a\xa1\x7a\xa2\x7a\xa3\x7a\xa4\x7a\xa5\x7a\xa6\x7a\xa7\x7a\xa8\x7a\xa9\x7a\xaa\x7a\xab\x7a\xac\x7a\xad\x7a\xae\x7a\xaf\x7a\xb0\x7a\xb1\x7a\xb2\x7a\xb3\x7a\xb4\x7a\xb5\x7a\xb6\x7a\xb7\x7a\xb8\x7a\xb9\x7a\xba\x7a\xbb\x7a\xbc\x7a\xbd\x7a\xbe\x7a\xbf\x7a\xc0\x7a\xc1\x7a\xc2\x7a\xc3\x7a\xc4\x7a\xc5\x7a\xc6\x7a\xc7\x7a\xc8\x7a\xc9\x7a\xca\x7a\xcb\x7a\xcc\x7a\xcd\x7a\xce\x7a\xcf\x7a\xd0\x7a\xd1", /* e380 */ "\x7a\xd2\x7a\xd3\x7a\xd4\x7a\xd5\x7a\xd6\x7a\xd7\x7a\xd8\x7a\xd9\x7a\xda\x7a\xdb\x7a\xdc\x7a\xdd\x7a\xde\x7a\xdf\x7a\xe0\x7a\xe1\x7a\xe2\x7a\xe3\x7a\xe4\x7a\xe5\x7a\xe6\x7a\xe7\x7a\xe8\x7a\xe9\x7a\xea\x7a\xeb\x7a\xec\x7a\xed\x7a\xee\x7a\xef\x7a\xf0\x7a\xf1\x7a\xf2\x7a\xf3\x7a\xf4\x7a\xf5\x7a\xf6\x7a\xf7\x7a\xf8\x7a\xf9\x7a\xfa\x7a\xfb\x7a\xfc\x7a\xfd\x7b\x41\x7b\x42\x7b\x43\x7b\x44\x7b\x45\x7b\x46\x7b\x47\x7b\x48\x7b\x49\x7b\x4a\x7b\x4b\x7b\x4c\x7b\x4d\x7b\x4e\x7b\x4f\x7b\x50\x7b\x51\x7b\x52\x7b\x53\x7b\x54\x7b\x55\x7b\x56\x7b\x57\x7b\x58\x7b\x59\x7b\x5a\x7b\x5b\x7b\x5c\x7b\x5d\x7b\x5e\x7b\x5f\x7b\x60\x7b\x61\x7b\x62\x7b\x63\x7b\x64\x7b\x65\x7b\x66\x7b\x67\x7b\x68\x7b\x69\x7b\x6a\x7b\x6b\x7b\x6c\x7b\x6d\x7b\x6e\x7b\x6f\x7b\x70\x7b\x71\x7b\x72\x7b\x73\x7b\x74\x7b\x75\x7b\x76\x7b\x77\x7b\x78\x7b\x79\x7b\x7a\x7b\x7b\x7b\x7c\x7b\x7d\x7b\x7e\x7b\x7f\x7b\x81\x7b\x82\x7b\x83\x7b\x84\x7b\x85\x7b\x86\x7b\x87\x7b\x88\x7b\x89\x7b\x8a\x7b\x8b\x7b\x8c\x7b\x8d\x7b\x8e\x7b\x8f\x7b\x90\x7b\x91\x7b\x92\x7b\x93\x7b\x94\x7b\x95", /* e400 */ "\x7b\x96\x7b\x97\x7b\x98\x7b\x99\x7b\x9a\x7b\x9b\x7b\x9c\x7b\x9d\x7b\x9e\x7b\x9f\x7b\xa0\x7b\xa1\x7b\xa2\x7b\xa3\x7b\xa4\x7b\xa5\x7b\xa6\x7b\xa7\x7b\xa8\x7b\xa9\x7b\xaa\x7b\xab\x7b\xac\x7b\xad\x7b\xae\x7b\xaf\x7b\xb0\x7b\xb1\x7b\xb2\x7b\xb3\x7b\xb4\x7b\xb5\x7b\xb6\x7b\xb7\x7b\xb8\x7b\xb9\x7b\xba\x7b\xbb\x7b\xbc\x7b\xbd\x7b\xbe\x7b\xbf\x7b\xc0\x7b\xc1\x7b\xc2\x7b\xc3\x7b\xc4\x7b\xc5\x7b\xc6\x7b\xc7\x7b\xc8\x7b\xc9\x7b\xca\x7b\xcb\x7b\xcc\x7b\xcd\x7b\xce\x7b\xcf\x7b\xd0\x7b\xd1\x7b\xd2\x7b\xd3\x7b\xd4\x7b\xd5\x7b\xd6\x7b\xd7\x7b\xd8\x7b\xd9\x7b\xda\x7b\xdb\x7b\xdc\x7b\xdd\x7b\xde\x7b\xdf\x7b\xe0\x7b\xe1\x7b\xe2\x7b\xe3\x7b\xe4\x7b\xe5\x7b\xe6\x7b\xe7\x7b\xe8\x7b\xe9\x7b\xea\x7b\xeb\x7b\xec\x7b\xed\x7b\xee\x7b\xef\x7b\xf0\x7b\xf1\x7b\xf2\x7b\xf3\x7b\xf4\x7b\xf5\x7b\xf6\x7b\xf7\x7b\xf8\x7b\xf9\x7b\xfa\x7b\xfb\x7b\xfc\x7b\xfd\x7c\x41\x7c\x42\x7c\x43\x7c\x44\x7c\x45\x7c\x46\x7c\x47\x7c\x48\x7c\x49\x7c\x4a\x7c\x4b\x7c\x4c\x7c\x4d\x7c\x4e\x7c\x4f\x7c\x50\x7c\x51\x7c\x52\x7c\x53\x7c\x54\x7c\x55\x7c\x56\x7c\x57\x7c\x58", /* e480 */ "\x7c\x59\x7c\x5a\x7c\x5b\x7c\x5c\x7c\x5d\x7c\x5e\x7c\x5f\x7c\x60\x7c\x61\x7c\x62\x7c\x63\x7c\x64\x7c\x65\x7c\x66\x7c\x67\x7c\x68\x7c\x69\x7c\x6a\x7c\x6b\x7c\x6c\x7c\x6d\x7c\x6e\x7c\x6f\x7c\x70\x7c\x71\x7c\x72\x7c\x73\x7c\x74\x7c\x75\x7c\x76\x7c\x77\x7c\x78\x7c\x79\x7c\x7a\x7c\x7b\x7c\x7c\x7c\x7d\x7c\x7e\x7c\x7f\x7c\x81\x7c\x82\x7c\x83\x7c\x84\x7c\x85\x7c\x86\x7c\x87\x7c\x88\x7c\x89\x7c\x8a\x7c\x8b\x7c\x8c\x7c\x8d\x7c\x8e\x7c\x8f\x7c\x90\x7c\x91\x7c\x92\x7c\x93\x7c\x94\x7c\x95\x7c\x96\x7c\x97\x7c\x98\x7c\x99\x7c\x9a\x7c\x9b\x7c\x9c\x7c\x9d\x7c\x9e\x7c\x9f\x7c\xa0\x7c\xa1\x7c\xa2\x7c\xa3\x7c\xa4\x7c\xa5\x7c\xa6\x7c\xa7\x7c\xa8\x7c\xa9\x7c\xaa\x7c\xab\x7c\xac\x7c\xad\x7c\xae\x7c\xaf\x7c\xb0\x7c\xb1\x7c\xb2\x7c\xb3\x7c\xb4\x7c\xb5\x7c\xb6\x7c\xb7\x7c\xb8\x7c\xb9\x7c\xba\x7c\xbb\x7c\xbc\x7c\xbd\x7c\xbe\x7c\xbf\x7c\xc0\x7c\xc1\x7c\xc2\x7c\xc3\x7c\xc4\x7c\xc5\x7c\xc6\x7c\xc7\x7c\xc8\x7c\xc9\x7c\xca\x7c\xcb\x7c\xcc\x7c\xcd\x7c\xce\x7c\xcf\x7c\xd0\x7c\xd1\x7c\xd2\x7c\xd3\x7c\xd4\x7c\xd5\x7c\xd6\x7c\xd7\x7c\xd8\x7c\xd9", /* e500 */ "\x7c\xda\x7c\xdb\x7c\xdc\x7c\xdd\x7c\xde\x7c\xdf\x7c\xe0\x7c\xe1\x7c\xe2\x7c\xe3\x7c\xe4\x7c\xe5\x7c\xe6\x7c\xe7\x7c\xe8\x7c\xe9\x7c\xea\x7c\xeb\x7c\xec\x7c\xed\x7c\xee\x7c\xef\x7c\xf0\x7c\xf1\x7c\xf2\x7c\xf3\x7c\xf4\x7c\xf5\x7c\xf6\x7c\xf7\x7c\xf8\x7c\xf9\x7c\xfa\x7c\xfb\x7c\xfc\x7c\xfd\x7d\x41\x7d\x42\x7d\x43\x7d\x44\x7d\x45\x7d\x46\x7d\x47\x7d\x48\x7d\x49\x7d\x4a\x7d\x4b\x7d\x4c\x7d\x4d\x7d\x4e\x7d\x4f\x7d\x50\x7d\x51\x7d\x52\x7d\x53\x7d\x54\x7d\x55\x7d\x56\x7d\x57\x7d\x58\x7d\x59\x7d\x5a\x7d\x5b\x7d\x5c\x7d\x5d\x7d\x5e\x7d\x5f\x7d\x60\x7d\x61\x7d\x62\x7d\x63\x7d\x64\x7d\x65\x7d\x66\x7d\x67\x7d\x68\x7d\x69\x7d\x6a\x7d\x6b\x7d\x6c\x7d\x6d\x7d\x6e\x7d\x6f\x7d\x70\x7d\x71\x7d\x72\x7d\x73\x7d\x74\x7d\x75\x7d\x76\x7d\x77\x7d\x78\x7d\x79\x7d\x7a\x7d\x7b\x7d\x7c\x7d\x7d\x7d\x7e\x7d\x7f\x7d\x81\x7d\x82\x7d\x83\x7d\x84\x7d\x85\x7d\x86\x7d\x87\x7d\x88\x7d\x89\x7d\x8a\x7d\x8b\x7d\x8c\x7d\x8d\x7d\x8e\x7d\x8f\x7d\x90\x7d\x91\x7d\x92\x7d\x93\x7d\x94\x7d\x95\x7d\x96\x7d\x97\x7d\x98\x7d\x99\x7d\x9a\x7d\x9b\x7d\x9c\x7d\x9d", /* e580 */ "\x7d\x9e\x7d\x9f\x7d\xa0\x7d\xa1\x7d\xa2\x7d\xa3\x7d\xa4\x7d\xa5\x7d\xa6\x7d\xa7\x7d\xa8\x7d\xa9\x7d\xaa\x7d\xab\x7d\xac\x7d\xad\x7d\xae\x7d\xaf\x7d\xb0\x7d\xb1\x7d\xb2\x7d\xb3\x7d\xb4\x7d\xb5\x7d\xb6\x7d\xb7\x7d\xb8\x7d\xb9\x7d\xba\x7d\xbb\x7d\xbc\x7d\xbd\x7d\xbe\x7d\xbf\x7d\xc0\x7d\xc1\x7d\xc2\x7d\xc3\x7d\xc4\x7d\xc5\x7d\xc6\x7d\xc7\x7d\xc8\x7d\xc9\x7d\xca\x7d\xcb\x7d\xcc\x7d\xcd\x7d\xce\x7d\xcf\x7d\xd0\x7d\xd1\x7d\xd2\x7d\xd3\x7d\xd4\x7d\xd5\x7d\xd6\x7d\xd7\x7d\xd8\x7d\xd9\x7d\xda\x7d\xdb\x7d\xdc\x7d\xdd\x7d\xde\x7d\xdf\x7d\xe0\x7d\xe1\x7d\xe2\x7d\xe3\x7d\xe4\x7d\xe5\x7d\xe6\x7d\xe7\x7d\xe8\x7d\xe9\x7d\xea\x7d\xeb\x7d\xec\x7d\xed\x7d\xee\x7d\xef\x7d\xf0\x7d\xf1\x7d\xf2\x7d\xf3\x7d\xf4\x7d\xf5\x7d\xf6\x7d\xf7\x7d\xf8\x7d\xf9\x7d\xfa\x7d\xfb\x7d\xfc\x7d\xfd\x7e\x41\x7e\x42\x7e\x43\x7e\x44\x7e\x45\x7e\x46\x7e\x47\x7e\x48\x7e\x49\x7e\x4a\x7e\x4b\x7e\x4c\x7e\x4d\x7e\x4e\x7e\x4f\x7e\x50\x7e\x51\x7e\x52\x7e\x53\x7e\x54\x7e\x55\x7e\x56\x7e\x57\x7e\x58\x7e\x59\x7e\x5a\x7e\x5b\x7e\x5c\x7e\x5d\x7e\x5e\x7e\x5f\x7e\x60", /* e600 */ "\x7e\x61\x7e\x62\x7e\x63\x7e\x64\x7e\x65\x7e\x66\x7e\x67\x7e\x68\x7e\x69\x7e\x6a\x7e\x6b\x7e\x6c\x7e\x6d\x7e\x6e\x7e\x6f\x7e\x70\x7e\x71\x7e\x72\x7e\x73\x7e\x74\x7e\x75\x7e\x76\x7e\x77\x7e\x78\x7e\x79\x7e\x7a\x7e\x7b\x7e\x7c\x7e\x7d\x7e\x7e\x7e\x7f\x7e\x81\x7e\x82\x7e\x83\x7e\x84\x7e\x85\x7e\x86\x7e\x87\x7e\x88\x7e\x89\x7e\x8a\x7e\x8b\x7e\x8c\x7e\x8d\x7e\x8e\x7e\x8f\x7e\x90\x7e\x91\x7e\x92\x7e\x93\x7e\x94\x7e\x95\x7e\x96\x7e\x97\x7e\x98\x7e\x99\x7e\x9a\x7e\x9b\x7e\x9c\x7e\x9d\x7e\x9e\x7e\x9f\x7e\xa0\x7e\xa1\x7e\xa2\x7e\xa3\x7e\xa4\x7e\xa5\x7e\xa6\x7e\xa7\x7e\xa8\x7e\xa9\x7e\xaa\x7e\xab\x7e\xac\x7e\xad\x7e\xae\x7e\xaf\x7e\xb0\x7e\xb1\x7e\xb2\x7e\xb3\x7e\xb4\x7e\xb5\x7e\xb6\x7e\xb7\x7e\xb8\x7e\xb9\x7e\xba\x7e\xbb\x7e\xbc\x7e\xbd\x7e\xbe\x7e\xbf\x7e\xc0\x7e\xc1\x7e\xc2\x7e\xc3\x7e\xc4\x7e\xc5\x7e\xc6\x7e\xc7\x7e\xc8\x7e\xc9\x7e\xca\x7e\xcb\x7e\xcc\x7e\xcd\x7e\xce\x7e\xcf\x7e\xd0\x7e\xd1\x7e\xd2\x7e\xd3\x7e\xd4\x7e\xd5\x7e\xd6\x7e\xd7\x7e\xd8\x7e\xd9\x7e\xda\x7e\xdb\x7e\xdc\x7e\xdd\x7e\xde\x7e\xdf\x7e\xe0\x7e\xe1", /* e680 */ "\x7e\xe2\x7e\xe3\x7e\xe4\x7e\xe5\x7e\xe6\x7e\xe7\x7e\xe8\x7e\xe9\x7e\xea\x7e\xeb\x7e\xec\x7e\xed\x7e\xee\x7e\xef\x7e\xf0\x7e\xf1\x7e\xf2\x7e\xf3\x7e\xf4\x7e\xf5\x7e\xf6\x7e\xf7\x7e\xf8\x7e\xf9\x7e\xfa\x7e\xfb\x7e\xfc\x7e\xfd\x7f\x41\x7f\x42\x7f\x43\x7f\x44\x7f\x45\x7f\x46\x7f\x47\x7f\x48\x7f\x49\x7f\x4a\x7f\x4b\x7f\x4c\x7f\x4d\x7f\x4e\x7f\x4f\x7f\x50\x7f\x51\x7f\x52\x7f\x53\x7f\x54\x7f\x55\x7f\x56\x7f\x57\x7f\x58\x7f\x59\x7f\x5a\x7f\x5b\x7f\x5c\x7f\x5d\x7f\x5e\x7f\x5f\x7f\x60\x7f\x61\x7f\x62\x7f\x63\x7f\x64\x7f\x65\x7f\x66\x7f\x67\x7f\x68\x7f\x69\x7f\x6a\x7f\x6b\x7f\x6c\x7f\x6d\x7f\x6e\x7f\x6f\x7f\x70\x7f\x71\x7f\x72\x7f\x73\x7f\x74\x7f\x75\x7f\x76\x7f\x77\x7f\x78\x7f\x79\x7f\x7a\x7f\x7b\x7f\x7c\x7f\x7d\x7f\x7e\x7f\x7f\x7f\x81\x7f\x82\x7f\x83\x7f\x84\x7f\x85\x7f\x86\x7f\x87\x7f\x88\x7f\x89\x7f\x8a\x7f\x8b\x7f\x8c\x7f\x8d\x7f\x8e\x7f\x8f\x7f\x90\x7f\x91\x7f\x92\x7f\x93\x7f\x94\x7f\x95\x7f\x96\x7f\x97\x7f\x98\x7f\x99\x7f\x9a\x7f\x9b\x7f\x9c\x7f\x9d\x7f\x9e\x7f\x9f\x7f\xa0\x7f\xa1\x7f\xa2\x7f\xa3\x7f\xa4\x7f\xa5", /* e700 */ "\x7f\xa6\x7f\xa7\x7f\xa8\x7f\xa9\x7f\xaa\x7f\xab\x7f\xac\x7f\xad\x7f\xae\x7f\xaf\x7f\xb0\x7f\xb1\x7f\xb2\x7f\xb3\x7f\xb4\x7f\xb5\x7f\xb6\x7f\xb7\x7f\xb8\x7f\xb9\x7f\xba\x7f\xbb\x7f\xbc\x7f\xbd\x7f\xbe\x7f\xbf\x7f\xc0\x7f\xc1\x7f\xc2\x7f\xc3\x7f\xc4\x7f\xc5\x7f\xc6\x7f\xc7\x7f\xc8\x7f\xc9\x7f\xca\x7f\xcb\x7f\xcc\x7f\xcd\x7f\xce\x7f\xcf\x7f\xd0\x7f\xd1\x7f\xd2\x7f\xd3\x7f\xd4\x7f\xd5\x7f\xd6\x7f\xd7\x7f\xd8\x7f\xd9\x7f\xda\x7f\xdb\x7f\xdc\x7f\xdd\x7f\xde\x7f\xdf\x7f\xe0\x7f\xe1\x7f\xe2\x7f\xe3\x7f\xe4\x7f\xe5\x7f\xe6\x7f\xe7\x7f\xe8\x7f\xe9\x7f\xea\x7f\xeb\x7f\xec\x7f\xed\x7f\xee\x7f\xef\x7f\xf0\x7f\xf1\x7f\xf2\x7f\xf3\x7f\xf4\x7f\xf5\x7f\xf6\x7f\xf7\x7f\xf8\x7f\xf9\x7f\xfa\x7f\xfb\x7f\xfc\x7f\xfd\x80\x41\x80\x42\x80\x43\x80\x44\x80\x45\x80\x46\x80\x47\x80\x48\x80\x49\x80\x4a\x80\x4b\x80\x4c\x80\x4d\x80\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* e780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x90\xfc\x91\xfc\x92\xfc\x93\xfc\x94\xfc\x95\xfc\x96\xfc\x97\xfc\x98\xfc\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* e800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x57\xce\x58\xce\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x67\x00\x00\x00\x00\x00\x00\x00\x00\xce\x6c\xce\x6d\x00\x00\x00\x00\x00\x00\x00\x00\xce\x72\xce\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x96\xce\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5b\x44\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f880 */ NULL, /* f900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x46\xce\x47\xce\x48\xce\x49\x00\x00\xce\x4a\x00\x00\xce\x4b\xce\x4c\x00\x00\x00\x00\x00\x00\xce\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x4e\xce\x4f\xce\x50\x00\x00\xce\x51\xce\x52\x00\x00\x00\x00\xce\x53\xce\x54\xce\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa80 */ NULL, /* fb00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x47\xf8\x48\xf8\x49\xf8\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x6b\xf8\x6c\xf8\x6d\xf8\x6e\x00\x00\x00\x00", /* fb80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x7f\xf8\x80\xf8\x81\xf8\x82\xf8\x83\xf8\x84\xf8\x85\xf8\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x9b\xf8\x9c\xf8\x9d\xf8\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xc4\xf8\xc5\xf8\xc6\xf8\xc7\xf8\xc8\xf8\xc9\xf8\xca\xf8\xcb\xf8\xcc\xf8\xcd\xf8\xce\xf8\xcf\xf8\xd0\xf8\xd1\xf8\xd2\xf8\xd3\xf8\xd4\xf8\xd5\xf8\xd6\xf8\xd7\xf8\xd8\xf8\xd9\xf8\xda\xf8\xdb\xf8\xdc\xf8\xdd\xf8\xde\xf8\xdf\xf8\xe0\xf8\xe1\xf8\xe2\xf8\xe3\xf8\xe4\xf8\xe5\xf8\xe6\xf8\xe7\xf8\xe8\xf8\xe9\xf8\xea\xf8\xeb\xf8\xec\xf8\xed\xf8\xee\xf8\xef\xf8\xf0", /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xa8\x47\x51\x00\x00\x47\x52\x47\x53\x47\x41\x47\x42\x47\x4f\x47\x50\x47\x43\x47\x44\x47\x4d\x47\x4e\x47\x47\x47\x48\x47\x45\x47\x46\x47\x49\x47\x4a\x47\x4b\x47\x4c\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xa9\xcd\xaa\xcd\xab\xcd\xac\xcd\xad\xcd\xae\xcd\xaf\xcd\xb0\xcd\xb1\xcd\xb2\x00\x00\xcd\xb3\xcd\xb4\xcd\xb5\xcd\xb6\x00\x00\xcd\xb7\xcd\xb8\xcd\xb9\xcd\xba\xcd\xbb\xcd\xbc\xcd\xbd\xcd\xbe\xcd\xbf\xcd\xc0\xcd\xc1\xcd\xc2\xcd\xc3\xcd\xc4\x00\x00\xcd\xc5\xcd\xc6\xcd\xc7\xcd\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fe80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xd0\xfb\xd1\xfb\xd2\xfb\xd3\xfb\xd4\xfb\xd5\xfb\xd6\xfb\xd7\xfb\xd8\xfb\xd9\x00\x00\x00\x00\xfb\xdc\xfb\xdd\xfb\xde\xfb\xdf\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xe4\xfb\xe5\xfb\xe6\xfb\xe7\xfb\xe8\xfb\xe9\xfb\xea\xfb\xeb\xfb\xec\xfb\xed\xfb\xee\xfb\xef\xfb\xf0\xfb\xf1\x00\x00\x00\x00\xfb\xf4\xfb\xf5\xfb\xf6\xfb\xf7\xfb\xf8\xfb\xf9\xfb\xfa\xfb\xfb\xfb\xfc\xfb\xfd\xfb\xfe\xfc\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x52\xfc\x53\xfc\x54\xfc\x55\xfc\x56\xfc\x57\xfc\x58\xfc\x59\xfc\x5a\xfc\x5b\xfc\x5c\xfc\x5d\xfc\x5e\xfc\x5f\xfc\x60\xfc\x61\xfc\x62\xfc\x63\xfc\x64\xfc\x65\xfc\x66\xfc\x67\xfc\x68\xfc\x69\xfc\x6a\xfc\x6b\xfc\x6c\xfc\x6d\xfc\x6e\xfc\x6f\xfc\x70\xfc\x71\xfc\x72\xfc\x73\xfc\x74\xfc\x75\xfc\x76\xfc\x77\xfc\x78\xfc\x79\xfc\x7a\xfc\x7b\xfc\x7c\xfc\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x84\xfc\x85\x00\x00\x00\x00\x00\x00", /* ff00 */ "\x00\x00\x42\x5a\x42\x7f\x42\x7b\x42\xe0\x42\x6c\x42\x50\x42\x7d\x42\x4d\x42\x5d\x42\x5c\x42\x4e\x42\x6b\x42\x60\x42\x4b\x42\x61\x42\xf0\x42\xf1\x42\xf2\x42\xf3\x42\xf4\x42\xf5\x42\xf6\x42\xf7\x42\xf8\x42\xf9\x42\x7a\x42\x5e\x42\x4c\x42\x7e\x42\x6e\x42\x6f\x42\x7c\x42\xc1\x42\xc2\x42\xc3\x42\xc4\x42\xc5\x42\xc6\x42\xc7\x42\xc8\x42\xc9\x42\xd1\x42\xd2\x42\xd3\x42\xd4\x42\xd5\x42\xd6\x42\xd7\x42\xd8\x42\xd9\x42\xe2\x42\xe3\x42\xe4\x42\xe5\x42\xe6\x42\xe7\x42\xe8\x42\xe9\x44\x44\x43\xe0\x44\x45\x44\x70\x42\x6d\x42\x79\x42\x81\x42\x82\x42\x83\x42\x84\x42\x85\x42\x86\x42\x87\x42\x88\x42\x89\x42\x91\x42\x92\x42\x93\x42\x94\x42\x95\x42\x96\x42\x97\x42\x98\x42\x99\x42\xa2\x42\xa3\x42\xa4\x42\xa5\x42\xa6\x42\xa7\x42\xa8\x42\xa9\x42\xc0\x42\x4f\x42\xd0\x43\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x4a\x42\x4a\x42\x5f\x42\xa1\x42\x6a\x42\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, /* EBCDIC DBCS to Unicode translation table for ibm-1388_P103-2001 */ { /* 0000 */ NULL, /* 0080 */ NULL, /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ NULL, /* 0300 */ NULL, /* 0380 */ NULL, /* 0400 */ NULL, /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ NULL, /* 2080 */ NULL, /* 2100 */ NULL, /* 2180 */ NULL, /* 2200 */ NULL, /* 2280 */ NULL, /* 2300 */ NULL, /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ NULL, /* 2580 */ NULL, /* 2600 */ NULL, /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ NULL, /* 3080 */ NULL, /* 3100 */ NULL, /* 3180 */ NULL, /* 3200 */ NULL, /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4080 */ NULL, /* 4100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4180 */ "\x04\x30\x04\x31\x04\x32\x04\x33\x04\x34\x04\x35\x04\x51\x04\x36\x04\x37\x04\x38\x04\x39\x04\x3a\x04\x3b\x04\x3c\x04\x3d\x04\x3e\x04\x3f\x04\x40\x04\x41\x04\x42\x04\x43\x04\x44\x04\x45\x04\x46\x04\x47\x04\x48\x04\x49\x04\x4a\x04\x4b\x04\x4c\x04\x4d\x04\x4e\x04\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x70\x21\x71\x21\x72\x21\x73\x21\x74\x21\x75\x21\x76\x21\x77\x21\x78\x21\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x01\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04\x20\x04\x21\x04\x22\x04\x23\x04\x24\x04\x25\x04\x26\x04\x27\x04\x28\x04\x29\x04\x2a\x04\x2b\x04\x2c\x04\x2d\x04\x2e\x04\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x60\x21\x61\x21\x62\x21\x63\x21\x64\x21\x65\x21\x66\x21\x67\x21\x68\x21\x69\x21\x6a\x21\x6b\x00\x00\x00\x00\x00\x00", /* 4200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe1\xff\x0e\xff\x1c\xff\x08\xff\x0b\xff\x5c\xff\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x01\xff\xe5\xff\x0a\xff\x09\xff\x1b\xff\xe2\xff\x0d\xff\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe4\xff\x0c\xff\x05\xff\x3f\xff\x1e\xff\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x40\xff\x1a\xff\x03\xff\x20\xff\x07\xff\x1d\xff\x02", /* 4280 */ "\x00\x00\xff\x41\xff\x42\xff\x43\xff\x44\xff\x45\xff\x46\xff\x47\xff\x48\xff\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x4a\xff\x4b\xff\x4c\xff\x4d\xff\x4e\xff\x4f\xff\x50\xff\x51\xff\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe3\xff\x53\xff\x54\xff\x55\xff\x56\xff\x57\xff\x58\xff\x59\xff\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5b\xff\x21\xff\x22\xff\x23\xff\x24\xff\x25\xff\x26\xff\x27\xff\x28\xff\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x5d\xff\x2a\xff\x2b\xff\x2c\xff\x2d\xff\x2e\xff\x2f\xff\x30\xff\x31\xff\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\xff\x33\xff\x34\xff\x35\xff\x36\xff\x37\xff\x38\xff\x39\xff\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x10\xff\x11\xff\x12\xff\x13\xff\x14\xff\x15\xff\x16\xff\x17\xff\x18\xff\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x02\x30\x0c\x30\x0d\x30\x01\x30\xfb\x30\xf2\x30\xa1\x30\xa3\x30\xa5\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\xa7\x30\xa9\x30\xe3\x30\xe5\x30\xe7\x30\xc3\x30\xee\x30\xfc\x30\xf5\x30\xf6\xf8\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4380 */ "\x00\x00\x30\xa2\x30\xa4\x30\xa6\x30\xa8\x30\xaa\x30\xab\x30\xad\x30\xaf\x30\xb1\x30\xb3\x00\x00\x30\xb5\x30\xb7\x30\xb9\x30\xbb\x30\xbd\x30\xbf\x30\xc1\x30\xc4\x30\xc6\x30\xc8\x30\xca\x30\xcb\x30\xcc\x30\xcd\x30\xce\x00\x00\x00\x00\x30\xcf\x30\xd2\x30\xd5\x00\x00\xff\x5e\x30\xd8\x30\xdb\x30\xde\x30\xdf\x30\xe0\x30\xe1\x30\xe2\x30\xe4\x30\xe6\x00\x00\x30\xe8\x30\xe9\x30\xea\x30\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\xec\x30\xed\x30\xef\x30\xf3\x30\x9b\x30\x9c\x30\xac\x30\xae\x30\xb0\x30\xb2\x30\xb4\x30\xb6\x30\xb8\x30\xba\x30\xbc\x30\xbe\x30\xc0\x30\xc2\x30\xc5\x30\xc7\x30\xc9\x30\xd0\x30\xd3\x30\xd6\x30\xd9\x30\xdc\x30\xf4\x30\xd1\x30\xd4\x30\xd7\x30\xda\x30\xdd\x30\xf0\x30\xf1\x30\xfd\x30\xfe\x00\x00\x00\x00\xff\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x0e\x30\x0f\xff\x3b\xff\x3d\x30\x92\x30\x41\x30\x43\x30\x45\x20\x15\x00\xb1\x22\x60\x22\x1e\x21\x03\x00\x00\x00\xb4\x30\x47\x30\x49\x30\x83\x30\x85\x30\x87\x30\x63\x30\x8e\x00\x00\x00\x00\x20\x10\x30\x03\xf8\x3e\x30\x05\x30\x06\x30\x07\x00\xa8\x20\x18\x20\x1c\x30\x14\x30\x08\x30\x0a\x30\x10\x22\x64\x22\x34\x26\x42\x00\xa7\x20\x3b\x30\x12\x32\x31\x21\x16\x21\x21\xff\x3e\x20\x19\x20\x1d\x30\x15\x30\x09\x30\x0b\x30\x11\x22\x65\x22\x35\x26\x40\x00\xd7\x00\xf7\x20\x16\x30\x13\x20\x25\x20\x26", /* 4480 */ "\x00\x00\x30\x42\x30\x44\x30\x46\x30\x48\x30\x4a\x30\x4b\x30\x4d\x30\x4f\x30\x51\x30\x53\x00\x00\x30\x55\x30\x57\x30\x59\x30\x5b\x30\x5d\x30\x5f\x30\x61\x30\x64\x30\x66\x30\x68\x30\x6a\x30\x6b\x30\x6c\x30\x6d\x30\x6e\x00\x00\x00\x00\x30\x6f\x30\x72\x30\x75\x00\x00\x00\x00\x30\x78\x30\x7b\x30\x7e\x30\x7f\x30\x80\x30\x81\x30\x82\x30\x84\x30\x86\x00\x00\x30\x88\x30\x89\x30\x8a\x30\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x8c\x30\x8d\x30\x8f\x30\x93\x00\x00\x00\x00\x30\x4c\x30\x4e\x30\x50\x30\x52\x30\x54\x30\x56\x30\x58\x30\x5a\x30\x5c\x30\x5e\x30\x60\x30\x62\x30\x65\x30\x67\x30\x69\x30\x70\x30\x73\x30\x76\x30\x79\x30\x7c\x00\x00\x30\x71\x30\x74\x30\x77\x30\x7a\x30\x7d\x30\x90\x30\x91\x30\x9d\x30\x9e\x00\x00\x00\x00\x25\xcb\x25\xcf\x25\xb3\x25\xb2\x25\xce\x26\x06\x26\x05\x25\xc7\x25\xc6\x25\xa1\x25\xa0\x25\xbd\x25\xbc\x00\xb0\x20\x32\x20\x33\x21\x92\x21\x90\x21\x91\x21\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc9\x02\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x16\x30\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x36\x22\x27\x22\x28\x22\x11\x22\x0f\x22\x2a\x22\x29\x22\x08\x22\x37\x22\x1a\x22\xa5\x22\x25\x22\x20\x23\x12\x22\x99\x22\x2b\x22\x2e\x22\x61\x22\x4c\x22\x48\x22\x3d\x22\x1d\x00\x00\x22\x6e\x22\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x20\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x88\x24\x89\x24\x8a\x24\x8b\x24\x8c\x24\x8d\x24\x8e\x24\x8f\x24\x90\x24\x91\x24\x92\x24\x93\x24\x94\x24\x95\x24\x96\x24\x97\x24\x98\x24\x99\x24\x9a\x24\x9b\x24\x74\x24\x75\x24\x76\x24\x77\x24\x78\x24\x79\x24\x7a\x24\x7b\x24\x7c\x24\x7d\x24\x7e\x24\x7f\x24\x80\x24\x81\x24\x82\x24\x83\x24\x84\x24\x85\x24\x86\x24\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x60\x24\x61\x24\x62\x24\x63\x24\x64\x24\x65\x24\x66\x24\x67\x24\x68\x24\x69\x20\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x20\x32\x21\x32\x22\x32\x23\x32\x24\x32\x25\x32\x26\x32\x27\x32\x28\x32\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\xe1\x01\xce\x00\xe0\x01\x13\x00\xe9\x01\x1b\x00\xe8\x01\x2b\x00\xed\x01\xd0\x00\xec\x01\x4d\x00\xf3\x01\xd2\x00\xf2\x01\x6b\x00\xfa\x01\xd4\x00\xf9\x01\xd6\x01\xd8\x01\xda\x01\xdc\x00\xfc\x00\xea\x02\x51\xe7\xc7\x01\x44\x01\x48\x01\xf9\x02\x61\x00\x00\x00\x00\x00\x00\x00\x00\x31\x05\x31\x06\x31\x07\x31\x08\x31\x09\x31\x0a\x31\x0b\x31\x0c\x31\x0d\x31\x0e\x31\x0f\x31\x10\x31\x11\x31\x12\x31\x13\x31\x14\x31\x15\x31\x16\x31\x17\x31\x18\x31\x19\x31\x1a\x31\x1b\x31\x1c\x31\x1d\x31\x1e\x31\x1f", /* 4680 */ "\x31\x20\x31\x21\x31\x22\x31\x23\x31\x24\x31\x25\x31\x26\x31\x27\x31\x28\x31\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x25\x01\x25\x02\x25\x03\x25\x04\x25\x05\x25\x06\x25\x07\x25\x08\x25\x09\x25\x0a\x25\x0b\x25\x0c\x25\x0d\x25\x0e\x25\x0f\x25\x10\x25\x11\x25\x12\x25\x13\x25\x14\x25\x15\x25\x16\x25\x17\x25\x18\x25\x19\x25\x1a\x25\x1b\x25\x1c\x25\x1d\x25\x1e\x25\x1f\x25\x20\x25\x21\x25\x22\x25\x23\x25\x24\x25\x25\x25\x26\x25\x27\x25\x28\x25\x29\x25\x2a\x25\x2b\x25\x2c\x25\x2d\x25\x2e\x25\x2f\x25\x30\x25\x31\x25\x32\x25\x33\x25\x34\x25\x35\x25\x36\x25\x37\x25\x38\x25\x39\x25\x3a\x25\x3b\x25\x3c\x25\x3d\x25\x3e\x25\x3f\x25\x40\x25\x41\x25\x42\x25\x43\x25\x44\x25\x45\x25\x46\x25\x47\x25\x48\x25\x49\x25\x4a\x25\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x35\xfe\x36\xfe\x39\xfe\x3a\xfe\x3f\xfe\x40\xfe\x3d\xfe\x3e\xfe\x41\xfe\x42\xfe\x43\xfe\x44\xfe\x3b\xfe\x3c\xfe\x37\xfe\x38\xfe\x31\xfe\x33\xfe\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x01\x06\x02\x06\x03\x06\x04\x06\x05\x06\x06\x06\x07\x06\x08\x06\x09\x06\x0a\x06\x0b\x06\x0c\x06\x0d\x06\x0e\x06\x0f\x06\x10\x06\x11\x06\x12\x06\x13\x06\x14\x06\x15\x06\x16\x06\x17\x06\x18\x06\x19\x06\x1a\x06\x1b\x06\x1c\x06\x1d\x06\x1e\x06\x1f\x06\x20\x06\x21\x06\x22", /* 4780 */ "\x06\x23\x06\x24\x06\x25\x06\x26\x06\x27\x06\x28\x06\x29\x06\x2a\x06\x2b\x06\x2c\x06\x2d\x06\x2e\x06\x2f\x06\x30\x06\x31\x06\x32\x06\x33\x06\x34\x06\x35\x06\x36\x06\x37\x06\x38\x06\x39\x06\x3a\x06\x3b\x06\x3c\x06\x3d\x06\x3e\x06\x3f\x06\x40\x06\x41\x06\x42\x06\x43\x06\x44\x06\x45\x06\x46\x06\x47\x06\x48\x06\x49\x06\x4a\x06\x4b\x06\x4c\x06\x4d\x06\x4e\x06\x4f\x06\x50\x06\x51\x06\x52\x06\x53\x06\x54\x06\x55\x06\x56\x06\x57\x06\x58\x06\x59\x06\x5a\x06\x5b\x06\x5c\x06\x5d\x06\x5e\x06\x5f\x06\x60\x06\x61\x06\x62\x06\x63\x06\x64\x06\x65\x06\x66\x06\x67\x06\x68\x06\x69\x06\x6a\x06\x6b\x06\x6c\x06\x6d\x06\x6e\x06\x6f\x06\x70\x06\x71\x06\x72\x06\x73\x06\x74\x06\x75\x06\x76\x06\x77\x06\x78\x06\x79\x06\x7a\x06\x7b\x06\x7c\x06\x7d\x06\x7e\x06\x7f\x06\x80\x06\x81\x06\x82\x06\x83\x06\x84\x06\x85\x06\x86\x06\x87\x06\x88\x06\x89\x06\x8a\x06\x8b\x06\x8c\x06\x8d\x06\x8e\x06\x8f\x06\x90\x06\x91\x06\x92\x06\x93\x06\x94\x06\x95\x06\x96\x06\x97\x06\x98\x06\x99\x06\x9a\x06\x9b\x06\x9c\x06\x9d\x06\x9e\x06\x9f\x06\xa0\x06\xa1\x00\x00", /* 4800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xa2\x06\xa3\x06\xa4\x06\xa5\x06\xa6\x06\xa7\x06\xa8\x06\xa9\x06\xaa\x06\xab\x06\xac\x06\xad\x06\xae\x06\xaf\x06\xb0\x06\xb1\x06\xb2\x06\xb3\x06\xb4\x06\xb5\x06\xb6\x06\xb7\x06\xb8\x06\xb9\x06\xba\x06\xbb\x06\xbc\x06\xbd\x06\xbe\x06\xbf\x06\xc0\x06\xc1\x06\xc2\x06\xc3\x06\xc4\x06\xc5\x06\xc6\x06\xc7\x06\xc8\x06\xc9\x06\xca\x06\xcb\x06\xcc\x06\xcd\x06\xce\x06\xcf\x06\xd0\x06\xd1\x06\xd2\x06\xd3\x06\xd4\x06\xd5\x06\xd6\x06\xd7\x06\xd8\x06\xd9\x06\xda\x06\xdb\x06\xdc\x06\xdd\x06\xde\x06\xdf\x06\xe0", /* 4880 */ "\x06\xe1\x06\xe2\x06\xe3\x06\xe4\x06\xe5\x06\xe6\x06\xe7\x06\xe8\x06\xe9\x06\xea\x06\xeb\x06\xec\x06\xed\x06\xee\x06\xef\x06\xf0\x06\xf1\x06\xf2\x06\xf3\x06\xf4\x06\xf5\x06\xf6\x06\xf7\x06\xf8\x06\xf9\x06\xfa\x06\xfb\x06\xfc\x06\xfd\x06\xfe\x06\xff\x00\x00\x55\x4a\x96\x3f\x57\xc3\x63\x28\x54\xce\x55\x09\x54\xc0\x76\x91\x76\x4c\x85\x3c\x77\xee\x82\x7e\x78\x8d\x72\x31\x96\x98\x97\x8d\x6c\x28\x5b\x89\x4f\xfa\x63\x09\x66\x97\x5c\xb8\x80\xfa\x68\x48\x80\xae\x66\x02\x76\xce\x51\xf9\x65\x56\x71\xac\x7f\xf1\x88\x84\x50\xb2\x59\x65\x61\xca\x6f\xb3\x82\xad\x63\x4c\x62\x52\x53\xed\x54\x27\x7b\x06\x51\x6b\x75\xa4\x5d\xf4\x62\xd4\x8d\xcb\x97\x76\x62\x8a\x80\x19\x57\x5d\x97\x38\x7f\x62\x72\x38\x76\x7d\x67\xcf\x76\x7e\x64\x46\x4f\x70\x8d\x25\x62\xdc\x7a\x17\x65\x91\x73\xed\x64\x2c\x62\x73\x82\x2c\x98\x81\x67\x7f\x72\x48\x62\x6e\x62\xcc\x4f\x34\x74\xe3\x53\x4a\x52\x9e\x7e\xca\x90\xa6\x5e\x2e\x68\x86\x69\x9c\x81\x80\x7e\xd1\x68\xd2\x78\xc5\x86\x8c\x95\x51\x50\x8d\x8c\x24\x82\xde\x80\xde\x53\x05\x89\x12\x52\x65\x00\x00\x00\x00", /* 4900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x84\x96\xf9\x4f\xdd\x58\x21\x99\x71\x5b\x9d\x62\xb1\x62\xa5\x66\xb4\x8c\x79\x9c\x8d\x72\x06\x67\x6f\x78\x91\x60\xb2\x53\x51\x53\x17\x8f\x88\x80\xcc\x8d\x1d\x94\xa1\x50\x0d\x72\xc8\x59\x07\x60\xeb\x71\x19\x88\xab\x59\x54\x82\xef\x67\x2c\x7b\x28\x5d\x29\x7e\xf7\x75\x2d\x6c\xf5\x8e\x66\x8f\xf8\x90\x3c\x9f\x3b\x6b\xd4\x91\x19\x7b\x14\x5f\x7c\x78\xa7\x84\xd6\x85\x3d\x6b\xd5\x6b\xd9\x6b\xd6\x5e\x01\x5e\x87\x75\xf9\x95\xed\x65\x5d\x5f\x0a\x5f\xc5\x8f\x9f\x58\xc1\x81\xc2\x90\x7f\x96\x5b\x97\xad\x8f\xb9", /* 4980 */ "\x00\x00\x7f\x16\x8d\x2c\x62\x41\x4f\xbf\x53\xd8\x53\x5e\x8f\xa8\x8f\xa9\x8f\xab\x90\x4d\x68\x07\x5f\x6a\x81\x98\x88\x68\x9c\xd6\x61\x8b\x52\x2b\x76\x2a\x5f\x6c\x65\x8c\x6f\xd2\x6e\xe8\x5b\xbe\x64\x48\x51\x75\x51\xb0\x67\xc4\x4e\x19\x79\xc9\x99\x7c\x70\xb3\x75\xc5\x5e\x76\x73\xbb\x83\xe0\x64\xad\x62\xe8\x94\xb5\x6c\xe2\x53\x5a\x52\xc3\x64\x0f\x94\xc2\x7b\x94\x4f\x2f\x5e\x1b\x82\x36\x81\x16\x81\x8a\x6e\x24\x6c\xca\x9a\x73\x63\x55\x53\x5c\x54\xfa\x88\x65\x57\xe0\x4e\x0d\x5e\x03\x6b\x65\x7c\x3f\x90\xe8\x60\x16\x64\xe6\x73\x1c\x88\xc1\x67\x50\x62\x4d\x8d\x22\x77\x6c\x8e\x29\x91\xc7\x5f\x69\x83\xdc\x85\x21\x99\x10\x53\xc2\x86\x95\x6b\x8b\x60\xed\x60\xe8\x70\x7f\x82\xcd\x82\x31\x4e\xd3\x6c\xa7\x85\xcf\x64\xcd\x7c\xd9\x69\xfd\x66\xf9\x83\x49\x53\x95\x7b\x56\x4f\xa7\x51\x8c\x6d\x4b\x5c\x42\x8e\x6d\x63\xd2\x53\xc9\x83\x2c\x83\x36\x67\xe5\x78\xb4\x64\x3d\x5b\xdf\x5c\x94\x5d\xee\x8b\xe7\x62\xc6\x67\xf4\x8c\x7a\x64\x00\x63\xba\x87\x49\x99\x8b\x8c\x17\x7f\x20\x94\xf2\x4e\xa7\x96\x10\x98\xa4\x66\x0c\x73\x16\x00\x00\x00\x00", /* 4a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x3a\x5c\x1d\x5e\x38\x95\x7f\x50\x7f\x80\xa0\x53\x82\x65\x5e\x75\x45\x55\x31\x50\x21\x8d\x85\x62\x84\x94\x9e\x67\x1d\x56\x32\x6f\x6e\x5d\xe2\x54\x35\x70\x92\x8f\x66\x62\x6f\x64\xa4\x63\xa3\x5f\x7b\x6f\x88\x90\xf4\x81\xe3\x8f\xb0\x5c\x18\x66\x68\x5f\xf1\x6c\x89\x96\x48\x8d\x81\x88\x6c\x64\x91\x79\xf0\x57\xce\x6a\x59\x62\x10\x54\x48\x4e\x58\x7a\x0b\x60\xe9\x6f\x84\x8b\xda\x62\x7f\x90\x1e\x9a\x8b\x79\xe4\x54\x03\x75\xf4\x63\x01\x53\x19\x6c\x60\x8f\xdf\x5f\x1b\x9a\x70\x80\x3b\x9f\x7f\x4f\x88\x5c\x3a", /* 4a80 */ "\x00\x00\x8d\x64\x7f\xc5\x65\xa5\x70\xbd\x51\x45\x51\xb2\x86\x6b\x5d\x07\x5b\xa0\x62\xbd\x91\x6c\x75\x74\x8e\x0c\x7a\x20\x61\x01\x7b\x79\x4e\xc7\x7e\xf8\x77\x85\x4e\x11\x81\xed\x52\x1d\x51\xfa\x6a\x71\x53\xa8\x8e\x87\x95\x04\x96\xcf\x6e\xc1\x96\x64\x69\x5a\x78\x40\x50\xa8\x77\xd7\x64\x10\x89\xe6\x59\x04\x63\xe3\x5d\xdd\x7a\x7f\x69\x3d\x4f\x20\x82\x39\x55\x98\x4e\x32\x75\xae\x7a\x97\x5e\x62\x5e\x8a\x95\xef\x52\x1b\x54\x39\x70\x8a\x63\x76\x95\x24\x57\x82\x66\x25\x69\x3f\x91\x87\x55\x07\x6d\xf3\x7e\xaf\x88\x22\x62\x33\x7e\xf0\x75\xb5\x83\x28\x78\xc1\x96\xcc\x8f\x9e\x61\x48\x74\xf7\x8b\xcd\x6b\x64\x52\x3a\x8d\x50\x6b\x21\x80\x6a\x84\x71\x56\xf1\x53\x06\x4e\xce\x4e\x1b\x51\xd1\x7c\x97\x91\x8b\x7c\x07\x4f\xc3\x8e\x7f\x7b\xe1\x7a\x9c\x64\x67\x5d\x14\x50\xac\x81\x06\x76\x01\x7c\xb9\x6d\xec\x7f\xe0\x67\x51\x5b\x58\x5b\xf8\x78\xcb\x64\xae\x64\x13\x63\xaa\x63\x2b\x95\x19\x64\x2d\x8f\xbe\x7b\x54\x76\x29\x62\x53\x59\x27\x54\x46\x6b\x79\x50\xa3\x62\x34\x5e\x26\x6b\x86\x4e\xe3\x8d\x37\x88\x8b\x5f\x85\x90\x2e\x00\x00\x00\x00", /* 4b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x20\x80\x3d\x62\xc5\x4e\x39\x53\x55\x90\xf8\x63\xb8\x80\xc6\x65\xe6\x6c\x2e\x4f\x46\x60\xee\x6d\xe1\x8b\xde\x5f\x39\x86\xcb\x5f\x53\x63\x21\x51\x5a\x83\x61\x68\x63\x52\x00\x63\x63\x8e\x48\x50\x12\x5c\x9b\x79\x77\x5b\xfc\x52\x30\x7a\x3b\x60\xbc\x90\x53\x76\xd7\x5f\xb7\x5f\x97\x76\x84\x8e\x6c\x70\x6f\x76\x7b\x7b\x49\x77\xaa\x51\xf3\x90\x93\x58\x24\x4f\x4e\x6e\xf4\x8f\xea\x65\x4c\x7b\x1b\x72\xc4\x6d\xa4\x7f\xdf\x5a\xe1\x62\xb5\x5e\x95\x57\x30\x84\x82\x7b\x2c\x5e\x1d\x5f\x1f\x90\x12\x7f\x14\x98\xa0", /* 4b80 */ "\x00\x00\x63\x82\x6e\xc7\x78\x98\x70\xb9\x51\x78\x97\x5b\x57\xab\x75\x35\x4f\x43\x75\x38\x5e\x97\x60\xe6\x59\x60\x6d\xc0\x6b\xbf\x78\x89\x53\xfc\x96\xd5\x51\xcb\x52\x01\x63\x89\x54\x0a\x94\x93\x8c\x03\x8d\xcc\x72\x39\x78\x9f\x87\x76\x8f\xed\x8c\x0d\x53\xe0\x4e\x01\x76\xef\x53\xee\x94\x89\x98\x76\x9f\x0e\x95\x2d\x5b\x9a\x8b\xa2\x4e\x22\x4e\x1c\x51\xac\x84\x63\x61\xc2\x52\xa8\x68\x0b\x4f\x97\x60\x6b\x51\xbb\x6d\x1e\x51\x5c\x62\x96\x65\x97\x96\x61\x8c\x46\x90\x17\x75\xd8\x90\xfd\x77\x63\x6b\xd2\x72\x8a\x72\xec\x8b\xfb\x58\x35\x77\x79\x8d\x4c\x67\x5c\x95\x40\x80\x9a\x5e\xa6\x6e\x21\x59\x92\x7a\xef\x77\xed\x95\x3b\x6b\xb5\x65\xad\x7f\x0e\x58\x06\x51\x51\x96\x1f\x5b\xf9\x58\xa9\x54\x28\x8e\x72\x65\x66\x98\x7f\x56\xe4\x94\x9d\x76\xfe\x90\x41\x63\x87\x54\xc6\x59\x1a\x59\x3a\x57\x9b\x8e\xb2\x67\x35\x8d\xfa\x82\x35\x52\x41\x60\xf0\x58\x15\x86\xfe\x5c\xe8\x9e\x45\x4f\xc4\x98\x9d\x8b\xb9\x5a\x25\x60\x76\x53\x84\x62\x7c\x90\x4f\x91\x02\x99\x7f\x60\x69\x80\x0c\x51\x3f\x80\x33\x5c\x14\x99\x75\x6d\x31\x4e\x8c\x00\x00\x00\x00", /* 4c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x30\x53\xd1\x7f\x5a\x7b\x4f\x4f\x10\x4e\x4f\x96\x00\x6c\xd5\x73\xd0\x85\xe9\x5e\x06\x75\x6a\x7f\xfb\x6a\x0a\x77\xfe\x94\x92\x7e\x41\x51\xe1\x70\xe6\x53\xcd\x8f\xd4\x83\x03\x8d\x29\x72\xaf\x99\x6d\x6c\xdb\x57\x4a\x82\xb3\x65\xb9\x80\xaa\x62\x3f\x96\x32\x59\xa8\x4e\xff\x8b\xbf\x7e\xba\x65\x3e\x83\xf2\x97\x5e\x55\x61\x98\xde\x80\xa5\x53\x2a\x8b\xfd\x54\x20\x80\xba\x5e\x9f\x6c\xb8\x8d\x39\x82\xac\x91\x5a\x54\x29\x6c\x1b\x52\x06\x7e\xb7\x57\x5f\x71\x1a\x6c\x7e\x7c\x89\x59\x4b\x4e\xfd\x5f\xff\x61\x24", /* 4c80 */ "\x00\x00\x7c\xaa\x4e\x30\x5c\x01\x67\xab\x87\x02\x5c\xf0\x95\x0b\x98\xce\x75\xaf\x70\xfd\x90\x22\x51\xaf\x7f\x1d\x8b\xbd\x59\x49\x51\xe4\x4f\x5b\x54\x26\x59\x2b\x65\x77\x80\xa4\x5b\x75\x62\x76\x62\xc2\x8f\x90\x5e\x45\x6c\x1f\x7b\x26\x4f\x0f\x4f\xd8\x67\x0d\x6d\x6e\x6d\xaa\x79\x8f\x88\xb1\x5f\x17\x75\x2b\x62\x9a\x8f\x85\x4f\xef\x91\xdc\x65\xa7\x81\x2f\x81\x51\x5e\x9c\x81\x50\x8d\x74\x52\x6f\x89\x86\x8d\x4b\x59\x0d\x50\x85\x4e\xd8\x96\x1c\x72\x36\x81\x79\x8d\x1f\x5b\xcc\x8b\xa3\x96\x44\x59\x87\x7f\x1a\x54\x90\x56\x76\x56\x0e\x8b\xe5\x65\x39\x69\x82\x94\x99\x76\xd6\x6e\x89\x5e\x72\x75\x18\x67\x46\x67\xd1\x7a\xff\x80\x9d\x8d\x76\x61\x1f\x79\xc6\x65\x62\x8d\x63\x51\x88\x52\x1a\x94\xa2\x7f\x38\x80\x9b\x7e\xb2\x5c\x97\x6e\x2f\x67\x60\x7b\xd9\x76\x8b\x9a\xd8\x81\x8f\x7f\x94\x7c\xd5\x64\x1e\x95\x50\x7a\x3f\x54\x4a\x54\xe5\x6b\x4c\x64\x01\x62\x08\x9e\x3d\x80\xf3\x75\x99\x52\x72\x97\x69\x84\x5b\x68\x3c\x86\xe4\x96\x01\x96\x94\x94\xec\x4e\x2a\x54\x04\x7e\xd9\x68\x39\x8d\xdf\x80\x15\x66\xf4\x5e\x9a\x7f\xb9\x00\x00\x00\x00", /* 4d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xc2\x80\x3f\x68\x97\x5d\xe5\x65\x3b\x52\x9f\x60\x6d\x9f\x9a\x4f\x9b\x8e\xac\x51\x6c\x5b\xab\x5f\x13\x5d\xe9\x6c\x5e\x62\xf1\x8d\x21\x51\x71\x94\xa9\x52\xfe\x6c\x9f\x82\xdf\x72\xd7\x57\xa2\x67\x84\x8d\x2d\x59\x1f\x8f\x9c\x83\xc7\x54\x95\x7b\x8d\x4f\x30\x6c\xbd\x5b\x64\x59\xd1\x9f\x13\x53\xe4\x86\xca\x9a\xa8\x8c\x37\x80\xa1\x65\x45\x98\x7e\x56\xfa\x96\xc7\x52\x2e\x74\xdc\x52\x50\x5b\xe1\x63\x02\x89\x02\x4e\x56\x62\xd0\x60\x2a\x68\xfa\x51\x73\x5b\x98\x51\xa0\x89\xc2\x7b\xa1\x99\x86\x7f\x50\x60\xef", /* 4d80 */ "\x00\x00\x70\x4c\x8d\x2f\x51\x49\x5e\x7f\x90\x1b\x74\x70\x89\xc4\x57\x2d\x78\x45\x5f\x52\x9f\x9f\x95\xfa\x8f\x68\x9b\x3c\x8b\xe1\x76\x78\x68\x42\x67\xdc\x8d\xea\x8d\x35\x52\x3d\x8f\x8a\x6e\xda\x68\xcd\x95\x05\x90\xed\x56\xfd\x67\x9c\x88\xf9\x8f\xc7\x54\xc8\x9a\xb8\x5b\x69\x6d\x77\x6c\x26\x4e\xa5\x5b\xb3\x9a\x87\x91\x63\x61\xa8\x90\xaf\x97\xe9\x54\x2b\x6d\xb5\x5b\xd2\x51\xfd\x55\x8a\x7f\x55\x7f\xf0\x64\xbc\x63\x4d\x65\xf1\x61\xbe\x60\x8d\x71\x0a\x6c\x57\x6c\x49\x59\x2f\x67\x6d\x82\x2a\x58\xd5\x56\x8e\x8c\x6a\x6b\xeb\x90\xdd\x59\x7d\x80\x17\x53\xf7\x6d\x69\x54\x75\x55\x9d\x83\x77\x83\xcf\x68\x38\x79\xbe\x54\x8c\x4f\x55\x54\x08\x76\xd2\x8c\x89\x96\x02\x6c\xb3\x6d\xb8\x8d\x6b\x89\x10\x9e\x64\x8d\x3a\x56\x3f\x9e\xd1\x75\xd5\x5f\x88\x72\xe0\x60\x68\x54\xfc\x4e\xa8\x6a\x2a\x88\x61\x60\x52\x8f\x70\x54\xc4\x70\xd8\x86\x79\x9e\x3f\x6d\x2a\x5b\x8f\x5f\x18\x7e\xa2\x55\x89\x4f\xaf\x73\x34\x54\x3c\x53\x9a\x50\x19\x54\x0e\x54\x7c\x4e\x4e\x5f\xfd\x74\x5a\x58\xf6\x84\x6b\x80\xe1\x87\x74\x72\xd0\x7c\xca\x6e\x56\x00\x00\x00\x00", /* 4e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x27\x86\x4e\x55\x2c\x62\xa4\x4e\x92\x6c\xaa\x62\x37\x82\xb1\x54\xd7\x53\x4e\x73\x3e\x6e\xd1\x75\x3b\x52\x12\x53\x16\x8b\xdd\x69\xd0\x5f\x8a\x60\x00\x6d\xee\x57\x4f\x6b\x22\x73\xaf\x68\x53\x8f\xd8\x7f\x13\x63\x62\x60\xa3\x55\x24\x75\xea\x8c\x62\x71\x15\x6d\xa3\x5b\xa6\x5e\x7b\x83\x52\x61\x4c\x9e\xc4\x78\xfa\x87\x57\x7c\x27\x76\x87\x51\xf0\x60\xf6\x71\x4c\x66\x43\x5e\x4c\x60\x4d\x8c\x0e\x70\x70\x63\x25\x8f\x89\x5f\xbd\x60\x62\x86\xd4\x56\xde\x6b\xc1\x60\x94\x61\x67\x53\x49\x60\xe0\x66\x66\x8d\x3f", /* 4e80 */ "\x00\x00\x79\xfd\x4f\x1a\x70\xe9\x6c\x47\x8b\xb3\x8b\xf2\x7e\xd8\x83\x64\x66\x0f\x5a\x5a\x9b\x42\x6d\x51\x6d\xf7\x8c\x41\x6d\x3b\x4f\x19\x70\x6b\x83\xb7\x62\x16\x60\xd1\x97\x0d\x8d\x27\x79\x78\x51\xfb\x57\x3e\x57\xfa\x67\x3a\x75\x78\x7a\x3d\x79\xef\x7b\x95\x80\x8c\x99\x65\x8f\xf9\x6f\xc0\x8b\xa5\x9e\x21\x59\xec\x7e\xe9\x7f\x09\x54\x09\x67\x81\x68\xd8\x8f\x91\x7c\x4d\x96\xc6\x53\xca\x60\x25\x75\xbe\x6c\x72\x53\x73\x5a\xc9\x7e\xa7\x63\x24\x51\xe0\x81\x0a\x5d\xf1\x84\xdf\x62\x80\x51\x80\x5b\x63\x4f\x0e\x79\x6d\x52\x42\x60\xb8\x6d\x4e\x5b\xc4\x5b\xc2\x8b\xa1\x8b\xb0\x65\xe2\x5f\xcc\x96\x45\x59\x93\x7e\xe7\x7e\xaa\x56\x09\x67\xb7\x59\x39\x4f\x73\x5b\xb6\x52\xa0\x83\x5a\x98\x8a\x8d\x3e\x75\x32\x94\xbe\x50\x47\x7a\x3c\x4e\xf7\x67\xb6\x9a\x7e\x5a\xc1\x6b\x7c\x76\xd1\x57\x5a\x5c\x16\x7b\x3a\x95\xf4\x71\x4e\x51\x7c\x80\xa9\x82\x70\x59\x78\x7f\x04\x83\x27\x68\xc0\x67\xec\x78\xb1\x78\x77\x62\xe3\x63\x61\x7b\x80\x4f\xed\x52\x6a\x51\xcf\x83\x50\x69\xdb\x92\x74\x8d\xf5\x8d\x31\x89\xc1\x95\x2e\x7b\xad\x4e\xf6\x00\x00\x00\x00", /* 4f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x65\x82\x30\x52\x51\x99\x6f\x6e\x10\x6e\x85\x6d\xa7\x5e\xfa\x50\xf5\x59\xdc\x5c\x06\x6d\x46\x6c\x5f\x75\x86\x84\x8b\x68\x68\x59\x56\x8b\xb2\x53\x20\x91\x71\x96\x4d\x85\x49\x69\x12\x79\x01\x71\x26\x80\xf6\x4e\xa4\x90\xca\x6d\x47\x9a\x84\x5a\x07\x56\xbc\x64\x05\x94\xf0\x77\xeb\x4f\xa5\x81\x1a\x72\xe1\x89\xd2\x99\x7a\x7f\x34\x7e\xde\x52\x7f\x65\x59\x91\x75\x8f\x7f\x8f\x83\x53\xeb\x7a\x96\x63\xed\x63\xa5\x76\x86\x79\xf8\x88\x57\x96\x36\x62\x2a\x52\xab\x82\x82\x68\x54\x67\x70\x63\x77\x77\x6b\x7a\xed", /* 4f80 */ "\x00\x00\x6d\x01\x7e\xd3\x89\xe3\x59\xd0\x62\x12\x85\xc9\x82\xa5\x75\x4c\x50\x1f\x4e\xcb\x75\xa5\x8b\xeb\x5c\x4a\x5d\xfe\x7b\x4b\x65\xa4\x91\xd1\x4e\xca\x6d\x25\x89\x5f\x7d\x27\x95\x26\x4e\xc5\x8c\x28\x8f\xdb\x97\x73\x66\x4b\x79\x81\x8f\xd1\x70\xec\x6d\x78\x5c\x3d\x52\xb2\x83\x46\x51\x62\x83\x0e\x77\x5b\x66\x76\x9c\xb8\x4e\xac\x60\xca\x7c\xbe\x7c\xb3\x7e\xcf\x4e\x95\x8b\x66\x66\x6f\x98\x88\x97\x59\x58\x83\x65\x6c\x95\x5c\x5f\x84\x75\xc9\x97\x56\x7a\xdf\x7a\xde\x51\xc0\x70\xaf\x7a\x98\x63\xea\x7a\x76\x7e\xa0\x73\x96\x97\xed\x4e\x45\x70\x78\x4e\x5d\x91\x52\x53\xa9\x65\x51\x65\xe7\x81\xfc\x82\x05\x54\x8e\x5c\x31\x75\x9a\x97\xa0\x62\xd8\x72\xd9\x75\xbd\x5c\x45\x9a\x79\x83\xca\x5c\x40\x54\x80\x77\xe9\x4e\x3e\x6c\xae\x80\x5a\x62\xd2\x63\x6e\x5d\xe8\x51\x77\x8d\xdd\x8e\x1e\x95\x2f\x4f\xf1\x53\xe5\x60\xe7\x70\xac\x52\x67\x63\x50\x9e\x43\x5a\x1f\x50\x26\x77\x37\x53\x77\x7e\xe2\x64\x85\x65\x2b\x62\x89\x63\x98\x50\x14\x72\x35\x89\xc9\x51\xb3\x8b\xc0\x7e\xdd\x57\x47\x83\xcc\x94\xa7\x51\x9b\x54\x1b\x5c\xfb\x00\x00\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xca\x7a\xe3\x6d\x5a\x90\xe1\x9a\x8f\x55\x80\x54\x96\x53\x61\x54\xaf\x5f\x00\x63\xe9\x69\x77\x51\xef\x61\x68\x52\x0a\x58\x2a\x52\xd8\x57\x4e\x78\x0d\x77\x0b\x5e\xb7\x61\x77\x7c\xe0\x62\x5b\x62\x97\x4e\xa2\x70\x95\x80\x03\x62\xf7\x70\xe4\x97\x60\x57\x77\x82\xdb\x67\xef\x68\xf5\x78\xd5\x98\x97\x79\xd1\x58\xf3\x54\xb3\x53\xef\x6e\x34\x51\x4b\x52\x3b\x5b\xa2\x8b\xfe\x80\xaf\x55\x43\x57\xa6\x60\x73\x57\x51\x54\x2d\x7a\x7a\x60\x50\x5b\x54\x63\xa7\x62\xa0\x53\xe3\x62\x63\x5b\xc7\x67\xaf\x54\xed\x7a\x9f", /* 5080 */ "\x00\x00\x82\xe6\x91\x77\x5e\x93\x88\xe4\x59\x38\x57\xae\x63\x0e\x8d\xe8\x80\xef\x57\x57\x7b\x77\x4f\xa9\x5f\xeb\x5b\xbd\x6b\x3e\x53\x21\x7b\x50\x72\xc2\x68\x46\x77\xff\x77\x36\x65\xf7\x51\xb5\x4e\x8f\x76\xd4\x5c\xbf\x7a\xa5\x84\x75\x59\x4e\x9b\x41\x50\x80\x99\x88\x61\x27\x6e\x83\x57\x64\x66\x06\x63\x46\x56\xf0\x62\xec\x62\x69\x5e\xd3\x96\x14\x57\x83\x62\xc9\x55\x87\x87\x21\x81\x4a\x8f\xa3\x55\x66\x83\xb1\x67\x65\x8d\x56\x84\xdd\x5a\x6a\x68\x0f\x62\xe6\x7b\xee\x96\x11\x51\x70\x6f\x9c\x8c\x30\x63\xfd\x89\xc8\x61\xd2\x7f\x06\x70\xc2\x6e\xe5\x74\x05\x69\x94\x72\xfc\x5e\xca\x90\xce\x67\x17\x6d\x6a\x63\x5e\x52\xb3\x72\x62\x80\x01\x4f\x6c\x59\xe5\x91\x6a\x70\xd9\x6d\x9d\x52\xd2\x4e\x50\x96\xf7\x95\x6d\x85\x7e\x78\xca\x7d\x2f\x51\x21\x57\x92\x64\xc2\x80\x8b\x7c\x7b\x6c\xea\x68\xf1\x69\x5e\x51\xb7\x53\x98\x68\xa8\x72\x81\x9e\xce\x7b\xf1\x72\xf8\x79\xbb\x6f\x13\x74\x06\x67\x4e\x91\xcc\x9c\xa4\x79\x3c\x83\x89\x83\x54\x54\x0f\x68\x17\x4e\x3d\x53\x89\x52\xb1\x78\x3e\x53\x86\x52\x29\x50\x88\x4f\x8b\x4f\xd0\x00\x00\x00\x00", /* 5100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xe2\x7a\xcb\x7c\x92\x6c\xa5\x96\xb6\x52\x9b\x74\x83\x54\xe9\x4f\xe9\x80\x54\x83\xb2\x8f\xde\x95\x70\x5e\xc9\x60\x1c\x6d\x9f\x5e\x18\x65\x5b\x81\x38\x94\xfe\x60\x4b\x70\xbc\x7e\xc3\x7c\xae\x51\xc9\x68\x81\x7c\xb1\x82\x6f\x4e\x24\x8f\x86\x91\xcf\x66\x7e\x4e\xae\x8c\x05\x64\xa9\x80\x4a\x50\xda\x75\x97\x71\xce\x5b\xe5\x8f\xbd\x6f\x66\x4e\x86\x64\x82\x95\x63\x5e\xd6\x65\x99\x52\x17\x88\xc2\x70\xc8\x52\xa3\x73\x0e\x74\x33\x67\x97\x78\xf7\x97\x16\x4e\x34\x90\xbb\x9c\xde\x6d\xcb\x51\xdb\x8d\x41\x54\x1d", /* 5180 */ "\x00\x00\x62\xce\x73\xb2\x83\xf1\x96\xf6\x9f\x84\x94\xc3\x4f\x36\x7f\x9a\x51\xcc\x70\x75\x96\x75\x5c\xad\x98\x86\x53\xe6\x4e\xe4\x6e\x9c\x74\x09\x69\xb4\x78\x6b\x99\x8f\x75\x59\x52\x18\x76\x24\x6d\x41\x67\xf3\x51\x6d\x9f\x99\x80\x4b\x54\x99\x7b\x3c\x7a\xbf\x96\x86\x57\x84\x62\xe2\x96\x47\x69\x7c\x5a\x04\x64\x02\x7b\xd3\x6f\x0f\x96\x4b\x82\xa6\x53\x62\x98\x85\x5e\x90\x70\x89\x63\xb3\x53\x64\x86\x4f\x9c\x81\x9e\x93\x78\x8c\x97\x32\x8d\xef\x8d\x42\x9e\x7f\x6f\x5e\x79\x84\x5f\x55\x96\x46\x62\x2e\x9a\x74\x54\x15\x94\xdd\x4f\xa3\x65\xc5\x5c\x65\x5c\x61\x7f\x15\x86\x51\x6c\x2f\x5f\x8b\x73\x87\x6e\xe4\x7e\xff\x5c\xe6\x63\x1b\x5b\x6a\x6e\xe6\x53\x75\x4e\x71\x63\xa0\x75\x65\x62\xa1\x8f\x6e\x4f\x26\x4e\xd1\x6c\xa6\x7e\xb6\x8b\xba\x84\x1d\x87\xba\x7f\x57\x90\x3b\x95\x23\x7b\xa9\x9a\xa1\x88\xf8\x84\x3d\x6d\x1b\x9a\x86\x7e\xdc\x59\x88\x9e\xbb\x73\x9b\x78\x01\x86\x82\x9a\x6c\x9a\x82\x56\x1b\x54\x17\x57\xcb\x4e\x70\x9e\xa6\x53\x56\x8f\xc8\x81\x09\x77\x92\x99\x92\x86\xee\x6e\xe1\x85\x13\x66\xfc\x61\x62\x6f\x2b\x00\x00\x00\x00", /* 5200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x29\x82\x92\x83\x2b\x76\xf2\x6c\x13\x5f\xd9\x83\xbd\x73\x2b\x83\x05\x95\x1a\x6b\xdb\x77\xdb\x94\xc6\x53\x6f\x83\x02\x51\x92\x5e\x3d\x8c\x8c\x8d\x38\x4e\x48\x73\xab\x67\x9a\x68\x85\x91\x76\x97\x09\x71\x64\x6c\xa1\x77\x09\x5a\x92\x95\x41\x6b\xcf\x7f\x8e\x66\x27\x5b\xd0\x59\xb9\x5a\x9a\x95\xe8\x95\xf7\x4e\xec\x84\x0c\x84\x99\x6a\xac\x76\xdf\x95\x30\x73\x1b\x68\xa6\x5b\x5f\x77\x2f\x91\x9a\x97\x61\x7c\xdc\x8f\xf7\x8c\x1c\x5f\x25\x7c\x73\x79\xd8\x89\xc5\x6c\xcc\x87\x1c\x5b\xc6\x5e\x42\x68\xc9\x77\x20", /* 5280 */ "\x00\x00\x7e\xf5\x51\x95\x51\x4d\x52\xc9\x5a\x29\x7f\x05\x97\x62\x82\xd7\x63\xcf\x77\x84\x85\xd0\x79\xd2\x6e\x3a\x5e\x99\x59\x99\x85\x11\x70\x6d\x6c\x11\x62\xbf\x76\xbf\x65\x4f\x60\xaf\x95\xfd\x66\x0e\x87\x9f\x9e\x23\x94\xed\x54\x0d\x54\x7d\x8c\x2c\x64\x78\x64\x79\x86\x11\x6a\x21\x81\x9c\x78\xe8\x64\x69\x9b\x54\x62\xb9\x67\x2b\x83\xab\x58\xa8\x9e\xd8\x6c\xab\x6f\x20\x5b\xde\x96\x4c\x8c\x0b\x72\x5f\x67\xd0\x62\xc7\x72\x61\x4e\xa9\x59\xc6\x6b\xcd\x58\x93\x66\xae\x5e\x55\x52\xdf\x61\x55\x67\x28\x76\xee\x77\x66\x72\x67\x7a\x46\x62\xff\x54\xea\x54\x50\x94\xa0\x90\xa3\x5a\x1c\x7e\xb3\x6c\x16\x4e\x43\x59\x76\x80\x10\x59\x48\x53\x57\x75\x37\x96\xbe\x56\xca\x63\x20\x81\x11\x60\x7c\x95\xf9\x6d\xd6\x54\x62\x99\x81\x51\x85\x5a\xe9\x80\xfd\x59\xae\x97\x13\x50\x2a\x6c\xe5\x5c\x3c\x62\xdf\x4f\x60\x53\x3f\x81\x7b\x90\x06\x6e\xba\x85\x2b\x62\xc8\x5e\x74\x78\xbe\x64\xb5\x63\x7b\x5f\xf5\x5a\x18\x91\x7f\x9e\x1f\x5c\x3f\x63\x4f\x80\x42\x5b\x7d\x55\x6e\x95\x4a\x95\x4d\x6d\x85\x60\xa8\x67\xe0\x72\xde\x51\xdd\x5b\x81\x00\x00\x00\x00", /* 5300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\xe7\x6c\xde\x72\x5b\x62\x6d\x94\xae\x7e\xbd\x81\x13\x6d\x53\x51\x9c\x5f\x04\x59\x74\x52\xaa\x60\x12\x59\x73\x66\x96\x86\x50\x75\x9f\x63\x2a\x61\xe6\x7c\xef\x8b\xfa\x54\xe6\x6b\x27\x9e\x25\x6b\xb4\x85\xd5\x54\x55\x50\x76\x6c\xa4\x55\x6a\x8d\xb4\x72\x2c\x5e\x15\x60\x15\x74\x36\x62\xcd\x63\x92\x72\x4c\x5f\x98\x6e\x43\x6d\x3e\x65\x00\x6f\x58\x76\xd8\x78\xd0\x76\xfc\x75\x54\x52\x24\x53\xdb\x4e\x53\x5e\x9e\x65\xc1\x80\x2a\x80\xd6\x62\x9b\x54\x86\x52\x28\x70\xae\x88\x8d\x8d\xd1\x6c\xe1\x54\x78\x80\xda", /* 5380 */ "\x00\x00\x57\xf9\x88\xf4\x8d\x54\x96\x6a\x91\x4d\x4f\x69\x6c\x9b\x55\xb7\x76\xc6\x78\x30\x62\xa8\x70\xf9\x6f\x8e\x5f\x6d\x84\xec\x68\xda\x78\x7c\x7b\xf7\x81\xa8\x67\x0b\x9e\x4f\x63\x67\x78\xb0\x57\x6f\x78\x12\x97\x39\x62\x79\x62\xab\x52\x88\x74\x35\x6b\xd7\x55\x64\x81\x3e\x75\xb2\x76\xae\x53\x39\x75\xde\x50\xfb\x5c\x41\x8b\x6c\x7b\xc7\x50\x4f\x72\x47\x9a\x97\x98\xd8\x6f\x02\x74\xe2\x79\x68\x64\x87\x77\xa5\x62\xfc\x98\x91\x8d\x2b\x54\xc1\x80\x58\x4e\x52\x57\x6a\x82\xf9\x84\x0d\x5e\x73\x51\xed\x74\xf6\x8b\xc4\x5c\x4f\x57\x61\x6c\xfc\x98\x87\x5a\x46\x78\x34\x9b\x44\x8f\xeb\x7c\x95\x52\x56\x62\x51\x94\xfa\x4e\xc6\x83\x86\x84\x61\x83\xe9\x84\xb2\x57\xd4\x67\x34\x57\x03\x66\x6e\x6d\x66\x8c\x31\x66\xdd\x70\x11\x67\x1f\x6b\x3a\x68\x16\x62\x1a\x59\xbb\x4e\x03\x51\xc4\x6f\x06\x67\xd2\x6c\x8f\x51\x76\x68\xcb\x59\x47\x6b\x67\x75\x66\x5d\x0e\x81\x10\x9f\x50\x65\xd7\x79\x48\x79\x41\x9a\x91\x8d\x77\x5c\x82\x4e\x5e\x4f\x01\x54\x2f\x59\x51\x78\x0c\x56\x68\x6c\x14\x8f\xc4\x5f\x03\x6c\x7d\x6c\xe3\x8b\xab\x63\x90\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x70\x6d\x3d\x72\x75\x62\x66\x94\x8e\x94\xc5\x53\x43\x8f\xc1\x7b\x7e\x4e\xdf\x8c\x26\x4e\x7e\x9e\xd4\x94\xb1\x94\xb3\x52\x4d\x6f\x5c\x90\x63\x6d\x45\x8c\x34\x58\x11\x5d\x4c\x6b\x20\x6b\x49\x67\xaa\x54\x5b\x81\x54\x7f\x8c\x58\x99\x85\x37\x5f\x3a\x62\xa2\x6a\x47\x95\x39\x65\x72\x60\x84\x68\x65\x77\xa7\x4e\x54\x4f\xa8\x5d\xe7\x97\x98\x64\xac\x7f\xd8\x5c\xed\x4f\xcf\x7a\x8d\x52\x07\x83\x04\x4e\x14\x60\x2f\x7a\x83\x94\xa6\x4f\xb5\x4e\xb2\x79\xe6\x74\x34\x52\xe4\x82\xb9\x64\xd2\x79\xbd\x5b\xdd\x6c\x81", /* 5480 */ "\x00\x00\x97\x52\x8f\x7b\x6c\x22\x50\x3e\x53\x7f\x6e\x05\x64\xce\x66\x74\x6c\x30\x60\xc5\x98\x77\x8b\xf7\x5e\x86\x74\x3c\x7a\x77\x79\xcb\x4e\x18\x90\xb1\x74\x03\x6c\x42\x56\xda\x91\x4b\x6c\xc5\x8d\x8b\x53\x3a\x86\xc6\x66\xf2\x8e\xaf\x5c\x48\x9a\x71\x6e\x20\x53\xd6\x5a\x36\x9f\x8b\x8d\xa3\x53\xbb\x57\x08\x98\xa7\x67\x43\x91\x9b\x6c\xc9\x51\x68\x75\xca\x62\xf3\x72\xac\x52\x38\x52\x9d\x7f\x3a\x70\x94\x76\x38\x53\x74\x9e\x4a\x69\xb7\x78\x6e\x96\xc0\x88\xd9\x7f\xa4\x71\x36\x71\xc3\x51\x89\x67\xd3\x74\xe4\x58\xe4\x65\x18\x56\xb7\x8b\xa9\x99\x76\x62\x70\x7e\xd5\x60\xf9\x70\xed\x58\xec\x4e\xc1\x4e\xba\x5f\xcd\x97\xe7\x4e\xfb\x8b\xa4\x52\x03\x59\x8a\x7e\xab\x62\x54\x4e\xcd\x65\xe5\x62\x0e\x83\x38\x84\xc9\x83\x63\x87\x8d\x71\x94\x6e\xb6\x5b\xb9\x7e\xd2\x51\x97\x63\xc9\x67\xd4\x80\x89\x83\x39\x88\x15\x51\x12\x5b\x7a\x59\x82\x8f\xb1\x4e\x73\x6c\x5d\x51\x65\x89\x25\x8f\x6f\x96\x2e\x85\x4a\x74\x5e\x95\x10\x95\xf0\x6d\xa6\x82\xe5\x5f\x31\x64\x92\x6d\x12\x84\x28\x81\x6e\x9c\xc3\x58\x5e\x8d\x5b\x4e\x09\x53\xc1\x00\x00\x00\x00", /* 5500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x1e\x65\x63\x68\x51\x55\xd3\x4e\x27\x64\x14\x9a\x9a\x62\x6b\x5a\xc2\x74\x5f\x82\x72\x6d\xa9\x68\xee\x50\xe7\x83\x8e\x78\x02\x67\x40\x52\x39\x6c\x99\x7e\xb1\x50\xbb\x55\x65\x71\x5e\x7b\x5b\x66\x52\x73\xca\x82\xeb\x67\x49\x5c\x71\x52\x20\x71\x7d\x88\x6b\x95\xea\x96\x55\x64\xc5\x8d\x61\x81\xb3\x55\x84\x6c\x55\x62\x47\x7f\x2e\x58\x92\x4f\x24\x55\x46\x8d\x4f\x66\x4c\x4e\x0a\x5c\x1a\x88\xf3\x68\xa2\x63\x4e\x7a\x0d\x70\xe7\x82\x8d\x52\xfa\x97\xf6\x5c\x11\x54\xe8\x90\xb5\x7e\xcd\x59\x62\x8d\x4a\x86\xc7", /* 5580 */ "\x00\x00\x82\x0c\x82\x0d\x8d\x66\x64\x44\x5c\x04\x61\x51\x6d\x89\x79\x3e\x8b\xbe\x78\x37\x75\x33\x54\x7b\x4f\x38\x8e\xab\x6d\xf1\x5a\x20\x7e\xc5\x79\x5e\x6c\x88\x5b\xa1\x5a\x76\x75\x1a\x80\xbe\x61\x4e\x6e\x17\x58\xf0\x75\x1f\x75\x25\x72\x72\x53\x47\x7e\xf3\x77\x01\x76\xdb\x52\x69\x80\xdc\x57\x23\x5e\x08\x59\x31\x72\xee\x65\xbd\x6e\x7f\x8b\xd7\x5c\x38\x86\x71\x53\x41\x77\xf3\x62\xfe\x65\xf6\x4e\xc0\x98\xdf\x86\x80\x5b\x9e\x8b\xc6\x53\xf2\x77\xe2\x4f\x7f\x5c\x4e\x9a\x76\x59\xcb\x5f\x0f\x79\x3a\x58\xeb\x4e\x16\x67\xff\x4e\x8b\x62\xed\x8a\x93\x90\x1d\x52\xbf\x66\x2f\x55\xdc\x56\x6c\x90\x02\x4e\xd5\x4f\x8d\x91\xca\x99\x70\x6c\x0f\x5e\x02\x60\x43\x5b\xa4\x89\xc6\x8b\xd5\x65\x36\x62\x4b\x99\x96\x5b\x88\x5b\xff\x63\x88\x55\x2e\x53\xd7\x76\x26\x51\x7d\x85\x2c\x67\xa2\x68\xb3\x6b\x8a\x62\x92\x8f\x93\x53\xd4\x82\x12\x6d\xd1\x75\x8f\x4e\x66\x8d\x4e\x5b\x70\x71\x9f\x85\xaf\x66\x91\x66\xd9\x7f\x72\x87\x00\x9e\xcd\x9f\x20\x5c\x5e\x67\x2f\x8f\xf0\x68\x11\x67\x5f\x62\x0d\x7a\xd6\x58\x85\x5e\xb6\x65\x70\x6f\x31\x00\x00\x00\x00", /* 5600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x55\x52\x37\x80\x0d\x64\x54\x88\x70\x75\x29\x5e\x05\x68\x13\x62\xf4\x97\x1c\x53\xcc\x72\x3d\x8c\x01\x6c\x34\x77\x61\x7a\x0e\x54\x2e\x77\xac\x98\x7a\x82\x1c\x8b\xf4\x78\x55\x67\x14\x70\xc1\x65\xaf\x64\x95\x56\x36\x60\x1d\x79\xc1\x53\xf8\x4e\x1d\x6b\x7b\x80\x86\x5b\xfa\x55\xe3\x56\xdb\x4f\x3a\x4f\x3c\x99\x72\x5d\xf3\x67\x7e\x80\x38\x60\x02\x98\x82\x90\x01\x5b\x8b\x8b\xbc\x8b\xf5\x64\x1c\x82\x58\x64\xde\x55\xfd\x82\xcf\x91\x65\x4f\xd7\x7d\x20\x90\x1f\x7c\x9f\x50\xf3\x58\x51\x6e\xaf\x5b\xbf\x8b\xc9", /* 5680 */ "\x00\x00\x80\x83\x91\x78\x84\x9c\x7b\x97\x86\x7d\x96\x8b\x96\x8f\x7e\xe5\x9a\xd3\x78\x8e\x5c\x81\x7a\x57\x90\x42\x96\xa7\x79\x5f\x5b\x59\x63\x5f\x7b\x0b\x84\xd1\x68\xad\x55\x06\x7f\x29\x74\x10\x7d\x22\x95\x01\x62\x40\x58\x4c\x4e\xd6\x5b\x83\x59\x79\x58\x54\x73\x6d\x63\x1e\x8e\x4b\x8e\x0f\x80\xce\x82\xd4\x62\xac\x53\xf0\x6c\xf0\x91\x5e\x59\x2a\x60\x01\x6c\x70\x57\x4d\x64\x4a\x8d\x2a\x76\x2b\x6e\xe9\x57\x5b\x6a\x80\x75\xf0\x6f\x6d\x8c\x2d\x8c\x08\x57\x66\x6b\xef\x88\x92\x78\xb3\x63\xa2\x53\xf9\x70\xad\x6c\x64\x58\x58\x64\x2a\x58\x02\x68\xe0\x81\x9b\x55\x10\x7c\xd6\x50\x18\x8e\xba\x6d\xcc\x8d\x9f\x70\xeb\x63\x8f\x6d\x9b\x6e\xd4\x7e\xe6\x84\x04\x68\x43\x90\x03\x6d\xd8\x96\x76\x8b\xa8\x59\x57\x72\x79\x85\xe4\x81\x7e\x75\xbc\x8a\x8a\x68\xaf\x52\x54\x8e\x22\x95\x11\x63\xd0\x98\x98\x8e\x44\x55\x7c\x4f\x53\x66\xff\x56\x8f\x60\xd5\x6d\x95\x52\x43\x5c\x49\x59\x29\x6d\xfb\x58\x6b\x75\x30\x75\x1c\x60\x6c\x82\x14\x81\x46\x63\x11\x67\x61\x8f\xe2\x77\x3a\x8d\xf3\x8d\x34\x94\xc1\x5e\x16\x53\x85\x54\x2c\x70\xc3\x00\x00\x00\x00", /* 5700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x40\x5e\xf7\x50\x5c\x4e\xad\x5e\xad\x63\x3a\x82\x47\x90\x1a\x68\x50\x91\x6e\x77\xb3\x54\x0c\x94\xdc\x5f\x64\x7a\xe5\x68\x76\x63\x45\x7b\x52\x7e\xdf\x75\xdb\x50\x77\x62\x95\x59\x34\x90\x0f\x51\xf8\x79\xc3\x7a\x81\x56\xfe\x5f\x92\x90\x14\x6d\x82\x5c\x60\x57\x1f\x54\x10\x51\x54\x6e\x4d\x56\xe2\x63\xa8\x98\x93\x81\x7f\x87\x15\x89\x2a\x90\x00\x54\x1e\x5c\x6f\x81\xc0\x62\xd6\x62\x58\x81\x31\x9e\x35\x96\x40\x9a\x6e\x9a\x7c\x69\x2d\x59\xa5\x62\xd3\x55\x3e\x63\x16\x54\xc7\x86\xd9\x6d\x3c\x5a\x03\x74\xe6", /* 5780 */ "\x00\x00\x88\x9c\x6b\x6a\x59\x16\x8c\x4c\x5f\x2f\x6e\x7e\x73\xa9\x98\x7d\x4e\x38\x70\xf7\x5b\x8c\x78\x97\x63\x3d\x66\x5a\x76\x96\x60\xcb\x5b\x9b\x5a\x49\x4e\x07\x81\x55\x6c\x6a\x73\x8b\x4e\xa1\x67\x89\x7f\x51\x5f\x80\x65\xfa\x67\x1b\x5f\xd8\x59\x84\x5a\x01\x5d\xcd\x5f\xae\x53\x71\x97\xe6\x8f\xdd\x68\x45\x56\xf4\x55\x2f\x60\xdf\x4e\x3a\x6f\x4d\x7e\xf4\x82\xc7\x84\x0e\x59\xd4\x4f\x1f\x4f\x2a\x5c\x3e\x7e\xac\x67\x2a\x85\x1a\x54\x73\x75\x4f\x80\xc3\x55\x82\x9b\x4f\x4f\x4d\x6e\x2d\x8c\x13\x5c\x09\x61\x70\x53\x6b\x76\x1f\x6e\x29\x86\x8a\x65\x87\x95\xfb\x7e\xb9\x54\x3b\x7a\x33\x7d\x0a\x95\xee\x55\xe1\x7f\xc1\x74\xee\x63\x1d\x87\x17\x6d\xa1\x7a\x9d\x62\x11\x65\xa1\x53\x67\x63\xe1\x6c\x83\x5d\xeb\x54\x5c\x94\xa8\x4e\x4c\x6c\x61\x8b\xec\x5c\x4b\x65\xe0\x82\x9c\x68\xa7\x54\x3e\x54\x34\x6b\xcb\x6b\x66\x4e\x94\x63\x42\x53\x48\x82\x1e\x4f\x0d\x4f\xae\x57\x5e\x62\x0a\x96\xfe\x66\x64\x72\x69\x52\xff\x52\xa1\x60\x9f\x8b\xef\x66\x14\x71\x99\x67\x90\x89\x7f\x78\x52\x77\xfd\x66\x70\x56\x3b\x54\x38\x95\x21\x72\x7a\x00\x00\x00\x00", /* 5800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x60\x6f\x5e\x0c\x60\x89\x81\x9d\x59\x15\x60\xdc\x71\x84\x70\xef\x6e\xaa\x6c\x50\x72\x80\x6a\x84\x88\xad\x5e\x2d\x4e\x60\x5a\xb3\x55\x9c\x94\xe3\x6d\x17\x7c\xfb\x96\x99\x62\x0f\x7e\xc6\x77\x8e\x86\x7e\x53\x23\x97\x1e\x8f\x96\x66\x87\x5c\xe1\x4f\xa0\x72\xed\x4e\x0b\x53\xa6\x59\x0f\x54\x13\x63\x80\x95\x28\x51\x48\x4e\xd9\x9c\x9c\x7e\xa4\x54\xb8\x8d\x24\x88\x54\x82\x37\x95\xf2\x6d\x8e\x5f\x26\x5a\xcc\x66\x3e\x96\x69\x73\xb0\x73\x2e\x53\xbf\x81\x7a\x99\x85\x7f\xa1\x5b\xaa\x96\x77\x96\x50\x7e\xbf", /* 5880 */ "\x00\x00\x76\xf8\x53\xa2\x95\x76\x99\x99\x7b\xb1\x89\x44\x6e\x58\x4e\x61\x7f\xd4\x79\x65\x8b\xe6\x60\xf3\x54\xcd\x4e\xab\x98\x79\x5d\xf7\x6a\x61\x50\xcf\x54\x11\x8c\x61\x84\x27\x78\x5d\x97\x04\x52\x4a\x54\xee\x56\xa3\x95\x00\x6d\x88\x5b\xb5\x6d\xc6\x66\x53\x5c\x0f\x5b\x5d\x68\x21\x80\x96\x55\x78\x7b\x11\x65\x48\x69\x54\x4e\x9b\x6b\x47\x87\x4e\x97\x8b\x53\x4f\x63\x1f\x64\x3a\x90\xaa\x65\x9c\x80\xc1\x8c\x10\x51\x99\x68\xb0\x53\x78\x87\xf9\x61\xc8\x6c\xc4\x6c\xfb\x8c\x22\x5c\x51\x85\xaa\x82\xaf\x95\x0c\x6b\x23\x8f\x9b\x65\xb0\x5f\xfb\x5f\xc3\x4f\xe1\x88\x45\x66\x1f\x81\x65\x73\x29\x60\xfa\x51\x74\x52\x11\x57\x8b\x5f\x62\x90\xa2\x88\x4c\x91\x92\x5e\x78\x67\x4f\x60\x27\x59\xd3\x51\x44\x51\xf6\x80\xf8\x53\x08\x6c\x79\x96\xc4\x71\x8a\x4f\x11\x4f\xee\x7f\x9e\x67\x3d\x55\xc5\x95\x08\x79\xc0\x88\x96\x7e\xe3\x58\x9f\x62\x0c\x97\x00\x86\x5a\x56\x18\x98\x7b\x5f\x90\x8b\xb8\x84\xc4\x91\x57\x53\xd9\x65\xed\x5e\x8f\x75\x5c\x60\x64\x7d\x6e\x5a\x7f\x7e\xea\x7e\xed\x8f\x69\x55\xa7\x5b\xa3\x60\xac\x65\xcb\x73\x84\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x09\x76\x63\x77\x29\x7e\xda\x97\x74\x85\x9b\x5b\x66\x7a\x74\x96\xea\x88\x40\x52\xcb\x71\x8f\x5f\xaa\x65\xec\x8b\xe2\x5b\xfb\x9a\x6f\x5d\xe1\x6b\x89\x6c\x5b\x8b\xad\x8b\xaf\x90\x0a\x8f\xc5\x53\x8b\x62\xbc\x9e\x26\x9e\x2d\x54\x40\x4e\x2b\x82\xbd\x72\x59\x86\x9c\x5d\x16\x88\x59\x6d\xaf\x96\xc5\x54\xd1\x4e\x9a\x8b\xb6\x71\x09\x54\xbd\x96\x09\x70\xdf\x6d\xf9\x76\xd0\x4e\x25\x78\x14\x87\x12\x5c\xa9\x5e\xf6\x8a\x00\x98\x9c\x96\x0e\x70\x8e\x6c\xbf\x59\x44\x63\xa9\x77\x3c\x88\x4d\x6f\x14\x82\x73\x58\x30", /* 5980 */ "\x00\x00\x71\xd5\x53\x8c\x78\x1a\x96\xc1\x55\x01\x5f\x66\x71\x30\x5b\xb4\x8c\x1a\x9a\x8c\x6b\x83\x59\x2e\x9e\x2f\x79\xe7\x67\x68\x62\x6c\x4f\x6f\x75\xa1\x7f\x8a\x6d\x0b\x96\x33\x6c\x27\x4e\xf0\x75\xd2\x51\x7b\x68\x37\x6f\x3e\x90\x80\x81\x70\x59\x96\x74\x76\x64\x47\x5c\x27\x90\x65\x7a\x91\x8c\x23\x59\xda\x54\xac\x82\x00\x83\x6f\x89\x81\x80\x00\x69\x30\x56\x4e\x80\x36\x72\x37\x91\xce\x51\xb6\x4e\x5f\x98\x75\x63\x96\x4e\x1a\x53\xf6\x66\xf3\x81\x4b\x59\x1c\x6d\xb2\x4e\x00\x58\xf9\x53\x3b\x63\xd6\x94\xf1\x4f\x9d\x4f\x0a\x88\x63\x98\x90\x59\x37\x90\x57\x79\xfb\x4e\xea\x80\xf0\x75\x91\x6c\x82\x5b\x9c\x59\xe8\x5f\x5d\x69\x05\x86\x81\x50\x1a\x5d\xf2\x4e\x59\x77\xe3\x4e\xe5\x82\x7a\x62\x91\x66\x13\x90\x91\x5c\x79\x4e\xbf\x5f\x79\x81\xc6\x90\x38\x80\x84\x75\xab\x4e\xa6\x88\xd4\x61\x0f\x6b\xc5\x5f\xc6\x4e\x49\x76\xca\x6e\xa2\x8b\xe3\x8b\xae\x8c\x0a\x8b\xd1\x5f\x02\x7f\xfc\x7f\xcc\x7e\xce\x83\x35\x83\x6b\x56\xe0\x6b\xb7\x97\xf3\x96\x34\x59\xfb\x54\x1f\x94\xf6\x6d\xeb\x5b\xc5\x99\x6e\x5c\x39\x5f\x15\x96\x90\x00\x00\x00\x00", /* 5a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x70\x82\xf1\x6a\x31\x5a\x74\x9e\x70\x5e\x94\x7f\x28\x83\xb9\x84\x24\x84\x25\x83\x67\x87\x47\x8f\xce\x8d\x62\x76\xc8\x5f\x71\x98\x96\x78\x6c\x66\x20\x54\xdf\x62\xe5\x4f\x63\x81\xc3\x75\xc8\x5e\xb8\x96\xcd\x8e\x0a\x86\xf9\x54\x8f\x6c\xf3\x6d\x8c\x6c\x38\x60\x7f\x52\xc7\x75\x28\x5e\x7d\x4f\x18\x60\xa0\x5f\xe7\x5c\x24\x75\x31\x90\xae\x94\xc0\x72\xb9\x6c\xb9\x6e\x38\x91\x49\x67\x09\x53\xcb\x53\xf3\x4f\x51\x91\xc9\x8b\xf1\x53\xc8\x5e\x7c\x8f\xc2\x6d\xe4\x4e\x8e\x76\xc2\x69\x86\x86\x5e\x61\x1a\x82\x06", /* 5a80 */ "\x00\x00\x4f\x59\x4f\xde\x90\x3e\x9c\x7c\x61\x09\x6e\x1d\x6e\x14\x96\x85\x4e\x88\x5a\x31\x96\xe8\x4e\x0e\x5c\x7f\x79\xb9\x5b\x87\x8b\xed\x7f\xbd\x73\x89\x57\xdf\x82\x8b\x90\xc1\x54\x01\x90\x47\x55\xbb\x5c\xea\x5f\xa1\x61\x08\x6b\x32\x72\xf1\x80\xb2\x8a\x89\x6d\x74\x5b\xd3\x88\xd5\x98\x84\x8c\x6b\x9a\x6d\x9e\x33\x6e\x0a\x51\xa4\x51\x43\x57\xa3\x88\x81\x53\x9f\x63\xf4\x8f\x95\x56\xed\x54\x58\x57\x06\x73\x3f\x6e\x90\x7f\x18\x8f\xdc\x82\xd1\x61\x3f\x60\x28\x96\x62\x66\xf0\x7e\xa6\x8d\x8a\x8d\xc3\x94\xa5\x5c\xb3\x7c\xa4\x67\x08\x60\xa6\x96\x05\x80\x18\x4e\x91\x90\xe7\x53\x00\x96\x68\x51\x41\x8f\xd0\x85\x74\x91\x5d\x66\x55\x97\xf5\x5b\x55\x53\x1d\x78\x38\x67\x42\x68\x3d\x54\xc9\x70\x7e\x5b\xb0\x8f\x7d\x51\x8d\x57\x28\x54\xb1\x65\x12\x66\x82\x8d\x5e\x8d\x43\x81\x0f\x84\x6c\x90\x6d\x7c\xdf\x51\xff\x85\xfb\x67\xa3\x65\xe9\x6f\xa1\x86\xa4\x8e\x81\x56\x6a\x90\x20\x76\x82\x70\x76\x71\xe5\x8d\x23\x62\xe9\x52\x19\x6c\xfd\x8d\x3c\x60\x0e\x58\x9e\x61\x8e\x66\xfe\x8d\x60\x62\x4e\x55\xb3\x6e\x23\x67\x2d\x8f\x67\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\xe1\x95\xf8\x77\x28\x68\x05\x69\xa8\x54\x8b\x4e\x4d\x70\xb8\x8b\xc8\x64\x58\x65\x8b\x5b\x85\x7a\x84\x50\x3a\x5b\xe8\x77\xbb\x6b\xe1\x8a\x79\x7c\x98\x6c\xbe\x76\xcf\x65\xa9\x8f\x97\x5d\x2d\x5c\x55\x86\x38\x68\x08\x53\x60\x62\x18\x7a\xd9\x6e\x5b\x7e\xfd\x6a\x1f\x7a\xe0\x5f\x70\x6f\x33\x5f\x20\x63\x8c\x6d\xa8\x67\x56\x4e\x08\x5e\x10\x8d\x26\x4e\xd7\x80\xc0\x76\x34\x96\x9c\x62\xdb\x66\x2d\x62\x7e\x6c\xbc\x8d\x75\x71\x67\x7f\x69\x51\x46\x80\x87\x53\xec\x90\x6e\x62\x98\x54\xf2\x86\xf0\x8f\x99\x80\x05", /* 5b80 */ "\x00\x00\x95\x17\x85\x17\x8f\xd9\x6d\x59\x73\xcd\x65\x9f\x77\x1f\x75\x04\x78\x27\x81\xfb\x8d\x1e\x94\x88\x4f\xa6\x67\x95\x75\xb9\x8b\xca\x97\x07\x63\x2f\x95\x47\x96\x35\x84\xb8\x63\x23\x77\x41\x5f\x81\x72\xf0\x4e\x89\x60\x14\x65\x74\x62\xef\x6b\x63\x65\x3f\x5e\x27\x75\xc7\x90\xd1\x8b\xc1\x82\x9d\x67\x9d\x65\x2f\x54\x31\x87\x18\x77\xe5\x80\xa2\x81\x02\x6c\x41\x4e\x4b\x7e\xc7\x80\x4c\x76\xf4\x69\x0d\x6b\x96\x62\x67\x50\x3c\x4f\x84\x57\x40\x63\x07\x6b\x62\x8d\xbe\x53\xea\x65\xe8\x7e\xb8\x5f\xd7\x63\x1a\x63\xb7\x81\xf3\x81\xf4\x7f\x6e\x5e\x1c\x5c\xd9\x52\x36\x66\x7a\x79\xe9\x7a\x1a\x8d\x28\x70\x99\x75\xd4\x6e\xde\x6c\xbb\x7a\x92\x4e\x2d\x76\xc5\x5f\xe0\x94\x9f\x88\x77\x7e\xc8\x79\xcd\x80\xbf\x91\xcd\x4e\xf2\x4f\x17\x82\x1f\x54\x68\x5d\xde\x6d\x32\x8b\xcc\x7c\xa5\x8f\x74\x80\x98\x5e\x1a\x54\x92\x76\xb1\x5b\x99\x66\x3c\x9a\xa4\x73\xe0\x68\x2a\x86\xdb\x67\x31\x73\x2a\x8b\xf8\x8b\xdb\x90\x10\x7a\xf9\x70\xdb\x71\x6e\x62\xc4\x77\xa9\x56\x31\x4e\x3b\x84\x57\x67\xf1\x52\xa9\x86\xc0\x8d\x2e\x94\xf8\x7b\x51\x00\x00\x00\x00", /* 5c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x4f\x6c\xe8\x79\x5d\x9a\x7b\x62\x93\x72\x2a\x62\xfd\x4e\x13\x78\x16\x8f\x6c\x64\xb0\x8d\x5a\x7b\xc6\x68\x69\x5e\x84\x88\xc5\x59\x86\x64\x9e\x58\xee\x72\xb6\x69\x0e\x95\x25\x8f\xfd\x8d\x58\x57\x60\x7f\x00\x8c\x06\x51\xc6\x63\x49\x62\xd9\x53\x53\x68\x4c\x74\x22\x83\x01\x91\x4c\x55\x44\x77\x40\x70\x7c\x6d\x4a\x51\x79\x54\xa8\x8d\x44\x59\xff\x6e\xcb\x6d\xc4\x5b\x5c\x7d\x2b\x4e\xd4\x7c\x7d\x6e\xd3\x5b\x50\x81\xea\x6e\x0d\x5b\x57\x9b\x03\x68\xd5\x8e\x2a\x5b\x97\x7e\xfc\x60\x3b\x7e\xb5\x90\xb9\x8d\x70", /* 5c80 */ "\x00\x00\x59\x4f\x63\xcd\x79\xdf\x8d\xb3\x53\x52\x65\xcf\x79\x56\x8b\xc5\x96\x3b\x7e\xc4\x94\xbb\x7e\x82\x56\x34\x91\x89\x67\x00\x7f\x6a\x5c\x0a\x90\x75\x66\x28\x5d\xe6\x4f\x50\x67\xde\x50\x5a\x4f\x5c\x57\x50\x5e\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x8d\x4e\x0c\x51\x40\x4e\x10\x5e\xff\x53\x45\x4e\x15\x4e\x98\x4e\x1e\x9b\x32\x5b\x6c\x56\x69\x4e\x28\x79\xba\x4e\x3f\x53\x15\x4e\x47\x59\x2d\x72\x3b\x53\x6e\x6c\x10\x56\xdf\x80\xe4\x99\x97\x6b\xd3\x77\x7e\x9f\x17\x4e\x36\x4e\x9f\x9f\x10\x4e\x5c\x4e\x69\x4e\x93\x82\x88\x5b\x5b\x55\x6c\x56\x0f\x4e\xc4\x53\x8d\x53\x9d\x53\xa3\x53\xa5\x53\xae\x97\x65\x8d\x5d\x53\x1a\x53\xf5\x53\x26\x53\x2e\x53\x3e\x8d\x5c\x53\x66\x53\x63\x52\x02\x52\x08\x52\x0e\x52\x2d\x52\x33\x52\x3f\x52\x40\x52\x4c\x52\x5e\x52\x61\x52\x5c\x84\xaf\x52\x7d\x52\x82\x52\x81\x52\x90\x52\x93\x51\x82\x7f\x54\x4e\xbb\x4e\xc3\x4e\xc9\x4e\xc2\x4e\xe8\x4e\xe1\x4e\xeb\x4e\xde\x4f\x1b\x4e\xf3\x4f\x22\x4f\x64\x4e\xf5\x4f\x25\x4f\x27\x4f\x09\x4f\x2b\x4f\x5e\x4f\x67\x65\x38\x4f\x5a\x4f\x5d\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x5f\x4f\x57\x4f\x32\x4f\x3d\x4f\x76\x4f\x74\x4f\x91\x4f\x89\x4f\x83\x4f\x8f\x4f\x7e\x4f\x7b\x4f\xaa\x4f\x7c\x4f\xac\x4f\x94\x4f\xe6\x4f\xe8\x4f\xea\x4f\xc5\x4f\xda\x4f\xe3\x4f\xdc\x4f\xd1\x4f\xdf\x4f\xf8\x50\x29\x50\x4c\x4f\xf3\x50\x2c\x50\x0f\x50\x2e\x50\x2d\x4f\xfe\x50\x1c\x50\x0c\x50\x25\x50\x28\x50\x7e\x50\x43\x50\x55\x50\x48\x50\x4e\x50\x6c\x50\x7b\x50\xa5\x50\xa7\x50\xa9\x50\xba\x50\xd6\x51\x06\x50\xed\x50\xec\x50\xe6\x50\xee\x51\x07\x51\x0b\x4e\xdd\x6c\x3d\x4f\x58\x4f\x65\x4f\xce\x9f\xa0", /* 5d80 */ "\x00\x00\x6c\x46\x7c\x74\x51\x6e\x5d\xfd\x9e\xc9\x99\x98\x51\x81\x59\x14\x52\xf9\x53\x0d\x8a\x07\x53\x10\x51\xeb\x59\x19\x51\x55\x4e\xa0\x51\x56\x4e\xb3\x88\x6e\x88\xa4\x4e\xb5\x81\x14\x88\xd2\x79\x80\x5b\x34\x88\x03\x7f\xb8\x51\xab\x51\xb1\x51\xbd\x51\xbc\x51\xc7\x51\x96\x51\xa2\x51\xa5\x8b\xa0\x8b\xa6\x8b\xa7\x8b\xaa\x8b\xb4\x8b\xb5\x8b\xb7\x8b\xc2\x8b\xc3\x8b\xcb\x8b\xcf\x8b\xce\x8b\xd2\x8b\xd3\x8b\xd4\x8b\xd6\x8b\xd8\x8b\xd9\x8b\xdc\x8b\xdf\x8b\xe0\x8b\xe4\x8b\xe8\x8b\xe9\x8b\xee\x8b\xf0\x8b\xf3\x8b\xf6\x8b\xf9\x8b\xfc\x8b\xff\x8c\x00\x8c\x02\x8c\x04\x8c\x07\x8c\x0c\x8c\x0f\x8c\x11\x8c\x12\x8c\x14\x8c\x15\x8c\x16\x8c\x19\x8c\x1b\x8c\x18\x8c\x1d\x8c\x1f\x8c\x20\x8c\x21\x8c\x25\x8c\x27\x8c\x2a\x8c\x2b\x8c\x2e\x8c\x2f\x8c\x32\x8c\x33\x8c\x35\x8c\x36\x53\x69\x53\x7a\x96\x1d\x96\x22\x96\x21\x96\x31\x96\x2a\x96\x3d\x96\x3c\x96\x42\x96\x49\x96\x54\x96\x5f\x96\x67\x96\x6c\x96\x72\x96\x74\x96\x88\x96\x8d\x96\x97\x96\xb0\x90\x97\x90\x9b\x90\x9d\x90\x99\x90\xac\x90\xa1\x90\xb4\x90\xb3\x90\xb6\x90\xba\x00\x00\x00\x00", /* 5e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xb8\x90\xb0\x90\xcf\x90\xc5\x90\xbe\x90\xd0\x90\xc4\x90\xc7\x90\xd3\x90\xe6\x90\xe2\x90\xdc\x90\xd7\x90\xdb\x90\xeb\x90\xef\x90\xfe\x91\x04\x91\x22\x91\x1e\x91\x23\x91\x31\x91\x2f\x91\x39\x91\x43\x91\x46\x52\x0d\x59\x42\x52\xa2\x52\xac\x52\xad\x52\xbe\x54\xff\x52\xd0\x52\xd6\x52\xf0\x53\xdf\x71\xee\x77\xcd\x5e\xf4\x51\xf5\x51\xfc\x9b\x2f\x53\xb6\x5f\x01\x75\x5a\x5d\xef\x57\x4c\x57\xa9\x57\xa1\x58\x7e\x58\xbc\x58\xc5\x58\xd1\x57\x29\x57\x2c\x57\x2a\x57\x33\x57\x39\x57\x2e\x57\x2f\x57\x5c\x57\x3b", /* 5e80 */ "\x00\x00\x57\x42\x57\x69\x57\x85\x57\x6b\x57\x86\x57\x7c\x57\x7b\x57\x68\x57\x6d\x57\x76\x57\x73\x57\xad\x57\xa4\x57\x8c\x57\xb2\x57\xcf\x57\xa7\x57\xb4\x57\x93\x57\xa0\x57\xd5\x57\xd8\x57\xda\x57\xd9\x57\xd2\x57\xb8\x57\xf4\x57\xef\x57\xf8\x57\xe4\x57\xdd\x58\x0b\x58\x0d\x57\xfd\x57\xed\x58\x00\x58\x1e\x58\x19\x58\x44\x58\x20\x58\x65\x58\x6c\x58\x81\x58\x89\x58\x9a\x58\x80\x99\xa8\x9f\x19\x61\xff\x82\x79\x82\x7d\x82\x7f\x82\x8f\x82\x8a\x82\xa8\x82\x84\x82\x8e\x82\x91\x82\x97\x82\x99\x82\xab\x82\xb8\x82\xbe\x82\xb0\x82\xc8\x82\xca\x82\xe3\x82\x98\x82\xb7\x82\xae\x82\xcb\x82\xcc\x82\xc1\x82\xa9\x82\xb4\x82\xa1\x82\xaa\x82\x9f\x82\xc4\x82\xce\x82\xa4\x82\xe1\x83\x09\x82\xf7\x82\xe4\x83\x0f\x83\x07\x82\xdc\x82\xf4\x82\xd2\x82\xd8\x83\x0c\x82\xfb\x82\xd3\x83\x11\x83\x1a\x83\x06\x83\x14\x83\x15\x82\xe0\x82\xd5\x83\x1c\x83\x51\x83\x5b\x83\x5c\x83\x08\x83\x92\x83\x3c\x83\x34\x83\x31\x83\x9b\x83\x5e\x83\x2f\x83\x4f\x83\x47\x83\x43\x83\x5f\x83\x40\x83\x17\x83\x60\x83\x2d\x83\x3a\x83\x33\x83\x66\x83\x65\x00\x00\x00\x00", /* 5f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x68\x83\x1b\x83\x69\x83\x6c\x83\x6a\x83\x6d\x83\x6e\x83\xb0\x83\x78\x83\xb3\x83\xb4\x83\xa0\x83\xaa\x83\x93\x83\x9c\x83\x85\x83\x7c\x83\xb6\x83\xa9\x83\x7d\x83\xb8\x83\x7b\x83\x98\x83\x9e\x83\xa8\x83\xba\x83\xbc\x83\xc1\x84\x01\x83\xe5\x83\xd8\x58\x07\x84\x18\x84\x0b\x83\xdd\x83\xfd\x83\xd6\x84\x1c\x84\x38\x84\x11\x84\x06\x83\xd4\x83\xdf\x84\x0f\x84\x03\x83\xf8\x83\xf9\x83\xea\x83\xc5\x83\xc0\x84\x26\x83\xf0\x83\xe1\x84\x5c\x84\x51\x84\x5a\x84\x59\x84\x73\x84\x87\x84\x88\x84\x7a\x84\x89\x84\x78", /* 5f80 */ "\x00\x00\x84\x3c\x84\x46\x84\x69\x84\x76\x84\x8c\x84\x8e\x84\x31\x84\x6d\x84\xc1\x84\xcd\x84\xd0\x84\xe6\x84\xbd\x84\xd3\x84\xca\x84\xbf\x84\xba\x84\xe0\x84\xa1\x84\xb9\x84\xb4\x84\x97\x84\xe5\x84\xe3\x85\x0c\x75\x0d\x85\x38\x84\xf0\x85\x39\x85\x1f\x85\x3a\x85\x56\x85\x3b\x84\xff\x84\xfc\x85\x59\x85\x48\x85\x68\x85\x64\x85\x5e\x85\x7a\x77\xa2\x85\x43\x85\x72\x85\x7b\x85\xa4\x85\xa8\x85\x87\x85\x8f\x85\x79\x85\xae\x85\x9c\x85\x85\x85\xb9\x85\xb7\x85\xb0\x85\xd3\x85\xc1\x85\xdc\x85\xff\x86\x27\x86\x05\x86\x29\x86\x16\x86\x3c\x5e\xfe\x5f\x08\x59\x3c\x59\x41\x80\x37\x59\x55\x59\x5a\x59\x58\x53\x0f\x5c\x22\x5c\x25\x5c\x2c\x5c\x34\x62\x4c\x62\x6a\x62\x9f\x62\xbb\x62\xca\x62\xda\x62\xd7\x62\xee\x63\x22\x62\xf6\x63\x39\x63\x4b\x63\x43\x63\xad\x63\xf6\x63\x71\x63\x7a\x63\x8e\x63\xb4\x63\x6d\x63\xac\x63\x8a\x63\x69\x63\xae\x63\xbc\x63\xf2\x63\xf8\x63\xe0\x63\xff\x63\xc4\x63\xde\x63\xce\x64\x52\x63\xc6\x63\xbe\x64\x45\x64\x41\x64\x0b\x64\x1b\x64\x20\x64\x0c\x64\x26\x64\x21\x64\x5e\x64\x84\x64\x6d\x64\x96\x00\x00\x00\x00", /* 6000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7a\x64\xb7\x64\xb8\x64\x99\x64\xba\x64\xc0\x64\xd0\x64\xd7\x64\xe4\x64\xe2\x65\x09\x65\x25\x65\x2e\x5f\x0b\x5f\xd2\x75\x19\x5f\x11\x53\x5f\x53\xf1\x53\xfd\x53\xe9\x53\xe8\x53\xfb\x54\x12\x54\x16\x54\x06\x54\x4b\x54\x52\x54\x53\x54\x54\x54\x56\x54\x43\x54\x21\x54\x57\x54\x59\x54\x23\x54\x32\x54\x82\x54\x94\x54\x77\x54\x71\x54\x64\x54\x9a\x54\x9b\x54\x84\x54\x76\x54\x66\x54\x9d\x54\xd0\x54\xad\x54\xc2\x54\xb4\x54\xd2\x54\xa7\x54\xa6\x54\xd3\x54\xd4\x54\x72\x54\xa3\x54\xd5\x54\xbb\x54\xbf\x54\xcc", /* 6080 */ "\x00\x00\x54\xd9\x54\xda\x54\xdc\x54\xa9\x54\xaa\x54\xa4\x54\xdd\x54\xcf\x54\xde\x55\x1b\x54\xe7\x55\x20\x54\xfd\x55\x14\x54\xf3\x55\x22\x55\x23\x55\x0f\x55\x11\x55\x27\x55\x2a\x55\x67\x55\x8f\x55\xb5\x55\x49\x55\x6d\x55\x41\x55\x55\x55\x3f\x55\x50\x55\x3c\x55\x37\x55\x56\x55\x75\x55\x76\x55\x77\x55\x33\x55\x30\x55\x5c\x55\x8b\x55\xd2\x55\x83\x55\xb1\x55\xb9\x55\x88\x55\x81\x55\x9f\x55\x7e\x55\xd6\x55\x91\x55\x7b\x55\xdf\x55\xbd\x55\xbe\x55\x94\x55\x99\x55\xea\x55\xf7\x55\xc9\x56\x1f\x55\xd1\x55\xeb\x55\xec\x55\xd4\x55\xe6\x55\xdd\x55\xc4\x55\xef\x55\xe5\x55\xf2\x55\xf3\x55\xcc\x55\xcd\x55\xe8\x55\xf5\x55\xe4\x8f\x94\x56\x1e\x56\x08\x56\x0c\x56\x01\x56\x24\x56\x23\x55\xfe\x56\x00\x56\x27\x56\x2d\x56\x58\x56\x39\x56\x57\x56\x2c\x56\x4d\x56\x62\x56\x59\x56\x5c\x56\x4c\x56\x54\x56\x86\x56\x64\x56\x71\x56\x6b\x56\x7b\x56\x7c\x56\x85\x56\x93\x56\xaf\x56\xd4\x56\xd7\x56\xdd\x56\xe1\x56\xf5\x56\xeb\x56\xf9\x56\xff\x57\x04\x57\x0a\x57\x09\x57\x1c\x5e\x0f\x5e\x19\x5e\x14\x5e\x11\x5e\x31\x5e\x3b\x5e\x3c\x00\x00\x00\x00", /* 6100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x37\x5e\x44\x5e\x54\x5e\x5b\x5e\x5e\x5e\x61\x5c\x8c\x5c\x7a\x5c\x8d\x5c\x90\x5c\x96\x5c\x88\x5c\x98\x5c\x99\x5c\x91\x5c\x9a\x5c\x9c\x5c\xb5\x5c\xa2\x5c\xbd\x5c\xac\x5c\xab\x5c\xb1\x5c\xa3\x5c\xc1\x5c\xb7\x5c\xc4\x5c\xd2\x5c\xe4\x5c\xcb\x5c\xe5\x5d\x02\x5d\x03\x5d\x27\x5d\x26\x5d\x2e\x5d\x24\x5d\x1e\x5d\x06\x5d\x1b\x5d\x58\x5d\x3e\x5d\x34\x5d\x3d\x5d\x6c\x5d\x5b\x5d\x6f\x5d\x5d\x5d\x6b\x5d\x4b\x5d\x4a\x5d\x69\x5d\x74\x5d\x82\x5d\x99\x5d\x9d\x8c\x73\x5d\xb7\x5d\xc5\x5f\x73\x5f\x77\x5f\x82\x5f\x87", /* 6180 */ "\x00\x00\x5f\x89\x5f\x8c\x5f\x95\x5f\x99\x5f\x9c\x5f\xa8\x5f\xad\x5f\xb5\x5f\xbc\x88\x62\x5f\x61\x72\xad\x72\xb0\x72\xb4\x72\xb7\x72\xb8\x72\xc3\x72\xc1\x72\xce\x72\xcd\x72\xd2\x72\xe8\x72\xef\x72\xe9\x72\xf2\x72\xf4\x72\xf7\x73\x01\x72\xf3\x73\x03\x72\xfa\x72\xfb\x73\x17\x73\x13\x73\x21\x73\x0a\x73\x1e\x73\x1d\x73\x15\x73\x22\x73\x39\x73\x25\x73\x2c\x73\x38\x73\x31\x73\x50\x73\x4d\x73\x57\x73\x60\x73\x6c\x73\x6f\x73\x7e\x82\x1b\x59\x25\x98\xe7\x59\x24\x59\x02\x99\x63\x99\x67\x99\x68\x99\x69\x99\x6a\x99\x6b\x99\x6c\x99\x74\x99\x77\x99\x7d\x99\x80\x99\x84\x99\x87\x99\x8a\x99\x8d\x99\x90\x99\x91\x99\x93\x99\x94\x99\x95\x5e\x80\x5e\x91\x5e\x8b\x5e\x96\x5e\xa5\x5e\xa0\x5e\xb9\x5e\xb5\x5e\xbe\x5e\xb3\x8d\x53\x5e\xd2\x5e\xd1\x5e\xdb\x5e\xe8\x5e\xea\x81\xba\x5f\xc4\x5f\xc9\x5f\xd6\x5f\xcf\x60\x03\x5f\xee\x60\x04\x5f\xe1\x5f\xe4\x5f\xfe\x60\x05\x60\x06\x5f\xea\x5f\xed\x5f\xf8\x60\x19\x60\x35\x60\x26\x60\x1b\x60\x0f\x60\x0d\x60\x29\x60\x2b\x60\x0a\x60\x3f\x60\x21\x60\x78\x60\x79\x60\x7b\x60\x7a\x60\x42\x00\x00\x00\x00", /* 6200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6a\x60\x7d\x60\x96\x60\x9a\x60\xad\x60\x9d\x60\x83\x60\x92\x60\x8c\x60\x9b\x60\xec\x60\xbb\x60\xb1\x60\xdd\x60\xd8\x60\xc6\x60\xda\x60\xb4\x61\x20\x61\x26\x61\x15\x61\x23\x60\xf4\x61\x00\x61\x0e\x61\x2b\x61\x4a\x61\x75\x61\xac\x61\x94\x61\xa7\x61\xb7\x61\xd4\x61\xf5\x5f\xdd\x96\xb3\x95\xe9\x95\xeb\x95\xf1\x95\xf3\x95\xf5\x95\xf6\x95\xfc\x95\xfe\x96\x03\x96\x04\x96\x06\x96\x08\x96\x0a\x96\x0b\x96\x0c\x96\x0d\x96\x0f\x96\x12\x96\x15\x96\x16\x96\x17\x96\x19\x96\x1a\x4e\x2c\x72\x3f\x62\x15\x6c\x35", /* 6280 */ "\x00\x00\x6c\x54\x6c\x5c\x6c\x4a\x6c\xa3\x6c\x85\x6c\x90\x6c\x94\x6c\x8c\x6c\x68\x6c\x69\x6c\x74\x6c\x76\x6c\x86\x6c\xa9\x6c\xd0\x6c\xd4\x6c\xad\x6c\xf7\x6c\xf8\x6c\xf1\x6c\xd7\x6c\xb2\x6c\xe0\x6c\xd6\x6c\xfa\x6c\xeb\x6c\xee\x6c\xb1\x6c\xd3\x6c\xef\x6c\xfe\x6d\x39\x6d\x27\x6d\x0c\x6d\x43\x6d\x48\x6d\x07\x6d\x04\x6d\x19\x6d\x0e\x6d\x2b\x6d\x4d\x6d\x2e\x6d\x35\x6d\x1a\x6d\x4f\x6d\x52\x6d\x54\x6d\x33\x6d\x91\x6d\x6f\x6d\x9e\x6d\xa0\x6d\x5e\x6d\x93\x6d\x94\x6d\x5c\x6d\x60\x6d\x7c\x6d\x63\x6e\x1a\x6d\xc7\x6d\xc5\x6d\xde\x6e\x0e\x6d\xbf\x6d\xe0\x6e\x11\x6d\xe6\x6d\xdd\x6d\xd9\x6e\x16\x6d\xab\x6e\x0c\x6d\xae\x6e\x2b\x6e\x6e\x6e\x4e\x6e\x6b\x6e\xb2\x6e\x5f\x6e\x86\x6e\x53\x6e\x54\x6e\x32\x6e\x25\x6e\x44\x6e\xdf\x6e\xb1\x6e\x98\x6e\xe0\x6f\x2d\x6e\xe2\x6e\xa5\x6e\xa7\x6e\xbd\x6e\xbb\x6e\xb7\x6e\xd7\x6e\xb4\x6e\xcf\x6e\x8f\x6e\xc2\x6e\x9f\x6f\x62\x6f\x46\x6f\x47\x6f\x24\x6f\x15\x6e\xf9\x6f\x2f\x6f\x36\x6f\x4b\x6f\x74\x6f\x2a\x6f\x09\x6f\x29\x6f\x89\x6f\x8d\x6f\x8c\x6f\x78\x6f\x72\x6f\x7c\x6f\x7a\x6f\xd1\x00\x00\x00\x00", /* 6300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xc9\x6f\xa7\x6f\xb9\x6f\xb6\x6f\xc2\x6f\xe1\x6f\xee\x6f\xde\x6f\xe0\x6f\xef\x70\x1a\x70\x23\x70\x1b\x70\x39\x70\x35\x70\x4f\x70\x5e\x5b\x80\x5b\x84\x5b\x95\x5b\x93\x5b\xa5\x5b\xb8\x75\x2f\x9a\x9e\x64\x34\x5b\xe4\x5b\xee\x89\x30\x5b\xf0\x8e\x47\x8b\x07\x8f\xb6\x8f\xd3\x8f\xd5\x8f\xe5\x8f\xee\x8f\xe4\x8f\xe9\x8f\xe6\x8f\xf3\x8f\xe8\x90\x05\x90\x04\x90\x0b\x90\x26\x90\x11\x90\x0d\x90\x16\x90\x21\x90\x35\x90\x36\x90\x2d\x90\x2f\x90\x44\x90\x51\x90\x52\x90\x50\x90\x68\x90\x58\x90\x62\x90\x5b\x66\xb9", /* 6380 */ "\x00\x00\x90\x74\x90\x7d\x90\x82\x90\x88\x90\x83\x90\x8b\x5f\x50\x5f\x57\x5f\x56\x5f\x58\x5c\x3b\x54\xab\x5c\x50\x5c\x59\x5b\x71\x5c\x63\x5c\x66\x7f\xbc\x5f\x2a\x5f\x29\x5f\x2d\x82\x74\x5f\x3c\x9b\x3b\x5c\x6e\x59\x81\x59\x83\x59\x8d\x59\xa9\x59\xaa\x59\xa3\x59\x97\x59\xca\x59\xab\x59\x9e\x59\xa4\x59\xd2\x59\xb2\x59\xaf\x59\xd7\x59\xbe\x5a\x05\x5a\x06\x59\xdd\x5a\x08\x59\xe3\x59\xd8\x59\xf9\x5a\x0c\x5a\x09\x5a\x32\x5a\x34\x5a\x11\x5a\x23\x5a\x13\x5a\x40\x5a\x67\x5a\x4a\x5a\x55\x5a\x3c\x5a\x62\x5a\x75\x80\xec\x5a\xaa\x5a\x9b\x5a\x77\x5a\x7a\x5a\xbe\x5a\xeb\x5a\xb2\x5a\xd2\x5a\xd4\x5a\xb8\x5a\xe0\x5a\xe3\x5a\xf1\x5a\xd6\x5a\xe6\x5a\xd8\x5a\xdc\x5b\x09\x5b\x17\x5b\x16\x5b\x32\x5b\x37\x5b\x40\x5c\x15\x5c\x1c\x5b\x5a\x5b\x65\x5b\x73\x5b\x51\x5b\x53\x5b\x62\x9a\x75\x9a\x77\x9a\x78\x9a\x7a\x9a\x7f\x9a\x7d\x9a\x80\x9a\x81\x9a\x85\x9a\x88\x9a\x8a\x9a\x90\x9a\x92\x9a\x93\x9a\x96\x9a\x98\x9a\x9b\x9a\x9c\x9a\x9d\x9a\x9f\x9a\xa0\x9a\xa2\x9a\xa3\x9a\xa5\x9a\xa7\x7e\x9f\x7e\xa1\x7e\xa3\x7e\xa5\x7e\xa8\x7e\xa9\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xad\x7e\xb0\x7e\xbe\x7e\xc0\x7e\xc1\x7e\xc2\x7e\xc9\x7e\xcb\x7e\xcc\x7e\xd0\x7e\xd4\x7e\xd7\x7e\xdb\x7e\xe0\x7e\xe1\x7e\xe8\x7e\xeb\x7e\xee\x7e\xef\x7e\xf1\x7e\xf2\x7f\x0d\x7e\xf6\x7e\xfa\x7e\xfb\x7e\xfe\x7f\x01\x7f\x02\x7f\x03\x7f\x07\x7f\x08\x7f\x0b\x7f\x0c\x7f\x0f\x7f\x11\x7f\x12\x7f\x17\x7f\x19\x7f\x1c\x7f\x1b\x7f\x1f\x7f\x21\x7f\x22\x7f\x23\x7f\x24\x7f\x25\x7f\x26\x7f\x27\x7f\x2a\x7f\x2b\x7f\x2c\x7f\x2d\x7f\x2f\x7f\x30\x7f\x31\x7f\x32\x7f\x33\x7f\x35\x5e\x7a\x75\x7f\x5d\xdb\x75\x3e\x90\x95", /* 6480 */ "\x00\x00\x73\x8e\x73\x91\x73\xae\x73\xa2\x73\x9f\x73\xcf\x73\xc2\x73\xd1\x73\xb7\x73\xb3\x73\xc0\x73\xc9\x73\xc8\x73\xe5\x73\xd9\x98\x7c\x74\x0a\x73\xe9\x73\xe7\x73\xde\x73\xba\x73\xf2\x74\x0f\x74\x2a\x74\x5b\x74\x26\x74\x25\x74\x28\x74\x30\x74\x2e\x74\x2c\x74\x1b\x74\x1a\x74\x41\x74\x5c\x74\x57\x74\x55\x74\x59\x74\x77\x74\x6d\x74\x7e\x74\x9c\x74\x8e\x74\x80\x74\x81\x74\x87\x74\x8b\x74\x9e\x74\xa8\x74\xa9\x74\x90\x74\xa7\x74\xd2\x74\xba\x97\xea\x97\xeb\x97\xec\x67\x4c\x67\x53\x67\x5e\x67\x48\x67\x69\x67\xa5\x67\x87\x67\x6a\x67\x73\x67\x98\x67\xa7\x67\x75\x67\xa8\x67\x9e\x67\xad\x67\x8b\x67\x77\x67\x7c\x67\xf0\x68\x09\x67\xd8\x68\x0a\x67\xe9\x67\xb0\x68\x0c\x67\xd9\x67\xb5\x67\xda\x67\xb3\x67\xdd\x68\x00\x67\xc3\x67\xb8\x67\xe2\x68\x0e\x67\xc1\x67\xfd\x68\x32\x68\x33\x68\x60\x68\x61\x68\x4e\x68\x62\x68\x44\x68\x64\x68\x83\x68\x1d\x68\x55\x68\x66\x68\x41\x68\x67\x68\x40\x68\x3e\x68\x4a\x68\x49\x68\x29\x68\xb5\x68\x8f\x68\x74\x68\x77\x68\x93\x68\x6b\x68\xc2\x69\x6e\x68\xfc\x69\x1f\x69\x20\x68\xf9\x00\x00\x00\x00", /* 6500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x24\x68\xf0\x69\x0b\x69\x01\x69\x57\x68\xe3\x69\x10\x69\x71\x69\x39\x69\x60\x69\x42\x69\x5d\x69\x84\x69\x6b\x69\x80\x69\x98\x69\x78\x69\x34\x69\xcc\x69\x87\x69\x88\x69\xce\x69\x89\x69\x66\x69\x63\x69\x79\x69\x9b\x69\xa7\x69\xbb\x69\xab\x69\xad\x69\xd4\x69\xb1\x69\xc1\x69\xca\x69\xdf\x69\x95\x69\xe0\x69\x8d\x69\xff\x6a\x2f\x69\xed\x6a\x17\x6a\x18\x6a\x65\x69\xf2\x6a\x44\x6a\x3e\x6a\xa0\x6a\x50\x6a\x5b\x6a\x35\x6a\x8e\x6a\x79\x6a\x3d\x6a\x28\x6a\x58\x6a\x7c\x6a\x91\x6a\x90\x6a\xa9\x6a\x97\x6a\xab", /* 6580 */ "\x00\x00\x73\x37\x73\x52\x6b\x81\x6b\x82\x6b\x87\x6b\x84\x6b\x92\x6b\x93\x6b\x8d\x6b\x9a\x6b\x9b\x6b\xa1\x6b\xaa\x8f\x6b\x8f\x6d\x8f\x71\x8f\x72\x8f\x73\x8f\x75\x8f\x76\x8f\x78\x8f\x77\x8f\x79\x8f\x7a\x8f\x7c\x8f\x7e\x8f\x81\x8f\x82\x8f\x84\x8f\x87\x8f\x8b\x8f\x8d\x8f\x8e\x8f\x8f\x8f\x98\x8f\x9a\x8e\xce\x62\x0b\x62\x17\x62\x1b\x62\x1f\x62\x22\x62\x21\x62\x25\x62\x24\x62\x2c\x81\xe7\x74\xef\x74\xf4\x74\xff\x75\x0f\x75\x11\x75\x13\x65\x34\x65\xee\x65\xef\x65\xf0\x66\x0a\x66\x19\x67\x72\x66\x03\x66\x15\x66\x00\x70\x85\x66\xf7\x66\x1d\x66\x34\x66\x31\x66\x36\x66\x35\x80\x06\x66\x5f\x66\x54\x66\x41\x66\x4f\x66\x56\x66\x61\x66\x57\x66\x77\x66\x84\x66\x8c\x66\xa7\x66\x9d\x66\xbe\x66\xdb\x66\xdc\x66\xe6\x66\xe9\x8d\x32\x8d\x33\x8d\x36\x8d\x3b\x8d\x3d\x8d\x40\x8d\x45\x8d\x46\x8d\x48\x8d\x49\x8d\x47\x8d\x4d\x8d\x55\x8d\x59\x89\xc7\x89\xca\x89\xcb\x89\xcc\x89\xce\x89\xcf\x89\xd0\x89\xd1\x72\x6e\x72\x9f\x72\x5d\x72\x66\x72\x6f\x72\x7e\x72\x7f\x72\x84\x72\x8b\x72\x8d\x72\x8f\x72\x92\x63\x08\x63\x32\x63\xb0\x00\x00\x00\x00", /* 6600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x3f\x64\xd8\x80\x04\x6b\xea\x6b\xf3\x6b\xfd\x6b\xf5\x6b\xf9\x6c\x05\x6c\x07\x6c\x06\x6c\x0d\x6c\x15\x6c\x18\x6c\x19\x6c\x1a\x6c\x21\x6c\x29\x6c\x24\x6c\x2a\x6c\x32\x65\x35\x65\x55\x65\x6b\x72\x4d\x72\x52\x72\x56\x72\x30\x86\x62\x52\x16\x80\x9f\x80\x9c\x80\x93\x80\xbc\x67\x0a\x80\xbd\x80\xb1\x80\xab\x80\xad\x80\xb4\x80\xb7\x80\xe7\x80\xe8\x80\xe9\x80\xea\x80\xdb\x80\xc2\x80\xc4\x80\xd9\x80\xcd\x80\xd7\x67\x10\x80\xdd\x80\xeb\x80\xf1\x80\xf4\x80\xed\x81\x0d\x81\x0e\x80\xf2\x80\xfc\x67\x15\x81\x12", /* 6680 */ "\x00\x00\x8c\x5a\x81\x36\x81\x1e\x81\x2c\x81\x18\x81\x32\x81\x48\x81\x4c\x81\x53\x81\x74\x81\x59\x81\x5a\x81\x71\x81\x60\x81\x69\x81\x7c\x81\x7d\x81\x6d\x81\x67\x58\x4d\x5a\xb5\x81\x88\x81\x82\x81\x91\x6e\xd5\x81\xa3\x81\xaa\x81\xcc\x67\x26\x81\xca\x81\xbb\x81\xc1\x81\xa6\x6b\x24\x6b\x37\x6b\x39\x6b\x43\x6b\x46\x6b\x59\x98\xd1\x98\xd2\x98\xd3\x98\xd5\x98\xd9\x98\xda\x6b\xb3\x5f\x40\x6b\xc2\x89\xf3\x65\x90\x9f\x51\x65\x93\x65\xbc\x65\xc6\x65\xc4\x65\xc3\x65\xcc\x65\xce\x65\xd2\x65\xd6\x70\x80\x70\x9c\x70\x96\x70\x9d\x70\xbb\x70\xc0\x70\xb7\x70\xab\x70\xb1\x70\xe8\x70\xca\x71\x10\x71\x13\x71\x16\x71\x2f\x71\x31\x71\x73\x71\x5c\x71\x68\x71\x45\x71\x72\x71\x4a\x71\x78\x71\x7a\x71\x98\x71\xb3\x71\xb5\x71\xa8\x71\xa0\x71\xe0\x71\xd4\x71\xe7\x71\xf9\x72\x1d\x72\x28\x70\x6c\x71\x18\x71\x66\x71\xb9\x62\x3e\x62\x3d\x62\x43\x62\x48\x62\x49\x79\x3b\x79\x40\x79\x46\x79\x49\x79\x5b\x79\x5c\x79\x53\x79\x5a\x79\x62\x79\x57\x79\x60\x79\x6f\x79\x67\x79\x7a\x79\x85\x79\x8a\x79\x9a\x79\xa7\x79\xb3\x5f\xd1\x5f\xd0\x00\x00\x00\x00", /* 6700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x3c\x60\x5d\x60\x5a\x60\x67\x60\x41\x60\x59\x60\x63\x60\xab\x61\x06\x61\x0d\x61\x5d\x61\xa9\x61\x9d\x61\xcb\x61\xd1\x62\x06\x80\x80\x80\x7f\x6c\x93\x6c\xf6\x6d\xfc\x77\xf6\x77\xf8\x78\x00\x78\x09\x78\x17\x78\x18\x78\x11\x65\xab\x78\x2d\x78\x1c\x78\x1d\x78\x39\x78\x3a\x78\x3b\x78\x1f\x78\x3c\x78\x25\x78\x2c\x78\x23\x78\x29\x78\x4e\x78\x6d\x78\x56\x78\x57\x78\x26\x78\x50\x78\x47\x78\x4c\x78\x6a\x78\x9b\x78\x93\x78\x9a\x78\x87\x78\x9c\x78\xa1\x78\xa3\x78\xb2\x78\xb9\x78\xa5\x78\xd4\x78\xd9\x78\xc9", /* 6780 */ "\x00\x00\x78\xec\x78\xf2\x79\x05\x78\xf4\x79\x13\x79\x24\x79\x1e\x79\x34\x9f\x9b\x9e\xf9\x9e\xfb\x9e\xfc\x76\xf1\x77\x04\x77\x0d\x76\xf9\x77\x07\x77\x08\x77\x1a\x77\x22\x77\x19\x77\x2d\x77\x26\x77\x35\x77\x38\x77\x50\x77\x51\x77\x47\x77\x43\x77\x5a\x77\x68\x77\x62\x77\x65\x77\x7f\x77\x8d\x77\x7d\x77\x80\x77\x8c\x77\x91\x77\x9f\x77\xa0\x77\xb0\x77\xb5\x77\xbd\x75\x3a\x75\x40\x75\x4e\x75\x4b\x75\x48\x75\x5b\x75\x72\x75\x79\x75\x83\x7f\x58\x7f\x61\x7f\x5f\x8a\x48\x7f\x68\x7f\x74\x7f\x71\x7f\x79\x7f\x81\x7f\x7e\x76\xcd\x76\xe5\x88\x32\x94\x85\x94\x86\x94\x87\x94\x8b\x94\x8a\x94\x8c\x94\x8d\x94\x8f\x94\x90\x94\x94\x94\x97\x94\x95\x94\x9a\x94\x9b\x94\x9c\x94\xa3\x94\xa4\x94\xab\x94\xaa\x94\xad\x94\xac\x94\xaf\x94\xb0\x94\xb2\x94\xb4\x94\xb6\x94\xb7\x94\xb8\x94\xb9\x94\xba\x94\xbc\x94\xbd\x94\xbf\x94\xc4\x94\xc8\x94\xc9\x94\xca\x94\xcb\x94\xcc\x94\xcd\x94\xce\x94\xd0\x94\xd1\x94\xd2\x94\xd5\x94\xd6\x94\xd7\x94\xd9\x94\xd8\x94\xdb\x94\xde\x94\xdf\x94\xe0\x94\xe2\x94\xe4\x94\xe5\x94\xe7\x94\xe8\x94\xea\x00\x00\x00\x00", /* 6800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\xe9\x94\xeb\x94\xee\x94\xef\x94\xf3\x94\xf4\x94\xf5\x94\xf7\x94\xf9\x94\xfc\x94\xfd\x94\xff\x95\x03\x95\x02\x95\x06\x95\x07\x95\x09\x95\x0a\x95\x0d\x95\x0e\x95\x0f\x95\x12\x95\x13\x95\x14\x95\x15\x95\x16\x95\x18\x95\x1b\x95\x1d\x95\x1e\x95\x1f\x95\x22\x95\x2a\x95\x2b\x95\x29\x95\x2c\x95\x31\x95\x32\x95\x34\x95\x36\x95\x37\x95\x38\x95\x3c\x95\x3e\x95\x3f\x95\x42\x95\x35\x95\x44\x95\x45\x95\x46\x95\x49\x95\x4c\x95\x4e\x95\x4f\x95\x52\x95\x53\x95\x54\x95\x56\x95\x57\x95\x58\x95\x59\x95\x5b\x95\x5e", /* 6880 */ "\x00\x00\x95\x5f\x95\x5d\x95\x61\x95\x62\x95\x64\x95\x65\x95\x66\x95\x67\x95\x68\x95\x69\x95\x6a\x95\x6b\x95\x6c\x95\x6f\x95\x71\x95\x72\x95\x73\x95\x3a\x77\xe7\x77\xec\x96\xc9\x79\xd5\x79\xed\x79\xe3\x79\xeb\x7a\x06\x5d\x47\x7a\x03\x7a\x02\x7a\x1e\x7a\x14\x7a\x39\x7a\x37\x7a\x51\x9e\xcf\x99\xa5\x7a\x70\x76\x88\x76\x8e\x76\x93\x76\x99\x76\xa4\x74\xde\x74\xe0\x75\x2c\x9e\x20\x9e\x22\x9e\x28\x9e\x29\x9e\x2a\x9e\x2b\x9e\x2c\x9e\x32\x9e\x31\x9e\x36\x9e\x38\x9e\x37\x9e\x39\x9e\x3a\x9e\x3e\x9e\x41\x9e\x42\x9e\x44\x9e\x46\x9e\x47\x9e\x48\x9e\x49\x9e\x4b\x9e\x4c\x9e\x4e\x9e\x51\x9e\x55\x9e\x57\x9e\x5a\x9e\x5b\x9e\x5c\x9e\x5e\x9e\x63\x9e\x66\x9e\x67\x9e\x68\x9e\x69\x9e\x6a\x9e\x6b\x9e\x6c\x9e\x71\x9e\x6d\x9e\x73\x75\x92\x75\x94\x75\x96\x75\xa0\x75\x9d\x75\xac\x75\xa3\x75\xb3\x75\xb4\x75\xb8\x75\xc4\x75\xb1\x75\xb0\x75\xc3\x75\xc2\x75\xd6\x75\xcd\x75\xe3\x75\xe8\x75\xe6\x75\xe4\x75\xeb\x75\xe7\x76\x03\x75\xf1\x75\xfc\x75\xff\x76\x10\x76\x00\x76\x05\x76\x0c\x76\x17\x76\x0a\x76\x25\x76\x18\x76\x15\x76\x19\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x1b\x76\x3c\x76\x22\x76\x20\x76\x40\x76\x2d\x76\x30\x76\x3f\x76\x35\x76\x43\x76\x3e\x76\x33\x76\x4d\x76\x5e\x76\x54\x76\x5c\x76\x56\x76\x6b\x76\x6f\x7f\xca\x7a\xe6\x7a\x78\x7a\x79\x7a\x80\x7a\x86\x7a\x88\x7a\x95\x7a\xa6\x7a\xa0\x7a\xac\x7a\xa8\x7a\xad\x7a\xb3\x88\x64\x88\x69\x88\x72\x88\x7d\x88\x7f\x88\x82\x88\xa2\x88\xc6\x88\xb7\x88\xbc\x88\xc9\x88\xe2\x88\xce\x88\xe3\x88\xe5\x88\xf1\x89\x1a\x88\xfc\x88\xe8\x88\xfe\x88\xf0\x89\x21\x89\x19\x89\x13\x89\x1b\x89\x0a\x89\x34\x89\x2b\x89\x36\x89\x41", /* 6980 */ "\x00\x00\x89\x66\x89\x7b\x75\x8b\x80\xe5\x76\xb2\x76\xb4\x77\xdc\x80\x12\x80\x14\x80\x16\x80\x1c\x80\x20\x80\x22\x80\x25\x80\x26\x80\x27\x80\x29\x80\x28\x80\x31\x80\x0b\x80\x35\x80\x43\x80\x46\x80\x4d\x80\x52\x80\x69\x80\x71\x89\x83\x98\x78\x98\x80\x98\x83\x98\x89\x98\x8c\x98\x8d\x98\x8f\x98\x94\x98\x9a\x98\x9b\x98\x9e\x98\x9f\x98\xa1\x98\xa2\x98\xa5\x98\xa6\x86\x4d\x86\x54\x86\x6c\x86\x6e\x86\x7f\x86\x7a\x86\x7c\x86\x7b\x86\xa8\x86\x8d\x86\x8b\x86\xac\x86\x9d\x86\xa7\x86\xa3\x86\xaa\x86\x93\x86\xa9\x86\xb6\x86\xc4\x86\xb5\x86\xce\x86\xb0\x86\xba\x86\xb1\x86\xaf\x86\xc9\x86\xcf\x86\xb4\x86\xe9\x86\xf1\x86\xf2\x86\xed\x86\xf3\x86\xd0\x87\x13\x86\xde\x86\xf4\x86\xdf\x86\xd8\x86\xd1\x87\x03\x87\x07\x86\xf8\x87\x08\x87\x0a\x87\x0d\x87\x09\x87\x23\x87\x3b\x87\x1e\x87\x25\x87\x2e\x87\x1a\x87\x3e\x87\x48\x87\x34\x87\x31\x87\x29\x87\x37\x87\x3f\x87\x82\x87\x22\x87\x7d\x87\x7e\x87\x7b\x87\x60\x87\x70\x87\x4c\x87\x6e\x87\x8b\x87\x53\x87\x63\x87\x7c\x87\x64\x87\x59\x87\x65\x87\x93\x87\xaf\x87\xa8\x87\xd2\x00\x00\x00\x00", /* 6a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\xc6\x87\x88\x87\x85\x87\xad\x87\x97\x87\x83\x87\xab\x87\xe5\x87\xac\x87\xb5\x87\xb3\x87\xcb\x87\xd3\x87\xbd\x87\xd1\x87\xc0\x87\xca\x87\xdb\x87\xea\x87\xe0\x87\xee\x88\x16\x88\x13\x87\xfe\x88\x0a\x88\x1b\x88\x21\x88\x39\x88\x3c\x7f\x36\x7f\x42\x7f\x44\x7f\x45\x82\x10\x7a\xfa\x7a\xfd\x7b\x08\x7b\x03\x7b\x04\x7b\x15\x7b\x0a\x7b\x2b\x7b\x0f\x7b\x47\x7b\x38\x7b\x2a\x7b\x19\x7b\x2e\x7b\x31\x7b\x20\x7b\x25\x7b\x24\x7b\x33\x7b\x3e\x7b\x1e\x7b\x58\x7b\x5a\x7b\x45\x7b\x75\x7b\x4c\x7b\x5d\x7b\x60\x7b\x6e", /* 6a80 */ "\x00\x00\x7b\x7b\x7b\x62\x7b\x72\x7b\x71\x7b\x90\x7b\xa6\x7b\xa7\x7b\xb8\x7b\xac\x7b\x9d\x7b\xa8\x7b\x85\x7b\xaa\x7b\x9c\x7b\xa2\x7b\xab\x7b\xb4\x7b\xd1\x7b\xc1\x7b\xcc\x7b\xdd\x7b\xda\x7b\xe5\x7b\xe6\x7b\xea\x7c\x0c\x7b\xfe\x7b\xfc\x7c\x0f\x7c\x16\x7c\x0b\x7c\x1f\x7c\x2a\x7c\x26\x7c\x38\x7c\x41\x7c\x40\x81\xfe\x82\x01\x82\x02\x82\x04\x81\xec\x88\x44\x82\x21\x82\x22\x82\x23\x82\x2d\x82\x2f\x82\x28\x82\x2b\x82\x38\x82\x3b\x82\x33\x82\x34\x82\x3e\x82\x44\x82\x49\x82\x4b\x82\x4f\x82\x5a\x82\x5f\x82\x68\x88\x7e\x88\x85\x88\x88\x88\xd8\x88\xdf\x89\x5e\x7f\x9d\x7f\x9f\x7f\xa7\x7f\xaf\x7f\xb0\x7f\xb2\x7c\x7c\x65\x49\x7c\x91\x7c\x9d\x7c\x9c\x7c\x9e\x7c\xa2\x7c\xb2\x7c\xbc\x7c\xbd\x7c\xc1\x7c\xc7\x7c\xcc\x7c\xcd\x7c\xc8\x7c\xc5\x7c\xd7\x7c\xe8\x82\x6e\x66\xa8\x7f\xbf\x7f\xce\x7f\xd5\x7f\xe5\x7f\xe1\x7f\xe6\x7f\xe9\x7f\xee\x7f\xf3\x7c\xf8\x7d\x77\x7d\xa6\x7d\xae\x7e\x47\x7e\x9b\x9e\xb8\x9e\xb4\x8d\x73\x8d\x84\x8d\x94\x8d\x91\x8d\xb1\x8d\x67\x8d\x6d\x8c\x47\x8c\x49\x91\x4a\x91\x50\x91\x4e\x91\x4f\x91\x64\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x62\x91\x61\x91\x70\x91\x69\x91\x6f\x91\x7d\x91\x7e\x91\x72\x91\x74\x91\x79\x91\x8c\x91\x85\x91\x90\x91\x8d\x91\x91\x91\xa2\x91\xa3\x91\xaa\x91\xad\x91\xae\x91\xaf\x91\xb5\x91\xb4\x91\xba\x8c\x55\x9e\x7e\x8d\xb8\x8d\xeb\x8e\x05\x8e\x59\x8e\x69\x8d\xb5\x8d\xbf\x8d\xbc\x8d\xba\x8d\xc4\x8d\xd6\x8d\xd7\x8d\xda\x8d\xde\x8d\xce\x8d\xcf\x8d\xdb\x8d\xc6\x8d\xec\x8d\xf7\x8d\xf8\x8d\xe3\x8d\xf9\x8d\xfb\x8d\xe4\x8e\x09\x8d\xfd\x8e\x14\x8e\x1d\x8e\x1f\x8e\x2c\x8e\x2e\x8e\x23\x8e\x2f\x8e\x3a\x8e\x40\x8e\x39", /* 6b80 */ "\x00\x00\x8e\x35\x8e\x3d\x8e\x31\x8e\x49\x8e\x41\x8e\x42\x8e\x51\x8e\x52\x8e\x4a\x8e\x70\x8e\x76\x8e\x7c\x8e\x6f\x8e\x74\x8e\x85\x8e\x8f\x8e\x94\x8e\x90\x8e\x9c\x8e\x9e\x8c\x78\x8c\x82\x8c\x8a\x8c\x85\x8c\x98\x8c\x94\x65\x9b\x89\xd6\x89\xde\x89\xda\x89\xdc\x89\xe5\x89\xeb\x89\xef\x8a\x3e\x8b\x26\x97\x53\x96\xe9\x96\xf3\x96\xef\x97\x06\x97\x01\x97\x08\x97\x0f\x97\x0e\x97\x2a\x97\x2d\x97\x30\x97\x3e\x9f\x80\x9f\x83\x9f\x85\x9f\x86\x9f\x87\x9f\x88\x9f\x89\x9f\x8a\x9f\x8c\x9e\xfe\x9f\x0b\x9f\x0d\x96\xb9\x96\xbc\x96\xbd\x96\xce\x96\xd2\x77\xbf\x96\xe0\x92\x8e\x92\xae\x92\xc8\x93\x3e\x93\x6a\x93\xca\x93\x8f\x94\x3e\x94\x6b\x9c\x7f\x9c\x82\x9c\x85\x9c\x86\x9c\x87\x9c\x88\x7a\x23\x9c\x8b\x9c\x8e\x9c\x90\x9c\x91\x9c\x92\x9c\x94\x9c\x95\x9c\x9a\x9c\x9b\x9c\x9e\x9c\x9f\x9c\xa0\x9c\xa1\x9c\xa2\x9c\xa3\x9c\xa5\x9c\xa6\x9c\xa7\x9c\xa8\x9c\xa9\x9c\xab\x9c\xad\x9c\xae\x9c\xb0\x9c\xb1\x9c\xb2\x9c\xb3\x9c\xb4\x9c\xb5\x9c\xb6\x9c\xb7\x9c\xba\x9c\xbb\x9c\xbc\x9c\xbd\x9c\xc4\x9c\xc5\x9c\xc6\x9c\xc7\x9c\xca\x9c\xcb\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xcc\x9c\xcd\x9c\xce\x9c\xcf\x9c\xd0\x9c\xd3\x9c\xd4\x9c\xd5\x9c\xd7\x9c\xd8\x9c\xd9\x9c\xdc\x9c\xdd\x9c\xdf\x9c\xe2\x97\x7c\x97\x85\x97\x91\x97\x92\x97\x94\x97\xaf\x97\xab\x97\xa3\x97\xb2\x97\xb4\x9a\xb1\x9a\xb0\x9a\xb7\x9e\x58\x9a\xb6\x9a\xba\x9a\xbc\x9a\xc1\x9a\xc0\x9a\xc5\x9a\xc2\x9a\xcb\x9a\xcc\x9a\xd1\x9b\x45\x9b\x43\x9b\x47\x9b\x49\x9b\x48\x9b\x4d\x9b\x51\x98\xe8\x99\x0d\x99\x2e\x99\x55\x99\x54\x9a\xdf\x9a\xe1\x9a\xe6\x9a\xef\x9a\xeb\x9a\xfb\x9a\xed\x9a\xf9\x9b\x08\x9b\x0f\x9b\x13\x9b\x1f", /* 6c80 */ "\x00\x00\x9b\x23\x9e\xbd\x9e\xbe\x7e\x3b\x9e\x82\x9e\x87\x9e\x88\x9e\x8b\x9e\x92\x93\xd6\x9e\x9d\x9e\x9f\x9e\xdb\x9e\xdc\x9e\xdd\x9e\xe0\x9e\xdf\x9e\xe2\x9e\xe9\x9e\xe7\x9e\xe5\x9e\xea\x9e\xef\x9f\x22\x9f\x2c\x9f\x2f\x9f\x39\x9f\x37\x9f\x3d\x9f\x3e\x9f\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x0f\x01\x0f\x02\x0f\x03\x0f\x04\x0f\x05\x0f\x06\x0f\x07\x0f\x08\x0f\x09\x0f\x0a\x0f\x0b\x0f\x0c\x0f\x0d\x0f\x0e\x0f\x0f\x0f\x10\x0f\x11\x0f\x12\x0f\x13\x0f\x14\x0f\x15\x0f\x16\x0f\x17\x0f\x18\x0f\x19\x0f\x1a\x0f\x1b\x0f\x1c\x0f\x1d\x0f\x1e\x0f\x1f\x0f\x20\x0f\x21\x0f\x22\x0f\x23\x0f\x24\x0f\x25\x0f\x26\x0f\x27\x0f\x28\x0f\x29\x0f\x2a\x0f\x2b\x0f\x2c\x0f\x2d\x0f\x2e\x0f\x2f\x0f\x30\x0f\x31\x0f\x32\x0f\x33\x0f\x34\x0f\x35\x0f\x36\x0f\x37\x0f\x38\x0f\x39\x0f\x3a\x0f\x3b\x0f\x3c\x0f\x3d\x0f\x3e", /* 6d80 */ "\x0f\x3f\x0f\x40\x0f\x41\x0f\x42\x0f\x43\x0f\x44\x0f\x45\x0f\x46\x0f\x47\x0f\x48\x0f\x49\x0f\x4a\x0f\x4b\x0f\x4c\x0f\x4d\x0f\x4e\x0f\x4f\x0f\x50\x0f\x51\x0f\x52\x0f\x53\x0f\x54\x0f\x55\x0f\x56\x0f\x57\x0f\x58\x0f\x59\x0f\x5a\x0f\x5b\x0f\x5c\x0f\x5d\x0f\x5e\x0f\x5f\x0f\x60\x0f\x61\x0f\x62\x0f\x63\x0f\x64\x0f\x65\x0f\x66\x0f\x67\x0f\x68\x0f\x69\x0f\x6a\x0f\x6b\x0f\x6c\x0f\x6d\x0f\x6e\x0f\x6f\x0f\x70\x0f\x71\x0f\x72\x0f\x73\x0f\x74\x0f\x75\x0f\x76\x0f\x77\x0f\x78\x0f\x79\x0f\x7a\x0f\x7b\x0f\x7c\x0f\x7d\x0f\x7e\x0f\x7f\x0f\x80\x0f\x81\x0f\x82\x0f\x83\x0f\x84\x0f\x85\x0f\x86\x0f\x87\x0f\x88\x0f\x89\x0f\x8a\x0f\x8b\x0f\x8c\x0f\x8d\x0f\x8e\x0f\x8f\x0f\x90\x0f\x91\x0f\x92\x0f\x93\x0f\x94\x0f\x95\x0f\x96\x0f\x97\x0f\x98\x0f\x99\x0f\x9a\x0f\x9b\x0f\x9c\x0f\x9d\x0f\x9e\x0f\x9f\x0f\xa0\x0f\xa1\x0f\xa2\x0f\xa3\x0f\xa4\x0f\xa5\x0f\xa6\x0f\xa7\x0f\xa8\x0f\xa9\x0f\xaa\x0f\xab\x0f\xac\x0f\xad\x0f\xae\x0f\xaf\x0f\xb0\x0f\xb1\x0f\xb2\x0f\xb3\x0f\xb4\x0f\xb5\x0f\xb6\x0f\xb7\x0f\xb8\x0f\xb9\x0f\xba\x0f\xbb\x0f\xbc\x0f\xbd\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xbe\x0f\xbf\x0f\xc0\x0f\xc1\x0f\xc2\x0f\xc3\x0f\xc4\x0f\xc5\x0f\xc6\x0f\xc7\x0f\xc8\x0f\xc9\x0f\xca\x0f\xcb\x0f\xcc\x0f\xcd\x0f\xce\x0f\xcf\x0f\xd0\x0f\xd1\x0f\xd2\x0f\xd3\x0f\xd4\x0f\xd5\x0f\xd6\x0f\xd7\x0f\xd8\x0f\xd9\x0f\xda\x0f\xdb\x0f\xdc\x0f\xdd\x0f\xde\x0f\xdf\x0f\xe0\x0f\xe1\x0f\xe2\x0f\xe3\x0f\xe4\x0f\xe5\x0f\xe6\x0f\xe7\x0f\xe8\x0f\xe9\x0f\xea\x0f\xeb\x0f\xec\x0f\xed\x0f\xee\x0f\xef\x0f\xf0\x0f\xf1\x0f\xf2\x0f\xf3\x0f\xf4\x0f\xf5\x0f\xf6\x0f\xf7\x0f\xf8\x0f\xf9\x0f\xfa\x0f\xfb\x0f\xfc", /* 6e80 */ "\x0f\xfd\x0f\xfe\x0f\xff\x18\x00\x18\x01\x18\x02\x18\x03\x18\x04\x18\x05\x18\x06\x18\x07\x18\x08\x18\x09\x18\x0a\x18\x0b\x18\x0c\x18\x0d\x18\x0e\x18\x0f\x18\x10\x18\x11\x18\x12\x18\x13\x18\x14\x18\x15\x18\x16\x18\x17\x18\x18\x18\x19\x18\x1a\x18\x1b\x18\x1c\x18\x1d\x18\x1e\x18\x1f\x18\x20\x18\x21\x18\x22\x18\x23\x18\x24\x18\x25\x18\x26\x18\x27\x18\x28\x18\x29\x18\x2a\x18\x2b\x18\x2c\x18\x2d\x18\x2e\x18\x2f\x18\x30\x18\x31\x18\x32\x18\x33\x18\x34\x18\x35\x18\x36\x18\x37\x18\x38\x18\x39\x18\x3a\x18\x3b\x18\x3c\x18\x3d\x18\x3e\x18\x3f\x18\x40\x18\x41\x18\x42\x18\x43\x18\x44\x18\x45\x18\x46\x18\x47\x18\x48\x18\x49\x18\x4a\x18\x4b\x18\x4c\x18\x4d\x18\x4e\x18\x4f\x18\x50\x18\x51\x18\x52\x18\x53\x18\x54\x18\x55\x18\x56\x18\x57\x18\x58\x18\x59\x18\x5a\x18\x5b\x18\x5c\x18\x5d\x18\x5e\x18\x5f\x18\x60\x18\x61\x18\x62\x18\x63\x18\x64\x18\x65\x18\x66\x18\x67\x18\x68\x18\x69\x18\x6a\x18\x6b\x18\x6c\x18\x6d\x18\x6e\x18\x6f\x18\x70\x18\x71\x18\x72\x18\x73\x18\x74\x18\x75\x18\x76\x18\x77\x18\x78\x18\x79\x18\x7a\x18\x7b\x00\x00", /* 6f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x7c\x18\x7d\x18\x7e\x18\x7f\x18\x80\x18\x81\x18\x82\x18\x83\x18\x84\x18\x85\x18\x86\x18\x87\x18\x88\x18\x89\x18\x8a\x18\x8b\x18\x8c\x18\x8d\x18\x8e\x18\x8f\x18\x90\x18\x91\x18\x92\x18\x93\x18\x94\x18\x95\x18\x96\x18\x97\x18\x98\x18\x99\x18\x9a\x18\x9b\x18\x9c\x18\x9d\x18\x9e\x18\x9f\x18\xa0\x18\xa1\x18\xa2\x18\xa3\x18\xa4\x18\xa5\x18\xa6\x18\xa7\x18\xa8\x18\xa9\x18\xaa\x18\xab\x18\xac\x18\xad\x18\xae\x18\xaf\xa0\x00\xa0\x01\xa0\x02\xa0\x03\xa0\x04\xa0\x05\xa0\x06\xa0\x07\xa0\x08\xa0\x09\xa0\x0a", /* 6f80 */ "\xa0\x0b\xa0\x0c\xa0\x0d\xa0\x0e\xa0\x0f\xa0\x10\xa0\x11\xa0\x12\xa0\x13\xa0\x14\xa0\x15\xa0\x16\xa0\x17\xa0\x18\xa0\x19\xa0\x1a\xa0\x1b\xa0\x1c\xa0\x1d\xa0\x1e\xa0\x1f\xa0\x20\xa0\x21\xa0\x22\xa0\x23\xa0\x24\xa0\x25\xa0\x26\xa0\x27\xa0\x28\xa0\x29\xa0\x2a\xa0\x2b\xa0\x2c\xa0\x2d\xa0\x2e\xa0\x2f\xa0\x30\xa0\x31\xa0\x32\xa0\x33\xa0\x34\xa0\x35\xa0\x36\xa0\x37\xa0\x38\xa0\x39\xa0\x3a\xa0\x3b\xa0\x3c\xa0\x3d\xa0\x3e\xa0\x3f\xa0\x40\xa0\x41\xa0\x42\xa0\x43\xa0\x44\xa0\x45\xa0\x46\xa0\x47\xa0\x48\xa0\x49\xa0\x4a\xa0\x4b\xa0\x4c\xa0\x4d\xa0\x4e\xa0\x4f\xa0\x50\xa0\x51\xa0\x52\xa0\x53\xa0\x54\xa0\x55\xa0\x56\xa0\x57\xa0\x58\xa0\x59\xa0\x5a\xa0\x5b\xa0\x5c\xa0\x5d\xa0\x5e\xa0\x5f\xa0\x60\xa0\x61\xa0\x62\xa0\x63\xa0\x64\xa0\x65\xa0\x66\xa0\x67\xa0\x68\xa0\x69\xa0\x6a\xa0\x6b\xa0\x6c\xa0\x6d\xa0\x6e\xa0\x6f\xa0\x70\xa0\x71\xa0\x72\xa0\x73\xa0\x74\xa0\x75\xa0\x76\xa0\x77\xa0\x78\xa0\x79\xa0\x7a\xa0\x7b\xa0\x7c\xa0\x7d\xa0\x7e\xa0\x7f\xa0\x80\xa0\x81\xa0\x82\xa0\x83\xa0\x84\xa0\x85\xa0\x86\xa0\x87\xa0\x88\xa0\x89\x00\x00", /* 7000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x8a\xa0\x8b\xa0\x8c\xa0\x8d\xa0\x8e\xa0\x8f\xa0\x90\xa0\x91\xa0\x92\xa0\x93\xa0\x94\xa0\x95\xa0\x96\xa0\x97\xa0\x98\xa0\x99\xa0\x9a\xa0\x9b\xa0\x9c\xa0\x9d\xa0\x9e\xa0\x9f\xa0\xa0\xa0\xa1\xa0\xa2\xa0\xa3\xa0\xa4\xa0\xa5\xa0\xa6\xa0\xa7\xa0\xa8\xa0\xa9\xa0\xaa\xa0\xab\xa0\xac\xa0\xad\xa0\xae\xa0\xaf\xa0\xb0\xa0\xb1\xa0\xb2\xa0\xb3\xa0\xb4\xa0\xb5\xa0\xb6\xa0\xb7\xa0\xb8\xa0\xb9\xa0\xba\xa0\xbb\xa0\xbc\xa0\xbd\xa0\xbe\xa0\xbf\xa0\xc0\xa0\xc1\xa0\xc2\xa0\xc3\xa0\xc4\xa0\xc5\xa0\xc6\xa0\xc7\xa0\xc8", /* 7080 */ "\xa0\xc9\xa0\xca\xa0\xcb\xa0\xcc\xa0\xcd\xa0\xce\xa0\xcf\xa0\xd0\xa0\xd1\xa0\xd2\xa0\xd3\xa0\xd4\xa0\xd5\xa0\xd6\xa0\xd7\xa0\xd8\xa0\xd9\xa0\xda\xa0\xdb\xa0\xdc\xa0\xdd\xa0\xde\xa0\xdf\xa0\xe0\xa0\xe1\xa0\xe2\xa0\xe3\xa0\xe4\xa0\xe5\xa0\xe6\xa0\xe7\xa0\xe8\xa0\xe9\xa0\xea\xa0\xeb\xa0\xec\xa0\xed\xa0\xee\xa0\xef\xa0\xf0\xa0\xf1\xa0\xf2\xa0\xf3\xa0\xf4\xa0\xf5\xa0\xf6\xa0\xf7\xa0\xf8\xa0\xf9\xa0\xfa\xa0\xfb\xa0\xfc\xa0\xfd\xa0\xfe\xa0\xff\xa1\x00\xa1\x01\xa1\x02\xa1\x03\xa1\x04\xa1\x05\xa1\x06\xa1\x07\xa1\x08\xa1\x09\xa1\x0a\xa1\x0b\xa1\x0c\xa1\x0d\xa1\x0e\xa1\x0f\xa1\x10\xa1\x11\xa1\x12\xa1\x13\xa1\x14\xa1\x15\xa1\x16\xa1\x17\xa1\x18\xa1\x19\xa1\x1a\xa1\x1b\xa1\x1c\xa1\x1d\xa1\x1e\xa1\x1f\xa1\x20\xa1\x21\xa1\x22\xa1\x23\xa1\x24\xa1\x25\xa1\x26\xa1\x27\xa1\x28\xa1\x29\xa1\x2a\xa1\x2b\xa1\x2c\xa1\x2d\xa1\x2e\xa1\x2f\xa1\x30\xa1\x31\xa1\x32\xa1\x33\xa1\x34\xa1\x35\xa1\x36\xa1\x37\xa1\x38\xa1\x39\xa1\x3a\xa1\x3b\xa1\x3c\xa1\x3d\xa1\x3e\xa1\x3f\xa1\x40\xa1\x41\xa1\x42\xa1\x43\xa1\x44\xa1\x45\xa1\x46\xa1\x47\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x48\xa1\x49\xa1\x4a\xa1\x4b\xa1\x4c\xa1\x4d\xa1\x4e\xa1\x4f\xa1\x50\xa1\x51\xa1\x52\xa1\x53\xa1\x54\xa1\x55\xa1\x56\xa1\x57\xa1\x58\xa1\x59\xa1\x5a\xa1\x5b\xa1\x5c\xa1\x5d\xa1\x5e\xa1\x5f\xa1\x60\xa1\x61\xa1\x62\xa1\x63\xa1\x64\xa1\x65\xa1\x66\xa1\x67\xa1\x68\xa1\x69\xa1\x6a\xa1\x6b\xa1\x6c\xa1\x6d\xa1\x6e\xa1\x6f\xa1\x70\xa1\x71\xa1\x72\xa1\x73\xa1\x74\xa1\x75\xa1\x76\xa1\x77\xa1\x78\xa1\x79\xa1\x7a\xa1\x7b\xa1\x7c\xa1\x7d\xa1\x7e\xa1\x7f\xa1\x80\xa1\x81\xa1\x82\xa1\x83\xa1\x84\xa1\x85\xa1\x86", /* 7180 */ "\xa1\x87\xa1\x88\xa1\x89\xa1\x8a\xa1\x8b\xa1\x8c\xa1\x8d\xa1\x8e\xa1\x8f\xa1\x90\xa1\x91\xa1\x92\xa1\x93\xa1\x94\xa1\x95\xa1\x96\xa1\x97\xa1\x98\xa1\x99\xa1\x9a\xa1\x9b\xa1\x9c\xa1\x9d\xa1\x9e\xa1\x9f\xa1\xa0\xa1\xa1\xa1\xa2\xa1\xa3\xa1\xa4\xa1\xa5\xa1\xa6\xa1\xa7\xa1\xa8\xa1\xa9\xa1\xaa\xa1\xab\xa1\xac\xa1\xad\xa1\xae\xa1\xaf\xa1\xb0\xa1\xb1\xa1\xb2\xa1\xb3\xa1\xb4\xa1\xb5\xa1\xb6\xa1\xb7\xa1\xb8\xa1\xb9\xa1\xba\xa1\xbb\xa1\xbc\xa1\xbd\xa1\xbe\xa1\xbf\xa1\xc0\xa1\xc1\xa1\xc2\xa1\xc3\xa1\xc4\xa1\xc5\xa1\xc6\xa1\xc7\xa1\xc8\xa1\xc9\xa1\xca\xa1\xcb\xa1\xcc\xa1\xcd\xa1\xce\xa1\xcf\xa1\xd0\xa1\xd1\xa1\xd2\xa1\xd3\xa1\xd4\xa1\xd5\xa1\xd6\xa1\xd7\xa1\xd8\xa1\xd9\xa1\xda\xa1\xdb\xa1\xdc\xa1\xdd\xa1\xde\xa1\xdf\xa1\xe0\xa1\xe1\xa1\xe2\xa1\xe3\xa1\xe4\xa1\xe5\xa1\xe6\xa1\xe7\xa1\xe8\xa1\xe9\xa1\xea\xa1\xeb\xa1\xec\xa1\xed\xa1\xee\xa1\xef\xa1\xf0\xa1\xf1\xa1\xf2\xa1\xf3\xa1\xf4\xa1\xf5\xa1\xf6\xa1\xf7\xa1\xf8\xa1\xf9\xa1\xfa\xa1\xfb\xa1\xfc\xa1\xfd\xa1\xfe\xa1\xff\xa2\x00\xa2\x01\xa2\x02\xa2\x03\xa2\x04\xa2\x05\x00\x00", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x06\xa2\x07\xa2\x08\xa2\x09\xa2\x0a\xa2\x0b\xa2\x0c\xa2\x0d\xa2\x0e\xa2\x0f\xa2\x10\xa2\x11\xa2\x12\xa2\x13\xa2\x14\xa2\x15\xa2\x16\xa2\x17\xa2\x18\xa2\x19\xa2\x1a\xa2\x1b\xa2\x1c\xa2\x1d\xa2\x1e\xa2\x1f\xa2\x20\xa2\x21\xa2\x22\xa2\x23\xa2\x24\xa2\x25\xa2\x26\xa2\x27\xa2\x28\xa2\x29\xa2\x2a\xa2\x2b\xa2\x2c\xa2\x2d\xa2\x2e\xa2\x2f\xa2\x30\xa2\x31\xa2\x32\xa2\x33\xa2\x34\xa2\x35\xa2\x36\xa2\x37\xa2\x38\xa2\x39\xa2\x3a\xa2\x3b\xa2\x3c\xa2\x3d\xa2\x3e\xa2\x3f\xa2\x40\xa2\x41\xa2\x42\xa2\x43\xa2\x44", /* 7280 */ "\xa2\x45\xa2\x46\xa2\x47\xa2\x48\xa2\x49\xa2\x4a\xa2\x4b\xa2\x4c\xa2\x4d\xa2\x4e\xa2\x4f\xa2\x50\xa2\x51\xa2\x52\xa2\x53\xa2\x54\xa2\x55\xa2\x56\xa2\x57\xa2\x58\xa2\x59\xa2\x5a\xa2\x5b\xa2\x5c\xa2\x5d\xa2\x5e\xa2\x5f\xa2\x60\xa2\x61\xa2\x62\xa2\x63\xa2\x64\xa2\x65\xa2\x66\xa2\x67\xa2\x68\xa2\x69\xa2\x6a\xa2\x6b\xa2\x6c\xa2\x6d\xa2\x6e\xa2\x6f\xa2\x70\xa2\x71\xa2\x72\xa2\x73\xa2\x74\xa2\x75\xa2\x76\xa2\x77\xa2\x78\xa2\x79\xa2\x7a\xa2\x7b\xa2\x7c\xa2\x7d\xa2\x7e\xa2\x7f\xa2\x80\xa2\x81\xa2\x82\xa2\x83\xa2\x84\xa2\x85\xa2\x86\xa2\x87\xa2\x88\xa2\x89\xa2\x8a\xa2\x8b\xa2\x8c\xa2\x8d\xa2\x8e\xa2\x8f\xa2\x90\xa2\x91\xa2\x92\xa2\x93\xa2\x94\xa2\x95\xa2\x96\xa2\x97\xa2\x98\xa2\x99\xa2\x9a\xa2\x9b\xa2\x9c\xa2\x9d\xa2\x9e\xa2\x9f\xa2\xa0\xa2\xa1\xa2\xa2\xa2\xa3\xa2\xa4\xa2\xa5\xa2\xa6\xa2\xa7\xa2\xa8\xa2\xa9\xa2\xaa\xa2\xab\xa2\xac\xa2\xad\xa2\xae\xa2\xaf\xa2\xb0\xa2\xb1\xa2\xb2\xa2\xb3\xa2\xb4\xa2\xb5\xa2\xb6\xa2\xb7\xa2\xb8\xa2\xb9\xa2\xba\xa2\xbb\xa2\xbc\xa2\xbd\xa2\xbe\xa2\xbf\xa2\xc0\xa2\xc1\xa2\xc2\xa2\xc3\x00\x00", /* 7300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xc4\xa2\xc5\xa2\xc6\xa2\xc7\xa2\xc8\xa2\xc9\xa2\xca\xa2\xcb\xa2\xcc\xa2\xcd\xa2\xce\xa2\xcf\xa2\xd0\xa2\xd1\xa2\xd2\xa2\xd3\xa2\xd4\xa2\xd5\xa2\xd6\xa2\xd7\xa2\xd8\xa2\xd9\xa2\xda\xa2\xdb\xa2\xdc\xa2\xdd\xa2\xde\xa2\xdf\xa2\xe0\xa2\xe1\xa2\xe2\xa2\xe3\xa2\xe4\xa2\xe5\xa2\xe6\xa2\xe7\xa2\xe8\xa2\xe9\xa2\xea\xa2\xeb\xa2\xec\xa2\xed\xa2\xee\xa2\xef\xa2\xf0\xa2\xf1\xa2\xf2\xa2\xf3\xa2\xf4\xa2\xf5\xa2\xf6\xa2\xf7\xa2\xf8\xa2\xf9\xa2\xfa\xa2\xfb\xa2\xfc\xa2\xfd\xa2\xfe\xa2\xff\xa3\x00\xa3\x01\xa3\x02", /* 7380 */ "\xa3\x03\xa3\x04\xa3\x05\xa3\x06\xa3\x07\xa3\x08\xa3\x09\xa3\x0a\xa3\x0b\xa3\x0c\xa3\x0d\xa3\x0e\xa3\x0f\xa3\x10\xa3\x11\xa3\x12\xa3\x13\xa3\x14\xa3\x15\xa3\x16\xa3\x17\xa3\x18\xa3\x19\xa3\x1a\xa3\x1b\xa3\x1c\xa3\x1d\xa3\x1e\xa3\x1f\xa3\x20\xa3\x21\xa3\x22\xa3\x23\xa3\x24\xa3\x25\xa3\x26\xa3\x27\xa3\x28\xa3\x29\xa3\x2a\xa3\x2b\xa3\x2c\xa3\x2d\xa3\x2e\xa3\x2f\xa3\x30\xa3\x31\xa3\x32\xa3\x33\xa3\x34\xa3\x35\xa3\x36\xa3\x37\xa3\x38\xa3\x39\xa3\x3a\xa3\x3b\xa3\x3c\xa3\x3d\xa3\x3e\xa3\x3f\xa3\x40\xa3\x41\xa3\x42\xa3\x43\xa3\x44\xa3\x45\xa3\x46\xa3\x47\xa3\x48\xa3\x49\xa3\x4a\xa3\x4b\xa3\x4c\xa3\x4d\xa3\x4e\xa3\x4f\xa3\x50\xa3\x51\xa3\x52\xa3\x53\xa3\x54\xa3\x55\xa3\x56\xa3\x57\xa3\x58\xa3\x59\xa3\x5a\xa3\x5b\xa3\x5c\xa3\x5d\xa3\x5e\xa3\x5f\xa3\x60\xa3\x61\xa3\x62\xa3\x63\xa3\x64\xa3\x65\xa3\x66\xa3\x67\xa3\x68\xa3\x69\xa3\x6a\xa3\x6b\xa3\x6c\xa3\x6d\xa3\x6e\xa3\x6f\xa3\x70\xa3\x71\xa3\x72\xa3\x73\xa3\x74\xa3\x75\xa3\x76\xa3\x77\xa3\x78\xa3\x79\xa3\x7a\xa3\x7b\xa3\x7c\xa3\x7d\xa3\x7e\xa3\x7f\xa3\x80\xa3\x81\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x82\xa3\x83\xa3\x84\xa3\x85\xa3\x86\xa3\x87\xa3\x88\xa3\x89\xa3\x8a\xa3\x8b\xa3\x8c\xa3\x8d\xa3\x8e\xa3\x8f\xa3\x90\xa3\x91\xa3\x92\xa3\x93\xa3\x94\xa3\x95\xa3\x96\xa3\x97\xa3\x98\xa3\x99\xa3\x9a\xa3\x9b\xa3\x9c\xa3\x9d\xa3\x9e\xa3\x9f\xa3\xa0\xa3\xa1\xa3\xa2\xa3\xa3\xa3\xa4\xa3\xa5\xa3\xa6\xa3\xa7\xa3\xa8\xa3\xa9\xa3\xaa\xa3\xab\xa3\xac\xa3\xad\xa3\xae\xa3\xaf\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4\xa3\xb5\xa3\xb6\xa3\xb7\xa3\xb8\xa3\xb9\xa3\xba\xa3\xbb\xa3\xbc\xa3\xbd\xa3\xbe\xa3\xbf\xa3\xc0", /* 7480 */ "\xa3\xc1\xa3\xc2\xa3\xc3\xa3\xc4\xa3\xc5\xa3\xc6\xa3\xc7\xa3\xc8\xa3\xc9\xa3\xca\xa3\xcb\xa3\xcc\xa3\xcd\xa3\xce\xa3\xcf\xa3\xd0\xa3\xd1\xa3\xd2\xa3\xd3\xa3\xd4\xa3\xd5\xa3\xd6\xa3\xd7\xa3\xd8\xa3\xd9\xa3\xda\xa3\xdb\xa3\xdc\xa3\xdd\xa3\xde\xa3\xdf\xa3\xe0\xa3\xe1\xa3\xe2\xa3\xe3\xa3\xe4\xa3\xe5\xa3\xe6\xa3\xe7\xa3\xe8\xa3\xe9\xa3\xea\xa3\xeb\xa3\xec\xa3\xed\xa3\xee\xa3\xef\xa3\xf0\xa3\xf1\xa3\xf2\xa3\xf3\xa3\xf4\xa3\xf5\xa3\xf6\xa3\xf7\xa3\xf8\xa3\xf9\xa3\xfa\xa3\xfb\xa3\xfc\xa3\xfd\xa3\xfe\xa3\xff\xa4\x00\xa4\x01\xa4\x02\xa4\x03\xa4\x04\xa4\x05\xa4\x06\xa4\x07\xa4\x08\xa4\x09\xa4\x0a\xa4\x0b\xa4\x0c\xa4\x0d\xa4\x0e\xa4\x0f\xa4\x10\xa4\x11\xa4\x12\xa4\x13\xa4\x14\xa4\x15\xa4\x16\xa4\x17\xa4\x18\xa4\x19\xa4\x1a\xa4\x1b\xa4\x1c\xa4\x1d\xa4\x1e\xa4\x1f\xa4\x20\xa4\x21\xa4\x22\xa4\x23\xa4\x24\xa4\x25\xa4\x26\xa4\x27\xa4\x28\xa4\x29\xa4\x2a\xa4\x2b\xa4\x2c\xa4\x2d\xa4\x2e\xa4\x2f\xa4\x30\xa4\x31\xa4\x32\xa4\x33\xa4\x34\xa4\x35\xa4\x36\xa4\x37\xa4\x38\xa4\x39\xa4\x3a\xa4\x3b\xa4\x3c\xa4\x3d\xa4\x3e\xa4\x3f\x00\x00", /* 7500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x40\xa4\x41\xa4\x42\xa4\x43\xa4\x44\xa4\x45\xa4\x46\xa4\x47\xa4\x48\xa4\x49\xa4\x4a\xa4\x4b\xa4\x4c\xa4\x4d\xa4\x4e\xa4\x4f\xa4\x50\xa4\x51\xa4\x52\xa4\x53\xa4\x54\xa4\x55\xa4\x56\xa4\x57\xa4\x58\xa4\x59\xa4\x5a\xa4\x5b\xa4\x5c\xa4\x5d\xa4\x5e\xa4\x5f\xa4\x60\xa4\x61\xa4\x62\xa4\x63\xa4\x64\xa4\x65\xa4\x66\xa4\x67\xa4\x68\xa4\x69\xa4\x6a\xa4\x6b\xa4\x6c\xa4\x6d\xa4\x6e\xa4\x6f\xa4\x70\xa4\x71\xa4\x72\xa4\x73\xa4\x74\xa4\x75\xa4\x76\xa4\x77\xa4\x78\xa4\x79\xa4\x7a\xa4\x7b\xa4\x7c\xa4\x7d\xa4\x7e", /* 7580 */ "\xa4\x7f\xa4\x80\xa4\x81\xa4\x82\xa4\x83\xa4\x84\xa4\x85\xa4\x86\xa4\x87\xa4\x88\xa4\x89\xa4\x8a\xa4\x8b\xa4\x8c\xa4\x8d\xa4\x8e\xa4\x8f\xa4\x90\xa4\x91\xa4\x92\xa4\x93\xa4\x94\xa4\x95\xa4\x96\xa4\x97\xa4\x98\xa4\x99\xa4\x9a\xa4\x9b\xa4\x9c\xa4\x9d\xa4\x9e\xa4\x9f\xa4\xa0\xa4\xa1\xa4\xa2\xa4\xa3\xa4\xa4\xa4\xa5\xa4\xa6\xa4\xa7\xa4\xa8\xa4\xa9\xa4\xaa\xa4\xab\xa4\xac\xa4\xad\xa4\xae\xa4\xaf\xa4\xb0\xa4\xb1\xa4\xb2\xa4\xb3\xa4\xb4\xa4\xb5\xa4\xb6\xa4\xb7\xa4\xb8\xa4\xb9\xa4\xba\xa4\xbb\xa4\xbc\xa4\xbd\xa4\xbe\xa4\xbf\xa4\xc0\xa4\xc1\xa4\xc2\xa4\xc3\xa4\xc4\xa4\xc5\xa4\xc6\xa4\xc7\xa4\xc8\xa4\xc9\xa4\xca\xa4\xcb\xa4\xcc\xa4\xcd\xa4\xce\xa4\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xe0\x02\xe0\x03\xe0\x04\xe0\x05\xe0\x06\xe0\x07\xe0\x08\xe0\x09\xe0\x0a\xe0\x0b\xe0\x0c\xe0\x0d\xe0\x0e\xe0\x0f\xe0\x10\xe0\x11\xe0\x12\xe0\x13\xe0\x14\xe0\x15\xe0\x16\xe0\x17\xe0\x18\xe0\x19\xe0\x1a\xe0\x1b\xe0\x1c\xe0\x1d\xe0\x1e\xe0\x1f\xe0\x20\xe0\x21\xe0\x22\xe0\x23\xe0\x24\xe0\x25\xe0\x26\xe0\x27\xe0\x28\xe0\x29\xe0\x2a\xe0\x2b\xe0\x2c\xe0\x2d\xe0\x2e\xe0\x2f\xe0\x30\xe0\x31\xe0\x32\xe0\x33\xe0\x34\xe0\x35\xe0\x36\xe0\x37\xe0\x38\xe0\x39\xe0\x3a\xe0\x3b\xe0\x3c\xe0\x3d\xe0\x3e", /* 7680 */ "\x00\x00\xe0\x3f\xe0\x40\xe0\x41\xe0\x42\xe0\x43\xe0\x44\xe0\x45\xe0\x46\xe0\x47\xe0\x48\xe0\x49\xe0\x4a\xe0\x4b\xe0\x4c\xe0\x4d\xe0\x4e\xe0\x4f\xe0\x50\xe0\x51\xe0\x52\xe0\x53\xe0\x54\xe0\x55\xe0\x56\xe0\x57\xe0\x58\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xe0\x5d\xe0\x5e\xe0\x5f\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xe0\x64\xe0\x65\xe0\x66\xe0\x67\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x7f\xe0\x80\xe0\x81\xe0\x82\xe0\x83\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xe0\x8f\xe0\x90\xe0\x91\xe0\x92\xe0\x93\xe0\x94\xe0\x95\xe0\x96\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xe0\xa0\xe0\xa1\xe0\xa2\xe0\xa3\xe0\xa4\xe0\xa5\xe0\xa6\xe0\xa7\xe0\xa8\xe0\xa9\xe0\xaa\xe0\xab\xe0\xac\xe0\xad\xe0\xae\xe0\xaf\xe0\xb0\xe0\xb1\xe0\xb2\xe0\xb3\xe0\xb4\xe0\xb5\xe0\xb6\xe0\xb7\xe0\xb8\xe0\xb9\xe0\xba\xe0\xbb\x00\x00\x00\x00", /* 7700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbc\xe0\xbd\xe0\xbe\xe0\xbf\xe0\xc0\xe0\xc1\xe0\xc2\xe0\xc3\xe0\xc4\xe0\xc5\xe0\xc6\xe0\xc7\xe0\xc8\xe0\xc9\xe0\xca\xe0\xcb\xe0\xcc\xe0\xcd\xe0\xce\xe0\xcf\xe0\xd0\xe0\xd1\xe0\xd2\xe0\xd3\xe0\xd4\xe0\xd5\xe0\xd6\xe0\xd7\xe0\xd8\xe0\xd9\xe0\xda\xe0\xdb\xe0\xdc\xe0\xdd\xe0\xde\xe0\xdf\xe0\xe0\xe0\xe1\xe0\xe2\xe0\xe3\xe0\xe4\xe0\xe5\xe0\xe6\xe0\xe7\xe0\xe8\xe0\xe9\xe0\xea\xe0\xeb\xe0\xec\xe0\xed\xe0\xee\xe0\xef\xe0\xf0\xe0\xf1\xe0\xf2\xe0\xf3\xe0\xf4\xe0\xf5\xe0\xf6\xe0\xf7\xe0\xf8\xe0\xf9\xe0\xfa", /* 7780 */ "\x00\x00\xe0\xfb\xe0\xfc\xe0\xfd\xe0\xfe\xe0\xff\xe1\x00\xe1\x01\xe1\x02\xe1\x03\xe1\x04\xe1\x05\xe1\x06\xe1\x07\xe1\x08\xe1\x09\xe1\x0a\xe1\x0b\xe1\x0c\xe1\x0d\xe1\x0e\xe1\x0f\xe1\x10\xe1\x11\xe1\x12\xe1\x13\xe1\x14\xe1\x15\xe1\x16\xe1\x17\xe1\x18\xe1\x19\xe1\x1a\xe1\x1b\xe1\x1c\xe1\x1d\xe1\x1e\xe1\x1f\xe1\x20\xe1\x21\xe1\x22\xe1\x23\xe1\x24\xe1\x25\xe1\x26\xe1\x27\xe1\x28\xe1\x29\xe1\x2a\xe1\x2b\xe1\x2c\xe1\x2d\xe1\x2e\xe1\x2f\xe1\x30\xe1\x31\xe1\x32\xe1\x33\xe1\x34\xe1\x35\xe1\x36\xe1\x37\xe1\x38\xe1\x39\xe1\x3a\xe1\x3b\xe1\x3c\xe1\x3d\xe1\x3e\xe1\x3f\xe1\x40\xe1\x41\xe1\x42\xe1\x43\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xe1\x48\xe1\x49\xe1\x4a\xe1\x4b\xe1\x4c\xe1\x4d\xe1\x4e\xe1\x4f\xe1\x50\xe1\x51\xe1\x52\xe1\x53\xe1\x54\xe1\x55\xe1\x56\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xe1\x5c\xe1\x5d\xe1\x5e\xe1\x5f\xe1\x60\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xe1\x74\xe1\x75\xe1\x76\xe1\x77\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x78\xe1\x79\xe1\x7a\xe1\x7b\xe1\x7c\xe1\x7d\xe1\x7e\xe1\x7f\xe1\x80\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xe1\x8b\xe1\x8c\xe1\x8d\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe1\xa1\xe1\xa2\xe1\xa3\xe1\xa4\xe1\xa5\xe1\xa6\xe1\xa7\xe1\xa8\xe1\xa9\xe1\xaa\xe1\xab\xe1\xac\xe1\xad\xe1\xae\xe1\xaf\xe1\xb0\xe1\xb1\xe1\xb2\xe1\xb3\xe1\xb4\xe1\xb5\xe1\xb6", /* 7880 */ "\x00\x00\xe1\xb7\xe1\xb8\xe1\xb9\xe1\xba\xe1\xbb\xe1\xbc\xe1\xbd\xe1\xbe\xe1\xbf\xe1\xc0\xe1\xc1\xe1\xc2\xe1\xc3\xe1\xc4\xe1\xc5\xe1\xc6\xe1\xc7\xe1\xc8\xe1\xc9\xe1\xca\xe1\xcb\xe1\xcc\xe1\xcd\xe1\xce\xe1\xcf\xe1\xd0\xe1\xd1\xe1\xd2\xe1\xd3\xe1\xd4\xe1\xd5\xe1\xd6\xe1\xd7\xe1\xd8\xe1\xd9\xe1\xda\xe1\xdb\xe1\xdc\xe1\xdd\xe1\xde\xe1\xdf\xe1\xe0\xe1\xe1\xe1\xe2\xe1\xe3\xe1\xe4\xe1\xe5\xe1\xe6\xe1\xe7\xe1\xe8\xe1\xe9\xe1\xea\xe1\xeb\xe1\xec\xe1\xed\xe1\xee\xe1\xef\xe1\xf0\xe1\xf1\xe1\xf2\xe1\xf3\xe1\xf4\xe1\xf5\xe1\xf6\xe1\xf7\xe1\xf8\xe1\xf9\xe1\xfa\xe1\xfb\xe1\xfc\xe1\xfd\xe1\xfe\xe1\xff\xe2\x00\xe2\x01\xe2\x02\xe2\x03\xe2\x04\xe2\x05\xe2\x06\xe2\x07\xe2\x08\xe2\x09\xe2\x0a\xe2\x0b\xe2\x0c\xe2\x0d\xe2\x0e\xe2\x0f\xe2\x10\xe2\x11\xe2\x12\xe2\x13\xe2\x14\xe2\x15\xe2\x16\xe2\x17\xe2\x18\xe2\x19\xe2\x1a\xe2\x1b\xe2\x1c\xe2\x1d\xe2\x1e\xe2\x1f\xe2\x20\xe2\x21\xe2\x22\xe2\x23\xe2\x24\xe2\x25\xe2\x26\xe2\x27\xe2\x28\xe2\x29\xe2\x2a\xe2\x2b\xe2\x2c\xe2\x2d\xe2\x2e\xe2\x2f\xe2\x30\xe2\x31\xe2\x32\xe2\x33\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x34\xe2\x35\xe2\x36\xe2\x37\xe2\x38\xe2\x39\xe2\x3a\xe2\x3b\xe2\x3c\xe2\x3d\xe2\x3e\xe2\x3f\xe2\x40\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72", /* 7980 */ "\x00\x00\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x7f\xe2\x80\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe2\xa1\xe2\xa2\xe2\xa3\xe2\xa4\xe2\xa5\xe2\xa6\xe2\xa7\xe2\xa8\xe2\xa9\xe2\xaa\xe2\xab\xe2\xac\xe2\xad\xe2\xae\xe2\xaf\xe2\xb0\xe2\xb1\xe2\xb2\xe2\xb3\xe2\xb4\xe2\xb5\xe2\xb6\xe2\xb7\xe2\xb8\xe2\xb9\xe2\xba\xe2\xbb\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1\xe2\xc2\xe2\xc3\xe2\xc4\xe2\xc5\xe2\xc6\xe2\xc7\xe2\xc8\xe2\xc9\xe2\xca\xe2\xcb\xe2\xcc\xe2\xcd\xe2\xce\xe2\xcf\xe2\xd0\xe2\xd1\xe2\xd2\xe2\xd3\xe2\xd4\xe2\xd5\xe2\xd6\xe2\xd7\xe2\xd8\xe2\xd9\xe2\xda\xe2\xdb\xe2\xdc\xe2\xdd\xe2\xde\xe2\xdf\xe2\xe0\xe2\xe1\xe2\xe2\xe2\xe3\xe2\xe4\xe2\xe5\xe2\xe6\xe2\xe7\xe2\xe8\xe2\xe9\xe2\xea\xe2\xeb\xe2\xec\xe2\xed\xe2\xee\xe2\xef\x00\x00\x00\x00", /* 7a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xf0\xe2\xf1\xe2\xf2\xe2\xf3\xe2\xf4\xe2\xf5\xe2\xf6\xe2\xf7\xe2\xf8\xe2\xf9\xe2\xfa\xe2\xfb\xe2\xfc\xe2\xfd\xe2\xfe\xe2\xff\xe3\x00\xe3\x01\xe3\x02\xe3\x03\xe3\x04\xe3\x05\xe3\x06\xe3\x07\xe3\x08\xe3\x09\xe3\x0a\xe3\x0b\xe3\x0c\xe3\x0d\xe3\x0e\xe3\x0f\xe3\x10\xe3\x11\xe3\x12\xe3\x13\xe3\x14\xe3\x15\xe3\x16\xe3\x17\xe3\x18\xe3\x19\xe3\x1a\xe3\x1b\xe3\x1c\xe3\x1d\xe3\x1e\xe3\x1f\xe3\x20\xe3\x21\xe3\x22\xe3\x23\xe3\x24\xe3\x25\xe3\x26\xe3\x27\xe3\x28\xe3\x29\xe3\x2a\xe3\x2b\xe3\x2c\xe3\x2d\xe3\x2e", /* 7a80 */ "\x00\x00\xe3\x2f\xe3\x30\xe3\x31\xe3\x32\xe3\x33\xe3\x34\xe3\x35\xe3\x36\xe3\x37\xe3\x38\xe3\x39\xe3\x3a\xe3\x3b\xe3\x3c\xe3\x3d\xe3\x3e\xe3\x3f\xe3\x40\xe3\x41\xe3\x42\xe3\x43\xe3\x44\xe3\x45\xe3\x46\xe3\x47\xe3\x48\xe3\x49\xe3\x4a\xe3\x4b\xe3\x4c\xe3\x4d\xe3\x4e\xe3\x4f\xe3\x50\xe3\x51\xe3\x52\xe3\x53\xe3\x54\xe3\x55\xe3\x56\xe3\x57\xe3\x58\xe3\x59\xe3\x5a\xe3\x5b\xe3\x5c\xe3\x5d\xe3\x5e\xe3\x5f\xe3\x60\xe3\x61\xe3\x62\xe3\x63\xe3\x64\xe3\x65\xe3\x66\xe3\x67\xe3\x68\xe3\x69\xe3\x6a\xe3\x6b\xe3\x6c\xe3\x6d\xe3\x6e\xe3\x6f\xe3\x70\xe3\x71\xe3\x72\xe3\x73\xe3\x74\xe3\x75\xe3\x76\xe3\x77\xe3\x78\xe3\x79\xe3\x7a\xe3\x7b\xe3\x7c\xe3\x7d\xe3\x7e\xe3\x7f\xe3\x80\xe3\x81\xe3\x82\xe3\x83\xe3\x84\xe3\x85\xe3\x86\xe3\x87\xe3\x88\xe3\x89\xe3\x8a\xe3\x8b\xe3\x8c\xe3\x8d\xe3\x8e\xe3\x8f\xe3\x90\xe3\x91\xe3\x92\xe3\x93\xe3\x94\xe3\x95\xe3\x96\xe3\x97\xe3\x98\xe3\x99\xe3\x9a\xe3\x9b\xe3\x9c\xe3\x9d\xe3\x9e\xe3\x9f\xe3\xa0\xe3\xa1\xe3\xa2\xe3\xa3\xe3\xa4\xe3\xa5\xe3\xa6\xe3\xa7\xe3\xa8\xe3\xa9\xe3\xaa\xe3\xab\x00\x00\x00\x00", /* 7b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xac\xe3\xad\xe3\xae\xe3\xaf\xe3\xb0\xe3\xb1\xe3\xb2\xe3\xb3\xe3\xb4\xe3\xb5\xe3\xb6\xe3\xb7\xe3\xb8\xe3\xb9\xe3\xba\xe3\xbb\xe3\xbc\xe3\xbd\xe3\xbe\xe3\xbf\xe3\xc0\xe3\xc1\xe3\xc2\xe3\xc3\xe3\xc4\xe3\xc5\xe3\xc6\xe3\xc7\xe3\xc8\xe3\xc9\xe3\xca\xe3\xcb\xe3\xcc\xe3\xcd\xe3\xce\xe3\xcf\xe3\xd0\xe3\xd1\xe3\xd2\xe3\xd3\xe3\xd4\xe3\xd5\xe3\xd6\xe3\xd7\xe3\xd8\xe3\xd9\xe3\xda\xe3\xdb\xe3\xdc\xe3\xdd\xe3\xde\xe3\xdf\xe3\xe0\xe3\xe1\xe3\xe2\xe3\xe3\xe3\xe4\xe3\xe5\xe3\xe6\xe3\xe7\xe3\xe8\xe3\xe9\xe3\xea", /* 7b80 */ "\x00\x00\xe3\xeb\xe3\xec\xe3\xed\xe3\xee\xe3\xef\xe3\xf0\xe3\xf1\xe3\xf2\xe3\xf3\xe3\xf4\xe3\xf5\xe3\xf6\xe3\xf7\xe3\xf8\xe3\xf9\xe3\xfa\xe3\xfb\xe3\xfc\xe3\xfd\xe3\xfe\xe3\xff\xe4\x00\xe4\x01\xe4\x02\xe4\x03\xe4\x04\xe4\x05\xe4\x06\xe4\x07\xe4\x08\xe4\x09\xe4\x0a\xe4\x0b\xe4\x0c\xe4\x0d\xe4\x0e\xe4\x0f\xe4\x10\xe4\x11\xe4\x12\xe4\x13\xe4\x14\xe4\x15\xe4\x16\xe4\x17\xe4\x18\xe4\x19\xe4\x1a\xe4\x1b\xe4\x1c\xe4\x1d\xe4\x1e\xe4\x1f\xe4\x20\xe4\x21\xe4\x22\xe4\x23\xe4\x24\xe4\x25\xe4\x26\xe4\x27\xe4\x28\xe4\x29\xe4\x2a\xe4\x2b\xe4\x2c\xe4\x2d\xe4\x2e\xe4\x2f\xe4\x30\xe4\x31\xe4\x32\xe4\x33\xe4\x34\xe4\x35\xe4\x36\xe4\x37\xe4\x38\xe4\x39\xe4\x3a\xe4\x3b\xe4\x3c\xe4\x3d\xe4\x3e\xe4\x3f\xe4\x40\xe4\x41\xe4\x42\xe4\x43\xe4\x44\xe4\x45\xe4\x46\xe4\x47\xe4\x48\xe4\x49\xe4\x4a\xe4\x4b\xe4\x4c\xe4\x4d\xe4\x4e\xe4\x4f\xe4\x50\xe4\x51\xe4\x52\xe4\x53\xe4\x54\xe4\x55\xe4\x56\xe4\x57\xe4\x58\xe4\x59\xe4\x5a\xe4\x5b\xe4\x5c\xe4\x5d\xe4\x5e\xe4\x5f\xe4\x60\xe4\x61\xe4\x62\xe4\x63\xe4\x64\xe4\x65\xe4\x66\xe4\x67\x00\x00\x00\x00", /* 7c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x68\xe4\x69\xe4\x6a\xe4\x6b\xe4\x6c\xe4\x6d\xe4\x6e\xe4\x6f\xe4\x70\xe4\x71\xe4\x72\xe4\x73\xe4\x74\xe4\x75\xe4\x76\xe4\x77\xe4\x78\xe4\x79\xe4\x7a\xe4\x7b\xe4\x7c\xe4\x7d\xe4\x7e\xe4\x7f\xe4\x80\xe4\x81\xe4\x82\xe4\x83\xe4\x84\xe4\x85\xe4\x86\xe4\x87\xe4\x88\xe4\x89\xe4\x8a\xe4\x8b\xe4\x8c\xe4\x8d\xe4\x8e\xe4\x8f\xe4\x90\xe4\x91\xe4\x92\xe4\x93\xe4\x94\xe4\x95\xe4\x96\xe4\x97\xe4\x98\xe4\x99\xe4\x9a\xe4\x9b\xe4\x9c\xe4\x9d\xe4\x9e\xe4\x9f\xe4\xa0\xe4\xa1\xe4\xa2\xe4\xa3\xe4\xa4\xe4\xa5\xe4\xa6", /* 7c80 */ "\x00\x00\xe4\xa7\xe4\xa8\xe4\xa9\xe4\xaa\xe4\xab\xe4\xac\xe4\xad\xe4\xae\xe4\xaf\xe4\xb0\xe4\xb1\xe4\xb2\xe4\xb3\xe4\xb4\xe4\xb5\xe4\xb6\xe4\xb7\xe4\xb8\xe4\xb9\xe4\xba\xe4\xbb\xe4\xbc\xe4\xbd\xe4\xbe\xe4\xbf\xe4\xc0\xe4\xc1\xe4\xc2\xe4\xc3\xe4\xc4\xe4\xc5\xe4\xc6\xe4\xc7\xe4\xc8\xe4\xc9\xe4\xca\xe4\xcb\xe4\xcc\xe4\xcd\xe4\xce\xe4\xcf\xe4\xd0\xe4\xd1\xe4\xd2\xe4\xd3\xe4\xd4\xe4\xd5\xe4\xd6\xe4\xd7\xe4\xd8\xe4\xd9\xe4\xda\xe4\xdb\xe4\xdc\xe4\xdd\xe4\xde\xe4\xdf\xe4\xe0\xe4\xe1\xe4\xe2\xe4\xe3\xe4\xe4\xe4\xe5\xe4\xe6\xe4\xe7\xe4\xe8\xe4\xe9\xe4\xea\xe4\xeb\xe4\xec\xe4\xed\xe4\xee\xe4\xef\xe4\xf0\xe4\xf1\xe4\xf2\xe4\xf3\xe4\xf4\xe4\xf5\xe4\xf6\xe4\xf7\xe4\xf8\xe4\xf9\xe4\xfa\xe4\xfb\xe4\xfc\xe4\xfd\xe4\xfe\xe4\xff\xe5\x00\xe5\x01\xe5\x02\xe5\x03\xe5\x04\xe5\x05\xe5\x06\xe5\x07\xe5\x08\xe5\x09\xe5\x0a\xe5\x0b\xe5\x0c\xe5\x0d\xe5\x0e\xe5\x0f\xe5\x10\xe5\x11\xe5\x12\xe5\x13\xe5\x14\xe5\x15\xe5\x16\xe5\x17\xe5\x18\xe5\x19\xe5\x1a\xe5\x1b\xe5\x1c\xe5\x1d\xe5\x1e\xe5\x1f\xe5\x20\xe5\x21\xe5\x22\xe5\x23\x00\x00\x00\x00", /* 7d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x24\xe5\x25\xe5\x26\xe5\x27\xe5\x28\xe5\x29\xe5\x2a\xe5\x2b\xe5\x2c\xe5\x2d\xe5\x2e\xe5\x2f\xe5\x30\xe5\x31\xe5\x32\xe5\x33\xe5\x34\xe5\x35\xe5\x36\xe5\x37\xe5\x38\xe5\x39\xe5\x3a\xe5\x3b\xe5\x3c\xe5\x3d\xe5\x3e\xe5\x3f\xe5\x40\xe5\x41\xe5\x42\xe5\x43\xe5\x44\xe5\x45\xe5\x46\xe5\x47\xe5\x48\xe5\x49\xe5\x4a\xe5\x4b\xe5\x4c\xe5\x4d\xe5\x4e\xe5\x4f\xe5\x50\xe5\x51\xe5\x52\xe5\x53\xe5\x54\xe5\x55\xe5\x56\xe5\x57\xe5\x58\xe5\x59\xe5\x5a\xe5\x5b\xe5\x5c\xe5\x5d\xe5\x5e\xe5\x5f\xe5\x60\xe5\x61\xe5\x62", /* 7d80 */ "\x00\x00\xe5\x63\xe5\x64\xe5\x65\xe5\x66\xe5\x67\xe5\x68\xe5\x69\xe5\x6a\xe5\x6b\xe5\x6c\xe5\x6d\xe5\x6e\xe5\x6f\xe5\x70\xe5\x71\xe5\x72\xe5\x73\xe5\x74\xe5\x75\xe5\x76\xe5\x77\xe5\x78\xe5\x79\xe5\x7a\xe5\x7b\xe5\x7c\xe5\x7d\xe5\x7e\xe5\x7f\xe5\x80\xe5\x81\xe5\x82\xe5\x83\xe5\x84\xe5\x85\xe5\x86\xe5\x87\xe5\x88\xe5\x89\xe5\x8a\xe5\x8b\xe5\x8c\xe5\x8d\xe5\x8e\xe5\x8f\xe5\x90\xe5\x91\xe5\x92\xe5\x93\xe5\x94\xe5\x95\xe5\x96\xe5\x97\xe5\x98\xe5\x99\xe5\x9a\xe5\x9b\xe5\x9c\xe5\x9d\xe5\x9e\xe5\x9f\xe5\xa0\xe5\xa1\xe5\xa2\xe5\xa3\xe5\xa4\xe5\xa5\xe5\xa6\xe5\xa7\xe5\xa8\xe5\xa9\xe5\xaa\xe5\xab\xe5\xac\xe5\xad\xe5\xae\xe5\xaf\xe5\xb0\xe5\xb1\xe5\xb2\xe5\xb3\xe5\xb4\xe5\xb5\xe5\xb6\xe5\xb7\xe5\xb8\xe5\xb9\xe5\xba\xe5\xbb\xe5\xbc\xe5\xbd\xe5\xbe\xe5\xbf\xe5\xc0\xe5\xc1\xe5\xc2\xe5\xc3\xe5\xc4\xe5\xc5\xe5\xc6\xe5\xc7\xe5\xc8\xe5\xc9\xe5\xca\xe5\xcb\xe5\xcc\xe5\xcd\xe5\xce\xe5\xcf\xe5\xd0\xe5\xd1\xe5\xd2\xe5\xd3\xe5\xd4\xe5\xd5\xe5\xd6\xe5\xd7\xe5\xd8\xe5\xd9\xe5\xda\xe5\xdb\xe5\xdc\xe5\xdd\xe5\xde\xe5\xdf\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xe0\xe5\xe1\xe5\xe2\xe5\xe3\xe5\xe4\xe5\xe5\xe5\xe6\xe5\xe7\xe5\xe8\xe5\xe9\xe5\xea\xe5\xeb\xe5\xec\xe5\xed\xe5\xee\xe5\xef\xe5\xf0\xe5\xf1\xe5\xf2\xe5\xf3\xe5\xf4\xe5\xf5\xe5\xf6\xe5\xf7\xe5\xf8\xe5\xf9\xe5\xfa\xe5\xfb\xe5\xfc\xe5\xfd\xe5\xfe\xe5\xff\xe6\x00\xe6\x01\xe6\x02\xe6\x03\xe6\x04\xe6\x05\xe6\x06\xe6\x07\xe6\x08\xe6\x09\xe6\x0a\xe6\x0b\xe6\x0c\xe6\x0d\xe6\x0e\xe6\x0f\xe6\x10\xe6\x11\xe6\x12\xe6\x13\xe6\x14\xe6\x15\xe6\x16\xe6\x17\xe6\x18\xe6\x19\xe6\x1a\xe6\x1b\xe6\x1c\xe6\x1d\xe6\x1e", /* 7e80 */ "\x00\x00\xe6\x1f\xe6\x20\xe6\x21\xe6\x22\xe6\x23\xe6\x24\xe6\x25\xe6\x26\xe6\x27\xe6\x28\xe6\x29\xe6\x2a\xe6\x2b\xe6\x2c\xe6\x2d\xe6\x2e\xe6\x2f\xe6\x30\xe6\x31\xe6\x32\xe6\x33\xe6\x34\xe6\x35\xe6\x36\xe6\x37\xe6\x38\xe6\x39\xe6\x3a\xe6\x3b\xe6\x3c\xe6\x3d\xe6\x3e\xe6\x3f\xe6\x40\xe6\x41\xe6\x42\xe6\x43\xe6\x44\xe6\x45\xe6\x46\xe6\x47\xe6\x48\xe6\x49\xe6\x4a\xe6\x4b\xe6\x4c\xe6\x4d\xe6\x4e\xe6\x4f\xe6\x50\xe6\x51\xe6\x52\xe6\x53\xe6\x54\xe6\x55\xe6\x56\xe6\x57\xe6\x58\xe6\x59\xe6\x5a\xe6\x5b\xe6\x5c\xe6\x5d\xe6\x5e\xe6\x5f\xe6\x60\xe6\x61\xe6\x62\xe6\x63\xe6\x64\xe6\x65\xe6\x66\xe6\x67\xe6\x68\xe6\x69\xe6\x6a\xe6\x6b\xe6\x6c\xe6\x6d\xe6\x6e\xe6\x6f\xe6\x70\xe6\x71\xe6\x72\xe6\x73\xe6\x74\xe6\x75\xe6\x76\xe6\x77\xe6\x78\xe6\x79\xe6\x7a\xe6\x7b\xe6\x7c\xe6\x7d\xe6\x7e\xe6\x7f\xe6\x80\xe6\x81\xe6\x82\xe6\x83\xe6\x84\xe6\x85\xe6\x86\xe6\x87\xe6\x88\xe6\x89\xe6\x8a\xe6\x8b\xe6\x8c\xe6\x8d\xe6\x8e\xe6\x8f\xe6\x90\xe6\x91\xe6\x92\xe6\x93\xe6\x94\xe6\x95\xe6\x96\xe6\x97\xe6\x98\xe6\x99\xe6\x9a\xe6\x9b\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x9c\xe6\x9d\xe6\x9e\xe6\x9f\xe6\xa0\xe6\xa1\xe6\xa2\xe6\xa3\xe6\xa4\xe6\xa5\xe6\xa6\xe6\xa7\xe6\xa8\xe6\xa9\xe6\xaa\xe6\xab\xe6\xac\xe6\xad\xe6\xae\xe6\xaf\xe6\xb0\xe6\xb1\xe6\xb2\xe6\xb3\xe6\xb4\xe6\xb5\xe6\xb6\xe6\xb7\xe6\xb8\xe6\xb9\xe6\xba\xe6\xbb\xe6\xbc\xe6\xbd\xe6\xbe\xe6\xbf\xe6\xc0\xe6\xc1\xe6\xc2\xe6\xc3\xe6\xc4\xe6\xc5\xe6\xc6\xe6\xc7\xe6\xc8\xe6\xc9\xe6\xca\xe6\xcb\xe6\xcc\xe6\xcd\xe6\xce\xe6\xcf\xe6\xd0\xe6\xd1\xe6\xd2\xe6\xd3\xe6\xd4\xe6\xd5\xe6\xd6\xe6\xd7\xe6\xd8\xe6\xd9\xe6\xda", /* 7f80 */ "\x00\x00\xe6\xdb\xe6\xdc\xe6\xdd\xe6\xde\xe6\xdf\xe6\xe0\xe6\xe1\xe6\xe2\xe6\xe3\xe6\xe4\xe6\xe5\xe6\xe6\xe6\xe7\xe6\xe8\xe6\xe9\xe6\xea\xe6\xeb\xe6\xec\xe6\xed\xe6\xee\xe6\xef\xe6\xf0\xe6\xf1\xe6\xf2\xe6\xf3\xe6\xf4\xe6\xf5\xe6\xf6\xe6\xf7\xe6\xf8\xe6\xf9\xe6\xfa\xe6\xfb\xe6\xfc\xe6\xfd\xe6\xfe\xe6\xff\xe7\x00\xe7\x01\xe7\x02\xe7\x03\xe7\x04\xe7\x05\xe7\x06\xe7\x07\xe7\x08\xe7\x09\xe7\x0a\xe7\x0b\xe7\x0c\xe7\x0d\xe7\x0e\xe7\x0f\xe7\x10\xe7\x11\xe7\x12\xe7\x13\xe7\x14\xe7\x15\xe7\x16\xe7\x17\xe7\x18\xe7\x19\xe7\x1a\xe7\x1b\xe7\x1c\xe7\x1d\xe7\x1e\xe7\x1f\xe7\x20\xe7\x21\xe7\x22\xe7\x23\xe7\x24\xe7\x25\xe7\x26\xe7\x27\xe7\x28\xe7\x29\xe7\x2a\xe7\x2b\xe7\x2c\xe7\x2d\xe7\x2e\xe7\x2f\xe7\x30\xe7\x31\xe7\x32\xe7\x33\xe7\x34\xe7\x35\xe7\x36\xe7\x37\xe7\x38\xe7\x39\xe7\x3a\xe7\x3b\xe7\x3c\xe7\x3d\xe7\x3e\xe7\x3f\xe7\x40\xe7\x41\xe7\x42\xe7\x43\xe7\x44\xe7\x45\xe7\x46\xe7\x47\xe7\x48\xe7\x49\xe7\x4a\xe7\x4b\xe7\x4c\xe7\x4d\xe7\x4e\xe7\x4f\xe7\x50\xe7\x51\xe7\x52\xe7\x53\xe7\x54\xe7\x55\xe7\x56\xe7\x57\x00\x00\x00\x00", /* 8000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x58\xe7\x59\xe7\x5a\xe7\x5b\xe7\x5c\xe7\x5d\xe7\x5e\xe7\x5f\xe7\x60\xe7\x61\xe7\x62\xe7\x63\xe7\x64\xe7\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8080 */ NULL, /* 8100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x02\x4e\x04\x4e\x05\x4e\x06\x4e\x0f\x4e\x12\x4e\x17\x4e\x1f\x4e\x20\x4e\x21\x4e\x23\x4e\x26\x4e\x29\x4e\x2e\x4e\x2f\x4e\x31\x4e\x33\x4e\x35\x4e\x37\x4e\x3c\x4e\x40\x4e\x41\x4e\x42\x4e\x44\x4e\x46\x4e\x4a\x4e\x51\x4e\x55\x4e\x57\x4e\x5a\x4e\x5b\x4e\x62\x4e\x63\x4e\x64\x4e\x65\x4e\x67\x4e\x68\x4e\x6a\x4e\x6b\x4e\x6c\x4e\x6d\x4e\x6e\x4e\x6f\x4e\x72\x4e\x74\x4e\x75\x4e\x76\x4e\x77\x4e\x78\x4e\x79\x4e\x7a\x4e\x7b\x4e\x7c\x4e\x7d\x4e\x7f\x4e\x80\x4e\x81\x4e\x82\x4e\x83\x4e\x84\x4e\x85\x4e\x87\x4e\x8a", /* 8180 */ "\x00\x00\x4e\x90\x4e\x96\x4e\x97\x4e\x99\x4e\x9c\x4e\x9d\x4e\x9e\x4e\xa3\x4e\xaa\x4e\xaf\x4e\xb0\x4e\xb1\x4e\xb4\x4e\xb6\x4e\xb7\x4e\xb8\x4e\xb9\x4e\xbc\x4e\xbd\x4e\xbe\x4e\xc8\x4e\xcc\x4e\xcf\x4e\xd0\x4e\xd2\x4e\xda\x4e\xdb\x4e\xdc\x4e\xe0\x4e\xe2\x4e\xe6\x4e\xe7\x4e\xe9\x4e\xed\x4e\xee\x4e\xef\x4e\xf1\x4e\xf4\x4e\xf8\x4e\xf9\x4e\xfa\x4e\xfc\x4e\xfe\x4f\x00\x4f\x02\x4f\x03\x4f\x04\x4f\x05\x4f\x06\x4f\x07\x4f\x08\x4f\x0b\x4f\x0c\x4f\x12\x4f\x13\x4f\x14\x4f\x15\x4f\x16\x4f\x1c\x4f\x1d\x4f\x21\x4f\x23\x4f\x28\x4f\x29\x4f\x2c\x4f\x2d\x4f\x2e\x4f\x31\x4f\x33\x4f\x35\x4f\x37\x4f\x39\x4f\x3b\x4f\x3e\x4f\x3f\x4f\x40\x4f\x41\x4f\x42\x4f\x44\x4f\x45\x4f\x47\x4f\x48\x4f\x49\x4f\x4a\x4f\x4b\x4f\x4c\x4f\x52\x4f\x54\x4f\x56\x4f\x61\x4f\x62\x4f\x66\x4f\x68\x4f\x6a\x4f\x6b\x4f\x6d\x4f\x6e\x4f\x71\x4f\x72\x4f\x75\x4f\x77\x4f\x78\x4f\x79\x4f\x7a\x4f\x7d\x4f\x80\x4f\x81\x4f\x82\x4f\x85\x4f\x86\x4f\x87\x4f\x8a\x4f\x8c\x4f\x8e\x4f\x90\x4f\x92\x4f\x93\x4f\x95\x4f\x96\x4f\x98\x4f\x99\x4f\x9a\x4f\x9c\x4f\x9e\x4f\x9f\x00\x00\x00\x00", /* 8200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\xa1\x4f\xa2\x4f\xa4\x4f\xab\x4f\xad\x4f\xb0\x4f\xb1\x4f\xb2\x4f\xb3\x4f\xb4\x4f\xb6\x4f\xb7\x4f\xb8\x4f\xb9\x4f\xba\x4f\xbb\x4f\xbc\x4f\xbd\x4f\xbe\x4f\xc0\x4f\xc1\x4f\xc2\x4f\xc6\x4f\xc7\x4f\xc8\x4f\xc9\x4f\xcb\x4f\xcc\x4f\xcd\x4f\xd2\x4f\xd3\x4f\xd4\x4f\xd5\x4f\xd6\x4f\xd9\x4f\xdb\x4f\xe0\x4f\xe2\x4f\xe4\x4f\xe5\x4f\xe7\x4f\xeb\x4f\xec\x4f\xf0\x4f\xf2\x4f\xf4\x4f\xf5\x4f\xf6\x4f\xf7\x4f\xf9\x4f\xfb\x4f\xfc\x4f\xfd\x4f\xff\x50\x00\x50\x01\x50\x02\x50\x03\x50\x04\x50\x05\x50\x06\x50\x07\x50\x08", /* 8280 */ "\x00\x00\x50\x09\x50\x0a\x50\x0b\x50\x0e\x50\x10\x50\x11\x50\x13\x50\x15\x50\x16\x50\x17\x50\x1b\x50\x1d\x50\x1e\x50\x20\x50\x22\x50\x23\x50\x24\x50\x27\x50\x2b\x50\x2f\x50\x30\x50\x31\x50\x32\x50\x33\x50\x34\x50\x35\x50\x36\x50\x37\x50\x38\x50\x39\x50\x3b\x50\x3d\x50\x3f\x50\x40\x50\x41\x50\x42\x50\x44\x50\x45\x50\x46\x50\x49\x50\x4a\x50\x4b\x50\x4d\x50\x50\x50\x51\x50\x52\x50\x53\x50\x54\x50\x56\x50\x57\x50\x58\x50\x59\x50\x5b\x50\x5d\x50\x5e\x50\x5f\x50\x60\x50\x61\x50\x62\x50\x63\x50\x64\x50\x66\x50\x67\x50\x68\x50\x69\x50\x6a\x50\x6b\x50\x6d\x50\x6e\x50\x6f\x50\x70\x50\x71\x50\x72\x50\x73\x50\x74\x50\x75\x50\x78\x50\x79\x50\x7a\x50\x7c\x50\x7d\x50\x81\x50\x82\x50\x83\x50\x84\x50\x86\x50\x87\x50\x89\x50\x8a\x50\x8b\x50\x8c\x50\x8e\x50\x8f\x50\x90\x50\x91\x50\x92\x50\x93\x50\x94\x50\x95\x50\x96\x50\x97\x50\x98\x50\x99\x50\x9a\x50\x9b\x50\x9c\x50\x9d\x50\x9e\x50\x9f\x50\xa0\x50\xa1\x50\xa2\x50\xa4\x50\xa6\x50\xaa\x50\xab\x50\xad\x50\xae\x50\xaf\x50\xb0\x50\xb1\x50\xb3\x50\xb4\x50\xb5\x50\xb6\x00\x00\x00\x00", /* 8300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xb7\x50\xb8\x50\xb9\x50\xbc\x50\xbd\x50\xbe\x50\xbf\x50\xc0\x50\xc1\x50\xc2\x50\xc3\x50\xc4\x50\xc5\x50\xc6\x50\xc7\x50\xc8\x50\xc9\x50\xca\x50\xcb\x50\xcc\x50\xcd\x50\xce\x50\xd0\x50\xd1\x50\xd2\x50\xd3\x50\xd4\x50\xd5\x50\xd7\x50\xd8\x50\xd9\x50\xdb\x50\xdc\x50\xdd\x50\xde\x50\xdf\x50\xe0\x50\xe1\x50\xe2\x50\xe3\x50\xe4\x50\xe5\x50\xe8\x50\xe9\x50\xea\x50\xeb\x50\xef\x50\xf0\x50\xf1\x50\xf2\x50\xf4\x50\xf6\x50\xf7\x50\xf8\x50\xf9\x50\xfa\x50\xfc\x50\xfd\x50\xfe\x50\xff\x51\x00\x51\x01\x51\x02", /* 8380 */ "\x00\x00\x51\x03\x51\x04\x51\x05\x51\x08\x51\x09\x51\x0a\x51\x0c\x51\x0d\x51\x0e\x51\x0f\x51\x10\x51\x11\x51\x13\x51\x14\x51\x15\x51\x16\x51\x17\x51\x18\x51\x19\x51\x1a\x51\x1b\x51\x1c\x51\x1d\x51\x1e\x51\x1f\x51\x20\x51\x22\x51\x23\x51\x24\x51\x25\x51\x26\x51\x27\x51\x28\x51\x29\x51\x2a\x51\x2b\x51\x2c\x51\x2d\x51\x2e\x51\x2f\x51\x30\x51\x31\x51\x32\x51\x33\x51\x34\x51\x35\x51\x36\x51\x37\x51\x38\x51\x39\x51\x3a\x51\x3b\x51\x3c\x51\x3d\x51\x3e\x51\x42\x51\x47\x51\x4a\x51\x4c\x51\x4e\x51\x4f\x51\x50\x51\x52\x51\x53\x51\x57\x51\x58\x51\x59\x51\x5b\x51\x5d\x51\x5e\x51\x5f\x51\x60\x51\x61\x51\x63\x51\x64\x51\x66\x51\x67\x51\x69\x51\x6a\x51\x6f\x51\x72\x51\x7a\x51\x7e\x51\x7f\x51\x83\x51\x84\x51\x86\x51\x87\x51\x8a\x51\x8b\x51\x8e\x51\x8f\x51\x90\x51\x91\x51\x93\x51\x94\x51\x98\x51\x9a\x51\x9d\x51\x9e\x51\x9f\x51\xa1\x51\xa3\x51\xa6\x51\xa7\x51\xa8\x51\xa9\x51\xaa\x51\xad\x51\xae\x51\xb4\x51\xb8\x51\xb9\x51\xba\x51\xbe\x51\xbf\x51\xc1\x51\xc2\x51\xc3\x51\xc5\x51\xc8\x51\xca\x51\xcd\x51\xce\x51\xd0\x00\x00\x00\x00", /* 8400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\xd2\x51\xd3\x51\xd4\x51\xd5\x51\xd6\x51\xd7\x51\xd8\x51\xd9\x51\xda\x51\xdc\x51\xde\x51\xdf\x51\xe2\x51\xe3\x51\xe5\x51\xe6\x51\xe7\x51\xe8\x51\xe9\x51\xea\x51\xec\x51\xee\x51\xf1\x51\xf2\x51\xf4\x51\xf7\x51\xfe\x52\x04\x52\x05\x52\x09\x52\x0b\x52\x0c\x52\x0f\x52\x10\x52\x13\x52\x14\x52\x15\x52\x1c\x52\x1e\x52\x1f\x52\x21\x52\x22\x52\x23\x52\x25\x52\x26\x52\x27\x52\x2a\x52\x2c\x52\x2f\x52\x31\x52\x32\x52\x34\x52\x35\x52\x3c\x52\x3e\x52\x44\x52\x45\x52\x46\x52\x47\x52\x48\x52\x49\x52\x4b\x52\x4e", /* 8480 */ "\x00\x00\x52\x4f\x52\x52\x52\x53\x52\x55\x52\x57\x52\x58\x52\x59\x52\x5a\x52\x5b\x52\x5d\x52\x5f\x52\x60\x52\x62\x52\x63\x52\x64\x52\x66\x52\x68\x52\x6b\x52\x6c\x52\x6d\x52\x6e\x52\x70\x52\x71\x52\x73\x52\x74\x52\x75\x52\x76\x52\x77\x52\x78\x52\x79\x52\x7a\x52\x7b\x52\x7c\x52\x7e\x52\x80\x52\x83\x52\x84\x52\x85\x52\x86\x52\x87\x52\x89\x52\x8a\x52\x8b\x52\x8c\x52\x8d\x52\x8e\x52\x8f\x52\x91\x52\x92\x52\x94\x52\x95\x52\x96\x52\x97\x52\x98\x52\x99\x52\x9a\x52\x9c\x52\xa4\x52\xa5\x52\xa6\x52\xa7\x52\xae\x52\xaf\x52\xb0\x52\xb4\x52\xb5\x52\xb6\x52\xb7\x52\xb8\x52\xb9\x52\xba\x52\xbb\x52\xbc\x52\xbd\x52\xc0\x52\xc1\x52\xc2\x52\xc4\x52\xc5\x52\xc6\x52\xc8\x52\xca\x52\xcc\x52\xcd\x52\xce\x52\xcf\x52\xd1\x52\xd3\x52\xd4\x52\xd5\x52\xd7\x52\xd9\x52\xda\x52\xdb\x52\xdc\x52\xdd\x52\xde\x52\xe0\x52\xe1\x52\xe2\x52\xe3\x52\xe5\x52\xe6\x52\xe7\x52\xe8\x52\xe9\x52\xea\x52\xeb\x52\xec\x52\xed\x52\xee\x52\xef\x52\xf1\x52\xf2\x52\xf3\x52\xf4\x52\xf5\x52\xf6\x52\xf7\x52\xf8\x52\xfb\x52\xfc\x52\xfd\x53\x01\x53\x02\x00\x00\x00\x00", /* 8500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x03\x53\x04\x53\x07\x53\x09\x53\x0a\x53\x0b\x53\x0c\x53\x0e\x53\x11\x53\x12\x53\x13\x53\x14\x53\x18\x53\x1b\x53\x1c\x53\x1e\x53\x1f\x53\x22\x53\x24\x53\x25\x53\x27\x53\x28\x53\x29\x53\x2b\x53\x2c\x53\x2d\x53\x2f\x53\x30\x53\x31\x53\x32\x53\x33\x53\x34\x53\x35\x53\x36\x53\x37\x53\x38\x53\x3c\x53\x3d\x53\x40\x53\x42\x53\x44\x53\x46\x53\x4b\x53\x4c\x53\x4d\x53\x50\x53\x54\x53\x58\x53\x59\x53\x5b\x53\x5d\x53\x65\x53\x68\x53\x6a\x53\x6c\x53\x6d\x53\x72\x53\x76\x53\x79\x53\x7b\x53\x7c\x53\x7d\x53\x7e", /* 8580 */ "\x00\x00\x53\x80\x53\x81\x53\x83\x53\x87\x53\x88\x53\x8a\x53\x8e\x53\x8f\x53\x90\x53\x91\x53\x92\x53\x93\x53\x94\x53\x96\x53\x97\x53\x99\x53\x9b\x53\x9c\x53\x9e\x53\xa0\x53\xa1\x53\xa4\x53\xa7\x53\xaa\x53\xab\x53\xac\x53\xad\x53\xaf\x53\xb0\x53\xb1\x53\xb2\x53\xb3\x53\xb4\x53\xb5\x53\xb7\x53\xb8\x53\xb9\x53\xba\x53\xbc\x53\xbd\x53\xbe\x53\xc0\x53\xc3\x53\xc4\x53\xc5\x53\xc6\x53\xc7\x53\xce\x53\xcf\x53\xd0\x53\xd2\x53\xd3\x53\xd5\x53\xda\x53\xdc\x53\xdd\x53\xde\x53\xe1\x53\xe2\x53\xe7\x53\xf4\x53\xfa\x53\xfe\x53\xff\x54\x00\x54\x02\x54\x05\x54\x07\x54\x0b\x54\x14\x54\x18\x54\x19\x54\x1a\x54\x1c\x54\x22\x54\x24\x54\x25\x54\x2a\x54\x30\x54\x33\x54\x36\x54\x37\x54\x3a\x54\x3d\x54\x3f\x54\x41\x54\x42\x54\x44\x54\x45\x54\x47\x54\x49\x54\x4c\x54\x4d\x54\x4e\x54\x4f\x54\x51\x54\x5a\x54\x5d\x54\x5e\x54\x5f\x54\x60\x54\x61\x54\x63\x54\x65\x54\x67\x54\x69\x54\x6a\x54\x6b\x54\x6c\x54\x6d\x54\x6e\x54\x6f\x54\x70\x54\x74\x54\x79\x54\x7a\x54\x7e\x54\x7f\x54\x81\x54\x83\x54\x85\x54\x87\x54\x88\x54\x89\x54\x8a\x00\x00\x00\x00", /* 8600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x8d\x54\x91\x54\x93\x54\x97\x54\x98\x54\x9c\x54\x9e\x54\x9f\x54\xa0\x54\xa1\x54\xa2\x54\xa5\x54\xae\x54\xb0\x54\xb2\x54\xb5\x54\xb6\x54\xb7\x54\xb9\x54\xba\x54\xbc\x54\xbe\x54\xc3\x54\xc5\x54\xca\x54\xcb\x54\xd6\x54\xd8\x54\xdb\x54\xe0\x54\xe1\x54\xe2\x54\xe3\x54\xe4\x54\xeb\x54\xec\x54\xef\x54\xf0\x54\xf1\x54\xf4\x54\xf5\x54\xf6\x54\xf7\x54\xf8\x54\xf9\x54\xfb\x54\xfe\x55\x00\x55\x02\x55\x03\x55\x04\x55\x05\x55\x08\x55\x0a\x55\x0b\x55\x0c\x55\x0d\x55\x0e\x55\x12\x55\x13\x55\x15\x55\x16\x55\x17", /* 8680 */ "\x00\x00\x55\x18\x55\x19\x55\x1a\x55\x1c\x55\x1d\x55\x1e\x55\x1f\x55\x21\x55\x25\x55\x26\x55\x28\x55\x29\x55\x2b\x55\x2d\x55\x32\x55\x34\x55\x35\x55\x36\x55\x38\x55\x39\x55\x3a\x55\x3b\x55\x3d\x55\x40\x55\x42\x55\x45\x55\x47\x55\x48\x55\x4b\x55\x4c\x55\x4d\x55\x4e\x55\x4f\x55\x51\x55\x52\x55\x53\x55\x54\x55\x57\x55\x58\x55\x59\x55\x5a\x55\x5b\x55\x5d\x55\x5e\x55\x5f\x55\x60\x55\x62\x55\x63\x55\x68\x55\x69\x55\x6b\x55\x6f\x55\x70\x55\x71\x55\x72\x55\x73\x55\x74\x55\x79\x55\x7a\x55\x7d\x55\x7f\x55\x85\x55\x86\x55\x8c\x55\x8d\x55\x8e\x55\x90\x55\x92\x55\x93\x55\x95\x55\x96\x55\x97\x55\x9a\x55\x9b\x55\x9e\x55\xa0\x55\xa1\x55\xa2\x55\xa3\x55\xa4\x55\xa5\x55\xa6\x55\xa8\x55\xa9\x55\xaa\x55\xab\x55\xac\x55\xad\x55\xae\x55\xaf\x55\xb0\x55\xb2\x55\xb4\x55\xb6\x55\xb8\x55\xba\x55\xbc\x55\xbf\x55\xc0\x55\xc1\x55\xc2\x55\xc3\x55\xc6\x55\xc7\x55\xc8\x55\xca\x55\xcb\x55\xce\x55\xcf\x55\xd0\x55\xd5\x55\xd7\x55\xd8\x55\xd9\x55\xda\x55\xdb\x55\xde\x55\xe0\x55\xe2\x55\xe7\x55\xe9\x55\xed\x55\xee\x55\xf0\x55\xf1\x00\x00\x00\x00", /* 8700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\xf4\x55\xf6\x55\xf8\x55\xf9\x55\xfa\x55\xfb\x55\xfc\x55\xff\x56\x02\x56\x03\x56\x04\x56\x05\x56\x06\x56\x07\x56\x0a\x56\x0b\x56\x0d\x56\x10\x56\x11\x56\x12\x56\x13\x56\x14\x56\x15\x56\x16\x56\x17\x56\x19\x56\x1a\x56\x1c\x56\x1d\x56\x20\x56\x21\x56\x22\x56\x25\x56\x26\x56\x28\x56\x29\x56\x2a\x56\x2b\x56\x2e\x56\x2f\x56\x30\x56\x33\x56\x35\x56\x37\x56\x38\x56\x3a\x56\x3c\x56\x3d\x56\x3e\x56\x40\x56\x41\x56\x42\x56\x43\x56\x44\x56\x45\x56\x46\x56\x47\x56\x48\x56\x49\x56\x4a\x56\x4b\x56\x4f\x56\x50", /* 8780 */ "\x00\x00\x56\x51\x56\x52\x56\x53\x56\x55\x56\x56\x56\x5a\x56\x5b\x56\x5d\x56\x5e\x56\x5f\x56\x60\x56\x61\x56\x63\x56\x65\x56\x66\x56\x67\x56\x6d\x56\x6e\x56\x6f\x56\x70\x56\x72\x56\x73\x56\x74\x56\x75\x56\x77\x56\x78\x56\x79\x56\x7a\x56\x7d\x56\x7e\x56\x7f\x56\x80\x56\x81\x56\x82\x56\x83\x56\x84\x56\x87\x56\x88\x56\x89\x56\x8a\x56\x8b\x56\x8c\x56\x8d\x56\x90\x56\x91\x56\x92\x56\x94\x56\x95\x56\x96\x56\x97\x56\x98\x56\x99\x56\x9a\x56\x9b\x56\x9c\x56\x9d\x56\x9e\x56\x9f\x56\xa0\x56\xa1\x56\xa2\x56\xa4\x56\xa5\x56\xa6\x56\xa7\x56\xa8\x56\xa9\x56\xaa\x56\xab\x56\xac\x56\xad\x56\xae\x56\xb0\x56\xb1\x56\xb2\x56\xb3\x56\xb4\x56\xb5\x56\xb6\x56\xb8\x56\xb9\x56\xba\x56\xbb\x56\xbd\x56\xbe\x56\xbf\x56\xc0\x56\xc1\x56\xc2\x56\xc3\x56\xc4\x56\xc5\x56\xc6\x56\xc7\x56\xc8\x56\xc9\x56\xcb\x56\xcc\x56\xcd\x56\xce\x56\xcf\x56\xd0\x56\xd1\x56\xd2\x56\xd3\x56\xd5\x56\xd6\x56\xd8\x56\xd9\x56\xdc\x56\xe3\x56\xe5\x56\xe6\x56\xe7\x56\xe8\x56\xe9\x56\xea\x56\xec\x56\xee\x56\xef\x56\xf2\x56\xf3\x56\xf6\x56\xf7\x56\xf8\x00\x00\x00\x00", /* 8800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\xfb\x56\xfc\x57\x00\x57\x01\x57\x02\x57\x05\x57\x07\x57\x0b\x57\x0c\x57\x0d\x57\x0e\x57\x0f\x57\x10\x57\x11\x57\x12\x57\x13\x57\x14\x57\x15\x57\x16\x57\x17\x57\x18\x57\x19\x57\x1a\x57\x1b\x57\x1d\x57\x1e\x57\x20\x57\x21\x57\x22\x57\x24\x57\x25\x57\x26\x57\x27\x57\x2b\x57\x31\x57\x32\x57\x34\x57\x35\x57\x36\x57\x37\x57\x38\x57\x3c\x57\x3d\x57\x3f\x57\x41\x57\x43\x57\x44\x57\x45\x57\x46\x57\x48\x57\x49\x57\x4b\x57\x52\x57\x53\x57\x54\x57\x55\x57\x56\x57\x58\x57\x59\x57\x62\x57\x63\x57\x65\x57\x67", /* 8880 */ "\x00\x00\x57\x6c\x57\x6e\x57\x70\x57\x71\x57\x72\x57\x74\x57\x75\x57\x78\x57\x79\x57\x7a\x57\x7d\x57\x7e\x57\x7f\x57\x80\x57\x81\x57\x87\x57\x88\x57\x89\x57\x8a\x57\x8d\x57\x8e\x57\x8f\x57\x90\x57\x91\x57\x94\x57\x95\x57\x96\x57\x97\x57\x98\x57\x99\x57\x9a\x57\x9c\x57\x9d\x57\x9e\x57\x9f\x57\xa5\x57\xa8\x57\xaa\x57\xac\x57\xaf\x57\xb0\x57\xb1\x57\xb3\x57\xb5\x57\xb6\x57\xb7\x57\xb9\x57\xba\x57\xbb\x57\xbc\x57\xbd\x57\xbe\x57\xbf\x57\xc0\x57\xc1\x57\xc4\x57\xc5\x57\xc6\x57\xc7\x57\xc8\x57\xc9\x57\xca\x57\xcc\x57\xcd\x57\xd0\x57\xd1\x57\xd3\x57\xd6\x57\xd7\x57\xdb\x57\xdc\x57\xde\x57\xe1\x57\xe2\x57\xe3\x57\xe5\x57\xe6\x57\xe7\x57\xe8\x57\xe9\x57\xea\x57\xeb\x57\xec\x57\xee\x57\xf0\x57\xf1\x57\xf2\x57\xf3\x57\xf5\x57\xf6\x57\xf7\x57\xfb\x57\xfc\x57\xfe\x57\xff\x58\x01\x58\x03\x58\x04\x58\x05\x58\x08\x58\x09\x58\x0a\x58\x0c\x58\x0e\x58\x0f\x58\x10\x58\x12\x58\x13\x58\x14\x58\x16\x58\x17\x58\x18\x58\x1a\x58\x1b\x58\x1c\x58\x1d\x58\x1f\x58\x22\x58\x23\x58\x25\x58\x26\x58\x27\x58\x28\x58\x29\x58\x2b\x00\x00\x00\x00", /* 8900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x2c\x58\x2d\x58\x2e\x58\x2f\x58\x31\x58\x32\x58\x33\x58\x34\x58\x36\x58\x37\x58\x38\x58\x39\x58\x3a\x58\x3b\x58\x3c\x58\x3d\x58\x3e\x58\x3f\x58\x40\x58\x41\x58\x42\x58\x43\x58\x45\x58\x46\x58\x47\x58\x48\x58\x49\x58\x4a\x58\x4b\x58\x4e\x58\x4f\x58\x50\x58\x52\x58\x53\x58\x55\x58\x56\x58\x57\x58\x59\x58\x5a\x58\x5b\x58\x5c\x58\x5d\x58\x5f\x58\x60\x58\x61\x58\x62\x58\x63\x58\x64\x58\x66\x58\x67\x58\x68\x58\x69\x58\x6a\x58\x6d\x58\x6e\x58\x6f\x58\x70\x58\x71\x58\x72\x58\x73\x58\x74\x58\x75\x58\x76", /* 8980 */ "\x00\x00\x58\x77\x58\x78\x58\x79\x58\x7a\x58\x7b\x58\x7c\x58\x7d\x58\x7f\x58\x82\x58\x84\x58\x86\x58\x87\x58\x88\x58\x8a\x58\x8b\x58\x8c\x58\x8d\x58\x8e\x58\x8f\x58\x90\x58\x91\x58\x94\x58\x95\x58\x96\x58\x97\x58\x98\x58\x9b\x58\x9c\x58\x9d\x58\xa0\x58\xa1\x58\xa2\x58\xa3\x58\xa4\x58\xa5\x58\xa6\x58\xa7\x58\xaa\x58\xab\x58\xac\x58\xad\x58\xae\x58\xaf\x58\xb0\x58\xb1\x58\xb2\x58\xb3\x58\xb4\x58\xb5\x58\xb6\x58\xb7\x58\xb8\x58\xb9\x58\xba\x58\xbb\x58\xbd\x58\xbe\x58\xbf\x58\xc0\x58\xc2\x58\xc3\x58\xc4\x58\xc6\x58\xc7\x58\xc8\x58\xc9\x58\xca\x58\xcb\x58\xcc\x58\xcd\x58\xce\x58\xcf\x58\xd0\x58\xd2\x58\xd3\x58\xd4\x58\xd6\x58\xd7\x58\xd8\x58\xd9\x58\xda\x58\xdb\x58\xdc\x58\xdd\x58\xde\x58\xdf\x58\xe0\x58\xe1\x58\xe2\x58\xe3\x58\xe5\x58\xe6\x58\xe7\x58\xe8\x58\xe9\x58\xea\x58\xed\x58\xef\x58\xf1\x58\xf2\x58\xf4\x58\xf5\x58\xf7\x58\xf8\x58\xfa\x58\xfb\x58\xfc\x58\xfd\x58\xfe\x58\xff\x59\x00\x59\x01\x59\x03\x59\x05\x59\x06\x59\x08\x59\x09\x59\x0a\x59\x0b\x59\x0c\x59\x0e\x59\x10\x59\x11\x59\x12\x59\x13\x00\x00\x00\x00", /* 8a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x17\x59\x18\x59\x1b\x59\x1d\x59\x1e\x59\x20\x59\x21\x59\x22\x59\x23\x59\x26\x59\x28\x59\x2c\x59\x30\x59\x32\x59\x33\x59\x35\x59\x36\x59\x3b\x59\x3d\x59\x3e\x59\x3f\x59\x40\x59\x43\x59\x45\x59\x46\x59\x4a\x59\x4c\x59\x4d\x59\x50\x59\x52\x59\x53\x59\x59\x59\x5b\x59\x5c\x59\x5d\x59\x5e\x59\x5f\x59\x61\x59\x63\x59\x64\x59\x66\x59\x67\x59\x68\x59\x69\x59\x6a\x59\x6b\x59\x6c\x59\x6d\x59\x6e\x59\x6f\x59\x70\x59\x71\x59\x72\x59\x75\x59\x77\x59\x7a\x59\x7b\x59\x7c\x59\x7e\x59\x7f\x59\x80\x59\x85\x59\x89", /* 8a80 */ "\x00\x00\x59\x8b\x59\x8c\x59\x8e\x59\x8f\x59\x90\x59\x91\x59\x94\x59\x95\x59\x98\x59\x9a\x59\x9b\x59\x9c\x59\x9d\x59\x9f\x59\xa0\x59\xa1\x59\xa2\x59\xa6\x59\xa7\x59\xac\x59\xad\x59\xb0\x59\xb1\x59\xb3\x59\xb4\x59\xb5\x59\xb6\x59\xb7\x59\xb8\x59\xba\x59\xbc\x59\xbd\x59\xbf\x59\xc0\x59\xc1\x59\xc2\x59\xc3\x59\xc4\x59\xc5\x59\xc7\x59\xc8\x59\xc9\x59\xcc\x59\xcd\x59\xce\x59\xcf\x59\xd5\x59\xd6\x59\xd9\x59\xdb\x59\xde\x59\xdf\x59\xe0\x59\xe1\x59\xe2\x59\xe4\x59\xe6\x59\xe7\x59\xe9\x59\xea\x59\xeb\x59\xed\x59\xee\x59\xef\x59\xf0\x59\xf1\x59\xf2\x59\xf3\x59\xf4\x59\xf5\x59\xf6\x59\xf7\x59\xf8\x59\xfa\x59\xfc\x59\xfd\x59\xfe\x5a\x00\x5a\x02\x5a\x0a\x5a\x0b\x5a\x0d\x5a\x0e\x5a\x0f\x5a\x10\x5a\x12\x5a\x14\x5a\x15\x5a\x16\x5a\x17\x5a\x19\x5a\x1a\x5a\x1b\x5a\x1d\x5a\x1e\x5a\x21\x5a\x22\x5a\x24\x5a\x26\x5a\x27\x5a\x28\x5a\x2a\x5a\x2b\x5a\x2c\x5a\x2d\x5a\x2e\x5a\x2f\x5a\x30\x5a\x33\x5a\x35\x5a\x37\x5a\x38\x5a\x39\x5a\x3a\x5a\x3b\x5a\x3d\x5a\x3e\x5a\x3f\x5a\x41\x5a\x42\x5a\x43\x5a\x44\x5a\x45\x5a\x47\x5a\x48\x00\x00\x00\x00", /* 8b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x4b\x5a\x4c\x5a\x4d\x5a\x4e\x5a\x4f\x5a\x50\x5a\x51\x5a\x52\x5a\x53\x5a\x54\x5a\x56\x5a\x57\x5a\x58\x5a\x59\x5a\x5b\x5a\x5c\x5a\x5d\x5a\x5e\x5a\x5f\x5a\x60\x5a\x61\x5a\x63\x5a\x64\x5a\x65\x5a\x66\x5a\x68\x5a\x69\x5a\x6b\x5a\x6c\x5a\x6d\x5a\x6e\x5a\x6f\x5a\x70\x5a\x71\x5a\x72\x5a\x73\x5a\x78\x5a\x79\x5a\x7b\x5a\x7c\x5a\x7d\x5a\x7e\x5a\x80\x5a\x81\x5a\x82\x5a\x83\x5a\x84\x5a\x85\x5a\x86\x5a\x87\x5a\x88\x5a\x89\x5a\x8a\x5a\x8b\x5a\x8c\x5a\x8d\x5a\x8e\x5a\x8f\x5a\x90\x5a\x91\x5a\x93\x5a\x94\x5a\x95", /* 8b80 */ "\x00\x00\x5a\x96\x5a\x97\x5a\x98\x5a\x99\x5a\x9c\x5a\x9d\x5a\x9e\x5a\x9f\x5a\xa0\x5a\xa1\x5a\xa2\x5a\xa3\x5a\xa4\x5a\xa5\x5a\xa6\x5a\xa7\x5a\xa8\x5a\xa9\x5a\xab\x5a\xac\x5a\xad\x5a\xae\x5a\xaf\x5a\xb0\x5a\xb1\x5a\xb4\x5a\xb6\x5a\xb7\x5a\xb9\x5a\xba\x5a\xbb\x5a\xbc\x5a\xbd\x5a\xbf\x5a\xc0\x5a\xc3\x5a\xc4\x5a\xc5\x5a\xc6\x5a\xc7\x5a\xc8\x5a\xca\x5a\xcb\x5a\xcd\x5a\xce\x5a\xcf\x5a\xd0\x5a\xd1\x5a\xd3\x5a\xd5\x5a\xd7\x5a\xd9\x5a\xda\x5a\xdb\x5a\xdd\x5a\xde\x5a\xdf\x5a\xe2\x5a\xe4\x5a\xe5\x5a\xe7\x5a\xe8\x5a\xea\x5a\xec\x5a\xed\x5a\xee\x5a\xef\x5a\xf0\x5a\xf2\x5a\xf3\x5a\xf4\x5a\xf5\x5a\xf6\x5a\xf7\x5a\xf8\x5a\xf9\x5a\xfa\x5a\xfb\x5a\xfc\x5a\xfd\x5a\xfe\x5a\xff\x5b\x00\x5b\x01\x5b\x02\x5b\x03\x5b\x04\x5b\x05\x5b\x06\x5b\x07\x5b\x08\x5b\x0a\x5b\x0b\x5b\x0c\x5b\x0d\x5b\x0e\x5b\x0f\x5b\x10\x5b\x11\x5b\x12\x5b\x13\x5b\x14\x5b\x15\x5b\x18\x5b\x19\x5b\x1a\x5b\x1b\x5b\x1c\x5b\x1d\x5b\x1e\x5b\x1f\x5b\x20\x5b\x21\x5b\x22\x5b\x23\x5b\x24\x5b\x25\x5b\x26\x5b\x27\x5b\x28\x5b\x29\x5b\x2a\x5b\x2b\x5b\x2c\x5b\x2d\x00\x00\x00\x00", /* 8c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x2e\x5b\x2f\x5b\x30\x5b\x31\x5b\x33\x5b\x35\x5b\x36\x5b\x38\x5b\x39\x5b\x3a\x5b\x3b\x5b\x3c\x5b\x3d\x5b\x3e\x5b\x3f\x5b\x41\x5b\x42\x5b\x43\x5b\x44\x5b\x45\x5b\x46\x5b\x47\x5b\x48\x5b\x49\x5b\x4a\x5b\x4b\x5b\x4c\x5b\x4d\x5b\x4e\x5b\x4f\x5b\x52\x5b\x56\x5b\x5e\x5b\x60\x5b\x61\x5b\x67\x5b\x68\x5b\x6b\x5b\x6d\x5b\x6e\x5b\x6f\x5b\x72\x5b\x74\x5b\x76\x5b\x77\x5b\x78\x5b\x79\x5b\x7b\x5b\x7c\x5b\x7e\x5b\x7f\x5b\x82\x5b\x86\x5b\x8a\x5b\x8d\x5b\x8e\x5b\x90\x5b\x91\x5b\x92\x5b\x94\x5b\x96\x5b\x9f\x5b\xa7", /* 8c80 */ "\x00\x00\x5b\xa8\x5b\xa9\x5b\xac\x5b\xad\x5b\xae\x5b\xaf\x5b\xb1\x5b\xb2\x5b\xb7\x5b\xba\x5b\xbb\x5b\xbc\x5b\xc0\x5b\xc1\x5b\xc3\x5b\xc8\x5b\xc9\x5b\xca\x5b\xcb\x5b\xcd\x5b\xce\x5b\xcf\x5b\xd1\x5b\xd4\x5b\xd5\x5b\xd6\x5b\xd7\x5b\xd8\x5b\xd9\x5b\xda\x5b\xdb\x5b\xdc\x5b\xe0\x5b\xe2\x5b\xe3\x5b\xe6\x5b\xe7\x5b\xe9\x5b\xea\x5b\xeb\x5b\xec\x5b\xed\x5b\xef\x5b\xf1\x5b\xf2\x5b\xf3\x5b\xf4\x5b\xf5\x5b\xf6\x5b\xf7\x5b\xfd\x5b\xfe\x5c\x00\x5c\x02\x5c\x03\x5c\x05\x5c\x07\x5c\x08\x5c\x0b\x5c\x0c\x5c\x0d\x5c\x0e\x5c\x10\x5c\x12\x5c\x13\x5c\x17\x5c\x19\x5c\x1b\x5c\x1e\x5c\x1f\x5c\x20\x5c\x21\x5c\x23\x5c\x26\x5c\x28\x5c\x29\x5c\x2a\x5c\x2b\x5c\x2d\x5c\x2e\x5c\x2f\x5c\x30\x5c\x32\x5c\x33\x5c\x35\x5c\x36\x5c\x37\x5c\x43\x5c\x44\x5c\x46\x5c\x47\x5c\x4c\x5c\x4d\x5c\x52\x5c\x53\x5c\x54\x5c\x56\x5c\x57\x5c\x58\x5c\x5a\x5c\x5b\x5c\x5c\x5c\x5d\x5c\x5f\x5c\x62\x5c\x64\x5c\x67\x5c\x68\x5c\x69\x5c\x6a\x5c\x6b\x5c\x6c\x5c\x6d\x5c\x70\x5c\x72\x5c\x73\x5c\x74\x5c\x75\x5c\x76\x5c\x77\x5c\x78\x5c\x7b\x5c\x7c\x5c\x7d\x5c\x7e\x00\x00\x00\x00", /* 8d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x80\x5c\x83\x5c\x84\x5c\x85\x5c\x86\x5c\x87\x5c\x89\x5c\x8a\x5c\x8b\x5c\x8e\x5c\x8f\x5c\x92\x5c\x93\x5c\x95\x5c\x9d\x5c\x9e\x5c\x9f\x5c\xa0\x5c\xa1\x5c\xa4\x5c\xa5\x5c\xa6\x5c\xa7\x5c\xa8\x5c\xaa\x5c\xae\x5c\xaf\x5c\xb0\x5c\xb2\x5c\xb4\x5c\xb6\x5c\xb9\x5c\xba\x5c\xbb\x5c\xbc\x5c\xbe\x5c\xc0\x5c\xc2\x5c\xc3\x5c\xc5\x5c\xc6\x5c\xc7\x5c\xc8\x5c\xc9\x5c\xca\x5c\xcc\x5c\xcd\x5c\xce\x5c\xcf\x5c\xd0\x5c\xd1\x5c\xd3\x5c\xd4\x5c\xd5\x5c\xd6\x5c\xd7\x5c\xd8\x5c\xda\x5c\xdb\x5c\xdc\x5c\xdd\x5c\xde\x5c\xdf", /* 8d80 */ "\x00\x00\x5c\xe0\x5c\xe2\x5c\xe3\x5c\xe7\x5c\xe9\x5c\xeb\x5c\xec\x5c\xee\x5c\xef\x5c\xf1\x5c\xf2\x5c\xf3\x5c\xf4\x5c\xf5\x5c\xf6\x5c\xf7\x5c\xf8\x5c\xf9\x5c\xfa\x5c\xfc\x5c\xfd\x5c\xfe\x5c\xff\x5d\x00\x5d\x01\x5d\x04\x5d\x05\x5d\x08\x5d\x09\x5d\x0a\x5d\x0b\x5d\x0c\x5d\x0d\x5d\x0f\x5d\x10\x5d\x11\x5d\x12\x5d\x13\x5d\x15\x5d\x17\x5d\x18\x5d\x19\x5d\x1a\x5d\x1c\x5d\x1d\x5d\x1f\x5d\x20\x5d\x21\x5d\x22\x5d\x23\x5d\x25\x5d\x28\x5d\x2a\x5d\x2b\x5d\x2c\x5d\x2f\x5d\x30\x5d\x31\x5d\x32\x5d\x33\x5d\x35\x5d\x36\x5d\x37\x5d\x38\x5d\x39\x5d\x3a\x5d\x3b\x5d\x3c\x5d\x3f\x5d\x40\x5d\x41\x5d\x42\x5d\x43\x5d\x44\x5d\x45\x5d\x46\x5d\x48\x5d\x49\x5d\x4d\x5d\x4e\x5d\x4f\x5d\x50\x5d\x51\x5d\x52\x5d\x53\x5d\x54\x5d\x55\x5d\x56\x5d\x57\x5d\x59\x5d\x5a\x5d\x5c\x5d\x5e\x5d\x5f\x5d\x60\x5d\x61\x5d\x62\x5d\x63\x5d\x64\x5d\x65\x5d\x66\x5d\x67\x5d\x68\x5d\x6a\x5d\x6d\x5d\x6e\x5d\x70\x5d\x71\x5d\x72\x5d\x73\x5d\x75\x5d\x76\x5d\x77\x5d\x78\x5d\x79\x5d\x7a\x5d\x7b\x5d\x7c\x5d\x7d\x5d\x7e\x5d\x7f\x5d\x80\x5d\x81\x5d\x83\x5d\x84\x00\x00\x00\x00", /* 8e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x85\x5d\x86\x5d\x87\x5d\x88\x5d\x89\x5d\x8a\x5d\x8b\x5d\x8c\x5d\x8d\x5d\x8e\x5d\x8f\x5d\x90\x5d\x91\x5d\x92\x5d\x93\x5d\x94\x5d\x95\x5d\x96\x5d\x97\x5d\x98\x5d\x9a\x5d\x9b\x5d\x9c\x5d\x9e\x5d\x9f\x5d\xa0\x5d\xa1\x5d\xa2\x5d\xa3\x5d\xa4\x5d\xa5\x5d\xa6\x5d\xa7\x5d\xa8\x5d\xa9\x5d\xaa\x5d\xab\x5d\xac\x5d\xad\x5d\xae\x5d\xaf\x5d\xb0\x5d\xb1\x5d\xb2\x5d\xb3\x5d\xb4\x5d\xb5\x5d\xb6\x5d\xb8\x5d\xb9\x5d\xba\x5d\xbb\x5d\xbc\x5d\xbd\x5d\xbe\x5d\xbf\x5d\xc0\x5d\xc1\x5d\xc2\x5d\xc3\x5d\xc4\x5d\xc6\x5d\xc7", /* 8e80 */ "\x00\x00\x5d\xc8\x5d\xc9\x5d\xca\x5d\xcb\x5d\xcc\x5d\xce\x5d\xcf\x5d\xd0\x5d\xd1\x5d\xd2\x5d\xd3\x5d\xd4\x5d\xd5\x5d\xd6\x5d\xd7\x5d\xd8\x5d\xd9\x5d\xda\x5d\xdc\x5d\xdf\x5d\xe0\x5d\xe3\x5d\xe4\x5d\xea\x5d\xec\x5d\xed\x5d\xf0\x5d\xf5\x5d\xf6\x5d\xf8\x5d\xf9\x5d\xfa\x5d\xfb\x5d\xfc\x5d\xff\x5e\x00\x5e\x04\x5e\x07\x5e\x09\x5e\x0a\x5e\x0b\x5e\x0d\x5e\x0e\x5e\x12\x5e\x13\x5e\x17\x5e\x1e\x5e\x1f\x5e\x20\x5e\x21\x5e\x22\x5e\x23\x5e\x24\x5e\x25\x5e\x28\x5e\x29\x5e\x2a\x5e\x2b\x5e\x2c\x5e\x2f\x5e\x30\x5e\x32\x5e\x33\x5e\x34\x5e\x35\x5e\x36\x5e\x39\x5e\x3a\x5e\x3e\x5e\x3f\x5e\x40\x5e\x41\x5e\x43\x5e\x46\x5e\x47\x5e\x48\x5e\x49\x5e\x4a\x5e\x4b\x5e\x4d\x5e\x4e\x5e\x4f\x5e\x50\x5e\x51\x5e\x52\x5e\x53\x5e\x56\x5e\x57\x5e\x58\x5e\x59\x5e\x5a\x5e\x5c\x5e\x5d\x5e\x5f\x5e\x60\x5e\x63\x5e\x64\x5e\x65\x5e\x66\x5e\x67\x5e\x68\x5e\x69\x5e\x6a\x5e\x6b\x5e\x6c\x5e\x6d\x5e\x6e\x5e\x6f\x5e\x70\x5e\x71\x5e\x75\x5e\x77\x5e\x79\x5e\x7e\x5e\x81\x5e\x82\x5e\x83\x5e\x85\x5e\x88\x5e\x89\x5e\x8c\x5e\x8d\x5e\x8e\x5e\x92\x5e\x98\x00\x00\x00\x00", /* 8f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x9b\x5e\x9d\x5e\xa1\x5e\xa2\x5e\xa3\x5e\xa4\x5e\xa8\x5e\xa9\x5e\xaa\x5e\xab\x5e\xac\x5e\xae\x5e\xaf\x5e\xb0\x5e\xb1\x5e\xb2\x5e\xb4\x5e\xba\x5e\xbb\x5e\xbc\x5e\xbd\x5e\xbf\x5e\xc0\x5e\xc1\x5e\xc2\x5e\xc3\x5e\xc4\x5e\xc5\x5e\xc6\x5e\xc7\x5e\xc8\x5e\xcb\x5e\xcc\x5e\xcd\x5e\xce\x5e\xcf\x5e\xd0\x5e\xd4\x5e\xd5\x5e\xd7\x5e\xd8\x5e\xd9\x5e\xda\x5e\xdc\x5e\xdd\x5e\xde\x5e\xdf\x5e\xe0\x5e\xe1\x5e\xe2\x5e\xe3\x5e\xe4\x5e\xe5\x5e\xe6\x5e\xe7\x5e\xe9\x5e\xeb\x5e\xec\x5e\xed\x5e\xee\x5e\xef\x5e\xf0\x5e\xf1", /* 8f80 */ "\x00\x00\x5e\xf2\x5e\xf3\x5e\xf5\x5e\xf8\x5e\xf9\x5e\xfb\x5e\xfc\x5e\xfd\x5f\x05\x5f\x06\x5f\x07\x5f\x09\x5f\x0c\x5f\x0d\x5f\x0e\x5f\x10\x5f\x12\x5f\x14\x5f\x16\x5f\x19\x5f\x1a\x5f\x1c\x5f\x1d\x5f\x1e\x5f\x21\x5f\x22\x5f\x23\x5f\x24\x5f\x28\x5f\x2b\x5f\x2c\x5f\x2e\x5f\x30\x5f\x32\x5f\x33\x5f\x34\x5f\x35\x5f\x36\x5f\x37\x5f\x38\x5f\x3b\x5f\x3d\x5f\x3e\x5f\x3f\x5f\x41\x5f\x42\x5f\x43\x5f\x44\x5f\x45\x5f\x46\x5f\x47\x5f\x48\x5f\x49\x5f\x4a\x5f\x4b\x5f\x4c\x5f\x4d\x5f\x4e\x5f\x4f\x5f\x51\x5f\x54\x5f\x59\x5f\x5a\x5f\x5b\x5f\x5c\x5f\x5e\x5f\x5f\x5f\x60\x5f\x63\x5f\x65\x5f\x67\x5f\x68\x5f\x6b\x5f\x6e\x5f\x6f\x5f\x72\x5f\x74\x5f\x75\x5f\x76\x5f\x78\x5f\x7a\x5f\x7d\x5f\x7e\x5f\x7f\x5f\x83\x5f\x86\x5f\x8d\x5f\x8e\x5f\x8f\x5f\x91\x5f\x93\x5f\x94\x5f\x96\x5f\x9a\x5f\x9b\x5f\x9d\x5f\x9e\x5f\x9f\x5f\xa0\x5f\xa2\x5f\xa3\x5f\xa4\x5f\xa5\x5f\xa6\x5f\xa7\x5f\xa9\x5f\xab\x5f\xac\x5f\xaf\x5f\xb0\x5f\xb1\x5f\xb2\x5f\xb3\x5f\xb4\x5f\xb6\x5f\xb8\x5f\xb9\x5f\xba\x5f\xbb\x5f\xbe\x5f\xbf\x5f\xc0\x5f\xc1\x5f\xc2\x5f\xc7\x00\x00\x00\x00", /* 9000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\xc8\x5f\xca\x5f\xcb\x5f\xce\x5f\xd3\x5f\xd4\x5f\xd5\x5f\xda\x5f\xdb\x5f\xdc\x5f\xde\x5f\xdf\x5f\xe2\x5f\xe3\x5f\xe5\x5f\xe6\x5f\xe8\x5f\xe9\x5f\xec\x5f\xef\x5f\xf0\x5f\xf2\x5f\xf3\x5f\xf4\x5f\xf6\x5f\xf7\x5f\xf9\x5f\xfa\x5f\xfc\x60\x07\x60\x08\x60\x09\x60\x0b\x60\x0c\x60\x10\x60\x11\x60\x13\x60\x17\x60\x18\x60\x1a\x60\x1e\x60\x1f\x60\x22\x60\x23\x60\x24\x60\x2c\x60\x2d\x60\x2e\x60\x30\x60\x31\x60\x32\x60\x33\x60\x34\x60\x36\x60\x37\x60\x38\x60\x39\x60\x3a\x60\x3d\x60\x3e\x60\x40\x60\x44\x60\x45", /* 9080 */ "\x00\x00\x60\x46\x60\x47\x60\x48\x60\x49\x60\x4a\x60\x4c\x60\x4e\x60\x4f\x60\x51\x60\x53\x60\x54\x60\x56\x60\x57\x60\x58\x60\x5b\x60\x5c\x60\x5e\x60\x5f\x60\x60\x60\x61\x60\x65\x60\x66\x60\x6e\x60\x71\x60\x72\x60\x74\x60\x75\x60\x77\x60\x7e\x60\x80\x60\x81\x60\x82\x60\x85\x60\x86\x60\x87\x60\x88\x60\x8a\x60\x8b\x60\x8e\x60\x8f\x60\x90\x60\x91\x60\x93\x60\x95\x60\x97\x60\x98\x60\x99\x60\x9c\x60\x9e\x60\xa1\x60\xa2\x60\xa4\x60\xa5\x60\xa7\x60\xa9\x60\xaa\x60\xae\x60\xb0\x60\xb3\x60\xb5\x60\xb6\x60\xb7\x60\xb9\x60\xba\x60\xbd\x60\xbe\x60\xbf\x60\xc0\x60\xc1\x60\xc2\x60\xc3\x60\xc4\x60\xc7\x60\xc8\x60\xc9\x60\xcc\x60\xcd\x60\xce\x60\xcf\x60\xd0\x60\xd2\x60\xd3\x60\xd4\x60\xd6\x60\xd7\x60\xd9\x60\xdb\x60\xde\x60\xe1\x60\xe2\x60\xe3\x60\xe4\x60\xe5\x60\xea\x60\xf1\x60\xf2\x60\xf5\x60\xf7\x60\xf8\x60\xfb\x60\xfc\x60\xfd\x60\xfe\x60\xff\x61\x02\x61\x03\x61\x04\x61\x05\x61\x07\x61\x0a\x61\x0b\x61\x0c\x61\x10\x61\x11\x61\x12\x61\x13\x61\x14\x61\x16\x61\x17\x61\x18\x61\x19\x61\x1b\x61\x1c\x61\x1d\x61\x1e\x00\x00\x00\x00", /* 9100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x21\x61\x22\x61\x25\x61\x28\x61\x29\x61\x2a\x61\x2c\x61\x2d\x61\x2e\x61\x2f\x61\x30\x61\x31\x61\x32\x61\x33\x61\x34\x61\x35\x61\x36\x61\x37\x61\x38\x61\x39\x61\x3a\x61\x3b\x61\x3c\x61\x3d\x61\x3e\x61\x40\x61\x41\x61\x42\x61\x43\x61\x44\x61\x45\x61\x46\x61\x47\x61\x49\x61\x4b\x61\x4d\x61\x4f\x61\x50\x61\x52\x61\x53\x61\x54\x61\x56\x61\x57\x61\x58\x61\x59\x61\x5a\x61\x5b\x61\x5c\x61\x5e\x61\x5f\x61\x60\x61\x61\x61\x63\x61\x64\x61\x65\x61\x66\x61\x69\x61\x6a\x61\x6b\x61\x6c\x61\x6d\x61\x6e\x61\x6f", /* 9180 */ "\x00\x00\x61\x71\x61\x72\x61\x73\x61\x74\x61\x76\x61\x78\x61\x79\x61\x7a\x61\x7b\x61\x7c\x61\x7d\x61\x7e\x61\x7f\x61\x80\x61\x81\x61\x82\x61\x83\x61\x84\x61\x85\x61\x86\x61\x87\x61\x88\x61\x89\x61\x8a\x61\x8c\x61\x8d\x61\x8f\x61\x90\x61\x91\x61\x92\x61\x93\x61\x95\x61\x96\x61\x97\x61\x98\x61\x99\x61\x9a\x61\x9b\x61\x9c\x61\x9e\x61\x9f\x61\xa0\x61\xa1\x61\xa2\x61\xa3\x61\xa4\x61\xa5\x61\xa6\x61\xaa\x61\xab\x61\xad\x61\xae\x61\xaf\x61\xb0\x61\xb1\x61\xb2\x61\xb3\x61\xb4\x61\xb5\x61\xb6\x61\xb8\x61\xb9\x61\xba\x61\xbb\x61\xbc\x61\xbd\x61\xbf\x61\xc0\x61\xc1\x61\xc3\x61\xc4\x61\xc5\x61\xc6\x61\xc7\x61\xc9\x61\xcc\x61\xcd\x61\xce\x61\xcf\x61\xd0\x61\xd3\x61\xd5\x61\xd6\x61\xd7\x61\xd8\x61\xd9\x61\xda\x61\xdb\x61\xdc\x61\xdd\x61\xde\x61\xdf\x61\xe0\x61\xe1\x61\xe2\x61\xe3\x61\xe4\x61\xe5\x61\xe7\x61\xe8\x61\xe9\x61\xea\x61\xeb\x61\xec\x61\xed\x61\xee\x61\xef\x61\xf0\x61\xf1\x61\xf2\x61\xf3\x61\xf4\x61\xf6\x61\xf7\x61\xf8\x61\xf9\x61\xfa\x61\xfb\x61\xfc\x61\xfd\x61\xfe\x62\x00\x62\x01\x62\x02\x62\x03\x00\x00\x00\x00", /* 9200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x04\x62\x05\x62\x07\x62\x09\x62\x13\x62\x14\x62\x19\x62\x1c\x62\x1d\x62\x1e\x62\x20\x62\x23\x62\x26\x62\x27\x62\x28\x62\x29\x62\x2b\x62\x2d\x62\x2f\x62\x30\x62\x31\x62\x32\x62\x35\x62\x36\x62\x38\x62\x39\x62\x3a\x62\x3b\x62\x3c\x62\x42\x62\x44\x62\x45\x62\x46\x62\x4a\x62\x4f\x62\x50\x62\x55\x62\x56\x62\x57\x62\x59\x62\x5a\x62\x5c\x62\x5d\x62\x5e\x62\x5f\x62\x60\x62\x61\x62\x62\x62\x64\x62\x65\x62\x68\x62\x71\x62\x72\x62\x74\x62\x75\x62\x77\x62\x78\x62\x7a\x62\x7b\x62\x7d\x62\x81\x62\x82\x62\x83", /* 9280 */ "\x00\x00\x62\x85\x62\x86\x62\x87\x62\x88\x62\x8b\x62\x8c\x62\x8d\x62\x8e\x62\x8f\x62\x90\x62\x94\x62\x99\x62\x9c\x62\x9d\x62\x9e\x62\xa3\x62\xa6\x62\xa7\x62\xa9\x62\xaa\x62\xad\x62\xae\x62\xaf\x62\xb0\x62\xb2\x62\xb3\x62\xb4\x62\xb6\x62\xb7\x62\xb8\x62\xba\x62\xbe\x62\xc0\x62\xc1\x62\xc3\x62\xcb\x62\xcf\x62\xd1\x62\xd5\x62\xdd\x62\xde\x62\xe0\x62\xe1\x62\xe4\x62\xea\x62\xeb\x62\xf0\x62\xf2\x62\xf5\x62\xf8\x62\xf9\x62\xfa\x62\xfb\x63\x00\x63\x03\x63\x04\x63\x05\x63\x06\x63\x0a\x63\x0b\x63\x0c\x63\x0d\x63\x0f\x63\x10\x63\x12\x63\x13\x63\x14\x63\x15\x63\x17\x63\x18\x63\x19\x63\x1c\x63\x26\x63\x27\x63\x29\x63\x2c\x63\x2d\x63\x2e\x63\x30\x63\x31\x63\x33\x63\x34\x63\x35\x63\x36\x63\x37\x63\x38\x63\x3b\x63\x3c\x63\x3e\x63\x3f\x63\x40\x63\x41\x63\x44\x63\x47\x63\x48\x63\x4a\x63\x51\x63\x52\x63\x53\x63\x54\x63\x56\x63\x57\x63\x58\x63\x59\x63\x5a\x63\x5b\x63\x5c\x63\x5d\x63\x60\x63\x64\x63\x65\x63\x66\x63\x68\x63\x6a\x63\x6b\x63\x6c\x63\x6f\x63\x70\x63\x72\x63\x73\x63\x74\x63\x75\x63\x78\x63\x79\x63\x7c\x00\x00\x00\x00", /* 9300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x7d\x63\x7e\x63\x7f\x63\x81\x63\x83\x63\x84\x63\x85\x63\x86\x63\x8b\x63\x8d\x63\x91\x63\x93\x63\x94\x63\x95\x63\x97\x63\x99\x63\x9a\x63\x9b\x63\x9c\x63\x9d\x63\x9e\x63\x9f\x63\xa1\x63\xa4\x63\xa6\x63\xab\x63\xaf\x63\xb1\x63\xb2\x63\xb5\x63\xb6\x63\xb9\x63\xbb\x63\xbd\x63\xbf\x63\xc0\x63\xc1\x63\xc2\x63\xc3\x63\xc5\x63\xc7\x63\xc8\x63\xca\x63\xcb\x63\xcc\x63\xd1\x63\xd3\x63\xd4\x63\xd5\x63\xd7\x63\xd8\x63\xd9\x63\xda\x63\xdb\x63\xdc\x63\xdd\x63\xdf\x63\xe2\x63\xe4\x63\xe5\x63\xe6\x63\xe7\x63\xe8", /* 9380 */ "\x00\x00\x63\xeb\x63\xec\x63\xee\x63\xef\x63\xf0\x63\xf1\x63\xf3\x63\xf5\x63\xf7\x63\xf9\x63\xfa\x63\xfb\x63\xfc\x63\xfe\x64\x03\x64\x04\x64\x06\x64\x07\x64\x08\x64\x09\x64\x0a\x64\x0d\x64\x0e\x64\x11\x64\x12\x64\x15\x64\x16\x64\x17\x64\x18\x64\x19\x64\x1a\x64\x1d\x64\x1f\x64\x22\x64\x23\x64\x24\x64\x25\x64\x27\x64\x28\x64\x29\x64\x2b\x64\x2e\x64\x2f\x64\x30\x64\x31\x64\x32\x64\x33\x64\x35\x64\x36\x64\x37\x64\x38\x64\x39\x64\x3b\x64\x3c\x64\x3e\x64\x40\x64\x42\x64\x43\x64\x49\x64\x4b\x64\x4c\x64\x4d\x64\x4e\x64\x4f\x64\x50\x64\x51\x64\x53\x64\x55\x64\x56\x64\x57\x64\x59\x64\x5a\x64\x5b\x64\x5c\x64\x5d\x64\x5f\x64\x60\x64\x61\x64\x62\x64\x63\x64\x64\x64\x65\x64\x66\x64\x68\x64\x6a\x64\x6b\x64\x6c\x64\x6e\x64\x6f\x64\x70\x64\x71\x64\x72\x64\x73\x64\x74\x64\x75\x64\x76\x64\x77\x64\x7b\x64\x7c\x64\x7d\x64\x7e\x64\x7f\x64\x80\x64\x81\x64\x83\x64\x86\x64\x88\x64\x89\x64\x8a\x64\x8b\x64\x8c\x64\x8d\x64\x8e\x64\x8f\x64\x90\x64\x93\x64\x94\x64\x97\x64\x98\x64\x9a\x64\x9b\x64\x9c\x64\x9d\x64\x9f\x64\xa0\x00\x00\x00\x00", /* 9400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xa1\x64\xa2\x64\xa3\x64\xa5\x64\xa6\x64\xa7\x64\xa8\x64\xaa\x64\xab\x64\xaf\x64\xb1\x64\xb2\x64\xb3\x64\xb4\x64\xb6\x64\xb9\x64\xbb\x64\xbd\x64\xbe\x64\xbf\x64\xc1\x64\xc3\x64\xc4\x64\xc6\x64\xc7\x64\xc8\x64\xc9\x64\xca\x64\xcb\x64\xcc\x64\xcf\x64\xd1\x64\xd3\x64\xd4\x64\xd5\x64\xd6\x64\xd9\x64\xda\x64\xdb\x64\xdc\x64\xdd\x64\xdf\x64\xe0\x64\xe1\x64\xe3\x64\xe5\x64\xe7\x64\xe8\x64\xe9\x64\xea\x64\xeb\x64\xec\x64\xed\x64\xee\x64\xef\x64\xf0\x64\xf1\x64\xf2\x64\xf3\x64\xf4\x64\xf5\x64\xf6\x64\xf7", /* 9480 */ "\x00\x00\x64\xf8\x64\xf9\x64\xfa\x64\xfb\x64\xfc\x64\xfd\x64\xfe\x64\xff\x65\x01\x65\x02\x65\x03\x65\x04\x65\x05\x65\x06\x65\x07\x65\x08\x65\x0a\x65\x0b\x65\x0c\x65\x0d\x65\x0e\x65\x0f\x65\x10\x65\x11\x65\x13\x65\x14\x65\x15\x65\x16\x65\x17\x65\x19\x65\x1a\x65\x1b\x65\x1c\x65\x1d\x65\x1e\x65\x1f\x65\x20\x65\x21\x65\x22\x65\x23\x65\x24\x65\x26\x65\x27\x65\x28\x65\x29\x65\x2a\x65\x2c\x65\x2d\x65\x30\x65\x31\x65\x32\x65\x33\x65\x37\x65\x3a\x65\x3c\x65\x3d\x65\x40\x65\x41\x65\x42\x65\x43\x65\x44\x65\x46\x65\x47\x65\x4a\x65\x4b\x65\x4d\x65\x4e\x65\x50\x65\x52\x65\x53\x65\x54\x65\x57\x65\x58\x65\x5a\x65\x5c\x65\x5f\x65\x60\x65\x61\x65\x64\x65\x65\x65\x67\x65\x68\x65\x69\x65\x6a\x65\x6d\x65\x6e\x65\x6f\x65\x71\x65\x73\x65\x75\x65\x76\x65\x78\x65\x79\x65\x7a\x65\x7b\x65\x7c\x65\x7d\x65\x7e\x65\x7f\x65\x80\x65\x81\x65\x82\x65\x83\x65\x84\x65\x85\x65\x86\x65\x88\x65\x89\x65\x8a\x65\x8d\x65\x8e\x65\x8f\x65\x92\x65\x94\x65\x95\x65\x96\x65\x98\x65\x9a\x65\x9d\x65\x9e\x65\xa0\x65\xa2\x65\xa3\x65\xa6\x65\xa8\x00\x00\x00\x00", /* 9500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xaa\x65\xac\x65\xae\x65\xb1\x65\xb2\x65\xb3\x65\xb4\x65\xb5\x65\xb6\x65\xb7\x65\xb8\x65\xba\x65\xbb\x65\xbe\x65\xbf\x65\xc0\x65\xc2\x65\xc7\x65\xc8\x65\xc9\x65\xca\x65\xcd\x65\xd0\x65\xd1\x65\xd3\x65\xd4\x65\xd5\x65\xd8\x65\xd9\x65\xda\x65\xdb\x65\xdc\x65\xdd\x65\xde\x65\xdf\x65\xe1\x65\xe3\x65\xe4\x65\xea\x65\xeb\x65\xf2\x65\xf3\x65\xf4\x65\xf5\x65\xf8\x65\xf9\x65\xfb\x65\xfc\x65\xfd\x65\xfe\x65\xff\x66\x01\x66\x04\x66\x05\x66\x07\x66\x08\x66\x09\x66\x0b\x66\x0d\x66\x10\x66\x11\x66\x12\x66\x16", /* 9580 */ "\x00\x00\x66\x17\x66\x18\x66\x1a\x66\x1b\x66\x1c\x66\x1e\x66\x21\x66\x22\x66\x23\x66\x24\x66\x26\x66\x29\x66\x2a\x66\x2b\x66\x2c\x66\x2e\x66\x30\x66\x32\x66\x33\x66\x37\x66\x38\x66\x39\x66\x3a\x66\x3b\x66\x3d\x66\x3f\x66\x40\x66\x42\x66\x44\x66\x45\x66\x46\x66\x47\x66\x48\x66\x49\x66\x4a\x66\x4d\x66\x4e\x66\x50\x66\x51\x66\x58\x66\x59\x66\x5b\x66\x5c\x66\x5d\x66\x5e\x66\x60\x66\x62\x66\x63\x66\x65\x66\x67\x66\x69\x66\x6a\x66\x6b\x66\x6c\x66\x6d\x66\x71\x66\x72\x66\x73\x66\x75\x66\x78\x66\x79\x66\x7b\x66\x7c\x66\x7d\x66\x7f\x66\x80\x66\x81\x66\x83\x66\x85\x66\x86\x66\x88\x66\x89\x66\x8a\x66\x8b\x66\x8d\x66\x8e\x66\x8f\x66\x90\x66\x92\x66\x93\x66\x94\x66\x95\x66\x98\x66\x99\x66\x9a\x66\x9b\x66\x9c\x66\x9e\x66\x9f\x66\xa0\x66\xa1\x66\xa2\x66\xa3\x66\xa4\x66\xa5\x66\xa6\x66\xa9\x66\xaa\x66\xab\x66\xac\x66\xad\x66\xaf\x66\xb0\x66\xb1\x66\xb2\x66\xb3\x66\xb5\x66\xb6\x66\xb7\x66\xb8\x66\xba\x66\xbb\x66\xbc\x66\xbd\x66\xbf\x66\xc0\x66\xc1\x66\xc2\x66\xc3\x66\xc4\x66\xc5\x66\xc6\x66\xc7\x66\xc8\x66\xc9\x00\x00\x00\x00", /* 9600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xca\x66\xcb\x66\xcc\x66\xcd\x66\xce\x66\xcf\x66\xd0\x66\xd1\x66\xd2\x66\xd3\x66\xd4\x66\xd5\x66\xd6\x66\xd7\x66\xd8\x66\xda\x66\xde\x66\xdf\x66\xe0\x66\xe1\x66\xe2\x66\xe3\x66\xe4\x66\xe5\x66\xe7\x66\xe8\x66\xea\x66\xeb\x66\xec\x66\xed\x66\xee\x66\xef\x66\xf1\x66\xf5\x66\xf6\x66\xf8\x66\xfa\x66\xfb\x66\xfd\x67\x01\x67\x02\x67\x03\x67\x04\x67\x05\x67\x06\x67\x07\x67\x0c\x67\x0e\x67\x0f\x67\x11\x67\x12\x67\x13\x67\x16\x67\x18\x67\x19\x67\x1a\x67\x1c\x67\x1e\x67\x20\x67\x21\x67\x22\x67\x23\x67\x24", /* 9680 */ "\x00\x00\x67\x25\x67\x27\x67\x29\x67\x2e\x67\x30\x67\x32\x67\x33\x67\x36\x67\x37\x67\x38\x67\x39\x67\x3b\x67\x3c\x67\x3e\x67\x3f\x67\x41\x67\x44\x67\x45\x67\x47\x67\x4a\x67\x4b\x67\x4d\x67\x52\x67\x54\x67\x55\x67\x57\x67\x58\x67\x59\x67\x5a\x67\x5b\x67\x5d\x67\x62\x67\x63\x67\x64\x67\x66\x67\x67\x67\x6b\x67\x6c\x67\x6e\x67\x71\x67\x74\x67\x76\x67\x78\x67\x79\x67\x7a\x67\x7b\x67\x7d\x67\x80\x67\x82\x67\x83\x67\x85\x67\x86\x67\x88\x67\x8a\x67\x8c\x67\x8d\x67\x8e\x67\x8f\x67\x91\x67\x92\x67\x93\x67\x94\x67\x96\x67\x99\x67\x9b\x67\x9f\x67\xa0\x67\xa1\x67\xa4\x67\xa6\x67\xa9\x67\xac\x67\xae\x67\xb1\x67\xb2\x67\xb4\x67\xb9\x67\xba\x67\xbb\x67\xbc\x67\xbd\x67\xbe\x67\xbf\x67\xc0\x67\xc2\x67\xc5\x67\xc6\x67\xc7\x67\xc8\x67\xc9\x67\xca\x67\xcb\x67\xcc\x67\xcd\x67\xce\x67\xd5\x67\xd6\x67\xd7\x67\xdb\x67\xdf\x67\xe1\x67\xe3\x67\xe4\x67\xe6\x67\xe7\x67\xe8\x67\xea\x67\xeb\x67\xed\x67\xee\x67\xf2\x67\xf5\x67\xf6\x67\xf7\x67\xf8\x67\xf9\x67\xfa\x67\xfb\x67\xfc\x67\xfe\x68\x01\x68\x02\x68\x03\x68\x04\x68\x06\x00\x00\x00\x00", /* 9700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x0d\x68\x10\x68\x12\x68\x14\x68\x15\x68\x18\x68\x19\x68\x1a\x68\x1b\x68\x1c\x68\x1e\x68\x1f\x68\x20\x68\x22\x68\x23\x68\x24\x68\x25\x68\x26\x68\x27\x68\x28\x68\x2b\x68\x2c\x68\x2d\x68\x2e\x68\x2f\x68\x30\x68\x31\x68\x34\x68\x35\x68\x36\x68\x3a\x68\x3b\x68\x3f\x68\x47\x68\x4b\x68\x4d\x68\x4f\x68\x52\x68\x56\x68\x57\x68\x58\x68\x59\x68\x5a\x68\x5b\x68\x5c\x68\x5d\x68\x5e\x68\x5f\x68\x6a\x68\x6c\x68\x6d\x68\x6e\x68\x6f\x68\x70\x68\x71\x68\x72\x68\x73\x68\x75\x68\x78\x68\x79\x68\x7a\x68\x7b\x68\x7c", /* 9780 */ "\x00\x00\x68\x7d\x68\x7e\x68\x7f\x68\x80\x68\x82\x68\x84\x68\x87\x68\x88\x68\x89\x68\x8a\x68\x8b\x68\x8c\x68\x8d\x68\x8e\x68\x90\x68\x91\x68\x92\x68\x94\x68\x95\x68\x96\x68\x98\x68\x99\x68\x9a\x68\x9b\x68\x9c\x68\x9d\x68\x9e\x68\x9f\x68\xa0\x68\xa1\x68\xa3\x68\xa4\x68\xa5\x68\xa9\x68\xaa\x68\xab\x68\xac\x68\xae\x68\xb1\x68\xb2\x68\xb4\x68\xb6\x68\xb7\x68\xb8\x68\xb9\x68\xba\x68\xbb\x68\xbc\x68\xbd\x68\xbe\x68\xbf\x68\xc1\x68\xc3\x68\xc4\x68\xc5\x68\xc6\x68\xc7\x68\xc8\x68\xca\x68\xcc\x68\xce\x68\xcf\x68\xd0\x68\xd1\x68\xd3\x68\xd4\x68\xd6\x68\xd7\x68\xd9\x68\xdb\x68\xdc\x68\xdd\x68\xde\x68\xdf\x68\xe1\x68\xe2\x68\xe4\x68\xe5\x68\xe6\x68\xe7\x68\xe8\x68\xe9\x68\xea\x68\xeb\x68\xec\x68\xed\x68\xef\x68\xf2\x68\xf3\x68\xf4\x68\xf6\x68\xf7\x68\xf8\x68\xfb\x68\xfd\x68\xfe\x68\xff\x69\x00\x69\x02\x69\x03\x69\x04\x69\x06\x69\x07\x69\x08\x69\x09\x69\x0a\x69\x0c\x69\x0f\x69\x11\x69\x13\x69\x14\x69\x15\x69\x16\x69\x17\x69\x18\x69\x19\x69\x1a\x69\x1b\x69\x1c\x69\x1d\x69\x1e\x69\x21\x69\x22\x69\x23\x69\x25\x00\x00\x00\x00", /* 9800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x26\x69\x27\x69\x28\x69\x29\x69\x2a\x69\x2b\x69\x2c\x69\x2e\x69\x2f\x69\x31\x69\x32\x69\x33\x69\x35\x69\x36\x69\x37\x69\x38\x69\x3a\x69\x3b\x69\x3c\x69\x3e\x69\x40\x69\x41\x69\x43\x69\x44\x69\x45\x69\x46\x69\x47\x69\x48\x69\x49\x69\x4a\x69\x4b\x69\x4c\x69\x4d\x69\x4e\x69\x4f\x69\x50\x69\x51\x69\x52\x69\x53\x69\x55\x69\x56\x69\x58\x69\x59\x69\x5b\x69\x5c\x69\x5f\x69\x61\x69\x62\x69\x64\x69\x65\x69\x67\x69\x68\x69\x69\x69\x6a\x69\x6c\x69\x6d\x69\x6f\x69\x70\x69\x72\x69\x73\x69\x74\x69\x75\x69\x76", /* 9880 */ "\x00\x00\x69\x7a\x69\x7b\x69\x7d\x69\x7e\x69\x7f\x69\x81\x69\x83\x69\x85\x69\x8a\x69\x8b\x69\x8c\x69\x8e\x69\x8f\x69\x90\x69\x91\x69\x92\x69\x93\x69\x96\x69\x97\x69\x99\x69\x9a\x69\x9d\x69\x9e\x69\x9f\x69\xa0\x69\xa1\x69\xa2\x69\xa3\x69\xa4\x69\xa5\x69\xa6\x69\xa9\x69\xaa\x69\xac\x69\xae\x69\xaf\x69\xb0\x69\xb2\x69\xb3\x69\xb5\x69\xb6\x69\xb8\x69\xb9\x69\xba\x69\xbc\x69\xbd\x69\xbe\x69\xbf\x69\xc0\x69\xc2\x69\xc3\x69\xc4\x69\xc5\x69\xc6\x69\xc7\x69\xc8\x69\xc9\x69\xcb\x69\xcd\x69\xcf\x69\xd1\x69\xd2\x69\xd3\x69\xd5\x69\xd6\x69\xd7\x69\xd8\x69\xd9\x69\xda\x69\xdc\x69\xdd\x69\xde\x69\xe1\x69\xe2\x69\xe3\x69\xe4\x69\xe5\x69\xe6\x69\xe7\x69\xe8\x69\xe9\x69\xea\x69\xeb\x69\xec\x69\xee\x69\xef\x69\xf0\x69\xf1\x69\xf3\x69\xf4\x69\xf5\x69\xf6\x69\xf7\x69\xf8\x69\xf9\x69\xfa\x69\xfb\x69\xfc\x69\xfe\x6a\x00\x6a\x01\x6a\x02\x6a\x03\x6a\x04\x6a\x05\x6a\x06\x6a\x07\x6a\x08\x6a\x09\x6a\x0b\x6a\x0c\x6a\x0d\x6a\x0e\x6a\x0f\x6a\x10\x6a\x11\x6a\x12\x6a\x13\x6a\x14\x6a\x15\x6a\x16\x6a\x19\x6a\x1a\x6a\x1b\x6a\x1c\x00\x00\x00\x00", /* 9900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x1d\x6a\x1e\x6a\x20\x6a\x22\x6a\x23\x6a\x24\x6a\x25\x6a\x26\x6a\x27\x6a\x29\x6a\x2b\x6a\x2c\x6a\x2d\x6a\x2e\x6a\x30\x6a\x32\x6a\x33\x6a\x34\x6a\x36\x6a\x37\x6a\x38\x6a\x39\x6a\x3a\x6a\x3b\x6a\x3c\x6a\x3f\x6a\x40\x6a\x41\x6a\x42\x6a\x43\x6a\x45\x6a\x46\x6a\x48\x6a\x49\x6a\x4a\x6a\x4b\x6a\x4c\x6a\x4d\x6a\x4e\x6a\x4f\x6a\x51\x6a\x52\x6a\x53\x6a\x54\x6a\x55\x6a\x56\x6a\x57\x6a\x5a\x6a\x5c\x6a\x5d\x6a\x5e\x6a\x5f\x6a\x60\x6a\x62\x6a\x63\x6a\x64\x6a\x66\x6a\x67\x6a\x68\x6a\x69\x6a\x6a\x6a\x6b\x6a\x6c", /* 9980 */ "\x00\x00\x6a\x6d\x6a\x6e\x6a\x6f\x6a\x70\x6a\x72\x6a\x73\x6a\x74\x6a\x75\x6a\x76\x6a\x77\x6a\x78\x6a\x7a\x6a\x7b\x6a\x7d\x6a\x7e\x6a\x7f\x6a\x81\x6a\x82\x6a\x83\x6a\x85\x6a\x86\x6a\x87\x6a\x88\x6a\x89\x6a\x8a\x6a\x8b\x6a\x8c\x6a\x8d\x6a\x8f\x6a\x92\x6a\x93\x6a\x94\x6a\x95\x6a\x96\x6a\x98\x6a\x99\x6a\x9a\x6a\x9b\x6a\x9c\x6a\x9d\x6a\x9e\x6a\x9f\x6a\xa1\x6a\xa2\x6a\xa3\x6a\xa4\x6a\xa5\x6a\xa6\x6a\xa7\x6a\xa8\x6a\xaa\x6a\xad\x6a\xae\x6a\xaf\x6a\xb0\x6a\xb1\x6a\xb2\x6a\xb3\x6a\xb4\x6a\xb5\x6a\xb6\x6a\xb7\x6a\xb8\x6a\xb9\x6a\xba\x6a\xbb\x6a\xbc\x6a\xbd\x6a\xbe\x6a\xbf\x6a\xc0\x6a\xc1\x6a\xc2\x6a\xc3\x6a\xc4\x6a\xc5\x6a\xc6\x6a\xc7\x6a\xc8\x6a\xc9\x6a\xca\x6a\xcb\x6a\xcc\x6a\xcd\x6a\xce\x6a\xcf\x6a\xd0\x6a\xd1\x6a\xd2\x6a\xd3\x6a\xd4\x6a\xd5\x6a\xd6\x6a\xd7\x6a\xd8\x6a\xd9\x6a\xda\x6a\xdb\x6a\xdc\x6a\xdd\x6a\xde\x6a\xdf\x6a\xe0\x6a\xe1\x6a\xe2\x6a\xe3\x6a\xe4\x6a\xe5\x6a\xe6\x6a\xe7\x6a\xe8\x6a\xe9\x6a\xea\x6a\xeb\x6a\xec\x6a\xed\x6a\xee\x6a\xef\x6a\xf0\x6a\xf1\x6a\xf2\x6a\xf3\x6a\xf4\x6a\xf5\x6a\xf6\x00\x00\x00\x00", /* 9a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xf7\x6a\xf8\x6a\xf9\x6a\xfa\x6a\xfb\x6a\xfc\x6a\xfd\x6a\xfe\x6a\xff\x6b\x00\x6b\x01\x6b\x02\x6b\x03\x6b\x04\x6b\x05\x6b\x06\x6b\x07\x6b\x08\x6b\x09\x6b\x0a\x6b\x0b\x6b\x0c\x6b\x0d\x6b\x0e\x6b\x0f\x6b\x10\x6b\x11\x6b\x12\x6b\x13\x6b\x14\x6b\x15\x6b\x16\x6b\x17\x6b\x18\x6b\x19\x6b\x1a\x6b\x1b\x6b\x1c\x6b\x1d\x6b\x1e\x6b\x1f\x6b\x25\x6b\x26\x6b\x28\x6b\x29\x6b\x2a\x6b\x2b\x6b\x2c\x6b\x2d\x6b\x2e\x6b\x2f\x6b\x30\x6b\x31\x6b\x33\x6b\x34\x6b\x35\x6b\x36\x6b\x38\x6b\x3b\x6b\x3c\x6b\x3d\x6b\x3f\x6b\x40", /* 9a80 */ "\x00\x00\x6b\x41\x6b\x42\x6b\x44\x6b\x45\x6b\x48\x6b\x4a\x6b\x4b\x6b\x4d\x6b\x4e\x6b\x4f\x6b\x50\x6b\x51\x6b\x52\x6b\x53\x6b\x54\x6b\x55\x6b\x56\x6b\x57\x6b\x58\x6b\x5a\x6b\x5b\x6b\x5c\x6b\x5d\x6b\x5e\x6b\x5f\x6b\x60\x6b\x61\x6b\x68\x6b\x69\x6b\x6b\x6b\x6c\x6b\x6d\x6b\x6e\x6b\x6f\x6b\x70\x6b\x71\x6b\x72\x6b\x73\x6b\x74\x6b\x75\x6b\x76\x6b\x77\x6b\x78\x6b\x7a\x6b\x7d\x6b\x7e\x6b\x7f\x6b\x80\x6b\x85\x6b\x88\x6b\x8c\x6b\x8e\x6b\x8f\x6b\x90\x6b\x91\x6b\x94\x6b\x95\x6b\x97\x6b\x98\x6b\x99\x6b\x9c\x6b\x9d\x6b\x9e\x6b\x9f\x6b\xa0\x6b\xa2\x6b\xa3\x6b\xa4\x6b\xa5\x6b\xa6\x6b\xa7\x6b\xa8\x6b\xa9\x6b\xab\x6b\xac\x6b\xad\x6b\xae\x6b\xaf\x6b\xb0\x6b\xb1\x6b\xb2\x6b\xb6\x6b\xb8\x6b\xb9\x6b\xba\x6b\xbb\x6b\xbc\x6b\xbd\x6b\xbe\x6b\xc0\x6b\xc3\x6b\xc4\x6b\xc6\x6b\xc7\x6b\xc8\x6b\xc9\x6b\xca\x6b\xcc\x6b\xce\x6b\xd0\x6b\xd1\x6b\xd8\x6b\xda\x6b\xdc\x6b\xdd\x6b\xde\x6b\xdf\x6b\xe0\x6b\xe2\x6b\xe3\x6b\xe4\x6b\xe5\x6b\xe6\x6b\xe7\x6b\xe8\x6b\xe9\x6b\xec\x6b\xed\x6b\xee\x6b\xf0\x6b\xf1\x6b\xf2\x6b\xf4\x6b\xf6\x6b\xf7\x00\x00\x00\x00", /* 9b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xf8\x6b\xfa\x6b\xfb\x6b\xfc\x6b\xfe\x6b\xff\x6c\x00\x6c\x01\x6c\x02\x6c\x03\x6c\x04\x6c\x08\x6c\x09\x6c\x0a\x6c\x0b\x6c\x0c\x6c\x0e\x6c\x12\x6c\x17\x6c\x1c\x6c\x1d\x6c\x1e\x6c\x20\x6c\x23\x6c\x25\x6c\x2b\x6c\x2c\x6c\x2d\x6c\x31\x6c\x33\x6c\x36\x6c\x37\x6c\x39\x6c\x3a\x6c\x3b\x6c\x3c\x6c\x3e\x6c\x3f\x6c\x43\x6c\x44\x6c\x45\x6c\x48\x6c\x4b\x6c\x4c\x6c\x4d\x6c\x4e\x6c\x4f\x6c\x51\x6c\x52\x6c\x53\x6c\x56\x6c\x58\x6c\x59\x6c\x5a\x6c\x62\x6c\x63\x6c\x65\x6c\x66\x6c\x67\x6c\x6b\x6c\x6c\x6c\x6d\x6c\x6e", /* 9b80 */ "\x00\x00\x6c\x6f\x6c\x71\x6c\x73\x6c\x75\x6c\x77\x6c\x78\x6c\x7a\x6c\x7b\x6c\x7c\x6c\x7f\x6c\x80\x6c\x84\x6c\x87\x6c\x8a\x6c\x8b\x6c\x8d\x6c\x8e\x6c\x91\x6c\x92\x6c\x95\x6c\x96\x6c\x97\x6c\x98\x6c\x9a\x6c\x9c\x6c\x9d\x6c\x9e\x6c\xa0\x6c\xa2\x6c\xa8\x6c\xac\x6c\xaf\x6c\xb0\x6c\xb4\x6c\xb5\x6c\xb6\x6c\xb7\x6c\xba\x6c\xc0\x6c\xc1\x6c\xc2\x6c\xc3\x6c\xc6\x6c\xc7\x6c\xc8\x6c\xcb\x6c\xcd\x6c\xce\x6c\xcf\x6c\xd1\x6c\xd2\x6c\xd8\x6c\xd9\x6c\xda\x6c\xdc\x6c\xdd\x6c\xdf\x6c\xe4\x6c\xe6\x6c\xe7\x6c\xe9\x6c\xec\x6c\xed\x6c\xf2\x6c\xf4\x6c\xf9\x6c\xff\x6d\x00\x6d\x02\x6d\x03\x6d\x05\x6d\x06\x6d\x08\x6d\x09\x6d\x0a\x6d\x0d\x6d\x0f\x6d\x10\x6d\x11\x6d\x13\x6d\x14\x6d\x15\x6d\x16\x6d\x18\x6d\x1c\x6d\x1d\x6d\x1f\x6d\x20\x6d\x21\x6d\x22\x6d\x23\x6d\x24\x6d\x26\x6d\x28\x6d\x29\x6d\x2c\x6d\x2d\x6d\x2f\x6d\x30\x6d\x34\x6d\x36\x6d\x37\x6d\x38\x6d\x3a\x6d\x3f\x6d\x40\x6d\x42\x6d\x44\x6d\x49\x6d\x4c\x6d\x50\x6d\x55\x6d\x56\x6d\x57\x6d\x58\x6d\x5b\x6d\x5d\x6d\x5f\x6d\x61\x6d\x62\x6d\x64\x6d\x65\x6d\x67\x6d\x68\x6d\x6b\x00\x00\x00\x00", /* 9c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x6c\x6d\x6d\x6d\x70\x6d\x71\x6d\x72\x6d\x73\x6d\x75\x6d\x76\x6d\x79\x6d\x7a\x6d\x7b\x6d\x7d\x6d\x7e\x6d\x7f\x6d\x80\x6d\x81\x6d\x83\x6d\x84\x6d\x86\x6d\x87\x6d\x8a\x6d\x8b\x6d\x8d\x6d\x8f\x6d\x90\x6d\x92\x6d\x96\x6d\x97\x6d\x98\x6d\x99\x6d\x9a\x6d\x9c\x6d\xa2\x6d\xa5\x6d\xac\x6d\xad\x6d\xb0\x6d\xb1\x6d\xb3\x6d\xb4\x6d\xb6\x6d\xb7\x6d\xb9\x6d\xba\x6d\xbb\x6d\xbc\x6d\xbd\x6d\xbe\x6d\xc1\x6d\xc2\x6d\xc3\x6d\xc8\x6d\xc9\x6d\xca\x6d\xcd\x6d\xce\x6d\xcf\x6d\xd0\x6d\xd2\x6d\xd3\x6d\xd4\x6d\xd5\x6d\xd7", /* 9c80 */ "\x00\x00\x6d\xda\x6d\xdb\x6d\xdc\x6d\xdf\x6d\xe2\x6d\xe3\x6d\xe5\x6d\xe7\x6d\xe8\x6d\xe9\x6d\xea\x6d\xed\x6d\xef\x6d\xf0\x6d\xf2\x6d\xf4\x6d\xf5\x6d\xf6\x6d\xf8\x6d\xfa\x6d\xfd\x6d\xfe\x6d\xff\x6e\x00\x6e\x01\x6e\x02\x6e\x03\x6e\x04\x6e\x06\x6e\x07\x6e\x08\x6e\x09\x6e\x0b\x6e\x0f\x6e\x12\x6e\x13\x6e\x15\x6e\x18\x6e\x19\x6e\x1b\x6e\x1c\x6e\x1e\x6e\x1f\x6e\x22\x6e\x26\x6e\x27\x6e\x28\x6e\x2a\x6e\x2c\x6e\x2e\x6e\x30\x6e\x31\x6e\x33\x6e\x35\x6e\x36\x6e\x37\x6e\x39\x6e\x3b\x6e\x3c\x6e\x3d\x6e\x3e\x6e\x3f\x6e\x40\x6e\x41\x6e\x42\x6e\x45\x6e\x46\x6e\x47\x6e\x48\x6e\x49\x6e\x4a\x6e\x4b\x6e\x4c\x6e\x4f\x6e\x50\x6e\x51\x6e\x52\x6e\x55\x6e\x57\x6e\x59\x6e\x5a\x6e\x5c\x6e\x5d\x6e\x5e\x6e\x60\x6e\x61\x6e\x62\x6e\x63\x6e\x64\x6e\x65\x6e\x66\x6e\x67\x6e\x68\x6e\x69\x6e\x6a\x6e\x6c\x6e\x6d\x6e\x6f\x6e\x70\x6e\x71\x6e\x72\x6e\x73\x6e\x74\x6e\x75\x6e\x76\x6e\x77\x6e\x78\x6e\x79\x6e\x7a\x6e\x7b\x6e\x7c\x6e\x7d\x6e\x80\x6e\x81\x6e\x82\x6e\x84\x6e\x87\x6e\x88\x6e\x8a\x6e\x8b\x6e\x8c\x6e\x8d\x6e\x8e\x6e\x91\x6e\x92\x00\x00\x00\x00", /* 9d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x93\x6e\x94\x6e\x95\x6e\x96\x6e\x97\x6e\x99\x6e\x9a\x6e\x9b\x6e\x9d\x6e\x9e\x6e\xa0\x6e\xa1\x6e\xa3\x6e\xa4\x6e\xa6\x6e\xa8\x6e\xa9\x6e\xab\x6e\xac\x6e\xad\x6e\xae\x6e\xb0\x6e\xb3\x6e\xb5\x6e\xb8\x6e\xb9\x6e\xbc\x6e\xbe\x6e\xbf\x6e\xc0\x6e\xc3\x6e\xc4\x6e\xc5\x6e\xc6\x6e\xc8\x6e\xc9\x6e\xca\x6e\xcc\x6e\xcd\x6e\xce\x6e\xd0\x6e\xd2\x6e\xd6\x6e\xd8\x6e\xd9\x6e\xdb\x6e\xdc\x6e\xdd\x6e\xe3\x6e\xe7\x6e\xea\x6e\xeb\x6e\xec\x6e\xed\x6e\xee\x6e\xef\x6e\xf0\x6e\xf1\x6e\xf2\x6e\xf3\x6e\xf5\x6e\xf6\x6e\xf7", /* 9d80 */ "\x00\x00\x6e\xf8\x6e\xfa\x6e\xfb\x6e\xfc\x6e\xfd\x6e\xfe\x6e\xff\x6f\x00\x6f\x01\x6f\x03\x6f\x04\x6f\x05\x6f\x07\x6f\x08\x6f\x0a\x6f\x0b\x6f\x0c\x6f\x0d\x6f\x0e\x6f\x10\x6f\x11\x6f\x12\x6f\x16\x6f\x17\x6f\x18\x6f\x19\x6f\x1a\x6f\x1b\x6f\x1c\x6f\x1d\x6f\x1e\x6f\x1f\x6f\x21\x6f\x22\x6f\x23\x6f\x25\x6f\x26\x6f\x27\x6f\x28\x6f\x2c\x6f\x2e\x6f\x30\x6f\x32\x6f\x34\x6f\x35\x6f\x37\x6f\x38\x6f\x39\x6f\x3a\x6f\x3b\x6f\x3c\x6f\x3d\x6f\x3f\x6f\x40\x6f\x41\x6f\x42\x6f\x43\x6f\x44\x6f\x45\x6f\x48\x6f\x49\x6f\x4a\x6f\x4c\x6f\x4e\x6f\x4f\x6f\x50\x6f\x51\x6f\x52\x6f\x53\x6f\x54\x6f\x55\x6f\x56\x6f\x57\x6f\x59\x6f\x5a\x6f\x5b\x6f\x5d\x6f\x5f\x6f\x60\x6f\x61\x6f\x63\x6f\x64\x6f\x65\x6f\x67\x6f\x68\x6f\x69\x6f\x6a\x6f\x6b\x6f\x6c\x6f\x6f\x6f\x70\x6f\x71\x6f\x73\x6f\x75\x6f\x76\x6f\x77\x6f\x79\x6f\x7b\x6f\x7d\x6f\x7e\x6f\x7f\x6f\x80\x6f\x81\x6f\x82\x6f\x83\x6f\x85\x6f\x86\x6f\x87\x6f\x8a\x6f\x8b\x6f\x8f\x6f\x90\x6f\x91\x6f\x92\x6f\x93\x6f\x94\x6f\x95\x6f\x96\x6f\x97\x6f\x98\x6f\x99\x6f\x9a\x6f\x9b\x6f\x9d\x6f\x9e\x00\x00\x00\x00", /* 9e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x9f\x6f\xa0\x6f\xa2\x6f\xa3\x6f\xa4\x6f\xa5\x6f\xa6\x6f\xa8\x6f\xa9\x6f\xaa\x6f\xab\x6f\xac\x6f\xad\x6f\xae\x6f\xaf\x6f\xb0\x6f\xb1\x6f\xb2\x6f\xb4\x6f\xb5\x6f\xb7\x6f\xb8\x6f\xba\x6f\xbb\x6f\xbc\x6f\xbd\x6f\xbe\x6f\xbf\x6f\xc1\x6f\xc3\x6f\xc4\x6f\xc5\x6f\xc6\x6f\xc7\x6f\xc8\x6f\xca\x6f\xcb\x6f\xcc\x6f\xcd\x6f\xce\x6f\xcf\x6f\xd0\x6f\xd3\x6f\xd4\x6f\xd5\x6f\xd6\x6f\xd7\x6f\xd8\x6f\xd9\x6f\xda\x6f\xdb\x6f\xdc\x6f\xdd\x6f\xdf\x6f\xe2\x6f\xe3\x6f\xe4\x6f\xe5\x6f\xe6\x6f\xe7\x6f\xe8\x6f\xe9\x6f\xea", /* 9e80 */ "\x00\x00\x6f\xeb\x6f\xec\x6f\xed\x6f\xf0\x6f\xf1\x6f\xf2\x6f\xf3\x6f\xf4\x6f\xf5\x6f\xf6\x6f\xf7\x6f\xf8\x6f\xf9\x6f\xfa\x6f\xfb\x6f\xfc\x6f\xfd\x6f\xfe\x6f\xff\x70\x00\x70\x01\x70\x02\x70\x03\x70\x04\x70\x05\x70\x06\x70\x07\x70\x08\x70\x09\x70\x0a\x70\x0b\x70\x0c\x70\x0d\x70\x0e\x70\x0f\x70\x10\x70\x12\x70\x13\x70\x14\x70\x15\x70\x16\x70\x17\x70\x18\x70\x19\x70\x1c\x70\x1d\x70\x1e\x70\x1f\x70\x20\x70\x21\x70\x22\x70\x24\x70\x25\x70\x26\x70\x27\x70\x28\x70\x29\x70\x2a\x70\x2b\x70\x2c\x70\x2d\x70\x2e\x70\x2f\x70\x30\x70\x31\x70\x32\x70\x33\x70\x34\x70\x36\x70\x37\x70\x38\x70\x3a\x70\x3b\x70\x3c\x70\x3d\x70\x3e\x70\x3f\x70\x40\x70\x41\x70\x42\x70\x43\x70\x44\x70\x45\x70\x46\x70\x47\x70\x48\x70\x49\x70\x4a\x70\x4b\x70\x4d\x70\x4e\x70\x50\x70\x51\x70\x52\x70\x53\x70\x54\x70\x55\x70\x56\x70\x57\x70\x58\x70\x59\x70\x5a\x70\x5b\x70\x5c\x70\x5d\x70\x5f\x70\x60\x70\x61\x70\x62\x70\x63\x70\x64\x70\x65\x70\x66\x70\x67\x70\x68\x70\x69\x70\x6a\x70\x6e\x70\x71\x70\x72\x70\x73\x70\x74\x70\x77\x70\x79\x70\x7a\x00\x00\x00\x00", /* 9f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x7b\x70\x7d\x70\x81\x70\x82\x70\x83\x70\x84\x70\x86\x70\x87\x70\x88\x70\x8b\x70\x8c\x70\x8d\x70\x8f\x70\x90\x70\x91\x70\x93\x70\x97\x70\x98\x70\x9a\x70\x9b\x70\x9e\x70\x9f\x70\xa0\x70\xa1\x70\xa2\x70\xa3\x70\xa4\x70\xa5\x70\xa6\x70\xa7\x70\xa8\x70\xa9\x70\xaa\x70\xb0\x70\xb2\x70\xb4\x70\xb5\x70\xb6\x70\xba\x70\xbe\x70\xbf\x70\xc4\x70\xc5\x70\xc6\x70\xc7\x70\xc9\x70\xcb\x70\xcc\x70\xcd\x70\xce\x70\xcf\x70\xd0\x70\xd1\x70\xd2\x70\xd3\x70\xd4\x70\xd5\x70\xd6\x70\xd7\x70\xda\x70\xdc\x70\xdd\x70\xde", /* 9f80 */ "\x00\x00\x70\xe0\x70\xe1\x70\xe2\x70\xe3\x70\xe5\x70\xea\x70\xee\x70\xf0\x70\xf1\x70\xf2\x70\xf3\x70\xf4\x70\xf5\x70\xf6\x70\xf8\x70\xfa\x70\xfb\x70\xfc\x70\xfe\x70\xff\x71\x00\x71\x01\x71\x02\x71\x03\x71\x04\x71\x05\x71\x06\x71\x07\x71\x08\x71\x0b\x71\x0c\x71\x0d\x71\x0e\x71\x0f\x71\x11\x71\x12\x71\x14\x71\x17\x71\x1b\x71\x1c\x71\x1d\x71\x1e\x71\x1f\x71\x20\x71\x21\x71\x22\x71\x23\x71\x24\x71\x25\x71\x27\x71\x28\x71\x29\x71\x2a\x71\x2b\x71\x2c\x71\x2d\x71\x2e\x71\x32\x71\x33\x71\x34\x71\x35\x71\x37\x71\x38\x71\x39\x71\x3a\x71\x3b\x71\x3c\x71\x3d\x71\x3e\x71\x3f\x71\x40\x71\x41\x71\x42\x71\x43\x71\x44\x71\x46\x71\x47\x71\x48\x71\x49\x71\x4b\x71\x4d\x71\x4f\x71\x50\x71\x51\x71\x52\x71\x53\x71\x54\x71\x55\x71\x56\x71\x57\x71\x58\x71\x59\x71\x5a\x71\x5b\x71\x5d\x71\x5f\x71\x60\x71\x61\x71\x62\x71\x63\x71\x65\x71\x69\x71\x6a\x71\x6b\x71\x6c\x71\x6d\x71\x6f\x71\x70\x71\x71\x71\x74\x71\x75\x71\x76\x71\x77\x71\x79\x71\x7b\x71\x7c\x71\x7e\x71\x7f\x71\x80\x71\x81\x71\x82\x71\x83\x71\x85\x71\x86\x71\x87\x00\x00\x00\x00", /* a000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x88\x71\x89\x71\x8b\x71\x8c\x71\x8d\x71\x8e\x71\x90\x71\x91\x71\x92\x71\x93\x71\x95\x71\x96\x71\x97\x71\x9a\x71\x9b\x71\x9c\x71\x9d\x71\x9e\x71\xa1\x71\xa2\x71\xa3\x71\xa4\x71\xa5\x71\xa6\x71\xa7\x71\xa9\x71\xaa\x71\xab\x71\xad\x71\xae\x71\xaf\x71\xb0\x71\xb1\x71\xb2\x71\xb4\x71\xb6\x71\xb7\x71\xb8\x71\xba\x71\xbb\x71\xbc\x71\xbd\x71\xbe\x71\xbf\x71\xc0\x71\xc1\x71\xc2\x71\xc4\x71\xc5\x71\xc6\x71\xc7\x71\xc8\x71\xc9\x71\xca\x71\xcb\x71\xcc\x71\xcd\x71\xcf\x71\xd0\x71\xd1\x71\xd2\x71\xd3\x71\xd6", /* a080 */ "\x00\x00\x71\xd7\x71\xd8\x71\xd9\x71\xda\x71\xdb\x71\xdc\x71\xdd\x71\xde\x71\xdf\x71\xe1\x71\xe2\x71\xe3\x71\xe4\x71\xe6\x71\xe8\x71\xe9\x71\xea\x71\xeb\x71\xec\x71\xed\x71\xef\x71\xf0\x71\xf1\x71\xf2\x71\xf3\x71\xf4\x71\xf5\x71\xf6\x71\xf7\x71\xf8\x71\xfa\x71\xfb\x71\xfc\x71\xfd\x71\xfe\x71\xff\x72\x00\x72\x01\x72\x02\x72\x03\x72\x04\x72\x05\x72\x07\x72\x08\x72\x09\x72\x0a\x72\x0b\x72\x0c\x72\x0d\x72\x0e\x72\x0f\x72\x10\x72\x11\x72\x12\x72\x13\x72\x14\x72\x15\x72\x16\x72\x17\x72\x18\x72\x19\x72\x1a\x72\x1b\x72\x1c\x72\x1e\x72\x1f\x72\x20\x72\x21\x72\x22\x72\x23\x72\x24\x72\x25\x72\x26\x72\x27\x72\x29\x72\x2b\x72\x2d\x72\x2e\x72\x2f\x72\x32\x72\x33\x72\x34\x72\x3a\x72\x3c\x72\x3e\x72\x40\x72\x41\x72\x42\x72\x43\x72\x44\x72\x45\x72\x46\x72\x49\x72\x4a\x72\x4b\x72\x4e\x72\x4f\x72\x50\x72\x51\x72\x53\x72\x54\x72\x55\x72\x57\x72\x58\x72\x5a\x72\x5c\x72\x5e\x72\x60\x72\x63\x72\x64\x72\x65\x72\x68\x72\x6a\x72\x6b\x72\x6c\x72\x6d\x72\x70\x72\x71\x72\x73\x72\x74\x72\x76\x72\x77\x72\x78\x72\x7b\x72\x7c\x00\x00\x00\x00", /* a100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x7d\x72\x82\x72\x83\x72\x85\x72\x86\x72\x87\x72\x88\x72\x89\x72\x8c\x72\x8e\x72\x90\x72\x91\x72\x93\x72\x94\x72\x95\x72\x96\x72\x97\x72\x98\x72\x99\x72\x9a\x72\x9b\x72\x9c\x72\x9d\x72\x9e\x72\xa0\x72\xa1\x72\xa2\x72\xa3\x72\xa4\x72\xa5\x72\xa6\x72\xa7\x72\xa8\x72\xa9\x72\xaa\x72\xab\x72\xae\x72\xb1\x72\xb2\x72\xb3\x72\xb5\x72\xba\x72\xbb\x72\xbc\x72\xbd\x72\xbe\x72\xbf\x72\xc0\x72\xc5\x72\xc6\x72\xc7\x72\xc9\x72\xca\x72\xcb\x72\xcc\x72\xcf\x72\xd1\x72\xd3\x72\xd4\x72\xd5\x72\xd6\x72\xd8\x72\xda", /* a180 */ "\x00\x00\x72\xdb\x72\xdc\x72\xdd\x72\xdf\x72\xe2\x72\xe3\x72\xe4\x72\xe5\x72\xe6\x72\xe7\x72\xea\x72\xeb\x72\xf5\x72\xf6\x72\xf9\x72\xfd\x72\xfe\x72\xff\x73\x00\x73\x02\x73\x04\x73\x05\x73\x06\x73\x07\x73\x08\x73\x09\x73\x0b\x73\x0c\x73\x0d\x73\x0f\x73\x10\x73\x11\x73\x12\x73\x14\x73\x18\x73\x19\x73\x1a\x73\x1f\x73\x20\x73\x23\x73\x24\x73\x26\x73\x27\x73\x28\x73\x2d\x73\x2f\x73\x30\x73\x32\x73\x33\x73\x35\x73\x36\x73\x3a\x73\x3b\x73\x3c\x73\x3d\x73\x40\x73\x41\x73\x42\x73\x43\x73\x44\x73\x45\x73\x46\x73\x47\x73\x48\x73\x49\x73\x4a\x73\x4b\x73\x4c\x73\x4e\x73\x4f\x73\x51\x73\x53\x73\x54\x73\x55\x73\x56\x73\x58\x73\x59\x73\x5a\x73\x5b\x73\x5c\x73\x5d\x73\x5e\x73\x5f\x73\x61\x73\x62\x73\x63\x73\x64\x73\x65\x73\x66\x73\x67\x73\x68\x73\x69\x73\x6a\x73\x6b\x73\x6e\x73\x70\x73\x71\x73\x72\x73\x73\x73\x74\x73\x75\x73\x76\x73\x77\x73\x78\x73\x79\x73\x7a\x73\x7b\x73\x7c\x73\x7d\x73\x7f\x73\x80\x73\x81\x73\x82\x73\x83\x73\x85\x73\x86\x73\x88\x73\x8a\x73\x8c\x73\x8d\x73\x8f\x73\x90\x73\x92\x73\x93\x73\x94\x00\x00\x00\x00", /* a200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x95\x73\x97\x73\x98\x73\x99\x73\x9a\x73\x9c\x73\x9d\x73\x9e\x73\xa0\x73\xa1\x73\xa3\x73\xa4\x73\xa5\x73\xa6\x73\xa7\x73\xa8\x73\xaa\x73\xac\x73\xad\x73\xb1\x73\xb4\x73\xb5\x73\xb6\x73\xb8\x73\xb9\x73\xbc\x73\xbd\x73\xbe\x73\xbf\x73\xc1\x73\xc3\x73\xc4\x73\xc5\x73\xc6\x73\xc7\x73\xcb\x73\xcc\x73\xce\x73\xd2\x73\xd3\x73\xd4\x73\xd5\x73\xd6\x73\xd7\x73\xd8\x73\xda\x73\xdb\x73\xdc\x73\xdd\x73\xdf\x73\xe1\x73\xe2\x73\xe3\x73\xe4\x73\xe6\x73\xe8\x73\xea\x73\xeb\x73\xec\x73\xee\x73\xef\x73\xf0\x73\xf1", /* a280 */ "\x00\x00\x73\xf3\x73\xf4\x73\xf5\x73\xf6\x73\xf7\x73\xf8\x73\xf9\x73\xfa\x73\xfb\x73\xfc\x73\xfd\x73\xfe\x73\xff\x74\x00\x74\x01\x74\x02\x74\x04\x74\x07\x74\x08\x74\x0b\x74\x0c\x74\x0d\x74\x0e\x74\x11\x74\x12\x74\x13\x74\x14\x74\x15\x74\x16\x74\x17\x74\x18\x74\x19\x74\x1c\x74\x1d\x74\x1e\x74\x1f\x74\x20\x74\x21\x74\x23\x74\x24\x74\x27\x74\x29\x74\x2b\x74\x2d\x74\x2f\x74\x31\x74\x32\x74\x37\x74\x38\x74\x39\x74\x3a\x74\x3b\x74\x3d\x74\x3e\x74\x3f\x74\x40\x74\x42\x74\x43\x74\x44\x74\x45\x74\x46\x74\x47\x74\x48\x74\x49\x74\x4a\x74\x4b\x74\x4c\x74\x4d\x74\x4e\x74\x4f\x74\x50\x74\x51\x74\x52\x74\x53\x74\x54\x74\x56\x74\x58\x74\x5d\x74\x60\x74\x61\x74\x62\x74\x63\x74\x64\x74\x65\x74\x66\x74\x67\x74\x68\x74\x69\x74\x6a\x74\x6b\x74\x6c\x74\x6e\x74\x6f\x74\x71\x74\x72\x74\x73\x74\x74\x74\x75\x74\x78\x74\x79\x74\x7a\x74\x7b\x74\x7c\x74\x7d\x74\x7f\x74\x82\x74\x84\x74\x85\x74\x86\x74\x88\x74\x89\x74\x8a\x74\x8c\x74\x8d\x74\x8f\x74\x91\x74\x92\x74\x93\x74\x94\x74\x95\x74\x96\x74\x97\x74\x98\x74\x99\x74\x9a\x00\x00\x00\x00", /* a300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x9b\x74\x9d\x74\x9f\x74\xa0\x74\xa1\x74\xa2\x74\xa3\x74\xa4\x74\xa5\x74\xa6\x74\xaa\x74\xab\x74\xac\x74\xad\x74\xae\x74\xaf\x74\xb0\x74\xb1\x74\xb2\x74\xb3\x74\xb4\x74\xb5\x74\xb6\x74\xb7\x74\xb8\x74\xb9\x74\xbb\x74\xbc\x74\xbd\x74\xbe\x74\xbf\x74\xc0\x74\xc1\x74\xc2\x74\xc3\x74\xc4\x74\xc5\x74\xc6\x74\xc7\x74\xc8\x74\xc9\x74\xca\x74\xcb\x74\xcc\x74\xcd\x74\xce\x74\xcf\x74\xd0\x74\xd1\x74\xd3\x74\xd4\x74\xd5\x74\xd6\x74\xd7\x74\xd8\x74\xd9\x74\xda\x74\xdb\x74\xdd\x74\xdf\x74\xe1\x74\xe5\x74\xe7", /* a380 */ "\x00\x00\x74\xe8\x74\xe9\x74\xea\x74\xeb\x74\xec\x74\xed\x74\xf0\x74\xf1\x74\xf2\x74\xf3\x74\xf5\x74\xf8\x74\xf9\x74\xfa\x74\xfb\x74\xfc\x74\xfd\x74\xfe\x75\x00\x75\x01\x75\x02\x75\x03\x75\x05\x75\x06\x75\x07\x75\x08\x75\x09\x75\x0a\x75\x0b\x75\x0c\x75\x0e\x75\x10\x75\x12\x75\x14\x75\x15\x75\x16\x75\x17\x75\x1b\x75\x1d\x75\x1e\x75\x20\x75\x21\x75\x22\x75\x23\x75\x24\x75\x26\x75\x27\x75\x2a\x75\x2e\x75\x34\x75\x36\x75\x39\x75\x3c\x75\x3d\x75\x3f\x75\x41\x75\x42\x75\x43\x75\x44\x75\x46\x75\x47\x75\x49\x75\x4a\x75\x4d\x75\x50\x75\x51\x75\x52\x75\x53\x75\x55\x75\x56\x75\x57\x75\x58\x75\x5d\x75\x5e\x75\x5f\x75\x60\x75\x61\x75\x62\x75\x63\x75\x64\x75\x67\x75\x68\x75\x69\x75\x6b\x75\x6c\x75\x6d\x75\x6e\x75\x6f\x75\x70\x75\x71\x75\x73\x75\x75\x75\x76\x75\x77\x75\x7a\x75\x7b\x75\x7c\x75\x7d\x75\x7e\x75\x80\x75\x81\x75\x82\x75\x84\x75\x85\x75\x87\x75\x88\x75\x89\x75\x8a\x75\x8c\x75\x8d\x75\x8e\x75\x90\x75\x93\x75\x95\x75\x98\x75\x9b\x75\x9c\x75\x9e\x75\xa2\x75\xa6\x75\xa7\x75\xa8\x75\xa9\x75\xaa\x75\xad\x00\x00\x00\x00", /* a400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xb6\x75\xb7\x75\xba\x75\xbb\x75\xbf\x75\xc0\x75\xc1\x75\xc6\x75\xcb\x75\xcc\x75\xce\x75\xcf\x75\xd0\x75\xd1\x75\xd3\x75\xd7\x75\xd9\x75\xda\x75\xdc\x75\xdd\x75\xdf\x75\xe0\x75\xe1\x75\xe5\x75\xe9\x75\xec\x75\xed\x75\xee\x75\xef\x75\xf2\x75\xf3\x75\xf5\x75\xf6\x75\xf7\x75\xf8\x75\xfa\x75\xfb\x75\xfd\x75\xfe\x76\x02\x76\x04\x76\x06\x76\x07\x76\x08\x76\x09\x76\x0b\x76\x0d\x76\x0e\x76\x0f\x76\x11\x76\x12\x76\x13\x76\x14\x76\x16\x76\x1a\x76\x1c\x76\x1d\x76\x1e\x76\x21\x76\x23\x76\x27\x76\x28\x76\x2c", /* a480 */ "\x00\x00\x76\x2e\x76\x2f\x76\x31\x76\x32\x76\x36\x76\x37\x76\x39\x76\x3a\x76\x3b\x76\x3d\x76\x41\x76\x42\x76\x44\x76\x45\x76\x46\x76\x47\x76\x48\x76\x49\x76\x4a\x76\x4b\x76\x4e\x76\x4f\x76\x50\x76\x51\x76\x52\x76\x53\x76\x55\x76\x57\x76\x58\x76\x59\x76\x5a\x76\x5b\x76\x5d\x76\x5f\x76\x60\x76\x61\x76\x62\x76\x64\x76\x65\x76\x66\x76\x67\x76\x68\x76\x69\x76\x6a\x76\x6c\x76\x6d\x76\x6e\x76\x70\x76\x71\x76\x72\x76\x73\x76\x74\x76\x75\x76\x76\x76\x77\x76\x79\x76\x7a\x76\x7c\x76\x7f\x76\x80\x76\x81\x76\x83\x76\x85\x76\x89\x76\x8a\x76\x8c\x76\x8d\x76\x8f\x76\x90\x76\x92\x76\x94\x76\x95\x76\x97\x76\x98\x76\x9a\x76\x9b\x76\x9c\x76\x9d\x76\x9e\x76\x9f\x76\xa0\x76\xa1\x76\xa2\x76\xa3\x76\xa5\x76\xa6\x76\xa7\x76\xa8\x76\xa9\x76\xaa\x76\xab\x76\xac\x76\xad\x76\xaf\x76\xb0\x76\xb3\x76\xb5\x76\xb6\x76\xb7\x76\xb8\x76\xb9\x76\xba\x76\xbb\x76\xbc\x76\xbd\x76\xbe\x76\xc0\x76\xc1\x76\xc3\x76\xc4\x76\xc7\x76\xc9\x76\xcb\x76\xcc\x76\xd3\x76\xd5\x76\xd9\x76\xda\x76\xdc\x76\xdd\x76\xde\x76\xe0\x76\xe1\x76\xe2\x76\xe3\x00\x00\x00\x00", /* a500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\xe4\x76\xe6\x76\xe7\x76\xe8\x76\xe9\x76\xea\x76\xeb\x76\xec\x76\xed\x76\xf0\x76\xf3\x76\xf5\x76\xf6\x76\xf7\x76\xfa\x76\xfb\x76\xfd\x76\xff\x77\x00\x77\x02\x77\x03\x77\x05\x77\x06\x77\x0a\x77\x0c\x77\x0e\x77\x0f\x77\x10\x77\x11\x77\x12\x77\x13\x77\x14\x77\x15\x77\x16\x77\x17\x77\x18\x77\x1b\x77\x1c\x77\x1d\x77\x1e\x77\x21\x77\x23\x77\x24\x77\x25\x77\x27\x77\x2a\x77\x2b\x77\x2c\x77\x2e\x77\x30\x77\x31\x77\x32\x77\x33\x77\x34\x77\x39\x77\x3b\x77\x3d\x77\x3e\x77\x3f\x77\x42\x77\x44\x77\x45\x77\x46", /* a580 */ "\x00\x00\x77\x48\x77\x49\x77\x4a\x77\x4b\x77\x4c\x77\x4d\x77\x4e\x77\x4f\x77\x52\x77\x53\x77\x54\x77\x55\x77\x56\x77\x57\x77\x58\x77\x59\x77\x5c\x77\x5d\x77\x5e\x77\x5f\x77\x60\x77\x64\x77\x67\x77\x69\x77\x6a\x77\x6d\x77\x6e\x77\x6f\x77\x70\x77\x71\x77\x72\x77\x73\x77\x74\x77\x75\x77\x76\x77\x77\x77\x78\x77\x7a\x77\x7b\x77\x7c\x77\x81\x77\x82\x77\x83\x77\x86\x77\x87\x77\x88\x77\x89\x77\x8a\x77\x8b\x77\x8f\x77\x90\x77\x93\x77\x94\x77\x95\x77\x96\x77\x97\x77\x98\x77\x99\x77\x9a\x77\x9b\x77\x9c\x77\x9d\x77\x9e\x77\xa1\x77\xa3\x77\xa4\x77\xa6\x77\xa8\x77\xab\x77\xad\x77\xae\x77\xaf\x77\xb1\x77\xb2\x77\xb4\x77\xb6\x77\xb7\x77\xb8\x77\xb9\x77\xba\x77\xbc\x77\xbe\x77\xc0\x77\xc1\x77\xc2\x77\xc3\x77\xc4\x77\xc5\x77\xc6\x77\xc7\x77\xc8\x77\xc9\x77\xca\x77\xcb\x77\xcc\x77\xce\x77\xcf\x77\xd0\x77\xd1\x77\xd2\x77\xd3\x77\xd4\x77\xd5\x77\xd6\x77\xd8\x77\xd9\x77\xda\x77\xdd\x77\xde\x77\xdf\x77\xe0\x77\xe1\x77\xe4\x77\xe6\x77\xe8\x77\xea\x77\xef\x77\xf0\x77\xf1\x77\xf2\x77\xf4\x77\xf5\x77\xf7\x77\xf9\x77\xfa\x00\x00\x00\x00", /* a600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\xfb\x77\xfc\x78\x03\x78\x04\x78\x05\x78\x06\x78\x07\x78\x08\x78\x0a\x78\x0b\x78\x0e\x78\x0f\x78\x10\x78\x13\x78\x15\x78\x19\x78\x1b\x78\x1e\x78\x20\x78\x21\x78\x22\x78\x24\x78\x28\x78\x2a\x78\x2b\x78\x2e\x78\x2f\x78\x31\x78\x32\x78\x33\x78\x35\x78\x36\x78\x3d\x78\x3f\x78\x41\x78\x42\x78\x43\x78\x44\x78\x46\x78\x48\x78\x49\x78\x4a\x78\x4b\x78\x4d\x78\x4f\x78\x51\x78\x53\x78\x54\x78\x58\x78\x59\x78\x5a\x78\x5b\x78\x5c\x78\x5e\x78\x5f\x78\x60\x78\x61\x78\x62\x78\x63\x78\x64\x78\x65\x78\x66\x78\x67", /* a680 */ "\x00\x00\x78\x68\x78\x69\x78\x6f\x78\x70\x78\x71\x78\x72\x78\x73\x78\x74\x78\x75\x78\x76\x78\x78\x78\x79\x78\x7a\x78\x7b\x78\x7d\x78\x7e\x78\x7f\x78\x80\x78\x81\x78\x82\x78\x83\x78\x84\x78\x85\x78\x86\x78\x88\x78\x8a\x78\x8b\x78\x8f\x78\x90\x78\x92\x78\x94\x78\x95\x78\x96\x78\x99\x78\x9d\x78\x9e\x78\xa0\x78\xa2\x78\xa4\x78\xa6\x78\xa8\x78\xa9\x78\xaa\x78\xab\x78\xac\x78\xad\x78\xae\x78\xaf\x78\xb5\x78\xb6\x78\xb7\x78\xb8\x78\xba\x78\xbb\x78\xbc\x78\xbd\x78\xbf\x78\xc0\x78\xc2\x78\xc3\x78\xc4\x78\xc6\x78\xc7\x78\xc8\x78\xcc\x78\xcd\x78\xce\x78\xcf\x78\xd1\x78\xd2\x78\xd3\x78\xd6\x78\xd7\x78\xd8\x78\xda\x78\xdb\x78\xdc\x78\xdd\x78\xde\x78\xdf\x78\xe0\x78\xe1\x78\xe2\x78\xe3\x78\xe4\x78\xe5\x78\xe6\x78\xe7\x78\xe9\x78\xea\x78\xeb\x78\xed\x78\xee\x78\xef\x78\xf0\x78\xf1\x78\xf3\x78\xf5\x78\xf6\x78\xf8\x78\xf9\x78\xfb\x78\xfc\x78\xfd\x78\xfe\x78\xff\x79\x00\x79\x02\x79\x03\x79\x04\x79\x06\x79\x07\x79\x08\x79\x09\x79\x0a\x79\x0b\x79\x0c\x79\x0d\x79\x0e\x79\x0f\x79\x10\x79\x11\x79\x12\x79\x14\x79\x15\x00\x00\x00\x00", /* a700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x16\x79\x17\x79\x18\x79\x19\x79\x1a\x79\x1b\x79\x1c\x79\x1d\x79\x1f\x79\x20\x79\x21\x79\x22\x79\x23\x79\x25\x79\x26\x79\x27\x79\x28\x79\x29\x79\x2a\x79\x2b\x79\x2c\x79\x2d\x79\x2e\x79\x2f\x79\x30\x79\x31\x79\x32\x79\x33\x79\x35\x79\x36\x79\x37\x79\x38\x79\x39\x79\x3d\x79\x3f\x79\x42\x79\x43\x79\x44\x79\x45\x79\x47\x79\x4a\x79\x4b\x79\x4c\x79\x4d\x79\x4e\x79\x4f\x79\x50\x79\x51\x79\x52\x79\x54\x79\x55\x79\x58\x79\x59\x79\x61\x79\x63\x79\x64\x79\x66\x79\x69\x79\x6a\x79\x6b\x79\x6c\x79\x6e\x79\x70", /* a780 */ "\x00\x00\x79\x71\x79\x72\x79\x73\x79\x74\x79\x75\x79\x76\x79\x79\x79\x7b\x79\x7c\x79\x7d\x79\x7e\x79\x7f\x79\x82\x79\x83\x79\x86\x79\x87\x79\x88\x79\x89\x79\x8b\x79\x8c\x79\x8d\x79\x8e\x79\x90\x79\x91\x79\x92\x79\x93\x79\x94\x79\x95\x79\x96\x79\x97\x79\x98\x79\x99\x79\x9b\x79\x9c\x79\x9d\x79\x9e\x79\x9f\x79\xa0\x79\xa1\x79\xa2\x79\xa3\x79\xa4\x79\xa5\x79\xa6\x79\xa8\x79\xa9\x79\xaa\x79\xab\x79\xac\x79\xad\x79\xae\x79\xaf\x79\xb0\x79\xb1\x79\xb2\x79\xb4\x79\xb5\x79\xb6\x79\xb7\x79\xb8\x79\xbc\x79\xbf\x79\xc2\x79\xc4\x79\xc5\x79\xc7\x79\xc8\x79\xca\x79\xcc\x79\xce\x79\xcf\x79\xd0\x79\xd3\x79\xd4\x79\xd6\x79\xd7\x79\xd9\x79\xda\x79\xdb\x79\xdc\x79\xdd\x79\xde\x79\xe0\x79\xe1\x79\xe2\x79\xe5\x79\xe8\x79\xea\x79\xec\x79\xee\x79\xf1\x79\xf2\x79\xf3\x79\xf4\x79\xf5\x79\xf6\x79\xf7\x79\xf9\x79\xfa\x79\xfc\x79\xfe\x79\xff\x7a\x01\x7a\x04\x7a\x05\x7a\x07\x7a\x08\x7a\x09\x7a\x0a\x7a\x0c\x7a\x0f\x7a\x10\x7a\x11\x7a\x12\x7a\x13\x7a\x15\x7a\x16\x7a\x18\x7a\x19\x7a\x1b\x7a\x1c\x7a\x1d\x7a\x1f\x7a\x21\x7a\x22\x00\x00\x00\x00", /* a800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x24\x7a\x25\x7a\x26\x7a\x27\x7a\x28\x7a\x29\x7a\x2a\x7a\x2b\x7a\x2c\x7a\x2d\x7a\x2e\x7a\x2f\x7a\x30\x7a\x31\x7a\x32\x7a\x34\x7a\x35\x7a\x36\x7a\x38\x7a\x3a\x7a\x3e\x7a\x40\x7a\x41\x7a\x42\x7a\x43\x7a\x44\x7a\x45\x7a\x47\x7a\x48\x7a\x49\x7a\x4a\x7a\x4b\x7a\x4c\x7a\x4d\x7a\x4e\x7a\x4f\x7a\x50\x7a\x52\x7a\x53\x7a\x54\x7a\x55\x7a\x56\x7a\x58\x7a\x59\x7a\x5a\x7a\x5b\x7a\x5c\x7a\x5d\x7a\x5e\x7a\x5f\x7a\x60\x7a\x61\x7a\x62\x7a\x63\x7a\x64\x7a\x65\x7a\x66\x7a\x67\x7a\x68\x7a\x69\x7a\x6a\x7a\x6b\x7a\x6c", /* a880 */ "\x00\x00\x7a\x6d\x7a\x6e\x7a\x6f\x7a\x71\x7a\x72\x7a\x73\x7a\x75\x7a\x7b\x7a\x7c\x7a\x7d\x7a\x7e\x7a\x82\x7a\x85\x7a\x87\x7a\x89\x7a\x8a\x7a\x8b\x7a\x8c\x7a\x8e\x7a\x8f\x7a\x90\x7a\x93\x7a\x94\x7a\x99\x7a\x9a\x7a\x9b\x7a\x9e\x7a\xa1\x7a\xa2\x7a\xa3\x7a\xa4\x7a\xa7\x7a\xa9\x7a\xaa\x7a\xab\x7a\xae\x7a\xaf\x7a\xb0\x7a\xb1\x7a\xb2\x7a\xb4\x7a\xb5\x7a\xb6\x7a\xb7\x7a\xb8\x7a\xb9\x7a\xba\x7a\xbb\x7a\xbc\x7a\xbd\x7a\xbe\x7a\xc0\x7a\xc1\x7a\xc2\x7a\xc3\x7a\xc4\x7a\xc5\x7a\xc6\x7a\xc7\x7a\xc8\x7a\xc9\x7a\xca\x7a\xcc\x7a\xcd\x7a\xce\x7a\xcf\x7a\xd0\x7a\xd1\x7a\xd2\x7a\xd3\x7a\xd4\x7a\xd5\x7a\xd7\x7a\xd8\x7a\xda\x7a\xdb\x7a\xdc\x7a\xdd\x7a\xe1\x7a\xe2\x7a\xe4\x7a\xe7\x7a\xe8\x7a\xe9\x7a\xea\x7a\xeb\x7a\xec\x7a\xee\x7a\xf0\x7a\xf1\x7a\xf2\x7a\xf3\x7a\xf4\x7a\xf5\x7a\xf6\x7a\xf7\x7a\xf8\x7a\xfb\x7a\xfc\x7a\xfe\x7b\x00\x7b\x01\x7b\x02\x7b\x05\x7b\x07\x7b\x09\x7b\x0c\x7b\x0d\x7b\x0e\x7b\x10\x7b\x12\x7b\x13\x7b\x16\x7b\x17\x7b\x18\x7b\x1a\x7b\x1c\x7b\x1d\x7b\x1f\x7b\x21\x7b\x22\x7b\x23\x7b\x27\x7b\x29\x7b\x2d\x00\x00\x00\x00", /* a900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x2f\x7b\x30\x7b\x32\x7b\x34\x7b\x35\x7b\x36\x7b\x37\x7b\x39\x7b\x3b\x7b\x3d\x7b\x3f\x7b\x40\x7b\x41\x7b\x42\x7b\x43\x7b\x44\x7b\x46\x7b\x48\x7b\x4a\x7b\x4d\x7b\x4e\x7b\x53\x7b\x55\x7b\x57\x7b\x59\x7b\x5c\x7b\x5e\x7b\x5f\x7b\x61\x7b\x63\x7b\x64\x7b\x65\x7b\x66\x7b\x67\x7b\x68\x7b\x69\x7b\x6a\x7b\x6b\x7b\x6c\x7b\x6d\x7b\x6f\x7b\x70\x7b\x73\x7b\x74\x7b\x76\x7b\x78\x7b\x7a\x7b\x7c\x7b\x7d\x7b\x7f\x7b\x81\x7b\x82\x7b\x83\x7b\x84\x7b\x86\x7b\x87\x7b\x88\x7b\x89\x7b\x8a\x7b\x8b\x7b\x8c\x7b\x8e\x7b\x8f", /* a980 */ "\x00\x00\x7b\x91\x7b\x92\x7b\x93\x7b\x96\x7b\x98\x7b\x99\x7b\x9a\x7b\x9b\x7b\x9e\x7b\x9f\x7b\xa0\x7b\xa3\x7b\xa4\x7b\xa5\x7b\xae\x7b\xaf\x7b\xb0\x7b\xb2\x7b\xb3\x7b\xb5\x7b\xb6\x7b\xb7\x7b\xb9\x7b\xba\x7b\xbb\x7b\xbc\x7b\xbd\x7b\xbe\x7b\xbf\x7b\xc0\x7b\xc2\x7b\xc3\x7b\xc4\x7b\xc5\x7b\xc8\x7b\xc9\x7b\xca\x7b\xcb\x7b\xcd\x7b\xce\x7b\xcf\x7b\xd0\x7b\xd2\x7b\xd4\x7b\xd5\x7b\xd6\x7b\xd7\x7b\xd8\x7b\xdb\x7b\xdc\x7b\xde\x7b\xdf\x7b\xe0\x7b\xe2\x7b\xe3\x7b\xe4\x7b\xe7\x7b\xe8\x7b\xe9\x7b\xeb\x7b\xec\x7b\xed\x7b\xef\x7b\xf0\x7b\xf2\x7b\xf3\x7b\xf4\x7b\xf5\x7b\xf6\x7b\xf8\x7b\xf9\x7b\xfa\x7b\xfb\x7b\xfd\x7b\xff\x7c\x00\x7c\x01\x7c\x02\x7c\x03\x7c\x04\x7c\x05\x7c\x06\x7c\x08\x7c\x09\x7c\x0a\x7c\x0d\x7c\x0e\x7c\x10\x7c\x11\x7c\x12\x7c\x13\x7c\x14\x7c\x15\x7c\x17\x7c\x18\x7c\x19\x7c\x1a\x7c\x1b\x7c\x1c\x7c\x1d\x7c\x1e\x7c\x20\x7c\x21\x7c\x22\x7c\x23\x7c\x24\x7c\x25\x7c\x28\x7c\x29\x7c\x2b\x7c\x2c\x7c\x2d\x7c\x2e\x7c\x2f\x7c\x30\x7c\x31\x7c\x32\x7c\x33\x7c\x34\x7c\x35\x7c\x36\x7c\x37\x7c\x39\x7c\x3a\x7c\x3b\x00\x00\x00\x00", /* aa00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x3c\x7c\x3d\x7c\x3e\x7c\x42\x7c\x43\x7c\x44\x7c\x45\x7c\x46\x7c\x47\x7c\x48\x7c\x49\x7c\x4a\x7c\x4b\x7c\x4c\x7c\x4e\x7c\x4f\x7c\x50\x7c\x51\x7c\x52\x7c\x53\x7c\x54\x7c\x55\x7c\x56\x7c\x57\x7c\x58\x7c\x59\x7c\x5a\x7c\x5b\x7c\x5c\x7c\x5d\x7c\x5e\x7c\x5f\x7c\x60\x7c\x61\x7c\x62\x7c\x63\x7c\x64\x7c\x65\x7c\x66\x7c\x67\x7c\x68\x7c\x69\x7c\x6a\x7c\x6b\x7c\x6c\x7c\x6d\x7c\x6e\x7c\x6f\x7c\x70\x7c\x71\x7c\x72\x7c\x75\x7c\x76\x7c\x77\x7c\x78\x7c\x79\x7c\x7a\x7c\x7e\x7c\x7f\x7c\x80\x7c\x81\x7c\x82\x7c\x83", /* aa80 */ "\x00\x00\x7c\x84\x7c\x85\x7c\x86\x7c\x87\x7c\x88\x7c\x8a\x7c\x8b\x7c\x8c\x7c\x8d\x7c\x8e\x7c\x8f\x7c\x90\x7c\x93\x7c\x94\x7c\x96\x7c\x99\x7c\x9a\x7c\x9b\x7c\xa0\x7c\xa1\x7c\xa3\x7c\xa6\x7c\xa7\x7c\xa8\x7c\xa9\x7c\xab\x7c\xac\x7c\xad\x7c\xaf\x7c\xb0\x7c\xb4\x7c\xb5\x7c\xb6\x7c\xb7\x7c\xb8\x7c\xba\x7c\xbb\x7c\xbf\x7c\xc0\x7c\xc2\x7c\xc3\x7c\xc4\x7c\xc6\x7c\xc9\x7c\xcb\x7c\xce\x7c\xcf\x7c\xd0\x7c\xd1\x7c\xd2\x7c\xd3\x7c\xd4\x7c\xd8\x7c\xda\x7c\xdb\x7c\xdd\x7c\xde\x7c\xe1\x7c\xe2\x7c\xe3\x7c\xe4\x7c\xe5\x7c\xe6\x7c\xe7\x7c\xe9\x7c\xea\x7c\xeb\x7c\xec\x7c\xed\x7c\xee\x7c\xf0\x7c\xf1\x7c\xf2\x7c\xf3\x7c\xf4\x7c\xf5\x7c\xf6\x7c\xf7\x7c\xf9\x7c\xfa\x7c\xfc\x7c\xfd\x7c\xfe\x7c\xff\x7d\x00\x7d\x01\x7d\x02\x7d\x03\x7d\x04\x7d\x05\x7d\x06\x7d\x07\x7d\x08\x7d\x09\x7d\x0b\x7d\x0c\x7d\x0d\x7d\x0e\x7d\x0f\x7d\x10\x7d\x11\x7d\x12\x7d\x13\x7d\x14\x7d\x15\x7d\x16\x7d\x17\x7d\x18\x7d\x19\x7d\x1a\x7d\x1b\x7d\x1c\x7d\x1d\x7d\x1e\x7d\x1f\x7d\x21\x7d\x23\x7d\x24\x7d\x25\x7d\x26\x7d\x28\x7d\x29\x7d\x2a\x7d\x2c\x7d\x2d\x00\x00\x00\x00", /* ab00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x2e\x7d\x30\x7d\x31\x7d\x32\x7d\x33\x7d\x34\x7d\x35\x7d\x36\x7d\x37\x7d\x38\x7d\x39\x7d\x3a\x7d\x3b\x7d\x3c\x7d\x3d\x7d\x3e\x7d\x3f\x7d\x40\x7d\x41\x7d\x42\x7d\x43\x7d\x44\x7d\x45\x7d\x46\x7d\x47\x7d\x48\x7d\x49\x7d\x4a\x7d\x4b\x7d\x4c\x7d\x4d\x7d\x4e\x7d\x4f\x7d\x50\x7d\x51\x7d\x52\x7d\x53\x7d\x54\x7d\x55\x7d\x56\x7d\x57\x7d\x58\x7d\x59\x7d\x5a\x7d\x5b\x7d\x5c\x7d\x5d\x7d\x5e\x7d\x5f\x7d\x60\x7d\x61\x7d\x62\x7d\x63\x7d\x64\x7d\x65\x7d\x66\x7d\x67\x7d\x68\x7d\x69\x7d\x6a\x7d\x6b\x7d\x6c\x7d\x6d", /* ab80 */ "\x00\x00\x7d\x6f\x7d\x70\x7d\x71\x7d\x72\x7d\x73\x7d\x74\x7d\x75\x7d\x76\x7d\x78\x7d\x79\x7d\x7a\x7d\x7b\x7d\x7c\x7d\x7d\x7d\x7e\x7d\x7f\x7d\x80\x7d\x81\x7d\x82\x7d\x83\x7d\x84\x7d\x85\x7d\x86\x7d\x87\x7d\x88\x7d\x89\x7d\x8a\x7d\x8b\x7d\x8c\x7d\x8d\x7d\x8e\x7d\x8f\x7d\x90\x7d\x91\x7d\x92\x7d\x93\x7d\x94\x7d\x95\x7d\x96\x7d\x97\x7d\x98\x7d\x99\x7d\x9a\x7d\x9b\x7d\x9c\x7d\x9d\x7d\x9e\x7d\x9f\x7d\xa0\x7d\xa1\x7d\xa2\x7d\xa3\x7d\xa4\x7d\xa5\x7d\xa7\x7d\xa8\x7d\xa9\x7d\xaa\x7d\xab\x7d\xac\x7d\xad\x7d\xaf\x7d\xb0\x7d\xb1\x7d\xb2\x7d\xb3\x7d\xb4\x7d\xb5\x7d\xb6\x7d\xb7\x7d\xb8\x7d\xb9\x7d\xba\x7d\xbb\x7d\xbc\x7d\xbd\x7d\xbe\x7d\xbf\x7d\xc0\x7d\xc1\x7d\xc2\x7d\xc3\x7d\xc4\x7d\xc5\x7d\xc6\x7d\xc7\x7d\xc8\x7d\xc9\x7d\xca\x7d\xcb\x7d\xcc\x7d\xcd\x7d\xce\x7d\xcf\x7d\xd0\x7d\xd1\x7d\xd2\x7d\xd3\x7d\xd4\x7d\xd5\x7d\xd6\x7d\xd7\x7d\xd8\x7d\xd9\x7d\xda\x7d\xdb\x7d\xdc\x7d\xdd\x7d\xde\x7d\xdf\x7d\xe0\x7d\xe1\x7d\xe2\x7d\xe3\x7d\xe4\x7d\xe5\x7d\xe6\x7d\xe7\x7d\xe8\x7d\xe9\x7d\xea\x7d\xeb\x7d\xec\x7d\xed\x7d\xee\x00\x00\x00\x00", /* ac00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\xef\x7d\xf0\x7d\xf1\x7d\xf2\x7d\xf3\x7d\xf4\x7d\xf5\x7d\xf6\x7d\xf7\x7d\xf8\x7d\xf9\x7d\xfa\x7d\xfb\x7d\xfc\x7d\xfd\x7d\xfe\x7d\xff\x7e\x00\x7e\x01\x7e\x02\x7e\x03\x7e\x04\x7e\x05\x7e\x06\x7e\x07\x7e\x08\x7e\x09\x7e\x0a\x7e\x0b\x7e\x0c\x7e\x0d\x7e\x0e\x7e\x0f\x7e\x10\x7e\x11\x7e\x12\x7e\x13\x7e\x14\x7e\x15\x7e\x16\x7e\x17\x7e\x18\x7e\x19\x7e\x1a\x7e\x1b\x7e\x1c\x7e\x1d\x7e\x1e\x7e\x1f\x7e\x20\x7e\x21\x7e\x22\x7e\x23\x7e\x24\x7e\x25\x7e\x26\x7e\x27\x7e\x28\x7e\x29\x7e\x2a\x7e\x2b\x7e\x2c\x7e\x2d", /* ac80 */ "\x00\x00\x7e\x2e\x7e\x2f\x7e\x30\x7e\x31\x7e\x32\x7e\x33\x7e\x34\x7e\x35\x7e\x36\x7e\x37\x7e\x38\x7e\x39\x7e\x3a\x7e\x3c\x7e\x3d\x7e\x3e\x7e\x3f\x7e\x40\x7e\x42\x7e\x43\x7e\x44\x7e\x45\x7e\x46\x7e\x48\x7e\x49\x7e\x4a\x7e\x4b\x7e\x4c\x7e\x4d\x7e\x4e\x7e\x4f\x7e\x50\x7e\x51\x7e\x52\x7e\x53\x7e\x54\x7e\x55\x7e\x56\x7e\x57\x7e\x58\x7e\x59\x7e\x5a\x7e\x5b\x7e\x5c\x7e\x5d\x7e\x5e\x7e\x5f\x7e\x60\x7e\x61\x7e\x62\x7e\x63\x7e\x64\x7e\x65\x7e\x66\x7e\x67\x7e\x68\x7e\x69\x7e\x6a\x7e\x6b\x7e\x6c\x7e\x6d\x7e\x6e\x7e\x6f\x7e\x70\x7e\x71\x7e\x72\x7e\x73\x7e\x74\x7e\x75\x7e\x76\x7e\x77\x7e\x78\x7e\x79\x7e\x7a\x7e\x7b\x7e\x7c\x7e\x7d\x7e\x7e\x7e\x7f\x7e\x80\x7e\x81\x7e\x83\x7e\x84\x7e\x85\x7e\x86\x7e\x87\x7e\x88\x7e\x89\x7e\x8a\x7e\x8b\x7e\x8c\x7e\x8d\x7e\x8e\x7e\x8f\x7e\x90\x7e\x91\x7e\x92\x7e\x93\x7e\x94\x7e\x95\x7e\x96\x7e\x97\x7e\x98\x7e\x99\x7e\x9a\x7e\x9c\x7e\x9d\x7e\x9e\x7e\xae\x7e\xb4\x7e\xbb\x7e\xbc\x7e\xd6\x7e\xe4\x7e\xec\x7e\xf9\x7f\x0a\x7f\x10\x7f\x1e\x7f\x37\x7f\x39\x7f\x3b\x7f\x3c\x7f\x3d\x7f\x3e\x00\x00\x00\x00", /* ad00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x3f\x7f\x40\x7f\x41\x7f\x43\x7f\x46\x7f\x47\x7f\x48\x7f\x49\x7f\x4a\x7f\x4b\x7f\x4c\x7f\x4d\x7f\x4e\x7f\x4f\x7f\x52\x7f\x53\x7f\x56\x7f\x59\x7f\x5b\x7f\x5c\x7f\x5d\x7f\x5e\x7f\x60\x7f\x63\x7f\x64\x7f\x65\x7f\x66\x7f\x67\x7f\x6b\x7f\x6c\x7f\x6d\x7f\x6f\x7f\x70\x7f\x73\x7f\x75\x7f\x76\x7f\x77\x7f\x78\x7f\x7a\x7f\x7b\x7f\x7c\x7f\x7d\x7f\x7f\x7f\x80\x7f\x82\x7f\x83\x7f\x84\x7f\x85\x7f\x86\x7f\x87\x7f\x88\x7f\x89\x7f\x8b\x7f\x8d\x7f\x8f\x7f\x90\x7f\x91\x7f\x92\x7f\x93\x7f\x95\x7f\x96\x7f\x97\x7f\x98", /* ad80 */ "\x00\x00\x7f\x99\x7f\x9b\x7f\x9c\x7f\xa0\x7f\xa2\x7f\xa3\x7f\xa5\x7f\xa6\x7f\xa8\x7f\xa9\x7f\xaa\x7f\xab\x7f\xac\x7f\xad\x7f\xae\x7f\xb1\x7f\xb3\x7f\xb4\x7f\xb5\x7f\xb6\x7f\xb7\x7f\xba\x7f\xbb\x7f\xbe\x7f\xc0\x7f\xc2\x7f\xc3\x7f\xc4\x7f\xc6\x7f\xc7\x7f\xc8\x7f\xc9\x7f\xcb\x7f\xcd\x7f\xcf\x7f\xd0\x7f\xd1\x7f\xd2\x7f\xd3\x7f\xd6\x7f\xd7\x7f\xd9\x7f\xda\x7f\xdb\x7f\xdc\x7f\xdd\x7f\xde\x7f\xe2\x7f\xe3\x7f\xe4\x7f\xe7\x7f\xe8\x7f\xea\x7f\xeb\x7f\xec\x7f\xed\x7f\xef\x7f\xf2\x7f\xf4\x7f\xf5\x7f\xf6\x7f\xf7\x7f\xf8\x7f\xf9\x7f\xfa\x7f\xfd\x7f\xfe\x7f\xff\x80\x02\x80\x07\x80\x08\x80\x09\x80\x0a\x80\x0e\x80\x0f\x80\x11\x80\x13\x80\x1a\x80\x1b\x80\x1d\x80\x1e\x80\x1f\x80\x21\x80\x23\x80\x24\x80\x2b\x80\x2c\x80\x2d\x80\x2e\x80\x2f\x80\x30\x80\x32\x80\x34\x80\x39\x80\x3a\x80\x3c\x80\x3e\x80\x40\x80\x41\x80\x44\x80\x45\x80\x47\x80\x48\x80\x49\x80\x4e\x80\x4f\x80\x50\x80\x51\x80\x53\x80\x55\x80\x56\x80\x57\x80\x59\x80\x5b\x80\x5c\x80\x5d\x80\x5e\x80\x5f\x80\x60\x80\x61\x80\x62\x80\x63\x80\x64\x80\x65\x80\x66\x00\x00\x00\x00", /* ae00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x67\x80\x68\x80\x6b\x80\x6c\x80\x6d\x80\x6e\x80\x6f\x80\x70\x80\x72\x80\x73\x80\x74\x80\x75\x80\x76\x80\x77\x80\x78\x80\x79\x80\x7a\x80\x7b\x80\x7c\x80\x7d\x80\x7e\x80\x81\x80\x82\x80\x85\x80\x88\x80\x8a\x80\x8d\x80\x8e\x80\x8f\x80\x90\x80\x91\x80\x92\x80\x94\x80\x95\x80\x97\x80\x99\x80\x9e\x80\xa3\x80\xa6\x80\xa7\x80\xa8\x80\xac\x80\xb0\x80\xb3\x80\xb5\x80\xb6\x80\xb8\x80\xb9\x80\xbb\x80\xc5\x80\xc7\x80\xc8\x80\xc9\x80\xca\x80\xcb\x80\xcf\x80\xd0\x80\xd1\x80\xd2\x80\xd3\x80\xd4\x80\xd5\x80\xd8", /* ae80 */ "\x00\x00\x80\xdf\x80\xe0\x80\xe2\x80\xe3\x80\xe6\x80\xee\x80\xf5\x80\xf7\x80\xf9\x80\xfb\x80\xfe\x80\xff\x81\x00\x81\x01\x81\x03\x81\x04\x81\x05\x81\x07\x81\x08\x81\x0b\x81\x0c\x81\x15\x81\x17\x81\x19\x81\x1b\x81\x1c\x81\x1d\x81\x1f\x81\x20\x81\x21\x81\x22\x81\x23\x81\x24\x81\x25\x81\x26\x81\x27\x81\x28\x81\x29\x81\x2a\x81\x2b\x81\x2d\x81\x2e\x81\x30\x81\x33\x81\x34\x81\x35\x81\x37\x81\x39\x81\x3a\x81\x3b\x81\x3c\x81\x3d\x81\x3f\x81\x40\x81\x41\x81\x42\x81\x43\x81\x44\x81\x45\x81\x47\x81\x49\x81\x4d\x81\x4e\x81\x4f\x81\x52\x81\x56\x81\x57\x81\x58\x81\x5b\x81\x5c\x81\x5d\x81\x5e\x81\x5f\x81\x61\x81\x62\x81\x63\x81\x64\x81\x66\x81\x68\x81\x6a\x81\x6b\x81\x6c\x81\x6f\x81\x72\x81\x73\x81\x75\x81\x76\x81\x77\x81\x78\x81\x81\x81\x83\x81\x84\x81\x85\x81\x86\x81\x87\x81\x89\x81\x8b\x81\x8c\x81\x8d\x81\x8e\x81\x90\x81\x92\x81\x93\x81\x94\x81\x95\x81\x96\x81\x97\x81\x99\x81\x9a\x81\x9e\x81\x9f\x81\xa0\x81\xa1\x81\xa2\x81\xa4\x81\xa5\x81\xa7\x81\xa9\x81\xab\x81\xac\x81\xad\x81\xae\x81\xaf\x81\xb0\x81\xb1\x00\x00\x00\x00", /* af00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\xb2\x81\xb4\x81\xb5\x81\xb6\x81\xb7\x81\xb8\x81\xb9\x81\xbc\x81\xbd\x81\xbe\x81\xbf\x81\xc4\x81\xc5\x81\xc7\x81\xc8\x81\xc9\x81\xcb\x81\xcd\x81\xce\x81\xcf\x81\xd0\x81\xd1\x81\xd2\x81\xd3\x81\xd4\x81\xd5\x81\xd6\x81\xd7\x81\xd8\x81\xd9\x81\xda\x81\xdb\x81\xdc\x81\xdd\x81\xde\x81\xdf\x81\xe0\x81\xe1\x81\xe2\x81\xe4\x81\xe5\x81\xe6\x81\xe8\x81\xe9\x81\xeb\x81\xee\x81\xef\x81\xf0\x81\xf1\x81\xf2\x81\xf5\x81\xf6\x81\xf7\x81\xf8\x81\xf9\x81\xfa\x81\xfd\x81\xff\x82\x03\x82\x07\x82\x08\x82\x09\x82\x0a", /* af80 */ "\x00\x00\x82\x0b\x82\x0e\x82\x0f\x82\x11\x82\x13\x82\x15\x82\x16\x82\x17\x82\x18\x82\x19\x82\x1a\x82\x1d\x82\x20\x82\x24\x82\x25\x82\x26\x82\x27\x82\x29\x82\x2e\x82\x32\x82\x3a\x82\x3c\x82\x3d\x82\x3f\x82\x40\x82\x41\x82\x42\x82\x43\x82\x45\x82\x46\x82\x48\x82\x4a\x82\x4c\x82\x4d\x82\x4e\x82\x50\x82\x51\x82\x52\x82\x53\x82\x54\x82\x55\x82\x56\x82\x57\x82\x59\x82\x5b\x82\x5c\x82\x5d\x82\x5e\x82\x60\x82\x61\x82\x62\x82\x63\x82\x64\x82\x65\x82\x66\x82\x67\x82\x69\x82\x6a\x82\x6b\x82\x6c\x82\x6d\x82\x71\x82\x75\x82\x76\x82\x77\x82\x78\x82\x7b\x82\x7c\x82\x80\x82\x81\x82\x83\x82\x85\x82\x86\x82\x87\x82\x89\x82\x8c\x82\x90\x82\x93\x82\x94\x82\x95\x82\x96\x82\x9a\x82\x9b\x82\x9e\x82\xa0\x82\xa2\x82\xa3\x82\xa7\x82\xb2\x82\xb5\x82\xb6\x82\xba\x82\xbb\x82\xbc\x82\xbf\x82\xc0\x82\xc2\x82\xc3\x82\xc5\x82\xc6\x82\xc9\x82\xd0\x82\xd6\x82\xd9\x82\xda\x82\xdd\x82\xe2\x82\xe7\x82\xe8\x82\xe9\x82\xea\x82\xec\x82\xed\x82\xee\x82\xf0\x82\xf2\x82\xf3\x82\xf5\x82\xf6\x82\xf8\x82\xfa\x82\xfc\x82\xfd\x82\xfe\x82\xff\x00\x00\x00\x00", /* b000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x0a\x83\x0b\x83\x0d\x83\x10\x83\x12\x83\x13\x83\x16\x83\x18\x83\x19\x83\x1d\x83\x1e\x83\x1f\x83\x20\x83\x21\x83\x22\x83\x23\x83\x24\x83\x25\x83\x26\x83\x29\x83\x2a\x83\x2e\x83\x30\x83\x32\x83\x37\x83\x3b\x83\x3d\x83\x3e\x83\x3f\x83\x41\x83\x42\x83\x44\x83\x45\x83\x48\x83\x4a\x83\x4b\x83\x4c\x83\x4d\x83\x4e\x83\x53\x83\x55\x83\x56\x83\x57\x83\x58\x83\x59\x83\x5d\x83\x62\x83\x70\x83\x71\x83\x72\x83\x73\x83\x74\x83\x75\x83\x76\x83\x79\x83\x7a\x83\x7e\x83\x7f\x83\x80\x83\x81\x83\x82\x83\x83", /* b080 */ "\x00\x00\x83\x84\x83\x87\x83\x88\x83\x8a\x83\x8b\x83\x8c\x83\x8d\x83\x8f\x83\x90\x83\x91\x83\x94\x83\x95\x83\x96\x83\x97\x83\x99\x83\x9a\x83\x9d\x83\x9f\x83\xa1\x83\xa2\x83\xa3\x83\xa4\x83\xa5\x83\xa6\x83\xa7\x83\xac\x83\xad\x83\xae\x83\xaf\x83\xb5\x83\xbb\x83\xbe\x83\xbf\x83\xc2\x83\xc3\x83\xc4\x83\xc6\x83\xc8\x83\xc9\x83\xcb\x83\xcd\x83\xce\x83\xd0\x83\xd1\x83\xd2\x83\xd3\x83\xd5\x83\xd7\x83\xd9\x83\xda\x83\xdb\x83\xde\x83\xe2\x83\xe3\x83\xe4\x83\xe6\x83\xe7\x83\xe8\x83\xeb\x83\xec\x83\xed\x83\xee\x83\xef\x83\xf3\x83\xf4\x83\xf5\x83\xf6\x83\xf7\x83\xfa\x83\xfb\x83\xfc\x83\xfe\x83\xff\x84\x00\x84\x02\x84\x05\x84\x07\x84\x08\x84\x09\x84\x0a\x84\x10\x84\x12\x84\x13\x84\x14\x84\x15\x84\x16\x84\x17\x84\x19\x84\x1a\x84\x1b\x84\x1e\x84\x1f\x84\x20\x84\x21\x84\x22\x84\x23\x84\x29\x84\x2a\x84\x2b\x84\x2c\x84\x2d\x84\x2e\x84\x2f\x84\x30\x84\x32\x84\x33\x84\x34\x84\x35\x84\x36\x84\x37\x84\x39\x84\x3a\x84\x3b\x84\x3e\x84\x3f\x84\x40\x84\x41\x84\x42\x84\x43\x84\x44\x84\x45\x84\x47\x84\x48\x84\x49\x84\x4a\x00\x00\x00\x00", /* b100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x4b\x84\x4c\x84\x4d\x84\x4e\x84\x4f\x84\x50\x84\x52\x84\x53\x84\x54\x84\x55\x84\x56\x84\x58\x84\x5d\x84\x5e\x84\x5f\x84\x60\x84\x62\x84\x64\x84\x65\x84\x66\x84\x67\x84\x68\x84\x6a\x84\x6e\x84\x6f\x84\x70\x84\x72\x84\x74\x84\x77\x84\x79\x84\x7b\x84\x7c\x84\x7d\x84\x7e\x84\x7f\x84\x80\x84\x81\x84\x83\x84\x84\x84\x85\x84\x86\x84\x8a\x84\x8d\x84\x8f\x84\x90\x84\x91\x84\x92\x84\x93\x84\x94\x84\x95\x84\x96\x84\x98\x84\x9a\x84\x9b\x84\x9d\x84\x9e\x84\x9f\x84\xa0\x84\xa2\x84\xa3\x84\xa4\x84\xa5\x84\xa6", /* b180 */ "\x00\x00\x84\xa7\x84\xa8\x84\xa9\x84\xaa\x84\xab\x84\xac\x84\xad\x84\xae\x84\xb0\x84\xb1\x84\xb3\x84\xb5\x84\xb6\x84\xb7\x84\xbb\x84\xbc\x84\xbe\x84\xc0\x84\xc2\x84\xc3\x84\xc5\x84\xc6\x84\xc7\x84\xc8\x84\xcb\x84\xcc\x84\xce\x84\xcf\x84\xd2\x84\xd4\x84\xd5\x84\xd7\x84\xd8\x84\xd9\x84\xda\x84\xdb\x84\xdc\x84\xde\x84\xe1\x84\xe2\x84\xe4\x84\xe7\x84\xe8\x84\xe9\x84\xea\x84\xeb\x84\xed\x84\xee\x84\xef\x84\xf1\x84\xf2\x84\xf3\x84\xf4\x84\xf5\x84\xf6\x84\xf7\x84\xf8\x84\xf9\x84\xfa\x84\xfb\x84\xfd\x84\xfe\x85\x00\x85\x01\x85\x02\x85\x03\x85\x04\x85\x05\x85\x06\x85\x07\x85\x08\x85\x09\x85\x0a\x85\x0b\x85\x0d\x85\x0e\x85\x0f\x85\x10\x85\x12\x85\x14\x85\x15\x85\x16\x85\x18\x85\x19\x85\x1b\x85\x1c\x85\x1d\x85\x1e\x85\x20\x85\x22\x85\x23\x85\x24\x85\x25\x85\x26\x85\x27\x85\x28\x85\x29\x85\x2a\x85\x2d\x85\x2e\x85\x2f\x85\x30\x85\x31\x85\x32\x85\x33\x85\x34\x85\x35\x85\x36\x85\x3e\x85\x3f\x85\x40\x85\x41\x85\x42\x85\x44\x85\x45\x85\x46\x85\x47\x85\x4b\x85\x4c\x85\x4d\x85\x4e\x85\x4f\x85\x50\x85\x51\x85\x52\x00\x00\x00\x00", /* b200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x53\x85\x54\x85\x55\x85\x57\x85\x58\x85\x5a\x85\x5b\x85\x5c\x85\x5d\x85\x5f\x85\x60\x85\x61\x85\x62\x85\x63\x85\x65\x85\x66\x85\x67\x85\x69\x85\x6a\x85\x6b\x85\x6c\x85\x6d\x85\x6e\x85\x6f\x85\x70\x85\x71\x85\x73\x85\x75\x85\x76\x85\x77\x85\x78\x85\x7c\x85\x7d\x85\x7f\x85\x80\x85\x81\x85\x82\x85\x83\x85\x86\x85\x88\x85\x89\x85\x8a\x85\x8b\x85\x8c\x85\x8d\x85\x8e\x85\x90\x85\x91\x85\x92\x85\x93\x85\x94\x85\x95\x85\x96\x85\x97\x85\x98\x85\x99\x85\x9a\x85\x9d\x85\x9e\x85\x9f\x85\xa0\x85\xa1\x85\xa2", /* b280 */ "\x00\x00\x85\xa3\x85\xa5\x85\xa6\x85\xa7\x85\xa9\x85\xab\x85\xac\x85\xad\x85\xb1\x85\xb2\x85\xb3\x85\xb4\x85\xb5\x85\xb6\x85\xb8\x85\xba\x85\xbb\x85\xbc\x85\xbd\x85\xbe\x85\xbf\x85\xc0\x85\xc2\x85\xc3\x85\xc4\x85\xc5\x85\xc6\x85\xc7\x85\xc8\x85\xca\x85\xcb\x85\xcc\x85\xcd\x85\xce\x85\xd1\x85\xd2\x85\xd4\x85\xd6\x85\xd7\x85\xd8\x85\xd9\x85\xda\x85\xdb\x85\xdd\x85\xde\x85\xdf\x85\xe0\x85\xe1\x85\xe2\x85\xe3\x85\xe5\x85\xe6\x85\xe7\x85\xe8\x85\xea\x85\xeb\x85\xec\x85\xed\x85\xee\x85\xef\x85\xf0\x85\xf1\x85\xf2\x85\xf3\x85\xf4\x85\xf5\x85\xf6\x85\xf7\x85\xf8\x85\xf9\x85\xfa\x85\xfc\x85\xfd\x85\xfe\x86\x00\x86\x01\x86\x02\x86\x03\x86\x04\x86\x06\x86\x07\x86\x08\x86\x09\x86\x0a\x86\x0b\x86\x0c\x86\x0d\x86\x0e\x86\x0f\x86\x10\x86\x12\x86\x13\x86\x14\x86\x15\x86\x17\x86\x18\x86\x19\x86\x1a\x86\x1b\x86\x1c\x86\x1d\x86\x1e\x86\x1f\x86\x20\x86\x21\x86\x22\x86\x23\x86\x24\x86\x25\x86\x26\x86\x28\x86\x2a\x86\x2b\x86\x2c\x86\x2d\x86\x2e\x86\x2f\x86\x30\x86\x31\x86\x32\x86\x33\x86\x34\x86\x35\x86\x36\x86\x37\x00\x00\x00\x00", /* b300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x39\x86\x3a\x86\x3b\x86\x3d\x86\x3e\x86\x3f\x86\x40\x86\x41\x86\x42\x86\x43\x86\x44\x86\x45\x86\x46\x86\x47\x86\x48\x86\x49\x86\x4a\x86\x4b\x86\x4c\x86\x52\x86\x53\x86\x55\x86\x56\x86\x57\x86\x58\x86\x59\x86\x5b\x86\x5c\x86\x5d\x86\x5f\x86\x60\x86\x61\x86\x63\x86\x64\x86\x65\x86\x66\x86\x67\x86\x68\x86\x69\x86\x6a\x86\x6d\x86\x6f\x86\x70\x86\x72\x86\x73\x86\x74\x86\x75\x86\x76\x86\x77\x86\x78\x86\x83\x86\x84\x86\x85\x86\x86\x86\x87\x86\x88\x86\x89\x86\x8e\x86\x8f\x86\x90\x86\x91\x86\x92\x86\x94", /* b380 */ "\x00\x00\x86\x96\x86\x97\x86\x98\x86\x99\x86\x9a\x86\x9b\x86\x9e\x86\x9f\x86\xa0\x86\xa1\x86\xa2\x86\xa5\x86\xa6\x86\xab\x86\xad\x86\xae\x86\xb2\x86\xb3\x86\xb7\x86\xb8\x86\xb9\x86\xbb\x86\xbc\x86\xbd\x86\xbe\x86\xbf\x86\xc1\x86\xc2\x86\xc3\x86\xc5\x86\xc8\x86\xcc\x86\xcd\x86\xd2\x86\xd3\x86\xd5\x86\xd6\x86\xd7\x86\xda\x86\xdc\x86\xdd\x86\xe0\x86\xe1\x86\xe2\x86\xe3\x86\xe5\x86\xe6\x86\xe7\x86\xe8\x86\xea\x86\xeb\x86\xec\x86\xef\x86\xf5\x86\xf6\x86\xf7\x86\xfa\x86\xfb\x86\xfc\x86\xfd\x86\xff\x87\x01\x87\x04\x87\x05\x87\x06\x87\x0b\x87\x0c\x87\x0e\x87\x0f\x87\x10\x87\x11\x87\x14\x87\x16\x87\x19\x87\x1b\x87\x1d\x87\x1f\x87\x20\x87\x24\x87\x26\x87\x27\x87\x28\x87\x2a\x87\x2b\x87\x2c\x87\x2d\x87\x2f\x87\x30\x87\x32\x87\x33\x87\x35\x87\x36\x87\x38\x87\x39\x87\x3a\x87\x3c\x87\x3d\x87\x40\x87\x41\x87\x42\x87\x43\x87\x44\x87\x45\x87\x46\x87\x4a\x87\x4b\x87\x4d\x87\x4f\x87\x50\x87\x51\x87\x52\x87\x54\x87\x55\x87\x56\x87\x58\x87\x5a\x87\x5b\x87\x5c\x87\x5d\x87\x5e\x87\x5f\x87\x61\x87\x62\x87\x66\x87\x67\x00\x00\x00\x00", /* b400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x68\x87\x69\x87\x6a\x87\x6b\x87\x6c\x87\x6d\x87\x6f\x87\x71\x87\x72\x87\x73\x87\x75\x87\x77\x87\x78\x87\x79\x87\x7a\x87\x7f\x87\x80\x87\x81\x87\x84\x87\x86\x87\x87\x87\x89\x87\x8a\x87\x8c\x87\x8e\x87\x8f\x87\x90\x87\x91\x87\x92\x87\x94\x87\x95\x87\x96\x87\x98\x87\x99\x87\x9a\x87\x9b\x87\x9c\x87\x9d\x87\x9e\x87\xa0\x87\xa1\x87\xa2\x87\xa3\x87\xa4\x87\xa5\x87\xa6\x87\xa7\x87\xa9\x87\xaa\x87\xae\x87\xb0\x87\xb1\x87\xb2\x87\xb4\x87\xb6\x87\xb7\x87\xb8\x87\xb9\x87\xbb\x87\xbc\x87\xbe\x87\xbf\x87\xc1", /* b480 */ "\x00\x00\x87\xc2\x87\xc3\x87\xc4\x87\xc5\x87\xc7\x87\xc8\x87\xc9\x87\xcc\x87\xcd\x87\xce\x87\xcf\x87\xd0\x87\xd4\x87\xd5\x87\xd6\x87\xd7\x87\xd8\x87\xd9\x87\xda\x87\xdc\x87\xdd\x87\xde\x87\xdf\x87\xe1\x87\xe2\x87\xe3\x87\xe4\x87\xe6\x87\xe7\x87\xe8\x87\xe9\x87\xeb\x87\xec\x87\xed\x87\xef\x87\xf0\x87\xf1\x87\xf2\x87\xf3\x87\xf4\x87\xf5\x87\xf6\x87\xf7\x87\xf8\x87\xfa\x87\xfb\x87\xfc\x87\xfd\x87\xff\x88\x00\x88\x01\x88\x02\x88\x04\x88\x05\x88\x06\x88\x07\x88\x08\x88\x09\x88\x0b\x88\x0c\x88\x0d\x88\x0e\x88\x0f\x88\x10\x88\x11\x88\x12\x88\x14\x88\x17\x88\x18\x88\x19\x88\x1a\x88\x1c\x88\x1d\x88\x1e\x88\x1f\x88\x20\x88\x23\x88\x24\x88\x25\x88\x26\x88\x27\x88\x28\x88\x29\x88\x2a\x88\x2b\x88\x2c\x88\x2d\x88\x2e\x88\x2f\x88\x30\x88\x31\x88\x33\x88\x34\x88\x35\x88\x36\x88\x37\x88\x38\x88\x3a\x88\x3b\x88\x3d\x88\x3e\x88\x3f\x88\x41\x88\x42\x88\x43\x88\x46\x88\x47\x88\x48\x88\x49\x88\x4a\x88\x4b\x88\x4e\x88\x4f\x88\x50\x88\x51\x88\x52\x88\x53\x88\x55\x88\x56\x88\x58\x88\x5a\x88\x5b\x88\x5c\x88\x5d\x88\x5e\x00\x00\x00\x00", /* b500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x5f\x88\x60\x88\x66\x88\x67\x88\x6a\x88\x6d\x88\x6f\x88\x71\x88\x73\x88\x74\x88\x75\x88\x76\x88\x78\x88\x79\x88\x7a\x88\x7b\x88\x7c\x88\x80\x88\x83\x88\x86\x88\x87\x88\x89\x88\x8a\x88\x8c\x88\x8e\x88\x8f\x88\x90\x88\x91\x88\x93\x88\x94\x88\x95\x88\x97\x88\x98\x88\x99\x88\x9a\x88\x9b\x88\x9d\x88\x9e\x88\x9f\x88\xa0\x88\xa1\x88\xa3\x88\xa5\x88\xa6\x88\xa7\x88\xa8\x88\xa9\x88\xaa\x88\xac\x88\xae\x88\xaf\x88\xb0\x88\xb2\x88\xb3\x88\xb4\x88\xb5\x88\xb6\x88\xb8\x88\xb9\x88\xba\x88\xbb\x88\xbd\x88\xbe", /* b580 */ "\x00\x00\x88\xbf\x88\xc0\x88\xc3\x88\xc4\x88\xc7\x88\xc8\x88\xca\x88\xcb\x88\xcc\x88\xcd\x88\xcf\x88\xd0\x88\xd1\x88\xd3\x88\xd6\x88\xd7\x88\xda\x88\xdb\x88\xdc\x88\xdd\x88\xde\x88\xe0\x88\xe1\x88\xe6\x88\xe7\x88\xe9\x88\xea\x88\xeb\x88\xec\x88\xed\x88\xee\x88\xef\x88\xf2\x88\xf5\x88\xf6\x88\xf7\x88\xfa\x88\xfb\x88\xfd\x88\xff\x89\x00\x89\x01\x89\x03\x89\x04\x89\x05\x89\x06\x89\x07\x89\x08\x89\x09\x89\x0b\x89\x0c\x89\x0d\x89\x0e\x89\x0f\x89\x11\x89\x14\x89\x15\x89\x16\x89\x17\x89\x18\x89\x1c\x89\x1d\x89\x1e\x89\x1f\x89\x20\x89\x22\x89\x23\x89\x24\x89\x26\x89\x27\x89\x28\x89\x29\x89\x2c\x89\x2d\x89\x2e\x89\x2f\x89\x31\x89\x32\x89\x33\x89\x35\x89\x37\x89\x38\x89\x39\x89\x3a\x89\x3b\x89\x3c\x89\x3d\x89\x3e\x89\x3f\x89\x40\x89\x42\x89\x43\x89\x45\x89\x46\x89\x47\x89\x48\x89\x49\x89\x4a\x89\x4b\x89\x4c\x89\x4d\x89\x4e\x89\x4f\x89\x50\x89\x51\x89\x52\x89\x53\x89\x54\x89\x55\x89\x56\x89\x57\x89\x58\x89\x59\x89\x5a\x89\x5b\x89\x5c\x89\x5d\x89\x60\x89\x61\x89\x62\x89\x63\x89\x64\x89\x65\x89\x67\x89\x68\x00\x00\x00\x00", /* b600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x69\x89\x6a\x89\x6b\x89\x6c\x89\x6d\x89\x6e\x89\x6f\x89\x70\x89\x71\x89\x72\x89\x73\x89\x74\x89\x75\x89\x76\x89\x77\x89\x78\x89\x79\x89\x7a\x89\x7c\x89\x7d\x89\x7e\x89\x80\x89\x82\x89\x84\x89\x85\x89\x87\x89\x88\x89\x89\x89\x8a\x89\x8b\x89\x8c\x89\x8d\x89\x8e\x89\x8f\x89\x90\x89\x91\x89\x92\x89\x93\x89\x94\x89\x95\x89\x96\x89\x97\x89\x98\x89\x99\x89\x9a\x89\x9b\x89\x9c\x89\x9d\x89\x9e\x89\x9f\x89\xa0\x89\xa1\x89\xa2\x89\xa3\x89\xa4\x89\xa5\x89\xa6\x89\xa7\x89\xa8\x89\xa9\x89\xaa\x89\xab\x89\xac", /* b680 */ "\x00\x00\x89\xad\x89\xae\x89\xaf\x89\xb0\x89\xb1\x89\xb2\x89\xb3\x89\xb4\x89\xb5\x89\xb6\x89\xb7\x89\xb8\x89\xb9\x89\xba\x89\xbb\x89\xbc\x89\xbd\x89\xbe\x89\xbf\x89\xc0\x89\xc3\x89\xcd\x89\xd3\x89\xd4\x89\xd5\x89\xd7\x89\xd8\x89\xd9\x89\xdb\x89\xdd\x89\xdf\x89\xe0\x89\xe1\x89\xe2\x89\xe4\x89\xe7\x89\xe8\x89\xe9\x89\xea\x89\xec\x89\xed\x89\xee\x89\xf0\x89\xf1\x89\xf2\x89\xf4\x89\xf5\x89\xf6\x89\xf7\x89\xf8\x89\xf9\x89\xfa\x89\xfb\x89\xfc\x89\xfd\x89\xfe\x89\xff\x8a\x01\x8a\x02\x8a\x03\x8a\x04\x8a\x05\x8a\x06\x8a\x08\x8a\x09\x8a\x0a\x8a\x0b\x8a\x0c\x8a\x0d\x8a\x0e\x8a\x0f\x8a\x10\x8a\x11\x8a\x12\x8a\x13\x8a\x14\x8a\x15\x8a\x16\x8a\x17\x8a\x18\x8a\x19\x8a\x1a\x8a\x1b\x8a\x1c\x8a\x1d\x8a\x1e\x8a\x1f\x8a\x20\x8a\x21\x8a\x22\x8a\x23\x8a\x24\x8a\x25\x8a\x26\x8a\x27\x8a\x28\x8a\x29\x8a\x2a\x8a\x2b\x8a\x2c\x8a\x2d\x8a\x2e\x8a\x2f\x8a\x30\x8a\x31\x8a\x32\x8a\x33\x8a\x34\x8a\x35\x8a\x36\x8a\x37\x8a\x38\x8a\x39\x8a\x3a\x8a\x3b\x8a\x3c\x8a\x3d\x8a\x3f\x8a\x40\x8a\x41\x8a\x42\x8a\x43\x8a\x44\x8a\x45\x8a\x46\x00\x00\x00\x00", /* b700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x47\x8a\x49\x8a\x4a\x8a\x4b\x8a\x4c\x8a\x4d\x8a\x4e\x8a\x4f\x8a\x50\x8a\x51\x8a\x52\x8a\x53\x8a\x54\x8a\x55\x8a\x56\x8a\x57\x8a\x58\x8a\x59\x8a\x5a\x8a\x5b\x8a\x5c\x8a\x5d\x8a\x5e\x8a\x5f\x8a\x60\x8a\x61\x8a\x62\x8a\x63\x8a\x64\x8a\x65\x8a\x66\x8a\x67\x8a\x68\x8a\x69\x8a\x6a\x8a\x6b\x8a\x6c\x8a\x6d\x8a\x6e\x8a\x6f\x8a\x70\x8a\x71\x8a\x72\x8a\x73\x8a\x74\x8a\x75\x8a\x76\x8a\x77\x8a\x78\x8a\x7a\x8a\x7b\x8a\x7c\x8a\x7d\x8a\x7e\x8a\x7f\x8a\x80\x8a\x81\x8a\x82\x8a\x83\x8a\x84\x8a\x85\x8a\x86\x8a\x87", /* b780 */ "\x00\x00\x8a\x88\x8a\x8b\x8a\x8c\x8a\x8d\x8a\x8e\x8a\x8f\x8a\x90\x8a\x91\x8a\x92\x8a\x94\x8a\x95\x8a\x96\x8a\x97\x8a\x98\x8a\x99\x8a\x9a\x8a\x9b\x8a\x9c\x8a\x9d\x8a\x9e\x8a\x9f\x8a\xa0\x8a\xa1\x8a\xa2\x8a\xa3\x8a\xa4\x8a\xa5\x8a\xa6\x8a\xa7\x8a\xa8\x8a\xa9\x8a\xaa\x8a\xab\x8a\xac\x8a\xad\x8a\xae\x8a\xaf\x8a\xb0\x8a\xb1\x8a\xb2\x8a\xb3\x8a\xb4\x8a\xb5\x8a\xb6\x8a\xb7\x8a\xb8\x8a\xb9\x8a\xba\x8a\xbb\x8a\xbc\x8a\xbd\x8a\xbe\x8a\xbf\x8a\xc0\x8a\xc1\x8a\xc2\x8a\xc3\x8a\xc4\x8a\xc5\x8a\xc6\x8a\xc7\x8a\xc8\x8a\xc9\x8a\xca\x8a\xcb\x8a\xcc\x8a\xcd\x8a\xce\x8a\xcf\x8a\xd0\x8a\xd1\x8a\xd2\x8a\xd3\x8a\xd4\x8a\xd5\x8a\xd6\x8a\xd7\x8a\xd8\x8a\xd9\x8a\xda\x8a\xdb\x8a\xdc\x8a\xdd\x8a\xde\x8a\xdf\x8a\xe0\x8a\xe1\x8a\xe2\x8a\xe3\x8a\xe4\x8a\xe5\x8a\xe6\x8a\xe7\x8a\xe8\x8a\xe9\x8a\xea\x8a\xeb\x8a\xec\x8a\xed\x8a\xee\x8a\xef\x8a\xf0\x8a\xf1\x8a\xf2\x8a\xf3\x8a\xf4\x8a\xf5\x8a\xf6\x8a\xf7\x8a\xf8\x8a\xf9\x8a\xfa\x8a\xfb\x8a\xfc\x8a\xfd\x8a\xfe\x8a\xff\x8b\x00\x8b\x01\x8b\x02\x8b\x03\x8b\x04\x8b\x05\x8b\x06\x8b\x08\x00\x00\x00\x00", /* b800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x09\x8b\x0a\x8b\x0b\x8b\x0c\x8b\x0d\x8b\x0e\x8b\x0f\x8b\x10\x8b\x11\x8b\x12\x8b\x13\x8b\x14\x8b\x15\x8b\x16\x8b\x17\x8b\x18\x8b\x19\x8b\x1a\x8b\x1b\x8b\x1c\x8b\x1d\x8b\x1e\x8b\x1f\x8b\x20\x8b\x21\x8b\x22\x8b\x23\x8b\x24\x8b\x25\x8b\x27\x8b\x28\x8b\x29\x8b\x2a\x8b\x2b\x8b\x2c\x8b\x2d\x8b\x2e\x8b\x2f\x8b\x30\x8b\x31\x8b\x32\x8b\x33\x8b\x34\x8b\x35\x8b\x36\x8b\x37\x8b\x38\x8b\x39\x8b\x3a\x8b\x3b\x8b\x3c\x8b\x3d\x8b\x3e\x8b\x3f\x8b\x40\x8b\x41\x8b\x42\x8b\x43\x8b\x44\x8b\x45\x8b\x46\x8b\x47\x8b\x48", /* b880 */ "\x00\x00\x8b\x49\x8b\x4a\x8b\x4b\x8b\x4c\x8b\x4d\x8b\x4e\x8b\x4f\x8b\x50\x8b\x51\x8b\x52\x8b\x53\x8b\x54\x8b\x55\x8b\x56\x8b\x57\x8b\x58\x8b\x59\x8b\x5a\x8b\x5b\x8b\x5c\x8b\x5d\x8b\x5e\x8b\x5f\x8b\x60\x8b\x61\x8b\x62\x8b\x63\x8b\x64\x8b\x65\x8b\x67\x8b\x68\x8b\x69\x8b\x6a\x8b\x6b\x8b\x6d\x8b\x6e\x8b\x6f\x8b\x70\x8b\x71\x8b\x72\x8b\x73\x8b\x74\x8b\x75\x8b\x76\x8b\x77\x8b\x78\x8b\x79\x8b\x7a\x8b\x7b\x8b\x7c\x8b\x7d\x8b\x7e\x8b\x7f\x8b\x80\x8b\x81\x8b\x82\x8b\x83\x8b\x84\x8b\x85\x8b\x86\x8b\x87\x8b\x88\x8b\x89\x8b\x8a\x8b\x8b\x8b\x8c\x8b\x8d\x8b\x8e\x8b\x8f\x8b\x90\x8b\x91\x8b\x92\x8b\x93\x8b\x94\x8b\x95\x8b\x96\x8b\x97\x8b\x98\x8b\x99\x8b\x9a\x8b\x9b\x8b\x9c\x8b\x9d\x8b\x9e\x8b\x9f\x8b\xac\x8b\xb1\x8b\xbb\x8b\xc7\x8b\xd0\x8b\xea\x8c\x09\x8c\x1e\x8c\x38\x8c\x39\x8c\x3a\x8c\x3b\x8c\x3c\x8c\x3d\x8c\x3e\x8c\x3f\x8c\x40\x8c\x42\x8c\x43\x8c\x44\x8c\x45\x8c\x48\x8c\x4a\x8c\x4b\x8c\x4d\x8c\x4e\x8c\x4f\x8c\x50\x8c\x51\x8c\x52\x8c\x53\x8c\x54\x8c\x56\x8c\x57\x8c\x58\x8c\x59\x8c\x5b\x8c\x5c\x8c\x5d\x8c\x5e\x00\x00\x00\x00", /* b900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x5f\x8c\x60\x8c\x63\x8c\x64\x8c\x65\x8c\x66\x8c\x67\x8c\x68\x8c\x69\x8c\x6c\x8c\x6d\x8c\x6e\x8c\x6f\x8c\x70\x8c\x71\x8c\x72\x8c\x74\x8c\x75\x8c\x76\x8c\x77\x8c\x7b\x8c\x7c\x8c\x7d\x8c\x7e\x8c\x7f\x8c\x80\x8c\x81\x8c\x83\x8c\x84\x8c\x86\x8c\x87\x8c\x88\x8c\x8b\x8c\x8d\x8c\x8e\x8c\x8f\x8c\x90\x8c\x91\x8c\x92\x8c\x93\x8c\x95\x8c\x96\x8c\x97\x8c\x99\x8c\x9a\x8c\x9b\x8c\x9c\x8c\x9d\x8c\x9e\x8c\x9f\x8c\xa0\x8c\xa1\x8c\xa2\x8c\xa3\x8c\xa4\x8c\xa5\x8c\xa6\x8c\xa7\x8c\xa8\x8c\xa9\x8c\xaa\x8c\xab\x8c\xac", /* b980 */ "\x00\x00\x8c\xad\x8c\xae\x8c\xaf\x8c\xb0\x8c\xb1\x8c\xb2\x8c\xb3\x8c\xb4\x8c\xb5\x8c\xb6\x8c\xb7\x8c\xb8\x8c\xb9\x8c\xba\x8c\xbb\x8c\xbc\x8c\xbd\x8c\xbe\x8c\xbf\x8c\xc0\x8c\xc1\x8c\xc2\x8c\xc3\x8c\xc4\x8c\xc5\x8c\xc6\x8c\xc7\x8c\xc8\x8c\xc9\x8c\xca\x8c\xcb\x8c\xcc\x8c\xcd\x8c\xce\x8c\xcf\x8c\xd0\x8c\xd1\x8c\xd2\x8c\xd3\x8c\xd4\x8c\xd5\x8c\xd6\x8c\xd7\x8c\xd8\x8c\xd9\x8c\xda\x8c\xdb\x8c\xdc\x8c\xdd\x8c\xde\x8c\xdf\x8c\xe0\x8c\xe1\x8c\xe2\x8c\xe3\x8c\xe4\x8c\xe5\x8c\xe6\x8c\xe7\x8c\xe8\x8c\xe9\x8c\xea\x8c\xeb\x8c\xec\x8c\xed\x8c\xee\x8c\xef\x8c\xf0\x8c\xf1\x8c\xf2\x8c\xf3\x8c\xf4\x8c\xf5\x8c\xf6\x8c\xf7\x8c\xf8\x8c\xf9\x8c\xfa\x8c\xfb\x8c\xfc\x8c\xfd\x8c\xfe\x8c\xff\x8d\x00\x8d\x01\x8d\x02\x8d\x03\x8d\x04\x8d\x05\x8d\x06\x8d\x07\x8d\x08\x8d\x09\x8d\x0a\x8d\x0b\x8d\x0c\x8d\x0d\x8d\x0e\x8d\x0f\x8d\x10\x8d\x11\x8d\x12\x8d\x13\x8d\x14\x8d\x15\x8d\x16\x8d\x17\x8d\x18\x8d\x19\x8d\x1a\x8d\x1b\x8d\x1c\x8d\x20\x8d\x51\x8d\x52\x8d\x57\x8d\x5f\x8d\x65\x8d\x68\x8d\x69\x8d\x6a\x8d\x6c\x8d\x6e\x8d\x6f\x8d\x71\x00\x00\x00\x00", /* ba00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x72\x8d\x78\x8d\x79\x8d\x7a\x8d\x7b\x8d\x7c\x8d\x7d\x8d\x7e\x8d\x7f\x8d\x80\x8d\x82\x8d\x83\x8d\x86\x8d\x87\x8d\x88\x8d\x89\x8d\x8c\x8d\x8d\x8d\x8e\x8d\x8f\x8d\x90\x8d\x92\x8d\x93\x8d\x95\x8d\x96\x8d\x97\x8d\x98\x8d\x99\x8d\x9a\x8d\x9b\x8d\x9c\x8d\x9d\x8d\x9e\x8d\xa0\x8d\xa1\x8d\xa2\x8d\xa4\x8d\xa5\x8d\xa6\x8d\xa7\x8d\xa8\x8d\xa9\x8d\xaa\x8d\xab\x8d\xac\x8d\xad\x8d\xae\x8d\xaf\x8d\xb0\x8d\xb2\x8d\xb6\x8d\xb7\x8d\xb9\x8d\xbb\x8d\xbd\x8d\xc0\x8d\xc1\x8d\xc2\x8d\xc5\x8d\xc7\x8d\xc8\x8d\xc9\x8d\xca", /* ba80 */ "\x00\x00\x8d\xcd\x8d\xd0\x8d\xd2\x8d\xd3\x8d\xd4\x8d\xd5\x8d\xd8\x8d\xd9\x8d\xdc\x8d\xe0\x8d\xe1\x8d\xe2\x8d\xe5\x8d\xe6\x8d\xe7\x8d\xe9\x8d\xed\x8d\xee\x8d\xf0\x8d\xf1\x8d\xf2\x8d\xf4\x8d\xf6\x8d\xfc\x8d\xfe\x8d\xff\x8e\x00\x8e\x01\x8e\x02\x8e\x03\x8e\x04\x8e\x06\x8e\x07\x8e\x08\x8e\x0b\x8e\x0d\x8e\x0e\x8e\x10\x8e\x11\x8e\x12\x8e\x13\x8e\x15\x8e\x16\x8e\x17\x8e\x18\x8e\x19\x8e\x1a\x8e\x1b\x8e\x1c\x8e\x20\x8e\x21\x8e\x24\x8e\x25\x8e\x26\x8e\x27\x8e\x28\x8e\x2b\x8e\x2d\x8e\x30\x8e\x32\x8e\x33\x8e\x34\x8e\x36\x8e\x37\x8e\x38\x8e\x3b\x8e\x3c\x8e\x3e\x8e\x3f\x8e\x43\x8e\x45\x8e\x46\x8e\x4c\x8e\x4d\x8e\x4e\x8e\x4f\x8e\x50\x8e\x53\x8e\x54\x8e\x55\x8e\x56\x8e\x57\x8e\x58\x8e\x5a\x8e\x5b\x8e\x5c\x8e\x5d\x8e\x5e\x8e\x5f\x8e\x60\x8e\x61\x8e\x62\x8e\x63\x8e\x64\x8e\x65\x8e\x67\x8e\x68\x8e\x6a\x8e\x6b\x8e\x6e\x8e\x71\x8e\x73\x8e\x75\x8e\x77\x8e\x78\x8e\x79\x8e\x7a\x8e\x7b\x8e\x7d\x8e\x7e\x8e\x80\x8e\x82\x8e\x83\x8e\x84\x8e\x86\x8e\x88\x8e\x89\x8e\x8a\x8e\x8b\x8e\x8c\x8e\x8d\x8e\x8e\x8e\x91\x8e\x92\x8e\x93\x00\x00\x00\x00", /* bb00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x95\x8e\x96\x8e\x97\x8e\x98\x8e\x99\x8e\x9a\x8e\x9b\x8e\x9d\x8e\x9f\x8e\xa0\x8e\xa1\x8e\xa2\x8e\xa3\x8e\xa4\x8e\xa5\x8e\xa6\x8e\xa7\x8e\xa8\x8e\xa9\x8e\xaa\x8e\xad\x8e\xae\x8e\xb0\x8e\xb1\x8e\xb3\x8e\xb4\x8e\xb5\x8e\xb6\x8e\xb7\x8e\xb8\x8e\xb9\x8e\xbb\x8e\xbc\x8e\xbd\x8e\xbe\x8e\xbf\x8e\xc0\x8e\xc1\x8e\xc2\x8e\xc3\x8e\xc4\x8e\xc5\x8e\xc6\x8e\xc7\x8e\xc8\x8e\xc9\x8e\xca\x8e\xcb\x8e\xcc\x8e\xcd\x8e\xcf\x8e\xd0\x8e\xd1\x8e\xd2\x8e\xd3\x8e\xd4\x8e\xd5\x8e\xd6\x8e\xd7\x8e\xd8\x8e\xd9\x8e\xda\x8e\xdb", /* bb80 */ "\x00\x00\x8e\xdc\x8e\xdd\x8e\xde\x8e\xdf\x8e\xe0\x8e\xe1\x8e\xe2\x8e\xe3\x8e\xe4\x8e\xe5\x8e\xe6\x8e\xe7\x8e\xe8\x8e\xe9\x8e\xea\x8e\xeb\x8e\xec\x8e\xed\x8e\xee\x8e\xef\x8e\xf0\x8e\xf1\x8e\xf2\x8e\xf3\x8e\xf4\x8e\xf5\x8e\xf6\x8e\xf7\x8e\xf8\x8e\xf9\x8e\xfa\x8e\xfb\x8e\xfc\x8e\xfd\x8e\xfe\x8e\xff\x8f\x00\x8f\x01\x8f\x02\x8f\x03\x8f\x04\x8f\x05\x8f\x06\x8f\x07\x8f\x08\x8f\x09\x8f\x0a\x8f\x0b\x8f\x0c\x8f\x0d\x8f\x0e\x8f\x0f\x8f\x10\x8f\x11\x8f\x12\x8f\x13\x8f\x14\x8f\x15\x8f\x16\x8f\x17\x8f\x18\x8f\x19\x8f\x1a\x8f\x1b\x8f\x1c\x8f\x1d\x8f\x1e\x8f\x1f\x8f\x20\x8f\x21\x8f\x22\x8f\x23\x8f\x24\x8f\x25\x8f\x26\x8f\x27\x8f\x28\x8f\x29\x8f\x2a\x8f\x2b\x8f\x2c\x8f\x2d\x8f\x2e\x8f\x2f\x8f\x30\x8f\x31\x8f\x32\x8f\x33\x8f\x34\x8f\x35\x8f\x36\x8f\x37\x8f\x38\x8f\x39\x8f\x3a\x8f\x3b\x8f\x3c\x8f\x3d\x8f\x3e\x8f\x3f\x8f\x40\x8f\x41\x8f\x42\x8f\x43\x8f\x44\x8f\x45\x8f\x46\x8f\x47\x8f\x48\x8f\x49\x8f\x4a\x8f\x4b\x8f\x4c\x8f\x4d\x8f\x4e\x8f\x4f\x8f\x50\x8f\x51\x8f\x52\x8f\x53\x8f\x54\x8f\x55\x8f\x56\x8f\x57\x8f\x58\x00\x00\x00\x00", /* bc00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x59\x8f\x5a\x8f\x5b\x8f\x5c\x8f\x5d\x8f\x5e\x8f\x5f\x8f\x60\x8f\x61\x8f\x62\x8f\x63\x8f\x64\x8f\x65\x8f\x6a\x8f\x80\x8f\x8c\x8f\x92\x8f\x9d\x8f\xa0\x8f\xa1\x8f\xa2\x8f\xa4\x8f\xa5\x8f\xa6\x8f\xa7\x8f\xaa\x8f\xac\x8f\xad\x8f\xae\x8f\xaf\x8f\xb2\x8f\xb3\x8f\xb4\x8f\xb5\x8f\xb7\x8f\xb8\x8f\xba\x8f\xbb\x8f\xbc\x8f\xbf\x8f\xc0\x8f\xc3\x8f\xc6\x8f\xc9\x8f\xca\x8f\xcb\x8f\xcc\x8f\xcd\x8f\xcf\x8f\xd2\x8f\xd6\x8f\xd7\x8f\xda\x8f\xe0\x8f\xe1\x8f\xe3\x8f\xe7\x8f\xec\x8f\xef\x8f\xf1\x8f\xf2\x8f\xf4\x8f\xf5", /* bc80 */ "\x00\x00\x8f\xf6\x8f\xfa\x8f\xfb\x8f\xfc\x8f\xfe\x8f\xff\x90\x07\x90\x08\x90\x0c\x90\x0e\x90\x13\x90\x15\x90\x18\x90\x19\x90\x1c\x90\x23\x90\x24\x90\x25\x90\x27\x90\x28\x90\x29\x90\x2a\x90\x2b\x90\x2c\x90\x30\x90\x31\x90\x32\x90\x33\x90\x34\x90\x37\x90\x39\x90\x3a\x90\x3d\x90\x3f\x90\x40\x90\x43\x90\x45\x90\x46\x90\x48\x90\x49\x90\x4a\x90\x4b\x90\x4c\x90\x4e\x90\x54\x90\x55\x90\x56\x90\x59\x90\x5a\x90\x5c\x90\x5d\x90\x5e\x90\x5f\x90\x60\x90\x61\x90\x64\x90\x66\x90\x67\x90\x69\x90\x6a\x90\x6b\x90\x6c\x90\x6f\x90\x70\x90\x71\x90\x72\x90\x73\x90\x76\x90\x77\x90\x78\x90\x79\x90\x7a\x90\x7b\x90\x7c\x90\x7e\x90\x81\x90\x84\x90\x85\x90\x86\x90\x87\x90\x89\x90\x8a\x90\x8c\x90\x8d\x90\x8e\x90\x8f\x90\x90\x90\x92\x90\x94\x90\x96\x90\x98\x90\x9a\x90\x9c\x90\x9e\x90\x9f\x90\xa0\x90\xa4\x90\xa5\x90\xa7\x90\xa8\x90\xa9\x90\xab\x90\xad\x90\xb2\x90\xb7\x90\xbc\x90\xbd\x90\xbf\x90\xc0\x90\xc2\x90\xc3\x90\xc6\x90\xc8\x90\xc9\x90\xcb\x90\xcc\x90\xcd\x90\xd2\x90\xd4\x90\xd5\x90\xd6\x90\xd8\x90\xd9\x90\xda\x90\xde\x00\x00\x00\x00", /* bd00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\xdf\x90\xe0\x90\xe3\x90\xe4\x90\xe5\x90\xe9\x90\xea\x90\xec\x90\xee\x90\xf0\x90\xf1\x90\xf2\x90\xf3\x90\xf5\x90\xf6\x90\xf7\x90\xf9\x90\xfa\x90\xfb\x90\xfc\x90\xff\x91\x00\x91\x01\x91\x03\x91\x05\x91\x06\x91\x07\x91\x08\x91\x09\x91\x0a\x91\x0b\x91\x0c\x91\x0d\x91\x0e\x91\x0f\x91\x10\x91\x11\x91\x12\x91\x13\x91\x14\x91\x15\x91\x16\x91\x17\x91\x18\x91\x1a\x91\x1b\x91\x1c\x91\x1d\x91\x1f\x91\x20\x91\x21\x91\x24\x91\x25\x91\x26\x91\x27\x91\x28\x91\x29\x91\x2a\x91\x2b\x91\x2c\x91\x2d\x91\x2e\x91\x30", /* bd80 */ "\x00\x00\x91\x32\x91\x33\x91\x34\x91\x35\x91\x36\x91\x37\x91\x38\x91\x3a\x91\x3b\x91\x3c\x91\x3d\x91\x3e\x91\x3f\x91\x40\x91\x41\x91\x42\x91\x44\x91\x45\x91\x47\x91\x48\x91\x51\x91\x53\x91\x54\x91\x55\x91\x56\x91\x58\x91\x59\x91\x5b\x91\x5c\x91\x5f\x91\x60\x91\x66\x91\x67\x91\x68\x91\x6b\x91\x6d\x91\x73\x91\x7a\x91\x7b\x91\x7c\x91\x80\x91\x81\x91\x82\x91\x83\x91\x84\x91\x86\x91\x88\x91\x8a\x91\x8e\x91\x8f\x91\x93\x91\x94\x91\x95\x91\x96\x91\x97\x91\x98\x91\x99\x91\x9c\x91\x9d\x91\x9e\x91\x9f\x91\xa0\x91\xa1\x91\xa4\x91\xa5\x91\xa6\x91\xa7\x91\xa8\x91\xa9\x91\xab\x91\xac\x91\xb0\x91\xb1\x91\xb2\x91\xb3\x91\xb6\x91\xb7\x91\xb8\x91\xb9\x91\xbb\x91\xbc\x91\xbd\x91\xbe\x91\xbf\x91\xc0\x91\xc1\x91\xc2\x91\xc3\x91\xc4\x91\xc5\x91\xc6\x91\xc8\x91\xcb\x91\xd0\x91\xd2\x91\xd3\x91\xd4\x91\xd5\x91\xd6\x91\xd7\x91\xd8\x91\xd9\x91\xda\x91\xdb\x91\xdd\x91\xde\x91\xdf\x91\xe0\x91\xe1\x91\xe2\x91\xe3\x91\xe4\x91\xe5\x91\xe6\x91\xe7\x91\xe8\x91\xe9\x91\xea\x91\xeb\x91\xec\x91\xed\x91\xee\x91\xef\x91\xf0\x91\xf1\x00\x00\x00\x00", /* be00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\xf2\x91\xf3\x91\xf4\x91\xf5\x91\xf6\x91\xf7\x91\xf8\x91\xf9\x91\xfa\x91\xfb\x91\xfc\x91\xfd\x91\xfe\x91\xff\x92\x00\x92\x01\x92\x02\x92\x03\x92\x04\x92\x05\x92\x06\x92\x07\x92\x08\x92\x09\x92\x0a\x92\x0b\x92\x0c\x92\x0d\x92\x0e\x92\x0f\x92\x10\x92\x11\x92\x12\x92\x13\x92\x14\x92\x15\x92\x16\x92\x17\x92\x18\x92\x19\x92\x1a\x92\x1b\x92\x1c\x92\x1d\x92\x1e\x92\x1f\x92\x20\x92\x21\x92\x22\x92\x23\x92\x24\x92\x25\x92\x26\x92\x27\x92\x28\x92\x29\x92\x2a\x92\x2b\x92\x2c\x92\x2d\x92\x2e\x92\x2f\x92\x30", /* be80 */ "\x00\x00\x92\x31\x92\x32\x92\x33\x92\x34\x92\x35\x92\x36\x92\x37\x92\x38\x92\x39\x92\x3a\x92\x3b\x92\x3c\x92\x3d\x92\x3e\x92\x3f\x92\x40\x92\x41\x92\x42\x92\x43\x92\x44\x92\x45\x92\x46\x92\x47\x92\x48\x92\x49\x92\x4a\x92\x4b\x92\x4c\x92\x4d\x92\x4e\x92\x4f\x92\x50\x92\x51\x92\x52\x92\x53\x92\x54\x92\x55\x92\x56\x92\x57\x92\x58\x92\x59\x92\x5a\x92\x5b\x92\x5c\x92\x5d\x92\x5e\x92\x5f\x92\x60\x92\x61\x92\x62\x92\x63\x92\x64\x92\x65\x92\x66\x92\x67\x92\x68\x92\x69\x92\x6a\x92\x6b\x92\x6c\x92\x6d\x92\x6e\x92\x6f\x92\x70\x92\x71\x92\x72\x92\x73\x92\x75\x92\x76\x92\x77\x92\x78\x92\x79\x92\x7a\x92\x7b\x92\x7c\x92\x7d\x92\x7e\x92\x7f\x92\x80\x92\x81\x92\x82\x92\x83\x92\x84\x92\x85\x92\x86\x92\x87\x92\x88\x92\x89\x92\x8a\x92\x8b\x92\x8c\x92\x8d\x92\x8f\x92\x90\x92\x91\x92\x92\x92\x93\x92\x94\x92\x95\x92\x96\x92\x97\x92\x98\x92\x99\x92\x9a\x92\x9b\x92\x9c\x92\x9d\x92\x9e\x92\x9f\x92\xa0\x92\xa1\x92\xa2\x92\xa3\x92\xa4\x92\xa5\x92\xa6\x92\xa7\x92\xa8\x92\xa9\x92\xaa\x92\xab\x92\xac\x92\xad\x92\xaf\x92\xb0\x00\x00\x00\x00", /* bf00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\xb1\x92\xb2\x92\xb3\x92\xb4\x92\xb5\x92\xb6\x92\xb7\x92\xb8\x92\xb9\x92\xba\x92\xbb\x92\xbc\x92\xbd\x92\xbe\x92\xbf\x92\xc0\x92\xc1\x92\xc2\x92\xc3\x92\xc4\x92\xc5\x92\xc6\x92\xc7\x92\xc9\x92\xca\x92\xcb\x92\xcc\x92\xcd\x92\xce\x92\xcf\x92\xd0\x92\xd1\x92\xd2\x92\xd3\x92\xd4\x92\xd5\x92\xd6\x92\xd7\x92\xd8\x92\xd9\x92\xda\x92\xdb\x92\xdc\x92\xdd\x92\xde\x92\xdf\x92\xe0\x92\xe1\x92\xe2\x92\xe3\x92\xe4\x92\xe5\x92\xe6\x92\xe7\x92\xe8\x92\xe9\x92\xea\x92\xeb\x92\xec\x92\xed\x92\xee\x92\xef\x92\xf0", /* bf80 */ "\x00\x00\x92\xf1\x92\xf2\x92\xf3\x92\xf4\x92\xf5\x92\xf6\x92\xf7\x92\xf8\x92\xf9\x92\xfa\x92\xfb\x92\xfc\x92\xfd\x92\xfe\x92\xff\x93\x00\x93\x01\x93\x02\x93\x03\x93\x04\x93\x05\x93\x06\x93\x07\x93\x08\x93\x09\x93\x0a\x93\x0b\x93\x0c\x93\x0d\x93\x0e\x93\x0f\x93\x10\x93\x11\x93\x12\x93\x13\x93\x14\x93\x15\x93\x16\x93\x17\x93\x18\x93\x19\x93\x1a\x93\x1b\x93\x1c\x93\x1d\x93\x1e\x93\x1f\x93\x20\x93\x21\x93\x22\x93\x23\x93\x24\x93\x25\x93\x26\x93\x27\x93\x28\x93\x29\x93\x2a\x93\x2b\x93\x2c\x93\x2d\x93\x2e\x93\x2f\x93\x30\x93\x31\x93\x32\x93\x33\x93\x34\x93\x35\x93\x36\x93\x37\x93\x38\x93\x39\x93\x3a\x93\x3b\x93\x3c\x93\x3d\x93\x3f\x93\x40\x93\x41\x93\x42\x93\x43\x93\x44\x93\x45\x93\x46\x93\x47\x93\x48\x93\x49\x93\x4a\x93\x4b\x93\x4c\x93\x4d\x93\x4e\x93\x4f\x93\x50\x93\x51\x93\x52\x93\x53\x93\x54\x93\x55\x93\x56\x93\x57\x93\x58\x93\x59\x93\x5a\x93\x5b\x93\x5c\x93\x5d\x93\x5e\x93\x5f\x93\x60\x93\x61\x93\x62\x93\x63\x93\x64\x93\x65\x93\x66\x93\x67\x93\x68\x93\x69\x93\x6b\x93\x6c\x93\x6d\x93\x6e\x93\x6f\x00\x00\x00\x00", /* c000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x70\x93\x71\x93\x72\x93\x73\x93\x74\x93\x75\x93\x76\x93\x77\x93\x78\x93\x79\x93\x7a\x93\x7b\x93\x7c\x93\x7d\x93\x7e\x93\x7f\x93\x80\x93\x81\x93\x82\x93\x83\x93\x84\x93\x85\x93\x86\x93\x87\x93\x88\x93\x89\x93\x8a\x93\x8b\x93\x8c\x93\x8d\x93\x8e\x93\x90\x93\x91\x93\x92\x93\x93\x93\x94\x93\x95\x93\x96\x93\x97\x93\x98\x93\x99\x93\x9a\x93\x9b\x93\x9c\x93\x9d\x93\x9e\x93\x9f\x93\xa0\x93\xa1\x93\xa2\x93\xa3\x93\xa4\x93\xa5\x93\xa6\x93\xa7\x93\xa8\x93\xa9\x93\xaa\x93\xab\x93\xac\x93\xad\x93\xae\x93\xaf", /* c080 */ "\x00\x00\x93\xb0\x93\xb1\x93\xb2\x93\xb3\x93\xb4\x93\xb5\x93\xb6\x93\xb7\x93\xb8\x93\xb9\x93\xba\x93\xbb\x93\xbc\x93\xbd\x93\xbe\x93\xbf\x93\xc0\x93\xc1\x93\xc2\x93\xc3\x93\xc4\x93\xc5\x93\xc6\x93\xc7\x93\xc8\x93\xc9\x93\xcb\x93\xcc\x93\xcd\x93\xce\x93\xcf\x93\xd0\x93\xd1\x93\xd2\x93\xd3\x93\xd4\x93\xd5\x93\xd7\x93\xd8\x93\xd9\x93\xda\x93\xdb\x93\xdc\x93\xdd\x93\xde\x93\xdf\x93\xe0\x93\xe1\x93\xe2\x93\xe3\x93\xe4\x93\xe5\x93\xe6\x93\xe7\x93\xe8\x93\xe9\x93\xea\x93\xeb\x93\xec\x93\xed\x93\xee\x93\xef\x93\xf0\x93\xf1\x93\xf2\x93\xf3\x93\xf4\x93\xf5\x93\xf6\x93\xf7\x93\xf8\x93\xf9\x93\xfa\x93\xfb\x93\xfc\x93\xfd\x93\xfe\x93\xff\x94\x00\x94\x01\x94\x02\x94\x03\x94\x04\x94\x05\x94\x06\x94\x07\x94\x08\x94\x09\x94\x0a\x94\x0b\x94\x0c\x94\x0d\x94\x0e\x94\x0f\x94\x10\x94\x11\x94\x12\x94\x13\x94\x14\x94\x15\x94\x16\x94\x17\x94\x18\x94\x19\x94\x1a\x94\x1b\x94\x1c\x94\x1d\x94\x1e\x94\x1f\x94\x20\x94\x21\x94\x22\x94\x23\x94\x24\x94\x25\x94\x26\x94\x27\x94\x28\x94\x29\x94\x2a\x94\x2b\x94\x2c\x94\x2d\x94\x2e\x00\x00\x00\x00", /* c100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x2f\x94\x30\x94\x31\x94\x32\x94\x33\x94\x34\x94\x35\x94\x36\x94\x37\x94\x38\x94\x39\x94\x3a\x94\x3b\x94\x3c\x94\x3d\x94\x3f\x94\x40\x94\x41\x94\x42\x94\x43\x94\x44\x94\x45\x94\x46\x94\x47\x94\x48\x94\x49\x94\x4a\x94\x4b\x94\x4c\x94\x4d\x94\x4e\x94\x4f\x94\x50\x94\x51\x94\x52\x94\x53\x94\x54\x94\x55\x94\x56\x94\x57\x94\x58\x94\x59\x94\x5a\x94\x5b\x94\x5c\x94\x5d\x94\x5e\x94\x5f\x94\x60\x94\x61\x94\x62\x94\x63\x94\x64\x94\x65\x94\x66\x94\x67\x94\x68\x94\x69\x94\x6a\x94\x6c\x94\x6d\x94\x6e\x94\x6f", /* c180 */ "\x00\x00\x94\x70\x94\x71\x94\x72\x94\x73\x94\x74\x94\x75\x94\x76\x94\x77\x94\x78\x94\x79\x94\x7a\x94\x7b\x94\x7c\x94\x7d\x94\x7e\x94\x7f\x94\x80\x94\x81\x94\x82\x94\x83\x94\x84\x94\x91\x94\x96\x94\x98\x94\xc7\x94\xcf\x94\xd3\x94\xd4\x94\xda\x94\xe6\x94\xfb\x95\x1c\x95\x20\x95\x27\x95\x33\x95\x3d\x95\x43\x95\x48\x95\x4b\x95\x55\x95\x5a\x95\x60\x95\x6e\x95\x74\x95\x75\x95\x77\x95\x78\x95\x79\x95\x7a\x95\x7b\x95\x7c\x95\x7d\x95\x7e\x95\x80\x95\x81\x95\x82\x95\x83\x95\x84\x95\x85\x95\x86\x95\x87\x95\x88\x95\x89\x95\x8a\x95\x8b\x95\x8c\x95\x8d\x95\x8e\x95\x8f\x95\x90\x95\x91\x95\x92\x95\x93\x95\x94\x95\x95\x95\x96\x95\x97\x95\x98\x95\x99\x95\x9a\x95\x9b\x95\x9c\x95\x9d\x95\x9e\x95\x9f\x95\xa0\x95\xa1\x95\xa2\x95\xa3\x95\xa4\x95\xa5\x95\xa6\x95\xa7\x95\xa8\x95\xa9\x95\xaa\x95\xab\x95\xac\x95\xad\x95\xae\x95\xaf\x95\xb0\x95\xb1\x95\xb2\x95\xb3\x95\xb4\x95\xb5\x95\xb6\x95\xb7\x95\xb8\x95\xb9\x95\xba\x95\xbb\x95\xbc\x95\xbd\x95\xbe\x95\xbf\x95\xc0\x95\xc1\x95\xc2\x95\xc3\x95\xc4\x95\xc5\x95\xc6\x95\xc7\x00\x00\x00\x00", /* c200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\xc8\x95\xc9\x95\xca\x95\xcb\x95\xcc\x95\xcd\x95\xce\x95\xcf\x95\xd0\x95\xd1\x95\xd2\x95\xd3\x95\xd4\x95\xd5\x95\xd6\x95\xd7\x95\xd8\x95\xd9\x95\xda\x95\xdb\x95\xdc\x95\xdd\x95\xde\x95\xdf\x95\xe0\x95\xe1\x95\xe2\x95\xe3\x95\xe4\x95\xe5\x95\xe6\x95\xe7\x95\xec\x95\xff\x96\x07\x96\x13\x96\x18\x96\x1b\x96\x1e\x96\x20\x96\x23\x96\x24\x96\x25\x96\x26\x96\x27\x96\x28\x96\x29\x96\x2b\x96\x2c\x96\x2d\x96\x2f\x96\x30\x96\x37\x96\x38\x96\x39\x96\x3a\x96\x3e\x96\x41\x96\x43\x96\x4a\x96\x4e\x96\x4f\x96\x51", /* c280 */ "\x00\x00\x96\x52\x96\x53\x96\x56\x96\x57\x96\x58\x96\x59\x96\x5a\x96\x5c\x96\x5d\x96\x5e\x96\x60\x96\x63\x96\x65\x96\x66\x96\x6b\x96\x6d\x96\x6e\x96\x6f\x96\x70\x96\x71\x96\x73\x96\x78\x96\x79\x96\x7a\x96\x7b\x96\x7c\x96\x7d\x96\x7e\x96\x7f\x96\x80\x96\x81\x96\x82\x96\x83\x96\x84\x96\x87\x96\x89\x96\x8a\x96\x8c\x96\x8e\x96\x91\x96\x92\x96\x93\x96\x95\x96\x96\x96\x9a\x96\x9b\x96\x9d\x96\x9e\x96\x9f\x96\xa0\x96\xa1\x96\xa2\x96\xa3\x96\xa4\x96\xa5\x96\xa6\x96\xa8\x96\xa9\x96\xaa\x96\xab\x96\xac\x96\xad\x96\xae\x96\xaf\x96\xb1\x96\xb2\x96\xb4\x96\xb5\x96\xb7\x96\xb8\x96\xba\x96\xbb\x96\xbf\x96\xc2\x96\xc3\x96\xc8\x96\xca\x96\xcb\x96\xd0\x96\xd1\x96\xd3\x96\xd4\x96\xd6\x96\xd7\x96\xd8\x96\xd9\x96\xda\x96\xdb\x96\xdc\x96\xdd\x96\xde\x96\xdf\x96\xe1\x96\xe2\x96\xe3\x96\xe4\x96\xe5\x96\xe6\x96\xe7\x96\xeb\x96\xec\x96\xed\x96\xee\x96\xf0\x96\xf1\x96\xf2\x96\xf4\x96\xf5\x96\xf8\x96\xfa\x96\xfb\x96\xfc\x96\xfd\x96\xff\x97\x02\x97\x03\x97\x05\x97\x0a\x97\x0b\x97\x0c\x97\x10\x97\x11\x97\x12\x97\x14\x97\x15\x00\x00\x00\x00", /* c300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x17\x97\x18\x97\x19\x97\x1a\x97\x1b\x97\x1d\x97\x1f\x97\x20\x97\x21\x97\x22\x97\x23\x97\x24\x97\x25\x97\x26\x97\x27\x97\x28\x97\x29\x97\x2b\x97\x2c\x97\x2e\x97\x2f\x97\x31\x97\x33\x97\x34\x97\x35\x97\x36\x97\x37\x97\x3a\x97\x3b\x97\x3c\x97\x3d\x97\x3f\x97\x40\x97\x41\x97\x42\x97\x43\x97\x44\x97\x45\x97\x46\x97\x47\x97\x48\x97\x49\x97\x4a\x97\x4b\x97\x4c\x97\x4d\x97\x4e\x97\x4f\x97\x50\x97\x51\x97\x54\x97\x55\x97\x57\x97\x58\x97\x5a\x97\x5c\x97\x5d\x97\x5f\x97\x63\x97\x64\x97\x66\x97\x67\x97\x68", /* c380 */ "\x00\x00\x97\x6a\x97\x6b\x97\x6c\x97\x6d\x97\x6e\x97\x6f\x97\x70\x97\x71\x97\x72\x97\x75\x97\x77\x97\x78\x97\x79\x97\x7a\x97\x7b\x97\x7d\x97\x7e\x97\x7f\x97\x80\x97\x81\x97\x82\x97\x83\x97\x84\x97\x86\x97\x87\x97\x88\x97\x89\x97\x8a\x97\x8c\x97\x8e\x97\x8f\x97\x90\x97\x93\x97\x95\x97\x96\x97\x97\x97\x99\x97\x9a\x97\x9b\x97\x9c\x97\x9d\x97\x9e\x97\x9f\x97\xa1\x97\xa2\x97\xa4\x97\xa5\x97\xa6\x97\xa7\x97\xa8\x97\xa9\x97\xaa\x97\xac\x97\xae\x97\xb0\x97\xb1\x97\xb3\x97\xb5\x97\xb6\x97\xb7\x97\xb8\x97\xb9\x97\xba\x97\xbb\x97\xbc\x97\xbd\x97\xbe\x97\xbf\x97\xc0\x97\xc1\x97\xc2\x97\xc3\x97\xc4\x97\xc5\x97\xc6\x97\xc7\x97\xc8\x97\xc9\x97\xca\x97\xcb\x97\xcc\x97\xcd\x97\xce\x97\xcf\x97\xd0\x97\xd1\x97\xd2\x97\xd3\x97\xd4\x97\xd5\x97\xd6\x97\xd7\x97\xd8\x97\xd9\x97\xda\x97\xdb\x97\xdc\x97\xdd\x97\xde\x97\xdf\x97\xe0\x97\xe1\x97\xe2\x97\xe3\x97\xe4\x97\xe5\x97\xe8\x97\xee\x97\xef\x97\xf0\x97\xf1\x97\xf2\x97\xf4\x97\xf7\x97\xf8\x97\xf9\x97\xfa\x97\xfb\x97\xfc\x97\xfd\x97\xfe\x97\xff\x98\x00\x98\x01\x98\x02\x00\x00\x00\x00", /* c400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x03\x98\x04\x98\x05\x98\x06\x98\x07\x98\x08\x98\x09\x98\x0a\x98\x0b\x98\x0c\x98\x0d\x98\x0e\x98\x0f\x98\x10\x98\x11\x98\x12\x98\x13\x98\x14\x98\x15\x98\x16\x98\x17\x98\x18\x98\x19\x98\x1a\x98\x1b\x98\x1c\x98\x1d\x98\x1e\x98\x1f\x98\x20\x98\x21\x98\x22\x98\x23\x98\x24\x98\x25\x98\x26\x98\x27\x98\x28\x98\x29\x98\x2a\x98\x2b\x98\x2c\x98\x2d\x98\x2e\x98\x2f\x98\x30\x98\x31\x98\x32\x98\x33\x98\x34\x98\x35\x98\x36\x98\x37\x98\x38\x98\x39\x98\x3a\x98\x3b\x98\x3c\x98\x3d\x98\x3e\x98\x3f\x98\x40\x98\x41", /* c480 */ "\x00\x00\x98\x42\x98\x43\x98\x44\x98\x45\x98\x46\x98\x47\x98\x48\x98\x49\x98\x4a\x98\x4b\x98\x4c\x98\x4d\x98\x4e\x98\x4f\x98\x50\x98\x51\x98\x52\x98\x53\x98\x54\x98\x55\x98\x56\x98\x57\x98\x58\x98\x59\x98\x5a\x98\x5b\x98\x5c\x98\x5d\x98\x5e\x98\x5f\x98\x60\x98\x61\x98\x62\x98\x63\x98\x64\x98\x65\x98\x66\x98\x67\x98\x68\x98\x69\x98\x6a\x98\x6b\x98\x6c\x98\x6d\x98\x6e\x98\x6f\x98\x70\x98\x71\x98\x72\x98\x73\x98\x74\x98\x8b\x98\x8e\x98\x92\x98\x95\x98\x99\x98\xa3\x98\xa8\x98\xa9\x98\xaa\x98\xab\x98\xac\x98\xad\x98\xae\x98\xaf\x98\xb0\x98\xb1\x98\xb2\x98\xb3\x98\xb4\x98\xb5\x98\xb6\x98\xb7\x98\xb8\x98\xb9\x98\xba\x98\xbb\x98\xbc\x98\xbd\x98\xbe\x98\xbf\x98\xc0\x98\xc1\x98\xc2\x98\xc3\x98\xc4\x98\xc5\x98\xc6\x98\xc7\x98\xc8\x98\xc9\x98\xca\x98\xcb\x98\xcc\x98\xcd\x98\xcf\x98\xd0\x98\xd4\x98\xd6\x98\xd7\x98\xdb\x98\xdc\x98\xdd\x98\xe0\x98\xe1\x98\xe2\x98\xe3\x98\xe4\x98\xe5\x98\xe6\x98\xe9\x98\xea\x98\xeb\x98\xec\x98\xed\x98\xee\x98\xef\x98\xf0\x98\xf1\x98\xf2\x98\xf3\x98\xf4\x98\xf5\x98\xf6\x98\xf7\x00\x00\x00\x00", /* c500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\xf8\x98\xf9\x98\xfa\x98\xfb\x98\xfc\x98\xfd\x98\xfe\x98\xff\x99\x00\x99\x01\x99\x02\x99\x03\x99\x04\x99\x05\x99\x06\x99\x07\x99\x08\x99\x09\x99\x0a\x99\x0b\x99\x0c\x99\x0e\x99\x0f\x99\x11\x99\x12\x99\x13\x99\x14\x99\x15\x99\x16\x99\x17\x99\x18\x99\x19\x99\x1a\x99\x1b\x99\x1c\x99\x1d\x99\x1e\x99\x1f\x99\x20\x99\x21\x99\x22\x99\x23\x99\x24\x99\x25\x99\x26\x99\x27\x99\x28\x99\x29\x99\x2a\x99\x2b\x99\x2c\x99\x2d\x99\x2f\x99\x30\x99\x31\x99\x32\x99\x33\x99\x34\x99\x35\x99\x36\x99\x37\x99\x38\x99\x39", /* c580 */ "\x00\x00\x99\x3a\x99\x3b\x99\x3c\x99\x3d\x99\x3e\x99\x3f\x99\x40\x99\x41\x99\x42\x99\x43\x99\x44\x99\x45\x99\x46\x99\x47\x99\x48\x99\x49\x99\x4a\x99\x4b\x99\x4c\x99\x4d\x99\x4e\x99\x4f\x99\x50\x99\x51\x99\x52\x99\x53\x99\x56\x99\x57\x99\x58\x99\x59\x99\x5a\x99\x5b\x99\x5c\x99\x5d\x99\x5e\x99\x5f\x99\x60\x99\x61\x99\x62\x99\x64\x99\x66\x99\x73\x99\x78\x99\x79\x99\x7b\x99\x7e\x99\x82\x99\x83\x99\x89\x99\x8c\x99\x8e\x99\x9a\x99\x9b\x99\x9c\x99\x9d\x99\x9e\x99\x9f\x99\xa0\x99\xa1\x99\xa2\x99\xa3\x99\xa4\x99\xa6\x99\xa7\x99\xa9\x99\xaa\x99\xab\x99\xac\x99\xad\x99\xae\x99\xaf\x99\xb0\x99\xb1\x99\xb2\x99\xb3\x99\xb4\x99\xb5\x99\xb6\x99\xb7\x99\xb8\x99\xb9\x99\xba\x99\xbb\x99\xbc\x99\xbd\x99\xbe\x99\xbf\x99\xc0\x99\xc1\x99\xc2\x99\xc3\x99\xc4\x99\xc5\x99\xc6\x99\xc7\x99\xc8\x99\xc9\x99\xca\x99\xcb\x99\xcc\x99\xcd\x99\xce\x99\xcf\x99\xd0\x99\xd1\x99\xd2\x99\xd3\x99\xd4\x99\xd5\x99\xd6\x99\xd7\x99\xd8\x99\xd9\x99\xda\x99\xdb\x99\xdc\x99\xdd\x99\xde\x99\xdf\x99\xe0\x99\xe1\x99\xe2\x99\xe3\x99\xe4\x99\xe5\x00\x00\x00\x00", /* c600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xe6\x99\xe7\x99\xe8\x99\xe9\x99\xea\x99\xeb\x99\xec\x99\xed\x99\xee\x99\xef\x99\xf0\x99\xf1\x99\xf2\x99\xf3\x99\xf4\x99\xf5\x99\xf6\x99\xf7\x99\xf8\x99\xf9\x99\xfa\x99\xfb\x99\xfc\x99\xfd\x99\xfe\x99\xff\x9a\x00\x9a\x01\x9a\x02\x9a\x03\x9a\x04\x9a\x05\x9a\x06\x9a\x07\x9a\x08\x9a\x09\x9a\x0a\x9a\x0b\x9a\x0c\x9a\x0d\x9a\x0e\x9a\x0f\x9a\x10\x9a\x11\x9a\x12\x9a\x13\x9a\x14\x9a\x15\x9a\x16\x9a\x17\x9a\x18\x9a\x19\x9a\x1a\x9a\x1b\x9a\x1c\x9a\x1d\x9a\x1e\x9a\x1f\x9a\x20\x9a\x21\x9a\x22\x9a\x23\x9a\x24", /* c680 */ "\x00\x00\x9a\x25\x9a\x26\x9a\x27\x9a\x28\x9a\x29\x9a\x2a\x9a\x2b\x9a\x2c\x9a\x2d\x9a\x2e\x9a\x2f\x9a\x30\x9a\x31\x9a\x32\x9a\x33\x9a\x34\x9a\x35\x9a\x36\x9a\x37\x9a\x38\x9a\x39\x9a\x3a\x9a\x3b\x9a\x3c\x9a\x3d\x9a\x3e\x9a\x3f\x9a\x40\x9a\x41\x9a\x42\x9a\x43\x9a\x44\x9a\x45\x9a\x46\x9a\x47\x9a\x48\x9a\x49\x9a\x4a\x9a\x4b\x9a\x4c\x9a\x4d\x9a\x4e\x9a\x4f\x9a\x50\x9a\x51\x9a\x52\x9a\x53\x9a\x54\x9a\x55\x9a\x56\x9a\x57\x9a\x58\x9a\x59\x9a\x5a\x9a\x5b\x9a\x5c\x9a\x5d\x9a\x5e\x9a\x5f\x9a\x60\x9a\x61\x9a\x62\x9a\x63\x9a\x64\x9a\x65\x9a\x66\x9a\x67\x9a\x68\x9a\x69\x9a\x6a\x9a\x6b\x9a\x72\x9a\x83\x9a\x89\x9a\x8d\x9a\x8e\x9a\x94\x9a\x95\x9a\x99\x9a\xa6\x9a\xa9\x9a\xaa\x9a\xab\x9a\xac\x9a\xad\x9a\xae\x9a\xaf\x9a\xb2\x9a\xb3\x9a\xb4\x9a\xb5\x9a\xb9\x9a\xbb\x9a\xbd\x9a\xbe\x9a\xbf\x9a\xc3\x9a\xc4\x9a\xc6\x9a\xc7\x9a\xc8\x9a\xc9\x9a\xca\x9a\xcd\x9a\xce\x9a\xcf\x9a\xd0\x9a\xd2\x9a\xd4\x9a\xd5\x9a\xd6\x9a\xd7\x9a\xd9\x9a\xda\x9a\xdb\x9a\xdc\x9a\xdd\x9a\xde\x9a\xe0\x9a\xe2\x9a\xe3\x9a\xe4\x9a\xe5\x9a\xe7\x9a\xe8\x00\x00\x00\x00", /* c700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xe9\x9a\xea\x9a\xec\x9a\xee\x9a\xf0\x9a\xf1\x9a\xf2\x9a\xf3\x9a\xf4\x9a\xf5\x9a\xf6\x9a\xf7\x9a\xf8\x9a\xfa\x9a\xfc\x9a\xfd\x9a\xfe\x9a\xff\x9b\x00\x9b\x01\x9b\x02\x9b\x04\x9b\x05\x9b\x06\x9b\x07\x9b\x09\x9b\x0a\x9b\x0b\x9b\x0c\x9b\x0d\x9b\x0e\x9b\x10\x9b\x11\x9b\x12\x9b\x14\x9b\x15\x9b\x16\x9b\x17\x9b\x18\x9b\x19\x9b\x1a\x9b\x1b\x9b\x1c\x9b\x1d\x9b\x1e\x9b\x20\x9b\x21\x9b\x22\x9b\x24\x9b\x25\x9b\x26\x9b\x27\x9b\x28\x9b\x29\x9b\x2a\x9b\x2b\x9b\x2c\x9b\x2d\x9b\x2e\x9b\x30\x9b\x31\x9b\x33\x9b\x34", /* c780 */ "\x00\x00\x9b\x35\x9b\x36\x9b\x37\x9b\x38\x9b\x39\x9b\x3a\x9b\x3d\x9b\x3e\x9b\x3f\x9b\x40\x9b\x46\x9b\x4a\x9b\x4b\x9b\x4c\x9b\x4e\x9b\x50\x9b\x52\x9b\x53\x9b\x55\x9b\x56\x9b\x57\x9b\x58\x9b\x59\x9b\x5a\x9b\x5b\x9b\x5c\x9b\x5d\x9b\x5e\x9b\x5f\x9b\x60\x9b\x61\x9b\x62\x9b\x63\x9b\x64\x9b\x65\x9b\x66\x9b\x67\x9b\x68\x9b\x69\x9b\x6a\x9b\x6b\x9b\x6c\x9b\x6d\x9b\x6e\x9b\x6f\x9b\x70\x9b\x71\x9b\x72\x9b\x73\x9b\x74\x9b\x75\x9b\x76\x9b\x77\x9b\x78\x9b\x79\x9b\x7a\x9b\x7b\x9b\x7c\x9b\x7d\x9b\x7e\x9b\x7f\x9b\x80\x9b\x81\x9b\x82\x9b\x83\x9b\x84\x9b\x85\x9b\x86\x9b\x87\x9b\x88\x9b\x89\x9b\x8a\x9b\x8b\x9b\x8c\x9b\x8d\x9b\x8e\x9b\x8f\x9b\x90\x9b\x91\x9b\x92\x9b\x93\x9b\x94\x9b\x95\x9b\x96\x9b\x97\x9b\x98\x9b\x99\x9b\x9a\x9b\x9b\x9b\x9c\x9b\x9d\x9b\x9e\x9b\x9f\x9b\xa0\x9b\xa1\x9b\xa2\x9b\xa3\x9b\xa4\x9b\xa5\x9b\xa6\x9b\xa7\x9b\xa8\x9b\xa9\x9b\xaa\x9b\xab\x9b\xac\x9b\xad\x9b\xae\x9b\xaf\x9b\xb0\x9b\xb1\x9b\xb2\x9b\xb3\x9b\xb4\x9b\xb5\x9b\xb6\x9b\xb7\x9b\xb8\x9b\xb9\x9b\xba\x9b\xbb\x9b\xbc\x9b\xbd\x9b\xbe\x9b\xbf\x00\x00\x00\x00", /* c800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xc0\x9b\xc1\x9b\xc2\x9b\xc3\x9b\xc4\x9b\xc5\x9b\xc6\x9b\xc7\x9b\xc8\x9b\xc9\x9b\xca\x9b\xcb\x9b\xcc\x9b\xcd\x9b\xce\x9b\xcf\x9b\xd0\x9b\xd1\x9b\xd2\x9b\xd3\x9b\xd4\x9b\xd5\x9b\xd6\x9b\xd7\x9b\xd8\x9b\xd9\x9b\xda\x9b\xdb\x9b\xdc\x9b\xdd\x9b\xde\x9b\xdf\x9b\xe0\x9b\xe1\x9b\xe2\x9b\xe3\x9b\xe4\x9b\xe5\x9b\xe6\x9b\xe7\x9b\xe8\x9b\xe9\x9b\xea\x9b\xeb\x9b\xec\x9b\xed\x9b\xee\x9b\xef\x9b\xf0\x9b\xf1\x9b\xf2\x9b\xf3\x9b\xf4\x9b\xf5\x9b\xf6\x9b\xf7\x9b\xf8\x9b\xf9\x9b\xfa\x9b\xfb\x9b\xfc\x9b\xfd\x9b\xfe", /* c880 */ "\x00\x00\x9b\xff\x9c\x00\x9c\x01\x9c\x02\x9c\x03\x9c\x04\x9c\x05\x9c\x06\x9c\x07\x9c\x08\x9c\x09\x9c\x0a\x9c\x0b\x9c\x0c\x9c\x0d\x9c\x0e\x9c\x0f\x9c\x10\x9c\x11\x9c\x12\x9c\x13\x9c\x14\x9c\x15\x9c\x16\x9c\x17\x9c\x18\x9c\x19\x9c\x1a\x9c\x1b\x9c\x1c\x9c\x1d\x9c\x1e\x9c\x1f\x9c\x20\x9c\x21\x9c\x22\x9c\x23\x9c\x24\x9c\x25\x9c\x26\x9c\x27\x9c\x28\x9c\x29\x9c\x2a\x9c\x2b\x9c\x2c\x9c\x2d\x9c\x2e\x9c\x2f\x9c\x30\x9c\x31\x9c\x32\x9c\x33\x9c\x34\x9c\x35\x9c\x36\x9c\x37\x9c\x38\x9c\x39\x9c\x3a\x9c\x3b\x9c\x3c\x9c\x3d\x9c\x3e\x9c\x3f\x9c\x40\x9c\x41\x9c\x42\x9c\x43\x9c\x44\x9c\x45\x9c\x46\x9c\x47\x9c\x48\x9c\x49\x9c\x4a\x9c\x4b\x9c\x4c\x9c\x4d\x9c\x4e\x9c\x4f\x9c\x50\x9c\x51\x9c\x52\x9c\x53\x9c\x54\x9c\x55\x9c\x56\x9c\x57\x9c\x58\x9c\x59\x9c\x5a\x9c\x5b\x9c\x5c\x9c\x5d\x9c\x5e\x9c\x5f\x9c\x60\x9c\x61\x9c\x62\x9c\x63\x9c\x64\x9c\x65\x9c\x66\x9c\x67\x9c\x68\x9c\x69\x9c\x6a\x9c\x6b\x9c\x6c\x9c\x6d\x9c\x6e\x9c\x6f\x9c\x70\x9c\x71\x9c\x72\x9c\x73\x9c\x74\x9c\x75\x9c\x76\x9c\x77\x9c\x78\x9c\x79\x9c\x7a\x9c\x7b\x00\x00\x00\x00", /* c900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x7d\x9c\x7e\x9c\x80\x9c\x83\x9c\x84\x9c\x89\x9c\x8a\x9c\x8c\x9c\x8f\x9c\x93\x9c\x96\x9c\x97\x9c\x98\x9c\x99\x9c\x9d\x9c\xaa\x9c\xac\x9c\xaf\x9c\xb9\x9c\xbe\x9c\xbf\x9c\xc0\x9c\xc1\x9c\xc2\x9c\xc8\x9c\xc9\x9c\xd1\x9c\xd2\x9c\xda\x9c\xdb\x9c\xe0\x9c\xe1\x9c\xe3\x9c\xe4\x9c\xe5\x9c\xe6\x9c\xe7\x9c\xe8\x9c\xe9\x9c\xea\x9c\xeb\x9c\xec\x9c\xed\x9c\xee\x9c\xef\x9c\xf0\x9c\xf1\x9c\xf2\x9c\xf3\x9c\xf4\x9c\xf5\x9c\xf6\x9c\xf7\x9c\xf8\x9c\xf9\x9c\xfa\x9c\xfb\x9c\xfc\x9c\xfd\x9c\xfe\x9c\xff\x9d\x00\x9d\x01", /* c980 */ "\x00\x00\x9d\x02\x9d\x03\x9d\x04\x9d\x05\x9d\x06\x9d\x07\x9d\x08\x9d\x09\x9d\x0a\x9d\x0b\x9d\x0c\x9d\x0d\x9d\x0e\x9d\x0f\x9d\x10\x9d\x11\x9d\x12\x9d\x13\x9d\x14\x9d\x15\x9d\x16\x9d\x17\x9d\x18\x9d\x19\x9d\x1a\x9d\x1b\x9d\x1c\x9d\x1d\x9d\x1e\x9d\x1f\x9d\x20\x9d\x21\x9d\x22\x9d\x23\x9d\x24\x9d\x25\x9d\x26\x9d\x27\x9d\x28\x9d\x29\x9d\x2a\x9d\x2b\x9d\x2c\x9d\x2d\x9d\x2e\x9d\x2f\x9d\x30\x9d\x31\x9d\x32\x9d\x33\x9d\x34\x9d\x35\x9d\x36\x9d\x37\x9d\x38\x9d\x39\x9d\x3a\x9d\x3b\x9d\x3c\x9d\x3d\x9d\x3e\x9d\x3f\x9d\x40\x9d\x41\x9d\x42\x9d\x43\x9d\x44\x9d\x45\x9d\x46\x9d\x47\x9d\x48\x9d\x49\x9d\x4a\x9d\x4b\x9d\x4c\x9d\x4d\x9d\x4e\x9d\x4f\x9d\x50\x9d\x51\x9d\x52\x9d\x53\x9d\x54\x9d\x55\x9d\x56\x9d\x57\x9d\x58\x9d\x59\x9d\x5a\x9d\x5b\x9d\x5c\x9d\x5d\x9d\x5e\x9d\x5f\x9d\x60\x9d\x61\x9d\x62\x9d\x63\x9d\x64\x9d\x65\x9d\x66\x9d\x67\x9d\x68\x9d\x69\x9d\x6a\x9d\x6b\x9d\x6c\x9d\x6d\x9d\x6e\x9d\x6f\x9d\x70\x9d\x71\x9d\x72\x9d\x73\x9d\x74\x9d\x75\x9d\x76\x9d\x77\x9d\x78\x9d\x79\x9d\x7a\x9d\x7b\x9d\x7c\x9d\x7d\x9d\x7e\x00\x00\x00\x00", /* ca00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x7f\x9d\x80\x9d\x81\x9d\x82\x9d\x83\x9d\x84\x9d\x85\x9d\x86\x9d\x87\x9d\x88\x9d\x89\x9d\x8a\x9d\x8b\x9d\x8c\x9d\x8d\x9d\x8e\x9d\x8f\x9d\x90\x9d\x91\x9d\x92\x9d\x93\x9d\x94\x9d\x95\x9d\x96\x9d\x97\x9d\x98\x9d\x99\x9d\x9a\x9d\x9b\x9d\x9c\x9d\x9d\x9d\x9e\x9d\x9f\x9d\xa0\x9d\xa1\x9d\xa2\x9d\xa3\x9d\xa4\x9d\xa5\x9d\xa6\x9d\xa7\x9d\xa8\x9d\xa9\x9d\xaa\x9d\xab\x9d\xac\x9d\xad\x9d\xae\x9d\xaf\x9d\xb0\x9d\xb1\x9d\xb2\x9d\xb3\x9d\xb4\x9d\xb5\x9d\xb6\x9d\xb7\x9d\xb8\x9d\xb9\x9d\xba\x9d\xbb\x9d\xbc\x9d\xbd", /* ca80 */ "\x00\x00\x9d\xbe\x9d\xbf\x9d\xc0\x9d\xc1\x9d\xc2\x9d\xc3\x9d\xc4\x9d\xc5\x9d\xc6\x9d\xc7\x9d\xc8\x9d\xc9\x9d\xca\x9d\xcb\x9d\xcc\x9d\xcd\x9d\xce\x9d\xcf\x9d\xd0\x9d\xd1\x9d\xd2\x9d\xd3\x9d\xd4\x9d\xd5\x9d\xd6\x9d\xd7\x9d\xd8\x9d\xd9\x9d\xda\x9d\xdb\x9d\xdc\x9d\xdd\x9d\xde\x9d\xdf\x9d\xe0\x9d\xe1\x9d\xe2\x9d\xe3\x9d\xe4\x9d\xe5\x9d\xe6\x9d\xe7\x9d\xe8\x9d\xe9\x9d\xea\x9d\xeb\x9d\xec\x9d\xed\x9d\xee\x9d\xef\x9d\xf0\x9d\xf1\x9d\xf2\x9d\xf3\x9d\xf4\x9d\xf5\x9d\xf6\x9d\xf7\x9d\xf8\x9d\xf9\x9d\xfa\x9d\xfb\x9d\xfc\x9d\xfd\x9d\xfe\x9d\xff\x9e\x00\x9e\x01\x9e\x02\x9e\x03\x9e\x04\x9e\x05\x9e\x06\x9e\x07\x9e\x08\x9e\x09\x9e\x0a\x9e\x0b\x9e\x0c\x9e\x0d\x9e\x0e\x9e\x0f\x9e\x10\x9e\x11\x9e\x12\x9e\x13\x9e\x14\x9e\x15\x9e\x16\x9e\x17\x9e\x18\x9e\x19\x9e\x1a\x9e\x1b\x9e\x1c\x9e\x1d\x9e\x1e\x9e\x24\x9e\x27\x9e\x2e\x9e\x30\x9e\x34\x9e\x3b\x9e\x3c\x9e\x40\x9e\x4d\x9e\x50\x9e\x52\x9e\x53\x9e\x54\x9e\x56\x9e\x59\x9e\x5d\x9e\x5f\x9e\x60\x9e\x61\x9e\x62\x9e\x65\x9e\x6e\x9e\x6f\x9e\x72\x9e\x74\x9e\x75\x9e\x76\x9e\x77\x00\x00\x00\x00", /* cb00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x78\x9e\x79\x9e\x7a\x9e\x7b\x9e\x7c\x9e\x7d\x9e\x80\x9e\x81\x9e\x83\x9e\x84\x9e\x85\x9e\x86\x9e\x89\x9e\x8a\x9e\x8c\x9e\x8d\x9e\x8e\x9e\x8f\x9e\x90\x9e\x91\x9e\x94\x9e\x95\x9e\x96\x9e\x97\x9e\x98\x9e\x99\x9e\x9a\x9e\x9b\x9e\x9c\x9e\x9e\x9e\xa0\x9e\xa1\x9e\xa2\x9e\xa3\x9e\xa4\x9e\xa5\x9e\xa7\x9e\xa8\x9e\xa9\x9e\xaa\x9e\xab\x9e\xac\x9e\xad\x9e\xae\x9e\xaf\x9e\xb0\x9e\xb1\x9e\xb2\x9e\xb3\x9e\xb5\x9e\xb6\x9e\xb7\x9e\xb9\x9e\xba\x9e\xbc\x9e\xbf\x9e\xc0\x9e\xc1\x9e\xc2\x9e\xc3\x9e\xc5\x9e\xc6\x9e\xc7", /* cb80 */ "\x00\x00\x9e\xc8\x9e\xca\x9e\xcb\x9e\xcc\x9e\xd0\x9e\xd2\x9e\xd3\x9e\xd5\x9e\xd6\x9e\xd7\x9e\xd9\x9e\xda\x9e\xde\x9e\xe1\x9e\xe3\x9e\xe4\x9e\xe6\x9e\xe8\x9e\xeb\x9e\xec\x9e\xed\x9e\xee\x9e\xf0\x9e\xf1\x9e\xf2\x9e\xf3\x9e\xf4\x9e\xf5\x9e\xf6\x9e\xf7\x9e\xf8\x9e\xfa\x9e\xfd\x9e\xff\x9f\x00\x9f\x01\x9f\x02\x9f\x03\x9f\x04\x9f\x05\x9f\x06\x9f\x07\x9f\x08\x9f\x09\x9f\x0a\x9f\x0c\x9f\x0f\x9f\x11\x9f\x12\x9f\x14\x9f\x15\x9f\x16\x9f\x18\x9f\x1a\x9f\x1b\x9f\x1c\x9f\x1d\x9f\x1e\x9f\x1f\x9f\x21\x9f\x23\x9f\x24\x9f\x25\x9f\x26\x9f\x27\x9f\x28\x9f\x29\x9f\x2a\x9f\x2b\x9f\x2d\x9f\x2e\x9f\x30\x9f\x31\x9f\x32\x9f\x33\x9f\x34\x9f\x35\x9f\x36\x9f\x38\x9f\x3a\x9f\x3c\x9f\x3f\x9f\x40\x9f\x41\x9f\x42\x9f\x43\x9f\x45\x9f\x46\x9f\x47\x9f\x48\x9f\x49\x9f\x4a\x9f\x4b\x9f\x4c\x9f\x4d\x9f\x4e\x9f\x4f\x9f\x52\x9f\x53\x9f\x54\x9f\x55\x9f\x56\x9f\x57\x9f\x58\x9f\x59\x9f\x5a\x9f\x5b\x9f\x5c\x9f\x5d\x9f\x5e\x9f\x5f\x9f\x60\x9f\x61\x9f\x62\x9f\x63\x9f\x64\x9f\x65\x9f\x66\x9f\x67\x9f\x68\x9f\x69\x9f\x6a\x9f\x6b\x9f\x6c\x9f\x6d\x00\x00\x00\x00", /* cc00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x6e\x9f\x6f\x9f\x70\x9f\x71\x9f\x72\x9f\x73\x9f\x74\x9f\x75\x9f\x76\x9f\x77\x9f\x78\x9f\x79\x9f\x7a\x9f\x7b\x9f\x7c\x9f\x7d\x9f\x7e\x9f\x81\x9f\x82\x9f\x8d\x9f\x8e\x9f\x8f\x9f\x90\x9f\x91\x9f\x92\x9f\x93\x9f\x94\x9f\x95\x9f\x96\x9f\x97\x9f\x98\x9f\x9c\x9f\x9d\x9f\x9e\x9f\xa1\x9f\xa2\x9f\xa3\x9f\xa4\x9f\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* cc80 */ NULL, /* cd00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xca\x02\xcb\x02\xd9\x20\x13\x20\x14\x20\x35\x21\x05\x21\x09\x21\x96\x21\x97\x21\x98\x21\x99\x22\x15\x22\x1f\x22\x23\x22\x52\x22\x66\x22\x67\x22\xbf\x25\x50\x25\x51\x25\x52\x25\x53\x25\x54\x25\x55\x25\x56\x25\x57\x25\x58\x25\x59\x25\x5a\x25\x5b\x25\x5c\x25\x5d\x25\x5e\x25\x5f\x25\x60\x25\x61\x25\x62\x25\x63\x25\x64\x25\x65\x25\x66\x25\x67\x25\x68\x25\x69\x25\x6a\x25\x6b\x25\x6c\x25\x6d\x25\x6e\x25\x6f\x25\x70\x25\x71\x25\x72\x25\x73\x25\x81\x25\x82\x25\x83\x25\x84\x25\x85\x25\x86\x25\x87\x25\x88", /* cd80 */ "\x00\x00\x25\x89\x25\x8a\x25\x8b\x25\x8c\x25\x8d\x25\x8e\x25\x8f\x25\x93\x25\x94\x25\x95\x25\xe2\x25\xe3\x25\xe4\x25\xe5\x26\x09\x22\x95\x30\x1d\x30\x1e\x30\x21\x30\x22\x30\x23\x30\x24\x30\x25\x30\x26\x30\x27\x30\x28\x30\x29\x32\xa3\x33\x8e\x33\x8f\x33\x9c\x33\x9d\x33\x9e\x33\xa1\x33\xc4\x33\xce\x33\xd1\x33\xd2\x33\xd5\xfe\x30\xfe\x49\xfe\x4a\xfe\x4b\xfe\x4c\xfe\x4d\xfe\x4e\xfe\x4f\xfe\x50\xfe\x51\xfe\x52\xfe\x54\xfe\x55\xfe\x56\xfe\x57\xfe\x59\xfe\x5a\xfe\x5b\xfe\x5c\xfe\x5d\xfe\x5e\xfe\x5f\xfe\x60\xfe\x61\xfe\x62\xfe\x63\xfe\x64\xfe\x65\xfe\x66\xfe\x68\xfe\x69\xfe\x6a\xfe\x6b\x30\x3e\x2f\xf0\x2f\xf1\x2f\xf2\x2f\xf3\x2f\xf4\x2f\xf5\x2f\xf6\x2f\xf7\x2f\xf8\x2f\xf9\x2f\xfa\x2f\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ce00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x2c\xf9\x79\xf9\x95\xf9\xe7\xf9\xf1\xfa\x0c\xfa\x0d\xfa\x0e\xfa\x0f\xfa\x11\xfa\x13\xfa\x14\xfa\x18\xfa\x1f\xfa\x20\xfa\x21\xfa\x23\xfa\x24\xfa\x27\xfa\x28\xfa\x29\x2e\x81\xe8\x16\xe8\x17\xe8\x18\x2e\x84\x34\x73\x34\x47\x2e\x88\x2e\x8b\xe8\x1e\x35\x9e\x36\x1a\x36\x0e\x2e\x8c\x2e\x97\x39\x6e\x39\x18\xe8\x26\x39\xcf\x39\xdf\x3a\x73\x39\xd0\xe8\x2b\xe8\x2c\x3b\x4e\x3c\x6e\x3c\xe0\x2e\xa7\xe8\x31\xe8\x32\x2e\xaa\x40\x56\x41\x5f\x2e\xae\x43\x37\x2e\xb3\x2e\xb6\x2e\xb7\xe8\x3b\x43\xb1\x43\xac\x2e\xbb", /* ce80 */ "\x00\x00\x43\xdd\x44\xd6\x46\x61\x46\x4c\xe8\x43\x47\x23\x47\x29\x47\x7c\x47\x8d\x2e\xca\x49\x47\x49\x7a\x49\x7d\x49\x82\x49\x83\x49\x85\x49\x86\x49\x9f\x49\x9b\x49\xb7\x49\xb6\xe8\x54\xe8\x55\x4c\xa3\x4c\x9f\x4c\xa0\x4c\xa1\x4c\x77\x4c\xa2\x4d\x13\x4d\x14\x4d\x15\x4d\x16\x4d\x17\x4d\x18\x4d\x19\x4d\xae\xe8\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* cf00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x01\x34\x02\x34\x03\x34\x04\x34\x05\x34\x06\x34\x07\x34\x08\x34\x09\x34\x0a\x34\x0b\x34\x0c\x34\x0d\x34\x0e\x34\x0f\x34\x10\x34\x11\x34\x12\x34\x13\x34\x14\x34\x15\x34\x16\x34\x17\x34\x18\x34\x19\x34\x1a\x34\x1b\x34\x1c\x34\x1d\x34\x1e\x34\x1f\x34\x20\x34\x21\x34\x22\x34\x23\x34\x24\x34\x25\x34\x26\x34\x27\x34\x28\x34\x29\x34\x2a\x34\x2b\x34\x2c\x34\x2d\x34\x2e\x34\x2f\x34\x30\x34\x31\x34\x32\x34\x33\x34\x34\x34\x35\x34\x36\x34\x37\x34\x38\x34\x39\x34\x3a\x34\x3b\x34\x3c\x34\x3d\x34\x3e", /* cf80 */ "\x34\x3f\x34\x40\x34\x41\x34\x42\x34\x43\x34\x44\x34\x45\x34\x46\x34\x48\x34\x49\x34\x4a\x34\x4b\x34\x4c\x34\x4d\x34\x4e\x34\x4f\x34\x50\x34\x51\x34\x52\x34\x53\x34\x54\x34\x55\x34\x56\x34\x57\x34\x58\x34\x59\x34\x5a\x34\x5b\x34\x5c\x34\x5d\x34\x5e\x34\x5f\x34\x60\x34\x61\x34\x62\x34\x63\x34\x64\x34\x65\x34\x66\x34\x67\x34\x68\x34\x69\x34\x6a\x34\x6b\x34\x6c\x34\x6d\x34\x6e\x34\x6f\x34\x70\x34\x71\x34\x72\x34\x74\x34\x75\x34\x76\x34\x77\x34\x78\x34\x79\x34\x7a\x34\x7b\x34\x7c\x34\x7d\x34\x7e\x34\x7f\x34\x80\x34\x81\x34\x82\x34\x83\x34\x84\x34\x85\x34\x86\x34\x87\x34\x88\x34\x89\x34\x8a\x34\x8b\x34\x8c\x34\x8d\x34\x8e\x34\x8f\x34\x90\x34\x91\x34\x92\x34\x93\x34\x94\x34\x95\x34\x96\x34\x97\x34\x98\x34\x99\x34\x9a\x34\x9b\x34\x9c\x34\x9d\x34\x9e\x34\x9f\x34\xa0\x34\xa1\x34\xa2\x34\xa3\x34\xa4\x34\xa5\x34\xa6\x34\xa7\x34\xa8\x34\xa9\x34\xaa\x34\xab\x34\xac\x34\xad\x34\xae\x34\xaf\x34\xb0\x34\xb1\x34\xb2\x34\xb3\x34\xb4\x34\xb5\x34\xb6\x34\xb7\x34\xb8\x34\xb9\x34\xba\x34\xbb\x34\xbc\x34\xbd\x34\xbe\x34\xbf\x00\x00", /* d000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\xc0\x34\xc1\x34\xc2\x34\xc3\x34\xc4\x34\xc5\x34\xc6\x34\xc7\x34\xc8\x34\xc9\x34\xca\x34\xcb\x34\xcc\x34\xcd\x34\xce\x34\xcf\x34\xd0\x34\xd1\x34\xd2\x34\xd3\x34\xd4\x34\xd5\x34\xd6\x34\xd7\x34\xd8\x34\xd9\x34\xda\x34\xdb\x34\xdc\x34\xdd\x34\xde\x34\xdf\x34\xe0\x34\xe1\x34\xe2\x34\xe3\x34\xe4\x34\xe5\x34\xe6\x34\xe7\x34\xe8\x34\xe9\x34\xea\x34\xeb\x34\xec\x34\xed\x34\xee\x34\xef\x34\xf0\x34\xf1\x34\xf2\x34\xf3\x34\xf4\x34\xf5\x34\xf6\x34\xf7\x34\xf8\x34\xf9\x34\xfa\x34\xfb\x34\xfc\x34\xfd\x34\xfe", /* d080 */ "\x34\xff\x35\x00\x35\x01\x35\x02\x35\x03\x35\x04\x35\x05\x35\x06\x35\x07\x35\x08\x35\x09\x35\x0a\x35\x0b\x35\x0c\x35\x0d\x35\x0e\x35\x0f\x35\x10\x35\x11\x35\x12\x35\x13\x35\x14\x35\x15\x35\x16\x35\x17\x35\x18\x35\x19\x35\x1a\x35\x1b\x35\x1c\x35\x1d\x35\x1e\x35\x1f\x35\x20\x35\x21\x35\x22\x35\x23\x35\x24\x35\x25\x35\x26\x35\x27\x35\x28\x35\x29\x35\x2a\x35\x2b\x35\x2c\x35\x2d\x35\x2e\x35\x2f\x35\x30\x35\x31\x35\x32\x35\x33\x35\x34\x35\x35\x35\x36\x35\x37\x35\x38\x35\x39\x35\x3a\x35\x3b\x35\x3c\x35\x3d\x35\x3e\x35\x3f\x35\x40\x35\x41\x35\x42\x35\x43\x35\x44\x35\x45\x35\x46\x35\x47\x35\x48\x35\x49\x35\x4a\x35\x4b\x35\x4c\x35\x4d\x35\x4e\x35\x4f\x35\x50\x35\x51\x35\x52\x35\x53\x35\x54\x35\x55\x35\x56\x35\x57\x35\x58\x35\x59\x35\x5a\x35\x5b\x35\x5c\x35\x5d\x35\x5e\x35\x5f\x35\x60\x35\x61\x35\x62\x35\x63\x35\x64\x35\x65\x35\x66\x35\x67\x35\x68\x35\x69\x35\x6a\x35\x6b\x35\x6c\x35\x6d\x35\x6e\x35\x6f\x35\x70\x35\x71\x35\x72\x35\x73\x35\x74\x35\x75\x35\x76\x35\x77\x35\x78\x35\x79\x35\x7a\x35\x7b\x35\x7c\x35\x7d\x00\x00", /* d100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x7e\x35\x7f\x35\x80\x35\x81\x35\x82\x35\x83\x35\x84\x35\x85\x35\x86\x35\x87\x35\x88\x35\x89\x35\x8a\x35\x8b\x35\x8c\x35\x8d\x35\x8e\x35\x8f\x35\x90\x35\x91\x35\x92\x35\x93\x35\x94\x35\x95\x35\x96\x35\x97\x35\x98\x35\x99\x35\x9a\x35\x9b\x35\x9c\x35\x9d\x35\x9f\x35\xa0\x35\xa1\x35\xa2\x35\xa3\x35\xa4\x35\xa5\x35\xa6\x35\xa7\x35\xa8\x35\xa9\x35\xaa\x35\xab\x35\xac\x35\xad\x35\xae\x35\xaf\x35\xb0\x35\xb1\x35\xb2\x35\xb3\x35\xb4\x35\xb5\x35\xb6\x35\xb7\x35\xb8\x35\xb9\x35\xba\x35\xbb\x35\xbc\x35\xbd", /* d180 */ "\x35\xbe\x35\xbf\x35\xc0\x35\xc1\x35\xc2\x35\xc3\x35\xc4\x35\xc5\x35\xc6\x35\xc7\x35\xc8\x35\xc9\x35\xca\x35\xcb\x35\xcc\x35\xcd\x35\xce\x35\xcf\x35\xd0\x35\xd1\x35\xd2\x35\xd3\x35\xd4\x35\xd5\x35\xd6\x35\xd7\x35\xd8\x35\xd9\x35\xda\x35\xdb\x35\xdc\x35\xdd\x35\xde\x35\xdf\x35\xe0\x35\xe1\x35\xe2\x35\xe3\x35\xe4\x35\xe5\x35\xe6\x35\xe7\x35\xe8\x35\xe9\x35\xea\x35\xeb\x35\xec\x35\xed\x35\xee\x35\xef\x35\xf0\x35\xf1\x35\xf2\x35\xf3\x35\xf4\x35\xf5\x35\xf6\x35\xf7\x35\xf8\x35\xf9\x35\xfa\x35\xfb\x35\xfc\x35\xfd\x35\xfe\x35\xff\x36\x00\x36\x01\x36\x02\x36\x03\x36\x04\x36\x05\x36\x06\x36\x07\x36\x08\x36\x09\x36\x0a\x36\x0b\x36\x0c\x36\x0d\x36\x0f\x36\x10\x36\x11\x36\x12\x36\x13\x36\x14\x36\x15\x36\x16\x36\x17\x36\x18\x36\x19\x36\x1b\x36\x1c\x36\x1d\x36\x1e\x36\x1f\x36\x20\x36\x21\x36\x22\x36\x23\x36\x24\x36\x25\x36\x26\x36\x27\x36\x28\x36\x29\x36\x2a\x36\x2b\x36\x2c\x36\x2d\x36\x2e\x36\x2f\x36\x30\x36\x31\x36\x32\x36\x33\x36\x34\x36\x35\x36\x36\x36\x37\x36\x38\x36\x39\x36\x3a\x36\x3b\x36\x3c\x36\x3d\x36\x3e\x00\x00", /* d200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x3f\x36\x40\x36\x41\x36\x42\x36\x43\x36\x44\x36\x45\x36\x46\x36\x47\x36\x48\x36\x49\x36\x4a\x36\x4b\x36\x4c\x36\x4d\x36\x4e\x36\x4f\x36\x50\x36\x51\x36\x52\x36\x53\x36\x54\x36\x55\x36\x56\x36\x57\x36\x58\x36\x59\x36\x5a\x36\x5b\x36\x5c\x36\x5d\x36\x5e\x36\x5f\x36\x60\x36\x61\x36\x62\x36\x63\x36\x64\x36\x65\x36\x66\x36\x67\x36\x68\x36\x69\x36\x6a\x36\x6b\x36\x6c\x36\x6d\x36\x6e\x36\x6f\x36\x70\x36\x71\x36\x72\x36\x73\x36\x74\x36\x75\x36\x76\x36\x77\x36\x78\x36\x79\x36\x7a\x36\x7b\x36\x7c\x36\x7d", /* d280 */ "\x36\x7e\x36\x7f\x36\x80\x36\x81\x36\x82\x36\x83\x36\x84\x36\x85\x36\x86\x36\x87\x36\x88\x36\x89\x36\x8a\x36\x8b\x36\x8c\x36\x8d\x36\x8e\x36\x8f\x36\x90\x36\x91\x36\x92\x36\x93\x36\x94\x36\x95\x36\x96\x36\x97\x36\x98\x36\x99\x36\x9a\x36\x9b\x36\x9c\x36\x9d\x36\x9e\x36\x9f\x36\xa0\x36\xa1\x36\xa2\x36\xa3\x36\xa4\x36\xa5\x36\xa6\x36\xa7\x36\xa8\x36\xa9\x36\xaa\x36\xab\x36\xac\x36\xad\x36\xae\x36\xaf\x36\xb0\x36\xb1\x36\xb2\x36\xb3\x36\xb4\x36\xb5\x36\xb6\x36\xb7\x36\xb8\x36\xb9\x36\xba\x36\xbb\x36\xbc\x36\xbd\x36\xbe\x36\xbf\x36\xc0\x36\xc1\x36\xc2\x36\xc3\x36\xc4\x36\xc5\x36\xc6\x36\xc7\x36\xc8\x36\xc9\x36\xca\x36\xcb\x36\xcc\x36\xcd\x36\xce\x36\xcf\x36\xd0\x36\xd1\x36\xd2\x36\xd3\x36\xd4\x36\xd5\x36\xd6\x36\xd7\x36\xd8\x36\xd9\x36\xda\x36\xdb\x36\xdc\x36\xdd\x36\xde\x36\xdf\x36\xe0\x36\xe1\x36\xe2\x36\xe3\x36\xe4\x36\xe5\x36\xe6\x36\xe7\x36\xe8\x36\xe9\x36\xea\x36\xeb\x36\xec\x36\xed\x36\xee\x36\xef\x36\xf0\x36\xf1\x36\xf2\x36\xf3\x36\xf4\x36\xf5\x36\xf6\x36\xf7\x36\xf8\x36\xf9\x36\xfa\x36\xfb\x36\xfc\x00\x00", /* d300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\xfd\x36\xfe\x36\xff\x37\x00\x37\x01\x37\x02\x37\x03\x37\x04\x37\x05\x37\x06\x37\x07\x37\x08\x37\x09\x37\x0a\x37\x0b\x37\x0c\x37\x0d\x37\x0e\x37\x0f\x37\x10\x37\x11\x37\x12\x37\x13\x37\x14\x37\x15\x37\x16\x37\x17\x37\x18\x37\x19\x37\x1a\x37\x1b\x37\x1c\x37\x1d\x37\x1e\x37\x1f\x37\x20\x37\x21\x37\x22\x37\x23\x37\x24\x37\x25\x37\x26\x37\x27\x37\x28\x37\x29\x37\x2a\x37\x2b\x37\x2c\x37\x2d\x37\x2e\x37\x2f\x37\x30\x37\x31\x37\x32\x37\x33\x37\x34\x37\x35\x37\x36\x37\x37\x37\x38\x37\x39\x37\x3a\x37\x3b", /* d380 */ "\x37\x3c\x37\x3d\x37\x3e\x37\x3f\x37\x40\x37\x41\x37\x42\x37\x43\x37\x44\x37\x45\x37\x46\x37\x47\x37\x48\x37\x49\x37\x4a\x37\x4b\x37\x4c\x37\x4d\x37\x4e\x37\x4f\x37\x50\x37\x51\x37\x52\x37\x53\x37\x54\x37\x55\x37\x56\x37\x57\x37\x58\x37\x59\x37\x5a\x37\x5b\x37\x5c\x37\x5d\x37\x5e\x37\x5f\x37\x60\x37\x61\x37\x62\x37\x63\x37\x64\x37\x65\x37\x66\x37\x67\x37\x68\x37\x69\x37\x6a\x37\x6b\x37\x6c\x37\x6d\x37\x6e\x37\x6f\x37\x70\x37\x71\x37\x72\x37\x73\x37\x74\x37\x75\x37\x76\x37\x77\x37\x78\x37\x79\x37\x7a\x37\x7b\x37\x7c\x37\x7d\x37\x7e\x37\x7f\x37\x80\x37\x81\x37\x82\x37\x83\x37\x84\x37\x85\x37\x86\x37\x87\x37\x88\x37\x89\x37\x8a\x37\x8b\x37\x8c\x37\x8d\x37\x8e\x37\x8f\x37\x90\x37\x91\x37\x92\x37\x93\x37\x94\x37\x95\x37\x96\x37\x97\x37\x98\x37\x99\x37\x9a\x37\x9b\x37\x9c\x37\x9d\x37\x9e\x37\x9f\x37\xa0\x37\xa1\x37\xa2\x37\xa3\x37\xa4\x37\xa5\x37\xa6\x37\xa7\x37\xa8\x37\xa9\x37\xaa\x37\xab\x37\xac\x37\xad\x37\xae\x37\xaf\x37\xb0\x37\xb1\x37\xb2\x37\xb3\x37\xb4\x37\xb5\x37\xb6\x37\xb7\x37\xb8\x37\xb9\x37\xba\x00\x00", /* d400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\xbb\x37\xbc\x37\xbd\x37\xbe\x37\xbf\x37\xc0\x37\xc1\x37\xc2\x37\xc3\x37\xc4\x37\xc5\x37\xc6\x37\xc7\x37\xc8\x37\xc9\x37\xca\x37\xcb\x37\xcc\x37\xcd\x37\xce\x37\xcf\x37\xd0\x37\xd1\x37\xd2\x37\xd3\x37\xd4\x37\xd5\x37\xd6\x37\xd7\x37\xd8\x37\xd9\x37\xda\x37\xdb\x37\xdc\x37\xdd\x37\xde\x37\xdf\x37\xe0\x37\xe1\x37\xe2\x37\xe3\x37\xe4\x37\xe5\x37\xe6\x37\xe7\x37\xe8\x37\xe9\x37\xea\x37\xeb\x37\xec\x37\xed\x37\xee\x37\xef\x37\xf0\x37\xf1\x37\xf2\x37\xf3\x37\xf4\x37\xf5\x37\xf6\x37\xf7\x37\xf8\x37\xf9", /* d480 */ "\x37\xfa\x37\xfb\x37\xfc\x37\xfd\x37\xfe\x37\xff\x38\x00\x38\x01\x38\x02\x38\x03\x38\x04\x38\x05\x38\x06\x38\x07\x38\x08\x38\x09\x38\x0a\x38\x0b\x38\x0c\x38\x0d\x38\x0e\x38\x0f\x38\x10\x38\x11\x38\x12\x38\x13\x38\x14\x38\x15\x38\x16\x38\x17\x38\x18\x38\x19\x38\x1a\x38\x1b\x38\x1c\x38\x1d\x38\x1e\x38\x1f\x38\x20\x38\x21\x38\x22\x38\x23\x38\x24\x38\x25\x38\x26\x38\x27\x38\x28\x38\x29\x38\x2a\x38\x2b\x38\x2c\x38\x2d\x38\x2e\x38\x2f\x38\x30\x38\x31\x38\x32\x38\x33\x38\x34\x38\x35\x38\x36\x38\x37\x38\x38\x38\x39\x38\x3a\x38\x3b\x38\x3c\x38\x3d\x38\x3e\x38\x3f\x38\x40\x38\x41\x38\x42\x38\x43\x38\x44\x38\x45\x38\x46\x38\x47\x38\x48\x38\x49\x38\x4a\x38\x4b\x38\x4c\x38\x4d\x38\x4e\x38\x4f\x38\x50\x38\x51\x38\x52\x38\x53\x38\x54\x38\x55\x38\x56\x38\x57\x38\x58\x38\x59\x38\x5a\x38\x5b\x38\x5c\x38\x5d\x38\x5e\x38\x5f\x38\x60\x38\x61\x38\x62\x38\x63\x38\x64\x38\x65\x38\x66\x38\x67\x38\x68\x38\x69\x38\x6a\x38\x6b\x38\x6c\x38\x6d\x38\x6e\x38\x6f\x38\x70\x38\x71\x38\x72\x38\x73\x38\x74\x38\x75\x38\x76\x38\x77\x38\x78\x00\x00", /* d500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x79\x38\x7a\x38\x7b\x38\x7c\x38\x7d\x38\x7e\x38\x7f\x38\x80\x38\x81\x38\x82\x38\x83\x38\x84\x38\x85\x38\x86\x38\x87\x38\x88\x38\x89\x38\x8a\x38\x8b\x38\x8c\x38\x8d\x38\x8e\x38\x8f\x38\x90\x38\x91\x38\x92\x38\x93\x38\x94\x38\x95\x38\x96\x38\x97\x38\x98\x38\x99\x38\x9a\x38\x9b\x38\x9c\x38\x9d\x38\x9e\x38\x9f\x38\xa0\x38\xa1\x38\xa2\x38\xa3\x38\xa4\x38\xa5\x38\xa6\x38\xa7\x38\xa8\x38\xa9\x38\xaa\x38\xab\x38\xac\x38\xad\x38\xae\x38\xaf\x38\xb0\x38\xb1\x38\xb2\x38\xb3\x38\xb4\x38\xb5\x38\xb6\x38\xb7", /* d580 */ "\x38\xb8\x38\xb9\x38\xba\x38\xbb\x38\xbc\x38\xbd\x38\xbe\x38\xbf\x38\xc0\x38\xc1\x38\xc2\x38\xc3\x38\xc4\x38\xc5\x38\xc6\x38\xc7\x38\xc8\x38\xc9\x38\xca\x38\xcb\x38\xcc\x38\xcd\x38\xce\x38\xcf\x38\xd0\x38\xd1\x38\xd2\x38\xd3\x38\xd4\x38\xd5\x38\xd6\x38\xd7\x38\xd8\x38\xd9\x38\xda\x38\xdb\x38\xdc\x38\xdd\x38\xde\x38\xdf\x38\xe0\x38\xe1\x38\xe2\x38\xe3\x38\xe4\x38\xe5\x38\xe6\x38\xe7\x38\xe8\x38\xe9\x38\xea\x38\xeb\x38\xec\x38\xed\x38\xee\x38\xef\x38\xf0\x38\xf1\x38\xf2\x38\xf3\x38\xf4\x38\xf5\x38\xf6\x38\xf7\x38\xf8\x38\xf9\x38\xfa\x38\xfb\x38\xfc\x38\xfd\x38\xfe\x38\xff\x39\x00\x39\x01\x39\x02\x39\x03\x39\x04\x39\x05\x39\x06\x39\x07\x39\x08\x39\x09\x39\x0a\x39\x0b\x39\x0c\x39\x0d\x39\x0e\x39\x0f\x39\x10\x39\x11\x39\x12\x39\x13\x39\x14\x39\x15\x39\x16\x39\x17\x39\x19\x39\x1a\x39\x1b\x39\x1c\x39\x1d\x39\x1e\x39\x1f\x39\x20\x39\x21\x39\x22\x39\x23\x39\x24\x39\x25\x39\x26\x39\x27\x39\x28\x39\x29\x39\x2a\x39\x2b\x39\x2c\x39\x2d\x39\x2e\x39\x2f\x39\x30\x39\x31\x39\x32\x39\x33\x39\x34\x39\x35\x39\x36\x39\x37\x00\x00", /* d600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x38\x39\x39\x39\x3a\x39\x3b\x39\x3c\x39\x3d\x39\x3e\x39\x3f\x39\x40\x39\x41\x39\x42\x39\x43\x39\x44\x39\x45\x39\x46\x39\x47\x39\x48\x39\x49\x39\x4a\x39\x4b\x39\x4c\x39\x4d\x39\x4e\x39\x4f\x39\x50\x39\x51\x39\x52\x39\x53\x39\x54\x39\x55\x39\x56\x39\x57\x39\x58\x39\x59\x39\x5a\x39\x5b\x39\x5c\x39\x5d\x39\x5e\x39\x5f\x39\x60\x39\x61\x39\x62\x39\x63\x39\x64\x39\x65\x39\x66\x39\x67\x39\x68\x39\x69\x39\x6a\x39\x6b\x39\x6c\x39\x6d\x39\x6f\x39\x70\x39\x71\x39\x72\x39\x73\x39\x74\x39\x75\x39\x76\x39\x77", /* d680 */ "\x39\x78\x39\x79\x39\x7a\x39\x7b\x39\x7c\x39\x7d\x39\x7e\x39\x7f\x39\x80\x39\x81\x39\x82\x39\x83\x39\x84\x39\x85\x39\x86\x39\x87\x39\x88\x39\x89\x39\x8a\x39\x8b\x39\x8c\x39\x8d\x39\x8e\x39\x8f\x39\x90\x39\x91\x39\x92\x39\x93\x39\x94\x39\x95\x39\x96\x39\x97\x39\x98\x39\x99\x39\x9a\x39\x9b\x39\x9c\x39\x9d\x39\x9e\x39\x9f\x39\xa0\x39\xa1\x39\xa2\x39\xa3\x39\xa4\x39\xa5\x39\xa6\x39\xa7\x39\xa8\x39\xa9\x39\xaa\x39\xab\x39\xac\x39\xad\x39\xae\x39\xaf\x39\xb0\x39\xb1\x39\xb2\x39\xb3\x39\xb4\x39\xb5\x39\xb6\x39\xb7\x39\xb8\x39\xb9\x39\xba\x39\xbb\x39\xbc\x39\xbd\x39\xbe\x39\xbf\x39\xc0\x39\xc1\x39\xc2\x39\xc3\x39\xc4\x39\xc5\x39\xc6\x39\xc7\x39\xc8\x39\xc9\x39\xca\x39\xcb\x39\xcc\x39\xcd\x39\xce\x39\xd1\x39\xd2\x39\xd3\x39\xd4\x39\xd5\x39\xd6\x39\xd7\x39\xd8\x39\xd9\x39\xda\x39\xdb\x39\xdc\x39\xdd\x39\xde\x39\xe0\x39\xe1\x39\xe2\x39\xe3\x39\xe4\x39\xe5\x39\xe6\x39\xe7\x39\xe8\x39\xe9\x39\xea\x39\xeb\x39\xec\x39\xed\x39\xee\x39\xef\x39\xf0\x39\xf1\x39\xf2\x39\xf3\x39\xf4\x39\xf5\x39\xf6\x39\xf7\x39\xf8\x39\xf9\x00\x00", /* d700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\xfa\x39\xfb\x39\xfc\x39\xfd\x39\xfe\x39\xff\x3a\x00\x3a\x01\x3a\x02\x3a\x03\x3a\x04\x3a\x05\x3a\x06\x3a\x07\x3a\x08\x3a\x09\x3a\x0a\x3a\x0b\x3a\x0c\x3a\x0d\x3a\x0e\x3a\x0f\x3a\x10\x3a\x11\x3a\x12\x3a\x13\x3a\x14\x3a\x15\x3a\x16\x3a\x17\x3a\x18\x3a\x19\x3a\x1a\x3a\x1b\x3a\x1c\x3a\x1d\x3a\x1e\x3a\x1f\x3a\x20\x3a\x21\x3a\x22\x3a\x23\x3a\x24\x3a\x25\x3a\x26\x3a\x27\x3a\x28\x3a\x29\x3a\x2a\x3a\x2b\x3a\x2c\x3a\x2d\x3a\x2e\x3a\x2f\x3a\x30\x3a\x31\x3a\x32\x3a\x33\x3a\x34\x3a\x35\x3a\x36\x3a\x37\x3a\x38", /* d780 */ "\x3a\x39\x3a\x3a\x3a\x3b\x3a\x3c\x3a\x3d\x3a\x3e\x3a\x3f\x3a\x40\x3a\x41\x3a\x42\x3a\x43\x3a\x44\x3a\x45\x3a\x46\x3a\x47\x3a\x48\x3a\x49\x3a\x4a\x3a\x4b\x3a\x4c\x3a\x4d\x3a\x4e\x3a\x4f\x3a\x50\x3a\x51\x3a\x52\x3a\x53\x3a\x54\x3a\x55\x3a\x56\x3a\x57\x3a\x58\x3a\x59\x3a\x5a\x3a\x5b\x3a\x5c\x3a\x5d\x3a\x5e\x3a\x5f\x3a\x60\x3a\x61\x3a\x62\x3a\x63\x3a\x64\x3a\x65\x3a\x66\x3a\x67\x3a\x68\x3a\x69\x3a\x6a\x3a\x6b\x3a\x6c\x3a\x6d\x3a\x6e\x3a\x6f\x3a\x70\x3a\x71\x3a\x72\x3a\x74\x3a\x75\x3a\x76\x3a\x77\x3a\x78\x3a\x79\x3a\x7a\x3a\x7b\x3a\x7c\x3a\x7d\x3a\x7e\x3a\x7f\x3a\x80\x3a\x81\x3a\x82\x3a\x83\x3a\x84\x3a\x85\x3a\x86\x3a\x87\x3a\x88\x3a\x89\x3a\x8a\x3a\x8b\x3a\x8c\x3a\x8d\x3a\x8e\x3a\x8f\x3a\x90\x3a\x91\x3a\x92\x3a\x93\x3a\x94\x3a\x95\x3a\x96\x3a\x97\x3a\x98\x3a\x99\x3a\x9a\x3a\x9b\x3a\x9c\x3a\x9d\x3a\x9e\x3a\x9f\x3a\xa0\x3a\xa1\x3a\xa2\x3a\xa3\x3a\xa4\x3a\xa5\x3a\xa6\x3a\xa7\x3a\xa8\x3a\xa9\x3a\xaa\x3a\xab\x3a\xac\x3a\xad\x3a\xae\x3a\xaf\x3a\xb0\x3a\xb1\x3a\xb2\x3a\xb3\x3a\xb4\x3a\xb5\x3a\xb6\x3a\xb7\x3a\xb8\x00\x00", /* d800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\xb9\x3a\xba\x3a\xbb\x3a\xbc\x3a\xbd\x3a\xbe\x3a\xbf\x3a\xc0\x3a\xc1\x3a\xc2\x3a\xc3\x3a\xc4\x3a\xc5\x3a\xc6\x3a\xc7\x3a\xc8\x3a\xc9\x3a\xca\x3a\xcb\x3a\xcc\x3a\xcd\x3a\xce\x3a\xcf\x3a\xd0\x3a\xd1\x3a\xd2\x3a\xd3\x3a\xd4\x3a\xd5\x3a\xd6\x3a\xd7\x3a\xd8\x3a\xd9\x3a\xda\x3a\xdb\x3a\xdc\x3a\xdd\x3a\xde\x3a\xdf\x3a\xe0\x3a\xe1\x3a\xe2\x3a\xe3\x3a\xe4\x3a\xe5\x3a\xe6\x3a\xe7\x3a\xe8\x3a\xe9\x3a\xea\x3a\xeb\x3a\xec\x3a\xed\x3a\xee\x3a\xef\x3a\xf0\x3a\xf1\x3a\xf2\x3a\xf3\x3a\xf4\x3a\xf5\x3a\xf6\x3a\xf7", /* d880 */ "\x3a\xf8\x3a\xf9\x3a\xfa\x3a\xfb\x3a\xfc\x3a\xfd\x3a\xfe\x3a\xff\x3b\x00\x3b\x01\x3b\x02\x3b\x03\x3b\x04\x3b\x05\x3b\x06\x3b\x07\x3b\x08\x3b\x09\x3b\x0a\x3b\x0b\x3b\x0c\x3b\x0d\x3b\x0e\x3b\x0f\x3b\x10\x3b\x11\x3b\x12\x3b\x13\x3b\x14\x3b\x15\x3b\x16\x3b\x17\x3b\x18\x3b\x19\x3b\x1a\x3b\x1b\x3b\x1c\x3b\x1d\x3b\x1e\x3b\x1f\x3b\x20\x3b\x21\x3b\x22\x3b\x23\x3b\x24\x3b\x25\x3b\x26\x3b\x27\x3b\x28\x3b\x29\x3b\x2a\x3b\x2b\x3b\x2c\x3b\x2d\x3b\x2e\x3b\x2f\x3b\x30\x3b\x31\x3b\x32\x3b\x33\x3b\x34\x3b\x35\x3b\x36\x3b\x37\x3b\x38\x3b\x39\x3b\x3a\x3b\x3b\x3b\x3c\x3b\x3d\x3b\x3e\x3b\x3f\x3b\x40\x3b\x41\x3b\x42\x3b\x43\x3b\x44\x3b\x45\x3b\x46\x3b\x47\x3b\x48\x3b\x49\x3b\x4a\x3b\x4b\x3b\x4c\x3b\x4d\x3b\x4f\x3b\x50\x3b\x51\x3b\x52\x3b\x53\x3b\x54\x3b\x55\x3b\x56\x3b\x57\x3b\x58\x3b\x59\x3b\x5a\x3b\x5b\x3b\x5c\x3b\x5d\x3b\x5e\x3b\x5f\x3b\x60\x3b\x61\x3b\x62\x3b\x63\x3b\x64\x3b\x65\x3b\x66\x3b\x67\x3b\x68\x3b\x69\x3b\x6a\x3b\x6b\x3b\x6c\x3b\x6d\x3b\x6e\x3b\x6f\x3b\x70\x3b\x71\x3b\x72\x3b\x73\x3b\x74\x3b\x75\x3b\x76\x3b\x77\x00\x00", /* d900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x78\x3b\x79\x3b\x7a\x3b\x7b\x3b\x7c\x3b\x7d\x3b\x7e\x3b\x7f\x3b\x80\x3b\x81\x3b\x82\x3b\x83\x3b\x84\x3b\x85\x3b\x86\x3b\x87\x3b\x88\x3b\x89\x3b\x8a\x3b\x8b\x3b\x8c\x3b\x8d\x3b\x8e\x3b\x8f\x3b\x90\x3b\x91\x3b\x92\x3b\x93\x3b\x94\x3b\x95\x3b\x96\x3b\x97\x3b\x98\x3b\x99\x3b\x9a\x3b\x9b\x3b\x9c\x3b\x9d\x3b\x9e\x3b\x9f\x3b\xa0\x3b\xa1\x3b\xa2\x3b\xa3\x3b\xa4\x3b\xa5\x3b\xa6\x3b\xa7\x3b\xa8\x3b\xa9\x3b\xaa\x3b\xab\x3b\xac\x3b\xad\x3b\xae\x3b\xaf\x3b\xb0\x3b\xb1\x3b\xb2\x3b\xb3\x3b\xb4\x3b\xb5\x3b\xb6", /* d980 */ "\x3b\xb7\x3b\xb8\x3b\xb9\x3b\xba\x3b\xbb\x3b\xbc\x3b\xbd\x3b\xbe\x3b\xbf\x3b\xc0\x3b\xc1\x3b\xc2\x3b\xc3\x3b\xc4\x3b\xc5\x3b\xc6\x3b\xc7\x3b\xc8\x3b\xc9\x3b\xca\x3b\xcb\x3b\xcc\x3b\xcd\x3b\xce\x3b\xcf\x3b\xd0\x3b\xd1\x3b\xd2\x3b\xd3\x3b\xd4\x3b\xd5\x3b\xd6\x3b\xd7\x3b\xd8\x3b\xd9\x3b\xda\x3b\xdb\x3b\xdc\x3b\xdd\x3b\xde\x3b\xdf\x3b\xe0\x3b\xe1\x3b\xe2\x3b\xe3\x3b\xe4\x3b\xe5\x3b\xe6\x3b\xe7\x3b\xe8\x3b\xe9\x3b\xea\x3b\xeb\x3b\xec\x3b\xed\x3b\xee\x3b\xef\x3b\xf0\x3b\xf1\x3b\xf2\x3b\xf3\x3b\xf4\x3b\xf5\x3b\xf6\x3b\xf7\x3b\xf8\x3b\xf9\x3b\xfa\x3b\xfb\x3b\xfc\x3b\xfd\x3b\xfe\x3b\xff\x3c\x00\x3c\x01\x3c\x02\x3c\x03\x3c\x04\x3c\x05\x3c\x06\x3c\x07\x3c\x08\x3c\x09\x3c\x0a\x3c\x0b\x3c\x0c\x3c\x0d\x3c\x0e\x3c\x0f\x3c\x10\x3c\x11\x3c\x12\x3c\x13\x3c\x14\x3c\x15\x3c\x16\x3c\x17\x3c\x18\x3c\x19\x3c\x1a\x3c\x1b\x3c\x1c\x3c\x1d\x3c\x1e\x3c\x1f\x3c\x20\x3c\x21\x3c\x22\x3c\x23\x3c\x24\x3c\x25\x3c\x26\x3c\x27\x3c\x28\x3c\x29\x3c\x2a\x3c\x2b\x3c\x2c\x3c\x2d\x3c\x2e\x3c\x2f\x3c\x30\x3c\x31\x3c\x32\x3c\x33\x3c\x34\x3c\x35\x00\x00", /* da00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x36\x3c\x37\x3c\x38\x3c\x39\x3c\x3a\x3c\x3b\x3c\x3c\x3c\x3d\x3c\x3e\x3c\x3f\x3c\x40\x3c\x41\x3c\x42\x3c\x43\x3c\x44\x3c\x45\x3c\x46\x3c\x47\x3c\x48\x3c\x49\x3c\x4a\x3c\x4b\x3c\x4c\x3c\x4d\x3c\x4e\x3c\x4f\x3c\x50\x3c\x51\x3c\x52\x3c\x53\x3c\x54\x3c\x55\x3c\x56\x3c\x57\x3c\x58\x3c\x59\x3c\x5a\x3c\x5b\x3c\x5c\x3c\x5d\x3c\x5e\x3c\x5f\x3c\x60\x3c\x61\x3c\x62\x3c\x63\x3c\x64\x3c\x65\x3c\x66\x3c\x67\x3c\x68\x3c\x69\x3c\x6a\x3c\x6b\x3c\x6c\x3c\x6d\x3c\x6f\x3c\x70\x3c\x71\x3c\x72\x3c\x73\x3c\x74\x3c\x75", /* da80 */ "\x3c\x76\x3c\x77\x3c\x78\x3c\x79\x3c\x7a\x3c\x7b\x3c\x7c\x3c\x7d\x3c\x7e\x3c\x7f\x3c\x80\x3c\x81\x3c\x82\x3c\x83\x3c\x84\x3c\x85\x3c\x86\x3c\x87\x3c\x88\x3c\x89\x3c\x8a\x3c\x8b\x3c\x8c\x3c\x8d\x3c\x8e\x3c\x8f\x3c\x90\x3c\x91\x3c\x92\x3c\x93\x3c\x94\x3c\x95\x3c\x96\x3c\x97\x3c\x98\x3c\x99\x3c\x9a\x3c\x9b\x3c\x9c\x3c\x9d\x3c\x9e\x3c\x9f\x3c\xa0\x3c\xa1\x3c\xa2\x3c\xa3\x3c\xa4\x3c\xa5\x3c\xa6\x3c\xa7\x3c\xa8\x3c\xa9\x3c\xaa\x3c\xab\x3c\xac\x3c\xad\x3c\xae\x3c\xaf\x3c\xb0\x3c\xb1\x3c\xb2\x3c\xb3\x3c\xb4\x3c\xb5\x3c\xb6\x3c\xb7\x3c\xb8\x3c\xb9\x3c\xba\x3c\xbb\x3c\xbc\x3c\xbd\x3c\xbe\x3c\xbf\x3c\xc0\x3c\xc1\x3c\xc2\x3c\xc3\x3c\xc4\x3c\xc5\x3c\xc6\x3c\xc7\x3c\xc8\x3c\xc9\x3c\xca\x3c\xcb\x3c\xcc\x3c\xcd\x3c\xce\x3c\xcf\x3c\xd0\x3c\xd1\x3c\xd2\x3c\xd3\x3c\xd4\x3c\xd5\x3c\xd6\x3c\xd7\x3c\xd8\x3c\xd9\x3c\xda\x3c\xdb\x3c\xdc\x3c\xdd\x3c\xde\x3c\xdf\x3c\xe1\x3c\xe2\x3c\xe3\x3c\xe4\x3c\xe5\x3c\xe6\x3c\xe7\x3c\xe8\x3c\xe9\x3c\xea\x3c\xeb\x3c\xec\x3c\xed\x3c\xee\x3c\xef\x3c\xf0\x3c\xf1\x3c\xf2\x3c\xf3\x3c\xf4\x3c\xf5\x00\x00", /* db00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf6\x3c\xf7\x3c\xf8\x3c\xf9\x3c\xfa\x3c\xfb\x3c\xfc\x3c\xfd\x3c\xfe\x3c\xff\x3d\x00\x3d\x01\x3d\x02\x3d\x03\x3d\x04\x3d\x05\x3d\x06\x3d\x07\x3d\x08\x3d\x09\x3d\x0a\x3d\x0b\x3d\x0c\x3d\x0d\x3d\x0e\x3d\x0f\x3d\x10\x3d\x11\x3d\x12\x3d\x13\x3d\x14\x3d\x15\x3d\x16\x3d\x17\x3d\x18\x3d\x19\x3d\x1a\x3d\x1b\x3d\x1c\x3d\x1d\x3d\x1e\x3d\x1f\x3d\x20\x3d\x21\x3d\x22\x3d\x23\x3d\x24\x3d\x25\x3d\x26\x3d\x27\x3d\x28\x3d\x29\x3d\x2a\x3d\x2b\x3d\x2c\x3d\x2d\x3d\x2e\x3d\x2f\x3d\x30\x3d\x31\x3d\x32\x3d\x33\x3d\x34", /* db80 */ "\x3d\x35\x3d\x36\x3d\x37\x3d\x38\x3d\x39\x3d\x3a\x3d\x3b\x3d\x3c\x3d\x3d\x3d\x3e\x3d\x3f\x3d\x40\x3d\x41\x3d\x42\x3d\x43\x3d\x44\x3d\x45\x3d\x46\x3d\x47\x3d\x48\x3d\x49\x3d\x4a\x3d\x4b\x3d\x4c\x3d\x4d\x3d\x4e\x3d\x4f\x3d\x50\x3d\x51\x3d\x52\x3d\x53\x3d\x54\x3d\x55\x3d\x56\x3d\x57\x3d\x58\x3d\x59\x3d\x5a\x3d\x5b\x3d\x5c\x3d\x5d\x3d\x5e\x3d\x5f\x3d\x60\x3d\x61\x3d\x62\x3d\x63\x3d\x64\x3d\x65\x3d\x66\x3d\x67\x3d\x68\x3d\x69\x3d\x6a\x3d\x6b\x3d\x6c\x3d\x6d\x3d\x6e\x3d\x6f\x3d\x70\x3d\x71\x3d\x72\x3d\x73\x3d\x74\x3d\x75\x3d\x76\x3d\x77\x3d\x78\x3d\x79\x3d\x7a\x3d\x7b\x3d\x7c\x3d\x7d\x3d\x7e\x3d\x7f\x3d\x80\x3d\x81\x3d\x82\x3d\x83\x3d\x84\x3d\x85\x3d\x86\x3d\x87\x3d\x88\x3d\x89\x3d\x8a\x3d\x8b\x3d\x8c\x3d\x8d\x3d\x8e\x3d\x8f\x3d\x90\x3d\x91\x3d\x92\x3d\x93\x3d\x94\x3d\x95\x3d\x96\x3d\x97\x3d\x98\x3d\x99\x3d\x9a\x3d\x9b\x3d\x9c\x3d\x9d\x3d\x9e\x3d\x9f\x3d\xa0\x3d\xa1\x3d\xa2\x3d\xa3\x3d\xa4\x3d\xa5\x3d\xa6\x3d\xa7\x3d\xa8\x3d\xa9\x3d\xaa\x3d\xab\x3d\xac\x3d\xad\x3d\xae\x3d\xaf\x3d\xb0\x3d\xb1\x3d\xb2\x3d\xb3\x00\x00", /* dc00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xb4\x3d\xb5\x3d\xb6\x3d\xb7\x3d\xb8\x3d\xb9\x3d\xba\x3d\xbb\x3d\xbc\x3d\xbd\x3d\xbe\x3d\xbf\x3d\xc0\x3d\xc1\x3d\xc2\x3d\xc3\x3d\xc4\x3d\xc5\x3d\xc6\x3d\xc7\x3d\xc8\x3d\xc9\x3d\xca\x3d\xcb\x3d\xcc\x3d\xcd\x3d\xce\x3d\xcf\x3d\xd0\x3d\xd1\x3d\xd2\x3d\xd3\x3d\xd4\x3d\xd5\x3d\xd6\x3d\xd7\x3d\xd8\x3d\xd9\x3d\xda\x3d\xdb\x3d\xdc\x3d\xdd\x3d\xde\x3d\xdf\x3d\xe0\x3d\xe1\x3d\xe2\x3d\xe3\x3d\xe4\x3d\xe5\x3d\xe6\x3d\xe7\x3d\xe8\x3d\xe9\x3d\xea\x3d\xeb\x3d\xec\x3d\xed\x3d\xee\x3d\xef\x3d\xf0\x3d\xf1\x3d\xf2", /* dc80 */ "\x3d\xf3\x3d\xf4\x3d\xf5\x3d\xf6\x3d\xf7\x3d\xf8\x3d\xf9\x3d\xfa\x3d\xfb\x3d\xfc\x3d\xfd\x3d\xfe\x3d\xff\x3e\x00\x3e\x01\x3e\x02\x3e\x03\x3e\x04\x3e\x05\x3e\x06\x3e\x07\x3e\x08\x3e\x09\x3e\x0a\x3e\x0b\x3e\x0c\x3e\x0d\x3e\x0e\x3e\x0f\x3e\x10\x3e\x11\x3e\x12\x3e\x13\x3e\x14\x3e\x15\x3e\x16\x3e\x17\x3e\x18\x3e\x19\x3e\x1a\x3e\x1b\x3e\x1c\x3e\x1d\x3e\x1e\x3e\x1f\x3e\x20\x3e\x21\x3e\x22\x3e\x23\x3e\x24\x3e\x25\x3e\x26\x3e\x27\x3e\x28\x3e\x29\x3e\x2a\x3e\x2b\x3e\x2c\x3e\x2d\x3e\x2e\x3e\x2f\x3e\x30\x3e\x31\x3e\x32\x3e\x33\x3e\x34\x3e\x35\x3e\x36\x3e\x37\x3e\x38\x3e\x39\x3e\x3a\x3e\x3b\x3e\x3c\x3e\x3d\x3e\x3e\x3e\x3f\x3e\x40\x3e\x41\x3e\x42\x3e\x43\x3e\x44\x3e\x45\x3e\x46\x3e\x47\x3e\x48\x3e\x49\x3e\x4a\x3e\x4b\x3e\x4c\x3e\x4d\x3e\x4e\x3e\x4f\x3e\x50\x3e\x51\x3e\x52\x3e\x53\x3e\x54\x3e\x55\x3e\x56\x3e\x57\x3e\x58\x3e\x59\x3e\x5a\x3e\x5b\x3e\x5c\x3e\x5d\x3e\x5e\x3e\x5f\x3e\x60\x3e\x61\x3e\x62\x3e\x63\x3e\x64\x3e\x65\x3e\x66\x3e\x67\x3e\x68\x3e\x69\x3e\x6a\x3e\x6b\x3e\x6c\x3e\x6d\x3e\x6e\x3e\x6f\x3e\x70\x3e\x71\x00\x00", /* dd00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x72\x3e\x73\x3e\x74\x3e\x75\x3e\x76\x3e\x77\x3e\x78\x3e\x79\x3e\x7a\x3e\x7b\x3e\x7c\x3e\x7d\x3e\x7e\x3e\x7f\x3e\x80\x3e\x81\x3e\x82\x3e\x83\x3e\x84\x3e\x85\x3e\x86\x3e\x87\x3e\x88\x3e\x89\x3e\x8a\x3e\x8b\x3e\x8c\x3e\x8d\x3e\x8e\x3e\x8f\x3e\x90\x3e\x91\x3e\x92\x3e\x93\x3e\x94\x3e\x95\x3e\x96\x3e\x97\x3e\x98\x3e\x99\x3e\x9a\x3e\x9b\x3e\x9c\x3e\x9d\x3e\x9e\x3e\x9f\x3e\xa0\x3e\xa1\x3e\xa2\x3e\xa3\x3e\xa4\x3e\xa5\x3e\xa6\x3e\xa7\x3e\xa8\x3e\xa9\x3e\xaa\x3e\xab\x3e\xac\x3e\xad\x3e\xae\x3e\xaf\x3e\xb0", /* dd80 */ "\x3e\xb1\x3e\xb2\x3e\xb3\x3e\xb4\x3e\xb5\x3e\xb6\x3e\xb7\x3e\xb8\x3e\xb9\x3e\xba\x3e\xbb\x3e\xbc\x3e\xbd\x3e\xbe\x3e\xbf\x3e\xc0\x3e\xc1\x3e\xc2\x3e\xc3\x3e\xc4\x3e\xc5\x3e\xc6\x3e\xc7\x3e\xc8\x3e\xc9\x3e\xca\x3e\xcb\x3e\xcc\x3e\xcd\x3e\xce\x3e\xcf\x3e\xd0\x3e\xd1\x3e\xd2\x3e\xd3\x3e\xd4\x3e\xd5\x3e\xd6\x3e\xd7\x3e\xd8\x3e\xd9\x3e\xda\x3e\xdb\x3e\xdc\x3e\xdd\x3e\xde\x3e\xdf\x3e\xe0\x3e\xe1\x3e\xe2\x3e\xe3\x3e\xe4\x3e\xe5\x3e\xe6\x3e\xe7\x3e\xe8\x3e\xe9\x3e\xea\x3e\xeb\x3e\xec\x3e\xed\x3e\xee\x3e\xef\x3e\xf0\x3e\xf1\x3e\xf2\x3e\xf3\x3e\xf4\x3e\xf5\x3e\xf6\x3e\xf7\x3e\xf8\x3e\xf9\x3e\xfa\x3e\xfb\x3e\xfc\x3e\xfd\x3e\xfe\x3e\xff\x3f\x00\x3f\x01\x3f\x02\x3f\x03\x3f\x04\x3f\x05\x3f\x06\x3f\x07\x3f\x08\x3f\x09\x3f\x0a\x3f\x0b\x3f\x0c\x3f\x0d\x3f\x0e\x3f\x0f\x3f\x10\x3f\x11\x3f\x12\x3f\x13\x3f\x14\x3f\x15\x3f\x16\x3f\x17\x3f\x18\x3f\x19\x3f\x1a\x3f\x1b\x3f\x1c\x3f\x1d\x3f\x1e\x3f\x1f\x3f\x20\x3f\x21\x3f\x22\x3f\x23\x3f\x24\x3f\x25\x3f\x26\x3f\x27\x3f\x28\x3f\x29\x3f\x2a\x3f\x2b\x3f\x2c\x3f\x2d\x3f\x2e\x3f\x2f\x00\x00", /* de00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x30\x3f\x31\x3f\x32\x3f\x33\x3f\x34\x3f\x35\x3f\x36\x3f\x37\x3f\x38\x3f\x39\x3f\x3a\x3f\x3b\x3f\x3c\x3f\x3d\x3f\x3e\x3f\x3f\x3f\x40\x3f\x41\x3f\x42\x3f\x43\x3f\x44\x3f\x45\x3f\x46\x3f\x47\x3f\x48\x3f\x49\x3f\x4a\x3f\x4b\x3f\x4c\x3f\x4d\x3f\x4e\x3f\x4f\x3f\x50\x3f\x51\x3f\x52\x3f\x53\x3f\x54\x3f\x55\x3f\x56\x3f\x57\x3f\x58\x3f\x59\x3f\x5a\x3f\x5b\x3f\x5c\x3f\x5d\x3f\x5e\x3f\x5f\x3f\x60\x3f\x61\x3f\x62\x3f\x63\x3f\x64\x3f\x65\x3f\x66\x3f\x67\x3f\x68\x3f\x69\x3f\x6a\x3f\x6b\x3f\x6c\x3f\x6d\x3f\x6e", /* de80 */ "\x3f\x6f\x3f\x70\x3f\x71\x3f\x72\x3f\x73\x3f\x74\x3f\x75\x3f\x76\x3f\x77\x3f\x78\x3f\x79\x3f\x7a\x3f\x7b\x3f\x7c\x3f\x7d\x3f\x7e\x3f\x7f\x3f\x80\x3f\x81\x3f\x82\x3f\x83\x3f\x84\x3f\x85\x3f\x86\x3f\x87\x3f\x88\x3f\x89\x3f\x8a\x3f\x8b\x3f\x8c\x3f\x8d\x3f\x8e\x3f\x8f\x3f\x90\x3f\x91\x3f\x92\x3f\x93\x3f\x94\x3f\x95\x3f\x96\x3f\x97\x3f\x98\x3f\x99\x3f\x9a\x3f\x9b\x3f\x9c\x3f\x9d\x3f\x9e\x3f\x9f\x3f\xa0\x3f\xa1\x3f\xa2\x3f\xa3\x3f\xa4\x3f\xa5\x3f\xa6\x3f\xa7\x3f\xa8\x3f\xa9\x3f\xaa\x3f\xab\x3f\xac\x3f\xad\x3f\xae\x3f\xaf\x3f\xb0\x3f\xb1\x3f\xb2\x3f\xb3\x3f\xb4\x3f\xb5\x3f\xb6\x3f\xb7\x3f\xb8\x3f\xb9\x3f\xba\x3f\xbb\x3f\xbc\x3f\xbd\x3f\xbe\x3f\xbf\x3f\xc0\x3f\xc1\x3f\xc2\x3f\xc3\x3f\xc4\x3f\xc5\x3f\xc6\x3f\xc7\x3f\xc8\x3f\xc9\x3f\xca\x3f\xcb\x3f\xcc\x3f\xcd\x3f\xce\x3f\xcf\x3f\xd0\x3f\xd1\x3f\xd2\x3f\xd3\x3f\xd4\x3f\xd5\x3f\xd6\x3f\xd7\x3f\xd8\x3f\xd9\x3f\xda\x3f\xdb\x3f\xdc\x3f\xdd\x3f\xde\x3f\xdf\x3f\xe0\x3f\xe1\x3f\xe2\x3f\xe3\x3f\xe4\x3f\xe5\x3f\xe6\x3f\xe7\x3f\xe8\x3f\xe9\x3f\xea\x3f\xeb\x3f\xec\x3f\xed\x00\x00", /* df00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xee\x3f\xef\x3f\xf0\x3f\xf1\x3f\xf2\x3f\xf3\x3f\xf4\x3f\xf5\x3f\xf6\x3f\xf7\x3f\xf8\x3f\xf9\x3f\xfa\x3f\xfb\x3f\xfc\x3f\xfd\x3f\xfe\x3f\xff\x40\x00\x40\x01\x40\x02\x40\x03\x40\x04\x40\x05\x40\x06\x40\x07\x40\x08\x40\x09\x40\x0a\x40\x0b\x40\x0c\x40\x0d\x40\x0e\x40\x0f\x40\x10\x40\x11\x40\x12\x40\x13\x40\x14\x40\x15\x40\x16\x40\x17\x40\x18\x40\x19\x40\x1a\x40\x1b\x40\x1c\x40\x1d\x40\x1e\x40\x1f\x40\x20\x40\x21\x40\x22\x40\x23\x40\x24\x40\x25\x40\x26\x40\x27\x40\x28\x40\x29\x40\x2a\x40\x2b\x40\x2c", /* df80 */ "\x40\x2d\x40\x2e\x40\x2f\x40\x30\x40\x31\x40\x32\x40\x33\x40\x34\x40\x35\x40\x36\x40\x37\x40\x38\x40\x39\x40\x3a\x40\x3b\x40\x3c\x40\x3d\x40\x3e\x40\x3f\x40\x40\x40\x41\x40\x42\x40\x43\x40\x44\x40\x45\x40\x46\x40\x47\x40\x48\x40\x49\x40\x4a\x40\x4b\x40\x4c\x40\x4d\x40\x4e\x40\x4f\x40\x50\x40\x51\x40\x52\x40\x53\x40\x54\x40\x55\x40\x57\x40\x58\x40\x59\x40\x5a\x40\x5b\x40\x5c\x40\x5d\x40\x5e\x40\x5f\x40\x60\x40\x61\x40\x62\x40\x63\x40\x64\x40\x65\x40\x66\x40\x67\x40\x68\x40\x69\x40\x6a\x40\x6b\x40\x6c\x40\x6d\x40\x6e\x40\x6f\x40\x70\x40\x71\x40\x72\x40\x73\x40\x74\x40\x75\x40\x76\x40\x77\x40\x78\x40\x79\x40\x7a\x40\x7b\x40\x7c\x40\x7d\x40\x7e\x40\x7f\x40\x80\x40\x81\x40\x82\x40\x83\x40\x84\x40\x85\x40\x86\x40\x87\x40\x88\x40\x89\x40\x8a\x40\x8b\x40\x8c\x40\x8d\x40\x8e\x40\x8f\x40\x90\x40\x91\x40\x92\x40\x93\x40\x94\x40\x95\x40\x96\x40\x97\x40\x98\x40\x99\x40\x9a\x40\x9b\x40\x9c\x40\x9d\x40\x9e\x40\x9f\x40\xa0\x40\xa1\x40\xa2\x40\xa3\x40\xa4\x40\xa5\x40\xa6\x40\xa7\x40\xa8\x40\xa9\x40\xaa\x40\xab\x40\xac\x00\x00", /* e000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xad\x40\xae\x40\xaf\x40\xb0\x40\xb1\x40\xb2\x40\xb3\x40\xb4\x40\xb5\x40\xb6\x40\xb7\x40\xb8\x40\xb9\x40\xba\x40\xbb\x40\xbc\x40\xbd\x40\xbe\x40\xbf\x40\xc0\x40\xc1\x40\xc2\x40\xc3\x40\xc4\x40\xc5\x40\xc6\x40\xc7\x40\xc8\x40\xc9\x40\xca\x40\xcb\x40\xcc\x40\xcd\x40\xce\x40\xcf\x40\xd0\x40\xd1\x40\xd2\x40\xd3\x40\xd4\x40\xd5\x40\xd6\x40\xd7\x40\xd8\x40\xd9\x40\xda\x40\xdb\x40\xdc\x40\xdd\x40\xde\x40\xdf\x40\xe0\x40\xe1\x40\xe2\x40\xe3\x40\xe4\x40\xe5\x40\xe6\x40\xe7\x40\xe8\x40\xe9\x40\xea\x40\xeb", /* e080 */ "\x40\xec\x40\xed\x40\xee\x40\xef\x40\xf0\x40\xf1\x40\xf2\x40\xf3\x40\xf4\x40\xf5\x40\xf6\x40\xf7\x40\xf8\x40\xf9\x40\xfa\x40\xfb\x40\xfc\x40\xfd\x40\xfe\x40\xff\x41\x00\x41\x01\x41\x02\x41\x03\x41\x04\x41\x05\x41\x06\x41\x07\x41\x08\x41\x09\x41\x0a\x41\x0b\x41\x0c\x41\x0d\x41\x0e\x41\x0f\x41\x10\x41\x11\x41\x12\x41\x13\x41\x14\x41\x15\x41\x16\x41\x17\x41\x18\x41\x19\x41\x1a\x41\x1b\x41\x1c\x41\x1d\x41\x1e\x41\x1f\x41\x20\x41\x21\x41\x22\x41\x23\x41\x24\x41\x25\x41\x26\x41\x27\x41\x28\x41\x29\x41\x2a\x41\x2b\x41\x2c\x41\x2d\x41\x2e\x41\x2f\x41\x30\x41\x31\x41\x32\x41\x33\x41\x34\x41\x35\x41\x36\x41\x37\x41\x38\x41\x39\x41\x3a\x41\x3b\x41\x3c\x41\x3d\x41\x3e\x41\x3f\x41\x40\x41\x41\x41\x42\x41\x43\x41\x44\x41\x45\x41\x46\x41\x47\x41\x48\x41\x49\x41\x4a\x41\x4b\x41\x4c\x41\x4d\x41\x4e\x41\x4f\x41\x50\x41\x51\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x41\x58\x41\x59\x41\x5a\x41\x5b\x41\x5c\x41\x5d\x41\x5e\x41\x60\x41\x61\x41\x62\x41\x63\x41\x64\x41\x65\x41\x66\x41\x67\x41\x68\x41\x69\x41\x6a\x41\x6b\x00\x00", /* e100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x6c\x41\x6d\x41\x6e\x41\x6f\x41\x70\x41\x71\x41\x72\x41\x73\x41\x74\x41\x75\x41\x76\x41\x77\x41\x78\x41\x79\x41\x7a\x41\x7b\x41\x7c\x41\x7d\x41\x7e\x41\x7f\x41\x80\x41\x81\x41\x82\x41\x83\x41\x84\x41\x85\x41\x86\x41\x87\x41\x88\x41\x89\x41\x8a\x41\x8b\x41\x8c\x41\x8d\x41\x8e\x41\x8f\x41\x90\x41\x91\x41\x92\x41\x93\x41\x94\x41\x95\x41\x96\x41\x97\x41\x98\x41\x99\x41\x9a\x41\x9b\x41\x9c\x41\x9d\x41\x9e\x41\x9f\x41\xa0\x41\xa1\x41\xa2\x41\xa3\x41\xa4\x41\xa5\x41\xa6\x41\xa7\x41\xa8\x41\xa9\x41\xaa", /* e180 */ "\x41\xab\x41\xac\x41\xad\x41\xae\x41\xaf\x41\xb0\x41\xb1\x41\xb2\x41\xb3\x41\xb4\x41\xb5\x41\xb6\x41\xb7\x41\xb8\x41\xb9\x41\xba\x41\xbb\x41\xbc\x41\xbd\x41\xbe\x41\xbf\x41\xc0\x41\xc1\x41\xc2\x41\xc3\x41\xc4\x41\xc5\x41\xc6\x41\xc7\x41\xc8\x41\xc9\x41\xca\x41\xcb\x41\xcc\x41\xcd\x41\xce\x41\xcf\x41\xd0\x41\xd1\x41\xd2\x41\xd3\x41\xd4\x41\xd5\x41\xd6\x41\xd7\x41\xd8\x41\xd9\x41\xda\x41\xdb\x41\xdc\x41\xdd\x41\xde\x41\xdf\x41\xe0\x41\xe1\x41\xe2\x41\xe3\x41\xe4\x41\xe5\x41\xe6\x41\xe7\x41\xe8\x41\xe9\x41\xea\x41\xeb\x41\xec\x41\xed\x41\xee\x41\xef\x41\xf0\x41\xf1\x41\xf2\x41\xf3\x41\xf4\x41\xf5\x41\xf6\x41\xf7\x41\xf8\x41\xf9\x41\xfa\x41\xfb\x41\xfc\x41\xfd\x41\xfe\x41\xff\x42\x00\x42\x01\x42\x02\x42\x03\x42\x04\x42\x05\x42\x06\x42\x07\x42\x08\x42\x09\x42\x0a\x42\x0b\x42\x0c\x42\x0d\x42\x0e\x42\x0f\x42\x10\x42\x11\x42\x12\x42\x13\x42\x14\x42\x15\x42\x16\x42\x17\x42\x18\x42\x19\x42\x1a\x42\x1b\x42\x1c\x42\x1d\x42\x1e\x42\x1f\x42\x20\x42\x21\x42\x22\x42\x23\x42\x24\x42\x25\x42\x26\x42\x27\x42\x28\x42\x29\x00\x00", /* e200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x2a\x42\x2b\x42\x2c\x42\x2d\x42\x2e\x42\x2f\x42\x30\x42\x31\x42\x32\x42\x33\x42\x34\x42\x35\x42\x36\x42\x37\x42\x38\x42\x39\x42\x3a\x42\x3b\x42\x3c\x42\x3d\x42\x3e\x42\x3f\x42\x40\x42\x41\x42\x42\x42\x43\x42\x44\x42\x45\x42\x46\x42\x47\x42\x48\x42\x49\x42\x4a\x42\x4b\x42\x4c\x42\x4d\x42\x4e\x42\x4f\x42\x50\x42\x51\x42\x52\x42\x53\x42\x54\x42\x55\x42\x56\x42\x57\x42\x58\x42\x59\x42\x5a\x42\x5b\x42\x5c\x42\x5d\x42\x5e\x42\x5f\x42\x60\x42\x61\x42\x62\x42\x63\x42\x64\x42\x65\x42\x66\x42\x67\x42\x68", /* e280 */ "\x42\x69\x42\x6a\x42\x6b\x42\x6c\x42\x6d\x42\x6e\x42\x6f\x42\x70\x42\x71\x42\x72\x42\x73\x42\x74\x42\x75\x42\x76\x42\x77\x42\x78\x42\x79\x42\x7a\x42\x7b\x42\x7c\x42\x7d\x42\x7e\x42\x7f\x42\x80\x42\x81\x42\x82\x42\x83\x42\x84\x42\x85\x42\x86\x42\x87\x42\x88\x42\x89\x42\x8a\x42\x8b\x42\x8c\x42\x8d\x42\x8e\x42\x8f\x42\x90\x42\x91\x42\x92\x42\x93\x42\x94\x42\x95\x42\x96\x42\x97\x42\x98\x42\x99\x42\x9a\x42\x9b\x42\x9c\x42\x9d\x42\x9e\x42\x9f\x42\xa0\x42\xa1\x42\xa2\x42\xa3\x42\xa4\x42\xa5\x42\xa6\x42\xa7\x42\xa8\x42\xa9\x42\xaa\x42\xab\x42\xac\x42\xad\x42\xae\x42\xaf\x42\xb0\x42\xb1\x42\xb2\x42\xb3\x42\xb4\x42\xb5\x42\xb6\x42\xb7\x42\xb8\x42\xb9\x42\xba\x42\xbb\x42\xbc\x42\xbd\x42\xbe\x42\xbf\x42\xc0\x42\xc1\x42\xc2\x42\xc3\x42\xc4\x42\xc5\x42\xc6\x42\xc7\x42\xc8\x42\xc9\x42\xca\x42\xcb\x42\xcc\x42\xcd\x42\xce\x42\xcf\x42\xd0\x42\xd1\x42\xd2\x42\xd3\x42\xd4\x42\xd5\x42\xd6\x42\xd7\x42\xd8\x42\xd9\x42\xda\x42\xdb\x42\xdc\x42\xdd\x42\xde\x42\xdf\x42\xe0\x42\xe1\x42\xe2\x42\xe3\x42\xe4\x42\xe5\x42\xe6\x42\xe7\x00\x00", /* e300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\xe8\x42\xe9\x42\xea\x42\xeb\x42\xec\x42\xed\x42\xee\x42\xef\x42\xf0\x42\xf1\x42\xf2\x42\xf3\x42\xf4\x42\xf5\x42\xf6\x42\xf7\x42\xf8\x42\xf9\x42\xfa\x42\xfb\x42\xfc\x42\xfd\x42\xfe\x42\xff\x43\x00\x43\x01\x43\x02\x43\x03\x43\x04\x43\x05\x43\x06\x43\x07\x43\x08\x43\x09\x43\x0a\x43\x0b\x43\x0c\x43\x0d\x43\x0e\x43\x0f\x43\x10\x43\x11\x43\x12\x43\x13\x43\x14\x43\x15\x43\x16\x43\x17\x43\x18\x43\x19\x43\x1a\x43\x1b\x43\x1c\x43\x1d\x43\x1e\x43\x1f\x43\x20\x43\x21\x43\x22\x43\x23\x43\x24\x43\x25\x43\x26", /* e380 */ "\x43\x27\x43\x28\x43\x29\x43\x2a\x43\x2b\x43\x2c\x43\x2d\x43\x2e\x43\x2f\x43\x30\x43\x31\x43\x32\x43\x33\x43\x34\x43\x35\x43\x36\x43\x38\x43\x39\x43\x3a\x43\x3b\x43\x3c\x43\x3d\x43\x3e\x43\x3f\x43\x40\x43\x41\x43\x42\x43\x43\x43\x44\x43\x45\x43\x46\x43\x47\x43\x48\x43\x49\x43\x4a\x43\x4b\x43\x4c\x43\x4d\x43\x4e\x43\x4f\x43\x50\x43\x51\x43\x52\x43\x53\x43\x54\x43\x55\x43\x56\x43\x57\x43\x58\x43\x59\x43\x5a\x43\x5b\x43\x5c\x43\x5d\x43\x5e\x43\x5f\x43\x60\x43\x61\x43\x62\x43\x63\x43\x64\x43\x65\x43\x66\x43\x67\x43\x68\x43\x69\x43\x6a\x43\x6b\x43\x6c\x43\x6d\x43\x6e\x43\x6f\x43\x70\x43\x71\x43\x72\x43\x73\x43\x74\x43\x75\x43\x76\x43\x77\x43\x78\x43\x79\x43\x7a\x43\x7b\x43\x7c\x43\x7d\x43\x7e\x43\x7f\x43\x80\x43\x81\x43\x82\x43\x83\x43\x84\x43\x85\x43\x86\x43\x87\x43\x88\x43\x89\x43\x8a\x43\x8b\x43\x8c\x43\x8d\x43\x8e\x43\x8f\x43\x90\x43\x91\x43\x92\x43\x93\x43\x94\x43\x95\x43\x96\x43\x97\x43\x98\x43\x99\x43\x9a\x43\x9b\x43\x9c\x43\x9d\x43\x9e\x43\x9f\x43\xa0\x43\xa1\x43\xa2\x43\xa3\x43\xa4\x43\xa5\x43\xa6\x00\x00", /* e400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xa7\x43\xa8\x43\xa9\x43\xaa\x43\xab\x43\xad\x43\xae\x43\xaf\x43\xb0\x43\xb2\x43\xb3\x43\xb4\x43\xb5\x43\xb6\x43\xb7\x43\xb8\x43\xb9\x43\xba\x43\xbb\x43\xbc\x43\xbd\x43\xbe\x43\xbf\x43\xc0\x43\xc1\x43\xc2\x43\xc3\x43\xc4\x43\xc5\x43\xc6\x43\xc7\x43\xc8\x43\xc9\x43\xca\x43\xcb\x43\xcc\x43\xcd\x43\xce\x43\xcf\x43\xd0\x43\xd1\x43\xd2\x43\xd3\x43\xd4\x43\xd5\x43\xd6\x43\xd7\x43\xd8\x43\xd9\x43\xda\x43\xdb\x43\xdc\x43\xde\x43\xdf\x43\xe0\x43\xe1\x43\xe2\x43\xe3\x43\xe4\x43\xe5\x43\xe6\x43\xe7\x43\xe8", /* e480 */ "\x43\xe9\x43\xea\x43\xeb\x43\xec\x43\xed\x43\xee\x43\xef\x43\xf0\x43\xf1\x43\xf2\x43\xf3\x43\xf4\x43\xf5\x43\xf6\x43\xf7\x43\xf8\x43\xf9\x43\xfa\x43\xfb\x43\xfc\x43\xfd\x43\xfe\x43\xff\x44\x00\x44\x01\x44\x02\x44\x03\x44\x04\x44\x05\x44\x06\x44\x07\x44\x08\x44\x09\x44\x0a\x44\x0b\x44\x0c\x44\x0d\x44\x0e\x44\x0f\x44\x10\x44\x11\x44\x12\x44\x13\x44\x14\x44\x15\x44\x16\x44\x17\x44\x18\x44\x19\x44\x1a\x44\x1b\x44\x1c\x44\x1d\x44\x1e\x44\x1f\x44\x20\x44\x21\x44\x22\x44\x23\x44\x24\x44\x25\x44\x26\x44\x27\x44\x28\x44\x29\x44\x2a\x44\x2b\x44\x2c\x44\x2d\x44\x2e\x44\x2f\x44\x30\x44\x31\x44\x32\x44\x33\x44\x34\x44\x35\x44\x36\x44\x37\x44\x38\x44\x39\x44\x3a\x44\x3b\x44\x3c\x44\x3d\x44\x3e\x44\x3f\x44\x40\x44\x41\x44\x42\x44\x43\x44\x44\x44\x45\x44\x46\x44\x47\x44\x48\x44\x49\x44\x4a\x44\x4b\x44\x4c\x44\x4d\x44\x4e\x44\x4f\x44\x50\x44\x51\x44\x52\x44\x53\x44\x54\x44\x55\x44\x56\x44\x57\x44\x58\x44\x59\x44\x5a\x44\x5b\x44\x5c\x44\x5d\x44\x5e\x44\x5f\x44\x60\x44\x61\x44\x62\x44\x63\x44\x64\x44\x65\x44\x66\x44\x67\x00\x00", /* e500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x68\x44\x69\x44\x6a\x44\x6b\x44\x6c\x44\x6d\x44\x6e\x44\x6f\x44\x70\x44\x71\x44\x72\x44\x73\x44\x74\x44\x75\x44\x76\x44\x77\x44\x78\x44\x79\x44\x7a\x44\x7b\x44\x7c\x44\x7d\x44\x7e\x44\x7f\x44\x80\x44\x81\x44\x82\x44\x83\x44\x84\x44\x85\x44\x86\x44\x87\x44\x88\x44\x89\x44\x8a\x44\x8b\x44\x8c\x44\x8d\x44\x8e\x44\x8f\x44\x90\x44\x91\x44\x92\x44\x93\x44\x94\x44\x95\x44\x96\x44\x97\x44\x98\x44\x99\x44\x9a\x44\x9b\x44\x9c\x44\x9d\x44\x9e\x44\x9f\x44\xa0\x44\xa1\x44\xa2\x44\xa3\x44\xa4\x44\xa5\x44\xa6", /* e580 */ "\x44\xa7\x44\xa8\x44\xa9\x44\xaa\x44\xab\x44\xac\x44\xad\x44\xae\x44\xaf\x44\xb0\x44\xb1\x44\xb2\x44\xb3\x44\xb4\x44\xb5\x44\xb6\x44\xb7\x44\xb8\x44\xb9\x44\xba\x44\xbb\x44\xbc\x44\xbd\x44\xbe\x44\xbf\x44\xc0\x44\xc1\x44\xc2\x44\xc3\x44\xc4\x44\xc5\x44\xc6\x44\xc7\x44\xc8\x44\xc9\x44\xca\x44\xcb\x44\xcc\x44\xcd\x44\xce\x44\xcf\x44\xd0\x44\xd1\x44\xd2\x44\xd3\x44\xd4\x44\xd5\x44\xd7\x44\xd8\x44\xd9\x44\xda\x44\xdb\x44\xdc\x44\xdd\x44\xde\x44\xdf\x44\xe0\x44\xe1\x44\xe2\x44\xe3\x44\xe4\x44\xe5\x44\xe6\x44\xe7\x44\xe8\x44\xe9\x44\xea\x44\xeb\x44\xec\x44\xed\x44\xee\x44\xef\x44\xf0\x44\xf1\x44\xf2\x44\xf3\x44\xf4\x44\xf5\x44\xf6\x44\xf7\x44\xf8\x44\xf9\x44\xfa\x44\xfb\x44\xfc\x44\xfd\x44\xfe\x44\xff\x45\x00\x45\x01\x45\x02\x45\x03\x45\x04\x45\x05\x45\x06\x45\x07\x45\x08\x45\x09\x45\x0a\x45\x0b\x45\x0c\x45\x0d\x45\x0e\x45\x0f\x45\x10\x45\x11\x45\x12\x45\x13\x45\x14\x45\x15\x45\x16\x45\x17\x45\x18\x45\x19\x45\x1a\x45\x1b\x45\x1c\x45\x1d\x45\x1e\x45\x1f\x45\x20\x45\x21\x45\x22\x45\x23\x45\x24\x45\x25\x45\x26\x00\x00", /* e600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x27\x45\x28\x45\x29\x45\x2a\x45\x2b\x45\x2c\x45\x2d\x45\x2e\x45\x2f\x45\x30\x45\x31\x45\x32\x45\x33\x45\x34\x45\x35\x45\x36\x45\x37\x45\x38\x45\x39\x45\x3a\x45\x3b\x45\x3c\x45\x3d\x45\x3e\x45\x3f\x45\x40\x45\x41\x45\x42\x45\x43\x45\x44\x45\x45\x45\x46\x45\x47\x45\x48\x45\x49\x45\x4a\x45\x4b\x45\x4c\x45\x4d\x45\x4e\x45\x4f\x45\x50\x45\x51\x45\x52\x45\x53\x45\x54\x45\x55\x45\x56\x45\x57\x45\x58\x45\x59\x45\x5a\x45\x5b\x45\x5c\x45\x5d\x45\x5e\x45\x5f\x45\x60\x45\x61\x45\x62\x45\x63\x45\x64\x45\x65", /* e680 */ "\x45\x66\x45\x67\x45\x68\x45\x69\x45\x6a\x45\x6b\x45\x6c\x45\x6d\x45\x6e\x45\x6f\x45\x70\x45\x71\x45\x72\x45\x73\x45\x74\x45\x75\x45\x76\x45\x77\x45\x78\x45\x79\x45\x7a\x45\x7b\x45\x7c\x45\x7d\x45\x7e\x45\x7f\x45\x80\x45\x81\x45\x82\x45\x83\x45\x84\x45\x85\x45\x86\x45\x87\x45\x88\x45\x89\x45\x8a\x45\x8b\x45\x8c\x45\x8d\x45\x8e\x45\x8f\x45\x90\x45\x91\x45\x92\x45\x93\x45\x94\x45\x95\x45\x96\x45\x97\x45\x98\x45\x99\x45\x9a\x45\x9b\x45\x9c\x45\x9d\x45\x9e\x45\x9f\x45\xa0\x45\xa1\x45\xa2\x45\xa3\x45\xa4\x45\xa5\x45\xa6\x45\xa7\x45\xa8\x45\xa9\x45\xaa\x45\xab\x45\xac\x45\xad\x45\xae\x45\xaf\x45\xb0\x45\xb1\x45\xb2\x45\xb3\x45\xb4\x45\xb5\x45\xb6\x45\xb7\x45\xb8\x45\xb9\x45\xba\x45\xbb\x45\xbc\x45\xbd\x45\xbe\x45\xbf\x45\xc0\x45\xc1\x45\xc2\x45\xc3\x45\xc4\x45\xc5\x45\xc6\x45\xc7\x45\xc8\x45\xc9\x45\xca\x45\xcb\x45\xcc\x45\xcd\x45\xce\x45\xcf\x45\xd0\x45\xd1\x45\xd2\x45\xd3\x45\xd4\x45\xd5\x45\xd6\x45\xd7\x45\xd8\x45\xd9\x45\xda\x45\xdb\x45\xdc\x45\xdd\x45\xde\x45\xdf\x45\xe0\x45\xe1\x45\xe2\x45\xe3\x45\xe4\x00\x00", /* e700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\xe5\x45\xe6\x45\xe7\x45\xe8\x45\xe9\x45\xea\x45\xeb\x45\xec\x45\xed\x45\xee\x45\xef\x45\xf0\x45\xf1\x45\xf2\x45\xf3\x45\xf4\x45\xf5\x45\xf6\x45\xf7\x45\xf8\x45\xf9\x45\xfa\x45\xfb\x45\xfc\x45\xfd\x45\xfe\x45\xff\x46\x00\x46\x01\x46\x02\x46\x03\x46\x04\x46\x05\x46\x06\x46\x07\x46\x08\x46\x09\x46\x0a\x46\x0b\x46\x0c\x46\x0d\x46\x0e\x46\x0f\x46\x10\x46\x11\x46\x12\x46\x13\x46\x14\x46\x15\x46\x16\x46\x17\x46\x18\x46\x19\x46\x1a\x46\x1b\x46\x1c\x46\x1d\x46\x1e\x46\x1f\x46\x20\x46\x21\x46\x22\x46\x23", /* e780 */ "\x46\x24\x46\x25\x46\x26\x46\x27\x46\x28\x46\x29\x46\x2a\x46\x2b\x46\x2c\x46\x2d\x46\x2e\x46\x2f\x46\x30\x46\x31\x46\x32\x46\x33\x46\x34\x46\x35\x46\x36\x46\x37\x46\x38\x46\x39\x46\x3a\x46\x3b\x46\x3c\x46\x3d\x46\x3e\x46\x3f\x46\x40\x46\x41\x46\x42\x46\x43\x46\x44\x46\x45\x46\x46\x46\x47\x46\x48\x46\x49\x46\x4a\x46\x4b\x46\x4d\x46\x4e\x46\x4f\x46\x50\x46\x51\x46\x52\x46\x53\x46\x54\x46\x55\x46\x56\x46\x57\x46\x58\x46\x59\x46\x5a\x46\x5b\x46\x5c\x46\x5d\x46\x5e\x46\x5f\x46\x60\x46\x62\x46\x63\x46\x64\x46\x65\x46\x66\x46\x67\x46\x68\x46\x69\x46\x6a\x46\x6b\x46\x6c\x46\x6d\x46\x6e\x46\x6f\x46\x70\x46\x71\x46\x72\x46\x73\x46\x74\x46\x75\x46\x76\x46\x77\x46\x78\x46\x79\x46\x7a\x46\x7b\x46\x7c\x46\x7d\x46\x7e\x46\x7f\x46\x80\x46\x81\x46\x82\x46\x83\x46\x84\x46\x85\x46\x86\x46\x87\x46\x88\x46\x89\x46\x8a\x46\x8b\x46\x8c\x46\x8d\x46\x8e\x46\x8f\x46\x90\x46\x91\x46\x92\x46\x93\x46\x94\x46\x95\x46\x96\x46\x97\x46\x98\x46\x99\x46\x9a\x46\x9b\x46\x9c\x46\x9d\x46\x9e\x46\x9f\x46\xa0\x46\xa1\x46\xa2\x46\xa3\x46\xa4\x00\x00", /* e800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xa5\x46\xa6\x46\xa7\x46\xa8\x46\xa9\x46\xaa\x46\xab\x46\xac\x46\xad\x46\xae\x46\xaf\x46\xb0\x46\xb1\x46\xb2\x46\xb3\x46\xb4\x46\xb5\x46\xb6\x46\xb7\x46\xb8\x46\xb9\x46\xba\x46\xbb\x46\xbc\x46\xbd\x46\xbe\x46\xbf\x46\xc0\x46\xc1\x46\xc2\x46\xc3\x46\xc4\x46\xc5\x46\xc6\x46\xc7\x46\xc8\x46\xc9\x46\xca\x46\xcb\x46\xcc\x46\xcd\x46\xce\x46\xcf\x46\xd0\x46\xd1\x46\xd2\x46\xd3\x46\xd4\x46\xd5\x46\xd6\x46\xd7\x46\xd8\x46\xd9\x46\xda\x46\xdb\x46\xdc\x46\xdd\x46\xde\x46\xdf\x46\xe0\x46\xe1\x46\xe2\x46\xe3", /* e880 */ "\x46\xe4\x46\xe5\x46\xe6\x46\xe7\x46\xe8\x46\xe9\x46\xea\x46\xeb\x46\xec\x46\xed\x46\xee\x46\xef\x46\xf0\x46\xf1\x46\xf2\x46\xf3\x46\xf4\x46\xf5\x46\xf6\x46\xf7\x46\xf8\x46\xf9\x46\xfa\x46\xfb\x46\xfc\x46\xfd\x46\xfe\x46\xff\x47\x00\x47\x01\x47\x02\x47\x03\x47\x04\x47\x05\x47\x06\x47\x07\x47\x08\x47\x09\x47\x0a\x47\x0b\x47\x0c\x47\x0d\x47\x0e\x47\x0f\x47\x10\x47\x11\x47\x12\x47\x13\x47\x14\x47\x15\x47\x16\x47\x17\x47\x18\x47\x19\x47\x1a\x47\x1b\x47\x1c\x47\x1d\x47\x1e\x47\x1f\x47\x20\x47\x21\x47\x22\x47\x24\x47\x25\x47\x26\x47\x27\x47\x28\x47\x2a\x47\x2b\x47\x2c\x47\x2d\x47\x2e\x47\x2f\x47\x30\x47\x31\x47\x32\x47\x33\x47\x34\x47\x35\x47\x36\x47\x37\x47\x38\x47\x39\x47\x3a\x47\x3b\x47\x3c\x47\x3d\x47\x3e\x47\x3f\x47\x40\x47\x41\x47\x42\x47\x43\x47\x44\x47\x45\x47\x46\x47\x47\x47\x48\x47\x49\x47\x4a\x47\x4b\x47\x4c\x47\x4d\x47\x4e\x47\x4f\x47\x50\x47\x51\x47\x52\x47\x53\x47\x54\x47\x55\x47\x56\x47\x57\x47\x58\x47\x59\x47\x5a\x47\x5b\x47\x5c\x47\x5d\x47\x5e\x47\x5f\x47\x60\x47\x61\x47\x62\x47\x63\x47\x64\x00\x00", /* e900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x65\x47\x66\x47\x67\x47\x68\x47\x69\x47\x6a\x47\x6b\x47\x6c\x47\x6d\x47\x6e\x47\x6f\x47\x70\x47\x71\x47\x72\x47\x73\x47\x74\x47\x75\x47\x76\x47\x77\x47\x78\x47\x79\x47\x7a\x47\x7b\x47\x7d\x47\x7e\x47\x7f\x47\x80\x47\x81\x47\x82\x47\x83\x47\x84\x47\x85\x47\x86\x47\x87\x47\x88\x47\x89\x47\x8a\x47\x8b\x47\x8c\x47\x8e\x47\x8f\x47\x90\x47\x91\x47\x92\x47\x93\x47\x94\x47\x95\x47\x96\x47\x97\x47\x98\x47\x99\x47\x9a\x47\x9b\x47\x9c\x47\x9d\x47\x9e\x47\x9f\x47\xa0\x47\xa1\x47\xa2\x47\xa3\x47\xa4\x47\xa5", /* e980 */ "\x47\xa6\x47\xa7\x47\xa8\x47\xa9\x47\xaa\x47\xab\x47\xac\x47\xad\x47\xae\x47\xaf\x47\xb0\x47\xb1\x47\xb2\x47\xb3\x47\xb4\x47\xb5\x47\xb6\x47\xb7\x47\xb8\x47\xb9\x47\xba\x47\xbb\x47\xbc\x47\xbd\x47\xbe\x47\xbf\x47\xc0\x47\xc1\x47\xc2\x47\xc3\x47\xc4\x47\xc5\x47\xc6\x47\xc7\x47\xc8\x47\xc9\x47\xca\x47\xcb\x47\xcc\x47\xcd\x47\xce\x47\xcf\x47\xd0\x47\xd1\x47\xd2\x47\xd3\x47\xd4\x47\xd5\x47\xd6\x47\xd7\x47\xd8\x47\xd9\x47\xda\x47\xdb\x47\xdc\x47\xdd\x47\xde\x47\xdf\x47\xe0\x47\xe1\x47\xe2\x47\xe3\x47\xe4\x47\xe5\x47\xe6\x47\xe7\x47\xe8\x47\xe9\x47\xea\x47\xeb\x47\xec\x47\xed\x47\xee\x47\xef\x47\xf0\x47\xf1\x47\xf2\x47\xf3\x47\xf4\x47\xf5\x47\xf6\x47\xf7\x47\xf8\x47\xf9\x47\xfa\x47\xfb\x47\xfc\x47\xfd\x47\xfe\x47\xff\x48\x00\x48\x01\x48\x02\x48\x03\x48\x04\x48\x05\x48\x06\x48\x07\x48\x08\x48\x09\x48\x0a\x48\x0b\x48\x0c\x48\x0d\x48\x0e\x48\x0f\x48\x10\x48\x11\x48\x12\x48\x13\x48\x14\x48\x15\x48\x16\x48\x17\x48\x18\x48\x19\x48\x1a\x48\x1b\x48\x1c\x48\x1d\x48\x1e\x48\x1f\x48\x20\x48\x21\x48\x22\x48\x23\x48\x24\x00\x00", /* ea00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x25\x48\x26\x48\x27\x48\x28\x48\x29\x48\x2a\x48\x2b\x48\x2c\x48\x2d\x48\x2e\x48\x2f\x48\x30\x48\x31\x48\x32\x48\x33\x48\x34\x48\x35\x48\x36\x48\x37\x48\x38\x48\x39\x48\x3a\x48\x3b\x48\x3c\x48\x3d\x48\x3e\x48\x3f\x48\x40\x48\x41\x48\x42\x48\x43\x48\x44\x48\x45\x48\x46\x48\x47\x48\x48\x48\x49\x48\x4a\x48\x4b\x48\x4c\x48\x4d\x48\x4e\x48\x4f\x48\x50\x48\x51\x48\x52\x48\x53\x48\x54\x48\x55\x48\x56\x48\x57\x48\x58\x48\x59\x48\x5a\x48\x5b\x48\x5c\x48\x5d\x48\x5e\x48\x5f\x48\x60\x48\x61\x48\x62\x48\x63", /* ea80 */ "\x48\x64\x48\x65\x48\x66\x48\x67\x48\x68\x48\x69\x48\x6a\x48\x6b\x48\x6c\x48\x6d\x48\x6e\x48\x6f\x48\x70\x48\x71\x48\x72\x48\x73\x48\x74\x48\x75\x48\x76\x48\x77\x48\x78\x48\x79\x48\x7a\x48\x7b\x48\x7c\x48\x7d\x48\x7e\x48\x7f\x48\x80\x48\x81\x48\x82\x48\x83\x48\x84\x48\x85\x48\x86\x48\x87\x48\x88\x48\x89\x48\x8a\x48\x8b\x48\x8c\x48\x8d\x48\x8e\x48\x8f\x48\x90\x48\x91\x48\x92\x48\x93\x48\x94\x48\x95\x48\x96\x48\x97\x48\x98\x48\x99\x48\x9a\x48\x9b\x48\x9c\x48\x9d\x48\x9e\x48\x9f\x48\xa0\x48\xa1\x48\xa2\x48\xa3\x48\xa4\x48\xa5\x48\xa6\x48\xa7\x48\xa8\x48\xa9\x48\xaa\x48\xab\x48\xac\x48\xad\x48\xae\x48\xaf\x48\xb0\x48\xb1\x48\xb2\x48\xb3\x48\xb4\x48\xb5\x48\xb6\x48\xb7\x48\xb8\x48\xb9\x48\xba\x48\xbb\x48\xbc\x48\xbd\x48\xbe\x48\xbf\x48\xc0\x48\xc1\x48\xc2\x48\xc3\x48\xc4\x48\xc5\x48\xc6\x48\xc7\x48\xc8\x48\xc9\x48\xca\x48\xcb\x48\xcc\x48\xcd\x48\xce\x48\xcf\x48\xd0\x48\xd1\x48\xd2\x48\xd3\x48\xd4\x48\xd5\x48\xd6\x48\xd7\x48\xd8\x48\xd9\x48\xda\x48\xdb\x48\xdc\x48\xdd\x48\xde\x48\xdf\x48\xe0\x48\xe1\x48\xe2\x00\x00", /* eb00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\xe3\x48\xe4\x48\xe5\x48\xe6\x48\xe7\x48\xe8\x48\xe9\x48\xea\x48\xeb\x48\xec\x48\xed\x48\xee\x48\xef\x48\xf0\x48\xf1\x48\xf2\x48\xf3\x48\xf4\x48\xf5\x48\xf6\x48\xf7\x48\xf8\x48\xf9\x48\xfa\x48\xfb\x48\xfc\x48\xfd\x48\xfe\x48\xff\x49\x00\x49\x01\x49\x02\x49\x03\x49\x04\x49\x05\x49\x06\x49\x07\x49\x08\x49\x09\x49\x0a\x49\x0b\x49\x0c\x49\x0d\x49\x0e\x49\x0f\x49\x10\x49\x11\x49\x12\x49\x13\x49\x14\x49\x15\x49\x16\x49\x17\x49\x18\x49\x19\x49\x1a\x49\x1b\x49\x1c\x49\x1d\x49\x1e\x49\x1f\x49\x20\x49\x21", /* eb80 */ "\x49\x22\x49\x23\x49\x24\x49\x25\x49\x26\x49\x27\x49\x28\x49\x29\x49\x2a\x49\x2b\x49\x2c\x49\x2d\x49\x2e\x49\x2f\x49\x30\x49\x31\x49\x32\x49\x33\x49\x34\x49\x35\x49\x36\x49\x37\x49\x38\x49\x39\x49\x3a\x49\x3b\x49\x3c\x49\x3d\x49\x3e\x49\x3f\x49\x40\x49\x41\x49\x42\x49\x43\x49\x44\x49\x45\x49\x46\x49\x48\x49\x49\x49\x4a\x49\x4b\x49\x4c\x49\x4d\x49\x4e\x49\x4f\x49\x50\x49\x51\x49\x52\x49\x53\x49\x54\x49\x55\x49\x56\x49\x57\x49\x58\x49\x59\x49\x5a\x49\x5b\x49\x5c\x49\x5d\x49\x5e\x49\x5f\x49\x60\x49\x61\x49\x62\x49\x63\x49\x64\x49\x65\x49\x66\x49\x67\x49\x68\x49\x69\x49\x6a\x49\x6b\x49\x6c\x49\x6d\x49\x6e\x49\x6f\x49\x70\x49\x71\x49\x72\x49\x73\x49\x74\x49\x75\x49\x76\x49\x77\x49\x78\x49\x79\x49\x7b\x49\x7c\x49\x7e\x49\x7f\x49\x80\x49\x81\x49\x84\x49\x87\x49\x88\x49\x89\x49\x8a\x49\x8b\x49\x8c\x49\x8d\x49\x8e\x49\x8f\x49\x90\x49\x91\x49\x92\x49\x93\x49\x94\x49\x95\x49\x96\x49\x97\x49\x98\x49\x99\x49\x9a\x49\x9c\x49\x9d\x49\x9e\x49\xa0\x49\xa1\x49\xa2\x49\xa3\x49\xa4\x49\xa5\x49\xa6\x49\xa7\x49\xa8\x49\xa9\x00\x00", /* ec00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\xaa\x49\xab\x49\xac\x49\xad\x49\xae\x49\xaf\x49\xb0\x49\xb1\x49\xb2\x49\xb3\x49\xb4\x49\xb5\x49\xb8\x49\xb9\x49\xba\x49\xbb\x49\xbc\x49\xbd\x49\xbe\x49\xbf\x49\xc0\x49\xc1\x49\xc2\x49\xc3\x49\xc4\x49\xc5\x49\xc6\x49\xc7\x49\xc8\x49\xc9\x49\xca\x49\xcb\x49\xcc\x49\xcd\x49\xce\x49\xcf\x49\xd0\x49\xd1\x49\xd2\x49\xd3\x49\xd4\x49\xd5\x49\xd6\x49\xd7\x49\xd8\x49\xd9\x49\xda\x49\xdb\x49\xdc\x49\xdd\x49\xde\x49\xdf\x49\xe0\x49\xe1\x49\xe2\x49\xe3\x49\xe4\x49\xe5\x49\xe6\x49\xe7\x49\xe8\x49\xe9\x49\xea", /* ec80 */ "\x49\xeb\x49\xec\x49\xed\x49\xee\x49\xef\x49\xf0\x49\xf1\x49\xf2\x49\xf3\x49\xf4\x49\xf5\x49\xf6\x49\xf7\x49\xf8\x49\xf9\x49\xfa\x49\xfb\x49\xfc\x49\xfd\x49\xfe\x49\xff\x4a\x00\x4a\x01\x4a\x02\x4a\x03\x4a\x04\x4a\x05\x4a\x06\x4a\x07\x4a\x08\x4a\x09\x4a\x0a\x4a\x0b\x4a\x0c\x4a\x0d\x4a\x0e\x4a\x0f\x4a\x10\x4a\x11\x4a\x12\x4a\x13\x4a\x14\x4a\x15\x4a\x16\x4a\x17\x4a\x18\x4a\x19\x4a\x1a\x4a\x1b\x4a\x1c\x4a\x1d\x4a\x1e\x4a\x1f\x4a\x20\x4a\x21\x4a\x22\x4a\x23\x4a\x24\x4a\x25\x4a\x26\x4a\x27\x4a\x28\x4a\x29\x4a\x2a\x4a\x2b\x4a\x2c\x4a\x2d\x4a\x2e\x4a\x2f\x4a\x30\x4a\x31\x4a\x32\x4a\x33\x4a\x34\x4a\x35\x4a\x36\x4a\x37\x4a\x38\x4a\x39\x4a\x3a\x4a\x3b\x4a\x3c\x4a\x3d\x4a\x3e\x4a\x3f\x4a\x40\x4a\x41\x4a\x42\x4a\x43\x4a\x44\x4a\x45\x4a\x46\x4a\x47\x4a\x48\x4a\x49\x4a\x4a\x4a\x4b\x4a\x4c\x4a\x4d\x4a\x4e\x4a\x4f\x4a\x50\x4a\x51\x4a\x52\x4a\x53\x4a\x54\x4a\x55\x4a\x56\x4a\x57\x4a\x58\x4a\x59\x4a\x5a\x4a\x5b\x4a\x5c\x4a\x5d\x4a\x5e\x4a\x5f\x4a\x60\x4a\x61\x4a\x62\x4a\x63\x4a\x64\x4a\x65\x4a\x66\x4a\x67\x4a\x68\x4a\x69\x00\x00", /* ed00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6a\x4a\x6b\x4a\x6c\x4a\x6d\x4a\x6e\x4a\x6f\x4a\x70\x4a\x71\x4a\x72\x4a\x73\x4a\x74\x4a\x75\x4a\x76\x4a\x77\x4a\x78\x4a\x79\x4a\x7a\x4a\x7b\x4a\x7c\x4a\x7d\x4a\x7e\x4a\x7f\x4a\x80\x4a\x81\x4a\x82\x4a\x83\x4a\x84\x4a\x85\x4a\x86\x4a\x87\x4a\x88\x4a\x89\x4a\x8a\x4a\x8b\x4a\x8c\x4a\x8d\x4a\x8e\x4a\x8f\x4a\x90\x4a\x91\x4a\x92\x4a\x93\x4a\x94\x4a\x95\x4a\x96\x4a\x97\x4a\x98\x4a\x99\x4a\x9a\x4a\x9b\x4a\x9c\x4a\x9d\x4a\x9e\x4a\x9f\x4a\xa0\x4a\xa1\x4a\xa2\x4a\xa3\x4a\xa4\x4a\xa5\x4a\xa6\x4a\xa7\x4a\xa8", /* ed80 */ "\x4a\xa9\x4a\xaa\x4a\xab\x4a\xac\x4a\xad\x4a\xae\x4a\xaf\x4a\xb0\x4a\xb1\x4a\xb2\x4a\xb3\x4a\xb4\x4a\xb5\x4a\xb6\x4a\xb7\x4a\xb8\x4a\xb9\x4a\xba\x4a\xbb\x4a\xbc\x4a\xbd\x4a\xbe\x4a\xbf\x4a\xc0\x4a\xc1\x4a\xc2\x4a\xc3\x4a\xc4\x4a\xc5\x4a\xc6\x4a\xc7\x4a\xc8\x4a\xc9\x4a\xca\x4a\xcb\x4a\xcc\x4a\xcd\x4a\xce\x4a\xcf\x4a\xd0\x4a\xd1\x4a\xd2\x4a\xd3\x4a\xd4\x4a\xd5\x4a\xd6\x4a\xd7\x4a\xd8\x4a\xd9\x4a\xda\x4a\xdb\x4a\xdc\x4a\xdd\x4a\xde\x4a\xdf\x4a\xe0\x4a\xe1\x4a\xe2\x4a\xe3\x4a\xe4\x4a\xe5\x4a\xe6\x4a\xe7\x4a\xe8\x4a\xe9\x4a\xea\x4a\xeb\x4a\xec\x4a\xed\x4a\xee\x4a\xef\x4a\xf0\x4a\xf1\x4a\xf2\x4a\xf3\x4a\xf4\x4a\xf5\x4a\xf6\x4a\xf7\x4a\xf8\x4a\xf9\x4a\xfa\x4a\xfb\x4a\xfc\x4a\xfd\x4a\xfe\x4a\xff\x4b\x00\x4b\x01\x4b\x02\x4b\x03\x4b\x04\x4b\x05\x4b\x06\x4b\x07\x4b\x08\x4b\x09\x4b\x0a\x4b\x0b\x4b\x0c\x4b\x0d\x4b\x0e\x4b\x0f\x4b\x10\x4b\x11\x4b\x12\x4b\x13\x4b\x14\x4b\x15\x4b\x16\x4b\x17\x4b\x18\x4b\x19\x4b\x1a\x4b\x1b\x4b\x1c\x4b\x1d\x4b\x1e\x4b\x1f\x4b\x20\x4b\x21\x4b\x22\x4b\x23\x4b\x24\x4b\x25\x4b\x26\x4b\x27\x00\x00", /* ee00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x28\x4b\x29\x4b\x2a\x4b\x2b\x4b\x2c\x4b\x2d\x4b\x2e\x4b\x2f\x4b\x30\x4b\x31\x4b\x32\x4b\x33\x4b\x34\x4b\x35\x4b\x36\x4b\x37\x4b\x38\x4b\x39\x4b\x3a\x4b\x3b\x4b\x3c\x4b\x3d\x4b\x3e\x4b\x3f\x4b\x40\x4b\x41\x4b\x42\x4b\x43\x4b\x44\x4b\x45\x4b\x46\x4b\x47\x4b\x48\x4b\x49\x4b\x4a\x4b\x4b\x4b\x4c\x4b\x4d\x4b\x4e\x4b\x4f\x4b\x50\x4b\x51\x4b\x52\x4b\x53\x4b\x54\x4b\x55\x4b\x56\x4b\x57\x4b\x58\x4b\x59\x4b\x5a\x4b\x5b\x4b\x5c\x4b\x5d\x4b\x5e\x4b\x5f\x4b\x60\x4b\x61\x4b\x62\x4b\x63\x4b\x64\x4b\x65\x4b\x66", /* ee80 */ "\x4b\x67\x4b\x68\x4b\x69\x4b\x6a\x4b\x6b\x4b\x6c\x4b\x6d\x4b\x6e\x4b\x6f\x4b\x70\x4b\x71\x4b\x72\x4b\x73\x4b\x74\x4b\x75\x4b\x76\x4b\x77\x4b\x78\x4b\x79\x4b\x7a\x4b\x7b\x4b\x7c\x4b\x7d\x4b\x7e\x4b\x7f\x4b\x80\x4b\x81\x4b\x82\x4b\x83\x4b\x84\x4b\x85\x4b\x86\x4b\x87\x4b\x88\x4b\x89\x4b\x8a\x4b\x8b\x4b\x8c\x4b\x8d\x4b\x8e\x4b\x8f\x4b\x90\x4b\x91\x4b\x92\x4b\x93\x4b\x94\x4b\x95\x4b\x96\x4b\x97\x4b\x98\x4b\x99\x4b\x9a\x4b\x9b\x4b\x9c\x4b\x9d\x4b\x9e\x4b\x9f\x4b\xa0\x4b\xa1\x4b\xa2\x4b\xa3\x4b\xa4\x4b\xa5\x4b\xa6\x4b\xa7\x4b\xa8\x4b\xa9\x4b\xaa\x4b\xab\x4b\xac\x4b\xad\x4b\xae\x4b\xaf\x4b\xb0\x4b\xb1\x4b\xb2\x4b\xb3\x4b\xb4\x4b\xb5\x4b\xb6\x4b\xb7\x4b\xb8\x4b\xb9\x4b\xba\x4b\xbb\x4b\xbc\x4b\xbd\x4b\xbe\x4b\xbf\x4b\xc0\x4b\xc1\x4b\xc2\x4b\xc3\x4b\xc4\x4b\xc5\x4b\xc6\x4b\xc7\x4b\xc8\x4b\xc9\x4b\xca\x4b\xcb\x4b\xcc\x4b\xcd\x4b\xce\x4b\xcf\x4b\xd0\x4b\xd1\x4b\xd2\x4b\xd3\x4b\xd4\x4b\xd5\x4b\xd6\x4b\xd7\x4b\xd8\x4b\xd9\x4b\xda\x4b\xdb\x4b\xdc\x4b\xdd\x4b\xde\x4b\xdf\x4b\xe0\x4b\xe1\x4b\xe2\x4b\xe3\x4b\xe4\x4b\xe5\x00\x00", /* ef00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xe6\x4b\xe7\x4b\xe8\x4b\xe9\x4b\xea\x4b\xeb\x4b\xec\x4b\xed\x4b\xee\x4b\xef\x4b\xf0\x4b\xf1\x4b\xf2\x4b\xf3\x4b\xf4\x4b\xf5\x4b\xf6\x4b\xf7\x4b\xf8\x4b\xf9\x4b\xfa\x4b\xfb\x4b\xfc\x4b\xfd\x4b\xfe\x4b\xff\x4c\x00\x4c\x01\x4c\x02\x4c\x03\x4c\x04\x4c\x05\x4c\x06\x4c\x07\x4c\x08\x4c\x09\x4c\x0a\x4c\x0b\x4c\x0c\x4c\x0d\x4c\x0e\x4c\x0f\x4c\x10\x4c\x11\x4c\x12\x4c\x13\x4c\x14\x4c\x15\x4c\x16\x4c\x17\x4c\x18\x4c\x19\x4c\x1a\x4c\x1b\x4c\x1c\x4c\x1d\x4c\x1e\x4c\x1f\x4c\x20\x4c\x21\x4c\x22\x4c\x23\x4c\x24", /* ef80 */ "\x4c\x25\x4c\x26\x4c\x27\x4c\x28\x4c\x29\x4c\x2a\x4c\x2b\x4c\x2c\x4c\x2d\x4c\x2e\x4c\x2f\x4c\x30\x4c\x31\x4c\x32\x4c\x33\x4c\x34\x4c\x35\x4c\x36\x4c\x37\x4c\x38\x4c\x39\x4c\x3a\x4c\x3b\x4c\x3c\x4c\x3d\x4c\x3e\x4c\x3f\x4c\x40\x4c\x41\x4c\x42\x4c\x43\x4c\x44\x4c\x45\x4c\x46\x4c\x47\x4c\x48\x4c\x49\x4c\x4a\x4c\x4b\x4c\x4c\x4c\x4d\x4c\x4e\x4c\x4f\x4c\x50\x4c\x51\x4c\x52\x4c\x53\x4c\x54\x4c\x55\x4c\x56\x4c\x57\x4c\x58\x4c\x59\x4c\x5a\x4c\x5b\x4c\x5c\x4c\x5d\x4c\x5e\x4c\x5f\x4c\x60\x4c\x61\x4c\x62\x4c\x63\x4c\x64\x4c\x65\x4c\x66\x4c\x67\x4c\x68\x4c\x69\x4c\x6a\x4c\x6b\x4c\x6c\x4c\x6d\x4c\x6e\x4c\x6f\x4c\x70\x4c\x71\x4c\x72\x4c\x73\x4c\x74\x4c\x75\x4c\x76\x4c\x78\x4c\x79\x4c\x7a\x4c\x7b\x4c\x7c\x4c\x7d\x4c\x7e\x4c\x7f\x4c\x80\x4c\x81\x4c\x82\x4c\x83\x4c\x84\x4c\x85\x4c\x86\x4c\x87\x4c\x88\x4c\x89\x4c\x8a\x4c\x8b\x4c\x8c\x4c\x8d\x4c\x8e\x4c\x8f\x4c\x90\x4c\x91\x4c\x92\x4c\x93\x4c\x94\x4c\x95\x4c\x96\x4c\x97\x4c\x98\x4c\x99\x4c\x9a\x4c\x9b\x4c\x9c\x4c\x9d\x4c\x9e\x4c\xa4\x4c\xa5\x4c\xa6\x4c\xa7\x4c\xa8\x4c\xa9\x00\x00", /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xaa\x4c\xab\x4c\xac\x4c\xad\x4c\xae\x4c\xaf\x4c\xb0\x4c\xb1\x4c\xb2\x4c\xb3\x4c\xb4\x4c\xb5\x4c\xb6\x4c\xb7\x4c\xb8\x4c\xb9\x4c\xba\x4c\xbb\x4c\xbc\x4c\xbd\x4c\xbe\x4c\xbf\x4c\xc0\x4c\xc1\x4c\xc2\x4c\xc3\x4c\xc4\x4c\xc5\x4c\xc6\x4c\xc7\x4c\xc8\x4c\xc9\x4c\xca\x4c\xcb\x4c\xcc\x4c\xcd\x4c\xce\x4c\xcf\x4c\xd0\x4c\xd1\x4c\xd2\x4c\xd3\x4c\xd4\x4c\xd5\x4c\xd6\x4c\xd7\x4c\xd8\x4c\xd9\x4c\xda\x4c\xdb\x4c\xdc\x4c\xdd\x4c\xde\x4c\xdf\x4c\xe0\x4c\xe1\x4c\xe2\x4c\xe3\x4c\xe4\x4c\xe5\x4c\xe6\x4c\xe7\x4c\xe8", /* f680 */ "\x4c\xe9\x4c\xea\x4c\xeb\x4c\xec\x4c\xed\x4c\xee\x4c\xef\x4c\xf0\x4c\xf1\x4c\xf2\x4c\xf3\x4c\xf4\x4c\xf5\x4c\xf6\x4c\xf7\x4c\xf8\x4c\xf9\x4c\xfa\x4c\xfb\x4c\xfc\x4c\xfd\x4c\xfe\x4c\xff\x4d\x00\x4d\x01\x4d\x02\x4d\x03\x4d\x04\x4d\x05\x4d\x06\x4d\x07\x4d\x08\x4d\x09\x4d\x0a\x4d\x0b\x4d\x0c\x4d\x0d\x4d\x0e\x4d\x0f\x4d\x10\x4d\x11\x4d\x12\x4d\x1a\x4d\x1b\x4d\x1c\x4d\x1d\x4d\x1e\x4d\x1f\x4d\x20\x4d\x21\x4d\x22\x4d\x23\x4d\x24\x4d\x25\x4d\x26\x4d\x27\x4d\x28\x4d\x29\x4d\x2a\x4d\x2b\x4d\x2c\x4d\x2d\x4d\x2e\x4d\x2f\x4d\x30\x4d\x31\x4d\x32\x4d\x33\x4d\x34\x4d\x35\x4d\x36\x4d\x37\x4d\x38\x4d\x39\x4d\x3a\x4d\x3b\x4d\x3c\x4d\x3d\x4d\x3e\x4d\x3f\x4d\x40\x4d\x41\x4d\x42\x4d\x43\x4d\x44\x4d\x45\x4d\x46\x4d\x47\x4d\x48\x4d\x49\x4d\x4a\x4d\x4b\x4d\x4c\x4d\x4d\x4d\x4e\x4d\x4f\x4d\x50\x4d\x51\x4d\x52\x4d\x53\x4d\x54\x4d\x55\x4d\x56\x4d\x57\x4d\x58\x4d\x59\x4d\x5a\x4d\x5b\x4d\x5c\x4d\x5d\x4d\x5e\x4d\x5f\x4d\x60\x4d\x61\x4d\x62\x4d\x63\x4d\x64\x4d\x65\x4d\x66\x4d\x67\x4d\x68\x4d\x69\x4d\x6a\x4d\x6b\x4d\x6c\x4d\x6d\x4d\x6e\x00\x00", /* f700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x6f\x4d\x70\x4d\x71\x4d\x72\x4d\x73\x4d\x74\x4d\x75\x4d\x76\x4d\x77\x4d\x78\x4d\x79\x4d\x7a\x4d\x7b\x4d\x7c\x4d\x7d\x4d\x7e\x4d\x7f\x4d\x80\x4d\x81\x4d\x82\x4d\x83\x4d\x84\x4d\x85\x4d\x86\x4d\x87\x4d\x88\x4d\x89\x4d\x8a\x4d\x8b\x4d\x8c\x4d\x8d\x4d\x8e\x4d\x8f\x4d\x90\x4d\x91\x4d\x92\x4d\x93\x4d\x94\x4d\x95\x4d\x96\x4d\x97\x4d\x98\x4d\x99\x4d\x9a\x4d\x9b\x4d\x9c\x4d\x9d\x4d\x9e\x4d\x9f\x4d\xa0\x4d\xa1\x4d\xa2\x4d\xa3\x4d\xa4\x4d\xa5\x4d\xa6\x4d\xa7\x4d\xa8\x4d\xa9\x4d\xaa\x4d\xab\x4d\xac\x4d\xad", /* f780 */ "\x4d\xaf\x4d\xb0\x4d\xb1\x4d\xb2\x4d\xb3\x4d\xb4\x4d\xb5\x4d\xb6\x4d\xb7\x4d\xb8\x4d\xb9\x4d\xba\x4d\xbb\x4d\xbc\x4d\xbd\x4d\xbe\x4d\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x56\xfb\x57\xfb\x58\xfb\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x7a\xfb\x7b\xfb\x7c\xfb\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x8e", /* f880 */ "\xfb\x8f\xfb\x90\xfb\x91\xfb\x92\xfb\x93\xfb\x94\xfb\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xaa\xfb\xab\xfb\xac\xfb\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xd3\xfb\xd4\xfb\xd5\xfb\xd6\xfb\xd7\xfb\xd8\xfb\xd9\xfb\xda\xfb\xdb\xfb\xdc\xfb\xdd\xfb\xde\xfb\xdf\xfb\xe0\xfb\xe1\xfb\xe2\xfb\xe3\xfb\xe4\xfb\xe5\xfb\xe6\xfb\xe7\xfb\xe8\xfb\xe9\xfb\xea\xfb\xeb\xfb\xec\xfb\xed\xfb\xee\xfb\xef\xfb\xf0\xfb\xf1\xfb\xf2\xfb\xf3\xfb\xf4\xfb\xf5\xfb\xf6\xfb\xf7\xfb\xf8\xfb\xf9\xfb\xfa\xfb\xfb\xfb\xfc\xfb\xfd\xfb\xfe\xfb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x89\xfe\x8a\xfe\x8b\xfe\x8c\xfe\x8d\xfe\x8e\xfe\x8f\xfe\x90\xfe\x91\xfe\x92\x00\x00\x00\x00\xfe\x95\xfe\x96\xfe\x97\xfe\x98\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x9d\xfe\x9e\xfe\x9f\xfe\xa0\xfe\xa1\xfe\xa2\xfe\xa3\xfe\xa4\xfe\xa5\xfe\xa6\xfe\xa7\xfe\xa8\xfe\xa9\xfe\xaa\x00\x00\x00\x00\xfe\xad\xfe\xae\xfe\xaf\xfe\xb0\xfe\xb1\xfe\xb2\xfe\xb3\xfe\xb4\xfe\xb5\xfe\xb6\xfe\xb7\x00\x00", /* fc00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xc9\xfe\xca\xfe\xcb\xfe\xcc\xfe\xcd\xfe\xce\xfe\xcf\xfe\xd0\xfe\xd1\xfe\xd2\xfe\xd3\xfe\xd4\xfe\xd5\xfe\xd6\xfe\xd7\xfe\xd8\xfe\xd9\xfe\xda\xfe\xdb\xfe\xdc\xfe\xdd\xfe\xde\xfe\xdf\xfe\xe0\xfe\xe1\xfe\xe2\xfe\xe3\xfe\xe4\xfe\xe5\xfe\xe6\xfe\xe7\xfe\xe8\xfe\xe9\xfe\xea\xfe\xeb\xfe\xec\xfe\xed\xfe\xee\xfe\xef\xfe\xf0\xfe\xf1\xfe\xf2\xfe\xf3\xfe\xf4\x00\x00\x00\x00", /* fc80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfb\xfe\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x8d\xe7\x8e\xe7\x8f\xe7\x90\xe7\x91\xe7\x92\xe7\x93\xe7\x94\xe7\x95\xe7\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ NULL, /* ff80 */ NULL } }, { NULL } }; #endif /*]*/ /* Code page aliases. */ typedef struct { char *alias; char *canon; } cpalias_t; #if defined(X3270_DBCS) /*[*/ cpalias_t cpaliases16[] = { { "chinese-gb18030", "cp1388" }, { "cp1027", "cp930" }, /* historical error */ { "cp290", "cp930" }, /* historical error */ { "cp936", "cp935" }, /* historical error */ { "japanese-1027", "cp930" }, /* historical error */ { "japanese-290", "cp930" }, /* historical error */ { "japanese-kana", "cp930" }, { "japanese-latin", "cp930" }, /* 930 and 939 DBCS are the same */ { "simplified-chinese", "cp935" }, { "traditional-chinese", "cp937" }, { NULL, NULL } }; #endif /*]*/ static uni16_t *cur_uni16 = NULL; void charset_list_dbcs(void) { #if defined(X3270_DBCS) /*[*/ int i; int j; char *sep = ""; printf("DBCS host code pages (with aliases):\n"); for (i = 0; uni16[i].name != NULL; i++) { bool any = false; char *asep = " ("; printf("%s%s", sep, uni16[i].name); for (j = 0; cpaliases16[j].alias != NULL; j++) { if (!strcmp(cpaliases16[j].canon, uni16[i].name)) { printf("%s%s", asep, cpaliases16[j].alias); asep = ", "; any = true; } } if (any) printf(")"); sep = ", "; } printf("\n"); #endif /*]*/ } /* * Translate a single DBCS EBCDIC character to Unicode. * * If EUO_BLANK_UNDEF is set, undisplayable characters are returned as * wide spaces (U+3000); otherwise they are returned as 0. */ ucs4_t ebcdic_dbcs_to_unicode(ebc_t c, unsigned flags) { int row, col; int ix; if (cur_uni16 == NULL || c < 0x100) return (flags & EUO_BLANK_UNDEF)? 0x3000: 0; if (c == 0x4040) return 0x3000; row = (c >> 7) & 0x1ff; if (cur_uni16->ebc2u[row] == NULL) return (flags & EUO_BLANK_UNDEF)? 0x3000: 0; col = (c & 0x7f) * 2; ix = ((cur_uni16->ebc2u[row][col] & 0xff) << 8) | (cur_uni16->ebc2u[row][col + 1] & 0xff); if (ix) return ix; else return (flags & EUO_BLANK_UNDEF)? 0x3000: 0; } /* * Map a UCS-4 character to a DBCS EBCDIC character. * Returns 0 for failure, nonzero for success. */ ebc_t unicode_to_ebcdic_dbcs(ucs4_t u) { int row, col; int ix; if (cur_uni16 == NULL || !u) return 0; if (u == 0x3000) return 0x4040; row = (u >> 7) & 0x1ff; if (cur_uni16->u2ebc[row] == NULL) return 0; col = (u & 0x7f) * 2; ix = ((cur_uni16->u2ebc[row][col] & 0xff) << 8) | (cur_uni16->u2ebc[row][col + 1] & 0xff); return ix; } /* * Set the EBCDIC-to-Unicode DBCS translation table. * Returns true for success, false for failure. */ bool set_uni_dbcs(const char *csname, const char **codepage) { #if defined(X3270_DBCS) /*[*/ int i; const char *realname = csname; bool rc = false; /* Search for an alias. */ for (i = 0; cpaliases16[i].alias != NULL; i++) { if (!strcasecmp(csname, cpaliases16[i].alias)) { realname = cpaliases16[i].canon; break; } } /* Search for a match. */ for (i = 0; uni16[i].name != NULL; i++) { if (!strcasecmp(realname, uni16[i].name)) { cur_uni16 = &uni16[i]; *codepage = uni16[i].codepage; rc = true; break; } } /* * If this fails (which we sometimes do on purpose), forget any * old setting. */ if (!rc) { cur_uni16 = NULL; } return rc; #else /*][*/ return false; #endif /*]*/ } suite3270-3.6/Common/utf8.c0000664000076500007650000001703513221577163013464 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * utf8.c * 3270 Terminal Emulator * UTF-8 conversions */ #include "globals.h" #include "utf8.h" char *locale_codeset = NULL; bool is_utf8 = false; #if defined(_WIN32) /*[*/ #define STR_HELPER(s) #s #define CPNAME(x) "CP" STR_HELPER(x) #endif /*]*/ /* * Save the codeset from the locale, and set globals based on known values. */ void set_codeset(char *codeset_name, bool force_utf8) { /* * s3270 and ws3270 have a '-utf8' option and a utf8 resource to force * UTF-8 mode. tcl3270 always forces UTF-8 mode, because that's what the * TCL library uses. */ if (force_utf8) { is_utf8 = true; /* Force the name. */ codeset_name = "UTF-8"; } /* * We're in UTF-8 mode if the codeset looks like 'UTF8', or on Windows, * if it is codepage 65001. */ is_utf8 |= (!strcasecmp(codeset_name, "utf-8") || !strcasecmp(codeset_name, "utf8") || !strcasecmp(codeset_name, "utf_8") #if defined(_WIN32) /*[*/ || !strcasecmp(codeset_name, CPNAME(CP_UTF8)) #endif /*]*/ ); #if defined(_WIN32) /*[*/ if (is_utf8) { /* Force the name, in case they specified it numerically. */ codeset_name = "UTF-8"; } #endif /*]*/ Replace(locale_codeset, NewString(codeset_name)); } /* * Return the local codeset. */ const char * get_codeset(void) { return locale_codeset; } /* * Convert from UCS-4 to UTF-8. * Returns: * >0: length of converted character * -1: invalid UCS-4 */ int unicode_to_utf8(ucs4_t ucs4, char *utf8) { if (ucs4 & 0x80000000) { return -1; } if (ucs4 <= 0x0000007f) { utf8[0] = ucs4 & 0x7f; /* 7 bits */ return 1; } else if (ucs4 <= 0x000007ff) { utf8[0] = 0xc0 | ((ucs4 >> 6) & 0x1f); /* upper 5 bits */ utf8[1] = 0x80 | (ucs4 & 0x3f); /* lower 6 bits */ return 2; } else if (ucs4 <= 0x0000ffff) { utf8[0] = 0xe0 | ((ucs4 >> 12) & 0x0f); /* upper 4 bits */ utf8[1] = 0x80 | ((ucs4 >> 6) & 0x3f); /* next 6 bits */ utf8[2] = 0x80 | (ucs4 & 0x3f); /* last 6 bits */ return 3; } else if (ucs4 <= 0x001fffff) { utf8[0] = 0xf0 | ((ucs4 >> 18) & 0x07); /* upper 3 bits */ utf8[1] = 0x80 | ((ucs4 >> 12) & 0x3f); /* next 6 bits */ utf8[2] = 0x80 | ((ucs4 >> 6) & 0x3f); /* next 6 bits */ utf8[3] = 0x80 | (ucs4 & 0x3f); /* last 6 bits */ return 4; } else if (ucs4 <= 0x03ffffff) { utf8[0] = 0xf8 | ((ucs4 >> 24) & 0x03); /* upper 2 bits */ utf8[1] = 0x80 | ((ucs4 >> 18) & 0x3f); /* next 6 bits */ utf8[2] = 0x80 | ((ucs4 >> 12) & 0x3f); /* next 6 bits */ utf8[3] = 0x80 | ((ucs4 >> 6) & 0x3f); /* next 6 bits */ utf8[4] = 0x80 | (ucs4 & 0x3f); /* last 6 bits */ return 5; } else { utf8[0] = 0xfc | ((ucs4 >> 30) & 0x01); /* upper 1 bit */ utf8[1] = 0x80 | ((ucs4 >> 24) & 0x3f); /* next 6 bits */ utf8[2] = 0x80 | ((ucs4 >> 18) & 0x3f); /* next 6 bits */ utf8[3] = 0x80 | ((ucs4 >> 12) & 0x3f); /* next 6 bits */ utf8[4] = 0x80 | ((ucs4 >> 6) & 0x3f); /* next 6 bits */ utf8[5] = 0x80 | (ucs4 & 0x3f); /* last 6 bits */ return 6; } } /* * Convert at most 'len' bytes from a UTF-8 string to one UCS-4 character. * Returns: * >0: Number of characters consumed. * 0: Incomplete sequence. * -1: Invalid sequence. * -2: Illegal (too-long) encoding. * -3: Invalid lead byte. * * An invalid sequence can be either improperly composed, or using the wrong * encoding length (often used to get past spam filters and such). */ int utf8_to_unicode(const char *utf8, int len, ucs4_t *ucs4) { /* No input is by definition incomplete. */ if (!len) { return 0; } /* See if it's ASCII-7. */ if ((utf8[0] & 0xff) < 0x80) { *ucs4 = utf8[0] & 0x7f; return 1; } /* Now check for specific UTF-8 leading bytes. */ if ((utf8[0] & 0xe0) == 0xc0) { /* 110xxxxx 10xxxxxx * 0x00000080-0x000007ff */ if (len < 2) { return 0; } if ((utf8[1] & 0xc0) != 0x80) { return -1; } *ucs4 = ((utf8[0] << 6) & 0x7c0) | (utf8[1] & 0x03f); if (*ucs4 < 0x00000080) { return -1; } return 2; } if ((utf8[0] & 0xf0) == 0xe0) { /* 1110xxxx 10xxxxxx 10xxxxxx * 0x00000800-0x0000ffff */ if (len < 3) { return 0; } if (((utf8[1] & 0xc0) != 0x80) || ((utf8[2] & 0xc0) != 0x80)) { return -1; } *ucs4 = ((utf8[0] << 12) & 0xf000) | ((utf8[1] << 6) & 0x0fc0) | ((utf8[2]) & 0x003f); if (*ucs4 < 0x00000800) { return -2; } return 3; } if ((utf8[0] & 0xf8) == 0xf0) { /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * 0x00010000-0x001fffff */ if (len < 4) { return 0; } if (((utf8[1] & 0xc0) != 0x80) || ((utf8[2] & 0xc0) != 0x80) || ((utf8[3] & 0xc0) != 0x80)) { return -1; } *ucs4 = ((utf8[0] << 18) & 0x1c0000) | ((utf8[1] << 12) & 0x03f000) | ((utf8[2] << 6) & 0x000fc0) | ((utf8[3]) & 0x00003f); if (*ucs4 < 0x00010000) { return -2; } return 4; } if ((utf8[0] & 0xfc) == 0xf8) { /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * 0x00200000-0x03ffffff */ if (len < 5) { return 0; } if (((utf8[1] & 0xc0) != 0x80) || ((utf8[2] & 0xc0) != 0x80) || ((utf8[3] & 0xc0) != 0x80) || ((utf8[4] & 0xc0) != 0x80)) { return -1; } *ucs4 = ((utf8[0] << 24) & 0x3000000) | ((utf8[1] << 18) & 0x0fc0000) | ((utf8[2] << 12) & 0x003f000) | ((utf8[3] << 6) & 0x0000fc0) | ((utf8[4]) & 0x000003f); if (*ucs4 < 0x00200000) { return -2; } return 5; } if ((utf8[0] & 0xfe) == 0xfc) { /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * 0x04000000-0x7fffffff */ if (len < 6) { return 0; } if (((utf8[1] & 0xc0) != 0x80) || ((utf8[2] & 0xc0) != 0x80) || ((utf8[3] & 0xc0) != 0x80) || ((utf8[4] & 0xc0) != 0x80) || ((utf8[5] & 0xc0) != 0x80)) { return -1; } *ucs4 = ((utf8[0] << 30) & 0x40000000) | ((utf8[1] << 24) & 0x3f000000) | ((utf8[2] << 18) & 0x00fc0000) | ((utf8[3] << 12) & 0x0003f000) | ((utf8[4] << 6) & 0x00000fc0) | ((utf8[5]) & 0x0000003f); if (*ucs4 < 0x04000000) { return -2; } return 6; } return -3; } suite3270-3.6/Common/util.c0000664000076500007650000004016213221577163013550 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * util.c * Utility functions for x3270/c3270/s3270/tcl3270 */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include #endif /*]*/ #include #include #include "resources.h" #include "charset.h" #include "lazya.h" #include "product.h" #include "unicodec.h" #include "varbuf.h" #include "utils.h" #define my_isspace(c) isspace((unsigned char)c) /** * printf-like interface to Warning(). * Displays a warning message, given a printf format. * * @param[in] fmt printf format */ void xs_warning(const char *fmt, ...) { va_list args; char *r; va_start(args, fmt); r = xs_vbuffer(fmt, args); va_end(args); Warning(r); Free(r); } /** * printf-like interface to Error(). * Displays an error message, and exits, given a printf format. * * @param[in] fmt printf format */ void xs_error(const char *fmt, ...) { va_list args; char *r; va_start(args, fmt); r = xs_vbuffer(fmt, args); va_end(args); Error(r); Free(r); } /* Prettyprinter for strings with unprintable data. */ void fcatv(FILE *f, char *s) { char c; while ((c = *s++)) { switch (c) { case '\n': (void) fprintf(f, "\\n"); break; case '\t': (void) fprintf(f, "\\t"); break; case '\b': (void) fprintf(f, "\\b"); break; default: if ((c & 0x7f) < ' ') { (void) fprintf(f, "\\%03o", c & 0xff); } else { fputc(c, f); } break; } } } /* String version of fcatv. */ char * scatv(const char *s, char *buf, size_t len) { char c; varbuf_t r; vb_init(&r); while ((c = *s++)) { /* Expand this character. */ switch (c) { case '\n': vb_appends(&r, "\\n"); break; case '\t': vb_appends(&r, "\\t"); break; case '\b': vb_appends(&r, "\\b"); break; default: if ((c & 0x7f) < ' ') { vb_appendf(&r, "\\%03o", c & 0xff); } else { vb_append(&r, &c, 1); } break; } } /* Copy what fits. */ (void) snprintf(buf, len, "%s", vb_buf(&r)? vb_buf(&r): ""); vb_free(&r); return buf; } /* * Definition resource splitter, for resources of the repeating form: * left: right\n * * Can be called iteratively to parse a list. * Returns 1 for success, 0 for EOF, -1 for error. * * Note: Modifies the input string. */ int split_dresource(char **st, char **left, char **right) { char *s = *st; char *t; bool quote; /* Skip leading white space. */ while (my_isspace(*s)) { s++; } /* If nothing left, EOF. */ if (!*s) { return 0; } /* There must be a left-hand side. */ if (*s == ':') { return -1; } /* Scan until an unquoted colon is found. */ *left = s; for (; *s && *s != ':' && *s != '\n'; s++) { if (*s == '\\' && *(s+1) == ':') { s++; } } if (*s != ':') { return -1; } /* Stip white space before the colon. */ for (t = s-1; my_isspace(*t); t--) { *t = '\0'; } /* Terminate the left-hand side. */ *(s++) = '\0'; /* Skip white space after the colon. */ while (*s != '\n' && my_isspace(*s)) { s++; } /* There must be a right-hand side. */ if (!*s || *s == '\n') { return -1; } /* Scan until an unquoted newline is found. */ *right = s; quote = false; for (; *s; s++) { if (*s == '\\' && *(s+1) == '"') { s++; } else if (*s == '"') { quote = !quote; } else if (!quote && *s == '\n') { break; } } /* Strip white space before the newline. */ if (*s) { t = s; *st = s+1; } else { t = s-1; *st = s; } while (my_isspace(*t)) { *t-- = '\0'; } /* Done. */ return 1; } /* * Split a DBCS resource into its parts. * Returns the number of parts found: * -1 error (empty sub-field) * 0 nothing found * 1 one and just one thing found * 2 two things found * 3 more than two things found */ int split_dbcs_resource(const char *value, char sep, char **part1, char **part2) { int n_parts = 0; const char *s = value; const char *f_start = NULL; /* start of sub-field */ const char *f_end = NULL; /* end of sub-field */ char c; char **rp; *part1 = NULL; *part2 = NULL; for( ; ; ) { c = *s; if (c == sep || c == '\0') { if (f_start == NULL) { return -1; } if (f_end == NULL) { f_end = s; } if (f_end == f_start) { if (c == sep) { if (*part1) { Free(*part1); *part1 = NULL; } if (*part2) { Free(*part2); *part2 = NULL; } return -1; } else { return n_parts; } } switch (n_parts) { case 0: rp = part1; break; case 1: rp = part2; break; default: return 3; } *rp = Malloc(f_end - f_start + 1); strncpy(*rp, f_start, f_end - f_start); (*rp)[f_end - f_start] = '\0'; f_end = NULL; f_start = NULL; n_parts++; if (c == '\0') { return n_parts; } } else if (isspace((unsigned char)c)) { if (f_end == NULL) { f_end = s; } } else { if (f_start == NULL) { f_start = s; } f_end = NULL; } s++; } } /* * List resource splitter, for lists of elements speparated by newlines. * * Can be called iteratively. * Returns 1 for success, 0 for EOF, -1 for error. */ int split_lresource(char **st, char **value) { char *s = *st; char *t; bool quote; /* Skip leading white space. */ while (my_isspace(*s)) { s++; } /* If nothing left, EOF. */ if (!*s) { return 0; } /* Save starting point. */ *value = s; /* Scan until an unquoted newline is found. */ quote = false; for (; *s; s++) { if (*s == '\\' && *(s+1) == '"') { s++; } else if (*s == '"') { quote = !quote; } else if (!quote && *s == '\n') { break; } } /* Strip white space before the newline. */ if (*s) { t = s; *st = s+1; } else { t = s-1; *st = s; } while (my_isspace(*t)) { *t-- = '\0'; } /* Done. */ return 1; } const char * get_message(const char *key) { char *r; if ((r = get_resource(lazyaf("%s.%s", ResMessage, key))) != NULL) { return r; } else { return lazyaf("[missing \"%s\" message]", key); } } static char * ex_getenv(const char *name, unsigned long flags, int *up) { if (!strcasecmp(name, "TIMESTAMP")) { /* YYYYMMDDHHMMSSUUUUUU */ struct timeval tv; time_t t; /* on Windows, timeval.tv_sec is a long */ struct tm *tm; if (gettimeofday(&tv, NULL) < 0) { return NewString("?"); } t = tv.tv_sec; tm = localtime(&t); return xs_buffer("%04u%02u%02u%02u%02u%02u%06u", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (unsigned)tv.tv_usec); } else if (!strcasecmp(name, "UNIQUE")) { ++*up; if (*up == 0) { return xs_buffer("%u", (unsigned)getpid()); } else { return xs_buffer("%u-%u", (unsigned)getpid(), *up); } } else { return getenv(name); } } /* Variable and tilde substitution functions. */ static char * var_subst(const char *s, unsigned long flags) { const char *t; enum { VS_BASE, VS_QUOTE, VS_DOLLAR, VS_BRACE, VS_VN, VS_VNB, VS_EOF } state; char c; size_t o_len; char *ob; char *o; const char *vn_start; int u = -1; # define LBR '{' # define RBR '}' if (strchr(s, '$') == NULL) { return NewString(s); } for (;;) { t = s; state = VS_BASE; vn_start = NULL; o_len = strlen(t) + 1; ob = Malloc(o_len); o = ob; while (state != VS_EOF) { c = *t; switch (state) { case VS_BASE: if (c == '\\') { state = VS_QUOTE; } else if (c == '$') { state = VS_DOLLAR; } else { *o++ = c; } break; case VS_QUOTE: if (c == '$') { *o++ = c; o_len--; } else { *o++ = '\\'; *o++ = c; } state = VS_BASE; break; case VS_DOLLAR: if (c == LBR) { state = VS_BRACE; } else if (isalpha((unsigned char)c) || c == '_') { vn_start = t; state = VS_VN; } else { *o++ = '$'; *o++ = c; state = VS_BASE; } break; case VS_BRACE: if (isalpha((unsigned char)c) || c == '_') { vn_start = t; state = VS_VNB; } else { *o++ = '$'; *o++ = LBR; *o++ = c; state = VS_BASE; } break; case VS_VN: case VS_VNB: if (!(isalnum((unsigned char)c) || c == '_')) { size_t vn_len; char *vn; char *vv; vn_len = t - vn_start; if (state == VS_VNB && c != RBR) { *o++ = '$'; *o++ = LBR; (void) strncpy(o, vn_start, vn_len); o += vn_len; state = VS_BASE; continue; /* rescan */ } vn = Malloc(vn_len + 1); (void) strncpy(vn, vn_start, vn_len); vn[vn_len] = '\0'; if ((vv = ex_getenv(vn, flags, &u))) { *o = '\0'; o_len = o_len - 1 /* '$' */ - (state == VS_VNB) /* { */ - vn_len /* name */ - (state == VS_VNB) /* } */ + strlen(vv); ob = Realloc(ob, o_len); o = strchr(ob, '\0'); (void) strcpy(o, vv); o += strlen(vv); } Free(vn); if (state == VS_VNB) { state = VS_BASE; break; } else { /* Rescan this character */ state = VS_BASE; continue; } } break; case VS_EOF: break; } t++; if (c == '\0') { state = VS_EOF; } } /* * Check for $UNIQUE. * * vr_subst() will increment u if $UNIQUE was used. If it has * been incremented, then try creating the resulting file. If * the open() call fails with EEXIST, then re-run this function * with the new value of u, and try this again with the next * name. * * Keep trying until open() succeeds, or fails with something * other than EEXIST. */ if (u != -1) { int fd; fd = open(ob, O_WRONLY | O_EXCL | O_CREAT, 0600); if (fd < 0) { if (errno == EEXIST) { /* Try again. */ Free(ob); continue; } } else { close(fd); } break; } else { break; } } return ob; } #if !defined(_WIN32) /*[*/ /* * Do tilde (home directory) substitution on a string. Returns a malloc'd * result. */ static char * tilde_subst(const char *s) { char *slash; const char *name; const char *rest; struct passwd *p; char *r; char *mname = NULL; /* Does it start with a "~"? */ if (*s != '~') { return NewString(s); } /* Terminate with "/". */ slash = strchr(s, '/'); if (slash) { int len = slash - s; mname = Malloc(len + 1); (void) strncpy(mname, s, len); mname[len] = '\0'; name = mname; rest = slash; } else { name = s; rest = strchr(name, '\0'); } /* Look it up. */ if (!strcmp(name, "~")) { /* this user */ p = getpwuid(getuid()); } else { /* somebody else */ p = getpwnam(name + 1); } /* Free any temporary copy. */ Free(mname); /* Substitute and return. */ if (p == NULL) { r = NewString(s); } else { r = Malloc(strlen(p->pw_dir) + strlen(rest) + 1); (void) strcpy(r, p->pw_dir); (void) strcat(r, rest); } return r; } #else /*][*/ static char * tilde_subst(const char *s) { char *t; if (*s != '~' || (t = getenv("HOMEPATH")) == NULL) { return NewString(s); } switch (*(s + 1)) { case '\0': return NewString(t); case '/': case '\\': return xs_buffer("%s%s", t, s + 1); default: return NewString(s); } } #endif /*]*/ char * do_subst(const char *s, unsigned flags) { if (flags == DS_NONE) { return NewString(s); } if (flags & DS_VARS) { char *t; t = var_subst(s, flags); if (flags & DS_TILDE) { char *u; u = tilde_subst(t); Free(t); return u; } return t; } return tilde_subst(s); } /* * ctl_see * Expands a character in the manner of "cat -v". */ char * ctl_see(int c) { static char buf[64]; char *p = buf; c &= 0xff; if ((c & 0x80) && (c <= 0xa0)) { *p++ = 'M'; *p++ = '-'; c &= 0x7f; } if (c >= ' ' && c != 0x7f) { *p++ = c; } else { *p++ = '^'; if (c == 0x7f) { *p++ = '?'; } else { *p++ = c + '@'; } } *p = '\0'; return buf; } /* A version of get_resource that accepts sprintf arguments. */ char * get_fresource(const char *fmt, ...) { va_list args; char *name; char *r; va_start(args, fmt); name = xs_vbuffer(fmt, args); va_end(args); r = get_resource(name); Free(name); return r; } /* * Whitespace stripper. */ char * strip_whitespace(const char *s) { char *t = NewString(s); while (*t && my_isspace(*t)) { t++; } if (*t) { char *u = t + strlen(t) - 1; while (my_isspace(*u)) { *u-- = '\0'; } } return t; } /* * Hierarchy (a>b>c) splitter. */ bool split_hier(char *label, char **base, char ***parents) { int n_parents = 0; char *gt; char *lp; label = NewString(label); for (lp = label; (gt = strchr(lp, '>')) != NULL; lp = gt + 1) { if (gt == lp) { return false; } n_parents++; } if (!*lp) { return false; } if (n_parents) { *parents = (char **)Calloc(n_parents + 1, sizeof(char *)); for (n_parents = 0, lp = label; (gt = strchr(lp, '>')) != NULL; lp = gt + 1) { (*parents)[n_parents++] = lp; *gt = '\0'; } *base = lp; } else { (*parents) = NULL; (*base) = label; } return true; } #if defined(_MSC_VER) /*[*/ #define xstr(s) str(s) #define str(s) #s #endif /*]*/ /* Return configuration options. */ const char * build_options(void) { const char *p = product_specific_build_options(); if (p == NULL) { p = ""; } return lazyaf("%s%s%s%s", "Build options:" #if defined(X3270_DBCS) /*[*/ " --enable-dbcs" #else /*][*/ " --disable-dbcs" #endif /*]*/ #if defined(X3270_LOCAL_PROCESS) /*[*/ " --enable-local-process" #else /*][*/ " --disable-local-process" #endif /*]*/ , p, using_iconv()? " --with-iconv": "", #if defined(_MSC_VER) /*[*/ " via MSVC " xstr(_MSC_VER) #endif /*]*/ #if defined(__GNUC__) /*[*/ " via gcc " __VERSION__ #endif /*]*/ #if defined(__LP64__) || defined(__LLP64__) /*[*/ " 64-bit" #else /*][*/ " 32-bit" #endif /*]*/ ); } void dump_version(void) { printf("%s\n%s\n", build, build_options()); charset_list(); printf("\n" "Copyright 1989-%s, Paul Mattes, GTRC and others.\n" "See the source code or documentation for licensing details.\n" "Distributed WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", cyear); exit(0); } /* Scale a number for display. */ const char * display_scale(double d) { if (d >= 1000000.0) { return lazyaf("%.3g M", d / 1000000.0); } else if (d >= 1000.0) { return lazyaf("%.3g K", d / 1000.0); } else { return lazyaf("%.3g ", d); } } suite3270-3.6/Common/varbuf.c0000664000076500007650000001113313221577163014054 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * varbuf.c * x3270 variable-length buffer library */ #include "globals.h" #include "asprintf.h" #include "varbuf.h" #define RA_BASE 16 /* initial allocation size */ /** * Initialize a buffer. * * @param[in,out] r Varbuf to initialize. */ void vb_init(varbuf_t *r) { memset(r, 0, sizeof(*r)); } /** * Expand a buffer. */ static void vb_expand(varbuf_t *r, size_t len) { if (r->len + len > r->alloc_len) { if (r->alloc_len == 0) { r->alloc_len = RA_BASE; } /* Yes, there are cleverer ways to find the nearest power of 2. */ while (r->len + len > r->alloc_len) { r->alloc_len *= 2; } r->buf = Realloc(r->buf, r->alloc_len); } } /** * Append a string to a buffer, restricted by a length. * * @param[in,out] r Varbuf to modify * @param[in] buf Buffer to append * @param[in] len Length of buffer to append */ void vb_append(varbuf_t *r, const char *buf, size_t len) { /* * Allocate more space, if needed. * We allocate an extra byte for the NUL terminator here. */ vb_expand(r, len + 1); /* Append the response. */ memcpy(r->buf + r->len, buf, len); r->len += len; /* Add the NUL terminator. */ r->buf[r->len] = '\0'; } /** * Append a string to a buffer. * * @param[in,out] r Varbuf to modify * @param[in] buf NUL-terminated buffer to append */ void vb_appends(varbuf_t *r, const char *buf) { vb_append(r, buf, strlen(buf)); } /** * Append a printf format to a buffer, varargs style. * * @param[in,out] r Varbuf to modify * @param[in] format Printf format * @param[in] ap Varargs */ void vb_vappendf(varbuf_t *r, const char *format, va_list ap) { va_list ap_copy; int len; /* Figure out how much to add. */ va_copy(ap_copy, ap); len = vscprintf(format, ap_copy); va_end(ap_copy); /* Expand. */ vb_expand(r, len + 1); /* Expand the text. */ vsnprintf(r->buf + r->len, len + 1, format, ap); r->len += len; } /** * Append a printf format to a buffer. * * @param[in,out] r Varbuf to modify * @param[in] format Printf format */ void vb_appendf(varbuf_t *r, const char *format, ...) { va_list ap; va_start(ap, format); vb_vappendf(r, format, ap); va_end(ap); } /** * Return the buffer. * * @param[in] r Varbuf to query * * @return Buffer */ const char * vb_buf(const varbuf_t *r) { return r->buf; } /** * Return the buffer length. * * @param[in] r Varbuf to query * * @return Buffer length */ size_t vb_len(const varbuf_t *r) { return r->len; } /** * Reset the length of a buffer. * * @param[in,out] r Varbuf to reset */ void vb_reset(varbuf_t *r) { r->len = 0; } /** * Consume a buffer (free it and return the contents). * * This function is guaranteed never to return NULL, even if nothing was ever * added. * * @param[in,out] r Varbuf to consume * * @return contents */ char * vb_consume(varbuf_t *r) { char *ret; ret = r->buf; vb_init(r); return ret? ret: NewString(""); } /** * Free a buffer. * * @param[in,out] r Varbuf to free */ void vb_free(varbuf_t *r) { Free(r->buf); vb_init(r); } suite3270-3.6/Common/version.txt0000775000076500007650000000006013221577443014652 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/Common/Win32/gdi_print.c0000664000076500007650000010351313221577163015454 0ustar pdmpdm/* * Copyright (c) 1994-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * gdi_print.c * GDI screen printing functions. */ #include "globals.h" #include #include #include #include #include "appres.h" #include "3270ds.h" #include "ctlr.h" #include "ctlrc.h" #include "resources.h" #include "fprint_screen.h" #include "gdi_print.h" #include "popups.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #include "w3misc.h" /* Defines */ #define PPI 72 /* points per inch */ /* Typedefs */ /* Globals */ /* Statics */ typedef struct { /* user parameters: */ int orientation; /* orientation */ double hmargin; /* horizontal margin in inches */ double vmargin; /* vertical margin in inches */ const char *font_name; /* font name */ int font_size; /* font size in points */ int spp; /* screens per page */ bool done; /* done fetching values */ } uparm_t; static uparm_t uparm; static struct { /* printer characteristics: */ int ppiX, ppiY; /* points per inch */ int poffX, poffY; /* left, top physical offsets */ int horzres, vertres; /* resolution (usable area) */ int pwidth, pheight; /* physical width, height */ } pchar; static struct { /* printer state */ char *caption; /* caption */ int out_row; /* next row to print to */ int screens; /* number of screens on current page */ PRINTDLG dlg; /* Windows print dialog */ FLOAT xptscale, yptscale; /* x, y point-to-LU scaling factors */ int hmargin_pixels, vmargin_pixels; /* margins, in pixels */ int usable_xpixels, usable_ypixels;/* usable area (pixels) */ int usable_cols, usable_rows;/* usable area (chars) */ HFONT font, bold_font, underscore_font, bold_underscore_font; HFONT caption_font; /* fonts */ SIZE space_size; /* size of a space character */ INT *dx; /* spacing array */ } pstate; /* Forward declarations. */ static void gdi_get_params(uparm_t *up); static gdi_status_t gdi_init(const char *printer_name, unsigned opts, const char **fail); static int gdi_screenful(struct ea *ea, unsigned short rows, unsigned short cols, const char **fail); static int gdi_done(const char **fail); static void gdi_abort(void); static BOOL get_printer_device(const char *printer_name, HGLOBAL *pdevnames, HGLOBAL *pdevmode); /* * Initialize printing to a GDI printer. */ gdi_status_t gdi_print_start(const char *printer_name, unsigned opts) { const char *fail = ""; if (!uparm.done) { /* Set the defaults. */ uparm.orientation = 0; uparm.hmargin = 0.5; uparm.vmargin = 0.5; uparm.font_name = NULL; uparm.font_size = 0; /* auto */ uparm.spp = 1; /* Gather up the parameters. */ gdi_get_params(&uparm); /* Don't do this again. */ uparm.done = true; } /* Initialize the printer and pop up the dialog. */ switch (gdi_init(printer_name, opts, &fail)) { case GDI_STATUS_SUCCESS: vtrace("[gdi] initialized\n"); break; case GDI_STATUS_ERROR: popup_an_error("Printer initialization error: %s", fail); return GDI_STATUS_ERROR; case GDI_STATUS_CANCEL: vtrace("[gdi] canceled\n"); return GDI_STATUS_CANCEL; } return GDI_STATUS_SUCCESS; } /* Finish printing to a GDI printer. */ gdi_status_t gdi_print_finish(FILE *f, const char *caption) { size_t nr; struct ea *ea_tmp; gdi_header_t h; const char *fail = ""; /* Save the caption. */ if (caption != NULL) { Replace(pstate.caption, NewString(caption)); } else { Replace(pstate.caption, NULL); } /* Allocate the buffer. */ ea_tmp = Malloc((((maxROWS * maxCOLS) + 1) * sizeof(struct ea))); /* Set up the fake fa in location -1. */ memset(&ea_tmp[0], '\0', sizeof(struct ea)); ea_tmp[0].fa = FA_PRINTABLE | FA_MODIFY; /* Rewind the file. */ fflush(f); rewind(f); /* Read it back. */ while ((nr = fread(&h, sizeof(gdi_header_t), 1, f)) == 1) { /* Check the signature. */ if (h.signature != GDI_SIGNATURE) { popup_an_error("Corrupt temporary file (signature)"); goto abort; } /* Check the screen dimensions. */ if (h.rows > maxROWS || h.cols > maxCOLS) { popup_an_error("Corrupt temporary file (screen size)"); goto abort; } /* Read the screen image in. */ if (fread(ea_tmp + 1, sizeof(struct ea), h.rows * h.cols, f) != h.rows * h.cols) { popup_an_error("Truncated temporary file"); goto abort; } /* Process it. */ if (gdi_screenful(ea_tmp + 1, h.rows, h.cols, &fail) < 0) { popup_an_error("Printing error: %s", fail); goto abort; } } if (gdi_done(&fail) < 0) { popup_an_error("Final printing error: %s", fail); goto abort; } Free(ea_tmp); return GDI_STATUS_SUCCESS; abort: Free(ea_tmp); gdi_abort(); return GDI_STATUS_ERROR; } /* * Validate and scale a margin value. */ static double parse_margin(char *s, const char *what) { double d; char *nextp; d = strtod(s, &nextp); if (d > 0.0) { while (*nextp == ' ') { nextp++; } if (*nextp == '\0' || *nextp == '"' || !strcasecmp(nextp, "in") || !strcasecmp(nextp, "inch") || !strcasecmp(nextp, "inches")) { /* Do nothing. */ } else if (!strcasecmp(nextp, "mm")) { d /= 25.4; } else if (!strcasecmp(nextp, "cm")) { d /= 2.54; } else { vtrace("gdi: unknown %s unit '%s'\n", what, nextp); } } else { vtrace("gdi: invalid %s '%s'\n", what, s); return 0; } return d; } /* * Gather the user parameters from resources. */ static void gdi_get_params(uparm_t *up) { char *s; double d; unsigned long l; char *nextp; /* Orientation. */ if ((s = get_resource(ResPrintTextOrientation)) != NULL) { if (!strcasecmp(s, "portrait")) { up->orientation = DMORIENT_PORTRAIT; } else if (!strcasecmp(s, "landscape")) { up->orientation = DMORIENT_LANDSCAPE; } else { vtrace("gdi: unknown orientation '%s'\n", s); } } /* Horizontal margin. */ if ((s = get_resource(ResPrintTextHorizontalMargin)) != NULL) { d = parse_margin(s, ResPrintTextHorizontalMargin); if (d > 0) { up->hmargin = d; } } /* Vertical margin. */ if ((s = get_resource(ResPrintTextVerticalMargin)) != NULL) { d = parse_margin(s, ResPrintTextVerticalMargin); if (d > 0) { up->vmargin = d; } } /* Font name. */ if ((s = get_resource(ResPrintTextFont)) != NULL) { up->font_name = s; } /* Font size. */ if ((s = get_resource(ResPrintTextSize)) != NULL) { if (strcasecmp(s, "auto")) { l = strtoul(s, &nextp, 0); if (l > 0) { up->font_size = (int)l; } else { vtrace("gdi: invalid %s '%s'\n", ResPrintTextSize, s); } } } /* Screens per page. */ if ((s = get_resource(ResPrintTextScreensPerPage)) != NULL) { l = strtoul(s, &nextp, 0); if (l > 0) { up->spp = (int)l; } else { vtrace("gdi: invalid %s '%s'\n", ResPrintTextScreensPerPage, s); } } } /* * Clean up fonts. */ static void cleanup_fonts(void) { if (pstate.font) { DeleteObject(pstate.font); pstate.font = NULL; } if (pstate.bold_font) { DeleteObject(pstate.bold_font); pstate.bold_font = NULL; } if (pstate.underscore_font) { DeleteObject(pstate.underscore_font); pstate.underscore_font = NULL; } if (pstate.caption_font) { DeleteObject(pstate.caption_font); pstate.caption_font = NULL; } } /* * Create a Roman font. * Returns 0 for success, -1 for failure. */ static int create_roman_font(HDC dc, int fheight, int fwidth, const char **fail) { char *w, *h; w = fwidth? xs_buffer("%d", fwidth): NewString("(auto)"); h = fheight? xs_buffer("%d", fheight): NewString("(auto)"); vtrace("[gdi] requesting a font %sx%s logical units\n", w, h); Free(w); Free(h); pstate.font = CreateFont( fheight, /* height */ fwidth, /* width */ 0, /* escapement */ 0, /* orientation */ FW_NORMAL, /* weight */ FALSE, /* italic */ FALSE, /* underline */ FALSE, /* strikeout */ DEFAULT_CHARSET, /* character set */ OUT_OUTLINE_PRECIS, /* output precision */ CLIP_DEFAULT_PRECIS,/* clip precision */ DEFAULT_QUALITY, /* quality */ FIXED_PITCH|FF_DONTCARE,/* pitch and family */ uparm.font_name); /* face */ if (pstate.font == NULL) { *fail = "CreateFont failed"; return -1; } /* Measure a space to find out the size we got. */ SelectObject(dc, pstate.font); if (!GetTextExtentPoint32(dc, " ", 1, &pstate.space_size)) { *fail = "GetTextExtentPoint32 failed"; return -1; } vtrace("[gdi] space character is %dx%d logical units\n", (int)pstate.space_size.cx, (int)pstate.space_size.cy); pstate.usable_cols = pstate.usable_xpixels / pstate.space_size.cx; pstate.usable_rows = pstate.usable_ypixels / pstate.space_size.cy; vtrace("[gdi] usable area is %dx%d characters\n", pstate.usable_cols, pstate.usable_rows); return 0; } /* * Return the default printer name. */ static char * get_default_printer_name(char *errbuf, size_t errbuf_size) { DWORD size; char *buf; /* Figure out how much memory to allocate. */ size = 0; (void) GetDefaultPrinter(NULL, &size); buf = Malloc(size); if (GetDefaultPrinter(buf, &size) == 0) { snprintf(errbuf, errbuf_size, "Cannot determine default printer"); return NULL; } return buf; } /* * Initalize the named GDI printer. If the name is NULL, use the default * printer. */ static gdi_status_t gdi_init(const char *printer_name, unsigned opts, const char **fail) { char *default_printer_name; LPDEVMODE devmode; HDC dc; DOCINFO docinfo; DEVNAMES *devnames; int rmargin, bmargin; /* right margin, bottom margin */ int maxphmargin, maxpvmargin; int i; static char get_fail[1024]; int fheight, fwidth; memset(&pstate.dlg, '\0', sizeof(pstate.dlg)); pstate.dlg.lStructSize = sizeof(pstate.dlg); pstate.dlg.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION; if (printer_name == NULL || !*printer_name) { default_printer_name = get_default_printer_name(get_fail, sizeof(get_fail)); if (default_printer_name == NULL) { *fail = get_fail; goto failed; } printer_name = default_printer_name; } if (!get_printer_device(printer_name, &pstate.dlg.hDevNames, &pstate.dlg.hDevMode)) { snprintf(get_fail, sizeof(get_fail), "GetPrinter(%s) failed: %s", printer_name, win32_strerror(GetLastError())); *fail = get_fail; goto failed; } if (uparm.orientation) { devmode = (LPDEVMODE)GlobalLock(pstate.dlg.hDevMode); devmode->dmFields |= DM_ORIENTATION; devmode->dmOrientation = uparm.orientation; GlobalUnlock(devmode); } if (opts & FPS_NO_DIALOG) { /* They don't want the print dialog. Allocate a DC for it. */ devmode = (LPDEVMODE)GlobalLock(pstate.dlg.hDevMode); pstate.dlg.hDC = CreateDC("WINSPOOL", printer_name, NULL, devmode); GlobalUnlock(devmode); if (pstate.dlg.hDC == NULL) { snprintf(get_fail, sizeof(get_fail), "Cannot create DC for " "printer '%s'", printer_name); *fail = get_fail; goto failed; } } else { if (default_printer_name != NULL) { Free(default_printer_name); default_printer_name = NULL; } /* Pop up the dialog to get the printer characteristics. */ if (!PrintDlg(&pstate.dlg)) { return GDI_STATUS_CANCEL; } } dc = pstate.dlg.hDC; if (default_printer_name != NULL) { Free(default_printer_name); default_printer_name = NULL; } /* Find out the printer characteristics. */ /* LOGPIXELSX and LOGPIXELSY are the pixels-per-inch for the printer. */ pchar.ppiX = GetDeviceCaps(dc, LOGPIXELSX); if (pchar.ppiX <= 0) { *fail = "Can't get LOGPIXELSX"; goto failed; } pchar.ppiY = GetDeviceCaps(dc, LOGPIXELSY); if (pchar.ppiY <= 0) { *fail = "Can't get LOGPIXELSY"; goto failed; } /* * PHYSICALOFFSETX and PHYSICALOFFSETY are the fixed top and left-hand * margins, in pixels. Whatever you print is offset by these amounts, so * you have to subtract them from your coordinates. You cannot print in * these areas. */ pchar.poffX = GetDeviceCaps(dc, PHYSICALOFFSETX); if (pchar.poffX < 0) { *fail = "Can't get PHYSICALOFFSETX"; goto failed; } pchar.poffY = GetDeviceCaps(dc, PHYSICALOFFSETY); if (pchar.poffY < 0) { *fail = "Can't get PHYSICALOFFSETY"; goto failed; } /* * HORZRES and VERTRES are the size of the usable area of the page, in * pixels. They implicitly give you the size of the right-hand and * bottom physical offsets. */ pchar.horzres = GetDeviceCaps(dc, HORZRES); if (pchar.horzres <= 0) { *fail = "Can't get HORZRES"; goto failed; } pchar.vertres = GetDeviceCaps(dc, VERTRES); if (pchar.vertres <= 0) { *fail = "Can't get VERTRES"; goto failed; } /* * PHYSICALWIDTH and PHYSICALHEIGHT are the size of the entire area of * the page, in pixels. */ pchar.pwidth = GetDeviceCaps(dc, PHYSICALWIDTH); if (pchar.pwidth <= 0) { *fail = "Can't get PHYSICALWIDTH"; goto failed; } pchar.pheight = GetDeviceCaps(dc, PHYSICALHEIGHT); if (pchar.pheight <= 0) { *fail = "Can't get PHYSICALHEIGHT"; goto failed; } /* Trace the device characteristics. */ devnames = (DEVNAMES *)GlobalLock(pstate.dlg.hDevNames); vtrace("[gdi] Printer '%s' capabilities:\n", (char *)devnames + devnames->wDeviceOffset); GlobalUnlock(devnames); vtrace("[gdi] LOGPIXELSX %d LOGPIXELSY %d\n", pchar.ppiX, pchar.ppiY); vtrace("[gdi] PHYSICALOFFSETX %d PHYSICALOFFSETY %d\n", pchar.poffX, pchar.poffY); vtrace("[gdi] HORZRES %d VERTRES %d\n", pchar.horzres, pchar.vertres); vtrace("[gdi] PHYSICALWIDTH %d PHYSICALHEIGHT %d\n", pchar.pwidth, pchar.pheight); /* Compute the scale factors (points to pixels). */ pstate.xptscale = (FLOAT)pchar.ppiX / (FLOAT)PPI; pstate.yptscale = (FLOAT)pchar.ppiY / (FLOAT)PPI; /* Compute the implied right and bottom margins. */ rmargin = pchar.pwidth - pchar.horzres - pchar.poffX; bmargin = pchar.pheight - pchar.vertres - pchar.poffY; if (rmargin > pchar.poffX) { maxphmargin = rmargin; } else { maxphmargin = pchar.poffX; } if (bmargin > pchar.poffY) { maxpvmargin = bmargin; } else { maxpvmargin = pchar.poffY; } vtrace("[gdi] maxphmargin is %d, maxpvmargin is %d pixels\n", maxphmargin, maxpvmargin); /* Compute the margins in pixels. */ pstate.hmargin_pixels = (int)(uparm.hmargin * pchar.ppiX); pstate.vmargin_pixels = (int)(uparm.vmargin * pchar.ppiY); /* See if the margins are too small. */ if (pstate.hmargin_pixels < maxphmargin) { pstate.hmargin_pixels = maxphmargin; vtrace("[gdi] hmargin is too small, setting to %g\"\n", (float)pstate.hmargin_pixels / pchar.ppiX); } if (pstate.vmargin_pixels < maxpvmargin) { pstate.vmargin_pixels = maxpvmargin; vtrace("[gdi] vmargin is too small, setting to %g\"\n", (float)pstate.vmargin_pixels / pchar.ppiX); } /* See if the margins are too big. */ if (pstate.hmargin_pixels * 2 >= pchar.horzres) { pstate.hmargin_pixels = pchar.ppiX; vtrace("[gdi] hmargin is too big, setting to 1\"\n"); } if (pstate.vmargin_pixels * 2 >= pchar.vertres) { pstate.vmargin_pixels = pchar.ppiY; vtrace("[gdi] vmargin is too big, setting to 1\"\n"); } /* * Compute the usable area in pixels. That's the physical page size * less the margins, now that we know that the margins are reasonable. */ pstate.usable_xpixels = pchar.pwidth - (2 * pstate.hmargin_pixels); pstate.usable_ypixels = pchar.pheight - (2 * pstate.vmargin_pixels); vtrace("[gdi] usable area is %dx%d pixels\n", pstate.usable_xpixels, pstate.usable_ypixels); /* * Create the Roman font. * * If they specified a particular font size, use that as the height, * and let the system pick the width. * * If they did not specify a font size, or chose "auto", then let the * "screens per page" drive what to do. If "screens per page" is set, * then divide the page Y pixels by the screens-per-page times the * display height to get the font height, and let the system pick the * width. * * Otherwise, divide the page X pixels by COLS to get the font width, * and let the system pick the height. */ if (uparm.font_size) { /* User-specified fixed font size. */ fheight = (int)(uparm.font_size * pstate.yptscale); fwidth = 0; } else { if (uparm.spp > 1) { /* * Scale the height so the specified number of screens will * fit. */ fheight = pstate.usable_ypixels / (uparm.spp * maxROWS /* spp screens */ + (uparm.spp - 1) /* spaces between screens */ + 2 /* space and caption*/ ); fwidth = 0; } else { /* * Scale the width so a screen will fit the page horizonally. */ fheight = 0; fwidth = pstate.usable_xpixels / maxCOLS; } } if (create_roman_font(dc, fheight, fwidth, fail) < 0) { goto failed; } /* * If we computed the font size, see if the other dimension is too * big. If it is, scale using the other dimension, which is guaranteed to * make the original computed dimension no bigger. * * XXX: This needs more testing. */ if (!uparm.font_size) { if (fwidth == 0) { /* * We computed the height because spp > 1. See if the width * overflows. */ if (pstate.space_size.cx * maxCOLS > pstate.usable_xpixels) { vtrace("[gdi] font too wide, retrying\n"); DeleteObject(pstate.font); pstate.font = NULL; fheight = 0; fwidth = pstate.usable_xpixels / maxCOLS; if (create_roman_font(dc, fheight, fwidth, fail) < 0) { goto failed; } } } else if (fheight == 0) { /* * We computed the width (spp <= 1). See if the height * overflows. */ if (pstate.space_size.cy * (maxROWS + 2) > pstate.usable_xpixels) { vtrace("[gdi] font too high, retrying\n"); DeleteObject(pstate.font); pstate.font = NULL; fheight = pstate.usable_xpixels / (maxROWS + 2); fwidth = 0; if (create_roman_font(dc, fheight, fwidth, fail) < 0) { goto failed; } } } } /* Create a bold font that is the same size, if possible. */ pstate.bold_font = CreateFont( pstate.space_size.cy, /* height */ pstate.space_size.cx, /* width */ 0, /* escapement */ 0, /* orientation */ FW_BOLD, /* weight */ FALSE, /* italic */ FALSE, /* underline */ FALSE, /* strikeout */ ANSI_CHARSET, /* character set */ OUT_OUTLINE_PRECIS, /* output precision */ CLIP_DEFAULT_PRECIS, /* clip precision */ DEFAULT_QUALITY, /* quality */ FIXED_PITCH|FF_DONTCARE,/* pitch and family */ uparm.font_name); /* face */ if (pstate.bold_font == NULL) { *fail = "CreateFont (bold) failed"; goto failed; } /* Create an underscore font that is the same size, if possible. */ pstate.underscore_font = CreateFont( pstate.space_size.cy, /* height */ pstate.space_size.cx, /* width */ 0, /* escapement */ 0, /* orientation */ FW_NORMAL, /* weight */ FALSE, /* italic */ TRUE, /* underline */ FALSE, /* strikeout */ ANSI_CHARSET, /* character set */ OUT_OUTLINE_PRECIS, /* output precision */ CLIP_DEFAULT_PRECIS, /* clip precision */ DEFAULT_QUALITY, /* quality */ FIXED_PITCH|FF_DONTCARE,/* pitch and family */ uparm.font_name); /* face */ if (pstate.underscore_font == NULL) { *fail = "CreateFont (underscore) failed"; goto failed; } /* Create a bold, underscore font that is the same size, if possible. */ pstate.bold_underscore_font = CreateFont( pstate.space_size.cy, /* height */ pstate.space_size.cx, /* width */ 0, /* escapement */ 0, /* orientation */ FW_BOLD, /* weight */ FALSE, /* italic */ TRUE, /* underline */ FALSE, /* strikeout */ ANSI_CHARSET, /* character set */ OUT_OUTLINE_PRECIS, /* output precision */ CLIP_DEFAULT_PRECIS, /* clip precision */ DEFAULT_QUALITY, /* quality */ FIXED_PITCH|FF_DONTCARE,/* pitch and family */ uparm.font_name); /* face */ if (pstate.bold_underscore_font == NULL) { *fail = "CreateFont (bold underscore) failed"; goto failed; } /* Create a caption font. */ pstate.caption_font = CreateFont( pstate.space_size.cy, /* height */ 0, /* width */ 0, /* escapement */ 0, /* orientation */ FW_NORMAL, /* weight */ TRUE, /* italic */ FALSE, /* underline */ FALSE, /* strikeout */ ANSI_CHARSET, /* character set */ OUT_OUTLINE_PRECIS, /* output precision */ CLIP_DEFAULT_PRECIS, /* clip precision */ DEFAULT_QUALITY, /* quality */ VARIABLE_PITCH|FF_DONTCARE,/* pitch and family */ "Times New Roman"); /* face */ if (pstate.bold_underscore_font == NULL) { *fail = "CreateFont (bold underscore) failed"; goto failed; } /* Set up the manual spacing array. */ pstate.dx = Malloc(sizeof(INT) * maxCOLS); for (i = 0; i < maxCOLS; i++) { pstate.dx[i] = pstate.space_size.cx; } /* Fill in the document info. */ memset(&docinfo, '\0', sizeof(docinfo)); docinfo.cbSize = sizeof(docinfo); docinfo.lpszDocName = "wc3270 screen"; /* Start the document. */ if (StartDoc(dc, &docinfo) <= 0) { *fail = "StartDoc failed"; goto failed; } return GDI_STATUS_SUCCESS; failed: /* Clean up what we can and return failure. */ if (default_printer_name != NULL) { Free(default_printer_name); } cleanup_fonts(); return GDI_STATUS_ERROR; } /* * Print one screeful to the GDI printer. */ static int gdi_screenful(struct ea *ea, unsigned short rows, unsigned short cols, const char **fail) { HDC dc = pstate.dlg.hDC; LPDEVMODE devmode; int row, col, baddr; int rc = 0; int status; int fa_addr = find_field_attribute_ea(0, ea); unsigned char fa = ea[fa_addr].fa; bool fa_high, high; bool fa_underline, underline; bool fa_reverse, reverse; unsigned long uc; bool is_dbcs; char c; int usable_rows; HFONT got_font = NULL, want_font; #if defined(GDI_DEBUG) /*[*/ const char *want_font_name; #endif /*]*/ enum { COLOR_NONE, COLOR_NORMAL, COLOR_REVERSE } got_color = COLOR_NONE, want_color; devmode = (LPDEVMODE)GlobalLock(pstate.dlg.hDevMode); /* Compute the usable rows, including the caption. */ usable_rows = pstate.usable_rows; if (pstate.caption) { usable_rows -= 2; } /* * Does this screen fit? * (Note that the first test, "pstate.out_row", is there so that if the * font is so big the image won't fit at all, we still print as much * of it as we can.) */ if (pstate.out_row && pstate.out_row + ROWS > usable_rows) { if (EndPage(dc) <= 0) { *fail = "EndPage failed"; rc = -1; goto done; } pstate.out_row = 0; pstate.screens = 0; } /* If there is a caption, put it on the last line. */ if (pstate.out_row == 0 && pstate.caption != NULL) { SelectObject(dc, pstate.caption_font); status = ExtTextOut(dc, pstate.hmargin_pixels - pchar.poffX, pstate.vmargin_pixels + ((pstate.usable_rows - 1) * pstate.space_size.cy) - pchar.poffY, 0, NULL, pstate.caption, (UINT)strlen(pstate.caption), NULL); if (status <= 0) { *fail = "ExtTextOut failed"; rc = -1; goto done; } } /* Draw a line separating the screens. */ if (pstate.out_row) { HPEN pen; pen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); SelectObject(dc, pen); status = MoveToEx(dc, pstate.hmargin_pixels - pchar.poffX, pstate.vmargin_pixels + (pstate.out_row * pstate.space_size.cy) + (pstate.space_size.cy / 2) - pchar.poffY, NULL); if (status == 0) { *fail = "MoveToEx failed"; rc = -1; goto done; } status = LineTo(dc, pstate.hmargin_pixels - pchar.poffX + pstate.usable_xpixels, pstate.vmargin_pixels + (pstate.out_row * pstate.space_size.cy) + (pstate.space_size.cy / 2) - pchar.poffY); if (status == 0) { *fail = "LineTo failed"; rc = -1; goto done; } DeleteObject(pen); } /* Now dump out a screen's worth. */ if (ea[fa_addr].gr & GR_INTENSIFY) { fa_high = true; } else { fa_high = FA_IS_HIGH(fa); } fa_reverse = ((ea[fa_addr].gr & GR_REVERSE) != 0); fa_underline = ((ea[fa_addr].gr & GR_UNDERLINE) != 0); for (baddr = 0, row = 0; row < ROWS; row++) { if (pstate.out_row + row >= usable_rows) { break; } for (col = 0; col < COLS; col++, baddr++) { if (ea[baddr].fa) { fa = ea[baddr].fa; if (ea[baddr].gr & GR_INTENSIFY) { fa_high = true; } else { fa_high = FA_IS_HIGH(fa); } fa_reverse = ((ea[fa_addr].gr & GR_REVERSE) != 0); fa_underline = ((ea[fa_addr].gr & GR_UNDERLINE) != 0); /* Just skip it. */ continue; } if (col >= pstate.usable_cols) { continue; } is_dbcs = FALSE; if (FA_IS_ZERO(fa)) { if (ctlr_dbcs_state_ea(baddr, ea) == DBCS_LEFT) { uc = 0x3000; } else { uc = ' '; } } else { /* Convert EBCDIC to Unicode. */ switch (ctlr_dbcs_state(baddr)) { case DBCS_NONE: case DBCS_SB: uc = ebcdic_to_unicode(ea[baddr].cc, ea[baddr].cs, EUO_NONE); if (uc == 0) { uc = ' '; } break; case DBCS_LEFT: is_dbcs = TRUE; uc = ebcdic_to_unicode((ea[baddr].cc << 8) | ea[baddr + 1].cc, CS_BASE, EUO_NONE); if (uc == 0) { uc = 0x3000; } break; case DBCS_RIGHT: /* skip altogether, we took care of it above */ continue; default: uc = ' '; break; } } /* Figure out the attributes of the current buffer position. */ high = ((ea[baddr].gr & GR_INTENSIFY) != 0); if (!high) { high = fa_high; } reverse = ((ea[fa_addr].gr & GR_REVERSE) != 0); if (!reverse) { reverse = fa_reverse; } underline = ((ea[fa_addr].gr & GR_UNDERLINE) != 0); if (!underline) { underline = fa_underline; } /* Set the bg/fg color and font. */ if (reverse) { want_color = COLOR_REVERSE; } else { want_color = COLOR_NORMAL; } if (want_color != got_color) { switch (want_color) { case COLOR_REVERSE: SetTextColor(dc, 0xffffff); SetBkColor(dc, 0); SetBkMode(dc, OPAQUE); break; case COLOR_NORMAL: SetTextColor(dc, 0); SetBkColor(dc, 0xffffff); SetBkMode(dc, TRANSPARENT); break; default: break; } got_color = want_color; } if (!high && !underline) { want_font = pstate.font; #if defined(GDI_DEBUG) /*[*/ want_font_name = "Roman"; #endif /*]*/ } else if (high && !underline) { want_font = pstate.bold_font; #if defined(GDI_DEBUG) /*[*/ want_font_name = "Bold"; #endif /*]*/ } else if (!high && underline) { want_font = pstate.underscore_font; #if defined(GDI_DEBUG) /*[*/ want_font_name = "Underscore"; #endif /*]*/ } else { want_font = pstate.bold_underscore_font; #if defined(GDI_DEBUG) /*[*/ want_font_name = "Underscore"; #endif /*]*/ } if (want_font != got_font) { SelectObject(dc, want_font); got_font = want_font; #if defined(GDI_DEBUG) /*[*/ vtrace("[gdi] selecting %s\n", want_font_name); #endif /*]*/ } /* * Handle spaces and DBCS spaces (U+3000). * If not reverse or underline, just skip over them. * Otherwise, print a space or two spaces, using the * right font and modes. */ if (uc == ' ' || uc == 0x3000) { if (reverse || underline) { status = ExtTextOut(dc, pstate.hmargin_pixels + (col * pstate.space_size.cx) - pchar.poffX, pstate.vmargin_pixels + ((pstate.out_row + row + 1) * pstate.space_size.cy) - pchar.poffY, 0, NULL, " ", (uc == 0x3000)? 2: 1, pstate.dx); if (status <= 0) { *fail = "ExtTextOut failed"; rc = -1; goto done; } } continue; } /* * Emit one character at a time. This should be optimized to print * strings of characters with the same attributes. */ if (is_dbcs) { wchar_t w; INT wdx; w = (wchar_t)uc; wdx = pstate.space_size.cx; status = ExtTextOutW(dc, pstate.hmargin_pixels + (col * pstate.space_size.cx) - pchar.poffX, pstate.vmargin_pixels + ((pstate.out_row + row + 1) * pstate.space_size.cy) - pchar.poffY, 0, NULL, &w, 1, &wdx); if (status <= 0) { *fail = "ExtTextOutW failed"; rc = -1; goto done; } continue; } c = (char)uc; status = ExtTextOut(dc, pstate.hmargin_pixels + (col * pstate.space_size.cx) - pchar.poffX, pstate.vmargin_pixels + ((pstate.out_row + row + 1) * pstate.space_size.cy) - pchar.poffY, 0, NULL, &c, 1, pstate.dx); #if defined(GDI_DEBUG) /*[*/ if (c != ' ') { vtrace("[gdi] row %d col %d x=%ld y=%ld '%c'\n", row, col, pstate.hmargin_pixels + (col * pstate.space_size.cx) - pchar.poffX, pstate.vmargin_pixels + ((pstate.out_row + row + 1) * pstate.space_size.cy) - pchar.poffY, c); } #endif /*]*/ if (status <= 0) { *fail = "ExtTextOut failed"; rc = -1; goto done; } } } /* Tally the current screen and see if we need to go to a new page. */ pstate.out_row += (row + 1); /* current screen plus a gap */ pstate.screens++; if (pstate.out_row >= usable_rows || pstate.screens >= uparm.spp) { if (EndPage(dc) <= 0) { *fail = "EndPage failed"; rc = -1; goto done; } pstate.out_row = 0; pstate.screens = 0; } done: GlobalUnlock(devmode); return rc; } /* * Finish the GDI print-out and clean up the data structures. */ static int gdi_done(const char **fail) { int rc = 0; if (pstate.out_row) { if (EndPage(pstate.dlg.hDC) <= 0) { *fail = "EndPage failed"; rc = -1; } pstate.out_row = 0; } if (EndDoc(pstate.dlg.hDC) <= 0) { *fail = "EndDoc failed"; rc = -1; } cleanup_fonts(); return rc; } /* * Clean up the GDI data structures without attempting any more printing. */ static void gdi_abort(void) { if (pstate.out_row) { (void) EndPage(pstate.dlg.hDC); pstate.out_row = 0; } (void) EndDoc(pstate.dlg.hDC); cleanup_fonts(); } /* * Get a DEVMODE and DEVNAMES from a printer name. * * Returns TRUE for success, FALSE for failure. */ static BOOL get_printer_device(const char *printer_name, HGLOBAL *pdevnames, HGLOBAL *pdevmode) { HANDLE h; DWORD len, len2; PRINTER_INFO_2 *pi; size_t dmsize; HGLOBAL gdm; char *dm; size_t ldn; size_t lpn; size_t ltn; HGLOBAL gdn; DEVNAMES *dn; size_t offset; /* Gotta have something to return the values in. */ if (pdevmode == NULL || pdevnames == NULL) { return FALSE; } /* Open the printer. */ h = NULL; if (!OpenPrinter((char *)printer_name, &h, NULL)) { return FALSE; } /* Get a PRINTER_INFO_2 structure for the printer. */ (void) GetPrinter(h, 2, NULL, 0, &len); pi = (PRINTER_INFO_2 *)malloc(len); if (!GetPrinter(h, 2, (LPBYTE)pi, len, &len2)) { free(pi); ClosePrinter(h); return FALSE; } ClosePrinter(h); h = NULL; /* Copy the DEVMODE from the PRINTER_INFO_2 into a global handle. */ dmsize = sizeof(*pi->pDevMode) + pi->pDevMode->dmDriverExtra; gdm = GlobalAlloc(GHND, dmsize); assert(gdm); dm = (char *)GlobalLock(gdm); assert(dm); memcpy(dm, pi->pDevMode, dmsize); GlobalUnlock(gdm); /* * Compute the size of the DEVNAMES structure from the fields in the * PRINTER_INFO_2. */ ldn = strlen(pi->pDriverName) + 1; lpn = strlen(pi->pPrinterName) + 1; ltn = strlen(pi->pPortName) + 1; /* * Construct a DEVNAMES from the PRINTER_INFO_2, allocated as a global * handle. */ gdn = GlobalAlloc(GHND, sizeof(DEVNAMES) + ldn + lpn + ltn); assert(gdn); dn = (DEVNAMES *)GlobalLock(gdn); assert(dn); memset(dn, '\0', sizeof(DEVNAMES)); offset = sizeof(DEVNAMES); dn->wDriverOffset = (WORD)offset; memcpy((char *)dn + offset, pi->pDriverName, ldn); offset += ldn; dn->wDeviceOffset = (WORD)offset; memcpy((char *)dn + offset, pi->pPrinterName, lpn); offset += lpn; dn->wOutputOffset = (WORD)offset; memcpy((char *)dn + offset, pi->pPortName, ltn); dn->wDefault = 0; /* Done filling in dn. */ GlobalUnlock(gdn); /* Done with the PRINTER_INFO_2. */ free(pi); pi = NULL; /* Return the devmode and devnames. */ *pdevmode = gdm; *pdevnames = gdn; /* Success. */ return TRUE; } suite3270-3.6/Common/Win32/manifest.tmpl0000664000076500007650000000241413221577163016033 0ustar pdmpdm %DESCRIPTION% suite3270-3.6/Common/Win32/mkmanifest.c0000775000076500007650000001630013221577163015633 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Construct a manifest file from a template. * Roughly Equivalent to the mkmanifest.sh used on Unix. * * mkmanifest * -a 32|64 * -d description * -e app-name * -m manifest-template * -v version-file */ #include #include #include #include "wincmn.h" typedef char bool; #define true 1 #define false 0 /* Keyword substitutions. */ #define SUBST(s) { s, "%" #s "%" } enum subst { NAME, VERSION, ARCHITECTURE, DESCRIPTION, NUM_SUBST }; static struct { enum subst subst; const char *keyword; char *value; } substs[] = { SUBST(NAME), SUBST(VERSION), SUBST(ARCHITECTURE), SUBST(DESCRIPTION) }; /* Allocate memory. */ void * Malloc(size_t len) { void *r; r = malloc(len); if (r == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } return r; } /* Free memory. */ void Free(void *s) { free(s); } /* Allocate a string. */ static char * NewString(char *s) { return strcpy(Malloc(strlen(s) + 1), s); } /* Display usage and exit. */ void Usage(void) { fprintf(stderr, "Usage: mkmanifest -a 32|64 -d description -e app-name -m manifest-template -v version-file\n"); exit(1); } /* Parse the version string (3.2ga7) into Windows format (3.2.7.0). */ char * parse_version(const char *version_string) { enum fsm { BASE, DIG_A, DIG_A_DOT, DIG_B, KW, DIG_C } state = BASE; unsigned char c; char out[256]; char *outp = out; # define STORE(c) { \ if (outp - out >= sizeof(out)) { \ return NULL; \ } \ *outp++ = c; \ } while ((c = *version_string++)) { switch (state) { case BASE: if (isdigit(c)) { STORE(c); state = DIG_A; } else { return NULL; } break; case DIG_A: if (isdigit(c)) { STORE(c); } else if (c == '.') { STORE(c); state = DIG_A_DOT; } else { return NULL; } break; case DIG_A_DOT: if (isdigit(c)) { STORE(c); state = DIG_B; } else { return NULL; } break; case DIG_B: if (isdigit(c)) { STORE(c); } else { state = KW; } break; case KW: if (isdigit(c)) { STORE('.'); STORE(c); state = DIG_C; } break; case DIG_C: if (isdigit(c)) { STORE(c); } else { return NULL; } break; } } if (state != DIG_C) { return NULL; } STORE('.'); STORE('0'); STORE('\0'); return NewString(out); } int main(int argc, char *argv[]) { bool ia64 = false; FILE *f; char buf[1024]; char *version = NULL; char *manifest = NULL; char *arch = NULL; char *version_string = NULL; char *manifest_version = NULL; char *appname = NULL; char *description = NULL; int i, j, k; /* Check the command line. */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-e")) { if (i + 1 >= argc) { Usage(); } appname = argv[++i]; } else if (!strcmp(argv[i], "-v")) { if (i + 1 >= argc) { Usage(); } version = argv[++i]; } else if (!strcmp(argv[i], "-d")) { if (i + 1 >= argc) { Usage(); } description = argv[++i]; } else if (!strcmp(argv[i], "-a")) { if (i + 1 >= argc) { Usage(); } arch = argv[++i]; if (!strcmp(arch, "32") || !strcmp(arch, "Win32")) { ia64 = false; } else if (!strcmp(arch, "64") || !strcmp(arch, "x64")) { ia64 = true; } else { Usage(); } } else if (!strcmp(argv[i], "-m")) { if (i + 1 >= argc) { Usage(); } manifest = argv[++i]; } else { Usage(); } } if (appname == NULL || description == NULL || manifest == NULL || arch == NULL || version == NULL) { Usage(); } /* Read up version.txt. */ f = fopen(version, "r"); if (f == NULL) { perror(version); return 1; } while (fgets(buf, sizeof(buf), f) != NULL) { if (!strncmp(buf, "version=\"", 9)) { char *q; version_string = NewString(buf + 9); q = strchr(version_string, '"'); if (q == NULL) { fprintf(stderr, "syntax error in %s\n", version); return 1; } *q = '\0'; } } fclose(f); if (version_string == NULL) { fprintf(stderr, "missing version= in %s\n", version); return 1; } /* Translate the version. */ manifest_version = parse_version(version_string); if (manifest_version == NULL) { fprintf(stderr, "Syntax error in version '%s'\n", version_string); return 1; } /* Populate the subsitutions. */ substs[NAME].value = appname; substs[VERSION].value = manifest_version; substs[ARCHITECTURE].value = ia64? "ia64": "x86"; substs[DESCRIPTION].value = description; /* Check the substitutions. */ for (j = 0; j < NUM_SUBST; j++) { for (k = 0; k < NUM_SUBST; k++) { if (strstr(substs[k].value, substs[j].keyword) != NULL) { fprintf(stderr, "Substitution '%s' contains keyword '%s'\n", substs[k].value, substs[j].keyword); return 1; } } } /* Parse and substitute. */ f = fopen(manifest, "r"); if (f == NULL) { perror(manifest); return 1; } while (fgets(buf, sizeof(buf), f) != NULL) { int i; char *xbuf = NewString(buf); for (i = 0; i < NUM_SUBST; i++) { char *s; while ((s = strstr(xbuf, substs[i].keyword)) != NULL) { size_t left_len = s - xbuf; char *middle_string = substs[i].value; size_t middle_len = strlen(middle_string); char *right_string = s + strlen(substs[i].keyword); size_t right_len = strlen(right_string); size_t bufsize = left_len + middle_len + right_len + 1; char *ybuf = Malloc(bufsize); sprintf(ybuf, "%.*s%s%s", (int)left_len, xbuf, middle_string, right_string); Free(xbuf); xbuf = ybuf; } } write(1, xbuf, (int)strlen(xbuf)); Free(xbuf); } fclose(f); return 0; } suite3270-3.6/Common/Win32/mkmanifest.sh0000775000076500007650000000463013221577163016026 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Create a manifest file from the template # mkmanifest version.txt exe-name "description" [WIN64] #set -x set -e if [ $# -lt 4 -o $# -gt 5 ] then echo >&2 "Usage: mkmanifest.sh version.txt manifest.tmpl exe-name 'description' [1]" exit 2 fi . $1 # Name and description are easy. name="$3" description="$4" # Version is trickier. # .text becomes ...0 version_subst=`echo $version | sed 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\)[a-z][a-z]*\([0-9][0-9]*\)$/\1.\2.\3.0/'` # Architecture is straightforward, but odd. # If no last argument, assume x86. # Otherwise, "1" means ia64. case "$5" in "") arch=x86;; 1) arch=ia64;; *) echo >&2 "Invalid arch parameter (must be empty for x86, 1 for ia64)" exit 1 esac sed -e "s/%NAME%/$name/g" \ -e "s/%VERSION%/$version_subst/g" \ -e "s/%ARCHITECTURE%/$arch/g" \ -e "s/%DESCRIPTION%/$description/g" \ $2 suite3270-3.6/Common/Win32/mkversion.c0000775000076500007650000001264513221577163015522 0ustar pdmpdm/* * Copyright (c) 2008-2009, 2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This program is a C-language encapsulation of all but the last line of: * * #! /bin/sh * # Create version.o from version.txt * * # Ensure that 'date' emits 7-bit U.S. ASCII. * LANG=C * LC_ALL=C * export LANG LC_ALL * * set -e * * . ./version.txt * builddate=`date` * sccsdate=`date +%Y/%m/%d` * user=${LOGNAME-$USER} * * # Create an all numeric timestamp for rpqnames. * # rpq.c will return this string of numbers in bcd format * # It is OK to change the length (+ or -), but use * # decimal (0-9) digits only. Length must be even number of digits. * rpq_timestamp=`date +%Y%m%d%H%M%S` * * trap 'rm -f version.c' 0 1 2 15 * * cat <version.c * char *build = "${2-x3270} v$version $builddate $user"; * char *app_defaults_version = "$adversion"; * static char sccsid[] = "@(#)${2-x3270} v$version $sccsdate $user"; * * const char *build_rpq_timestamp = "$rpq_timestamp"; * const char *build_rpq_version = "$version"; * EOF */ #include #include #include "wincmn.h" static char * NewString(char *s) { char *t = malloc(strlen(s) + 1); if (t == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } return strcpy(t, s); } int main(int argc, char *argv[]) { FILE *f; char buf[1024]; char *version = NULL; char *adversion = NULL; char *cyear = NULL; char *user; __time64_t t; char *builddate; struct tm *tm; char sccsdate[128]; char rpqtime[128]; int is_w = 0; char *ofile = "version.c"; char *progname = "wc3270"; char *vtname = "version.txt"; if (argc > 1 && !strcmp(argv[1], "-w")) { is_w = 1; ofile = "wversion.c"; argv++; argc--; } if (argc > 1) { progname = argv[1]; argv++; argc--; } if (argc > 1) { vtname = argv[1]; argv++; argc--; } /* Read up version.txt. */ f = fopen(vtname, "r"); if (f == NULL) { perror("vtname"); return 1; } while (fgets(buf, sizeof(buf), f) != NULL) { if (!strncmp(buf, "version=\"", 9)) { char *q; version = NewString(buf + 9); q = strchr(version, '"'); if (q == NULL) { fprintf(stderr, "syntax error in %s\n", vtname); return 1; } *q = '\0'; } else if (!strncmp(buf, "adversion=\"", 11)) { char *q; adversion = NewString(buf + 11); q = strchr(adversion, '"'); if (q == NULL) { fprintf(stderr, "syntax error in %s\n", vtname); return 1; } *q = '\0'; } else if (!strncmp(buf, "cyear=\"", 7)) { char *q; cyear = NewString(buf + 7); q = strchr(cyear, '"'); if (q == NULL) { fprintf(stderr, "syntax error in %s\n", vtname); return 1; } *q = '\0'; } } fclose(f); if (version == NULL || adversion == NULL) { fprintf(stderr, "missing version= or adversion= in %s\n", vtname); return 1; } /* Grab the username. */ user = getenv("USERNAME"); if (user == NULL) { fprintf(stderr, "No %USERNAME%?\n"); return 1; } /* Format the dates. */ _time64(&t); builddate = NewString(_ctime64(&t)); builddate[strlen(builddate) - 1] = '\0'; tm = _localtime64(&t); sprintf(sccsdate, "%d/%02d/%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); sprintf(rpqtime, "%02d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); /* Create the code. */ f = fopen(ofile, "w"); if (f == NULL) { perror(ofile); return 1; } if (is_w) { fprintf(f, "const char *wversion = \"%s\";\n", version); } else { fprintf(f, "const char *app = \"%s\";\n", progname); fprintf(f, "const char *build = \"%s v%s %s %s\";\n", progname, version, builddate, user); fprintf(f, "const char *cyear = \"%s\";\n", cyear); fprintf(f, "const char *app_defaults_version = \"%s\";\n", adversion); fprintf(f, "static char sccsid[] = \"@(#)%s v%s %s %s\";\n", progname, version, sccsdate, user); fprintf(f, "const char *build_rpq_timestamp = \"%s\";\n", rpqtime); fprintf(f, "const char *build_rpq_version = \"%s\";\n", version); } fclose(f); return 0; } suite3270-3.6/Common/Win32/sio_schannel.c0000775000076500007650000013415313221577163016151 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This module borrows freely from "TLS with Schannel" posted on * http://www.coastrd.com/tls-with-schannel. */ /* * sio_schannel.c * Secure I/O via the Windows schannel facility. */ #include "globals.h" #define SECURITY_WIN32 #include #include #include #include #include #include "indent_s.h" #include "ssl_config.h" #include "sio.h" #include "sioc.h" #include "ssl_passwd_gui.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #include "w3misc.h" #include "winvers.h" #if !defined(SP_PROT_TLS1_1_CLIENT) # define SP_PROT_TLS1_1_CLIENT 0x200 #endif #if !defined(SP_PROT_TLS1_2_CLIENT) # define SP_PROT_TLS1_2_CLIENT 0x800 #endif /* TLS protocols to negotiate. */ #define TLS_PROTOCOLS \ (SP_PROT_TLS1_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_2_CLIENT) /* #define VERBOSE 1 */ /* dump protocol packets in hex */ #define MIN_READ 50 /* small amount to read from the socket at a time, so we are in no danger of reading more than one record */ #define INBUF (16 * 1024) /* preliminary input buffer size */ /* Globals */ /* Statics */ typedef struct { socket_t sock; /* socket */ const char *hostname; /* server name */ bool secure_unverified; /* true if server cert not verified */ bool negotiated; /* true if session is negotiated */ CredHandle client_creds; /* client credentials */ bool client_creds_set; /* true if client_creds is valid */ bool manual; /* true if manual validation needed */ CtxtHandle context; /* security context */ bool context_set; /* true if context is valid */ SecPkgContext_StreamSizes sizes; /* stream sizes */ char *session_info; /* session information */ char *server_cert_info; /* server cert information */ char *rcvbuf; /* receive buffer */ size_t rcvbuf_len; /* receive buffer length */ char *prbuf; /* pending record buffer */ size_t prbuf_len; /* pending record buffer size */ char *sendbuf; /* send buffer */ } schannel_sio_t; static ssl_config_t *config; static HCERTSTORE my_cert_store; /* Display the certificate chain. */ static void display_cert_chain(varbuf_t *v, PCCERT_CONTEXT cert) { CHAR name[1024]; PCCERT_CONTEXT current_cert, issuer_cert; PCERT_EXTENSION ext; WCHAR *wcbuf = NULL; DWORD wcsize; DWORD mbsize; char *mbbuf = NULL; int i; /* Display leaf name. */ if (!CertNameToStr(cert->dwCertEncodingType, &cert->pCertInfo->Subject, CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG, name, sizeof(name))) { int err = GetLastError(); vtrace("CertNameToStr(subject): error 0x%x (%s)\n", err, win32_strerror(err)); } else { vb_appendf(v, "Subject: %s\n", name); } if (!CertNameToStr(cert->dwCertEncodingType, &cert->pCertInfo->Issuer, CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG, name, sizeof(name))) { int err = GetLastError(); vtrace("CertNameToStr(issuer): error 0x%x (%s)\n", err, win32_strerror(err)); } else { vb_appendf(v, "Issuer: %s\n", name); } /* Display the alternate name. */ do { ext = CertFindExtension(szOID_SUBJECT_ALT_NAME2, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension); if (ext == NULL) { break; } if (!CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, szOID_SUBJECT_ALT_NAME2, ext->Value.pbData, ext->Value.cbData, NULL, &wcsize)) { break; } wcsize *= 4; wcbuf = (WCHAR *)Malloc(wcsize); if (!CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, szOID_SUBJECT_ALT_NAME2, ext->Value.pbData, ext->Value.cbData, wcbuf, &wcsize)) { break; } mbsize = WideCharToMultiByte(CP_ACP, 0, wcbuf, -1, NULL, 0, NULL, NULL); mbbuf = Malloc(mbsize); if (WideCharToMultiByte(CP_ACP, 0, wcbuf, -1, mbbuf, mbsize, NULL, NULL) != mbsize) { break; } vb_appendf(v, "Alternate names: %s\n", mbbuf); } while (false); if (wcbuf != NULL) { Free(wcbuf); } if (mbbuf != NULL) { Free(mbbuf); } /* Display certificate chain. */ current_cert = cert; i = 0; while (current_cert != NULL) { DWORD verification_flags = 0; i++; issuer_cert = CertGetIssuerCertificateFromStore(cert->hCertStore, current_cert, NULL, &verification_flags); if (issuer_cert == NULL) { if (current_cert != cert) { CertFreeCertificateContext(current_cert); } break; } if (!CertNameToStr(issuer_cert->dwCertEncodingType, &issuer_cert->pCertInfo->Subject, CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG, name, sizeof(name))) { int err = GetLastError(); vtrace("CertNameToStr(subject): error 0x%x (%s)\n", err, win32_strerror(err)); } else { vb_appendf(v, "CA %d Subject: %s\n", i, name); } if (!CertNameToStr(issuer_cert->dwCertEncodingType, &issuer_cert->pCertInfo->Issuer, CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG, name, sizeof(name))) { int err = GetLastError(); vtrace("CertNameToStr(issuer): error 0x%x (%s)\n", err, win32_strerror(err)); } else { vb_appendf(v, "CA %d Issuer: %s\n", i, name); } if (current_cert != cert) { CertFreeCertificateContext(current_cert); } current_cert = issuer_cert; issuer_cert = NULL; } } /* Create security credentials. */ static SECURITY_STATUS create_credentials(LPSTR friendly_name, PCredHandle creds, bool *manual) { TimeStamp ts_expiry; SECURITY_STATUS status; PCCERT_CONTEXT cert_context = NULL; SCHANNEL_CRED schannel_cred; varbuf_t v; char *s, *t; *manual = false; /* Open the "MY" certificate store, where IE stores client certificates. */ if (my_cert_store == NULL) { my_cert_store = CertOpenSystemStore(0, "MY"); if (my_cert_store == NULL) { int err = GetLastError(); sioc_set_error("CertOpenSystemStore: error 0x%x (%s)\n", err, win32_strerror(err)); return err; } } /* * If a friendly name name is specified, then attempt to find a client * certificate. Otherwise, just create a NULL credential. */ if (friendly_name != NULL) { for (;;) { DWORD nbytes; LPTSTR cert_friendly_name; /* Find a client certificate with the given friendly name. */ cert_context = CertFindCertificateInStore( my_cert_store, /* hCertStore */ X509_ASN_ENCODING, /* dwCertEncodingType */ 0, /* dwFindFlags */ CERT_FIND_ANY, /* dwFindType */ NULL, /* *pvFindPara */ cert_context); /* pPrevCertContext */ if (cert_context == NULL) { int err = GetLastError(); sioc_set_error("CertFindCertificateInStore: error 0x%x (%s)\n", err, win32_strerror(err)); return err; } nbytes = CertGetNameString(cert_context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL, NULL, 0); cert_friendly_name = Malloc(nbytes); nbytes = CertGetNameString(cert_context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL, cert_friendly_name, nbytes); if (!strcasecmp(friendly_name, cert_friendly_name)) { Free(cert_friendly_name); break; } Free(cert_friendly_name); } /* Display it. */ vtrace("Client certificate:\n"); vb_init(&v); display_cert_chain(&v, cert_context); s = vb_consume(&v); t = indent_s(s); vtrace("%s", t); Free(t); Free(s); } /* Build Schannel credential structure. */ memset(&schannel_cred, 0, sizeof(schannel_cred)); schannel_cred.dwVersion = SCHANNEL_CRED_VERSION; if (cert_context != NULL) { schannel_cred.cCreds = 1; schannel_cred.paCred = &cert_context; } /* Before Windows 10, you need to specify the protocols explicitly. */ if (!IsWindowsVersionOrGreater(10, 0, 0)) { schannel_cred.grbitEnabledProtocols = TLS_PROTOCOLS; } schannel_cred.dwFlags |= SCH_CRED_NO_DEFAULT_CREDS; /* * If they don't want the host certificate checked, specify manual * validation here and then don't validate. */ if (!config->verify_host_cert || is_wine()) { schannel_cred.dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION; *manual = true; } else { schannel_cred.dwFlags |= SCH_CRED_AUTO_CRED_VALIDATION; } /* Create an SSPI credential. */ status = AcquireCredentialsHandle( NULL, /* Name of principal */ UNISP_NAME, /* Name of package */ SECPKG_CRED_OUTBOUND, /* Flags indicating use */ NULL, /* Pointer to logon ID */ &schannel_cred, /* Package specific data */ NULL, /* Pointer to GetKey() func */ NULL, /* Value to pass to GetKey() */ creds, /* (out) Cred Handle */ &ts_expiry); /* (out) Lifetime (optional) */ if (status != SEC_E_OK) { sioc_set_error("AcquireCredentialsHandle: error 0x%x (%s)\n", status, win32_strerror(status)); } /* Free the certificate context. Schannel has already made its own copy. */ if (cert_context != NULL) { CertFreeCertificateContext(cert_context); } return status; } /* Get new client credentials. */ static void get_new_client_credentials(CredHandle *creds, CtxtHandle *context) { CredHandle new_creds; SecPkgContext_IssuerListInfoEx issuer_list_info; PCCERT_CHAIN_CONTEXT chain_context; CERT_CHAIN_FIND_BY_ISSUER_PARA find_by_issuer_params; PCCERT_CONTEXT cert_context; TimeStamp expiry; SECURITY_STATUS status; SCHANNEL_CRED schannel_cred; /* Read the list of trusted issuers from schannel. */ status = QueryContextAttributes(context, SECPKG_ATTR_ISSUER_LIST_EX, (PVOID)&issuer_list_info); if (status != SEC_E_OK) { vtrace("QueryContextAttributes: error 0x%x (%s)\n", (unsigned)status, win32_strerror(status)); return; } /* Enumerate the client certificates. */ memset(&find_by_issuer_params, 0, sizeof(find_by_issuer_params)); find_by_issuer_params.cbSize = sizeof(find_by_issuer_params); find_by_issuer_params.pszUsageIdentifier = szOID_PKIX_KP_CLIENT_AUTH; find_by_issuer_params.dwKeySpec = 0; find_by_issuer_params.cIssuer = issuer_list_info.cIssuers; find_by_issuer_params.rgIssuer = issuer_list_info.aIssuers; chain_context = NULL; while (true) { /* Find a certificate chain. */ chain_context = CertFindChainInStore( my_cert_store, X509_ASN_ENCODING, 0, CERT_CHAIN_FIND_BY_ISSUER, &find_by_issuer_params, chain_context); if (chain_context == NULL) { vtrace("CertFindChainInStore: error 0x%x (%s)\n", (unsigned)GetLastError(), win32_strerror(GetLastError())); break; } /* Get pointer to leaf certificate context. */ cert_context = chain_context->rgpChain[0]->rgpElement[0]->pCertContext; /* Create schannel credential. */ schannel_cred.dwVersion = SCHANNEL_CRED_VERSION; schannel_cred.cCreds = 1; schannel_cred.paCred = &cert_context; status = AcquireCredentialsHandle( NULL, /* Name of principal */ UNISP_NAME_A, /* Name of package */ SECPKG_CRED_OUTBOUND, /* Flags indicating use */ NULL, /* Pointer to logon ID */ &schannel_cred, /* Package specific data */ NULL, /* Pointer to GetKey() func */ NULL, /* Value to pass to GetKey() */ &new_creds, /* (out) Cred Handle */ &expiry); /* (out) Lifetime (optional) */ if (status != SEC_E_OK) { vtrace("AcquireCredentialsHandle: error 0x%x (%s)\n", (unsigned)status, win32_strerror(status)); continue; } /* Destroy the old credentials. */ FreeCredentialsHandle(creds); *creds = new_creds; } } #if defined(VERBOSE) /*[*/ /* Display a hex dump of a buffer. */ static void print_hex_dump(const char *prefix, int length, unsigned char *buffer) { int i, count, index; static char rgbDigits[] = "0123456789abcdef"; char rgbLine[100]; int cbLine; for (index = 0; length; length -= count, buffer += count, index += count) { count = (length > 16)? 16: length; sprintf(rgbLine, "%4.4x ", index); cbLine = 6; for (i = 0; i < count; i++) { rgbLine[cbLine++] = rgbDigits[buffer[i] >> 4]; rgbLine[cbLine++] = rgbDigits[buffer[i] & 0x0f]; if (i == 7) { rgbLine[cbLine++] = ':'; } else { rgbLine[cbLine++] = ' '; } } for (; i < 16; i++) { rgbLine[cbLine++] = ' '; rgbLine[cbLine++] = ' '; rgbLine[cbLine++] = ' '; } rgbLine[cbLine++] = ' '; for (i = 0; i < count; i++) { if (buffer[i] < 32 || buffer[i] > 126 || buffer[i] == '%') { rgbLine[cbLine++] = '.'; } else { rgbLine[cbLine++] = buffer[i]; } } rgbLine[cbLine++] = 0; vtrace("%s %s\n", prefix, rgbLine); } } #endif /*]*/ /* Client handshake, second phase. */ static SECURITY_STATUS client_handshake_loop( schannel_sio_t *s, /* in, out */ bool do_initial_read) /* in */ { SecBufferDesc out_buffer, in_buffer; SecBuffer in_buffers[2], out_buffers[1]; DWORD ssp_i_flags, ssp_o_flags; int nrw; TimeStamp expiry; SECURITY_STATUS ret; bool do_read; int n2read = MIN_READ; ssp_i_flags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; do_read = do_initial_read; /* Loop until the handshake is finished or an error occurs. */ ret = SEC_I_CONTINUE_NEEDED; while (ret == SEC_I_CONTINUE_NEEDED || ret == SEC_E_INCOMPLETE_MESSAGE || ret == SEC_I_INCOMPLETE_CREDENTIALS) { if (s->rcvbuf_len == 0 || ret == SEC_E_INCOMPLETE_MESSAGE) { /* Read data from server. */ if (do_read) { fd_set rfds; struct timeval tv; int ns; /* Wait 5 seconds for the data. */ FD_ZERO(&rfds); FD_SET(s->sock, &rfds); tv.tv_sec = 5; tv.tv_usec = 0; ns = select(0, &rfds, NULL, NULL, &tv); if (ns < 0) { int err = WSAGetLastError(); sioc_set_error("select: error %d (%s)\n", err, win32_strerror(err)); ret = err; break; } if (ns == 0) { sioc_set_error("receive timeout during SSL/TLS " "negotiation"); ret = WSAECONNABORTED; /* XXX: synthetic error */ break; } /* Read it. */ nrw = recv(s->sock, s->rcvbuf + s->rcvbuf_len, n2read, 0); vtrace("SSL: %d/%d bytes of handshake data received\n", nrw, n2read); if (nrw == SOCKET_ERROR) { ret = WSAGetLastError(); sioc_set_error("recv: error %d (%s)\n", (int)ret, win32_strerror(ret)); break; } else if (nrw == 0) { sioc_set_error("server disconnected during SSL/TLS " "negotiation"); ret = WSAECONNABORTED; /* XXX: synthetic error */ break; } #if defined(VERBOSE) /*[*/ print_hex_dump("rcvbuf + s->rcvbuf_len); #endif /*]*/ s->rcvbuf_len += nrw; } else { do_read = true; } } /* * Set up the input buffers. Buffer 0 is used to pass in data * received from the server. Schannel will consume some or all * of this. Leftover data (if any) will be placed in buffer 1 and * given a buffer type of SECBUFFER_EXTRA. */ in_buffers[0].pvBuffer = s->rcvbuf; in_buffers[0].cbBuffer = (DWORD)s->rcvbuf_len; in_buffers[0].BufferType = SECBUFFER_TOKEN; in_buffers[1].pvBuffer = NULL; in_buffers[1].cbBuffer = 0; in_buffers[1].BufferType = SECBUFFER_EMPTY; in_buffer.cBuffers = 2; in_buffer.pBuffers = in_buffers; in_buffer.ulVersion = SECBUFFER_VERSION; /* * Set up the output buffers. These are initialized to NULL * so as to make it less likely we'll attempt to free random * garbage later. */ out_buffers[0].pvBuffer = NULL; out_buffers[0].BufferType= SECBUFFER_TOKEN; out_buffers[0].cbBuffer = 0; out_buffer.cBuffers = 1; out_buffer.pBuffers = out_buffers; out_buffer.ulVersion = SECBUFFER_VERSION; /* Call InitializeSecurityContext. */ ret = InitializeSecurityContext( &s->client_creds, &s->context, NULL, ssp_i_flags, 0, 0, &in_buffer, 0, NULL, &out_buffer, &ssp_o_flags, &expiry); vtrace("SSL: InitializeSecurityContext -> 0x%x (%s)\n", (unsigned)ret, win32_strerror(ret)); /* * If InitializeSecurityContext was successful (or if the error was * one of the special extended ones), send the contends of the output * buffer to the server. */ if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED || (FAILED(ret) && (ssp_o_flags & ISC_RET_EXTENDED_ERROR))) { if (out_buffers[0].cbBuffer != 0 && out_buffers[0].pvBuffer != NULL) { nrw = send(s->sock, out_buffers[0].pvBuffer, out_buffers[0].cbBuffer, 0); if (nrw == SOCKET_ERROR) { ret = WSAGetLastError(); sioc_set_error("send: error %d (%s)\n", (int)ret, win32_strerror(ret)); FreeContextBuffer(out_buffers[0].pvBuffer); break; } vtrace("SSL: %d bytes of handshake data sent\n", nrw); #if defined(VERBOSE) /*[*/ print_hex_dump(">enc", nrw, out_buffers[0].pvBuffer); #endif /*]*/ /* Free output buffer. */ FreeContextBuffer(out_buffers[0].pvBuffer); out_buffers[0].pvBuffer = NULL; } } /* * If InitializeSecurityContext returned SEC_E_INCOMPLETE_MESSAGE, * then we need to read more data from the server and try again. */ if (ret == SEC_E_INCOMPLETE_MESSAGE) { if (in_buffers[1].BufferType == SECBUFFER_MISSING) { n2read = in_buffers[1].cbBuffer; } else { n2read = MIN_READ; } continue; } else { n2read = MIN_READ; } /* * If InitializeSecurityContext returned SEC_E_OK, then the * handshake completed successfully. */ if (ret == SEC_E_OK) { /* * If the "extra" buffer contains data, this is encrypted * application protocol layer stuff. It needs to be saved. The * application layer will later decrypt it with DecryptMessage. */ vtrace("SSL: Handshake was successful\n"); if (in_buffers[1].BufferType == SECBUFFER_EXTRA) { /* Interestingly, in_buffers[1].pvBuffer is NULL here. */ vtrace("SSL: %d bytes of encrypted data saved\n", (int)in_buffers[1].cbBuffer); memmove(s->rcvbuf, s->rcvbuf + s->rcvbuf_len - in_buffers[1].cbBuffer, in_buffers[1].cbBuffer); s->rcvbuf_len = in_buffers[1].cbBuffer; } else { s->rcvbuf_len = 0; } break; } if (ret == SEC_E_UNSUPPORTED_FUNCTION) { vtrace("SSL: SEC_E_UNSUPPORTED_FUNCTION from InitializeSecurityContext -- usually means requested TLS version not supported by server\n"); } if (ret == SEC_E_WRONG_PRINCIPAL) { vtrace("SSL: SEC_E_WRONG_PRINCIPAL from InitializeSecurityContext -- bad server certificate\n"); } /* Check for fatal error. */ if (FAILED(ret)) { sioc_set_error("InitializeSecurityContext: error 0x%x (%s)\n", ret, win32_strerror(ret)); break; } /* * If InitializeSecurityContext returned SEC_I_INCOMPLETE_CREDENTIALS, * then the server just requested client authentication. */ if (ret == SEC_I_INCOMPLETE_CREDENTIALS) { /* * Busted. The server has requested client authentication and * the credential we supplied didn't contain a client certificate. * This function will read the list of trusted certificate * authorities ("issuers") that was received from the server * and attempt to find a suitable client certificate that * was issued by one of these. If this function is successful, * then we will connect using the new certificate. Otherwise, * we will attempt to connect anonymously (using our current * credentials). */ get_new_client_credentials(&s->client_creds, &s->context); /* Go around again. */ do_read = false; ret = SEC_I_CONTINUE_NEEDED; continue; } if (in_buffers[1].BufferType == SECBUFFER_EXTRA) { /* * Copy any leftover data from the "extra" buffer, and go around * again. */ vtrace("SSL: %lu bytes of extra data copied\n", in_buffers[1].cbBuffer); memmove(s->rcvbuf, s->rcvbuf + s->rcvbuf_len - in_buffers[1].cbBuffer, in_buffers[1].cbBuffer); s->rcvbuf_len = in_buffers[1].cbBuffer; } else { s->rcvbuf_len = 0; } } /* Delete the security context in the case of a fatal error. */ if (ret != SEC_E_OK) { DeleteSecurityContext(&s->context); } else { s->context_set = true; } return ret; } /* Client handshake, first phase. */ static SECURITY_STATUS perform_client_handshake( schannel_sio_t *s, /* in, out */ LPSTR server_name) /* in */ { SecBufferDesc out_buffer; SecBuffer out_buffers[1]; DWORD ssp_i_flags, ssp_o_flags; int data; TimeStamp expiry; SECURITY_STATUS scRet; ssp_i_flags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; /* Initiate a ClientHello message and generate a token. */ out_buffers[0].pvBuffer = NULL; out_buffers[0].BufferType = SECBUFFER_TOKEN; out_buffers[0].cbBuffer = 0; out_buffer.cBuffers = 1; out_buffer.pBuffers = out_buffers; out_buffer.ulVersion = SECBUFFER_VERSION; scRet = InitializeSecurityContext( &s->client_creds, NULL, server_name, ssp_i_flags, 0, 0, NULL, 0, &s->context, &out_buffer, &ssp_o_flags, &expiry); if (scRet != SEC_I_CONTINUE_NEEDED) { sioc_set_error("InitializeSecurityContext: error %d (%s)\n", scRet, win32_strerror(scRet)); return scRet; } /* Send response to server, if there is one. */ if (out_buffers[0].cbBuffer != 0 && out_buffers[0].pvBuffer != NULL) { data = send(s->sock, out_buffers[0].pvBuffer, out_buffers[0].cbBuffer, 0); if (data == SOCKET_ERROR) { int err = WSAGetLastError(); sioc_set_error("send: error %d (%s)\n", err, win32_strerror(err)); FreeContextBuffer(out_buffers[0].pvBuffer); DeleteSecurityContext(&s->context); return err; } vtrace("SSL: %d bytes of handshake data sent\n", data); FreeContextBuffer(out_buffers[0].pvBuffer); out_buffers[0].pvBuffer = NULL; } return client_handshake_loop(s, true); } /* Manually verify a server certificate. */ static DWORD verify_server_certificate( PCCERT_CONTEXT server_cert, PSTR server_name, DWORD cert_flags) { HTTPSPolicyCallbackData policy_https; CERT_CHAIN_POLICY_PARA policy_params; CERT_CHAIN_POLICY_STATUS policy_status; CERT_CHAIN_PARA chain_params; PCCERT_CHAIN_CONTEXT chain_context = NULL; DWORD server_name_size, status; LPSTR rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH, szOID_SERVER_GATED_CRYPTO, szOID_SGC_NETSCAPE }; DWORD usages_count = sizeof(rgszUsages) / sizeof(LPSTR); PWSTR server_name_wide = NULL; vtrace("SSL: Verifying server certificate manually\n"); /* Convert server name to Unicode. */ server_name_size = MultiByteToWideChar(CP_ACP, 0, server_name, -1, NULL, 0); server_name_wide = Malloc(server_name_size * sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, server_name, -1, server_name_wide, server_name_size); /* Build certificate chain. */ memset(&chain_params, 0, sizeof(chain_params)); chain_params.cbSize = sizeof(chain_params); chain_params.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; chain_params.RequestedUsage.Usage.cUsageIdentifier = usages_count; chain_params.RequestedUsage.Usage.rgpszUsageIdentifier = rgszUsages; if (!CertGetCertificateChain( NULL, server_cert, NULL, server_cert->hCertStore, &chain_params, 0, NULL, &chain_context)) { status = GetLastError(); sioc_set_error("CertGetCertificateChain: error 0x%x (%s)\n", status, win32_strerror(status)); goto done; } /* Validate certificate chain. */ ZeroMemory(&policy_https, sizeof(HTTPSPolicyCallbackData)); policy_https.cbStruct = sizeof(HTTPSPolicyCallbackData); policy_https.dwAuthType = AUTHTYPE_SERVER; policy_https.fdwChecks = cert_flags; policy_https.pwszServerName = server_name_wide; memset(&policy_params, 0, sizeof(policy_params)); policy_params.cbSize = sizeof(policy_params); policy_params.pvExtraPolicyPara = &policy_https; memset(&policy_status, 0, sizeof(policy_status)); policy_status.cbSize = sizeof(policy_status); if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, chain_context, &policy_params, &policy_status)) { status = GetLastError(); sioc_set_error("CertVerifyCertificateChainPolicy: error 0x%x (%s)\n", status, win32_strerror(status)); goto done; } if (policy_status.dwError) { status = policy_status.dwError; sioc_set_error("CertVerifyCertificateChainPolicy: error 0x%x (%s)\n", status, win32_strerror(status)); goto done; } status = SEC_E_OK; done: if (chain_context != NULL) { CertFreeCertificateChain(chain_context); } if (server_name_wide != NULL) { Free(server_name_wide); } return status; } /* Display a connection. */ static void display_connection_info(varbuf_t *v, CtxtHandle *context) { SECURITY_STATUS status; SecPkgContext_ConnectionInfo connection_info; status = QueryContextAttributes(context, SECPKG_ATTR_CONNECTION_INFO, (PVOID)&connection_info); if (status != SEC_E_OK) { vtrace("QueryContextAttributes: error 0x%x (%s)\n", (unsigned)status, win32_strerror(status)); return; } vb_appendf(v, "Protocol: "); switch (connection_info.dwProtocol) { case SP_PROT_TLS1_CLIENT: vb_appendf(v, "TLS 1.0\n"); break; case SP_PROT_TLS1_1_CLIENT: vb_appendf(v, "TLS 1.1\n"); break; case SP_PROT_TLS1_2_CLIENT: vb_appendf(v, "TLS 1.2\n"); break; case SP_PROT_SSL3_CLIENT: vb_appendf(v, "SSL 3.0\n"); break; case SP_PROT_SSL2_CLIENT: vb_appendf(v, "SSL 2.0\n"); break; default: vb_appendf(v, "0x%x\n", (unsigned)connection_info.dwProtocol); break; } vb_appendf(v, "Cipher: "); switch (connection_info.aiCipher) { case CALG_3DES: vb_appendf(v, "Triple DES\n"); break; case CALG_AES: vb_appendf(v, "AES\n"); break; case CALG_AES_128: vb_appendf(v, "AES 128\n"); break; case CALG_AES_256: vb_appendf(v, "AES 256\n"); break; case CALG_DES: vb_appendf(v, "DES\n"); break; case CALG_RC2: vb_appendf(v, "RC2\n"); break; case CALG_RC4: vb_appendf(v, "RC4\n"); break; default: vb_appendf(v, "0x%x\n", connection_info.aiCipher); break; } vb_appendf(v, "Cipher strength: %d\n", (int)connection_info.dwCipherStrength); vb_appendf(v, "Hash: "); switch (connection_info.aiHash) { case CALG_MD5: vb_appendf(v, "MD5\n"); break; case CALG_SHA: vb_appendf(v, "SHA\n"); break; default: vb_appendf(v, "0x%x\n", connection_info.aiHash); break; } vb_appendf(v, "Hash strength: %d\n", (int)connection_info.dwHashStrength); vb_appendf(v, "Key exchange: "); switch (connection_info.aiExch) { case CALG_RSA_KEYX: case CALG_RSA_SIGN: vb_appendf(v, "RSA\n"); break; case CALG_KEA_KEYX: vb_appendf(v, "KEA\n"); break; case CALG_DH_EPHEM: vb_appendf(v, "DH Ephemeral\n"); break; default: vb_appendf(v, "0x%x\n", connection_info.aiExch); break; } vb_appendf(v, "Key exchange strength: %d\n", (int)connection_info.dwExchStrength); } /* Free an sio context. */ static void sio_free(schannel_sio_t *s) { s->sock = INVALID_SOCKET; /* Free the SSPI context handle. */ if (s->context_set) { DeleteSecurityContext(&s->context); memset(&s->context, 0, sizeof(s->context)); s->context_set = false; } /* Free the SSPI credentials handle. */ if (s->client_creds_set) { FreeCredentialsHandle(&s->client_creds); memset(&s->client_creds, 0, sizeof(s->client_creds)); s->client_creds_set = false; } /* Free the receive buffer. */ if (s->rcvbuf != NULL) { Free(s->rcvbuf); s->rcvbuf = NULL; } /* Free the record buffer. */ if (s->prbuf != NULL) { Free(s->prbuf); s->prbuf = NULL; } /* Free the send buffer. */ if (s->sendbuf != NULL) { Free(s->sendbuf); s->sendbuf = NULL; } /* Free the session info. */ if (s->session_info != NULL) { Free(s->session_info); s->session_info = NULL; } /* Free the server cert info. */ if (s->server_cert_info != NULL) { Free(s->server_cert_info); s->server_cert_info = NULL; } Free(s); } /* Returns true if secure I/O is supported. */ bool sio_supported(void) { return true; } /* * Create a new context. */ sio_init_ret_t sio_init(ssl_config_t *c, const char *password, sio_t *sio_ret) { schannel_sio_t *s; sioc_error_reset(); config = c; s = (schannel_sio_t *)Malloc(sizeof(schannel_sio_t)); memset(s, 0, sizeof(*s)); s->sock = INVALID_SOCKET; /* Create credentials. */ if (create_credentials(config->client_cert, &s->client_creds, &s->manual)) { vtrace("SSL: Error creating credentials\n"); goto fail; } s->client_creds_set = true; *sio_ret = (sio_t)s; return SI_SUCCESS; fail: sio_free(s); return SI_FAILURE; } /* * Negotiate an SSL connection. * Returns true for success, false for failure. * If it returns false, the socket should be disconnected. * * Returns 'data' true if there is already protocol data pending. */ bool sio_negotiate(sio_t sio, socket_t sock, const char *hostname, bool *data) { schannel_sio_t *s; const char *accept_hostname = hostname; SECURITY_STATUS status; PCCERT_CONTEXT remote_cert_context = NULL; size_t recsz; varbuf_t v; char *cert_desc = NULL; size_t sl; sioc_error_reset(); *data = false; if (sio == NULL) { sioc_set_error("NULL sio"); return false; } s = (schannel_sio_t *)sio; if (s->sock != INVALID_SOCKET) { sioc_set_error("Invalid sio (already negotiated)"); return false; } s->sock = sock; s->hostname = hostname; /* * Allocate the initial receive buffer. * This is temporary, because we can't learn the receive stream sizes until * we have finished negotiating, but we need a receive buffer to negotiate * in the first place. */ s->rcvbuf = Malloc(INBUF); /* Perform handshake. */ if (config->accept_hostname != NULL) { if (!strncasecmp(accept_hostname, "DNS:", 4)) { accept_hostname = config->accept_hostname + 4; sioc_set_error("Empty acceptHostname"); goto fail; } else if (!strncasecmp(config->accept_hostname, "IP:", 3)) { sioc_set_error("Cannot use 'IP:' acceptHostname"); goto fail; } else if (!strcasecmp(config->accept_hostname, "any")) { sioc_set_error("Cannot use 'any' acceptHostname"); goto fail; } else { accept_hostname = config->accept_hostname; } } if (perform_client_handshake(s, (LPSTR)accept_hostname)) { vtrace("SSL: Error performing handshake\n"); goto fail; } /* Get the server's certificate. */ status = QueryContextAttributes(&s->context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (PVOID)&remote_cert_context); if (status != SEC_E_OK) { sioc_set_error("QueryContextAttributes: error 0x%x (%s)", (unsigned)status, win32_strerror(status)); goto fail; } /* * Get the description of the server certificate chain. */ vb_init(&v); display_cert_chain(&v, remote_cert_context); cert_desc = vb_consume(&v); /* Attempt to validate the server certificate. */ if (s->manual && config->verify_host_cert) { status = verify_server_certificate(remote_cert_context, (LPSTR)accept_hostname, 0); if (status) { vtrace("SSL: Error 0x%x authenticating server credentials\n", (unsigned)status); goto fail; } } /* Free the server certificate context. */ CertFreeCertificateContext(remote_cert_context); remote_cert_context = NULL; /* Read stream encryption properties. */ status = QueryContextAttributes(&s->context, SECPKG_ATTR_STREAM_SIZES, &s->sizes); if (status != SEC_E_OK) { sioc_set_error("QueryContextAttributes: error 0x%x (%s)", (unsigned)status, win32_strerror(status)); goto fail; } /* Display connection info. */ vb_init(&v); display_connection_info(&v, &s->context); s->session_info = vb_consume(&v); sl = strlen(s->session_info); if (sl > 0 && s->session_info[sl - 1] == '\n') { s->session_info[sl - 1] = '\0'; } /* Display server_cert info. */ s->server_cert_info = cert_desc; cert_desc = NULL; sl = strlen(s->server_cert_info); if (sl > 0 && s->server_cert_info[sl - 1] == '\n') { s->server_cert_info[sl - 1] = '\0'; } /* Account for any extra data. */ if (s->rcvbuf_len > 0) { *data = true; } /* Reallocate the receive buffer. */ vtrace("SSL: Sizes: header %d, trailer %d, max message %d\n", (int)s->sizes.cbHeader, (int)s->sizes.cbTrailer, (int)s->sizes.cbMaximumMessage); recsz = s->sizes.cbHeader + s->sizes.cbTrailer + s->sizes.cbMaximumMessage; if (recsz > INBUF) { s->rcvbuf = Realloc(s->rcvbuf, recsz); } s->prbuf = Malloc(s->sizes.cbMaximumMessage); s->sendbuf = Malloc(s->sizes.cbMaximumMessage); /* Success. */ s->secure_unverified = !config->verify_host_cert; s->negotiated = true; return true; fail: /* Free the server certificate context. */ if (remote_cert_context != NULL) { CertFreeCertificateContext(remote_cert_context); remote_cert_context = NULL; } /* Free the SSPI context handle. */ if (s->context_set) { DeleteSecurityContext(&s->context); memset(&s->context, 0, sizeof(s->context)); s->context_set = false; } /* Free the SSPI credentials handle. */ if (s->client_creds_set) { FreeCredentialsHandle(&s->client_creds); memset(&s->client_creds, 0, sizeof(s->client_creds)); s->client_creds_set = false; } if (cert_desc != NULL) { Free(cert_desc); } return false; } /* * Read and decrypt data. */ static SECURITY_STATUS read_decrypt( schannel_sio_t *s, /* in */ CtxtHandle *context) /* in */ { SecBuffer *data_buffer_ptr, *extra_buffer_ptr; SECURITY_STATUS ret; SecBufferDesc message; SecBuffer buffers[4]; int nr; int i; int n2read = s->sizes.cbHeader; /* Read data from server until done. */ ret = SEC_E_OK; while (true) { data_buffer_ptr = NULL; extra_buffer_ptr = NULL; /* Read some data. */ if (s->rcvbuf_len == 0 || ret == SEC_E_INCOMPLETE_MESSAGE) { /* Get the data */ nr = recv(s->sock, s->rcvbuf + s->rcvbuf_len, n2read, 0); vtrace("SSL: %d/%d bytes of encrypted application data received\n", nr, n2read); if (nr == SOCKET_ERROR) { ret = WSAGetLastError(); sioc_set_error("recv: error %d (%s)", (int)ret, win32_strerror(ret)); break; } else if (nr == 0) { /* Server disconnected. */ vtrace("SSL: Server disconnected.\n"); s->negotiated = false; ret = SEC_E_OK; break; } else { /* Success. */ #if defined(VERBOSE) /*[*/ print_hex_dump("rcvbuf + s->rcvbuf_len); #endif /*]*/ s->rcvbuf_len += nr; } } /* Try to decrypt it. */ buffers[0].pvBuffer = s->rcvbuf; buffers[0].cbBuffer = (DWORD)s->rcvbuf_len; buffers[0].BufferType = SECBUFFER_DATA; buffers[1].BufferType = SECBUFFER_EMPTY; buffers[2].BufferType = SECBUFFER_EMPTY; buffers[3].BufferType = SECBUFFER_EMPTY; message.ulVersion = SECBUFFER_VERSION; message.cBuffers = 4; message.pBuffers = buffers; ret = DecryptMessage(context, &message, 0, NULL); if (ret == SEC_I_CONTEXT_EXPIRED) { /* Server signalled end of session. Treat it like EOF. */ vtrace("SSL: Server signaled end of session.\n"); s->negotiated = false; ret = SEC_E_OK; break; } if (ret != SEC_E_OK && ret != SEC_I_RENEGOTIATE && ret != SEC_I_CONTEXT_EXPIRED && ret != SEC_E_INCOMPLETE_MESSAGE) { sioc_set_error("DecryptMessage: error 0x%x (%s)\n", (unsigned)ret, win32_strerror(ret)); return ret; } if (ret == SEC_E_INCOMPLETE_MESSAGE) { /* Nibble some more. */ if (buffers[0].BufferType == SECBUFFER_MISSING) { n2read = buffers[0].cbBuffer; } else { n2read = s->sizes.cbHeader; } continue; } else { n2read = s->sizes.cbHeader; } /* Locate data and (optional) extra buffers. */ data_buffer_ptr = NULL; extra_buffer_ptr = NULL; for (i = 1; i < 4; i++) { if (data_buffer_ptr == NULL && buffers[i].BufferType == SECBUFFER_DATA) { data_buffer_ptr = &buffers[i]; } if (extra_buffer_ptr == NULL && buffers[i].BufferType == SECBUFFER_EXTRA) { extra_buffer_ptr = &buffers[i]; } } /* Check for completion. */ if (data_buffer_ptr != NULL && data_buffer_ptr->cbBuffer) { /* Copy decrypted data to the record buffer. */ memcpy(s->prbuf, data_buffer_ptr->pvBuffer, data_buffer_ptr->cbBuffer); s->prbuf_len = data_buffer_ptr->cbBuffer; s->rcvbuf_len = 0; vtrace("SSL: Got %lu decrypted bytes\n", data_buffer_ptr->cbBuffer); } /* Move any "extra" data to the receive buffer for next time. */ if (extra_buffer_ptr != NULL) { vtrace("SSL: %d bytes extra after decryption\n", (int)extra_buffer_ptr->cbBuffer); memmove(s->rcvbuf, extra_buffer_ptr->pvBuffer, extra_buffer_ptr->cbBuffer); s->rcvbuf_len = extra_buffer_ptr->cbBuffer; } /* * Check for renegotiation. * It's not clear to me if we can get data back *and* this return code, * of if it's one or the other. */ if (ret == SEC_I_RENEGOTIATE) { /* The server wants to perform another handshake sequence. */ vtrace("SSL: Server requested renegotiate\n"); ret = client_handshake_loop(s, false); if (ret != SEC_E_OK) { s->negotiated = false; return ret; } /* XXX: And if it succeeds? */ } if (ret == SEC_E_OK) { break; } } return ret; } /* Send an encrypted message. */ static SECURITY_STATUS encrypt_send( schannel_sio_t *s, const char *buf, size_t len) { SECURITY_STATUS ret; SecBufferDesc message; SecBuffer buffers[4]; int nw; /* Copy the data. */ memcpy(s->sendbuf + s->sizes.cbHeader, buf, len); /* Encrypt the data. */ buffers[0].pvBuffer = s->sendbuf; buffers[0].cbBuffer = s->sizes.cbHeader; buffers[0].BufferType = SECBUFFER_STREAM_HEADER; buffers[1].pvBuffer = s->sendbuf + s->sizes.cbHeader; buffers[1].cbBuffer = (DWORD)len; buffers[1].BufferType = SECBUFFER_DATA; buffers[2].pvBuffer = s->sendbuf + s->sizes.cbHeader + len; buffers[2].cbBuffer = s->sizes.cbTrailer; buffers[2].BufferType = SECBUFFER_STREAM_TRAILER; buffers[3].pvBuffer = SECBUFFER_EMPTY; buffers[3].cbBuffer = SECBUFFER_EMPTY; buffers[3].BufferType = SECBUFFER_EMPTY; message.ulVersion = SECBUFFER_VERSION; message.cBuffers = 4; message.pBuffers = buffers; ret = EncryptMessage(&s->context, 0, &message, 0); if (FAILED(ret)) { sioc_set_error("EncryptMessage: error 0x%x (%s)", (unsigned)ret, win32_strerror(ret)); return ret; } /* Send the encrypted data to the server. */ nw = send(s->sock, s->sendbuf, buffers[0].cbBuffer + buffers[1].cbBuffer + buffers[2].cbBuffer, 0); vtrace("SSL: %d bytes of encrypted data sent\n", nw); if (nw < 0) { ret = WSAGetLastError(); sioc_set_error("send: error %d (%s)", (int)ret, win32_strerror(ret)); } else { #if defined(VERBOSE) /*[*/ print_hex_dump(">enc", nw, (PBYTE)s->sendbuf); #endif /*]*/ } return ret; } /* Disconnect from the server. */ static SECURITY_STATUS disconnect_from_server(schannel_sio_t *s) { PBYTE outbuf; DWORD type, flags, out_flags; int n2w; int nw; SECURITY_STATUS status; SecBufferDesc out_buffer; SecBuffer out_buffers[1]; TimeStamp expiry; /* Notify schannel that we are about to close the connection. */ type = SCHANNEL_SHUTDOWN; out_buffers[0].pvBuffer = &type; out_buffers[0].BufferType = SECBUFFER_TOKEN; out_buffers[0].cbBuffer = sizeof(type); out_buffer.cBuffers = 1; out_buffer.pBuffers = out_buffers; out_buffer.ulVersion = SECBUFFER_VERSION; status = ApplyControlToken(&s->context, &out_buffer); if (FAILED(status)) { vtrace("SSL: ApplyControlToken: error 0x%x (%s)\n", (unsigned)status, win32_strerror(status)); return status; } /* Build an SSL close notify message. */ flags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; out_buffers[0].pvBuffer = NULL; out_buffers[0].BufferType = SECBUFFER_TOKEN; out_buffers[0].cbBuffer = 0; out_buffer.cBuffers = 1; out_buffer.pBuffers = out_buffers; out_buffer.ulVersion = SECBUFFER_VERSION; status = InitializeSecurityContext(&s->client_creds, &s->context, NULL, flags, 0, 0, NULL, 0, &s->context, &out_buffer, &out_flags, &expiry); if (FAILED(status)) { vtrace("SSL: InitializeSecurityContext: error 0x%x (%s)\n", (unsigned)status, win32_strerror(status)); return status; } outbuf = out_buffers[0].pvBuffer; n2w = out_buffers[0].cbBuffer; /* Send the close notify message to the server. */ if (outbuf != NULL && n2w != 0) { nw = send(s->sock, (char *)outbuf, n2w, 0); if (nw == SOCKET_ERROR) { status = WSAGetLastError(); vtrace("SSL: send: error %d (%s)\n", (int)status, win32_strerror(status)); } else { vtrace("SSL: %d bytes of handshake data sent\n", nw); #if defined(VERBOSE) /*[*/ print_hex_dump(">enc", nw, outbuf); #endif /*]*/ } FreeContextBuffer(outbuf); } vtrace("SSL: Sent SSL/TLS disconnect\n"); return status; } /* * Read encrypted data from a socket. * Returns the data length, SIO_EOF for EOF, SIO_FATAL_ERROR for a fatal error, * SIO_EWOULDBLOCK for incomplete input. */ int sio_read(sio_t sio, char *buf, size_t buflen) { schannel_sio_t *s; SECURITY_STATUS ret; sioc_error_reset(); if (sio == NULL) { sioc_set_error("NULL sio"); return SIO_FATAL_ERROR; } s = (schannel_sio_t *)sio; if (s->sock == INVALID_SOCKET) { sioc_set_error("Invalid sio (not negotiated)"); return SIO_FATAL_ERROR; } if (!s->negotiated) { return 0; } if (s->prbuf_len > 0) { size_t copy_len = s->prbuf_len; /* Record already buffered. */ if (copy_len > buflen) { copy_len = buflen; } memcpy(buf, s->prbuf, copy_len); s->prbuf_len -= copy_len; return (int)copy_len; } ret = read_decrypt(s, &s->context); if (ret != SEC_E_OK) { if (ret == WSAEWOULDBLOCK) { return SIO_EWOULDBLOCK; } s->negotiated = false; vtrace("SSL: sio_read: fatal error, ret = 0x%x\n", (unsigned)ret); return SIO_FATAL_ERROR; } if (s->prbuf_len == 0) { /* End of file. */ s->negotiated = false; return SIO_EOF; } /* Got a complete record. */ return sio_read(sio, buf, buflen); } /* * Write encrypted data on the socket. * Returns the data length or SIO_FATAL_ERROR. */ int sio_write(sio_t sio, const char *buf, size_t buflen) { schannel_sio_t *s; size_t len_left = buflen; sioc_error_reset(); if (sio == NULL) { sioc_set_error("NULL sio"); return SIO_FATAL_ERROR; } s = (schannel_sio_t *)sio; if (s->sock == INVALID_SOCKET) { sioc_set_error("Invalid sio (not negotiated)"); return SIO_FATAL_ERROR; } do { size_t n2w = len_left; SECURITY_STATUS ret; if (n2w > s->sizes.cbMaximumMessage) { n2w = s->sizes.cbMaximumMessage; } ret = encrypt_send(s, buf, n2w); if (ret != SEC_E_OK) { s->negotiated = false; return SIO_FATAL_ERROR; } len_left -= n2w; buf += n2w; } while (len_left > 0); return (int)buflen; } /* Closes the SSL connection. */ void sio_close(sio_t sio) { schannel_sio_t *s; if (sio == NULL) { return; } s = (schannel_sio_t *)sio; if (s->sock == INVALID_SOCKET) { return; } if (s->negotiated) { (void) disconnect_from_server(s); } sio_free(s); } /* * Returns true if the current connection is unverified. */ bool sio_secure_unverified(sio_t sio) { schannel_sio_t *s = (schannel_sio_t *)sio; return s? s->secure_unverified: false; } /* * Returns a bitmap of the supported options. */ unsigned sio_options_supported(void) { return SSL_OPT_CLIENT_CERT; } /* * Returns session information. */ const char * sio_session_info(sio_t sio) { schannel_sio_t *s = (schannel_sio_t *)sio; return s? s->session_info: NULL; } /* * Returns server cert information. */ const char * sio_server_cert_info(sio_t sio) { schannel_sio_t *s = (schannel_sio_t *)sio; return s? s->server_cert_info: NULL; } /* * Returns the provider name. */ const char * sio_provider(void) { return "Windows Schannel"; } suite3270-3.6/Common/Win32/snprintf.c0000664000076500007650000000451513221577163015342 0ustar pdmpdm/* * Copyright (c) 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * snprintf.c * A safer version of snprintf for Windows. */ #if !defined(_WIN32) /*[*/ #error For Windows only. #endif /*]*/ #define IS_SNPRINTF_C 1 #include "globals.h" /* * Version of {,v}snprintf that work more like the standard versions, and * always NULL terminate. They do not, however, return the length that would * have been written if overflow did not occur -- they return -1, like the * Windows versions. */ int safe_vsnprintf(char *str, size_t size, const char *fmt, va_list ap) { if (size > 0) { int len; len = vsnprintf(str, size, fmt, ap); str[size - 1] = '\0'; return len; } else { return 0; } } int safe_snprintf(char *str, size_t size, const char *fmt, ...) { va_list ap; int len; va_start(ap, fmt); len = safe_vsnprintf(str, size, fmt, ap); va_end(ap); return len; } suite3270-3.6/Common/Win32/w3misc.c0000664000076500007650000001332213221577163014700 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * w3misc.c * Miscellaneous Win32 functions. */ #include "globals.h" #if !defined(_WIN32) /*[*/ #error This module is only for Win32. #endif /*]*/ #include #include #include "asprintf.h" #include "w3misc.h" /* Initialize Winsock. */ int sockstart(void) { static int initted = 0; WORD wVersionRequested; WSADATA wsaData; if (initted) { return 0; } initted = 1; wVersionRequested = MAKEWORD(2, 2); if (WSAStartup(wVersionRequested, &wsaData) != 0) { fprintf(stderr, "WSAStartup failed: %s\n", win32_strerror(GetLastError())); return -1; } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { fprintf(stderr, "Bad winsock version: %d.%d\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); return -1; } return 0; } /* Convert a network address to a string. */ const char * inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { union { struct sockaddr sa; struct sockaddr_in sin; struct sockaddr_in6 sin6; } sa; DWORD ssz; DWORD sz = cnt; *dst = '\0'; memset(&sa, '\0', sizeof(sa)); switch (af) { case AF_INET: sa.sin.sin_addr = *(struct in_addr *)src; /* struct copy */ ssz = sizeof(struct sockaddr_in); break; case AF_INET6: sa.sin6.sin6_addr = *(struct in6_addr *)src; /* struct copy */ ssz = sizeof(struct sockaddr_in6); break; default: if (cnt > 0) { dst[0] = '\0'; } return NULL; } sa.sa.sa_family = af; if (WSAAddressToString(&sa.sa, ssz, NULL, dst, &sz) != 0) { if (cnt > 0) { dst[0] = '\0'; } return NULL; } return dst; } /* Decode a Win32 error number. */ const char * win32_strerror(int e) { static char buffer[4096]; if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), NULL)) { size_t sl; char c; /* Get rid of trailing CRLF. */ while ((sl = strlen(buffer)) > 0 && ((c = buffer[sl - 1]) == '\r' || c == '\n')) { buffer[sl - 1] = '\0'; } } else { sprintf(buffer, "Windows error %d", e); } return buffer; } /* * Windows version of perror(). */ void win32_perror(const char *fmt, ...) { va_list ap; char *buf; va_start(ap, fmt); (void) vasprintf(&buf, fmt, ap); va_end(ap); fprintf(stderr, "%s: %s\n", buf, win32_strerror(GetLastError())); fflush(stderr); free(buf); } #if defined(_MSC_VER) /*[*/ /* MinGW has gettimofday(), but MSVC does not. */ #define SECS_BETWEEN_EPOCHS 11644473600ULL #define SECS_TO_100NS 10000000ULL /* 10^7 */ int gettimeofday(struct timeval *tv, void *ignored) { FILETIME t; ULARGE_INTEGER u; GetSystemTimeAsFileTime(&t); memcpy(&u, &t, sizeof(ULARGE_INTEGER)); /* Isolate seconds and move epochs. */ tv->tv_sec = (DWORD)((u.QuadPart / SECS_TO_100NS) - SECS_BETWEEN_EPOCHS); tv->tv_usec = (u.QuadPart % SECS_TO_100NS) / 10ULL; return 0; } /* MinGW has getopt(), but MSVC does not. */ char *optarg; int optind = 1, opterr = 1, optopt; static const char *nextchar = NULL; int getopt(int argc, char * const argv[], const char *optstring) { char c; const char *s; if (optind == 1) { nextchar = argv[optind++]; } do { if (nextchar == argv[optind - 1]) { if (optind > argc) { --optind; /* went too far */ return -1; } if (nextchar == NULL) { --optind; /* went too far */ return -1; } if (!strcmp(nextchar, "--")) { return -1; } if (*nextchar++ != '-') { --optind; return -1; } } if ((c = *nextchar++) == '\0') { nextchar = argv[optind++]; } } while (nextchar == argv[optind - 1]); s = strchr(optstring, c); if (s == NULL) { if (opterr) { fprintf(stderr, "Unknown option '%c'\n", c); } return '?'; } if (*(s + 1) == ':') { if (*nextchar) { optarg = (char *)nextchar; nextchar = argv[optind++]; return c; } else if (optind < argc && argv[optind] != NULL) { optarg = (char *)argv[optind++]; nextchar = argv[optind++]; return c; } else { if (opterr) { fprintf(stderr, "Missing value after '%c'\n", c); } return -1; } } else { return c; } } #endif /*]*/ suite3270-3.6/Common/Win32/windirs.c0000775000076500007650000002553213221577163015163 0ustar pdmpdm/* * Copyright (c) 2006-2009, 2014-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * windirs.c * A Windows console-based 3270 Terminal Emulator * Find common directory paths. */ #include "globals.h" #include "windirs.h" /* Locate the desktop and appdata directories via the SHGetFolderPath API. */ static int get_dirs_shfp(char **desktop, char **appdata, char **common_desktop, char **common_appdata) { HRESULT r; if (desktop != NULL) { *desktop = malloc(MAX_PATH); if (*desktop == NULL) { return -1; } r = SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, SHGFP_TYPE_CURRENT, *desktop); if (r != S_OK) { fprintf(stderr, "SHGetFolderPath(DESKTOPDIRECTORY) failed: 0x%x\n", (int)r); return -1; } } if (appdata != NULL) { *appdata = malloc(MAX_PATH); if (*appdata == NULL) { return -1; } r = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, *appdata); if (r != S_OK) { fprintf(stderr, "SHGetFolderPath(APPDATA) failed: 0x%x\n", (int)r); return -1; } } if (common_desktop != NULL) { *common_desktop = malloc(MAX_PATH); if (*common_desktop == NULL) { return -1; } r = SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, SHGFP_TYPE_CURRENT, *common_desktop); if (r != S_OK) { fprintf(stderr, "SHGetFolderPath(COMMON_DESKTOPDIRECTORY) failed: " "0x%x\n", (int)r); return -1; } } if (common_appdata != NULL) { *common_appdata = malloc(MAX_PATH); if (*common_appdata == NULL) { return -1; } r = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, *common_appdata); if (r != S_OK) { fprintf(stderr, "SHGetFolderPath(COMMON_APPDATA) failed: 0x%x\n", (int)r); return -1; } } return 0; } /* Return the current working directory, always ending with a '\'. */ static char * getcwd_bsl(void) { char *wd; size_t sl; wd = _getcwd(NULL, 0); sl = strlen(wd); if (sl > 0 && wd[sl - 1] != '\\') { char *xwd; xwd = malloc(sl + 2); if (xwd == NULL) { return NULL; } strcpy(xwd, wd); strcat(xwd, "\\"); free(wd); wd = xwd; } return wd; } /** * Locate the installation, desktop and app-data directories. * Return them in malloc'd buffers, all with trailing backslashes. * Also return a flag indicating that the program was installed. * If returning AppData and the program is installed, make sure that the * directory exists. * * @param[in] appname application name (for app-data) * @param[out] instdir installation directory (or NULL) * @param[out] desktop desktop directory (or NULL) * @param[out] appdata app-data directory (or NULL) * @param[out] common_desktop common desktop directory (or NULL) * @param[out] common_appdata common app-data directory (or NULL) * @param[out] documents My Documents directory (or NULL) * @param[out] common_docunents common Documents directory (or NULL) * @param[out] docs3270 My Documents\{appname} directory (or NULL) * @param[out] common_docs3270 common Documents\{appname} directory (or NULL) * @param[out] flags Is the program installed? Does catf,exe exist? * * @returns true for success, false for an unrecoverable error. * * All returned directories end in '\'. * * Uses the presence of CATF.EXE to decide if the program is installed or * not. If not, appdata is returned as the cwd. */ bool get_dirs(char *appname, char **instdir, char **desktop, char **appdata, char **common_desktop, char **common_appdata, char **documents, char **common_documents, char **docs3270, char **common_docs3270, unsigned *flags) { char **xappdata = appdata; char **common_xappdata = common_appdata; bool is_installed = false; HRESULT r; char *d, *cd; HKEY key; HMODULE h; if (flags != NULL) { *flags = 0; } /* Check for the registry key to see if we are installed. */ if (RegOpenKeyEx(HKEY_CLASSES_ROOT, ".wc3270", 0, KEY_READ, &key) == ERROR_SUCCESS) { RegCloseKey(key); if (flags != NULL) { *flags |= GD_INSTALLED; } is_installed = true; } /* Check for CATF.EXE. */ h = LoadLibrary("CATF.EXE"); if (h != NULL) { FreeLibrary(h); if (flags != NULL) { *flags |= GD_CATF; } } /* * Use arg0 and GetFullPathName() to figure out the installation * directory. * * When the Session Wizard is run from the normal install directory, this * will produce the desired result. In no-install mode, this will also do * the right thing, assuming that they put wc3270.exe and wc3270wiz.exe * in the same place. * * The danger is if someone copies the Wizard somewhere different. We will * end up pointing at that directory. * * I can't use CSIDL_PROGRAMFILES, because the user can override it in the * installer. */ if (instdir != NULL) { /* Get the pathname of this program. */ HMODULE hModule = GetModuleHandle(NULL); char path[MAX_PATH]; char *bsl; GetModuleFileName(hModule, path, MAX_PATH); /* Chop it off after the last backslash. */ bsl = strrchr(path, '\\'); if (bsl == NULL) { /* Should not happen. */ *instdir = getcwd_bsl(); if (*instdir == NULL) { return false; } } else { *(bsl + 1) = '\0'; *instdir = malloc(strlen(path) + 1); if (*instdir == NULL) { return false; } strcpy(*instdir, path); } } /* If not installed, app-data and common app-data are cwd. */ if (!is_installed) { if (appdata != NULL) { *appdata = getcwd_bsl(); if (*appdata == NULL) { return false; } } if (common_appdata != NULL) { *common_appdata = getcwd_bsl(); if (*common_appdata == NULL) { return false; } } /* Keep get_dirs_shfp() from resolving it below. */ xappdata = NULL; common_xappdata = NULL; } if (desktop != NULL || xappdata != NULL) { char *wsl; /* Ask Windows where the directories are. */ if (get_dirs_shfp(desktop, xappdata, common_desktop, common_xappdata) < 0) { return false; } /* Append a trailing "\" to Desktop. */ if (desktop != NULL && (*desktop)[strlen(*desktop) - 1] != '\\') { wsl = malloc(strlen(*desktop) + 2); if (wsl == NULL) { return false; } sprintf(wsl, "%s\\", *desktop); free(*desktop); *desktop = wsl; } /* Append the application name and trailing "\" to AppData. */ if (xappdata != NULL) { size_t sl = strlen(*xappdata); wsl = malloc(sl + 1 + strlen(appname) + 2); if (wsl == NULL) { return false; } sprintf(wsl, "%s\\%s\\", *xappdata, appname); free(*xappdata); *xappdata = wsl; /* * Create the per-user AppData directory, in case the * program was installed by a different user. */ _mkdir(*xappdata); } /* Append a trailing "\" to CommonDesktop. */ if (common_desktop != NULL && *common_desktop != NULL && (*common_desktop)[strlen(*common_desktop) - 1] != '\\') { wsl = malloc(strlen(*common_desktop) + 2); if (wsl == NULL) { return false; } sprintf(wsl, "%s\\", *common_desktop); free(*common_desktop); *common_desktop = wsl; } /* Append the product name to CommonAppData. */ if (common_xappdata != NULL && *common_xappdata != NULL) { size_t sl = strlen(*common_xappdata); int add_bsl = 0; if ((*common_xappdata)[sl - 1] != '\\') { add_bsl = 1; } wsl = malloc(sl + add_bsl + strlen(appname) + 2); if (wsl == NULL) { return false; } sprintf(wsl, "%s%s%s\\", *common_xappdata, add_bsl? "\\": "", appname); _mkdir(wsl); free(*common_xappdata); *common_xappdata = wsl; } } /* Get the Documents directories. */ if (documents != NULL || docs3270 != NULL) { d = malloc(MAX_PATH + 1); if (d == NULL) { return false; } r = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, d); if (r != S_OK) { free(d); d = NULL; } else { strcat(d, "\\"); } if (documents != NULL) { *documents = d; } } if (common_documents != NULL || common_docs3270 != NULL) { cd = malloc(MAX_PATH); if (cd == NULL) { return false; } r = SHGetFolderPath(NULL, CSIDL_COMMON_DOCUMENTS, NULL, SHGFP_TYPE_CURRENT, cd); if (r != S_OK) { free(cd); cd = NULL; } else { strcat(cd, "\\"); } if (common_documents != NULL) { *common_documents = cd; } } if (d != NULL && docs3270 != NULL) { size_t sl = strlen(d) + strlen(appname) + 2; *docs3270 = malloc(sl); if (*docs3270 == NULL) { return false; } snprintf(*docs3270, sl, "%s%s\\", d, appname); } if (cd != NULL && common_docs3270 != NULL) { size_t sl = strlen(cd) + strlen(appname) + 2; *common_docs3270 = malloc(sl); if (*common_docs3270 == NULL) { return false; } snprintf(*common_docs3270, sl, "%s%s\\", cd, appname); } #if defined(DEBUG) /*[*/ printf("get_dirs: instdir '%s', desktop '%s', appdata '%s', " "common_desktop '%s', common_appdata '%s' " "documents '%s', common_documents '%s' " "docs3270 '%s', common_docs3270 '%s'\n", instdir? *instdir: "(none)", desktop? *desktop: "(none)", appdata? *appdata: "(none)", common_desktop? *common_desktop: "(none)", common_appdata? *common_appdata: "(none)", documents? *documents: "(none)", common_documents? *common_documents: "(none)", docs3270? *docs3270: "(none)", common_docs3270? *common_docs3270: "(none)"); printf("Enter..."); fflush(stdout); (void) getchar(); #endif /*]*/ return true; } suite3270-3.6/Common/Win32/winenv.mk0000775000076500007650000000103013221577163015162 0ustar pdmpdm# Common definitions for Windows makefiles. # Set the MinGW tools prefix and the _WIN32/64 symbols based on the WIN64 # environment variable. ifdef WIN64 GT_PFX = x86_64-w64-mingw32- WIN32_FLAGS = -D_WIN32 -D_WIN64 else GT_PFX = i686-w64-mingw32- WIN32_FLAGS = -D_WIN32 endif NATIVECC = gcc CC = $(GT_PFX)gcc AR = $(GT_PFX)ar WINDRES = $(GT_PFX)windres # Set the local executable suffix, depending on whether we are compiling on # Cygwin or Linux. OS = $(shell uname -o) ifeq ($(OS),Cygwin) NATIVE_SFX = .exe else NATIVE_SFX = endif suite3270-3.6/Common/Win32/winvers.c0000664000076500007650000000634713221577163015201 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2014, 2016-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * winvers.c * A Windows console-based 3270 Terminal Emulator * OS version query */ #include "globals.h" #include "winvers.h" #if defined(__GNUC__) /*[*/ /* MinGW doesn't have IsWindowsVersionOrGreater(). */ BOOL IsWindowsVersionOrGreater(WORD major_version, WORD minor_version, WORD service_pack_major) { OSVERSIONINFOEX version_info; DWORDLONG condition_mask = 0; memset(&version_info, 0, sizeof(OSVERSIONINFOEX)); version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); version_info.dwMajorVersion = major_version; version_info.dwMinorVersion = minor_version; version_info.wServicePackMajor = service_pack_major; VER_SET_CONDITION(condition_mask, VER_MAJORVERSION, VER_GREATER_EQUAL); VER_SET_CONDITION(condition_mask, VER_MINORVERSION, VER_GREATER_EQUAL); VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); return VerifyVersionInfo(&version_info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, condition_mask); } #endif /*]*/ int get_version_info(void) { /* * Enforce our version requirements explicitly, though chances are * missing DLL entry points will cause us to fall over long before we * get to here. */ if (!IsWindowsVersionOrGreater(5, 1, 0)) { fprintf(stderr, "Minimum supported Windows version is Windows XP " "(NT 5.1)\n"); return -1; } return 0; } /* Returns true if running under Wine. */ bool is_wine(void) { static const char *(CDECL *pwine_get_version)(void); HMODULE hntdll = GetModuleHandle("ntdll.dll"); if (!hntdll) { return false; } pwine_get_version = (void *)GetProcAddress(hntdll, "wine_get_version"); return pwine_get_version != NULL; } suite3270-3.6/Common/winprint.c0000664000076500007650000001760713221577163014455 0ustar pdmpdm/* * Copyright (c) 1994-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * winprint.c * Windows screen printing functions. */ #include "globals.h" #include "appres.h" #include "3270ds.h" #include "ctlr.h" #include "ctlrc.h" #include #include "popups.h" #include "resources.h" #include "print_screen.h" #include "trace.h" #include "utils.h" #include "winprint.h" #include #include #include "w3misc.h" /* Typedefs */ typedef struct { /* Windows screen print context */ char *filename; /* Name of file to print (and unlink) */ char *wp; /* Path of WORDPAD.EXE */ char *args; /* Parameters for Wordpad */ } wsp_t; /* Globals */ /* Statics */ /* * A Windows version of something like mkstemp(). Creates a temporary * file in $TEMP, returning its path and an open file descriptor. */ int win_mkstemp(char **path, ptype_t ptype) { char *s; int fd; unsigned gen = 0; while (gen < 1000) { s = getenv("TEMP"); if (s == NULL) { s = getenv("TMP"); } if (s == NULL) { s = "C:"; } if (gen) { *path = xs_buffer("%s\\x3h-%u-%u.%s", s, getpid(), gen, (ptype == P_RTF)? "rtf": "txt"); } else { *path = xs_buffer("%s\\x3h-%u.%s", s, getpid(), (ptype == P_RTF)? "rtf": "txt"); } fd = open(*path, O_CREAT | O_EXCL | O_RDWR, S_IREAD | S_IWRITE); if (fd >= 0) { break; } /* Try again. */ Free(*path); *path = NULL; if (errno != EEXIST) break; gen++; } return fd; } /* * Find WORDPAD.EXE. */ #define PROGRAMFILES "%ProgramFiles%" static char * find_wordpad(void) { char data[1024]; DWORD dlen; char *slash; static char *wp = NULL; HKEY key; if (wp != NULL) { return wp; } /* Get the shell print command for RTF files. */ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes\\rtffile\\shell\\print\\command", 0, KEY_READ, &key) != ERROR_SUCCESS) { return NULL; } dlen = sizeof(data); if (RegQueryValueEx(key, NULL, NULL, NULL, (LPVOID)data, &dlen) != ERROR_SUCCESS) { RegCloseKey(key); return NULL; } RegCloseKey(key); if (data[0] == '"') { char data2[1024]; char *q2; /* The first token is quoted; that's the path. */ strcpy(data2, data + 1); q2 = strchr(data2, '"'); if (q2 == NULL) { return NULL; } *q2 = '\0'; strcpy(data, data2); } else if ((slash = strchr(data, '/')) != NULL) { /* Find the "/p". */ *slash = '\0'; if (*(slash - 1) == ' ') *(slash - 1) = '\0'; } if (!strncasecmp(data, PROGRAMFILES, strlen(PROGRAMFILES))) { char *pf = getenv("PROGRAMFILES"); /* Substitute %ProgramFiles%. */ if (pf == NULL) { return NULL; } wp = xs_buffer("%s\\%s", pf, data + strlen(PROGRAMFILES)); } else { wp = NewString(data); } return wp; } /* Asynchronous thread to print a screen snapshot with Wordpad. */ static DWORD WINAPI run_wordpad(LPVOID lpParameter) { wsp_t *w = (wsp_t *)lpParameter; char *cmdline; STARTUPINFO si; PROCESS_INFORMATION pi; /* Run the command and wait for it to complete. */ cmdline = xs_buffer("\"%s\" %s", w->wp, w->args); memset(&si, '\0', sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; memset(&pi, '\0', sizeof(pi)); if (CreateProcess(NULL, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi)) { WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } Free(cmdline); /* Unlink the temporary file. */ (void) unlink(w->filename); /* * Free the memory. * This is a bit scary, but I believe it's thread-safe. * If not, I'll just leak the memory. */ Free(w->args); Free(w); /* No more need for the thread. */ ExitThread(0); return 0; } /* * Close a completed thread handle. */ static void close_wsh(iosrc_t fd, ioid_t id) { CloseHandle((HANDLE)fd); RemoveInput(id); if (appres.interactive.do_confirms) { popup_an_info("Screen image printed.\n"); } } /* Start WordPad to print something, synchronously. */ void start_wordpad_sync(const char *action_name, const char *filename, const char *printer) { char *wp; char *cmd; STARTUPINFO si; PROCESS_INFORMATION pi; /* Find WordPad. */ wp = find_wordpad(); if (wp == NULL) { popup_an_error("%s: Can't find WORDPAD.EXE", action_name); return; } /* Construct the command line. */ if (printer != NULL && printer[0]) { cmd = xs_buffer("\"%s\" /pt \"%s\" \"%s\"", wp, filename, printer); } else { cmd = xs_buffer("\"%s\" /p \"%s\"", wp, filename); } vtrace("%s command: %s\n", action_name, cmd); /* Run the command and wait for it to complete. */ memset(&si, '\0', sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; memset(&pi, '\0', sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi)) { popup_an_error("%s: WORDPAD start failure: %s", action_name, win32_strerror(GetLastError())); } else { WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } Free(cmd); } /* Start WordPad to print something, asynchonously. */ void start_wordpad_async(const char *action_name, const char *filename, const char *printer) { char *wp; wsp_t *w; char *args; HANDLE print_thread; /* Find WordPad. */ wp = find_wordpad(); if (wp == NULL) { popup_an_error("%s: Can't find WORDPAD.EXE", action_name); return; } /* Construct the command line. */ if (printer != NULL && printer[0]) { args = xs_buffer("/pt \"%s\" \"%s\"", filename, printer); } else { args = xs_buffer("/p \"%s\"", filename); } vtrace("%s command: \"%s\" %s\n", action_name, wp, args); /* * Create a thread to start WordPad, wait for it to terminate, and * delete the temporary file. */ w = Malloc(sizeof(wsp_t) + strlen(filename) + 1); w->filename = (char *)(w + 1); strcpy(w->filename, filename); w->wp = wp; w->args = args; print_thread = CreateThread(NULL, 0, run_wordpad, w, 0, NULL); if (print_thread == NULL) { popup_an_error("%s: Cannot create printing thread: %s\n", action_name, win32_strerror(GetLastError())); Free(w); Free(args); return; } /* * Make sure the thread handle is closed when the screen printing is * done. */ (void) AddInput(print_thread, close_wsh); } suite3270-3.6/Common/x3270if.c0000664000076500007650000004231513221577163013677 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Script interface utility for x3270, c3270, wc3270, s3270 and ws3270. * * Accesses an emulator command stream in one of several different ways: * * - (Unix only) Using the file descriptors defined by the environment * variables X3270OUTPUT (output from the emulator, input to script) and * X3270INPUT (input to the emulator, output from script). These are * automatically passed to child scripts by the Unix emulators' Script() * action. * * - Using a loopback IPv4 socket whose TCP port is defined by the * environment variable X3270PORT. This is automatically passed to child * scripts by the Windows emulators' Script() action. * * - (Unix only) Using the Unix-domain socket /tmp/x3sck.. This * socket is created by the Unix emulators' -socket option. * * - Using a loopback IPv4 socket whose TCP port is passed in explicitly. * This port is bound by the emulators by the -scriptport option. */ #include "globals.h" #if !defined(_WIN32) /*[*/ # include # include # include # include # include # include # include #endif /*]*/ #include "w3misc.h" #define IBS 4096 #define NO_STATUS (-1) #define ALL_FIELDS (-2) #if defined(_WIN32) /*[*/ #define DIRSEP '\\' #else /*][*/ #define DIRSEP '/' #endif /*]*/ static char *me; static int verbose = 0; static char buf[IBS]; static void iterative_io(int pid, unsigned short port); static void single_io(int pid, unsigned short port, int fn, char *cmd); static void x3270if_usage(void) { (void) fprintf(stderr, "\ usage:\n\ %s [options] \"action[(param[,...])]\"\n\ execute the named action\n\ %s [options] -s field\n\ display status field 0..12\n\ %s [options] -S\n\ display all status fields\n\ %s [options] -i\n\ shuttle commands and responses between stdin/stdout and emulator\n\ options:\n\ -v verbose operation\n" #if !defined(_WIN32) /*[*/ " -p pid connect to process \n" #endif /*]*/ " -t port connect to TCP port \n", me, me, me, me); exit(2); } /* Get a file descriptor from the environment. */ static int fd_env(const char *name) { char *fdname; int fd; fdname = getenv(name); if (fdname == NULL) { (void) fprintf(stderr, "%s: %s not set in the environment\n", me, name); exit(2); } fd = atoi(fdname); if (fd <= 0) { (void) fprintf(stderr, "%s: invalid value '%s' for %s\n", me, fdname, name); exit(2); } return fd; } int main(int argc, char *argv[]) { int c; int fn = NO_STATUS; char *ptr; int iterative = 0; int pid = 0; unsigned short port = 0; #if defined(_WIN32) /*[*/ if (sockstart() < 0) exit(1); #endif /*]*/ /* Identify yourself. */ if ((me = strrchr(argv[0], DIRSEP)) != NULL) { me++; } else { me = argv[0]; } /* Parse options. */ opterr = 0; while ((c = getopt(argc, argv, "ip:s:St:v")) != -1) { switch (c) { case 'i': if (fn >= 0) x3270if_usage(); iterative++; break; #if !defined(_WIN32) /*[*/ case 'p': pid = (int)strtoul(optarg, &ptr, 0); if (ptr == optarg || *ptr != '\0' || pid <= 0) { (void) fprintf(stderr, "%s: Invalid process ID: '%s'\n", me, optarg); x3270if_usage(); } break; #endif /*]*/ case 's': if (fn >= 0 || iterative) x3270if_usage(); fn = (int)strtol(optarg, &ptr, 0); if (ptr == optarg || *ptr != '\0' || fn < 0) { (void) fprintf(stderr, "%s: Invalid field number: '%s'\n", me, optarg); x3270if_usage(); } break; case 'S': if (fn >= 0 || iterative) x3270if_usage(); fn = ALL_FIELDS; break; case 't': port = (unsigned short)strtoul(optarg, &ptr, 0); if (ptr == optarg || *ptr != '\0' || port <= 0) { (void) fprintf(stderr, "%s: Invalid port: '%s'\n", me, optarg); x3270if_usage(); } break; case 'v': verbose++; break; default: x3270if_usage(); break; } } /* Validate positional arguments. */ if (optind == argc) { /* No positional arguments. */ if (fn == NO_STATUS && !iterative) x3270if_usage(); } else { /* Got positional arguments. */ if (iterative) x3270if_usage(); if (argc - optind > 1) { x3270if_usage(); } } if (pid && port) { x3270if_usage(); } #if !defined(_WIN32) /*[*/ /* Ignore broken pipes. */ (void) signal(SIGPIPE, SIG_IGN); #endif /*]*/ /* Do the I/O. */ if (iterative) iterative_io(pid, port); else single_io(pid, port, fn, argv[optind]); return 0; } #if !defined(_WIN32) /*[*/ /* Connect to a Unix-domain socket. */ static socket_t usock(int pid) { struct sockaddr_un ssun; socket_t fd; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd == INVALID_SOCKET) { perror("socket"); exit(2); } (void) memset(&ssun, '\0', sizeof(struct sockaddr_un)); ssun.sun_family = AF_UNIX; (void) snprintf(ssun.sun_path, sizeof(ssun.sun_path), "/tmp/x3sck.%d", pid); if (connect(fd, (struct sockaddr *)&ssun, sizeof(ssun)) < 0) { perror("connect"); exit(2); } return fd; } #endif /*]*/ /* Connect to a TCP socket. */ static socket_t tsock(unsigned short port) { struct sockaddr_in sin; socket_t fd; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd == INVALID_SOCKET) { #if defined(_WIN32) /*[*/ win32_perror("socket"); #else /*][*/ perror("socket"); #endif /*]*/ exit(2); } (void) memset(&sin, '\0', sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { #if defined(_WIN32) /*[*/ win32_perror("connect(%u)", port); #else /*][*/ perror("connect"); #endif /*]*/ exit(2); } return fd; } /* Do a single command, and interpret the results. */ static void single_io(int pid, unsigned short port, int fn, char *cmd) { char *port_env; int infd, outfd; socket_t insocket, outsocket; bool is_socket = false; char status[IBS] = ""; int nr; int xs = -1; int nw = 0; char rbuf[IBS]; int sl = 0; int done = 0; char *cmd_nl; char *wstr; /* Verify the environment and open files. */ #if !defined(_WIN32) /*[*/ if (pid) { insocket = outsocket = usock(pid); is_socket = true; } else #endif /*]*/ if (port) { insocket = outsocket = tsock(port); is_socket = true; } else if ((port_env = getenv("X3270PORT")) != NULL) { insocket = outsocket = tsock(atoi(port_env)); is_socket = true; } else { infd = fd_env("X3270OUTPUT"); outfd = fd_env("X3270INPUT"); } if ((!is_socket && infd < 0) || (is_socket && insocket == INVALID_SOCKET)) { perror("x3270if: input"); exit(2); } if ((!is_socket && outfd < 0) || (is_socket && outsocket == INVALID_SOCKET)) { perror("x3270if: output"); exit(2); } /* Speak to x3270. */ if (verbose) (void) fprintf(stderr, "i+ out %s\n", (cmd != NULL) ? cmd : ""); if (cmd != NULL) { cmd_nl = malloc(strlen(cmd) + 2); if (cmd_nl == NULL) { fprintf(stderr, "Out of memory\n"); exit(2); } sprintf(cmd_nl, "%s\n", cmd); wstr = cmd_nl; } else { cmd_nl = NULL; wstr = "\n"; } if (is_socket) { nw = send(outsocket, wstr, (int)strlen(wstr), 0); } else { nw = write(outfd, wstr, (int)strlen(wstr)); } if (nw < 0) { if (is_socket) #if defined(_WIN32) /*[*/ win32_perror("x3270if: send"); #else /*][*/ perror("x3270if: send"); #endif /*]*/ else perror("x3270if: write"); exit(2); } if (cmd_nl != NULL) free(cmd_nl); /* Get the answer. */ while (!done && (nr = (is_socket? recv(insocket, rbuf, IBS, 0): read(infd, rbuf, IBS))) > 0) { int i; int get_more = 0; i = 0; do { /* Copy from rbuf into buf until '\n'. */ while (i < nr && rbuf[i] != '\n') { if (sl < IBS - 1) buf[sl++] = rbuf[i++]; } if (rbuf[i] == '\n') i++; else { /* Go get more input. */ get_more = 1; break; } /* Process one line of output. */ buf[sl] = '\0'; if (verbose) (void) fprintf(stderr, "i+ in %s\n", buf); if (!strcmp(buf, "ok")) { (void) fflush(stdout); xs = 0; done = 1; break; } else if (!strcmp(buf, "error")) { (void) fflush(stdout); xs = 1; done = 1; break; } else if (!strncmp(buf, "data: ", 6)) { if (printf("%s\n", buf + 6) < 0) { perror("x3270if: printf"); exit(2); } } else (void) strcpy(status, buf); /* Get ready for the next. */ sl = 0; } while (i < nr); if (get_more) { get_more = 0; continue; } } if (nr < 0) { if (is_socket) #if defined(_WIN32) /*[*/ win32_perror("x3270if: recv"); #else /*][*/ perror("recv"); #endif /*]*/ else perror("read"); exit(2); } else if (nr == 0) { fprintf(stderr, "x3270if: unexpected EOF\n"); exit(2); } if (fflush(stdout) < 0) { perror("x3270if: fflush"); exit(2); } /* Print status, if that's what they want. */ if (fn != NO_STATUS) { char *sf = NULL; char *sb = status; int rc; if (fn == ALL_FIELDS) { rc = printf("%s\n", status); } else { do { if (!fn--) break; sf = strtok(sb, " \t"); sb = NULL; } while (sf != NULL); rc = printf("%s\n", (sf != NULL) ? sf : ""); } if (rc < 0) { perror("x3270if: printf"); exit(2); } } if (fflush(stdout) < 0) { perror("x3270if: fflush"); exit(2); } if (is_socket) { shutdown(insocket, 2); #if defined(_WIN32) /*[*/ closesocket(insocket); #else /*][*/ close(insocket); #endif /*]*/ } exit(xs); } #if !defined(_WIN32) /*[*/ /* Act as a passive pipe to the emulator. */ static void iterative_io(int pid, unsigned short port) { # define N_IO 2 struct { const char *name; int rfd, wfd; char buf[IBS]; int offset, count; } io[N_IO]; /* [0] is script->emulator, [1] is emulator->script */ fd_set rfds, wfds; int fd_max = 0; int i; char *port_env; #ifdef DEBUG if (verbose) { freopen("/tmp/x3270if.dbg", "w", stderr); setlinebuf(stderr); } #endif /* Get the x3270 file descriptors. */ io[0].name = "script->emulator"; io[0].rfd = fileno(stdin); #if !defined(_WIN32) /*[*/ if (pid) io[0].wfd = usock(pid); else #endif /*]*/ if (port) { io[0].wfd = tsock(port); } else if ((port_env = getenv("X3270PORT")) != NULL) { io[0].wfd = tsock(atoi(port_env)); } else { io[0].wfd = fd_env("X3270INPUT"); } io[1].name = "emulator->script"; if (pid || port || (port_env != NULL)) { io[1].rfd = dup(io[0].wfd); } else { io[1].rfd = fd_env("X3270OUTPUT"); } io[1].wfd = fileno(stdout); for (i = 0; i < N_IO; i++) { if (io[i].rfd > fd_max) fd_max = io[i].rfd; if (io[i].wfd > fd_max) fd_max = io[i].wfd; io[i].offset = 0; io[i].count = 0; } fd_max++; for (;;) { int rv; FD_ZERO(&rfds); FD_ZERO(&wfds); for (i = 0; i < N_IO; i++) { if (io[i].count) { FD_SET(io[i].wfd, &wfds); #ifdef DEBUG if (verbose) (void) fprintf(stderr, "enabling output %s %d\n", io[i].name, io[i].wfd); #endif } else { FD_SET(io[i].rfd, &rfds); #ifdef DEBUG if (verbose) (void) fprintf(stderr, "enabling input %s %d\n", io[i].name, io[i].rfd); #endif } } if ((rv = select(fd_max, &rfds, &wfds, NULL, NULL)) < 0) { perror("x3270if: select"); exit(2); } if (verbose) { (void) fprintf(stderr, "select->%d\n", rv); } for (i = 0; i < N_IO; i++) { if (io[i].count) { if (FD_ISSET(io[i].wfd, &wfds)) { rv = write(io[i].wfd, io[i].buf + io[i].offset, io[i].count); if (rv < 0) { (void) fprintf(stderr, "x3270if: write(%s): %s", io[i].name, strerror(errno)); exit(2); } io[i].offset += rv; io[i].count -= rv; #ifdef DEBUG if (verbose) { (void) fprintf(stderr, "write(%s)->%d\n", io[i].name, rv); } #endif } } else if (FD_ISSET(io[i].rfd, &rfds)) { rv = read(io[i].rfd, io[i].buf, IBS); if (rv < 0) { (void) fprintf(stderr, "x3270if: read(%s): %s", io[i].name, strerror(errno)); exit(2); } if (rv == 0) exit(0); io[i].offset = 0; io[i].count = rv; #ifdef DEBUG if (verbose) { (void) fprintf(stderr, "read(%s)->%d\n", io[i].name, rv); } #endif } } } } #else /*][*/ static HANDLE stdin_thread; static HANDLE stdin_enable_event, stdin_done_event; static char stdin_buf[256]; static int stdin_nr; static int stdin_error; /* * stdin input thread * * Endlessly: * - waits for stdin_enable_event * - reads from stdin * - leaves the input in stdin_buf and the length in stdin_nr * - sets stdin_done_event * * If there is a read error, leaves -1 in stdin_nr and a Windows error code in * stdin_error. */ static DWORD WINAPI stdin_read(LPVOID lpParameter) { for (;;) { DWORD rv; rv = WaitForSingleObject(stdin_enable_event, INFINITE); switch (rv) { case WAIT_ABANDONED: case WAIT_TIMEOUT: case WAIT_FAILED: stdin_nr = -1; stdin_error = GetLastError(); SetEvent(stdin_done_event); break; case WAIT_OBJECT_0: stdin_nr = read(0, stdin_buf, sizeof(stdin_buf)); if (stdin_nr < 0) { stdin_error = GetLastError(); } SetEvent(stdin_done_event); break; } } return 0; } /* Act as a passive pipe to the emulator. */ static void iterative_io(int pid, unsigned short port) { char *port_env; socket_t s; struct sockaddr_in sin; HANDLE socket_event; HANDLE ha[2]; DWORD ret; char buf[1024]; int nr; if (!port) { port_env = getenv("X3270PORT"); if (port_env == NULL) { fprintf(stderr, "Must specify port or put port in " "X3270PORT.\n"); exit(2); } port = atoi(port_env); if (port <= 0 || (port & ~0xffff)) { fprintf(stderr, "Invalid X3270PORT.\n"); exit(2); } } /* Open the socket. */ s = socket(PF_INET, SOCK_STREAM, 0); if (s < 0) { fprintf(stderr, "socket failed: error 0x%x\n", (unsigned)WSAGetLastError()); exit(2); } memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { win32_perror("connect(%u) failed", port); exit(2); } if (verbose) { fprintf(stderr, "\n", port); } socket_event = CreateEvent(NULL, FALSE, FALSE, NULL); if (socket_event == NULL) { win32_perror("CreateEvent failed"); exit(2); } if (WSAEventSelect(s, socket_event, FD_READ|FD_CLOSE) != 0) { win32_perror("WSAEventSelect failed"); exit(2); } /* Create a thread to read data from the socket. */ stdin_enable_event = CreateEvent(NULL, FALSE, FALSE, NULL); stdin_done_event = CreateEvent(NULL, FALSE, FALSE, NULL); stdin_thread = CreateThread(NULL, 0, stdin_read, NULL, 0, NULL); if (stdin_thread == NULL) { win32_perror("CreateThread failed"); exit(2); } SetEvent(stdin_enable_event); ha[0] = socket_event; ha[1] = stdin_done_event; for (;;) { ret = WaitForMultipleObjects(2, ha, FALSE, INFINITE); switch (ret) { case WAIT_OBJECT_0: /* socket input */ nr = recv(s, buf, sizeof(buf), 0); if (verbose) { fprintf(stderr, "<%d byte%s from socket>\n", nr, (nr == 1)? "": "s"); } if (nr < 0) { win32_perror("recv failed"); exit(2); } if (nr == 0) { exit(0); } fwrite(buf, 1, nr, stdout); fflush(stdout); break; case WAIT_OBJECT_0 + 1: /* stdin input */ if (verbose) { fprintf(stderr, "<%d byte%s from stdin>\n", stdin_nr, (stdin_nr == 1)? "": "s"); } if (stdin_nr < 0) { fprintf(stderr, "stdin read failed: %s\n", win32_strerror(stdin_error)); exit(2); } if (stdin_nr == 0) { exit(0); } (void) send(s, stdin_buf, stdin_nr, 0); SetEvent(stdin_enable_event); break; case WAIT_FAILED: win32_perror("WaitForMultipleObjects failed"); exit(2); default: fprintf(stderr, "Unexpected return %d from " "WaitForMultipleObjects\n", (int)ret); exit(2); } } } #endif /*]*/ suite3270-3.6/Common/xio.c0000664000076500007650000001126313221577163013372 0ustar pdmpdm/* * Copyright (c) 1993-2013, 2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR * GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * xio.c * Low-level I/O setup functions and exit code. */ #include "globals.h" #include "actions.h" #include "telnet.h" #include "utils.h" #include "xio.h" /* Globals. */ int x3270_exit_code = 0; /* Statics. */ static ioid_t ns_read_id; static ioid_t ns_exception_id; static bool reading = false; static bool excepting = false; /* * Called to set up input on a new network connection. */ void x_add_input(iosrc_t iosrc) { ns_exception_id = AddExcept(iosrc, net_exception); excepting = true; ns_read_id = AddInput(iosrc, net_input); reading = true; } /* * Called when an exception is received to disable further exceptions. */ void x_except_off(void) { if (excepting) { RemoveInput(ns_exception_id); excepting = false; } } /* * Called when exception processing is complete to re-enable exceptions. * This includes removing and restoring reading, so the exceptions are always * processed first. */ void x_except_on(iosrc_t iosrc) { if (excepting) { return; } if (reading) { RemoveInput(ns_read_id); } ns_exception_id = AddExcept(iosrc, net_exception); excepting = true; if (reading) { ns_read_id = AddInput(iosrc, net_input); } } /* * Called to disable input on a closing network connection. */ void x_remove_input(void) { if (reading) { RemoveInput(ns_read_id); reading = false; } if (excepting) { RemoveInput(ns_exception_id); excepting = false; } } /* * Application exit, with cleanup. */ void x3270_exit(int n) { static bool already_exiting = false; /* Handle unintentional recursion. */ if (already_exiting) { return; } already_exiting = true; /* Set the exit code. */ x3270_exit_code = n; /* Flush any pending output (mostly for Windows). */ fflush(stdout); fflush(stderr); /* Tell everyone else who's interested. */ st_changed(ST_EXITING, true); #if !defined(_WIN32) /*[*/ exit(n); #else /*][*/ /* * On Windows, call ExitProcess() instead of the POSIXish exit(). * Apparently calling exit() in a ConsoleCtrlHandler is a bad thing on * XP, and causes a hang. */ ExitProcess(n); #endif /*]*/ } static bool Quit_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Quit", ia, argc, argv); if (check_argc("Quit", argc, 0, 0) < 0) { return false; } /* * We allow Quit() to succeed if invoked from anything besides a keymap, and * from a keymap if we're not connected. * * This test is imperfect. Someone could put a Source() in a keymap and * read in a file that includes a Quit(). If we are connected, it will * fail. */ if (ia != IA_KEYMAP || !CONNECTED) { x3270_exit(0); } return false; } /* * X I/O module registration. */ void xio_register(void) { static action_table_t xio_actions[] = { { "Quit", Quit_action, ACTION_KE }, { "Exit", Quit_action, ACTION_KE } }; /* Register our actions. */ register_actions(xio_actions, array_count(xio_actions)); } suite3270-3.6/Common/xs_buffer.c0000664000076500007650000000510513221577163014554 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * xs_buffer.c * Simplified version of asprintf/vsprintf. */ #include "globals.h" #include "asprintf.h" #include "utils.h" /** * Local variation of vasprintf(). Returns the buffer instead of a count, and * crashes if it runs out of memory. * * @param[in] fmt printf format string * @param[in] args argument list * * @return malloc'd buffer, guaranteed not to be NULL. Must free() when done. */ char * xs_vbuffer(const char *fmt, va_list args) { char *r = NULL; int nw; nw = vasprintf(&r, fmt, args); if (nw < 0) { Error("xs_vbuffer: vasprintf failure"); } if (r == NULL) { Error("Out of memory"); } return r; } /** * Local variation of vsprintf(). Returns the buffer instead of a count, and * crashes if it runs out of memory. * * @param[in] fmt printf format string * * @return malloc'd buffer, guaranteed not to be NULL. Must free() when done. */ char * xs_buffer(const char *fmt, ...) { va_list args; char *r; va_start(args, fmt); r = xs_vbuffer(fmt, args); va_end(args); return r; } suite3270-3.6/Common/XtGlue.c0000664000076500007650000005665113221577163014015 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* glue for missing Xt code */ #include "globals.h" #include "glue.h" #include "appres.h" #include "latin1.h" #include "trace.h" #include "utils.h" #if defined(_WIN32) /*[*/ # include "xio.h" #endif /*]*/ #include #include #include #include #include #if defined(SEPARATE_SELECT_H) /*[*/ # include #endif /*]*/ #define InputReadMask 0x1 #define InputExceptMask 0x2 #define InputWriteMask 0x4 #define MILLION 1000000L void (*Error_redirect)(const char *) = NULL; void (*Warning_redirect)(const char *) = NULL; void Error(const char *s) { if (Error_redirect != NULL) { (*Error_redirect)(s); return; } fprintf(stderr, "Error: %s\n", s); fflush(stderr); exit(1); } void Warning(const char *s) { if (Warning_redirect != NULL) { (*Warning_redirect)(s); } else { fprintf(stderr, "Warning: %s\n", s); fflush(stderr); } any_error_output = true; } static struct { /*const*/ char *name; /* not const because of ancient X11 API */ latin1_symbol_t key; } latin1[] = { /* HTML entities and X11 KeySym names. */ { "sp", latin1_sp }, { "space", latin1_sp }, { "excl", latin1_excl }, { "exclam", latin1_excl }, { "quot", latin1_quot }, { "quotedbl", latin1_quot }, { "num", latin1_num }, { "numbersign", latin1_num }, { "dollar", latin1_dollar }, { "percnt", latin1_percnt }, { "percent", latin1_percnt }, { "amp", latin1_amp }, { "ampersand", latin1_amp }, { "apos", latin1_apos }, { "apostrophe", latin1_apos }, { "quoteright", latin1_apos }, { "lpar", latin1_lpar }, { "parenleft", latin1_lpar }, { "rpar", latin1_rpar }, { "parenright", latin1_rpar }, { "ast", latin1_ast }, { "asterisk", latin1_ast }, { "plus", latin1_plus }, { "comma", latin1_comma }, { "minus", latin1_minus }, { "hyphen", latin1_minus }, /* There is a conflict here between HTML and X11, which uses 'hyphen' for shy (U+00AD). HTML wins. */ { "period", latin1_period }, { "sol", latin1_sol }, { "slash", latin1_sol }, { "0", latin1_0 }, { "1", latin1_1 }, { "2", latin1_2 }, { "3", latin1_3 }, { "4", latin1_4 }, { "5", latin1_5 }, { "6", latin1_6 }, { "7", latin1_7 }, { "8", latin1_8 }, { "9", latin1_9 }, { "colon", latin1_colon }, { "semi", latin1_semi }, { "semicolon", latin1_semi }, { "lt", latin1_lt }, { "less", latin1_lt }, { "equals", latin1_equals }, { "equal", latin1_equals }, { "gr", latin1_gt }, { "greater", latin1_gt }, { "quest", latin1_quest }, { "question", latin1_quest }, { "commat", latin1_commat }, { "at", latin1_commat }, { "A", latin1_A }, { "B", latin1_B }, { "C", latin1_C }, { "D", latin1_D }, { "E", latin1_E }, { "F", latin1_F }, { "G", latin1_G }, { "H", latin1_H }, { "I", latin1_I }, { "J", latin1_J }, { "K", latin1_K }, { "L", latin1_L }, { "M", latin1_M }, { "N", latin1_N }, { "O", latin1_O }, { "P", latin1_P }, { "Q", latin1_Q }, { "R", latin1_R }, { "S", latin1_S }, { "T", latin1_T }, { "U", latin1_U }, { "V", latin1_V }, { "W", latin1_W }, { "X", latin1_X }, { "Y", latin1_Y }, { "Z", latin1_Z }, { "lsqb", latin1_lsqb }, { "bracketleft", latin1_lsqb }, { "bsol", latin1_bsol }, { "backslash", latin1_bsol }, { "rsqb", latin1_rsqb }, { "bracketright", latin1_rsqb }, { "circ", latin1_circ }, { "asciicircum", latin1_circ }, { "lowbar", latin1_lowbar }, { "horbar", latin1_lowbar }, { "underscore", latin1_lowbar }, { "grave", latin1_grave }, { "quoteleft", latin1_grave }, { "a", latin1_a }, { "b", latin1_b }, { "c", latin1_c }, { "d", latin1_d }, { "e", latin1_e }, { "f", latin1_f }, { "g", latin1_g }, { "h", latin1_h }, { "i", latin1_i }, { "j", latin1_j }, { "k", latin1_k }, { "l", latin1_l }, { "m", latin1_m }, { "n", latin1_n }, { "o", latin1_o }, { "p", latin1_p }, { "q", latin1_q }, { "r", latin1_r }, { "s", latin1_s }, { "t", latin1_t }, { "u", latin1_u }, { "v", latin1_v }, { "w", latin1_w }, { "x", latin1_x }, { "y", latin1_y }, { "z", latin1_z }, { "lcub", latin1_lcub }, { "braceleft", latin1_lcub }, { "verbar", latin1_verbar }, { "bar", latin1_verbar }, { "rcub", latin1_rcub }, { "braceright", latin1_rcub }, { "tilde", latin1_tilde }, { "asciitilde", latin1_tilde }, { "nbsp", latin1_nbsp }, { "nobreakspace", latin1_nbsp }, { "iexcl", latin1_iexcl }, { "exclamdown", latin1_iexcl }, { "cent", latin1_cent }, { "pound", latin1_pound }, { "sterling", latin1_pound }, { "curren", latin1_curren }, { "currency", latin1_curren }, { "yen", latin1_yen }, { "brkbar", latin1_brkbar }, { "brvbar", latin1_brkbar }, { "brokenbar", latin1_brkbar }, { "sect", latin1_sect }, { "section", latin1_sect }, { "uml", latin1_uml }, { "die", latin1_uml }, { "diaeresis", latin1_uml }, { "copy", latin1_copy }, { "copyright", latin1_copy }, { "ordf", latin1_ordf }, { "ordfeminine", latin1_ordf }, { "laquo", latin1_laquo }, { "guillemotleft",latin1_laquo }, { "not", latin1_not }, { "notsign", latin1_not }, { "shy", latin1_shy }, { "reg", latin1_reg }, { "registered", latin1_reg }, { "macr", latin1_macr }, { "hibar", latin1_macr }, { "macron", latin1_macr }, { "deg", latin1_deg }, { "degree", latin1_deg }, { "plusmn", latin1_plusmn }, { "plusminus", latin1_plusmn }, { "sup2", latin1_sup2 }, { "twosuperior", latin1_sup2 }, { "sup3", latin1_sup3 }, { "threesuperior",latin1_sup3 }, { "acute", latin1_acute }, { "micro", latin1_micro }, { "mu", latin1_micro }, { "para", latin1_para }, { "paragraph", latin1_para }, { "middot", latin1_middot }, { "periodcentered",latin1_middot }, { "cedil", latin1_cedil }, { "cedilla", latin1_cedil }, { "sup1", latin1_sup1 }, { "onesuperior", latin1_sup1 }, { "ordm", latin1_ordm }, { "masculine", latin1_ordm }, { "raquo", latin1_raquo }, { "guillemotright",latin1_raquo }, { "frac14", latin1_frac14 }, { "onequarter", latin1_frac14 }, { "frac12", latin1_frac12 }, { "half", latin1_frac12 }, { "onehalf", latin1_frac12 }, { "frac34", latin1_frac34 }, { "threequarters",latin1_frac34 }, { "iquest", latin1_iquest }, { "questiondown", latin1_iquest }, { "Agrave", latin1_Agrave }, { "Aacute", latin1_Aacute }, { "Acirc", latin1_Acirc }, { "Acircumflex", latin1_Acirc }, { "Atilde", latin1_Atilde }, { "Auml", latin1_Auml }, { "Adiaeresis", latin1_Auml }, { "Aring", latin1_Aring }, { "AElig", latin1_AElig }, { "AE", latin1_AElig }, { "Ccedil", latin1_Ccedil }, { "Ccedilla", latin1_Ccedil }, { "Egrave", latin1_Egrave }, { "Eacute", latin1_Eacute }, { "Ecirc", latin1_Ecirc }, { "Ecircumflex", latin1_Ecirc }, { "Euml", latin1_Euml }, { "Ediaeresis", latin1_Euml }, { "Igrave", latin1_Igrave }, { "Iacute", latin1_Iacute }, { "Icirc", latin1_Icirc }, { "Icircumflex", latin1_Icirc }, { "Iuml", latin1_Iuml }, { "Idiaeresis", latin1_Iuml }, { "ETH", latin1_ETH }, { "Eth", latin1_ETH }, { "Ntilde", latin1_Ntilde }, { "Ograve", latin1_Ograve }, { "Oacute", latin1_Oacute }, { "Ocirc", latin1_Ocirc }, { "Ocircumflex", latin1_Ocirc }, { "Otilde", latin1_Otilde }, { "Ouml", latin1_Ouml }, { "Odiaeresis", latin1_Ouml }, { "times", latin1_times }, { "multiply", latin1_times }, { "Oslash", latin1_Oslash }, { "Ooblique", latin1_Oslash }, { "Ugrave", latin1_Ugrave }, { "Uacute", latin1_Uacute }, { "Ucirc", latin1_Ucirc }, { "Ucircumflex", latin1_Ucirc }, { "Uuml", latin1_Uuml }, { "Udiaeresis", latin1_Uuml }, { "Yacute", latin1_Yacute }, { "THORN", latin1_THORN }, { "Thorn", latin1_THORN }, { "szlig", latin1_szlig }, { "ssharp", latin1_szlig }, { "agrave", latin1_agrave }, { "aacute", latin1_aacute }, { "acirc", latin1_acirc }, { "acircumflex", latin1_acirc }, { "atilde", latin1_atilde }, { "auml", latin1_auml }, { "adiaeresis", latin1_auml }, { "aring", latin1_aring }, { "aelig", latin1_aelig }, { "ae", latin1_aelig }, { "ccedil", latin1_ccedil }, { "ccedilla", latin1_ccedil }, { "egrave", latin1_egrave }, { "eacute", latin1_eacute }, { "ecirc", latin1_ecirc }, { "ecircumflex", latin1_ecirc }, { "euml", latin1_euml }, { "ediaeresis", latin1_euml }, { "igrave", latin1_igrave }, { "iacute", latin1_iacute }, { "icirc", latin1_icirc }, { "icircumflex", latin1_icirc }, { "iuml", latin1_iuml }, { "idiaeresis", latin1_iuml }, { "eth", latin1_eth }, { "ntilde", latin1_ntilde }, { "ograve", latin1_ograve }, { "oacute", latin1_oacute }, { "ocirc", latin1_ocirc }, { "ocircumflex", latin1_ocirc }, { "otilde", latin1_otilde }, { "ouml", latin1_ouml }, { "odiaeresis", latin1_ouml }, { "divide", latin1_divide }, { "division", latin1_divide }, { "oslash", latin1_oslash }, { "ugrave", latin1_ugrave }, { "uacute", latin1_uacute }, { "ucirc", latin1_ucirc }, { "ucircumflex", latin1_ucirc }, { "uuml", latin1_uuml }, { "udiaeresis", latin1_uuml }, { "yacute", latin1_yacute }, { "thorn", latin1_thorn }, { "yuml", latin1_yuml }, { "ydiaeresis", latin1_yuml }, /* * The following are, umm, hacks to allow symbolic names for * control codes. */ #if !defined(_WIN32) /*[*/ { "BackSpace", 0x08 }, { "Tab", 0x09 }, { "LineFeed", 0x0a }, { "Return", 0x0d }, { "Escape", 0x1b }, { "Delete", 0x7f }, #endif /*]*/ { NULL, 0 } }; ks_t string_to_key(char *s) { int i; if (strlen(s) == 1 && (*(unsigned char *)s & 0x7f) > ' ') { return *(unsigned char *)s; } for (i = 0; latin1[i].name != NULL; i++) { if (!strcmp(s, latin1[i].name)) { return latin1[i].key; } } return KS_NONE; } char * key_to_string(ks_t k) { int i; for (i = 0; latin1[i].name != NULL; i++) { if (latin1[i].key == k) { return latin1[i].name; } } return NULL; } /* Timeouts. */ #if defined(_WIN32) /*[*/ static void ms_ts(unsigned long long *u) { FILETIME t; /* Get the system time, in 100ns units. */ GetSystemTimeAsFileTime(&t); memcpy(u, &t, sizeof(unsigned long long)); /* Divide by 10,000 to get ms. */ *u /= 10000ULL; } #endif /*]*/ typedef struct timeout { struct timeout *next; #if defined(_WIN32) /*[*/ unsigned long long ts; #else /*][*/ struct timeval tv; #endif /*]*/ tofn_t proc; bool in_play; } timeout_t; static timeout_t *timeouts = NULL; ioid_t AddTimeOut(unsigned long interval_ms, tofn_t proc) { timeout_t *t_new; timeout_t *t; timeout_t *prev = NULL; t_new = (timeout_t *)Malloc(sizeof(timeout_t)); t_new->proc = proc; t_new->in_play = false; #if defined(_WIN32) /*[*/ ms_ts(&t_new->ts); t_new->ts += interval_ms; #else /*][*/ (void) gettimeofday(&t_new->tv, NULL); t_new->tv.tv_sec += interval_ms / 1000L; t_new->tv.tv_usec += (interval_ms % 1000L) * 1000L; if (t_new->tv.tv_usec > MILLION) { t_new->tv.tv_sec += t_new->tv.tv_usec / MILLION; t_new->tv.tv_usec %= MILLION; } #endif /*]*/ /* Find where to insert this item. */ for (t = timeouts; t != NULL; t = t->next) { #if defined(_WIN32) /*[*/ if (t->ts > t_new->ts) #else /*][*/ if (t->tv.tv_sec > t_new->tv.tv_sec || (t->tv.tv_sec == t_new->tv.tv_sec && t->tv.tv_usec > t_new->tv.tv_usec)) #endif /*]*/ { break; } prev = t; } /* Insert it. */ if (prev == NULL) { /* Front. */ t_new->next = timeouts; timeouts = t_new; } else if (t == NULL) { /* Rear. */ t_new->next = NULL; prev->next = t_new; } else { /* Middle. */ t_new->next = t; prev->next = t_new; } return (ioid_t)t_new; } void RemoveTimeOut(ioid_t timer) { timeout_t *st = (timeout_t *)timer; timeout_t *t; timeout_t *prev = NULL; if (st->in_play) { return; } for (t = timeouts; t != NULL; t = t->next) { if (t == st) { if (prev != NULL) { prev->next = t->next; } else { timeouts = t->next; } Free(t); return; } prev = t; } } /* Input events. */ typedef struct input { struct input *next; iosrc_t source; int condition; iofn_t proc; } input_t; static input_t *inputs = NULL; static bool inputs_changed = false; ioid_t AddInput(iosrc_t source, iofn_t fn) { input_t *ip; assert(source != INVALID_IOSRC); ip = (input_t *)Malloc(sizeof(input_t)); ip->source = source; ip->condition = InputReadMask; ip->proc = fn; ip->next = inputs; inputs = ip; inputs_changed = true; return (ioid_t)ip; } ioid_t AddExcept(iosrc_t source, iofn_t fn) { #if defined(_WIN32) /*[*/ return 0; #else /*][*/ input_t *ip; ip = (input_t *)Malloc(sizeof(input_t)); ip->source = source; ip->condition = InputExceptMask; ip->proc = fn; ip->next = inputs; inputs = ip; inputs_changed = true; return (ioid_t)ip; #endif /*]*/ } #if !defined(_WIN32) /*[*/ ioid_t AddOutput(iosrc_t source, iofn_t fn) { input_t *ip; ip = (input_t *)Malloc(sizeof(input_t)); ip->source = source; ip->condition = InputWriteMask; ip->proc = fn; ip->next = inputs; inputs = ip; inputs_changed = true; return (ioid_t)ip; } #endif /*]*/ void RemoveInput(ioid_t id) { input_t *ip; input_t *prev = NULL; for (ip = inputs; ip != NULL; ip = ip->next) { if (ip == (input_t *)id) { break; } prev = ip; } if (ip == NULL) { return; } if (prev != NULL) { prev->next = ip->next; } else { inputs = ip->next; } Free(ip); inputs_changed = true; } #if defined(_WIN32) /*[*/ #define MAX_HA 256 #endif /*]*/ /* * Inner event dispatcher. * Processes one or more pending I/O and timeout events. * Waits for the first event if block is true. * Returns in *processed_any if any events were processed. * * Returns true if all pending events have been processed. * Returns false if the set of events changed while events were being processed * and new ones may be ready; this function should be called again (with block * set to false) to try to process them. */ static bool process_some_events(bool block, bool *processed_any) { #if defined(_WIN32) /*[*/ HANDLE ha[MAX_HA]; DWORD nha; DWORD tmo; DWORD ret; unsigned long long now; int i; #else /*][*/ fd_set rfds, wfds, xfds; int ns; struct timeval now, twait, *tp; #endif /*]*/ input_t *ip, *ip_next; struct timeout *t; bool any_events_pending; # if defined(_WIN32) /*[*/ # define SOURCE_READY (ret == WAIT_OBJECT_0 + i) # define WAIT_BAD (ret == WAIT_FAILED) # define GET_TS(v) ms_ts(v) # define EXPIRED(t, now) (t->ts <= now) # else /*][*/ # define SOURCE_READY FD_ISSET(ip->source, &rfds) # define WAIT_BAD (ns < 0) # define GET_TS(v) (void) gettimeofday(v, NULL); # define EXPIRED(t, now) (t->tv.tv_sec < now.tv_sec || \ (t->tv.tv_sec == now.tv_sec && \ t->tv.tv_usec < now.tv_usec)) # endif /*]*/ *processed_any = false; any_events_pending = false; #if defined(_WIN32) /*[*/ nha = 0; #else /*][*/ FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&xfds); #endif /*]*/ for (ip = inputs; ip != NULL; ip = ip->next) { /* Set pending input event. */ if ((unsigned long)ip->condition & InputReadMask) { #if defined(_WIN32) /*[*/ ha[nha++] = ip->source; #else /*][*/ FD_SET(ip->source, &rfds); #endif /*]*/ any_events_pending = true; } #if !defined(_WIN32) /*[*/ /* Set pending output event. */ if ((unsigned long)ip->condition & InputWriteMask) { FD_SET(ip->source, &wfds); any_events_pending = true; } /* Set pending exception event. */ if ((unsigned long)ip->condition & InputExceptMask) { FD_SET(ip->source, &xfds); any_events_pending = true; } #endif /*]*/ } if (block) { if (timeouts != NULL) { /* Compute how long to wait for the first event. */ GET_TS(&now); #if defined(_WIN32) /*[*/ if (now > timeouts->ts) { tmo = 0; } else { tmo = (DWORD)(timeouts->ts - now); } #else /*][*/ twait.tv_sec = timeouts->tv.tv_sec - now.tv_sec; twait.tv_usec = timeouts->tv.tv_usec - now.tv_usec; if (twait.tv_usec < 0L) { twait.tv_sec--; twait.tv_usec += MILLION; } if (twait.tv_sec < 0L) { twait.tv_sec = twait.tv_usec = 0L; } tp = &twait; #endif /*]*/ any_events_pending = true; } else { /* Block infinitely. */ #if defined(_WIN32) /*[*/ tmo = INFINITE; #else /*][*/ tp = NULL; #endif /*]*/ } } else { /* Don't block. */ #if defined(_WIN32) /*[*/ tmo = 1; #else /*][*/ twait.tv_sec = twait.tv_usec = 0L; tp = &twait; #endif /*]*/ } /* If there's nothing to do now, we're done. */ if (!any_events_pending) { return true; } /* Wait for events. */ vtrace("Waiting for events\n"); #if defined(_WIN32) /*[*/ ret = WaitForMultipleObjects(nha, ha, FALSE, tmo); #else /*][*/ ns = select(FD_SETSIZE, &rfds, &wfds, &xfds, tp); #endif /*[*/ if (WAIT_BAD) { #if !defined(_WIN32) /*[*/ if (errno != EINTR) { xs_warning("process_events: select() failed: %s", strerror(errno)); } #endif /*]*/ return true; } #if defined(_WIN32) /*[*/ vtrace("Got event 0x%lx\n", ret); #else /*][*/ vtrace("Got %u event%s\n", ns, (ns == 1)? "": "s"); #endif /*]*/ inputs_changed = false; /* Process the event(s) that occurred. */ #if defined(_WIN32) /*[*/ for (i = 0, ip = inputs; ip != NULL; ip = ip_next, i++) #else /*][*/ for (ip = inputs; ip != NULL; ip = ip_next) #endif /*]*/ { ip_next = ip->next; /* Check for input ready. */ if (((unsigned long)ip->condition & InputReadMask) && SOURCE_READY) { (*ip->proc)(ip->source, (ioid_t)ip); *processed_any = true; if (inputs_changed) { /* Other events may no longer be valid. Try again. */ return false; } } #if !defined(_WIN32) /*[*/ /* Check for output ready. */ if (((unsigned long)ip->condition & InputWriteMask) && FD_ISSET(ip->source, &wfds)) { (*ip->proc)(ip->source, (ioid_t)ip); *processed_any = true; if (inputs_changed) { /* Other events may no longer be valid. Try again. */ return false; } } /* Check for exception ready. */ if (((unsigned long)ip->condition & InputExceptMask) && FD_ISSET(ip->source, &xfds)) { (*ip->proc)(ip->source, (ioid_t)ip); *processed_any = true; if (inputs_changed) { /* Other events may no longer be valid. Try again. */ return false; } } #endif /*]*/ } /* See what's expired. */ if (timeouts != NULL) { GET_TS(&now); while ((t = timeouts) != NULL) { if (EXPIRED(t, now)) { timeouts = t->next; t->in_play = true; (*t->proc)((ioid_t)t); *processed_any = true; Free(t); } else { break; } } } /* If inputs have changed, retry. */ return !inputs_changed; } /* * Event dispatcher. * Processes all pending I/O and timeout events. * Waits for the first event if block is true. * Returns true if events were proccessed, false otherwise. */ bool process_events(bool block) { bool processed_any = false; bool any_this_time = false; /* Process events until no more are ready. */ while (!process_some_events(block, &any_this_time)) { /* Don't block a second time. */ block = false; /* Record what happened this time. */ processed_any |= any_this_time; } return processed_any | any_this_time; } suite3270-3.6/config.guess0000775000076500007650000012753413221577163013530 0ustar pdmpdm#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-23' # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: suite3270-3.6/config.sub0000775000076500007650000010115313221577163013160 0ustar pdmpdm#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: suite3270-3.6/configure0000775000076500007650000027415513221577163013121 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="x3270/x3270.c" enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS T_INSTALL_MAN T_INSTALL T_CLOBBER T_CLEAN T_DEPEND T_ALL subdirs mingw32_found mingw64_found target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_unix enable_windows enable_x3270 enable_c3270 enable_s3270 enable_tcl3270 enable_pr3287 enable_unix_lib enable_wc3270 enable_ws3270 enable_wpr3287 enable_windows_lib ' ac_precious_vars='build_alias host_alias target_alias' ac_subdirs_all='lib lib/w32xx x3270 c3270 s3270 tcl3270 pr3287' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-unix build all Unix emulators --enable-windows build all Windows emulators --enable-x3270 build x3270 --enable-c3270 build c3270 --enable-s3270 build s3270 --enable-tcl3270 build tcl3270 --enable-pr3287 build pr3287 --enable-lib build unix libraries --enable-wc3270 build wc3270 --enable-ws3270 build ws3270 --enable-wpr3287 build wpr3287 --enable-windows-lib build Windows libraries Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --enable-unix was given. if test "${enable_unix+set}" = set; then : enableval=$enable_unix; fi if test "x$enable_unix" = xyes; then enable_x3270=yes enable_c3270=yes enable_s3270=yes enable_tcl3270=yes enable_pr3287=yes fi # Check whether --enable-windows was given. if test "${enable_windows+set}" = set; then : enableval=$enable_windows; fi if test "x$enable_windows" = xyes; then enable_wc3270=yes enable_ws3270=yes enable_wpr3287=yes fi # Check whether --enable-x3270 was given. if test "${enable_x3270+set}" = set; then : enableval=$enable_x3270; fi # Check whether --enable-c3270 was given. if test "${enable_c3270+set}" = set; then : enableval=$enable_c3270; fi # Check whether --enable-s3270 was given. if test "${enable_s3270+set}" = set; then : enableval=$enable_s3270; fi # Check whether --enable-tcl3270 was given. if test "${enable_tcl3270+set}" = set; then : enableval=$enable_tcl3270; fi # Check whether --enable-pr3287 was given. if test "${enable_pr3287+set}" = set; then : enableval=$enable_pr3287; fi # Check whether --enable-unix-lib was given. if test "${enable_unix_lib+set}" = set; then : enableval=$enable_unix_lib; fi # Check whether --enable-wc3270 was given. if test "${enable_wc3270+set}" = set; then : enableval=$enable_wc3270; fi # Check whether --enable-ws3270 was given. if test "${enable_ws3270+set}" = set; then : enableval=$enable_ws3270; fi # Check whether --enable-wpr3287 was given. if test "${enable_wpr3287+set}" = set; then : enableval=$enable_wpr3287; fi # Check whether --enable-windows-lib was given. if test "${enable_windows_lib+set}" = set; then : enableval=$enable_windows_lib; fi if test "x$enable_x3270" != xyes -a \ "x$enable_c3270" != xyes -a \ "x$enable_s3270" != xyes -a \ "x$enable_tcl3270" != xyes -a \ "x$enable_pr3287" != xyes -a \ "x$enable_unix_lib" != xyes -a \ "x$enable_wc3270" != xyes -a \ "x$enable_ws3270" != xyes -a \ "x$enable_wpr3287" != xyes -a \ "x$enable_windows_lib" != xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: configuring all emulators... use --enable options to pick a subset" >&5 $as_echo "$as_me: configuring all emulators... use --enable options to pick a subset" >&6;} enable_x3270=yes enable_c3270=yes enable_s3270=yes enable_tcl3270=yes enable_pr3287=yes enable_wc3270=yes enable_ws3270=yes enable_wpr3287=yes fi # Extract the first word of "x86_64-w64-mingw32-gcc", so it can be a program name with args. set dummy x86_64-w64-mingw32-gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_mingw64_found+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$mingw64_found"; then ac_cv_prog_mingw64_found="$mingw64_found" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_mingw64_found="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_mingw64_found" && ac_cv_prog_mingw64_found="no" fi fi mingw64_found=$ac_cv_prog_mingw64_found if test -n "$mingw64_found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mingw64_found" >&5 $as_echo "$mingw64_found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "i686-w64-mingw32-gcc", so it can be a program name with args. set dummy i686-w64-mingw32-gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_mingw32_found+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$mingw32_found"; then ac_cv_prog_mingw32_found="$mingw32_found" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_mingw32_found="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_mingw32_found" && ac_cv_prog_mingw32_found="no" fi fi mingw32_found=$ac_cv_prog_mingw32_found if test -n "$mingw32_found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mingw32_found" >&5 $as_echo "$mingw32_found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$mingw64_found" = "no" -o "$mingw32_found" = "no" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling Windows cross-compile" >&5 $as_echo "$as_me: WARNING: Disabling Windows cross-compile" >&2;} windows_notfound=1 enable_wc3270=no enable_ws3270=no enable_wpr3287=no enable_windows_lib=no fi if test "x$enable_x3270" = xyes -o \ "x$enable_c3270" = xyes -o \ "x$enable_s3270" = xyes -o \ "x$enable_tcl3270" = xyes -o \ "x$enable_pr3287" = xyes -o \ "x$enable_unix_lib" = xyes; then ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. subdirs="$subdirs lib" fi if test "x$enable_wc3270" = xyes -o \ "x$enable_ws3270" = xyes -o \ "x$enable_wpr3287" = xyes -o \ "x$enable_windows_lib" = xyes; then subdirs="$subdirs lib/w32xx" fi T_ALL="" T_DEPEND="" T_CLEAN="" T_CLOBBER="" T_INSTALL="" T_INSTALL_MAN="" for i in x3270 c3270 s3270 tcl3270 pr3287 wc3270 ws3270 wpr3287; do eval x=\$enable_$i if test "x$x" = xyes; then T_ALL="$T_ALL $i" T_DEPEND="$T_DEPEND $i-depend" T_CLEAN="$T_CLEAN $i-clean" T_CLOBBER="$T_CLOBBER $i-clobber" case "$i" in w*) ;; *) T_INSTALL="$T_INSTALL $i-install" T_INSTALL_MAN="$T_INSTALL_MAN $i-install.man" esac fi done if test "x$enable_x3270" = xyes -o \ "x$enable_c3270" = xyes -o \ "x$enable_s3270" = xyes -o \ "x$enable_tcl3270" = xyes -o \ "x$enable_pr3287" = xyes; then T_DEPEND="$T_DEPEND unix-lib-depend" T_CLEAN="$T_CLEAN unix-lib-clean" T_CLOBBER="$T_CLOBBER unix-lib-clobber" fi if test "x$enable_wc3270" = xyes -o \ "x$enable_ws3270" = xyes -o \ "x$enable_wpr3287" = xyes; then T_DEPEND="$T_DEPEND windows-lib-depend" T_CLEAN="$T_CLEAN windows-lib-clean" T_CLOBBER="$T_CLOBBER windows-lib-clobber" fi if test "x$enable_x3270" = xyes; then subdirs="$subdirs x3270" fi if test "x$enable_c3270" = xyes; then subdirs="$subdirs c3270" fi if test "x$enable_s3270" = xyes; then subdirs="$subdirs s3270" fi if test "x$enable_tcl3270" = xyes; then subdirs="$subdirs tcl3270" fi if test "x$enable_pr3287" = xyes; then subdirs="$subdirs pr3287" fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/include/3270ds.h0000664000076500007650000003535013221577163013720 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013 Paul Mattes. * Copyright (c) 2004, Don Russell. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES AND GTRC * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, JEFF * SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * 3270ds.h * * Header file for the 3270 Data Stream Protocol. */ /* 3270 commands */ #define CMD_W 0x01 /* write */ #define CMD_RB 0x02 /* read buffer */ #define CMD_NOP 0x03 /* no-op */ #define CMD_EW 0x05 /* erase/write */ #define CMD_RM 0x06 /* read modified */ #define CMD_EWA 0x0d /* erase/write alternate */ #define CMD_RMA 0x0e /* read modified all */ #define CMD_EAU 0x0f /* erase all unprotected */ #define CMD_WSF 0x11 /* write structured field */ /* SNA 3270 commands */ #define SNA_CMD_RMA 0x6e /* read modified all */ #define SNA_CMD_EAU 0x6f /* erase all unprotected */ #define SNA_CMD_EWA 0x7e /* erase/write alternate */ #define SNA_CMD_W 0xf1 /* write */ #define SNA_CMD_RB 0xf2 /* read buffer */ #define SNA_CMD_WSF 0xf3 /* write structured field */ #define SNA_CMD_EW 0xf5 /* erase/write */ #define SNA_CMD_RM 0xf6 /* read modified */ /* 3270 orders */ #define ORDER_PT 0x05 /* program tab */ #define ORDER_GE 0x08 /* graphic escape */ #define ORDER_SBA 0x11 /* set buffer address */ #define ORDER_EUA 0x12 /* erase unprotected to address */ #define ORDER_IC 0x13 /* insert cursor */ #define ORDER_SF 0x1d /* start field */ #define ORDER_SA 0x28 /* set attribute */ #define ORDER_SFE 0x29 /* start field extended */ #define ORDER_YALE 0x2b /* Yale sub command */ #define ORDER_MF 0x2c /* modify field */ #define ORDER_RA 0x3c /* repeat to address */ #define FCORDER_NULL 0x00 /* format control: null */ #define FCORDER_FF 0x0c /* form feed */ #define FCORDER_CR 0x0d /* carriage return */ #define FCORDER_SO 0x0e /* shift out (DBCS subfield) */ #define FCORDER_SI 0x0f /* shift in (DBCS end) */ #define FCORDER_NL 0x15 /* new line */ #define FCORDER_EM 0x19 /* end of medium */ #define FCORDER_LF 0x25 /* line feed */ #define FCORDER_DUP 0x1c /* duplicate */ #define FCORDER_FM 0x1e /* field mark */ #define FCORDER_SUB 0x3f /* substitute */ #define FCORDER_EO 0xff /* eight ones */ /* SCS control code, some overlap orders */ #define SCS_BS 0x16 /* Back Space */ #define SCS_BEL 0x2f /* Bell Function */ #define SCS_CR 0x0d /* Carriage Return */ #define SCS_ENP 0x14 /* Enable Presentation */ #define SCS_FF 0x0c /* Forms Feed */ #define SCS_GE 0x08 /* Graphic Escape */ #define SCS_HT 0x05 /* Horizontal Tab */ #define SCS_INP 0x24 /* Inhibit Presentation */ #define SCS_IRS 0x1e /* Interchange-Record Separator */ #define SCS_LF 0x25 /* Line Feed */ #define SCS_NL 0x15 /* New Line */ #define SCS_SA 0x28 /* Set Attribute: */ #define SCS_SA_RESET 0x00 /* Reset all */ #define SCS_SA_HIGHLIGHT 0x41 /* Highlighting */ #define SCS_SA_CS 0x42 /* Character set */ #define SCS_SA_GRID 0xc2 /* Grid */ #define SCS_SET 0x2b /* Set: */ #define SCS_SHF 0xc1 /* Horizontal format */ #define SCS_SLD 0xc6 /* Line Density */ #define SCS_SVF 0xc2 /* Vertical Format */ #define SCS_SO 0x0e /* Shift out (DBCS subfield start) */ #define SCS_SI 0x0f /* Shift in (DBCS subfield end) */ #define SCS_TRN 0x35 /* Transparent */ #define SCS_VCS 0x04 /* Vertical Channel Select */ #define SCS_VT 0x0b /* Vertical Tab */ /* Structured fields */ #define SF_READ_PART 0x01 /* read partition */ #define SF_RP_QUERY 0x02 /* query */ #define SF_RP_QLIST 0x03 /* query list */ #define SF_RPQ_LIST 0x00 /* QCODE list */ #define SF_RPQ_EQUIV 0x40 /* equivalent+ QCODE list */ #define SF_RPQ_ALL 0x80 /* all */ #define SF_ERASE_RESET 0x03 /* erase/reset */ #define SF_ER_DEFAULT 0x00 /* default */ #define SF_ER_ALT 0x80 /* alternate */ #define SF_SET_REPLY_MODE 0x09 /* set reply mode */ #define SF_SRM_FIELD 0x00 /* field */ #define SF_SRM_XFIELD 0x01 /* extended field */ #define SF_SRM_CHAR 0x02 /* character */ #define SF_CREATE_PART 0x0c /* create partition */ #define CPFLAG_PROT 0x40 /* protected flag */ #define CPFLAG_COPY_PS 0x20 /* local copy to presentation space */ #define CPFLAG_BASE 0x07 /* base character set index */ #define SF_OUTBOUND_DS 0x40 /* outbound 3270 DS */ #define SF_TRANSFER_DATA 0xd0 /* file transfer open request */ /* Query replies */ #define QR_SUMMARY 0x80 /* summary */ #define QR_USABLE_AREA 0x81 /* usable area */ #define QR_IMAGE 0x82 /* image */ #define QR_TEXT_PART 0x83 /* text partitions */ #define QR_ALPHA_PART 0x84 /* alphanumeric partitions */ #define QR_CHARSETS 0x85 /* character sets */ #define QR_COLOR 0x86 /* color */ #define QR_HIGHLIGHTING 0x87 /* highlighting */ #define QR_REPLY_MODES 0x88 /* reply modes */ #define QR_FIELD_VAL 0x8a /* field validation */ #define QR_MSR_CTL 0x8b /* MSR control */ #define QR_OUTLINING 0x8c /* field outlining */ #define QR_PART_CHAR 0x8e /* partition characteristics */ #define QR_OEM_AUX 0x8f /* OEM auxiliary device */ #define QR_FMT_PRES 0x90 /* format presentation */ #define QR_DBCS_ASIA 0x91 /* DBCS-Asia */ #define QR_SAVE_RESTORE 0x92 /* save/restore format */ #define QR_PC3270 0x93 /* PC3270 */ #define QR_FMT_SAD 0x94 /* format storage auxiliary device */ #define QR_DDM 0x95 /* distributed data management */ #define QR_STG_POOLS 0x96 /* storage pools */ #define QR_DIA 0x97 /* document interchange architecture */ #define QR_DATA_CHAIN 0x98 /* data chaining */ #define QR_AUX_DEVICE 0x99 /* auxiliary device */ #define QR_3270_IPDS 0x9a /* 3270 IPDS */ #define QR_PDDS 0x9c /* product defined data stream */ #define QR_IBM_AUX 0x9e /* IBM auxiliary device */ #define QR_BEGIN_EOF 0x9f /* begin/end of file */ #define QR_DEVICE_CHAR 0xa0 /* device characteristics */ #define QR_RPQNAMES 0xa1 /* RPQ names */ #define QR_DATA_STREAMS 0xa2 /* data streams */ #define QR_IMP_PART 0xa6 /* implicit partition */ #define QR_PAPER_FEED 0xa7 /* paper feed techniques */ #define QR_TRANSPARENCY 0xa8 /* transparency */ #define QR_SPC 0xa9 /* settable printer characteristics */ #define QR_IOCA_AD 0xaa /* IOCA auxiliary device */ #define QR_CPR 0xab /* cooperative proc. requestor */ #define QR_SEGMENT 0xb0 /* segment */ #define QR_PROCEDURE 0xb1 /* procedure */ #define QR_LINE_TYPE 0xb2 /* line type */ #define QR_PORT 0xb3 /* port */ #define QR_GCOLOR 0xb4 /* graphic color */ #define QR_XDR 0xb5 /* extended drawing routine */ #define QR_GSS 0xb6 /* graphic symbol sets */ #define QR_NULL 0xff /* null */ #define BA_TO_ROW(ba) ((ba) / COLS) #define BA_TO_COL(ba) ((ba) % COLS) #define ROWCOL_TO_BA(r,c) (((r) * COLS) + c) #define INC_BA(ba) { (ba) = ((ba) + 1) % (COLS * ROWS); } #define DEC_BA(ba) { (ba) = (ba) ? (ba - 1) : ((COLS*ROWS) - 1); } /* Field attributes. */ #define FA_PRINTABLE 0xc0 /* these make the character "printable" */ #define FA_PROTECT 0x20 /* unprotected (0) / protected (1) */ #define FA_NUMERIC 0x10 /* alphanumeric (0) /numeric (1) */ #define FA_INTENSITY 0x0c /* display/selector pen detectable: */ #define FA_INT_NORM_NSEL 0x00 /* 00 normal, non-detect */ #define FA_INT_NORM_SEL 0x04 /* 01 normal, detectable */ #define FA_INT_HIGH_SEL 0x08 /* 10 intensified, detectable */ #define FA_INT_ZERO_NSEL 0x0c /* 11 nondisplay, non-detect */ #define FA_RESERVED 0x02 /* must be 0 */ #define FA_MODIFY 0x01 /* modified (1) */ /* Bits in the field attribute that are stored. */ #define FA_MASK (FA_PROTECT | FA_NUMERIC | FA_INTENSITY | FA_MODIFY) /* Tests for various attribute properties. */ #define FA_IS_MODIFIED(c) ((c) & FA_MODIFY) #define FA_IS_NUMERIC(c) ((c) & FA_NUMERIC) #define FA_IS_PROTECTED(c) ((c) & FA_PROTECT) #define FA_IS_SKIP(c) (((c) & FA_PROTECT) && ((c) & FA_NUMERIC)) #define FA_IS_ZERO(c) \ (((c) & FA_INTENSITY) == FA_INT_ZERO_NSEL) #define FA_IS_HIGH(c) \ (((c) & FA_INTENSITY) == FA_INT_HIGH_SEL) #define FA_IS_NORMAL(c) \ ( \ ((c) & FA_INTENSITY) == FA_INT_NORM_NSEL \ || \ ((c) & FA_INTENSITY) == FA_INT_NORM_SEL \ ) #define FA_IS_SELECTABLE(c) \ ( \ ((c) & FA_INTENSITY) == FA_INT_NORM_SEL \ || \ ((c) & FA_INTENSITY) == FA_INT_HIGH_SEL \ ) #define FA_IS_INTENSE(c) \ ((c & FA_INT_HIGH_SEL) == FA_INT_HIGH_SEL) /* Extended attributes */ #define XA_ALL 0x00 #define XA_3270 0xc0 #define XA_VALIDATION 0xc1 #define XAV_FILL 0x04 #define XAV_ENTRY 0x02 #define XAV_TRIGGER 0x01 #define XA_OUTLINING 0xc2 #define XAO_UNDERLINE 0x01 #define XAO_RIGHT 0x02 #define XAO_OVERLINE 0x04 #define XAO_LEFT 0x08 #define XA_HIGHLIGHTING 0x41 #define XAH_DEFAULT 0x00 #define XAH_NORMAL 0xf0 #define XAH_BLINK 0xf1 #define XAH_REVERSE 0xf2 #define XAH_UNDERSCORE 0xf4 #define XAH_INTENSIFY 0xf8 #define XA_FOREGROUND 0x42 #define XAC_DEFAULT 0x00 #define XA_CHARSET 0x43 #define XA_BACKGROUND 0x45 #define XA_TRANSPARENCY 0x46 #define XAT_DEFAULT 0x00 #define XAT_OR 0xf0 #define XAT_XOR 0xf1 #define XAT_OPAQUE 0xff #define XA_INPUT_CONTROL 0xfe #define XAI_DISABLED 0x00 #define XAI_ENABLED 0x01 /* WCC definitions */ #define WCC_RESET(c) ((c) & 0x40) #define WCC_START_PRINTER(c) ((c) & 0x08) #define WCC_SOUND_ALARM(c) ((c) & 0x04) #define WCC_KEYBOARD_RESTORE(c) ((c) & 0x02) #define WCC_RESET_MDT(c) ((c) & 0x01) /* AIDs */ #define AID_NO 0x60 /* no AID generated */ #define AID_QREPLY 0x61 #define AID_ENTER 0x7d #define AID_PF1 0xf1 #define AID_PF2 0xf2 #define AID_PF3 0xf3 #define AID_PF4 0xf4 #define AID_PF5 0xf5 #define AID_PF6 0xf6 #define AID_PF7 0xf7 #define AID_PF8 0xf8 #define AID_PF9 0xf9 #define AID_PF10 0x7a #define AID_PF11 0x7b #define AID_PF12 0x7c #define AID_PF13 0xc1 #define AID_PF14 0xc2 #define AID_PF15 0xc3 #define AID_PF16 0xc4 #define AID_PF17 0xc5 #define AID_PF18 0xc6 #define AID_PF19 0xc7 #define AID_PF20 0xc8 #define AID_PF21 0xc9 #define AID_PF22 0x4a #define AID_PF23 0x4b #define AID_PF24 0x4c #define AID_OICR 0xe6 #define AID_MSR_MHS 0xe7 #define AID_SELECT 0x7e #define AID_PA1 0x6c #define AID_PA2 0x6e #define AID_PA3 0x6b #define AID_CLEAR 0x6d #define AID_SYSREQ 0xf0 #define AID_SF 0x88 #define SFID_QREPLY 0x81 /* Colors */ #define HOST_COLOR_NEUTRAL_BLACK 0 #define HOST_COLOR_BLUE 1 #define HOST_COLOR_RED 2 #define HOST_COLOR_PINK 3 #define HOST_COLOR_GREEN 4 #define HOST_COLOR_TURQUOISE 5 #define HOST_COLOR_YELLOW 6 #define HOST_COLOR_NEUTRAL_WHITE 7 #define HOST_COLOR_BLACK 8 #define HOST_COLOR_DEEP_BLUE 9 #define HOST_COLOR_ORANGE 10 #define HOST_COLOR_PURPLE 11 #define HOST_COLOR_PALE_GREEN 12 #define HOST_COLOR_PALE_TURQUOISE 13 #define HOST_COLOR_GREY 14 #define HOST_COLOR_WHITE 15 /* Data stream manipulation macros. */ #define MASK32 0xff000000U #define MASK24 0x00ff0000U #define MASK16 0x0000ff00U #define MASK08 0x000000ffU #define MINUS1 0xffffffffU #define SET16(ptr, val) { \ *((ptr)++) = (unsigned char)(((val) & MASK16) >> 8); \ *((ptr)++) = (unsigned char)(((val) & MASK08)); \ } #define GET16(val, ptr) { \ (val) = *((ptr)+1); \ (val) += *(ptr) << 8; \ } #define SET32(ptr, val) { \ *((ptr)++) = (unsigned char)(((val) & MASK32) >> 24); \ *((ptr)++) = (unsigned char)(((val) & MASK24) >> 16); \ *((ptr)++) = (unsigned char)(((val) & MASK16) >> 8); \ *((ptr)++) = (unsigned char)(((val) & MASK08)); \ } #define HIGH8(s) (((s) >> 8) & 0xff) #define LOW8(s) ((s) & 0xff) /* Other EBCDIC control codes. */ #define EBC_null 0x00 #define EBC_soh 0x01 #define EBC_stx 0x02 #define EBC_ff 0x0c #define EBC_cr 0x0d #define EBC_so 0x0e #define EBC_si 0x0f #define EBC_nl 0x15 #define EBC_em 0x19 #define EBC_dup 0x1c #define EBC_fm 0x1e #define EBC_sub 0x3f #define EBC_space 0x40 #define EBC_nobreakspace 0x41 #define EBC_period 0x4b #define EBC_ampersand 0x50 #define EBC_slash 0x61 #define EBC_percent 0x6c #define EBC_underscore 0x6d #define EBC_greater 0x6e #define EBC_question 0x6f #define EBC_Yacute 0xad #define EBC_diaeresis 0xbd #define EBC_minus 0xca #define EBC_0 0xf0 #define EBC_1 0xf1 #define EBC_2 0xf2 #define EBC_3 0xf3 #define EBC_4 0xf4 #define EBC_5 0xf5 #define EBC_6 0xf6 #define EBC_7 0xf7 #define EBC_8 0xf8 #define EBC_9 0xf9 #define EBC_A 0xc1 #define EBC_B 0xc2 #define EBC_C 0xc3 #define EBC_D 0xc4 #define EBC_E 0xc5 #define EBC_F 0xc6 #define EBC_G 0xc7 #define EBC_H 0xc8 #define EBC_I 0xc9 #define EBC_J 0xd1 #define EBC_K 0xd2 #define EBC_L 0xd3 #define EBC_M 0xd4 #define EBC_N 0xd5 #define EBC_O 0xd6 #define EBC_P 0xd7 #define EBC_Q 0xd8 #define EBC_R 0xd9 #define EBC_S 0xe2 #define EBC_T 0xe3 #define EBC_U 0xe4 #define EBC_V 0xe5 #define EBC_eo 0xff #define EBC_less 0x4c #define EBC_greaer 0x6e /* Unicode private-use definitions. */ #define UPRIV_GE_00 0xf700 /* first GE */ #define UPRIV_GE_ff 0xf7ff /* last GE */ #define UPRIV_sub 0xf8fc #define UPRIV_eo 0xf8fd #define UPRIV_fm 0xf8fe #define UPRIV_dup 0xf8ff /* BIND definitions. */ #define BIND_RU 0x31 #define BIND_OFF_MAXRU_SEC 10 #define BIND_OFF_MAXRU_PRI 11 #define BIND_OFF_RD 20 #define BIND_OFF_CD 21 #define BIND_OFF_RA 22 #define BIND_OFF_CA 23 #define BIND_OFF_SSIZE 24 #define BIND_OFF_PLU_NAME_LEN 27 #define BIND_PLU_NAME_MAX 8 #define BIND_OFF_PLU_NAME 28 /* Screen sizes. */ #define MODEL_2_ROWS 24 #define MODEL_2_COLS 80 #define MODEL_3_ROWS 32 #define MODEL_3_COLS 80 #define MODEL_4_ROWS 43 #define MODEL_4_COLS 80 #define MODEL_5_ROWS 27 #define MODEL_5_COLS 132 suite3270-3.6/include/actions.h0000664000076500007650000000504113221577163014430 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * actions.h * Global declarations for actions.c. */ typedef struct { const char *name; action_t *action; unsigned flags; unsigned help_flags; const char *help_parms; const char *help_text; } action_table_t; #define ACTION_KE 0x1 /* action is valid from key events */ typedef struct action_elt { llist_t list; /* linkage */ action_table_t t; /* payload */ } action_elt_t; extern llist_t actions_list; extern unsigned actions_list_count; extern const char *ia_name[]; void action_debug(const char *aname, ia_t ia, unsigned argc, const char **argv); bool run_action(const char *name, enum iaction cause, const char *parm1, const char *parm2); bool run_action_a(const char *name, enum iaction cause, unsigned count, const char **parms); bool run_action_entry(action_elt_t *e, enum iaction cause, unsigned count, const char **parms); int check_argc(const char *aname, unsigned nargs, unsigned nargs_min, unsigned nargs_max); void register_actions(action_table_t *actions, unsigned count); suite3270-3.6/include/apl.h0000664000076500007650000000323713221577163013551 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * apl.h * Global declarations for apl.c. */ ks_t apl_string_to_key(const char *s, int *is_gep); const char *key_to_apl_string(ks_t k); suite3270-3.6/include/appres.h0000664000076500007650000001171013221577163014262 0ustar pdmpdm/* * Copyright (c) 1993-2012, 2016-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * appres.h * Application resource definitions for x3270, c3270, s3270 and * tcl3270. */ /* * Alas, a nested #include here, so everyone who wants the appres definitions * does not need to explicitly include ssl_config.h. */ #include "ssl_config.h" /* Application resources */ typedef struct { /* Common options. */ bool extended; bool m3279; bool modified_sel; bool once; bool apl_mode; bool scripted; bool numeric_lock; bool secure; bool oerr_lock; bool typeahead; bool debug_tracing; bool disconnect_clear; bool highlight_bold; bool color8; bool bsd_tm; bool unlock_delay; bool qr_bg_color; bool bind_limit; bool new_environ; bool socket; bool dsTrace_bc; bool eventTrace_bc; bool trace_monitor; bool script_port_once; bool bind_unlock; char *script_port; char *httpd_port; char *dbcs_cgcsgid; char *conf_dir; char *model; char *hostsfile; char *port; char *charset; char *sbcs_cgcsgid; char *termname; char *devname; /* for 5250 */ char *user; /* for 5250 */ char *login_macro; char *macros; char *trace_dir; char *trace_file; char *screentrace_file; char *trace_file_size; char *oversize; char *ft_command; char *connectfile_name; char *idle_command; bool idle_command_enabled; char *idle_timeout; char *proxy; int unlock_delay_ms; char *hostname; bool utf8; int max_recent; bool nvt_mode; char *suppress_actions; char *min_version; int connect_timeout; int nop_seconds; #if defined(_WIN32) /*[*/ int local_cp; int ft_cp; #endif /*]*/ /* Toggles. */ bool toggle[N_TOGGLES]; /* Line-mode TTY parameters. */ struct { bool icrnl; bool inlcr; bool onlcr; char *erase; char *kill; char *werase; char *rprnt; char *lnext; char *intr; char *quit; char *eof; } linemode; /* SSL fields. */ ssl_config_t ssl; /* Interactive (x3270/c3270/wc3270) fields. */ struct { bool mono; bool reconnect; bool do_confirms; bool menubar; bool visual_bell; char *key_map; char *compose_map; char *printer_lu; char *printer_opts; int save_lines; char *crosshair_color; } interactive; /* File transfer fields. */ struct { char *allocation; int avblock; int blksize; char *cr; char *direction; char *exist; char *host; char *host_file; char *local_file; int lrecl; char *mode; int primary_space; char *recfm; char *remap; int secondary_space; int dft_buffer_size; int dft_buffer_size_bc; /* old resource value */ #if defined(_WIN32) /*[*/ int codepage; int codepage_bc; /* old resource value */ #endif /*]*/ } ft; /* c3270/wc3270-specific fields. */ struct { bool all_bold_on; bool ascii_box_draw; bool acs; #if !defined(_WIN32) /*[*/ bool default_fgbg; bool cbreak_mode; bool curses_keypad; bool mouse; bool reverse_video; #else /*]*/ bool auto_shortcut; bool lightpen_primary; #endif /*]*/ char *all_bold; #if !defined(_WIN32) /*[*/ char *altscreen; char *defscreen; char *meta_escape; #else /*][*/ char *bell_mode; char *title; #endif /*]*/ } c3270; /* tcl3270-specific fields. */ struct { int command_timeout; } tcl3270; } AppRes, *AppResptr; extern AppRes appres; suite3270-3.6/include/arpa_telnet.h0000664000076500007650000001161613221577163015273 0ustar pdmpdm/* @(#)telnet.h 1.7 88/08/19 SMI; from UCB 5.1 5/30/85 */ /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ /* * Definitions for the TELNET protocol. */ #ifndef _arpa_telnet_h #define _arpa_telnet_h #define IAC 255 /* interpret as command: */ #define DONT 254 /* you are not to use option */ #define DO 253 /* please, you use option */ #define WONT 252 /* I won't use option */ #define WILL 251 /* I will use option */ #define SB 250 /* interpret as subnegotiation */ #define GA 249 /* you may reverse the line */ #define EL 248 /* erase the current line */ #define EC 247 /* erase the current character */ #define AYT 246 /* are you there */ #define AO 245 /* abort output--but let prog finish */ #define IP 244 /* interrupt process--permanently */ #define BREAK 243 /* break */ #define DM 242 /* data mark--for connect. cleaning */ #define NOP 241 /* nop */ #define SE 240 /* end sub negotiation */ #define EOR 239 /* end of record (transparent mode) */ #define SUSP 237 /* suspend process */ #define xEOF 236 /* end of file */ #define SYNCH 242 /* for telfunc calls */ #ifdef TELCMDS const char *telcmds[] = { "EOF", "SUSP", "ABORT", "EOR", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0 }; #endif #define TELCMD_FIRST xEOF #define TELCMD_LAST IAC #define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \ (unsigned int)(x) >= TELCMD_FIRST) #define TELCMD(x) telcmds[(x)-TELCMD_FIRST] /* telnet options */ #define TELOPT_BINARY 0 /* 8-bit data path */ #define TELOPT_ECHO 1 /* echo */ #define TELOPT_RCP 2 /* prepare to reconnect */ #define TELOPT_SGA 3 /* suppress go ahead */ #define TELOPT_NAMS 4 /* approximate message size */ #define TELOPT_STATUS 5 /* give status */ #define TELOPT_TM 6 /* timing mark */ #define TELOPT_RCTE 7 /* remote controlled transmission and echo */ #define TELOPT_NAOL 8 /* negotiate about output line width */ #define TELOPT_NAOP 9 /* negotiate about output page size */ #define TELOPT_NAOCRD 10 /* negotiate about CR disposition */ #define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */ #define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */ #define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */ #define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */ #define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */ #define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */ #define TELOPT_XASCII 17 /* extended ascic character set */ #define TELOPT_LOGOUT 18 /* force logout */ #define TELOPT_BM 19 /* byte macro */ #define TELOPT_DET 20 /* data entry terminal */ #define TELOPT_SUPDUP 21 /* supdup protocol */ #define TELOPT_SUPDUPOUTPUT 22 /* supdup output */ #define TELOPT_SNDLOC 23 /* send location */ #define TELOPT_TTYPE 24 /* terminal type */ #define TELOPT_EOR 25 /* end or record */ #define TELOPT_TUID 26 /* TACACS user identification */ #define TELOPT_OUTMRK 27 /* output marking */ #define TELOPT_TTYLOC 28 /* terminal location number */ #define TELOPT_3270REGIME 29 /* 3270 regime */ #define TELOPT_X3PAD 30 /* X.3 PAD */ #define TELOPT_NAWS 31 /* window size */ #define TELOPT_TSPEED 32 /* terminal speed */ #define TELOPT_LFLOW 33 /* remote flow control */ #define TELOPT_LINEMODE 34 /* linemode option */ #define TELOPT_XDISPLOC 35 /* X Display Location */ #define TELOPT_OLD_ENVIRON 36 /* old - Environment variables */ #define TELOPT_AUTHENTICATION 37/* authenticate */ #define TELOPT_ENCRYPT 38 /* encryption option */ #define TELOPT_NEW_ENVIRON 39 /* new - environment variables */ #define TELOPT_TN3270E 40 /* extended 3270 regime */ #define TELOPT_EXOPL 255 /* extended-options-list */ #define NTELOPTS (1+TELOPT_TN3270E) #ifdef TELOPTS const char *telopts[NTELOPTS+1] = { "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME", "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP", "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS", "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO", "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT", "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD", "TACACS UID", "OUTPUT MARKING", "TTYLOC", "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW", "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON", "TN3270E", 0 }; #define TELOPT_FIRST TELOPT_BINARY #define TELOPT_LAST TELOPT_TN3270E #define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST) #define TELOPT(x) telopts[(x)-TELOPT_FIRST] #endif /* sub-option qualifiers */ #define TELQUAL_IS 0 /* option is... */ #define TELQUAL_SEND 1 /* send option */ #define TELQUAL_INFO 2 /* new-environ objects */ #define TELOBJ_VAR 0 #define TELOBJ_VALUE 1 #define TELOBJ_ESC 2 #define TELOBJ_USERVAR 3 #endif /*!_arpa_telnet_h*/ suite3270-3.6/include/asprintf.h0000664000076500007650000000374713221577163014631 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * asprintf.h * Header file for vcsprintf, asprintf and vasprintf. */ #if !defined(_WIN32) /*[*/ extern int vscprintf(const char *fmt, va_list ap); #else /*][*/ # define vscprintf _vscprintf #endif /*]*/ #if !defined(HAVE_VASPRINTF) /*[*/ extern int my_asprintf(char **bufp, const char *fmt, ...) printflike(2, 3); # define asprintf my_asprintf extern int my_vasprintf(char **bufp, const char *fmt, va_list ap); # define vasprintf my_vasprintf #endif /*]*/ suite3270-3.6/include/b8.h0000664000076500007650000000412613221577163013304 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * b8.h * Declarations for 256-bit bitmap manipulation functions. */ #define MX8 256 /* maxiumum number of bits */ #define NB8 64 /* bits per unit */ #define NU8 (MX8 / NB8) /* units per object */ typedef struct { uint64_t u[NU8]; } b8_t; void b8_zero(b8_t *b); void b8_not(b8_t *b); void b8_and(b8_t *r, b8_t *a, b8_t *b); void b8_set_bit(b8_t *b, unsigned bit); bool b8_bit_is_set(b8_t *b, unsigned bit); bool b8_is_zero(b8_t *b); void b8_copy(b8_t *to, b8_t *from); bool b8_none_added(b8_t *want, b8_t *got); suite3270-3.6/include/bind-opt.h0000664000076500007650000000330313221577163014503 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * bind-opt.h * Header file for option parsing for -scriptport and -httpd. * */ bool parse_bind_opt(const char *spec, struct sockaddr **addr, socklen_t *addrlen); suite3270-3.6/include/charset.h0000664000076500007650000000373513221577163014431 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * charset.h * Global declarations for charset.c */ extern bool charset_changed; extern unsigned long cgcsgid; extern unsigned long cgcsgid_dbcs; enum cs_result { CS_OKAY, CS_NOTFOUND, CS_BAD, CS_PREREQ, CS_ILLEGAL }; enum cs_result charset_init(const char *csname); const char *get_charset_name(void); const char *get_host_codepage(void); void charset_list(void); suite3270-3.6/include/child.h0000664000076500007650000000317713221577163014063 0ustar pdmpdm/* * Copyright (c) 2001-2009, 2013, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * child.h * Global declarations for child.c. */ int fork_child(void); void child_ignore_output(void); suite3270-3.6/include/child_popups.h0000664000076500007650000000331613221577163015464 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * child_popups.h * Child shell popups delarations. */ void popup_child_output(bool is_err, abort_callback_t *a, const char *fmt, ...) printflike(3, 4); void child_popup_init(void); suite3270-3.6/include/ctlrc.h0000664000076500007650000001207413221577163014103 0ustar pdmpdm/* * Copyright (c) 2005-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ctlrc.h * Global declarations for ctlr.c. */ enum pds { PDS_OKAY_NO_OUTPUT = 0, /* command accepted, produced no output */ PDS_OKAY_OUTPUT = 1, /* command accepted, produced output */ PDS_BAD_CMD = -1, /* command rejected */ PDS_BAD_ADDR = -2 /* command contained a bad address */ }; extern unsigned char crm_attr[]; extern int crm_nattr; extern unsigned char reply_mode; extern bool screen_alt; extern bool screen_changed; extern int first_changed; extern int last_changed; void ctlr_aclear(int baddr, int count, int clear_ea); void ctlr_add(int baddr, unsigned char c, unsigned char cs); void ctlr_add_bg(int baddr, unsigned char color); void ctlr_add_cs(int baddr, unsigned char cs); void ctlr_add_fa(int baddr, unsigned char fa, unsigned char cs); void ctlr_add_fg(int baddr, unsigned char color); void ctlr_add_gr(int baddr, unsigned char gr); void ctlr_altbuffer(bool alt); bool ctlr_any_data(void); void ctlr_bcopy(int baddr_from, int baddr_to, int count, int move_ea); void ctlr_changed(int bstart, int bend); void ctlr_clear(bool can_snap); void ctlr_erase(bool alt); void ctlr_erase_all_unprotected(void); void ctlr_init(unsigned cmask); const char *ctlr_query_cur_size(void); const char *ctlr_query_cursor(void); const char *ctlr_query_formatted(void); const char *ctlr_query_max_size(void); void ctlr_read_buffer(unsigned char aid_byte); void ctlr_read_modified(unsigned char aid_byte, bool all); void ctlr_reinit(unsigned cmask); void ctlr_scroll(void); void ctlr_shrink(void); void ctlr_snap_buffer(void); void ctlr_snap_buffer_sscp_lu(void); bool ctlr_snap_modes(void); void ctlr_wrapping_memmove(int baddr_to, int baddr_from, int count); enum pds ctlr_write(unsigned char buf[], size_t buflen, bool erase); void ctlr_write_sscp_lu(unsigned char buf[], size_t buflen); struct ea *fa2ea(int baddr); int find_field_attribute(int baddr); int find_field_attribute_ea(int baddr, struct ea *ea); unsigned char get_field_attribute(register int baddr); bool get_bounded_field_attribute(register int baddr, register int bound, unsigned char *fa_out); void mdt_clear(int baddr); void mdt_set(int baddr); int next_unprotected(int baddr0); enum pds process_ds(unsigned char *buf, size_t buflen); void ps_process(void); void set_rows_cols(int mn, int ovc, int ovr); void ticking_start(bool anyway); void ctlr_register(void); enum dbcs_state { DBCS_NONE = 0, /* position is not DBCS */ DBCS_LEFT, /* position is left half of DBCS character */ DBCS_RIGHT, /* position is right half of DBCS character */ DBCS_SI, /* position is SI terminating DBCS subfield */ DBCS_SB, /* position is SBCS character after the SI */ DBCS_LEFT_WRAP, /* position is left half of split DBCS */ DBCS_RIGHT_WRAP, /* position is right half of split DBCS */ DBCS_DEAD /* position is dead left-half DBCS */ }; #define IS_LEFT(d) ((d) == DBCS_LEFT || (d) == DBCS_LEFT_WRAP) #define IS_RIGHT(d) ((d) == DBCS_RIGHT || (d) == DBCS_RIGHT_WRAP) #define IS_DBCS(d) (IS_LEFT(d) || IS_RIGHT(d)) #define MAKE_LEFT(b) { \ if (((b) % COLS) == ((ROWS * COLS) - 1)) \ ea_buf[(b)].db = DBCS_LEFT_WRAP; \ else \ ea_buf[(b)].db = DBCS_LEFT; \ } #define MAKE_RIGHT(b) { \ if (!((b) % COLS)) \ ea_buf[(b)].db = DBCS_RIGHT_WRAP; \ else \ ea_buf[(b)].db = DBCS_RIGHT; \ } #define SOSI(c) (((c) == EBC_so)? EBC_si: EBC_so) enum dbcs_why { DBCS_FIELD, DBCS_SUBFIELD, DBCS_ATTRIBUTE }; enum dbcs_state ctlr_dbcs_state(int baddr); enum dbcs_state ctlr_dbcs_state_ea(int baddr, struct ea *ea); enum dbcs_state ctlr_lookleft_state(int baddr, enum dbcs_why *why); int ctlr_dbcs_postprocess(void); suite3270-3.6/include/ctlr.h0000664000076500007650000000362113221577163013736 0ustar pdmpdm/* * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ctlr.h * External declarations for ctlr.c data structures. */ extern int buffer_addr; /* buffer address */ extern int cursor_addr; /* cursor address */ extern struct ea *ea_buf; /* 3270 device buffer */ extern struct ea *aea_buf; /* alternate 3270 device buffer */ extern bool formatted; /* contains at least one field? */ extern bool is_altbuffer; /* in alternate-buffer mode? */ suite3270-3.6/include/fallbacks.h0000664000076500007650000000342313221577163014714 0ustar pdmpdm/* * Copyright (c) 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * fallbacks.h * Global declarations for fallbacks.c. */ #if defined(X3270_DISPLAY) /*[*/ extern unsigned char common_fallbacks[]; extern unsigned char color_fallbacks[]; extern unsigned char mono_fallbacks[]; #else /*][*/ extern char *fallbacks[]; #endif /*]*/ suite3270-3.6/include/fprint_screen.h0000664000076500007650000000464613221577163015643 0ustar pdmpdm/* * Copyright (c) 1994-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * fprint_screen.h * Screen printing functions. */ #define FPS_EVEN_IF_EMPTY 0x1 /* print even if screen is blank */ #define FPS_MODIFIED_ITALIC 0x2 /* print modified fields in italic */ #define FPS_FF_SEP 0x4 /* use FFs to divide pages in text */ #define FPS_NO_HEADER 0x8 /* do not generate HTML header */ #define FPS_NO_DIALOG 0x10 /* do not use Windows print dialog */ typedef struct _fps *fps_t; typedef enum { FPS_STATUS_SUCCESS = 0, FPS_STATUS_SUCCESS_WRITTEN = 1, FPS_STATUS_ERROR = -1, FPS_STATUS_CANCEL = -2 } fps_status_t; #define FPS_IS_ERROR(fps) ((int)fps < 0) fps_status_t fprint_screen(FILE *f, ptype_t ptype, unsigned opts, const char *caption, const char *printer_name); fps_status_t fprint_screen_start(FILE *f, ptype_t ptype, unsigned opts, const char *caption, const char *printer_name, fps_t *fps); fps_status_t fprint_screen_body(fps_t fps); fps_status_t fprint_screen_done(fps_t *fps); suite3270-3.6/include/ft_cut_ds.h0000664000076500007650000000732513221577163014751 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ft_cut_ds.c * Data Stream definitions for CUT-style file transfers. */ /* Primary Area */ #define O_FRAME_TYPE 0 /* offset to frame type */ #define FT_CONTROL_CODE 0xc3 /* frame type: control code (host->) */ #define O_CC_FRAME_SEQ 1 /* offset to frame sequence */ #define O_CC_STATUS_CODE 2 /* offset to status code */ #define SC_HOST_ACK 0x8181 /* ack of IND$FILE command */ #define SC_XFER_COMPLETE 0x8189 /* file transfer complete */ #define SC_ABORT_FILE 0x8194 /* abort, file error */ #define SC_ABORT_XMIT 0x8198 /* abort, transmission error */ #define O_CC_MESSAGE 4 /* offset of message text */ #define FT_DATA_REQUEST 0xc2 /* frame type: data request (host->) */ #define O_DR_SF 1 /* offset to start field */ #define O_DR_DATA_CODE 2 /* offset to data code */ #define O_DR_FRAME_SEQ 3 /* offset to frame sequence */ #define FT_RETRANSMIT 0x4c /* frame type: retransmit (host->) */ #define FT_DATA 0xc1 /* frame type: data (bidirectional) */ #define O_DT_FRAME_SEQ 1 /* offset to frame sequence */ #define O_DT_CSUM 2 /* offset to checksum */ #define O_DT_LEN 3 /* offset to length */ #define O_DT_DATA 5 /* offset to data */ /* Response Area */ #define O_RESPONSE 1914 /* offset to response area */ #define RO_FRAME_TYPE (O_RESPONSE+1) /* response frame type */ #define RFT_RETRANSMIT 0x4c /* response frame type: retransmit */ #define RFT_CONTROL_CODE 0xc3 /* response frame type: control code */ #define RO_FRAME_SEQ (O_RESPONSE+2) /* response frame sequence */ #define RO_REASON_CODE (O_RESPONSE+3) /* response reason code */ /* Special Data */ #define EOF_DATA1 0x5c /* special data for EOF */ #define EOF_DATA2 0xa9 /* Acknowledgement AIDs */ #define ACK_OK AID_ENTER #define ACK_RETRANSMIT AID_PF1 #define ACK_RESYNC_VM AID_CLEAR #define ACK_RESYNC_TSO AID_PA2 #define ACK_ABORT AID_PF2 /* Data area for uploads. */ #define O_UP_DATA_CODE 2 /* offset to data code */ #define O_UP_FRAME_SEQ 3 /* offset to frame sequence */ #define O_UP_CSUM 4 /* offset to checksum */ #define O_UP_LEN 5 /* offset to length */ #define O_UP_DATA 7 /* offset to start of data */ #define O_UP_MAX (1919 - O_UP_DATA) /* max upload data */ suite3270-3.6/include/ft_cut.h0000664000076500007650000000312613221577163014256 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ft_cut.c * Declarations for ft_cut.c. */ void ft_cut_data(void); suite3270-3.6/include/ft_dft_ds.h0000664000076500007650000000511113221577163014722 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_dft_ds.h * DFT-style file transfer codes. */ /* Host requests. */ #define TR_OPEN_REQ 0x0012 /* open request */ #define TR_CLOSE_REQ 0x4112 /* close request */ #define TR_SET_CUR_REQ 0x4511 /* set cursor request */ #define TR_GET_REQ 0x4611 /* get request */ #define TR_INSERT_REQ 0x4711 /* insert request */ #define TR_DATA_INSERT 0x4704 /* data to insert */ /* PC replies. */ #define TR_GET_REPLY 0x4605 /* data for get */ #define TR_NORMAL_REPLY 0x4705 /* insert normal reply */ #define TR_ERROR_REPLY 0x08 /* error reply (low 8 bits) */ #define TR_CLOSE_REPLY 0x4109 /* close acknowledgement */ /* Other headers. */ #define TR_RECNUM_HDR 0x6306 /* record number header */ #define TR_ERROR_HDR 0x6904 /* error header */ #define TR_NOT_COMPRESSED 0xc080 /* data not compressed */ #define TR_BEGIN_DATA 0x61 /* beginning of data */ /* Error codes. */ #define TR_ERR_EOF 0x2200 /* get past end of file */ #define TR_ERR_CMDFAIL 0x0100 /* command failed */ suite3270-3.6/include/ft_dft.h0000664000076500007650000000341513221577163014241 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_dft.h * Declarations for ft_dft.c. */ void ft_dft_data(unsigned char *data, int length); void dft_read_modified(void); int set_dft_buffersize(int); suite3270-3.6/include/ft_gui.h0000664000076500007650000000427613221577163014256 0ustar pdmpdm/* * Copyright (c) 1996-2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_gui.h * Header file for file transfer dialogs. */ void ft_gui_progress_popdown(void); void ft_gui_errmsg_prepare(char *msg); void ft_gui_clear_progress(void); void ft_gui_complete_popup(const char *msg); void ft_gui_update_length(size_t length); void ft_gui_running(size_t length); void ft_gui_aborting(void); typedef enum { FGI_NOP, /* interaction not supported */ FGI_SUCCESS, /* parameters set, proceed */ FGI_ABORT /* user aborted transfer */ } ft_gui_interact_t; ft_gui_interact_t ft_gui_interact(ft_conf_t *p); void ft_gui_awaiting(void); void ft_gui_popup_ft(void); suite3270-3.6/include/ft.h0000664000076500007650000000547313221577163013412 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2014-2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft.h * Global declarations for ft.c. */ enum ft_state { FT_NONE, /* No transfer in progress */ FT_AWAIT_ACK, /* IND$FILE sent, awaiting acknowledgement message */ FT_RUNNING, /* Ack received, data flowing */ FT_ABORT_WAIT, /* Awaiting chance to send an abort */ FT_ABORT_SENT /* Abort sent; awaiting response */ }; extern enum ft_state ft_state; extern unsigned char i_ft2asc[], i_asc2ft[]; void ft_aborting(void); void ft_complete(const char *errmsg); void ft_init(void); void ft_running(bool is_cut); void ft_update_length(void); bool ft_do_cancel(void); void ft_register(void); # if defined(_WIN32) /*[*/ size_t ft_ebcdic_to_multibyte(ebc_t ebc, char mb[], size_t mb_len); int ft_unicode_to_multibyte(ucs4_t ucs4, char *mb, size_t mb_len); ucs4_t ft_multibyte_to_unicode(const char *mb, size_t mb_len, int *consumedp, enum me_fail *errorp); # else /*][*/ # define ft_ebcdic_to_multibyte(ebc, mb, mb_len) \ ebcdic_to_multibyte(ebc, mb, mb_len) # define ft_unicode_to_multibyte(ucs4, mb, mb_len) \ unicode_to_multibyte(ucs4, mb, mb_len) # define ft_multibyte_to_unicode(mb, mb_len, consumedp, errorp) \ multibyte_to_unicode(mb, mb_len, consumedp, errorp) # endif /*]*/ suite3270-3.6/include/ft_private.h0000664000076500007650000000622613221577163015141 0ustar pdmpdm/* * Copyright (c) 1996-2014, Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_private.h * Private definitions for ft.c. */ typedef enum { HT_TSO, HT_VM, HT_CICS } host_type_t; bool ft_encode_host_type(const char *s, host_type_t *ht); const char *ft_decode_host_type(host_type_t ht); typedef enum { DEFAULT_RECFM, RECFM_FIXED, RECFM_VARIABLE, RECFM_UNDEFINED } recfm_t; bool ft_encode_recfm(const char *s, recfm_t *recfm); const char *ft_decode_recfm(recfm_t recfm); typedef enum { DEFAULT_UNITS, TRACKS, CYLINDERS, AVBLOCK } units_t; bool ft_encode_units(const char *s, units_t *units); const char *ft_decode_units(units_t units); typedef struct { /* User-specified parameters. */ char *host_filename; char *local_filename; bool receive_flag; bool append_flag; host_type_t host_type; bool ascii_flag; bool cr_flag; bool remap_flag; recfm_t recfm; units_t units; bool allow_overwrite; int lrecl; int blksize; int primary_space; int secondary_space; int avblock; int dft_buffersize; #if defined(_WIN32) /*[*/ int windows_codepage; #endif /*]*/ /* Invocation state. */ bool is_action; bool is_interactive; } ft_conf_t; extern ft_conf_t *ftc; FILE *ft_go(ft_conf_t *p); extern void ft_init_conf(ft_conf_t *p); /* Transient state. */ typedef struct { FILE *local_file; size_t length; bool is_cut; bool last_dbcs; bool last_cr; enum ftd { FT_DBCS_NONE, FT_DBCS_SO, FT_DBCS_LEFT } dbcs_state; unsigned char dbcs_byte1; } ft_tstate_t; extern ft_tstate_t fts; #define __FT_PRIVATE_H suite3270-3.6/include/gdi_print.h0000664000076500007650000000430013221577163014744 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * gdi_print.h * GDI screen printing functions. */ #if !defined(_WIN32) /*[*/ #error For Windows ony #endif /*]*/ /* Header for screen snapshots. */ typedef struct { unsigned signature; /* Signature, to make sure we haven't gotten lost */ unsigned short rows; /* Rows */ unsigned short cols; /* Columns */ } gdi_header_t; /* Signature for GDI snapshot files. */ #define GDI_SIGNATURE 0x33323730 typedef enum { GDI_STATUS_SUCCESS = 0, GDI_STATUS_ERROR = -1, GDI_STATUS_CANCEL = -2 } gdi_status_t; #define GDI_STATUS_IS_ERROR(gs) ((int)gs < 0) gdi_status_t gdi_print_start(const char *printer_name, unsigned opts); gdi_status_t gdi_print_finish(FILE *f, const char *caption); suite3270-3.6/include/globals.h0000664000076500007650000003055613221577163014424 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 2005, Don Russell. * Copyright (c) 1990, Jeff Sparkes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes nor the * names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL AND JEFF SPARKES * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL OR JEFF * SPARKES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * globals.h * Common definitions for x3270, c3270, s3270 and tcl3270. */ /* Autoconf settings. */ #include "conf.h" /* autoconf settings */ #if defined(HAVE_VASPRINTF) && !defined(_GNU_SOURCE) /*[*/ #define _GNU_SOURCE /* vasprintf isn't POSIX */ #endif /*]*/ /* * OS-specific #defines. Except for the blocking-connect workarounds, these * should be replaced with autoconf probes as soon as possible. */ /* * BLOCKING_CONNECT_ONLY * Use only blocking sockets. */ #if defined(sco) /*[*/ # define BLOCKING_CONNECT_ONLY 1 #endif /*]*/ #if defined(apollo) /*[*/ # define BLOCKING_CONNECT_ONLY 1 #endif /*]*/ /* * Compiler-specific #defines. */ /* '_is_unused' explicitly flags an unused parameter */ #if defined(__GNUC__) /*[*/ # define _is_unused __attribute__((__unused__)) # define printflike(s,f) __attribute__ ((__format__ (__printf__, s, f))) #else /*][*/ # define _is_unused /* nothing */ # define printflike(s, f) /* nothing */ #endif /*]*/ #if 'A' > 'a' /*[*/ # define EBCDIC_HOST 1 #endif /*]*/ /* * Prerequisite #includes. */ #include /* Unix standard I/O library */ #include /* Other Unix library functions */ #if !defined(_MSC_VER) /*[*/ # include /* Unix system calls */ #endif /*]*/ #include /* Character classes */ #include /* String manipulations */ #include /* Integer types */ #include /* Basic system data types */ #if !defined(_WIN32) /*[*/ # include /* Socket data types */ #endif /*]*/ #if !defined(_MSC_VER) /*[*/ # include /* System time-related data types */ #endif /*]*/ #include /* C library time functions */ #include /* variable argument lists */ #if !defined(_MSC_VER) /*[*/ # include /* bool, true, false */ #else /*][*/ typedef char bool; /* roll our own for MSC */ # define true 1 # define false 0 #endif /*]*/ #if defined(_WIN32) /*[*/ # include "wincmn.h" /* Common Windows definitions */ #endif /*]*/ #include "localdefs.h" /* {s,tcl,c}3270-specific defines */ /* * Unicode UCS-4 characters are (hopefully) 32 bits. * EBCDIC (including DBCS) is (hopefully) 16 bits. */ typedef unsigned int ucs4_t; typedef unsigned short ebc_t; /* * Cancel out contradictory parts. */ #if defined(C3270) && defined(X3270_DBCS) && !defined(CURSES_WIDE) && !defined(_WIN32) /*[*/ # undef X3270_DBCS #endif /*]*/ #if defined(X3270_IPV6) && !defined(AF_INET6) /*[*/ # undef X3270_IPV6 #endif /*]*/ /* Local process (-e) header files. */ #if defined(X3270_LOCAL_PROCESS) && defined(HAVE_FORKPTY) /*[*/ # define LOCAL_PROCESS 1 # include # if defined(HAVE_PTY_H) /*[*/ # include # endif /*]*/ # if defined(HAVE_LIBUTIL_H) /*[*/ # include # endif /*]*/ # if defined(HAVE_UTIL_H) /*[*/ # include # endif /*]*/ #endif /*]*/ /* Stop conflicting with curses' COLS, even if we don't link with it. */ #define COLS cCOLS /* Memory allocation. */ void *Malloc(size_t); void Free(void *); void *Calloc(size_t, size_t); void *Realloc(void *, size_t); char *NewString(const char *); /* Error exits. */ void Error(const char *); void Warning(const char *); /* A key symbol. */ typedef unsigned long ks_t; #define KS_NONE 0L /* Host flags. */ #define HOST_FLAG(t) HOST_nFLAG(host_flags, t) /* Simple global variables */ extern int COLS; /* current */ extern int ROWS; extern int maxCOLS; /* maximum */ extern int maxROWS; extern int defROWS; /* default (EraseWrite) */ extern int defCOLS; extern int altROWS; /* alternate (EraseWriteAlternate) */ extern int altCOLS; extern const char *app; extern const char *build; extern const char *cyear; extern const char *build_rpq_timestamp; extern const char *build_rpq_version; extern int children; extern char *connected_lu; extern char *connected_type; extern char *current_host; extern unsigned short current_port; extern bool dbcs; extern char *efontname; extern bool ever_3270; extern bool exiting; extern bool flipped; extern char *full_current_host; extern char *full_efontname; extern char *full_efontname_dbcs; extern char full_model_name[]; extern bool *funky_font; extern char *hostname; extern unsigned host_flags; extern char luname[]; #if defined(LOCAL_PROCESS) /*[*/ extern bool local_process; #endif /*]*/ extern char *model_name; extern int model_num; extern bool non_tn3270e_host; extern int ov_cols, ov_rows; extern bool ov_auto; extern char *profile_name; extern const char *programname; extern char *qualified_host; extern char *reconnect_host; extern int screen_depth; extern bool scroll_initted; extern bool shifted; extern bool *standard_font; extern char *termtype; extern bool visible_control; extern int *xtra_width; extern int x3270_exit_code; #if defined(_WIN32) /*[*/ extern char *instdir; extern char *mydesktop; extern char *mydocs3270; extern char *commondocs3270; #endif /*]*/ #if defined(_WIN32) /*[*/ extern unsigned windirs_flags; #endif /*]*/ /* Data types and complex global variables */ /* connection state */ enum cstate { NOT_CONNECTED, /* no socket, unknown mode */ SSL_PASS, /* waiting for interactive SSL password */ RESOLVING, /* resolving hostname */ PENDING, /* socket connection pending */ NEGOTIATING, /* SSL/proxy negotiation in progress */ CONNECTED_INITIAL, /* connected, no 3270 mode yet */ CONNECTED_NVT, /* connected in NVT mode */ CONNECTED_3270, /* connected in old-style 3270 mode */ CONNECTED_UNBOUND, /* connected in TN3270E mode, unbound */ CONNECTED_E_NVT, /* connected in TN3270E mode, NVT mode */ CONNECTED_SSCP, /* connected in TN3270E mode, SSCP-LU mode */ CONNECTED_TN3270E /* connected in TN3270E mode, 3270 mode */ }; extern enum cstate cstate; #define PCONNECTED (cstate > NOT_CONNECTED) #define HALF_CONNECTED (cstate == RESOLVING || cstate == PENDING) #define CONNECTED (cstate >= CONNECTED_INITIAL) #define IN_NVT (cstate == CONNECTED_NVT || cstate == CONNECTED_E_NVT) #define IN_3270 (cstate == CONNECTED_3270 || cstate == CONNECTED_TN3270E || cstate == CONNECTED_SSCP) #define IN_SSCP (cstate == CONNECTED_SSCP) #define IN_TN3270E (cstate == CONNECTED_TN3270E) #define IN_E (cstate >= CONNECTED_UNBOUND) /* keyboard modifer bitmap */ #define ShiftKeyDown 0x01 #define MetaKeyDown 0x02 #define AltKeyDown 0x04 /* toggles */ typedef enum { MONOCASE, /* all-uppercase display */ ALT_CURSOR, /* block cursor (x3270) */ CURSOR_BLINK, /* blinking cursor (x3270) */ SHOW_TIMING, /* display command execution time in the OIA (interactive) */ CURSOR_POS, /* display cursor position in the OIA (interactive) */ TRACING, /* trace data and events */ SCROLL_BAR, /* include scroll bar (x3270) */ LINE_WRAP, /* NVT xterm line-wrap mode (auto-wraparound) */ BLANK_FILL, /* treat trailing blanks like NULLs on input */ SCREEN_TRACE, /* trace screen contents to file or printer */ MARGINED_PASTE, /* respect left margin when pasting (x3270 and wc3270) */ RECTANGLE_SELECT, /* select by rectangles (x3270) */ CROSSHAIR, /* display cursor crosshair (x3270) */ VISIBLE_CONTROL, /* display visible control characters (x3270) */ AID_WAIT, /* make scripts wait for AIDs to complete */ UNDERSCORE, /* special c3270/wc3270 underscore display mode (c3270 and wc320) */ OVERLAY_PASTE, /* overlay protected fields when pasting (x3270 and wc3270) */ N_TOGGLES } toggle_index_t; bool toggled(toggle_index_t ix); /* extended attributes */ struct ea { unsigned char cc; /* EBCDIC or ASCII character code */ unsigned char fa; /* field attribute, it nonzero */ unsigned char fg; /* foreground color (0x00 or 0xf) */ unsigned char bg; /* background color (0x00 or 0xf) */ unsigned char gr; /* ANSI graphics rendition bits */ unsigned char cs; /* character set (GE flag, or 0..2) */ unsigned char ic; /* input control (DBCS) */ unsigned char db; /* DBCS state */ }; #define GR_BLINK 0x01 #define GR_REVERSE 0x02 #define GR_UNDERLINE 0x04 #define GR_INTENSIFY 0x08 #define CS_MASK 0x03 /* mask for specific character sets */ #define CS_BASE 0x00 /* base character set (X'00') */ #define CS_APL 0x01 /* APL character set (X'01' or GE) */ #define CS_LINEDRAW 0x02 /* DEC line-drawing character set (ANSI) */ #define CS_DBCS 0x03 /* DBCS character set (X'F8') */ #define CS_GE 0x04 /* cs flag for Graphic Escape */ /* input key type */ enum keytype { KT_STD, KT_GE }; /* Shorthand macros */ #define Replace(var, value) do { Free(var); var = (value); } while(false) /* Configuration change masks. */ #define NO_CHANGE 0x0000 /* no change */ #define MODEL_CHANGE 0x0001 /* screen dimensions changed */ #define FONT_CHANGE 0x0002 /* emulator font changed */ #define COLOR_CHANGE 0x0004 /* color scheme or 3278/9 mode changed */ #define SCROLL_CHANGE 0x0008 /* scrollbar snapped on or off */ #define CHARSET_CHANGE 0x0010 /* character set changed */ #define ALL_CHANGE 0xffff /* everything changed */ /* Portability macros */ /* Equivalent of setlinebuf */ #if defined(_IOLBF) /*[*/ # define SETLINEBUF(s) setvbuf(s, NULL, _IOLBF, BUFSIZ) #else /*][*/ # define SETLINEBUF(s) setlinebuf(s) #endif /*]*/ /* Default DFT file transfer buffer size. */ #if !defined(DFT_BUF) /*[*/ # define DFT_BUF (4 * 1024) #endif /*]*/ /* DBCS Preedit Types */ #define PT_ROOT "Root" #define PT_OVER_THE_SPOT "OverTheSpot" #define PT_OFF_THE_SPOT "OffTheSpot" #define PT_ON_THE_SPOT "OnTheSpot" /* I/O typedefs */ #if !defined(_WIN32) /*[*/ typedef int iosrc_t; # define INVALID_IOSRC (-1) #else /*][*/ typedef HANDLE iosrc_t; # define INVALID_IOSRC INVALID_HANDLE_VALUE #endif /*]*/ typedef uintptr_t ioid_t; #define NULL_IOID 0L /* Screen print types. */ typedef enum { P_TEXT, P_HTML, P_RTF, P_GDI } ptype_t; /* Usage message with error exit. */ void usage(const char *); /* Emulator actions. */ /* types of internal actions */ typedef enum iaction { IA_STRING, IA_PASTE, IA_REDRAW, IA_KEYPAD, IA_DEFAULT, IA_KEY, IA_MACRO, IA_SCRIPT, IA_PEEK, IA_TYPEAHEAD, IA_FT, IA_COMMAND, IA_KEYMAP, IA_IDLE } ia_t; extern enum iaction ia_cause; typedef bool (action_t)(ia_t ia, unsigned argc, const char **argv); /* Common socket definitions. */ #if !defined(_WIN32) /*[*/ typedef int socket_t; # define INVALID_SOCKET (-1) # define INET_ADDR_T in_addr_t # define SOCK_CLOSE(s) close(s) # define socket_errno() errno # define SE_EWOULDBLOCK EWOULDBLOCK #else /*][*/ typedef SOCKET socket_t; # define INET_ADDR_T unsigned long # define SOCK_CLOSE(s) closesocket(s) # define socket_errno() WSAGetLastError() # define SE_EWOULDBLOCK WSAEWOULDBLOCK #endif /*]*/ /* Handy stuff. */ #define array_count(a) sizeof(a)/sizeof(a[0]) /* Doubly-linked lists. */ typedef struct llist { struct llist *next; struct llist *prev; } llist_t; suite3270-3.6/include/glue_gui.h0000664000076500007650000000323413221577163014572 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * glue_gui.h * Declarations for GUI-specific functions called from the glue * logic. */ bool glue_gui_output(const char *s); /* default False */ suite3270-3.6/include/glue.h0000664000076500007650000000424113221577163013725 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * glue.h * Declarations for glue.c and XtGlue.c */ /* glue.c */ extern bool any_error_output; struct host_color { char *name; int index; }; extern struct host_color host_color[]; extern char *profile_path; int parse_command_line(int argc, const char **argv, const char **cl_hostname); void parse_xrm(const char *arg, const char *where); char *safe_string(const char *s); bool process_events(bool block); void cmdline_help(bool as_action); void model_init(void); typedef bool merge_profile_t(void); void register_merge_profile(merge_profile_t *); /* XtGlue.c */ void (*Error_redirect)(const char *); void (*Warning_redirect)(const char *); suite3270-3.6/include/host_gui.h0000664000076500007650000000344313221577163014615 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * host_gui.h * Declarations for GUI-specific functions called from the host * connect/disconnect logic. */ bool host_gui_connect(void); /* default False */ void host_gui_connect_initial(void); bool host_gui_disconnect(void); /* default False */ void host_gui_connected(void); suite3270-3.6/include/host.h0000664000076500007650000000417113221577163013750 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014-2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * host.h * Global declarations for host.c. */ struct host { char *name; char **parents; char *hostname; enum { PRIMARY, ALIAS, RECENT } entry_type; char *loginstring; time_t connect_time; struct host *prev, *next; }; extern struct host *hosts; /* Host connect/disconnect and state change. */ void hostfile_init(void); void host_cancel_reconnect(void); bool host_connect(const char *n); void host_connected(void); void host_new_connection(bool pending); void host_disconnect(bool disable); void host_in3270(enum cstate); void host_newfd(iosrc_t s); void host_register(void); suite3270-3.6/include/httpd-core.h0000664000076500007650000000714513221577163015050 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * httpd-core.h * x3270 webserver, header file for core protocol module */ typedef enum { CT_HTML, CT_TEXT, CT_BINARY } content_t; /* Flags. */ #define HF_NONE 0x0 #define HF_TRAILER 0x1 /* include standard trailer */ #define HF_HIDDEN 0x2 /* do not include in directory listings */ typedef enum { HS_CONTINUE = 0, /* incomplete request */ HS_SUCCESS_OPEN = 1, /* request succeeded, leave socket open */ HS_ERROR_OPEN = 2, /* request failed, leave socket open */ HS_PENDING = 3, /* request is pending (async) */ HS_ERROR_CLOSE = -1, /* request failed, close socket */ HS_SUCCESS_CLOSE = -2 /* request succeeded, close socket */ } httpd_status_t; /* Registration functions. */ typedef httpd_status_t reg_dyn_t(const char *uri, void *dhandle); void *httpd_register_dir(const char *path, const char *desc); void *httpd_register_fixed(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, const char *fixed); void *httpd_register_fixed_binary(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, const unsigned char *fixed, unsigned lenrth); void *httpd_register_dyn_term(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, reg_dyn_t *dyn); void *httpd_register_dyn_nonterm(const char *path, const char *desc, content_t content_type, const char *content_str, unsigned flags, reg_dyn_t *dyn); void httpd_set_alias(void *nhandle, const char *text); /* Called from the main logic. */ void *httpd_mhandle(void *dhandle); void *httpd_new(void *mhandle, const char *client_name); httpd_status_t httpd_input(void *dhandle, const char *data, size_t len); void httpd_close(void *dhandle, const char *why); /* Callable from methods. */ httpd_status_t httpd_dyn_complete(void *dhandle, const char *format, ...); httpd_status_t httpd_dyn_error(void *dhandle, int status_code, const char *format, ...); char *html_quote(const char *text); char *uri_quote(const char *text); const char *httpd_fetch_query(void *dhandle, const char *name); suite3270-3.6/include/httpd-io.h0000664000076500007650000000465313221577163014530 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * httpd-io.h * x3270 webserver, header file for I/O module */ typedef enum { SENDTO_PENDING = 0, /* command queued */ SENDTO_COMPLETE = 1, /* command executed (successfully or not) */ SENDTO_INVALID = -1,/* invalid command */ SENDTO_FAILURE = -2 /* IPC failure */ } sendto_t; typedef enum { SC_SUCCESS, /* command succeeded */ SC_USER_ERROR, /* user errror (400) */ SC_SYSTEM_ERROR /* system error (500) */ } sendto_cbs_t; /* Callback function for hio_to3270(). */ typedef void sendto_callback_t(void *, sendto_cbs_t, const char *buf, size_t len, const char *slbuf, size_t sl_len); sendto_t hio_to3270(const char *cmd, sendto_callback_t *callback, void *dhandle, content_t content_type); void hio_send(void *mhandle, const char *buf, size_t len); void hio_async_done(void *dhandle, httpd_status_t rv); void hio_init(struct sockaddr *sa, socklen_t sa_len); suite3270-3.6/include/httpd-nodes.h0000664000076500007650000000320113221577163015215 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * httpd-node.h * x3270 webserver, header file for objects module */ void httpd_objects_init(void); suite3270-3.6/include/idle.h0000664000076500007650000000404513221577163013710 0ustar pdmpdm/* * Copyright (c) 2002-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * idle.h * Global declarations for idle.c. */ enum idle_enum { IDLE_DISABLED = 0, IDLE_SESSION = 1, IDLE_PERM = 2 }; void cancel_idle_timer(void); void idle_init(void); void reset_idle_timer(void); char *get_idle_command(); char *get_idle_timeout(); extern bool idle_changed; extern char *idle_command; extern char *idle_timeout_string; extern enum idle_enum idle_user_enabled; bool process_idle_timeout_value(const char *string); void idle_register(void); void idle_ft_complete(void); void idle_ft_start(void); suite3270-3.6/include/include_files.mk0000664000076500007650000000153013221577163015754 0ustar pdmpdmINCLUDE_HEADERS = 3270ds.h actions.h apl.h appres.h arpa_telnet.h asprintf.h \ b8.h bind-opt.h charset.h child.h child_popups.h ctlr.h ctlrc.h \ fallbacks.h fprint_screen.h ft.h ft_cut.h ft_cut_ds.h ft_dft.h \ ft_dft_ds.h ft_gui.h ft_private.h gdi_print.h globals.h glue.h \ glue_gui.h host.h host_gui.h httpd-core.h httpd-io.h httpd-nodes.h \ idle.h kybd.h latin1.h lazya.h linemode.h macros.h menubar.h nvt.h \ nvt_gui.h opts.h popups.h pr3287_session.h print_gui.h print_screen.h \ product.h proxy.h proxy_names.h readres.h resolver.h resources.h \ rpq.h save.h screen.h scroll.h see.h selectc.h sf.h ssl_passwd_gui.h \ status.h tables.h telnet.h telnet_core.h telnet_gui.h \ telnet_private.h tn3270e.h toggles.h trace.h trace_gui.h \ unicode_dbcs.h unicodec.h utf8.h util.h varbuf.h w3misc.h wincmn.h \ windirs.h winprint.h winvers.h xio.h suite3270-3.6/include/indent_s.h0000664000076500007650000000314713221577163014600 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * indent_s.h * String indent function. */ char *indent_s(const char *s); suite3270-3.6/include/kybd.h0000664000076500007650000000547313221577163013732 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * kybd.h * Global declarations for kybd.c. */ /* keyboard lock states */ extern unsigned int kybdlock; #define KL_OERR_MASK 0x000f #define KL_OERR_PROTECTED 1 #define KL_OERR_NUMERIC 2 #define KL_OERR_OVERFLOW 3 #define KL_OERR_DBCS 4 #define KL_NOT_CONNECTED 0x0010 #define KL_AWAITING_FIRST 0x0020 #define KL_OIA_TWAIT 0x0040 #define KL_OIA_LOCKED 0x0080 #define KL_DEFERRED_UNLOCK 0x0100 #define KL_ENTER_INHIBIT 0x0200 #define KL_SCROLLED 0x0400 #define KL_OIA_MINUS 0x0800 extern unsigned char aid; void do_reset(bool explicit); size_t emulate_input(const char *s, size_t len, bool pasting); size_t emulate_uinput(const ucs4_t *s, size_t len, bool pasting); void hex_input(const char *s); void kybdlock_clr(unsigned int bits, const char *cause); void kybd_inhibit(bool inhibit); void kybd_register(void); int kybd_prime(void); void kybd_scroll_lock(bool lock); bool run_ta(void); int state_from_keymap(char keymap[32]); void lightpen_select(int baddr); void key_UCharacter(ucs4_t ucs4, enum keytype keytype, enum iaction cause); void kybd_register(void); bool Down_action(ia_t ia, unsigned argc, const char **argv); bool Left_action(ia_t ia, unsigned argc, const char **argv); bool Right_action(ia_t ia, unsigned argc, const char **argv); bool Up_action(ia_t ia, unsigned argc, const char **argv); suite3270-3.6/include/latin1.h0000664000076500007650000001515313221577163014165 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * latin1.h * Symbolic names for ISO 8859-1 Latin-1 characters. */ /* * With the addition of nul, [0-9a-fA-F] and del, these are the standard HTML * entity names. */ typedef enum { latin1_nul = 0x00, latin1_sp = 0x20, latin1_excl = 0x21, latin1_quot = 0x22, latin1_num = 0x23, latin1_dollar = 0x24, latin1_percnt = 0x25, latin1_amp = 0x26, latin1_apos = 0x27, latin1_lpar = 0x28, latin1_rpar = 0x29, latin1_ast = 0x2a, latin1_plus = 0x2b, latin1_comma = 0x2c, latin1_minus = 0x2d, latin1_period = 0x2e, latin1_sol = 0x2f, latin1_0 = 0x30, latin1_1 = 0x31, latin1_2 = 0x32, latin1_3 = 0x33, latin1_4 = 0x34, latin1_5 = 0x35, latin1_6 = 0x36, latin1_7 = 0x37, latin1_8 = 0x38, latin1_9 = 0x39, latin1_colon = 0x3a, latin1_semi = 0x3b, latin1_lt = 0x3c, latin1_equals = 0x3d, latin1_gt = 0x3e, latin1_quest = 0x3f, latin1_commat = 0x40, latin1_A = 0x41, latin1_B = 0x42, latin1_C = 0x43, latin1_D = 0x44, latin1_E = 0x45, latin1_F = 0x46, latin1_G = 0x47, latin1_H = 0x48, latin1_I = 0x49, latin1_J = 0x4a, latin1_K = 0x4b, latin1_L = 0x4c, latin1_M = 0x4d, latin1_N = 0x4e, latin1_O = 0x4f, latin1_P = 0x50, latin1_Q = 0x51, latin1_R = 0x52, latin1_S = 0x53, latin1_T = 0x54, latin1_U = 0x55, latin1_V = 0x56, latin1_W = 0x57, latin1_X = 0x58, latin1_Y = 0x59, latin1_Z = 0x5a, latin1_lsqb = 0x5b, latin1_bsol = 0x5c, latin1_rsqb = 0x5d, latin1_circ = 0x5e, latin1_lowbar = 0x5f, latin1_grave = 0x60, latin1_a = 0x61, latin1_b = 0x62, latin1_c = 0x63, latin1_d = 0x64, latin1_e = 0x65, latin1_f = 0x66, latin1_g = 0x67, latin1_h = 0x68, latin1_i = 0x69, latin1_j = 0x6a, latin1_k = 0x6b, latin1_l = 0x6c, latin1_m = 0x6d, latin1_n = 0x6e, latin1_o = 0x6f, latin1_p = 0x70, latin1_q = 0x71, latin1_r = 0x72, latin1_s = 0x73, latin1_t = 0x74, latin1_u = 0x75, latin1_v = 0x76, latin1_w = 0x77, latin1_x = 0x78, latin1_y = 0x79, latin1_z = 0x7a, latin1_lcub = 0x7b, latin1_verbar = 0x7c, latin1_rcub = 0x7d, latin1_tilde = 0x7e, latin1_del = 0x7f, latin1_nbsp = 0xa0, latin1_iexcl = 0xa1, latin1_cent = 0xa2, latin1_pound = 0xa3, latin1_curren = 0xa4, latin1_yen = 0xa5, latin1_brkbar = 0xa6, latin1_sect = 0xa7, latin1_uml = 0xa8, latin1_copy = 0xa9, latin1_ordf = 0xaa, latin1_laquo = 0xab, latin1_not = 0xac, latin1_shy = 0xad, latin1_reg = 0xae, latin1_macr = 0xaf, latin1_deg = 0xb0, latin1_plusmn = 0xb1, latin1_sup2 = 0xb2, latin1_sup3 = 0xb3, latin1_acute = 0xb4, latin1_micro = 0xb5, latin1_para = 0xb6, latin1_middot = 0xb7, latin1_cedil = 0xb8, latin1_sup1 = 0xb9, latin1_ordm = 0xba, latin1_raquo = 0xbb, latin1_frac14 = 0xbc, latin1_frac12 = 0xbd, latin1_frac34 = 0xbe, latin1_iquest = 0xbf, latin1_Agrave = 0xc0, latin1_Aacute = 0xc1, latin1_Acirc = 0xc2, latin1_Atilde = 0xc3, latin1_Auml = 0xc4, latin1_Aring = 0xc5, latin1_AElig = 0xc6, latin1_Ccedil = 0xc7, latin1_Egrave = 0xc8, latin1_Eacute = 0xc9, latin1_Ecirc = 0xca, latin1_Euml = 0xcb, latin1_Igrave = 0xcc, latin1_Iacute = 0xcd, latin1_Icirc = 0xce, latin1_Iuml = 0xcf, latin1_ETH = 0xd0, latin1_Ntilde = 0xd1, latin1_Ograve = 0xd2, latin1_Oacute = 0xd3, latin1_Ocirc = 0xd4, latin1_Otilde = 0xd5, latin1_Ouml = 0xd6, latin1_times = 0xd7, latin1_Oslash = 0xd8, latin1_Ugrave = 0xd9, latin1_Uacute = 0xda, latin1_Ucirc = 0xdb, latin1_Uuml = 0xdc, latin1_Yacute = 0xdd, latin1_THORN = 0xde, latin1_szlig = 0xdf, latin1_agrave = 0xe0, latin1_aacute = 0xe1, latin1_acirc = 0xe2, latin1_atilde = 0xe3, latin1_auml = 0xe4, latin1_aring = 0xe5, latin1_aelig = 0xe6, latin1_ccedil = 0xe7, latin1_egrave = 0xe8, latin1_eacute = 0xe9, latin1_ecirc = 0xea, latin1_euml = 0xeb, latin1_igrave = 0xec, latin1_iacute = 0xed, latin1_icirc = 0xee, latin1_iuml = 0xef, latin1_eth = 0xf0, latin1_ntilde = 0xf1, latin1_ograve = 0xf2, latin1_oacute = 0xf3, latin1_ocirc = 0xf4, latin1_otilde = 0xf5, latin1_ouml = 0xf6, latin1_divide = 0xf7, latin1_oslash = 0xf8, latin1_ugrave = 0xf9, latin1_uacute = 0xfa, latin1_ucirc = 0xfb, latin1_uuml = 0xfc, latin1_yacute = 0xfd, latin1_thorn = 0xfe, latin1_yuml = 0xff } latin1_symbol_t; suite3270-3.6/include/lazya.h0000664000076500007650000000327013221577163014112 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * lazya.h * Lazy allocations. */ char *lazya(char *buf); char *lazyaf(const char *fmt, ...); char *vlazyaf(const char *fmt, va_list args); void lazya_flush(); suite3270-3.6/include/linemode.h0000664000076500007650000000404613221577163014570 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * Copyright (c) 2004, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * linemode.h * Header file for linemode.c. */ /* Spelled-out tty control character. */ struct ctl_char { const char *name; char value[3]; }; void linemode_init(void); void linemode_buf_init(void); struct ctl_char *linemode_chars(void); void linemode_out(const char *buf, size_t len); void linemode_send_erase(void); void linemode_send_kill(void); void linemode_send_werase(void); void linemode_dump(void); suite3270-3.6/include/macros.h0000664000076500007650000000552613221577163014264 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * macros.h * Global declarations for macros.c. */ /* macro definition */ struct macro_def { char *name; char **parents; char *action; struct macro_def *next; }; extern struct macro_def *macro_defs; extern bool macro_output; void abort_script(void); void cancel_if_idle_command(void); void login_macro(char *s); void macros_init(void); void macro_command(struct macro_def *m); void peer_script_init(void); void ps_set(char *s, bool is_hex); void push_command(char *); void push_idle(char *); void push_keymap_action(char *); void push_macro(char *, bool); void sms_accumulate_time(struct timeval *, struct timeval *); bool sms_active(void); void sms_connect_wait(void); void sms_continue(void); void sms_error(const char *msg); void sms_host_output(void); void sms_info(const char *fmt, ...) printflike(1, 2); bool sms_in_macro(void); bool sms_redirect(void); void sms_store(unsigned char c); typedef void *sms_cbh; typedef void (*sms_data_cb)(sms_cbh handle, const char *buf, size_t len); typedef void (*sms_done_cb)(sms_cbh handle, bool success, const char *status_buf, size_t status_len); typedef struct { const char *shortname; enum iaction ia; sms_data_cb data; sms_done_cb done; } sms_cb_t; void push_cb(const char *buf, size_t len, const sms_cb_t *cb, sms_cbh handle); void macros_register(void); suite3270-3.6/include/Makefile.aux0000664000076500007650000000325313221577163015056 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015, 2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for the include directory all: @echo "Must pick a specific make target." # Development tools. include include_files.mk src.tgz: $(INCLUDE_HEADERS) suite3270-3.6/include/menubar.h0000664000076500007650000000323313221577163014422 0ustar pdmpdm/* * Copyright (c) 1995-2010, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * menubar.h * Global declarations for menubar.c. */ void menubar_as_set(bool sensitive); void menubar_retoggle(toggle_index_t ix); suite3270-3.6/include/nvt_gui.h0000664000076500007650000000316213221577163014445 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * nvt_gui.h * Global declarations for nvt_gui.c. */ void xterm_text_gui(int code, const char *text); suite3270-3.6/include/nvt.h0000664000076500007650000000362413221577163013604 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * nvt.h * Global declarations for nvt.c. */ void nvt_init(void); void nvt_process(unsigned int c); void nvt_send_clear(void); void nvt_send_down(void); void nvt_send_home(void); void nvt_send_left(void); void nvt_send_pa(int nn); void nvt_send_pf(int nn); void nvt_send_right(void); void nvt_send_up(void); void nvt_snap(void); void nvt_snap_modes(void); void nvt_register(void); suite3270-3.6/include/opts.h0000664000076500007650000000610413221577163013756 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * opts.h * Command-line option processing declarations. */ /* Offset macros. */ #define aoffset(n) (void *)&appres.n #define toggle_aoffset(index) aoffset(toggle[index]) /* Option defition. */ typedef struct { const char *name; enum { OPT_BOOLEAN, /* set bool to True or False */ OPT_STRING, /* set a (char *) */ OPT_XRM, /* special for "-xrm" syntax */ OPT_SKIP2, /* skip the next token */ OPT_NOP, /* do nothing */ OPT_INT, /* set an integer */ OPT_V, /* special for "-v" */ OPT_DONE /* option-list terminator */ } type; bool flag; /* value if OPT_BOOLEAN */ const char *res_name; /* name of resource to set, or NULL */ void *aoff; /* appres offset */ char *help_opts; /* options to display for help, or NULL */ char *help_text; /* help text, or NULL */ } opt_t; /* Register an array of options. */ void register_opts(opt_t *opts, unsigned num_opts); /* Resource definition. */ typedef struct { const char *name; void *address; enum resource_type { XRM_STRING, /* char * */ XRM_BOOLEAN, /* bool */ XRM_INT /* int */ } type; } res_t; /* Register an array of resources. */ void register_resources(res_t *res, unsigned num_res); /* Explicit (non-appres) resource definition. */ typedef struct { const char *name; enum { V_FLAT, /* match the full name: */ V_WILD, /* name is the root, i.e., .* */ V_COLOR /* match or */ } type; } xres_t; /* Register an array of explicit resources. */ void register_xresources(xres_t *xres, unsigned num_xres); suite3270-3.6/include/popups.h0000664000076500007650000000371313221577163014322 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * popups.h * Common declarations for popups.c */ void action_output(const char *fmt, ...) printflike(1, 2); void popup_an_info(const char *fmt, ...) printflike(1, 2); void popup_an_errno(int errn, const char *fmt, ...) printflike(2, 3); void popup_an_error(const char *fmt, ...) printflike(1, 2); typedef void abort_callback_t(void); void popup_printer_output(bool is_err, abort_callback_t *a, const char *fmt, ...) printflike(3, 4); suite3270-3.6/include/pr3287_session.h0000664000076500007650000000356413221577163015510 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pr3287_session.h * Printer session support */ void pr3287_session_register(void); void pr3287_session_start(const char *lu); void pr3287_session_stop(void); bool pr3287_session_running(void); #if !defined(_WIN32) /*[*/ void pr3287_session_check(pid_t pid, int status); #else /*][*/ void pr3287_session_check(void); #endif /*]*/ suite3270-3.6/include/print_gui.h0000664000076500007650000000316413221577163014774 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_gui.h * Global declarations for print_gui.c. */ bool print_text_gui(bool use_file); suite3270-3.6/include/print_screen.h0000664000076500007650000000322513221577163015465 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_screen.h * Global declarations for print_screen.c. */ char *default_caption(void); void print_screen_register(void); suite3270-3.6/include/product.h0000664000076500007650000000356713221577163014463 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * product.h * Global declarations for product functions. * * A product can define these functions, or let a stub define a * default value. */ bool product_has_display(void); /* default False */ const char *product_specific_build_options(void); /* default NULL */ bool product_auto_oversize(void); /* default False */ void product_set_appres_defaults(void); suite3270-3.6/include/proxy.h0000664000076500007650000000335213221577163014154 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * proxy.h * Declarations for proxy.c. */ int proxy_setup(const char *spec, char **phost, char **pport); bool proxy_negotiate(int type, socket_t fd, char *host, unsigned short port); char *proxy_type_name(int type); suite3270-3.6/include/proxy_names.h0000664000076500007650000000370613221577163015342 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * proxy_names.h * Common definitions for proxy. */ #define PROXY_PASSTHRU "passthru" #define PORT_PASSTHRU "3514" #define PROXY_HTTP "http" #define PORT_HTTP "3128" #define PROXY_TELNET "telnet" #define PROXY_SOCKS4 "socks4" #define PORT_SOCKS4 "1080" #define PROXY_SOCKS4A "socks4a" #define PORT_SOCKS4A "1080" #define PROXY_SOCKS5 "socks5" #define PORT_SOCKS5 "1080" #define PROXY_SOCKS5D "socks5d" #define PORT_SOCKS5D "1080" suite3270-3.6/include/readres.h0000664000076500007650000000337413221577163014424 0ustar pdmpdm/* * Copyright (c) 2009, 2014-2015 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * readres.h * Header for resource file reader. */ int validate_and_split_resource(const char *where, const char *arg, const char **left, size_t *rnlenp, const char **right); bool read_resource_filex(const char *filename, bool fatal); suite3270-3.6/include/resolver.h0000664000076500007650000000376113221577163014640 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * resolver.h * Hostname resolution. */ typedef enum { RHP_SUCCESS = 0, RHP_FATAL = -1, RHP_CANNOT_RESOLVE = -2 } rhp_t; #define RHP_IS_ERROR(r) ((r) < 0) rhp_t resolve_host_and_port(const char *host, char *portname, int ix, unsigned short *pport, struct sockaddr *sa, socklen_t *sa_len, char **errmsg, int *lastp); bool numeric_host_and_port(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, char **errmsg); suite3270-3.6/include/resources.h0000664000076500007650000004763213221577163015016 0ustar pdmpdm/* * Copyright (c) 1995-2017, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * resources.h * x3270/c3270/s3270/tcl3270 resource and option names. */ /* Resources. */ #define ResAcs "acs" #define ResAcceptHostname "acceptHostname" #define ResActiveIcon "activeIcon" #define ResAdVersion "adVersion" #define ResAidWait "aidWait" #define ResAllBold "allBold" #define ResAllowResize "allowResize" #define ResAltCursor "altCursor" #define ResAltScreen "altScreen" #define ResAplCircledAlpha "aplCircledAlpha" #define ResAplMode "aplMode" #define ResAsciiBoxDraw "asciiBoxDraw" #define ResAssocCommand "printer.assocCommandLine" #define ResAutoShortcut "autoShortcut" #define ResBaselevelTranslations "baselevelTranslations" #define ResBellMode "bellMode" #define ResBellVolume "bellVolume" #define ResBindUnlock "bindUnlock" #define ResBindLimit "bindLimit" #define ResBlankFill "blankFill" #define ResBoldColor "boldColor" #define ResBsdTm "bsdTm" #define ResCaDir "caDir" #define ResCaFile "caFile" #define ResCbreak "cbreak" #define ResCertFile "certFile" #define ResCertFileType "certFileType" #define ResChainFile "chainFile" #define ResCharClass "charClass" #define ResCharset "charset" #define ResCharsetList "charsetList" #define ResClientCert "clientCert" #define ResColor8 "color8" #define ResColorBackground "colorBackground" #define ResColorScheme "colorScheme" #define ResCommandTimeout "commandTimeout" #define ResComposeMap "composeMap" #define ResConfDir "confDir" #define ResConnectFileName "connectFileName" #define ResConnectTimeout "connectTimeout" #define ResConsoleColorForHostColor "consoleColorForHostColor" #define ResCrosshair "crosshair" #define ResCrosshairColor "crosshairColor" #define ResCursesColorFor "cursesColorFor" #define ResCursesColorForDefault ResCursesColorFor "Default" #define ResCursesColorForHostColor ResCursesColorFor "HostColor" #define ResCursesColorForIntensified ResCursesColorFor "Intensified" #define ResCursesColorForProtected ResCursesColorFor "Protected" #define ResCursesColorForProtectedIntensified ResCursesColorFor "ProtectedIntensified" #define ResCursesKeypad "cursesKeypad" #define ResCursorBlink "cursorBlink" #define ResCursorColor "cursorColor" #define ResCursorPos "cursorPos" #define ResDebugTracing "debugTracing" #define ResDefaultFgBg "defaultFgBg" #define ResDefScreen "defScreen" #define ResDevName "devName" #define ResDftBufferSize "dftBufferSize" /* deprecated */ #define ResDisconnectClear "disconnectClear" #define ResDoConfirms "doConfirms" #define ResDbcsCgcsgid "dbcsCgcsgid" #define ResDsTrace "dsTrace" #define ResEmulatorFont "emulatorFont" #define ResEof "eof" #define ResErase "erase" #define ResEventTrace "eventTrace" #define ResExtended "extended" #define ResFixedSize "fixedSize" #define ResFtAllocation "ftAllocation" #define ResFtAvblock "ftAvblock" #define ResFtBlksize "ftBlksize" #define ResFtBufferSize "ftBufferSize" #define ResFtCr "ftCr" #define ResFtCodePage "ftCodePage" /* deprecated */ #define ResFtDirection "ftDirection" #define ResFtExist "ftExist" #define ResFtHost "ftHost" #define ResFtHostFile "ftHostFile" #define ResFtLocalFile "ftLocalFile" #define ResFtLrecl "ftLrecl" #define ResFtMode "ftMode" #define ResFtPrimarySpace "ftPrimarySpace" #define ResFtRecfm "ftRecfm" #define ResFtRemap "ftRemap" #define ResFtSecondarySpace "ftSecondarySpace" #define ResFtWindowsCodePage "ftWindowsCodePage" #define ResHighlightBold "highlightBold" #define ResHostColorFor "hostColorFor" #define ResHostColorForDefault ResHostColorFor "Default" #define ResHostColorForIntensified ResHostColorFor "Intensified" #define ResHostColorForProtected ResHostColorFor "Protected" #define ResHostColorForProtectedIntensified ResHostColorFor "ProtectedIntensified" #define ResHostname "hostname" #define ResHostsFile "hostsFile" #define ResHttpd "httpd" #define ResIconFont "iconFont" #define ResIconLabelFont "iconLabelFont" #define ResIcrnl "icrnl" #define ResIdleCommand "idleCommand" #define ResIdleCommandEnabled "idleCommandEnabled" #define ResIdleTimeout "idleTimeout" #define ResInlcr "inlcr" #define ResInputColor "inputColor" #define ResInputMethod "inputMethod" #define ResIntr "intr" #define ResInvertKeypadShift "invertKeypadShift" #define ResKeyFile "keyFile" #define ResKeyFileType "keyFileType" #define ResKeymap "keymap" #define ResKeypad "keypad" #define ResKeypadBackground "keypadBackground" #define ResKeypadOn "keypadOn" #define ResKeyPasswd "keyPasswd" #define ResKill "kill" #define ResLabelIcon "labelIcon" #define ResLightPenPrimary "lightPenPrimary" #define ResLineWrap "lineWrap" #define ResLnext "lnext" #define ResLocalCp "localCp" #define ResLoginMacro "loginMacro" #define ResLockedCursor "lockedCursor" #define ResLuCommandLine "printer.luCommandLine" #define ResM3279 "m3279" #define ResMacros "macros" #define ResMarginedPaste "marginedPaste" #define ResMaxRecent "maxRecent" #define ResMenuBar "menuBar" #define ResMetaEscape "metaEscape" #define ResMinVersion "minVersion" #define ResModel "model" #define ResModifiedSel "modifiedSel" #define ResModifiedSelColor "modifiedSelColor" #define ResMono "mono" #define ResMonoCase "monoCase" #define ResMouse "mouse" #define ResNewEnviron "newEnviron" #define ResNoOther "noOther" #define ResNoPrompt "noPrompt" #define ResNopSeconds "nopSeconds" #define ResNormalColor "normalColor" #define ResNormalCursor "normalCursor" #define ResNumericLock "numericLock" #define ResNvtMode "nvtMode" #define ResOerrLock "oerrLock" #define ResOnce "once" #define ResOnlcr "onlcr" #define ResOverlayPaste "overlayPaste" #define ResOversize "oversize" #define ResPort "port" #define ResPreeditType "preeditType" #define ResPrinterCodepage "printer.codepage" #define ResPrinterCommand "printer.command" #define ResPrinterLu "printerLu" #define ResPrinterName "printer.name" #define ResPrinterOptions "printer.options" #define ResProxy "proxy" #define ResQuit "quit" #define ResQrBgColor "qrBgColor" #define ResReconnect "reconnect" #define ResRectangleSelect "rectangleSelect" #define ResReverseVideo "reverseVideo" #define ResRprnt "rprnt" #define ResSaveLines "saveLines" #define ResSchemeList "schemeList" #define ResScreenTrace "screenTrace" #define ResScreenTraceFile "screenTraceFile" #define ResScripted "scripted" #define ResScriptPort "scriptPort" #define ResScriptPortOnce "scriptPortOnce" #define ResScrollBar "scrollBar" #define ResSecure "secure" #define ResSelectBackground "selectBackground" #define ResSbcsCgcsgid "sbcsCgcsgid" #define ResShowTiming "showTiming" #define ResSocket "socket" #define ResStartTls "startTls" #define ResSuppressActions "suppressActions" #define ResSuppressHost "suppressHost" #define ResSuppressFontMenu "suppressFontMenu" #define ResSuppress "suppress" #define ResTermName "termName" #define ResTitle "title" #define ResTrace "trace" #define ResTraceDir "traceDir" #define ResTraceFile "traceFile" #define ResTraceFileSize "traceFileSize" #define ResTraceMonitor "traceMonitor" #define ResTypeahead "typeahead" #define ResUnderscore "underscore" #define ResUnlockDelay "unlockDelay" #define ResUnlockDelayMs "unlockDelayMs" #define ResUseCursorColor "useCursorColor" #define ResUser "user" #define ResUtf8 "utf8" #define ResV "v" #define ResVerifyHostCert "verifyHostCert" #define ResVisibleControl "visibleControl" #define ResVisualBell "visualBell" #define ResVisualSelect "visualSelect" #define ResVisualSelectColor "visualSelectColor" #define ResWaitCursor "waitCursor" #define ResWerase "werase" /* Dotted resource names. */ #define DotAcceptHostname "." ResAcceptHostname #define DotActiveIcon "." ResActiveIcon #define DotAplMode "." ResAplMode #define DotCaDir "." ResCaDir #define DotCaFile "." ResCaFile #define DotCertFile "." ResCertFile #define DotCertFileType "." ResCertFileType #define DotChainFile "." ResChainFile #define DotCbreak "." ResCbreak #define DotCharClass "." ResCharClass #define DotCharset "." ResCharset #define DotClientCert "." ResClientCert #define DotColorScheme "." ResColorScheme #define DotConnectTimeout "." ResConnectTimeout #define DotDevName "." ResDevName #define DotDsTrace "." ResDsTrace #define DotEmulatorFont "." ResEmulatorFont #define DotExtended "." ResExtended #define DotHostsFile "." ResHostsFile #define DotHttpd "." ResHttpd #define DotInputMethod "." ResInputMethod #define DotKeyFile "." ResKeyFile #define DotKeyFileType "." ResKeyFileType #define DotKeymap "." ResKeymap #define DotKeypadOn "." ResKeypadOn #define DotKeyPasswd "." ResKeyPasswd #define DotLoginMacro "." ResLoginMacro #define DotM3279 "." ResM3279 #define DotMinVersion "." ResMinVersion #define DotModel "." ResModel #define DotMono "." ResMono #define DotNopSeconds "." ResNopSeconds #define DotNvtMode "." ResNvtMode #define DotOnce "." ResOnce #define DotOversize "." ResOversize #define DotPort "." ResPort #define DotPreeditType "." ResPreeditType #define DotPrinterLu "." ResPrinterLu #define DotProxy "." ResProxy #define DotReconnect "." ResReconnect #define DotSaveLines "." ResSaveLines #define DotScripted "." ResScripted #define DotScriptPort "." ResScriptPort #define DotScriptPortOnce "." ResScriptPortOnce #define DotScrollBar "." ResScrollBar #define DotSecure "." ResSecure #define DotSelfSignedOk "." ResSelfSignedOk #define DotSocket "." ResSocket #define DotTermName "." ResTermName #define DotTitle "." ResTitle #define DotTrace "." ResTrace #define DotTraceFile "." ResTraceFile #define DotTraceFileSize "." ResTraceFileSize #define DotUser "." ResUser #define DotV "." ResV #define DotVerifyHostCert "." ResVerifyHostCert /* Resource classes. */ #define ClsAcceptHostname "AcceptHostname" #define ClsActiveIcon "ActiveIcon" #define ClsAdVersion "AdVersion" #define ClsAidWait "AidWait" #define ClsAllBold "AllBold" #define ClsAllowResize "AllowResize" #define ClsAltCursor "AltCursor" #define ClsAplCircledAlpha "AplCircledAlpha" #define ClsAplMode "AplMode" #define ClsBaselevelTranslations "BaselevelTranslations" #define ClsBellVolume "BellVolume" #define ClsBindLimit "BindLimit" #define ClsBindUnlock "BindUnlock" #define ClsBlankFill "BlankFill" #define ClsBoldColor "BoldColor" #define ClsBsdTm "BsdTm" #define ClsCaDir "CaDir" #define ClsCaFile "CaFile" #define ClsCbreak "Cbreak" #define ClsCertFile "CertFile" #define ClsCertFileType "CertFileType" #define ClsChainFile "ChainFile" #define ClsCharClass "CharClass" #define ClsCharset "Charset" #define ClsClientCert "ClientCert" #define ClsColor8 "Color8" #define ClsColorBackground "ColorBackground" #define ClsColorScheme "ColorScheme" #define ClsComposeMap "ComposeMap" #define ClsConfDir "ConfDir" #define ClsConnectFileName "ConnectFileName" #define ClsConnectTimeout "ConnectTimeout" #define ClsCrosshair "Crosshair" #define ClsCrosshairColor "CrosshairColor" #define ClsCursorBlink "CursorBlink" #define ClsCursorColor "CursorColor" #define ClsCursorPos "CursorPos" #define ClsDbcsCgcsgid "DbcsCgcsgid" #define ClsDebugTracing "DebugTracing" #define ClsDevName "DevName" #define ClsDftBufferSize "DftBufferSize" /* deprecated */ #define ClsDisconnectClear "DisconnectClear" #define ClsDoConfirms "DoConfirms" #define ClsDsTrace "DsTrace" #define ClsEmulatorFont "EmulatorFont" #define ClsEof "Eof" #define ClsErase "Erase" #define ClsEventTrace "EventTrace" #define ClsExtended "Extended" #define ClsFixedSize "FixedSize" #define ClsFtAllocation "FtAllocation" #define ClsFtAvblock "FtAvblock" #define ClsFtBlksize "FtBlksize" #define ClsFtBufferSize "FtBufferSize" #define ClsFtCr "FtCr" #define ClsFtDirection "FtDirection" #define ClsFtExist "FtExist" #define ClsFtHost "FtHost" #define ClsFtHostFile "FtHostFile" #define ClsFtLocalFile "FtLocalFile" #define ClsFtLrecl "FtLrecl" #define ClsFtMode "FtMode" #define ClsFtPrimarySpace "FtPrimarySpace" #define ClsFtRecfm "FtRecfm" #define ClsFtRemap "FtRemap" #define ClsFtSecondarySpace "FtSecondarySpace" #define ClsFtWindowsCodePage "ClsWindowsCodePage" #define ClsHighlightBold "HighlightBold" #define ClsHostname "Hostname" #define ClsHostsFile "HostsFile" #define ClsHttpd "Httpd" #define ClsIconFont "IconFont" #define ClsIconLabelFont "IconLabelFont" #define ClsIcrnl "Icrnl" #define ClsIdleCommand "IdleCommand" #define ClsIdleCommandEnabled "IdleCommandEnabled" #define ClsIdleTimeout "IdleTimeout" #define ClsInlcr "Inlcr" #define ClsInputColor "InputColor" #define ClsInputMethod "InputMethod" #define ClsIntr "Intr" #define ClsInvertKeypadShift "InvertKeypadShift" #define ClsKeyFile "KeyFile" #define ClsKeyFileType "KeyFileType" #define ClsKeymap "Keymap" #define ClsKeypad "Keypad" #define ClsKeypadBackground "KeypadBackground" #define ClsKeypadOn "KeypadOn" #define ClsKeyPasswd "KeyPasswd" #define ClsKill "Kill" #define ClsLabelIcon "LabelIcon" #define ClsLineWrap "LineWrap" #define ClsLnext "Lnext" #define ClsLockedCursor "LockedCursor" #define ClsLoginMacro "LoginMacro" #define ClsM3279 "M3279" #define ClsMacros "Macros" #define ClsMarginedPaste "MarginedPaste" #define ClsMaxRecent "MaxRecent" #define ClsMenuBar "MenuBar" #define ClsMetaEscape "MetaEscape" #define ClsMinVersion "MinVersion" #define ClsModel "Model" #define ClsModifiedSel "ModifiedSel" #define ClsModifiedSelColor "ModifiedSelColor" #define ClsMono "Mono" #define ClsMonoCase "MonoCase" #define ClsNewEnviron "NewEnviron" #define ClsNoOther "NoOther" #define ClsNopSeconds "NopSeconds" #define ClsNormalColor "NormalColor" #define ClsNormalCursor "NormalCursor" #define ClsNumericLock "NumericLock" #define ClsNvtMode "NvtMode" #define ClsOerrLock "OerrLock" #define ClsOnce "Once" #define ClsOnlcr "Onlcr" #define ClsOverlayPaste "OverlayPaste" #define ClsOversize "Oversize" #define ClsPort "Port" #define ClsPreeditType "PreeditType" #define ClsPrinterLu "PrinterLu" #define ClsProxy "Proxy" #define ClsQuit "Quit" #define ClsReconnect "Reconnect" #define ClsRectangleSelect "RectangleSelect" #define ClsRprnt "Rprnt" #define ClsSaveLines "SaveLines" #define ClsSbcsCgcsgid "SbcsSgcsgid" #define ClsScreenTrace "ScreenTrace" #define ClsScreenTraceFile "ScreenTraceFile" #define ClsScripted "Scripted" #define ClsScriptPort "ScriptPort" #define ClsScriptPortOnce "ScriptPortOnce" #define ClsScrollBar "ScrollBar" #define ClsSecure "Secure" #define ClsSelectBackground "SelectBackground" #define ClsShowTiming "ShowTiming" #define ClsSocket "Socket" #define ClsStartTls "StartTls" #define ClsSuppressActions "SuppressActions" #define ClsSuppressHost "SuppressHost" #define ClsSuppressFontMenu "SuppressFontMenu" #define ClsTermName "TermName" #define ClsTrace "Trace" #define ClsTraceDir "TraceDir" #define ClsTraceFile "TraceFile" #define ClsTraceFileSize "TraceFileSize" #define ClsTraceMonitor "TraceMonitor" #define ClsTypeahead "Typeahead" #define ClsUnlockDelay "UnlockDelay" #define ClsUnlockDelayMs "UnlockDelayMs" #define ClsUseCursorColor "UseCursorColor" #define ClsUser "User" #define ClsVerifyHostCert "VerifyHostCert" #define ClsVisibleControl "VisibleControl" #define ClsVisualBell "VisualBell" #define ClsVisualSelect "VisualSelect" #define ClsVisualSelectColor "VisualSelectColor" #define ClsWaitCursor "WaitCursor" #define ClsWerase "Werase" /* Options. */ #define OptAcceptHostname "-accepthostname" #define OptActiveIcon "-activeicon" #define OptAllBold "-allbold" #define OptAltScreen "-altscreen" #define OptAplMode "-apl" #define OptCaDir "-cadir" #define OptCaFile "-cafile" #define OptCbreak "-cbreak" #define OptCertFile "-certfile" #define OptCertFileType "-certfiletype" #define OptChainFile "-chainfile" #define OptCharClass "-cc" #define OptCharset "-charset" #define OptClientCert "-clientcert" #define OptClear "-clear" #define OptColorScheme "-scheme" #define OptConnectTimeout "-connecttimeout" #define OptDefaultFgBg "-defaultfgbg" #define OptDefScreen "-defscreen" #define OptDevName "-devname" #define OptTrace "-trace" #define OptEmulatorFont "-efont" #define OptExtended "-extended" #define OptHostsFile "-hostsfile" #define OptHttpd "-httpd" #define OptIconName "-iconname" #define OptIconX "-iconx" #define OptIconY "-icony" #define OptInputMethod "-im" #define OptKeyFile "-keyfile" #define OptKeyFileType "-keyfiletype" #define OptKeymap "-keymap" #define OptKeypadOn "-keypad" #define OptKeyPasswd "-keypasswd" #define OptLocalCp "-localcp" #define OptLocalProcess "-e" #define OptLoginMacro "-loginmacro" #define OptM3279 "-color" #define OptMinVersion "-minversion" #define OptModel "-model" #define OptMono "-mono" #define OptNoPrompt "-noprompt" #define OptNoScrollBar "+sb" #define OptNvtMode "-nvt" #define OptOnce "-once" #define OptOversize "-oversize" #define OptPort "-port" #define OptPreeditType "-pt" #define OptPrinterLu "-printerlu" #define OptProxy "-proxy" #define OptReconnect "-reconnect" #define OptReverseVideo "-rv" #define OptSaveLines "-sl" #define OptSecure "-secure" #define OptScripted "-script" #define OptScriptPort "-scriptport" #define OptScriptPortOnce "-scriptportonce" #define OptScrollBar "-sb" #define OptSet "-set" #define OptSocket "-socket" #define OptSyncPort "-syncport" #define OptAutoShortcut "-S" #define OptNoAutoShortcut "+S" #define OptNoVerifyHostCert "-noverifycert" #define OptTermName "-tn" #define OptTitle "-title" #define OptTraceFile "-tracefile" #define OptTraceFileSize "-tracefilesize" #define OptUser "-user" #define OptUtf8 "-utf8" #define OptV "-v" #define OptVerifyHostCert "-verifycert" #define OptVersion "--version" /* Miscellaneous values. */ #define ResTrue "true" #define ResFalse "false" #define KpLeft "left" #define KpRight "right" #define KpBottom "bottom" #define KpIntegral "integral" #define KpInsideRight "insideRight" #define Apl "apl" /* Resources that are gotten explicitly. */ #define ResComposeMap "composeMap" #define ResEmulatorFontList "emulatorFontList" #define ResKeyHeight "keyHeight" #define ResKeyWidth "keyWidth" #define ResLargeKeyWidth "largeKeyWidth" #define ResMessage "message" #define ResNvt "nvt" #define ResPaWidth "paWidth" #define ResPfWidth "pfWidth" #define ResPrintTextCommand "printTextCommand" #define ResPrintTextFont "printTextFont" #define ResPrintTextHorizontalMargin "printTextHorizontalMargin" #define ResPrintTextOrientation "printTextOrientation" #define ResPrintTextScreensPerPage "printTextScreensPerPage" #define ResPrintTextSize "printTextSize" #define ResPrintTextVerticalMargin "printTextVerticalMargin" #define ResPrintWindowCommand "printWindowCommand" #define ResTraceCommand "traceCommand" #define ResUser "user" suite3270-3.6/include/rpq.h0000664000076500007650000000334613221577163013600 0ustar pdmpdm/* * Copyright (c) 2005-2009, 2013, 2015 Paul Mattes. * Copyright (c) 2004-2005, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * rpq.h * RPQNAMES structured field support. * */ extern qr_single_fn_t do_qr_rpqnames; suite3270-3.6/include/save.h0000664000076500007650000000316213221577163013730 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * save.h * Declarations for save.c. */ extern char *command_string; void save_yourself(void); suite3270-3.6/include/screen.h0000664000076500007650000000454013221577163014252 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen.h * Declarations for screen.c. */ extern int *char_width, *char_height; void cursor_move(int baddr); void blink_start(void); unsigned display_heightMM(void); unsigned display_height(void); unsigned display_widthMM(void); unsigned display_width(void); void mcursor_locked(void); void mcursor_normal(void); void mcursor_waiting(void); bool screen_obscured(void); void screen_scroll(void); unsigned long screen_window_number(void); bool screen_has_bg_color(void); void ring_bell(void); void screen_disp(bool erasing); void screen_80(void); void screen_132(void); void screen_flip(void); bool screen_selected(int baddr); bool screen_new_display_charsets(const char *realname, const char *csnames); void screen_system_fixup(void); bool screen_suspend(void); void screen_set_thumb(float top, float shown); void enable_cursor(bool on); suite3270-3.6/include/scroll.h0000664000076500007650000000321413221577163014266 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * scroll.h * Global declarations for scroll.c. */ void scroll_save(int n, bool trim_blanks); void scroll_to_bottom(void); suite3270-3.6/include/see.h0000664000076500007650000000364213221577163013551 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * see.h * Declarations for see.c * */ const char *see_aid(unsigned char code); const char *see_attr(unsigned char fa); const char *see_color(unsigned char setting); const char *see_ebc(unsigned char ch); const char *see_efa(unsigned char efa, unsigned char value); const char *see_efa_only(unsigned char efa); const char *see_qcode(unsigned char id); int decode_host_color(const char *name); suite3270-3.6/include/selectc.h0000664000076500007650000000326013221577163014413 0ustar pdmpdm/* * Copyright (c) 1999-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * selectc.h * Common declarations for select.c. */ void unselect(int baddr, int len); bool area_is_selected(int baddr, int len); void select_register(void); suite3270-3.6/include/sf.h0000664000076500007650000000325413221577163013404 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sf.h * Global declarations for sf.c. */ typedef void qr_single_fn_t(void); enum pds write_structured_field(unsigned char buf[], size_t buflen); suite3270-3.6/include/sio.h0000664000076500007650000000544113221577163013566 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sio.h * External definitions for functions and data for secure I/O, * implemented in various platform-specific ways. */ /* Special return values from sio_read and sio_write. */ #define SIO_EOF 0 #define SIO_FATAL_ERROR (-1) #define SIO_EWOULDBLOCK (-2) /* Return values from sio_init. */ typedef enum { SI_SUCCESS, /* success */ SI_FAILURE, /* failure, reason in sio_last_error */ SI_NEED_PASSWORD, /* need a password */ SI_WRONG_PASSWORD /* password is wrong */ } sio_init_ret_t; typedef void *sio_t; /* Implemented in common code. */ void sio_register(void); const char *sio_last_error(void); unsigned sio_all_options_supported(); const char *sio_option_name(unsigned option); /* Implemented in platform-specific code. */ bool sio_supported(void); const char *sio_provider(void); unsigned sio_options_supported(void); sio_init_ret_t sio_init(ssl_config_t *config, const char *password, sio_t *sio_ret); bool sio_negotiate(sio_t sio, socket_t sock, const char *hostname, bool *data); int sio_read(sio_t sio, char *buf, size_t buflen); int sio_write(sio_t sio, const char *buf, size_t buflen); void sio_close(sio_t sio); bool sio_secure_unverified(sio_t sio); const char *sio_session_info(sio_t sio); const char *sio_server_cert_info(sio_t sio); suite3270-3.6/include/sioc.h0000664000076500007650000000342113221577163013725 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * sioc.h * Common back-end logic for secure I/O. */ void sioc_set_error(const char *fmt, ...); void sioc_error_reset(void); char *sioc_string_from_file(const char *path, size_t *len_ret); char *sioc_parse_password_spec(const char *spec); suite3270-3.6/include/split_host.h0000664000076500007650000000405413221577163015163 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * split_host.h * Host name parsing. */ /* Host flags. */ typedef enum { ANSI_HOST, /* A: */ NO_LOGIN_HOST, /* C: */ SSL_HOST, /* L: */ NON_TN3270E_HOST, /* N: */ PASSTHRU_HOST, /* P: */ STD_DS_HOST, /* S: */ BIND_LOCK_HOST, /* B:, now a no-op */ NO_VERIFY_CERT_HOST /* Y: */ } host_flags_t; #define HOST_nFLAG(flags, t) ((flags & (1 << t)) != 0) bool new_split_host(char *raw, char **lu, char **host, char **port, char **accept, unsigned *prefixes, char **error); suite3270-3.6/include/ssl_config.h0000664000076500007650000000607013221577163015121 0ustar pdmpdm/* * Copyright (c) 1993-2012, 2016-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ssl_config.h * Secure I/O configuration. */ typedef struct { /* Required options. */ char *accept_hostname; bool verify_host_cert; bool starttls; /* Options that might or might not be supported. */ char *ca_dir; char *ca_file; char *cert_file; char *cert_file_type; char *chain_file; char *key_file; char *key_file_type; char *key_passwd; char *client_cert; } ssl_config_t; /* Required options. */ #define SSL_OPT_ACCEPT_HOSTNAME 0x00000001 #define SSL_OPT_VERIFY_HOST_CERT 0x00000002 #define SSL_OPT_STARTTLS 0x00000004 #define SSL_REQUIRED_OPTS \ (SSL_OPT_ACCEPT_HOSTNAME | SSL_OPT_VERIFY_HOST_CERT | SSL_OPT_STARTTLS) /* Options optionally supported by specific implementations. */ #define SSL_OPT_CA_DIR 0x00000008 #define SSL_OPT_CA_FILE 0x00000010 #define SSL_OPT_CERT_FILE 0x00000020 #define SSL_OPT_CERT_FILE_TYPE 0x00000040 #define SSL_OPT_CHAIN_FILE 0x00000080 #define SSL_OPT_KEY_FILE 0x00000100 #define SSL_OPT_KEY_FILE_TYPE 0x00000200 #define SSL_OPT_KEY_PASSWD 0x00000400 #define SSL_OPT_CLIENT_CERT 0x00000800 #define SSL_OPTIONAL_OPTS \ (SSL_OPT_CA_DIR | SSL_OPT_CA_FILE | SSL_OPT_CERT_FILE | \ SSL_OPT_CERT_FILE_TYPE | SSL_OPT_CHAIN_FILE | SSL_OPT_KEY_FILE | \ SSL_OPT_KEY_FILE_TYPE | SSL_OPT_KEY_PASSWD | SSL_OPT_CLIENT_CERT) #define SSL_ALL_OPTS (SSL_REQUIRED_OPTS | SSL_OPTIONAL_OPTS) #define FOREACH_SSL_OPTS(opt) { \ unsigned opt = 1; \ while (SSL_ALL_OPTS & opt) { #define FOREACH_SSL_OPTS_END(opt) \ opt <<= 1; \ } \ } suite3270-3.6/include/ssl_passwd_gui.h0000664000076500007650000000351113221577163016016 0ustar pdmpdm/* * Copyright (c) 2014-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ssl_passwd_gui.h * Global declarations for ssl_passwd_gui.c. */ typedef enum { SP_SUCCESS, /* got a password */ SP_FAILURE, /* aborted */ SP_PENDING, /* pending */ SP_NOT_SUPPORTED /* can't prompt */ } ssl_passwd_ret_t; ssl_passwd_ret_t ssl_passwd_gui_callback(char *buf, int size, bool again); suite3270-3.6/include/status.h0000664000076500007650000000423613221577163014320 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * status.h * Global declarations for status.c. */ void status_compose(bool on, unsigned char c, enum keytype keytype); void status_ctlr_done(void); void status_cursor_pos(int ca); void status_insert_mode(bool on); void status_lu(const char *); void status_minus(void); void status_oerr(int error_type); void status_reset(void); void status_reverse_mode(bool on); void status_screentrace(int n); void status_script(bool on); void status_scrolled(int n); void status_syswait(void); void status_timing(struct timeval *t0, struct timeval *t1); void status_twait(void); void status_typeahead(bool on); void status_uncursor_pos(void); void status_untiming(void); suite3270-3.6/include/tables.h0000664000076500007650000000323113221577163014241 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * tables.h * Global declarations for tables.c. */ extern const unsigned char ebc2asc0[256]; extern const unsigned char asc2ebc0[256]; suite3270-3.6/include/telnet_core.h0000664000076500007650000000414213221577163015274 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_core.h * Global declarations for telnet.c functions and data common to * both the 3270 and 3287 emulators. */ /* Output buffer. */ extern unsigned char *obuf, *obptr; /* Entry points. */ void popup_a_sockerr(const char *fmt, ...) printflike(1, 2); bool net_add_dummy_tn3270e(void); void net_add_eor(unsigned char *buf, size_t len); void net_disconnect(bool including_ssl); void net_output(void); void space3270out(size_t n); void trace_netdata(char direction, unsigned const char *buf, size_t len); suite3270-3.6/include/telnet_gui.h0000664000076500007650000000322013221577163015124 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_gui.h * Declarations for interactive TELNET functions */ void telnet_gui_connecting(const char *hostname, const char *portname); suite3270-3.6/include/telnet.h0000664000076500007650000000661213221577163014270 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2017 Paul Mattes. * Copyright (c) 2004, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet.h * Global declarations for telnet.c, beyond what is declared in * telnet_core.h. */ #if defined(PR3287) /*[*/ # error "Do not include this file for pr3287" #endif /*]*/ typedef enum { NC_FAILED, /* failed */ NC_RESOLVING, /* name resolution in progress */ NC_SSL_PASS, /* SSL password pending */ NC_CONNECT_PENDING, /* connection pending */ NC_CONNECTED /* connected */ } net_connect_t; extern int ns_brcvd; extern int ns_bsent; extern int ns_rrcvd; extern int ns_rsent; extern time_t ns_time; void net_abort(void); void net_break(void); void net_charmode(void); net_connect_t net_connect(const char *, char *, char *, bool, iosrc_t *); void net_exception(iosrc_t fd, ioid_t id); int net_getsockname(void *buf, int *len); void net_hexnvt_out(unsigned char *buf, int len); void net_input(iosrc_t fd, ioid_t id); void net_interrupt(void); void net_linemode(void); const char *net_query_bind_plu_name(void); const char *net_query_connection_state(void); const char *net_query_host(void); const char *net_query_lu_name(void); const char *net_query_ssl(void); void net_sendc(char c); void net_sends(const char *s); bool net_snap_options(void); const char *tn3270e_current_opts(void); char *net_proxy_type(void); char *net_proxy_host(void); char *net_proxy_port(void); bool net_bound(void); extern int linemode; bool net_secure_connection(); void net_set_default_termtype(void); bool net_secure_unverified(void); const char *net_server_cert_info(void); const char *net_session_info(void); void net_password_continue(char *password); unsigned net_sio_supported(void); const char *net_sio_provider(void); /* These are for linemode.c to call, not external users. */ void net_cookedout(const char *buf, size_t len); void net_cookout(const char *buf, size_t len); suite3270-3.6/include/telnet_private.h0000664000076500007650000000402613221577163016017 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2017 Paul Mattes. * Copyright (c) 2004, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC nor * the names of their contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_private.h * Private (locally-shared) declarations for telnet.c. */ extern sio_t sio; extern bool *ssl_pending; extern const char *telquals[]; const char *cmd(int c); const char *opt(unsigned char c); bool telnet_new_environ(unsigned char *request_buf, size_t request_buflen, unsigned char **reply_buf, size_t *reply_buflen, char **trace_inp, char **trace_outp); void environ_init(void); suite3270-3.6/include/telnet_sio.h0000664000076500007650000000327513221577163015144 0ustar pdmpdm/* * Copyright (c) 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * telnet_sio.h * Glue between telnet and secure I/O (sio). */ sio_t sio_init_wrapper(char *password, bool force_no_verify, char *accept, bool *pending); suite3270-3.6/include/tn3270e.h0000664000076500007650000000777413221577163014111 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * tn3270e.h * * Header file for the TN3270E Protocol, RFC 2355. */ /* Negotiation operations. */ #define TN3270E_OP_ASSOCIATE 0 #define TN3270E_OP_CONNECT 1 #define TN3270E_OP_DEVICE_TYPE 2 #define TN3270E_OP_FUNCTIONS 3 #define TN3270E_OP_IS 4 #define TN3270E_OP_REASON 5 #define TN3270E_OP_REJECT 6 #define TN3270E_OP_REQUEST 7 #define TN3270E_OP_SEND 8 /* Negotiation reason-codes. */ #define TN3270E_REASON_CONN_PARTNER 0 #define TN3270E_REASON_DEVICE_IN_USE 1 #define TN3270E_REASON_INV_ASSOCIATE 2 #define TN3270E_REASON_INV_DEVICE_NAME 3 #define TN3270E_REASON_INV_DEVICE_TYPE 4 #define TN3270E_REASON_TYPE_NAME_ERROR 5 #define TN3270E_REASON_UNKNOWN_ERROR 6 #define TN3270E_REASON_UNSUPPORTED_REQ 7 /* Negotiation function Names. */ #define TN3270E_FUNC_BIND_IMAGE 0 #define TN3270E_FUNC_DATA_STREAM_CTL 1 #define TN3270E_FUNC_RESPONSES 2 #define TN3270E_FUNC_SCS_CTL_CODES 3 #define TN3270E_FUNC_SYSREQ 4 /* Header data type names. */ #define TN3270E_DT_3270_DATA 0x00 #define TN3270E_DT_SCS_DATA 0x01 #define TN3270E_DT_RESPONSE 0x02 #define TN3270E_DT_BIND_IMAGE 0x03 #define TN3270E_DT_UNBIND 0x04 #define TN3270E_DT_NVT_DATA 0x05 #define TN3270E_DT_REQUEST 0x06 #define TN3270E_DT_SSCP_LU_DATA 0x07 #define TN3270E_DT_PRINT_EOJ 0x08 /* Header request flags. */ #define TN3270E_RQF_ERR_COND_CLEARED 0x00 /* Header response flags. */ #define TN3270E_RSF_NO_RESPONSE 0x00 #define TN3270E_RSF_ERROR_RESPONSE 0x01 #define TN3270E_RSF_ALWAYS_RESPONSE 0x02 #define TN3270E_RSF_POSITIVE_RESPONSE 0x00 #define TN3270E_RSF_NEGATIVE_RESPONSE 0x01 /* Header response data. */ #define TN3270E_POS_DEVICE_END 0x00 #define TN3270E_NEG_COMMAND_REJECT 0x00 #define TN3270E_NEG_INTERVENTION_REQUIRED 0x01 #define TN3270E_NEG_OPERATION_CHECK 0x02 #define TN3270E_NEG_COMPONENT_DISCONNECTED 0x03 /* TN3270E data header. */ typedef struct { unsigned char data_type; unsigned char request_flag; unsigned char response_flag; unsigned char seq_number[2]; /* actually, 16 bits, unaligned (!) */ } tn3270e_header; #define EH_SIZE 5 /* UNBIND types. */ #define TN3270E_UNBIND_NORMAL 0x01 #define TN3270E_UNBIND_BIND_FORTHCOMING 0x02 #define TN3270E_UNBIND_VR_INOPERATIVE 0x07 #define TN3270E_UNBIND_RX_INOPERATIVE 0x08 #define TN3270E_UNBIND_HRESET 0x09 #define TN3270E_UNBIND_SSCP_GONE 0x0a #define TN3270E_UNBIND_VR_DEACTIVATED 0x0b #define TN3270E_UNBIND_LU_FAILURE_PERM 0x0c #define TN3270E_UNBIND_LU_FAILURE_TEMP 0x0e #define TN3270E_UNBIND_CLEANUP 0x0f #define TN3270E_UNBIND_BAD_SENSE 0xfe suite3270-3.6/include/toggles.h0000664000076500007650000000547413221577163014446 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * toggles.h * Global declarations for toggles.c. */ typedef struct { const char *name; toggle_index_t index; bool is_alias; } toggle_name_t; extern toggle_name_t toggle_names[]; enum toggle_type { TT_INITIAL, /* at start-up */ TT_INTERACTIVE, /* at the prompt */ TT_ACTION, /* from a keymap, script or macro */ TT_XMENU, /* from a GUI menu */ TT_FINAL /* at shutdown */ }; typedef void toggle_upcall_t(toggle_index_t ix, enum toggle_type type); void do_menu_toggle(int); void do_toggle(int); void initialize_toggles(void); void toggles_register(void); void toggle_toggle(toggle_index_t ix); void set_toggle(toggle_index_t ix, bool value); void set_toggle_initial(toggle_index_t ix, bool value); bool toggle_changed(toggle_index_t ix); bool toggle_supported(toggle_index_t ix); #define TOGGLE_NEED_INIT 0x1 /* needs start-up initialization */ #define TOGGLE_NEED_CLEANUP 0x2 /* needs shutdown clean-up */ typedef struct { toggle_index_t ix; toggle_upcall_t *upcall; unsigned flags; } toggle_register_t; void register_toggles(toggle_register_t toggles[], unsigned count); suite3270-3.6/include/trace_gui.h0000664000076500007650000000334113221577163014733 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace_gui.h * Global declarations for trace_gui.c. */ void trace_gui_bad_size(const char *default_value); bool trace_gui_on(int reason, enum toggle_type tt, const char *tracefile); void trace_gui_toggle(void); suite3270-3.6/include/trace.h0000664000076500007650000000467413221577163014101 0ustar pdmpdm/* * Copyright (c) 1995-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace.h * Global declarations for trace.c. */ typedef enum { TSS_FILE, /* trace to file */ TSS_PRINTER /* trace to printer */ } tss_t; extern bool trace_skipping; extern char *tracefile_name; extern struct timeval ds_ts; const char *rcba(int baddr); char *screentrace_default_file(ptype_t ptype); char *screentrace_default_printer(void); void trace_nvt_disc(void); void trace_char(char c); void trace_ds(const char *fmt, ...) printflike(1, 2); void vtrace(const char *fmt, ...) printflike(1, 2); void ntvtrace(const char *fmt, ...) printflike(1, 2); tss_t trace_get_screentrace_how(void); tss_t trace_get_screentrace_last_how(void); const char *trace_get_screentrace_name(void); void trace_set_trace_file(const char *path); void trace_set_screentrace_file(tss_t how, ptype_t ptype, const char *name); void trace_screen(bool is_clear); void trace_rollover_check(void); void tracefile_ok(const char *tfn); void trace_register(void); suite3270-3.6/include/unicodec.h0000664000076500007650000000650213221577163014564 0ustar pdmpdm/* * Copyright (c) 2008-2009, 2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * unicodec.h * Declarations for Unicode translation functions. */ extern bool dbcs_allowed; /* EBCDIC-to-Unicode options */ #define EUO_NONE 0x00000000 /* no options */ #define EUO_BLANK_UNDEF 0x00000001 /* if undefined, return U+0020 */ #define EUO_UPRIV 0x00000002 /* translate FM/DUP/SUB/EO to UPRIV */ #define EUO_ASCII_BOX 0x00000004 /* use ASCII for box drawing */ #define EUO_APL_CIRCLED 0x00000010 /* map APL underscored capital letters to DBCS circled alphabetics */ ucs4_t ebcdic_to_unicode(ebc_t e, unsigned char cs, unsigned flags); ucs4_t ebcdic_base_to_unicode(ebc_t e, unsigned flags); ebc_t unicode_to_ebcdic(ucs4_t u); ebc_t unicode_to_ebcdic_ge(ucs4_t u, bool *ge); bool set_uni(const char *csname, int local_cp, const char **host_codepage, const char **cgcsgid, const char **realnamep, bool *is_dbcs); int linedraw_to_unicode(ebc_t e); int apl_to_unicode(ebc_t e, unsigned flags); size_t ebcdic_to_multibyte_x(ebc_t ebc, unsigned char cs, char mb[], size_t mb_len, unsigned flags, ucs4_t *uc); size_t ebcdic_to_multibyte(ebc_t ebc, char mb[], size_t mb_len); size_t ebcdic_to_multibyte_string(unsigned char *ebc, size_t ebc_len, char mb[], size_t mb_len); int mb_max_len(int len); enum me_fail { ME_NONE, /* no error */ ME_INVALID, /* invalid sequence */ ME_SHORT /* incomplete sequence */ }; ucs4_t multibyte_to_unicode(const char *mb, size_t mb_len, int *consumedp, enum me_fail *errorp); int multibyte_to_unicode_string(const char *mb, size_t mb_len, ucs4_t *ucs4, size_t u_len); ebc_t multibyte_to_ebcdic(const char *mb, size_t mb_len, int *consumedp, enum me_fail *errorp); int multibyte_to_ebcdic_string(char *mb, size_t mb_len, unsigned char *ebc, size_t ebc_len, enum me_fail *errorp); int unicode_to_multibyte(ucs4_t ucs4, char *mb, size_t mb_len); bool using_iconv(void); suite3270-3.6/include/unicode_dbcs.h0000664000076500007650000000342313221577163015413 0ustar pdmpdm/* * Copyright (c) 2008-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * unicode_dbcs.h * Declarations for DBCS Unicode functions. */ ucs4_t ebcdic_dbcs_to_unicode(ebc_t e, unsigned flags); ebc_t unicode_to_ebcdic_dbcs(ucs4_t u); bool set_uni_dbcs(const char *csname, const char **codepage); void charset_list_dbcs(void); suite3270-3.6/include/utf8.h0000664000076500007650000000347013221577163013662 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * utf8.h * UTF-8 conversion functions. */ extern char *locale_codeset; extern bool is_utf8; void set_codeset(char *codeset_name, bool force_utf8); int unicode_to_utf8(ucs4_t ucs4, char *utf8); int utf8_to_unicode(const char *utf8, int len, ucs4_t *ucs4); const char *get_codeset(void); suite3270-3.6/include/utils.h0000664000076500007650000000776413221577163014146 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * util.h * Global declarations for util.c. */ void add_resource(const char *name, const char *value); char *ctl_see(int c); char *do_subst(const char *s, unsigned flags); #define DS_NONE 0x0 #define DS_VARS 0x1 #define DS_TILDE 0x2 #define DS_UNIQUE 0x4 void fcatv(FILE *f, char *s); const char *get_message(const char *key); char *get_fresource(const char *fmt, ...) printflike(1, 2); char *get_resource(const char *name); char *scatv(const char *s, char *buf, size_t len); int split_dbcs_resource(const char *value, char sep, char **part1, char **part2); int split_dresource(char **st, char **left, char **right); int split_lresource(char **st, char **value); char *strip_whitespace(const char *s); char *xs_vbuffer(const char *fmt, va_list); char *xs_buffer(const char *fmt, ...) printflike(1, 2); void xs_error(const char *fmt, ...) printflike(1, 2); void xs_warning(const char *fmt, ...) printflike(1, 2); typedef void (*iofn_t)(iosrc_t, ioid_t id); typedef void (*tofn_t)(ioid_t id); ioid_t AddInput(iosrc_t fd, iofn_t fn); ioid_t AddExcept(iosrc_t fd, iofn_t fn); ioid_t AddOutput(iosrc_t fd, iofn_t fn); void RemoveInput(ioid_t); ioid_t AddTimeOut(unsigned long msec, tofn_t); void RemoveTimeOut(ioid_t id); ks_t string_to_key(char *s); char *key_to_string(ks_t k); bool read_resource_file(const char *filename, bool fatal); bool split_hier(char *label, char **base, char ***parents); const char *build_options(void); void dump_version(void); const char *display_scale(double d); /* Doubly-linked lists. */ bool llist_isempty(llist_t *l); void llist_init(llist_t *l); void llist_insert_before(llist_t *element, llist_t *before); void llist_unlink(llist_t *element); #define LLIST_INIT(head) { &head, &head } #define FOREACH_LLIST(head, elt, type) { \ llist_t *_elt; \ llist_t *_next; \ for (_elt = (head)->next; _elt != (head); _elt = _next) { \ _next = _elt->next; \ (elt) = (type)(void *)_elt; #define FOREACH_LLIST_END(head, elt, type) \ } \ } /* State changes. */ #define ST_RESOLVING 1 #define ST_HALF_CONNECT 2 #define ST_CONNECT 3 #define ST_3270_MODE 4 #define ST_LINE_MODE 5 #define ST_REMODEL 6 #define ST_PRINTER 7 #define ST_EXITING 8 #define ST_CHARSET 9 #define ST_SELECTING 10 #define N_ST 11 #define ORDER_DONTCARE 0xfffe #define ORDER_LAST 0xffff typedef void schange_callback_t(bool); void register_schange_ordered(int tx, schange_callback_t *func, unsigned short order); void register_schange(int tx, schange_callback_t *func); void st_changed(int tx, bool mode); suite3270-3.6/include/varbuf.h0000664000076500007650000000414113221577163014255 0ustar pdmpdm/* * Copyright (c) 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * varbuf.h * Header file for x3270 variable-length buffer library. */ typedef struct { char *buf; size_t len; size_t alloc_len; } varbuf_t; void vb_init(varbuf_t *r); void vb_append(varbuf_t *r, const char *buf, size_t len); void vb_appends(varbuf_t *r, const char *buf); void vb_vappendf(varbuf_t *r, const char *format, va_list ap); void vb_appendf(varbuf_t *r, const char *format, ...) printflike(2, 3); const char *vb_buf(const varbuf_t *r); size_t vb_len(const varbuf_t *r); void vb_reset(varbuf_t *r); char *vb_consume(varbuf_t *r); void vb_free(varbuf_t *r); suite3270-3.6/include/w3misc.h0000664000076500007650000000357613221577163014210 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * w3misc.h * Miscellaneous Win32 functions. */ /* * Note: This header file declares only the x3270-specific functions in * w3misc.c. The libc replacement functions defined in w3misc.c are declared * in wincmn.h. */ #if defined(_WIN32) /*[*/ int sockstart(void); const char *win32_strerror(int e); void win32_perror(const char *fmt, ...); #endif /*]*/ suite3270-3.6/include/wincmn.h0000664000076500007650000001026213221577163014264 0ustar pdmpdm/* * Copyright (c) 2007-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * wincmn.h * Common Windows definitions. */ #if defined(_WIN32) /*[*/ /* * Pull in the Windows header files needed for the function names redefined * below, and containing the typedefs for the substitute functions defined * below. */ # define WIN32_LEAN_AND_MEAN 1 /* Skip things we don't need */ # include /* Has to come before windows.h */ # include /* Common definitions for Windows */ # include # include # include # include # include # include # include /* * Windows has inet_ntop() only in Vista and up. We define our own in * w3misc.c. */ # define inet_ntop my_inet_ntop const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); /* * MinGW has no IsWindowsVersionOrGreater(). */ # if !defined(__GNUC__) /*[*/ # include # else /*][*/ # define IsWindowsVersionOrGreater my_IsWindowsVersionOrGreater extern BOOL IsWindowsVersionOrGreater(WORD major_version, WORD minor_version, WORD service_pack_major); # endif /*]*/ /* * Windows has no in_addr_t. */ typedef unsigned long in_addr_t; /* * Prior to VS2013, Windows did not define va_copy(). */ # if !defined(va_copy) /*[*/ # define va_copy(to, from) (to) = (from) # endif /*]*/ /* * Windows snprintf/vsnprintf do not guarantee NUL termination, so we have our * own. */ int safe_vsnprintf(char *str, size_t size, const char *fmt, va_list ap); int safe_snprintf(char *str, size_t size, const char *fmt, ...); # if !defined(IS_SNPRINTF_C) /*[*/ # define vsnprintf safe_vsnprintf # define snprintf safe_snprintf # endif /*]*/ /* * We always use _vscprintf instead of vscprintf. */ # define vscprintf _vscprintf # if defined(_MSC_VER) /*[*/ /* MSVC does not define the constants for access(). */ # define R_OK 4 /* MSVC says these POSIX names are deprecated. */ # define access _access # define close _close # define dup _dup # define fdopen _fdopen # define fileno _fileno # define getcwd _getcwd # define getpid _getpid # define open _open # define putenv _putenv # define read _read # define strdup _strdup # define unlink _unlink # define write _write /* Non-standard string function names. */ # define strcasecmp _stricmp # define strncasecmp _strnicmp /* MSVC has no POSIX ssize_t. */ typedef SSIZE_T ssize_t; /* MSVC has no gettimeofday(). We define it in w3misc.c. */ int gettimeofday(struct timeval *, void *); /* MSVC has no getopt(). We define it in w3misc.c. */ int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; # endif /*]*/ #endif /*]*/ suite3270-3.6/include/windirs.h0000664000076500007650000000363513221577163014456 0ustar pdmpdm/* * Copyright (c) 2006-2009, 2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * windirs.h * Global declarations for windirs.c. */ #if !defined(_WIN32) /*[*/ #error For Windows only #endif /*]*/ #define GD_INSTALLED 0x1 #define GD_CATF 0x2 bool get_dirs(char *appname, char **instdir, char **desktop, char **appdata, char **common_desktop, char **common_appdata, char **documents, char **common_documnts, char **docs3270, char **common_docs3270, unsigned *flags); suite3270-3.6/include/winprint.h0000664000076500007650000000345713221577163014653 0ustar pdmpdm/* * Copyright (c) 2013-2015, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * winprint.h * Global declaratoins for winprint.c. */ int win_mkstemp(char **path, ptype_t ptype); void start_wordpad_sync(const char *action_name, const char *filename, const char *printer); void start_wordpad_async(const char *action_name, const char *filename, const char *printer); suite3270-3.6/include/winvers.h0000664000076500007650000000326613221577163014474 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2014-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * winvers.h * Declarations for winvers.c. */ #if !defined(_WIN32) /*[*/ #error For Windows only #endif /*[*/ int get_version_info(void); bool is_wine(void); suite3270-3.6/include/xio.h0000664000076500007650000000335313221577163013573 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * xio.h * Global declarations for xio.c. */ void x3270_exit(int n); void x_add_input(iosrc_t iosrc); void x_except_off(void); void x_except_on(iosrc_t iosrc); void xio_register(void); void x_remove_input(void); suite3270-3.6/include/xscroll.h0000664000076500007650000000336013221577163014460 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * xscrollc.h * Global declarations for x3270 scroll.c. */ void jump_proc(float top); void rethumb(void); void scroll_buf_init(void); void scroll_proc(int n, int total); void scroll_register(void); void scroll_round(void); suite3270-3.6/install-sh0000775000076500007650000001270113221577163013201 0ustar pdmpdm#!/usr/bin/env sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then : else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else : fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else : fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else : fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 suite3270-3.6/lib/3270i/Makefile.aux0000664000076500007650000000314513221577163014745 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for 3270 interactive library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/3270i/Makefile.in0000664000076500007650000000403413221577163014554 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for lib3270i objdir = ../../obj/@host@/lib3270i top = ../../.. this = $(top)/lib/3270i export VPATH = $(this):$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/3270i/Makefile.obj.in0000664000076500007650000000422013221577163015322 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270 interactive emulation common library LIB3270I = lib3270i.a RM = rm -f CC = @CC@ AR = ar all: $(LIB3270I) include lib3270i_files.mk OBJS = $(LIB3270I_OBJECTS) LIBDIR = @libdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sysconfdir = @sysconfdir@ datarootdir = @datrootdir@ LIBX3270DIR = @LIBX3270DIR@ CCOPTIONS = @CCOPTIONS@ XCPPFLAGS = -I$(THIS) -I$(THIS)/../include/unix -I$(THIS)/../include -I$(TOP)/include -DLIBX3270DIR=\"$(LIBX3270DIR)\" @CPPFLAGS@ CFLAGS = $(CCOPTIONS) $(CDEBUGFLAGS) $(XCPPFLAGS) $(LIB3270I): $(OBJS) $(AR) cr $@ $(OBJS) ranlib $@ clean: $(RM) *.o clobber: clean $(RM) $(LIB3270I) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/3270/lib3270u_files.mk0000664000076500007650000000010513221577163015313 0ustar pdmpdm# Unix-specific object files for lib3270. LIB3270U_OBJECTS = child.o suite3270-3.6/lib/3270/Makefile.in0000664000076500007650000000406113221577163014403 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for lib3270 objdir = ../../obj/@host@/lib3270 top = ../../.. this = $(top)/lib/3270 export VPATH = $(this):$(top)/Common:$(top)/Common/Nodisplay export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/3270/Makefile.obj.in0000664000076500007650000000437413221577163015163 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270 emulation library LIB3270 = lib3270.a RM = rm -f CC = @CC@ AR = ar all: $(LIB3270) include lib3270_files.mk include lib3270u_files.mk OBJS = $(LIB3270_OBJECTS) $(LIB3270U_OBJECTS) LIBDIR = @libdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sysconfdir = @sysconfdir@ datarootdir = @datarootdir@ LIBX3270DIR = @LIBX3270DIR@ CCOPTIONS = @CCOPTIONS@ XCPPFLAGS = -I$(THIS) -I$(THIS)/../include/unix -I$(THIS)/../include -I$(TOP)/include -DLIBX3270DIR=\"$(LIBX3270DIR)\" @CPPFLAGS@ CFLAGS = $(CCOPTIONS) $(CDEBUGFLAGS) $(XCPPFLAGS) $(LIB3270): $(OBJS) $(AR) cr $@ $(OBJS) ranlib $@ favicon.o: favicon.c favicon.c: favicon.ico mkicon ./mkicon $< >$@ clean: $(RM) *.o favicon.c mkicon clobber: clean $(RM) $(LIB3270) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/3270stubs/child_stubs.c0000664000076500007650000000325213221577163016067 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * child_stubs.c * Stubs for child.c. */ #include "globals.h" #include "child.h" int fork_child(void) { return fork(); } void child_ignore_output(void) { } suite3270-3.6/lib/3270stubs/lib3270stubsu_files.mk0000664000076500007650000000012113221577163017453 0ustar pdmpdm# Unix-only object files for lib3270stubs. LIB3270STUBSU_OBJECTS = child_stubs.o suite3270-3.6/lib/3270stubs/Makefile.aux0000664000076500007650000000313213221577163015651 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for stubs library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/3270stubs/Makefile.in0000664000076500007650000000405013221577163015462 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for lib3270stubs objdir = ../../obj/@host@/lib3270stubs top = ../../.. this = $(top)/lib/3270stubs export VPATH = $(this):$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/3270stubs/Makefile.obj.in0000664000076500007650000000427013221577163016237 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for stubs library LIBSTUBS = lib3270stubs.a RM = rm -f CC = @CC@ AR = ar all: $(LIBSTUBS) include lib3270stubs_files.mk include lib3270stubsu_files.mk OBJS = $(LIB3270STUBS_OBJECTS) $(LIB3270STUBSU_OBJECTS) LIBDIR = @libdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sysconfdir = @sysconfdir@ datarootdir = @datarootdir@ LIBX3270DIR = @LIBX3270DIR@ CCOPTIONS = @CCOPTIONS@ XCPPFLAGS = -I$(THIS) -I$(THIS)/../include/unix -I$(THIS)/../include -I$(TOP)/include -DLIBX3270DIR=\"$(LIBX3270DIR)\" @CPPFLAGS@ CFLAGS = $(CCOPTIONS) $(CDEBUGFLAGS) $(XCPPFLAGS) $(LIBSTUBS): $(OBJS) $(AR) cr $@ $(OBJS) ranlib $@ clean: $(RM) *.o clobber: clean $(RM) $(LIBSTUBS) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/32xx/32xx-deplibs.mk.in0000664000076500007650000000020013221577163015720 0ustar pdmpdm# lib32xx depends on the SSL libraries and libiconv, found by autoconf. LIB32XX_DEPLIBS = @SSL_LDFLAGS@ @SSL_LIBS@ @ICONV_LIBS@ suite3270-3.6/lib/32xx/Makefile.aux0000664000076500007650000000314513221577163015005 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for 3270/3287 common library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/32xx/Makefile.in0000664000076500007650000000403113221577163014611 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for lib32xx objdir = ../../obj/@host@/lib32xx top = ../../.. this = $(top)/lib/32xx export VPATH = $(this):$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/32xx/Makefile.obj.in0000664000076500007650000000422013221577163015362 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270/3287 emulation common library LIB32XX = lib32xx.a RM = rm -f CC = @CC@ AR = ar all: $(LIB32XX) include lib32xx_files.mk OBJS = $(LIB32XX_OBJECTS) @SSL_MODULES@ LIBDIR = @libdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sysconfdir = @sysconfdir@ datarootdir = @datarootdir@ LIBX3270DIR = @LIBX3270DIR@ CCOPTIONS = @CCOPTIONS@ XCPPFLAGS = -I$(THIS) -I$(THIS)/../include/unix -I$(THIS)/../include -I$(TOP)/include -DLIBX3270DIR=\"$(LIBX3270DIR)\" @CPPFLAGS@ CFLAGS = $(CCOPTIONS) $(CDEBUGFLAGS) $(XCPPFLAGS) $(LIB32XX): $(OBJS) $(AR) cr $@ $(OBJS) ranlib $@ clean: $(RM) *.o clobber: clean $(RM) $(LIB32XX) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/configure0000775000076500007650000050122413221577163013655 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for suite3270-lib 3.x. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='suite3270-lib' PACKAGE_TARNAME='suite3270-lib' PACKAGE_VERSION='3.x' PACKAGE_STRING='suite3270-lib 3.x' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS SSL_MODULES LIBX3270DIR SSL_LIBS SSL_LDFLAGS ICONV_LIBS USE_ICONV EGREP GREP CPP CONNECT_GETPEERNAME CCOPTIONS host_os host_vendor host_cpu host build_os build_vendor build_cpu build RANLIB OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_ssl with_iconv enable_dbcs enable_local_process enable_ssl enable_ipv6 enable_stransport enable_mock_ssl ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures suite3270-lib 3.x to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/suite3270-lib] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of suite3270-lib 3.x:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dbcs leave out DBCS support --disable-local-process leave out local process support --disable-ssl leave out SSL/TLS support --disable-ipv6 leave out IPv6 support --disable-stransport use OpenSSL instead of Secure Transport (MacOS) --enable-mock-ssl use SSL mock for testing Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR specify OpenSSL install directory --with-iconv ignore __STDC_ISO_10646__ and use iconv() instead Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF suite3270-lib configure 3.x generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by suite3270-lib $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ansi="-std=c99 -pedantic" case "$host_os" in *cygwin*) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ansi="" ;; hpux|*cygwin*) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ;; solaris2*) CPPFLAGS=-D__EXTENSIONS__ $as_echo "#define CONNECT_GETPEERNAME 1" >>confdefs.h ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" CPPFLAGS="-D_XOPEN_SOURCE_EXTENDED" mac_os=1 ;; linux*) CPPFLAGS="-D_POSIX_SOURCE -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE" ;; esac if test "$GCC" = yes then CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SELECT_H 1 _ACEOF fi done for ac_header in readline/history.h do : ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" if test "x$ac_cv_header_readline_history_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_READLINE_HISTORY_H 1 _ACEOF fi done for ac_header in pty.h do : ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTY_H 1 _ACEOF fi done for ac_header in libutil.h do : ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBUTIL_H 1 _ACEOF fi done for ac_header in util.h do : ac_fn_c_check_header_mongrel "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTIL_H 1 _ACEOF fi done for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF fi done if test ! "$enable_ssl" = no then use_openssl=yes else use_openssl=no fi if test ! -z "$mac_os" -a "$enable_stransport" != no then use_openssl=no fi # Check whether --with-ssl was given. if test "${with_ssl+set}" = set; then : withval=$with_ssl; fi if test "$use_openssl" != no then orig_CPPFLAGS="$CPPFLAGS" unset any for dir in "$with_openssl" /usr/local /usr/local/ssl /usr/lib/ssl /usr/pkg/ssl /usr/ssl /var/ssl /opt/ssl do header_fail=0 if test -n "$dir" -a ! -d "$dir/include" then header_fail=1 continue fi if test -n "$any" then { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with -I$dir/include" >&5 $as_echo "$as_me: retrying with -I$dir/include" >&6;} fi if test -n "$dir" then CPPFLAGS="$orig_CPPFLAGS -I$dir/include" fi for ac_header in openssl/ssl.h do : ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENSSL_SSL_H 1 _ACEOF else header_fail=1 fi done if test "$header_fail" -eq 0 then break fi unset `echo ac_cv_header_openssl/ssl_h | $as_tr_sh` CPPFLAGS="$orig_CPPFLAGS" any=1 done if test $header_fail -eq 1 then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling OpenSSL -- missing headers" >&5 $as_echo "$as_me: WARNING: Disabling OpenSSL -- missing headers" >&2;} use_openssl="no" enable_ssl="no" unset HAVE_LIBSSL fi fi ac_fn_c_check_decl "$LINENO" "__STDC_ISO_10646__" "ac_cv_have_decl___STDC_ISO_10646__" "$ac_includes_default" if test "x$ac_cv_have_decl___STDC_ISO_10646__" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL___STDC_ISO_10646__ $ac_have_decl _ACEOF if test $ac_have_decl = 1; then : unset unkw else unkw=1 fi # Check whether --with-iconv was given. if test "${with_iconv+set}" = set; then : withval=$with_iconv; fi case "$with_iconv" in no|"") ;; yes|*) $as_echo "#define USE_ICONV 1" >>confdefs.h unkw=1 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing forkpty" >&5 $as_echo_n "checking for library containing forkpty... " >&6; } if ${ac_cv_search_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char forkpty (); int main () { return forkpty (); ; return 0; } _ACEOF for ac_lib in '' util; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_forkpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_forkpty+:} false; then : break fi done if ${ac_cv_search_forkpty+:} false; then : else ac_cv_search_forkpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_forkpty" >&5 $as_echo "$ac_cv_search_forkpty" >&6; } ac_res=$ac_cv_search_forkpty if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" if test "x$ac_cv_func_forkpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_header in iconv.h do : ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" if test "x$ac_cv_header_iconv_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ICONV_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing libiconv" >&5 $as_echo_n "checking for library containing libiconv... " >&6; } if ${ac_cv_search_libiconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv (); int main () { return libiconv (); ; return 0; } _ACEOF for ac_lib in '' iconv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_libiconv=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_libiconv+:} false; then : break fi done if ${ac_cv_search_libiconv+:} false; then : else ac_cv_search_libiconv=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_libiconv" >&5 $as_echo "$ac_cv_search_libiconv" >&6; } ac_res=$ac_cv_search_libiconv if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing iconv" >&5 $as_echo_n "checking for library containing iconv... " >&6; } if ${ac_cv_search_iconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv (); int main () { return iconv (); ; return 0; } _ACEOF for ac_lib in '' iconv; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_iconv=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_iconv+:} false; then : break fi done if ${ac_cv_search_iconv+:} false; then : else ac_cv_search_iconv=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_iconv" >&5 $as_echo "$ac_cv_search_iconv" >&6; } ac_res=$ac_cv_search_iconv if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else if test "$unkw"; then as_fn_error $? "No iconv library function" "$LINENO" 5; fi fi fi if echo "$LIBS" | grep -e '-liconv\>' >/dev/null then ICONV_LIBS="-liconv" fi for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi if test "$use_openssl" != no then orig_LDFLAGS="$LDFLAGS" orig_LIBS="$LIBS" unset any if test -n "$with_openssl" then ssl_libs="$with_openssl/lib $with_openssl/ssl/lib" else ssl_libs="nil /usr/local/ssl/lib /usr/pkg/ssl/lib /usr/ssl/lib /var/ssl/lib /opt/ssl/lib" fi for dir in $ssl_libs do lib_fail=0 if test "$dir" = nil then dir="" fi if test -n "$dir" -a ! -d "$dir" then lib_fail=1 continue fi if test -n "$any" then { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with -L$dir" >&5 $as_echo "$as_me: retrying with -L$dir" >&6;} fi if test -n "$dir" then LDFLAGS="$orig_LDFLAGS -L$dir" SSL_LDFLAGS=-L$dir fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRYPTO_malloc in -lcrypto" >&5 $as_echo_n "checking for CRYPTO_malloc in -lcrypto... " >&6; } if ${ac_cv_lib_crypto_CRYPTO_malloc+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypto $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char CRYPTO_malloc (); int main () { return CRYPTO_malloc (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypto_CRYPTO_malloc=yes else ac_cv_lib_crypto_CRYPTO_malloc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_CRYPTO_malloc" >&5 $as_echo "$ac_cv_lib_crypto_CRYPTO_malloc" >&6; } if test "x$ac_cv_lib_crypto_CRYPTO_malloc" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCRYPTO 1 _ACEOF LIBS="-lcrypto $LIBS" else lib_fail=1 fi if test "$lib_fail" -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5 $as_echo_n "checking for SSL_new in -lssl... " >&6; } if ${ac_cv_lib_ssl_SSL_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lssl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SSL_new (); int main () { return SSL_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ssl_SSL_new=yes else ac_cv_lib_ssl_SSL_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_new" >&5 $as_echo "$ac_cv_lib_ssl_SSL_new" >&6; } if test "x$ac_cv_lib_ssl_SSL_new" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSSL 1 _ACEOF LIBS="-lssl $LIBS" else lib_fail=1 fi fi if test "$lib_fail" -eq 0 then break fi unset `echo ac_cv_lib_crypto_CRYPTO_malloc | $as_tr_sh` unset `echo ac_cv_lib_ssl_SSL_new | $as_tr_sh` LDFLAGS="$orig_LDFLAGS" unset SSL_LDFLAGS any=1 done if test $lib_fail -eq 1 then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling OpenSSL -- missing libs" >&5 $as_echo "$as_me: WARNING: Disabling OpenSSL -- missing libs" >&2;} use_openssl="no" enable_ssl="no" else SSL_LIBS="-lssl -lcrypto" fi fi LIBX3270DIR='${sysconfdir}/x3270' # Check whether --enable-dbcs was given. if test "${enable_dbcs+set}" = set; then : enableval=$enable_dbcs; fi case "$enable_dbcs" in no) ;; *) $as_echo "#define X3270_DBCS 1" >>confdefs.h ;; esac # Check whether --enable-local_process was given. if test "${enable_local_process+set}" = set; then : enableval=$enable_local_process; fi case "$enable_local_process" in ""|yes) $as_echo "#define X3270_LOCAL_PROCESS 1" >>confdefs.h ;; esac # Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; fi # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi case "$enable_ipv6" in ""|yes) $as_echo "#define X3270_IPV6 1" >>confdefs.h ;; esac # Check whether --enable-stransport was given. if test "${enable_stransport+set}" = set; then : enableval=$enable_stransport; fi if test ! -z "$mac_os" -a "$enable_stransport" = no -a "use_openssl" = no then enable_ssl=no fi if test -z "$mac_os" -a ! -z "$enable_stransport" then as_fn_error $? "--enable-stransport/--disable-stransport is only for MacOS" "$LINENO" 5; fi # Check whether --enable-mock_ssl was given. if test "${enable_mock_ssl+set}" = set; then : enableval=$enable_mock_ssl; fi if test "$enable_mock_ssl" = yes then use_openssl=no fi if test "$enable_mock_ssl" = yes then SSL_MODULES=sio_mock.o elif test "$enable_ssl" = no then SSL_MODULES="" elif test ! -z "$mac_os" -a "$enable_stransport" != no then SSL_MODULES=sio_secure_transport.o SSL_LIBS="-framework CoreFoundation -framework Security" else SSL_MODULES=sio_openssl.o fi ac_config_headers="$ac_config_headers include/unix/conf.h" ac_config_files="$ac_config_files 3270/Makefile 3270/Makefile.obj 3270i/Makefile 3270i/Makefile.obj 32xx/Makefile 32xx/Makefile.obj 3270stubs/Makefile 3270stubs/Makefile.obj 32xx/32xx-deplibs.mk" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by suite3270-lib $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ suite3270-lib config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "include/unix/conf.h") CONFIG_HEADERS="$CONFIG_HEADERS include/unix/conf.h" ;; "3270/Makefile") CONFIG_FILES="$CONFIG_FILES 3270/Makefile" ;; "3270/Makefile.obj") CONFIG_FILES="$CONFIG_FILES 3270/Makefile.obj" ;; "3270i/Makefile") CONFIG_FILES="$CONFIG_FILES 3270i/Makefile" ;; "3270i/Makefile.obj") CONFIG_FILES="$CONFIG_FILES 3270i/Makefile.obj" ;; "32xx/Makefile") CONFIG_FILES="$CONFIG_FILES 32xx/Makefile" ;; "32xx/Makefile.obj") CONFIG_FILES="$CONFIG_FILES 32xx/Makefile.obj" ;; "3270stubs/Makefile") CONFIG_FILES="$CONFIG_FILES 3270stubs/Makefile" ;; "3270stubs/Makefile.obj") CONFIG_FILES="$CONFIG_FILES 3270stubs/Makefile.obj" ;; "32xx/32xx-deplibs.mk") CONFIG_FILES="$CONFIG_FILES 32xx/32xx-deplibs.mk" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/lib/configure.in0000664000076500007650000001702713221577163014262 0ustar pdmpdmdnl Copyright (c) 2000-2017 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl Process this file with autoconf to produce a configure script. AC_INIT(suite3270-lib,3.x) AC_PREREQ(2.50) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_CC AC_PROG_RANLIB dnl Figure out what sort of host this is. AC_CANONICAL_HOST ansi="-std=c99 -pedantic" case "$host_os" in *cygwin*) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ansi="" ;; hpux|*cygwin*) CPPFLAGS=-D_XOPEN_SOURCE_EXTENDED ;; solaris2*) CPPFLAGS=-D__EXTENSIONS__ AC_DEFINE(CONNECT_GETPEERNAME,1) ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" CPPFLAGS="-D_XOPEN_SOURCE_EXTENDED" mac_os=1 ;; linux*) CPPFLAGS="-D_POSIX_SOURCE -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE" ;; esac if test "$GCC" = yes then CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi AC_SUBST(host) AC_SUBST(CCOPTIONS) AC_SUBST(CONNECT_GETPEERNAME) dnl Checks for header files. AC_CHECK_HEADERS(sys/select.h) AC_CHECK_HEADERS(readline/history.h) AC_CHECK_HEADERS(pty.h) AC_CHECK_HEADERS(libutil.h) AC_CHECK_HEADERS(util.h) AC_CHECK_HEADERS(getopt.h) dnl If SSL is disabled, don't go looking for OpenSSL. if test ! "$enable_ssl" = no then use_openssl=yes else use_openssl=no fi dnl Default to secure Transport on the Mac. if test ! -z "$mac_os" -a "$enable_stransport" != no then use_openssl=no fi dnl Check for OpenSSL header files. AC_ARG_WITH(ssl,[ --with-openssl=DIR specify OpenSSL install directory]) if test "$use_openssl" != no then orig_CPPFLAGS="$CPPFLAGS" unset any for dir in "$with_openssl" /usr/local /usr/local/ssl /usr/lib/ssl /usr/pkg/ssl /usr/ssl /var/ssl /opt/ssl do header_fail=0 if test -n "$dir" -a ! -d "$dir/include" then header_fail=1 continue fi if test -n "$any" then AC_MSG_NOTICE(retrying with -I$dir/include) fi if test -n "$dir" then CPPFLAGS="$orig_CPPFLAGS -I$dir/include" fi AC_CHECK_HEADERS(openssl/ssl.h, ,[header_fail=1]) if test "$header_fail" -eq 0 then break fi unset `echo ac_cv_header_openssl/ssl_h | $as_tr_sh` CPPFLAGS="$orig_CPPFLAGS" any=1 done if test $header_fail -eq 1 then AC_MSG_WARN(Disabling OpenSSL -- missing headers) use_openssl="no" enable_ssl="no" unset HAVE_LIBSSL fi fi dnl Check for ISO 10646 (wchar_t is Unicode) and --with-iconv AC_CHECK_DECLS(__STDC_ISO_10646__, unset unkw, unkw=1) AC_ARG_WITH(iconv,[ --with-iconv ignore __STDC_ISO_10646__ and use iconv() instead]) case "$with_iconv" in no|"") ;; yes|*) AC_DEFINE(USE_ICONV,1) unkw=1 ;; esac AC_SUBST(USE_ICONV) dnl Check for libraries. dnl Note that the order here is important. The last libraries should appear dnl first, so that objects in them can be used by subsequent libraries. AC_SEARCH_LIBS(forkpty, util) AC_CHECK_FUNCS(forkpty) AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket) AC_CHECK_HEADERS(iconv.h) AC_SEARCH_LIBS(libiconv, iconv, , AC_SEARCH_LIBS(iconv, iconv, , if test "$unkw"; then AC_MSG_ERROR(No iconv library function); fi)) dnl Handle iconv library dependency. if echo "$LIBS" | grep -e '-liconv\>' >/dev/null then ICONV_LIBS="-liconv" fi AC_SUBST(ICONV_LIBS) dnl Checks for library functions. AC_CHECK_FUNCS(vasprintf) AC_FUNC_FSEEKO dnl Check for OpenSSL libraries. if test "$use_openssl" != no then orig_LDFLAGS="$LDFLAGS" orig_LIBS="$LIBS" unset any if test -n "$with_openssl" then ssl_libs="$with_openssl/lib $with_openssl/ssl/lib" else ssl_libs="nil /usr/local/ssl/lib /usr/pkg/ssl/lib /usr/ssl/lib /var/ssl/lib /opt/ssl/lib" fi for dir in $ssl_libs do lib_fail=0 if test "$dir" = nil then dir="" fi if test -n "$dir" -a ! -d "$dir" then lib_fail=1 continue fi if test -n "$any" then AC_MSG_NOTICE(retrying with -L$dir) fi if test -n "$dir" then LDFLAGS="$orig_LDFLAGS -L$dir" SSL_LDFLAGS=-L$dir fi AC_CHECK_LIB(crypto, CRYPTO_malloc, , [lib_fail=1]) if test "$lib_fail" -eq 0 then AC_CHECK_LIB(ssl, SSL_new, , [lib_fail=1]) fi if test "$lib_fail" -eq 0 then break fi unset `echo ac_cv_lib_crypto_CRYPTO_malloc | $as_tr_sh` unset `echo ac_cv_lib_ssl_SSL_new | $as_tr_sh` LDFLAGS="$orig_LDFLAGS" unset SSL_LDFLAGS any=1 done if test $lib_fail -eq 1 then AC_MSG_WARN(Disabling OpenSSL -- missing libs) use_openssl="no" enable_ssl="no" else SSL_LIBS="-lssl -lcrypto" fi fi AC_SUBST(SSL_LDFLAGS) AC_SUBST(SSL_LIBS) dnl Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' AC_SUBST(LIBX3270DIR) dnl Check for unwanted parts. AC_ARG_ENABLE(dbcs,[ --disable-dbcs leave out DBCS support]) case "$enable_dbcs" in no) ;; *) AC_DEFINE(X3270_DBCS,1) ;; esac AC_ARG_ENABLE(local_process,[ --disable-local-process leave out local process support]) case "$enable_local_process" in ""|yes) AC_DEFINE(X3270_LOCAL_PROCESS,1) ;; esac AC_ARG_ENABLE(ssl,[ --disable-ssl leave out SSL/TLS support]) AC_ARG_ENABLE(ipv6,[ --disable-ipv6 leave out IPv6 support]) case "$enable_ipv6" in ""|yes) AC_DEFINE(X3270_IPV6,1) ;; esac AC_ARG_ENABLE(stransport,[ --disable-stransport use OpenSSL instead of Secure Transport (MacOS)]) if test ! -z "$mac_os" -a "$enable_stransport" = no -a "use_openssl" = no then enable_ssl=no fi if test -z "$mac_os" -a ! -z "$enable_stransport" then AC_MSG_ERROR(--enable-stransport/--disable-stransport is only for MacOS); fi AC_ARG_ENABLE(mock_ssl,[ --enable-mock-ssl use SSL mock for testing]) if test "$enable_mock_ssl" = yes then use_openssl=no fi dnl Set up SSL modules and libraries if test "$enable_mock_ssl" = yes then SSL_MODULES=sio_mock.o elif test "$enable_ssl" = no then SSL_MODULES="" elif test ! -z "$mac_os" -a "$enable_stransport" != no then SSL_MODULES=sio_secure_transport.o SSL_LIBS="-framework CoreFoundation -framework Security" else SSL_MODULES=sio_openssl.o fi AC_SUBST(SSL_MODULES) AC_SUBST(SSL_LIBS) dnl Generate the files. AC_CONFIG_HEADERS(include/unix/conf.h) AC_CONFIG_FILES(3270/Makefile 3270/Makefile.obj 3270i/Makefile 3270i/Makefile.obj 32xx/Makefile 32xx/Makefile.obj 3270stubs/Makefile 3270stubs/Makefile.obj 32xx/32xx-deplibs.mk) AC_OUTPUT suite3270-3.6/lib/include/localdefs.h0000664000076500007650000000312313221577163015471 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * localdefs.h * Local definitions for the stubs library. */ suite3270-3.6/lib/include/unix/conf.h.in0000664000076500007650000000411613221577163016055 0ustar pdmpdm/* * Copyright (c) 2000-2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. * Automatically generated from conf.h.in by configure. */ /* Libraries. */ /* Header files. */ #undef HAVE_SYS_SELECT_H #undef HAVE_PTY_H #undef HAVE_LIBUTIL_H #undef HAVE_UTIL_H #undef HAVE_GETOPT_H /* Uncommon functions. */ #undef HAVE_VASPRINTF #undef HAVE_FSEEKO #undef HAVE_FORKPTY /* Configuration options. */ #undef USE_ICONV /* Platform-specific oddness. */ #undef CONNECT_GETPEERNAME /* Optional parts. */ #undef X3270_DBCS #undef X3270_LOCAL_PROCESS #undef X3270_IPV6 suite3270-3.6/lib/include/windows/conf.h0000664000076500007650000000014713221577163016157 0ustar pdmpdm/* Hard-coded conf.h for wc3270 */ #define LIBX3270DIR "." #define X3270_DBCS 1 #define X3270_IPV6 1 suite3270-3.6/lib/Makefile.aux0000664000076500007650000000360613221577163014203 0ustar pdmpdm# Copyright (c) 2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary Makefile for lib. prepare: configure configure: configure.in autoconf src.tgz: prepare cd 3270 && $(MAKE) -f Makefile.aux $@ cd 3270i && $(MAKE) -f Makefile.aux $@ cd 32xx && $(MAKE) -f Makefile.aux $@ cd 3270stubs && $(MAKE) -f Makefile.aux $@ cd w3270 && $(MAKE) -f Makefile.aux $@ cd w3270i && $(MAKE) -f Makefile.aux $@ cd w32xx && $(MAKE) -f Makefile.aux $@ cd w3270stubs && $(MAKE) -f Makefile.aux $@ suite3270-3.6/lib/w3270i/Makefile0000664000076500007650000000423713221577163014343 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for libw3270, can build either 32- or 64-bit ifdef WIN64 objdir = ../../obj/win64/lib3270i else objdir = ../../obj/win32/lib3270i endif top = ../../.. this = $(top)/lib/w3270i export VPATH = $(this):$(top)/Common/Win32:$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(top)/Common/Win32 -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/w3270i/Makefile.aux0000664000076500007650000000314513221577163015134 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for 3270 interactive library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/w3270i/Makefile.obj0000664000076500007650000000371213221577163015111 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270 emulation library (Windows) LIB3270I = lib3270i.a include winenv.mk XCPPFLAGS = $(WIN32_FLAGS) -I. -I$(THIS)/../include/windows -I$(THIS)/../include -I$(TOP)/include CFLAGS = $(EXTRA_FLAGS) -g -Wall -Werror -MMD -MP $(XCPPFLAGS) $(SSLCPP) all:: $(LIB3270I) include lib3270i_files.mk OBJS = $(LIB3270I_OBJECTS) $(LIB3270I): $(OBJS) $(RM) $@ $(AR) crs $@ $(OBJS) clean: $(RM) *.o clobber: clean $(RM) $(LIB3270I) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/w3270/libw3270_files.mk0000664000076500007650000000011713221577163015507 0ustar pdmpdm# Object files specific to libw3270. LIBW3270_OBJECTS = gdi_print.o winprint.o suite3270-3.6/lib/w3270/Makefile0000664000076500007650000000426413221577163014172 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for libw3270, can build either 32- or 64-bit ifdef WIN64 objdir = ../../obj/win64/lib3270 else objdir = ../../obj/win32/lib3270 endif top = ../../.. this = $(top)/lib/w3270 export VPATH = $(this):$(top)/Common/Win32:$(top)/Common:$(top)/Common/Nodisplay export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(top)/Common/Win32 -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/w3270/Makefile.aux0000664000076500007650000000314313221577163014761 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for 3270 emulation library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/w3270/Makefile.obj0000664000076500007650000000432613221577163014742 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270 emulation library (Windows) LIB3270 = lib3270.a include winenv.mk XCPPFLAGS = $(WIN32_FLAGS) -I. -I$(THIS)/../include/windows -I$(THIS)/../include -I$(TOP)/include CFLAGS = $(EXTRA_FLAGS) -g -Wall -Werror $(XCPPFLAGS) $(SSLCPP) all:: $(LIB3270) include lib3270_files.mk include libw3270_files.mk OBJS = $(LIB3270_OBJECTS) $(LIBW3270_OBJECTS) $(LIB3270): $(OBJS) $(RM) $@ $(AR) crs $@ $(OBJS) favicon.o: favicon.c favicon.c: favicon.ico mkicon$(NATIVE_SFX) ./mkicon$(NATIVE_SFX) $< >favicon.c mkicon.o: CC = $(NATIVECC) mkicon.o: CFLAGS = mkicon$(NATIVE_SFX): mkicon.o $(NATIVECC) -o $@ mkicon.o clean: $(RM) *.o favicon.c mkicon$(NATIVE_SFX) clobber: clean $(RM) $(LIB3270) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/w3270stubs/libw3270stubs_files.mk0000664000076500007650000000010313221577163017644 0ustar pdmpdm# Object files specific to libw3270stubs. LIBW3270STUBS_OBJECTS = suite3270-3.6/lib/w3270stubs/Makefile0000664000076500007650000000426013221577163015247 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for libw3270stubs, can build either 32- or 64-bit ifdef WIN64 objdir = ../../obj/win64/lib3270stubs else objdir = ../../obj/win32/lib3270stubs endif top = ../../.. this = $(top)/lib/w3270stubs export VPATH = $(this):$(top)/Common/Win32:$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(top)/Common/Win32 -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/w3270stubs/Makefile.aux0000664000076500007650000000313213221577163016040 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for stubs library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/w3270stubs/Makefile.obj0000664000076500007650000000402613221577163016020 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270 emulation stubs library (Windows) LIB3270 = lib3270stubs.a include winenv.mk XCPPFLAGS = $(WIN32_FLAGS) -I$(THIS) -I$(THIS)/../include/windows -I$(THIS)/../include -I$(TOP)/include CFLAGS = $(EXTRA_FLAGS) -g -Wall -Werror -MMD -MP $(XCPPFLAGS) $(SSLCPP) all:: $(LIB3270) include lib3270stubs_files.mk include libw3270stubs_files.mk OBJS = $(LIB3270STUBS_OBJECTS) $(LIBW3270STUBS_OBJECTS) $(LIB3270): $(OBJS) $(RM) $@ $(AR) crs $@ $(OBJS) clean: $(RM) *.o clobber: clean $(RM) $(LIB3270) *.d -include $(OBJS:.o=.d) suite3270-3.6/lib/w32xx/libw32xx_files.mk0000664000076500007650000000014013221577163016125 0ustar pdmpdm# Object files specific to libw32xx. LIBW32XX_OBJECTS = snprintf.o w3misc.o windirs.o winvers.o suite3270-3.6/lib/w32xx/Makefile0000664000076500007650000000423413221577163014400 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for libw32xx, can build either 32- or 64-bit ifdef WIN64 objdir = ../../obj/win64/lib32xx else objdir = ../../obj/win32/lib32xx endif top = ../../.. this = $(top)/lib/w32xx export VPATH = $(this):$(top)/Common/Win32:$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(top)/Common/Win32 -I$(this) all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/lib/w32xx/Makefile.aux0000664000076500007650000000315213221577163015172 0ustar pdmpdm# # Copyright (c) 1995-2011, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Auxiliary makefile for 3270/3287 interactive library all: @echo "Must pick a specific make target." src.tgz: suite3270-3.6/lib/w32xx/Makefile.obj0000664000076500007650000000401013221600143015122 0ustar pdmpdm# Copyright (c) 1999-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Makefile for 3270/3287 emulation common library (Windows) LIB32XX = lib32xx.a include winenv.mk XCPPFLAGS = $(WIN32_FLAGS) -I$(THIS) -I$(THIS)/../include/windows -I$(THIS)/../include -I$(TOP)/include CFLAGS = $(EXTRA_FLAGS) -g -Wall -Werror -MMD -MP $(XCPPFLAGS) $(SSLCPP) all:: $(LIB32XX) include lib32xx_files.mk include libw32xx_files.mk OBJS = $(LIB32XX_OBJECTS) $(LIBW32XX_OBJECTS) sio_schannel.o $(LIB32XX): $(OBJS) $(AR) crs $@ $(OBJS) clean: $(RM) *.o clobber: clean $(RM) $(LIB32XX) *.d -include $(OBJS:.o=.d) suite3270-3.6/Makefile.aux0000664000076500007650000000714713221577163013441 0ustar pdmpdm# Copyright (c) 2015-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Top-level auxiliary Makefile for suite3270. all: @echo "Must pick a specific make target." @false FORCE: src.tgz: prepare man Webpage program-src ./mktar.sh prepare: configure configure: configure.in autoconf prepare: lib-prepare c3270-prepare s3270-prepare tcl3270-prepare x3270-prepare pr3287-prepare Webpage-prepare lib-prepare: cd lib && $(MAKE) -f Makefile.aux prepare c3270-prepare: cd c3270 && $(MAKE) -f Makefile.aux prepare s3270-prepare: cd s3270 && $(MAKE) -f Makefile.aux prepare tcl3270-prepare: cd tcl3270 && $(MAKE) -f Makefile.aux prepare x3270-prepare: cd x3270 && $(MAKE) -f Makefile.aux prepare pr3287-prepare: cd pr3287 && $(MAKE) -f Makefile.aux prepare Webpage-prepare: cd Webpage && $(MAKE) -f Makefile.aux prepare man: prepare man: c3270-man s3270-man tcl3270-man x3270-man pr3287-man wc3270-man ws3270-man wpr3287-man c3270-man: cd c3270 && $(MAKE) -f Makefile.aux man s3270-man: cd s3270 && $(MAKE) -f Makefile.aux man tcl3270-man: cd tcl3270 && $(MAKE) -f Makefile.aux man x3270-man: cd x3270 && $(MAKE) -f Makefile.aux man pr3287-man: cd pr3287 && $(MAKE) -f Makefile.aux man wc3270-man: cd wc3270 && $(MAKE) -f Makefile.aux man ws3270-man: cd ws3270 && $(MAKE) -f Makefile.aux man wpr3287-man: cd wpr3287 && $(MAKE) -f Makefile.aux man Webpage: program-src man FORCE cd Webpage && $(MAKE) program-src: c3270-src.tgz s3270-src.tgz tcl3270-src.tgz x3270-src.tgz pr3287-src.tgz wc3270-src.tgz ws3270-src.tgz wpr3287-src.tgz lib-src.tgz lib-src.tgz: cd lib && $(MAKE) -f Makefile.aux src.tgz c3270-src.tgz: cd c3270 && $(MAKE) -f Makefile.aux src.tgz s3270-src.tgz: cd s3270 && $(MAKE) -f Makefile.aux src.tgz tcl3270-src.tgz: cd tcl3270 && $(MAKE) -f Makefile.aux src.tgz x3270-src.tgz: cd x3270 && $(MAKE) -f Makefile.aux src.tgz pr3287-src.tgz: cd pr3287 && $(MAKE) -f Makefile.aux src.tgz wc3270-src.tgz: cd wc3270 && $(MAKE) -f Makefile.aux src.tgz ws3270-src.tgz: cd ws3270 && $(MAKE) -f Makefile.aux src.tgz wpr3287-src.tgz: cd wpr3287 && $(MAKE) -f Makefile.aux src.tgz # Target for building the Inno Setup .exe file and the .zip file. windows-release: man $(MAKE) windows cd wc3270 && $(MAKE) -f Makefile.aux $@ suite3270-3.6/Makefile.in0000664000076500007650000002300013221577163013234 0ustar pdmpdm# Copyright (c) 2015-2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Top-level Makefile for suite3270. all: @T_ALL@ # Cleverness for 'make targets': # MIXED is true if there is at least one Unix target and at least one Windows # target # M1 is true if there is more than one target MIXED := $(shell (echo @T_ALL@ | grep -q '\<[^w]') && (echo @T_ALL@ | grep -q '\<[w]') && echo true) M1 := $(shell test `echo @T_ALL@ | wc -w` -gt 1 && echo true) # List targets targets: @echo "Targets:" @echo " all @T_ALL@" ifdef MIXED @echo " unix build all Unix programs" @echo " windows build all Windows programs" endif @echo " lib build all libraries" ifdef MIXED @echo " unix-lib build all Unix libraries" @echo " windows-lib build all Windows libraries" endif ifdef M1 @echo " build " endif @echo " clean remove all intermediate files" ifdef MIXED @echo " unix-clean remove Unix intermediate files" @echo " windows-clean remove Windows intermediate files" endif @echo " lib-clean remove library intermediate files" ifdef MIXED @echo " unix-lib-clean remove Unix library intermediate files" @echo " windows-lib-clean remove Windows library intermediate files" endif ifdef M1 @echo " -clean remove intermediate files" endif @echo " clobber remove all derived files" ifdef MIXED @echo " unix-clobber remove Unix derived files" @echo " windows-clobber remove Windows derived files" endif @echo " lib-clobber remove library derived files" ifdef MIXED @echo " unix-lib-clobber remove Unix library derived files" @echo " windows-lib-clobber remove Windows library derived files" endif ifdef M1 @echo " -clobber remove derived files" endif # Library ependencies. c3270 s3270 tcl3270 x3270 pr3287: unix-lib wc3270 ws3270 wpr3287: windows-lib # Individual targets. unix-lib: lib3270 lib3270i lib32xx lib3270stubs windows-lib: libw3270 libw3270i libw32xx libw3270stubs lib: unix-lib windows-lib lib3270: cd lib/3270 && $(MAKE) lib3270i: cd lib/3270i && $(MAKE) lib32xx: cd lib/32xx && $(MAKE) lib3270stubs: cd lib/3270stubs && $(MAKE) libw3270: libw3270-32 libw3270-64 libw3270-32: cd lib/w3270 && $(MAKE) libw3270-64: cd lib/w3270 && $(MAKE) WIN64=1 libw3270i: libw3270i-32 libw3270i-64 libw3270i-32: cd lib/w3270i && $(MAKE) libw3270i-64: cd lib/w3270i && $(MAKE) WIN64=1 libw32xx: libw32xx-32 libw32xx-64 libw32xx-32: cd lib/w32xx && $(MAKE) libw32xx-64: cd lib/w32xx && $(MAKE) WIN64=1 libw3270stubs: libw3270stubs-32 libw3270stubs-64 libw3270stubs-32: cd lib/w3270stubs && $(MAKE) libw3270stubs-64: cd lib/w3270stubs && $(MAKE) WIN64=1 c3270: lib3270 lib3270i lib32xx cd c3270 && $(MAKE) s3270: lib3270 lib32xx cd s3270 && $(MAKE) tcl3270: lib3270 lib32xx cd tcl3270 && $(MAKE) x3270: lib3270 lib3270i lib32xx cd x3270 && $(MAKE) pr3287: lib32xx cd pr3287 && $(MAKE) wc3270: wc3270-32 wc3270-64 wc3270-32: libw3270-32 libw3270i-32 libw32xx-32 cd wc3270 && $(MAKE) wc3270-64: libw3270-64 libw3270i-64 libw32xx-64 cd wc3270 && $(MAKE) WIN64=1 ws3270: ws3270-32 ws3270-64 ws3270-32: libw3270-32 libw32xx-32 cd ws3270 && $(MAKE) ws3270-64: libw3270-64 libw32xx-64 cd ws3270 && $(MAKE) WIN64=1 wpr3287: wpr3287-32 wpr3287-64 wpr3287-32: libw32xx-32 cd wpr3287 && $(MAKE) wpr3287-64: libw32xx-64 cd wpr3287 && $(MAKE) WIN64=1 FORCE: unix: c3270 s3270 tcl3270 x3270 pr3287 windows: wc3270 ws3270 wpr3287 # Installation install unix-install: @T_INSTALL@ x3270-install: x3270 cd x3270 && $(MAKE) install c3270-install: c3270 cd c3270 && $(MAKE) install s3270-install: s3270 cd s3270 && $(MAKE) install tcl3270-install: tcl3270 cd tcl3270 && $(MAKE) install pr3287-install: pr3287 cd pr3287 && $(MAKE) install # Manual page install install.man unix-install.man: @T_INSTALL_MAN@ x3270-install.man: x3270 cd x3270 && $(MAKE) install.man c3270-install.man: c3270 cd c3270 && $(MAKE) install.man s3270-install.man: s3270 cd s3270 && $(MAKE) install.man tcl3270-install.man: tcl3270 cd tcl3270 && $(MAKE) install.man pr3287-install.man: pr3287 cd pr3287 && $(MAKE) install.man # Clean and clobber targets clean: @T_CLEAN@ unix-lib-clean: lib3270-clean lib3270i-clean lib32xx-clean lib3270stubs-clean windows-lib-clean: libw3270-clean libw3270i-clean libw32xx-clean libw3270stubs-clean lib-clean: unix-lib-clean windows-lib-clean unix-clean: x3270-clean c3270-clean s3270-clean tcl3270-clean pr3287-clean unix-lib-clean windows-clean: wc3270-clean ws3270-clean wpr3287-clean windows-lib-clean lib3270-clean: cd lib/3270 && $(MAKE) clean lib3270i-clean: cd lib/3270i && $(MAKE) clean lib32xx-clean: cd lib/32xx && $(MAKE) clean lib3270stubs-clean: cd lib/3270stubs && $(MAKE) clean libw3270-clean: libw3270-clean-32 libw3270-clean-64 libw3270-clean-32: cd lib/w3270 && $(MAKE) clean libw3270-clean-64: cd lib/w3270 && $(MAKE) clean WIN64=1 libw3270i-clean: libw3270i-clean-32 libw3270i-clean-64 libw3270i-clean-32: cd lib/w3270i && $(MAKE) clean libw3270i-clean-64: cd lib/w3270i && $(MAKE) clean WIN64=1 libw32xx-clean: libw32xx-clean-32 libw32xx-clean-64 libw32xx-clean-32: cd lib/w32xx && $(MAKE) clean libw32xx-clean-64: cd lib/w32xx && $(MAKE) clean WIN64=1 libw3270stubs-clean: libw3270stubs-clean-32 libw3270stubs-clean-64 libw3270stubs-clean-32: cd lib/w3270stubs && $(MAKE) clean libw3270stubs-clean-64: cd lib/w3270stubs && $(MAKE) clean WIN64=1 x3270-clean: cd x3270 && $(MAKE) clean c3270-clean: cd c3270 && $(MAKE) clean s3270-clean: cd s3270 && $(MAKE) clean tcl3270-clean: cd tcl3270 && $(MAKE) clean pr3287-clean: cd pr3287 && $(MAKE) clean wc3270-clean: wc3270-clean-32 wc3270-clean-64 wc3270-clean-32: cd wc3270 && $(MAKE) clean wc3270-clean-64: cd wc3270 && $(MAKE) clean WIN64=1 ws3270-clean: ws3270-clean-32 ws3270-clean-64 ws3270-clean-32: cd ws3270 && $(MAKE) clean ws3270-clean-64: cd ws3270 && $(MAKE) clean WIN64=1 wpr3287-clean: wpr3287-clean-32 wpr3287-clean-64 wpr3287-clean-32: cd wpr3287 && $(MAKE) clean wpr3287-clean-64: cd wpr3287 && $(MAKE) clean WIN64=1 clobber: @T_CLOBBER@ unix-lib-clobber: lib3270-clobber lib3270i-clobber lib32xx-clobber lib3270stubs-clobber windows-lib-clobber: libw3270-clobber libw3270i-clobber libw32xx-clobber libw3270stubs-clobber lib-clobber: unix-lib-clobber windows-lib-clobber unix-clobber: x3270-clobber c3270-clobber s3270-clobber tcl3270-clobber pr3287-clobber unix-lib-clobber windows-clobber: wc3270-clobber ws3270-clobber wpr3287-clobber windows-lib-clobber lib3270-clobber: cd lib/3270 && $(MAKE) clobber lib3270i-clobber: cd lib/3270i && $(MAKE) clobber lib32xx-clobber: cd lib/32xx && $(MAKE) clobber lib3270stubs-clobber: cd lib/3270stubs && $(MAKE) clobber libw3270-clobber: libw3270-clobber-32 libw3270-clobber-64 libw3270-clobber-32: cd lib/w3270 && $(MAKE) clobber libw3270-clobber-64: cd lib/w3270 && $(MAKE) clobber WIN64=1 libw3270i-clobber: libw3270i-clobber-32 libw3270i-clobber-64 libw3270i-clobber-32: cd lib/w3270i && $(MAKE) clobber libw3270i-clobber-64: cd lib/w3270i && $(MAKE) clobber WIN64=1 libw32xx-clobber: libw32xx-clobber-32 libw32xx-clobber-64 libw32xx-clobber-32: cd lib/w32xx && $(MAKE) clobber libw32xx-clobber-64: cd lib/w32xx && $(MAKE) clobber WIN64=1 libw3270stubs-clobber: libw3270stubs-clobber-32 libw3270stubs-clobber-64 libw3270stubs-clobber-32: cd lib/w3270stubs && $(MAKE) clobber libw3270stubs-clobber-64: cd lib/w3270stubs && $(MAKE) clobber WIN64=1 x3270-clobber: cd x3270 && $(MAKE) clobber c3270-clobber: cd c3270 && $(MAKE) clobber s3270-clobber: cd s3270 && $(MAKE) clobber tcl3270-clobber: cd tcl3270 && $(MAKE) clobber pr3287-clobber: cd pr3287 && $(MAKE) clobber wc3270-clobber: wc3270-clobber-32 wc3270-clobber-64 wc3270-clobber-32: cd wc3270 && $(MAKE) clobber wc3270-clobber-64: cd wc3270 && $(MAKE) clobber WIN64=1 ws3270-clobber: ws3270-clobber-32 ws3270-clobber-64 ws3270-clobber-32: cd ws3270 && $(MAKE) clobber ws3270-clobber-64: cd ws3270 && $(MAKE) clobber WIN64=1 wpr3287-clobber: wpr3287-clobber-32 wpr3287-clobber-64 wpr3287-clobber-32: cd wpr3287 && $(MAKE) clobber wpr3287-clobber-64: cd wpr3287 && $(MAKE) clobber WIN64=1 suite3270-3.6/Playback/Makefile0000664000076500007650000000025613221577163014365 0ustar pdmpdmCFLAGS = -g -Wall -Werror -ansi -pedantic -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_BSD_SOURCE all: playback playback: playback.o $(CC) $(CFLAGS) -o playback playback.o suite3270-3.6/Playback/playback.c0000664000076500007650000002624413221577163014664 0ustar pdmpdm/* * Copyright (c) 1994-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Playback file facility for x3270 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PORT 4001 #define BSIZE 16384 #define LINEDUMP_MAX 32 int port = PORT; char *me; static enum { NONE, WRONG, BASE, LESS, SPACE, ZERO, X, N, SPACE2, D1, D2 } pstate = NONE; static enum { T_NONE, T_IAC } tstate = T_NONE; int fdisp = 0; static void process(FILE *f, int s); typedef enum { STEP_LINE, /* step one line in the file */ STEP_EOR, /* step until IAC EOR */ STEP_MARK /* step until a mark (line starting with '+') */ } step_t; static int step(FILE *f, int s, step_t type); static int process_command(FILE *f, int s); void usage(void) { (void) fprintf(stderr, "usage: %s [-p port] file\n", me); exit(1); } int main(int argc, char *argv[]) { int c; FILE *f; int s; union { struct sockaddr sa; #if defined(AF_INET6) /*[*/ struct sockaddr_in6 sin6; #else /*][*/ struct sockaddr_in sin; #endif /*]*/ } addr; #if defined(AF_INET6) /*[*/ int proto = AF_INET6; #else /*][*/ int proto = AF_INET; #endif /*]*/ int addrlen = sizeof(addr); int one = 1; socklen_t len; int flags; /* Parse command-line arguments */ if ((me = strrchr(argv[0], '/')) != NULL) { me++; } else { me = argv[0]; } while ((c = getopt(argc, argv, "p:")) != -1) { switch (c) { case 'p': port = atoi(optarg); break; default: usage(); } } if (argc - optind != 1) { usage(); } /* Open the file. */ f = fopen(argv[optind], "r"); if (f == NULL) { perror(argv[optind]); exit(1); } /* Listen on a socket. */ s = socket(proto, SOCK_STREAM, 0); if (s < 0) { perror("socket"); exit(1); } if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) < 0) { perror("setsockopt"); exit(1); } (void) memset(&addr, '\0', sizeof(addr)); addr.sa.sa_family = proto; #if defined(AF_INET6) /*[*/ addr.sin6.sin6_port = htons(port); #else /*][*/ addr.sin.sin_port = htons(port); #endif /*]*/ if (bind(s, &addr.sa, addrlen) < 0) { perror("bind"); exit(1); } if (listen(s, 1) < 0) { perror("listen"); exit(1); } if ((flags = fcntl(s, F_GETFL)) < 0) { perror("fcntl(F_GETFD)"); exit(1); } if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) { perror("fcntl(F_SETFD)"); exit(1); } (void) signal(SIGPIPE, SIG_IGN); /* Accept connections and process them. */ for (;;) { int s2; #if defined(AF_INET6) /*[*/ char buf[INET6_ADDRSTRLEN]; #endif /*]*/ (void) memset((char *)&addr, '\0', sizeof(addr)); addr.sa.sa_family = proto; len = addrlen; (void) printf("Waiting for connection on port %u.\n", port); for (;;) { fd_set rfds; int ns; FD_ZERO(&rfds); FD_SET(0, &rfds); FD_SET(s, &rfds); printf("playback> "); fflush(stdout); ns = select(s + 1, &rfds, NULL, NULL, NULL); if (ns < 0) { perror("select"); exit(1); } if (FD_ISSET(0, &rfds)) { process_command(NULL, -1); } if (FD_ISSET(s, &rfds)) { break; } } s2 = accept(s, &addr.sa, &len); if (s2 < 0) { perror("accept"); continue; } (void) printf("\nConnection from %s, port %u.\n", #if defined(AF_INET6) /*[*/ inet_ntop(proto, &addr.sin6.sin6_addr, buf, INET6_ADDRSTRLEN) + (IN6_IS_ADDR_V4MAPPED(&addr.sin6.sin6_addr)? 7: 0), ntohs(addr.sin6.sin6_port) #else /*][*/ inet_ntoa(addr.sin.sin_addr), ntohs(addr.sin.sin_port) #endif /*]*/ ); rewind(f); pstate = BASE; fdisp = 0; process(f, s2); } } /* * Process a command on stdin. * * f is NULL and s is -1 if we are not connected. * * Returns 0 for no change, -1 to stop processing the file. */ static int process_command(FILE *f, int s) { char buf[BUFSIZ]; size_t sl; char *t; if (fgets(buf, BUFSIZ, stdin) == NULL) { printf("\n"); exit(0); } sl = strlen(buf); if (sl > 0 && buf[sl - 1] == '\n') { buf[sl - 1] = '\0'; } t = buf; while (*t == ' ') { t++; } if (!*t) { return 0; } if (!strncmp(t, "s", 1)) { /* step line */ if (f == NULL) { printf("Not connected.\n"); return 0; } if (!step(f, s, STEP_LINE)) { return -1; } } else if (!strncmp(t, "r", 1)) { /* step record */ if (f == NULL) { printf("Not connected.\n"); return 0; } if (!step(f, s, STEP_EOR)) { return -1; } } else if (!strncmp(t, "t", 1)) { /* to mark */ if (f == NULL) { printf("Not connected.\n"); return 0; } if (!step(f, s, STEP_MARK)) { return -1; } } else if (!strncmp(t, "e", 1)) { /* to EOF */ if (f == NULL) { printf("Not connected.\n"); return 0; } while (step(f, s, STEP_EOR)) { usleep(1000000 / 4); } return -1; } else if (!strncmp(t, "q", 1)) { /* quit */ exit(0); } else if (!strncmp(t, "d", 1)) { /* disconnect */ if (f == NULL) { printf("Not connected.\n"); return 0; } return -1; } else if (t[0] == '?' || t[0] == 'h') { (void) printf("\ s: step line\n\ r: step record\n\ t: to mark\n\ e: play to EOF\n\ q: quit\n\ d: disconnect\n\ ?: help\n"); } else { printf("%c? Use '?' for help.\n", *t); } return 0; } /* Trace data from the host or emulator. */ void trace_netdata(char *direction, unsigned char *buf, int len) { int offset; printf("\n"); for (offset = 0; offset < len; offset++) { if (!(offset % LINEDUMP_MAX)) (void) printf("%s%s 0x%-3x ", (offset ? "\n" : ""), direction, offset); (void) printf("%02x", buf[offset]); } (void) printf("\n"); } /* * Process commands until a file is exhausted or we get a 'quit' command or * EOF. */ static void process(FILE *f, int s) { char buf[BSIZE]; /* Loop, looking for keyboard input or emulator response. */ for (;;) { fd_set rfds; int ns; (void) printf("playback> "); (void) fflush(stdout); FD_ZERO(&rfds); FD_SET(s, &rfds); FD_SET(0, &rfds); ns = select(s+1, &rfds, NULL, NULL, NULL); if (ns < 0) { perror("select"); exit(1); } if (ns == 0) { continue; } if (FD_ISSET(s, &rfds)) { int nr; nr = read(s, buf, BSIZE); if (nr < 0) { perror("read"); break; } if (nr == 0) { (void) printf("Emulator disconnected.\n"); break; } trace_netdata("emul", (unsigned char *)buf, nr); } if (FD_ISSET(0, &rfds)) { if (process_command(f, s) < 0) { break; } } } (void) close(s); pstate = NONE; tstate = T_NONE; fdisp = 0; return; } /* * Step through the file. * * Returns 0 for EOF, nonzeo otherwise. */ static int step(FILE *f, int s, step_t type) { int c = 0; static int d1; static char hexes[] = "0123456789abcdef"; # define isxd(c) strchr(hexes, c) static int again = 0; char obuf[BSIZE]; char *cp = obuf; int at_mark = 0; int stop_eor = 0; # define NO_FDISP { if (fdisp) { printf("\n"); fdisp = 0; } } top: while (again || ((c = fgetc(f)) != EOF)) { if (c == '\r') { continue; } if (!again) { if (!fdisp || c == '\n') { printf("\nfile "); fdisp = 1; } if (c != '\n') { putchar(c); } } again = 0; switch (pstate) { case NONE: assert(pstate != NONE); break; case WRONG: if (c == '\n') { pstate = BASE; } break; case BASE: if (c == '+' && (type == STEP_MARK)) { /* Hit the mark. */ at_mark = 1; goto run_it; } if (c == '<') { pstate = LESS; } else { pstate = WRONG; again = 1; } break; case LESS: if (c == ' ') { pstate = SPACE; } else { pstate = WRONG; again = 1; } break; case SPACE: if (c == '0') { pstate = ZERO; } else { pstate = WRONG; again = 1; } break; case ZERO: if (c == 'x') { pstate = X; } else { pstate = WRONG; again = 1; } break; case X: if (isxd(c)) { pstate = N; } else { pstate = WRONG; again = 1; } break; case N: if (isxd(c)) { pstate = N; } else if (c == ' ' || c == '\t') { pstate = SPACE2; } else { pstate = WRONG; again = 1; } break; case SPACE2: if (isxd(c)) { d1 = strchr(hexes, c) - hexes; pstate = D1; cp = obuf; } else if (c == ' ' || c == '\t') { pstate = SPACE2; } else { pstate = WRONG; again = 1; } break; case D1: if (isxd(c)) { int at_eor = 0; *cp = ((d1*16)+(strchr(hexes,c)-hexes)); pstate = D2; switch (tstate) { case T_NONE: if (*(unsigned char *)cp == IAC) { tstate = T_IAC; } break; case T_IAC: if (*(unsigned char *)cp == EOR && type == STEP_EOR) { at_eor = 1; } tstate = T_NONE; break; } cp++; if (at_eor && type == STEP_EOR) { stop_eor = 1; } if (at_eor || (cp - obuf >= BUFSIZ)) { goto run_it; } } else { NO_FDISP; (void) printf("Non-hex char '%c' in playback " "file, skipping to newline.", c); pstate = WRONG; again = 1; } break; case D2: if (isxd(c)) { d1 = strchr(hexes, c) - hexes; pstate = D1; } else if (c == '\n') { pstate = BASE; goto run_it; } else { NO_FDISP; (void) printf("Non-hex char '%c' in playback " "file, skipping to newline.", c); pstate = WRONG; again = 1; } break; } } goto done; run_it: NO_FDISP; trace_netdata("host", (unsigned char *)obuf, cp - obuf); if (write(s, obuf, cp - obuf) < 0) { perror("socket write"); return 0; } if (type == STEP_EOR && !stop_eor) { cp = obuf; goto top; } if (type == STEP_MARK && !at_mark) { cp = obuf; goto top; } return 1; done: if (c == EOF) { NO_FDISP; (void) printf("Playback file EOF.\n"); } return 0; } suite3270-3.6/Playback/playback.man0000664000076500007650000000224413221577163015207 0ustar pdmpdm'\" t .TH PLAYBACK 1 "25 October 1994" .SH NAME playback \- .SM IBM x3270 trace file playback tool .SH SYNOPSIS .B playback [ .B \-p .I port ] .I trace_file .SH DESCRIPTION .B playback opens a trace file (presumably created by the .B x3270 .I "Trace Data Stream" facility) and plays the host data it contains back over a socket to processes that connect to it. It also displays the data produced by the process in response. .LP Once connected to a process, .B playback is used interactively. Keyboard commands control the flow of data from the file to the socket. These commands are: .TP .B s Send one line of data. .TP .B r Send one record of data (send data until the TELNET EOR sequence is reached). .TP .B q Exit .B playback. .TP .B d Disconnect the current socket and wait for another connection. .SH EXAMPLE Suppose you wanted to play back a trace file called .B /usr/tmp/x3trc.12345. In one window, run: .sp playback /usr/tmp/x3trc.12345 .LP In another window, start .B x3270 with the command: .sp x3270 localhost 4001 .LP .B playback will announce the connection. .LP Thereafter, the .B s and .B r commands will send data from the file to .B x3270. .SH "SEE ALSO" .IR x3270 (1) suite3270-3.6/pr3287/conf.h.in0000664000076500007650000000353113221577163013646 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2014-2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. * Automatically generated from conf.h.in by configure. */ /* Libraries. */ /* Header files. */ /* Uncommon functions. */ #undef HAVE_VASPRINTF /* Configuration options. */ /* Optional parts. */ #undef X3270_DBCS #undef X3270_IPV6 suite3270-3.6/pr3287/configure0000775000076500007650000054174313221577163014066 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for pr3287 3.x. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='pr3287' PACKAGE_TARNAME='pr3287' PACKAGE_VERSION='3.x' PACKAGE_STRING='pr3287 3.x' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS LIBX3270DIR EGREP GREP CPP CCOPTIONS host_os host_vendor host_cpu host build_os build_vendor build_cpu build OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_ssl enable_dbcs enable_ipv6 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pr3287 3.x to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pr3287] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pr3287 3.x:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dbcs leave out DBCS support --disable-ipv6 leave out IPv6 support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-ssl=DIR specify OpenSSL install directory Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pr3287 configure 3.x generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pr3287 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ansi="-std=c99 -pedantic" case "$host_os" in *cygwin*) ansi="" ;; solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" ;; linux*) CPPFLAGS="-D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_SOURCE -D_XOPEN_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in iconv.h do : ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" if test "x$ac_cv_header_iconv_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ICONV_H 1 _ACEOF fi done # Check whether --with-ssl was given. if test "${with_ssl+set}" = set; then : withval=$with_ssl; fi if test "$enable_ssl" != no then orig_CPPFLAGS="$CPPFLAGS" unset any for dir in "$with_ssl" /usr/local /usr/local/ssl /usr/lib/ssl /usr/pkg/ssl /usr/ssl /var/ssl /opt/ssl do header_fail=0 if test -n "$dir" -a ! -d "$dir/include" then header_fail=1 continue fi if test -n "$any" then { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with -I$dir/include" >&5 $as_echo "$as_me: retrying with -I$dir/include" >&6;} fi if test -n "$dir" then CPPFLAGS="$orig_CPPFLAGS -I$dir/include" fi for ac_header in openssl/ssl.h do : ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENSSL_SSL_H 1 _ACEOF else header_fail=1 fi done if test "$header_fail" -eq 0 then break fi unset `echo ac_cv_header_openssl/ssl_h | $as_tr_sh` CPPFLAGS="$orig_CPPFLAGS" any=1 done if test $header_fail -eq 1 then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling OpenSSL" >&5 $as_echo "$as_me: WARNING: Disabling OpenSSL" >&2;} enable_ssl="no" unset HAVE_LIBSSL fi fi for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done LIBX3270DIR='${sysconfdir}/x3270' # Check whether --enable-dbcs was given. if test "${enable_dbcs+set}" = set; then : enableval=$enable_dbcs; fi case "$enable_dbcs" in no) ;; *) $as_echo "#define X3270_DBCS 1" >>confdefs.h ;; esac # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi case "$enable_ipv6" in ""|yes) $as_echo "#define X3270_IPV6 1" >>confdefs.h ;; esac ac_config_headers="$ac_config_headers conf.h" ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pr3287 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ pr3287 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ac_config_files="$ac_config_files Makefile.obj" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pr3287 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ pr3287 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile.obj") CONFIG_FILES="$CONFIG_FILES Makefile.obj" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/pr3287/configure.in0000664000076500007650000000763413221577163014464 0ustar pdmpdmdnl Copyright (c) 2000-2010, 2014-2017 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. dnl Process this file with autoconf to produce a configure script. AC_INIT(pr3287,3.x) AC_PREREQ(2.50) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_CC dnl Figure out what sort of host and compiler this is. AC_CANONICAL_HOST ansi="-std=c99 -pedantic" case "$host_os" in *cygwin*) ansi="" ;; solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" ;; linux*) CPPFLAGS="-D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_SOURCE -D_XOPEN_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi AC_SUBST(host) AC_SUBST(CCOPTIONS) dnl Check for libraries. dnl Note that the order here is important. The last libraries should appear dnl first, so that objects in them can be used by subsequent libraries. AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket) dnl Checks for header files. AC_CHECK_HEADERS(iconv.h) dnl Check for SSL header file. AC_ARG_WITH(ssl,[ --with-ssl=DIR specify OpenSSL install directory]) if test "$enable_ssl" != no then orig_CPPFLAGS="$CPPFLAGS" unset any for dir in "$with_ssl" /usr/local /usr/local/ssl /usr/lib/ssl /usr/pkg/ssl /usr/ssl /var/ssl /opt/ssl do header_fail=0 if test -n "$dir" -a ! -d "$dir/include" then header_fail=1 continue fi if test -n "$any" then AC_MSG_NOTICE(retrying with -I$dir/include) fi if test -n "$dir" then CPPFLAGS="$orig_CPPFLAGS -I$dir/include" fi AC_CHECK_HEADERS(openssl/ssl.h, ,[header_fail=1]) if test "$header_fail" -eq 0 then break fi unset `echo ac_cv_header_openssl/ssl_h | $as_tr_sh` CPPFLAGS="$orig_CPPFLAGS" any=1 done if test $header_fail -eq 1 then AC_MSG_WARN(Disabling OpenSSL) enable_ssl="no" unset HAVE_LIBSSL fi fi dnl Checks for library functions. AC_CHECK_FUNCS(vasprintf) dnl Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' AC_SUBST(LIBX3270DIR) dnl Check for unwanted parts. AC_ARG_ENABLE(dbcs,[ --disable-dbcs leave out DBCS support]) case "$enable_dbcs" in no) ;; *) AC_DEFINE(X3270_DBCS,1) ;; esac AC_ARG_ENABLE(ipv6,[ --disable-ipv6 leave out IPv6 support]) case "$enable_ipv6" in ""|yes) AC_DEFINE(X3270_IPV6,1) ;; esac dnl Generate conf.h. AC_CONFIG_HEADER(conf.h) dnl Generate the Makefiles. AC_OUTPUT(Makefile) AC_OUTPUT(Makefile.obj) suite3270-3.6/pr3287/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021444 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/pr3287/html.m40000664000076500007650000000642213221577163013353 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/pr3287/html/pr3287-man.html0000664000076500007650000003357413221600611015506 0ustar pdmpdm pr3287 Manual Page

    pr3287 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Signals
    Proxy
    See Also
    Copyrights
    Version

    Name

    pr3287 - IBM host printing tool

    Synopsis

    pr3287 [options] [L:][Y:][LUname[,LUname...]@]hostname[:port][=accept]

    Description

    pr3287 opens a telnet connection to an IBM host, and emulates an IBM 3287 printer. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection).

    If the hostname is prefixed with L:, the connection will be made through an SSL/TLS tunnel. If the hostname is also prefixed with Y:, the host's SSL/TLS certificate will not be checked. pr3287 also supports TELNET START-TLS option negotiation without any need for command-line options.

    A specific LU name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma.

    The port to connect to defaults to telnet. This can be overridden by appending a port to the hostname with a colon `:'.

    An accept name (a name to compare to the host's SSL/TLS certificate) may be specified by appending it with an equals sign.

    Options

    pr3287 understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. name can either be any (OpenSSL only), which disables name validation, or a specific name.
    -assoc LUname
    Causes the session to be associated with the specified LUname.
    -blanklines
    In LU3 formatted mode, print blank lines even if they are all NULLs or control characters. (This is a violation of the 3270 printer protocol, but some hosts require it.)
    -cadir directory
    Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -cafile filename
    Specifies a PEM-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -certfile filename
    Specifies a file containing a certificate to provide to the host. The default file type is PEM (OpenSSL) or PKCS12 (MacOS).
    -certfiletype type
    Specifies the type of the certificate file specified by -certfile. Type can be pem or asn1. (OpenSSL only)
    -chainfile filename
    Specifies a certificate chain file in PEM format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If -chainfile is specified, it overrides -certfile. (OpenSSL only)
    -clientcert name
    Specifies the name of a client certificate to provide to the host. It must be installed in the keychain. (MacOS only)
    -charset name
    Specifies an alternate host code page (input EBCDIC mapping). The default maps the U.S. English (037) code page to the current locale character encoding. pr3287 generally supports the same host character sets as x3270.
    -command command
    Specifies the command to run for each print job. The default is lpr.
    -crlf
    Causes newline characters in the output to be expanded to carriage-return/linefeed sequences.
    -crthru
    In unformatted 3270 mode, causes EBCDIC CR orders to be passed to directly to the printer as ASCII CR characters, and the output buffer to be flushed, instead of being specially interpreted by pr3287.

    By default, EBCDIC CRs cause the (virtual) print head to return to column 0, so that subsequent text overwrites what is already in the buffer, and the buffer is flushed only when an EBCDIC NL or EM order is received.

    -daemon
    Causes pr3287 to become a daemon (background) process.
    -eojtimeout seconds
    Causes pr3287 to complete the print job after seconds seconds of inactivity.
    -emflush
    Causes pr3287 to flush any pending printer output whenever an EM (End of Medium) order arrives in unformatted 3270 mode. This can help preserve multi-page output with hosts that do not clear the 3270 buffer between pages. (Note: This option is defined for historical purposes only; -emflush is now the default.)
    -noemflush
    Causes pr3287 not to flush any pending printer output when an EM (End of Medium) order arrives in unformatted 3270 mode.
    -ignoreeoj
    Ignore TN3270E PRINT-EOJ commands, relying on UNBIND commands to indicate the ends of print jobs.
    -ffeoj
    Causes pr3287 to add a FF (formfeed) at the end of each print job.
    -ffskip
    Causes pr3287 to ignore a FF (formfeed) order if it occurs at the top of a page.
    -ffthru
    In SCS mode, causes pr3287 to pass FF (formfeed) orders through to the printer as ASCII formfeed characters, rather than simulating them based on the values of the MPL (maximum presentation line) and TM (top margin) parameters.
    -keyfile filename
    Specifies a file containing the private key for the certificate file (specified via -certfile or -chainfile). The default file type is PEM. (OpenSSL only)
    -keyfiletype type
    Specifies the type of the private key file specified by -keyfile. Type can be pem or asn1. (OpenSSL only)
    -keypasswd type:value
    Specifies the password for the private key file, if it is encrypted. The argument can be file:filename, specifying that the password is in a file, or string:string, specifying the password on the command-line directly.
    -mpp n
    Specifies a non-default value for the Maximum Presentation Position (the line length for unformatted Write commands). The default is 132. The minimum is 40 and the maximum is 256.
    -noverifycert
    Do not verify the host certificate for SSL/TLS connections.
    -proxy type:host[:port]
    Causes pr3287 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -reconnect
    Causes pr3287 to reconnect to the host, whenever the connection is broken. There is a 5-second delay between reconnect attempts, to reduce network thrashing for down or misconfigured hosts.
    -skipcc
    For unformatted writes, skip ASA carriage control characters (e.g., blank for single-space, 0 for double-space, 1 for formfeed, etc.) in the first position of each line of host output.
    -trace
    Turns on data stream tracing. Trace information is usually saved in the file /tmp/x3trc.pid.
    -tracedir dir
    Specifies the directory to save trace files in, instead of /tmp.
    -trnpre file
    Specifies a file containing data that will be sent to the printer before each print job. The file contents are treated as transparent data, i.e., they are not translated in any way.
    -trnpost file
    Specifies a file containing data that will be sent to the printer after each print job. The file contents are treated as transparent data, i.e., they are not translated in any way.
    -v
    Display build and version information and exit.
    -verifycert
    Verify the host certificate for SSL/TLS connections. (This is the default setting.)
    -xtable file
    Specifies a file containing transparent data translations. The file specifies EBCDIC characters that will be translated into transparent ASCII data (data that will not be further translated and will not count as taking up column(s) on the print line). Any printable ECBDIC code can be translated to zero or more ASCII characters.

    The table consists of lines that look like:

    ebcdic ebcdic-code ascii ascii-code...

    The ebcdic-code can be specified in hexadecimal X'nn' notation or as numbers in decimal, octal (with a leading 0) or hexadecimal (with a leading 0x). The ascii-codes can be specified as numbers in decimal, octal or hexadecimal, control codes such as ^X, symbolic control codes such as CR or Escape, or as double-quoted strings, following the full C-language conventions, such as \r for a carriage return. Comments begin with #, ! or //.

    Here are some examples of translations.
    # Expand EBCDIC D to an escape sequence.
    ebcdic X'C4' ascii Esc "]1,3" 0x6d
    # Delete EBCDIC B's
    ebcdic X'C2' ascii

    The full list of symbolic control codes is: BS CR BEL ESC ESCAPE FF HT LF NL NUL SPACE TAB VT.

    Signals

    SIGINT, SIGHUP and SIGTERM cause the current print job to be flushed (any pending data to be printed) and pr3287 to exit.

    SIGUSR1 causes the current print job to be flushed without otherwise affecting the pr3287 process.

    Proxy

    The -proxy option causes pr3287 to use a proxy server to connect to the host. The syntax of the option is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    See Also

    x3270(1), c3270(1), telnet(1), tn3270(1)
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    3174 Establishment Controller Functional Description, IBM GA23-0218
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC `AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    pr3287 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/pr3287/html/ReleaseNotes.html0000664000076500007650000032733413221600611016361 0ustar pdmpdm pr3287 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/pr3287/LICENSE0000664000076500007650000000315713221577163013154 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/pr3287/m4man0000775000076500007650000000342013221577163013102 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/pr3287/Makefile.aux0000664000076500007650000000473413221577163014405 0ustar pdmpdm# Copyright (c) 2000-2009, 2013-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for pr3287 PRODUCT = pr3287 all: @echo "Must pick a specific make target." DOCS = $(PRODUCT).man html/$(PRODUCT)-man.html html/ReleaseNotes.html # Rule for building the source tarball: run autoconf and build the # documentation. src.tgz: prepare $(DOCS) # Rule for preparing a freshly-pulled working copy: run autoconf. prepare: configure configure: configure.in autoconf MANDEP = man.m4 html.m4 m4man Makefile.aux version.txt MKMAN = ./m4man -t man -p $(PRODUCT) MKHTML = ./m4man -t html -p $(PRODUCT) # Rule for building the documentation. man: $(DOCS) # Rules for building man pages and derived HTML documentation. $(PRODUCT).man: $(PRODUCT).man.m4 $(MANDEP) $(MKMAN) -n $(PRODUCT) -o $@ $(PRODUCT).man.m4 html/$(PRODUCT)-man.html: $(PRODUCT).man.m4 $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ $(PRODUCT).man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ suite3270-3.6/pr3287/Makefile.in0000664000076500007650000000435313221577163014213 0ustar pdmpdm# Copyright (c) 2016-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for pr3287 top = ../../.. objdir = ../obj/@host@/pr3287 this = $(top)/pr3287 export VPATH = $(this):$(top)/Common/pr3287:$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(this) -I$(top)/Common -I$(top)/Common/pr3287 all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ install: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ install.man: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/pr3287/Makefile.obj.in0000664000076500007650000000550613221577163014765 0ustar pdmpdm# Copyright (c) 1999-2010, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Makefile for pr3287 RM = rm -f CC = @CC@ all: pr3287 prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ MANDIR = @mandir@ BINDIR = @bindir@ sysconfdir = @sysconfdir@ CCOPTIONS = @CCOPTIONS@ XCPPFLAGS = @CPPFLAGS@ -I$(THIS) -I$(TOP)/include CFLAGS = $(CCOPTIONS) $(CDEBUGFLAGS) $(XCPPFLAGS) \ -DLIBX3270DIR=\"@LIBX3270DIR@\" LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ HOST = @host@ include pr3287_files.mk libs.mk OBJECTS = $(PR3287_OBJECTS) XVERSION = xversion.c version.o: mkversion.sh $(OBJECTS) version.txt $(RM) $(XVERSION) sh $< pr3287 $(filter %.txt,$^) >$(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) pr3287: $(OBJECTS) version.o $(DEP32XX) $(DEP3270STUBS) $(CC) -o $@ $(OBJECTS) version.o $(LDFLAGS) $(LD32XX) $(LD3270STUBS) $(LIBS) man:: pr3287.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi install: pr3287 [ -d $(DESTDIR)$(BINDIR) ] || \ mkdir -p $(DESTDIR)$(BINDIR) $(INSTALL_PROGRAM) pr3287 $(DESTDIR)$(BINDIR)/pr3287 install.man: man [ -d $(DESTDIR)$(MANDIR)/man1 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man1 $(INSTALL_DATA) pr3287.man $(DESTDIR)$(MANDIR)/man1/pr3287.1 clean: $(RM) *.o clobber: clean $(RM) pr3287 *.d *.man # Include auto-generated dependencies. -include $(OBJS:.o=.d) suite3270-3.6/pr3287/man.m40000664000076500007650000000513013221577163013155 0ustar pdmpdmdnl Copyright (c) 2000-2012, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces output for nroff -man changecom()dnl changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl define(XX_SH,.SH `"translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)"')dnl define(XX_TH,.TH $1 $2 "$3")dnl define(XX_SM,\s-1$1\s+1)dnl define(XX_LP,.LP)dnl define(XX_IP,.IP)dnl define(XX_BR,.br)dnl define(XX_RS,.RS $1 .RE)dnl define(XX_TS,.TS $2)dnl define(XX_TR,$1)dnl define(XX_TD,T{ .na .nh $1 T})dnl define(XX_TDH,T{ .na .nh .in +2 .ti -2 $1 T})dnl define(XX_T_,_)dnl define(XX_TC,$1)dnl define(XX_TE,.TE)dnl define(XX_TPS)dnl define(XX_TP,.TP $1)dnl define(XX_TPE)dnl define(XX_PP,.PP)dnl define(XX_RI2,.RI $1 $2)dnl define(XX_DASH,\-)dnl define(XX_DASHED,\-$1)dnl define(XX_FI,\fI$1\fP)dnl define(XX_FB,\fB$1\fP)dnl define(XX_NBSP,`\ ')dnl define(XX_LT,<)dnl define(XX_BS,\e)dnl define(XX_TARGET)dnl define(XX_LINK,$2)dnl define(XX_COPY,` ')dnl define(XX_NOT,notsign)dnl define(XX_BACKSLASH,\\$1)dnl define(XX_HO)dnl define(XX_HY,$1\%$2)dnl dnl Make sure it gets run through tbl first. '\" t suite3270-3.6/pr3287/mkstand.bash0000775000076500007650000000100313221577163014436 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/pr3287/mkversion.sh0000775000076500007650000000466413221577163014527 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <\\server\printer1. XX_TP(XX_FB(XX_DASHED(printercp)) XX_FI(codepage)) Specifies the code page to use when generating printer output. The default is to use the system ANSI code page.') XX_TP(XX_FB(XX_DASHED(noverifycert))) Do not verify the host certificate for SSL/TLS connections. XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FI(XX_PRODUCT) to reconnect to the host, whenever the connection is broken. There is a 5-second delay between reconnect attempts, to reduce network thrashing for down or misconfigured hosts. XX_TP(XX_FB(XX_DASHED(skipcc))) For unformatted writes, skip ASA carriage control characters (e.g., blank for single-space, `0' for double-space, `1' for formfeed, etc.) in the first position of each line of host output. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream tracing. Trace information is usually saved in the file ifelse(XX_PRODUCT,pr3287,`XX_FB(/tmp/x3trc.)`'XX_FI(pid).', `XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt).') XX_TP(XX_FB(XX_DASHED(tracedir)) XX_FI(dir)) Specifies the directory to save trace files in, instead of ifelse(XX_PRODUCT,pr3287,XX_FB(/tmp), the current directory). XX_TP(XX_FB(XX_DASHED(trnpre) XX_FI(file))) Specifies a file containing data that will be sent to the printer before each print job. The file contents are treated as transparent data, i.e., they are not translated in any way. XX_TP(XX_FB(XX_DASHED(trnpost) XX_FI(file))) Specifies a file containing data that will be sent to the printer after each print job. The file contents are treated as transparent data, i.e., they are not translated in any way. XX_TP(XX_FB(XX_DASHED(v))) Display build and version information and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) Verify the host certificate for SSL/TLS connections. (This is the default setting.) XX_TP(XX_FB(XX_DASHED(xtable) XX_FI(file))) Specifies a file containing transparent data translations. The file specifies EBCDIC characters that will be translated into transparent ASCII data (data that will not be further translated and will not count as taking up column(s) on the print line). Any printable ECBDIC code can be translated to zero or more ASCII characters. XX_IP The table consists of lines that look like: XX_RS(XX_FB(ebcdic) XX_FI(ebcdic-code) XX_FB(ascii) XX_FI(ascii-code)... ) XX_IP The XX_FI(ebcdic-code) can be specified in hexadecimal X'XX_FI(nn)' notation or as numbers in decimal, octal (with a leading 0) or hexadecimal (with a leading 0x). The XX_FI(ascii-code)s can be specified as numbers in decimal, octal or hexadecimal, control codes such as XX_FB(^X), symbolic control codes such as XX_FB(CR) or XX_FB(Escape), or as double-quoted strings, following the full C-language conventions, such as XX_FB(XX_BACKSLASH(r)) for a carriage return. Comments begin with XX_FB(#), XX_FB(!) or XX_FB(//). XX_IP Here are some examples of translations. XX_BR # Expand EBCDIC D to an escape sequence. XX_BR ebcdic X'C4' ascii Esc "]1,3" 0x6d XX_BR # Delete EBCDIC XX_POSESSIVE(B) XX_BR ebcdic X'C2' ascii XX_IP The full list of symbolic control codes is: XX_FB(BS CR BEL ESC ESCAPE FF HT LF NL NUL SPACE TAB VT). XX_TPE()dnl ifelse(XX_PRODUCT,pr3287,`XX_SH(Signals) SIGINT, SIGHUP and SIGTERM cause the current print job to be flushed (any pending data to be printed) and XX_FI(XX_PRODUCT) to exit. XX_LP() SIGUSR1 causes the current print job to be flushed without otherwise affecting the XX_FI(XX_PRODUCT) process.') ifelse(XX_PRODUCT,wpr3287,`XX_SH(Environment) XX_TPS()dnl XX_TP(XX_FB(PRINTER)) Specifies the Windows printer to use for print jobs. The XX_FB(XX_DASHED(printer)) command-line option overrides XX_FB($PRINTER). XX_TPE()dnl') XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. XX_SH(See Also) ifelse(XX_PRODUCT,pr3287,`x3270(1), c3270(1), telnet(1), tn3270(1)', `wc3270(1)') XX_BR Data Stream Programmer's Reference, IBM GA23`'XX_DASHED(0059) XX_BR Character Set Reference, IBM GA27`'XX_DASHED(3831) XX_BR 3174 Establishment Controller Functional Description, IBM GA23`'XX_DASHED(0218) XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP() Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_LP() THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC XX_DQUOTED(AS IS) AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/pr3287/README0000664000076500007650000000077713221577163013034 0ustar pdmpdmpr3287 is an IBM 3287 printer emulator. It connects to an IBM host via TELNET, using TN3270 or TN3270E. It supports SCS (SNA Character Stream). To build pr3287, type: ./configure make To install pr3287 in /usr/local/bin, type (as root): make install If you are running Sun Solaris and have Sun's unbundled C compiler installed, _do_not_ use it to build pr3287. Instead, type: make CC=/usr/ccs/bin/cc If you have any questions or comments on pr3287, please contact Paul.Mattes@usa.net. suite3270-3.6/pr3287/version.txt0000775000076500007650000000006013221577443014367 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/README.txt0000664000076500007650000000026413221577163012674 0ustar pdmpdmThis is the source tree for the 3270 emulation suite (x3270, c3270, s3270, tcl3270, pr3287, wc3270, ws3270 and wpr3287). General build instructions are in Webpage/Build.html. suite3270-3.6/s3270/conf.h.in0000664000076500007650000000377713221577163013473 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. * Automatically generated from conf.h.in by configure. */ /* Libraries. */ /* Header files. */ #undef HAVE_SYS_SELECT_H #undef HAVE_PTY_H #undef HAVE_LIBUTIL_H #undef HAVE_UTIL_H #undef HAVE_GETOPT_H /* Uncommon functions. */ #undef HAVE_VASPRINTF #undef HAVE_FSEEKO #undef HAVE_FORKPTY /* Configuration options. */ /* Optional parts. */ #undef X3270_DBCS #undef X3270_LOCAL_PROCESS #undef X3270_IPV6 suite3270-3.6/s3270/configure0000775000076500007650000055014613221577163013674 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for s3270 3.x. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='s3270' PACKAGE_TARNAME='s3270' PACKAGE_VERSION='3.x' PACKAGE_STRING='s3270 3.x' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS LIBX3270DIR EGREP GREP CPP CCOPTIONS host_os host_vendor host_cpu host build_os build_vendor build_cpu build OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dbcs enable_local_process enable_ipv6 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures s3270 3.x to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/s3270] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of s3270 3.x:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dbcs leave out DBCS support --disable-local-process leave out local process support --disable-ipv6 leave out IPv6 support Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF s3270 configure 3.x generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by s3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ansi="-std=c99 -pedantic" case "$host_os" in *cygwin*) ansi="" ;; solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" ;; linux*) CPPFLAGS="-D_POSIX_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing forkpty" >&5 $as_echo_n "checking for library containing forkpty... " >&6; } if ${ac_cv_search_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char forkpty (); int main () { return forkpty (); ; return 0; } _ACEOF for ac_lib in '' util; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_forkpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_forkpty+:} false; then : break fi done if ${ac_cv_search_forkpty+:} false; then : else ac_cv_search_forkpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_forkpty" >&5 $as_echo "$ac_cv_search_forkpty" >&6; } ac_res=$ac_cv_search_forkpty if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" if test "x$ac_cv_func_forkpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SELECT_H 1 _ACEOF fi done for ac_header in pty.h do : ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTY_H 1 _ACEOF fi done for ac_header in libutil.h do : ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBUTIL_H 1 _ACEOF fi done for ac_header in util.h do : ac_fn_c_check_header_mongrel "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTIL_H 1 _ACEOF fi done for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF fi done for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi LIBX3270DIR='${sysconfdir}/x3270' # Check whether --enable-dbcs was given. if test "${enable_dbcs+set}" = set; then : enableval=$enable_dbcs; fi case "$enable_dbcs" in no) ;; *) $as_echo "#define X3270_DBCS 1" >>confdefs.h ;; esac # Check whether --enable-local_process was given. if test "${enable_local_process+set}" = set; then : enableval=$enable_local_process; fi case "$enable_local_process" in ""|yes) $as_echo "#define X3270_LOCAL_PROCESS 1" >>confdefs.h ;; esac # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi case "$enable_ipv6" in ""|yes) $as_echo "#define X3270_IPV6 1" >>confdefs.h ;; esac ac_config_headers="$ac_config_headers conf.h" ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by s3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ s3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ac_config_files="$ac_config_files Makefile.obj" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by s3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ s3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile.obj") CONFIG_FILES="$CONFIG_FILES Makefile.obj" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/s3270/configure.in0000664000076500007650000000660113221577163014266 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2017 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. dnl Process this file with autoconf to produce a configure script. AC_INIT(s3270,3.x) AC_PREREQ(2.50) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_CC dnl Figure out what sort of host and compiler this is. AC_CANONICAL_HOST ansi="-std=c99 -pedantic" case "$host_os" in *cygwin*) ansi="" ;; solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" ;; linux*) CPPFLAGS="-D_POSIX_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare $ansi -Wno-variadic-macros -MMD -MP" fi AC_SUBST(host) AC_SUBST(CCOPTIONS) dnl Check for libraries. dnl Note that the order here is important. The last libraries should appear dnl first, so that objects in them can be used by subsequent libraries. AC_SEARCH_LIBS(forkpty, util) AC_CHECK_FUNCS(forkpty) AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket) dnl Checks for header files. AC_CHECK_HEADERS(sys/select.h) AC_CHECK_HEADERS(pty.h) AC_CHECK_HEADERS(libutil.h) AC_CHECK_HEADERS(util.h) AC_CHECK_HEADERS(getopt.h) dnl Checks for library functions. AC_CHECK_FUNCS(vasprintf) AC_FUNC_FSEEKO dnl Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' AC_SUBST(LIBX3270DIR) dnl Check for unwanted parts. AC_ARG_ENABLE(dbcs,[ --disable-dbcs leave out DBCS support]) case "$enable_dbcs" in no) ;; *) AC_DEFINE(X3270_DBCS,1) ;; esac AC_ARG_ENABLE(local_process,[ --disable-local-process leave out local process support]) case "$enable_local_process" in ""|yes) AC_DEFINE(X3270_LOCAL_PROCESS,1) ;; esac AC_ARG_ENABLE(ipv6,[ --disable-ipv6 leave out IPv6 support]) case "$enable_ipv6" in ""|yes) AC_DEFINE(X3270_IPV6,1) ;; esac dnl Generate conf.h. AC_CONFIG_HEADER(conf.h) dnl Generate the Makefiles. AC_OUTPUT(Makefile) AC_OUTPUT(Makefile.obj) suite3270-3.6/s3270/documentation-ssl-body.html0000664000076500007650000002056613221577163017254 0ustar pdmpdm

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/s3270/Examples/cms_cmd.expect0000775000076500007650000001110613221577163016351 0ustar pdmpdm#!/usr/bin/expect # Copyright (c) 2000-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Read in the glue functions. source x3270_glue.expect # Pluck the username, password and command from the command line. if {$argc != 4} { puts stderr "Usage: $argv0 hostname username password command" exit 1 } set hostname [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] set command [lindex $argv 3] # Procedure to wait for a READ prompt from CMS or CP. proc waitread {} { Snap Save while {[Snap Ascii [expr [Snap Rows]-1] [expr [Snap Cols]-17] 4] != "READ"} { Snap Wait Output } } # Procedure to check for the CMS "Ready" prompt. # Returns its row number, or -1 for "MORE..." state, and leaves a screen with # data to read in the Snap buffer. proc cmd_done {} { global verbose Snap Save while {1} { if {[Snap Ascii [expr [Snap Rows]-1] [expr [Snap Cols]-20] 7] == "MORE..."} { if {$verbose} {puts "MORE..."} return -1 } set i [expr [Snap Rows]-2] while {$i >= 0} { set text [Snap Ascii $i 0 [Snap Cols]] switch -regexp $text { "Ready; T=.*" {return $i} "Ready\(.*\); T=.*" { error [Snap Ascii [expr $i-1] 0 \ [Snap Cols]] } "^ *\$" {} default { if {$verbose} {puts "Incomplete $i '[string trimright $text]'"} set i 0 } } incr i -1 } Snap Wait Output } } # Execute a command, return the output. proc cms_cmd {text} { global verbose # Clear the screen. Clear # Send the command. String "$text\n" # 'first' is the row where the first line of output will appear. For # the first screenful it's 1; after that it's 0. set first 1 # r is the result. set r {} while {1} { # Wait for a screenful. set d [cmd_done] # Dump out what's there. set i $first set first 0 if {$d < 0} {set last [expr [Snap Rows]-2]} {set last $d} while {$i < $last} { set r [linsert $r end [string trimright \ [Snap Ascii $i 0 [Snap Cols]]]] incr i } if {$d >= 0} {break} # Clear the screen and go around again. Clear } return $r } # Start of main procedure. # Set 'verbose' to 1 to get debug output from the glue functions. set verbose 0 # Start s3270 Start # Setverbose 1 # Connect to the host and wait for an input field. Connect $hostname Wait InputField # Log in and wait for CP READ or VM READ mode. String "$username\t$password\n" waitread # If we can't log on, we're hosed. if {[Ascii 1 11 7] == "Already"} { puts stderr "Can't run -- already logged in." exit 1 } # If we're in CP mode, which means we disconnected last time, boot CMS. if {[Ascii [expr [Rows]-1] [expr [Cols]-20] 2] == "CP"} { Clear String "i cms\n" waitread } # Enter an empty command to get a CMS prompt. If we don't do this, there will # be a Ready prompt as the first line of output below. Clear Enter cmd_done # Get the output of the user's command and display it. if {[catch {cms_cmd $command} result]} { puts stderr $result set rc 1 } { for {set i 0} {$i < [llength $result]} {incr i} { puts [lindex $result $i] } set rc 0 } # Log off, and wait for the host to hang up on us, so we don't unintentionally # create a disconnected session. Clear if {! [catch {String "logoff\n"}]} {Wait Disconnect} exit $rc suite3270-3.6/s3270/ft.inc0000664000076500007650000001355013221577163013062 0ustar pdmpdmXX_SH(File Transfer) The XX_FB(Transfer) XX_action implements XX_FB(IND$FILE) file transfer. This XX_action requires that the XX_FB(IND$FILE) program be installed on the XX_SM(IBM) host, and that the 3270 cursor be located in a field that will accept a XX_SM(TSO) or XX_SM(VM/CMS) command. XX_LP ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`The XX_FB(Transfer) XX_action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. ')dnl XX_LP Because of the complexity and number of options for file transfer, the parameters to the XX_FB(Transfer) XX_action take the unique form of XX_FI(option)=XX_FI(value), and can appear in any order. Note that if the XX_FI(value) contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: XX_LP XX_TS(4,l c l l.) XX_TR(XX_TD(Option) XX_TD(Required?) XX_TD(Default) XX_TD(Other Values)) XX_T_() XX_TR(XX_TD(Direction) XX_TD(No) XX_TD(receive) XX_TD(send)) XX_TR(XX_TD(HostFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(LocalFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Host) XX_TD(No) XX_TD(tso) `XX_TD(`vm, cics')') XX_TR(XX_TD(Mode) XX_TD(No) XX_TD(ascii) XX_TD(binary)) XX_TR(XX_TD(Cr) XX_TD(No) XX_TD(remove) `XX_TD(`add, keep')') XX_TR(XX_TD(Remap) XX_TD(No) XX_TD(yes) XX_TD(no)) XX_TR(XX_TD(Exist) XX_TD(No) XX_TD(keep) `XX_TD(`replace, append')') XX_TR(XX_TD(Recfm) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`fixed, variable, undefined')') XX_TR(XX_TD(Lrecl) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Blksize) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Allocation) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`tracks, cylinders, avblock')') XX_TR(XX_TD(PrimarySpace) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(SecondarySpace) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Avblock) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(BufferSize) XX_TD(No) XX_TD(4096) XX_TD(XX_NBSP)) XX_TE() XX_LP The option details are as follows. XX_TPS()dnl XX_TP(XX_FB(Direction)) XX_FB(send) to send a file to the host, XX_FB(receive) to receive a file from the host. XX_TP(XX_FB(HostFile)) The name of the file on the host. XX_TP(XX_FB(LocalFile)) The name of the file on the local workstation. XX_TP(XX_FB(Host)) The type of host (which dictates the form of the XX_FB(IND$FILE) command): XX_FB(tso) (the default), XX_FB(vm) or XX_FB(cics). XX_TP(XX_FB(Mode)) Use XX_FB(ascii) (the default) for a text file, which will be translated between XX_SM(EBCDIC) and XX_SM(ASCII) as necessary. Use XX_FB(binary) for non-text files. XX_TP(XX_FB(Cr)) Controls how XX_FB(Newline) characters are handled when transferring XX_FB(Mode=ascii) files. XX_FB(remove) (the default) strips XX_FB(Newline) characters in local files before transferring them to the host. XX_FB(add) adds XX_FB(Newline) characters to each host file record before transferring it to the local workstation. XX_FB(keep) preserves XX_FB(Newline) characters when transferring a local file to the host. XX_TP(XX_FB(Remap)) Controls text translation for XX_FB(Mode=ascii) files. The value XX_FB(yes) (the default) causes XX_PRODUCT to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's XX_SM(EBCDIC) code page. The value XX_FB(no) causes XX_PRODUCT to pass the text to or from the host as-is, leaving all translation to the XX_FB(IND$FILE) program on the host. XX_TP(XX_FB(Exist)) Controls what happens when the destination file already exists. XX_FB(keep) (the default) preserves the file, causing the XX_FB(Transfer) XX_action to fail. XX_FB(replace) overwrites the destination file with the source file. XX_FB(append) appends the source file to the destination file. XX_TP(XX_FB(Recfm)) Controls the record format of files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_FB(fixed) creates a file with fixed-length records. XX_FB(variable) creates a file with variable-length records. XX_FB(undefined) creates a file with undefined-length records (XX_SM(TSO) hosts only). The XX_FB(Lrecl) option controls the record length or maximum record length for XX_FB(Recfm=fixed) and XX_FB(Recfm=variable) files, respectively. XX_TP(XX_FB(Lrecl)) Specifies the record length (or maximum record length) for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Blksize)) Specifies the block size for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Allocation)) Specifies the units for the XX_FB(PrimarySpace) and XX_FB(SecondarySpace) options: XX_FB(tracks), XX_FB(cylinders) or XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(PrimarySpace)) Primary allocation for a file. The units are given by the XX_FB(Allocation) option. Required when the XX_FB(Allocation) is specified as something other than XX_FB(default). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(SecondarySpace)) Secondary allocation for a file. The units are given by the XX_FB(Allocation) option. (XX_SM(TSO) hosts only.) XX_TP(XX_FB(Avblock)) Average block size, required when XX_FB(Allocation) specifies XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(BufferSize)) Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(WindowsCodePage)) Overrides the workstation code page used for XX_SM(ASCII) file transfers. By default, the system XX_SM(ANSI) code page is used. ')dnl XX_TPE()dnl XX_LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the XX_FB(Transfer) keywords, but with XX_FB(ft) prepended. E.g., the default for the XX_FB(Mode) keyword is the XX_FB(XX_PRODUCT.ftMode) resource. suite3270-3.6/s3270/hostname.inc0000664000076500007650000000600213221577163014261 0ustar pdmpdmThe full syntax for XX_FI(host) is: XX_RS([XX_FI(prefix):]...[XX_FI(LUname)@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)]) ifelse(XX_PRODUCT,wc3270,,`XX_LP Prepending a XX_FB(P:) onto XX_FI(hostname) causes the connection to go through the XX_FI(telnet-passthru) service rather than directly to the host. See XX_LINK(#Passthru,XX_SM(PASSTHRU)) below. ')dnl XX_LP Prepending an XX_FB(S:) onto XX_FI(hostname) removes the "extended data stream" option reported to the host. See XX_LINK(#tn,XX_FB(XX_DASHED(tn))) below for further information. XX_LP Prepending an XX_FB(N:) onto XX_FI(hostname) turns off TN3270E support for the session. XX_LP Prepending an XX_FB(L:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if XX_FB(XX_PRODUCT) was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the XX_FB(L:) prefix should not be used. XX_LP Prepending a XX_FB(Y:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. XX_LP Prepending an XX_FB(A:) onto XX_FI(hostname) is equivalent to setting the XX_FB(XX_DASHED(nvt)) option; it forces an NVT-mode session instead of a 3270-mode session. XX_LP A specific Logical Unit (LU) name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) XX_LP The XX_FI(hostname) may optionally be placed inside square-bracket characters XX_DQUOTED(XX_FB([)) and XX_DQUOTED(XX_FB(])). This will prevent any colon XX_DQUOTED(XX_FB(:)) characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. ifelse(XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_LP On systems that support the XX_FI(forkpty) library call, the XX_FI(hostname) may be replaced with XX_FB(XX_DASHED(e)) and a command string. This will cause XX_FB(XX_PRODUCT) to connect to a local child process, such as a shell. ')dnl XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden with the XX_FB(XX_DASHED(port)) option, or by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). (For compatability with previous versions of XX_FB(XX_PRODUCT) and with XX_FI(tn3270)(1), the XX_FI(port) may also be specified as a second, separate argument.) XX_LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (XX_DQUOTED(XX_FB(=))). The accept name can also be specified with the XX_FB(XX_DASHED(accepthostname)) option. suite3270-3.6/s3270/html/Bugs.html0000664000076500007650000000056113221577163014506 0ustar pdmpdm Known Bugs in s3270 3.3

    Known Bugs in s3270 3.3

    (none)
    suite3270-3.6/s3270/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021255 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/s3270/html/FAQ.html0000664000076500007650000000406713221577163014222 0ustar pdmpdm s3270 Frequently Asked Questions

    s3270 Frequently Asked Questions

    If you have a problem building, installing, or running s3270, please browse through this file first.

    General Questions

    Am I allowed to use it?

    Yes. Full copyright information is in the Lineage file, but the gist is that anyone is free to use the code, and anyone is free to sell copies of the code.

    You are also free to modify it and to redistribute it, provided you preserve the existing copyright notices.

    Getting Help

    If you are still having a problem with s3270, feel free to send e-mail to Paul Mattes, Paul.Mattes@usa.net No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. It will also get you on an x3270 mailing list, which also includes information on s3270, and where you can find out about new releases and bug fixes.

    When you send a question about s3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of s3270 you are using, including all patches, e.g., "3.3.6p1".
    2. What kind of machine you are running on, e.g., "Sun SPARC-10".
    3. What operating system you are running, and what version, e.g., "SunOS 4.1.3_U1" or "Irix 5.2". The "uname -a" command will usually provide this information.
    Complaints, suggestions, requests for enhancements, and porting experiences are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) under the x3270 license. suite3270-3.6/s3270/html/Intro.html0000664000076500007650000000220213221577163014673 0ustar pdmpdm s3270 Introduction

    s3270 Introduction

    s3270 is a scripted IBM 3270 terminal emulator. It can be used to communicate with any IBM host that supports 3270-style connections over TELNET. It can also communicate with hosts that use line-by-line ASCII mode to do initial login negotiation before switching to full-screen 3270 mode.

    s3270 emulates one of four models of an IBM 3278 or 3279 terminal. The difference between the various models is the screen size. The emulation is not quite complete; s3270 understands extended field orders but does not implement some of the extended attributes (outlining, extended validation, etc.). It does not support 3179G bit-mapped graphics (GDDM).

    s3270 supports the APL character set and several international character sets. Many APL and international symbols may be entered by their X11 symbol names. suite3270-3.6/s3270/html/Lineage.html0000664000076500007650000000445413221577163015157 0ustar pdmpdm s3270 Lineage

    s3270 Lineage

    Here is the official copyright notice for s3270 3.3. It is a standard 3-element BSD license.

    Copyright © 1993-2015, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    suite3270-3.6/s3270/html.m40000664000076500007650000000642213221577163013164 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/s3270/html/README.html0000664000076500007650000000430313221577163014541 0ustar pdmpdm s3270 3.5 General Release

    s3270 3.5 General Release

    s3270 is a scripted IBM 3278/3279 terminal emulator.

    Documentation is in the directory. The files are:

    Intro
    What s3270 is
    Lineage
    Where s3270 came from (copyright stuff)
    Build
    How to build and install s3270
    FAQ
    Frequently Asked Questions (what to do when something goes wrong)
    ReleaseNotes
    What's new in this release
    Resources
    A complete list of s3270 resources (configuration items)
    SSL
    How to use s3270 with the Secure Sockets Layer (SSL)
    Bugs
    What's broken in this release
    Wishlist
    What isn't in this release
    There is also a hypertext version of the s3270 man page, and of the man pages for x3270-script and x3270if. Please read Build before going ahead and building the program. Also, if you have a problem, scan through FAQ; there are lots of interesting answers there.

    Updates to s3270, as well as the current status of development and bugs, are available from the x3270 Web Page.

    Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit.

    There is also an x3270 mailing list, which also includes information about s3270, and which receives news about new releases. You can subscribe to this list here. suite3270-3.6/s3270/html/ReleaseNotes.html0000664000076500007650000032733313221600611016171 0ustar pdmpdm s3270 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/s3270/html/Resources.html0000664000076500007650000015112013221600611015537 0ustar pdmpdm s3270 Resources

    s3270 Resources

    Resources are used to configure s3270. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into s3270.
    • If a session file foo.s3270 is specified on the command line, its contents are applied. These definitions override resource values defined by compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example s3270.bsdTm can be set by the following command-line option:
         -xrm "s3270.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file (session file) has the following syntax.
    • Each definition consists of:
          s3270.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.

    Alphabetical Resource List

    Name: s3270.acceptHostname
    Type: String
    Command Line: -accepthostname
    Description:

    Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.)

    Name: s3270.aidWait
    Type: Boolean
    Default: false
    Command Line: -set aidWait , -clear aidWait
    Description:

    When true, s3270 will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll s3270's status until it shows that the keyboard is no longer unlocked.

    Name: s3270.bindLimit
    Type: Boolean
    Default: true
    Description:

    When true, s3270 will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not.

    Name: s3270.bindUnlock
    Type: Boolean
    Default: false
    Description:

    When true, s3270 will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing s3270 to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op.

    Name: s3270.blankFill
    Type: Boolean
    Default: false
    Command Line: -set blankFill , -clear blankFill
    Description:

    When true, in 3270 mode s3270 will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals.

    Name: s3270.bsdTm
    Type: Boolean
    Default: false
    Description:

    Defines s3270's response to the TELNET DO TIMING MARK option. When set to false, s3270 will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, s3270 will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of s3270. In either case, s3270 will never respond to a DONT TIMING MARK option.

    Name: s3270.caDir
    Type: String
    Command Line: -cadir
    Description:

    Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: s3270.caFile
    Type: String
    Command Line: -cafile
    Description:

    Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: s3270.certFile
    Type: String
    Command Line: -certfile
    Description:

    Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by s3270.certFileType. The private key for the certificate is specified by s3270.keyFile. If s3270.chainFile is specified, it overrides s3270.certFile.

    On the Mac, the file must be in PKCS12 format.

    Name: s3270.certFileType
    Type: String
    Default: pem
    Command Line: -certfiletype
    Description:

    Gives the type of the certificate file specified by s3270.certFile. The value can be pem or asn1. (OpenSSL only)

    Name: s3270.chainFile
    Type: String
    Command Line: -chainfile
    Description:

    Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by s3270.keyFile. If s3270.chainFile is specified, it overrides s3270.certFile. (OpenSSL only)

    Name: s3270.charset
    Type: String
    Default: bracket
    Command Line: -charset
    Description:

    This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by s3270, use the -v command-line option.

    Name: s3270.clientCert
    Type: String
    Command Line: -clientcert
    Description:

    Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only)

    Name: s3270.color8
    Type: Boolean
    Default: false
    Description:

    If true, s3270 will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported.

    Name: s3270.confDir
    Type: String
    Default: /usr/local/etc/x3270
    Description:

    Defines the s3270 configuration directory, where s3270 will search for the ibm_hosts file by default. (See s3270.hostsFile.)

    Name: s3270.connectTimeout
    Type: Integer
    Command Line: -connecttimeout
    Description:

    Specifies a timeout, in seconds, that s3270 will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that s3270 will wait for the lesser of the two times (the specified timeout and the system-defined timeout).

    Name: s3270.dbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use s3270.sbcsCgcsgid for the single-byte (SBCS) character set.

    Name: s3270.dftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Deprecated resource -- replaced by s3270.ftBufferSize

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: s3270.devName
    Type: String
    Command Line: -devname
    Description:

    Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: s3270.dsTrace
    Type: Boolean
    Default: false
    Command Line: -trace , -set dsTrace , -clear dsTrace
    Description:

    Deprecated resource -- replaced by s3270.trace

    When true, s3270 writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. The directory where the file is written is defined by s3270.traceDir. If s3270.traceFile is defined, it gives the entire pathname and s3270.traceDir is ignored.

    Name: s3270.eof
    Type: String
    Default: ^D
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when s3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    Name: s3270.erase
    Type: String
    Default: ^?
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (s3270 gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause s3270 to discard the last character on the input line.

    When connected in character-at-a-time mode (s3270 sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action.

    Name: s3270.eventTrace
    Type: Boolean
    Default: false
    Command Line: -set eventTrace , -clear eventTrace
    Description:

    Deprecated resource -- replaced by s3270.trace

    When true, s3270 traces information about keyboard and mouse events into a file. The default file name is x3trc.pid. The directory where the file is written is defined by s3270.traceDir. If s3270.traceFile is defined, it gives the entire pathname and s3270.traceDir is ignored.

    Name: s3270.extended
    Type: Boolean
    Default: false
    Command Line: -extended
    Description:

    Deprecated resource -- replaced by s3270.model syntax

    Indicates support for the 3270 Extended Data Stream.

    Name: s3270.ftAllocation
    Type: String
    Default: default
    Description:

    Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock.

    Name: s3270.ftAvblock
    Type: Integer
    Description:

    Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers.

    Name: s3270.ftBlksize
    Type: Integer
    Description:

    Defines the default block size for files sent to TSO hosts by IND$FILE file transfers.

    Name: s3270.ftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: s3270.ftCr
    Type: String
    Default: auto
    Description:

    Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done.

    Name: s3270.ftDirection
    Type: String
    Default: receive
    Description:

    Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation).

    Name: s3270.ftExist
    Type: String
    Default: keep
    Description:

    Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be aborted, replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file.

    Name: s3270.ftHost
    Type: String
    Default: tso
    Description:

    Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics.

    Name: s3270.ftHostFile
    Type: String
    Description:

    Defines the default host file name for IND$FILE file transfers.

    Name: s3270.ftLocalFile
    Type: String
    Description:

    Defines the default local file name for IND$FILE file transfers.

    Name: s3270.ftLrecl
    Type: Integer
    Description:

    Defines the default logical record length for files sent to the host via IND$FILE.

    Name: s3270.ftMode
    Type: String
    Default: ascii
    Description:

    Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation).

    Name: s3270.ftPrimarySpace
    Type: Integer
    Description:

    Defines the default primary space allocation for files sent to TSO hosts via IND$FILE.

    Name: s3270.ftRecfm
    Type: String
    Default: default
    Description:

    Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format.

    Name: s3270.ftRemap
    Type: String
    Default: yes
    Description:

    Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by s3270 to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37.

    Name: s3270.ftSecondarySpace
    Type: Integer
    Description:

    Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE.

    Name: s3270.hostname
    Type: String
    Description:

    Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over s3270.hostname.

    The most common use of s3270.hostname is in session files, where a file is used to pass all of the options to establish a s3270 session.

    Name: s3270.hostsFile
    Type: String
    Default: /usr/local/etc/x3270/ibm_hosts
    Description:

    The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by s3270.confDir.

    Name: s3270.httpd
    Type: String
    Command Line: -httpd
    Description:

    Defines the TCP port and optional address to listen on for HTTP connections. (s3270 implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: s3270.icrnl
    Type: Boolean
    Default: true
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines.

    Name: s3270.idleCommand
    Type: String
    Description:

    When s3270.idleCommand is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The s3270.idleCommand can be an arbitrary sequence of s3270 actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). s3270.idleCommandEnabled must be true in order for the s3270.idleCommand to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) s3270.idleTimeout specifies the inactivity interval.

    Name: s3270.idleCommandEnabled
    Type: Boolean
    Default: false
    Description:

    Controls whether s3270.idleCommand has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.)

    Name: s3270.idleTimeout
    Type: String
    Default: ~7m
    Description:

    The timeout value for s3270.idleCommand. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified.

    Name: s3270.inlcr
    Type: Boolean
    Default: false
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns.

    Name: s3270.intr
    Type: String
    Default: ^C
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host.

    Name: s3270.keyFile
    Type: String
    Command Line: -keyfile
    Description:

    Gives the name of a file containg the private key for the certificate specified by s3270.certFile or s3270.chainFile. The default file type is PEM; it can be overridden by s3270.keyFileType. If the private key is encrypted, the password is specified by s3270.keyPasswd. (OpenSSL only)

    Name: s3270.keyFileType
    Type: String
    Default: pem
    Command Line: -keyfileType
    Description:

    Gives the type of the private key file specified by s3270.keyFile. The value can be pem or asn1. (OpenSSL only)

    Name: s3270.keyPasswd
    Type: String
    Command Line: -keypasswd
    Description:

    On OpenSSL, gives the password for the private key file specified by s3270.keyFile, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the s3270.certfile certifiate file.

    Name: s3270.kill
    Type: String
    Default: ^U
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when s3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when s3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action.

    Name: s3270.lineWrap
    Type: Boolean
    Default: true
    Command Line: -set lineWrap , -clear lineWrap
    Description:

    This setting is used only in NVT mode. When true, s3270 will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence.

    Name: s3270.loginMacro
    Type: String
    Command Line: -loginmacro
    Description:

    Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a s3270.hostsFile is in use and a matching entry is found, the login macro from that entry will be used in preference to the s3270.loginMacro.

    Name: s3270.lnext
    Type: String
    Default: ^V
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when s3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered.

    Name: s3270.m3279
    Type: Boolean
    Default: true
    Command Line: -color
    Description:

    Deprecated resource -- replaced by s3270.model syntax

    Indicates support for color (a 3279 terminal).

    Name: s3270.minVersion
    Type: String
    Command Line: -minversion
    Description:

    Defines a minimum required version for s3270. If the version of s3270 is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal.

    Name: s3270.model
    Type: String
    Default: 3279-4-E
    Command Line: -model
    Description:

    The terminal model that s3270 is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display.
      3279 specifies a color 3270 display.
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is 4.
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.

    Name: s3270.monoCase
    Type: Boolean
    Default: false
    Command Line: -set monoCase , -clear monoCase
    Description:

    When true, causes s3270 to run in uppercase-only mode.

    Name: s3270.newEnviron
    Type: Boolean
    Default: true
    Description:

    If true, s3270 will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not.

    Name: s3270.nopSeconds
    Type: Integer
    Description:

    If nonzero, s3270 will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity.

    Name: s3270.numericLock
    Type: Boolean
    Default: false
    Description:

    When true, causes s3270 to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute.

    Name: s3270.nvtMode
    Type: Boolean
    Default: false
    Command Line: -nvt
    Description:

    When true, causes s3270 to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname.

    Name: s3270.onlcr
    Type: Boolean
    Default: true
    Description:

    Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences.

    Name: s3270.oerrLock
    Type: Boolean
    Default: true
    Description:

    If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message.

    Name: s3270.once
    Type: Boolean
    Default: false
    Command Line: -once
    Description:

    When true, s3270 will exit as soon as a host disconnects. The default is false if no hostname is specified on the command line, true otherwise.

    Name: s3270.oversize
    Type: String
    Command Line: -oversize
    Description:

    Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. It is used only if the s3270.model includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with s3270 in this mode.

    Name: s3270.port
    Type: String
    Default: telnet
    Command Line: -port
    Description:

    The name of the default TCP port for s3270 to connect to. This can be either a symbolic name from /etc/services, or an integer.

    Name: s3270.proxy
    Type: String
    Command Line: -proxy
    Description:

    Defines a proxy server that s3270 will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the s3270 manual page.

    Name: s3270.qrBgColor
    Type: Boolean
    Default: false
    Description:

    When true, s3270 will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash.

    Name: s3270.quit
    Type: String
    Default: ^\
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when s3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host.

    Name: s3270.rprnt
    Type: String
    Default: ^R
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when s3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed.

    Name: s3270.sbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use s3270.dbcsCgcsgid for the double-byte (DBCS) character set.

    Name: s3270.screenTrace
    Type: Boolean
    Default: false
    Command Line: -set screenTrace , -clear screenTrace
    Description:

    When true, s3270 will save an ASCII version of the screen image in a file every time it changes. The file name defaults to x3scr.pid. The directory where the file is written is defined by s3270.traceDir. If s3270.screenTraceFile is defined, it defines the file name and s3270.traceDir is ignored.

    Name: s3270.screenTraceFile
    Type: String
    Description:

    If defined, gives the name of the file that screen traces will be written into.

    Name: s3270.scriptPort
    Type: Integer
    Command Line: -scriptport
    Description:

    If defined, s3270 will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: s3270.scriptPortOnce
    Type: Boolean
    Default: false
    Command Line: -scriptportonce
    Description:

    If defined, s3270 will accept only one script connection. When that connection is broken, it will exit.

    Name: s3270.socket
    Type: Boolean
    Default: false
    Command Line: -socket
    Description:

    When true, s3270 will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket.

    Name: s3270.startTls
    Type: Boolean
    Default: true
    Description:

    If true, s3270 will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them.

    Name: s3270.suppressActions
    Type: String
    Description:

    A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options.

    Name: s3270.termName
    Type: String
    Command Line: -tn
    Description:

    An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of s3270.model.

    Name: s3270.trace
    Type: Boolean
    Default: false
    Command Line: -trace , -set trace , -clear trace
    Description:

    When true, s3270 writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. The directory where the file is written is defined by s3270.traceDir. If s3270.traceFile is defined, it gives the entire pathname and s3270.traceDir is ignored.

    Name: s3270.traceDir
    Type: String
    Default: /tmp
    Description:

    Defines the directory that trace files are written into.

    Name: s3270.traceFile
    Type: String
    Command Line: -tracefile
    Description:

    If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file.

    Name: s3270.traceFileSize
    Type: String
    Command Line: -tracefilesize
    Description:

    If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started.

    Name: s3270.unlockDelay
    Type: Boolean
    Default: false
    Description:

    When s3270 sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, s3270 can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for s3270.unlockDelayMs milliseconds.

    Name: s3270.unlockDelayMs
    Type: Integer
    Default: 350
    Description:

    Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and s3270 actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros.

    Name: s3270.user
    Type: String
    Command Line: -user
    Description:

    Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: s3270.utf8
    Type: Boolean
    Command Line: -utf8
    Description:

    Forces local I/O to use UTF-8 encoding, regardless of the local codepage.

    Name: s3270.verifyHostCert
    Type: Boolean
    Default: true
    Command Line: -noverifycert , -verifycert
    Description:

    If true (the default), s3270 will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, s3270 will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking.

    Name: s3270.werase
    Type: String
    Default: ^W
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when s3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when s3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action.

    Index of All Resources

    acceptHostname aidWait bindLimit bindUnlock
    blankFill bsdTm caDir caFile
    certFile certFileType chainFile charset
    clientCert color8 confDir connectTimeout
    dbcsCgcsgid dftBufferSize devName dsTrace
    eof erase eventTrace extended
    ftAllocation ftAvblock ftBlksize ftBufferSize
    ftCr ftDirection ftExist ftHost
    ftHostFile ftLocalFile ftLrecl ftMode
    ftPrimarySpace ftRecfm ftRemap ftSecondarySpace
    hostname hostsFile httpd icrnl
    idleCommand idleCommandEnabled idleTimeout inlcr
    intr keyFile keyFileType keyPasswd
    kill lineWrap loginMacro lnext
    m3279 minVersion model monoCase
    newEnviron nopSeconds numericLock nvtMode
    onlcr oerrLock once oversize
    port proxy qrBgColor quit
    rprnt sbcsCgcsgid screenTrace screenTraceFile
    scriptPort scriptPortOnce socket startTls
    suppressActions termName trace traceDir
    traceFile traceFileSize unlockDelay unlockDelayMs
    user utf8 verifyHostCert werase

    Basic Configuration Resources

    charset connectTimeout hostname model
    port proxy

    NVT-Mode Resources

    eof erase icrnl inlcr
    intr kill lineWrap lnext
    onlcr quit rprnt werase

    Protocol Resources

    bindLimit bindUnlock bsdTm color8
    dbcsCgcsgid dftBufferSize devName ftBufferSize
    sbcsCgcsgid termName user

    Terminal Interaction Resources

    blankFill ftAllocation ftAvblock ftBlksize
    ftCr ftDirection ftExist ftHost
    ftHostFile ftLocalFile ftLrecl ftMode
    ftPrimarySpace ftRecfm ftRemap ftSecondarySpace
    idleCommand idleCommandEnabled idleTimeout nopSeconds
    numericLock nvtMode oerrLock

    Security Resources

    acceptHostname caDir caFile certFile
    certFileType chainFile clientCert keyFile
    keyFileType keyPasswd startTls suppressActions
    verifyHostCert

    Tracing Resources

    dsTrace eventTrace screenTrace screenTraceFile
    trace traceDir traceFile traceFileSize

    Other Resources

    aidWait confDir hostsFile httpd
    loginMacro minVersion monoCase newEnviron
    once oversize qrBgColor scriptPort
    scriptPortOnce socket unlockDelay unlockDelayMs
    utf8

    Deprecated Resources

    extended m3279

    s3270 version 3.6ga4 Fri Dec 29 21:01:29 CST 2017 suite3270-3.6/s3270/html/s3270-man.html0000664000076500007650000013323513221600611015123 0ustar pdmpdm s3270 Manual Page

    s3270 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Character Sets
    NVT Mode
    Toggles
    Actions
    File Transfer
    The PrintText Action
    Nested Scripts
    Passthru
    Proxy
    Resources
    Files
    See Also
    Copyrights
    Version

    Name

    s3270 - IBM host access tool

    Synopsis

    s3270 [options] [host]
    s3270 [options] session-file.s3270

    Description

    s3270 opens a telnet connection to an IBM host, then allows a script to control the host login session. It is derived from x3270(1), an X-windows IBM 3270 emulator. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The full syntax for host is:
    [prefix:]...[LUname@]hostname[:port][=accept]

    Prepending a P: onto hostname causes the connection to go through the telnet-passthru service rather than directly to the host. See PASSTHRU below.

    Prepending an S: onto hostname removes the "extended data stream" option reported to the host. See -tn below for further information.

    Prepending an N: onto hostname turns off TN3270E support for the session.

    Prepending an L: onto hostname causes s3270 to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if s3270 was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the L: prefix should not be used.

    Prepending a Y: onto hostname causes s3270 to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options.

    Prepending an A: onto hostname is equivalent to setting the -nvt option; it forces an NVT-mode session instead of a 3270-mode session.

    A specific Logical Unit (LU) name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.)

    The hostname may optionally be placed inside square-bracket characters `[' and `]'. This will prevent any colon `:' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames.

    On systems that support the forkpty library call, the hostname may be replaced with -e and a command string. This will cause s3270 to connect to a local child process, such as a shell.

    The port to connect to defaults to telnet. This can be overridden with the -port option, or by appending a port to the hostname with a colon `:'. (For compatability with previous versions of s3270 and with tn3270(1), the port may also be specified as a second, separate argument.)

    An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`='). The accept name can also be specified with the -accepthostname option.

    Options

    s3270 understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
    -cadir directory
    Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -cafile filename
    Specifies a PEM-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -certfile filename
    Specifies a file containing a client certificate to provide to the host. The default file type is PEM.
    -clientcert name
    Specifies the name of a client certificate to provide to the host. (MacOS only)
    -certfiletype type
    Specifies the type of the certificate file specified by -certfile. Type can be pem or asn1. (OpenSSL only)
    -chainfile filename
    Specifies a certificate chain file in PEM format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If -chainfile is specified, it overrides -certfile. (OpenSSL only)
    -charset name
    Specifies an EBCDIC host character set. See CHARACTER SETS below.
    -clear toggle
    Sets the initial value of toggle to false. The list of toggle names is under TOGGLES below.
    -connecttimeout seconds
    Specifies the time that s3270 will wait for a host connection to complete.
    -devname name
    Specifies a device name (workstation ID) for RFC 4777 support.
    -httpd [addr:]port
    Specifies a port and optional address to listen on for HTTP connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080.

    Note that this option is mutually-exclusive with the -scriptport option and disables reading commands from standard input.

    -keyfile filename
    Specifies a file containing the private key for the certificate file (specified via -certfile or -chainfile). The default file type is PEM. (OpenSSL only)
    -keyfiletype type
    Specifies the type of the private key file specified by -keyfile. Type can be pem or asn1. (OpenSSL only)
    -keypasswd type:value
    Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be file:filename, specifying that the password is in a file, or string:string, specifying the password on the command-line directly. If the private key file is encrypted and no -keypasswd option is given, secure connections will not be allowed.
    -km name
    Specifies the local encoding method for multi-byte text. name is an encoding name recognized by the ICU library. (Supported only when s3270 is compiled with DBCS support, and necessary only when s3270 cannot figure it out from the locale.)
    -loginmacro Action(arg...) ...
    Specifies a macro to run at login time.
    -minversion version
    The minimum required version of s3270, e.g., 3.6ga4. If the running version is less than the specified version, s3270 will abort. The format of a version is major.minortypeiteration. type is ignored, and minor and iteration can be omitted.
    -model name
    The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted:

    The first part is the base model, which is either 3278 or 3279. 3278 specifies a monochrome (green on black) 3270 display; 3279 specifies a color 3270 display.

    The second part is the model number, which specifies the number of rows and columns. Model 4 is the default.

    Model Number
    Columns
    Rows
    2
    80
    24
    3
    80
    32
    4
    80
    43
    5
    132
    27

    Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway.

    The default model is 3279-4.

    -noverifycert
    For SSL/TLS connections, do not verify the host certificate.
    -nvt
    Start in NVT mode instead of waiting for the host to send data, and make the default terminal type xterm.
    -oversize colsxrows
    Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "s3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing.
    -port n
    Specifies a different TCP port to connect to. n can be a name from /etc/services like telnet, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.)
    -proxy type:host[:port]
    Causes s3270 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -scriptport [addr:]port
    Specifies a port and optional address to listen on for scripting connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081.

    Note that this option is mutually-exclusive with the -httpd option and disables reading commands from standard input.

    -scriptportonce
    Allows s3270 to accept only one script connection. When that connection is broken, s3270 will exit.
    -set toggle
    Sets the initial value of toggle to true. The list of toggle names is under TOGGLES below.
    -socket
    Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named /tmp/x3sck.pid. The -p option of x3270if causes it to use this socket, instead of pipes specified by environment variables.
    -tn name
    Specifies the terminal name to be transmitted over the telnet connection. The default name is IBM-model_name-E, for example, IBM-3278-4-E.

    Some hosts are confused by the -E suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an s: on the hostname, or setting the "s3270.extended" resource to "false", removes the -E from the terminal name when connecting to such hosts.

    The name can also be specified with the "s3270.termName" resource.

    -trace
    Turns on data stream and event tracing at startup. The default trace file name is /tmp/x3trc.
    -tracefile file
    Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file.
    -tracefilesize size
    Places a limit on the size of a trace file. If this option is not specified, or is specified as 0 or none, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of size can have a K or M suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started.
    -user name
    Specifies the user name for RFC 4777 support.
    -utf8
    Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage.
    -v
    Display the version and build options for s3270 and exit.
    -verifycert
    For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a y: prepended to the hostname when connecting.
    -xrm "s3270.resource: value"
    Sets the value of the named resource to value. Resources control less common s3270 options, and are defined under RESOURCES below.

    Character Sets

    The -charset option or the "s3270.charset" resource controls the EBCDIC host character set used by s3270. Available sets include:

    Charset Name
    Host Code Page
    Character Set
    belgian
    500
    iso8859-1
    belgian-euro
    1148
    iso8859-15
    bracket
    037
    iso8859-1
    brazilian
    275
    iso8859-1
    chinese-gb18030
    1388
    iso8859-1 + iso10646-1
    cp1047
    1047
    iso8859-1
    cp870
    870
    iso8859-2
    finnish
    278
    iso8859-1
    finnish-euro
    1143
    iso8859-15
    french
    297
    iso8859-1
    french-euro
    1147
    iso8859-15
    german
    273
    iso8859-1
    german-euro
    1141
    iso8859-15
    greek
    423
    iso8859-7
    hebrew
    424
    iso8859-8
    icelandic
    871
    iso8859-1
    icelandic-euro
    1149
    iso8859-15
    italian
    280
    iso8859-1
    italian-euro
    1144
    iso8859-15
    japanese-kana
    930
    jisx0201.1976-0 + jisx0208.1983-0
    japanese-latin
    939
    jisx0201.1976-0 + jisx0208.1983-0
    norwegian
    277
    iso8859-1
    norwegian-euro
    1142
    iso8859-15
    russian
    880
    koi8-r
    simplified-chinese
    935
    iso8859-1 + gb2312.1980-0
    slovenian
    870
    iso8859-2
    spanish
    284
    iso8859-1
    spanish-euro
    1145
    iso8859-15
    swedish
    278
    iso8859-1
    swedish-euro
    1143
    iso8859-15
    thai
    1160
    iso8859-11 tis620.2529-0
    traditional-chinese
    937
    iso8859-1 + Big5-0
    turkish
    1026
    iso8859-9
    uk
    285
    iso8859-1
    uk-euro
    1146
    iso8859-15
    us-euro
    1140
    iso8859-15
    us-intl
    037
    iso8859-1

    The default character set is bracket, which is useful for common U.S. IBM hosts which use EBCDIC codes AD and BD for the `[' and `]' characters, respectively.

    Note that any of the host code pages listed above can be specified by adding cp to the host code page, e.g., cp037 for host code page 037. Also note that the code pages available for a given version of s3270 are displayed by the -v command-line option.

    NVT Mode

    Some hosts use an ASCII front-end to do initial login negotiation, then later switch to 3270 mode. s3270 will emulate an ANSI X3.64 terminal until the host places it in 3270 mode (telnet BINARY and SEND EOR modes, or TN3270E mode negotiation).

    If the host later negotiates to stop functioning in 3270 mode, s3270 will return to NVT emulation.

    In NVT mode, s3270 supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources:

    Mode/Character Resource Default
    Translate CR to NL s3270.icrnl true
    Translate NL to CR s3270.inlcr false
    Erase previous character s3270.erase ^?
    Erase entire line s3270.kill ^U
    Erase previous word s3270.werase ^W
    Redisplay line s3270.rprnt ^R
    Ignore special meaning of next character s3270.lnext ^V
    Interrupt s3270.intr ^C
    Quit s3270.quit ^\
    End of file s3270.eof ^D

    Toggles

    s3270 has a number of configurable modes which may be selected by the -set and -clear options. These names can also be used as the first parameter to the Toggle action, and are the names of resources that can be used to set or clear the value of each toggle at start-up.
    aidWait
    Changes the behavior of actions that send an AID to the host (Enter, Clear, PA and PF). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the Wait(Unlock) action to wait for the unlock.
    blankFill
    If set, s3270 modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying `lock-up' that often occurs when inserting into an field with (apparent) space at the end.
    lineWrap
    If set, the NVT terminal emulator automatically assumes a NEWLINE character when it reaches the end of a line.
    screenTrace
    Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file .
    trace
    Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file . The directory for the trace file can be changed with the "s3270.traceDir" resource. Script commands are also traced.

    Actions

    Here is a complete list of basic s3270 actions. Script-specific actions are described on the x3270-script(1) manual page. )

    Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response.

    *Attn attention key
    BackSpace move cursor left (or send ASCII BS)
    BackTab tab to start of previous input field
    CircumNot input "^" in NVT mode, or "¬" in 3270 mode
    *Clear clear screen
    *Connect(host) connect to host
    *CursorSelect Cursor Select AID
    Delete delete character under cursor (or send ASCII DEL)
    DeleteField delete the entire field
    DeleteWord delete the current or previous word
    *Disconnect disconnect from host
    Down move cursor down
    Dup duplicate field
    *Enter Enter AID (or send ASCII CR)
    Erase erase previous character (or send ASCII BS)
    EraseEOF erase to end of current field
    EraseInput erase all input fields
    Execute(cmd) execute a command in a shell
    FieldEnd move cursor to end of field
    FieldMark mark field
    HexString(hex_digits) insert control-character string
    Home move cursor to first input field
    Insert set insert mode
    *Interrupt send TELNET IP to host
    Key(keysym) insert key keysym
    Key(0xxx) insert key with character code xx
    Left move cursor left
    Left2 move cursor left 2 positions
    MonoCase toggle uppercase-only mode
    MoveCursor(row, col) move cursor to zero-origin (row,col)
    Newline move cursor to first field on next line (or send ASCII LF)
    NextWord move cursor to next word
    *PA(n) Program Attention AID (n from 1 to 3)
    *PF(n) Program Function AID (n from 1 to 24)
    PreviousWord move cursor to previous word
    PrintText(command) print screen text on printer
    Quit exit s3270
    Redraw redraw window
    Reset reset locked keyboard
    Right move cursor right
    Right2 move cursor right 2 positions
    *Script(command[,arg...]) run a script
    *String(string) insert string (simple macro facility)
    Tab move cursor to next input field
    Toggle(option[,set|clear]) toggle an option
    ToggleInsert toggle insert mode
    ToggleReverse toggle reverse-input mode
    *Transfer(option=value...') file transfer
    Up move cursor up

    Note that certain parameters to s3270 actions (such as the names of files and keymaps) are subject to substitutions:

    The character ~ at the beginning of a string is replaced with the user's home directory. A ~ character followed by a username is replaced with that user's home directory.

    Environment variables are substituted using the Unix shell convention of $name or ${name}.

    Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes s3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes s3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the s3270.ftMode resource.

    The PrintText Action

    The PrintText produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., lpr.

    Multiple arguments can include keywords to control the output of PrintText:

    file filename
    Save the output in a file.
    html
    Save the output as HTML. This option implies file.
    rtf
    Save the output as RichText. This option implies file. The font defaults to Courier New and the point size defaults to 8. These can be overridden by the printTextFont and printTextSize resources, respectively.
    string
    Return the output as a string. This can only be used from scripts.
    modi
    Render modified fields in italics.
    caption text
    Add the specified text as a caption above the output. Within text, the special sequence %T% will be replaced with a timestamp.
    command command
    Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer.

    Nested Scripts

    There are several types of nested script functions available.
    The String Action
    The simplest method for nested scripts is provided via the String action. The arguments to String are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the AID code to the host, s3270 will wait for the host to unlock the keyboard before further processing the string.)
    \b Left
    \exxxx EBCDIC character in hex
    \f Clear*
    \n Enter*
    \pan PA(n)*
    \pfnn PF(nn)*
    \r Newline
    \t Tab
    \T BackTab
    \uxxxx Unicode character in hex
    \xxxxx Unicode character in hex

    Note that the numeric values for the \e, \u and \x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if s3270 is built with DBCS support and the host allows DBCS input in the current field.

    Note: The strings are in ASCII and converted to EBCDIC, so beware of inserting control codes.

    There is also an alternate form of the String action, HexString, which is used to enter non-printing data. The argument to HexString is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent EBCDIC characters, which are entered into the current field. In NVT mode, the hexadecimal data represent ASCII characters, which are sent directly to the host.

    The Script Action
    This action causes s3270 to start a child process which can execute s3270 actions. Standard input and output from the child process are piped back to s3270. The Script action is fully documented in x3270-script(1).

    Passthru

    s3270 supports the Sun telnet-passthru service provided by the in.telnet-gw server. This allows outbound telnet connections through a firewall machine. When a p: is prepended to a hostname, s3270 acts much like the itelnet(1) command. It contacts the machine named internet-gateway at the port defined in /etc/services as telnet-passthru (which defaults to 3514). It then passes the requested hostname and port to the in.telnet-gw server.

    Proxy

    The -proxy option or the s3270.proxy resource causes s3270 to use a proxy server to connect to the host. The syntax of the option or resource is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    Resources

    Certain s3270 options can be configured via resources. Resources are defined by -xrm options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in s3270 are:

    Resource Default Option Purpose
    blankFill False -set blankFill Blank Fill mode
    charset bracket -charset EBCDIC character set
    dbcsCgcsgid     Override DBCS CGCSGID
    dsTrace False -trace Data stream tracing
    eof ^D   NVT-mode EOF character
    erase ^H   NVT-mode erase character
    extended True   Use 3270 extended data stream
    eventTrace False -trace Event tracing
    icrnl False   Map CR to NL on NVT-mode input
    inlcr False   Map NL to CR in NVT-mode input
    intr ^C   NVT-mode interrupt character
    kill ^U   NVT-mode kill character
    lineWrap False -set lineWrap NVT line wrap mode
    lnext ^V   NVT-mode lnext character
    m3279 (note 1) -model 3279 (color) emulation
    monoCase False -set monoCase Mono-case mode
    numericLock False   Lock keyboard for numeric field error
    oerrLock False   Lock keyboard for input error
    oversize   -oversize Oversize screen dimensions
    port telnet -port Non-default TCP port
    quit ^\   NVT-mode quit character
    rprnt ^R   NVT-mode reprint character
    sbcsCgcsgid     Override SBCS CGCSGID
    secure False   Disable "dangerous" options
    termName (note 2) -tn TELNET terminal type string
    traceDir /tmp   Directory for trace files
    traceFile (note 3) -tracefile File for trace output
    werase ^W   NVT-mode word-erase character

    Note 1: m3279 defaults to False. It can be forced to True with the proper -model option.

    Note 2: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as IBM-3279-2-E. Note also that when TN3270E mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities.

    Note 3: The default trace file is x3trc.pid in the directory specified by the traceDir resource.

    If more than one -xrm option is given for the same resource, the last one on the command line is used.

    Files

    /usr/local/lib/x3270/ibm_hosts

    See Also

    x3270-script(1), x3270(1), c3270(1), tcl3270(1), telnet(1), tn3270(1)
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    s3270 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/s3270/html/SSL.html0000664000076500007650000002103713221600611014231 0ustar pdmpdm s3270 and TLS

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/s3270/html/Unix-x3270if.html0000664000076500007650000001606413221600611015617 0ustar pdmpdm x3270if Manual Page

    x3270if Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Exit Status
    Environment
    See Also
    Copyright

    Name

    x3270if - command interface to x3270, c3270 and s3270

    Synopsis

    x3270if [option]... [ action ]
    x3270if -i

    Description

    x3270if provides an interface between scripts and the 3270 emulators x3270, c3270 and s3270.

    x3270if operates in one of two modes. In action mode, it passes a single action and parameters to the emulator for execution. The result of the action is written to standard output, along with the (optional) status of the emulator. (The action is optional as well, so that x3270if can just reports the emulator status.) In iterative mode, it forms a continuous conduit between a script and the emulator.

    The action takes the form:

    action-name(param[,param]...)

    The parentheses are manatory, and usually must be quoted when x3270if is called from a shell script.

    If any param contains a space or comma, it must be surrounded by double quotes.

    Options

    -s field
    Causes x3270if to write to stdout the value of one of the emulator status fields. Field is an integer in the range 0 through 11. The value 0 is a no-op and is used only to return exit status indicating the state of the emulator. The indices 1-11 and meanings of each field are documented on the x3270-script(1) manual page. If an action is specified as well, the status field is written after the output of the action, separated by a newline. The -s option is mutually exclusive with the -S and -i options.
    -S
    Causes x3270if to write to stdout the value of all of the emulator status fields. If an action is specified as well, the status fields are written after the output of the action, separated by a newline. The -S option is mutually exclusive with the -s and -i options.
    -i
    Puts x3270if in iterative mode. Data from x3270if's standard input is copied to the emulator's script input; data from the emulator's script output is copied to x3270if's standard output. The -i option is mutually exclusive with the -s and -S options. x3270if runs until it detects end-of-file on its standard input or on the output from the emulator. (This mode exists primarily to give expect(1) a process to run, on systems which do not support bidirectional pipes.)
    -p process-id
    Causes x3270if to use a Unix-domain socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the -socket option.
    -t port
    Causes x3270if to use a TCP socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the -scriptport option.
    -v
    Turns on verbose debug messages, showing on stderr the literal data that is passed between the emulator and x3270if.

    Exit Status

    In action mode, if the requested action succeeds, x3270if exits with status 0. If the action fails, x3270if exits with status 1. In iterative mode, x3270if exits with status 0 when it encounters end-of-file. If there is an operational error within x3270if itself, such as a command-line syntax error, missing environment variable, or an unexpectedly closed pipe, x3270if exits with status 2.

    Environment

    When a script is run as a child process of one of the emulators via the Script action, the emulator passes information about how to control it in environment variables.

    On Unix, the emulator process creates a pair of pipes for communication with the child script process. The values of the file descriptors for these pipes are encoded as text in two environment variables:

    X3270OUTPUT
    Output from the emulator, input to the child process.
    X3270INPUT
    Input to the emulator, output from the child process.

    When an emulator is started with the -scriptport option, the emulator will pass the scriptport port number encoded as text in the X3270PORT environment variable. x3270if will use that value as if it had been passed to it via the -t option. X3270PORT takes precedence over X3270OUTPUT and X3270INPUT.

    See Also

    x3270(1), c3270(1), s3270(1), x3270-script(1)

    Copyright

    Copyright © 1999-2009, 2017 Paul Mattes.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES `AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/s3270/html/Wishlist.html0000664000076500007650000000123513221577163015413 0ustar pdmpdm The s3270 Wish List

    The s3270 Wish List

    Here is a list of some of the more interesting suggestions and requests made for s3270. You may also take this as a list of functions that are definitely not in this version of s3270.

    There is no guarantee that anyone is actively working on these, but feel free to yourself...

    • (nothing at the moment...)
    suite3270-3.6/s3270/html/x3270-script.html0000664000076500007650000010016313221600611015653 0ustar pdmpdm x3270-script Manual Page

    x3270-script Manual Page

    Contents

    Name
    Synopsis
    Description
    Status Format
    Differences
    Basic Programming Strategies
    Script-Specific Actions
    File Transfer
    See Also
    Version

    Name

    Scripting Facilities for x3270, c3270 and s3270

    Synopsis

    x3270 -script [ x3270-options ]
    x3270 -socket [ x3270-options ]
    x3270 -scriptport port [ x3270-options ]
    c3270 -socket [ c3270-options ]
    c3270 -scriptport port [ s3270-options ]
    s3270 [ s3270-options ]
    Script ( command [ ,arg... ] )

    Description

    The x3270 scripting facilities allow the interactive 3270 emulators x3270 and c3270 to be operated under the control of another program, and forms the basis for the script-only emulator s3270.

    There are four basic scripting methods. The first is the peer script facility, invoked by the x3270 -script switch, and the default mode for s3270. This runs the emulator as a child of another process. Typically this would be a script using expect(1), perl(1), or the co-process facility of the Korn Shell ksh(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output.

    The second method is the child script facility, invoked by the emulator's Script action. This runs a script as a child process of the emulator. The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT.

    The third method uses a TCP socket. The -scrpiptport command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection.

    The fourth method uses a Unix-domain socket. The -socket command-line option causes the emulator to create a Unix-domain stream socket named /tmp/x3sck.pid. The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection.

    It is possible to nest the methods. For example, a peer or TCP socket script can invoke the Script action. The calling script will be resumed when the nested script completes.

    Commands are emulator actions; the syntax is the same as for the right-hand side of an x3270 or c3270 keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with # or ! is treaded as a comment and will be ignored.

    Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script.

    Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error".

    Status Format

    The status message consists of 12 blank-separated fields:
    1 Keyboard State
    If the keyboard is unlocked, the letter U. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter L. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter E.
    2 Screen Formatting
    If the screen is formatted, the letter F. If unformatted or in NVT mode, the letter U.
    3 Field Protection
    If the field containing the cursor is protected, the letter P. If unprotected or unformatted, the letter U.
    4 Connection State
    If connected to a host, the string C(hostname). Otherwise, the letter N.
    5 Emulator Mode
    If connected in 3270 mode, the letter I. If connected in NVT line mode, the letter L. If connected in NVT character mode, the letter C. If connected in unnegotiated mode (no BIND active from the host), the letter P. If not connected, the letter N.
    6 Model Number (2-5)
    7 Number of Rows
    The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model.
    8 Number of Columns
    The current number of columns defined on the screen, subject to the same difference for rows, above.
    9 Cursor Row
    The current cursor row (zero-origin).
    10 Cursor Column
    The current cursor column (zero-origin).
    11 Window ID
    The X window identifier for the main x3270 window, in hexadecimal preceded by 0x. For s3270 and c3270, this is zero.
    12 Command Execution Time
    The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash.

    Differences

    When an action is initiated by a script, the emulators behave in several different ways:

    If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output.

    If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the CloseScript action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the Script action to complete.

    The Quit action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.)

    Normally, the AID actions (Clear, Enter, PF, and PA) will not complete until the host unlocks the keyboard. If the parameter to a String action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding.

    The AidWait toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The Wait(Output) action can then be used to delay a script until the host changes something on the screen, and the Wait(Unlock) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the AidWait toggle.

    Note that the Script action does not complete until end-of-file is detected on the pipe or the CloseScript action is called by the child process. This behavior is not affected by the state of the AidWait toggle.

    Basic Programming Strategies

    3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete.

    Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the Snap action. The Snap(Save) action saves a snapshot of the screen in a special buffer. Then the script can use Snap variants of the Ascii and Ebcdic actions (Snap(Ascii) and Snap(Ebcdic)) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, Snap(Wait Output) blocks the script until the host modifies the screen, specifically since the last call to Snap(Save). Thus a script can poll the screen efficiently by writing a loop that begins with Snap(Save) and ends with Snap(Wait Output).

    Script-Specific Actions

    The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, row and col coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]).
    AnsiText
    Outputs whatever data that has been output by the host in NVT mode since the last time that AnsiText was called. The data is preceded by the string "data: ", and has had all control characters expanded into C backslash sequences.

    This is a convenient way to capture NVT mode output in a synchronous manner without trying to decode the screen contents.

    Ascii(row,col,rows,cols)
    Ascii(row,col,length)
    Ascii(length)
    Ascii
    Outputs an ASCII text representation of the screen contents. Each line is preceded by the string "data: ", and there are no control characters.

    If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.)

    If three parameters are given, length characters are output, starting at the specified zero-origin row and column.

    If only the length parameter is given, that many characters are output, starting at the cursor position.

    If no parameters are given, the entire screen is output.

    The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the -charset option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f.

    AsciiField
    Outputs an ASCII text representation of the field containing the cursor. The text is preceded by the string "data: ".
    Connect(hostname)
    Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails.
    CloseScript(status)
    Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the Script action, the optional status is used as the return status of Script; if nonzero, Script will complete with an error, and if this script was invoked as part of login through the ibm_hosts file, the connection will be broken.
    ContinueScript([param])
    Allows a script that is waiting in a PauseScript action, below, to continue. The optional param string is output by the PauseScript action.
    Disconnect
    Disconnects from the host.
    Ebcdic(row,col,rows,cols)
    Ebcdic(row,col,length)
    Ebcdic(length)
    Ebcdic
    The same function as Ascii above, except that rather than generating ASCII text, each character is output as a 2-digit or 4-digit hexadecimal EBCDIC code.
    EbcdicField
    The same function as AsciiField above, except that it generates hexadecimal EBCDIC codes.
    Info(message)
    In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270.
    Expect(text[,timeout])
    Pauses the script until the specified text appears in the data stream from the host, or the specified timeout (in seconds) expires. If no timeout is specified, the default is 30 seconds. Text can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. Expect is valid only in NVT mode.
    MoveCursor(row,col)
    Moves the cursor to the specified zero-origin coordinates.
    PauseScript
    Stops a script until the ContinueScript action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to ContinueScript, if one is given.
    PrintText([command,]filter)
    Pipes an ASCII representation of the current screen image through the named filter, e.g., lpr.
    PrintText([html,][append,][replace,]file,filename)
    Saves the current screen contents in a file. With the html option, saves it as HTML, otherwise saves it as plain ASCII. The append option (the default) causes the data to be appended to the file if it already exists. The replace option causes the file to be overwritten instead.
    PrintText(html,string)
    Returns the current screen contents as HTML.
    Query(keyword)
    Returns state information. Keywords are:

    Keyword Output
    BindPluName BIND PLU returned by the host
    ConnectionState TN3270/TN3270E mode and submode
    CodePage Host code page
    Cursor Cursor position (row col)
    Formatted 3270 format state (formatted or unformatted)
    Host Host name and port
    LocalEncoding Local character encoding
    LuName Host name LU name
    Model 3270 model name (IBM-327x-n)
    ScreenCurSize Current screen size (rows cols)
    ScreenMaxSize Maximum screen size (rows cols)
    Ssl SSL state (secure or not-secure) and host validation state (host-verified or host-unverified)

    Without a keyword, Query returns each of the defined attributes, one per line, labeled by its name.

    ReadBuffer(Ascii)
    Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as SF(aa=nn[,...]), where aa is a field attribute type and nn is its value.

    Attribute
    Values
    c0 basic 3270
    20 protected
    10 numeric
    04 detectable
    08 intensified
    0c non-display
    01 modified
    41 highlighting
    f1 blink
    f2 reverse
    f4 underscore
    f8 intensify
    42 foreground
    f0 neutral black
    f1 blue
    f2 red
    f3 pink
    f4 green
    f5 turquoise
    f6 yellow
    f7 neutral white
    f8 black
    f9 deep blue
    fa orange
    fb purple
    fc pale green
    fd pale turquoise
    fe grey
    ff white
    43 character set
    f0 default
    f1 APL
    f8 DBCS

    Extended attributes (which do not take up display positions) are output as SA(aa=nn), with aa and nn having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute).

    In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks.

    ReadBuffer(Ebcdic)
    Equivalent to ReadBuffer(Ascii), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as GE(xx).
    Script(path[,arg...])
    Runs a child script, passing it optional command-line arguments. path must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the Source action.
    Snap
    Equivalent to Snap(Save) (see below).
    Snap(Ascii,...)
    Performs the Ascii action on the saved screen image.
    Snap(Cols)
    Returns the number of columns in the saved screen image.
    Snap(Ebcdic,...)
    Performs the Ebcdic action on the saved screen image.
    Snap(ReadBuffer)
    Performs the ReadBuffer action on the saved screen image.
    Snap(Rows)
    Returns the number of rows in the saved screen image.
    Snap(Save)
    Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other Snap actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically.
    Snap(Status)
    Returns the status line from when the screen was last saved.
    Snap(Wait[,timeout],Output)
    Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an Enter, PF or PA action), but has not finished updating the screen. This action is usually invoked in a loop that uses the Snap(Ascii) or Snap(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Snap action. The default is to wait indefinitely.

    Source(file)
    Read and execute commands from file. Any output from those commands will become the output from Source. If any of the commands fails, the Source command will not abort; it will continue reading commands until EOF.
    Title(text)
    Changes the x3270 window title to text.
    Transfer(keyword=value,...)
    Invokes IND$FILE file transfer. See FILE TRANSFER below.
    Wait([timeout,] 3270Mode)
    Used when communicating with a host that switches between NVT mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(3270) is equivalent to Wait(3270Mode)

    Wait([timeout,] Disconnect)
    Pauses the script until the host disconnects. Often used to after sending a logoff command to a VM/CMS host, to ensure that the session is not unintentionally set to disconnected state.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] InputField)
    A useful utility for use at the beginning of scripts and after the Connect action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In NVT mode, waits until the host sends at least one byte of data.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait is equivalent to Wait(InputField).

    Wait([timeout,] NVTMode)
    Used when communicating with a host that switches between 3270 mode and NVT mode. Pauses the script or macro until the host negotiates NVT mode, then waits for a byte from the host as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(ansi) is equivalent to Wait(NVTMode).

    Wait([timeout,] Output)
    Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a Clear, Enter, PF or PA action), but has not finished updating the screen. Also used in non-blocking AID mode (see DIFFERENCES for details). This action is usually invoked in a loop that uses the Ascii or Ebcdic action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] Unlock)
    Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (toggle AidWait clear), to wait for a host command to complete. See DIFFERENCES for details).

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait(timeout, Seconds)
    Delays the script timeout seconds. Unlike the other forms of Wait, the timeout is not optional.
    WindowState(mode)
    If mode is Iconic, changes the x3270 window into an icon. If mode is Normal, changes the x3270 window from an icon to a normal window.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes s3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes s3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the s3270.ftMode resource.

    See Also

    expect(1)
    perl(1)
    ksh(1)
    x3270(1)
    x3270if(1)
    c3270(1)
    s3270(1)

    Version

    Version 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/s3270/html/x3270.xbm0000664000076500007650000000434413221577163014216 0ustar pdmpdm#define x3270_width 50 #define x3270_height 50 static unsigned char x3270_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xaf, 0xfe, 0xff, 0xe7, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xfa, 0xff, 0xff, 0xbf, 0x0f, 0x00, 0x78, 0xed, 0x62, 0x0c, 0x73, 0x0f, 0x00, 0xf8, 0x5a, 0xdf, 0x7b, 0xad, 0x0f, 0x00, 0x78, 0xb5, 0xe7, 0xbc, 0x6d, 0x0f, 0x00, 0xf8, 0x5a, 0x5f, 0xdf, 0xed, 0x0f, 0x00, 0x78, 0xed, 0x62, 0xd8, 0x73, 0x0f, 0x00, 0xf8, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x43, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x10, 0x44, 0x44, 0x44, 0x84, 0x42, 0x00, 0x08, 0x11, 0x11, 0x11, 0x41, 0x42, 0x00, 0x84, 0x88, 0x88, 0x88, 0x48, 0x42, 0x00, 0x24, 0x22, 0x22, 0x22, 0x22, 0xfe, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; suite3270-3.6/s3270/ibm_hosts.man.m40000664000076500007650000001122513221577163014756 0ustar pdmpdmdnl Copyright (c) 1994-2009, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(IBM_HOSTS,5,XX_DATE) XX_SH(Name) ibm_hosts XX_DASHED() host database for x3270 and c3270 XX_SH(Synopsis) /usr/lib/X11/x3270/ibm_hosts XX_SH(Description) The XX_FB(ibm_hosts) file contains information regarding IBM hosts on the network. An XX_FI(IBM host) is a host which can communicate with a 3270 terminal emulator such as XX_FB(x3270) or XX_FB(c3270). Each line defines a name in the following format (optional fields are shown in brackets): XX_LP XX_FI(name) XX_FI(type) [XX_FI(opt):]...[XX_FI(luname)@]XX_FI(hostname)[:XX_FI(port)] [XX_FI(actions)] XX_LP Items are separated by any number of blanks and/or TAB characters. A line beginning with `#' is taken as a comment (note that `#' anywhere else on a line does XX_FI(not) indicate a comment). XX_LP The XX_FI(name) field is a mnemonic used to identify the host. XX_LP The XX_FI(type) field is a keyword that indicates the type of entry. The value XX_FB(primary) means that the XX_FI(name) will be included in host-selection menus that may be displayed by a 3270 emulator. The value XX_FB(alias) means that the XX_FI(name) will not be included in menus, but will still be accepted as valid input when a host name is required. XX_LP The XX_FI(hostname) field is the Internet hostname or dot-notation Internet address of the host. XX_LP The XX_FI(hostname) can `include' ``s:'' or ``p:'' prefixes, e.g., XX_FB(s:finicky) (see the XX_LINK(x3270-man.html,XX_FI(x3270)(1)) or XX_LINK(c3270-man.html,XX_FI(c3270)(1)) man page sfor details). It can also include an LU name, separated by an ``@'' character, e.g., XX_FB(oddlu@bluehost). Finally, it can include a non-default XX_FI(port) number, appended to the XX_FI(hostname) with a colon ``:'' character, e.g., XX_FB(bluehost:97). (For compatability with earlier versions of XX_FI(x3270), the XX_FI(port) can also be separated by a slash ``/'' character.) XX_LP The optional XX_FI(actions) field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., XX_FB(PF(1)), it is unmodified; otherwise it is taken as the parameter to the XX_FB(String()) action. The XX_FI(actions) are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. XX_SH(Example) Given the following XX_FB(ibm_hosts) file: XX_LP XX_RS(`mvs primary mvs-host XX_BR tso alias mvs-host XX_BR mvs2 primary mvs-host:4012 XX_BR vm primary vtam Tab() String(3) Enter() ') A 3270 emulator will display four names (XX_FB(mvs), XX_FB(mvs2), XX_FB(afhost) and XX_FB(vm)) on its hosts menu. The names XX_FB(mvs) and XX_FB(tso) will cause connections to the host XX_FB(mvs-host). The name XX_FB(mvs2) will also cause a connection to XX_FB(mvs-host), but to port 4012 rather than the emulator's default port (usually 23). The name XX_FB(vm) will cause the 3270 emulator to connect to the host XX_FB(vtam) (presumably some sort of host-selection front-end), enter the string ``3'' on the second data-entry field on the screen, and send the Enter XX_SM(AID) sequence. XX_SH(Files) /usr/lib/X11/x3270/ibm_hosts XX_SH(See Also) XX_LINK(x3270-man.html,x3270(1)), XX_LINK(c3270-man.html,c3270(1)) suite3270-3.6/s3270/LICENSE0000664000076500007650000000342613221577163012764 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/s3270/m4man0000775000076500007650000000342013221577163012713 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/s3270/Makefile.aux0000664000076500007650000000674613221577163014223 0ustar pdmpdm# Copyright (c) 1995-2011, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for s3270 PRODUCT=s3270 all: @echo "Must pick a specific make target." # Development tools. include s3270_files.mk MISC = $(PRODUCT).man Examples/cms_cmd.expect LICENSE Makefile.in README \ conf.h.in configure configure.in mkversion.sh \ parts.h.in s3270_files.mk s3270_glue.bash version.txt \ x3270-script.man x3270_glue.expect x3270if.man HTML = html/$(PRODUCT)-man.html html/Bugs.html html/FAQ.html html/Intro.html \ html/Lineage.html html/README.html html/ReleaseNotes.html \ html/Resources.html html/SSL.html html/Wishlist.html \ html/x3270-script.html html/x3270.xbm html/Unix-x3270if.html FILES = $(SOURCES) $(HEADERS) $(MISC) $(HTML) src.tgz: prepare $(FILES) prepare: configure configure: configure.in autoconf MANDEP = man.m4 html.m4 m4man Makefile.aux version.txt MKMAN = ./m4man -t man -p $(PRODUCT) MKHTML = ./m4man -t html -p $(PRODUCT) man: $(PRODUCT).man x3270if.man x3270-script.man $(HTML) $(PRODUCT).man: x3270.man.m4 ft.inc resources.inc hostname.inc $(MANDEP) $(MKMAN) -n $(PRODUCT) -o $@ x3270.man.m4 html/$(PRODUCT)-man.html: x3270.man.m4 ft.inc resources.inc hostname.inc $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ x3270.man.m4 x3270if.man: x3270if.man.m4 $(MANDEP) $(MKMAN) -n x3270if -o $@ x3270if.man.m4 html/Unix-x3270if.html: x3270if.man.m4 ft.inc $(MANDEP) $(MKHTML) -n x3270if -o $@ x3270if.man.m4 x3270-script.man: x3270-script.man.m4 ft.inc $(MANDEP) $(MKMAN) -n x3270-script -o $@ x3270-script.man.m4 html/x3270-script.html: x3270-script.man.m4 ft.inc $(MANDEP) $(MKHTML) -n x3270-script -o $@ x3270-script.man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ html/Resources.html: resource-body make-resource-doc.pl version.txt ./make-resource-doc.pl -o $@ $(PRODUCT) $(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) FALLBACKS = fb-common fallbacks.c: mkfb $(FALLBACKS) $(RM) $@ ./mkfb -c -o $@ $(filter-out mkfb,$^) mkfb: mkfb.c $(CC) $(CFLAGS) -o $@ $(filter %.c,$^) s3270: $(OBJS1) $(DEP3270) $(DEP32XX) $(DEP3270STUBS) $(CC) -o $@ $(OBJS1) $(LDFLAGS) $(LD3270) $(LD32XX) $(LD3270STUBS) $(LIBS) x3270if: x3270if.o $(CC) -o $@ $(LDFLAGS) -I../include x3270if.o $(LIBS) man:: s3270.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi man:: x3270if.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi man:: x3270-script.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi install: s3270 x3270if [ -d $(DESTDIR)$(BINDIR) ] || \ mkdir -p $(DESTDIR)$(BINDIR) $(INSTALL_PROGRAM) s3270 $(DESTDIR)$(BINDIR)/s3270 $(INSTALL_PROGRAM) x3270if $(DESTDIR)$(BINDIR)/x3270if install.man: man [ -d $(DESTDIR)$(MANDIR)/man1 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man1 $(INSTALL_DATA) s3270.man $(DESTDIR)$(MANDIR)/man1/s3270.1 $(INSTALL_DATA) x3270if.man $(DESTDIR)$(MANDIR)/man1/x3270if.1 $(INSTALL_DATA) x3270-script.man $(DESTDIR)$(MANDIR)/man1/x3270-script.1 clean: $(RM) *.o mkfb clobber: clean $(RM) s3270 *.d *.man # Include auto-generated dependencies. -include $(OBJS:.o=.d) x3270if.d mkfb.d suite3270-3.6/s3270/make-resource-doc.pl0000775000076500007650000001752213221577163015626 0ustar pdmpdm#!/usr/bin/env perl use strict; my $outfile; if ($ARGV[0] eq "-o") { die "Missing filename after -o.\n" unless ($#ARGV >= 1); shift; $outfile = $ARGV[0]; shift; } die "Must specify product.\n" unless ($#ARGV >= 0); my $product = $ARGV[0]; # Figure out the version name. my $version; open VERSION, ") { chomp; if (/^version="(.*)"/) { $version=$1 } } close VERSION; # Sort out the product, and %approd. my %approd; $approd{'a'} = 1; if ($product eq "x3270") { $approd{'u'} = 1; } elsif ($product eq "c3270") { $approd{'C'} = 1; $approd{'u'} = 1; } elsif ($product eq "s3270") { $approd{'S'} = 1; $approd{'u'} = 1; } elsif ($product eq "tcl3270") { $approd{'u'} = 1; } elsif ($product eq "wc3270") { $approd{'C'} = 1; $approd{'w'} = 1; } elsif ($product eq "ws3270") { $approd{'S'} = 1; $approd{'w'} = 1; } else { die "Unknown product '$product'.\n"; } my $prefix = $product; $prefix =~ s/3270//; $approd{$prefix} = 1; # Dump out %approd. #foreach my $k (keys %approd) { # print STDERR "$k: $approd{$k}\n" #} my %types = ( i => 'Integer', b => 'Boolean', s => 'String' ); # Set up output file. my $out; my $tmpfile; if ($outfile) { $tmpfile = "/tmp/mkr" . $$; unlink $tmpfile; open TMPFILE, ">", $tmpfile or die "Can't open $tmpfile.\n"; $out = *TMPFILE; } else { $out = *STDOUT; } # From here on out, unlink the tempfile if we bail. END { unlink $tmpfile if ($tmpfile); } # Unlink the tempfile if we get a termination signal. sub sighandler { unlink $tmpfile if ($tmpfile); exit(0); } $SIG{'INT'} = \&sighandler; $SIG{'QUIT'} = \&sighandler; $SIG{'HUP'} = \&sighandler; $SIG{'TERM'} = \&sighandler; # Remove HTML attributes from a resource name. sub nix { my $txt = shift(@_); $txt =~ s/<\/?[\w.]+>//g; return $txt; } # The indices. my @index; # overall index my @c_index; # configuration index my @a_index; # appearance index my @n_index; # NVT-mode index my @p_index; # protocol index my @i_index; # interaction index my @s_index; # security index my @t_index; # tracing index my @o_index; # other index my @d_index; # deprecated index my @indices = ( \@c_index, \@a_index, \@n_index, \@p_index, \@i_index, \@s_index, \@t_index, \@o_index, \@d_index ); my @index_name = ( "Basic Configuration", "Appearance", "NVT-Mode", "Protocol", "Terminal Interaction", "Security", "Tracing", "Other", "Deprecated" ); # The elements of an entry. my $name; my @names; my $applies; my $type; my $default; my @switch; my @option; my $description; my $groups; sub dump { if ($name && $applies) { # The minimum set of required attributes are type and description. die "$name missing type\n" if (!$type); die "$name missing description\n" if (!$description); foreach my $n (@names) { # Add this name to the general index. push @index, $n; # Add this name to the specified indices... if (defined($groups)) { foreach (split /\s+/, $groups) { if ($_ eq "c") { push @c_index, $n; } elsif ($_ eq "a") { push @a_index, $n; } elsif ($_ eq "n") { push @n_index, $n; } elsif ($_ eq "p") { push @p_index, $n; } elsif ($_ eq "i") { push @i_index, $n; } elsif ($_ eq "s") { push @s_index, $n; } elsif ($_ eq "t") { push @t_index, $n; } elsif ($_ eq "d") { push @d_index, $n; } else { die "Unknown group '$_'\n"; } } } else { # ... or to the 'other' index. push @o_index, $n; } my $tgt = nix($n); print $out "\nName: $product.$n
    \n"; } print $out "Type: $type
    \n"; if ($default) { print $out "Default: $default
    \n"; } if (@switch) { my $comma; print $out "Command Line:"; foreach my $s (@switch) { print $out "$comma $s\n"; $comma = ","; } print $out "
    \n"; } if ($product eq "x3270") { foreach my $o (@option) { print $out "Option: $o
    \n"; } } $description =~ s/%p%/$product/g; while ($description =~ /%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $description =~ s/%-[\w.<>\/*]+%/$product.$full<\/a>/; } #$description =~ s/%-([\w.]+)%/$product.\1<\/tt><\/a>/g; print $out "Description:
    \n"; print $out "

    $description

    \n"; } undef $name; undef @names; undef $applies; undef $type; undef $default; undef @switch; undef @option; undef $description; undef $groups; } print $out <<"EOS"; $product Resources

    $product Resources

    EOS my $on = 1; my $in_desc; my $in_intro; my @ifstack; while () { chomp; # Skip blank lines. next if (/^\s*$/); # Handle if/endif. if (/^if\s+(.*)/) { push @ifstack, $on; my $desc_applies; foreach (split /\s+/, $1) { $desc_applies = 1 if ($approd{$_}); } $on = $desc_applies if ($ifstack[$#ifstack]); next; } elsif (/^else/) { die "dangling else\n" if ($#ifstack < 0); $on = !$on if ($ifstack[$#ifstack]); next; } elsif (/^endif/) { die "dangling endif\n" if ($#ifstack < 0); $on = pop(@ifstack); next; } next unless $on; # Handle desc. if ($in_desc) { if (/^\./) { undef $in_desc; } else { $description .= $_ . "\n"; } next; } # Handle intro. if (/^intro/) { $in_intro = 1; next; } elsif ($in_intro) { if (/^\./) { undef $in_intro; print $out "

    Alphabetical Resource List

    \n"; } else { s/%p%/$product/g; while (/%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $_ =~ s/%-[\w.<>\/*]+%/
    $product.$full<\/a>/; } print $out "$_\n"; } next; } # Handle normal keywords. if (/name\s(.*)/) { &dump; @names = split /\s+/, $1; $name = $names[0]; next; } if (/applies\s(.*)/) { undef $applies; foreach (split /\s+/, $1) { $applies = 1 if ($approd{$_}); } next; } if (/groups\s(.*)/) { $groups = $1; next; } if (/type\s([^\s]*)/) { $type = $types{$1}; next; } if (/default\s(.*)/) { $default = $1; next; } if (/switch\s(.*)/) { push @switch, $1; next; } if (/option\s(.*)/) { push @option, $1; next; } if (/^desc/) { $in_desc = 1; next; } last if (/^EOF$/); die "Unknown keyword '$_'.\n"; } &dump; print $out <Index of All Resources EOT my $ix = 0; foreach my $i (@index) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; my $q = 0; foreach my $j (@indices) { my @arr = @$j; if ($#arr >= 0) { print $out "

    $index_name[$q] Resources

    \n"; print $out "\n"; my $ix = 0; foreach my $i (@arr) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; } $q = $q + 1; } print $out "

    $product version $version ", `date`, "\n"; print $out "\n"; # Wrap up the outfile. if ($outfile) { close TMPFILE; system("mv $tmpfile $outfile") == 0 or die "Can't rename $tmpfile to $outfile.\n"; } suite3270-3.6/s3270/man.m40000664000076500007650000000513013221577163012766 0ustar pdmpdmdnl Copyright (c) 2000-2012, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces output for nroff -man changecom()dnl changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl define(XX_SH,.SH `"translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)"')dnl define(XX_TH,.TH $1 $2 "$3")dnl define(XX_SM,\s-1$1\s+1)dnl define(XX_LP,.LP)dnl define(XX_IP,.IP)dnl define(XX_BR,.br)dnl define(XX_RS,.RS $1 .RE)dnl define(XX_TS,.TS $2)dnl define(XX_TR,$1)dnl define(XX_TD,T{ .na .nh $1 T})dnl define(XX_TDH,T{ .na .nh .in +2 .ti -2 $1 T})dnl define(XX_T_,_)dnl define(XX_TC,$1)dnl define(XX_TE,.TE)dnl define(XX_TPS)dnl define(XX_TP,.TP $1)dnl define(XX_TPE)dnl define(XX_PP,.PP)dnl define(XX_RI2,.RI $1 $2)dnl define(XX_DASH,\-)dnl define(XX_DASHED,\-$1)dnl define(XX_FI,\fI$1\fP)dnl define(XX_FB,\fB$1\fP)dnl define(XX_NBSP,`\ ')dnl define(XX_LT,<)dnl define(XX_BS,\e)dnl define(XX_TARGET)dnl define(XX_LINK,$2)dnl define(XX_COPY,` ')dnl define(XX_NOT,notsign)dnl define(XX_BACKSLASH,\\$1)dnl define(XX_HO)dnl define(XX_HY,$1\%$2)dnl dnl Make sure it gets run through tbl first. '\" t suite3270-3.6/s3270/mkstand.bash0000775000076500007650000000100313221577163014247 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/s3270/mkversion.sh0000775000076500007650000000466413221577163014340 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <Resources are used to configure %p%. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into %p%.
    • if x
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The %p% app-defaults file (only if %p% is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
      endif
    • If a session file foo.%p% is specified on the command line, its contents are applied. if x c Otherwise, if the %p% profile (~/.%p%pro) exists, it is read and its contents are applied. endif These definitions override resource values defined by if x X11 methods and endif compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example %-bsdTm% can be set by the following command-line option:
         -xrm "%p%.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file if x (app-defaults file, profile or session file) else if c (profile or session file) else (session file) endif endif has the following syntax.
    • Each definition consists of:
          %p%.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • if x C
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          %p%.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        
    • endif
    . name acceptHostname applies a type s groups s switch -accepthostname description Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.) . name acs applies c type b default true desc When true, %p% will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, %p% will use Unicode box-drawing characters. . name activeIcon applies x groups a type b default false switch -activeicon description When true, %p%'s icon becomes a live miniature of the screen display. . name aidWait applies x c s tcl type b default false switch -set aidWait switch -clear aidWait desc When true, %p% will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll %p%'s status until it shows that the keyboard is no longer unlocked. . name allBold applies c groups a type s default auto switch -allbold desc When true, %p% will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation. . name allowResize applies x type b default true description When true, the %p% window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it. . name altCursor applies x wc groups a type b default false switch -set altCursor switch -clear altCursor option Options -> Toggles -> Underline Cursor option Options -> Toggles -> Block Cursor description When true, this causes %p% to use the alternate (underscore) cursor. When false, it will use a block cursor. . name altScreen applies c type s switch -altscreen desc Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-defScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name aplCircledAlpha applies x groups a type b default false description When set to true, allows %p% to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with %p%.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point. . name aplMode applies x type b default false switch -apl desc Enables %p% APL mode. APL mode appends apl to the list of names in %-keymap% (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets %-composeMap% to apl (allowing Compose key sequences to construct complex APL symbols), and sets %-charset% to apl (allowing the display of APL symbols using several of the 3270 fonts). . name asciiBoxDraw applies C type b default false desc When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width. . name autoShortcut applies wc type b default false switch -S switch +S desc When true, %p% will run in auto-shortcut mode. In auto-shortcut mode, %p% automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x. . name background applies x groups a type s default white switch -bg switch -rv description The background color for menus, buttons, and on monochrome X11 displays, the emulator window. . name bellMode applies wc type s groups i description Controls how %p% responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the %p% window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides %-visualBell%. . name bellVolume applies x type i default 0 description Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by %-visualBell%, which if true, will replace the bell with a flash of the screen. . name bindLimit applies a groups p type b default true description When true, %p% will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not. . name bindUnlock applies a type b groups p default false description When true, %p% will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing %p% to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op. . name blankFill applies a groups i type b default false option Options -> Toggles -> Blank Fill switch -set blankFill switch -clear blankFill description When true, in 3270 mode %p% will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals. . name boldColor applies x groups a default green type s description This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan. . name bsdTm applies a groups p type b default false description Defines %p%'s response to the TELNET DO TIMING MARK option. When set to false, %p% will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, %p% will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of %p%. In either case, %p% will never respond to a DONT TIMING MARK option. . name caDir applies u type s groups s switch -cadir description Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name caFile applies u type s groups s switch -cafile description Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name cbreak applies c type b default false switch -cbreak desc If true, %p% will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters. . name certFile applies u groups s type s switch -certfile desc Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by %-certFileType%. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%.

    On the Mac, the file must be in PKCS12 format. . name certFileType applies u groups s type s default pem switch -certfiletype desc Gives the type of the certificate file specified by %-certFile%. The value can be pem or asn1. (OpenSSL only) . name chainFile applies u groups s type s switch -chainfile desc Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%. (OpenSSL only) . name charClass applies x type s desc Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name. . name charset applies a groups c type s default bracket switch -charset option Options -> Character Set description This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by %p%, use the -v command-line option. if wc

    Note that %p% DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language. endif . name clientCert applies w groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store. . name clientCert applies u groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only) . name color8 applies a groups p type b default false description If true, %p% will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported. if c

    This setting will also cause %p% to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen. endif . name colorBackground applies x groups a type s default black description The background color for the emulator window. This resource is used only on color X11 displays when %-model% specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by %-colorScheme%. . name colorScheme applies x groups a type s default default option Options -> Color Scheme description Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when %-model% specifies a 3279 display. %-colorScheme% is just the name of the color scheme. The actual color scheme definition for color scheme foo is %-colorScheme.foo%. . name colorScheme.foo applies x groups a type s description An individual color scheme definition. I.e., to define color scheme foo, a resource named %p%.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer. . name commandTimeout applies tcl type i description Defines the number of seconds to wait for a command to complete before failing it with a timeout error. . name composeMap applies x C type s default latin1 description Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource %-composeMap.foo%. . name composeMap.foo applies x C type s description An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive. . name confDir applies a type s if u default /usr/local/etc/x3270 else default . endif desc Defines the %p% configuration directory, where %p% will search for the ibm_hosts file by default. (See %-hostsFile%.) if w

    The default is to search the directory where %p% was started, which usually its installation directory. endif . name connectFileName applies x type s default ~/.x3270connect description Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of %p% that run under the same username. . name connectTimeout applies a type i groups c switch -connecttimeout description Specifies a timeout, in seconds, that %p% will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that %p% will wait for the lesser of the two times (the specified timeout and the system-defined timeout). . name consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite applies wc groups a type i desc Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource %p%.consoleColorForHostColorGreen or the resource %p%.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the %p% Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with %p%.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         %p%.consoleColorForHostColorNeutralBlack: 15
         %p%.consoleColorForHostColorNeutralWhite: 0
        
    . name crosshair applies x C groups a type b default false option Options -> Toggles -> Crosshair Cursor switch -set crosshair switch -clear crosshair description When true, causes %p% to display a crosshair over the cursor: lines extending with height and width of the screen. . name crosshairColor applies x C groups a type s default purple description Defines the color used for the crosshair cursor (see %-crosshair%). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15
    . name cursesColorForDefault cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified applies c groups a type s desc Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    %p% Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)
    . name cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite applies c groups a type s desc Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource %p%.cursesColorForHostColorGreen or the resource %p%.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, %p% only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with %p%.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See %-cursesColorForDefault% for the definitions of curses colors. . name cursesKeypad applies c type b default false desc When true, %p% will set up the terminal in curses keypad mode. . name cursorBlink applies x groups a type b default false option Options -> Toggles -> Blinking Cursor switch -set cursorBlink switch -clear cursorBlink description When true, causes %p% to use a blinking cursor. . name cursorColor applies x groups a type s default red description On color X11 displays, this is the color of the text cursor. This resource is used only if %-useCursorColor% is true. . name cursorPos applies x C groups a type b default true switch -set cursorPos switch -clear cursorPos option Options -> Toggles -> Track Cursor description When true, causes %p% to display the cursor location in the OIA (the status line). . name dbcsCgcsgid applies a groups p type s description Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use %-sbcsCgcsgid% for the single-byte (SBCS) character set. . name debugTracing applies x groups t s type b default true description If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed. . name defaultFgBg applies c type b groups a default false switch -defaultfgbg description If true, %p% will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that %p%'s screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if %p% has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9). . name defScreen applies c type s switch -defscreen desc Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-altScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name dftBufferSize applies a groups p type i default 4096 description Deprecated resource -- replaced by %-ftBufferSize%

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name devName applies a type s switch -devname groups p description Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name disconnectClear applies x type b default false description If true, %p% will clear the screen when a host disconnects. . name doConfirms applies x type b default true description When true, %p% will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed. . name dsTrace applies a groups t type b default false switch -trace switch -set dsTrace switch -clear dsTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name emulatorFont type s applies x groups a default 3270 switch -efont option Options -> Font description The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (%-charset%). However, the special OIA (status line) symbols are only available with the 3270 fonts. . name eof type s applies a groups n default ^D description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    . name erase type s applies a groups n default ^? description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (%p% gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause %p% to discard the last character on the input line.

    When connected in character-at-a-time mode (%p% sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action. . name eventTrace groups t type b applies a default false switch -set eventTrace switch -clear eventTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% traces information about keyboard and mouse events into a file. The default file name is if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name extended type b applies a default false groups d switch -extended description Deprecated resource -- replaced by %-model% syntax

    Indicates support for the 3270 Extended Data Stream. . name fixedSize type s applies x groups a description Specifies a fixed size for the %p% display window. If set, %p% will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary. . name foreground type s applies x groups a default black switch -fg switch -rv description The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display. . name ftAllocation type s applies a groups i default default description Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock. . name ftAvblock type i applies a groups i description Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers. . name ftBlksize type i applies a groups i description Defines the default block size for files sent to TSO hosts by IND$FILE file transfers. . name ftBufferSize applies a groups p type i default 4096 description Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCodePage type i applies w groups i description Deprecated resource -- replaced by %-ftWindowsCodePage%

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCr type s applies a groups i default auto description Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done. . name ftDirection type s applies a groups i default receive description Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation). . name ftExist type s applies a groups i default keep description Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be if x aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), else aborted, endif replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file. . name ftHost type s applies a groups i default tso description Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics. . name ftHostFile type s applies a groups i description Defines the default host file name for IND$FILE file transfers. . name ftLocalFile type s applies a groups i description Defines the default local file name for IND$FILE file transfers. . name ftLrecl type i applies a groups i description Defines the default logical record length for files sent to the host via IND$FILE. . name ftMode type s applies a groups i default ascii description Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation). . name ftPrimarySpace type i applies a groups i description Defines the default primary space allocation for files sent to TSO hosts via IND$FILE. . name ftRecfm type s applies a groups i default default description Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format. . name ftRemap type s applies a groups i default yes description Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by %p% to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37. . name ftSecondarySpace type i applies a groups i description Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE. . name ftWindowsCodePage type i applies w groups i description The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name highlightBold type b applies x groups a default false description If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font. . name hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified applies wc groups a type s desc Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See %-consoleColorForHostColor0% for the definitions of host colors.

    The default values are:
    %p% Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite
    . name hostname type s applies a groups c desc Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over %-hostname%.

    The most common use of %-hostname% is in session files, where a file is used to pass all of the options to establish a %p% session. . name hostsFile type s applies x default /usr/local/etc/x3270/ibm_hosts description The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by %-confDir%. . name hostsFile type s applies C S tcl if u default /usr/local/etc/x3270/ibm_hosts else default ibm_hosts endif description The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. if u The default pathname is actually ibm_hosts in the directory defined by %-confDir%. endif . name httpd type s applies C S x switch -httpd description Defines the TCP port and optional address to listen on for HTTP connections. (%p% implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name iconFont type s applies x groups a default nil2 description The font used to paint the text inside the active icon (see %-activeIcon%). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image. . name iconLabelFont type s applies x groups a default 8x13 description When %-activeIcon% and %-labelIcon% are true, this is the name of the font used to paint the icon label. . name icrnl type b applies a groups n default true description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines. . name idleCommand applies x C S groups i type s description When %-idleCommand% is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The %-idleCommand% can be an arbitrary sequence of %p% actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). %-idleCommandEnabled% must be true in order for the %-idleCommand% to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) %-idleTimeout% specifies the inactivity interval. . name idleCommandEnabled applies x C S groups i type b default false description Controls whether %-idleCommand% has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.) . name idleTimeout applies x C S groups i type s default ~7m description The timeout value for %-idleCommand%. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified. . name inlcr applies a groups n type b default false description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns. . name inputColor applies x groups a type s default green description This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan.

    If the resource %-modifiedSel% is true, modified fields are also displayed using %-inputColor%. . name inputMethod applies x type s switch -im description Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale. . name intr applies a groups n type s default ^C description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host. . name invertKeypadShift applies x type b default false description When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed. . name keyFile applies u groups s type s switch -keyfile desc Gives the name of a file containg the private key for the certificate specified by %-certFile% or %-chainFile%. The default file type is PEM; it can be overridden by %-keyFileType%. If the private key is encrypted, the password is specified by %-keyPasswd%. (OpenSSL only) . name keyFileType applies u groups s type s default pem switch -keyfileType desc Gives the type of the private key file specified by %-keyFile%. The value can be pem or asn1. (OpenSSL only) . name keyHeight applies x groups a type i default 24 desc Defines the height of the keys on the pop-up keypad. . name keymap applies x C groups c type s switch -keymap description The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a %-keymap% value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270. if x

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six. endif

    if x If no %-keymap% is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. %-keymap% is only the name; the keymap definition for name foo is the resource %-keymap.foo%. endif if C %-keymap% is only the name; the actual keymap for name foo can be defined either by the resource %-keymap.foo%, or by a keymap file. if c The keymap file is not searched for in any particular location, nor does it have a special suffix, so %-keymap% can specify the full pathname of the keymap file. else Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km. endif endif . name keymap.foo applies x C type s description The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax. . name keypad applies x groups a type s default right description. This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main %p% window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main %p% window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar
    . name keypad.keyHeight applies x groups a type i default 24 description The height in pixels of all of the buttons on the keypad. . name keyPasswd applies u groups s type s switch -keypasswd desc On OpenSSL, gives the password for the private key file specified by %-keyFile%, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the %-certfile% certifiate file. . name keyWidth applies x groups a type i default 48 description The width in pixels of the lower tier of buttons on a horizontal keypad. . name keypad.largeKeyWidth applies x groups a type i default 56 description The width in pixels of the lower tier of buttons on a vertical keypad. . name keypad.paWidth applies x groups a type i default 36 description The width in pixels of PA and cursor keys on the keypad. . name keypad.pfWidth applies x groups a type i default 32 description The width in pixels of PF keys on the keypad. . name keypadBackground applies x groups a type s default grey70 description On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap. . name keypadOn applies x type b groups a default false description If true, the keypad will automatically appear when %p% is started. . name kill applies a groups n type s default ^U description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action. . name labelIcon applies x groups a type b default false description When %-activeIcon% is true, the twm window manager will not put a label on %p%'s icon. Setting %-labelIcon% to true causes %p% to supply its own label for the icon.

    The icon label is drawn using the font specified by %-iconLabelFont%. . name largeKeyWidth applies x groups a type i default 56 desc Defines the width of the "large" keys in the lower section of the pop-up keypad. . name lightPenPrimary applies wc groups i type b default false description Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste. . name lineWrap applies a groups n type b default true switch -set lineWrap switch -clear lineWrap option Options -> Toggles -> Wraparound description This setting is used only in NVT mode. When true, %p% will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence. . name loginMacro applies a type s switch -loginmacro desc Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a %-hostsFile% is in use and a matching entry is found, the login macro from that entry will be used in preference to the %-loginMacro%. . name lnext applies a groups n type s default ^V description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered. . name localCp applies ws type i desc Forces %p% to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files. . name lockedCursor applies x groups a type s default X_cursor description The name of the mouse cursor displayed with %p% is not connected to a host. . name m3279 applies a type b default true groups d switch -color description Deprecated resource -- replaced by %-model% syntax

    Indicates support for color (a 3279 terminal). . name macros applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    %-macros% defines a set of macros for all hosts. To specify a set of macros for host foo, use %-macros.foo%. . name macros.foo applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of %-macros%. See %-macros% for details on its syntax. . name marginedPaste applies x wc groups i type b default false switch -set marginedPaste switch -clear marginedPaste option Options -> Toggles -> Paste With Left Margin description When true, %p% will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon. . name maxRecent applies x groups i type i default 5 description The maximum number of entries in the Connect menu's recent host list. . name menuBar applies x wc groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% main window. if x The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons. endif . name menuBar applies c groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% display, even if the terminal supports a mouse. . name metaEscape applies c type b default true desc When true, %p% will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus %p% will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character. . name minVersion applies S type s switch -minversion description Defines a minimum required version for %p%. If the version of %p% is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal. . name model applies a groups c type s default 3279-4-E switch -model option Options -> Screen Size description The terminal model that %p% is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. if x If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays. endif
      3279 specifies a color 3270 display. if x This is the default for color X11 displays. endif
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is if C the largest model that will fit on the console or terminal emulator window where %p% is running. Displaying the OIA (status line) requires one more row than what is listed above. else 4. endif
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.
    . name modifiedSel applies x groups a type b default false description When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by %-inputColor%. In 3279 mode, this is the color whose index is defined by %-modifiedSelColor%. When %-modifiedSel% is false, modified fields are displayed in the same colors as unmodified fields. . name modifiedSelColor applies x groups a type i default 10 description In 3279 mode, when %-modifiedSel% is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See %-colorSchemes% for the host color index definitions.) . name mono applies x c type b default false switch -mono description if x If true, %p% will operate as if it were running on a monochrome X11 display. else If true, %p% will emulate a 3278, and will not use any of the terminal's color attributes. endif . name monoCase applies a type b default false switch -set monoCase switch -clear monoCase option Options -> Toggles -> Monocase description When true, causes %p% to run in uppercase-only mode. . name mouse applies c groups i type b default true description If true, enables %p% to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled. . name newEnviron applies a type b default true description If true, %p% will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not. . name noOther applies x groups s type b default false description If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus. . name noPrompt applies C groups s type b default false desc If true, the interactive %p%> prompt will be disabled. In particular, this means that when %p% is not connected to a host, a keymap or an external script is the only way to start a new host connection. . name normalCursor applies x type s groups a default top_left_arrow desc Defines the mouse cursor that %p% uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked. . name nopSeconds applies a type i groups i default 0 desc If nonzero, %p% will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity. . name normalColor applies x groups a type s default green desc On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color. . name numericLock applies a groups i type b default false desc When true, causes %p% to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute. . name nvtMode applies a groups i type b default false switch -nvt desc When true, causes %p% to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname. . name onlcr applies a groups n type b default true desc Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences. . name oerrLock applies a groups i type b default true desc If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message. . name once applies a type b default false switch -once desc When true, %p% will exit as soon as a host disconnects. The default is false if no hostname is specified on the command if x C line or in a session file, else line, endif true otherwise. . name overlayPaste applies wc x groups i type b default false switch -set overlayPaste switch -clear overlayPaste option Options -> Toggles -> Overlay Paste desc When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause %p% to act as if the %-marginedPaste% toggle were also set. . name oversize applies a type s switch -oversize desc Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. if C It can also be the string auto, which will cause %p% to use the entire screen area of the endif if c terminal. endif if wc console window it is running in. endif It is used only if the %-model% includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with %p% in this mode. . name paWidth applies x groups a type i default 36 desc Defines the width of the PA keys in the lower section of the pop-up keypad. . name pfWidth applies x groups a type i default 32 desc Defines the width of the PF keys on the pop-up keypad. . name port applies a groups c type s default telnet switch -port desc The name of the default TCP port for %p% to connect to. This can be either a symbolic name from /etc/services, or an integer. . name proxy applies a groups c type s switch -proxy desc Defines a proxy server that %p% will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the %p% manual page. . name preeditType applies x type s default OverTheSpot+1 switch -pt desc The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. . name printerLu type s applies x C groups c switch -printerlu desc If a value is set, %p% will automatically start a if u pr3287 else wpr3287 endif printer session when a host connection is established. If the value is ".", the if u pr3287 else wpr3287 endif session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session. . name printer.assocCommandLine applies x C type s if x c default pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H% else default wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when %-printerLU% is "."). Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with the %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with the current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.codepage applies wc type i desc The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage. . name printer.command applies x c type s default lpr desc The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in %-printer.assocCommandLine% and %-printer.luCommandLine% resources. . name printer.luCommandLine applies x C type s if x c default pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H% else default wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.name applies wc type s desc Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer. . name printer.options applies x C type s desc Defines extra parameters to substutute for the %O% token in the printer command line. . name printTextCommand applies x c type s default lpr desc The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. if x If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear. endif . name printTextFont applies wc type s default Courier New desc The font used by the PrintText action. . name printTextHorizontalMargin applies wc type i default 0.5 desc The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printTextOrientation applies wc type i desc The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is. . name printTextScreensPerPage applies wc c x type i default 1 desc The number of screens to display on a page when tracing screens to the printer. . name printTextSize applies wc type i default auto (GDI), 8 (WordPad) desc The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points. . name printTextVerticalMargin applies wc type i default 0.5 desc The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printWindowCommand applies x type s default xwd -id %d | xpr | lpr desc The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear. . name qrBgColor applies C s tcl type b default false desc When true, %p% will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash. . name quit applies a groups n type s default ^\ desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host. . name reconnect applies x C type b default false desc When true, %p% will automatically reconnect to a host after it disconnects. . name rectangleSelect applies x groups i type b default false switch -set rectangleSelect switch -clear rectangleSelect option Options -> Toggles -> Select by Rectangles desc When true, %p% will always select rectangular areas of the screen. When false, %p% will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm. . name reverseVideo applies c type b groups a default false option -rv desc When true, %p% will use a white background instead of a black one. . name rprnt applies a groups n type s default ^R desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed. . name saveLines applies x C type i default 4096 switch -sl desc The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved. . name sbcsCgcsgid applies a groups p type s desc Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use %-dbcsCgcsgid% for the double-byte (DBCS) character set. . name schemeList applies x type s desc Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme. . name screenTrace applies a groups t type b default false switch -set screenTrace switch -clear screenTrace option File -> Save Screen(s) in File desc When true, %p% will save an ASCII version of the screen image in a file every time it changes. The file name defaults to if u x3scr.pid. else x3scr.pid.txt. endif The directory where the file is written is defined by %-traceDir%. If %-screenTraceFile% is defined, it defines the file name and %-traceDir% is ignored. if w file name. endif . name screenTraceFile applies a groups t type s desc If defined, gives the name of the file that screen traces will be written into. . name scripted applies x type b default false switch -script desc When true, %p% will read commands from standard input. The rules for these commands are documented in the x3270-script manual page. . name scriptPort applies a type i switch -scriptport desc If defined, %p% will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name scriptPortOnce applies a type b default false switch -scriptportonce desc If defined, %p% will accept only one script connection. When that connection is broken, it will exit. . name scrollBar applies x type b default false switch -sb switch +sb switch -set scrollBar switch -clear scrollBar desc When true, %p% will display a scroll bar to the right of the emulator window. . name secure applies x groups s type b default false desc When true, %p% will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and %-disconnectClear% is true. See %-noOther% and %-suppressActions% for additional security options. . name selectBackground applies x groups a type s default dimGrey desc On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video. . name showTiming applies x groups a type b default false switch -set showTiming switch -clear showTiming option Options -> Toggles -> Show Timing desc When true, %p% will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent. . name socket applies u type b default false switch -socket desc When true, %p% will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket. . name startTls applies a type b groups s default true description If true, %p% will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them. . name *suppress applies x groups s type b desc When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress . name suppressActions applies a groups s type s desc A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options. . name suppressFontMenu applies x type b default false desc If true, the Options -> Font menu will not be displayed. . name suppressHost applies x type b default false desc If true, %p% will omit the hostname from the File -> About %p% -> Connection Status pop-up. . name termName applies a groups p type s switch -tn desc An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of %-model%. . name title applies x wc groups a type s switch -title desc Sets the title for the %p% window, overriding the default of constructing the name from the host that is connected to. . name trace applies a groups t type b default false switch -trace switch -set trace switch -clear trace option File -> Trace Data and Events description When true, %p% writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name traceCommand applies x type s default tail -f desc Defines the command that runs in the trace window. . name traceDir applies a groups t type s if u default /tmp endif if wc default current user's Desktop endif if ws default current directory endif desc Defines the directory that trace files are written into. . name traceFile applies a groups t type s switch -tracefile desc If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. if x If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created. endif . name traceFileSize applies a groups t type s switch -tracefilesize desc If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started. . name traceMonitor applies x wc groups t type b default true desc When true, %p% will create a window to monitor data stream and event traces. When false, no monitor window will be if x created (and the value of none for %-traceFile% will be considered invalid). else created. endif . name typeahead applies w C type b default true desc When true, %p% will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped. . name underscore applies C groups a type b if c default false else default true endif switch -set underscore switch -clear underscore desc When true, %p% will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed if c on terminals that else to overcome the fact that Windows consoles endif are unable to display real underlined text. . name unlockDelay applies x c wc type b default true desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% implements a hack to briefly delay actually unlocking the keyboard. When %-unlockDelay% is true (the default), the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. Setting it to false removes this delay. . name unlockDelay applies s ws tcl type b default false desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. . name unlockDelayMs applies a type i default 350 desc Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and %p% actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros. . name useCursorColor applies x groups a type b default false desc If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by %-cursorColor%. . name user applies a type s switch -user groups p description Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name utf8 applies S type b switch -utf8 description Forces local I/O to use UTF-8 encoding, regardless of the local codepage. . name verifyHostCert applies a type b groups s switch -noverifycert switch -verifycert default true description If true (the default), %p% will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, %p% will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking. . name visibleControl applies x C type b default false switch -set visibleControl switch -clear visibleControl option Options -> Toggles -> Visible Control Characters desc If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, if x c displayed with underlines, endif are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, if x c displayed in yellow with underlines, endif if wc displayed in reverse-video yellow, endif are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified
    . name visualBell applies x groups i type b default false desc When true, %p% will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell. . name visualBell applies wc groups i type b default false desc Deprecated resource -- replaced by %-bellMode%

    When true, %p% will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, %p% will beep the console and flash the screen.

    Note that this resource is overridden by %-bellMode%. %-bellMode% is the preferred method of controlling the console bell behavior. . name visualSelect applies x groups a type b default false desc This resource controls how %p% displays light pen selectable fields that do not have a color explicitly set by the host. When true, %p% will display these fields using the color defined by %-visualSelectColor%. When false, %p% will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode. . name visualSelectColor applies x groups a type i default 6 desc The host color index of the color to use to display light pen selectable fields. This resource is used only if %-visualSelect% is true. The default is 6 (yellow). . name waitCursor applies x groups a type s default watch desc The name of the mouse cursor displayed when %p% is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>. . name werase applies a groups n type s default ^W desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action. . EOF suite3270-3.6/s3270/resources.inc0000664000076500007650000003113613221577163014463 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ifelse(XX_PRODUCT,c3270,`XX_SH(Screen Size Switching) When running as a 3270 Model 5, XX_FB(c3270) can take advantage of terminals that can switch between 80 and 132 column modes. XX_LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to XX_FB(c3270). These are specified with the XX_FB(XX_DASHED(altscreen)) and XX_FB(XX_DASHED(defscreen)) command-line options, or the XX_FB(altScreen) and XX_FB(defScreen) resources. XX_FB(XX_DASHED(altscreen)) or XX_FB(altScreen) defines the alternate (132-column) mode; XX_FB(XX_DASHED(defscreen)) or XX_FB(defScreen) defines the default (80-column) mode. XX_LP The syntax for the options and resources is XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string), where XX_FI(rows) and XX_FI(cols) give the screen dimensions, and XX_FI(init_string) is the escape sequence to transmit to the terminal to enter that mode. For XX_FB(defscreen), the minimum dimensions are 24 rows and 80 columns. For XX_FB(altscreen), the minimum dimensions are 27 rows and 132 columns. Within XX_FI(init_string), the usual escape sequences are supported (XX_BACKSLASH(E) for escape, XX_BACKSLASH(r), XX_BACKSLASH(b), etc.). For example, the init string for a 132-column xterm is: XX_IP XX_BACKSLASH(E)[?40h`'XX_BACKSLASH(E)[?3h XX_LP Note: When XX_FB(defscreen) and XX_FB(altscreen) are specified, the model number is always set to 5. ')dnl XX_SH(Resources) Certain XX_FB(XX_PRODUCT) options can be configured via resources. Resources are defined ifelse(XX_PRODUCT,c3270,`in the file XX_FB(.c3270pro) in the XX_POSESSIVE(user) home directory, and ')dnl ifelse(XX_PRODUCT,wc3270,`in the session file, or ')dnl by XX_FB(XX_DASHED(xrm)) options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in XX_FB(XX_PRODUCT) are: XX_LP XX_TS(4, l l l l.) XX_TR(XX_TD(Resource) XX_TD(Default) XX_TD(Option) XX_TD(Purpose)) XX_T_() ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(allBold) XX_TD(Auto) XX_TD(XX_DASHED(allbold)) XX_TD(Display all characters bold)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(altScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(altscreen)) XX_TD(132-col screen definition)) ')dnl XX_TR(XX_TD(blankFill) XX_TD(False) XX_TD(XX_DASHED(set) blankFill) XX_TD(Blank Fill mode)) XX_TR(XX_TD(charset) XX_TD(bracket) XX_TD(XX_DASHED(charset)) XX_TD(XX_SM(EBCDIC) character set)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(composeMap) XX_TD(latin1) XX_TD(XX_NBSP) XX_TD(Name of composed-character map)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(consoleColorForHostColor`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForHostColor)`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForDefault)) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForIntensified)) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtected)) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtectedIntensified)) XX_TD(white) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(cursesKeymap) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Set curses keymap option)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(defScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(defscreen)) XX_TD(80-col screen definition)) ')dnl XX_TR(XX_TD(dbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override DBCS CGCSGID)) XX_TR(XX_TD(dsTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Data stream tracing)) XX_TR(XX_TD(eof) XX_TD(^D) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode XX_SM(EOF) character)) XX_TR(XX_TD(erase) XX_TD(^H) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode erase character)) XX_TR(XX_TD(extended) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Use 3270 extended data stream)) XX_TR(XX_TD(eventTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Event tracing)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForDefault) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForIntensified) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtected) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtectedIntensified) XX_TD(neutralWhite) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(hostsFile) XX_TD(XX_NBSP) XX_TD(XX_DASHED(hostsfile)) XX_TD(Host alias/macro file)) ')dnl XX_TR(XX_TD(icrnl) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(CR) to XX_SM(NL) on XX_SM(NVT)-mode input)) XX_TR(XX_TD(inlcr) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(NL) to XX_SM(CR) in XX_SM(NVT)-mode input)) XX_TR(XX_TD(intr) XX_TD(^C) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode interrupt character)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(keymap) XX_TD(XX_NBSP) XX_TD(XX_DASHED(keymap)) XX_TD(Keyboard map name)) XX_TR(XX_TD(keymap.XX_FI(foo)) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Definition of keymap XX_FI(foo))) ')dnl XX_TR(XX_TD(kill) XX_TD(^U) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode kill character)) XX_TR(XX_TD(lineWrap) XX_TD(False) XX_TD(XX_DASHED(set) lineWrap) XX_TD(XX_SM(NVT) line wrap mode)) XX_TR(XX_TD(lnext) XX_TD(^V) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode lnext character)) ifelse(XX_PRODUCT,ws3270,`XX_TR(XX_TD(localCp) XX_TD((system ANSI code page)) XX_TD(XX_DASHED(localcp)) XX_TD(Windows code page for local I/O)) ')dnl XX_TR(XX_TD(m3279) XX_TD(XX_LINK(#rn1,`(note 1)')) XX_TD(XX_DASHED(model)) XX_TD(3279 (color) emulation)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(metaEscape) XX_TD(Auto) XX_TD(XX_NBSP) XX_TD(Interpret ESC-x as Meta-x)) ')dnl ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(marginedPaste) XX_TD(False) XX_TD(XX_DASHED(set) marginedPaste) XX_TD(Keep left margin when pasting)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(mono) XX_TD(XX_LINK(#rn5, `(note 5)')) XX_TD(XX_DASHED(mono)) XX_TD(Ignore terminal color capabilities)) ')dnl XX_TR(XX_TD(monoCase) XX_TD(False) XX_TD(XX_DASHED(set) monoCase) XX_TD(Mono-case mode)) ifelse(XX_MODE,console,`XX_TR(XX_TD(noPrompt) XX_TD(False) XX_TD(XX_DASHED(noprompt)) XX_TD(Disable command-prompt mode)) ')dnl XX_TR(XX_TD(numericLock) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Lock keyboard for numeric field error)) XX_TR(XX_TD(oerrLock) XX_TD(ifelse(XX_PRODUCT,c3270,True,False)) XX_TD(XX_NBSP) XX_TD(Lock keyboard for input error)) ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(overlayPaste) XX_TD(False) XX_TD(XX_DASHED(set) overlayPaste) XX_TD(Overlay protected fields when pasting)) ')dnl XX_TR(XX_TD(oversize) XX_TD(XX_NBSP) XX_TD(XX_DASHED(oversize)) XX_TD(Oversize screen dimensions)) XX_TR(XX_TD(port) XX_TD(telnet) XX_TD(XX_DASHED(port)) XX_TD(Non-default TCP port)) ifelse(XX_MODE,console,`XX_TR(XX_TD(printer.*) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) XX_TR(XX_TD(printerLu) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(printTextFont) XX_TD(Courier New) XX_TD(XX_NBSP) XX_TD(PrintText font name)) XX_TR(XX_TD(printTextSize) XX_TD(8) XX_TD(XX_NBSP) XX_TD(PrintText font size)) ')dnl XX_TR(XX_TD(quit) XX_TD(^XX_BS) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode quit character)) ifelse(XX_MODE,console,`XX_TR(XX_TD(reconnect) XX_TD(False) XX_TD(XX_DASHED(reconnect)) XX_TD(Automatically reconnect to host)) ')dnl XX_TR(XX_TD(rprnt) XX_TD(^R) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode reprint character)) XX_TR(XX_TD(sbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override SBCS CGCSGID)) XX_TR(XX_TD(secure) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable "dangerous" options)) XX_TR(XX_TD(termName) XX_TD(XX_LINK(#rn2,`(note 2)')) XX_TD(XX_DASHED(tn)) XX_TD(XX_SM(TELNET) terminal type string)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(title) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Console window title)) ')dnl ifelse(XX_PLATFORM,windows,,`XX_TR(XX_TD(traceDir) XX_TD(/tmp) XX_TD(XX_NBSP) XX_TD(Directory for trace files)) ')dnl XX_TR(XX_TD(traceFile) XX_TD(XX_LINK(#rn3,`(note 3)')) XX_TD(XX_DASHED(tracefile)) XX_TD(File for trace output)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(typeahead) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Allow typeahead)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(visualBell) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable bell sound)) ')dnl XX_TR(XX_TD(werase) XX_TD(^W) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode word-erase character)) XX_TE() XX_LP XX_RS(`XX_TARGET(rn1)XX_FI(Note 1): XX_FB(m3279) defaults to ifelse(XX_PRODUCT,c3270,`XX_FB(True) if the terminal supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,wc3270,`XX_FB(True). It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,x3270,`XX_FB(True) if the display supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', `XX_FB(False). It can be forced to XX_FB(True) with the proper XX_FB(XX_DASHED(model)) option.') XX_LP XX_TARGET(rn2)XX_FI(Note 2): The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as XX_FB(IBM-3279-2-E). Note also that when XX_SM(TN3270E) mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. XX_LP XX_TARGET(rn3)XX_FI(Note 3): The default trace file is ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(x3trc.)`'XX_FI(pid) in the directory specified by the XX_FB(traceDir) resource'). ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.')' ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn5)XX_FI(Note 5): XX_FB(mono) defaults to XX_FB(false) if the terminal supports at least 8 colors and to XX_FB(true) otherwise.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.' ')dnl ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.' ')) XX_LP ifelse(XX_PRODUCT,c3270,`In XX_FB(.c3270pro), lines are continued with a backslash character. XX_LP XX_FB(XX_DASHED(xrm)) options override definitions found in XX_FB(.c3270pro). ')dnl If more than one XX_FB(XX_DASHED(xrm)) option is given for the same resource, the last one on the command line is used. suite3270-3.6/s3270/s3270_files.mk0000664000076500007650000000006613221577163014245 0ustar pdmpdm# s3270-specific object files S3270_OBJECTS = s3270.o suite3270-3.6/s3270/s3270_glue.bash0000775000076500007650000001224013221577163014405 0ustar pdmpdm#!/usr/bin/env bash # Copyright (c) 1993-2009, 2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # s3270 glue for bash # # Intended use in a bash script: # # . s3270_glue.bash # Start # Connect host # Wait InputField # # interact with the host as needed # Disconnect # Stop #set -x # Define some handy functions. # s3270 interface function function xi { typeset x y if [ "X$1" = "X-s" ] then echo >&5 read x <&6 read <&6 echo "$x" | awk "{print \$$2}" return fi echo >&5 "$@" while read x <&6 do y=$(expr substr "$x" 1 5) if [ "$y" = "data:" ] then z="${x#?????}" if [ -n "$z" ] then echo "${z#?}" else echo "$z" fi elif [ "$x" = ok ] then return 0 elif [ "$x" = error ] then return 1 fi done return 1 } # 'xi' function, with space-to-comma and double-quote translation function xic { typeset sep cmd="$1(" typeset a shift while [ $# -gt 0 ] do echo "$1" | sed 's/"/\\"/' >/tmp/x$$ a="$($op & xp=$! exec 5>$ip 6<$op # hold the pipes open xi -s 0 >/dev/null || exit 1 } # Stop function function Stop { # Close the pipes. exec 5>&- 6<&- # Remove them. rm -f $ip $op } # Failure. function Die { echo >&2 "$@" Stop exit 1 } suite3270-3.6/s3270/s3270.man0000664000076500007650000010243413221600610013211 0ustar pdmpdm'\" t .TH s3270 1 "29 December 2017" .SH "NAME" s3270 \- \s-1IBM\s+1 host access tool .SH "SYNOPSIS" \fBs3270\fP [\fIoptions\fP] [\fIhost\fP] .br \fBs3270\fP [\fIoptions\fP] \fIsession-file\fP.s3270 .SH "DESCRIPTION" \fBs3270\fP opens a telnet connection to an \s-1IBM\s+1 host, then allows a script to control the host login session. It is derived from \fIx3270\fP(1), an X-windows IBM 3270 emulator. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The full syntax for \fIhost\fP is: .RS [\fIprefix\fP:]...[\fILUname\fP@]\fIhostname\fP[:\fIport\fP][=\fIaccept\fP] .RE .LP Prepending a \fBP:\fP onto \fIhostname\fP causes the connection to go through the \fItelnet-passthru\fP service rather than directly to the host. See \s-1PASSTHRU\s+1 below. .LP Prepending an \fBS:\fP onto \fIhostname\fP removes the "extended data stream" option reported to the host. See \fB\-tn\fP below for further information. .LP Prepending an \fBN:\fP onto \fIhostname\fP turns off TN3270E support for the session. .LP Prepending an \fBL:\fP onto \fIhostname\fP causes \fBs3270\fP to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if \fBs3270\fP was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the \fBL:\fP prefix should not be used. .LP Prepending a \fBY:\fP onto \fIhostname\fP causes \fBs3270\fP to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. .LP Prepending an \fBA:\fP onto \fIhostname\fP is equivalent to setting the \fB\-nvt\fP option; it forces an NVT-mode session instead of a 3270-mode session. .LP A specific Logical Unit (LU) name to use may be specified by prepending it to the \fIhostname\fP with an `\fB@\fP'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) .LP The \fIhostname\fP may optionally be placed inside square-bracket characters `\fB[\fP' and `\fB]\fP'. This will prevent any colon `\fB:\fP' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. .LP On systems that support the \fIforkpty\fP library call, the \fIhostname\fP may be replaced with \fB\-e\fP and a command string. This will cause \fBs3270\fP to connect to a local child process, such as a shell. .LP The port to connect to defaults to \fBtelnet\fP. This can be overridden with the \fB\-port\fP option, or by appending a \fIport\fP to the \fIhostname\fP with a colon `\fB:\fP'. (For compatability with previous versions of \fBs3270\fP and with \fItn3270\fP(1), the \fIport\fP may also be specified as a second, separate argument.) .LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`\fB=\fP'). The accept name can also be specified with the \fB\-accepthostname\fP option. .SH "OPTIONS" \fBs3270\fP understands the following options: .TP \fB\-accepthostname\fP \fIname\fP Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. .TP \fB\-cadir\fP \fIdirectory\fP Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) .TP \fB\-cafile\fP \fIfilename\fP Specifies a \s-1PEM\s+1-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) .TP \fB\-certfile\fP \fIfilename\fP Specifies a file containing a client certificate to provide to the host. The default file type is \s-1PEM\s+1. .TP \fB\-clientcert\fP \fIname\fP Specifies the name of a client certificate to provide to the host. (MacOS only) .TP \fB\-certfiletype\fP \fItype\fP Specifies the type of the certificate file specified by \fB\-certfile\fP. \fIType\fP can be \fBpem\fP or \fBasn1\fP. (OpenSSL only) .TP \fB\-chainfile \fIfilename\fP\fP Specifies a certificate chain file in \s-1PEM\s+1 format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If \fB\-chainfile\fP is specified, it overrides \fB\-certfile\fP. (OpenSSL only) .TP \fB\-charset\fP \fIname\fP Specifies an \s-1EBCDIC\s+1 host character set. .TP \fB\-clear\fP \fItoggle\fP Sets the initial value of \fItoggle\fP to \fBfalse\fP. .TP \fB\-connecttimeout\fP \fIseconds\fP Specifies the time that s3270 will wait for a host connection to complete. .TP \fB\-devname\fP \fIname\fP Specifies a device name (workstation ID) for RFC 4777 support. .TP \fB\-httpd\fP \fB[\fP\fIaddr\fP\fB:]\fP\fIport\fP Specifies a port and optional address to listen on for HTTP connections. \fIAddr\fP can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. .IP Note that this option is mutually-exclusive with the \-scriptport option and disables reading commands from standard input. .TP \fB\-keyfile\fP \fIfilename\fP Specifies a file containing the private key for the certificate file (specified via \fB\-certfile\fP or \fB\-chainfile\fP). The default file type is \s-1PEM\s+1. (OpenSSL only) .TP \fB\-keyfiletype\fP \fItype\fP Specifies the type of the private key file specified by \fB\-keyfile\fP. \fIType\fP can be \fBpem\fP or \fBasn1\fP. (OpenSSL only) .TP \fB\-keypasswd\fP \fItype\fP:\fIvalue\fP Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be \fBfile\fP:\fIfilename\fP, specifying that the password is in a file, or \fBstring\fP:\fIstring\fP, specifying the password on the command-line directly. If the private key file is encrypted and no \fB\-keypasswd\fP option is given, secure connections will not be allowed. .TP \fB\-km\fP \fIname\fP Specifies the local encoding method for multi-byte text. \fIname\fP is an encoding name recognized by the ICU library. (Supported only when s3270 is compiled with DBCS support, and necessary only when s3270 cannot figure it out from the locale.) .TP \fB\-loginmacro\fP \fIAction(arg...) ...\fP Specifies a macro to run at login time. .TP \fB\-minversion\fP \fIversion\fP The minimum required version of \fBs3270\fP, e.g., 3.6ga4. If the running version is less than the specified version, \fBs3270\fP will abort. The format of a version is \fImajor\fP\fB.\fP\fIminor\fP\fBtype\fP\fIiteration\fP. \fBtype\fP is ignored, and \fIminor\fP and \fIiteration\fP can be omitted. .TP \fB\-model\fP \fIname\fP The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: .IP The first part is the \fBbase model\fP, which is either \fB3278\fP or \fB3279\fP. \fB3278\fP specifies a monochrome (green on black) 3270 display; \fB3279\fP specifies a color 3270 display. .IP The second part is the \fBmodel number\fP, which specifies the number of rows and columns. Model 4 is the default. .PP .TS center; c c c . T{ .na .nh Model Number T} T{ .na .nh Columns T} T{ .na .nh Rows T} _ T{ .na .nh 2 T} T{ .na .nh 80 T} T{ .na .nh 24 T} T{ .na .nh 3 T} T{ .na .nh 80 T} T{ .na .nh 32 T} T{ .na .nh 4 T} T{ .na .nh 80 T} T{ .na .nh 43 T} T{ .na .nh 5 T} T{ .na .nh 132 T} T{ .na .nh 27 T} .TE .IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. .IP The default model is \fB3279\-4\fP. .TP \fB\-noverifycert\fP For SSL/TLS connections, do not verify the host certificate. .TP \fB\-nvt\fP Start in NVT mode instead of waiting for the host to send data, and make the default terminal type \fBxterm\fP. .TP \fB\-oversize\fP \fIcols\fP\fBx\fP\fIrows\fP Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "s3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. .TP \fB\-port\fP \fIn\fP Specifies a different \s-1TCP\s+1 port to connect to. \fIn\fP can be a name from \fB/etc/services\fP like \fBtelnet\fP, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) .TP \fB\-proxy \fItype\fP:\fIhost\fP[:\fIport\fP]\fP Causes \fBs3270\fP to connect via the specified proxy, instead of using a direct connection. The \fIhost\fP can be an IP address or hostname. The optional \fIport\fP can be a number or a service name. For a list of supported proxy \fItypes\fP, see \s-1PROXY\s+1 below. .TP \fB\-scriptport\fP \fB[\fP\fIaddr\fP\fB:]\fP\fIport\fP Specifies a port and optional address to listen on for scripting connections. \fIAddr\fP can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. .IP Note that this option is mutually-exclusive with the \-httpd option and disables reading commands from standard input. .TP \fB\-scriptportonce\fP Allows s3270 to accept only one script connection. When that connection is broken, s3270 will exit. .TP \fB\-set\fP \fItoggle\fP Sets the initial value of \fItoggle\fP to \fBtrue\fP. .TP \fB\-socket\fP Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named \fB/tmp/x3sck.\fP\fIpid\fP. The \fB\-p\fP option of \fIx3270if\fP causes it to use this socket, instead of pipes specified by environment variables. .TP \fB\-tn\fP \fIname\fP Specifies the terminal name to be transmitted over the telnet connection. The default name is \fBIBM\-\fP\fImodel_name\fP\fB\-E\fP, for example, \fBIBM\-3278\-4\-E\fP. .IP Some hosts are confused by the \fB\-E\fP suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an \fBs:\fP on the hostname, or setting the "s3270.extended" resource to "false", removes the \fB\-E\fP from the terminal name when connecting to such hosts. .IP The name can also be specified with the "s3270.termName" resource. .TP \fB\-trace\fP Turns on data stream and event tracing at startup. The default trace file name is \fB/tmp/x3trc\fP. .TP \fB\-tracefile\fP \fIfile\fP Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file. .TP \fB\-tracefilesize\fP \fIsize\fP Places a limit on the size of a trace file. If this option is not specified, or is specified as \fB0\fP or \fBnone\fP, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of \fIsize\fP can have a \fBK\fP or \fBM\fP suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started. .TP \fB\-user\fP \fIname\fP Specifies the user name for RFC 4777 support. .TP \fB\-utf8\fP Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. .TP \fB\-v\fP Display the version and build options for \fBs3270\fP and exit. .TP \fB\-verifycert\fP For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a \fBy:\fP prepended to the hostname when connecting. .TP \fB\-xrm\fP "s3270.\fIresource\fP: \fIvalue\fP" Sets the value of the named \fIresource\fP to \fIvalue\fP. Resources control less common \fBs3270\fP options, and are defined under \s-1RESOURCES\s+1 below. .SH "ACTIONS" Here is a complete list of basic s3270 actions. Script-specific actions are described on the \fIx3270-script\fP(1) manual page. ).PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. .PP .TS center; lw(3i) lw(3i). T{ .na .nh .in +2 .ti -2 *Attn T} T{ .na .nh attention key T} T{ .na .nh .in +2 .ti -2 BackSpace T} T{ .na .nh move cursor left (or send \s-1ASCII BS\s+1) T} T{ .na .nh .in +2 .ti -2 BackTab T} T{ .na .nh tab to start of previous input field T} T{ .na .nh .in +2 .ti -2 CircumNot T} T{ .na .nh input "^" in \s-1NVT\s+1 mode, or "notsign" in 3270 mode T} T{ .na .nh .in +2 .ti -2 *Clear T} T{ .na .nh clear screen T} T{ .na .nh .in +2 .ti -2 *Connect(\fIhost\fP) T} T{ .na .nh connect to \fIhost\fP T} T{ .na .nh .in +2 .ti -2 *CursorSelect T} T{ .na .nh Cursor Select \s-1AID\s+1 T} T{ .na .nh .in +2 .ti -2 Delete T} T{ .na .nh delete character under cursor (or send \s-1ASCII DEL\s+1) T} T{ .na .nh .in +2 .ti -2 DeleteField T} T{ .na .nh delete the entire field T} T{ .na .nh .in +2 .ti -2 DeleteWord T} T{ .na .nh delete the current or previous word T} T{ .na .nh .in +2 .ti -2 *Disconnect T} T{ .na .nh disconnect from host T} T{ .na .nh .in +2 .ti -2 Down T} T{ .na .nh move cursor down T} T{ .na .nh .in +2 .ti -2 Dup T} T{ .na .nh duplicate field T} T{ .na .nh .in +2 .ti -2 *Enter T} T{ .na .nh Enter \s-1AID\s+1 (or send \s-1ASCII CR\s+1) T} T{ .na .nh .in +2 .ti -2 Erase T} T{ .na .nh erase previous character (or send \s-1ASCII BS\s+1) T} T{ .na .nh .in +2 .ti -2 EraseEOF T} T{ .na .nh erase to end of current field T} T{ .na .nh .in +2 .ti -2 EraseInput T} T{ .na .nh erase all input fields T} T{ .na .nh .in +2 .ti -2 Execute(\fIcmd\fP) T} T{ .na .nh execute a command in a shell T} T{ .na .nh .in +2 .ti -2 FieldEnd T} T{ .na .nh move cursor to end of field T} T{ .na .nh .in +2 .ti -2 FieldMark T} T{ .na .nh mark field T} T{ .na .nh .in +2 .ti -2 HexString(\fIhex_digits\fP) T} T{ .na .nh insert control-character string T} T{ .na .nh .in +2 .ti -2 Home T} T{ .na .nh move cursor to first input field T} T{ .na .nh .in +2 .ti -2 Insert T} T{ .na .nh set insert mode T} T{ .na .nh .in +2 .ti -2 *Interrupt T} T{ .na .nh send \s-1TELNET IP\s+1 to host T} T{ .na .nh .in +2 .ti -2 Key(\fIkeysym\fP) T} T{ .na .nh insert key \fIkeysym\fP T} T{ .na .nh .in +2 .ti -2 Key(0x\fIxx\fP) T} T{ .na .nh insert key with character code \fIxx\fP T} T{ .na .nh .in +2 .ti -2 Left T} T{ .na .nh move cursor left T} T{ .na .nh .in +2 .ti -2 Left2 T} T{ .na .nh move cursor left 2 positions T} T{ .na .nh .in +2 .ti -2 MonoCase T} T{ .na .nh toggle uppercase-only mode T} T{ .na .nh .in +2 .ti -2 MoveCursor(\fIrow\fP, \fIcol\fP) T} T{ .na .nh move cursor to zero-origin (\fIrow\fP,\fIcol\fP) T} T{ .na .nh .in +2 .ti -2 Newline T} T{ .na .nh move cursor to first field on next line (or send \s-1ASCII LF\s+1) T} T{ .na .nh .in +2 .ti -2 NextWord T} T{ .na .nh move cursor to next word T} T{ .na .nh .in +2 .ti -2 *PA(\fIn\fP) T} T{ .na .nh Program Attention \s-1AID\s+1 (\fIn\fP from 1 to 3) T} T{ .na .nh .in +2 .ti -2 *PF(\fIn\fP) T} T{ .na .nh Program Function \s-1AID\s+1 (\fIn\fP from 1 to 24) T} T{ .na .nh .in +2 .ti -2 PreviousWord T} T{ .na .nh move cursor to previous word T} T{ .na .nh .in +2 .ti -2 PrintText(\fIcommand\fP) T} T{ .na .nh print screen text on printer T} T{ .na .nh .in +2 .ti -2 Quit T} T{ .na .nh exit \fBs3270\fP T} T{ .na .nh .in +2 .ti -2 Redraw T} T{ .na .nh redraw window T} T{ .na .nh .in +2 .ti -2 Reset T} T{ .na .nh reset locked keyboard T} T{ .na .nh .in +2 .ti -2 Right T} T{ .na .nh move cursor right T} T{ .na .nh .in +2 .ti -2 Right2 T} T{ .na .nh move cursor right 2 positions T} T{ .na .nh .in +2 .ti -2 *Script(\fIcommand\fP[,\fIarg\fP...]) T} T{ .na .nh run a script T} T{ .na .nh .in +2 .ti -2 *String(\fIstring\fP) T} T{ .na .nh insert string (simple macro facility) T} T{ .na .nh .in +2 .ti -2 Tab T} T{ .na .nh move cursor to next input field T} T{ .na .nh .in +2 .ti -2 Toggle(\fIoption\fP[,\fIset|clear\fP]) T} T{ .na .nh toggle an option T} T{ .na .nh .in +2 .ti -2 ToggleInsert T} T{ .na .nh toggle insert mode T} T{ .na .nh .in +2 .ti -2 ToggleReverse T} T{ .na .nh toggle reverse-input mode T} T{ .na .nh .in +2 .ti -2 *Transfer(\fIoption\fP=\fIvalue\fP...') T} T{ .na .nh file transfer T} T{ .na .nh .in +2 .ti -2 Up T} T{ .na .nh move cursor up T} .TE .LP Note that certain parameters to s3270 actions (such as the names of files and keymaps) are subject to \fIsubstitutions\fP: .LP The character \fB~\fP at the beginning of a string is replaced with the user's home directory. A \fB~\fP character followed by a username is replaced with that user's home directory. .LP Environment variables are substituted using the Unix shell convention of $\fIname\fP or ${\fIname\fP}. .LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. .SH "FILE TRANSFER" The \fBTransfer\fP action implements \fBIND$FILE\fP file transfer. This action requires that the \fBIND$FILE\fP program be installed on the \s-1IBM\s+1 host, and that the 3270 cursor be located in a field that will accept a \s-1TSO\s+1 or \s-1VM/CMS\s+1 command. .LP .LP Because of the complexity and number of options for file transfer, the parameters to the \fBTransfer\fP action take the unique form of \fIoption\fP=\fIvalue\fP, and can appear in any order. Note that if the \fIvalue\fP contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: .LP .TS l c l l. T{ .na .nh Option T} T{ .na .nh Required? T} T{ .na .nh Default T} T{ .na .nh Other Values T} _ T{ .na .nh Direction T} T{ .na .nh No T} T{ .na .nh receive T} T{ .na .nh send T} T{ .na .nh HostFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh LocalFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Host T} T{ .na .nh No T} T{ .na .nh tso T} T{ .na .nh vm, cics T} T{ .na .nh Mode T} T{ .na .nh No T} T{ .na .nh ascii T} T{ .na .nh binary T} T{ .na .nh Cr T} T{ .na .nh No T} T{ .na .nh remove T} T{ .na .nh add, keep T} T{ .na .nh Remap T} T{ .na .nh No T} T{ .na .nh yes T} T{ .na .nh no T} T{ .na .nh Exist T} T{ .na .nh No T} T{ .na .nh keep T} T{ .na .nh replace, append T} T{ .na .nh Recfm T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh fixed, variable, undefined T} T{ .na .nh Lrecl T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Blksize T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Allocation T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh tracks, cylinders, avblock T} T{ .na .nh PrimarySpace T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh SecondarySpace T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Avblock T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh BufferSize T} T{ .na .nh No T} T{ .na .nh 4096 T} T{ .na .nh \ T} .TE .LP The option details are as follows. .TP \fBDirection\fP \fBsend\fP to send a file to the host, \fBreceive\fP to receive a file from the host. .TP \fBHostFile\fP The name of the file on the host. .TP \fBLocalFile\fP The name of the file on the local workstation. .TP \fBHost\fP The type of host (which dictates the form of the \fBIND$FILE\fP command): \fBtso\fP (the default), \fBvm\fP or \fBcics\fP. .TP \fBMode\fP Use \fBascii\fP (the default) for a text file, which will be translated between \s-1EBCDIC\s+1 and \s-1ASCII\s+1 as necessary. Use \fBbinary\fP for non-text files. .TP \fBCr\fP Controls how \fBNewline\fP characters are handled when transferring \fBMode=ascii\fP files. \fBremove\fP (the default) strips \fBNewline\fP characters in local files before transferring them to the host. \fBadd\fP adds \fBNewline\fP characters to each host file record before transferring it to the local workstation. \fBkeep\fP preserves \fBNewline\fP characters when transferring a local file to the host. .TP \fBRemap\fP Controls text translation for \fBMode=ascii\fP files. The value \fByes\fP (the default) causes s3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's \s-1EBCDIC\s+1 code page. The value \fBno\fP causes s3270 to pass the text to or from the host as-is, leaving all translation to the \fBIND$FILE\fP program on the host. .TP \fBExist\fP Controls what happens when the destination file already exists. \fBkeep\fP (the default) preserves the file, causing the \fBTransfer\fP action to fail. \fBreplace\fP overwrites the destination file with the source file. \fBappend\fP appends the source file to the destination file. .TP \fBRecfm\fP Controls the record format of files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) \fBfixed\fP creates a file with fixed-length records. \fBvariable\fP creates a file with variable-length records. \fBundefined\fP creates a file with undefined-length records (\s-1TSO\s+1 hosts only). The \fBLrecl\fP option controls the record length or maximum record length for \fBRecfm=fixed\fP and \fBRecfm=variable\fP files, respectively. .TP \fBLrecl\fP Specifies the record length (or maximum record length) for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBBlksize\fP Specifies the block size for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBAllocation\fP Specifies the units for the \fBPrimarySpace\fP and \fBSecondarySpace\fP options: \fBtracks\fP, \fBcylinders\fP or \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBPrimarySpace\fP Primary allocation for a file. The units are given by the \fBAllocation\fP option. Required when the \fBAllocation\fP is specified as something other than \fBdefault\fP. (\s-1TSO\s+1 hosts only.) .TP \fBSecondarySpace\fP Secondary allocation for a file. The units are given by the \fBAllocation\fP option. (\s-1TSO\s+1 hosts only.) .TP \fBAvblock\fP Average block size, required when \fBAllocation\fP specifies \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBBufferSize\fP Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. .LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the \fBTransfer\fP keywords, but with \fBft\fP prepended. E.g., the default for the \fBMode\fP keyword is the \fBs3270.ftMode\fP resource. .SH "THE PRINTTEXT ACTION" The \fBPrintText\fP produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., \fBlpr\fP. .LP Multiple arguments can include keywords to control the output of \fBPrintText\fP: .TP \fBfile\fP \fIfilename\fP Save the output in a file. .TP \fBhtml\fP Save the output as HTML. This option implies \fBfile\fP. .TP \fBrtf\fP Save the output as RichText. This option implies \fBfile\fP. The font defaults to \fBCourier New\fP and the point size defaults to 8. These can be overridden by the \fBprintTextFont\fP and \fBprintTextSize\fP resources, respectively. .TP \fBstring\fP Return the output as a string. This can only be used from scripts. .TP \fBmodi\fP Render modified fields in italics. .TP \fBcaption\fP \fItext\fP Add the specified \fItext\fP as a caption above the output. Within \fItext\fP, the special sequence \fB%T%\fP will be replaced with a timestamp. .TP \fBcommand\fP \fIcommand\fP Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. .SH "NESTED SCRIPTS" There are several types of nested script functions available. .TP \fBThe String Action\fP The simplest method for nested scripts is provided via the \fBString\fP action. The arguments to \fBString\fP are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the \s-1AID\s+1 code to the host, \fBs3270\fP will wait for the host to unlock the keyboard before further processing the string.) .TS l l. T{ .na .nh \eb T} T{ .na .nh Left T} T{ .na .nh \ee\fIxxxx\fP T} T{ .na .nh EBCDIC character in hex T} T{ .na .nh \ef T} T{ .na .nh Clear* T} T{ .na .nh \en T} T{ .na .nh Enter* T} T{ .na .nh \epa\fIn\fP T} T{ .na .nh PA(\fIn\fP)* T} T{ .na .nh \epf\fInn\fP T} T{ .na .nh PF(\fInn\fP)* T} T{ .na .nh \er T} T{ .na .nh Newline T} T{ .na .nh \et T} T{ .na .nh Tab T} T{ .na .nh \eT T} T{ .na .nh BackTab T} T{ .na .nh \eu\fIxxxx\fP T} T{ .na .nh Unicode character in hex T} T{ .na .nh \ex\fIxxxx\fP T} T{ .na .nh Unicode character in hex T} .TE .IP Note that the numeric values for the \ee, \eu and \ex sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if s3270 is built with DBCS support and the host allows DBCS input in the current field. .IP \fBNote:\fP The strings are in \s-1ASCII\s+1 and converted to \s-1EBCDIC\s+1, so beware of inserting control codes. .IP There is also an alternate form of the \fBString\fP action, \fBHexString\fP, which is used to enter non-printing data. The argument to \fBHexString\fP is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent \s-1EBCDIC\s+1 characters, which are entered into the current field. In \s-1NVT\s+1 mode, the hexadecimal data represent \s-1ASCII\s+1 characters, which are sent directly to the host. .TP \fBThe Script Action\fP This action causes \fBs3270\fP to start a child process which can execute \fBs3270\fP actions. Standard input and output from the child process are piped back to \fBs3270\fP. The \fBScript\fP action is fully documented in \fIx3270-script\fP(1). .SH "PASSTHRU" \fBs3270\fP supports the Sun \fItelnet-passthru\fP service provided by the \fIin.telnet-gw\fP server. This allows outbound telnet connections through a firewall machine. When a \fBp:\fP is prepended to a hostname, \fBs3270\fP acts much like the \fIitelnet\fP(1) command. It contacts the machine named \fBinternet-gateway\fP at the port defined in \fB/etc/services\fP as \fBtelnet-passthru\fP (which defaults to 3514). It then passes the requested hostname and port to the \fBin.telnet-gw\fP server. .SH "PROXY" The \fB\-proxy\fP option or the \fBs3270.proxy\fP resource causes s3270 to use a proxy server to connect to the host. The syntax of the option or resource is: .RS \fItype\fP:\fIhost\fP[:\fIport\fP] .RE The supported values for \fItype\fP are: .TS center; c l c . T{ .na .nh Proxy Type T} T{ .na .nh Protocol T} T{ .na .nh Default Port T} _ T{ .na .nh http T} T{ .na .nh RFC 2817 HTTP tunnel (squid) T} T{ .na .nh 3128 T} T{ .na .nh passthru T} T{ .na .nh Sun in.telnet-gw T} T{ .na .nh none T} T{ .na .nh socks4 T} T{ .na .nh SOCKS version 4 T} T{ .na .nh 1080 T} T{ .na .nh socks5 T} T{ .na .nh SOCKS version 5 (RFC 1928) T} T{ .na .nh 1080 T} T{ .na .nh telnet T} T{ .na .nh No protocol (just send \fBconnect\fP \fIhost port\fP) T} T{ .na .nh none T} .TE .LP The special types \fBsocks4a\fP and \fBsocks5d\fP can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. .SH "RESOURCES" Certain \fBs3270\fP options can be configured via resources. Resources are defined by \fB\-xrm\fP options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in \fBs3270\fP are: .LP .TS l l l l. T{ .na .nh Resource T} T{ .na .nh Default T} T{ .na .nh Option T} T{ .na .nh Purpose T} _ T{ .na .nh blankFill T} T{ .na .nh False T} T{ .na .nh \-set blankFill T} T{ .na .nh Blank Fill mode T} T{ .na .nh charset T} T{ .na .nh bracket T} T{ .na .nh \-charset T} T{ .na .nh \s-1EBCDIC\s+1 character set T} T{ .na .nh dbcsCgcsgid T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Override DBCS CGCSGID T} T{ .na .nh dsTrace T} T{ .na .nh False T} T{ .na .nh \-trace T} T{ .na .nh Data stream tracing T} T{ .na .nh eof T} T{ .na .nh ^D T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode \s-1EOF\s+1 character T} T{ .na .nh erase T} T{ .na .nh ^H T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode erase character T} T{ .na .nh extended T} T{ .na .nh True T} T{ .na .nh \ T} T{ .na .nh Use 3270 extended data stream T} T{ .na .nh eventTrace T} T{ .na .nh False T} T{ .na .nh \-trace T} T{ .na .nh Event tracing T} T{ .na .nh icrnl T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Map \s-1CR\s+1 to \s-1NL\s+1 on \s-1NVT\s+1-mode input T} T{ .na .nh inlcr T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Map \s-1NL\s+1 to \s-1CR\s+1 in \s-1NVT\s+1-mode input T} T{ .na .nh intr T} T{ .na .nh ^C T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode interrupt character T} T{ .na .nh kill T} T{ .na .nh ^U T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode kill character T} T{ .na .nh lineWrap T} T{ .na .nh False T} T{ .na .nh \-set lineWrap T} T{ .na .nh \s-1NVT\s+1 line wrap mode T} T{ .na .nh lnext T} T{ .na .nh ^V T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode lnext character T} T{ .na .nh m3279 T} T{ .na .nh (note 1) T} T{ .na .nh \-model T} T{ .na .nh 3279 (color) emulation T} T{ .na .nh monoCase T} T{ .na .nh False T} T{ .na .nh \-set monoCase T} T{ .na .nh Mono-case mode T} T{ .na .nh numericLock T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Lock keyboard for numeric field error T} T{ .na .nh oerrLock T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Lock keyboard for input error T} T{ .na .nh oversize T} T{ .na .nh \ T} T{ .na .nh \-oversize T} T{ .na .nh Oversize screen dimensions T} T{ .na .nh port T} T{ .na .nh telnet T} T{ .na .nh \-port T} T{ .na .nh Non-default TCP port T} T{ .na .nh quit T} T{ .na .nh ^\e T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode quit character T} T{ .na .nh rprnt T} T{ .na .nh ^R T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode reprint character T} T{ .na .nh sbcsCgcsgid T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Override SBCS CGCSGID T} T{ .na .nh secure T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Disable "dangerous" options T} T{ .na .nh termName T} T{ .na .nh (note 2) T} T{ .na .nh \-tn T} T{ .na .nh \s-1TELNET\s+1 terminal type string T} T{ .na .nh traceDir T} T{ .na .nh /tmp T} T{ .na .nh \ T} T{ .na .nh Directory for trace files T} T{ .na .nh traceFile T} T{ .na .nh (note 3) T} T{ .na .nh \-tracefile T} T{ .na .nh File for trace output T} T{ .na .nh werase T} T{ .na .nh ^W T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode word-erase character T} .TE .LP .RS \fINote 1\fP: \fBm3279\fP defaults to \fBFalse\fP. It can be forced to \fBTrue\fP with the proper \fB\-model\fP option. .LP \fINote 2\fP: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as \fBIBM-3279-2-E\fP. Note also that when \s-1TN3270E\s+1 mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. .LP \fINote 3\fP: The default trace file is \fBx3trc.\fP\fIpid\fP in the directory specified by the \fBtraceDir\fP resource. .RE .LP If more than one \fB\-xrm\fP option is given for the same resource, the last one on the command line is used. .SH "FILES" /usr/local/lib/x3270/ibm_hosts .br .SH "SEE ALSO" x3270-script(1), x3270(1), c3270(1), tcl3270(1), telnet(1), tn3270(1) .br Data Stream Programmer's Reference, IBM GA23-0059 .br Character Set Reference, IBM GA27-3831 .br RFC 1576, TN3270 Current Practices .br RFC 1646, TN3270 Extensions for LUname and Printer Selection .br RFC 2355, TN3270 Enhancements .SH "COPYRIGHTS" Copyright 1993-2017, Paul Mattes. .br Copyright 2004-2005, Don Russell. .br Copyright 2004, Dick Altenbern. .br Copyright 1990, Jeff Sparkes. .br Copyright 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. .br All rights reserved. .LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: .TP * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. .TP * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. .TP * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. .LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .SH "VERSION" s3270 3.6ga4 suite3270-3.6/s3270/version.txt0000775000076500007650000000006013221577443014200 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/s3270/x3270_glue.expect0000664000076500007650000002102713221577163014765 0ustar pdmpdm# Copyright (c) 2000-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Glue functions between 'expect' and x3270 # Usage: source x3270_glue.expect namespace eval x3270 { variable verbose 0 variable pid 0 # Start function: Start ?-nohup? ?program? ?options? # # Sets up the 'expect' environment correctly and spawns a 3270 # interface process. # # The 'program' and 'options' can be: # "x3270 -script" to drive an x3270 session # "s3270" to drive a displayless 3270 session # "x3270if -i" to run as a child script of x3270 (via the Script() # action) # # If "args" is empty, or starts with an option besides '-nohup', # guesses which process to start. # It will only guess "x3270if -i" or "s3270"; if you want to start # x3270, you need to specify it explicitly. # # Returns the process ID of the spawned process. proc Start {args} { global stty_init timeout spawn_id env variable verbose variable pid if {$pid != 0} {return -code error "Already started."} # If the first argument is "-nohup", remember that as an # argument to 'spawn'. if {[lindex $args 0] == "-nohup"} { set nohup {-ignore HUP} set args [lrange $args 1 end] } { set nohup {} } # If there are no arguments, or the first argument is an # option, guess what to start. # If X3270INPUT is defined in the environment, this must be a # child script; start x3270if. Otherwise, this must be a peer # script; start s3270. if {$args == {} || [string index [lindex $args 0] 0] == "-"} { if {[info exists env(X3270INPUT)]} { set args [concat x3270if -i $args] } { if {$::tcl_platform(platform) == "windows"} { set args [concat ws3270 $args] } { set args [concat s3270 $args] } } } # Set up the pty initialization default. set stty_init -echo # Spawn the process. if {$verbose} { set pid [eval [concat spawn $nohup $args]] } { set pid [eval [concat spawn -noecho $nohup $args]] log_user 0 } # Set the 'expect' timeout. set timeout -1 return $pid } # Basic interface command. Used internally by the action functions # below. proc cmd {cmd} { variable verbose variable pid if {$pid==0} { return -code error "Not started yet." } if {$verbose} {puts "+$cmd"} send "$cmd\r" expect { -re "data: (.*)\r?\n.*\r?\nok\r?\n$" { set r $expect_out(buffer) } -re ".*ok\r?\n" { return {} } -re "(.*)\r?\n.*?\r?\nerror\r?\n" { return -code error "$expect_out(1,string)" } -re ".*error\r?\n" { return -code error \ "$cmd failed: $expect_out(buffer)" } eof { set pid 0; error "process died" } } # Convert result to a list. set ret {} set iter 0 while {1} { if {! [regexp "data: (.*?)\r?\n" $r dummy elt]} {break} if {$iter==1} {set ret [list $ret]} set r [string range $r [expr [string length $elt]+7] \ end] if {$iter > 0} { set ret [linsert $ret end $elt] } { set ret $elt } set iter [expr $iter + 1] } if {$verbose} {puts "ret $iter"} return $ret } # Convert an argument list to a comma-separated list that x3270 will # accept. proc commafy {alist} { set i 0 set a "" while {$i < [llength $alist]} { if {$i > 0} { set a "$a,[lindex $alist $i]" } { set a [lindex $alist $i] } incr i } return $a } # Quote a text string into x3270-acceptable format. proc stringify {text} { set a "\"" set i 0 while {$i < [string len $text]} { set c [string range $text $i $i] switch -- $c { "\n" { set a "$a\\n" } "\r" { set a "$a\\r" } " " { set a "$a\\ " } "\"" { set a "$a\\\"" } default { set a "$a$c" } } incr i } set a "$a\"" return $a } # User-accessible actions. # Some of these apply only to x3270 and x3270if, and not to s3270. proc AltCursor {} { return [cmd "AltCursor"] } proc Ascii {args} { return [cmd "Ascii([commafy $args])"] } proc AsciiField {} { return [cmd "AsciiField"] } proc Attn {} { return [cmd "Attn"] } proc BackSpace {} { return [cmd "BackSpace"] } proc BackTab {} { return [cmd "BackTab"] } proc CircumNot {} { return [cmd "CircumNot"] } proc Clear {} { return [cmd "Clear"] } proc CloseScript {} { return [cmd "CloseScript"] } proc Cols {} { return [lindex [Status] 7] } proc Compose {} { return [cmd "Compose"] } proc Connect {host} { return [cmd "Connect($host)"] } proc CursorSelect {} { return [cmd "CursorSelect"] } proc Delete {} { return [cmd "Delete"] } proc DeleteField {} { return [cmd "DeleteField"] } proc DeleteWord {} { return [cmd "DeleteWord"] } proc Disconnect {} { return [cmd "Disconnect"] } proc Down {} { return [cmd "Down"] } proc Dup {} { return [cmd "Dup"] } proc Ebcdic {args} { return [cmd "Ebcdic([commafy $args])"] } proc EbcdicField {} { return [cmd "EbcdicField"] } proc Enter {} { return [cmd "Enter"] } proc Erase {} { return [cmd "Erase"] } proc EraseEOF {} { return [cmd "EraseEOF"] } proc EraseInput {} { return [cmd "EraseInput"] } proc FieldEnd {} { return [cmd "FieldEnd"] } proc FieldMark {} { return [cmd "FieldMark"] } proc FieldExit {} { return [cmd "FieldExit"] } proc Flip {} { return [cmd "Flip"] } proc HexString {x} { return [cmd "HexString($x)"] } proc Home {} { return [cmd "Home"] } proc Info {text} { return [cmd "Info([stringify $text])"] } proc Insert {} { return [cmd "Insert"] } proc Interrupt {} { return [cmd "Interrupt"] } proc Key {k} { return [cmd "Key($k)"] } proc Keymap {k} { return [cmd "Keymap($k)"] } proc Left {} { return [cmd "Left"] } proc Left2 {} { return [cmd "Left2"] } proc MonoCase {} { return [cmd "MonoCase"] } proc MoveCursor {r c} { return [cmd "MoveCursor($r,$c)"] } proc Newline {} { return [cmd "Newline"] } proc NextWord {} { return [cmd "NextWord"] } proc PA {n} { return [cmd "PA($n)"] } proc PF {n} { return [cmd "PF($n)"] } proc PreviousWord {} { return [cmd "PreviousWord"] } proc Quit {} { exit } proc Reset {} { return [cmd "Reset"] } proc Right {} { return [cmd "Right"] } proc Right2 {} { return [cmd "Right2"] } proc Rows {} { return [lindex [Status] 6] } proc SetFont {font} { return [cmd "SetFont($font)"] } proc Snap {args} { return [cmd "Snap([commafy $args])"] } proc Status {} { variable verbose variable pid if {$pid==0} { return -code error "Not started yet." } if {$verbose} {puts "+(nothing)"} send "\r" expect { -re ".*ok\r?\n" { set r $expect_out(buffer) } eof { set pid 0; error "process died" } } return [string range $r 0 [expr [string length $r]-7]] } proc String {text} { return [cmd "String([stringify $text])"] } proc SysReq {} { return [cmd "SysReq"] } proc Tab {} { return [cmd "Tab"] } proc ToggleInsert {} { return [cmd "ToggleInsert"] } proc ToggleReverse {} { return [cmd "ToggleReverse"] } proc TemporaryKeymap {args} { return [cmd "TemporaryKeymap($args)"] } proc Transfer {args} { return [cmd "Transfer([commafy $args])"] } proc Up {} { return [cmd "Up"] } proc Wait {args} { return [cmd "Wait([commafy $args])"] } # Extra function to toggle verbosity on the fly. proc Setverbose {level} { variable verbose set verbose $level return } # Export all the user-visible functions. namespace export \[A-Z\]* } # Import all of the exported functions. namespace import x3270::* suite3270-3.6/s3270/x3270if.man0000664000076500007650000001351513221600610013536 0ustar pdmpdm'\" t .TH X3270IF 1 "29 December 2017" .SH "NAME" x3270if \- command interface to x3270, c3270 and s3270 .SH "SYNOPSIS" \fBx3270if\fP [option]... [ \fIaction\fP ] .br \fBx3270if \-i\fP .SH "DESCRIPTION" \fBx3270if\fP provides an interface between scripts and the 3270 emulators \fIx3270\fP, \fIc3270\fP and \fIs3270\fP. .LP \fBx3270if\fP operates in one of two modes. In \fBaction mode\fP, it passes a single action and parameters to the emulator for execution. The result of the action is written to standard output, along with the (optional) status of the emulator. (The action is optional as well, so that \fBx3270if\fP can just reports the emulator status.) In \fBiterative mode\fP, it forms a continuous conduit between a script and the emulator. .LP The \fIaction\fP takes the form: .IP \fIaction-name\fP(\fIparam\fP[,\fIparam\fP]...) .LP The parentheses are manatory, and usually must be quoted when \fBx3270if\fP is called from a shell script. .LP If any \fIparam\fP contains a space or comma, it must be surrounded by double quotes. .SH "OPTIONS" .TP \fB\-s\fP \fIfield\fP Causes \fBx3270if\fP to write to stdout the value of one of the emulator status fields. \fIField\fP is an integer in the range 0 through 11. The value 0 is a no-op and is used only to return exit status indicating the state of the emulator. The indices 1-11 and meanings of each field are documented on the \fIx3270-script\fP(1) manual page. If an \fIaction\fP is specified as well, the status field is written after the output of the action, separated by a newline. The \fB\-s\fP option is mutually exclusive with the \fB\-S\fP and \fB\-i\fP options. .TP \fB\-S\fP Causes \fBx3270if\fP to write to stdout the value of all of the emulator status fields. If an \fIaction\fP is specified as well, the status fields are written after the output of the action, separated by a newline. The \fB\-S\fP option is mutually exclusive with the \fB\-s\fP and \fB\-i\fP options. .TP \fB\-i\fP Puts \fBx3270if\fP in iterative mode. Data from \fBx3270if\fP's standard input is copied to the emulator's script input; data from the emulator's script output is copied to \fBx3270if\fP's standard output. The \fB\-i\fP option is mutually exclusive with the \fB\-s\fP and \fB\-S\fP options. \fBx3270if\fP runs until it detects end-of-file on its standard input or on the output from the emulator. (This mode exists primarily to give \fIexpect\fP(1) a process to run, on systems which do not support bidirectional pipes.) .TP \fB\-p\fP \fIprocess-id\fP Causes \fIx3270if\fP to use a Unix-domain socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the \fB\-socket\fP option. .TP \fB\-t\fP \fIport\fP Causes \fIx3270if\fP to use a TCP socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the \fB\-scriptport\fP option. .TP \fB\-v\fP Turns on verbose debug messages, showing on stderr the literal data that is passed between the emulator and \fBx3270if\fP. .SH "EXIT STATUS" In action mode, if the requested \fIaction\fP succeeds, \fBx3270if\fP exits with status 0. If the action fails, \fBx3270if\fP exits with status 1. In iterative mode, \fBx3270if\fP exits with status 0 when it encounters end-of-file. If there is an operational error within \fBx3270if\fP itself, such as a command-line syntax error, missing environment variable, or an unexpectedly closed pipe, \fBx3270if\fP exits with status 2. .SH "ENVIRONMENT" When a script is run as a child process of one of the emulators via the \fBScript\fP action, the emulator passes information about how to control it in environment variables. .LP On Unix, the emulator process creates a pair of pipes for communication with the child script process. The values of the file descriptors for these pipes are encoded as text in two environment variables: .TP \fBX3270OUTPUT\fP Output from the emulator, input to the child process. .TP \fBX3270INPUT\fP Input to the emulator, output from the child process. .LP When an emulator is started with the \fB\-scriptport\fP option, the emulator will pass the scriptport port number encoded as text in the \fBX3270PORT\fP environment variable. \fIx3270if\fP will use that value as if it had been passed to it via the \fB\-t\fP option. \fBX3270PORT\fP takes precedence over \fBX3270OUTPUT\fP and \fBX3270INPUT\fP. .SH "SEE ALSO" x3270(1), c3270(1), s3270(1), x3270-script(1) .SH "COPYRIGHT" Copyright 1999-2009, 2017 Paul Mattes. .br All rights reserved. .LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: .TP * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. .TP * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. .TP * Neither the names of Paul Mattes nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. .LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES `AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/s3270/x3270if.man.m40000664000076500007650000002026413221577163014074 0ustar pdmpdmdnl Copyright (c) 1999-2009, 2013 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270IF,1,XX_DATE) XX_SH(Name) x3270if XX_DASHED() command interface to ifelse(XX_PLATFORM,unix,`x3270, ')dnl XX_C3270 and XX_S3270 XX_SH(Synopsis) XX_FB(x3270if) [option]... [ XX_FI(action) ] XX_BR XX_FB(x3270if XX_DASHED(i)) XX_SH(Description) XX_FB(x3270if) provides an interface between scripts and the 3270 emulators ifelse(XX_PLATFORM,unix,`XX_FI(x3270), ')dnl XX_FI(XX_C3270) and XX_FI(XX_S3270). XX_LP() XX_FB(x3270if) operates in one of two modes. In XX_FB(action mode), it passes a single action and parameters to the emulator for execution. The result of the action is written to standard output, along with the (optional) status of the emulator. (The action is optional as well, so that XX_FB(x3270if) can just reports the emulator status.) In XX_FB(iterative mode), it forms a continuous conduit between a script and the emulator. XX_LP() The XX_FI(action) takes the form: XX_IP() XX_FI(action-name)(XX_FI(param)[,XX_FI(param)]...) XX_LP() The parentheses are manatory, and usually must be quoted when XX_FB(x3270if) is called from a shell script. XX_LP() If any XX_FI(param) contains a space or comma, it must be surrounded by double quotes. XX_SH(Options) XX_TPS()dnl XX_TP(XX_FB(XX_DASHED(s)) XX_FI(field)) Causes XX_FB(x3270if) to write to stdout the value of one of the emulator status fields. XX_FI(Field) is an integer in the range 0 through 11. The value 0 is a no-op and is used only to return exit status indicating the state of the emulator. The indices 1-11 and meanings of each field are documented on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. If an XX_FI(action) is specified as well, the status field is written after the output of the action, separated by a newline. The XX_FB(XX_DASHED(s)) option is mutually exclusive with the XX_FB(XX_DASHED(S)) and XX_FB(XX_DASHED(i)) options. XX_TP(XX_FB(XX_DASHED(S))) Causes XX_FB(x3270if) to write to stdout the value of all of the emulator status fields. If an XX_FI(action) is specified as well, the status fields are written after the output of the action, separated by a newline. The XX_FB(XX_DASHED(S)) option is mutually exclusive with the XX_FB(XX_DASHED(s)) and XX_FB(XX_DASHED(i)) options. XX_TP(XX_FB(XX_DASHED(i))) Puts XX_FB(x3270if) in iterative mode. Data from XX_POSESSIVE(XX_FB(x3270if)) standard input is copied to the XX_POSESSIVE(emulator) script input; data from the XX_POSESSIVE(emulator) script output is copied to XX_POSESSIVE(XX_FB(x3270if)) standard output. The XX_FB(XX_DASHED(i)) option is mutually exclusive with the XX_FB(XX_DASHED(s)) and XX_FB(XX_DASHED(S)) options. XX_FB(x3270if) runs until it detects end-of-file on its standard input or on the output from the emulator. (This mode exists primarily to give XX_FI(expect)(1) a process to run, on systems which do not support bidirectional pipes.) ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(p)) XX_FI(process-id)) Causes XX_FI(x3270if) to use a Unix-domain socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the XX_FB(XX_DASHED(socket)) option. ')dnl XX_TP(XX_FB(XX_DASHED(t)) XX_FI(port)) Causes XX_FI(x3270if) to use a TCP socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the XX_FB(XX_DASHED(scriptport)) option. XX_TP(XX_FB(XX_DASHED(v))) Turns on verbose debug messages, showing on stderr the literal data that is passed between the emulator and XX_FB(x3270if). XX_TPE()dnl XX_SH(Exit Status) In action mode, if the requested XX_FI(action) succeeds, XX_FB(x3270if) exits with status 0. If the action fails, XX_FB(x3270if) exits with status 1. In iterative mode, XX_FB(x3270if) exits with status 0 when it encounters end-of-file. If there is an operational error within XX_FB(x3270if) itself, such as a command-line syntax error, missing environment variable, or an unexpectedly closed pipe, XX_FB(x3270if) exits with status 2. XX_SH(Environment) When a script is run as a child process of one of the emulators via the XX_FB(Script) action, the emulator passes information about how to control it in environment variables. ifelse(XX_PLATFORM,unix,`XX_LP() On Unix, the emulator process creates a pair of pipes for communication with the child script process. The values of the file descriptors for these pipes are encoded as text in two environment variables: XX_TPS()dnl XX_TP(XX_FB(X3270OUTPUT)) Output from the emulator, input to the child process. XX_TP(XX_FB(X3270INPUT)) Input to the emulator, output from the child process. XX_TPE()dnl ')dnl XX_LP() ifelse(XX_PLATFORM,unix,`When an emulator is started with the XX_FB(XX_DASHED(scriptport)) option, the ',`The') emulator will pass the scriptport port number encoded as text in the XX_FB(X3270PORT) environment variable. XX_FI(x3270if) will use that value as if it had been passed to it via the XX_FB(XX_DASHED(t)) option. ifelse(XX_PLATFORM,unix,`XX_FB(X3270PORT) takes precedence over XX_FB(X3270OUTPUT) and XX_FB(X3270INPUT). ')dnl XX_SH(See Also) ifelse(XX_PLATFORM,unix,`XX_LINK(x3270-man.html,x3270(1)), ')dnl XX_LINK(XX_C3270-man.html,XX_C3270`'(1)), XX_LINK(XX_S3270-man.html,XX_S3270`'(1)), XX_LINK(XX_X3270-script.html,XX_X3270-script(1)) XX_SH(Copyright) Copyright`'XX_COPY()1999-2009, XX_CYEAR Paul Mattes. XX_BR All rights reserved. XX_LP() Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP() THIS SOFTWARE IS PROVIDED BY PAUL MATTES XX_DQUOTED(AS IS) AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/s3270/x3270.man.m40000664000076500007650000023655313221577163013567 0ustar pdmpdmdnl Copyright (c) 1993-2017, Paul Mattes. dnl Copyright (c) 1990, Jeff Sparkes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their dnl contributors may be used to endorse or promote products derived from dnl this software without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR dnl ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER dnl CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH dnl DAMAGE. define(XX_KEY,$1`'XX_LT()Key>$2)dnl define(XX_BTN,$1`'XX_LT()Btn$2>)dnl define(XX_action,`ifelse(XX_PRODUCT,tcl3270,command,action)')dnl define(XX_Action,`ifelse(XX_PRODUCT,tcl3270,Command,Action)')dnl XX_TH(XX_PRODUCT,1,XX_DATE) XX_SH(Name) XX_PRODUCT XX_DASH ifelse(XX_PRODUCT,c3270,`curses-based ')dnl XX_SM(IBM) host access tool XX_SH(Synopsis) XX_FB(XX_PRODUCT) ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')dnl [XX_FI(options)] [XX_FI(host)] ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_BR XX_FB(XX_PRODUCT) [XX_FI(options)] ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')XX_FI(session-file).XX_PRODUCT ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_SH(Description) XX_FB(XX_PRODUCT) opens a telnet connection to an XX_SM(IBM) ifelse(XX_PRODUCT,x3270,`host in an X window.', XX_PRODUCT,s3270,`host, then allows a script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_PRODUCT,ws3270,`host, then allows a script to control the host login session.', XX_PRODUCT,tcl3270,`host, then allows a tcl script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_MODE,console,`host in a console window.') It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. ifelse(XX_PRODUCT,x3270, `The window created by XX_FB(XX_PRODUCT) can use its own font for displaying characters, so it is a fairly accurate representation of an XX_SM(IBM) 3278 or 3279. It is similar to XX_FI(tn3270)(1) except that it is X-based, not curses-based. ')dnl ifelse(XX_PRODUCT,c3270, `If the console is capable of displaying colors, then XX_FB(c3270) emulates an XX_SM(IBM) 3279. Otherwise, it emulates a 3278. ')dnl include(hostname.inc) XX_SH(Options) ifelse(XX_PRODUCT,x3270,`XX_FB(x3270) is a toolkit based program, so it understands standard Xt options and resources. It also understands',` XX_FB(XX_PRODUCT) understands') the following options:XX_TPS() ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ', `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(activeicon))) Specifies that the icon should be a miniature version of the screen image. See XX_LINK(#Icons,XX_SM(ICONS)) below. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed using the XX_DQUOTED(bold) colors (colors 8 through 15, rather than colors 0 through 7). This helps with PC console windows in which colors 0 through 7 are unreadably dim. All-bold mode is the default for color (3279) emulation, but not for monochrome (3278) emulation. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays. XX_TP(XX_FB(XX_DASHED(altscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(apl))) Sets up XX_SM(APL) mode. ifelse(XX_PRODUCT,x3270,`This is actually an abbreviation for several options. ')dnl See XX_LINK(#APL-Support,XX_SM(APL SUPPORT)) below. ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(cadir)) XX_FI(directory)) Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) XX_TP(XX_FB(XX_DASHED(cafile)) XX_FI(filename)) Specifies a XX_SM(PEM)-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(cbreak))) Causes XX_FB(c3270) to operate in XX_FI(cbreak) mode, instead of XX_FI(raw) mode. In XX_FI(cbreak) mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for XX_FB(interrupt), XX_FB(quit), and XX_FB(lnext) (usually ^C, ^XX_BACKSLASH and ^V respectively) will be seen by XX_FB(c3270) only if preceded by the XX_FB(lnext) character. The XX_FB(susp) character (usually ^Z) cannot be seen by XX_FB(c3270) at all. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(cc)) XX_FI(range):XX_FI(value)[`,'...]) Sets character classes. XX_HO(`See XX_LINK(#Character-Classes,XX_SM(CHARACTER CLASSES)), below. ')dnl ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfile)) XX_FI(filename)) Specifies a file containing a client certificate to provide to the host. The default file type is XX_SM(PEM). ')dnl XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. ifelse(XX_PLATFORM,unix,`(MacOS only) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfiletype)) XX_FI(type)) Specifies the type of the certificate file specified by XX_FB(XX_DASHED(certfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(chainfile) XX_FI(filename))) Specifies a certificate chain file in XX_SM(PEM) format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If XX_FB(XX_DASHED(chainfile)) is specified, it overrides XX_FB(XX_DASHED(certfile)). (OpenSSL only) ')dnl XX_TP(XX_FB(XX_DASHED(charset)) XX_FI(name)) Specifies an XX_SM(EBCDIC) host character set. XX_HO(`See XX_LINK(#Character-Sets,XX_SM(CHARACTER SETS)) below. ')dnl XX_TP(XX_FB(XX_DASHED(clear)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(false). define(XX_TOGGLEREF,`ifelse(XX_PRODUCT,x3270,Menus,Toggles)')dnl define(XX_TOGGLEREFNM,`ifelse(XX_PRODUCT,x3270,MENUS,TOGGLES)')dnl XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl XX_TP(XX_FB(XX_DASHED(connecttimeout)) XX_FI(seconds)) Specifies the time that XX_PRODUCT will wait for a host connection to complete. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defaultfgbg))) Causes XX_PRODUCT to use the XX_POSESSIVE(terminal) default foreground color instead of the curses color XX_FB(black), and the XX_POSESSIVE(terminal) default background color instead of the curses color XX_FB(white). This is helpful for emulators such as XX_FI(gnome-terminal) whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable XX_FB(COLORTERM) is set to XX_FB(gnome-terminal). It is available only if XX_PRODUCT was compiled with a version of XX_FI(ncurses) that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the default (80-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl XX_TP(XX_FB(XX_DASHED(devname)) XX_FI(name)) Specifies a device name (workstation ID) for RFC 4777 support. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(efont)) XX_FI(name)) Specifies a font for the emulator window. XX_HO(`See XX_LINK(#Fonts,XX_SM(FONTS)) below. ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(hostsfile)) XX_FI(file)) Uses XX_FI(file) as the hosts file, which allows aliases for host names and scripts to be executed at login. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(1)) for details. ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(XX_DASHED(httpd)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for HTTP connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(scriptport) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(iconname)) XX_FI(name)) Specifies an alternate title for the program icon. XX_TP(XX_FB(XX_DASHED(iconx)) XX_FI(x)) Specifies the initial x coordinate for the program icon. XX_TP(XX_FB(XX_DASHED(icony)) XX_FI(y)) Specifies the initial y coordinate for the program icon. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(im)) XX_FI(method)) Specifies the name of the input method to use for multi-byte input. (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(keyfile)) XX_FI(filename)) Specifies a file containing the private key for the certificate file (specified via XX_FB(XX_DASHED(certfile)) or XX_FB(XX_DASHED(chainfile))). The default file type is XX_SM(PEM). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keyfiletype)) XX_FI(type)) Specifies the type of the private key file specified by XX_FB(XX_DASHED(keyfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keypasswd)) XX_FI(type):XX_FI(value)) Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be XX_FB(file):XX_FI(filename), specifying that the password is in a file, or XX_FB(string):XX_FI(string), specifying the password on the command-line directly. If the private key file is encrypted and no XX_FB(XX_DASHED(keypasswd)) option is given, ifelse(XX_INTERACTIVE,yes,`the password will be prompted for interactively.', `secure connections will not be allowed.') ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keymap name and optional modifiers. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keyboard map to be found in the resource XX_FB(c3270.keymap.)`'XX_FI(name) or the file XX_FI(name). See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below for details. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keypad))) Turns on the keypad as soon as XX_FB(XX_PRODUCT) starts. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(km)) XX_FI(name)) Specifies the local encoding method for multi-byte text. XX_FI(name) is an encoding name recognized by the ICU library. (Supported only when XX_PRODUCT is compiled with DBCS support, and necessary only when XX_PRODUCT cannot figure it out from the locale.) ')dnl XX_TP(XX_FB(XX_DASHED(loginmacro)) XX_FI(Action(arg...) ...)) Specifies a macro to run at login time. ifelse(XX_PRODUCT,ws3270,`XX_TP(XX_FB(XX_DASHED(localcp) XX_FI(codepage))) Specifies the Windows code page to use for local I/O. The default is to use the XX_POSESSIVE(system) ANSI code page. ')dnl ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(minversion)) XX_FI(version)) The minimum required version of XX_FB(XX_PRODUCT), e.g., XX_VERSION_NUMBER. If the running version is less than the specified version, XX_FB(XX_PRODUCT) will abort. The format of a version is XX_FI(major)`'XX_FB(.)`'XX_FI(minor)`'XX_FB(type)`'XX_FI(iteration). XX_FB(type) is ignored, and XX_FI(minor) and XX_FI(iteration) can be omitted. ')dnl XX_TP(XX_FB(XX_DASHED(model)) XX_FI(name)) The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: XX_IP The first part is the XX_FB(base model), which is either XX_FB(3278) or XX_FB(3279). XX_FB(3278) specifies a monochrome (green on black) 3270 display; XX_FB(3279) specifies a color 3270 display. XX_IP The second part is the XX_FB(model number), which specifies the number of rows and columns. Model 4 is the default. XX_PP XX_TS(3,`center; c c c .') XX_TR(XX_TD(XX_TC(Model Number)) XX_TD(XX_TC(Columns)) XX_TD(XX_TC(Rows))) XX_T_ XX_TR(XX_TD(XX_TC(2)) XX_TD(XX_TC(80)) XX_TD(XX_TC(24))) XX_TR(XX_TD(XX_TC(3)) XX_TD(XX_TC(80)) XX_TD(XX_TC(32))) XX_TR(XX_TD(XX_TC(4)) XX_TD(XX_TC(80)) XX_TD(XX_TC(43))) XX_TR(XX_TD(XX_TC(5)) XX_TD(XX_TC(132)) XX_TD(XX_TC(27))) XX_TE() XX_IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. XX_IP The default model ifelse(XX_PRODUCT,x3270,`for a color X display is XX_FB(`3279'XX_DASHED(4)). For a monochrome X display, it is XX_FB(`3278'XX_DASHED(4)).', XX_PRODUCT,c3270,`for a color display is XX_FB(`3279'XX_DASHED(4)). For a monochrome display, it is XX_FB(`3278'XX_DASHED(4)).', `is XX_FB(`3279'XX_DASHED(4)).') ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(mono))) Forces XX_FB(XX_PRODUCT) to believe it is running on a monochrome X display. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(mono))) Prevents XX_FB(XX_PRODUCT) from using color, ignoring any color capabilities reported by the terminal. XX_TP(XX_FB(XX_DASHED(noprompt))) An alias for XX_DASHED(secure). ')dnl XX_TP(XX_FB(XX_DASHED(noverifycert))) For SSL/TLS connections, do not verify the host certificate. XX_TP(XX_FB(XX_DASHED(nvt))) Start in NVT mode instead of waiting for the host to send data, and make the default terminal type XX_FB(xterm). ifelse(XX_PRODUCT,x3270, XX_TP(XX_FB(XX_DASHED(once))) Causes XX_FB(XX_PRODUCT) to exit after a host disconnects. This option has effect only if a hostname is specified on the command line. )dnl XX_TP(XX_FB(XX_DASHED(oversize)) XX_FI(cols)`'XX_FB(x)`'XX_FI(rows)) Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "XX_PRODUCT.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. ifelse(XX_MODE,console,`XX_IP It can also be specified as XX_FB(auto), which causes XX_FB(XX_PRODUCT) to fill the entire terminal or console window. ')dnl XX_TP(XX_FB(XX_DASHED(port)) XX_FI(n)) Specifies a different XX_SM(TCP) port to connect to. XX_FI(n) can be a name from XX_FB(/etc/services) like XX_FB(telnet), or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(pt)) XX_FI(type)) Specifies the preedit type for the multi-byte input method. Valid values are XX_FB(OverTheSpot), XX_FB(OffTheSpot), XX_FB(Root) and XX_FB(OnTheSpot). The value for XX_FB(OverTheSpot) can `include' an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. XX_FB(OverTheSpot+1) or XX_FB(OverTheSpot-2). The default value is XX_FB(OverTheSpot+1). (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FB(XX_PRODUCT) to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(rv))) Switches XX_PRODUCT from a white-on-black display to a black-on-white display. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(sb))) Turns on the scrollbar. XX_TP(XX_FB(+sb)) Turns the scrollbar off. XX_TP(XX_FB(XX_DASHED(scheme)) XX_FI(name)) Specifes a color scheme to use in 3279 mode. This option has effect only in combination with 3279 emulation. XX_HO(`See XX_LINK(#Color-Schemes,XX_SM(COLOR SCHEMES)) below. ')dnl XX_TP(XX_FB(XX_DASHED(script))) Causes XX_FB(XX_PRODUCT) to read commands from standard input, with the results written to standard output. The protocol for these commands is documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(sl)) XX_FI(n)) Specifies that XX_FI(n) lines should be saved for scrolling back. The default is 4096. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(S))) Runs XX_PRODUCT in auto-shortcut mode. XX_PRODUCT will create a temporary shorcut (.LNK file) that matches the parameters in the session file (model number, characterset, etc.) and re-run itself from the shortcut. XX_TP(XX_FB(+S)) Disables auto-shortcut mode. It is generally a good idea to put this option on the command lines of all shortcuts, to avoid infinite looping. ')dnl ifelse(XX_PRODUCT,tcl3270,, `XX_TP(XX_FB(XX_DASHED(scriptport)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for scripting connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(httpd) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) XX_TP(XX_FB(XX_DASHED(scriptportonce))) Allows XX_PRODUCT to accept only one script connection. When that connection is broken, XX_PRODUCT will exit. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables the interactive XX_FB(c3270>) prompt. When used, a hostname must be provided on the command line. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables run-time features that could compromise system security (user-specified file names and commands, etc.). ')dnl XX_TP(XX_FB(XX_DASHED(set)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(true). XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_TP(XX_FB(XX_DASHED(socket))) Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named XX_FB(/tmp/x3sck.)`'XX_FI(pid). ')dnl The XX_FB(XX_DASHED(p)) option of XX_FI(x3270if) causes it to use this socket, instead of pipes specified by environment variables. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(title)) XX_FI(text)) Sets the console window title to XX_FI(text), overriding the automatic setting of the hostname and the string XX_FB(wc3270). ')dnl XX_TP(XX_TARGET(tn)XX_FB(XX_DASHED(tn)) XX_FI(name)) Specifies the terminal name to be transmitted over the telnet connection. The default name is XX_FB(`IBM'XX_DASH)`'XX_FI(model_name)`'XX_FB(XX_DASHED(E)), for example, ifelse(XX_PRODUCT,x3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', XX_PRODUCT,c3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', `XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)).') XX_IP Some hosts are confused by the XX_FB(XX_DASHED(E)) suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an XX_FB(s:) on the hostname, or setting the "XX_PRODUCT.extended" resource to "false", removes the XX_FB(XX_DASHED(E)) from the terminal name when connecting to such hosts. XX_IP The name can also be specified with the "XX_PRODUCT.termName" resource. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream ifelse(XX_PRODUCT,x3270,,`and event ')tracing at startup. ifelse(XX_PRODUCT,x3270,`Unlike turning it on from a menu option, there is no pop-up to confirm the file name, which defaults to', `The default trace file name is') ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) on the current XX_POSESSIVE(user) Desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3trc)'). XX_TP(XX_FB(XX_DASHED(tracefile)) XX_FI(file)) Specifies a file to save data stream and event traces into. If the name starts with XX_DQUOTED(>>), data will be appended to the file. ifelse(XX_PRODUCT,x3270,`If the value XX_FB(stdout) is given, then traces will be written to standard output. If the value XX_FB(none) is given, then traces will be piped directly to the monitor window, and no file will be created. ')dnl XX_TP(XX_FB(XX_DASHED(tracefilesize)) XX_FI(size)) Places a limit on the size of a trace file. If this option is not specified, or is specified as XX_FB(0) or XX_FB(none), the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of XX_FI(size) can have a XX_FB(K) or XX_FB(M) suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a XX_DQUOTED(-) appended and a new file started. XX_TP(XX_FB(XX_DASHED(user)) XX_FI(name)) Specifies the user name for RFC 4777 support. ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl XX_TP(XX_FB(XX_DASHED(v))) Display the version and build options for XX_FB(XX_PRODUCT) and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a XX_FB(y:) prepended to the hostname when connecting. ifelse(XX_PRODUCT,x3270,, `XX_TP(XX_FB(XX_DASHED(xrm)) "XX_PRODUCT.XX_FI(resource): XX_FI(value)") Sets the value of the named XX_FI(resource) to XX_FI(value). Resources control less common XX_FB(XX_PRODUCT) options, and are defined under XX_LINK(#Resources,XX_SM(RESOURCES)) below. ')dnl ifelse(XX_PRODUCT,tcl3270, `XX_TP(XX_FB(XX_DASHED()XX_DASHED())) Terminates the list of XX_FB(tcl3270) options. Whatever follows will be available to the script in the XX_FB($argv) tcl variable. ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,x3270,`XX_LP After reading resource definitions from the X server and any standandard X11 resource definition files (XX_FB($HOME/.Xdefaults), etc.), XX_FB(XX_PRODUCT) will read definitions from the file XX_FB($HOME/.x3270pro). This file contains local customizations and is also used to save changed options by the XX_FB(Save Changed Options in File) menu option. XX_LP Note that XX_FB(XX_DASHED(xrm)) options override any definitions in the XX_FB(.x3270pro) file. ')dnl XX_HO(`ifelse(XX_PRODUCT,x3270,`XX_SH(Fonts) XX_FB(XX_PRODUCT) does not use the "*font" resource for its main window. Instead, it uses a custom 14-point font called XX_FB(3270), which is a close approximation of a real 3270 display and allows XX_FB(XX_PRODUCT) to display the XX_SM(ISO) `8859'XX_DASHED(1) (`Latin'XX_DASH()1) character set and special status-line symbols. A more compact font, XX_FB(`3270'XX_DASHED(12)), is also supported, as are the various sized fonts XX_FB(3270gt8), XX_FB(3270gt12), XX_FB(3270gt16), XX_FB(3270-20), XX_FB(3270gt24), and XX_FB(3270gt32). The fonts XX_FB(3270h) and XX_FB(3270gr) are also included to allow display of Hebrew and Greek text, respectively. XX_LP The font may be specified with the XX_FB(XX_DASHED(efont)) option or the "XX_PRODUCT.emulatorFont" resource. XX_LP XX_FB(XX_PRODUCT) can also use any X11 font that implements the display character set required by the host XX_SM(EBCDIC) character set. XX_PP An additional font, XX_FB(3270d), is supplied. This font is identical to the default XX_FB(3270) font, except that it has bitmaps defined for field attribute characters. This means that field attributes, which are normally displayed as blanks, are now visible on the screen. The characters displayed are hexadecimal codes, which can be translated using a document provided with the XX_FB(XX_PRODUCT) sources. XX_LP The font can be changed at any time through a menu option. It can also be implicitly changed by changing the size of the XX_FB(XX_PRODUCT) window with the mouse: if the window is made larger, XX_PRODUCT will try to change to a larger font, and vice-versa. ')dnl ifelse(XX_MODE,console,`XX_SH(Modes) XX_FB(XX_PRODUCT) has two basic modes: XX_FI(command-prompt) and XX_FI(session). XX_PP XX_FI(Command-prompt) mode is where the XX_FB(XX_PRODUCT`'>) prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit XX_FB(XX_PRODUCT), etc. The complete list of interactive commands is listed under XX_LINK(#Actions,XX_SM(ACTIONS)). XX_PP XX_FI(Session) mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host. XX_PP To switch from display mode to command-prompt mode, press ifelse(XX_PRODUCT,c3270,`Ctrl-]',`the Escape key'). To switch from command-prompt mode to display mode, press XX_FB(Enter) (without entering a command) at the XX_FB(XX_PRODUCT`'>) prompt. ')dnl XX_SH(Character Sets) The XX_FB(XX_DASHED(charset)) option or the "XX_PRODUCT.charset" resource controls the XX_SM(EBCDIC) host character set used by XX_FB(XX_PRODUCT). Available sets `include': XX_PP define(XX_CG1A,ifelse(XX_PRODUCT,x3270,3270cg-1a))dnl define(XX_CG1,ifelse(XX_PRODUCT,x3270,3270cg-1))dnl define(XX_CG7,ifelse(XX_PRODUCT,x3270,3270cg-7))dnl define(XX_CG8,ifelse(XX_PRODUCT,x3270,3270cg-8))dnl define(XX_CG9,ifelse(XX_PRODUCT,x3270,3270cg-9))dnl define(XX_CG11,ifelse(XX_PRODUCT,x3270,3270cg-11))dnl define(XX_CG15A,ifelse(XX_PRODUCT,x3270,3270cg-15a))dnl define(XX_CG15,ifelse(XX_PRODUCT,x3270,3270cg-15))dnl define(XX_88591,ifelse(XX_PLATFORM,windows,`',iso8859-1))dnl define(XX_88592,ifelse(XX_PLATFORM,windows,`',iso8859-2))dnl define(XX_88597,ifelse(XX_PLATFORM,windows,`',iso8859-7))dnl define(XX_88598,ifelse(XX_PLATFORM,windows,`',iso8859-8))dnl define(XX_88599,ifelse(XX_PLATFORM,windows,`',iso8859-9))dnl define(XX_885911,ifelse(XX_PLATFORM,windows,`',iso8859-11))dnl define(XX_885915,ifelse(XX_PLATFORM,windows,`',iso8859-15))dnl define(XX_KOI8R,ifelse(XX_PLATFORM,windows,`',koi8-r))dnl define(XX_TIS,ifelse(XX_PLATFORM,windows,`',tis620.2529-0))dnl define(XX_GB,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + gb2312.1980-0))dnl define(XX_GBX,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + iso10646-1))dnl define(XX_BIG5,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + Big5-0))dnl define(XX_JIS,ifelse(XX_PLATFORM,windows,`',jisx0201.1976-0 + jisx0208.1983-0))dnl XX_TS(3,`center; l l l lfB l l.') XX_TR(XX_TD(XX_TC(Charset Name)) XX_TD(XX_TC(Host Code Page)) XX_TD(XX_TC(ifelse(XX_PRODUCT,x3270,Display Character Sets,XX_PRODUCT,c3270,Display Character Set,XX_PLATFORM,windows,`',Character Set)))) XX_T_() ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TD(XX_TC(apl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A))) ')dnl XX_TR(XX_TD(XX_TC(belgian)) XX_TD(XX_TC(500)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(belgian-euro)) XX_TD(XX_TC(1148)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(bracket)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(brazilian)) XX_TD(XX_TC(275)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(chinese-gb18030)) XX_TD(XX_TC(1388)) XX_TD(XX_TC(XX_GBX))) XX_TR(XX_TD(XX_TC(cp1047)) XX_TD(XX_TC(1047)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(cp870)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88592))) XX_TR(XX_TD(XX_TC(finnish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(finnish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(french)) XX_TD(XX_TC(297)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(french-euro)) XX_TD(XX_TC(1147)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(german)) XX_TD(XX_TC(273)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(german-euro)) XX_TD(XX_TC(1141)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(greek)) XX_TD(XX_TC(423)) XX_TD(XX_TC(XX_CG7 XX_88597))) XX_TR(XX_TD(XX_TC(hebrew)) XX_TD(XX_TC(424)) XX_TD(XX_TC(XX_CG8 XX_88598))) XX_TR(XX_TD(XX_TC(icelandic)) XX_TD(XX_TC(871)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(icelandic-euro)) XX_TD(XX_TC(1149)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(italian)) XX_TD(XX_TC(280)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(italian-euro)) XX_TD(XX_TC(1144)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(japanese-kana)) XX_TD(XX_TC(930)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(japanese-latin)) XX_TD(XX_TC(939)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(norwegian)) XX_TD(XX_TC(277)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(norwegian-euro)) XX_TD(XX_TC(1142)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(russian)) XX_TD(XX_TC(880)) XX_TD(XX_TC(XX_KOI8R))) XX_TR(XX_TD(XX_TC(simplified-chinese)) XX_TD(XX_TC(935)) XX_TD(XX_TC(XX_GB))) XX_TR(XX_TD(XX_TC(slovenian)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_88592))) XX_TR(XX_TD(XX_TC(spanish)) XX_TD(XX_TC(284)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(spanish-euro)) XX_TD(XX_TC(1145)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(swedish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(swedish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(thai)) XX_TD(XX_TC(1160)) XX_TD(XX_TC(XX_885911 XX_TIS))) XX_TR(XX_TD(XX_TC(traditional-chinese)) XX_TD(XX_TC(937)) XX_TD(XX_TC(XX_BIG5))) XX_TR(XX_TD(XX_TC(turkish)) XX_TD(XX_TC(1026)) XX_TD(XX_TC(XX_88599))) XX_TR(XX_TD(XX_TC(uk)) XX_TD(XX_TC(285)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(uk-euro)) XX_TD(XX_TC(1146)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-euro)) XX_TD(XX_TC(1140)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-intl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TE() XX_PP The default character set is XX_FB(bracket), which is useful for common U.S. XX_SM(IBM) hosts which use XX_SM(EBCDIC) codes AD and BD for the XX_DQUOTED([) and XX_DQUOTED(]) characters, respectively. XX_PP Note that any of the host code pages listed above can be specified by adding XX_FB(cp) to the host code page, e.g., XX_FB(cp037) for host code page 037. Also note that the code pages available for a given version of XX_FB(XX_PRODUCT) are displayed by the XX_FB(XX_DASHED(v)) command-line option. ifelse(XX_PRODUCT,wc3270,`XX_PP Note that DBCS character sets (Chinese, Japanese) display properly only on 32-bit Windows XP. Work is proceeding on other platforms. ')dnl ifelse(XX_PRODUCT,x3270, `XX_PP Most 3270 fonts implement the 3270cg-1 display character set, which is a reordered version of the XX_SM(ISO) `8859'XX_DASHED(1) character set. Some implement the 3270cg-1a display character set, which is a superset of 3270cg-1 that includes APL2 characters. 3270h and 3270gr implement special character sets for Hebrew and Greek, respectively. XX_PP You can also specify national-language translations for your keyboard; see XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Character Classes) XX_FB(XX_PRODUCT) supports character classes (groupings of characters chosen with a double mouse click) in the same manner as XX_FI(xterm)(1). The "XX_PRODUCT.charClass" resource or the XX_FB(XX_DASHED(cc)) option can be used to alter the character class table. The default table is the same as XX_POSESSIVE(XX_FI(xterm)); It groups letters together, and puts most punctuation characters in individual classes. To put all non-whitespace characters together in the same class (and duplicate the behavior of some early versions of XX_FB(XX_PRODUCT), use the following value: XX_PP XX_RS(`33-127:48,161-255:48') XX_PP See XX_FI(xterm)(1) for further syntax details. XX_SH(Keypad) A keypad may optionally be displayed, with a mouse-clickable button for each 3270 function key (these functions are also available from the keyboard). The keypad can be turned on and off by clicking on the "keypad" button in the upper-right-hand corner of the window. The "XX_PRODUCT.keypad" resource controls where it is displayed. Options are: XX_PP XX_TS(2,center; l l.) XX_TR(`XX_TD(left) XX_TD(`in a separate window, to the left of the screen')') XX_TR(`XX_TD(right) XX_TD(`in a separate window, to the right of the screen')') XX_TR(`XX_TD(bottom) XX_TD(`in a separate window, below the screen')') XX_TR(`XX_TD(integral) XX_TD(`in the same window as the screen, below it')') XX_TE() XX_PP The default is XX_FB(right). XX_PP If the "XX_PRODUCT.keypadOn" resource is set to XX_FB(true), the keypad will be displayed at startup. ')dnl ifelse(XX_MODE,console,`XX_SH(Menu Bar and Keypad) XX_FB(XX_PRODUCT) supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the XX_FB(XX_PRODUCT>) prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen. XX_LP The on-screen menu title bar can be turned off via the "XX_PRODUCT.menuBar" resource. XX_LP The pop-up keypad allows the 3270-specific keys (XX_SM(PF) keys, XX_SM(PA) keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the XX_FB(XX_PRODUCT>) prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option. ')dnl ifelse(XX_MODE,script,,XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_SH(Hosts Database) XX_FB(XX_PRODUCT) uses the XX_FI(ibm_hosts) database to ifelse(XX_PRODUCT,x3270,`construct a pull-down menu of hosts to connect to. It also allows host name aliases to be defined, as well as specifying ',XX_PRODUCT,c3270,``define' aliases for host names, and to specify ')dnl macros to be executed when a connection is first made. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(5)) for details. XX_LP You may specify a different XX_FI(ibm_hosts) database with the "XX_PRODUCT.hostsFile" resource. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Color Schemes) When emulating a 3279 display, the X colors used to draw the display are selected by two resources: the "XX_PRODUCT.colorScheme" resource, which gives the name of the color scheme to use, and the individual "XX_PRODUCT.colorScheme.XX_FI(xxx)" resources, which give the actual definitions. The color scheme resources are documented in the XX_FB(Resources) file with the XX_FB(XX_PRODUCT) source. XX_LP The color scheme may also be changed while XX_FB(XX_PRODUCT) is running with a selection from the XX_FB(Options) menu. ')dnl XX_SH(NVT Mode) Some hosts use an XX_SM(ASCII) front-end to do initial login negotiation, then later switch to 3270 mode. XX_FB(XX_PRODUCT) will emulate an XX_SM(ANSI) X3.64 terminal until the host places it in 3270 mode (telnet XX_SM(BINARY) and XX_SM(SEND EOR) modes, or XX_SM(TN3270E) mode negotiation). ifelse(XX_PRODUCT,x3270,`The emulation is fairly complete; however, it is not intended to make XX_FB(XX_PRODUCT) a replacement for XX_FI(xterm)(1). ')dnl XX_PP If the host later negotiates to stop functioning in 3270 mode, XX_FB(XX_PRODUCT) will return to XX_SM(NVT) emulation. XX_PP In XX_SM(NVT) mode, XX_FB(XX_PRODUCT) supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources: XX_PP XX_TS(3,center; l c c.) XX_TR(XX_TD(Mode/Character) XX_TD(Resource) XX_TD(Default)) XX_T_() XX_TR(XX_TD(Translate CR to NL) XX_TD(XX_PRODUCT.icrnl) XX_TD(true)) XX_TR(XX_TD(Translate NL to CR) XX_TD(XX_PRODUCT.inlcr) XX_TD(false)) XX_TR(XX_TD(Erase previous character) XX_TD(XX_PRODUCT.erase) XX_TD(^?)) XX_TR(XX_TD(Erase entire line) XX_TD(XX_PRODUCT.kill) XX_TD(^U)) XX_TR(XX_TD(Erase previous word) XX_TD(XX_PRODUCT.werase) XX_TD(^W)) XX_TR(XX_TD(Redisplay line) XX_TD(XX_PRODUCT.rprnt) XX_TD(^R)) XX_TR(XX_TD(Ignore special meaning of next character) XX_TD(XX_PRODUCT.lnext) XX_TD(^V)) XX_TR(XX_TD(Interrupt) XX_TD(XX_PRODUCT.intr) XX_TD(^C)) XX_TR(XX_TD(Quit) XX_TD(XX_PRODUCT.quit) XX_TD(^XX_BS())) XX_TR(XX_TD(End of file) XX_TD(XX_PRODUCT.eof) XX_TD(^D)) XX_TE() ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_LP Separate keymaps can be defined for use only when XX_FB(XX_PRODUCT) is in 3270 mode or XX_SM(NVT) mode. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) for details. ')dnl ifelse(XX_PRODUCT,x3270,`include(menus.inc)',`XX_SH(Toggles) XX_FB(XX_PRODUCT) has a number of configurable modes which may be selected by the XX_FB(XX_DASHED(set)) and XX_FB(XX_DASHED(clear)) options. These names can also be used as the first parameter to the XX_FB(Toggle) action, and are the names of resources that can be used to set or clear the value of each toggle at start-up. XX_TPS()dnl XX_TP(XX_FB(aidWait)) Changes the behavior of actions that send an XX_SM(AID) to the host (XX_FB(Enter), XX_FB(Clear), XX_FB(PA) and XX_FB(PF)). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the XX_FB(Wait(Unlock)) action to wait for the unlock. ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(altCursor)) If set, the cursor will be an underline. If clear, it will be a solid block. ')dnl XX_TP(XX_FB(blankFill)) If set, XX_FB(XX_PRODUCT) modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying XX_DQUOTED(lock-up) that often occurs when inserting into an field with (apparent) space at the end. ifelse(XX_MODE,console,`XX_TP(XX_FB(crosshair)) When set, XX_PRODUCT will display a crosshair to help locate the cursor on the screen. ')dnl XX_TP(XX_FB(lineWrap)) If set, the XX_SM(NVT) terminal emulator automatically assumes a XX_SM(NEWLINE) character when it reaches the end of a line. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(marginedPaste)) If set, pasting multi-line input via the XX_FB(Paste) action will maintain a left margin (it will not move the cursor further left than where the paste begins). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(monoCase)) If set, XX_FB(XX_PRODUCT) operates in uppercase-only mode. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(overlayPaste)) If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the XX_FB(marginedPaste) toggle. ')dnl XX_TP(XX_FB(screenTrace)) Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). ifelse(XX_MODE,console,`XX_TP(XX_FB(showTiming)) If set, the time taken by the host to process an XX_SM(AID) is displayed on the status line. ')dnl XX_TP(XX_FB(trace)) Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the wc3270 AppData directory',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). The directory for the trace file can be changed with the "XX_PRODUCT.traceDir" resource. Script commands are also traced. ifelse(XX_MODE,console,`XX_TP(XX_FB(underscore)) If set, XX_PRODUCT will display underlined fields by substituting underscore XX_DQUOTED(_) characters for blanks or nulls in the field. Otherwise, these fields will be displayed ifelse(XX_PRODUCT,c3270,`using the XX_POSESSIVE(terminal) native underlining mode, if one is defined. ',`with a highlighted background. Note that setting XX_FB(underscore) also disables the highlighted background for blinking fields. XX_FB(underscore) is set by default. ')dnl ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(visibleControl)) If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes XX_DQUOTED(XX_LT()), SI becomes XX_DQUOTED(>). Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in ifelse(c3270,`underlined',wc3270,`reverse-video') yellow. Field attribute mappings are part of the XX_FB(XX_PRODUCT) Resources documentation for the XX_FB(visibleControl) resource. ')dnl XX_TPE()dnl XX_LP ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_SH(Status Line) ifelse(XX_PRODUCT,c3270,`If the terminal that XX_FB(XX_PRODUCT) is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), XX_FB(XX_PRODUCT) will display a status line. ')dnl The XX_FB(XX_PRODUCT) status line contains a variety of information. From left to right, the fields are: XX_TPS()dnl XX_TP(XX_FB(comm status)) The first symbol is always a XX_FB(4). If XX_FB(XX_PRODUCT) is in TN3270E mode, the second symbol is a XX_FB(B); otherwise it is an XX_FB(A). ifelse(XX_PRODUCT,x3270,`If XX_FB(x3270) is disconnected, the third symbol is a question mark. Otherwise, if ',`If ') XX_FB(XX_PRODUCT) is in SSCP-LU mode, the third symbol is an XX_FB(S). Otherwise it is blank. XX_TP(XX_FB(keyboard lock)) If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock. ifelse(XX_PRODUCT,x3270,`XX_TP(`XX_FB(`shift')') Three characters indicate the keyboard modifier status. "M" indicates the Meta key, "A" the Alt key, and an up-arrow or "^" indicates the Shift key. XX_TP(XX_FB(compose)) The letter "C" indicates that a composite character is in progress. If another symbol follows the "C", it is the first character of the composite. ')dnl XX_TP(XX_FB(typeahead)) The letter "T" indicates that one or more keystrokes are in the typeahead buffer. XX_TP(XX_FB(temporary keymap)) The letter "K" indicates that a temporary keymap is in effect. XX_TP(XX_FB(reverse)) The letter "R" indicates that the keyboard is in reverse field entry mode. XX_TP(XX_FB(insert mode)) ifelse(XX_PRODUCT,x3270,`A thick caret "^" or the ', `The ') letter "I" indicates that the keyboard is in insert mode. XX_TP(XX_FB(printer session)) The letter "P" indicates that a XX_FI(pr3287) session is active. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(script)) The letter "S" indicates that a script is active. ')dnl ifelse(XX_PRODUCT,x3270,,`XX_TP(XX_FB(secure connection)) A green letter "S" indicates that the connection is secured via SSL/TLS. ')dnl XX_TP(XX_FB(LU name)) The LU name associated with the session, if there is one. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(timing)) A clock symbol and a time in seconds indicate the time it took to process the last XX_SM(AID) or the time to connect to a host. This display is optional. ')dnl XX_TP(XX_FB(cursor position)) The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0. XX_TPE()dnl ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Icons) If the XX_FB(XX_DASHED(activeicon)) option is given (or the "XX_PRODUCT.activeIcon" resource is set to XX_FB(true)`)', XX_FB(XX_PRODUCT) will attempt to make its icon a miniature version of the current screen image. This function is highly dependent on your window manager: XX_TPS()dnl XX_TP(XX_FB(mwm)) The size of the icon is limited by the "Mwm.iconImageMaximum" resource, which defaults to XX_FB(50x50). The image will be clipped at the bottom and right. The icon cannot accept keyboard input. XX_TP(XX_FB(olwm)) The full screen image of all 3270 models can be displayed on the icon. However, the icon cannot be resized, so if the model is later changed with an XX_FB(XX_PRODUCT) menu option, the icon image will be corrupted. The icon cannot accept keyboard input. XX_TP(XX_FB(twm) and XX_FB(tvtwm)) The full screen image of all 3270 models can be displayed on the icon, and the icon can be resized. The icon can accept keyboard input. XX_IP However, XX_FB(twm) does not put labels on application-supplied icon windows. You can have XX_FB(XX_PRODUCT) add its own label to the icon by setting the "XX_PRODUCT.labelIcon" resource to XX_FB(true). The default font for icon labels is XX_FB(8x13); you may change it with the "XX_PRODUCT.iconLabelFont" resource. XX_TPE()dnl include(xkeymaps.inc)') define(XX_LPAREN,`ifelse(XX_PRODUCT,tcl3270,` ',`(')')dnl define(XX_RPAREN,`ifelse(XX_PRODUCT,tcl3270,,`)')')dnl define(XX_COMMA,`ifelse(XX_PRODUCT,tcl3270,` ',`, ')')dnl define(XX_SPACE,`ifelse(XX_PRODUCT,tcl3270,` ',`')')dnl define(XX_WAIT,`ifelse(XX_PRODUCT,tcl3270,`Wait [XX_FI(timeout)] $1', `Wait$1(XX_FI(timeout))')')dnl XX_TARGET(actions)dnl ifelse(XX_PRODUCT,x3270,, XX_PRODUCT,tcl3270, `XX_SH(Commands) XX_FB(XX_PRODUCT) supports the following additional tcl commands: ', `XX_SH(Actions) Here is a complete list of basic XX_PRODUCT actions. Script-specific actions are described on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. ')dnl define(XX_BLOCK,*))dnl XX_PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. XX_PP XX_TS(2,center; lw(3i) lw(3i).) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ascii'`') XX_TD(return entire screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region as text)) XX_TR(XX_TDH(`AsciiField') XX_TD(return current field as text)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Attn') XX_TD(attention key)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(AltCursor) XX_TD(switch between block and underscore cursor)) ')dnl XX_TR(XX_TDH(`BackSpace') XX_TD(move cursor left (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`BackTab') XX_TD(tab to start of previous input field)) XX_TR(`XX_TDH(CircumNot) XX_TD(`input "^" in XX_SM(NVT) mode, or "XX_NOT" in 3270 mode'')) XX_TR(XX_TDH(XX_BLOCK()`Clear') XX_TD(clear screen)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Cols') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Compose) XX_TD(next two keys form a special symbol)) ')dnl XX_TR(XX_TDH(XX_BLOCK()Connect`'XX_LPAREN`'XX_FI(host)`'XX_RPAREN) XX_TD(connect to XX_FI(host))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Copy') XX_TD(copy highlighted area to clipboard)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`CursorSelect') XX_TD(Cursor Select XX_SM(AID))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Cut) XX_TD(copy highlighted area to clipboard and erase)) XX_TR(XX_TDH(Default) XX_TD(enter key literally)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Cut') XX_TD(copy highlighted area to clipboard and erase)) ')dnl XX_TR(XX_TDH(`Delete') XX_TD(delete character under cursor (or send XX_SM(ASCII DEL)))) XX_TR(XX_TDH(`DeleteField') XX_TD(delete the entire field)) XX_TR(XX_TDH(`DeleteWord') XX_TD(delete the current or previous word)) XX_TR(XX_TDH(XX_BLOCK()`Disconnect') XX_TD(disconnect from host)) XX_TR(XX_TDH(`Down') XX_TD(move cursor down)) XX_TR(XX_TDH(`Dup') XX_TD(duplicate field)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ebcdic'`') XX_TD(return entire screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region in XX_SM(EBCDIC))) XX_TR(XX_TDH(`EbcdicField') XX_TD(return current field in XX_SM(EBCDIC))) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Enter') XX_TD(Enter XX_SM(AID) (or send XX_SM(ASCII CR)))) XX_TR(XX_TDH(`Erase') XX_TD(erase previous character (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`EraseEOF') XX_TD(erase to end of current field)) XX_TR(XX_TDH(`EraseInput') XX_TD(erase all input fields)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(Escape) XX_TD(escape to XX_FB(c3270>) prompt)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Execute(XX_FI(cmd))) XX_TD(execute a command in a shell)) ')dnl XX_TR(XX_TDH(`FieldEnd') XX_TD(move cursor to end of field)) XX_TR(XX_TDH(`FieldMark') XX_TD(mark field)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(HandleMenu(XX_FI(name))) XX_TD(pop up a menu)) ')dnl XX_TR(XX_TDH(`HexString'`'XX_LPAREN`'XX_FI(hex_digits)`'XX_RPAREN) XX_TD(insert control-character string)) XX_TR(XX_TDH(`Home') XX_TD(move cursor to first input field)) XX_TR(XX_TDH(`Insert') XX_TD(set insert mode)) XX_TR(XX_TDH(XX_BLOCK()`Interrupt') XX_TD(send XX_SM(TELNET IP) to host)) ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Keypad') XX_TD(Display pop-up keypad)) ')dnl XX_TR(XX_TDH(Key`'XX_LPAREN`'XX_FI(keysym)`'XX_RPAREN) XX_TD(insert key XX_FI(keysym))) XX_TR(XX_TDH(Key`'XX_LPAREN`'0x`'XX_FI(xx)`'XX_RPAREN) XX_TD(insert key with character code XX_FI(xx))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Keymap(XX_FI(keymap))) XX_TD(toggle alternate XX_FI(keymap) (or remove with XX_FB(None)))) XX_TR(XX_TDH(KybdSelect(XX_FI(direction) [,XX_FI(atom)...])) XX_TD(Extend selection by one row or column)) ')dnl XX_TR(XX_TDH(`Left') XX_TD(move cursor left)) XX_TR(XX_TDH(`Left2') XX_TD(move cursor left 2 positions)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Macro(XX_FI(macro))) XX_TD(run a macro)) ')dnl ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Menu') XX_TD(Display menu bar)) ')dnl XX_TR(XX_TDH(`MonoCase') XX_TD(toggle uppercase-only mode)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(MoveCursor) XX_TD(move cursor to mouse position)) ')dnl XX_TR(XX_TDH(MoveCursor`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_RPAREN) XX_TD(move cursor to zero-origin (XX_FI(row),XX_FI(col)))) ifelse(XX_PRODUCT,x3270,`XX_TR(`XX_TDH(XX_BLOCK()MoveCursorSelect) XX_TD(`move cursor to mouse position, light pen selection'')) ')dnl XX_TR(XX_TDH(`Newline') XX_TD(move cursor to first field on next line (or send XX_SM(ASCII LF)))) XX_TR(XX_TDH(`NextWord') XX_TD(move cursor to next word)) XX_TR(XX_TDH(XX_BLOCK()PA`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Attention XX_SM(AID) (XX_FI(n) from 1 to 3))) XX_TR(XX_TDH(XX_BLOCK()PF`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Function XX_SM(AID) (XX_FI(n) from 1 to 24))) XX_TR(XX_TDH(`PreviousWord') XX_TD(move cursor to previous word)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Paste') XX_TD(insert clipboard contents))')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(Printer(Start[,XX_FI(lu)]|Stop)) XX_TD(start or stop printer session)) ')dnl ifelse(XX_PLATFORM,windows,`XX_TR(XX_TDH(PrintText([gdi|wordpad,][dialog|nodialog,]XX_FI([printer-name]))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(PrintText(XX_FI(command))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(PrintWindow(XX_FI(command))) XX_TD(print screen image (bitmap) on printer)) ')dnl XX_TR(XX_TDH(Quit) XX_TD(exit XX_FB(XX_PRODUCT))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Reconnect) XX_TD(reconnect to previous host)) ')dnl XX_TR(XX_TDH(`Redraw') XX_TD(redraw window)) XX_TR(XX_TDH(`Reset') XX_TD(reset locked keyboard)) XX_TR(XX_TDH(`Right') XX_TD(move cursor right)) XX_TR(XX_TDH(`Right2') XX_TD(move cursor right 2 positions)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ascii`') XX_TD(dump screen buffer as text)) XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ebcdic`') XX_TD(dump screen buffer in EBCDIC)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Rows') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Script(XX_FI(command)[,XX_FI(arg)...])) XX_TD(run a script)) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TR(XX_TDH(Scroll(Forward|Backward)) XX_TD(scroll screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SelectAll(XX_FI(atom))) XX_TD(select entire screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SetFont(XX_FI(font))) XX_TD(change emulator font)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `ifelse(XX_PRODUCT,tcl3270,`XX_TR(XX_TDH(Snap) XX_TD(same as XX_FB(Snap Save))) ')dnl XX_TR(XX_TDH(Snap`'XX_SPACE`'Ascii`') XX_TD(report saved screen data (see XX_FB(Ascii)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Cols`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Ebcdic`') XX_TD(report saved screen data (see XX_FB(Ebcdic)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'ReadBuffer`') XX_TD(report saved screen data (see XX_FB(ReadBuffer)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Rows`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Save`') XX_TD(save screen image)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Status`') XX_TD(report saved connection status)) XX_TR(XX_TDH(`ifelse(XX_PRODUCT,tcl3270,`XX_BLOCK()Snap Wait [XX_FI(timeout)] Output', `XX_BLOCK()SnapWaitOuput(XX_FI(timeout))')') XX_TD(wait for host output and save screen image)) ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Source(XX_FI(file))) XX_TD(read commands from XX_FI(file))) ')dnl XX_TR(XX_TDH(Status`') XX_TD(report connection status)) ')dnl XX_TR(XX_TDH(XX_BLOCK()String`'XX_LPAREN`'XX_FI(string)`'XX_RPAREN) XX_TD(insert string (simple macro facility))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(XX_BLOCK()`SelectDown') XX_TD(Extend selection down)) XX_TR(XX_TDH(SelectLeft) XX_TD(Extend selection left)) XX_TR(XX_TDH(SelectUp) XX_TD(Extend selection up)) XX_TR(XX_TDH(SelectDown) XX_TD(Extend selection down)) XX_TR(XX_TDH(SysReq) XX_TD(System Request XX_SM(AID))) ')dnl XX_TR(XX_TDH(`Tab') XX_TD(move cursor to next input field)) XX_TR(XX_TDH(`Toggle'XX_LPAREN`'XX_FI(option)[,XX_FI(set|clear)]XX_RPAREN) XX_TD(toggle an option)) XX_TR(XX_TDH(`ToggleInsert') XX_TD(toggle insert mode)) XX_TR(XX_TDH(`ToggleReverse') XX_TD(toggle reverse-input mode)) XX_TR(XX_TDH(XX_BLOCK()Transfer`'XX_LPAREN`'XX_FI(option)=XX_FI(value)...'`'XX_RPAREN) XX_TD(file transfer)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Unselect) XX_TD(release selection)) ')dnl XX_TR(XX_TDH(`Up') XX_TD(move cursor up)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(ignore) XX_TD(do nothing)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(3270mode)) XX_TD(wait for 3270 mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Disconnect)) XX_TD(wait for host to disconnect)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(InputField)) XX_TD(wait for valid input field)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(NVTMode)) XX_TD(wait for NVT mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Output)) XX_TD(wait for more host output)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_T_() XX_TR(XX_TDH((the following are similar to xterm),COLSPAN="2")) XX_T_() XX_TR(XX_TDH(ignore) XX_TD(do nothing)) XX_TR(`XX_TDH(insert-selection([XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(``paste' selection')') XX_TR(XX_TDH(move-select) XX_TD(a combination of XX_FB(MoveCursor) and XX_FB(select-start))) XX_TR(XX_TDH(select-end(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(complete selection and assign to atom(s))) XX_TR(XX_TDH(select-extend) XX_TD(move the end of a selection)) XX_TR(XX_TDH(select-start) XX_TD(mark the beginning of a selection)) XX_TR(XX_TDH(set-select(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(assign existing selection to atom(s))) XX_TR(XX_TDH(start-extend) XX_TD(begin marking the end of a selection)) ')dnl XX_TE() ifelse(XX_MODE,console,`XX_LP Any of the above actions may be entered at the XX_FB(XX_PRODUCT>) prompt; these commands are also available for use in keymaps (see XX_LINK(#Keymaps,XX_SM(KEYMAPS))). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.: XX_RS(PF(1)) or with spaces, e.g.: XX_RS(PF 1) Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used. XX_LP XX_FB(XX_PRODUCT) also supports the following interactive commands: XX_TPS()dnl XX_TP(XX_FB(Help)) Displays a list of available commands. XX_TP(XX_FB(ScreenTrace)) Turns screen tracing (saving screen images to a file) on or off. The command XX_FB(screentrace on) enables screen tracing; the command XX_FB(screentrace off) disables it. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). The keyaord XX_FB(on) can also be followed by the keyword XX_FB(printer) and an optional ifelse(XX_PRODUCT,wc3270,printer name,print command) to direct screen traces directly to the printer. XX_TP(XX_FB(Show)) Displays statistics and settings. XX_TP(XX_FB(Trace)) Turns tracing on or off. The command XX_FB(trace on) enables data stream and keyboard event tracing; the command XX_FB(trace off) disables it. The qualifier XX_FB(data) or XX_FB(keyboard) can be specified before XX_FB(on) or XX_FB(off) to enable or disable a particular trace. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). XX_TPE()dnl ')dnl XX_LP Note that certain parameters to XX_PRODUCT actions (such as the names of files and keymaps) are subject to XX_FI(substitutions): XX_LP The character XX_FB(~) at the beginning of a string is replaced with the user's home directory. ifelse(XX_PLATFORM,unix,`A XX_FB(~) character followed by a username is replaced with that XX_POSESSIVE(user) home directory. ')dnl XX_LP Environment variables are substituted using the Unix shell convention of $XX_FI(name) or ${XX_FI(name)}. XX_LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. ifelse(XX_PRODUCT,c3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,wc3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,x3270,,`include(ft.inc) ')dnl XX_SH(The PrintText Action) The XX_FB(PrintText) produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is ifelse(XX_PLATFORM,windows,`the name of the printer to use', `the command to use to print, e.g., XX_FB(lpr)'). ifelse(XX_PLATFORM,windows,`The font defaults to XX_FB(Courier New) and the point size defaults to XX_FI(auto) (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. Unless the XX_FB(wordpad) keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. XX_FB(printTextHorizontalMargin) defines the left- and right-hand margins. XX_FB(printTextVerticalMargin) defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with XX_FB(mm) or XX_FB(cm). XX_FB(printTextOrientation) defines the page orientation as XX_FB(portrait) or XX_FB(landscape). ')dnl XX_LP Multiple arguments can include keywords to control the output of XX_FB(PrintText): XX_TPS()dnl ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(gdi)) Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default). XX_TP(XX_FB(wordpad)) Create an RTF file and run WordPad to print it. (This was the former default). XX_TP(XX_FB(dialog)) In GDI mode, pop up the Windows print dialog. ifelse(XX_PRODUCT,wc3270,`(This is the default.) ')dnl XX_TP(XX_FB(nodialog)) In GDI mode, skip the usual Windows print dialog. ifelse(XX_PRODUCT,ws3270,`(This is the default.) ')dnl ')dnl XX_TP(XX_FB(file) XX_FI(filename)) Save the output in a file. XX_TP(XX_FB(html)) Save the output as HTML. This option implies XX_FB(file). XX_TP(XX_FB(rtf)) Save the output as RichText. This option implies XX_FB(file). The font defaults to XX_FB(Courier New) and the point size defaults to 8. These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(string)) Return the output as a string. This can only be used from scripts. ')dnl XX_TP(XX_FB(modi)) Render modified fields in italics. XX_TP(XX_FB(caption) XX_FI(text)) Add the specified XX_FI(text) as a caption above the output. Within XX_FI(text), the special sequence XX_FB(%T%) will be replaced with a timestamp. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(secure)) Disables the pop-up dialog. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(command) XX_FI(command)) Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. ')dnl XX_TPE() define(XX_SCRIPTS,`ifelse(XX_PRODUCT,x3270,Macros and Scripts, XX_PRODUCT,c3270,Scripts, Nested Scripts)')dnl XX_SH(XX_SCRIPTS) ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`There are several types of ifelse(XX_PRODUCT,x3270,`macros and ', XX_PRODUCT,x3270,,XX_PRODUCT,c3270,, `nested ')dnl script functions available. ')dnl XX_TPS()dnl XX_TP(XX_FB(The String XX_Action)) The simplest method for ifelse(XX_PRODUCT,x3270,`macros ', XX_PRODUCT,c3270,`scripting ', `nested scripts ')dnl is provided via the XX_FB(String) XX_action`'ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,tcl3270,,`, which can be bound to any key in a keymap'). The arguments to XX_FB(String) are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the XX_SM(AID) code to the host, XX_FB(XX_PRODUCT) will wait for the host to unlock the keyboard before further processing the string.) XX_TS(2,l l.) XX_TR(XX_TD(XX_BS()b) XX_TD(Left)) XX_TR(XX_TD(XX_BS()`e'XX_FI(xxxx)) XX_TD(EBCDIC character in hex)) XX_TR(XX_TD(XX_BS()f) XX_TD(Clear*)) XX_TR(XX_TD(XX_BS()n) XX_TD(Enter*)) XX_TR(XX_TD(XX_BS()`pa'XX_FI(n)) XX_TD(PA(XX_FI(n))*)) XX_TR(XX_TD(XX_BS()`pf'XX_FI(nn)) XX_TD(PF(XX_FI(nn))*)) XX_TR(XX_TD(XX_BS()r) XX_TD(Newline)) XX_TR(XX_TD(XX_BS()t) XX_TD(Tab)) XX_TR(XX_TD(XX_BS()T) XX_TD(BackTab)) XX_TR(XX_TD(XX_BS()`u'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TR(XX_TD(XX_BS()`x'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TE() XX_IP Note that the numeric values for the XX_BS()e, XX_BS()u and XX_BS()x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if XX_PRODUCT is built with DBCS support and the host allows DBCS input in the current field. ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270, `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Alt,p): String("probs clearrdr`'XX_BS()n")) ', `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Meta,p): String("probs clearrdr`'XX_BS()n")) ')dnl XX_IP XX_FB(Note:) The strings are in XX_SM(ASCII) and converted to XX_SM(EBCDIC), so beware of inserting control codes. ifelse(XX_PRODUCT,x3270,`Also, a backslash before a XX_FB(p) may need to be doubled so it will not be removed when a resource file is read. ')dnl XX_IP There is also an alternate form of the XX_FB(String) XX_action, XX_FB(HexString), which is used to enter non-printing data. The argument to XX_FB(HexString) is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent XX_SM(EBCDIC) characters, which are entered into the current field. In XX_SM(NVT) mode, the hexadecimal data represent XX_SM(ASCII) characters, which are sent directly to the host. ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(The Script Action)) This action causes XX_FB(XX_PRODUCT) to start a child process which can execute XX_FB(XX_PRODUCT) actions. ifelse(XX_PLATFORM,windows, `XX_FB(XX_PRODUCT) listens for connections from the child process on a dynamically-generated TCP port. ', `Standard input and output from the child process are piped back to XX_FB(XX_PRODUCT). ')dnl The XX_FB(Script) action is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(The macros Resource)) An alternate method of defining macros is the "XX_PRODUCT.macros" resource. This resource is similar to a keymap, but instead of defining keyboard mappings, it associates a list of X actions with a name. These names are displayed on a Macros menu that appears when XX_FB(XX_PRODUCT) is connected to a host. Selecting one of the names on the menu executes the X actions associated with it. Typically the actions are XX_FB(String) calls, but any action may be specified. Here is a sample macros resource definition, which would result in a four-entry Macros menu: XX_RS(XX_PRODUCT.macros: XX_BS() XX_BR log off: String("logout`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR vtam: String("dial vtam`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR pa1: PA(1)XX_BS()n`'XX_BS() XX_BR alt printer: PrintText("lpr -Plw2")) XX_IP You can also define a different set of macros for each host. If there is a resource named XX_DQUOTED(XX_PRODUCT.XX_FI(macros).XX_FI(somehost)), it defines the macros menu for when XX_FB(XX_PRODUCT) is connected to XX_FI(somehost). XX_TP(XX_FB(The XX_DASHED(script) Option)) This facility allows XX_FB(XX_PRODUCT) to operate under the complete control of a script. XX_FB(XX_PRODUCT) accepts actions from standard input, and prints results on standard output. The XX_FB(XX_DASHED(script)) option is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`XX_SH(Composite Characters) XX_FB(XX_PRODUCT) allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A `C' on the status line indicates a pending composite character. XX_PP The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "XX_PRODUCT.composeMap" resource; it gives the name of the map to use. The maps themselves are named "XX_PRODUCT.composeMap.XX_FI(name)". The default is "latin1", which gives mappings for most of the symbols in the XX_SM(ISO) 8859-1 Latin-1 character set that are not in the 7-bit XX_SM(ASCII) character set. XX_PP XX_FB(Note:) The default keymap defines ifelse(XX_PRODUCT,x3270,`the "Multi_key" keysym',`XX_KEY(Meta,m)') as the "Compose" key. ifelse(XX_PRODUCT,x3270,`If your keyboard lacks such a key, you',`You') may set up your own "Compose" key with a keymap that maps some other keysym onto the XX_FB(Compose) action. ')dnl ifelse(XX_PRODUCT,x3270,`include(apl.inc)')dnl ifelse(XX_PRODUCT,c3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(pr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(pr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(c3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(pr3287). XX_LP See XX_FI(pr3287)(1) for further details. XX_LP The resource XX_FB(c3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(wpr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(wpr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(wc3270.printer.name) specifies the Windows printer used to print each job. It defaults to the value of the XX_FB($PRINTER) environment variable, if set. Otherwise the default system printer is used. This resource also controls the printer used by the XX_FB(PrintText) action. XX_LP The resource XX_FB(wc3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(wpr3287). XX_LP See XX_FI(wpr3287)(1) for further details. XX_LP The resource XX_FB(wc3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Screen Printing) Screen printing is handled through options on the XX_FB(File) menu or by the XX_FB(PrintText) and XX_FB(PrintWindow) actions. Each results in a pop-up to confirm the print command. XX_PP The XX_FB(PrintText) action (usually assigned to the key XX_LT()Meta>p) sends the current screen image to the printer as XX_SM(ASCII) characters. The default command used to print the data is controlled by the "XX_PRODUCT.printTextCommand" resource; the default is XX_FB(lpr). You may also use a keymap definition to pass a print command the XX_FB(PrintText) action itself. The command receives the screen text as its standard input. For example, the following keymap will save the screen text in a file: XX_IP XX_RS(XX_KEY(Meta,f): PrintText("cat >screen.image")) XX_PP Note: XX_FB(HardPrint) is an alias for XX_FB(PrintText). XX_PP The XX_FB(PrintWindow) action (usually assigned to the key XX_LT()Meta>b) sends the current screen image to the printer as a bitmap. The default command used to print the data is controlled by the "XX_PRODUCT.printWindowCommand" resource; the default is XX_IP XX_RS(XX_FB(xwd XX_DASHED(id) %d | xpr | lpr).) XX_PP You may also use a keymap definition to pass a print command to the XX_FB(PrintWindow) action itself. If the command contains the text "%d", the window ID of XX_FB(XX_PRODUCT) will be substituted before it is run. For example, the following keymap will pop up a duplicate of the current screen image: XX_IP XX_RS(XX_KEY(Meta,g): PrintWindow("xwd XX_DASHED(id) %d | xwud &")) XX_LP If the command for PrintWindow or PrintText begins with an "@" character, the initial pop-up menu to confirm the print command is not displayed and the command cannot be edited. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Bugs) Cursor highlighting will not work with if you use the XX_FB(NoTitleFocus) option in your .twmrc file. ')dnl ifelse(XX_PRODUCT,wc3270,,` XX_SH(Passthru) XX_FB(XX_PRODUCT) supports the Sun XX_FI(telnet-passthru) service provided by the XX_FI(in.telnet-gw) server. This allows outbound telnet connections through a firewall machine. When a XX_FB(p:) is prepended to a hostname, XX_FB(XX_PRODUCT) acts much like the XX_FI(itelnet)(1) command. It contacts the machine named XX_FB(internet-gateway) at the port defined in XX_FB(/etc/services) as XX_FB(telnet-passthru) (which defaults to 3514). It then passes the requested hostname and port to the XX_FB(in.telnet-gw) server. ')dnl XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option or the XX_FB(XX_PRODUCT.proxy) resource causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option or resource is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. ifelse(XX_PRODUCT,x3270,,`include(resources.inc)')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_SH(Files) ifelse(XX_PRODUCT,x3270,/usr/lib/X11,/usr/local/lib)/x3270/ibm_hosts XX_BR ifelse(XX_PRODUCT,x3270,`$HOME/.x3270pro ',XX_PRODUCT,c3270,`$HOME/.c3270pro ') ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Environment Variables) XX_FB(3270PRO) Path of profile file, containing resource definitions. Merged after the system resource database, but before XX_FB(X3270RDB). Defaults to $HOME/.x3270pro. XX_BR XX_FB(NOX3270PRO) If set, do not read the profile. XX_BR XX_FB(X3270RDB) Additional resource definitions, merged after the profile file but before the command-line options. XX_BR XX_FB(KEYMAP) Keymap name. XX_BR XX_FB(KEYBD) Keymap name. ')dnl XX_SH(See Also) ifelse(XX_INTERACTIVE,yes,XX_LINK(XX_PR3287-man.html,XX_PR3287`'(1))`, ')dnl ifelse(XX_PRODUCT,XX_S3270,,XX_LINK(XX_S3270-man.html,XX_S3270`'(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(XX_X3270-script.html,`XX_X3270-script`'(1)), ')dnl ifelse(XX_PLATFORM,unix,`ifelse(XX_PRODUCT,x3270,,XX_LINK(x3270-man.html,x3270(1))`, ')dnl ifelse(XX_PRODUCT,c3270,,XX_LINK(c3270-man.html,c3270(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(tcl3270-man.html,tcl3270(1))`, ')dnl ')dnl telnet(1), tn3270(1)dnl ifelse(XX_PRODUCT,x3270,`, XX_LINK(ibm_hosts.html,ibm_hosts(5)) XX_BR X Toolkit Intrinsics ',` ')dnl XX_BR Data Stream XX_POSESSIVE(Programmer) Reference, IBM GA23-0059 XX_BR Character Set Reference, IBM GA27-3831 XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()2004-2005, Don Russell. XX_BR Copyright`'XX_COPY()2004, Dick Altenbern. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/s3270/x3270-script.man0000664000076500007650000007111013221600611014515 0ustar pdmpdm'\" t .TH X3270-SCRIPT 1 "29 December 2017" .SH "NAME" Scripting Facilities for x3270, c3270 and s3270 .SH "SYNOPSIS" \fBx3270\fP \fB\-script\fP [ \fIx3270-options\fP ] .br \fBx3270\fP \fB\-socket\fP [ \fIx3270-options\fP ] .br \fBx3270\fP \fB\-scriptport \fIport\fP\fP [ \fIx3270-options\fP ] .br \fBc3270\fP \fB\-socket\fP [ \fIc3270-options\fP ] .br \fBc3270\fP \fB\-scriptport\fP \fIport\fP [ \fIs3270-options\fP ] .br \fBs3270\fP [ \fIs3270-options\fP ] .br \fBScript\fP ( \fIcommand\fP [ ,\fIarg\fP... ] ) .SH "DESCRIPTION" The \fBx3270\fP scripting facilities allow the interactive 3270 emulators \fBx3270\fP and \fBc3270\fP to be operated under the control of another program, and forms the basis for the script-only emulator \fBs3270\fP. .PP There are four basic scripting methods. The first is the \fBpeer script\fP facility, invoked by the \fBx3270\fP \fB\-script\fP switch, and the default mode for \fBs3270\fP. This runs the emulator as a child of another process. Typically this would be a script using \fIexpect\fP(1), \fIperl\fP(1), or the co-process facility of the Korn Shell \fIksh\fP(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. .PP The second method is the \fBchild script\fP facility, invoked by the emulator's \fBScript\fP action. This runs a script as a child process of the emulator. The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. .PP The third method uses a TCP socket. The \fB\-scrpiptport\fP command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. .PP The fourth method uses a Unix-domain socket. The \fB\-socket\fP command-line option causes the emulator to create a Unix-domain stream socket named \fB/tmp/x3sck.\fP\fIpid\fP. The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. .PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the \fBScript\fP action. The calling script will be resumed when the nested script completes. .PP Commands are emulator \fIactions\fP; the syntax is the same as for the right-hand side of an \fBx3270\fP or \fBc3270\fP keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with \fB#\fP or \fB!\fP is treaded as a comment and will be ignored. .PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. .PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". .SH "STATUS FORMAT" The status message consists of 12 blank-separated fields: .TP 1 Keyboard State If the keyboard is unlocked, the letter \fBU\fP. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter \fBL\fP. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter \fBE\fP. .TP 2 Screen Formatting If the screen is formatted, the letter \fBF\fP. If unformatted or in \s-1NVT\s+1 mode, the letter \fBU\fP. .TP 3 Field Protection If the field containing the cursor is protected, the letter \fBP\fP. If unprotected or unformatted, the letter \fBU\fP. .TP 4 Connection State If connected to a host, the string \fBC(\fP\fIhostname\fP\fB)\fP. Otherwise, the letter \fBN\fP. .TP 5 Emulator Mode If connected in 3270 mode, the letter \fBI\fP. If connected in \s-1NVT\s+1 line mode, the letter \fBL\fP. If connected in \s-1NVT\s+1 character mode, the letter \fBC\fP. If connected in unnegotiated mode (no BIND active from the host), the letter \fBP\fP. If not connected, the letter \fBN\fP. .TP 6 Model Number (2-5) .TP 7 Number of Rows The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. .TP 8 Number of Columns The current number of columns defined on the screen, subject to the same difference for rows, above. .TP 9 Cursor Row The current cursor row (zero-origin). .TP 10 Cursor Column The current cursor column (zero-origin). .TP 11 Window ID The X window identifier for the main \fBx3270\fP window, in hexadecimal preceded by \fB0x\fP. For \fBs3270\fP and \fBc3270\fP, this is zero. .TP 12 Command Execution Time The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. .SH "DIFFERENCES" When an action is initiated by a script, the emulators behave in several different ways: .PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. .PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the \fBCloseScript\fP action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the \fBScript\fP action to complete. .PP The \fBQuit\fP action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) .PP Normally, the AID actions (\fBClear\fP, \fBEnter\fP, \fBPF\fP, and \fBPA\fP) will not complete until the host unlocks the keyboard. If the parameter to a \fBString\fP action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. .PP The \fBAidWait\fP toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The \fBWait(Output)\fP action can then be used to delay a script until the host changes something on the screen, and the \fBWait(Unlock)\fP action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the \fBAidWait\fP toggle. .PP Note that the \fBScript\fP action does not complete until end-of-file is detected on the pipe or the \fBCloseScript\fP action is called by the child process. This behavior is not affected by the state of the \fBAidWait\fP toggle. .SH "BASIC PROGRAMMING STRATEGIES" 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. .LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the \fBSnap\fP action. The \fBSnap(Save)\fP action saves a snapshot of the screen in a special buffer. Then the script can use \fBSnap\fP variants of the \fBAscii\fP and \fBEbcdic\fP actions (\fBSnap(Ascii)\fP and \fBSnap(Ebcdic)\fP) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, \fBSnap(Wait Output)\fP blocks the script until the host modifies the screen, specifically since the last call to \fBSnap(Save)\fP. Thus a script can poll the screen efficiently by writing a loop that begins with \fBSnap(Save)\fP and ends with \fBSnap(Wait Output)\fP. .SH "SCRIPT-SPECIFIC ACTIONS" The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, \fIrow\fP and \fIcol\fP coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). .TP \fBAnsiText\fP Outputs whatever data that has been output by the host in \s-1NVT\s+1 mode since the last time that \fBAnsiText\fP was called. The data is preceded by the string "data:\ ", and has had all control characters expanded into C backslash sequences. .IP This is a convenient way to capture \s-1NVT\s+1 mode output in a synchronous manner without trying to decode the screen contents. .TP \fBAscii\fP(\fIrow\fP,\fIcol\fP,\fIrows\fP,\fIcols\fP) .TP \fBAscii\fP(\fIrow\fP,\fIcol\fP,\fIlength\fP) .TP \fBAscii\fP(\fIlength\fP) .TP \fBAscii\fP Outputs an \s-1ASCII\s+1 text representation of the screen contents. Each line is preceded by the string "data:\ ", and there are no control characters. .IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) .IP If three parameters are given, \fIlength\fP characters are output, starting at the specified zero-origin row and column. .IP If only the \fIlength\fP parameter is given, that many characters are output, starting at the cursor position. .IP If no parameters are given, the entire screen is output. .IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the \fB\-charset\fP option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. .TP \fBAsciiField\fP Outputs an \s-1ASCII\s+1 text representation of the field containing the cursor. The text is preceded by the string "data:\ ". .TP \fBConnect\fP(\fIhostname\fP) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. .TP \fBCloseScript\fP(\fIstatus\fP) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the \fBScript\fP action, the optional \fIstatus\fP is used as the return status of \fBScript\fP; if nonzero, \fBScript\fP will complete with an error, and if this script was invoked as part of login through the \fBibm_hosts\fP file, the connection will be broken. .TP \fBContinueScript\fP([\fIparam\fP]) Allows a script that is waiting in a \fBPauseScript\fP action, below, to continue. The optional \fIparam\fP string is output by the \fBPauseScript\fP action. .TP \fBDisconnect\fP Disconnects from the host. .TP \fBEbcdic\fP(\fIrow\fP,\fIcol\fP,\fIrows\fP,\fIcols\fP) .TP \fBEbcdic\fP(\fIrow\fP,\fIcol\fP,\fIlength\fP) .TP \fBEbcdic\fP(\fIlength\fP) .TP \fBEbcdic\fP The same function as \fBAscii\fP above, except that rather than generating \s-1ASCII\s+1 text, each character is output as a 2-digit or 4-digit hexadecimal \s-1EBCDIC\s+1 code. .TP \fBEbcdicField\fP The same function as \fBAsciiField\fP above, except that it generates hexadecimal \s-1EBCDIC\s+1 codes. .TP \fBInfo\fP(\fImessage\fP) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. .TP \fBExpect\fP(\fItext\fP[,\fItimeout\fP]) Pauses the script until the specified \fItext\fP appears in the data stream from the host, or the specified \fItimeout\fP (in seconds) expires. If no \fItimeout\fP is specified, the default is 30 seconds. \fIText\fP can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. \fBExpect\fP is valid only in \s-1NVT\s+1 mode. .TP \fBMoveCursor\fP(\fIrow\fP,\fIcol\fP) Moves the cursor to the specified zero-origin coordinates. .TP \fBPauseScript\fP Stops a script until the \fBContinueScript\fP action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to \fBContinueScript\fP, if one is given. .TP \fBPrintText\fP([\fBcommand\fP,]\fIfilter\fP) Pipes an ASCII representation of the current screen image through the named \fIfilter\fP, e.g., \fBlpr\fP. .TP \fBPrintText\fP([\fBhtml\fP,][\fBappend\fP,][\fBreplace\fP,]\fBfile\fP,\fIfilename\fP) Saves the current screen contents in a file. With the \fBhtml\fP option, saves it as HTML, otherwise saves it as plain ASCII. The \fBappend\fP option (the default) causes the data to be appended to the file if it already exists. The \fBreplace\fP option causes the file to be overwritten instead. .TP \fBPrintText\fP(\fBhtml,string\fP) Returns the current screen contents as HTML. .TP \fBQuery\fP(\fIkeyword\fP) Returns state information. Keywords are: .PP .TS center; l l . T{ .na .nh Keyword T} T{ .na .nh Output T} _ T{ .na .nh BindPluName T} T{ .na .nh BIND PLU returned by the host T} T{ .na .nh ConnectionState T} T{ .na .nh TN3270/TN3270E mode and submode T} T{ .na .nh CodePage T} T{ .na .nh Host code page T} T{ .na .nh Cursor T} T{ .na .nh Cursor position (row col) T} T{ .na .nh Formatted T} T{ .na .nh 3270 format state (formatted or unformatted) T} T{ .na .nh Host T} T{ .na .nh Host name and port T} T{ .na .nh LocalEncoding T} T{ .na .nh Local character encoding T} T{ .na .nh LuName T} T{ .na .nh Host name LU name T} T{ .na .nh Model T} T{ .na .nh 3270 model name (IBM-327x-n) T} T{ .na .nh ScreenCurSize T} T{ .na .nh Current screen size (rows cols) T} T{ .na .nh ScreenMaxSize T} T{ .na .nh Maximum screen size (rows cols) T} T{ .na .nh Ssl T} T{ .na .nh SSL state (secure or not-secure) and host validation state (host-verified or host-unverified) T} .TE .IP Without a \fIkeyword\fP, \fBQuery\fP returns each of the defined attributes, one per line, labeled by its name. .TP \fBReadBuffer\fP(\fBAscii\fP) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as \fBSF(aa=nn[,...])\fP, where \fIaa\fP is a field attribute type and \fInn\fP is its value. .PP .TS center; l l . T{ .na .nh Attribute T} T{ .na .nh Values T} _ T{ .na .nh c0 basic 3270 T} T{ .na .nh 20 protected T} T{ .na .nh T} T{ .na .nh 10 numeric T} T{ .na .nh T} T{ .na .nh 04 detectable T} T{ .na .nh T} T{ .na .nh 08 intensified T} T{ .na .nh T} T{ .na .nh 0c non-display T} T{ .na .nh T} T{ .na .nh 01 modified T} T{ .na .nh 41 highlighting T} T{ .na .nh f1 blink T} T{ .na .nh T} T{ .na .nh f2 reverse T} T{ .na .nh T} T{ .na .nh f4 underscore T} T{ .na .nh T} T{ .na .nh f8 intensify T} T{ .na .nh 42 foreground T} T{ .na .nh f0 neutral black T} T{ .na .nh T} T{ .na .nh f1 blue T} T{ .na .nh T} T{ .na .nh f2 red T} T{ .na .nh T} T{ .na .nh f3 pink T} T{ .na .nh T} T{ .na .nh f4 green T} T{ .na .nh T} T{ .na .nh f5 turquoise T} T{ .na .nh T} T{ .na .nh f6 yellow T} T{ .na .nh T} T{ .na .nh f7 neutral white T} T{ .na .nh T} T{ .na .nh f8 black T} T{ .na .nh T} T{ .na .nh f9 deep blue T} T{ .na .nh T} T{ .na .nh fa orange T} T{ .na .nh T} T{ .na .nh fb purple T} T{ .na .nh T} T{ .na .nh fc pale green T} T{ .na .nh T} T{ .na .nh fd pale turquoise T} T{ .na .nh T} T{ .na .nh fe grey T} T{ .na .nh T} T{ .na .nh ff white T} T{ .na .nh 43 character set T} T{ .na .nh f0 default T} T{ .na .nh T} T{ .na .nh f1 APL T} T{ .na .nh T} T{ .na .nh f8 DBCS T} .TE .IP Extended attributes (which do not take up display positions) are output as \fBSA(aa=nn)\fP, with \fIaa\fP and \fInn\fP having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). .IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. .TP \fBReadBuffer\fP(\fBEbcdic\fP) Equivalent to \fBReadBuffer\fP(\fBAscii\fP), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as \fBGE(\fIxx\fP)\fP. .TP \fBScript\fP(\fIpath\fP[,arg...]) Runs a child script, passing it optional command-line arguments. \fIpath\fP must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the \fBSource\fP action. .TP \fBSnap\fP Equivalent to \fBSnap\fP(\fBSave\fP) (see below). .TP \fBSnap\fP(\fBAscii\fP,...) Performs the \fBAscii\fP action on the saved screen image. .TP \fBSnap\fP(\fBCols\fP) Returns the number of columns in the saved screen image. .TP \fBSnap\fP(\fBEbcdic\fP,...) Performs the \fBEbcdic\fP action on the saved screen image. .TP \fBSnap\fP(\fBReadBuffer\fP) Performs the \fBReadBuffer\fP action on the saved screen image. .TP \fBSnap(\fBRows\fP)\fP Returns the number of rows in the saved screen image. .TP \fBSnap\fP(\fBSave\fP) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other \fBSnap\fP actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. .TP \fBSnap\fP(\fBStatus\fP) Returns the status line from when the screen was last saved. .TP \fBSnap\fP(\fBWait\fP[,\fItimeout\fP],\fBOutput\fP) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an \fBEnter\fP, \fBPF\fP or \fBPA\fP action), but has not finished updating the screen. This action is usually invoked in a loop that uses the \fBSnap\fP(\fBAscii\fP) or \fBSnap\fP(\fBEbcdic\fP) action to scan the screen for some pattern that indicates that the host has fully processed the last command. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBSnap\fP action. The default is to wait indefinitely. .TP \fBSource\fP(\fIfile\fP) Read and execute commands from \fIfile\fP. Any output from those commands will become the output from \fBSource\fP. If any of the commands fails, the \fBSource\fP command will \fInot\fP abort; it will continue reading commands until EOF. .TP \fBTitle\fP(\fItext\fP) Changes the x3270 window title to \fItext\fP. .TP \fBTransfer\fP(\fIkeyword\fP=\fIvalue\fP,...) Invokes IND$FILE file transfer. See \s-1FILE TRANSFER\s+1 below. .TP \fBWait\fP([\fItimeout\fP,] \fB3270Mode\fP) Used when communicating with a host that switches between \s-1NVT\s+1 mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .IP For backwards compatibility, \fBWait(3270)\fP is equivalent to \fBWait\fP(\fB3270Mode\fP) .TP \fBWait\fP([\fItimeout\fP,] \fBDisconnect\fP) Pauses the script until the host disconnects. Often used to after sending a \fIlogoff\fP command to a \s-1VM/CMS\s+1 host, to ensure that the session is not unintentionally set to \fBdisconnected\fP state. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .TP \fBWait\fP([\fItimeout\fP,] \fBInputField\fP) A useful utility for use at the beginning of scripts and after the \fBConnect\fP action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In \s-1NVT\s+1 mode, waits until the host sends at least one byte of data. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .IP For backwards compatibility, \fBWait\fP is equivalent to \fBWait\fP(\fBInputField\fP). .TP \fBWait\fP([\fItimeout\fP,] \fBNVTMode\fP) Used when communicating with a host that switches between 3270 mode and \s-1NVT\s+1 mode. Pauses the script or macro until the host negotiates \s-1NVT\s+1 mode, then waits for a byte from the host as above. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .IP For backwards compatibility, \fBWait\fP(\fBansi\fP) is equivalent to \fBWait\fP(\fBNVTMode\fP). .TP \fBWait\fP([\fItimeout\fP,] \fBOutput\fP) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a \fBClear\fP, \fBEnter\fP, \fBPF\fP or \fBPA\fP action), but has not finished updating the screen. Also used in non-blocking AID mode (see \s-1DIFFERENCES\s+1 for details). This action is usually invoked in a loop that uses the \fBAscii\fP or \fBEbcdic\fP action to scan the screen for some pattern that indicates that the host has fully processed the last command. .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .TP \fBWait\fP([\fItimeout\fP,] \fBUnlock\fP) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (\fBtoggle AidWait clear\fP), to wait for a host command to complete. See \s-1DIFFERENCES\s+1 for details). .IP The optional \fItimeout\fP parameter specifies a number of seconds to wait before failing the \fBWait\fP action. The default is to wait indefinitely. .TP \fBWait\fP(\fItimeout\fP, \fBSeconds\fP) Delays the script \fItimeout\fP seconds. Unlike the other forms of \fBWait\fP, the timeout is not optional. .TP \fBWindowState\fP(\fImode\fP) If \fImode\fP is \fBIconic\fP, changes the x3270 window into an icon. If \fImode\fP is \fBNormal\fP, changes the x3270 window from an icon to a normal window. .SH "FILE TRANSFER" The \fBTransfer\fP action implements \fBIND$FILE\fP file transfer. This action requires that the \fBIND$FILE\fP program be installed on the \s-1IBM\s+1 host, and that the 3270 cursor be located in a field that will accept a \s-1TSO\s+1 or \s-1VM/CMS\s+1 command. .LP .LP Because of the complexity and number of options for file transfer, the parameters to the \fBTransfer\fP action take the unique form of \fIoption\fP=\fIvalue\fP, and can appear in any order. Note that if the \fIvalue\fP contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: .LP .TS l c l l. T{ .na .nh Option T} T{ .na .nh Required? T} T{ .na .nh Default T} T{ .na .nh Other Values T} _ T{ .na .nh Direction T} T{ .na .nh No T} T{ .na .nh receive T} T{ .na .nh send T} T{ .na .nh HostFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh LocalFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Host T} T{ .na .nh No T} T{ .na .nh tso T} T{ .na .nh vm, cics T} T{ .na .nh Mode T} T{ .na .nh No T} T{ .na .nh ascii T} T{ .na .nh binary T} T{ .na .nh Cr T} T{ .na .nh No T} T{ .na .nh remove T} T{ .na .nh add, keep T} T{ .na .nh Remap T} T{ .na .nh No T} T{ .na .nh yes T} T{ .na .nh no T} T{ .na .nh Exist T} T{ .na .nh No T} T{ .na .nh keep T} T{ .na .nh replace, append T} T{ .na .nh Recfm T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh fixed, variable, undefined T} T{ .na .nh Lrecl T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Blksize T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Allocation T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh tracks, cylinders, avblock T} T{ .na .nh PrimarySpace T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh SecondarySpace T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Avblock T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh BufferSize T} T{ .na .nh No T} T{ .na .nh 4096 T} T{ .na .nh \ T} .TE .LP The option details are as follows. .TP \fBDirection\fP \fBsend\fP to send a file to the host, \fBreceive\fP to receive a file from the host. .TP \fBHostFile\fP The name of the file on the host. .TP \fBLocalFile\fP The name of the file on the local workstation. .TP \fBHost\fP The type of host (which dictates the form of the \fBIND$FILE\fP command): \fBtso\fP (the default), \fBvm\fP or \fBcics\fP. .TP \fBMode\fP Use \fBascii\fP (the default) for a text file, which will be translated between \s-1EBCDIC\s+1 and \s-1ASCII\s+1 as necessary. Use \fBbinary\fP for non-text files. .TP \fBCr\fP Controls how \fBNewline\fP characters are handled when transferring \fBMode=ascii\fP files. \fBremove\fP (the default) strips \fBNewline\fP characters in local files before transferring them to the host. \fBadd\fP adds \fBNewline\fP characters to each host file record before transferring it to the local workstation. \fBkeep\fP preserves \fBNewline\fP characters when transferring a local file to the host. .TP \fBRemap\fP Controls text translation for \fBMode=ascii\fP files. The value \fByes\fP (the default) causes s3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's \s-1EBCDIC\s+1 code page. The value \fBno\fP causes s3270 to pass the text to or from the host as-is, leaving all translation to the \fBIND$FILE\fP program on the host. .TP \fBExist\fP Controls what happens when the destination file already exists. \fBkeep\fP (the default) preserves the file, causing the \fBTransfer\fP action to fail. \fBreplace\fP overwrites the destination file with the source file. \fBappend\fP appends the source file to the destination file. .TP \fBRecfm\fP Controls the record format of files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) \fBfixed\fP creates a file with fixed-length records. \fBvariable\fP creates a file with variable-length records. \fBundefined\fP creates a file with undefined-length records (\s-1TSO\s+1 hosts only). The \fBLrecl\fP option controls the record length or maximum record length for \fBRecfm=fixed\fP and \fBRecfm=variable\fP files, respectively. .TP \fBLrecl\fP Specifies the record length (or maximum record length) for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBBlksize\fP Specifies the block size for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBAllocation\fP Specifies the units for the \fBPrimarySpace\fP and \fBSecondarySpace\fP options: \fBtracks\fP, \fBcylinders\fP or \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBPrimarySpace\fP Primary allocation for a file. The units are given by the \fBAllocation\fP option. Required when the \fBAllocation\fP is specified as something other than \fBdefault\fP. (\s-1TSO\s+1 hosts only.) .TP \fBSecondarySpace\fP Secondary allocation for a file. The units are given by the \fBAllocation\fP option. (\s-1TSO\s+1 hosts only.) .TP \fBAvblock\fP Average block size, required when \fBAllocation\fP specifies \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBBufferSize\fP Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. .LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the \fBTransfer\fP keywords, but with \fBft\fP prepended. E.g., the default for the \fBMode\fP keyword is the \fBs3270.ftMode\fP resource. .SH "SEE ALSO" expect(1) .br perl(1) .br ksh(1) .br x3270(1) .br x3270if(1) .br c3270(1) .br s3270(1) .SH "VERSION" Version 3.6ga4 suite3270-3.6/s3270/x3270-script.man.m40000664000076500007650000006544613221577163015072 0ustar pdmpdmdnl Copyright (c) 2000-2014, 2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270-SCRIPT,1,XX_DATE) XX_SH(Name) Scripting Facilities for ifelse(XX_PLATFORM,unix,`x3270,') XX_C3270 and XX_S3270 XX_SH(Synopsis) ifelse(XX_PLATFORM,unix,`XX_FB(x3270) XX_FB(XX_DASHED(script)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(socket)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(scriptport) XX_FI(port)) [ XX_FI(x3270-options) ] XX_BR ')dnl ifelse(XX_PLATFORM,unix,`XX_FB(XX_C3270) XX_FB(XX_DASHED(socket)) [ XX_FI(XX_C3270-options) ] XX_BR ')dnl XX_FB(XX_C3270) XX_FB(XX_DASHED(scriptport)) XX_FI(port) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(XX_S3270) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(`Script') ( XX_FI(command) [ `,'XX_FI(arg)... ] ) XX_SH(Description) The XX_FB(x3270) scripting facilities allow the interactive 3270 ifelse(XX_PLATFORM,unix,`emulators XX_FB(x3270) and XX_FB(c3270)', `emulator XX_FB(wc3270)') to be operated under the control of another program, and forms the basis for the script-only emulator XX_FB(XX_S3270). XX_PP There are ifelse(XX_PLATFORM,unix,four,three) basic scripting methods. The first is the XX_FB(peer script) facility, ifelse(XX_PLATFORM,unix,`invoked by the XX_FB(x3270) XX_FB(XX_DASHED(script)) switch, and ')dnl the default mode for XX_FB(XX_S3270). This runs the emulator as a child of another process. Typically this would be a script using XX_FI(expect)(1), XX_FI(perl)(1), or the co-process facility of the Korn Shell XX_FI(ksh)(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. XX_PP The second method is the XX_FB(child script) facility, invoked by the emulator's XX_FB(Script) action. This runs a script as a child process of the emulator. ifelse(XX_PLATFORM,unix,`The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. ',`The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196). ')dnl XX_PP The third method uses a TCP socket. The XX_FB(XX_DASHED(scrpiptport)) command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. ifelse(XX_PLATFORM,windows,`(Note that if the XX_FB(Script) action is used with XX_FB(XX_DASHED(scriptport)), it will pass the scriptport port number to child scripts, rather than creating a new socket.) ')dnl ifelse(XX_PLATFORM,unix,`XX_PP The fourth method uses a Unix-domain socket. The XX_FB(XX_DASHED(socket)) command-line option causes the emulator to create a Unix-domain stream socket named XX_FB(/tmp/x3sck.)`'XX_FI(pid). The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. ')dnl XX_PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the XX_FB(Script) action. The calling script will be resumed when the nested script completes. XX_PP Commands are emulator XX_FI(actions); the syntax is the same as for the right-hand side of ifelse(XX_PLATFORM,unix,`an XX_FB(x3270) or',`a') XX_FB(XX_C3270) keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with XX_FB(#) or XX_FB(!) is treaded as a comment and will be ignored. XX_PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. XX_PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". XX_SH(Status Format) The status message consists of 12 blank-separated fields: XX_TPS()dnl XX_TP(1 Keyboard State) If the keyboard is unlocked, the letter XX_FB(U). If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter XX_FB(L). If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter XX_FB(E). XX_TP(2 Screen Formatting) If the screen is formatted, the letter XX_FB(F). If unformatted or in XX_SM(NVT) mode, the letter XX_FB(U). XX_TP(3 Field Protection) If the field containing the cursor is protected, the letter XX_FB(P). If unprotected or unformatted, the letter XX_FB(U). XX_TP(4 Connection State) If connected to a host, the string XX_FB(`C(')`'XX_FI(hostname)`'XX_FB(`)'). Otherwise, the letter XX_FB(N). XX_TP(5 Emulator Mode) If connected in 3270 mode, the letter XX_FB(I). If connected in XX_SM(NVT) line mode, the letter XX_FB(L). If connected in XX_SM(NVT) character mode, the letter XX_FB(C). If connected in unnegotiated mode (no BIND active from the host), the letter XX_FB(P). If not connected, the letter XX_FB(N). XX_TP(6 Model Number (2-5)) XX_TP(7 Number of Rows) The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. XX_TP(8 Number of Columns) The current number of columns defined on the screen, subject to the same difference for rows, above. XX_TP(9 Cursor Row) The current cursor row (zero-origin). XX_TP(10 Cursor Column) The current cursor column (zero-origin). XX_TP(11 Window ID) The X window identifier for the main XX_FB(x3270) window, in hexadecimal preceded by XX_FB(0x). For XX_FB(XX_S3270) and XX_FB(XX_C3270), this is zero. XX_TP(12 Command Execution Time) The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. XX_TPE()dnl XX_SH(Differences) When an action is initiated by a script, the emulators behave in several different ways: XX_PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. XX_PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the XX_FB(CloseScript) action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the XX_FB(Script) action to complete. XX_PP The XX_FB(Quit) action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) XX_PP Normally, the AID actions (XX_FB(Clear), XX_FB(Enter), XX_FB(PF), and XX_FB(PA)) will not complete until the host unlocks the keyboard. If the parameter to a XX_FB(String) action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. XX_PP The XX_FB(AidWait) toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The XX_FB(Wait(Output)) action can then be used to delay a script until the host changes something on the screen, and the XX_FB(Wait(Unlock)) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the XX_FB(AidWait) toggle. XX_PP Note that the XX_FB(Script) action does not complete until ifelse(XX_PLATFORM,unix,`end-of-file is detected on the pipe or ')dnl the XX_FB(CloseScript) action is called by the child process. This behavior is not affected by the state of the XX_FB(AidWait) toggle. XX_SH(Basic Programming Strategies) 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. XX_LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the XX_FB(Snap) action. The XX_FB(Snap(Save)) action saves a snapshot of the screen in a special buffer. Then the script can use XX_FB(Snap) variants of the XX_FB(Ascii) and XX_FB(Ebcdic) actions (XX_FB(Snap(Ascii)) and XX_FB(Snap(Ebcdic))) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, XX_FB(Snap(Wait Output)) blocks the script until the host modifies the screen, specifically since the last call to XX_FB(Snap(Save)). Thus a script can poll the screen efficiently by writing a loop that begins with XX_FB(Snap(Save)) and ends with XX_FB(Snap(Wait Output)). XX_SH(Script-Specific Actions) The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, XX_FI(row) and XX_FI(col) coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). XX_TPS()dnl XX_TP(XX_FB(AnsiText)) Outputs whatever data that has been output by the host in XX_SM(NVT) mode since the last time that XX_FB(AnsiText) was called. The data is preceded by the string "data:XX_NBSP", and has had all control characters expanded into C backslash sequences. XX_IP This is a convenient way to capture XX_SM(NVT) mode output in a synchronous manner without trying to decode the screen contents. XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ascii)(XX_FI(length))) XX_TP(XX_FB(Ascii)) Outputs an XX_SM(ASCII) text representation of the screen contents. Each line is preceded by the string "data:XX_NBSP", and there are no control characters. XX_IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) XX_IP If three parameters are given, XX_FI(length) characters are output, starting at the specified zero-origin row and column. XX_IP If only the XX_FI(length) parameter is given, that many characters are output, starting at the cursor position. XX_IP If no parameters are given, the entire screen is output. XX_IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the XX_FB(XX_DASHED(charset)) option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. XX_TP(XX_FB(AsciiField)) Outputs an XX_SM(ASCII) text representation of the field containing the cursor. The text is preceded by the string "data:XX_NBSP". XX_TP(XX_FB(Connect)(XX_FI(hostname))) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. XX_TP(XX_FB(CloseScript)(XX_FI(status))) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the XX_FB(Script) action, the optional XX_FI(status) is used as the return status of XX_FB(Script); if nonzero, XX_FB(Script) will complete with an error, and if this script was invoked as part of login through the XX_FB(ibm_hosts) file, the connection will be broken. XX_TP(XX_FB(ContinueScript)([XX_FI(param)])) Allows a script that is waiting in a XX_FB(PauseScript) action, below, to continue. The optional XX_FI(param) string is output by the XX_FB(PauseScript) action. XX_TP(XX_FB(Disconnect)) Disconnects from the host. XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ebcdic)(XX_FI(length))) XX_TP(XX_FB(Ebcdic)) The same function as XX_FB(Ascii) above, except that rather than generating XX_SM(ASCII) text, each character is output as a 2-digit or 4-digit hexadecimal XX_SM(EBCDIC) code. XX_TP(XX_FB(EbcdicField)) The same function as XX_FB(AsciiField) above, except that it generates hexadecimal XX_SM(EBCDIC) codes. XX_TP(XX_FB(Info)(XX_FI(message))) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. XX_TP(XX_FB(Expect)(XX_FI(text)[,XX_FI(timeout)])) Pauses the script until the specified XX_FI(text) appears in the data stream from the host, or the specified XX_FI(timeout) (in seconds) expires. If no XX_FI(timeout) is specified, the default is 30 seconds. XX_FI(Text) can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. XX_FB(Expect) is valid only in XX_SM(NVT) mode. ifelse(XX_MODE,console,`XX_TP(XX_FB(Keymap([XX_FI(keymap)]))) Adds or removes a temporary keymap. If the XX_FI(keymap) parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed. ')dnl XX_TP(XX_FB(MoveCursor)(XX_FI(row),XX_FI(col))) Moves the cursor to the specified zero-origin coordinates. XX_TP(XX_FB(PauseScript)) Stops a script until the XX_FB(ContinueScript) action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to XX_FB(ContinueScript), if one is given. XX_TP(XX_FB(PrintText)([XX_FB(command),]XX_FI(filter))) Pipes an ASCII representation of the current screen image through the named XX_FI(filter), e.g., XX_FB(lpr). XX_TP(XX_FB(PrintText)([XX_FB(html),][XX_FB(append),][XX_FB(replace),]XX_FB(file),XX_FI(filename))) Saves the current screen contents in a file. With the XX_FB(html) option, saves it as HTML, otherwise saves it as plain ASCII. The XX_FB(append) option (the default) causes the data to be appended to the file if it already exists. The XX_FB(replace) option causes the file to be overwritten instead. XX_TP(XX_FB(PrintText)(XX_FB(`html,string'))) Returns the current screen contents as HTML. XX_TP(XX_FB(Query)(XX_FI(keyword))) Returns state information. Keywords are: XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(Keyword) XX_TD(Output)) XX_T_ XX_TR(XX_TD(BindPluName) XX_TD(BIND PLU returned by the host)) XX_TR(XX_TD(ConnectionState) XX_TD(TN3270/TN3270E mode and submode)) XX_TR(XX_TD(CodePage) XX_TD(Host code page)) XX_TR(XX_TD(Cursor) XX_TD(Cursor position (row col), zero-origin)) XX_TR(XX_TD(Formatted) XX_TD(3270 format state (formatted or unformatted))) XX_TR(XX_TD(Host) XX_TD(Host name and port)) XX_TR(XX_TD(LocalEncoding) XX_TD(Local character encoding)) XX_TR(XX_TD(LuName) XX_TD(Host name LU name)) XX_TR(XX_TD(Model) XX_TD(3270 model name (IBM-327x-n))) XX_TR(XX_TD(ScreenCurSize) XX_TD(Current screen size (rows cols))) XX_TR(XX_TD(ScreenMaxSize) XX_TD(Maximum screen size (rows cols))) XX_TR(XX_TD(Ssl) XX_TD(SSL state (secure or not-secure) and host validation state (host-verified or host-unverified))) XX_TE XX_IP Without a XX_FI(keyword), XX_FB(Query) returns each of the defined attributes, one per line, labeled by its name. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ascii))) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as XX_FB(SF`(aa=nn[,...])'), where XX_FI(aa) is a field attribute type and XX_FI(nn) is its value. XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(XX_TC(Attribute)) XX_TD(XX_TC(Values))) XX_T_ XX_TR(XX_TD(XX_TC(c0 basic 3270)) XX_TD(XX_TC(20 protected))) XX_TR(XX_TD() XX_TD(XX_TC(10 numeric))) XX_TR(XX_TD() XX_TD(XX_TC(04 detectable))) XX_TR(XX_TD() XX_TD(XX_TC(08 intensified))) XX_TR(XX_TD() XX_TD(XX_TC(0c non-display))) XX_TR(XX_TD() XX_TD(XX_TC(01 modified))) XX_TR(XX_TD(XX_TC(41 highlighting)) XX_TD(XX_TC(f1 blink))) XX_TR(XX_TD() XX_TD(XX_TC(f2 reverse))) XX_TR(XX_TD() XX_TD(XX_TC(f4 underscore))) XX_TR(XX_TD() XX_TD(XX_TC(f8 intensify))) XX_TR(XX_TD(XX_TC(42 foreground)) XX_TD(XX_TC(f0 neutral black))) XX_TR(XX_TD() XX_TD(XX_TC(f1 blue))) XX_TR(XX_TD() XX_TD(XX_TC(f2 red))) XX_TR(XX_TD() XX_TD(XX_TC(f3 pink))) XX_TR(XX_TD() XX_TD(XX_TC(f4 green))) XX_TR(XX_TD() XX_TD(XX_TC(f5 turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(f6 yellow))) XX_TR(XX_TD() XX_TD(XX_TC(f7 neutral white))) XX_TR(XX_TD() XX_TD(XX_TC(f8 black))) XX_TR(XX_TD() XX_TD(XX_TC(f9 deep blue))) XX_TR(XX_TD() XX_TD(XX_TC(fa orange))) XX_TR(XX_TD() XX_TD(XX_TC(fb purple))) XX_TR(XX_TD() XX_TD(XX_TC(fc pale green))) XX_TR(XX_TD() XX_TD(XX_TC(fd pale turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(fe grey))) XX_TR(XX_TD() XX_TD(XX_TC(ff white))) XX_TR(XX_TD(XX_TC(43 character set)) XX_TD(XX_TC(f0 default))) XX_TR(XX_TD() XX_TD(XX_TC(f1 APL))) XX_TR(XX_TD() XX_TD(XX_TC(f8 DBCS))) XX_TE() XX_IP Extended attributes (which do not take up display positions) are output as XX_FB(SA`('aa=nn`)'), with XX_FI(aa) and XX_FI(nn) having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). XX_IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ebcdic))) Equivalent to XX_FB(ReadBuffer)(XX_FB(Ascii)), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as XX_FB(GE`('XX_FI(xx)`)'). XX_TP(XX_FB(Script)(XX_FI(path)[,arg...])) Runs a child script, passing it optional command-line arguments. XX_FI(path) must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the XX_FB(Source) action. XX_TP(XX_FB(Snap)) Equivalent to XX_FB(Snap)(XX_FB(Save)) (see XX_LINK(#save,below)). XX_TP(XX_FB(Snap)(XX_FB(Ascii),...)) Performs the XX_FB(Ascii) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(Cols))) Returns the number of columns in the saved screen image. XX_TP(XX_FB(Snap)(`XX_FB(Ebcdic),...')) Performs the XX_FB(Ebcdic) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(ReadBuffer))) Performs the XX_FB(ReadBuffer) action on the saved screen image. XX_TP(XX_FB(Snap(XX_FB(Rows)))) Returns the number of rows in the saved screen image. XX_TARGET(save)dnl XX_TP(XX_FB(Snap)(XX_FB(Save))) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other XX_FB(Snap) actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. XX_TP(XX_FB(Snap)(XX_FB(Status))) Returns the status line from when the screen was last saved. XX_TP(XX_FB(Snap)(XX_FB(Wait)[`,'XX_FI(timeout)]`,'XX_FB(Output))) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. This action is usually invoked in a loop that uses the XX_FB(Snap)(XX_FB(Ascii)) or XX_FB(Snap)(XX_FB(Ebcdic)) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Snap) action. The default is to wait indefinitely. XX_TP(XX_FB(Source)(XX_FI(file))) Read and execute commands from XX_FI(file). Any output from those commands will become the output from XX_FB(Source). If any of the commands fails, the XX_FB(Source) command will XX_FI(not) abort; it will continue reading commands until EOF. XX_TP(XX_FB(Title)(XX_FI(text))) Changes the ifelse(XX_PLATFORM,unix,x3270,wc3270) window title to XX_FI(text). XX_TP(XX_FB(Transfer)(XX_FI(keyword)=XX_FI(value),...)) Invokes IND$FILE file transfer. See XX_LINK(#File-Transfer,XX_SM(FILE TRANSFER)) below. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(3270Mode))) Used when communicating with a host that switches between XX_SM(NVT) mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait(3270)) is equivalent to XX_FB(Wait)(XX_FB(3270Mode)) XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Disconnect))) Pauses the script until the host disconnects. Often used to after sending a XX_FI(logoff) command to a XX_SM(VM/CMS) host, to ensure that the session is not unintentionally set to XX_FB(disconnected) state. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(InputField))) A useful utility for use at the beginning of scripts and after the XX_FB(Connect) action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In XX_SM(NVT) mode, waits until the host sends at least one byte of data. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait) is equivalent to XX_FB(Wait)(XX_FB(InputField)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(NVTMode))) Used when communicating with a host that switches between 3270 mode and XX_SM(NVT) mode. Pauses the script or macro until the host negotiates XX_SM(NVT) mode, then waits for a byte from the host as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait)(XX_FB(ansi)) is equivalent to XX_FB(Wait)(XX_FB(NVTMode)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Output))) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a XX_FB(Clear), XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. Also used in non-blocking AID mode (see XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). This action is usually invoked in a loop that uses the XX_FB(Ascii) or XX_FB(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Unlock))) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (XX_FB(toggle AidWait clear)), to wait for a host command to complete. See XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)(XX_FI(timeout)`,' XX_FB(Seconds))) Delays the script XX_FI(timeout) seconds. Unlike the other forms of XX_FB(Wait), the timeout is not optional. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(WindowState)(XX_FI(mode))) If XX_FI(mode) is XX_FB(Iconic), changes the x3270 window into an icon. If XX_FI(mode) is XX_FB(Normal), changes the x3270 window from an icon to a normal window. ')dnl XX_TPE()dnl define(XX_action,action)dnl include(ft.inc)dnl XX_SH(See Also) expect(1) XX_BR perl(1) XX_BR ksh(1) ifelse(XX_PLATFORM,unix,`XX_BR XX_LINK(x3270-man.html,x3270(1)) ')dnl XX_BR ifelse(XX_PLATFORM,unix,`XX_LINK(Unix-x3270if.html,x3270if(1))',`XX_LINK(Windows-x3270if.html,x3270if(1))') XX_BR XX_LINK(XX_C3270-man.html,XX_C3270`(1)') XX_BR XX_LINK(XX_S3270-man.html,XX_S3270`(1)') XX_SH(Version) Version XX_VERSION_NUMBER suite3270-3.6/tcl3270/conf.h.in0000664000076500007650000000371713221577163014005 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2014-2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. */ /* Libraries. */ /* Header files. */ #undef HAVE_SYS_SELECT_H #undef HAVE_PTY_H #undef HAVE_LIBUTIL_H #undef HAVE_UTIL_H #undef HAVE_TCLEXTEND_H /* Uncommon functions. */ #undef HAVE_VASPRINTF #undef HAVE_FSEEKO #undef HAVE_FORKPTY /* Configuration options. */ /* Optional parts. */ #undef X3270_DBCS #undef X3270_LOCAL_PROCESS #undef X3270_IPV6 suite3270-3.6/tcl3270/configure0000775000076500007650000056535313221600613014205 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for tcl3270 3.x. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tcl3270' PACKAGE_TARNAME='tcl3270' PACKAGE_VERSION='3.x' PACKAGE_STRING='tcl3270 3.x' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS LIBX3270DIR EGREP GREP CPP tclsh CCOPTIONS host_os host_vendor host_cpu host build_os build_vendor build_cpu build OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dbcs enable_local_process enable_ipv6 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tcl3270 3.x to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tcl3270] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tcl3270 3.x:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dbcs leave out DBCS support --disable-local-process leave out local process support --disable-ipv6 leave out IPv6 support Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tcl3270 configure 3.x generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tcl3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case "$host_os" in solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" ;; linux*) CPPFLAGS="-D_BSD_SOURCE -D_DEFAULT_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare -std=c99 -pedantic -Wno-variadic-macros -Wno-long-long -MMD -MP" fi # Extract the first word of "tclsh", so it can be a program name with args. set dummy tclsh; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_tclsh+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$tclsh"; then ac_cv_prog_tclsh="$tclsh" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_tclsh="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_tclsh" && ac_cv_prog_tclsh="no" fi fi tclsh=$ac_cv_prog_tclsh if test -n "$tclsh"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tclsh" >&5 $as_echo "$tclsh" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$tclsh" = no then as_fn_error $? "Can't find tclsh" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking Tcl version" >&5 $as_echo_n "checking Tcl version... " >&6; } tclver=`echo "puts [set tcl_version]" | tclsh` if test -z "$tclver" then as_fn_error $? "Can't figure out Tcl version" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tclver" >&5 $as_echo "$tclver" >&6; } pthread=`echo $tclver | awk -F . '{ if ($1 > 8 || ($1 == 8 && $2 >= 6)) print "1"}'` tclvr=`echo $tclver | tr -d .` ac_config_headers="$ac_config_headers conf.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SELECT_H 1 _ACEOF fi done for ac_header in pty.h do : ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTY_H 1 _ACEOF fi done for ac_header in libutil.h do : ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBUTIL_H 1 _ACEOF fi done for ac_header in util.h do : ac_fn_c_check_header_mongrel "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTIL_H 1 _ACEOF fi done if test "$pthread" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_create" >&5 $as_echo_n "checking for library containing pthread_create... " >&6; } if ${ac_cv_search_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF for ac_lib in '' pthread; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_pthread_create=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_pthread_create+:} false; then : break fi done if ${ac_cv_search_pthread_create+:} false; then : else ac_cv_search_pthread_create=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pthread_create" >&5 $as_echo "$ac_cv_search_pthread_create" >&6; } ac_res=$ac_cv_search_pthread_create if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi orig_CPPFLAGS="$CPPFLAGS" for dir in "" -I/usr/include/tcl$tclver /usr/include/tcl$tclvr -I/usr/local/include -I/usr/local/include/tcl$tclver -I/usr/local/include/tcl$tclvr do header_fail=0 if test -n "$dir" then { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with $dir" >&5 $as_echo "$as_me: retrying with $dir" >&6;} fi CPPFLAGS="$orig_CPPFLAGS $dir" for ac_header in tcl.h do : ac_fn_c_check_header_mongrel "$LINENO" "tcl.h" "ac_cv_header_tcl_h" "$ac_includes_default" if test "x$ac_cv_header_tcl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TCL_H 1 _ACEOF else header_fail=1 fi done if test "$header_fail" -eq 0 then break fi unset `echo ac_cv_header_tcl.h | $as_tr_sh` CPPFLAGS="$orig_CPPFLAGS" done if test $header_fail -eq 1 then as_fn_error $? "Can't find tcl header file" "$LINENO" 5 fi for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi LDFLAGS="$LDFLAGS -lm" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing forkpty" >&5 $as_echo_n "checking for library containing forkpty... " >&6; } if ${ac_cv_search_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char forkpty (); int main () { return forkpty (); ; return 0; } _ACEOF for ac_lib in '' util; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_forkpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_forkpty+:} false; then : break fi done if ${ac_cv_search_forkpty+:} false; then : else ac_cv_search_forkpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_forkpty" >&5 $as_echo "$ac_cv_search_forkpty" >&6; } ac_res=$ac_cv_search_forkpty if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" if test "x$ac_cv_func_forkpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ORIG_LDFLAGS="$LDFLAGS" for dir in "" -L/usr/local/lib do LDFLAGS="$ORIG_LDFLAGS $dir" tcl_failed=0 if test -n "$dir" then { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with $dir" >&5 $as_echo "$as_me: retrying with $dir" >&6;} fi as_ac_Lib=`$as_echo "ac_cv_lib_tcl$tclver''_Tcl_Init" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl_Init in -ltcl$tclver" >&5 $as_echo_n "checking for Tcl_Init in -ltcl$tclver... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltcl$tclver $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char Tcl_Init (); int main () { return Tcl_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_LIBtcl$tclver" | $as_tr_cpp` 1 _ACEOF LIBS="-ltcl$tclver $LIBS" else tcl_failed=1 fi if test "$tcl_failed" -eq 0 then break fi unset `echo ac_cv_lib_tcl${tclver}___Tcl_Init | $as_tr_sh` tcl_failed=0 as_ac_Lib=`$as_echo "ac_cv_lib_tcl$tclvr''_Tcl_Init" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl_Init in -ltcl$tclvr" >&5 $as_echo_n "checking for Tcl_Init in -ltcl$tclvr... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltcl$tclvr $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char Tcl_Init (); int main () { return Tcl_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_LIBtcl$tclvr" | $as_tr_cpp` 1 _ACEOF LIBS="-ltcl$tclvr $LIBS" else tcl_failed=1 fi if test "$tcl_failed" = 0 then break fi unset `echo ac_cv_lib_tcl${tclvr}___Tcl_Init | $as_tr_sh` LDFLAGS="$ORIG_LDFLAGS" done if test "$tcl_failed" = 1 then as_fn_error $? "Can't find TCL library" "$LINENO" 5 fi LIBX3270DIR='${sysconfdir}/x3270' # Check whether --enable-dbcs was given. if test "${enable_dbcs+set}" = set; then : enableval=$enable_dbcs; fi case "$enable_dbcs" in no) ;; *) $as_echo "#define X3270_DBCS 1" >>confdefs.h ;; esac # Check whether --enable-local_process was given. if test "${enable_local_process+set}" = set; then : enableval=$enable_local_process; fi case "$enable_local_process" in ""|yes) $as_echo "#define X3270_LOCAL_PROCESS 1" >>confdefs.h ;; esac # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi case "$enable_ipv6" in ""|yes) $as_echo "#define X3270_IPV6 1" >>confdefs.h ;; esac ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tcl3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tcl3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ac_config_files="$ac_config_files Makefile.obj" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tcl3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tcl3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile.obj") CONFIG_FILES="$CONFIG_FILES Makefile.obj" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/tcl3270/configure.in0000664000076500007650000001217413221577163014610 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2013-2017 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. dnl Process this file with autoconf to produce a configure script. AC_INIT(tcl3270,3.x) AC_PREREQ(2.50) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_CC dnl Figure out what sort of host this is. AC_CANONICAL_HOST case "$host_os" in solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations" ;; linux*) CPPFLAGS="-D_BSD_SOURCE -D_DEFAULT_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare -std=c99 -pedantic -Wno-variadic-macros -Wno-long-long -MMD -MP" fi AC_SUBST(host) AC_SUBST(CCOPTIONS) dnl Figure out what version of Tcl they've got AC_CHECK_PROG(tclsh,tclsh,yes,no) if test "$tclsh" = no then AC_ERROR(Can't find tclsh) fi AC_MSG_CHECKING(Tcl version) tclver=`echo "puts [[set tcl_version]]" | tclsh` if test -z "$tclver" then AC_ERROR(Can't figure out Tcl version) fi AC_MSG_RESULT($tclver) dnl If Tcl > 8.6, we need pthreads. pthread=`echo $tclver | awk -F . '{ if ($1 > 8 || ($1 == 8 && $2 >= 6)) print "1"}'` dnl Set up tclvr (tclver without the period, for BSD) tclvr=`echo $tclver | tr -d .` dnl Checks for header files. AC_CONFIG_HEADER(conf.h) AC_CHECK_HEADERS(sys/select.h) AC_CHECK_HEADERS(pty.h) AC_CHECK_HEADERS(libutil.h) AC_CHECK_HEADERS(util.h) dnl Check for pthreads. if test "$pthread" then AC_SEARCH_LIBS(pthread_create, pthread) fi dnl Check for TCL header files. orig_CPPFLAGS="$CPPFLAGS" for dir in "" -I/usr/include/tcl$tclver /usr/include/tcl$tclvr -I/usr/local/include -I/usr/local/include/tcl$tclver -I/usr/local/include/tcl$tclvr do header_fail=0 if test -n "$dir" then AC_MSG_NOTICE(retrying with $dir) fi CPPFLAGS="$orig_CPPFLAGS $dir" AC_CHECK_HEADERS(tcl.h, ,[header_fail=1]) if test "$header_fail" -eq 0 then break fi unset `echo ac_cv_header_tcl.h | $as_tr_sh` CPPFLAGS="$orig_CPPFLAGS" done if test $header_fail -eq 1 then AC_ERROR(Can't find tcl header file) fi dnl Checks for orindary library functions. AC_CHECK_FUNCS(vasprintf) AC_FUNC_FSEEKO dnl Check for libraries. dnl Note that the order here is important. The last libraries should appear dnl first, so that objects in them can be used by subsequent libraries. LDFLAGS="$LDFLAGS -lm" AC_SEARCH_LIBS(forkpty, util) AC_CHECK_FUNCS(forkpty) AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket) ORIG_LDFLAGS="$LDFLAGS" for dir in "" -L/usr/local/lib do LDFLAGS="$ORIG_LDFLAGS $dir" tcl_failed=0 if test -n "$dir" then AC_MSG_NOTICE(retrying with $dir) fi AC_CHECK_LIB(tcl$tclver, Tcl_Init, , [tcl_failed=1]) if test "$tcl_failed" -eq 0 then break fi unset `echo ac_cv_lib_tcl${tclver}___Tcl_Init | $as_tr_sh` tcl_failed=0 AC_CHECK_LIB(tcl$tclvr, Tcl_Init, , [tcl_failed=1]) if test "$tcl_failed" = 0 then break fi unset `echo ac_cv_lib_tcl${tclvr}___Tcl_Init | $as_tr_sh` LDFLAGS="$ORIG_LDFLAGS" done if test "$tcl_failed" = 1 then AC_ERROR(Can't find TCL library) fi dnl Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' AC_SUBST(LIBX3270DIR) dnl Check for unwanted parts. AC_ARG_ENABLE(dbcs,[ --disable-dbcs leave out DBCS support]) case "$enable_dbcs" in no) ;; *) AC_DEFINE(X3270_DBCS,1) ;; esac AC_ARG_ENABLE(local_process,[ --disable-local-process leave out local process support]) case "$enable_local_process" in ""|yes) AC_DEFINE(X3270_LOCAL_PROCESS,1) ;; esac AC_ARG_ENABLE(ipv6,[ --disable-ipv6 leave out IPv6 support]) case "$enable_ipv6" in ""|yes) AC_DEFINE(X3270_IPV6,1) ;; esac dnl Generate the Makefile. AC_OUTPUT(Makefile) AC_OUTPUT(Makefile.obj) suite3270-3.6/tcl3270/documentation-ssl-body.html0000664000076500007650000002056613221577163017574 0ustar pdmpdm

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/tcl3270/Examples/cms_cmd.tcl32700000775000076500007650000001074513221577163016507 0ustar pdmpdm#!tcl3270 # Copyright (c) 2000-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Pluck the username, password and command from the command line. if {$argc != 4} { puts stderr "Usage: $argv0 -- hostname username password command" exit 1 } set hostname [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] set command [lindex $argv 3] # Procedure to wait for a READ prompt from CMS or CP. proc waitread {} { Snap Save while {[Snap Ascii [expr [Snap Rows]-1] [expr [Snap Cols]-17] 4] != "READ"} { Snap Wait Output } } # Procedure to check for the CMS "Ready" prompt. # Returns its row number, or -1 for "MORE..." state, and leaves a screen with # data to read in the Snap buffer. proc cmd_done {} { global verbose Snap Save while {1} { if {[Snap Ascii [expr [Snap Rows]-1] [expr [Snap Cols]-20] 7] == "MORE..."} { if {$verbose} {puts "MORE..."} return -1 } set i [expr [Snap Rows]-2] while {$i >= 0} { set text [Snap Ascii $i 0 [Snap Cols]] switch -regexp $text { "Ready; T=.*" {return $i} "Ready\(.*\); T=.*" { error [Snap Ascii [expr $i-1] 0 \ [Snap Cols]] } "^ *\$" {} default { if {$verbose} {puts "Incomplete $i '[string trimright $text]'"} set i 0 } } incr i -1 } Snap Wait Output } } # Execute a command, return the output. proc cms_cmd {text} { global verbose # Clear the screen. Clear # Send the command. String "$text\n" # 'first' is the row where the first line of output will appear. For # the first screenful it's 1; after that it's 0. set first 1 # r is the result. set r {} while {1} { # Wait for a screenful. set d [cmd_done] # Dump out what's there. set i $first set first 0 if {$d < 0} {set last [expr [Snap Rows]-2]} {set last $d} while {$i < $last} { set r [linsert $r end [string trimright \ [Snap Ascii $i 0 [Snap Cols]]]] incr i } if {$d >= 0} {break} # Clear the screen and go around again. Clear } return $r } # Start of main procedure. # Set 'verbose' to 1 to get debug output from the glue functions. set verbose 0 # Connect to the host and wait for an input field. Connect $hostname Wait InputField # Log in and wait for CP READ or VM READ mode. String "$username\t$password\n" waitread # If we can't log on, we're hosed. if {[Ascii 1 11 7] == "Already"} { puts stderr "Can't run -- already logged in." exit 1 } # If we're in CP mode, which means we disconnected last time, boot CMS. if {[Ascii [expr [Rows]-1] [expr [Cols]-20] 2] == "CP"} { Clear String "i cms\n" waitread } # Enter an empty command to get a CMS prompt. If we don't do this, there will # be a Ready prompt as the first line of output below. Clear Enter cmd_done # Get the output of the user's command and display it. if {[catch {cms_cmd $command} result]} { puts stderr $result set rc 1 } { for {set i 0} {$i < [llength $result]} {incr i} { puts [lindex $result $i] } set rc 0 } # Log off, and wait for the host to hang up on us, so we don't unintentionally # create a disconnected session. Clear if {! [catch {String "logoff\n"}]} {Wait Disconnect} exit $rc suite3270-3.6/tcl3270/ft.inc0000664000076500007650000001355013221577163013402 0ustar pdmpdmXX_SH(File Transfer) The XX_FB(Transfer) XX_action implements XX_FB(IND$FILE) file transfer. This XX_action requires that the XX_FB(IND$FILE) program be installed on the XX_SM(IBM) host, and that the 3270 cursor be located in a field that will accept a XX_SM(TSO) or XX_SM(VM/CMS) command. XX_LP ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`The XX_FB(Transfer) XX_action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. ')dnl XX_LP Because of the complexity and number of options for file transfer, the parameters to the XX_FB(Transfer) XX_action take the unique form of XX_FI(option)=XX_FI(value), and can appear in any order. Note that if the XX_FI(value) contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: XX_LP XX_TS(4,l c l l.) XX_TR(XX_TD(Option) XX_TD(Required?) XX_TD(Default) XX_TD(Other Values)) XX_T_() XX_TR(XX_TD(Direction) XX_TD(No) XX_TD(receive) XX_TD(send)) XX_TR(XX_TD(HostFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(LocalFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Host) XX_TD(No) XX_TD(tso) `XX_TD(`vm, cics')') XX_TR(XX_TD(Mode) XX_TD(No) XX_TD(ascii) XX_TD(binary)) XX_TR(XX_TD(Cr) XX_TD(No) XX_TD(remove) `XX_TD(`add, keep')') XX_TR(XX_TD(Remap) XX_TD(No) XX_TD(yes) XX_TD(no)) XX_TR(XX_TD(Exist) XX_TD(No) XX_TD(keep) `XX_TD(`replace, append')') XX_TR(XX_TD(Recfm) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`fixed, variable, undefined')') XX_TR(XX_TD(Lrecl) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Blksize) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Allocation) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`tracks, cylinders, avblock')') XX_TR(XX_TD(PrimarySpace) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(SecondarySpace) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Avblock) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(BufferSize) XX_TD(No) XX_TD(4096) XX_TD(XX_NBSP)) XX_TE() XX_LP The option details are as follows. XX_TPS()dnl XX_TP(XX_FB(Direction)) XX_FB(send) to send a file to the host, XX_FB(receive) to receive a file from the host. XX_TP(XX_FB(HostFile)) The name of the file on the host. XX_TP(XX_FB(LocalFile)) The name of the file on the local workstation. XX_TP(XX_FB(Host)) The type of host (which dictates the form of the XX_FB(IND$FILE) command): XX_FB(tso) (the default), XX_FB(vm) or XX_FB(cics). XX_TP(XX_FB(Mode)) Use XX_FB(ascii) (the default) for a text file, which will be translated between XX_SM(EBCDIC) and XX_SM(ASCII) as necessary. Use XX_FB(binary) for non-text files. XX_TP(XX_FB(Cr)) Controls how XX_FB(Newline) characters are handled when transferring XX_FB(Mode=ascii) files. XX_FB(remove) (the default) strips XX_FB(Newline) characters in local files before transferring them to the host. XX_FB(add) adds XX_FB(Newline) characters to each host file record before transferring it to the local workstation. XX_FB(keep) preserves XX_FB(Newline) characters when transferring a local file to the host. XX_TP(XX_FB(Remap)) Controls text translation for XX_FB(Mode=ascii) files. The value XX_FB(yes) (the default) causes XX_PRODUCT to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's XX_SM(EBCDIC) code page. The value XX_FB(no) causes XX_PRODUCT to pass the text to or from the host as-is, leaving all translation to the XX_FB(IND$FILE) program on the host. XX_TP(XX_FB(Exist)) Controls what happens when the destination file already exists. XX_FB(keep) (the default) preserves the file, causing the XX_FB(Transfer) XX_action to fail. XX_FB(replace) overwrites the destination file with the source file. XX_FB(append) appends the source file to the destination file. XX_TP(XX_FB(Recfm)) Controls the record format of files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_FB(fixed) creates a file with fixed-length records. XX_FB(variable) creates a file with variable-length records. XX_FB(undefined) creates a file with undefined-length records (XX_SM(TSO) hosts only). The XX_FB(Lrecl) option controls the record length or maximum record length for XX_FB(Recfm=fixed) and XX_FB(Recfm=variable) files, respectively. XX_TP(XX_FB(Lrecl)) Specifies the record length (or maximum record length) for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Blksize)) Specifies the block size for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Allocation)) Specifies the units for the XX_FB(PrimarySpace) and XX_FB(SecondarySpace) options: XX_FB(tracks), XX_FB(cylinders) or XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(PrimarySpace)) Primary allocation for a file. The units are given by the XX_FB(Allocation) option. Required when the XX_FB(Allocation) is specified as something other than XX_FB(default). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(SecondarySpace)) Secondary allocation for a file. The units are given by the XX_FB(Allocation) option. (XX_SM(TSO) hosts only.) XX_TP(XX_FB(Avblock)) Average block size, required when XX_FB(Allocation) specifies XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(BufferSize)) Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(WindowsCodePage)) Overrides the workstation code page used for XX_SM(ASCII) file transfers. By default, the system XX_SM(ANSI) code page is used. ')dnl XX_TPE()dnl XX_LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the XX_FB(Transfer) keywords, but with XX_FB(ft) prepended. E.g., the default for the XX_FB(Mode) keyword is the XX_FB(XX_PRODUCT.ftMode) resource. suite3270-3.6/tcl3270/hostname.inc0000664000076500007650000000600213221577163014601 0ustar pdmpdmThe full syntax for XX_FI(host) is: XX_RS([XX_FI(prefix):]...[XX_FI(LUname)@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)]) ifelse(XX_PRODUCT,wc3270,,`XX_LP Prepending a XX_FB(P:) onto XX_FI(hostname) causes the connection to go through the XX_FI(telnet-passthru) service rather than directly to the host. See XX_LINK(#Passthru,XX_SM(PASSTHRU)) below. ')dnl XX_LP Prepending an XX_FB(S:) onto XX_FI(hostname) removes the "extended data stream" option reported to the host. See XX_LINK(#tn,XX_FB(XX_DASHED(tn))) below for further information. XX_LP Prepending an XX_FB(N:) onto XX_FI(hostname) turns off TN3270E support for the session. XX_LP Prepending an XX_FB(L:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if XX_FB(XX_PRODUCT) was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the XX_FB(L:) prefix should not be used. XX_LP Prepending a XX_FB(Y:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. XX_LP Prepending an XX_FB(A:) onto XX_FI(hostname) is equivalent to setting the XX_FB(XX_DASHED(nvt)) option; it forces an NVT-mode session instead of a 3270-mode session. XX_LP A specific Logical Unit (LU) name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) XX_LP The XX_FI(hostname) may optionally be placed inside square-bracket characters XX_DQUOTED(XX_FB([)) and XX_DQUOTED(XX_FB(])). This will prevent any colon XX_DQUOTED(XX_FB(:)) characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. ifelse(XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_LP On systems that support the XX_FI(forkpty) library call, the XX_FI(hostname) may be replaced with XX_FB(XX_DASHED(e)) and a command string. This will cause XX_FB(XX_PRODUCT) to connect to a local child process, such as a shell. ')dnl XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden with the XX_FB(XX_DASHED(port)) option, or by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). (For compatability with previous versions of XX_FB(XX_PRODUCT) and with XX_FI(tn3270)(1), the XX_FI(port) may also be specified as a second, separate argument.) XX_LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (XX_DQUOTED(XX_FB(=))). The accept name can also be specified with the XX_FB(XX_DASHED(accepthostname)) option. suite3270-3.6/tcl3270/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021575 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/tcl3270/html/FAQ.html0000664000076500007650000000444713221577163014544 0ustar pdmpdm tcl3270 Frequently Asked Questions

    tcl3270 Frequently Asked Questions

    If you have a problem building, installing, or running tcl3270, please browse through this file first.

    Build/Run Questions

    Unresolved Symbols

    The tcl library is often installed as a shared library, so in order to run tcl3270, you need to have the library directory in your LD_LIBRARY_PATH envronment variable.

    General Questions

    Am I allowed to use it?

    Yes. Full copyright information is in the Lineage file, but the gist is that anyone is free to use the code, and anyone is free to sell copies of the code.

    You are also free to modify it and to redistribute it, provided you preserve the existing copyright notices.

    Getting Help

    If you are still having a problem with tcl3270, feel free to send e-mail to Paul Mattes, Paul.Mattes@usa.net No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. It will also get you on an x3270 mailing list, which also includes information on tcl3270, and where you can find out about new releases and bug fixes.

    When you send a question about tcl3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of tcl3270 you are using, including all patches, e.g., "3.2.9".
    2. What kind of machine you are running on, e.g., "Sun SPARC-10".
    3. What operating system you are running, and what version, e.g., "SunOS 4.1.3_U1" or "Irix 5.2". The "uname -a" command will usually provide this information.
    Complaints, suggestions, requests for enhancements, and porting experiences are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) under the x3270 license. suite3270-3.6/tcl3270/html/Intro.html0000664000076500007650000000221613221577163015220 0ustar pdmpdm tcl3270 Introduction

    tcl3270 Introduction

    tcl3270 is a scripted IBM 3270 terminal emulator. It can be used to communicate with any IBM host that supports 3270-style connections over TELNET. It can also communicate with hosts that use line-by-line ASCII mode to do initial login negotiation before switching to full-screen 3270 mode.

    tcl3270 emulates one of four models of an IBM 3278 or 3279 terminal. The difference between the various models is the screen size. The emulation is not quite complete; tcl3270 understands extended field orders but does not implement some of the extended attributes (outlining, extended validation, etc.). It does not support 3179G bit-mapped graphics (GDDM).

    tcl3270 supports the APL character set and several international character sets. Many APL and international symbols may be entered by their X11 symbol names. suite3270-3.6/tcl3270/html/Lineage.html0000664000076500007650000000446213221577163015476 0ustar pdmpdm tcl3270 Lineage

    tcl3270 Lineage

    Here is the official copyright notice for tcl3270 3.3. It is a standard 3-element BSD license.

    Copyright © 1993-2015, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    suite3270-3.6/tcl3270/html.m40000664000076500007650000000642213221577163013504 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/tcl3270/html/README.html0000664000076500007650000000373613221577163015072 0ustar pdmpdm tcl3270 3.3 General Release

    tcl3270 3.3 General Release

    tcl3270 is a scripted IBM 3278/3279 terminal emulator.

    Documentation is in the html directory. The files are:

    Intro
    What tcl3270 is
    Lineage
    Where tcl3270 came from (copyright stuff)
    Build
    How to build and install tcl3270
    FAQ
    Frequently Asked Questions (what to do when something goes wrong)
    ReleaseNotes
    What's new in this release
    Resources
    A complete list of tcl3270 resources (configuration items)
    SSL
    How to use tcl3270 with the Secure Sockets Layer (SSL)
    There is also a hypertext version of the tcl3270 man page. Please read Build before going ahead and building the program. Also, if you have a problem, scan through FAQ; there are lots of interesting answers there.

    Updates to tcl3270, as well as the current status of development and bugs, are available from the x3270 Web Page.

    Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit.

    There is also an x3270 mailing list, which also includes information about tcl3270, and which receives news about new releases. You can subscribe to this list here. suite3270-3.6/tcl3270/html/ReleaseNotes.html0000664000076500007650000032733513221600612016514 0ustar pdmpdm tcl3270 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/tcl3270/html/Resources.html0000664000076500007650000014233213221600612016065 0ustar pdmpdm tcl3270 Resources

    tcl3270 Resources

    Resources are used to configure tcl3270. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into tcl3270.
    • If a session file foo.tcl3270 is specified on the command line, its contents are applied. These definitions override resource values defined by compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example tcl3270.bsdTm can be set by the following command-line option:
         -xrm "tcl3270.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file (session file) has the following syntax.
    • Each definition consists of:
          tcl3270.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.

    Alphabetical Resource List

    Name: tcl3270.acceptHostname
    Type: String
    Command Line: -accepthostname
    Description:

    Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.)

    Name: tcl3270.aidWait
    Type: Boolean
    Default: false
    Command Line: -set aidWait , -clear aidWait
    Description:

    When true, tcl3270 will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll tcl3270's status until it shows that the keyboard is no longer unlocked.

    Name: tcl3270.bindLimit
    Type: Boolean
    Default: true
    Description:

    When true, tcl3270 will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not.

    Name: tcl3270.bindUnlock
    Type: Boolean
    Default: false
    Description:

    When true, tcl3270 will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing tcl3270 to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op.

    Name: tcl3270.blankFill
    Type: Boolean
    Default: false
    Command Line: -set blankFill , -clear blankFill
    Description:

    When true, in 3270 mode tcl3270 will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals.

    Name: tcl3270.bsdTm
    Type: Boolean
    Default: false
    Description:

    Defines tcl3270's response to the TELNET DO TIMING MARK option. When set to false, tcl3270 will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, tcl3270 will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of tcl3270. In either case, tcl3270 will never respond to a DONT TIMING MARK option.

    Name: tcl3270.caDir
    Type: String
    Command Line: -cadir
    Description:

    Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: tcl3270.caFile
    Type: String
    Command Line: -cafile
    Description:

    Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: tcl3270.certFile
    Type: String
    Command Line: -certfile
    Description:

    Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by tcl3270.certFileType. The private key for the certificate is specified by tcl3270.keyFile. If tcl3270.chainFile is specified, it overrides tcl3270.certFile.

    On the Mac, the file must be in PKCS12 format.

    Name: tcl3270.certFileType
    Type: String
    Default: pem
    Command Line: -certfiletype
    Description:

    Gives the type of the certificate file specified by tcl3270.certFile. The value can be pem or asn1. (OpenSSL only)

    Name: tcl3270.chainFile
    Type: String
    Command Line: -chainfile
    Description:

    Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by tcl3270.keyFile. If tcl3270.chainFile is specified, it overrides tcl3270.certFile. (OpenSSL only)

    Name: tcl3270.charset
    Type: String
    Default: bracket
    Command Line: -charset
    Description:

    This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by tcl3270, use the -v command-line option.

    Name: tcl3270.clientCert
    Type: String
    Command Line: -clientcert
    Description:

    Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only)

    Name: tcl3270.color8
    Type: Boolean
    Default: false
    Description:

    If true, tcl3270 will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported.

    Name: tcl3270.commandTimeout
    Type: Integer
    Description:

    Defines the number of seconds to wait for a command to complete before failing it with a timeout error.

    Name: tcl3270.confDir
    Type: String
    Default: /usr/local/etc/x3270
    Description:

    Defines the tcl3270 configuration directory, where tcl3270 will search for the ibm_hosts file by default. (See tcl3270.hostsFile.)

    Name: tcl3270.connectTimeout
    Type: Integer
    Command Line: -connecttimeout
    Description:

    Specifies a timeout, in seconds, that tcl3270 will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that tcl3270 will wait for the lesser of the two times (the specified timeout and the system-defined timeout).

    Name: tcl3270.dbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use tcl3270.sbcsCgcsgid for the single-byte (SBCS) character set.

    Name: tcl3270.dftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Deprecated resource -- replaced by tcl3270.ftBufferSize

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: tcl3270.devName
    Type: String
    Command Line: -devname
    Description:

    Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: tcl3270.dsTrace
    Type: Boolean
    Default: false
    Command Line: -trace , -set dsTrace , -clear dsTrace
    Description:

    Deprecated resource -- replaced by tcl3270.trace

    When true, tcl3270 writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. The directory where the file is written is defined by tcl3270.traceDir. If tcl3270.traceFile is defined, it gives the entire pathname and tcl3270.traceDir is ignored.

    Name: tcl3270.eof
    Type: String
    Default: ^D
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when tcl3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    Name: tcl3270.erase
    Type: String
    Default: ^?
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (tcl3270 gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause tcl3270 to discard the last character on the input line.

    When connected in character-at-a-time mode (tcl3270 sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action.

    Name: tcl3270.eventTrace
    Type: Boolean
    Default: false
    Command Line: -set eventTrace , -clear eventTrace
    Description:

    Deprecated resource -- replaced by tcl3270.trace

    When true, tcl3270 traces information about keyboard and mouse events into a file. The default file name is x3trc.pid. The directory where the file is written is defined by tcl3270.traceDir. If tcl3270.traceFile is defined, it gives the entire pathname and tcl3270.traceDir is ignored.

    Name: tcl3270.extended
    Type: Boolean
    Default: false
    Command Line: -extended
    Description:

    Deprecated resource -- replaced by tcl3270.model syntax

    Indicates support for the 3270 Extended Data Stream.

    Name: tcl3270.ftAllocation
    Type: String
    Default: default
    Description:

    Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock.

    Name: tcl3270.ftAvblock
    Type: Integer
    Description:

    Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers.

    Name: tcl3270.ftBlksize
    Type: Integer
    Description:

    Defines the default block size for files sent to TSO hosts by IND$FILE file transfers.

    Name: tcl3270.ftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: tcl3270.ftCr
    Type: String
    Default: auto
    Description:

    Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done.

    Name: tcl3270.ftDirection
    Type: String
    Default: receive
    Description:

    Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation).

    Name: tcl3270.ftExist
    Type: String
    Default: keep
    Description:

    Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be aborted, replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file.

    Name: tcl3270.ftHost
    Type: String
    Default: tso
    Description:

    Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics.

    Name: tcl3270.ftHostFile
    Type: String
    Description:

    Defines the default host file name for IND$FILE file transfers.

    Name: tcl3270.ftLocalFile
    Type: String
    Description:

    Defines the default local file name for IND$FILE file transfers.

    Name: tcl3270.ftLrecl
    Type: Integer
    Description:

    Defines the default logical record length for files sent to the host via IND$FILE.

    Name: tcl3270.ftMode
    Type: String
    Default: ascii
    Description:

    Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation).

    Name: tcl3270.ftPrimarySpace
    Type: Integer
    Description:

    Defines the default primary space allocation for files sent to TSO hosts via IND$FILE.

    Name: tcl3270.ftRecfm
    Type: String
    Default: default
    Description:

    Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format.

    Name: tcl3270.ftRemap
    Type: String
    Default: yes
    Description:

    Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by tcl3270 to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37.

    Name: tcl3270.ftSecondarySpace
    Type: Integer
    Description:

    Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE.

    Name: tcl3270.hostname
    Type: String
    Description:

    Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over tcl3270.hostname.

    The most common use of tcl3270.hostname is in session files, where a file is used to pass all of the options to establish a tcl3270 session.

    Name: tcl3270.hostsFile
    Type: String
    Default: /usr/local/etc/x3270/ibm_hosts
    Description:

    The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by tcl3270.confDir.

    Name: tcl3270.icrnl
    Type: Boolean
    Default: true
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines.

    Name: tcl3270.inlcr
    Type: Boolean
    Default: false
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns.

    Name: tcl3270.intr
    Type: String
    Default: ^C
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host.

    Name: tcl3270.keyFile
    Type: String
    Command Line: -keyfile
    Description:

    Gives the name of a file containg the private key for the certificate specified by tcl3270.certFile or tcl3270.chainFile. The default file type is PEM; it can be overridden by tcl3270.keyFileType. If the private key is encrypted, the password is specified by tcl3270.keyPasswd. (OpenSSL only)

    Name: tcl3270.keyFileType
    Type: String
    Default: pem
    Command Line: -keyfileType
    Description:

    Gives the type of the private key file specified by tcl3270.keyFile. The value can be pem or asn1. (OpenSSL only)

    Name: tcl3270.keyPasswd
    Type: String
    Command Line: -keypasswd
    Description:

    On OpenSSL, gives the password for the private key file specified by tcl3270.keyFile, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the tcl3270.certfile certifiate file.

    Name: tcl3270.kill
    Type: String
    Default: ^U
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when tcl3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when tcl3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action.

    Name: tcl3270.lineWrap
    Type: Boolean
    Default: true
    Command Line: -set lineWrap , -clear lineWrap
    Description:

    This setting is used only in NVT mode. When true, tcl3270 will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence.

    Name: tcl3270.loginMacro
    Type: String
    Command Line: -loginmacro
    Description:

    Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a tcl3270.hostsFile is in use and a matching entry is found, the login macro from that entry will be used in preference to the tcl3270.loginMacro.

    Name: tcl3270.lnext
    Type: String
    Default: ^V
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when tcl3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered.

    Name: tcl3270.m3279
    Type: Boolean
    Default: true
    Command Line: -color
    Description:

    Deprecated resource -- replaced by tcl3270.model syntax

    Indicates support for color (a 3279 terminal).

    Name: tcl3270.model
    Type: String
    Default: 3279-4-E
    Command Line: -model
    Description:

    The terminal model that tcl3270 is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display.
      3279 specifies a color 3270 display.
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is 4.
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.

    Name: tcl3270.monoCase
    Type: Boolean
    Default: false
    Command Line: -set monoCase , -clear monoCase
    Description:

    When true, causes tcl3270 to run in uppercase-only mode.

    Name: tcl3270.newEnviron
    Type: Boolean
    Default: true
    Description:

    If true, tcl3270 will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not.

    Name: tcl3270.nopSeconds
    Type: Integer
    Description:

    If nonzero, tcl3270 will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity.

    Name: tcl3270.numericLock
    Type: Boolean
    Default: false
    Description:

    When true, causes tcl3270 to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute.

    Name: tcl3270.nvtMode
    Type: Boolean
    Default: false
    Command Line: -nvt
    Description:

    When true, causes tcl3270 to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname.

    Name: tcl3270.onlcr
    Type: Boolean
    Default: true
    Description:

    Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences.

    Name: tcl3270.oerrLock
    Type: Boolean
    Default: true
    Description:

    If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message.

    Name: tcl3270.once
    Type: Boolean
    Default: false
    Command Line: -once
    Description:

    When true, tcl3270 will exit as soon as a host disconnects. The default is false if no hostname is specified on the command line, true otherwise.

    Name: tcl3270.oversize
    Type: String
    Command Line: -oversize
    Description:

    Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. It is used only if the tcl3270.model includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with tcl3270 in this mode.

    Name: tcl3270.port
    Type: String
    Default: telnet
    Command Line: -port
    Description:

    The name of the default TCP port for tcl3270 to connect to. This can be either a symbolic name from /etc/services, or an integer.

    Name: tcl3270.proxy
    Type: String
    Command Line: -proxy
    Description:

    Defines a proxy server that tcl3270 will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the tcl3270 manual page.

    Name: tcl3270.qrBgColor
    Type: Boolean
    Default: false
    Description:

    When true, tcl3270 will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash.

    Name: tcl3270.quit
    Type: String
    Default: ^\
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when tcl3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host.

    Name: tcl3270.rprnt
    Type: String
    Default: ^R
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when tcl3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed.

    Name: tcl3270.sbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use tcl3270.dbcsCgcsgid for the double-byte (DBCS) character set.

    Name: tcl3270.screenTrace
    Type: Boolean
    Default: false
    Command Line: -set screenTrace , -clear screenTrace
    Description:

    When true, tcl3270 will save an ASCII version of the screen image in a file every time it changes. The file name defaults to x3scr.pid. The directory where the file is written is defined by tcl3270.traceDir. If tcl3270.screenTraceFile is defined, it defines the file name and tcl3270.traceDir is ignored.

    Name: tcl3270.screenTraceFile
    Type: String
    Description:

    If defined, gives the name of the file that screen traces will be written into.

    Name: tcl3270.scriptPort
    Type: Integer
    Command Line: -scriptport
    Description:

    If defined, tcl3270 will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: tcl3270.scriptPortOnce
    Type: Boolean
    Default: false
    Command Line: -scriptportonce
    Description:

    If defined, tcl3270 will accept only one script connection. When that connection is broken, it will exit.

    Name: tcl3270.socket
    Type: Boolean
    Default: false
    Command Line: -socket
    Description:

    When true, tcl3270 will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket.

    Name: tcl3270.startTls
    Type: Boolean
    Default: true
    Description:

    If true, tcl3270 will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them.

    Name: tcl3270.suppressActions
    Type: String
    Description:

    A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options.

    Name: tcl3270.termName
    Type: String
    Command Line: -tn
    Description:

    An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of tcl3270.model.

    Name: tcl3270.trace
    Type: Boolean
    Default: false
    Command Line: -trace , -set trace , -clear trace
    Description:

    When true, tcl3270 writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. The directory where the file is written is defined by tcl3270.traceDir. If tcl3270.traceFile is defined, it gives the entire pathname and tcl3270.traceDir is ignored.

    Name: tcl3270.traceDir
    Type: String
    Default: /tmp
    Description:

    Defines the directory that trace files are written into.

    Name: tcl3270.traceFile
    Type: String
    Command Line: -tracefile
    Description:

    If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file.

    Name: tcl3270.traceFileSize
    Type: String
    Command Line: -tracefilesize
    Description:

    If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started.

    Name: tcl3270.unlockDelay
    Type: Boolean
    Default: false
    Description:

    When tcl3270 sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, tcl3270 can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for tcl3270.unlockDelayMs milliseconds.

    Name: tcl3270.unlockDelayMs
    Type: Integer
    Default: 350
    Description:

    Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and tcl3270 actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros.

    Name: tcl3270.user
    Type: String
    Command Line: -user
    Description:

    Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: tcl3270.verifyHostCert
    Type: Boolean
    Default: true
    Command Line: -noverifycert , -verifycert
    Description:

    If true (the default), tcl3270 will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, tcl3270 will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking.

    Name: tcl3270.werase
    Type: String
    Default: ^W
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when tcl3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when tcl3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action.

    Index of All Resources

    acceptHostname aidWait bindLimit bindUnlock
    blankFill bsdTm caDir caFile
    certFile certFileType chainFile charset
    clientCert color8 commandTimeout confDir
    connectTimeout dbcsCgcsgid dftBufferSize devName
    dsTrace eof erase eventTrace
    extended ftAllocation ftAvblock ftBlksize
    ftBufferSize ftCr ftDirection ftExist
    ftHost ftHostFile ftLocalFile ftLrecl
    ftMode ftPrimarySpace ftRecfm ftRemap
    ftSecondarySpace hostname hostsFile icrnl
    inlcr intr keyFile keyFileType
    keyPasswd kill lineWrap loginMacro
    lnext m3279 model monoCase
    newEnviron nopSeconds numericLock nvtMode
    onlcr oerrLock once oversize
    port proxy qrBgColor quit
    rprnt sbcsCgcsgid screenTrace screenTraceFile
    scriptPort scriptPortOnce socket startTls
    suppressActions termName trace traceDir
    traceFile traceFileSize unlockDelay unlockDelayMs
    user verifyHostCert werase

    Basic Configuration Resources

    charset connectTimeout hostname model
    port proxy

    NVT-Mode Resources

    eof erase icrnl inlcr
    intr kill lineWrap lnext
    onlcr quit rprnt werase

    Protocol Resources

    bindLimit bindUnlock bsdTm color8
    dbcsCgcsgid dftBufferSize devName ftBufferSize
    sbcsCgcsgid termName user

    Terminal Interaction Resources

    blankFill ftAllocation ftAvblock ftBlksize
    ftCr ftDirection ftExist ftHost
    ftHostFile ftLocalFile ftLrecl ftMode
    ftPrimarySpace ftRecfm ftRemap ftSecondarySpace
    nopSeconds numericLock nvtMode oerrLock

    Security Resources

    acceptHostname caDir caFile certFile
    certFileType chainFile clientCert keyFile
    keyFileType keyPasswd startTls suppressActions
    verifyHostCert

    Tracing Resources

    dsTrace eventTrace screenTrace screenTraceFile
    trace traceDir traceFile traceFileSize

    Other Resources

    aidWait commandTimeout confDir hostsFile
    loginMacro monoCase newEnviron once
    oversize qrBgColor scriptPort scriptPortOnce
    socket unlockDelay unlockDelayMs

    Deprecated Resources

    extended m3279

    tcl3270 version 3.6ga4 Fri Dec 29 21:01:30 CST 2017 suite3270-3.6/tcl3270/html/SSL.html0000664000076500007650000002104113221600612014545 0ustar pdmpdm tcl3270 and TLS

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/tcl3270/html/tcl3270-man.html0000664000076500007650000013342613221600611015765 0ustar pdmpdm tcl3270 Manual Page

    tcl3270 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Character Sets
    NVT Mode
    Toggles
    Commands
    File Transfer
    The PrintText Action
    Nested Scripts
    Passthru
    Proxy
    Resources
    See Also
    Copyrights
    Version

    Name

    tcl3270 - IBM host access tool

    Synopsis

    tcl3270 [script] [options] [host] [-- script-arg...]
    tcl3270 [options] [script] session-file.tcl3270 [-- script-arg...]

    Description

    tcl3270 opens a telnet connection to an IBM host, then allows a tcl script to control the host login session. It is derived from x3270(1), an X-windows IBM 3270 emulator. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The full syntax for host is:
    [prefix:]...[LUname@]hostname[:port][=accept]

    Prepending a P: onto hostname causes the connection to go through the telnet-passthru service rather than directly to the host. See PASSTHRU below.

    Prepending an S: onto hostname removes the "extended data stream" option reported to the host. See -tn below for further information.

    Prepending an N: onto hostname turns off TN3270E support for the session.

    Prepending an L: onto hostname causes tcl3270 to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if tcl3270 was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the L: prefix should not be used.

    Prepending a Y: onto hostname causes tcl3270 to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options.

    Prepending an A: onto hostname is equivalent to setting the -nvt option; it forces an NVT-mode session instead of a 3270-mode session.

    A specific Logical Unit (LU) name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.)

    The hostname may optionally be placed inside square-bracket characters `[' and `]'. This will prevent any colon `:' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames.

    On systems that support the forkpty library call, the hostname may be replaced with -e and a command string. This will cause tcl3270 to connect to a local child process, such as a shell.

    The port to connect to defaults to telnet. This can be overridden with the -port option, or by appending a port to the hostname with a colon `:'. (For compatability with previous versions of tcl3270 and with tn3270(1), the port may also be specified as a second, separate argument.)

    An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`='). The accept name can also be specified with the -accepthostname option.

    Options

    tcl3270 understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
    -cadir directory
    Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -cafile filename
    Specifies a PEM-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -certfile filename
    Specifies a file containing a client certificate to provide to the host. The default file type is PEM.
    -clientcert name
    Specifies the name of a client certificate to provide to the host. (MacOS only)
    -certfiletype type
    Specifies the type of the certificate file specified by -certfile. Type can be pem or asn1. (OpenSSL only)
    -chainfile filename
    Specifies a certificate chain file in PEM format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If -chainfile is specified, it overrides -certfile. (OpenSSL only)
    -charset name
    Specifies an EBCDIC host character set. See CHARACTER SETS below.
    -clear toggle
    Sets the initial value of toggle to false. The list of toggle names is under TOGGLES below.
    -connecttimeout seconds
    Specifies the time that tcl3270 will wait for a host connection to complete.
    -devname name
    Specifies a device name (workstation ID) for RFC 4777 support.
    -keyfile filename
    Specifies a file containing the private key for the certificate file (specified via -certfile or -chainfile). The default file type is PEM. (OpenSSL only)
    -keyfiletype type
    Specifies the type of the private key file specified by -keyfile. Type can be pem or asn1. (OpenSSL only)
    -keypasswd type:value
    Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be file:filename, specifying that the password is in a file, or string:string, specifying the password on the command-line directly. If the private key file is encrypted and no -keypasswd option is given, secure connections will not be allowed.
    -km name
    Specifies the local encoding method for multi-byte text. name is an encoding name recognized by the ICU library. (Supported only when tcl3270 is compiled with DBCS support, and necessary only when tcl3270 cannot figure it out from the locale.)
    -loginmacro Action(arg...) ...
    Specifies a macro to run at login time.
    -model name
    The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted:

    The first part is the base model, which is either 3278 or 3279. 3278 specifies a monochrome (green on black) 3270 display; 3279 specifies a color 3270 display.

    The second part is the model number, which specifies the number of rows and columns. Model 4 is the default.

    Model Number
    Columns
    Rows
    2
    80
    24
    3
    80
    32
    4
    80
    43
    5
    132
    27

    Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway.

    The default model is 3279-4.

    -noverifycert
    For SSL/TLS connections, do not verify the host certificate.
    -nvt
    Start in NVT mode instead of waiting for the host to send data, and make the default terminal type xterm.
    -oversize colsxrows
    Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "tcl3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing.
    -port n
    Specifies a different TCP port to connect to. n can be a name from /etc/services like telnet, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.)
    -proxy type:host[:port]
    Causes tcl3270 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -set toggle
    Sets the initial value of toggle to true. The list of toggle names is under TOGGLES below. The -p option of x3270if causes it to use this socket, instead of pipes specified by environment variables.
    -tn name
    Specifies the terminal name to be transmitted over the telnet connection. The default name is IBM-model_name-E, for example, IBM-3278-4-E.

    Some hosts are confused by the -E suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an s: on the hostname, or setting the "tcl3270.extended" resource to "false", removes the -E from the terminal name when connecting to such hosts.

    The name can also be specified with the "tcl3270.termName" resource.

    -trace
    Turns on data stream and event tracing at startup. The default trace file name is /tmp/x3trc.
    -tracefile file
    Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file.
    -tracefilesize size
    Places a limit on the size of a trace file. If this option is not specified, or is specified as 0 or none, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of size can have a K or M suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started.
    -user name
    Specifies the user name for RFC 4777 support.
    -v
    Display the version and build options for tcl3270 and exit.
    -verifycert
    For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a y: prepended to the hostname when connecting.
    -xrm "tcl3270.resource: value"
    Sets the value of the named resource to value. Resources control less common tcl3270 options, and are defined under RESOURCES below.
    --
    Terminates the list of tcl3270 options. Whatever follows will be available to the script in the $argv tcl variable.

    Character Sets

    The -charset option or the "tcl3270.charset" resource controls the EBCDIC host character set used by tcl3270. Available sets include:

    Charset Name
    Host Code Page
    Character Set
    belgian
    500
    iso8859-1
    belgian-euro
    1148
    iso8859-15
    bracket
    037
    iso8859-1
    brazilian
    275
    iso8859-1
    chinese-gb18030
    1388
    iso8859-1 + iso10646-1
    cp1047
    1047
    iso8859-1
    cp870
    870
    iso8859-2
    finnish
    278
    iso8859-1
    finnish-euro
    1143
    iso8859-15
    french
    297
    iso8859-1
    french-euro
    1147
    iso8859-15
    german
    273
    iso8859-1
    german-euro
    1141
    iso8859-15
    greek
    423
    iso8859-7
    hebrew
    424
    iso8859-8
    icelandic
    871
    iso8859-1
    icelandic-euro
    1149
    iso8859-15
    italian
    280
    iso8859-1
    italian-euro
    1144
    iso8859-15
    japanese-kana
    930
    jisx0201.1976-0 + jisx0208.1983-0
    japanese-latin
    939
    jisx0201.1976-0 + jisx0208.1983-0
    norwegian
    277
    iso8859-1
    norwegian-euro
    1142
    iso8859-15
    russian
    880
    koi8-r
    simplified-chinese
    935
    iso8859-1 + gb2312.1980-0
    slovenian
    870
    iso8859-2
    spanish
    284
    iso8859-1
    spanish-euro
    1145
    iso8859-15
    swedish
    278
    iso8859-1
    swedish-euro
    1143
    iso8859-15
    thai
    1160
    iso8859-11 tis620.2529-0
    traditional-chinese
    937
    iso8859-1 + Big5-0
    turkish
    1026
    iso8859-9
    uk
    285
    iso8859-1
    uk-euro
    1146
    iso8859-15
    us-euro
    1140
    iso8859-15
    us-intl
    037
    iso8859-1

    The default character set is bracket, which is useful for common U.S. IBM hosts which use EBCDIC codes AD and BD for the `[' and `]' characters, respectively.

    Note that any of the host code pages listed above can be specified by adding cp to the host code page, e.g., cp037 for host code page 037. Also note that the code pages available for a given version of tcl3270 are displayed by the -v command-line option.

    NVT Mode

    Some hosts use an ASCII front-end to do initial login negotiation, then later switch to 3270 mode. tcl3270 will emulate an ANSI X3.64 terminal until the host places it in 3270 mode (telnet BINARY and SEND EOR modes, or TN3270E mode negotiation).

    If the host later negotiates to stop functioning in 3270 mode, tcl3270 will return to NVT emulation.

    In NVT mode, tcl3270 supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources:

    Mode/Character Resource Default
    Translate CR to NL tcl3270.icrnl true
    Translate NL to CR tcl3270.inlcr false
    Erase previous character tcl3270.erase ^?
    Erase entire line tcl3270.kill ^U
    Erase previous word tcl3270.werase ^W
    Redisplay line tcl3270.rprnt ^R
    Ignore special meaning of next character tcl3270.lnext ^V
    Interrupt tcl3270.intr ^C
    Quit tcl3270.quit ^\
    End of file tcl3270.eof ^D

    Toggles

    tcl3270 has a number of configurable modes which may be selected by the -set and -clear options. These names can also be used as the first parameter to the Toggle action, and are the names of resources that can be used to set or clear the value of each toggle at start-up.
    aidWait
    Changes the behavior of actions that send an AID to the host (Enter, Clear, PA and PF). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the Wait(Unlock) action to wait for the unlock.
    blankFill
    If set, tcl3270 modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying `lock-up' that often occurs when inserting into an field with (apparent) space at the end.
    lineWrap
    If set, the NVT terminal emulator automatically assumes a NEWLINE character when it reaches the end of a line.
    screenTrace
    Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file .
    trace
    Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file . The directory for the trace file can be changed with the "tcl3270.traceDir" resource. Script commands are also traced.

    Commands

    tcl3270 supports the following additional tcl commands: )

    Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response.

    Ascii return entire screen contents as text
    Ascii length return screen contents at cursor as text
    Ascii row col length return screen contents as text
    Ascii row col rows cols return screen region as text
    AsciiField return current field as text
    *Attn attention key
    BackSpace move cursor left (or send ASCII BS)
    BackTab tab to start of previous input field
    CircumNot input "^" in NVT mode, or "¬" in 3270 mode
    *Clear clear screen
    Cols report screen size
    *Connect host connect to host
    *CursorSelect Cursor Select AID
    Delete delete character under cursor (or send ASCII DEL)
    DeleteField delete the entire field
    DeleteWord delete the current or previous word
    *Disconnect disconnect from host
    Down move cursor down
    Dup duplicate field
    Ebcdic return entire screen contents in EBCDIC
    Ebcdic length return screen contents at cursor in EBCDIC
    Ebcdic row col length return screen contents in EBCDIC
    Ebcdic row col rows cols return screen region in EBCDIC
    EbcdicField return current field in EBCDIC
    *Enter Enter AID (or send ASCII CR)
    Erase erase previous character (or send ASCII BS)
    EraseEOF erase to end of current field
    EraseInput erase all input fields
    FieldEnd move cursor to end of field
    FieldMark mark field
    HexString hex_digits insert control-character string
    Home move cursor to first input field
    Insert set insert mode
    *Interrupt send TELNET IP to host
    Key keysym insert key keysym
    Key 0xxx insert key with character code xx
    Left move cursor left
    Left2 move cursor left 2 positions
    MonoCase toggle uppercase-only mode
    MoveCursor row col move cursor to zero-origin (row,col)
    Newline move cursor to first field on next line (or send ASCII LF)
    NextWord move cursor to next word
    *PA n Program Attention AID (n from 1 to 3)
    *PF n Program Function AID (n from 1 to 24)
    PreviousWord move cursor to previous word
    Quit exit tcl3270
    Redraw redraw window
    Reset reset locked keyboard
    Right move cursor right
    Right2 move cursor right 2 positions
    ReadBuffer Ascii dump screen buffer as text
    ReadBuffer Ebcdic dump screen buffer in EBCDIC
    Rows report screen size
    Snap same as Snap Save
    Snap Ascii report saved screen data (see Ascii)
    Snap Cols report saved screen size
    Snap Ebcdic report saved screen data (see Ebcdic)
    Snap ReadBuffer report saved screen data (see ReadBuffer)
    Snap Rows report saved screen size
    Snap Save save screen image
    Snap Status report saved connection status
    *Snap Wait [timeout] Output wait for host output and save screen image
    Status report connection status
    *String string insert string (simple macro facility)
    Tab move cursor to next input field
    set|clear]>Toggle option[ toggle an option
    ToggleInsert toggle insert mode
    ToggleReverse toggle reverse-input mode
    *Transfer option=value...' file transfer
    Up move cursor up
    *Wait [timeout] 3270mode wait for 3270 mode
    *Wait [timeout] Disconnect wait for host to disconnect
    *Wait [timeout] InputField wait for valid input field
    *Wait [timeout] NVTMode wait for NVT mode
    *Wait [timeout] Output wait for more host output

    Note that certain parameters to tcl3270 actions (such as the names of files and keymaps) are subject to substitutions:

    The character ~ at the beginning of a string is replaced with the user's home directory. A ~ character followed by a username is replaced with that user's home directory.

    Environment variables are substituted using the Unix shell convention of $name or ${name}.

    Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names.

    File Transfer

    The Transfer command implements IND$FILE file transfer. This command requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer command take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes tcl3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes tcl3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer command to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the tcl3270.ftMode resource.

    The PrintText Action

    The PrintText produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., lpr.

    Multiple arguments can include keywords to control the output of PrintText:

    file filename
    Save the output in a file.
    html
    Save the output as HTML. This option implies file.
    rtf
    Save the output as RichText. This option implies file. The font defaults to Courier New and the point size defaults to 8. These can be overridden by the printTextFont and printTextSize resources, respectively.
    string
    Return the output as a string. This can only be used from scripts.
    modi
    Render modified fields in italics.
    caption text
    Add the specified text as a caption above the output. Within text, the special sequence %T% will be replaced with a timestamp.
    command command
    Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer.

    Nested Scripts

    The String Command
    The simplest method for nested scripts is provided via the String command. The arguments to String are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the AID code to the host, tcl3270 will wait for the host to unlock the keyboard before further processing the string.)
    \b Left
    \exxxx EBCDIC character in hex
    \f Clear*
    \n Enter*
    \pan PA(n)*
    \pfnn PF(nn)*
    \r Newline
    \t Tab
    \T BackTab
    \uxxxx Unicode character in hex
    \xxxxx Unicode character in hex

    Note that the numeric values for the \e, \u and \x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if tcl3270 is built with DBCS support and the host allows DBCS input in the current field.

    Note: The strings are in ASCII and converted to EBCDIC, so beware of inserting control codes.

    There is also an alternate form of the String command, HexString, which is used to enter non-printing data. The argument to HexString is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent EBCDIC characters, which are entered into the current field. In NVT mode, the hexadecimal data represent ASCII characters, which are sent directly to the host.

    Passthru

    tcl3270 supports the Sun telnet-passthru service provided by the in.telnet-gw server. This allows outbound telnet connections through a firewall machine. When a p: is prepended to a hostname, tcl3270 acts much like the itelnet(1) command. It contacts the machine named internet-gateway at the port defined in /etc/services as telnet-passthru (which defaults to 3514). It then passes the requested hostname and port to the in.telnet-gw server.

    Proxy

    The -proxy option or the tcl3270.proxy resource causes tcl3270 to use a proxy server to connect to the host. The syntax of the option or resource is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    Resources

    Certain tcl3270 options can be configured via resources. Resources are defined by -xrm options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in tcl3270 are:

    Resource Default Option Purpose
    blankFill False -set blankFill Blank Fill mode
    charset bracket -charset EBCDIC character set
    dbcsCgcsgid     Override DBCS CGCSGID
    dsTrace False -trace Data stream tracing
    eof ^D   NVT-mode EOF character
    erase ^H   NVT-mode erase character
    extended True   Use 3270 extended data stream
    eventTrace False -trace Event tracing
    icrnl False   Map CR to NL on NVT-mode input
    inlcr False   Map NL to CR in NVT-mode input
    intr ^C   NVT-mode interrupt character
    kill ^U   NVT-mode kill character
    lineWrap False -set lineWrap NVT line wrap mode
    lnext ^V   NVT-mode lnext character
    m3279 (note 1) -model 3279 (color) emulation
    monoCase False -set monoCase Mono-case mode
    numericLock False   Lock keyboard for numeric field error
    oerrLock False   Lock keyboard for input error
    oversize   -oversize Oversize screen dimensions
    port telnet -port Non-default TCP port
    quit ^\   NVT-mode quit character
    rprnt ^R   NVT-mode reprint character
    sbcsCgcsgid     Override SBCS CGCSGID
    secure False   Disable "dangerous" options
    termName (note 2) -tn TELNET terminal type string
    traceDir /tmp   Directory for trace files
    traceFile (note 3) -tracefile File for trace output
    werase ^W   NVT-mode word-erase character

    Note 1: m3279 defaults to False. It can be forced to True with the proper -model option.

    Note 2: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as IBM-3279-2-E. Note also that when TN3270E mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities.

    Note 3: The default trace file is x3trc.pid in the directory specified by the traceDir resource.

    If more than one -xrm option is given for the same resource, the last one on the command line is used.

    See Also

    s3270(1), , x3270(1), c3270(1), telnet(1), tn3270(1)
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    tcl3270 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/tcl3270/ibm_hosts.man.m40000664000076500007650000001122513221577163015276 0ustar pdmpdmdnl Copyright (c) 1994-2009, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(IBM_HOSTS,5,XX_DATE) XX_SH(Name) ibm_hosts XX_DASHED() host database for x3270 and c3270 XX_SH(Synopsis) /usr/lib/X11/x3270/ibm_hosts XX_SH(Description) The XX_FB(ibm_hosts) file contains information regarding IBM hosts on the network. An XX_FI(IBM host) is a host which can communicate with a 3270 terminal emulator such as XX_FB(x3270) or XX_FB(c3270). Each line defines a name in the following format (optional fields are shown in brackets): XX_LP XX_FI(name) XX_FI(type) [XX_FI(opt):]...[XX_FI(luname)@]XX_FI(hostname)[:XX_FI(port)] [XX_FI(actions)] XX_LP Items are separated by any number of blanks and/or TAB characters. A line beginning with `#' is taken as a comment (note that `#' anywhere else on a line does XX_FI(not) indicate a comment). XX_LP The XX_FI(name) field is a mnemonic used to identify the host. XX_LP The XX_FI(type) field is a keyword that indicates the type of entry. The value XX_FB(primary) means that the XX_FI(name) will be included in host-selection menus that may be displayed by a 3270 emulator. The value XX_FB(alias) means that the XX_FI(name) will not be included in menus, but will still be accepted as valid input when a host name is required. XX_LP The XX_FI(hostname) field is the Internet hostname or dot-notation Internet address of the host. XX_LP The XX_FI(hostname) can `include' ``s:'' or ``p:'' prefixes, e.g., XX_FB(s:finicky) (see the XX_LINK(x3270-man.html,XX_FI(x3270)(1)) or XX_LINK(c3270-man.html,XX_FI(c3270)(1)) man page sfor details). It can also include an LU name, separated by an ``@'' character, e.g., XX_FB(oddlu@bluehost). Finally, it can include a non-default XX_FI(port) number, appended to the XX_FI(hostname) with a colon ``:'' character, e.g., XX_FB(bluehost:97). (For compatability with earlier versions of XX_FI(x3270), the XX_FI(port) can also be separated by a slash ``/'' character.) XX_LP The optional XX_FI(actions) field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., XX_FB(PF(1)), it is unmodified; otherwise it is taken as the parameter to the XX_FB(String()) action. The XX_FI(actions) are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. XX_SH(Example) Given the following XX_FB(ibm_hosts) file: XX_LP XX_RS(`mvs primary mvs-host XX_BR tso alias mvs-host XX_BR mvs2 primary mvs-host:4012 XX_BR vm primary vtam Tab() String(3) Enter() ') A 3270 emulator will display four names (XX_FB(mvs), XX_FB(mvs2), XX_FB(afhost) and XX_FB(vm)) on its hosts menu. The names XX_FB(mvs) and XX_FB(tso) will cause connections to the host XX_FB(mvs-host). The name XX_FB(mvs2) will also cause a connection to XX_FB(mvs-host), but to port 4012 rather than the emulator's default port (usually 23). The name XX_FB(vm) will cause the 3270 emulator to connect to the host XX_FB(vtam) (presumably some sort of host-selection front-end), enter the string ``3'' on the second data-entry field on the screen, and send the Enter XX_SM(AID) sequence. XX_SH(Files) /usr/lib/X11/x3270/ibm_hosts XX_SH(See Also) XX_LINK(x3270-man.html,x3270(1)), XX_LINK(c3270-man.html,c3270(1)) suite3270-3.6/tcl3270/LICENSE0000664000076500007650000000342613221577163013304 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/tcl3270/localdefs.h0000664000076500007650000000336713221577163014410 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * localdefs.h * Local definitions for tcl3270. * * This file contains definitions for environment-specific * facilities, such as memory allocation, I/O registration, * and timers. */ /* Identify ourselves. */ #define TCL3270 1 suite3270-3.6/tcl3270/m4man0000775000076500007650000000342013221577163013233 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/tcl3270/Makefile.aux0000664000076500007650000000560613221577163014535 0ustar pdmpdm# Copyright (c) 1995-2011, 2013-2015, 2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for tcl3270 PRODUCT = tcl3270 all: @echo "Must pick a specific make target." DOCS = $(PRODUCT).man html/$(PRODUCT)-man.html html/ReleaseNotes.html \ html/Resources.html html/SSL.html # Rule for building the source tarball: run autoconf and build the # documentation. src.tgz: prepare $(DOCS) Makefile.aux # Rule for preparing a freshly-pulled working copy: run autoconf. prepare: configure configure: configure.in autoconf MANDEP = man.m4 html.m4 m4man Makefile.aux version.txt MKMAN = ./m4man -t man -p $(PRODUCT) MKHTML = ./m4man -t html -p $(PRODUCT) # Rule for building the documentation. man: $(PRODUCT).man html/$(PRODUCT)-man.html # Rules for building man pages and derived HTML documentation. $(PRODUCT).man: x3270.man.m4 ft.inc resources.inc hostname.inc $(MANDEP) $(MKMAN) -n $(PRODUCT) -o $@ x3270.man.m4 html/$(PRODUCT)-man.html: x3270.man.m4 ft.inc resources.inc hostname.inc $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ x3270.man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ html/Resources.html: resource-body make-resource-doc.pl version.txt ./make-resource-doc.pl -o $@ $(PRODUCT) $(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) FALLBACKS = fb-common fallbacks.c: mkfb $(FALLBACKS) $(RM) $@ ./mkfb -c -o $@ $(filter-out mkfb,$^) mkfb: mkfb.c $(CC) $(CFLAGS) -o $@ $(filter %.c,$^) tcl3270: $(OBJS1) $(OBJS1) $(DEP3270) $(DEP32XX) $(DEP3270STUBS) $(CC) -o $@ $(OBJS1) $(LDFLAGS) $(LD3270) $(LD32XX) $(LD3270STUBS) $(LIBS) man:: tcl3270.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi install: tcl3270 [ -d $(DESTDIR)$(BINDIR) ] || \ mkdir -p $(DESTDIR)$(BINDIR) $(INSTALL_PROGRAM) tcl3270 $(DESTDIR)$(BINDIR)/tcl3270 install.man: man [ -d $(DESTDIR)$(MANDIR)/man1 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man1 $(INSTALL_DATA) tcl3270.man $(DESTDIR)$(MANDIR)/man1/tcl3270.1 clean: $(RM) *.o mkfb clobber: clean $(RM) tcl3270 *.d *.man # Include auto-generated dependencies. -include $(OBJS:.o=.d) mkfb.d suite3270-3.6/tcl3270/make-resource-doc.pl0000775000076500007650000001752213221577163016146 0ustar pdmpdm#!/usr/bin/env perl use strict; my $outfile; if ($ARGV[0] eq "-o") { die "Missing filename after -o.\n" unless ($#ARGV >= 1); shift; $outfile = $ARGV[0]; shift; } die "Must specify product.\n" unless ($#ARGV >= 0); my $product = $ARGV[0]; # Figure out the version name. my $version; open VERSION, ") { chomp; if (/^version="(.*)"/) { $version=$1 } } close VERSION; # Sort out the product, and %approd. my %approd; $approd{'a'} = 1; if ($product eq "x3270") { $approd{'u'} = 1; } elsif ($product eq "c3270") { $approd{'C'} = 1; $approd{'u'} = 1; } elsif ($product eq "s3270") { $approd{'S'} = 1; $approd{'u'} = 1; } elsif ($product eq "tcl3270") { $approd{'u'} = 1; } elsif ($product eq "wc3270") { $approd{'C'} = 1; $approd{'w'} = 1; } elsif ($product eq "ws3270") { $approd{'S'} = 1; $approd{'w'} = 1; } else { die "Unknown product '$product'.\n"; } my $prefix = $product; $prefix =~ s/3270//; $approd{$prefix} = 1; # Dump out %approd. #foreach my $k (keys %approd) { # print STDERR "$k: $approd{$k}\n" #} my %types = ( i => 'Integer', b => 'Boolean', s => 'String' ); # Set up output file. my $out; my $tmpfile; if ($outfile) { $tmpfile = "/tmp/mkr" . $$; unlink $tmpfile; open TMPFILE, ">", $tmpfile or die "Can't open $tmpfile.\n"; $out = *TMPFILE; } else { $out = *STDOUT; } # From here on out, unlink the tempfile if we bail. END { unlink $tmpfile if ($tmpfile); } # Unlink the tempfile if we get a termination signal. sub sighandler { unlink $tmpfile if ($tmpfile); exit(0); } $SIG{'INT'} = \&sighandler; $SIG{'QUIT'} = \&sighandler; $SIG{'HUP'} = \&sighandler; $SIG{'TERM'} = \&sighandler; # Remove HTML attributes from a resource name. sub nix { my $txt = shift(@_); $txt =~ s/<\/?[\w.]+>//g; return $txt; } # The indices. my @index; # overall index my @c_index; # configuration index my @a_index; # appearance index my @n_index; # NVT-mode index my @p_index; # protocol index my @i_index; # interaction index my @s_index; # security index my @t_index; # tracing index my @o_index; # other index my @d_index; # deprecated index my @indices = ( \@c_index, \@a_index, \@n_index, \@p_index, \@i_index, \@s_index, \@t_index, \@o_index, \@d_index ); my @index_name = ( "Basic Configuration", "Appearance", "NVT-Mode", "Protocol", "Terminal Interaction", "Security", "Tracing", "Other", "Deprecated" ); # The elements of an entry. my $name; my @names; my $applies; my $type; my $default; my @switch; my @option; my $description; my $groups; sub dump { if ($name && $applies) { # The minimum set of required attributes are type and description. die "$name missing type\n" if (!$type); die "$name missing description\n" if (!$description); foreach my $n (@names) { # Add this name to the general index. push @index, $n; # Add this name to the specified indices... if (defined($groups)) { foreach (split /\s+/, $groups) { if ($_ eq "c") { push @c_index, $n; } elsif ($_ eq "a") { push @a_index, $n; } elsif ($_ eq "n") { push @n_index, $n; } elsif ($_ eq "p") { push @p_index, $n; } elsif ($_ eq "i") { push @i_index, $n; } elsif ($_ eq "s") { push @s_index, $n; } elsif ($_ eq "t") { push @t_index, $n; } elsif ($_ eq "d") { push @d_index, $n; } else { die "Unknown group '$_'\n"; } } } else { # ... or to the 'other' index. push @o_index, $n; } my $tgt = nix($n); print $out "\nName: $product.$n
    \n"; } print $out "Type: $type
    \n"; if ($default) { print $out "Default: $default
    \n"; } if (@switch) { my $comma; print $out "Command Line:"; foreach my $s (@switch) { print $out "$comma $s\n"; $comma = ","; } print $out "
    \n"; } if ($product eq "x3270") { foreach my $o (@option) { print $out "Option: $o
    \n"; } } $description =~ s/%p%/$product/g; while ($description =~ /%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $description =~ s/%-[\w.<>\/*]+%/$product.$full<\/a>/; } #$description =~ s/%-([\w.]+)%/$product.\1<\/tt><\/a>/g; print $out "Description:
    \n"; print $out "

    $description

    \n"; } undef $name; undef @names; undef $applies; undef $type; undef $default; undef @switch; undef @option; undef $description; undef $groups; } print $out <<"EOS"; $product Resources

    $product Resources

    EOS my $on = 1; my $in_desc; my $in_intro; my @ifstack; while () { chomp; # Skip blank lines. next if (/^\s*$/); # Handle if/endif. if (/^if\s+(.*)/) { push @ifstack, $on; my $desc_applies; foreach (split /\s+/, $1) { $desc_applies = 1 if ($approd{$_}); } $on = $desc_applies if ($ifstack[$#ifstack]); next; } elsif (/^else/) { die "dangling else\n" if ($#ifstack < 0); $on = !$on if ($ifstack[$#ifstack]); next; } elsif (/^endif/) { die "dangling endif\n" if ($#ifstack < 0); $on = pop(@ifstack); next; } next unless $on; # Handle desc. if ($in_desc) { if (/^\./) { undef $in_desc; } else { $description .= $_ . "\n"; } next; } # Handle intro. if (/^intro/) { $in_intro = 1; next; } elsif ($in_intro) { if (/^\./) { undef $in_intro; print $out "

    Alphabetical Resource List

    \n"; } else { s/%p%/$product/g; while (/%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $_ =~ s/%-[\w.<>\/*]+%/
    $product.$full<\/a>/; } print $out "$_\n"; } next; } # Handle normal keywords. if (/name\s(.*)/) { &dump; @names = split /\s+/, $1; $name = $names[0]; next; } if (/applies\s(.*)/) { undef $applies; foreach (split /\s+/, $1) { $applies = 1 if ($approd{$_}); } next; } if (/groups\s(.*)/) { $groups = $1; next; } if (/type\s([^\s]*)/) { $type = $types{$1}; next; } if (/default\s(.*)/) { $default = $1; next; } if (/switch\s(.*)/) { push @switch, $1; next; } if (/option\s(.*)/) { push @option, $1; next; } if (/^desc/) { $in_desc = 1; next; } last if (/^EOF$/); die "Unknown keyword '$_'.\n"; } &dump; print $out <Index of All Resources EOT my $ix = 0; foreach my $i (@index) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; my $q = 0; foreach my $j (@indices) { my @arr = @$j; if ($#arr >= 0) { print $out "

    $index_name[$q] Resources

    \n"; print $out "\n"; my $ix = 0; foreach my $i (@arr) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; } $q = $q + 1; } print $out "

    $product version $version ", `date`, "\n"; print $out "\n"; # Wrap up the outfile. if ($outfile) { close TMPFILE; system("mv $tmpfile $outfile") == 0 or die "Can't rename $tmpfile to $outfile.\n"; } suite3270-3.6/tcl3270/man.m40000664000076500007650000000513013221577163013306 0ustar pdmpdmdnl Copyright (c) 2000-2012, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces output for nroff -man changecom()dnl changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl define(XX_SH,.SH `"translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)"')dnl define(XX_TH,.TH $1 $2 "$3")dnl define(XX_SM,\s-1$1\s+1)dnl define(XX_LP,.LP)dnl define(XX_IP,.IP)dnl define(XX_BR,.br)dnl define(XX_RS,.RS $1 .RE)dnl define(XX_TS,.TS $2)dnl define(XX_TR,$1)dnl define(XX_TD,T{ .na .nh $1 T})dnl define(XX_TDH,T{ .na .nh .in +2 .ti -2 $1 T})dnl define(XX_T_,_)dnl define(XX_TC,$1)dnl define(XX_TE,.TE)dnl define(XX_TPS)dnl define(XX_TP,.TP $1)dnl define(XX_TPE)dnl define(XX_PP,.PP)dnl define(XX_RI2,.RI $1 $2)dnl define(XX_DASH,\-)dnl define(XX_DASHED,\-$1)dnl define(XX_FI,\fI$1\fP)dnl define(XX_FB,\fB$1\fP)dnl define(XX_NBSP,`\ ')dnl define(XX_LT,<)dnl define(XX_BS,\e)dnl define(XX_TARGET)dnl define(XX_LINK,$2)dnl define(XX_COPY,` ')dnl define(XX_NOT,notsign)dnl define(XX_BACKSLASH,\\$1)dnl define(XX_HO)dnl define(XX_HY,$1\%$2)dnl dnl Make sure it gets run through tbl first. '\" t suite3270-3.6/tcl3270/mkstand.bash0000775000076500007650000000100313221577163014567 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/tcl3270/mkversion.sh0000775000076500007650000000466413221577163014660 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <Resources are used to configure %p%. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into %p%.
    • if x
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The %p% app-defaults file (only if %p% is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
      endif
    • If a session file foo.%p% is specified on the command line, its contents are applied. if x c Otherwise, if the %p% profile (~/.%p%pro) exists, it is read and its contents are applied. endif These definitions override resource values defined by if x X11 methods and endif compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example %-bsdTm% can be set by the following command-line option:
         -xrm "%p%.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file if x (app-defaults file, profile or session file) else if c (profile or session file) else (session file) endif endif has the following syntax.
    • Each definition consists of:
          %p%.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • if x C
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          %p%.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        
    • endif
    . name acceptHostname applies a type s groups s switch -accepthostname description Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.) . name acs applies c type b default true desc When true, %p% will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, %p% will use Unicode box-drawing characters. . name activeIcon applies x groups a type b default false switch -activeicon description When true, %p%'s icon becomes a live miniature of the screen display. . name aidWait applies x c s tcl type b default false switch -set aidWait switch -clear aidWait desc When true, %p% will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll %p%'s status until it shows that the keyboard is no longer unlocked. . name allBold applies c groups a type s default auto switch -allbold desc When true, %p% will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation. . name allowResize applies x type b default true description When true, the %p% window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it. . name altCursor applies x wc groups a type b default false switch -set altCursor switch -clear altCursor option Options -> Toggles -> Underline Cursor option Options -> Toggles -> Block Cursor description When true, this causes %p% to use the alternate (underscore) cursor. When false, it will use a block cursor. . name altScreen applies c type s switch -altscreen desc Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-defScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name aplCircledAlpha applies x groups a type b default false description When set to true, allows %p% to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with %p%.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point. . name aplMode applies x type b default false switch -apl desc Enables %p% APL mode. APL mode appends apl to the list of names in %-keymap% (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets %-composeMap% to apl (allowing Compose key sequences to construct complex APL symbols), and sets %-charset% to apl (allowing the display of APL symbols using several of the 3270 fonts). . name asciiBoxDraw applies C type b default false desc When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width. . name autoShortcut applies wc type b default false switch -S switch +S desc When true, %p% will run in auto-shortcut mode. In auto-shortcut mode, %p% automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x. . name background applies x groups a type s default white switch -bg switch -rv description The background color for menus, buttons, and on monochrome X11 displays, the emulator window. . name bellMode applies wc type s groups i description Controls how %p% responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the %p% window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides %-visualBell%. . name bellVolume applies x type i default 0 description Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by %-visualBell%, which if true, will replace the bell with a flash of the screen. . name bindLimit applies a groups p type b default true description When true, %p% will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not. . name bindUnlock applies a type b groups p default false description When true, %p% will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing %p% to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op. . name blankFill applies a groups i type b default false option Options -> Toggles -> Blank Fill switch -set blankFill switch -clear blankFill description When true, in 3270 mode %p% will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals. . name boldColor applies x groups a default green type s description This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan. . name bsdTm applies a groups p type b default false description Defines %p%'s response to the TELNET DO TIMING MARK option. When set to false, %p% will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, %p% will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of %p%. In either case, %p% will never respond to a DONT TIMING MARK option. . name caDir applies u type s groups s switch -cadir description Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name caFile applies u type s groups s switch -cafile description Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name cbreak applies c type b default false switch -cbreak desc If true, %p% will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters. . name certFile applies u groups s type s switch -certfile desc Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by %-certFileType%. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%.

    On the Mac, the file must be in PKCS12 format. . name certFileType applies u groups s type s default pem switch -certfiletype desc Gives the type of the certificate file specified by %-certFile%. The value can be pem or asn1. (OpenSSL only) . name chainFile applies u groups s type s switch -chainfile desc Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%. (OpenSSL only) . name charClass applies x type s desc Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name. . name charset applies a groups c type s default bracket switch -charset option Options -> Character Set description This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by %p%, use the -v command-line option. if wc

    Note that %p% DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language. endif . name clientCert applies w groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store. . name clientCert applies u groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only) . name color8 applies a groups p type b default false description If true, %p% will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported. if c

    This setting will also cause %p% to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen. endif . name colorBackground applies x groups a type s default black description The background color for the emulator window. This resource is used only on color X11 displays when %-model% specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by %-colorScheme%. . name colorScheme applies x groups a type s default default option Options -> Color Scheme description Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when %-model% specifies a 3279 display. %-colorScheme% is just the name of the color scheme. The actual color scheme definition for color scheme foo is %-colorScheme.foo%. . name colorScheme.foo applies x groups a type s description An individual color scheme definition. I.e., to define color scheme foo, a resource named %p%.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer. . name commandTimeout applies tcl type i description Defines the number of seconds to wait for a command to complete before failing it with a timeout error. . name composeMap applies x C type s default latin1 description Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource %-composeMap.foo%. . name composeMap.foo applies x C type s description An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive. . name confDir applies a type s if u default /usr/local/etc/x3270 else default . endif desc Defines the %p% configuration directory, where %p% will search for the ibm_hosts file by default. (See %-hostsFile%.) if w

    The default is to search the directory where %p% was started, which usually its installation directory. endif . name connectFileName applies x type s default ~/.x3270connect description Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of %p% that run under the same username. . name connectTimeout applies a type i groups c switch -connecttimeout description Specifies a timeout, in seconds, that %p% will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that %p% will wait for the lesser of the two times (the specified timeout and the system-defined timeout). . name consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite applies wc groups a type i desc Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource %p%.consoleColorForHostColorGreen or the resource %p%.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the %p% Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with %p%.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         %p%.consoleColorForHostColorNeutralBlack: 15
         %p%.consoleColorForHostColorNeutralWhite: 0
        
    . name crosshair applies x C groups a type b default false option Options -> Toggles -> Crosshair Cursor switch -set crosshair switch -clear crosshair description When true, causes %p% to display a crosshair over the cursor: lines extending with height and width of the screen. . name crosshairColor applies x C groups a type s default purple description Defines the color used for the crosshair cursor (see %-crosshair%). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15
    . name cursesColorForDefault cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified applies c groups a type s desc Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    %p% Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)
    . name cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite applies c groups a type s desc Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource %p%.cursesColorForHostColorGreen or the resource %p%.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, %p% only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with %p%.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See %-cursesColorForDefault% for the definitions of curses colors. . name cursesKeypad applies c type b default false desc When true, %p% will set up the terminal in curses keypad mode. . name cursorBlink applies x groups a type b default false option Options -> Toggles -> Blinking Cursor switch -set cursorBlink switch -clear cursorBlink description When true, causes %p% to use a blinking cursor. . name cursorColor applies x groups a type s default red description On color X11 displays, this is the color of the text cursor. This resource is used only if %-useCursorColor% is true. . name cursorPos applies x C groups a type b default true switch -set cursorPos switch -clear cursorPos option Options -> Toggles -> Track Cursor description When true, causes %p% to display the cursor location in the OIA (the status line). . name dbcsCgcsgid applies a groups p type s description Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use %-sbcsCgcsgid% for the single-byte (SBCS) character set. . name debugTracing applies x groups t s type b default true description If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed. . name defaultFgBg applies c type b groups a default false switch -defaultfgbg description If true, %p% will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that %p%'s screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if %p% has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9). . name defScreen applies c type s switch -defscreen desc Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-altScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name dftBufferSize applies a groups p type i default 4096 description Deprecated resource -- replaced by %-ftBufferSize%

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name devName applies a type s switch -devname groups p description Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name disconnectClear applies x type b default false description If true, %p% will clear the screen when a host disconnects. . name doConfirms applies x type b default true description When true, %p% will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed. . name dsTrace applies a groups t type b default false switch -trace switch -set dsTrace switch -clear dsTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name emulatorFont type s applies x groups a default 3270 switch -efont option Options -> Font description The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (%-charset%). However, the special OIA (status line) symbols are only available with the 3270 fonts. . name eof type s applies a groups n default ^D description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    . name erase type s applies a groups n default ^? description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (%p% gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause %p% to discard the last character on the input line.

    When connected in character-at-a-time mode (%p% sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action. . name eventTrace groups t type b applies a default false switch -set eventTrace switch -clear eventTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% traces information about keyboard and mouse events into a file. The default file name is if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name extended type b applies a default false groups d switch -extended description Deprecated resource -- replaced by %-model% syntax

    Indicates support for the 3270 Extended Data Stream. . name fixedSize type s applies x groups a description Specifies a fixed size for the %p% display window. If set, %p% will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary. . name foreground type s applies x groups a default black switch -fg switch -rv description The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display. . name ftAllocation type s applies a groups i default default description Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock. . name ftAvblock type i applies a groups i description Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers. . name ftBlksize type i applies a groups i description Defines the default block size for files sent to TSO hosts by IND$FILE file transfers. . name ftBufferSize applies a groups p type i default 4096 description Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCodePage type i applies w groups i description Deprecated resource -- replaced by %-ftWindowsCodePage%

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCr type s applies a groups i default auto description Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done. . name ftDirection type s applies a groups i default receive description Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation). . name ftExist type s applies a groups i default keep description Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be if x aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), else aborted, endif replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file. . name ftHost type s applies a groups i default tso description Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics. . name ftHostFile type s applies a groups i description Defines the default host file name for IND$FILE file transfers. . name ftLocalFile type s applies a groups i description Defines the default local file name for IND$FILE file transfers. . name ftLrecl type i applies a groups i description Defines the default logical record length for files sent to the host via IND$FILE. . name ftMode type s applies a groups i default ascii description Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation). . name ftPrimarySpace type i applies a groups i description Defines the default primary space allocation for files sent to TSO hosts via IND$FILE. . name ftRecfm type s applies a groups i default default description Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format. . name ftRemap type s applies a groups i default yes description Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by %p% to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37. . name ftSecondarySpace type i applies a groups i description Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE. . name ftWindowsCodePage type i applies w groups i description The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name highlightBold type b applies x groups a default false description If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font. . name hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified applies wc groups a type s desc Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See %-consoleColorForHostColor0% for the definitions of host colors.

    The default values are:
    %p% Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite
    . name hostname type s applies a groups c desc Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over %-hostname%.

    The most common use of %-hostname% is in session files, where a file is used to pass all of the options to establish a %p% session. . name hostsFile type s applies x default /usr/local/etc/x3270/ibm_hosts description The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by %-confDir%. . name hostsFile type s applies C S tcl if u default /usr/local/etc/x3270/ibm_hosts else default ibm_hosts endif description The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. if u The default pathname is actually ibm_hosts in the directory defined by %-confDir%. endif . name httpd type s applies C S x switch -httpd description Defines the TCP port and optional address to listen on for HTTP connections. (%p% implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name iconFont type s applies x groups a default nil2 description The font used to paint the text inside the active icon (see %-activeIcon%). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image. . name iconLabelFont type s applies x groups a default 8x13 description When %-activeIcon% and %-labelIcon% are true, this is the name of the font used to paint the icon label. . name icrnl type b applies a groups n default true description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines. . name idleCommand applies x C S groups i type s description When %-idleCommand% is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The %-idleCommand% can be an arbitrary sequence of %p% actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). %-idleCommandEnabled% must be true in order for the %-idleCommand% to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) %-idleTimeout% specifies the inactivity interval. . name idleCommandEnabled applies x C S groups i type b default false description Controls whether %-idleCommand% has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.) . name idleTimeout applies x C S groups i type s default ~7m description The timeout value for %-idleCommand%. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified. . name inlcr applies a groups n type b default false description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns. . name inputColor applies x groups a type s default green description This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan.

    If the resource %-modifiedSel% is true, modified fields are also displayed using %-inputColor%. . name inputMethod applies x type s switch -im description Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale. . name intr applies a groups n type s default ^C description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host. . name invertKeypadShift applies x type b default false description When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed. . name keyFile applies u groups s type s switch -keyfile desc Gives the name of a file containg the private key for the certificate specified by %-certFile% or %-chainFile%. The default file type is PEM; it can be overridden by %-keyFileType%. If the private key is encrypted, the password is specified by %-keyPasswd%. (OpenSSL only) . name keyFileType applies u groups s type s default pem switch -keyfileType desc Gives the type of the private key file specified by %-keyFile%. The value can be pem or asn1. (OpenSSL only) . name keyHeight applies x groups a type i default 24 desc Defines the height of the keys on the pop-up keypad. . name keymap applies x C groups c type s switch -keymap description The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a %-keymap% value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270. if x

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six. endif

    if x If no %-keymap% is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. %-keymap% is only the name; the keymap definition for name foo is the resource %-keymap.foo%. endif if C %-keymap% is only the name; the actual keymap for name foo can be defined either by the resource %-keymap.foo%, or by a keymap file. if c The keymap file is not searched for in any particular location, nor does it have a special suffix, so %-keymap% can specify the full pathname of the keymap file. else Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km. endif endif . name keymap.foo applies x C type s description The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax. . name keypad applies x groups a type s default right description. This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main %p% window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main %p% window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar
    . name keypad.keyHeight applies x groups a type i default 24 description The height in pixels of all of the buttons on the keypad. . name keyPasswd applies u groups s type s switch -keypasswd desc On OpenSSL, gives the password for the private key file specified by %-keyFile%, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the %-certfile% certifiate file. . name keyWidth applies x groups a type i default 48 description The width in pixels of the lower tier of buttons on a horizontal keypad. . name keypad.largeKeyWidth applies x groups a type i default 56 description The width in pixels of the lower tier of buttons on a vertical keypad. . name keypad.paWidth applies x groups a type i default 36 description The width in pixels of PA and cursor keys on the keypad. . name keypad.pfWidth applies x groups a type i default 32 description The width in pixels of PF keys on the keypad. . name keypadBackground applies x groups a type s default grey70 description On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap. . name keypadOn applies x type b groups a default false description If true, the keypad will automatically appear when %p% is started. . name kill applies a groups n type s default ^U description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action. . name labelIcon applies x groups a type b default false description When %-activeIcon% is true, the twm window manager will not put a label on %p%'s icon. Setting %-labelIcon% to true causes %p% to supply its own label for the icon.

    The icon label is drawn using the font specified by %-iconLabelFont%. . name largeKeyWidth applies x groups a type i default 56 desc Defines the width of the "large" keys in the lower section of the pop-up keypad. . name lightPenPrimary applies wc groups i type b default false description Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste. . name lineWrap applies a groups n type b default true switch -set lineWrap switch -clear lineWrap option Options -> Toggles -> Wraparound description This setting is used only in NVT mode. When true, %p% will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence. . name loginMacro applies a type s switch -loginmacro desc Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a %-hostsFile% is in use and a matching entry is found, the login macro from that entry will be used in preference to the %-loginMacro%. . name lnext applies a groups n type s default ^V description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered. . name localCp applies ws type i desc Forces %p% to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files. . name lockedCursor applies x groups a type s default X_cursor description The name of the mouse cursor displayed with %p% is not connected to a host. . name m3279 applies a type b default true groups d switch -color description Deprecated resource -- replaced by %-model% syntax

    Indicates support for color (a 3279 terminal). . name macros applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    %-macros% defines a set of macros for all hosts. To specify a set of macros for host foo, use %-macros.foo%. . name macros.foo applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of %-macros%. See %-macros% for details on its syntax. . name marginedPaste applies x wc groups i type b default false switch -set marginedPaste switch -clear marginedPaste option Options -> Toggles -> Paste With Left Margin description When true, %p% will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon. . name maxRecent applies x groups i type i default 5 description The maximum number of entries in the Connect menu's recent host list. . name menuBar applies x wc groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% main window. if x The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons. endif . name menuBar applies c groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% display, even if the terminal supports a mouse. . name metaEscape applies c type b default true desc When true, %p% will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus %p% will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character. . name minVersion applies S type s switch -minversion description Defines a minimum required version for %p%. If the version of %p% is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal. . name model applies a groups c type s default 3279-4-E switch -model option Options -> Screen Size description The terminal model that %p% is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. if x If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays. endif
      3279 specifies a color 3270 display. if x This is the default for color X11 displays. endif
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is if C the largest model that will fit on the console or terminal emulator window where %p% is running. Displaying the OIA (status line) requires one more row than what is listed above. else 4. endif
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.
    . name modifiedSel applies x groups a type b default false description When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by %-inputColor%. In 3279 mode, this is the color whose index is defined by %-modifiedSelColor%. When %-modifiedSel% is false, modified fields are displayed in the same colors as unmodified fields. . name modifiedSelColor applies x groups a type i default 10 description In 3279 mode, when %-modifiedSel% is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See %-colorSchemes% for the host color index definitions.) . name mono applies x c type b default false switch -mono description if x If true, %p% will operate as if it were running on a monochrome X11 display. else If true, %p% will emulate a 3278, and will not use any of the terminal's color attributes. endif . name monoCase applies a type b default false switch -set monoCase switch -clear monoCase option Options -> Toggles -> Monocase description When true, causes %p% to run in uppercase-only mode. . name mouse applies c groups i type b default true description If true, enables %p% to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled. . name newEnviron applies a type b default true description If true, %p% will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not. . name noOther applies x groups s type b default false description If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus. . name noPrompt applies C groups s type b default false desc If true, the interactive %p%> prompt will be disabled. In particular, this means that when %p% is not connected to a host, a keymap or an external script is the only way to start a new host connection. . name normalCursor applies x type s groups a default top_left_arrow desc Defines the mouse cursor that %p% uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked. . name nopSeconds applies a type i groups i default 0 desc If nonzero, %p% will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity. . name normalColor applies x groups a type s default green desc On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color. . name numericLock applies a groups i type b default false desc When true, causes %p% to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute. . name nvtMode applies a groups i type b default false switch -nvt desc When true, causes %p% to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname. . name onlcr applies a groups n type b default true desc Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences. . name oerrLock applies a groups i type b default true desc If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message. . name once applies a type b default false switch -once desc When true, %p% will exit as soon as a host disconnects. The default is false if no hostname is specified on the command if x C line or in a session file, else line, endif true otherwise. . name overlayPaste applies wc x groups i type b default false switch -set overlayPaste switch -clear overlayPaste option Options -> Toggles -> Overlay Paste desc When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause %p% to act as if the %-marginedPaste% toggle were also set. . name oversize applies a type s switch -oversize desc Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. if C It can also be the string auto, which will cause %p% to use the entire screen area of the endif if c terminal. endif if wc console window it is running in. endif It is used only if the %-model% includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with %p% in this mode. . name paWidth applies x groups a type i default 36 desc Defines the width of the PA keys in the lower section of the pop-up keypad. . name pfWidth applies x groups a type i default 32 desc Defines the width of the PF keys on the pop-up keypad. . name port applies a groups c type s default telnet switch -port desc The name of the default TCP port for %p% to connect to. This can be either a symbolic name from /etc/services, or an integer. . name proxy applies a groups c type s switch -proxy desc Defines a proxy server that %p% will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the %p% manual page. . name preeditType applies x type s default OverTheSpot+1 switch -pt desc The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. . name printerLu type s applies x C groups c switch -printerlu desc If a value is set, %p% will automatically start a if u pr3287 else wpr3287 endif printer session when a host connection is established. If the value is ".", the if u pr3287 else wpr3287 endif session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session. . name printer.assocCommandLine applies x C type s if x c default pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H% else default wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when %-printerLU% is "."). Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with the %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with the current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.codepage applies wc type i desc The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage. . name printer.command applies x c type s default lpr desc The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in %-printer.assocCommandLine% and %-printer.luCommandLine% resources. . name printer.luCommandLine applies x C type s if x c default pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H% else default wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.name applies wc type s desc Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer. . name printer.options applies x C type s desc Defines extra parameters to substutute for the %O% token in the printer command line. . name printTextCommand applies x c type s default lpr desc The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. if x If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear. endif . name printTextFont applies wc type s default Courier New desc The font used by the PrintText action. . name printTextHorizontalMargin applies wc type i default 0.5 desc The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printTextOrientation applies wc type i desc The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is. . name printTextScreensPerPage applies wc c x type i default 1 desc The number of screens to display on a page when tracing screens to the printer. . name printTextSize applies wc type i default auto (GDI), 8 (WordPad) desc The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points. . name printTextVerticalMargin applies wc type i default 0.5 desc The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printWindowCommand applies x type s default xwd -id %d | xpr | lpr desc The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear. . name qrBgColor applies C s tcl type b default false desc When true, %p% will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash. . name quit applies a groups n type s default ^\ desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host. . name reconnect applies x C type b default false desc When true, %p% will automatically reconnect to a host after it disconnects. . name rectangleSelect applies x groups i type b default false switch -set rectangleSelect switch -clear rectangleSelect option Options -> Toggles -> Select by Rectangles desc When true, %p% will always select rectangular areas of the screen. When false, %p% will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm. . name reverseVideo applies c type b groups a default false option -rv desc When true, %p% will use a white background instead of a black one. . name rprnt applies a groups n type s default ^R desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed. . name saveLines applies x C type i default 4096 switch -sl desc The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved. . name sbcsCgcsgid applies a groups p type s desc Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use %-dbcsCgcsgid% for the double-byte (DBCS) character set. . name schemeList applies x type s desc Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme. . name screenTrace applies a groups t type b default false switch -set screenTrace switch -clear screenTrace option File -> Save Screen(s) in File desc When true, %p% will save an ASCII version of the screen image in a file every time it changes. The file name defaults to if u x3scr.pid. else x3scr.pid.txt. endif The directory where the file is written is defined by %-traceDir%. If %-screenTraceFile% is defined, it defines the file name and %-traceDir% is ignored. if w file name. endif . name screenTraceFile applies a groups t type s desc If defined, gives the name of the file that screen traces will be written into. . name scripted applies x type b default false switch -script desc When true, %p% will read commands from standard input. The rules for these commands are documented in the x3270-script manual page. . name scriptPort applies a type i switch -scriptport desc If defined, %p% will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name scriptPortOnce applies a type b default false switch -scriptportonce desc If defined, %p% will accept only one script connection. When that connection is broken, it will exit. . name scrollBar applies x type b default false switch -sb switch +sb switch -set scrollBar switch -clear scrollBar desc When true, %p% will display a scroll bar to the right of the emulator window. . name secure applies x groups s type b default false desc When true, %p% will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and %-disconnectClear% is true. See %-noOther% and %-suppressActions% for additional security options. . name selectBackground applies x groups a type s default dimGrey desc On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video. . name showTiming applies x groups a type b default false switch -set showTiming switch -clear showTiming option Options -> Toggles -> Show Timing desc When true, %p% will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent. . name socket applies u type b default false switch -socket desc When true, %p% will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket. . name startTls applies a type b groups s default true description If true, %p% will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them. . name *suppress applies x groups s type b desc When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress . name suppressActions applies a groups s type s desc A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options. . name suppressFontMenu applies x type b default false desc If true, the Options -> Font menu will not be displayed. . name suppressHost applies x type b default false desc If true, %p% will omit the hostname from the File -> About %p% -> Connection Status pop-up. . name termName applies a groups p type s switch -tn desc An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of %-model%. . name title applies x wc groups a type s switch -title desc Sets the title for the %p% window, overriding the default of constructing the name from the host that is connected to. . name trace applies a groups t type b default false switch -trace switch -set trace switch -clear trace option File -> Trace Data and Events description When true, %p% writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name traceCommand applies x type s default tail -f desc Defines the command that runs in the trace window. . name traceDir applies a groups t type s if u default /tmp endif if wc default current user's Desktop endif if ws default current directory endif desc Defines the directory that trace files are written into. . name traceFile applies a groups t type s switch -tracefile desc If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. if x If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created. endif . name traceFileSize applies a groups t type s switch -tracefilesize desc If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started. . name traceMonitor applies x wc groups t type b default true desc When true, %p% will create a window to monitor data stream and event traces. When false, no monitor window will be if x created (and the value of none for %-traceFile% will be considered invalid). else created. endif . name typeahead applies w C type b default true desc When true, %p% will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped. . name underscore applies C groups a type b if c default false else default true endif switch -set underscore switch -clear underscore desc When true, %p% will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed if c on terminals that else to overcome the fact that Windows consoles endif are unable to display real underlined text. . name unlockDelay applies x c wc type b default true desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% implements a hack to briefly delay actually unlocking the keyboard. When %-unlockDelay% is true (the default), the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. Setting it to false removes this delay. . name unlockDelay applies s ws tcl type b default false desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. . name unlockDelayMs applies a type i default 350 desc Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and %p% actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros. . name useCursorColor applies x groups a type b default false desc If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by %-cursorColor%. . name user applies a type s switch -user groups p description Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name utf8 applies S type b switch -utf8 description Forces local I/O to use UTF-8 encoding, regardless of the local codepage. . name verifyHostCert applies a type b groups s switch -noverifycert switch -verifycert default true description If true (the default), %p% will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, %p% will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking. . name visibleControl applies x C type b default false switch -set visibleControl switch -clear visibleControl option Options -> Toggles -> Visible Control Characters desc If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, if x c displayed with underlines, endif are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, if x c displayed in yellow with underlines, endif if wc displayed in reverse-video yellow, endif are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified
    . name visualBell applies x groups i type b default false desc When true, %p% will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell. . name visualBell applies wc groups i type b default false desc Deprecated resource -- replaced by %-bellMode%

    When true, %p% will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, %p% will beep the console and flash the screen.

    Note that this resource is overridden by %-bellMode%. %-bellMode% is the preferred method of controlling the console bell behavior. . name visualSelect applies x groups a type b default false desc This resource controls how %p% displays light pen selectable fields that do not have a color explicitly set by the host. When true, %p% will display these fields using the color defined by %-visualSelectColor%. When false, %p% will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode. . name visualSelectColor applies x groups a type i default 6 desc The host color index of the color to use to display light pen selectable fields. This resource is used only if %-visualSelect% is true. The default is 6 (yellow). . name waitCursor applies x groups a type s default watch desc The name of the mouse cursor displayed when %p% is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>. . name werase applies a groups n type s default ^W desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action. . EOF suite3270-3.6/tcl3270/resources.inc0000664000076500007650000003113613221577163015003 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ifelse(XX_PRODUCT,c3270,`XX_SH(Screen Size Switching) When running as a 3270 Model 5, XX_FB(c3270) can take advantage of terminals that can switch between 80 and 132 column modes. XX_LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to XX_FB(c3270). These are specified with the XX_FB(XX_DASHED(altscreen)) and XX_FB(XX_DASHED(defscreen)) command-line options, or the XX_FB(altScreen) and XX_FB(defScreen) resources. XX_FB(XX_DASHED(altscreen)) or XX_FB(altScreen) defines the alternate (132-column) mode; XX_FB(XX_DASHED(defscreen)) or XX_FB(defScreen) defines the default (80-column) mode. XX_LP The syntax for the options and resources is XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string), where XX_FI(rows) and XX_FI(cols) give the screen dimensions, and XX_FI(init_string) is the escape sequence to transmit to the terminal to enter that mode. For XX_FB(defscreen), the minimum dimensions are 24 rows and 80 columns. For XX_FB(altscreen), the minimum dimensions are 27 rows and 132 columns. Within XX_FI(init_string), the usual escape sequences are supported (XX_BACKSLASH(E) for escape, XX_BACKSLASH(r), XX_BACKSLASH(b), etc.). For example, the init string for a 132-column xterm is: XX_IP XX_BACKSLASH(E)[?40h`'XX_BACKSLASH(E)[?3h XX_LP Note: When XX_FB(defscreen) and XX_FB(altscreen) are specified, the model number is always set to 5. ')dnl XX_SH(Resources) Certain XX_FB(XX_PRODUCT) options can be configured via resources. Resources are defined ifelse(XX_PRODUCT,c3270,`in the file XX_FB(.c3270pro) in the XX_POSESSIVE(user) home directory, and ')dnl ifelse(XX_PRODUCT,wc3270,`in the session file, or ')dnl by XX_FB(XX_DASHED(xrm)) options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in XX_FB(XX_PRODUCT) are: XX_LP XX_TS(4, l l l l.) XX_TR(XX_TD(Resource) XX_TD(Default) XX_TD(Option) XX_TD(Purpose)) XX_T_() ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(allBold) XX_TD(Auto) XX_TD(XX_DASHED(allbold)) XX_TD(Display all characters bold)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(altScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(altscreen)) XX_TD(132-col screen definition)) ')dnl XX_TR(XX_TD(blankFill) XX_TD(False) XX_TD(XX_DASHED(set) blankFill) XX_TD(Blank Fill mode)) XX_TR(XX_TD(charset) XX_TD(bracket) XX_TD(XX_DASHED(charset)) XX_TD(XX_SM(EBCDIC) character set)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(composeMap) XX_TD(latin1) XX_TD(XX_NBSP) XX_TD(Name of composed-character map)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(consoleColorForHostColor`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForHostColor)`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForDefault)) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForIntensified)) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtected)) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtectedIntensified)) XX_TD(white) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(cursesKeymap) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Set curses keymap option)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(defScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(defscreen)) XX_TD(80-col screen definition)) ')dnl XX_TR(XX_TD(dbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override DBCS CGCSGID)) XX_TR(XX_TD(dsTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Data stream tracing)) XX_TR(XX_TD(eof) XX_TD(^D) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode XX_SM(EOF) character)) XX_TR(XX_TD(erase) XX_TD(^H) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode erase character)) XX_TR(XX_TD(extended) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Use 3270 extended data stream)) XX_TR(XX_TD(eventTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Event tracing)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForDefault) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForIntensified) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtected) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtectedIntensified) XX_TD(neutralWhite) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(hostsFile) XX_TD(XX_NBSP) XX_TD(XX_DASHED(hostsfile)) XX_TD(Host alias/macro file)) ')dnl XX_TR(XX_TD(icrnl) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(CR) to XX_SM(NL) on XX_SM(NVT)-mode input)) XX_TR(XX_TD(inlcr) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(NL) to XX_SM(CR) in XX_SM(NVT)-mode input)) XX_TR(XX_TD(intr) XX_TD(^C) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode interrupt character)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(keymap) XX_TD(XX_NBSP) XX_TD(XX_DASHED(keymap)) XX_TD(Keyboard map name)) XX_TR(XX_TD(keymap.XX_FI(foo)) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Definition of keymap XX_FI(foo))) ')dnl XX_TR(XX_TD(kill) XX_TD(^U) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode kill character)) XX_TR(XX_TD(lineWrap) XX_TD(False) XX_TD(XX_DASHED(set) lineWrap) XX_TD(XX_SM(NVT) line wrap mode)) XX_TR(XX_TD(lnext) XX_TD(^V) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode lnext character)) ifelse(XX_PRODUCT,ws3270,`XX_TR(XX_TD(localCp) XX_TD((system ANSI code page)) XX_TD(XX_DASHED(localcp)) XX_TD(Windows code page for local I/O)) ')dnl XX_TR(XX_TD(m3279) XX_TD(XX_LINK(#rn1,`(note 1)')) XX_TD(XX_DASHED(model)) XX_TD(3279 (color) emulation)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(metaEscape) XX_TD(Auto) XX_TD(XX_NBSP) XX_TD(Interpret ESC-x as Meta-x)) ')dnl ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(marginedPaste) XX_TD(False) XX_TD(XX_DASHED(set) marginedPaste) XX_TD(Keep left margin when pasting)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(mono) XX_TD(XX_LINK(#rn5, `(note 5)')) XX_TD(XX_DASHED(mono)) XX_TD(Ignore terminal color capabilities)) ')dnl XX_TR(XX_TD(monoCase) XX_TD(False) XX_TD(XX_DASHED(set) monoCase) XX_TD(Mono-case mode)) ifelse(XX_MODE,console,`XX_TR(XX_TD(noPrompt) XX_TD(False) XX_TD(XX_DASHED(noprompt)) XX_TD(Disable command-prompt mode)) ')dnl XX_TR(XX_TD(numericLock) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Lock keyboard for numeric field error)) XX_TR(XX_TD(oerrLock) XX_TD(ifelse(XX_PRODUCT,c3270,True,False)) XX_TD(XX_NBSP) XX_TD(Lock keyboard for input error)) ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(overlayPaste) XX_TD(False) XX_TD(XX_DASHED(set) overlayPaste) XX_TD(Overlay protected fields when pasting)) ')dnl XX_TR(XX_TD(oversize) XX_TD(XX_NBSP) XX_TD(XX_DASHED(oversize)) XX_TD(Oversize screen dimensions)) XX_TR(XX_TD(port) XX_TD(telnet) XX_TD(XX_DASHED(port)) XX_TD(Non-default TCP port)) ifelse(XX_MODE,console,`XX_TR(XX_TD(printer.*) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) XX_TR(XX_TD(printerLu) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(printTextFont) XX_TD(Courier New) XX_TD(XX_NBSP) XX_TD(PrintText font name)) XX_TR(XX_TD(printTextSize) XX_TD(8) XX_TD(XX_NBSP) XX_TD(PrintText font size)) ')dnl XX_TR(XX_TD(quit) XX_TD(^XX_BS) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode quit character)) ifelse(XX_MODE,console,`XX_TR(XX_TD(reconnect) XX_TD(False) XX_TD(XX_DASHED(reconnect)) XX_TD(Automatically reconnect to host)) ')dnl XX_TR(XX_TD(rprnt) XX_TD(^R) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode reprint character)) XX_TR(XX_TD(sbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override SBCS CGCSGID)) XX_TR(XX_TD(secure) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable "dangerous" options)) XX_TR(XX_TD(termName) XX_TD(XX_LINK(#rn2,`(note 2)')) XX_TD(XX_DASHED(tn)) XX_TD(XX_SM(TELNET) terminal type string)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(title) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Console window title)) ')dnl ifelse(XX_PLATFORM,windows,,`XX_TR(XX_TD(traceDir) XX_TD(/tmp) XX_TD(XX_NBSP) XX_TD(Directory for trace files)) ')dnl XX_TR(XX_TD(traceFile) XX_TD(XX_LINK(#rn3,`(note 3)')) XX_TD(XX_DASHED(tracefile)) XX_TD(File for trace output)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(typeahead) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Allow typeahead)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(visualBell) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable bell sound)) ')dnl XX_TR(XX_TD(werase) XX_TD(^W) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode word-erase character)) XX_TE() XX_LP XX_RS(`XX_TARGET(rn1)XX_FI(Note 1): XX_FB(m3279) defaults to ifelse(XX_PRODUCT,c3270,`XX_FB(True) if the terminal supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,wc3270,`XX_FB(True). It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,x3270,`XX_FB(True) if the display supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', `XX_FB(False). It can be forced to XX_FB(True) with the proper XX_FB(XX_DASHED(model)) option.') XX_LP XX_TARGET(rn2)XX_FI(Note 2): The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as XX_FB(IBM-3279-2-E). Note also that when XX_SM(TN3270E) mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. XX_LP XX_TARGET(rn3)XX_FI(Note 3): The default trace file is ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(x3trc.)`'XX_FI(pid) in the directory specified by the XX_FB(traceDir) resource'). ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.')' ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn5)XX_FI(Note 5): XX_FB(mono) defaults to XX_FB(false) if the terminal supports at least 8 colors and to XX_FB(true) otherwise.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.' ')dnl ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.' ')) XX_LP ifelse(XX_PRODUCT,c3270,`In XX_FB(.c3270pro), lines are continued with a backslash character. XX_LP XX_FB(XX_DASHED(xrm)) options override definitions found in XX_FB(.c3270pro). ')dnl If more than one XX_FB(XX_DASHED(xrm)) option is given for the same resource, the last one on the command line is used. suite3270-3.6/tcl3270/tcl3270.c0000664000076500007650000012423013221577163013536 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR * GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * tclAppInit.c -- * * Provides a default version of the main program and Tcl_AppInit * procedure for Tcl applications (without Tk). * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tcl3270.c,v 1.35 2007/07/17 15:58:53 pdm Exp $ */ /* * tcl3270.c * A tcl-based 3270 Terminal Emulator * Main proceudre. */ #include "tcl.h" #include "globals.h" #include #include #include #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "ctlr.h" #include "actions.h" #include "charset.h" #include "ctlrc.h" #include "ft.h" #include "glue.h" #include "host.h" #include "kybd.h" #include "lazya.h" #include "macros.h" #include "nvt.h" #include "opts.h" #include "popups.h" #include "print_screen.h" #include "screen.h" #include "selectc.h" #include "sio.h" #include "telnet.h" #include "toggles.h" #include "trace.h" #include "unicodec.h" #include "utf8.h" #include "utils.h" #include "varbuf.h" #include "xio.h" /* * The following variable is a special hack that is needed in order for * Sun shared libraries to be used for Tcl. */ #if defined(_sun) /*[*/ extern int matherr(); int *tclDummyMathPtr = (int *) matherr; #endif /*]*/ static Tcl_ObjCmdProc x3270_cmd; static Tcl_ObjCmdProc Rows_cmd, Cols_cmd; static enum { NOT_WAITING, /* Not waiting */ AWAITING_CONNECT, /* Connect (negotiation completion) */ AWAITING_RESET, /* Keyboard locked */ AWAITING_FT, /* File transfer in progress */ AWAITING_IFIELD, /* Wait InputField */ AWAITING_3270, /* Wait 3270Mode */ AWAITING_NVT, /* Wait NVTMode */ AWAITING_OUTPUT, /* Wait Output */ AWAITING_SOUTPUT, /* Snap Wait */ AWAITING_DISCONNECT,/* Wait Disconnect */ AWAITING_UNLOCK /* Wait Unlock */ } waiting = NOT_WAITING; static const char *wait_name[] = { "not waiting", "connection incomplete", "keyboard locked", "file transfer in progress", "need input field", "need 3270 mode", "need NVT mode", "need host output", "need snap host output", "need host disconnect", "need keyboard unlock" }; static const char *unwait_name[] = { "wasn't waiting", "connection complete", "keyboard unlocked", "file transfer complete", "input field found", "in 3270 mode", "in NVT mode", "host generated output", "host generated snap output", "host disconnected", "keyboard unlocked" }; static ioid_t wait_id = NULL_IOID; static ioid_t command_timeout_id = NULL_IOID; static int cmd_ret; static char *action = NULL; static bool interactive = false; static action_t Ascii_action; static action_t AsciiField_action; static action_t Ebcdic_action; static action_t EbcdicField_action; static action_t Status_action; static action_t ReadBuffer_action; static action_t Snap_action; static action_t Wait_action; static action_t Query_action; /* Local prototypes. */ static void ps_clear(void); static int tcl3270_main(int argc, const char *argv[]); static void negotiate(void); static char *tc_scatv(const char *s); static void snap_save(void); static void wait_timed_out(ioid_t); static void tcl3270_register(void); /* Macros.c stuff. */ static bool in_cmd = false; static Tcl_Interp *sms_interp; static bool output_wait_needed = false; static char *pending_string = NULL; static char *pending_string_ptr = NULL; static bool pending_hex = false; bool macro_output = false; /* Is the keyboard is locked due to user input? */ #define KBWAIT (kybdlock & (KL_OIA_LOCKED|KL_OIA_TWAIT|KL_DEFERRED_UNLOCK)) #define CKBWAIT (toggled(AID_WAIT) && KBWAIT) /* Is it safe to continue a script waiting for an input field? */ #define INPUT_OKAY ( \ IN_SSCP || \ (IN_3270 && formatted && cursor_addr && !CKBWAIT) || \ (IN_NVT && !(kybdlock & KL_AWAITING_FIRST)) \ ) /* Is is safe to continue a script waiting for the connection to complete? */ #define CONNECT_DONE (IN_SSCP || IN_3270 || IN_NVT) /* Shorthand macro to unlock the current action. */ #define UNBLOCK() { \ vtrace("Unblocked %s (%s)\n", action, unwait_name[waiting]); \ waiting = NOT_WAITING; \ if (wait_id != NULL_IOID) { \ RemoveTimeOut(wait_id); \ wait_id = NULL_IOID; \ } \ } /* *---------------------------------------------------------------------- * * main -- * * This is the main program for the application. * * Results: * None: Tcl_Main never returns here, so this procedure never * returns either. * * Side effects: * Whatever the application does. * *---------------------------------------------------------------------- */ int main(int argc, char **argv) { Tcl_Main(argc, argv, Tcl_AppInit); return 0; } /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in the interp's result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(Tcl_Interp *interp) { const char *s0, *s; int tcl_argc; const char **tcl_argv; int argc; const char **argv; unsigned i; int j; Tcl_Obj *argv_obj; action_elt_t *e; if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* * Call the module registration functions, to build up the tables of * actions, options and callbacks. */ ctlr_register(); ft_register(); host_register(); kybd_register(); nvt_register(); print_screen_register(); tcl3270_register(); toggles_register(); trace_register(); xio_register(); sio_register(); /* Use argv and argv0 to figure out our command-line arguments. */ s0 = Tcl_GetVar(interp, "argv0", 0); if (s0 == NULL) { return TCL_ERROR; } s = Tcl_GetVar(interp, "argv", 0); if (s == NULL) { return TCL_ERROR; } (void) Tcl_SplitList(interp, s, &tcl_argc, &tcl_argv); argc = tcl_argc + 1; argv = (const char **)Malloc((argc + 1) * sizeof(char *)); argv[0] = s0; for (j = 0; j < tcl_argc; j++) { argv[1 + j] = tcl_argv[j]; } argv[argc] = NULL; /* Find out if we're interactive. */ s = Tcl_GetVar(interp, "tcl_interactive", 0); interactive = (s != NULL && !strcmp(s, "1")); /* Call main. */ if (tcl3270_main(argc, argv) == TCL_ERROR) { return TCL_ERROR; } /* Replace tcl's argc and argv with whatever was left. */ argv_obj = Tcl_NewListObj(0, NULL); for (i = 1; argv[i] != NULL; i++) { Tcl_ListObjAppendElement(interp, argv_obj, Tcl_NewStringObj(argv[i], strlen(argv[i]))); } Tcl_SetVar2Ex(interp, "argv", NULL, argv_obj, 0); Tcl_SetVar(interp, "argc", lazyaf("%d", i? i - 1: 0), 0); /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. */ /* * Call Tcl_CreateCommands for the application-specific commands, if * they weren't already created by the init procedures called above. */ FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (Tcl_CreateObjCommand(interp, e->t.name, x3270_cmd, NULL, NULL) == NULL) { return TCL_ERROR; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (Tcl_CreateObjCommand(interp, "Rows", Rows_cmd, NULL, NULL) == NULL) { return TCL_ERROR; } if (Tcl_CreateObjCommand(interp, "Cols", Cols_cmd, NULL, NULL) == NULL) { return TCL_ERROR; } /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ #if 0 Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); #endif return TCL_OK; } void usage(const char *msg) { const char *sn = ""; if (!strcmp(programname, "tcl3270")) { sn = " [scriptname]"; } if (msg != NULL) { fprintf(stderr, "%s\n", msg); } fprintf(stderr, "Usage: %s%s [tcl3270-options] [host] [-- script-args]\n" " is [ps:][LUname@]hostname[:port]\n", programname, sn); fprintf(stderr, "Options:\n"); cmdline_help(false); exit(1); } /* * Called when the host connects, disconnects, or changes modes. * When we connect or change modes, clear the screen. * When we disconnect, clear the pending string, so we don't keep trying to * feed it to a dead host. */ static void tcl3270_connect(bool ignored) { if (CONNECTED) { ctlr_erase(true); /* Check for various wait conditions. */ switch (waiting) { case AWAITING_CONNECT: if (CONNECT_DONE) { UNBLOCK(); } break; case AWAITING_3270: if (IN_3270) { UNBLOCK(); } break; case AWAITING_NVT: if (IN_NVT) { UNBLOCK(); } break; default: /* Nothing we can figure out here. */ break; } } else { if (appres.disconnect_clear) { ctlr_erase(true); } ps_clear(); /* Cause (almost) any pending Wait command to fail. */ if (waiting != NOT_WAITING) { if (waiting == AWAITING_DISCONNECT) { UNBLOCK(); } else { vtrace("Unblocked %s (was '%s') -- failure\n", action, wait_name[waiting]); popup_an_error("Host disconnected"); waiting = NOT_WAITING; } } } } /* Initialization procedure for tcl3270. */ static int tcl3270_main(int argc, const char *argv[]) { const char *cl_hostname = NULL; argc = parse_command_line(argc, (const char **)argv, &cl_hostname); /* Set tcl3270-specific defaults. */ appres.utf8 = true; if (charset_init(appres.charset) != CS_OKAY) { xs_warning("Cannot find charset \"%s\"", appres.charset); (void) charset_init(NULL); } model_init(); ctlr_init(-1); ctlr_reinit(-1); ft_init(); /* Make sure we don't fall over any SIGPIPEs. */ (void) signal(SIGPIPE, SIG_IGN); /* Handle initial toggle settings. */ initialize_toggles(); /* Connect to the host, and wait for negotiation to complete. */ if (cl_hostname != NULL) { action = NewString("[initial connection]"); if (!host_connect(cl_hostname)) { exit(1); } if (CONNECTED || HALF_CONNECTED) { sms_connect_wait(); negotiate(); } } return TCL_OK; } /* Replacements for the logic in macros.c. */ /* Process the pending string (set by the String command). */ static void process_pending_string(void) { if (pending_string_ptr == NULL || waiting != NOT_WAITING) { return; } if (pending_hex) { hex_input(pending_string_ptr); ps_clear(); } else { int len = strlen(pending_string_ptr); int len_left; len_left = emulate_input(pending_string_ptr, len, false); if (len_left) { pending_string_ptr += len - len_left; return; } else { ps_clear(); } } if (CKBWAIT) { vtrace("Blocked %s (keyboard locked)\n", action); waiting = AWAITING_RESET; } } /* Clear out the pending string. */ static void ps_clear(void) { if (pending_string != NULL) { pending_string_ptr = NULL; Replace(pending_string, NULL); } } /* Command timeout function. */ static void command_timed_out(ioid_t id _is_unused) { popup_an_error("Command timed out after %ds.\n", appres.tcl3270.command_timeout); command_timeout_id = NULL_IOID; /* Let the command complete unsuccessfully. */ UNBLOCK(); } /* The tcl "x3270" command: The root of all 3270 access. */ static int x3270_cmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { unsigned j; unsigned count; const char **argv = NULL; int old_mode; action_elt_t *e; bool found; /* Set up ugly global variables. */ in_cmd = true; sms_interp = interp; /* Synchronously run any pending I/O's and timeouts. Ugly. */ old_mode = Tcl_SetServiceMode(TCL_SERVICE_ALL); while (process_events(false)) { ; } (void) Tcl_SetServiceMode(old_mode); /* Verify minimal command syntax. */ if (objc < 1) { Tcl_SetResult(interp, "Missing action name", TCL_STATIC); return TCL_ERROR; } /* Look up the action. */ Replace(action, NewString(Tcl_GetString(objv[0]))); found = false; FOREACH_LLIST(&actions_list, e, action_elt_t *) { if (!strcmp(action, e->t.name)) { found = true; break; } } FOREACH_LLIST_END(&actions_list, e, action_elt_t *); if (!found) { Tcl_SetResult(interp, "No such action", TCL_STATIC); return TCL_ERROR; } /* Stage the arguments. */ count = objc - 1; if (count) { argv = (const char **)Malloc(count*sizeof(char *)); for (j = 0; j < count; j++) { argv[j] = Tcl_GetString(objv[j + 1]); } } /* Trace what we're about to do. */ if (toggled(TRACING)) { vtrace("Running %s", action); for (j = 0; j < count; j++) { char *s; s = tc_scatv(argv[j]); vtrace(" %s", s); Free(s); } vtrace("\n"); } /* Set up more ugly global variables and run the action. */ ia_cause = IA_SCRIPT; cmd_ret = TCL_OK; run_action_entry(e, IA_SCRIPT, count, argv); /* Set implicit wait state. */ if (ft_state != FT_NONE) { waiting = AWAITING_FT; } else if ((waiting == NOT_WAITING) && CKBWAIT) { waiting = AWAITING_RESET; } if (waiting != NOT_WAITING) { vtrace("Blocked %s (%s)\n", action, wait_name[waiting]); if (appres.tcl3270.command_timeout) { command_timeout_id = AddTimeOut(appres.tcl3270.command_timeout * 1000, command_timed_out); } } /* * Process responses and push any pending string, until * we can proceed. */ process_pending_string(); old_mode = Tcl_SetServiceMode(TCL_SERVICE_ALL); while (waiting != NOT_WAITING) { /* Process pending file I/O. */ (void) process_events(true); /* * Check for the completion of output-related wait conditions. */ switch (waiting) { case AWAITING_IFIELD: if (INPUT_OKAY) { UNBLOCK(); } break; case AWAITING_RESET: if (!CKBWAIT) { UNBLOCK(); } break; case AWAITING_FT: if (ft_state == FT_NONE) { UNBLOCK(); } break; case AWAITING_UNLOCK: if (!KBWAIT) { UNBLOCK(); } default: break; } /* Push more string text in. */ process_pending_string(); } if (command_timeout_id != NULL_IOID) { RemoveTimeOut(command_timeout_id); command_timeout_id = NULL_IOID; } if (toggled(TRACING)) { const char *s; # define TRUNC_LEN 40 char s_trunc[TRUNC_LEN + 1]; s = Tcl_GetStringResult(interp); vtrace("Completed %s (%s)", action, (cmd_ret == TCL_OK)? "ok": "error"); if (s != NULL && *s) { char buf[1024]; strncpy(s_trunc, s, TRUNC_LEN); s_trunc[TRUNC_LEN] = '\0'; vtrace(" -> \"%s\"", scatv(s_trunc, buf, sizeof(buf))); if (strlen(s) > TRUNC_LEN) { vtrace("...(%d chars)", (int)strlen(s)); } } vtrace("\n"); } (void) Tcl_SetServiceMode(old_mode); in_cmd = false; sms_interp = NULL; if (argv) { Free(argv); } return cmd_ret; } /* Do initial connect negotiation. */ void negotiate(void) { int old_mode; old_mode = Tcl_SetServiceMode(TCL_SERVICE_ALL); while (CKBWAIT || (waiting == AWAITING_CONNECT && !CONNECT_DONE)) { (void) process_events(true); if (!PCONNECTED) { exit(1); } } (void) Tcl_SetServiceMode(old_mode); } /* Indicates whether errors should go to stderr, or be returned to tcl. */ bool sms_redirect(void) { return in_cmd; } /* Returns an error to tcl. */ void sms_error(const char *s) { Tcl_SetResult(sms_interp, (char *)s, TCL_VOLATILE); cmd_ret = TCL_ERROR; } /* For now, a no-op. Used to implement 'Expect'. */ void sms_store(unsigned char c) { } /* Also a no-op. */ void sms_accumulate_time(struct timeval *t0 _is_unused, struct timeval *t1 _is_unused) { } /* Set the pending string. Used by the 'String' action. */ void ps_set(char *s, bool is_hex) { Replace(pending_string, NewString(s)); pending_string_ptr = pending_string; pending_hex = is_hex; } /* Signal a new connection. */ void sms_connect_wait(void) { waiting = AWAITING_CONNECT; } /* Signal host output. */ void sms_host_output(void) { /* Release the script, if it is waiting now. */ switch (waiting) { case AWAITING_SOUTPUT: snap_save(); /* fall through... */ case AWAITING_OUTPUT: UNBLOCK(); break; default: break; } /* If there was no script waiting, ensure that it won't later. */ output_wait_needed = false; } /* More no-ops. */ void login_macro(char *s) { } void sms_continue(void) { } /* Data query actions. */ static void dump_range(int first, int len, bool in_ascii, struct ea *buf, int rel_rows _is_unused, int rel_cols) { int i; Tcl_Obj *o = NULL; Tcl_Obj *row = NULL; bool is_zero = false; /* * The client has now 'looked' at the screen, so should they later * execute 'Wait(output)', they will actually need to wait for output * from the host. output_wait_needed is cleared by sms_host_output, * which is called from the write logic in ctlr.c. */ if (buf == ea_buf) { output_wait_needed = true; } is_zero = FA_IS_ZERO(get_field_attribute(first)); for (i = 0; i < len; i++) { /* Check for a new row. */ if (i && !((first + i) % rel_cols)) { /* Done with this row. */ if (o == NULL) { o = Tcl_NewListObj(0, NULL); } Tcl_ListObjAppendElement(sms_interp, o, row); row = NULL; } if (!row) { if (in_ascii) { row = Tcl_NewObj(); } else { row = Tcl_NewListObj(0, NULL); } } if (in_ascii) { int len; char mb[16]; ucs4_t uc; mb[0] = ' '; mb[1] = '\0'; len = 2; if (buf[first + i].fa) { is_zero = FA_IS_ZERO(buf[first + i].fa); /* leave mb[] as " " */ } else if (is_zero) { /* leave mb[] as " " */ } else if (IS_LEFT(ctlr_dbcs_state(first + i))) { len = ebcdic_to_multibyte((buf[first + i].cc << 8) | buf[first + i + 1].cc, mb, sizeof(mb)); } else if (IS_RIGHT(ctlr_dbcs_state(first + i))) { continue; } else { len = ebcdic_to_multibyte_x(buf[first + i].cc, buf[first + i].cs & CS_MASK, mb, sizeof(mb), EUO_BLANK_UNDEF, &uc); } if (len > 0) { Tcl_AppendToObj(row, mb, len - 1); } } else { char *s; s = xs_buffer("0x%02x", buf[first + i].cc); Tcl_ListObjAppendElement(sms_interp, row, Tcl_NewStringObj(s, -1)); Free(s); } } /* Return it. */ if (row) { if (o) { Tcl_ListObjAppendElement(sms_interp, o, row); Tcl_SetObjResult(sms_interp, o); } else { Tcl_SetObjResult(sms_interp, row); } } } static void dump_rectangle(int start_row, int start_col, int rows, int cols, bool in_ascii, struct ea *buf, int rel_cols) { int r, c; Tcl_Obj *o = NULL; Tcl_Obj *row = NULL; /* * The client has now 'looked' at the screen, so should they later * execute 'Wait(output)', they will actually need to wait for output * from the host. output_wait_needed is cleared by sms_host_output, * which is called from the write logic in ctlr.c. */ if (buf == ea_buf) { output_wait_needed = true; } if (!rows || !cols) { return; } for (r = start_row; r < start_row + rows; r++) { /* New row. */ if (o == NULL) { o = Tcl_NewListObj(0, NULL); } if (row != NULL) { Tcl_ListObjAppendElement(sms_interp, o, row); } if (in_ascii) { row = Tcl_NewObj(); } else { row = Tcl_NewListObj(0, NULL); } for (c = start_col; c < start_col + cols; c++) { int loc = (r * rel_cols) + c; if (in_ascii) { int len; char mb[16]; ucs4_t uc; if (FA_IS_ZERO(get_field_attribute(loc))) { mb[0] = ' '; mb[1] = '\0'; len = 2; } else if (IS_LEFT(ctlr_dbcs_state(loc))) { len = ebcdic_to_multibyte((buf[loc].cc << 8) | buf[loc + 1].cc, mb, sizeof(mb)); } else if (IS_RIGHT(ctlr_dbcs_state(loc))) { continue; } else { len = ebcdic_to_multibyte_x(buf[loc].cc, buf[loc].cs & CS_MASK, mb, sizeof(mb), EUO_BLANK_UNDEF, &uc); } if (len > 0) { Tcl_AppendToObj(row, mb, len - 1); } } else { char *s; s = xs_buffer("0x%02x", buf[loc].cc); Tcl_ListObjAppendElement(sms_interp, row, Tcl_NewStringObj(s, -1)); Free(s); } } } /* Return it. */ if (row) { if (o) { Tcl_ListObjAppendElement(sms_interp, o, row); Tcl_SetObjResult(sms_interp, o); } else { Tcl_SetObjResult(sms_interp, row); } } } static bool dump_fixed(const char **params, unsigned count, const char *name, bool in_ascii, struct ea *buf, int rel_rows, int rel_cols, int caddr) { int row, col, len, rows = 0, cols = 0; switch (count) { case 0: /* everything */ row = 0; col = 0; len = rel_rows*rel_cols; break; case 1: /* from cursor, for n */ row = caddr / rel_cols; col = caddr % rel_cols; len = atoi(params[0]); break; case 3: /* from (row,col), for n */ row = atoi(params[0]); col = atoi(params[1]); len = atoi(params[2]); break; case 4: /* from (row,col), for rows x cols */ row = atoi(params[0]); col = atoi(params[1]); rows = atoi(params[2]); cols = atoi(params[3]); len = 0; break; default: popup_an_error("%s requires 0, 1, 3 or 4 arguments", name); return false; } if ( (row < 0 || row > rel_rows || col < 0 || col > rel_cols || len < 0) || ((count < 4) && ((row * rel_cols) + col + len > rel_rows * rel_cols)) || ((count == 4) && (cols < 0 || rows < 0 || col + cols > rel_cols || row + rows > rel_rows)) ) { popup_an_error("%s: Invalid argument", name); return false; } if (count < 4) { dump_range((row * rel_cols) + col, len, in_ascii, buf, rel_rows, rel_cols); } else { dump_rectangle(row, col, rows, cols, in_ascii, buf, rel_cols); } return true; } static bool dump_field(unsigned count, const char *name, bool in_ascii) { int start, baddr; int len = 0; if (count != 0) { popup_an_error("%s requires 0 arguments", name); return false; } if (!formatted) { popup_an_error("%s: Screen is not formatted", name); return false; } start = find_field_attribute(cursor_addr); INC_BA(start); baddr = start; do { if (ea_buf[baddr].fa) { break; } len++; INC_BA(baddr); } while (baddr != start); dump_range(start, len, in_ascii, ea_buf, ROWS, COLS); return true; } static bool Ascii_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Ascii", ia, argc, argv); return dump_fixed(argv, argc, "Ascii", true, ea_buf, ROWS, COLS, cursor_addr); } static bool AsciiField_action(ia_t ia, unsigned argc, const char **argv) { action_debug("AsciiField", ia, argc, argv); return dump_field(argc, "AsciiField", true); } static bool Ebcdic_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Ebcdic", ia, argc, argv); return dump_fixed(argv, argc, "Ebcdic", false, ea_buf, ROWS, COLS, cursor_addr); } static bool EbcdicField_action(ia_t ia, unsigned argc, const char **argv) { action_debug("EbcdicField", ia, argc, argv); return dump_field(argc, "EbcdicField", false); } /* "Status" action, returns the s3270 prompt. */ static char * status_string(void) { char kb_stat; char fmt_stat; char prot_stat; char *connect_stat; char em_mode; if (!kybdlock) { kb_stat = 'U'; } else if (!CONNECTED || KBWAIT) { kb_stat = 'L'; } else { kb_stat = 'E'; } if (formatted) { fmt_stat = 'F'; } else { fmt_stat = 'U'; } if (!formatted) { prot_stat = 'U'; } else { unsigned char fa; fa = get_field_attribute(cursor_addr); if (FA_IS_PROTECTED(fa)) { prot_stat = 'P'; } else { prot_stat = 'U'; } } if (CONNECTED) { connect_stat = lazyaf("C(%s)", current_host); } else { connect_stat = "N"; } if (CONNECTED) { if (IN_NVT) { if (linemode) { em_mode = 'L'; } else { em_mode = 'C'; } } else if (IN_SSCP) { em_mode = 'S'; } else if (IN_3270) { em_mode = 'I'; } else { em_mode = 'P'; } } else { em_mode = 'N'; } return xs_buffer("%c %c %c %s %c %d %d %d %d %d", kb_stat, fmt_stat, prot_stat, connect_stat, em_mode, model_num, ROWS, COLS, cursor_addr / COLS, cursor_addr % COLS); } static bool Status_action(ia_t ia, unsigned argc, const char **argv) { char *s; action_debug("Status", ia, argc, argv); if (check_argc("Status", argc, 0, 0) < 0) { return false; } s = status_string(); Tcl_SetResult(sms_interp, s, TCL_VOLATILE); Free(s); return true; } static unsigned char calc_cs(unsigned char cs) { switch (cs & CS_MASK) { case CS_APL: return 0xf1; case CS_LINEDRAW: return 0xf2; case CS_DBCS: return 0xf8; default: return 0x00; } } /* * Internals of the ReadBuffer action. * Operates on the supplied 'buf' parameter, which might be the live * screen buffer 'ea_buf' or a copy saved with 'Snap'. */ static bool do_read_buffer(const char **params, unsigned num_params, struct ea *buf) { Tcl_Obj *o = NULL; Tcl_Obj *row = NULL; int baddr; unsigned char current_fg = 0x00; unsigned char current_bg = 0x00; unsigned char current_gr = 0x00; unsigned char current_cs = 0x00; unsigned char current_ic = 0x00; varbuf_t r; char *rbuf; bool in_ebcdic = false; if (num_params > 0) { if (num_params > 1) { popup_an_error("ReadBuffer: extra agruments"); return false; } if (!strncasecmp(params[0], "Ascii", strlen(params[0]))) in_ebcdic = false; else if (!strncasecmp(params[0], "Ebcdic", strlen(params[0]))) in_ebcdic = true; else { popup_an_error("ReadBuffer: first parameter must be Ascii or " "Ebcdic"); return false; } } vb_init(&r); baddr = 0; do { if (!(baddr % COLS)) { /* New row. */ if (o == NULL) { o = Tcl_NewListObj(0, NULL); } if (row != NULL) { Tcl_ListObjAppendElement(sms_interp, o, row); } row = Tcl_NewListObj(0, NULL); } if (buf[baddr].fa) { vb_appendf(&r, "SF(%02x=%02x", XA_3270, buf[baddr].fa); if (buf[baddr].fg) { vb_appendf(&r, ",%02x=%02x", XA_FOREGROUND, buf[baddr].fg); } if (buf[baddr].bg) { vb_appendf(&r, ",%02x=%02x", XA_BACKGROUND, buf[baddr].bg); } if (buf[baddr].gr) { vb_appendf(&r, ",%02x=%02x", XA_HIGHLIGHTING, buf[baddr].gr | 0xf0); } if (buf[baddr].ic) { vb_appendf(&r, ",%02x=%02x", XA_INPUT_CONTROL, buf[baddr].ic); } if (buf[baddr].cs & CS_MASK) { vb_appendf(&r, ",%02x=%02x", XA_CHARSET, calc_cs(buf[baddr].cs)); } vb_appends(&r, ")"); Tcl_ListObjAppendElement(sms_interp, row, Tcl_NewStringObj(vb_consume(&r), -1)); } else { bool any_sa = false; # define SA_SEP (any_sa? ",": "SA(") if (buf[baddr].fg != current_fg) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_FOREGROUND, buf[baddr].fg); current_fg = buf[baddr].fg; any_sa = true; } if (buf[baddr].bg != current_bg) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_BACKGROUND, buf[baddr].bg); current_bg = buf[baddr].bg; any_sa = true; } if (buf[baddr].gr != current_gr) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_HIGHLIGHTING, buf[baddr].gr | 0xf0); current_gr = buf[baddr].gr; any_sa = true; } if (buf[baddr].ic != current_ic) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_INPUT_CONTROL, buf[baddr].ic); current_ic = buf[baddr].ic; any_sa = true; } if ((buf[baddr].cs & ~CS_GE) != (current_cs & ~CS_GE)) { vb_appendf(&r, "%s%02x=%02x", SA_SEP, XA_CHARSET, calc_cs(buf[baddr].cs)); current_cs = buf[baddr].cs; any_sa = true; } if (any_sa) { vb_appends(&r, ")"); Tcl_ListObjAppendElement(sms_interp, row, Tcl_NewStringObj(vb_consume(&r), -1)); } if (in_ebcdic) { if (buf[baddr].cs & CS_GE) { rbuf = xs_buffer("GE(%02x)", buf[baddr].cc); } else { rbuf = xs_buffer("%02x", buf[baddr].cc); } Tcl_ListObjAppendElement(sms_interp, row, Tcl_NewStringObj(rbuf, -1)); Free(rbuf); } else { int len; char mb[16]; int j; ucs4_t uc; if (IS_LEFT(ctlr_dbcs_state(baddr))) { len = ebcdic_to_multibyte((buf[baddr].cc << 8) | buf[baddr + 1].cc, mb, sizeof(mb)); for (j = 0; j < len - 1; j++) { vb_appendf(&r, "%02x", mb[j] & 0xff); } } else if (IS_RIGHT(ctlr_dbcs_state(baddr))) { vb_appends(&r, " -"); } else if (buf[baddr].cc == EBC_null) { vb_appends(&r, "00"); } else { len = ebcdic_to_multibyte_x(buf[baddr].cc, buf[baddr].cs & CS_MASK, mb, sizeof(mb), EUO_BLANK_UNDEF, &uc); for (j = 0; j < len - 1; j++) { vb_appendf(&r, "%02x", mb[j] & 0xff); } } Tcl_ListObjAppendElement(sms_interp, row, Tcl_NewStringObj(vb_consume(&r), -1)); } } INC_BA(baddr); } while (baddr != 0); if (row) { if (o) { Tcl_ListObjAppendElement(sms_interp, o, row); Tcl_SetObjResult(sms_interp, o); } else { Tcl_SetObjResult(sms_interp, row); } } return true; } /* * ReadBuffer action. */ static bool ReadBuffer_action(ia_t ia, unsigned argc, const char **argv) { action_debug("ReadBuffer", ia, argc, argv); return do_read_buffer(argv, argc, ea_buf); } /* * "Snap" action, maintains a snapshot for consistent multi-field comparisons: * * Snap Save * updates the saved image from the live image * Snap Rows * returns the number of rows * Snap Cols * returns the number of columns * Snap Staus * Snap Ascii ... * Snap AsciiField (not yet) * Snap Ebcdic ... * Snap EbcdicField (not yet) * runs the named command * Snap Wait [tmo] Output * waits for the screen to change */ static char *snap_status = NULL; static struct ea *snap_buf = NULL; static int snap_rows = 0; static int snap_cols = 0; static int snap_field_start = -1; static int snap_field_length = -1; static int snap_caddr = 0; static void snap_save(void) { output_wait_needed = true; Replace(snap_status, status_string()); Replace(snap_buf, (struct ea *)Malloc(sizeof(struct ea) * ROWS*COLS)); (void) memcpy(snap_buf, ea_buf, sizeof(struct ea) * ROWS*COLS); snap_rows = ROWS; snap_cols = COLS; if (!formatted) { snap_field_start = -1; snap_field_length = -1; } else { int baddr; snap_field_length = 0; snap_field_start = find_field_attribute(cursor_addr); INC_BA(snap_field_start); baddr = snap_field_start; do { if (ea_buf[baddr].fa) { break; } snap_field_length++; INC_BA(baddr); } while (baddr != snap_field_start); } snap_caddr = cursor_addr; } static bool Snap_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Snap", ia, argc, argv); if (argc == 0) { snap_save(); return true; } /* Handle 'Snap Wait' separately. */ if (!strcasecmp(argv[0], "Wait")) { long tmo = -1; char *ptr; unsigned maxp = 0; if (argc > 1 && (tmo = strtol(argv[1], &ptr, 10)) >= 0 && ptr != argv[0] && *ptr == '\0') { maxp = 3; } else { tmo = -1; maxp = 2; } if (argc > maxp) { popup_an_error("Too many arguments to Snap(Wait)"); return false; } if (argc < maxp) { popup_an_error("Too few arguments to Snap(Wait)"); return false; } if (strcasecmp(argv[argc - 1], "Output")) { popup_an_error("Unknown parameter to Snap(Wait)"); return false; } /* Must be connected. */ if (!(CONNECTED || HALF_CONNECTED)) { popup_an_error("Snap: Not connected"); return false; } /* * Make sure we need to wait. * If we don't, then Snap Wait Output is equivalen to Snap Save. */ if (!output_wait_needed) { snap_save(); return false; } /* Set the new state. */ waiting = AWAITING_SOUTPUT; /* Set up a timeout, if they want one. */ if (tmo >= 0) { wait_id = AddTimeOut(tmo? (tmo * 1000): 1, wait_timed_out); } return true; } if (!strcasecmp(argv[0], "Save")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } snap_save(); } else if (!strcasecmp(argv[0], "Status")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } if (snap_status == NULL) { popup_an_error("No saved state"); return false; } Tcl_SetResult(sms_interp, snap_status, TCL_VOLATILE); } else if (!strcasecmp(argv[0], "Rows")) { if (argc != 1) { popup_an_error("Extra argument(s)"); return false; } if (snap_status == NULL) { popup_an_error("No saved state"); return false; } Tcl_SetResult(sms_interp, lazyaf("%d", snap_rows), TCL_VOLATILE); } else if (!strcasecmp(argv[0], "Cols")) { if (argc != 1) { popup_an_error("extra argument(s)"); return false; } Tcl_SetResult(sms_interp, lazyaf("%d", snap_cols), TCL_VOLATILE); } else if (!strcasecmp(argv[0], "Ascii")) { if (snap_status == NULL) { popup_an_error("No saved state"); return false; } return dump_fixed(argv + 1, argc - 1, "Ascii", true, snap_buf, snap_rows, snap_cols, snap_caddr); } else if (!strcasecmp(argv[0], "Ebcdic")) { if (snap_status == NULL) { popup_an_error("No saved state"); return false; } return dump_fixed(argv + 1, argc - 1, "Ebcdic", false, snap_buf, snap_rows, snap_cols, snap_caddr); } else if (!strcasecmp(argv[0], "ReadBuffer")) { if (snap_status == NULL) { popup_an_error("No saved state"); return false; } return do_read_buffer(argv + 1, argc - 1, snap_buf); } else { popup_an_error("Snap: Argument must be Save, Status, Rows, Cols, " "Wait, Ascii, Ebcdic or ReadBuffer"); return false; } return true; } static void wait_timed_out(ioid_t id _is_unused) { popup_an_error("Wait timed out"); wait_id = NULL_IOID; UNBLOCK(); } static bool Wait_action(ia_t ia, unsigned argc, const char **argv) { float tmo = -1.0; char *ptr; unsigned np; const char **pr; action_debug("Wait", ia, argc, argv); if (argc > 0 && (tmo = strtof(argv[0], &ptr)) >= 0.0 && ptr != argv[0] && *ptr == '\0') { np = argc - 1; pr = argv + 1; } else { tmo = -1.0; np = argc; pr = argv; } if (np == 0) { if (!CONNECTED) { popup_an_error("Not connected"); return false; } if (!INPUT_OKAY) { waiting = AWAITING_IFIELD; } return true; } if (np != 1) { popup_an_error("Too many parameters"); return true; } if (!strcasecmp(pr[0], "InputField")) { /* Same as no parameters. */ if (!CONNECTED) { popup_an_error("Not connected"); return false; } if (!INPUT_OKAY) { waiting = AWAITING_IFIELD; } } else if (!strcasecmp(pr[0], "Output")) { if (!CONNECTED) { popup_an_error("Not connected"); return false; } if (output_wait_needed) { waiting = AWAITING_OUTPUT; } } else if (!strcasecmp(pr[0], "3270") || !strcasecmp(pr[0], "3270Mode")) { if (!CONNECTED) { popup_an_error("Not connected"); return false; } if (!IN_3270) { waiting = AWAITING_3270; } } else if (!strcasecmp(pr[0], "ansi") || !strcasecmp(pr[0], "NVTMode")) { if (!CONNECTED) { popup_an_error("Not connected"); return false; } if (!IN_NVT) { waiting = AWAITING_NVT; } } else if (!strcasecmp(pr[0], "Disconnect")) { if (CONNECTED) { waiting = AWAITING_DISCONNECT; } } else if (!strcasecmp(pr[0], "Unlock")) { if (CONNECTED && KBWAIT) { waiting = AWAITING_UNLOCK; } } else { popup_an_error("Unknown Wait type: %s", pr[0]); return false; } if (waiting != NOT_WAITING && tmo >= 0.0) { unsigned long tmo_msec = tmo * 1000; if (tmo_msec == 0) { tmo_msec = 1; } wait_id = AddTimeOut(tmo_msec, wait_timed_out); } return true; } static int Rows_cmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *buf; if (objc > 1) { Tcl_SetResult(interp, "Too many arguments", TCL_STATIC); return TCL_ERROR; } buf = xs_buffer("%d", ROWS); Tcl_SetResult(interp, buf, TCL_VOLATILE); Free(buf); return TCL_OK; } static int Cols_cmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *buf; if (objc > 1) { Tcl_SetResult(interp, "Too many arguments", TCL_STATIC); return TCL_ERROR; } buf = xs_buffer("%d", COLS); Tcl_SetResult(interp, buf, TCL_VOLATILE); Free(buf); return TCL_OK; } static bool Query_action(ia_t ia, unsigned argc, const char **argv) { Tcl_Obj *q_obj; char *s; char *t; static struct { char *name; const char *(*fn)(void); char *string; } queries[] = { { "BindPluName", net_query_bind_plu_name, NULL }, { "ConnectionState", net_query_connection_state, NULL }, { "CodePage", get_host_codepage, NULL }, { "Cursor", ctlr_query_cursor, NULL }, { "Formatted", ctlr_query_formatted, NULL }, { "Host", net_query_host, NULL }, { "LocalEncoding", get_codeset, NULL }, { "LuName", net_query_lu_name, NULL }, { "Model", NULL, full_model_name }, { "ScreenCurSize", ctlr_query_cur_size, NULL }, { "ScreenMaxSize", ctlr_query_max_size, NULL }, { "Ssl", net_query_ssl, NULL }, { NULL, NULL } }; int i; action_debug("Query", ia, argc, argv); if (check_argc("Query", argc, 0, 1) < 0) { return false; } switch (argc) { case 0: q_obj = Tcl_NewListObj(0, NULL); for (i = 0; queries[i].name != NULL; i++) { t = (char *)(queries[i].fn? (*queries[i].fn)(): queries[i].string); if (t && *t) { s = xs_buffer("%s %s", queries[i].name, t); } else { s = xs_buffer("%s", queries[i].name); } Tcl_ListObjAppendElement(sms_interp, q_obj, Tcl_NewStringObj(s, strlen(s))); Free(s); } Tcl_SetObjResult(sms_interp, q_obj); break; case 1: for (i = 0; queries[i].name != NULL; i++) { if (!strcasecmp(argv[0], queries[i].name)) { s = (char *)(queries[i].fn? (*queries[i].fn)(): queries[i].string); Tcl_SetResult(sms_interp, *s? s: "", TCL_VOLATILE); return true; } } popup_an_error("Query: Unknown parameter"); return false; } return true; } /* Generate a response to a script command. */ void sms_info(const char *fmt, ...) { va_list args; char *buf; va_start(args, fmt); buf = xs_vbuffer(fmt, args); va_end(args); Tcl_AppendResult(sms_interp, buf, NULL); Free(buf); } /* * Return true if there is a pending macro. */ bool sms_in_macro(void) { return pending_string != NULL; } /* Like fcatv, but goes to a dynamically-allocated buffer. */ static char * tc_scatv(const char *s) { char c; varbuf_t r; vb_init(&r); while ((c = *s++)) { switch (c) { case '\n': vb_appends(&r, "\\n"); break; case '\t': vb_appends(&r, "\\t"); break; case '\b': vb_appends(&r, "\\b"); break; case '\f': vb_appends(&r, "\\f"); break; case ' ': vb_appends(&r, "\\ "); break; default: if ((c & 0x7f) < ' ') { vb_appendf(&r, "\\%03o", c & 0xff); break; } else { vb_append(&r, &c, 1); } } } return vb_consume(&r); } /* Dummy version of function in macros.c. */ void cancel_if_idle_command(void) { } /* Dummy idle.c function. */ void idle_ft_complete(void) { } /* Dummy idle.c function. */ void idle_ft_start(void) { } /** * Set product-specific appres defaults. */ void product_set_appres_defaults(void) { appres.oerr_lock = true; appres.unlock_delay = false; } /** * Registration for tcl3270 main module. */ static void tcl3270_register(void) { static toggle_register_t toggles[] = { { AID_WAIT, NULL, 0 } }; static action_table_t actions[] = { { "Ascii", Ascii_action, ACTION_KE }, { "AsciiField", AsciiField_action, ACTION_KE }, { "Ebcdic", Ebcdic_action, ACTION_KE }, { "EbcdicField", EbcdicField_action, ACTION_KE }, { "Status", Status_action, ACTION_KE }, { "ReadBuffer", ReadBuffer_action, ACTION_KE }, { "Snap", Snap_action, ACTION_KE }, { "Wait", Wait_action, ACTION_KE }, { "Query", Query_action, ACTION_KE } }; static res_t tcl3270_resources[] = { { ResCommandTimeout, aoffset(tcl3270.command_timeout), XRM_INT } }; /* Register our toggles. */ register_toggles(toggles, array_count(toggles)); /* Register for state changes. */ register_schange(ST_CONNECT, tcl3270_connect); register_schange(ST_3270_MODE, tcl3270_connect); /* Register our actions. */ register_actions(actions, array_count(actions)); /* Register our resources. */ register_resources(tcl3270_resources, array_count(tcl3270_resources)); } suite3270-3.6/tcl3270/tcl3270_files.mk0000664000076500007650000000011113221577163015074 0ustar pdmpdm# tcl3270-specific object files TCL3270_OBJECTS = idle_stubs.o tcl3270.o suite3270-3.6/tcl3270/tcl3270.man0000664000076500007650000010347213221600610014054 0ustar pdmpdm'\" t .TH tcl3270 1 "29 December 2017" .SH "NAME" tcl3270 \- \s-1IBM\s+1 host access tool .SH "SYNOPSIS" \fBtcl3270\fP [\fIscript\fP] [\fIoptions\fP] [\fIhost\fP] [\-\- \fIscript-arg\fP...] .br \fBtcl3270\fP [\fIoptions\fP] [\fIscript\fP] \fIsession-file\fP.tcl3270 [\-\- \fIscript-arg\fP...] .SH "DESCRIPTION" \fBtcl3270\fP opens a telnet connection to an \s-1IBM\s+1 host, then allows a tcl script to control the host login session. It is derived from \fIx3270\fP(1), an X-windows IBM 3270 emulator. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The full syntax for \fIhost\fP is: .RS [\fIprefix\fP:]...[\fILUname\fP@]\fIhostname\fP[:\fIport\fP][=\fIaccept\fP] .RE .LP Prepending a \fBP:\fP onto \fIhostname\fP causes the connection to go through the \fItelnet-passthru\fP service rather than directly to the host. See \s-1PASSTHRU\s+1 below. .LP Prepending an \fBS:\fP onto \fIhostname\fP removes the "extended data stream" option reported to the host. See \fB\-tn\fP below for further information. .LP Prepending an \fBN:\fP onto \fIhostname\fP turns off TN3270E support for the session. .LP Prepending an \fBL:\fP onto \fIhostname\fP causes \fBtcl3270\fP to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if \fBtcl3270\fP was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the \fBL:\fP prefix should not be used. .LP Prepending a \fBY:\fP onto \fIhostname\fP causes \fBtcl3270\fP to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. .LP Prepending an \fBA:\fP onto \fIhostname\fP is equivalent to setting the \fB\-nvt\fP option; it forces an NVT-mode session instead of a 3270-mode session. .LP A specific Logical Unit (LU) name to use may be specified by prepending it to the \fIhostname\fP with an `\fB@\fP'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) .LP The \fIhostname\fP may optionally be placed inside square-bracket characters `\fB[\fP' and `\fB]\fP'. This will prevent any colon `\fB:\fP' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. .LP On systems that support the \fIforkpty\fP library call, the \fIhostname\fP may be replaced with \fB\-e\fP and a command string. This will cause \fBtcl3270\fP to connect to a local child process, such as a shell. .LP The port to connect to defaults to \fBtelnet\fP. This can be overridden with the \fB\-port\fP option, or by appending a \fIport\fP to the \fIhostname\fP with a colon `\fB:\fP'. (For compatability with previous versions of \fBtcl3270\fP and with \fItn3270\fP(1), the \fIport\fP may also be specified as a second, separate argument.) .LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`\fB=\fP'). The accept name can also be specified with the \fB\-accepthostname\fP option. .SH "OPTIONS" \fBtcl3270\fP understands the following options: .TP \fB\-accepthostname\fP \fIname\fP Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. .TP \fB\-cadir\fP \fIdirectory\fP Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) .TP \fB\-cafile\fP \fIfilename\fP Specifies a \s-1PEM\s+1-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) .TP \fB\-certfile\fP \fIfilename\fP Specifies a file containing a client certificate to provide to the host. The default file type is \s-1PEM\s+1. .TP \fB\-clientcert\fP \fIname\fP Specifies the name of a client certificate to provide to the host. (MacOS only) .TP \fB\-certfiletype\fP \fItype\fP Specifies the type of the certificate file specified by \fB\-certfile\fP. \fIType\fP can be \fBpem\fP or \fBasn1\fP. (OpenSSL only) .TP \fB\-chainfile \fIfilename\fP\fP Specifies a certificate chain file in \s-1PEM\s+1 format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If \fB\-chainfile\fP is specified, it overrides \fB\-certfile\fP. (OpenSSL only) .TP \fB\-charset\fP \fIname\fP Specifies an \s-1EBCDIC\s+1 host character set. .TP \fB\-clear\fP \fItoggle\fP Sets the initial value of \fItoggle\fP to \fBfalse\fP. .TP \fB\-connecttimeout\fP \fIseconds\fP Specifies the time that tcl3270 will wait for a host connection to complete. .TP \fB\-devname\fP \fIname\fP Specifies a device name (workstation ID) for RFC 4777 support. .TP \fB\-keyfile\fP \fIfilename\fP Specifies a file containing the private key for the certificate file (specified via \fB\-certfile\fP or \fB\-chainfile\fP). The default file type is \s-1PEM\s+1. (OpenSSL only) .TP \fB\-keyfiletype\fP \fItype\fP Specifies the type of the private key file specified by \fB\-keyfile\fP. \fIType\fP can be \fBpem\fP or \fBasn1\fP. (OpenSSL only) .TP \fB\-keypasswd\fP \fItype\fP:\fIvalue\fP Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be \fBfile\fP:\fIfilename\fP, specifying that the password is in a file, or \fBstring\fP:\fIstring\fP, specifying the password on the command-line directly. If the private key file is encrypted and no \fB\-keypasswd\fP option is given, secure connections will not be allowed. .TP \fB\-km\fP \fIname\fP Specifies the local encoding method for multi-byte text. \fIname\fP is an encoding name recognized by the ICU library. (Supported only when tcl3270 is compiled with DBCS support, and necessary only when tcl3270 cannot figure it out from the locale.) .TP \fB\-loginmacro\fP \fIAction(arg...) ...\fP Specifies a macro to run at login time. .TP \fB\-model\fP \fIname\fP The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: .IP The first part is the \fBbase model\fP, which is either \fB3278\fP or \fB3279\fP. \fB3278\fP specifies a monochrome (green on black) 3270 display; \fB3279\fP specifies a color 3270 display. .IP The second part is the \fBmodel number\fP, which specifies the number of rows and columns. Model 4 is the default. .PP .TS center; c c c . T{ .na .nh Model Number T} T{ .na .nh Columns T} T{ .na .nh Rows T} _ T{ .na .nh 2 T} T{ .na .nh 80 T} T{ .na .nh 24 T} T{ .na .nh 3 T} T{ .na .nh 80 T} T{ .na .nh 32 T} T{ .na .nh 4 T} T{ .na .nh 80 T} T{ .na .nh 43 T} T{ .na .nh 5 T} T{ .na .nh 132 T} T{ .na .nh 27 T} .TE .IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. .IP The default model is \fB3279\-4\fP. .TP \fB\-noverifycert\fP For SSL/TLS connections, do not verify the host certificate. .TP \fB\-nvt\fP Start in NVT mode instead of waiting for the host to send data, and make the default terminal type \fBxterm\fP. .TP \fB\-oversize\fP \fIcols\fP\fBx\fP\fIrows\fP Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "tcl3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. .TP \fB\-port\fP \fIn\fP Specifies a different \s-1TCP\s+1 port to connect to. \fIn\fP can be a name from \fB/etc/services\fP like \fBtelnet\fP, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) .TP \fB\-proxy \fItype\fP:\fIhost\fP[:\fIport\fP]\fP Causes \fBtcl3270\fP to connect via the specified proxy, instead of using a direct connection. The \fIhost\fP can be an IP address or hostname. The optional \fIport\fP can be a number or a service name. For a list of supported proxy \fItypes\fP, see \s-1PROXY\s+1 below. .TP \fB\-set\fP \fItoggle\fP Sets the initial value of \fItoggle\fP to \fBtrue\fP. The \fB\-p\fP option of \fIx3270if\fP causes it to use this socket, instead of pipes specified by environment variables. .TP \fB\-tn\fP \fIname\fP Specifies the terminal name to be transmitted over the telnet connection. The default name is \fBIBM\-\fP\fImodel_name\fP\fB\-E\fP, for example, \fBIBM\-3278\-4\-E\fP. .IP Some hosts are confused by the \fB\-E\fP suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an \fBs:\fP on the hostname, or setting the "tcl3270.extended" resource to "false", removes the \fB\-E\fP from the terminal name when connecting to such hosts. .IP The name can also be specified with the "tcl3270.termName" resource. .TP \fB\-trace\fP Turns on data stream and event tracing at startup. The default trace file name is \fB/tmp/x3trc\fP. .TP \fB\-tracefile\fP \fIfile\fP Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file. .TP \fB\-tracefilesize\fP \fIsize\fP Places a limit on the size of a trace file. If this option is not specified, or is specified as \fB0\fP or \fBnone\fP, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of \fIsize\fP can have a \fBK\fP or \fBM\fP suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started. .TP \fB\-user\fP \fIname\fP Specifies the user name for RFC 4777 support. .TP \fB\-v\fP Display the version and build options for \fBtcl3270\fP and exit. .TP \fB\-verifycert\fP For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a \fBy:\fP prepended to the hostname when connecting. .TP \fB\-xrm\fP "tcl3270.\fIresource\fP: \fIvalue\fP" Sets the value of the named \fIresource\fP to \fIvalue\fP. Resources control less common \fBtcl3270\fP options, and are defined under \s-1RESOURCES\s+1 below. .TP \fB\-\-\fP Terminates the list of \fBtcl3270\fP options. Whatever follows will be available to the script in the \fB$argv\fP tcl variable. .SH "COMMANDS" \fBtcl3270\fP supports the following additional tcl commands: ).PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. .PP .TS center; lw(3i) lw(3i). T{ .na .nh .in +2 .ti -2 Ascii T} T{ .na .nh return entire screen contents as text T} T{ .na .nh .in +2 .ti -2 Ascii \fIlength\fP T} T{ .na .nh return screen contents at cursor as text T} T{ .na .nh .in +2 .ti -2 Ascii \fIrow\fP \fIcol\fP \fIlength\fP T} T{ .na .nh return screen contents as text T} T{ .na .nh .in +2 .ti -2 Ascii \fIrow\fP \fIcol\fP \fIrows\fP \fIcols\fP T} T{ .na .nh return screen region as text T} T{ .na .nh .in +2 .ti -2 AsciiField T} T{ .na .nh return current field as text T} T{ .na .nh .in +2 .ti -2 *Attn T} T{ .na .nh attention key T} T{ .na .nh .in +2 .ti -2 BackSpace T} T{ .na .nh move cursor left (or send \s-1ASCII BS\s+1) T} T{ .na .nh .in +2 .ti -2 BackTab T} T{ .na .nh tab to start of previous input field T} T{ .na .nh .in +2 .ti -2 CircumNot T} T{ .na .nh input "^" in \s-1NVT\s+1 mode, or "notsign" in 3270 mode T} T{ .na .nh .in +2 .ti -2 *Clear T} T{ .na .nh clear screen T} T{ .na .nh .in +2 .ti -2 Cols T} T{ .na .nh report screen size T} T{ .na .nh .in +2 .ti -2 *Connect \fIhost\fP T} T{ .na .nh connect to \fIhost\fP T} T{ .na .nh .in +2 .ti -2 *CursorSelect T} T{ .na .nh Cursor Select \s-1AID\s+1 T} T{ .na .nh .in +2 .ti -2 Delete T} T{ .na .nh delete character under cursor (or send \s-1ASCII DEL\s+1) T} T{ .na .nh .in +2 .ti -2 DeleteField T} T{ .na .nh delete the entire field T} T{ .na .nh .in +2 .ti -2 DeleteWord T} T{ .na .nh delete the current or previous word T} T{ .na .nh .in +2 .ti -2 *Disconnect T} T{ .na .nh disconnect from host T} T{ .na .nh .in +2 .ti -2 Down T} T{ .na .nh move cursor down T} T{ .na .nh .in +2 .ti -2 Dup T} T{ .na .nh duplicate field T} T{ .na .nh .in +2 .ti -2 Ebcdic T} T{ .na .nh return entire screen contents in \s-1EBCDIC\s+1 T} T{ .na .nh .in +2 .ti -2 Ebcdic \fIlength\fP T} T{ .na .nh return screen contents at cursor in \s-1EBCDIC\s+1 T} T{ .na .nh .in +2 .ti -2 Ebcdic \fIrow\fP \fIcol\fP \fIlength\fP T} T{ .na .nh return screen contents in \s-1EBCDIC\s+1 T} T{ .na .nh .in +2 .ti -2 Ebcdic \fIrow\fP \fIcol\fP \fIrows\fP \fIcols\fP T} T{ .na .nh return screen region in \s-1EBCDIC\s+1 T} T{ .na .nh .in +2 .ti -2 EbcdicField T} T{ .na .nh return current field in \s-1EBCDIC\s+1 T} T{ .na .nh .in +2 .ti -2 *Enter T} T{ .na .nh Enter \s-1AID\s+1 (or send \s-1ASCII CR\s+1) T} T{ .na .nh .in +2 .ti -2 Erase T} T{ .na .nh erase previous character (or send \s-1ASCII BS\s+1) T} T{ .na .nh .in +2 .ti -2 EraseEOF T} T{ .na .nh erase to end of current field T} T{ .na .nh .in +2 .ti -2 EraseInput T} T{ .na .nh erase all input fields T} T{ .na .nh .in +2 .ti -2 FieldEnd T} T{ .na .nh move cursor to end of field T} T{ .na .nh .in +2 .ti -2 FieldMark T} T{ .na .nh mark field T} T{ .na .nh .in +2 .ti -2 HexString \fIhex_digits\fP T} T{ .na .nh insert control-character string T} T{ .na .nh .in +2 .ti -2 Home T} T{ .na .nh move cursor to first input field T} T{ .na .nh .in +2 .ti -2 Insert T} T{ .na .nh set insert mode T} T{ .na .nh .in +2 .ti -2 *Interrupt T} T{ .na .nh send \s-1TELNET IP\s+1 to host T} T{ .na .nh .in +2 .ti -2 Key \fIkeysym\fP T} T{ .na .nh insert key \fIkeysym\fP T} T{ .na .nh .in +2 .ti -2 Key 0x\fIxx\fP T} T{ .na .nh insert key with character code \fIxx\fP T} T{ .na .nh .in +2 .ti -2 Left T} T{ .na .nh move cursor left T} T{ .na .nh .in +2 .ti -2 Left2 T} T{ .na .nh move cursor left 2 positions T} T{ .na .nh .in +2 .ti -2 MonoCase T} T{ .na .nh toggle uppercase-only mode T} T{ .na .nh .in +2 .ti -2 MoveCursor \fIrow\fP \fIcol\fP T} T{ .na .nh move cursor to zero-origin (\fIrow\fP,\fIcol\fP) T} T{ .na .nh .in +2 .ti -2 Newline T} T{ .na .nh move cursor to first field on next line (or send \s-1ASCII LF\s+1) T} T{ .na .nh .in +2 .ti -2 NextWord T} T{ .na .nh move cursor to next word T} T{ .na .nh .in +2 .ti -2 *PA \fIn\fP T} T{ .na .nh Program Attention \s-1AID\s+1 (\fIn\fP from 1 to 3) T} T{ .na .nh .in +2 .ti -2 *PF \fIn\fP T} T{ .na .nh Program Function \s-1AID\s+1 (\fIn\fP from 1 to 24) T} T{ .na .nh .in +2 .ti -2 PreviousWord T} T{ .na .nh move cursor to previous word T} T{ .na .nh .in +2 .ti -2 Quit T} T{ .na .nh exit \fBtcl3270\fP T} T{ .na .nh .in +2 .ti -2 Redraw T} T{ .na .nh redraw window T} T{ .na .nh .in +2 .ti -2 Reset T} T{ .na .nh reset locked keyboard T} T{ .na .nh .in +2 .ti -2 Right T} T{ .na .nh move cursor right T} T{ .na .nh .in +2 .ti -2 Right2 T} T{ .na .nh move cursor right 2 positions T} T{ .na .nh .in +2 .ti -2 ReadBuffer Ascii T} T{ .na .nh dump screen buffer as text T} T{ .na .nh .in +2 .ti -2 ReadBuffer Ebcdic T} T{ .na .nh dump screen buffer in EBCDIC T} T{ .na .nh .in +2 .ti -2 Rows T} T{ .na .nh report screen size T} T{ .na .nh .in +2 .ti -2 Snap T} T{ .na .nh same as \fBSnap Save\fP T} T{ .na .nh .in +2 .ti -2 Snap Ascii T} T{ .na .nh report saved screen data (see \fBAscii\fP) T} T{ .na .nh .in +2 .ti -2 Snap Cols T} T{ .na .nh report saved screen size T} T{ .na .nh .in +2 .ti -2 Snap Ebcdic T} T{ .na .nh report saved screen data (see \fBEbcdic\fP) T} T{ .na .nh .in +2 .ti -2 Snap ReadBuffer T} T{ .na .nh report saved screen data (see \fBReadBuffer\fP) T} T{ .na .nh .in +2 .ti -2 Snap Rows T} T{ .na .nh report saved screen size T} T{ .na .nh .in +2 .ti -2 Snap Save T} T{ .na .nh save screen image T} T{ .na .nh .in +2 .ti -2 Snap Status T} T{ .na .nh report saved connection status T} T{ .na .nh .in +2 .ti -2 *Snap Wait [\fItimeout\fP] Output T} T{ .na .nh wait for host output and save screen image T} T{ .na .nh .in +2 .ti -2 Status T} T{ .na .nh report connection status T} T{ .na .nh .in +2 .ti -2 *String \fIstring\fP T} T{ .na .nh insert string (simple macro facility) T} T{ .na .nh .in +2 .ti -2 Tab T} T{ .na .nh move cursor to next input field T} T{ .na .nh .in +2 .ti -2 Toggle \fIoption\fP[ T} T{ .na .nh toggle an option T} T{ .na .nh .in +2 .ti -2 ToggleInsert T} T{ .na .nh toggle insert mode T} T{ .na .nh .in +2 .ti -2 ToggleReverse T} T{ .na .nh toggle reverse-input mode T} T{ .na .nh .in +2 .ti -2 *Transfer \fIoption\fP=\fIvalue\fP...' T} T{ .na .nh file transfer T} T{ .na .nh .in +2 .ti -2 Up T} T{ .na .nh move cursor up T} T{ .na .nh .in +2 .ti -2 *Wait [\fItimeout\fP] 3270mode T} T{ .na .nh wait for 3270 mode T} T{ .na .nh .in +2 .ti -2 *Wait [\fItimeout\fP] Disconnect T} T{ .na .nh wait for host to disconnect T} T{ .na .nh .in +2 .ti -2 *Wait [\fItimeout\fP] InputField T} T{ .na .nh wait for valid input field T} T{ .na .nh .in +2 .ti -2 *Wait [\fItimeout\fP] NVTMode T} T{ .na .nh wait for NVT mode T} T{ .na .nh .in +2 .ti -2 *Wait [\fItimeout\fP] Output T} T{ .na .nh wait for more host output T} .TE .LP Note that certain parameters to tcl3270 actions (such as the names of files and keymaps) are subject to \fIsubstitutions\fP: .LP The character \fB~\fP at the beginning of a string is replaced with the user's home directory. A \fB~\fP character followed by a username is replaced with that user's home directory. .LP Environment variables are substituted using the Unix shell convention of $\fIname\fP or ${\fIname\fP}. .LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. .SH "FILE TRANSFER" The \fBTransfer\fP command implements \fBIND$FILE\fP file transfer. This command requires that the \fBIND$FILE\fP program be installed on the \s-1IBM\s+1 host, and that the 3270 cursor be located in a field that will accept a \s-1TSO\s+1 or \s-1VM/CMS\s+1 command. .LP .LP Because of the complexity and number of options for file transfer, the parameters to the \fBTransfer\fP command take the unique form of \fIoption\fP=\fIvalue\fP, and can appear in any order. Note that if the \fIvalue\fP contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: .LP .TS l c l l. T{ .na .nh Option T} T{ .na .nh Required? T} T{ .na .nh Default T} T{ .na .nh Other Values T} _ T{ .na .nh Direction T} T{ .na .nh No T} T{ .na .nh receive T} T{ .na .nh send T} T{ .na .nh HostFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh LocalFile T} T{ .na .nh Yes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Host T} T{ .na .nh No T} T{ .na .nh tso T} T{ .na .nh vm, cics T} T{ .na .nh Mode T} T{ .na .nh No T} T{ .na .nh ascii T} T{ .na .nh binary T} T{ .na .nh Cr T} T{ .na .nh No T} T{ .na .nh remove T} T{ .na .nh add, keep T} T{ .na .nh Remap T} T{ .na .nh No T} T{ .na .nh yes T} T{ .na .nh no T} T{ .na .nh Exist T} T{ .na .nh No T} T{ .na .nh keep T} T{ .na .nh replace, append T} T{ .na .nh Recfm T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh fixed, variable, undefined T} T{ .na .nh Lrecl T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Blksize T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Allocation T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh tracks, cylinders, avblock T} T{ .na .nh PrimarySpace T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh SecondarySpace T} T{ .na .nh No T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Avblock T} T{ .na .nh Sometimes T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh BufferSize T} T{ .na .nh No T} T{ .na .nh 4096 T} T{ .na .nh \ T} .TE .LP The option details are as follows. .TP \fBDirection\fP \fBsend\fP to send a file to the host, \fBreceive\fP to receive a file from the host. .TP \fBHostFile\fP The name of the file on the host. .TP \fBLocalFile\fP The name of the file on the local workstation. .TP \fBHost\fP The type of host (which dictates the form of the \fBIND$FILE\fP command): \fBtso\fP (the default), \fBvm\fP or \fBcics\fP. .TP \fBMode\fP Use \fBascii\fP (the default) for a text file, which will be translated between \s-1EBCDIC\s+1 and \s-1ASCII\s+1 as necessary. Use \fBbinary\fP for non-text files. .TP \fBCr\fP Controls how \fBNewline\fP characters are handled when transferring \fBMode=ascii\fP files. \fBremove\fP (the default) strips \fBNewline\fP characters in local files before transferring them to the host. \fBadd\fP adds \fBNewline\fP characters to each host file record before transferring it to the local workstation. \fBkeep\fP preserves \fBNewline\fP characters when transferring a local file to the host. .TP \fBRemap\fP Controls text translation for \fBMode=ascii\fP files. The value \fByes\fP (the default) causes tcl3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's \s-1EBCDIC\s+1 code page. The value \fBno\fP causes tcl3270 to pass the text to or from the host as-is, leaving all translation to the \fBIND$FILE\fP program on the host. .TP \fBExist\fP Controls what happens when the destination file already exists. \fBkeep\fP (the default) preserves the file, causing the \fBTransfer\fP command to fail. \fBreplace\fP overwrites the destination file with the source file. \fBappend\fP appends the source file to the destination file. .TP \fBRecfm\fP Controls the record format of files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) \fBfixed\fP creates a file with fixed-length records. \fBvariable\fP creates a file with variable-length records. \fBundefined\fP creates a file with undefined-length records (\s-1TSO\s+1 hosts only). The \fBLrecl\fP option controls the record length or maximum record length for \fBRecfm=fixed\fP and \fBRecfm=variable\fP files, respectively. .TP \fBLrecl\fP Specifies the record length (or maximum record length) for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBBlksize\fP Specifies the block size for files created on the host. (\s-1TSO\s+1 and \s-1VM\s+1 hosts only.) .TP \fBAllocation\fP Specifies the units for the \fBPrimarySpace\fP and \fBSecondarySpace\fP options: \fBtracks\fP, \fBcylinders\fP or \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBPrimarySpace\fP Primary allocation for a file. The units are given by the \fBAllocation\fP option. Required when the \fBAllocation\fP is specified as something other than \fBdefault\fP. (\s-1TSO\s+1 hosts only.) .TP \fBSecondarySpace\fP Secondary allocation for a file. The units are given by the \fBAllocation\fP option. (\s-1TSO\s+1 hosts only.) .TP \fBAvblock\fP Average block size, required when \fBAllocation\fP specifies \fBavblock\fP. (\s-1TSO\s+1 hosts only.) .TP \fBBufferSize\fP Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. .LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the \fBTransfer\fP keywords, but with \fBft\fP prepended. E.g., the default for the \fBMode\fP keyword is the \fBtcl3270.ftMode\fP resource. .SH "THE PRINTTEXT ACTION" The \fBPrintText\fP produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., \fBlpr\fP. .LP Multiple arguments can include keywords to control the output of \fBPrintText\fP: .TP \fBfile\fP \fIfilename\fP Save the output in a file. .TP \fBhtml\fP Save the output as HTML. This option implies \fBfile\fP. .TP \fBrtf\fP Save the output as RichText. This option implies \fBfile\fP. The font defaults to \fBCourier New\fP and the point size defaults to 8. These can be overridden by the \fBprintTextFont\fP and \fBprintTextSize\fP resources, respectively. .TP \fBstring\fP Return the output as a string. This can only be used from scripts. .TP \fBmodi\fP Render modified fields in italics. .TP \fBcaption\fP \fItext\fP Add the specified \fItext\fP as a caption above the output. Within \fItext\fP, the special sequence \fB%T%\fP will be replaced with a timestamp. .TP \fBcommand\fP \fIcommand\fP Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. .SH "NESTED SCRIPTS" .TP \fBThe String Command\fP The simplest method for nested scripts is provided via the \fBString\fP command. The arguments to \fBString\fP are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the \s-1AID\s+1 code to the host, \fBtcl3270\fP will wait for the host to unlock the keyboard before further processing the string.) .TS l l. T{ .na .nh \eb T} T{ .na .nh Left T} T{ .na .nh \ee\fIxxxx\fP T} T{ .na .nh EBCDIC character in hex T} T{ .na .nh \ef T} T{ .na .nh Clear* T} T{ .na .nh \en T} T{ .na .nh Enter* T} T{ .na .nh \epa\fIn\fP T} T{ .na .nh PA(\fIn\fP)* T} T{ .na .nh \epf\fInn\fP T} T{ .na .nh PF(\fInn\fP)* T} T{ .na .nh \er T} T{ .na .nh Newline T} T{ .na .nh \et T} T{ .na .nh Tab T} T{ .na .nh \eT T} T{ .na .nh BackTab T} T{ .na .nh \eu\fIxxxx\fP T} T{ .na .nh Unicode character in hex T} T{ .na .nh \ex\fIxxxx\fP T} T{ .na .nh Unicode character in hex T} .TE .IP Note that the numeric values for the \ee, \eu and \ex sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if tcl3270 is built with DBCS support and the host allows DBCS input in the current field. .IP \fBNote:\fP The strings are in \s-1ASCII\s+1 and converted to \s-1EBCDIC\s+1, so beware of inserting control codes. .IP There is also an alternate form of the \fBString\fP command, \fBHexString\fP, which is used to enter non-printing data. The argument to \fBHexString\fP is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent \s-1EBCDIC\s+1 characters, which are entered into the current field. In \s-1NVT\s+1 mode, the hexadecimal data represent \s-1ASCII\s+1 characters, which are sent directly to the host. .SH "PASSTHRU" \fBtcl3270\fP supports the Sun \fItelnet-passthru\fP service provided by the \fIin.telnet-gw\fP server. This allows outbound telnet connections through a firewall machine. When a \fBp:\fP is prepended to a hostname, \fBtcl3270\fP acts much like the \fIitelnet\fP(1) command. It contacts the machine named \fBinternet-gateway\fP at the port defined in \fB/etc/services\fP as \fBtelnet-passthru\fP (which defaults to 3514). It then passes the requested hostname and port to the \fBin.telnet-gw\fP server. .SH "PROXY" The \fB\-proxy\fP option or the \fBtcl3270.proxy\fP resource causes tcl3270 to use a proxy server to connect to the host. The syntax of the option or resource is: .RS \fItype\fP:\fIhost\fP[:\fIport\fP] .RE The supported values for \fItype\fP are: .TS center; c l c . T{ .na .nh Proxy Type T} T{ .na .nh Protocol T} T{ .na .nh Default Port T} _ T{ .na .nh http T} T{ .na .nh RFC 2817 HTTP tunnel (squid) T} T{ .na .nh 3128 T} T{ .na .nh passthru T} T{ .na .nh Sun in.telnet-gw T} T{ .na .nh none T} T{ .na .nh socks4 T} T{ .na .nh SOCKS version 4 T} T{ .na .nh 1080 T} T{ .na .nh socks5 T} T{ .na .nh SOCKS version 5 (RFC 1928) T} T{ .na .nh 1080 T} T{ .na .nh telnet T} T{ .na .nh No protocol (just send \fBconnect\fP \fIhost port\fP) T} T{ .na .nh none T} .TE .LP The special types \fBsocks4a\fP and \fBsocks5d\fP can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. .SH "RESOURCES" Certain \fBtcl3270\fP options can be configured via resources. Resources are defined by \fB\-xrm\fP options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in \fBtcl3270\fP are: .LP .TS l l l l. T{ .na .nh Resource T} T{ .na .nh Default T} T{ .na .nh Option T} T{ .na .nh Purpose T} _ T{ .na .nh blankFill T} T{ .na .nh False T} T{ .na .nh \-set blankFill T} T{ .na .nh Blank Fill mode T} T{ .na .nh charset T} T{ .na .nh bracket T} T{ .na .nh \-charset T} T{ .na .nh \s-1EBCDIC\s+1 character set T} T{ .na .nh dbcsCgcsgid T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Override DBCS CGCSGID T} T{ .na .nh dsTrace T} T{ .na .nh False T} T{ .na .nh \-trace T} T{ .na .nh Data stream tracing T} T{ .na .nh eof T} T{ .na .nh ^D T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode \s-1EOF\s+1 character T} T{ .na .nh erase T} T{ .na .nh ^H T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode erase character T} T{ .na .nh extended T} T{ .na .nh True T} T{ .na .nh \ T} T{ .na .nh Use 3270 extended data stream T} T{ .na .nh eventTrace T} T{ .na .nh False T} T{ .na .nh \-trace T} T{ .na .nh Event tracing T} T{ .na .nh icrnl T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Map \s-1CR\s+1 to \s-1NL\s+1 on \s-1NVT\s+1-mode input T} T{ .na .nh inlcr T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Map \s-1NL\s+1 to \s-1CR\s+1 in \s-1NVT\s+1-mode input T} T{ .na .nh intr T} T{ .na .nh ^C T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode interrupt character T} T{ .na .nh kill T} T{ .na .nh ^U T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode kill character T} T{ .na .nh lineWrap T} T{ .na .nh False T} T{ .na .nh \-set lineWrap T} T{ .na .nh \s-1NVT\s+1 line wrap mode T} T{ .na .nh lnext T} T{ .na .nh ^V T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode lnext character T} T{ .na .nh m3279 T} T{ .na .nh (note 1) T} T{ .na .nh \-model T} T{ .na .nh 3279 (color) emulation T} T{ .na .nh monoCase T} T{ .na .nh False T} T{ .na .nh \-set monoCase T} T{ .na .nh Mono-case mode T} T{ .na .nh numericLock T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Lock keyboard for numeric field error T} T{ .na .nh oerrLock T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Lock keyboard for input error T} T{ .na .nh oversize T} T{ .na .nh \ T} T{ .na .nh \-oversize T} T{ .na .nh Oversize screen dimensions T} T{ .na .nh port T} T{ .na .nh telnet T} T{ .na .nh \-port T} T{ .na .nh Non-default TCP port T} T{ .na .nh quit T} T{ .na .nh ^\e T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode quit character T} T{ .na .nh rprnt T} T{ .na .nh ^R T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode reprint character T} T{ .na .nh sbcsCgcsgid T} T{ .na .nh \ T} T{ .na .nh \ T} T{ .na .nh Override SBCS CGCSGID T} T{ .na .nh secure T} T{ .na .nh False T} T{ .na .nh \ T} T{ .na .nh Disable "dangerous" options T} T{ .na .nh termName T} T{ .na .nh (note 2) T} T{ .na .nh \-tn T} T{ .na .nh \s-1TELNET\s+1 terminal type string T} T{ .na .nh traceDir T} T{ .na .nh /tmp T} T{ .na .nh \ T} T{ .na .nh Directory for trace files T} T{ .na .nh traceFile T} T{ .na .nh (note 3) T} T{ .na .nh \-tracefile T} T{ .na .nh File for trace output T} T{ .na .nh werase T} T{ .na .nh ^W T} T{ .na .nh \ T} T{ .na .nh \s-1NVT\s+1-mode word-erase character T} .TE .LP .RS \fINote 1\fP: \fBm3279\fP defaults to \fBFalse\fP. It can be forced to \fBTrue\fP with the proper \fB\-model\fP option. .LP \fINote 2\fP: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as \fBIBM-3279-2-E\fP. Note also that when \s-1TN3270E\s+1 mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. .LP \fINote 3\fP: The default trace file is \fBx3trc.\fP\fIpid\fP in the directory specified by the \fBtraceDir\fP resource. .RE .LP If more than one \fB\-xrm\fP option is given for the same resource, the last one on the command line is used. .SH "SEE ALSO" s3270(1), , x3270(1), c3270(1), telnet(1), tn3270(1) .br Data Stream Programmer's Reference, IBM GA23-0059 .br Character Set Reference, IBM GA27-3831 .br RFC 1576, TN3270 Current Practices .br RFC 1646, TN3270 Extensions for LUname and Printer Selection .br RFC 2355, TN3270 Enhancements .SH "COPYRIGHTS" Copyright 1993-2017, Paul Mattes. .br Copyright 2004-2005, Don Russell. .br Copyright 2004, Dick Altenbern. .br Copyright 1990, Jeff Sparkes. .br Copyright 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. .br All rights reserved. .LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: .TP * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. .TP * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. .TP * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. .LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .SH "VERSION" tcl3270 3.6ga4 suite3270-3.6/tcl3270/version.txt0000775000076500007650000000006013221577443014520 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/tcl3270/x3270.man.m40000664000076500007650000023655313221577163014107 0ustar pdmpdmdnl Copyright (c) 1993-2017, Paul Mattes. dnl Copyright (c) 1990, Jeff Sparkes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their dnl contributors may be used to endorse or promote products derived from dnl this software without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR dnl ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER dnl CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH dnl DAMAGE. define(XX_KEY,$1`'XX_LT()Key>$2)dnl define(XX_BTN,$1`'XX_LT()Btn$2>)dnl define(XX_action,`ifelse(XX_PRODUCT,tcl3270,command,action)')dnl define(XX_Action,`ifelse(XX_PRODUCT,tcl3270,Command,Action)')dnl XX_TH(XX_PRODUCT,1,XX_DATE) XX_SH(Name) XX_PRODUCT XX_DASH ifelse(XX_PRODUCT,c3270,`curses-based ')dnl XX_SM(IBM) host access tool XX_SH(Synopsis) XX_FB(XX_PRODUCT) ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')dnl [XX_FI(options)] [XX_FI(host)] ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_BR XX_FB(XX_PRODUCT) [XX_FI(options)] ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')XX_FI(session-file).XX_PRODUCT ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_SH(Description) XX_FB(XX_PRODUCT) opens a telnet connection to an XX_SM(IBM) ifelse(XX_PRODUCT,x3270,`host in an X window.', XX_PRODUCT,s3270,`host, then allows a script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_PRODUCT,ws3270,`host, then allows a script to control the host login session.', XX_PRODUCT,tcl3270,`host, then allows a tcl script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_MODE,console,`host in a console window.') It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. ifelse(XX_PRODUCT,x3270, `The window created by XX_FB(XX_PRODUCT) can use its own font for displaying characters, so it is a fairly accurate representation of an XX_SM(IBM) 3278 or 3279. It is similar to XX_FI(tn3270)(1) except that it is X-based, not curses-based. ')dnl ifelse(XX_PRODUCT,c3270, `If the console is capable of displaying colors, then XX_FB(c3270) emulates an XX_SM(IBM) 3279. Otherwise, it emulates a 3278. ')dnl include(hostname.inc) XX_SH(Options) ifelse(XX_PRODUCT,x3270,`XX_FB(x3270) is a toolkit based program, so it understands standard Xt options and resources. It also understands',` XX_FB(XX_PRODUCT) understands') the following options:XX_TPS() ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ', `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(activeicon))) Specifies that the icon should be a miniature version of the screen image. See XX_LINK(#Icons,XX_SM(ICONS)) below. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed using the XX_DQUOTED(bold) colors (colors 8 through 15, rather than colors 0 through 7). This helps with PC console windows in which colors 0 through 7 are unreadably dim. All-bold mode is the default for color (3279) emulation, but not for monochrome (3278) emulation. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays. XX_TP(XX_FB(XX_DASHED(altscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(apl))) Sets up XX_SM(APL) mode. ifelse(XX_PRODUCT,x3270,`This is actually an abbreviation for several options. ')dnl See XX_LINK(#APL-Support,XX_SM(APL SUPPORT)) below. ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(cadir)) XX_FI(directory)) Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) XX_TP(XX_FB(XX_DASHED(cafile)) XX_FI(filename)) Specifies a XX_SM(PEM)-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(cbreak))) Causes XX_FB(c3270) to operate in XX_FI(cbreak) mode, instead of XX_FI(raw) mode. In XX_FI(cbreak) mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for XX_FB(interrupt), XX_FB(quit), and XX_FB(lnext) (usually ^C, ^XX_BACKSLASH and ^V respectively) will be seen by XX_FB(c3270) only if preceded by the XX_FB(lnext) character. The XX_FB(susp) character (usually ^Z) cannot be seen by XX_FB(c3270) at all. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(cc)) XX_FI(range):XX_FI(value)[`,'...]) Sets character classes. XX_HO(`See XX_LINK(#Character-Classes,XX_SM(CHARACTER CLASSES)), below. ')dnl ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfile)) XX_FI(filename)) Specifies a file containing a client certificate to provide to the host. The default file type is XX_SM(PEM). ')dnl XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. ifelse(XX_PLATFORM,unix,`(MacOS only) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfiletype)) XX_FI(type)) Specifies the type of the certificate file specified by XX_FB(XX_DASHED(certfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(chainfile) XX_FI(filename))) Specifies a certificate chain file in XX_SM(PEM) format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If XX_FB(XX_DASHED(chainfile)) is specified, it overrides XX_FB(XX_DASHED(certfile)). (OpenSSL only) ')dnl XX_TP(XX_FB(XX_DASHED(charset)) XX_FI(name)) Specifies an XX_SM(EBCDIC) host character set. XX_HO(`See XX_LINK(#Character-Sets,XX_SM(CHARACTER SETS)) below. ')dnl XX_TP(XX_FB(XX_DASHED(clear)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(false). define(XX_TOGGLEREF,`ifelse(XX_PRODUCT,x3270,Menus,Toggles)')dnl define(XX_TOGGLEREFNM,`ifelse(XX_PRODUCT,x3270,MENUS,TOGGLES)')dnl XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl XX_TP(XX_FB(XX_DASHED(connecttimeout)) XX_FI(seconds)) Specifies the time that XX_PRODUCT will wait for a host connection to complete. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defaultfgbg))) Causes XX_PRODUCT to use the XX_POSESSIVE(terminal) default foreground color instead of the curses color XX_FB(black), and the XX_POSESSIVE(terminal) default background color instead of the curses color XX_FB(white). This is helpful for emulators such as XX_FI(gnome-terminal) whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable XX_FB(COLORTERM) is set to XX_FB(gnome-terminal). It is available only if XX_PRODUCT was compiled with a version of XX_FI(ncurses) that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the default (80-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl XX_TP(XX_FB(XX_DASHED(devname)) XX_FI(name)) Specifies a device name (workstation ID) for RFC 4777 support. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(efont)) XX_FI(name)) Specifies a font for the emulator window. XX_HO(`See XX_LINK(#Fonts,XX_SM(FONTS)) below. ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(hostsfile)) XX_FI(file)) Uses XX_FI(file) as the hosts file, which allows aliases for host names and scripts to be executed at login. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(1)) for details. ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(XX_DASHED(httpd)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for HTTP connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(scriptport) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(iconname)) XX_FI(name)) Specifies an alternate title for the program icon. XX_TP(XX_FB(XX_DASHED(iconx)) XX_FI(x)) Specifies the initial x coordinate for the program icon. XX_TP(XX_FB(XX_DASHED(icony)) XX_FI(y)) Specifies the initial y coordinate for the program icon. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(im)) XX_FI(method)) Specifies the name of the input method to use for multi-byte input. (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(keyfile)) XX_FI(filename)) Specifies a file containing the private key for the certificate file (specified via XX_FB(XX_DASHED(certfile)) or XX_FB(XX_DASHED(chainfile))). The default file type is XX_SM(PEM). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keyfiletype)) XX_FI(type)) Specifies the type of the private key file specified by XX_FB(XX_DASHED(keyfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keypasswd)) XX_FI(type):XX_FI(value)) Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be XX_FB(file):XX_FI(filename), specifying that the password is in a file, or XX_FB(string):XX_FI(string), specifying the password on the command-line directly. If the private key file is encrypted and no XX_FB(XX_DASHED(keypasswd)) option is given, ifelse(XX_INTERACTIVE,yes,`the password will be prompted for interactively.', `secure connections will not be allowed.') ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keymap name and optional modifiers. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keyboard map to be found in the resource XX_FB(c3270.keymap.)`'XX_FI(name) or the file XX_FI(name). See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below for details. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keypad))) Turns on the keypad as soon as XX_FB(XX_PRODUCT) starts. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(km)) XX_FI(name)) Specifies the local encoding method for multi-byte text. XX_FI(name) is an encoding name recognized by the ICU library. (Supported only when XX_PRODUCT is compiled with DBCS support, and necessary only when XX_PRODUCT cannot figure it out from the locale.) ')dnl XX_TP(XX_FB(XX_DASHED(loginmacro)) XX_FI(Action(arg...) ...)) Specifies a macro to run at login time. ifelse(XX_PRODUCT,ws3270,`XX_TP(XX_FB(XX_DASHED(localcp) XX_FI(codepage))) Specifies the Windows code page to use for local I/O. The default is to use the XX_POSESSIVE(system) ANSI code page. ')dnl ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(minversion)) XX_FI(version)) The minimum required version of XX_FB(XX_PRODUCT), e.g., XX_VERSION_NUMBER. If the running version is less than the specified version, XX_FB(XX_PRODUCT) will abort. The format of a version is XX_FI(major)`'XX_FB(.)`'XX_FI(minor)`'XX_FB(type)`'XX_FI(iteration). XX_FB(type) is ignored, and XX_FI(minor) and XX_FI(iteration) can be omitted. ')dnl XX_TP(XX_FB(XX_DASHED(model)) XX_FI(name)) The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: XX_IP The first part is the XX_FB(base model), which is either XX_FB(3278) or XX_FB(3279). XX_FB(3278) specifies a monochrome (green on black) 3270 display; XX_FB(3279) specifies a color 3270 display. XX_IP The second part is the XX_FB(model number), which specifies the number of rows and columns. Model 4 is the default. XX_PP XX_TS(3,`center; c c c .') XX_TR(XX_TD(XX_TC(Model Number)) XX_TD(XX_TC(Columns)) XX_TD(XX_TC(Rows))) XX_T_ XX_TR(XX_TD(XX_TC(2)) XX_TD(XX_TC(80)) XX_TD(XX_TC(24))) XX_TR(XX_TD(XX_TC(3)) XX_TD(XX_TC(80)) XX_TD(XX_TC(32))) XX_TR(XX_TD(XX_TC(4)) XX_TD(XX_TC(80)) XX_TD(XX_TC(43))) XX_TR(XX_TD(XX_TC(5)) XX_TD(XX_TC(132)) XX_TD(XX_TC(27))) XX_TE() XX_IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. XX_IP The default model ifelse(XX_PRODUCT,x3270,`for a color X display is XX_FB(`3279'XX_DASHED(4)). For a monochrome X display, it is XX_FB(`3278'XX_DASHED(4)).', XX_PRODUCT,c3270,`for a color display is XX_FB(`3279'XX_DASHED(4)). For a monochrome display, it is XX_FB(`3278'XX_DASHED(4)).', `is XX_FB(`3279'XX_DASHED(4)).') ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(mono))) Forces XX_FB(XX_PRODUCT) to believe it is running on a monochrome X display. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(mono))) Prevents XX_FB(XX_PRODUCT) from using color, ignoring any color capabilities reported by the terminal. XX_TP(XX_FB(XX_DASHED(noprompt))) An alias for XX_DASHED(secure). ')dnl XX_TP(XX_FB(XX_DASHED(noverifycert))) For SSL/TLS connections, do not verify the host certificate. XX_TP(XX_FB(XX_DASHED(nvt))) Start in NVT mode instead of waiting for the host to send data, and make the default terminal type XX_FB(xterm). ifelse(XX_PRODUCT,x3270, XX_TP(XX_FB(XX_DASHED(once))) Causes XX_FB(XX_PRODUCT) to exit after a host disconnects. This option has effect only if a hostname is specified on the command line. )dnl XX_TP(XX_FB(XX_DASHED(oversize)) XX_FI(cols)`'XX_FB(x)`'XX_FI(rows)) Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "XX_PRODUCT.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. ifelse(XX_MODE,console,`XX_IP It can also be specified as XX_FB(auto), which causes XX_FB(XX_PRODUCT) to fill the entire terminal or console window. ')dnl XX_TP(XX_FB(XX_DASHED(port)) XX_FI(n)) Specifies a different XX_SM(TCP) port to connect to. XX_FI(n) can be a name from XX_FB(/etc/services) like XX_FB(telnet), or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(pt)) XX_FI(type)) Specifies the preedit type for the multi-byte input method. Valid values are XX_FB(OverTheSpot), XX_FB(OffTheSpot), XX_FB(Root) and XX_FB(OnTheSpot). The value for XX_FB(OverTheSpot) can `include' an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. XX_FB(OverTheSpot+1) or XX_FB(OverTheSpot-2). The default value is XX_FB(OverTheSpot+1). (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FB(XX_PRODUCT) to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(rv))) Switches XX_PRODUCT from a white-on-black display to a black-on-white display. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(sb))) Turns on the scrollbar. XX_TP(XX_FB(+sb)) Turns the scrollbar off. XX_TP(XX_FB(XX_DASHED(scheme)) XX_FI(name)) Specifes a color scheme to use in 3279 mode. This option has effect only in combination with 3279 emulation. XX_HO(`See XX_LINK(#Color-Schemes,XX_SM(COLOR SCHEMES)) below. ')dnl XX_TP(XX_FB(XX_DASHED(script))) Causes XX_FB(XX_PRODUCT) to read commands from standard input, with the results written to standard output. The protocol for these commands is documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(sl)) XX_FI(n)) Specifies that XX_FI(n) lines should be saved for scrolling back. The default is 4096. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(S))) Runs XX_PRODUCT in auto-shortcut mode. XX_PRODUCT will create a temporary shorcut (.LNK file) that matches the parameters in the session file (model number, characterset, etc.) and re-run itself from the shortcut. XX_TP(XX_FB(+S)) Disables auto-shortcut mode. It is generally a good idea to put this option on the command lines of all shortcuts, to avoid infinite looping. ')dnl ifelse(XX_PRODUCT,tcl3270,, `XX_TP(XX_FB(XX_DASHED(scriptport)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for scripting connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(httpd) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) XX_TP(XX_FB(XX_DASHED(scriptportonce))) Allows XX_PRODUCT to accept only one script connection. When that connection is broken, XX_PRODUCT will exit. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables the interactive XX_FB(c3270>) prompt. When used, a hostname must be provided on the command line. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables run-time features that could compromise system security (user-specified file names and commands, etc.). ')dnl XX_TP(XX_FB(XX_DASHED(set)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(true). XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_TP(XX_FB(XX_DASHED(socket))) Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named XX_FB(/tmp/x3sck.)`'XX_FI(pid). ')dnl The XX_FB(XX_DASHED(p)) option of XX_FI(x3270if) causes it to use this socket, instead of pipes specified by environment variables. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(title)) XX_FI(text)) Sets the console window title to XX_FI(text), overriding the automatic setting of the hostname and the string XX_FB(wc3270). ')dnl XX_TP(XX_TARGET(tn)XX_FB(XX_DASHED(tn)) XX_FI(name)) Specifies the terminal name to be transmitted over the telnet connection. The default name is XX_FB(`IBM'XX_DASH)`'XX_FI(model_name)`'XX_FB(XX_DASHED(E)), for example, ifelse(XX_PRODUCT,x3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', XX_PRODUCT,c3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', `XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)).') XX_IP Some hosts are confused by the XX_FB(XX_DASHED(E)) suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an XX_FB(s:) on the hostname, or setting the "XX_PRODUCT.extended" resource to "false", removes the XX_FB(XX_DASHED(E)) from the terminal name when connecting to such hosts. XX_IP The name can also be specified with the "XX_PRODUCT.termName" resource. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream ifelse(XX_PRODUCT,x3270,,`and event ')tracing at startup. ifelse(XX_PRODUCT,x3270,`Unlike turning it on from a menu option, there is no pop-up to confirm the file name, which defaults to', `The default trace file name is') ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) on the current XX_POSESSIVE(user) Desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3trc)'). XX_TP(XX_FB(XX_DASHED(tracefile)) XX_FI(file)) Specifies a file to save data stream and event traces into. If the name starts with XX_DQUOTED(>>), data will be appended to the file. ifelse(XX_PRODUCT,x3270,`If the value XX_FB(stdout) is given, then traces will be written to standard output. If the value XX_FB(none) is given, then traces will be piped directly to the monitor window, and no file will be created. ')dnl XX_TP(XX_FB(XX_DASHED(tracefilesize)) XX_FI(size)) Places a limit on the size of a trace file. If this option is not specified, or is specified as XX_FB(0) or XX_FB(none), the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of XX_FI(size) can have a XX_FB(K) or XX_FB(M) suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a XX_DQUOTED(-) appended and a new file started. XX_TP(XX_FB(XX_DASHED(user)) XX_FI(name)) Specifies the user name for RFC 4777 support. ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl XX_TP(XX_FB(XX_DASHED(v))) Display the version and build options for XX_FB(XX_PRODUCT) and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a XX_FB(y:) prepended to the hostname when connecting. ifelse(XX_PRODUCT,x3270,, `XX_TP(XX_FB(XX_DASHED(xrm)) "XX_PRODUCT.XX_FI(resource): XX_FI(value)") Sets the value of the named XX_FI(resource) to XX_FI(value). Resources control less common XX_FB(XX_PRODUCT) options, and are defined under XX_LINK(#Resources,XX_SM(RESOURCES)) below. ')dnl ifelse(XX_PRODUCT,tcl3270, `XX_TP(XX_FB(XX_DASHED()XX_DASHED())) Terminates the list of XX_FB(tcl3270) options. Whatever follows will be available to the script in the XX_FB($argv) tcl variable. ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,x3270,`XX_LP After reading resource definitions from the X server and any standandard X11 resource definition files (XX_FB($HOME/.Xdefaults), etc.), XX_FB(XX_PRODUCT) will read definitions from the file XX_FB($HOME/.x3270pro). This file contains local customizations and is also used to save changed options by the XX_FB(Save Changed Options in File) menu option. XX_LP Note that XX_FB(XX_DASHED(xrm)) options override any definitions in the XX_FB(.x3270pro) file. ')dnl XX_HO(`ifelse(XX_PRODUCT,x3270,`XX_SH(Fonts) XX_FB(XX_PRODUCT) does not use the "*font" resource for its main window. Instead, it uses a custom 14-point font called XX_FB(3270), which is a close approximation of a real 3270 display and allows XX_FB(XX_PRODUCT) to display the XX_SM(ISO) `8859'XX_DASHED(1) (`Latin'XX_DASH()1) character set and special status-line symbols. A more compact font, XX_FB(`3270'XX_DASHED(12)), is also supported, as are the various sized fonts XX_FB(3270gt8), XX_FB(3270gt12), XX_FB(3270gt16), XX_FB(3270-20), XX_FB(3270gt24), and XX_FB(3270gt32). The fonts XX_FB(3270h) and XX_FB(3270gr) are also included to allow display of Hebrew and Greek text, respectively. XX_LP The font may be specified with the XX_FB(XX_DASHED(efont)) option or the "XX_PRODUCT.emulatorFont" resource. XX_LP XX_FB(XX_PRODUCT) can also use any X11 font that implements the display character set required by the host XX_SM(EBCDIC) character set. XX_PP An additional font, XX_FB(3270d), is supplied. This font is identical to the default XX_FB(3270) font, except that it has bitmaps defined for field attribute characters. This means that field attributes, which are normally displayed as blanks, are now visible on the screen. The characters displayed are hexadecimal codes, which can be translated using a document provided with the XX_FB(XX_PRODUCT) sources. XX_LP The font can be changed at any time through a menu option. It can also be implicitly changed by changing the size of the XX_FB(XX_PRODUCT) window with the mouse: if the window is made larger, XX_PRODUCT will try to change to a larger font, and vice-versa. ')dnl ifelse(XX_MODE,console,`XX_SH(Modes) XX_FB(XX_PRODUCT) has two basic modes: XX_FI(command-prompt) and XX_FI(session). XX_PP XX_FI(Command-prompt) mode is where the XX_FB(XX_PRODUCT`'>) prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit XX_FB(XX_PRODUCT), etc. The complete list of interactive commands is listed under XX_LINK(#Actions,XX_SM(ACTIONS)). XX_PP XX_FI(Session) mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host. XX_PP To switch from display mode to command-prompt mode, press ifelse(XX_PRODUCT,c3270,`Ctrl-]',`the Escape key'). To switch from command-prompt mode to display mode, press XX_FB(Enter) (without entering a command) at the XX_FB(XX_PRODUCT`'>) prompt. ')dnl XX_SH(Character Sets) The XX_FB(XX_DASHED(charset)) option or the "XX_PRODUCT.charset" resource controls the XX_SM(EBCDIC) host character set used by XX_FB(XX_PRODUCT). Available sets `include': XX_PP define(XX_CG1A,ifelse(XX_PRODUCT,x3270,3270cg-1a))dnl define(XX_CG1,ifelse(XX_PRODUCT,x3270,3270cg-1))dnl define(XX_CG7,ifelse(XX_PRODUCT,x3270,3270cg-7))dnl define(XX_CG8,ifelse(XX_PRODUCT,x3270,3270cg-8))dnl define(XX_CG9,ifelse(XX_PRODUCT,x3270,3270cg-9))dnl define(XX_CG11,ifelse(XX_PRODUCT,x3270,3270cg-11))dnl define(XX_CG15A,ifelse(XX_PRODUCT,x3270,3270cg-15a))dnl define(XX_CG15,ifelse(XX_PRODUCT,x3270,3270cg-15))dnl define(XX_88591,ifelse(XX_PLATFORM,windows,`',iso8859-1))dnl define(XX_88592,ifelse(XX_PLATFORM,windows,`',iso8859-2))dnl define(XX_88597,ifelse(XX_PLATFORM,windows,`',iso8859-7))dnl define(XX_88598,ifelse(XX_PLATFORM,windows,`',iso8859-8))dnl define(XX_88599,ifelse(XX_PLATFORM,windows,`',iso8859-9))dnl define(XX_885911,ifelse(XX_PLATFORM,windows,`',iso8859-11))dnl define(XX_885915,ifelse(XX_PLATFORM,windows,`',iso8859-15))dnl define(XX_KOI8R,ifelse(XX_PLATFORM,windows,`',koi8-r))dnl define(XX_TIS,ifelse(XX_PLATFORM,windows,`',tis620.2529-0))dnl define(XX_GB,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + gb2312.1980-0))dnl define(XX_GBX,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + iso10646-1))dnl define(XX_BIG5,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + Big5-0))dnl define(XX_JIS,ifelse(XX_PLATFORM,windows,`',jisx0201.1976-0 + jisx0208.1983-0))dnl XX_TS(3,`center; l l l lfB l l.') XX_TR(XX_TD(XX_TC(Charset Name)) XX_TD(XX_TC(Host Code Page)) XX_TD(XX_TC(ifelse(XX_PRODUCT,x3270,Display Character Sets,XX_PRODUCT,c3270,Display Character Set,XX_PLATFORM,windows,`',Character Set)))) XX_T_() ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TD(XX_TC(apl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A))) ')dnl XX_TR(XX_TD(XX_TC(belgian)) XX_TD(XX_TC(500)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(belgian-euro)) XX_TD(XX_TC(1148)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(bracket)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(brazilian)) XX_TD(XX_TC(275)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(chinese-gb18030)) XX_TD(XX_TC(1388)) XX_TD(XX_TC(XX_GBX))) XX_TR(XX_TD(XX_TC(cp1047)) XX_TD(XX_TC(1047)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(cp870)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88592))) XX_TR(XX_TD(XX_TC(finnish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(finnish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(french)) XX_TD(XX_TC(297)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(french-euro)) XX_TD(XX_TC(1147)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(german)) XX_TD(XX_TC(273)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(german-euro)) XX_TD(XX_TC(1141)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(greek)) XX_TD(XX_TC(423)) XX_TD(XX_TC(XX_CG7 XX_88597))) XX_TR(XX_TD(XX_TC(hebrew)) XX_TD(XX_TC(424)) XX_TD(XX_TC(XX_CG8 XX_88598))) XX_TR(XX_TD(XX_TC(icelandic)) XX_TD(XX_TC(871)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(icelandic-euro)) XX_TD(XX_TC(1149)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(italian)) XX_TD(XX_TC(280)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(italian-euro)) XX_TD(XX_TC(1144)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(japanese-kana)) XX_TD(XX_TC(930)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(japanese-latin)) XX_TD(XX_TC(939)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(norwegian)) XX_TD(XX_TC(277)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(norwegian-euro)) XX_TD(XX_TC(1142)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(russian)) XX_TD(XX_TC(880)) XX_TD(XX_TC(XX_KOI8R))) XX_TR(XX_TD(XX_TC(simplified-chinese)) XX_TD(XX_TC(935)) XX_TD(XX_TC(XX_GB))) XX_TR(XX_TD(XX_TC(slovenian)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_88592))) XX_TR(XX_TD(XX_TC(spanish)) XX_TD(XX_TC(284)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(spanish-euro)) XX_TD(XX_TC(1145)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(swedish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(swedish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(thai)) XX_TD(XX_TC(1160)) XX_TD(XX_TC(XX_885911 XX_TIS))) XX_TR(XX_TD(XX_TC(traditional-chinese)) XX_TD(XX_TC(937)) XX_TD(XX_TC(XX_BIG5))) XX_TR(XX_TD(XX_TC(turkish)) XX_TD(XX_TC(1026)) XX_TD(XX_TC(XX_88599))) XX_TR(XX_TD(XX_TC(uk)) XX_TD(XX_TC(285)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(uk-euro)) XX_TD(XX_TC(1146)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-euro)) XX_TD(XX_TC(1140)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-intl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TE() XX_PP The default character set is XX_FB(bracket), which is useful for common U.S. XX_SM(IBM) hosts which use XX_SM(EBCDIC) codes AD and BD for the XX_DQUOTED([) and XX_DQUOTED(]) characters, respectively. XX_PP Note that any of the host code pages listed above can be specified by adding XX_FB(cp) to the host code page, e.g., XX_FB(cp037) for host code page 037. Also note that the code pages available for a given version of XX_FB(XX_PRODUCT) are displayed by the XX_FB(XX_DASHED(v)) command-line option. ifelse(XX_PRODUCT,wc3270,`XX_PP Note that DBCS character sets (Chinese, Japanese) display properly only on 32-bit Windows XP. Work is proceeding on other platforms. ')dnl ifelse(XX_PRODUCT,x3270, `XX_PP Most 3270 fonts implement the 3270cg-1 display character set, which is a reordered version of the XX_SM(ISO) `8859'XX_DASHED(1) character set. Some implement the 3270cg-1a display character set, which is a superset of 3270cg-1 that includes APL2 characters. 3270h and 3270gr implement special character sets for Hebrew and Greek, respectively. XX_PP You can also specify national-language translations for your keyboard; see XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Character Classes) XX_FB(XX_PRODUCT) supports character classes (groupings of characters chosen with a double mouse click) in the same manner as XX_FI(xterm)(1). The "XX_PRODUCT.charClass" resource or the XX_FB(XX_DASHED(cc)) option can be used to alter the character class table. The default table is the same as XX_POSESSIVE(XX_FI(xterm)); It groups letters together, and puts most punctuation characters in individual classes. To put all non-whitespace characters together in the same class (and duplicate the behavior of some early versions of XX_FB(XX_PRODUCT), use the following value: XX_PP XX_RS(`33-127:48,161-255:48') XX_PP See XX_FI(xterm)(1) for further syntax details. XX_SH(Keypad) A keypad may optionally be displayed, with a mouse-clickable button for each 3270 function key (these functions are also available from the keyboard). The keypad can be turned on and off by clicking on the "keypad" button in the upper-right-hand corner of the window. The "XX_PRODUCT.keypad" resource controls where it is displayed. Options are: XX_PP XX_TS(2,center; l l.) XX_TR(`XX_TD(left) XX_TD(`in a separate window, to the left of the screen')') XX_TR(`XX_TD(right) XX_TD(`in a separate window, to the right of the screen')') XX_TR(`XX_TD(bottom) XX_TD(`in a separate window, below the screen')') XX_TR(`XX_TD(integral) XX_TD(`in the same window as the screen, below it')') XX_TE() XX_PP The default is XX_FB(right). XX_PP If the "XX_PRODUCT.keypadOn" resource is set to XX_FB(true), the keypad will be displayed at startup. ')dnl ifelse(XX_MODE,console,`XX_SH(Menu Bar and Keypad) XX_FB(XX_PRODUCT) supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the XX_FB(XX_PRODUCT>) prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen. XX_LP The on-screen menu title bar can be turned off via the "XX_PRODUCT.menuBar" resource. XX_LP The pop-up keypad allows the 3270-specific keys (XX_SM(PF) keys, XX_SM(PA) keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the XX_FB(XX_PRODUCT>) prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option. ')dnl ifelse(XX_MODE,script,,XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_SH(Hosts Database) XX_FB(XX_PRODUCT) uses the XX_FI(ibm_hosts) database to ifelse(XX_PRODUCT,x3270,`construct a pull-down menu of hosts to connect to. It also allows host name aliases to be defined, as well as specifying ',XX_PRODUCT,c3270,``define' aliases for host names, and to specify ')dnl macros to be executed when a connection is first made. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(5)) for details. XX_LP You may specify a different XX_FI(ibm_hosts) database with the "XX_PRODUCT.hostsFile" resource. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Color Schemes) When emulating a 3279 display, the X colors used to draw the display are selected by two resources: the "XX_PRODUCT.colorScheme" resource, which gives the name of the color scheme to use, and the individual "XX_PRODUCT.colorScheme.XX_FI(xxx)" resources, which give the actual definitions. The color scheme resources are documented in the XX_FB(Resources) file with the XX_FB(XX_PRODUCT) source. XX_LP The color scheme may also be changed while XX_FB(XX_PRODUCT) is running with a selection from the XX_FB(Options) menu. ')dnl XX_SH(NVT Mode) Some hosts use an XX_SM(ASCII) front-end to do initial login negotiation, then later switch to 3270 mode. XX_FB(XX_PRODUCT) will emulate an XX_SM(ANSI) X3.64 terminal until the host places it in 3270 mode (telnet XX_SM(BINARY) and XX_SM(SEND EOR) modes, or XX_SM(TN3270E) mode negotiation). ifelse(XX_PRODUCT,x3270,`The emulation is fairly complete; however, it is not intended to make XX_FB(XX_PRODUCT) a replacement for XX_FI(xterm)(1). ')dnl XX_PP If the host later negotiates to stop functioning in 3270 mode, XX_FB(XX_PRODUCT) will return to XX_SM(NVT) emulation. XX_PP In XX_SM(NVT) mode, XX_FB(XX_PRODUCT) supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources: XX_PP XX_TS(3,center; l c c.) XX_TR(XX_TD(Mode/Character) XX_TD(Resource) XX_TD(Default)) XX_T_() XX_TR(XX_TD(Translate CR to NL) XX_TD(XX_PRODUCT.icrnl) XX_TD(true)) XX_TR(XX_TD(Translate NL to CR) XX_TD(XX_PRODUCT.inlcr) XX_TD(false)) XX_TR(XX_TD(Erase previous character) XX_TD(XX_PRODUCT.erase) XX_TD(^?)) XX_TR(XX_TD(Erase entire line) XX_TD(XX_PRODUCT.kill) XX_TD(^U)) XX_TR(XX_TD(Erase previous word) XX_TD(XX_PRODUCT.werase) XX_TD(^W)) XX_TR(XX_TD(Redisplay line) XX_TD(XX_PRODUCT.rprnt) XX_TD(^R)) XX_TR(XX_TD(Ignore special meaning of next character) XX_TD(XX_PRODUCT.lnext) XX_TD(^V)) XX_TR(XX_TD(Interrupt) XX_TD(XX_PRODUCT.intr) XX_TD(^C)) XX_TR(XX_TD(Quit) XX_TD(XX_PRODUCT.quit) XX_TD(^XX_BS())) XX_TR(XX_TD(End of file) XX_TD(XX_PRODUCT.eof) XX_TD(^D)) XX_TE() ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_LP Separate keymaps can be defined for use only when XX_FB(XX_PRODUCT) is in 3270 mode or XX_SM(NVT) mode. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) for details. ')dnl ifelse(XX_PRODUCT,x3270,`include(menus.inc)',`XX_SH(Toggles) XX_FB(XX_PRODUCT) has a number of configurable modes which may be selected by the XX_FB(XX_DASHED(set)) and XX_FB(XX_DASHED(clear)) options. These names can also be used as the first parameter to the XX_FB(Toggle) action, and are the names of resources that can be used to set or clear the value of each toggle at start-up. XX_TPS()dnl XX_TP(XX_FB(aidWait)) Changes the behavior of actions that send an XX_SM(AID) to the host (XX_FB(Enter), XX_FB(Clear), XX_FB(PA) and XX_FB(PF)). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the XX_FB(Wait(Unlock)) action to wait for the unlock. ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(altCursor)) If set, the cursor will be an underline. If clear, it will be a solid block. ')dnl XX_TP(XX_FB(blankFill)) If set, XX_FB(XX_PRODUCT) modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying XX_DQUOTED(lock-up) that often occurs when inserting into an field with (apparent) space at the end. ifelse(XX_MODE,console,`XX_TP(XX_FB(crosshair)) When set, XX_PRODUCT will display a crosshair to help locate the cursor on the screen. ')dnl XX_TP(XX_FB(lineWrap)) If set, the XX_SM(NVT) terminal emulator automatically assumes a XX_SM(NEWLINE) character when it reaches the end of a line. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(marginedPaste)) If set, pasting multi-line input via the XX_FB(Paste) action will maintain a left margin (it will not move the cursor further left than where the paste begins). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(monoCase)) If set, XX_FB(XX_PRODUCT) operates in uppercase-only mode. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(overlayPaste)) If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the XX_FB(marginedPaste) toggle. ')dnl XX_TP(XX_FB(screenTrace)) Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). ifelse(XX_MODE,console,`XX_TP(XX_FB(showTiming)) If set, the time taken by the host to process an XX_SM(AID) is displayed on the status line. ')dnl XX_TP(XX_FB(trace)) Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the wc3270 AppData directory',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). The directory for the trace file can be changed with the "XX_PRODUCT.traceDir" resource. Script commands are also traced. ifelse(XX_MODE,console,`XX_TP(XX_FB(underscore)) If set, XX_PRODUCT will display underlined fields by substituting underscore XX_DQUOTED(_) characters for blanks or nulls in the field. Otherwise, these fields will be displayed ifelse(XX_PRODUCT,c3270,`using the XX_POSESSIVE(terminal) native underlining mode, if one is defined. ',`with a highlighted background. Note that setting XX_FB(underscore) also disables the highlighted background for blinking fields. XX_FB(underscore) is set by default. ')dnl ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(visibleControl)) If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes XX_DQUOTED(XX_LT()), SI becomes XX_DQUOTED(>). Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in ifelse(c3270,`underlined',wc3270,`reverse-video') yellow. Field attribute mappings are part of the XX_FB(XX_PRODUCT) Resources documentation for the XX_FB(visibleControl) resource. ')dnl XX_TPE()dnl XX_LP ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_SH(Status Line) ifelse(XX_PRODUCT,c3270,`If the terminal that XX_FB(XX_PRODUCT) is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), XX_FB(XX_PRODUCT) will display a status line. ')dnl The XX_FB(XX_PRODUCT) status line contains a variety of information. From left to right, the fields are: XX_TPS()dnl XX_TP(XX_FB(comm status)) The first symbol is always a XX_FB(4). If XX_FB(XX_PRODUCT) is in TN3270E mode, the second symbol is a XX_FB(B); otherwise it is an XX_FB(A). ifelse(XX_PRODUCT,x3270,`If XX_FB(x3270) is disconnected, the third symbol is a question mark. Otherwise, if ',`If ') XX_FB(XX_PRODUCT) is in SSCP-LU mode, the third symbol is an XX_FB(S). Otherwise it is blank. XX_TP(XX_FB(keyboard lock)) If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock. ifelse(XX_PRODUCT,x3270,`XX_TP(`XX_FB(`shift')') Three characters indicate the keyboard modifier status. "M" indicates the Meta key, "A" the Alt key, and an up-arrow or "^" indicates the Shift key. XX_TP(XX_FB(compose)) The letter "C" indicates that a composite character is in progress. If another symbol follows the "C", it is the first character of the composite. ')dnl XX_TP(XX_FB(typeahead)) The letter "T" indicates that one or more keystrokes are in the typeahead buffer. XX_TP(XX_FB(temporary keymap)) The letter "K" indicates that a temporary keymap is in effect. XX_TP(XX_FB(reverse)) The letter "R" indicates that the keyboard is in reverse field entry mode. XX_TP(XX_FB(insert mode)) ifelse(XX_PRODUCT,x3270,`A thick caret "^" or the ', `The ') letter "I" indicates that the keyboard is in insert mode. XX_TP(XX_FB(printer session)) The letter "P" indicates that a XX_FI(pr3287) session is active. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(script)) The letter "S" indicates that a script is active. ')dnl ifelse(XX_PRODUCT,x3270,,`XX_TP(XX_FB(secure connection)) A green letter "S" indicates that the connection is secured via SSL/TLS. ')dnl XX_TP(XX_FB(LU name)) The LU name associated with the session, if there is one. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(timing)) A clock symbol and a time in seconds indicate the time it took to process the last XX_SM(AID) or the time to connect to a host. This display is optional. ')dnl XX_TP(XX_FB(cursor position)) The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0. XX_TPE()dnl ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Icons) If the XX_FB(XX_DASHED(activeicon)) option is given (or the "XX_PRODUCT.activeIcon" resource is set to XX_FB(true)`)', XX_FB(XX_PRODUCT) will attempt to make its icon a miniature version of the current screen image. This function is highly dependent on your window manager: XX_TPS()dnl XX_TP(XX_FB(mwm)) The size of the icon is limited by the "Mwm.iconImageMaximum" resource, which defaults to XX_FB(50x50). The image will be clipped at the bottom and right. The icon cannot accept keyboard input. XX_TP(XX_FB(olwm)) The full screen image of all 3270 models can be displayed on the icon. However, the icon cannot be resized, so if the model is later changed with an XX_FB(XX_PRODUCT) menu option, the icon image will be corrupted. The icon cannot accept keyboard input. XX_TP(XX_FB(twm) and XX_FB(tvtwm)) The full screen image of all 3270 models can be displayed on the icon, and the icon can be resized. The icon can accept keyboard input. XX_IP However, XX_FB(twm) does not put labels on application-supplied icon windows. You can have XX_FB(XX_PRODUCT) add its own label to the icon by setting the "XX_PRODUCT.labelIcon" resource to XX_FB(true). The default font for icon labels is XX_FB(8x13); you may change it with the "XX_PRODUCT.iconLabelFont" resource. XX_TPE()dnl include(xkeymaps.inc)') define(XX_LPAREN,`ifelse(XX_PRODUCT,tcl3270,` ',`(')')dnl define(XX_RPAREN,`ifelse(XX_PRODUCT,tcl3270,,`)')')dnl define(XX_COMMA,`ifelse(XX_PRODUCT,tcl3270,` ',`, ')')dnl define(XX_SPACE,`ifelse(XX_PRODUCT,tcl3270,` ',`')')dnl define(XX_WAIT,`ifelse(XX_PRODUCT,tcl3270,`Wait [XX_FI(timeout)] $1', `Wait$1(XX_FI(timeout))')')dnl XX_TARGET(actions)dnl ifelse(XX_PRODUCT,x3270,, XX_PRODUCT,tcl3270, `XX_SH(Commands) XX_FB(XX_PRODUCT) supports the following additional tcl commands: ', `XX_SH(Actions) Here is a complete list of basic XX_PRODUCT actions. Script-specific actions are described on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. ')dnl define(XX_BLOCK,*))dnl XX_PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. XX_PP XX_TS(2,center; lw(3i) lw(3i).) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ascii'`') XX_TD(return entire screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region as text)) XX_TR(XX_TDH(`AsciiField') XX_TD(return current field as text)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Attn') XX_TD(attention key)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(AltCursor) XX_TD(switch between block and underscore cursor)) ')dnl XX_TR(XX_TDH(`BackSpace') XX_TD(move cursor left (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`BackTab') XX_TD(tab to start of previous input field)) XX_TR(`XX_TDH(CircumNot) XX_TD(`input "^" in XX_SM(NVT) mode, or "XX_NOT" in 3270 mode'')) XX_TR(XX_TDH(XX_BLOCK()`Clear') XX_TD(clear screen)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Cols') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Compose) XX_TD(next two keys form a special symbol)) ')dnl XX_TR(XX_TDH(XX_BLOCK()Connect`'XX_LPAREN`'XX_FI(host)`'XX_RPAREN) XX_TD(connect to XX_FI(host))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Copy') XX_TD(copy highlighted area to clipboard)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`CursorSelect') XX_TD(Cursor Select XX_SM(AID))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Cut) XX_TD(copy highlighted area to clipboard and erase)) XX_TR(XX_TDH(Default) XX_TD(enter key literally)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Cut') XX_TD(copy highlighted area to clipboard and erase)) ')dnl XX_TR(XX_TDH(`Delete') XX_TD(delete character under cursor (or send XX_SM(ASCII DEL)))) XX_TR(XX_TDH(`DeleteField') XX_TD(delete the entire field)) XX_TR(XX_TDH(`DeleteWord') XX_TD(delete the current or previous word)) XX_TR(XX_TDH(XX_BLOCK()`Disconnect') XX_TD(disconnect from host)) XX_TR(XX_TDH(`Down') XX_TD(move cursor down)) XX_TR(XX_TDH(`Dup') XX_TD(duplicate field)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ebcdic'`') XX_TD(return entire screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region in XX_SM(EBCDIC))) XX_TR(XX_TDH(`EbcdicField') XX_TD(return current field in XX_SM(EBCDIC))) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Enter') XX_TD(Enter XX_SM(AID) (or send XX_SM(ASCII CR)))) XX_TR(XX_TDH(`Erase') XX_TD(erase previous character (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`EraseEOF') XX_TD(erase to end of current field)) XX_TR(XX_TDH(`EraseInput') XX_TD(erase all input fields)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(Escape) XX_TD(escape to XX_FB(c3270>) prompt)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Execute(XX_FI(cmd))) XX_TD(execute a command in a shell)) ')dnl XX_TR(XX_TDH(`FieldEnd') XX_TD(move cursor to end of field)) XX_TR(XX_TDH(`FieldMark') XX_TD(mark field)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(HandleMenu(XX_FI(name))) XX_TD(pop up a menu)) ')dnl XX_TR(XX_TDH(`HexString'`'XX_LPAREN`'XX_FI(hex_digits)`'XX_RPAREN) XX_TD(insert control-character string)) XX_TR(XX_TDH(`Home') XX_TD(move cursor to first input field)) XX_TR(XX_TDH(`Insert') XX_TD(set insert mode)) XX_TR(XX_TDH(XX_BLOCK()`Interrupt') XX_TD(send XX_SM(TELNET IP) to host)) ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Keypad') XX_TD(Display pop-up keypad)) ')dnl XX_TR(XX_TDH(Key`'XX_LPAREN`'XX_FI(keysym)`'XX_RPAREN) XX_TD(insert key XX_FI(keysym))) XX_TR(XX_TDH(Key`'XX_LPAREN`'0x`'XX_FI(xx)`'XX_RPAREN) XX_TD(insert key with character code XX_FI(xx))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Keymap(XX_FI(keymap))) XX_TD(toggle alternate XX_FI(keymap) (or remove with XX_FB(None)))) XX_TR(XX_TDH(KybdSelect(XX_FI(direction) [,XX_FI(atom)...])) XX_TD(Extend selection by one row or column)) ')dnl XX_TR(XX_TDH(`Left') XX_TD(move cursor left)) XX_TR(XX_TDH(`Left2') XX_TD(move cursor left 2 positions)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Macro(XX_FI(macro))) XX_TD(run a macro)) ')dnl ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Menu') XX_TD(Display menu bar)) ')dnl XX_TR(XX_TDH(`MonoCase') XX_TD(toggle uppercase-only mode)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(MoveCursor) XX_TD(move cursor to mouse position)) ')dnl XX_TR(XX_TDH(MoveCursor`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_RPAREN) XX_TD(move cursor to zero-origin (XX_FI(row),XX_FI(col)))) ifelse(XX_PRODUCT,x3270,`XX_TR(`XX_TDH(XX_BLOCK()MoveCursorSelect) XX_TD(`move cursor to mouse position, light pen selection'')) ')dnl XX_TR(XX_TDH(`Newline') XX_TD(move cursor to first field on next line (or send XX_SM(ASCII LF)))) XX_TR(XX_TDH(`NextWord') XX_TD(move cursor to next word)) XX_TR(XX_TDH(XX_BLOCK()PA`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Attention XX_SM(AID) (XX_FI(n) from 1 to 3))) XX_TR(XX_TDH(XX_BLOCK()PF`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Function XX_SM(AID) (XX_FI(n) from 1 to 24))) XX_TR(XX_TDH(`PreviousWord') XX_TD(move cursor to previous word)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Paste') XX_TD(insert clipboard contents))')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(Printer(Start[,XX_FI(lu)]|Stop)) XX_TD(start or stop printer session)) ')dnl ifelse(XX_PLATFORM,windows,`XX_TR(XX_TDH(PrintText([gdi|wordpad,][dialog|nodialog,]XX_FI([printer-name]))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(PrintText(XX_FI(command))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(PrintWindow(XX_FI(command))) XX_TD(print screen image (bitmap) on printer)) ')dnl XX_TR(XX_TDH(Quit) XX_TD(exit XX_FB(XX_PRODUCT))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Reconnect) XX_TD(reconnect to previous host)) ')dnl XX_TR(XX_TDH(`Redraw') XX_TD(redraw window)) XX_TR(XX_TDH(`Reset') XX_TD(reset locked keyboard)) XX_TR(XX_TDH(`Right') XX_TD(move cursor right)) XX_TR(XX_TDH(`Right2') XX_TD(move cursor right 2 positions)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ascii`') XX_TD(dump screen buffer as text)) XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ebcdic`') XX_TD(dump screen buffer in EBCDIC)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Rows') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Script(XX_FI(command)[,XX_FI(arg)...])) XX_TD(run a script)) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TR(XX_TDH(Scroll(Forward|Backward)) XX_TD(scroll screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SelectAll(XX_FI(atom))) XX_TD(select entire screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SetFont(XX_FI(font))) XX_TD(change emulator font)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `ifelse(XX_PRODUCT,tcl3270,`XX_TR(XX_TDH(Snap) XX_TD(same as XX_FB(Snap Save))) ')dnl XX_TR(XX_TDH(Snap`'XX_SPACE`'Ascii`') XX_TD(report saved screen data (see XX_FB(Ascii)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Cols`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Ebcdic`') XX_TD(report saved screen data (see XX_FB(Ebcdic)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'ReadBuffer`') XX_TD(report saved screen data (see XX_FB(ReadBuffer)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Rows`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Save`') XX_TD(save screen image)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Status`') XX_TD(report saved connection status)) XX_TR(XX_TDH(`ifelse(XX_PRODUCT,tcl3270,`XX_BLOCK()Snap Wait [XX_FI(timeout)] Output', `XX_BLOCK()SnapWaitOuput(XX_FI(timeout))')') XX_TD(wait for host output and save screen image)) ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Source(XX_FI(file))) XX_TD(read commands from XX_FI(file))) ')dnl XX_TR(XX_TDH(Status`') XX_TD(report connection status)) ')dnl XX_TR(XX_TDH(XX_BLOCK()String`'XX_LPAREN`'XX_FI(string)`'XX_RPAREN) XX_TD(insert string (simple macro facility))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(XX_BLOCK()`SelectDown') XX_TD(Extend selection down)) XX_TR(XX_TDH(SelectLeft) XX_TD(Extend selection left)) XX_TR(XX_TDH(SelectUp) XX_TD(Extend selection up)) XX_TR(XX_TDH(SelectDown) XX_TD(Extend selection down)) XX_TR(XX_TDH(SysReq) XX_TD(System Request XX_SM(AID))) ')dnl XX_TR(XX_TDH(`Tab') XX_TD(move cursor to next input field)) XX_TR(XX_TDH(`Toggle'XX_LPAREN`'XX_FI(option)[,XX_FI(set|clear)]XX_RPAREN) XX_TD(toggle an option)) XX_TR(XX_TDH(`ToggleInsert') XX_TD(toggle insert mode)) XX_TR(XX_TDH(`ToggleReverse') XX_TD(toggle reverse-input mode)) XX_TR(XX_TDH(XX_BLOCK()Transfer`'XX_LPAREN`'XX_FI(option)=XX_FI(value)...'`'XX_RPAREN) XX_TD(file transfer)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Unselect) XX_TD(release selection)) ')dnl XX_TR(XX_TDH(`Up') XX_TD(move cursor up)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(ignore) XX_TD(do nothing)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(3270mode)) XX_TD(wait for 3270 mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Disconnect)) XX_TD(wait for host to disconnect)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(InputField)) XX_TD(wait for valid input field)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(NVTMode)) XX_TD(wait for NVT mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Output)) XX_TD(wait for more host output)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_T_() XX_TR(XX_TDH((the following are similar to xterm),COLSPAN="2")) XX_T_() XX_TR(XX_TDH(ignore) XX_TD(do nothing)) XX_TR(`XX_TDH(insert-selection([XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(``paste' selection')') XX_TR(XX_TDH(move-select) XX_TD(a combination of XX_FB(MoveCursor) and XX_FB(select-start))) XX_TR(XX_TDH(select-end(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(complete selection and assign to atom(s))) XX_TR(XX_TDH(select-extend) XX_TD(move the end of a selection)) XX_TR(XX_TDH(select-start) XX_TD(mark the beginning of a selection)) XX_TR(XX_TDH(set-select(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(assign existing selection to atom(s))) XX_TR(XX_TDH(start-extend) XX_TD(begin marking the end of a selection)) ')dnl XX_TE() ifelse(XX_MODE,console,`XX_LP Any of the above actions may be entered at the XX_FB(XX_PRODUCT>) prompt; these commands are also available for use in keymaps (see XX_LINK(#Keymaps,XX_SM(KEYMAPS))). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.: XX_RS(PF(1)) or with spaces, e.g.: XX_RS(PF 1) Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used. XX_LP XX_FB(XX_PRODUCT) also supports the following interactive commands: XX_TPS()dnl XX_TP(XX_FB(Help)) Displays a list of available commands. XX_TP(XX_FB(ScreenTrace)) Turns screen tracing (saving screen images to a file) on or off. The command XX_FB(screentrace on) enables screen tracing; the command XX_FB(screentrace off) disables it. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). The keyaord XX_FB(on) can also be followed by the keyword XX_FB(printer) and an optional ifelse(XX_PRODUCT,wc3270,printer name,print command) to direct screen traces directly to the printer. XX_TP(XX_FB(Show)) Displays statistics and settings. XX_TP(XX_FB(Trace)) Turns tracing on or off. The command XX_FB(trace on) enables data stream and keyboard event tracing; the command XX_FB(trace off) disables it. The qualifier XX_FB(data) or XX_FB(keyboard) can be specified before XX_FB(on) or XX_FB(off) to enable or disable a particular trace. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). XX_TPE()dnl ')dnl XX_LP Note that certain parameters to XX_PRODUCT actions (such as the names of files and keymaps) are subject to XX_FI(substitutions): XX_LP The character XX_FB(~) at the beginning of a string is replaced with the user's home directory. ifelse(XX_PLATFORM,unix,`A XX_FB(~) character followed by a username is replaced with that XX_POSESSIVE(user) home directory. ')dnl XX_LP Environment variables are substituted using the Unix shell convention of $XX_FI(name) or ${XX_FI(name)}. XX_LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. ifelse(XX_PRODUCT,c3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,wc3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,x3270,,`include(ft.inc) ')dnl XX_SH(The PrintText Action) The XX_FB(PrintText) produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is ifelse(XX_PLATFORM,windows,`the name of the printer to use', `the command to use to print, e.g., XX_FB(lpr)'). ifelse(XX_PLATFORM,windows,`The font defaults to XX_FB(Courier New) and the point size defaults to XX_FI(auto) (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. Unless the XX_FB(wordpad) keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. XX_FB(printTextHorizontalMargin) defines the left- and right-hand margins. XX_FB(printTextVerticalMargin) defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with XX_FB(mm) or XX_FB(cm). XX_FB(printTextOrientation) defines the page orientation as XX_FB(portrait) or XX_FB(landscape). ')dnl XX_LP Multiple arguments can include keywords to control the output of XX_FB(PrintText): XX_TPS()dnl ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(gdi)) Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default). XX_TP(XX_FB(wordpad)) Create an RTF file and run WordPad to print it. (This was the former default). XX_TP(XX_FB(dialog)) In GDI mode, pop up the Windows print dialog. ifelse(XX_PRODUCT,wc3270,`(This is the default.) ')dnl XX_TP(XX_FB(nodialog)) In GDI mode, skip the usual Windows print dialog. ifelse(XX_PRODUCT,ws3270,`(This is the default.) ')dnl ')dnl XX_TP(XX_FB(file) XX_FI(filename)) Save the output in a file. XX_TP(XX_FB(html)) Save the output as HTML. This option implies XX_FB(file). XX_TP(XX_FB(rtf)) Save the output as RichText. This option implies XX_FB(file). The font defaults to XX_FB(Courier New) and the point size defaults to 8. These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(string)) Return the output as a string. This can only be used from scripts. ')dnl XX_TP(XX_FB(modi)) Render modified fields in italics. XX_TP(XX_FB(caption) XX_FI(text)) Add the specified XX_FI(text) as a caption above the output. Within XX_FI(text), the special sequence XX_FB(%T%) will be replaced with a timestamp. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(secure)) Disables the pop-up dialog. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(command) XX_FI(command)) Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. ')dnl XX_TPE() define(XX_SCRIPTS,`ifelse(XX_PRODUCT,x3270,Macros and Scripts, XX_PRODUCT,c3270,Scripts, Nested Scripts)')dnl XX_SH(XX_SCRIPTS) ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`There are several types of ifelse(XX_PRODUCT,x3270,`macros and ', XX_PRODUCT,x3270,,XX_PRODUCT,c3270,, `nested ')dnl script functions available. ')dnl XX_TPS()dnl XX_TP(XX_FB(The String XX_Action)) The simplest method for ifelse(XX_PRODUCT,x3270,`macros ', XX_PRODUCT,c3270,`scripting ', `nested scripts ')dnl is provided via the XX_FB(String) XX_action`'ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,tcl3270,,`, which can be bound to any key in a keymap'). The arguments to XX_FB(String) are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the XX_SM(AID) code to the host, XX_FB(XX_PRODUCT) will wait for the host to unlock the keyboard before further processing the string.) XX_TS(2,l l.) XX_TR(XX_TD(XX_BS()b) XX_TD(Left)) XX_TR(XX_TD(XX_BS()`e'XX_FI(xxxx)) XX_TD(EBCDIC character in hex)) XX_TR(XX_TD(XX_BS()f) XX_TD(Clear*)) XX_TR(XX_TD(XX_BS()n) XX_TD(Enter*)) XX_TR(XX_TD(XX_BS()`pa'XX_FI(n)) XX_TD(PA(XX_FI(n))*)) XX_TR(XX_TD(XX_BS()`pf'XX_FI(nn)) XX_TD(PF(XX_FI(nn))*)) XX_TR(XX_TD(XX_BS()r) XX_TD(Newline)) XX_TR(XX_TD(XX_BS()t) XX_TD(Tab)) XX_TR(XX_TD(XX_BS()T) XX_TD(BackTab)) XX_TR(XX_TD(XX_BS()`u'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TR(XX_TD(XX_BS()`x'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TE() XX_IP Note that the numeric values for the XX_BS()e, XX_BS()u and XX_BS()x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if XX_PRODUCT is built with DBCS support and the host allows DBCS input in the current field. ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270, `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Alt,p): String("probs clearrdr`'XX_BS()n")) ', `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Meta,p): String("probs clearrdr`'XX_BS()n")) ')dnl XX_IP XX_FB(Note:) The strings are in XX_SM(ASCII) and converted to XX_SM(EBCDIC), so beware of inserting control codes. ifelse(XX_PRODUCT,x3270,`Also, a backslash before a XX_FB(p) may need to be doubled so it will not be removed when a resource file is read. ')dnl XX_IP There is also an alternate form of the XX_FB(String) XX_action, XX_FB(HexString), which is used to enter non-printing data. The argument to XX_FB(HexString) is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent XX_SM(EBCDIC) characters, which are entered into the current field. In XX_SM(NVT) mode, the hexadecimal data represent XX_SM(ASCII) characters, which are sent directly to the host. ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(The Script Action)) This action causes XX_FB(XX_PRODUCT) to start a child process which can execute XX_FB(XX_PRODUCT) actions. ifelse(XX_PLATFORM,windows, `XX_FB(XX_PRODUCT) listens for connections from the child process on a dynamically-generated TCP port. ', `Standard input and output from the child process are piped back to XX_FB(XX_PRODUCT). ')dnl The XX_FB(Script) action is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(The macros Resource)) An alternate method of defining macros is the "XX_PRODUCT.macros" resource. This resource is similar to a keymap, but instead of defining keyboard mappings, it associates a list of X actions with a name. These names are displayed on a Macros menu that appears when XX_FB(XX_PRODUCT) is connected to a host. Selecting one of the names on the menu executes the X actions associated with it. Typically the actions are XX_FB(String) calls, but any action may be specified. Here is a sample macros resource definition, which would result in a four-entry Macros menu: XX_RS(XX_PRODUCT.macros: XX_BS() XX_BR log off: String("logout`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR vtam: String("dial vtam`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR pa1: PA(1)XX_BS()n`'XX_BS() XX_BR alt printer: PrintText("lpr -Plw2")) XX_IP You can also define a different set of macros for each host. If there is a resource named XX_DQUOTED(XX_PRODUCT.XX_FI(macros).XX_FI(somehost)), it defines the macros menu for when XX_FB(XX_PRODUCT) is connected to XX_FI(somehost). XX_TP(XX_FB(The XX_DASHED(script) Option)) This facility allows XX_FB(XX_PRODUCT) to operate under the complete control of a script. XX_FB(XX_PRODUCT) accepts actions from standard input, and prints results on standard output. The XX_FB(XX_DASHED(script)) option is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`XX_SH(Composite Characters) XX_FB(XX_PRODUCT) allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A `C' on the status line indicates a pending composite character. XX_PP The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "XX_PRODUCT.composeMap" resource; it gives the name of the map to use. The maps themselves are named "XX_PRODUCT.composeMap.XX_FI(name)". The default is "latin1", which gives mappings for most of the symbols in the XX_SM(ISO) 8859-1 Latin-1 character set that are not in the 7-bit XX_SM(ASCII) character set. XX_PP XX_FB(Note:) The default keymap defines ifelse(XX_PRODUCT,x3270,`the "Multi_key" keysym',`XX_KEY(Meta,m)') as the "Compose" key. ifelse(XX_PRODUCT,x3270,`If your keyboard lacks such a key, you',`You') may set up your own "Compose" key with a keymap that maps some other keysym onto the XX_FB(Compose) action. ')dnl ifelse(XX_PRODUCT,x3270,`include(apl.inc)')dnl ifelse(XX_PRODUCT,c3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(pr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(pr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(c3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(pr3287). XX_LP See XX_FI(pr3287)(1) for further details. XX_LP The resource XX_FB(c3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(wpr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(wpr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(wc3270.printer.name) specifies the Windows printer used to print each job. It defaults to the value of the XX_FB($PRINTER) environment variable, if set. Otherwise the default system printer is used. This resource also controls the printer used by the XX_FB(PrintText) action. XX_LP The resource XX_FB(wc3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(wpr3287). XX_LP See XX_FI(wpr3287)(1) for further details. XX_LP The resource XX_FB(wc3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Screen Printing) Screen printing is handled through options on the XX_FB(File) menu or by the XX_FB(PrintText) and XX_FB(PrintWindow) actions. Each results in a pop-up to confirm the print command. XX_PP The XX_FB(PrintText) action (usually assigned to the key XX_LT()Meta>p) sends the current screen image to the printer as XX_SM(ASCII) characters. The default command used to print the data is controlled by the "XX_PRODUCT.printTextCommand" resource; the default is XX_FB(lpr). You may also use a keymap definition to pass a print command the XX_FB(PrintText) action itself. The command receives the screen text as its standard input. For example, the following keymap will save the screen text in a file: XX_IP XX_RS(XX_KEY(Meta,f): PrintText("cat >screen.image")) XX_PP Note: XX_FB(HardPrint) is an alias for XX_FB(PrintText). XX_PP The XX_FB(PrintWindow) action (usually assigned to the key XX_LT()Meta>b) sends the current screen image to the printer as a bitmap. The default command used to print the data is controlled by the "XX_PRODUCT.printWindowCommand" resource; the default is XX_IP XX_RS(XX_FB(xwd XX_DASHED(id) %d | xpr | lpr).) XX_PP You may also use a keymap definition to pass a print command to the XX_FB(PrintWindow) action itself. If the command contains the text "%d", the window ID of XX_FB(XX_PRODUCT) will be substituted before it is run. For example, the following keymap will pop up a duplicate of the current screen image: XX_IP XX_RS(XX_KEY(Meta,g): PrintWindow("xwd XX_DASHED(id) %d | xwud &")) XX_LP If the command for PrintWindow or PrintText begins with an "@" character, the initial pop-up menu to confirm the print command is not displayed and the command cannot be edited. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Bugs) Cursor highlighting will not work with if you use the XX_FB(NoTitleFocus) option in your .twmrc file. ')dnl ifelse(XX_PRODUCT,wc3270,,` XX_SH(Passthru) XX_FB(XX_PRODUCT) supports the Sun XX_FI(telnet-passthru) service provided by the XX_FI(in.telnet-gw) server. This allows outbound telnet connections through a firewall machine. When a XX_FB(p:) is prepended to a hostname, XX_FB(XX_PRODUCT) acts much like the XX_FI(itelnet)(1) command. It contacts the machine named XX_FB(internet-gateway) at the port defined in XX_FB(/etc/services) as XX_FB(telnet-passthru) (which defaults to 3514). It then passes the requested hostname and port to the XX_FB(in.telnet-gw) server. ')dnl XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option or the XX_FB(XX_PRODUCT.proxy) resource causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option or resource is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. ifelse(XX_PRODUCT,x3270,,`include(resources.inc)')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_SH(Files) ifelse(XX_PRODUCT,x3270,/usr/lib/X11,/usr/local/lib)/x3270/ibm_hosts XX_BR ifelse(XX_PRODUCT,x3270,`$HOME/.x3270pro ',XX_PRODUCT,c3270,`$HOME/.c3270pro ') ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Environment Variables) XX_FB(3270PRO) Path of profile file, containing resource definitions. Merged after the system resource database, but before XX_FB(X3270RDB). Defaults to $HOME/.x3270pro. XX_BR XX_FB(NOX3270PRO) If set, do not read the profile. XX_BR XX_FB(X3270RDB) Additional resource definitions, merged after the profile file but before the command-line options. XX_BR XX_FB(KEYMAP) Keymap name. XX_BR XX_FB(KEYBD) Keymap name. ')dnl XX_SH(See Also) ifelse(XX_INTERACTIVE,yes,XX_LINK(XX_PR3287-man.html,XX_PR3287`'(1))`, ')dnl ifelse(XX_PRODUCT,XX_S3270,,XX_LINK(XX_S3270-man.html,XX_S3270`'(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(XX_X3270-script.html,`XX_X3270-script`'(1)), ')dnl ifelse(XX_PLATFORM,unix,`ifelse(XX_PRODUCT,x3270,,XX_LINK(x3270-man.html,x3270(1))`, ')dnl ifelse(XX_PRODUCT,c3270,,XX_LINK(c3270-man.html,c3270(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(tcl3270-man.html,tcl3270(1))`, ')dnl ')dnl telnet(1), tn3270(1)dnl ifelse(XX_PRODUCT,x3270,`, XX_LINK(ibm_hosts.html,ibm_hosts(5)) XX_BR X Toolkit Intrinsics ',` ')dnl XX_BR Data Stream XX_POSESSIVE(Programmer) Reference, IBM GA23-0059 XX_BR Character Set Reference, IBM GA27-3831 XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()2004-2005, Don Russell. XX_BR Copyright`'XX_COPY()2004, Dick Altenbern. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/tcl3270/x3270-script.man.m40000664000076500007650000006544613221577163015412 0ustar pdmpdmdnl Copyright (c) 2000-2014, 2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270-SCRIPT,1,XX_DATE) XX_SH(Name) Scripting Facilities for ifelse(XX_PLATFORM,unix,`x3270,') XX_C3270 and XX_S3270 XX_SH(Synopsis) ifelse(XX_PLATFORM,unix,`XX_FB(x3270) XX_FB(XX_DASHED(script)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(socket)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(scriptport) XX_FI(port)) [ XX_FI(x3270-options) ] XX_BR ')dnl ifelse(XX_PLATFORM,unix,`XX_FB(XX_C3270) XX_FB(XX_DASHED(socket)) [ XX_FI(XX_C3270-options) ] XX_BR ')dnl XX_FB(XX_C3270) XX_FB(XX_DASHED(scriptport)) XX_FI(port) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(XX_S3270) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(`Script') ( XX_FI(command) [ `,'XX_FI(arg)... ] ) XX_SH(Description) The XX_FB(x3270) scripting facilities allow the interactive 3270 ifelse(XX_PLATFORM,unix,`emulators XX_FB(x3270) and XX_FB(c3270)', `emulator XX_FB(wc3270)') to be operated under the control of another program, and forms the basis for the script-only emulator XX_FB(XX_S3270). XX_PP There are ifelse(XX_PLATFORM,unix,four,three) basic scripting methods. The first is the XX_FB(peer script) facility, ifelse(XX_PLATFORM,unix,`invoked by the XX_FB(x3270) XX_FB(XX_DASHED(script)) switch, and ')dnl the default mode for XX_FB(XX_S3270). This runs the emulator as a child of another process. Typically this would be a script using XX_FI(expect)(1), XX_FI(perl)(1), or the co-process facility of the Korn Shell XX_FI(ksh)(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. XX_PP The second method is the XX_FB(child script) facility, invoked by the emulator's XX_FB(Script) action. This runs a script as a child process of the emulator. ifelse(XX_PLATFORM,unix,`The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. ',`The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196). ')dnl XX_PP The third method uses a TCP socket. The XX_FB(XX_DASHED(scrpiptport)) command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. ifelse(XX_PLATFORM,windows,`(Note that if the XX_FB(Script) action is used with XX_FB(XX_DASHED(scriptport)), it will pass the scriptport port number to child scripts, rather than creating a new socket.) ')dnl ifelse(XX_PLATFORM,unix,`XX_PP The fourth method uses a Unix-domain socket. The XX_FB(XX_DASHED(socket)) command-line option causes the emulator to create a Unix-domain stream socket named XX_FB(/tmp/x3sck.)`'XX_FI(pid). The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. ')dnl XX_PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the XX_FB(Script) action. The calling script will be resumed when the nested script completes. XX_PP Commands are emulator XX_FI(actions); the syntax is the same as for the right-hand side of ifelse(XX_PLATFORM,unix,`an XX_FB(x3270) or',`a') XX_FB(XX_C3270) keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with XX_FB(#) or XX_FB(!) is treaded as a comment and will be ignored. XX_PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. XX_PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". XX_SH(Status Format) The status message consists of 12 blank-separated fields: XX_TPS()dnl XX_TP(1 Keyboard State) If the keyboard is unlocked, the letter XX_FB(U). If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter XX_FB(L). If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter XX_FB(E). XX_TP(2 Screen Formatting) If the screen is formatted, the letter XX_FB(F). If unformatted or in XX_SM(NVT) mode, the letter XX_FB(U). XX_TP(3 Field Protection) If the field containing the cursor is protected, the letter XX_FB(P). If unprotected or unformatted, the letter XX_FB(U). XX_TP(4 Connection State) If connected to a host, the string XX_FB(`C(')`'XX_FI(hostname)`'XX_FB(`)'). Otherwise, the letter XX_FB(N). XX_TP(5 Emulator Mode) If connected in 3270 mode, the letter XX_FB(I). If connected in XX_SM(NVT) line mode, the letter XX_FB(L). If connected in XX_SM(NVT) character mode, the letter XX_FB(C). If connected in unnegotiated mode (no BIND active from the host), the letter XX_FB(P). If not connected, the letter XX_FB(N). XX_TP(6 Model Number (2-5)) XX_TP(7 Number of Rows) The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. XX_TP(8 Number of Columns) The current number of columns defined on the screen, subject to the same difference for rows, above. XX_TP(9 Cursor Row) The current cursor row (zero-origin). XX_TP(10 Cursor Column) The current cursor column (zero-origin). XX_TP(11 Window ID) The X window identifier for the main XX_FB(x3270) window, in hexadecimal preceded by XX_FB(0x). For XX_FB(XX_S3270) and XX_FB(XX_C3270), this is zero. XX_TP(12 Command Execution Time) The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. XX_TPE()dnl XX_SH(Differences) When an action is initiated by a script, the emulators behave in several different ways: XX_PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. XX_PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the XX_FB(CloseScript) action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the XX_FB(Script) action to complete. XX_PP The XX_FB(Quit) action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) XX_PP Normally, the AID actions (XX_FB(Clear), XX_FB(Enter), XX_FB(PF), and XX_FB(PA)) will not complete until the host unlocks the keyboard. If the parameter to a XX_FB(String) action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. XX_PP The XX_FB(AidWait) toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The XX_FB(Wait(Output)) action can then be used to delay a script until the host changes something on the screen, and the XX_FB(Wait(Unlock)) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the XX_FB(AidWait) toggle. XX_PP Note that the XX_FB(Script) action does not complete until ifelse(XX_PLATFORM,unix,`end-of-file is detected on the pipe or ')dnl the XX_FB(CloseScript) action is called by the child process. This behavior is not affected by the state of the XX_FB(AidWait) toggle. XX_SH(Basic Programming Strategies) 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. XX_LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the XX_FB(Snap) action. The XX_FB(Snap(Save)) action saves a snapshot of the screen in a special buffer. Then the script can use XX_FB(Snap) variants of the XX_FB(Ascii) and XX_FB(Ebcdic) actions (XX_FB(Snap(Ascii)) and XX_FB(Snap(Ebcdic))) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, XX_FB(Snap(Wait Output)) blocks the script until the host modifies the screen, specifically since the last call to XX_FB(Snap(Save)). Thus a script can poll the screen efficiently by writing a loop that begins with XX_FB(Snap(Save)) and ends with XX_FB(Snap(Wait Output)). XX_SH(Script-Specific Actions) The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, XX_FI(row) and XX_FI(col) coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). XX_TPS()dnl XX_TP(XX_FB(AnsiText)) Outputs whatever data that has been output by the host in XX_SM(NVT) mode since the last time that XX_FB(AnsiText) was called. The data is preceded by the string "data:XX_NBSP", and has had all control characters expanded into C backslash sequences. XX_IP This is a convenient way to capture XX_SM(NVT) mode output in a synchronous manner without trying to decode the screen contents. XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ascii)(XX_FI(length))) XX_TP(XX_FB(Ascii)) Outputs an XX_SM(ASCII) text representation of the screen contents. Each line is preceded by the string "data:XX_NBSP", and there are no control characters. XX_IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) XX_IP If three parameters are given, XX_FI(length) characters are output, starting at the specified zero-origin row and column. XX_IP If only the XX_FI(length) parameter is given, that many characters are output, starting at the cursor position. XX_IP If no parameters are given, the entire screen is output. XX_IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the XX_FB(XX_DASHED(charset)) option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. XX_TP(XX_FB(AsciiField)) Outputs an XX_SM(ASCII) text representation of the field containing the cursor. The text is preceded by the string "data:XX_NBSP". XX_TP(XX_FB(Connect)(XX_FI(hostname))) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. XX_TP(XX_FB(CloseScript)(XX_FI(status))) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the XX_FB(Script) action, the optional XX_FI(status) is used as the return status of XX_FB(Script); if nonzero, XX_FB(Script) will complete with an error, and if this script was invoked as part of login through the XX_FB(ibm_hosts) file, the connection will be broken. XX_TP(XX_FB(ContinueScript)([XX_FI(param)])) Allows a script that is waiting in a XX_FB(PauseScript) action, below, to continue. The optional XX_FI(param) string is output by the XX_FB(PauseScript) action. XX_TP(XX_FB(Disconnect)) Disconnects from the host. XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ebcdic)(XX_FI(length))) XX_TP(XX_FB(Ebcdic)) The same function as XX_FB(Ascii) above, except that rather than generating XX_SM(ASCII) text, each character is output as a 2-digit or 4-digit hexadecimal XX_SM(EBCDIC) code. XX_TP(XX_FB(EbcdicField)) The same function as XX_FB(AsciiField) above, except that it generates hexadecimal XX_SM(EBCDIC) codes. XX_TP(XX_FB(Info)(XX_FI(message))) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. XX_TP(XX_FB(Expect)(XX_FI(text)[,XX_FI(timeout)])) Pauses the script until the specified XX_FI(text) appears in the data stream from the host, or the specified XX_FI(timeout) (in seconds) expires. If no XX_FI(timeout) is specified, the default is 30 seconds. XX_FI(Text) can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. XX_FB(Expect) is valid only in XX_SM(NVT) mode. ifelse(XX_MODE,console,`XX_TP(XX_FB(Keymap([XX_FI(keymap)]))) Adds or removes a temporary keymap. If the XX_FI(keymap) parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed. ')dnl XX_TP(XX_FB(MoveCursor)(XX_FI(row),XX_FI(col))) Moves the cursor to the specified zero-origin coordinates. XX_TP(XX_FB(PauseScript)) Stops a script until the XX_FB(ContinueScript) action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to XX_FB(ContinueScript), if one is given. XX_TP(XX_FB(PrintText)([XX_FB(command),]XX_FI(filter))) Pipes an ASCII representation of the current screen image through the named XX_FI(filter), e.g., XX_FB(lpr). XX_TP(XX_FB(PrintText)([XX_FB(html),][XX_FB(append),][XX_FB(replace),]XX_FB(file),XX_FI(filename))) Saves the current screen contents in a file. With the XX_FB(html) option, saves it as HTML, otherwise saves it as plain ASCII. The XX_FB(append) option (the default) causes the data to be appended to the file if it already exists. The XX_FB(replace) option causes the file to be overwritten instead. XX_TP(XX_FB(PrintText)(XX_FB(`html,string'))) Returns the current screen contents as HTML. XX_TP(XX_FB(Query)(XX_FI(keyword))) Returns state information. Keywords are: XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(Keyword) XX_TD(Output)) XX_T_ XX_TR(XX_TD(BindPluName) XX_TD(BIND PLU returned by the host)) XX_TR(XX_TD(ConnectionState) XX_TD(TN3270/TN3270E mode and submode)) XX_TR(XX_TD(CodePage) XX_TD(Host code page)) XX_TR(XX_TD(Cursor) XX_TD(Cursor position (row col), zero-origin)) XX_TR(XX_TD(Formatted) XX_TD(3270 format state (formatted or unformatted))) XX_TR(XX_TD(Host) XX_TD(Host name and port)) XX_TR(XX_TD(LocalEncoding) XX_TD(Local character encoding)) XX_TR(XX_TD(LuName) XX_TD(Host name LU name)) XX_TR(XX_TD(Model) XX_TD(3270 model name (IBM-327x-n))) XX_TR(XX_TD(ScreenCurSize) XX_TD(Current screen size (rows cols))) XX_TR(XX_TD(ScreenMaxSize) XX_TD(Maximum screen size (rows cols))) XX_TR(XX_TD(Ssl) XX_TD(SSL state (secure or not-secure) and host validation state (host-verified or host-unverified))) XX_TE XX_IP Without a XX_FI(keyword), XX_FB(Query) returns each of the defined attributes, one per line, labeled by its name. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ascii))) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as XX_FB(SF`(aa=nn[,...])'), where XX_FI(aa) is a field attribute type and XX_FI(nn) is its value. XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(XX_TC(Attribute)) XX_TD(XX_TC(Values))) XX_T_ XX_TR(XX_TD(XX_TC(c0 basic 3270)) XX_TD(XX_TC(20 protected))) XX_TR(XX_TD() XX_TD(XX_TC(10 numeric))) XX_TR(XX_TD() XX_TD(XX_TC(04 detectable))) XX_TR(XX_TD() XX_TD(XX_TC(08 intensified))) XX_TR(XX_TD() XX_TD(XX_TC(0c non-display))) XX_TR(XX_TD() XX_TD(XX_TC(01 modified))) XX_TR(XX_TD(XX_TC(41 highlighting)) XX_TD(XX_TC(f1 blink))) XX_TR(XX_TD() XX_TD(XX_TC(f2 reverse))) XX_TR(XX_TD() XX_TD(XX_TC(f4 underscore))) XX_TR(XX_TD() XX_TD(XX_TC(f8 intensify))) XX_TR(XX_TD(XX_TC(42 foreground)) XX_TD(XX_TC(f0 neutral black))) XX_TR(XX_TD() XX_TD(XX_TC(f1 blue))) XX_TR(XX_TD() XX_TD(XX_TC(f2 red))) XX_TR(XX_TD() XX_TD(XX_TC(f3 pink))) XX_TR(XX_TD() XX_TD(XX_TC(f4 green))) XX_TR(XX_TD() XX_TD(XX_TC(f5 turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(f6 yellow))) XX_TR(XX_TD() XX_TD(XX_TC(f7 neutral white))) XX_TR(XX_TD() XX_TD(XX_TC(f8 black))) XX_TR(XX_TD() XX_TD(XX_TC(f9 deep blue))) XX_TR(XX_TD() XX_TD(XX_TC(fa orange))) XX_TR(XX_TD() XX_TD(XX_TC(fb purple))) XX_TR(XX_TD() XX_TD(XX_TC(fc pale green))) XX_TR(XX_TD() XX_TD(XX_TC(fd pale turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(fe grey))) XX_TR(XX_TD() XX_TD(XX_TC(ff white))) XX_TR(XX_TD(XX_TC(43 character set)) XX_TD(XX_TC(f0 default))) XX_TR(XX_TD() XX_TD(XX_TC(f1 APL))) XX_TR(XX_TD() XX_TD(XX_TC(f8 DBCS))) XX_TE() XX_IP Extended attributes (which do not take up display positions) are output as XX_FB(SA`('aa=nn`)'), with XX_FI(aa) and XX_FI(nn) having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). XX_IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ebcdic))) Equivalent to XX_FB(ReadBuffer)(XX_FB(Ascii)), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as XX_FB(GE`('XX_FI(xx)`)'). XX_TP(XX_FB(Script)(XX_FI(path)[,arg...])) Runs a child script, passing it optional command-line arguments. XX_FI(path) must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the XX_FB(Source) action. XX_TP(XX_FB(Snap)) Equivalent to XX_FB(Snap)(XX_FB(Save)) (see XX_LINK(#save,below)). XX_TP(XX_FB(Snap)(XX_FB(Ascii),...)) Performs the XX_FB(Ascii) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(Cols))) Returns the number of columns in the saved screen image. XX_TP(XX_FB(Snap)(`XX_FB(Ebcdic),...')) Performs the XX_FB(Ebcdic) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(ReadBuffer))) Performs the XX_FB(ReadBuffer) action on the saved screen image. XX_TP(XX_FB(Snap(XX_FB(Rows)))) Returns the number of rows in the saved screen image. XX_TARGET(save)dnl XX_TP(XX_FB(Snap)(XX_FB(Save))) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other XX_FB(Snap) actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. XX_TP(XX_FB(Snap)(XX_FB(Status))) Returns the status line from when the screen was last saved. XX_TP(XX_FB(Snap)(XX_FB(Wait)[`,'XX_FI(timeout)]`,'XX_FB(Output))) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. This action is usually invoked in a loop that uses the XX_FB(Snap)(XX_FB(Ascii)) or XX_FB(Snap)(XX_FB(Ebcdic)) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Snap) action. The default is to wait indefinitely. XX_TP(XX_FB(Source)(XX_FI(file))) Read and execute commands from XX_FI(file). Any output from those commands will become the output from XX_FB(Source). If any of the commands fails, the XX_FB(Source) command will XX_FI(not) abort; it will continue reading commands until EOF. XX_TP(XX_FB(Title)(XX_FI(text))) Changes the ifelse(XX_PLATFORM,unix,x3270,wc3270) window title to XX_FI(text). XX_TP(XX_FB(Transfer)(XX_FI(keyword)=XX_FI(value),...)) Invokes IND$FILE file transfer. See XX_LINK(#File-Transfer,XX_SM(FILE TRANSFER)) below. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(3270Mode))) Used when communicating with a host that switches between XX_SM(NVT) mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait(3270)) is equivalent to XX_FB(Wait)(XX_FB(3270Mode)) XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Disconnect))) Pauses the script until the host disconnects. Often used to after sending a XX_FI(logoff) command to a XX_SM(VM/CMS) host, to ensure that the session is not unintentionally set to XX_FB(disconnected) state. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(InputField))) A useful utility for use at the beginning of scripts and after the XX_FB(Connect) action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In XX_SM(NVT) mode, waits until the host sends at least one byte of data. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait) is equivalent to XX_FB(Wait)(XX_FB(InputField)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(NVTMode))) Used when communicating with a host that switches between 3270 mode and XX_SM(NVT) mode. Pauses the script or macro until the host negotiates XX_SM(NVT) mode, then waits for a byte from the host as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait)(XX_FB(ansi)) is equivalent to XX_FB(Wait)(XX_FB(NVTMode)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Output))) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a XX_FB(Clear), XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. Also used in non-blocking AID mode (see XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). This action is usually invoked in a loop that uses the XX_FB(Ascii) or XX_FB(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Unlock))) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (XX_FB(toggle AidWait clear)), to wait for a host command to complete. See XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)(XX_FI(timeout)`,' XX_FB(Seconds))) Delays the script XX_FI(timeout) seconds. Unlike the other forms of XX_FB(Wait), the timeout is not optional. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(WindowState)(XX_FI(mode))) If XX_FI(mode) is XX_FB(Iconic), changes the x3270 window into an icon. If XX_FI(mode) is XX_FB(Normal), changes the x3270 window from an icon to a normal window. ')dnl XX_TPE()dnl define(XX_action,action)dnl include(ft.inc)dnl XX_SH(See Also) expect(1) XX_BR perl(1) XX_BR ksh(1) ifelse(XX_PLATFORM,unix,`XX_BR XX_LINK(x3270-man.html,x3270(1)) ')dnl XX_BR ifelse(XX_PLATFORM,unix,`XX_LINK(Unix-x3270if.html,x3270if(1))',`XX_LINK(Windows-x3270if.html,x3270if(1))') XX_BR XX_LINK(XX_C3270-man.html,XX_C3270`(1)') XX_BR XX_LINK(XX_S3270-man.html,XX_S3270`(1)') XX_SH(Version) Version XX_VERSION_NUMBER suite3270-3.6/VS2013/catf/catf.vcxproj0000775000076500007650000001771313221577163015315 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567} Win32Proj catf Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Console true Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Console true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Console true true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Console true true true suite3270-3.6/VS2013/catf/catf.vcxproj.filters0000775000076500007650000000170613221577163016757 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files suite3270-3.6/VS2013/catf/catf.vcxproj.user0000775000076500007650000000021713221577163016261 0ustar pdmpdm suite3270-3.6/VS2013/libw3270i/libw3270i.vcxproj0000775000076500007650000001754413221577163016531 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {B306FA2C-263B-423D-A42D-F1930DA727F3} Win32Proj libw3270i StaticLibrary true MultiByte v120 StaticLibrary true MultiByte v120 StaticLibrary false true MultiByte v120 StaticLibrary false true MultiByte v120 Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true suite3270-3.6/VS2013/libw3270i/libw3270i.vcxproj.filters0000775000076500007650000000206613221577163020171 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files suite3270-3.6/VS2013/libw3270i/libw3270i.vcxproj.user0000775000076500007650000000021713221577163017473 0ustar pdmpdm suite3270-3.6/VS2013/libw3270/libw3270.vcxproj0000775000076500007650000002342613221577163016203 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00} Win32Proj libw3270 StaticLibrary true MultiByte v120 StaticLibrary true MultiByte v120 StaticLibrary false true MultiByte v120 StaticLibrary false true MultiByte v120 Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true suite3270-3.6/VS2013/libw3270/libw3270.vcxproj.filters0000775000076500007650000001171113221577163017644 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files suite3270-3.6/VS2013/libw3270/libw3270.vcxproj.user0000775000076500007650000000021713221577163017151 0ustar pdmpdm suite3270-3.6/VS2013/libw3270stubs/libw3270stubs.vcxproj0000775000076500007650000002225713221577163020346 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {A6D4C4FA-6515-416C-9EB2-244A5C40488E} Win32Proj libw3270stubs StaticLibrary true MultiByte v120 StaticLibrary true MultiByte v120 StaticLibrary false true MultiByte v120 StaticLibrary false true MultiByte v120 Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true suite3270-3.6/VS2013/libw3270stubs/libw3270stubs.vcxproj.filters0000775000076500007650000000673013221577163022013 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files suite3270-3.6/VS2013/libw3270stubs/libw3270stubs.vcxproj.user0000775000076500007650000000021713221577163021313 0ustar pdmpdm suite3270-3.6/VS2013/libw32xx/libw32xx.vcxproj0000775000076500007650000002135713221577163016626 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} Win32Proj libw32xx StaticLibrary true MultiByte v120 StaticLibrary true MultiByte v120 StaticLibrary false true MultiByte v120 StaticLibrary false true MultiByte v120 Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) true Windows true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\lib\include\windows;%(ProjectDir)..\..\lib\include;%(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Windows true true true suite3270-3.6/VS2013/libw32xx/libw32xx.vcxproj.filters0000775000076500007650000000516313221577163020272 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files suite3270-3.6/VS2013/libw32xx/libw32xx.vcxproj.user0000775000076500007650000000021713221577163017573 0ustar pdmpdm suite3270-3.6/VS2013/mkfb/mkfb.bat0000775000076500007650000000034213221577163014362 0ustar pdmpdmcd ..\..\wc3270 %1\mkfb.exe -c -o fallbacks.c ..\Common\fb-common ..\Common\fb-printSession ..\Common\fb-messages ..\Common\fb-composeMap ..\Common\fb-c3270 cd ..\ws3270 %1\mkfb.exe -c -o fallbacks.c ..\Common\fb-common suite3270-3.6/VS2013/mkfb/mkfb.vcxproj0000775000076500007650000002257613221577163015324 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {2A000DFC-320A-4F19-AFB1-42F11775664F} mkfb Win32Proj Application MultiByte true v120 Application MultiByte true v120 Application MultiByte v120 Application MultiByte v120 <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(Configuration)\ $(Configuration)\ true true $(SolutionDir)$(Configuration)\ $(Configuration)\ false false Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270 true true Console MachineX86 "$(ProjectDir)\mkfb.bat" "$(OutDir)" Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270 true true Console "$(ProjectDir)\mkfb.bat" "$(OutDir)" MaxSpeed true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270 true Console true true MachineX86 "$(ProjectDir)\mkfb.bat" "$(OutDir)" MaxSpeed true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270 true Console true true "$(ProjectDir)\mkfb.bat" "$(OutDir)" suite3270-3.6/VS2013/mkfb/mkfb.vcxproj.filters0000775000076500007650000000167113221577163016764 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav Source Files suite3270-3.6/VS2013/mkfb/mkfb.vcxproj.user0000775000076500007650000000021713221577163016265 0ustar pdmpdm suite3270-3.6/VS2013/mkicon/mkfaviconc.bat0000775000076500007650000000011013221577163016115 0ustar pdmpdmcd ..\..\lib\w3270 %1\mkicon.exe ..\..\Common\favicon.ico > favicon.c suite3270-3.6/VS2013/mkicon/mkicon.vcxproj0000775000076500007650000001763313221577163016224 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {07A63EBF-BCDC-40E7-B1EA-6384B461A448} Win32Proj mkicon Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true Console true "$(ProjectDir)\mkfaviconc.bat" "$(OutDir)" Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true Console true "$(ProjectDir)\mkfaviconc.bat" "$(OutDir)" Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true Console true true true "$(ProjectDir)\mkfaviconc.bat" "$(OutDir)" Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true Console true true true "$(ProjectDir)\mkfaviconc.bat" "$(OutDir)" suite3270-3.6/VS2013/mkicon/mkicon.vcxproj.filters0000664000076500007650000000171113221577163017656 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files suite3270-3.6/VS2013/mkicon/mkicon.vcxproj.user0000664000076500007650000000021713221577163017164 0ustar pdmpdm suite3270-3.6/VS2013/mkmanifest/mkmanifest.bat0000775000076500007650000000075213221577163017025 0ustar pdmpdmcd ..\..\wc3270 %1\mkmanifest.exe -a %2 -d "wc3270 terminal emulator" -e wc3270 -m ..\Common\Win32\manifest.tmpl -v ..\Common\version.txt >wc3270.exe.manifest cd ..\ws3270 %1\mkmanifest.exe -a %2 -d "ws3270 scripting terminal emulator" -e ws3270 -m ..\Common\Win32\manifest.tmpl -v ..\Common\version.txt >ws3270.exe.manifest cd ..\wpr3287 %1\mkmanifest.exe -a %2 -d "wpr3287 printer emulator" -e wpr3287 -m ..\Common\Win32\manifest.tmpl -v ..\Common\version.txt >wpr3287.exe.manifest suite3270-3.6/VS2013/mkmanifest/mkmanifest.vcxproj0000775000076500007650000001722513221577163017755 0ustar pdmpdm Debug Win32 Release Win32 Debug x64 Release x64 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} Win32Proj mkmanifest 8.1 Application true v120 Unicode Application false v140 true Unicode Application true v120 MultiByte Application false v140 true Unicode true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) %(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Console true "$(ProjectDir)\mkmanifest.bat" "$(OutDir)" $(Platform) Level3 Disabled _DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) %(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) Console true "$(ProjectDir)\mkmanifest.bat" "$(OutDir)" $(Platform) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) Console true true true Level3 MaxSpeed true true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) Console true true true suite3270-3.6/VS2013/mkmanifest/mkmanifest.vcxproj.filters0000775000076500007650000000172313221577163021420 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files suite3270-3.6/VS2013/mkmanifest/mkmanifest.vcxproj.user0000775000076500007650000000024513221577163020724 0ustar pdmpdm suite3270-3.6/VS2013/mkkeypad/mkkeypadh.bat0000775000076500007650000000011013221577163016277 0ustar pdmpdmcd ..\..\wc3270 %1\mkkeypad.exe -I..\Common\c3270 > compiled_keypad.h suite3270-3.6/VS2013/mkkeypad/mkkeypad.vcxproj0000775000076500007650000002167413221577163017076 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {54F94101-1334-443A-B501-5BFBDFEC5323} mkkeypad Win32Proj Application MultiByte true v120 Application MultiByte true v120 Application MultiByte v120 Application MultiByte v120 <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(Configuration)\ $(Configuration)\ true true $(SolutionDir)$(Configuration)\ $(Configuration)\ false false Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console MachineX86 "$(ProjectDir)\mkkeypadh.bat" "$(OutDir)" Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true true Console "$(ProjectDir)\mkkeypadh.bat" "$(OutDir)" MaxSpeed true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true true Console true true MachineX86 "$(ProjectDir)\mkkeypadh.bat" "$(OutDir)" MaxSpeed true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true true Console true true "$(ProjectDir)\mkkeypadh.bat" "$(OutDir)" suite3270-3.6/VS2013/mkkeypad/mkkeypad.vcxproj.filters0000775000076500007650000000167513221577163020544 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav Source Files suite3270-3.6/VS2013/mkkeypad/mkkeypad.vcxproj.user0000775000076500007650000000021713221577163020041 0ustar pdmpdm suite3270-3.6/VS2013/mkshort/mkshort.vcxproj0000775000076500007650000002064613221577163016640 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E} Win32Proj mkshort Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true $(OutDir)libw32xx.lib;%(AdditionalDependencies) Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true $(OutDir)libw32xx.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true true true $(OutDir)libw32xx.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true true true $(OutDir)libw32xx.lib;%(AdditionalDependencies) suite3270-3.6/VS2013/mkshort/mkshort.vcxproj.filters0000775000076500007650000000206113221577163020276 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files suite3270-3.6/VS2013/mkshort/mkshort.vcxproj.user0000775000076500007650000000021713221577163017605 0ustar pdmpdm suite3270-3.6/VS2013/mkversion/mkversion.bat0000775000076500007650000000035613221577163016563 0ustar pdmpdmcd ..\..\wc3270 %1\mkversion.exe wc3270 ..\Common\version.txt %1\mkversion.exe -w wc3270 ..\Common\version.txt cd ..\ws3270 %1\mkversion.exe ws3270 ..\Common\version.txt cd ..\wpr3287 %1\mkversion.exe wpr3287 ..\Common\version.txt suite3270-3.6/VS2013/mkversion/mkversion.vcxproj0000775000076500007650000002317613221577163017515 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE} mkversion Win32Proj Application MultiByte true v120 Application MultiByte true v120 Application MultiByte v120 Application MultiByte v120 <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(Configuration)\ $(Configuration)\ true true $(SolutionDir)$(Configuration)\ $(Configuration)\ false false Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true %(ProjectDir)..\..\include;%(RootDir)%(Directory);%(RootDir)%(Directory)\..;%(AdditionalIncludeDirectories) true Console MachineX86 "$(ProjectDir)\mkversion.bat" "$(OutDir)" Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true %(ProjectDir)..\..\include;%(RootDir)%(Directory);%(RootDir)%(Directory)\..;%(AdditionalIncludeDirectories) true Console "$(ProjectDir)\mkversion.bat" "$(OutDir)" MaxSpeed true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true %(ProjectDir)..\..\include;%(RootDir)%(Directory);%(RootDir)%(Directory)\..;%(AdditionalIncludeDirectories) true Console true true MachineX86 "$(ProjectDir)\mkversion.bat" "$(OutDir)" MaxSpeed true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true %(ProjectDir)..\..\include;%(RootDir)%(Directory);%(RootDir)%(Directory)\..;%(AdditionalIncludeDirectories) true Console true true "$(ProjectDir)\mkversion.bat" "$(OutDir)" suite3270-3.6/VS2013/mkversion/mkversion.vcxproj.filters0000775000076500007650000000170213221577163021153 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav Source Files suite3270-3.6/VS2013/mkversion/mkversion.vcxproj.user0000775000076500007650000000021713221577163020461 0ustar pdmpdm suite3270-3.6/VS2013/README.txt0000664000076500007650000000047613221577163013537 0ustar pdmpdmREADME for VS2013 solution -------------------------- This directory contains the necessary files for building wc3270 and associated utilities with Microsoft Visual Studio 2013. It might work with other versions of Visual Studio, but this has not been verified. The top-level solution file is suite3270.sln. suite3270-3.6/VS2013/suite3270.sln0000775000076500007650000003463213221577163014230 0ustar pdmpdm Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wc3270", "wc3270\wc3270.vcxproj", "{3F0E2661-72DE-4C76-B013-3FA3ED125DF3}" ProjectSection(ProjectDependencies) = postProject {B306FA2C-263B-423D-A42D-F1930DA727F3} = {B306FA2C-263B-423D-A42D-F1930DA727F3} {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00} = {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00} {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} = {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} = {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} {A6D4C4FA-6515-416C-9EB2-244A5C40488E} = {A6D4C4FA-6515-416C-9EB2-244A5C40488E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mkkeypad", "mkkeypad\mkkeypad.vcxproj", "{54F94101-1334-443A-B501-5BFBDFEC5323}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mkversion", "mkversion\mkversion.vcxproj", "{1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mkfb", "mkfb\mkfb.vcxproj", "{2A000DFC-320A-4F19-AFB1-42F11775664F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wc3270wiz", "wc3270wiz\wc3270wiz.vcxproj", "{7CC1CB4D-16D7-446A-B132-963F5C1247E9}" ProjectSection(ProjectDependencies) = postProject {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE} = {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE} {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} = {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ws3270", "ws3270\ws3270.vcxproj", "{74911F0D-82AF-4FFC-8A43-C411597A64C1}" ProjectSection(ProjectDependencies) = postProject {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00} = {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00} {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} = {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} = {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} {A6D4C4FA-6515-416C-9EB2-244A5C40488E} = {A6D4C4FA-6515-416C-9EB2-244A5C40488E} {2A000DFC-320A-4F19-AFB1-42F11775664F} = {2A000DFC-320A-4F19-AFB1-42F11775664F} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wpr3287", "wpr3287\wpr3287.vcxproj", "{0094B3D7-0924-4296-BED4-300B53F63562}" ProjectSection(ProjectDependencies) = postProject {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE} = {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE} {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} = {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} = {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x3270if", "x3270if\x3270if.vcxproj", "{25CA97FA-186C-4235-8280-BF1F56FD3CFF}" ProjectSection(ProjectDependencies) = postProject {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} = {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mkshort", "mkshort\mkshort.vcxproj", "{F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}" ProjectSection(ProjectDependencies) = postProject {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} = {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "catf", "catf\catf.vcxproj", "{2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libw3270", "libw3270\libw3270.vcxproj", "{7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}" ProjectSection(ProjectDependencies) = postProject {07A63EBF-BCDC-40E7-B1EA-6384B461A448} = {07A63EBF-BCDC-40E7-B1EA-6384B461A448} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libw3270stubs", "libw3270stubs\libw3270stubs.vcxproj", "{A6D4C4FA-6515-416C-9EB2-244A5C40488E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mkicon", "mkicon\mkicon.vcxproj", "{07A63EBF-BCDC-40E7-B1EA-6384B461A448}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libw3270i", "libw3270i\libw3270i.vcxproj", "{B306FA2C-263B-423D-A42D-F1930DA727F3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libw32xx", "libw32xx\libw32xx.vcxproj", "{9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mkmanifest", "mkmanifest\mkmanifest.vcxproj", "{6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Debug|Win32.ActiveCfg = Debug|Win32 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Debug|Win32.Build.0 = Debug|Win32 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Debug|x64.ActiveCfg = Debug|x64 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Debug|x64.Build.0 = Debug|x64 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Release|Win32.ActiveCfg = Release|Win32 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Release|Win32.Build.0 = Release|Win32 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Release|x64.ActiveCfg = Release|x64 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3}.Release|x64.Build.0 = Release|x64 {54F94101-1334-443A-B501-5BFBDFEC5323}.Debug|Win32.ActiveCfg = Debug|Win32 {54F94101-1334-443A-B501-5BFBDFEC5323}.Debug|Win32.Build.0 = Debug|Win32 {54F94101-1334-443A-B501-5BFBDFEC5323}.Debug|x64.ActiveCfg = Debug|x64 {54F94101-1334-443A-B501-5BFBDFEC5323}.Debug|x64.Build.0 = Debug|x64 {54F94101-1334-443A-B501-5BFBDFEC5323}.Release|Win32.ActiveCfg = Release|Win32 {54F94101-1334-443A-B501-5BFBDFEC5323}.Release|Win32.Build.0 = Release|Win32 {54F94101-1334-443A-B501-5BFBDFEC5323}.Release|x64.ActiveCfg = Release|x64 {54F94101-1334-443A-B501-5BFBDFEC5323}.Release|x64.Build.0 = Release|x64 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Debug|Win32.ActiveCfg = Debug|Win32 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Debug|Win32.Build.0 = Debug|Win32 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Debug|x64.ActiveCfg = Debug|x64 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Debug|x64.Build.0 = Debug|x64 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Release|Win32.ActiveCfg = Release|Win32 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Release|Win32.Build.0 = Release|Win32 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Release|x64.ActiveCfg = Release|x64 {1A5B909A-4E61-4AB0-BC7A-2BC07F3BE1CE}.Release|x64.Build.0 = Release|x64 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Debug|Win32.ActiveCfg = Debug|Win32 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Debug|Win32.Build.0 = Debug|Win32 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Debug|x64.ActiveCfg = Debug|x64 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Debug|x64.Build.0 = Debug|x64 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Release|Win32.ActiveCfg = Release|Win32 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Release|Win32.Build.0 = Release|Win32 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Release|x64.ActiveCfg = Release|x64 {2A000DFC-320A-4F19-AFB1-42F11775664F}.Release|x64.Build.0 = Release|x64 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Debug|Win32.ActiveCfg = Debug|Win32 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Debug|Win32.Build.0 = Debug|Win32 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Debug|x64.ActiveCfg = Debug|x64 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Debug|x64.Build.0 = Debug|x64 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Release|Win32.ActiveCfg = Release|Win32 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Release|Win32.Build.0 = Release|Win32 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Release|x64.ActiveCfg = Release|x64 {7CC1CB4D-16D7-446A-B132-963F5C1247E9}.Release|x64.Build.0 = Release|x64 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Debug|Win32.ActiveCfg = Debug|Win32 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Debug|Win32.Build.0 = Debug|Win32 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Debug|x64.ActiveCfg = Debug|x64 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Debug|x64.Build.0 = Debug|x64 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Release|Win32.ActiveCfg = Release|Win32 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Release|Win32.Build.0 = Release|Win32 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Release|x64.ActiveCfg = Release|x64 {74911F0D-82AF-4FFC-8A43-C411597A64C1}.Release|x64.Build.0 = Release|x64 {0094B3D7-0924-4296-BED4-300B53F63562}.Debug|Win32.ActiveCfg = Debug|Win32 {0094B3D7-0924-4296-BED4-300B53F63562}.Debug|Win32.Build.0 = Debug|Win32 {0094B3D7-0924-4296-BED4-300B53F63562}.Debug|x64.ActiveCfg = Debug|x64 {0094B3D7-0924-4296-BED4-300B53F63562}.Debug|x64.Build.0 = Debug|x64 {0094B3D7-0924-4296-BED4-300B53F63562}.Release|Win32.ActiveCfg = Release|Win32 {0094B3D7-0924-4296-BED4-300B53F63562}.Release|Win32.Build.0 = Release|Win32 {0094B3D7-0924-4296-BED4-300B53F63562}.Release|x64.ActiveCfg = Release|x64 {0094B3D7-0924-4296-BED4-300B53F63562}.Release|x64.Build.0 = Release|x64 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Debug|Win32.ActiveCfg = Debug|Win32 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Debug|Win32.Build.0 = Debug|Win32 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Debug|x64.ActiveCfg = Debug|x64 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Debug|x64.Build.0 = Debug|x64 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Release|Win32.ActiveCfg = Release|Win32 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Release|Win32.Build.0 = Release|Win32 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Release|x64.ActiveCfg = Release|x64 {25CA97FA-186C-4235-8280-BF1F56FD3CFF}.Release|x64.Build.0 = Release|x64 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Debug|Win32.ActiveCfg = Debug|Win32 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Debug|Win32.Build.0 = Debug|Win32 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Debug|x64.ActiveCfg = Debug|x64 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Debug|x64.Build.0 = Debug|x64 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Release|Win32.ActiveCfg = Release|Win32 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Release|Win32.Build.0 = Release|Win32 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Release|x64.ActiveCfg = Release|x64 {F42388CA-CE98-4F9F-96B7-D0DC1F9DA67E}.Release|x64.Build.0 = Release|x64 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Debug|Win32.ActiveCfg = Debug|Win32 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Debug|Win32.Build.0 = Debug|Win32 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Debug|x64.ActiveCfg = Debug|x64 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Debug|x64.Build.0 = Debug|x64 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Release|Win32.ActiveCfg = Release|Win32 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Release|Win32.Build.0 = Release|Win32 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Release|x64.ActiveCfg = Release|x64 {2BA5D6CF-59E7-4747-A8BF-A5A1DA3C2567}.Release|x64.Build.0 = Release|x64 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Debug|Win32.ActiveCfg = Debug|Win32 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Debug|Win32.Build.0 = Debug|Win32 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Debug|x64.ActiveCfg = Debug|x64 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Debug|x64.Build.0 = Debug|x64 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Release|Win32.ActiveCfg = Release|Win32 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Release|Win32.Build.0 = Release|Win32 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Release|x64.ActiveCfg = Release|x64 {7B2EBB95-B987-4FC6-BB3F-B7612B54BD00}.Release|x64.Build.0 = Release|x64 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Debug|Win32.ActiveCfg = Debug|Win32 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Debug|Win32.Build.0 = Debug|Win32 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Debug|x64.ActiveCfg = Debug|x64 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Debug|x64.Build.0 = Debug|x64 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Release|Win32.ActiveCfg = Release|Win32 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Release|Win32.Build.0 = Release|Win32 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Release|x64.ActiveCfg = Release|x64 {A6D4C4FA-6515-416C-9EB2-244A5C40488E}.Release|x64.Build.0 = Release|x64 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Debug|Win32.ActiveCfg = Debug|Win32 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Debug|Win32.Build.0 = Debug|Win32 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Debug|x64.ActiveCfg = Debug|x64 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Debug|x64.Build.0 = Debug|x64 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Release|Win32.ActiveCfg = Release|Win32 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Release|Win32.Build.0 = Release|Win32 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Release|x64.ActiveCfg = Release|x64 {07A63EBF-BCDC-40E7-B1EA-6384B461A448}.Release|x64.Build.0 = Release|x64 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Debug|Win32.ActiveCfg = Debug|Win32 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Debug|Win32.Build.0 = Debug|Win32 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Debug|x64.ActiveCfg = Debug|x64 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Debug|x64.Build.0 = Debug|x64 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Release|Win32.ActiveCfg = Release|Win32 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Release|Win32.Build.0 = Release|Win32 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Release|x64.ActiveCfg = Release|x64 {B306FA2C-263B-423D-A42D-F1930DA727F3}.Release|x64.Build.0 = Release|x64 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Debug|Win32.ActiveCfg = Debug|Win32 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Debug|Win32.Build.0 = Debug|Win32 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Debug|x64.ActiveCfg = Debug|x64 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Debug|x64.Build.0 = Debug|x64 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Release|Win32.ActiveCfg = Release|Win32 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Release|Win32.Build.0 = Release|Win32 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Release|x64.ActiveCfg = Release|x64 {9403B3C3-2EA9-44F8-99D4-45DE7692BB1A}.Release|x64.Build.0 = Release|x64 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Debug|Win32.ActiveCfg = Debug|Win32 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Debug|Win32.Build.0 = Debug|Win32 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Debug|x64.ActiveCfg = Debug|x64 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Debug|x64.Build.0 = Debug|x64 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Release|Win32.ActiveCfg = Release|Win32 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Release|Win32.Build.0 = Release|Win32 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Release|x64.ActiveCfg = Release|x64 {6CB171E9-F0B7-425C-A9EE-2B2EAFABF6B6}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal suite3270-3.6/VS2013/wc3270/wc3270.vcxproj0000775000076500007650000002751213221577163015333 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {3F0E2661-72DE-4C76-B013-3FA3ED125DF3} wc3270 Win32Proj Application MultiByte true v120 Application MultiByte true v120 Application MultiByte v120 Application MultiByte v120 <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(Configuration)\ $(Configuration)\ true true $(SolutionDir)$(Configuration)\ $(Configuration)\ false false Disabled %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\wc3270;%(ProjectDir)..\..\Common;%(ProjectDir)..\..\Common\c3270;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw3270i.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;crypt32.lib;secur32.lib;%(AdditionalDependencies) true Console MachineX86 Disabled %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\wc3270;%(ProjectDir)..\..\Common;%(ProjectDir)..\..\Common\c3270;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw3270i.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;crypt32.lib;secur32.lib;%(AdditionalDependencies) true Console MaxSpeed true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\wc3270;%(ProjectDir)..\..\Common;%(ProjectDir)..\..\Common\c3270;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw3270i.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;%(AdditionalDependencies) true Console true true MachineX86 MaxSpeed true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\wc3270;%(ProjectDir)..\..\Common;%(ProjectDir)..\..\Common\c3270;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw3270i.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;%(AdditionalDependencies) true Console true true {2a000dfc-320a-4f19-afb1-42f11775664f} false {54f94101-1334-443a-b501-5bfbdfec5323} false {1a5b909a-4e61-4ab0-bc7a-2bc07f3be1ce} false suite3270-3.6/VS2013/wc3270/wc3270.vcxproj.filters0000775000076500007650000000506413221577163017000 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav Resource Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files suite3270-3.6/VS2013/wc3270/wc3270.vcxproj.user0000775000076500007650000000060013221577163016275 0ustar pdmpdm -verifycert -trace WindowsLocalDebugger suite3270-3.6/VS2013/wc3270wiz/wc3270wiz.vcxproj0000775000076500007650000002101713221577163016611 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {7CC1CB4D-16D7-446A-B132-963F5C1247E9} Win32Proj wc3270wiz Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true $(OutDir)libw32xx.lib;%(AdditionalDependencies) Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true $(OutDir)libw32xx.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true true true $(OutDir)libw32xx.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\c3270 Console true true true $(OutDir)libw32xx.lib;%(AdditionalDependencies) suite3270-3.6/VS2013/wc3270wiz/wc3270wiz.vcxproj.filters0000775000076500007650000000240413221577163020257 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files suite3270-3.6/VS2013/wc3270wiz/wc3270wiz.vcxproj.user0000775000076500007650000000021713221577163017565 0ustar pdmpdm suite3270-3.6/VS2013/wpr3287/wpr3287.vcxproj0000775000076500007650000002246513221577163015753 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {0094B3D7-0924-4296-BED4-300B53F63562} Win32Proj wpr3287 Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\pr3287;%(ProjectDir)..\..\wpr3287;%(AdditionalIncludeDirectories) Console true $(OutDir)libw32xx.lib;Ws2_32.lib;crypt32.lib;secur32.lib;%(AdditionalDependencies) Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\pr3287;%(ProjectDir)..\..\wpr3287;%(AdditionalIncludeDirectories) Console true $(OutDir)libw32xx.lib;Ws2_32.lib;crypt32.lib;secur32.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\pr3287;%(ProjectDir)..\..\wpr3287;%(AdditionalIncludeDirectories) Console true true true $(OutDir)libw32xx.lib;Ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\Common\pr3287;%(ProjectDir)..\..\wpr3287;%(AdditionalIncludeDirectories) Console true true true $(OutDir)libw32xx.lib;Ws2_32.lib;%(AdditionalDependencies) suite3270-3.6/VS2013/wpr3287/wpr3287.vcxproj.filters0000775000076500007650000000371213221577163017414 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Resource Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files suite3270-3.6/VS2013/wpr3287/wpr3287.vcxproj.user0000775000076500007650000000021713221577163016717 0ustar pdmpdm suite3270-3.6/VS2013/ws3270/ws3270.vcxproj0000775000076500007650000002235113221577163015367 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {74911F0D-82AF-4FFC-8A43-C411597A64C1} Win32Proj ws3270 Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270;%(AdditionalIncludeDirectories) false Console true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;crypt32.lib;secur32.lib;%(AdditionalDependencies) Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270;%(AdditionalIncludeDirectories) false Console true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;crypt32.lib;secur32.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270;%(AdditionalIncludeDirectories) Console true true true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(RootDir)%(Directory);%(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270;%(AdditionalIncludeDirectories) Console true true true Ws2_32.lib;$(OutDir)libw3270.lib;$(OutDir)libw32xx.lib;$(OutDir)libw3270stubs.lib;%(AdditionalDependencies) suite3270-3.6/VS2013/ws3270/ws3270.vcxproj.filters0000775000076500007650000000246113221577163017036 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Resource Files Source Files Source Files Source Files suite3270-3.6/VS2013/ws3270/ws3270.vcxproj.user0000775000076500007650000000022113221577163016334 0ustar pdmpdm suite3270-3.6/VS2013/x3270if/x3270if.vcxproj0000775000076500007650000002100513221577163015654 0ustar pdmpdm Debug Win32 Debug x64 Release Win32 Release x64 {25CA97FA-186C-4235-8280-BF1F56FD3CFF} Win32Proj x3270if Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 true true false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270 Console true $(OutDir)libw32xx.lib;ws2_32.lib;%(AdditionalDependencies) Level3 Disabled WIN32;_DEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270 Console true $(OutDir)libw32xx.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270 Console true true true $(OutDir)libw32xx.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_WIN32;_CRT_SECURE_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true %(ProjectDir)..\..\include;%(ProjectDir)..\..\ws3270;%(ProjectDir)..\..\Common\s3270 Console true true true $(OutDir)libw32xx.lib;ws2_32.lib;%(AdditionalDependencies) suite3270-3.6/VS2013/x3270if/x3270if.vcxproj.filters0000775000076500007650000000171113221577163017325 0ustar pdmpdm {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files suite3270-3.6/VS2013/x3270if/x3270if.vcxproj.user0000775000076500007650000000021713221577163016633 0ustar pdmpdm suite3270-3.6/wc3270/catf.c0000664000076500007650000000657313221577163013215 0ustar pdmpdm/* * Copyright (c) 2007-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * catf.c * A Windows console-based 3270 Terminal Emulator * A subset of the Unix 'tail -f' command. */ #if !defined(_WIN32) /*[*/ #error For Windows only. #endif /*]*/ #include #include "wincmn.h" #include #include #define BUFFER_SIZE 16384 static int catf(char *filename); int main(int argc, char *argv[]) { int rv; if (argc != 2) { fprintf(stderr, "usage: catf \n"); exit(1); } do { rv = catf(argv[1]); } while (rv == 0); exit(1); } /* * Tail the file. * Returns -1 for error, 0 for retry (file shrank or possibly disappeared). */ static int catf(char *filename) { int fd; struct stat buf; off_t size; off_t fp = 0; char rbuf[BUFFER_SIZE]; wchar_t rbuf_w[BUFFER_SIZE]; fd = open(filename, O_RDONLY | O_BINARY); if (fd < 0) { perror(filename); return -1; } if (fstat(fd, &buf) < 0) { perror(filename); return -1; } size = buf.st_size; for (;;) { while (fp < size) { int n2r, nr; BOOL udc; if (size - fp > BUFFER_SIZE) n2r = BUFFER_SIZE; else n2r = size - fp; nr = read(fd, rbuf, n2r); if (nr < 0) { perror(filename); close(fd); return 0; } if (nr == 0) { printf("\nUNEXPECTED EOF\n"); close(fd); return 0; } /* Translate ANSI to OEM. */ (void) MultiByteToWideChar(CP_ACP, 0, rbuf, nr, rbuf_w, BUFFER_SIZE); (void) WideCharToMultiByte(CP_OEMCP, 0, rbuf_w, BUFFER_SIZE, rbuf, nr, "?", &udc); (void) write(1, rbuf, nr); fp += nr; } do { if (fstat(fd, &buf) < 0) { perror(filename); return -1; } if (buf.st_size < size) { printf("\ncatf: '%s' shrank -- reopening\n", filename); close(fd); return 0; } if (buf.st_size == size) Sleep(1 * 1000); } while (buf.st_size == size); size = buf.st_size; } } suite3270-3.6/wc3270/conf.h0000664000076500007650000000014713221577163013221 0ustar pdmpdm/* Hard-coded conf.h for wc3270 */ #define LIBX3270DIR "." #define X3270_DBCS 1 #define X3270_IPV6 1 suite3270-3.6/wc3270/documentation-ssl-body.html0000664000076500007650000002056613221577163017423 0ustar pdmpdm

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/wc3270/ft.inc0000664000076500007650000001355013221577163013231 0ustar pdmpdmXX_SH(File Transfer) The XX_FB(Transfer) XX_action implements XX_FB(IND$FILE) file transfer. This XX_action requires that the XX_FB(IND$FILE) program be installed on the XX_SM(IBM) host, and that the 3270 cursor be located in a field that will accept a XX_SM(TSO) or XX_SM(VM/CMS) command. XX_LP ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`The XX_FB(Transfer) XX_action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. ')dnl XX_LP Because of the complexity and number of options for file transfer, the parameters to the XX_FB(Transfer) XX_action take the unique form of XX_FI(option)=XX_FI(value), and can appear in any order. Note that if the XX_FI(value) contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: XX_LP XX_TS(4,l c l l.) XX_TR(XX_TD(Option) XX_TD(Required?) XX_TD(Default) XX_TD(Other Values)) XX_T_() XX_TR(XX_TD(Direction) XX_TD(No) XX_TD(receive) XX_TD(send)) XX_TR(XX_TD(HostFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(LocalFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Host) XX_TD(No) XX_TD(tso) `XX_TD(`vm, cics')') XX_TR(XX_TD(Mode) XX_TD(No) XX_TD(ascii) XX_TD(binary)) XX_TR(XX_TD(Cr) XX_TD(No) XX_TD(remove) `XX_TD(`add, keep')') XX_TR(XX_TD(Remap) XX_TD(No) XX_TD(yes) XX_TD(no)) XX_TR(XX_TD(Exist) XX_TD(No) XX_TD(keep) `XX_TD(`replace, append')') XX_TR(XX_TD(Recfm) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`fixed, variable, undefined')') XX_TR(XX_TD(Lrecl) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Blksize) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Allocation) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`tracks, cylinders, avblock')') XX_TR(XX_TD(PrimarySpace) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(SecondarySpace) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Avblock) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(BufferSize) XX_TD(No) XX_TD(4096) XX_TD(XX_NBSP)) XX_TE() XX_LP The option details are as follows. XX_TPS()dnl XX_TP(XX_FB(Direction)) XX_FB(send) to send a file to the host, XX_FB(receive) to receive a file from the host. XX_TP(XX_FB(HostFile)) The name of the file on the host. XX_TP(XX_FB(LocalFile)) The name of the file on the local workstation. XX_TP(XX_FB(Host)) The type of host (which dictates the form of the XX_FB(IND$FILE) command): XX_FB(tso) (the default), XX_FB(vm) or XX_FB(cics). XX_TP(XX_FB(Mode)) Use XX_FB(ascii) (the default) for a text file, which will be translated between XX_SM(EBCDIC) and XX_SM(ASCII) as necessary. Use XX_FB(binary) for non-text files. XX_TP(XX_FB(Cr)) Controls how XX_FB(Newline) characters are handled when transferring XX_FB(Mode=ascii) files. XX_FB(remove) (the default) strips XX_FB(Newline) characters in local files before transferring them to the host. XX_FB(add) adds XX_FB(Newline) characters to each host file record before transferring it to the local workstation. XX_FB(keep) preserves XX_FB(Newline) characters when transferring a local file to the host. XX_TP(XX_FB(Remap)) Controls text translation for XX_FB(Mode=ascii) files. The value XX_FB(yes) (the default) causes XX_PRODUCT to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's XX_SM(EBCDIC) code page. The value XX_FB(no) causes XX_PRODUCT to pass the text to or from the host as-is, leaving all translation to the XX_FB(IND$FILE) program on the host. XX_TP(XX_FB(Exist)) Controls what happens when the destination file already exists. XX_FB(keep) (the default) preserves the file, causing the XX_FB(Transfer) XX_action to fail. XX_FB(replace) overwrites the destination file with the source file. XX_FB(append) appends the source file to the destination file. XX_TP(XX_FB(Recfm)) Controls the record format of files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_FB(fixed) creates a file with fixed-length records. XX_FB(variable) creates a file with variable-length records. XX_FB(undefined) creates a file with undefined-length records (XX_SM(TSO) hosts only). The XX_FB(Lrecl) option controls the record length or maximum record length for XX_FB(Recfm=fixed) and XX_FB(Recfm=variable) files, respectively. XX_TP(XX_FB(Lrecl)) Specifies the record length (or maximum record length) for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Blksize)) Specifies the block size for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Allocation)) Specifies the units for the XX_FB(PrimarySpace) and XX_FB(SecondarySpace) options: XX_FB(tracks), XX_FB(cylinders) or XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(PrimarySpace)) Primary allocation for a file. The units are given by the XX_FB(Allocation) option. Required when the XX_FB(Allocation) is specified as something other than XX_FB(default). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(SecondarySpace)) Secondary allocation for a file. The units are given by the XX_FB(Allocation) option. (XX_SM(TSO) hosts only.) XX_TP(XX_FB(Avblock)) Average block size, required when XX_FB(Allocation) specifies XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(BufferSize)) Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(WindowsCodePage)) Overrides the workstation code page used for XX_SM(ASCII) file transfers. By default, the system XX_SM(ANSI) code page is used. ')dnl XX_TPE()dnl XX_LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the XX_FB(Transfer) keywords, but with XX_FB(ft) prepended. E.g., the default for the XX_FB(Mode) keyword is the XX_FB(XX_PRODUCT.ftMode) resource. suite3270-3.6/wc3270/hostname.inc0000664000076500007650000000600213221577163014430 0ustar pdmpdmThe full syntax for XX_FI(host) is: XX_RS([XX_FI(prefix):]...[XX_FI(LUname)@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)]) ifelse(XX_PRODUCT,wc3270,,`XX_LP Prepending a XX_FB(P:) onto XX_FI(hostname) causes the connection to go through the XX_FI(telnet-passthru) service rather than directly to the host. See XX_LINK(#Passthru,XX_SM(PASSTHRU)) below. ')dnl XX_LP Prepending an XX_FB(S:) onto XX_FI(hostname) removes the "extended data stream" option reported to the host. See XX_LINK(#tn,XX_FB(XX_DASHED(tn))) below for further information. XX_LP Prepending an XX_FB(N:) onto XX_FI(hostname) turns off TN3270E support for the session. XX_LP Prepending an XX_FB(L:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if XX_FB(XX_PRODUCT) was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the XX_FB(L:) prefix should not be used. XX_LP Prepending a XX_FB(Y:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. XX_LP Prepending an XX_FB(A:) onto XX_FI(hostname) is equivalent to setting the XX_FB(XX_DASHED(nvt)) option; it forces an NVT-mode session instead of a 3270-mode session. XX_LP A specific Logical Unit (LU) name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) XX_LP The XX_FI(hostname) may optionally be placed inside square-bracket characters XX_DQUOTED(XX_FB([)) and XX_DQUOTED(XX_FB(])). This will prevent any colon XX_DQUOTED(XX_FB(:)) characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. ifelse(XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_LP On systems that support the XX_FI(forkpty) library call, the XX_FI(hostname) may be replaced with XX_FB(XX_DASHED(e)) and a command string. This will cause XX_FB(XX_PRODUCT) to connect to a local child process, such as a shell. ')dnl XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden with the XX_FB(XX_DASHED(port)) option, or by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). (For compatability with previous versions of XX_FB(XX_PRODUCT) and with XX_FI(tn3270)(1), the XX_FI(port) may also be specified as a second, separate argument.) XX_LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (XX_DQUOTED(XX_FB(=))). The accept name can also be specified with the XX_FB(XX_DASHED(accepthostname)) option. suite3270-3.6/wc3270/html/Bugs.html0000664000076500007650000000056313221577163014657 0ustar pdmpdm Known Bugs in wc3270 3.3

    Known Bugs in wc3270 3.3

    (none)
    suite3270-3.6/wc3270/html/Build.html0000664000076500007650000002307213221577163015016 0ustar pdmpdm suite3270 Build and Install Instructions

    suite3270 Build and Install Instructions

    Building on Unix or Cygwin

    To build the entire 3270 emulation suite, including native Unix programs and cross-compiled Windows programs, use:
       ./configure
       make

    To install Unix binaries in the default install directory (/usr/local), use:

       make install
    To install Unix manual pages, use:
       make install.man
    To remove intermediate files, use:
       make clean
    To remove all derived files, use:
       make clobber

    Object files will be placed in directories named obj/architecture. For example, 64-bit Linux object files are placed in obj/x86_64-unknown-gnu-linux. 32-bit Windows object files are placed in obj/win32. 64-bit Windows object files are placed in obj/win64.

    Selective configure

    If you only want to build a subset of the programs, you can limit the scope of the configure script with the following options. Note that the options are cumulative, so you can specify exactly the set of programs you want:
    --enable-unix Include all of the Unix programs
    --enable-windows Include all of the Windows programs
    --enable-x3270 Include x3270
    --enable-c3270 Include c3270
    --enable-s3270 Include s3270
    --enable-tcl3270 Include tcl3270
    --enable-pr3287 Include pr3287
    --enable-ws3270 Include ws3270
    --enable-wc3270 Include wc3270
    --enable-wpr3287 Include wpr3287
    When you limit the configuration this way, it changes the top-level make targets, so make, make install, make clean and make clobber will operate only on the programs you have configured.

    Summary of Common configure Options

    The top-level configure script accepts the following options. Note that these apply only to Unix; the options for Windows programs are fixed.
    --help Print a help message.
    --prefix=prefix Install architecture-independent files under prefix (defaults to /usr/local)
    --exec-prefix=eprefix Install architecture-dependent files (executables) under eprefix (defaults to same as prefix)
    --bindir=dir Install user executables dir (defaults to eprefix/bin
    --sysconfdir=dir Install configuration files (ibm_hosts, character sets) in dir (defaults to prefix/etc).
    --disable-apl Leave out APL character support.
    --disable-dbcs Leave out DBCS (Double Byte Character Set) support.
    --disable-local-process Leave out local process (connecting to "-e shell_command") support. This will be automatically disabled if the local system does not support the forkpty() library call.
    --disable-ssl Leave out SSL/TLS (Secure Sockets Layer) support.
    --with-openssl=dir Specify the directory where the OpenSSL library is installed. Note that this option was previously called --with-ssl=.
    There are also configure options that are specific to individual programs. These can be passed to the top-level configure script. See each individual program's additional build information for details.

    Selective Build Targets

    To build just the Unix programs, use:
       make unix
    To cross-compile just the Windows programs, use:
       make windows
    To build an individual program, such as s3270, just make it:
       make s3270
    Each of the top-level symbolic targets can be limited to a group (unix or windows) or to a program, by adding the desired prefix:
       make unix-install
       make unix-install.man
       make program-install
       make program-install.man
       make group-clean
       make program-clean
       make group-clobber
       make program-clobber

    Notes for Ubuntu

    Base packages needed to compile any of programs in the suite are:
    • libssl-dev (for SSL/TLS support)
    • mingw-w64 (for Windows cross-compilation)
    • m4 (to build man pages)
    Other packages are listed in the program-specific instructions.

    Notes for Cygwin

    The minimum set of extra Cygwin packages needed to build the 3270 suite are:
    • The make package from the Devel group
    • The gcc-core package from the Devel group
    • For SSL support, the openssl-devel package from the Devel group
    To cross-compile native Windows binaries, you need this package:
    • mingw-w64-gcc from the Devel group
    Other packages are needed by the specific programs, and are listed in those programs' build instructions.

    Notes for MacOS X

    Everything except x3270 is built the usual (Unix) way on MacOS X. But to build x3270, you first need to install XQuartz (http://xquartz.macosforge.org/). Then to build all of the emulators, use the following commands:
       export PATH=$PATH:/opt/X11/bin
       ./configure --enable-unix --x-includes=/opt/X11/include
       make

    By default, the MacOS build uses Secure Transport for SSL/TLS. To switch to OpenSSL, pass the --disable-stransport option to the configure script.

    Notes for Solaris 2.x and Sun's C Compiler

    Do not use Sun's BSD-compatibility compiler, /usr/ucb/cc. This is good advice in general, but in particular, the 3270 suite will not build with it. You should have a directory containing gcc (recommended) or Sun's standard compiler in your $PATH ahead of /usr/ucb.

    Building on FreeBSD

    FreeBSD's iconv library is installed in /usr/local, so the the following options must be passed to the configure script:
       ./configure LDFLAGS=-L/usr/local/lib CPPFLAGS=-I/usr/local/include

    Also, the generated makefiles must be run with GNU make (gmake), not BSD make.

    Building with Visual Studio 2013

    Visual Studio GUI

    The Visual Studio solution is called suite3270.sln in the VS2013 folder. There are individual projects for each of the programs and components.

    Visual Studio Command Line

    To build with Microsoft Visual Studio from the command prompt, first open a command console with Visual Studio build environment variables set. Switch to the VS2013 directory, and type:
       msbuild
    The usual msbuild options are available, such as /m, /p:Configuration (which can specify Debug or Release) and /p:Platform (which can specify x86 or x64).

    Building with Visual Studio 2013

    Visual Studio GUI

    The Visual Studio solution is called suite3270.sln in the VS2013 folder. There are individual projects for each of the programs and components. The Debug and Release configurations build code without OpenSSL support. The SSL-Debug and SSL-Release configurations build code with OpenSSL support, and require standard OpenSSL header files to be installed in the folder C:\OpenSSL-Win64\include.

    Visual Studio Command Line

    To build with Microsoft Visual Studio from the command prompt, first open a command console with Visual Studio build environment variables set. Switch to the VS2013 directory, and type:
       msbuild
    The usual msbuild options are available, such as /m, /p:Configuration (which can specify Debug, Release, SSL-Debug or SSL-Release) and /p:Platform (which can specify x86 or x64). suite3270-3.6/wc3270/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021424 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/wc3270/html/FAQ.html0000664000076500007650000000575513221577163014376 0ustar pdmpdm wc3270 Frequently Asked Questions

    wc3270 Frequently Asked Questions

    If you have a problem building, installing, or running wc3270, please browse through this file first.

    General Questions

    Am I allowed to use it?

    Yes. Full copyright information is in the Lineage file, but the gist is that anyone is free to use the code, and anyone is free to sell copies of the code.

    You are also free to modify it and to redistribute it, provided you preserve the existing copyright notices.

    What versions of Windows does wc3270 run on?

    wc3270 runs on all 32-bit and 64-bit versions of Windows from Windows XP through Windows 10.

    How do I change the font?

    To change any of the screen properties for wc3270 not available in the Session Wizard (font, colors, cursor type, etc.), you should modify the properties of a wc3270 desktop shortcut, then run wc3270 to see the results. If you modify the properties of a live wc3270 session, you may get odd and inconsistent results.

    Note that if you want to run anything other than one of the basic U.S. character sets (us-english or bracket), then it is not a good idea to change the font, because non-English character set support requires a full Unicode fixed-width font, and Lucida Console is the only one provided with Windows.

    How do I change the keyboard mappings?

    Eventually, there will be a utility to create and edit custom keymaps. In the meantime, a tutorial for the manual procedure is here and the reference for keymaps is here.

    Getting Help

    If you are still having a problem with wc3270, feel free to send e-mail to Paul Mattes, Paul.Mattes@usa.net No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. It will also get you on an x3270 mailing list, which also includes information on wc3270, and where you can find out about new releases and bug fixes.

    When you send a question about wc3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of wc3270 you are using, including all patches, e.g., "3.3.6p1".
    2. What operating system you are running, and what version, e.g., "Windows XP SP2 32-bit".
    Complaints, suggestions and requests for enhancements are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) under the x3270 license. suite3270-3.6/wc3270/html/Intro.html0000664000076500007650000000167513221577163015057 0ustar pdmpdm wc3270 Introduction

    wc3270 Introduction

    wc3270 is a Windows console-based IBM 3270 terminal emulator. It can be used to communicate with any IBM host that supports 3270-style connections over TELNET. It can also communicate with hosts that use line-by-line ASCII mode to do initial login negotiation before switching to full-screen 3270 mode.

    wc3270 emulates one of four models of an IBM 3278 or 3279 terminal. The difference between the various models is the screen size. The emulation is not quite complete; wc3270 understands extended field orders but does not implement some of the extended attributes (outlining, extended validation, etc.). suite3270-3.6/wc3270/html/Keymap.html0000664000076500007650000002256213221577163015210 0ustar pdmpdm Creating a Custom wc3270 Keymap

    How to Create a Custom wc3270 Keymap

    It Might Already be Defined

    First, you might want to make sure that the action you want isn't already defined in the default keymap. The default keymap, documented on the wc3270 manual page, defines many common actions. For example, the Reset action, which unlocks the keyboard, is defined as Alt-r.

    Defining a Keymap in a File

    If the mappings you want aren't defined in the default keymap, you can create a custom keymap. The easiest way to do this is to follow this example -- a custom keymap that maps Page Up to PF7 and Page Down to PF8. (Note that in the default keymap, Page Up scrolls the display up, and Page Down scrolls it down; this keymap will override that.)

    First, pick a unique name for your keymap, e.g., mine. Using a text editor such as notepad, create a file called mine.wc3270km in your wc3270 documents directory (My Documents\wc3270 -- where where the Session Wizard saves session files).

    In that file, put the following, using a text editing program like Notepad:

    !description: Map PageUp and PageDown to PF7/PF8
    <Key>PRIOR: PF(7)
    <Key>NEXT: PF(8)

    Note that in a keymap file, comment lines start with !. Comment lines are ignored, except for one special one (shown above): a comment line starting with !description: will be displayed by the Session Wizard as the description of the keymap.

    To use the keymap, you can either create a new wc3270 session, or you can modify an existing one. In either case, run the Session Wizard. The list of available keymaps should now include mine.

    Tell the Session Wizard to change the keymap and rewrite the session file.

    Now, run your wc3270 session again. The Page Up key should now emulate the 3270 PF7 key, and the Page Down key should now emulate the 3270 PF8 key.

    Full Keymap File Name Conventions

    Keymap files can come in three flavors:
    • The file foo.wc3270km contains keymap definitions that apply to all wc3270 modes.
    • The file foo.nvt.wc3270km contains keymap definitions that apply only to NVT (non-3270) mode.
    • The file foo.3270.wc3270km contains keymap definitions that apply only to 3270 mode.
    Any or all of the three files can be present. The one, two or three files are taken together to represent a single keymap named foo.

    Rules for Keymap Definition Files

    You may now edit the keymap to create your own custom definition. Here is the full set of rules. Each line has the format:
      [modifier...] <Key> keyname... : action[(args)]...
    where:
      modifier is a keyboard modifier such as Ctrl or Alt
      keyname is a key name: a symbolic name for a key, such as semicolon (the ';' key) or a Windows key name such as HOME (the Home key)
      action is a wc3270 action such as Enter or PF
      args are the optional action arguments, such as a number to specify which PF key to transmit.

    Note that order matters in the keymap. Three important rules apply:

    • User-specified keymaps appear after the default keymap.
    • More-specific entries must come before less-specific ones.
    • If there is more than one entry mapping exactly the same key (with the modifiers), the last one wins.
    An example of the second rule is if you want to map both BACK (the Backspace key) and Shift-BACK. The entry for Shift-BACK must come before the entry for BACK, otherwise the entry for Shift-BACK will be ignored.

    The first rule, combined with the second, means that a default key mapping may interfere with your keymap. For example, if you want to define a mapping for Ctrl-Shift-F1, the default mapping for Shift-F1 (PF13) will override it. The way around this is to use the third rule: define your own mapping for Shift-F1. Your entry will disable the one in the default keymap. But (because of the second rule) be sure to put it after your entry for Ctrl-Shift-F1.

    Also note that except for entries that use the Ctrl modifier, mappings are case-sensitive. For example, an entry for Alt-p will not be matched if the Shift key is down or Caps Lock is in effect. To match both Alt-p and Alt-P, there must be two entries in your keymap.

    How to Find the Modifiers

    The list of modifiers is on the wc3270 manual page.

    How to Find the Key Names

    The names for alphanumeric keys can be entered literally, e.g., a for the A key. They can also be entered using ISO 8859-1 standard names, such as colon for the : key (which would otherwise confuse the keymap syntax). Finally, Unicode values (U+nnnn) can be used.

    The list of names for special Windows keys (VKeys), such as PRIOR, NEXT and HOME, is on the wc3270 manual page.

    wc3270 will also accept the syntax VKEY-0xnn, where nn is a hexadecimal number between 01 and fe (254). For example, the PRIOR key is VKey 0x21. wc3270 will accept VKEY-0x21 as an alias for PRIOR.

    To find out which key or sequence of keys is being generated for any given key on your keyboard, start wc3270 with the -trace option. wc3270 will create a pop-up window showing a trace file, which will include several lines of text for each key that is pressed. Each entry will include the text for the left-hand side of a keymap entry that will match that key. You can copy and paste the text into a keymap definition. The trace file is x3trc.pid on your desktop.

    How to Find the Actions

    These are documented on the wc3270 manual page.

    How to Debug Your Keymap

    There are two wc3270 options to aid with keymap debugging. The first is the -trace option described above. The information traced includes the keymap (and line within the keymap) that matched the event, the wc3270 action that was run in response, and if for some reason the action did not work, why it did not work.

    The second is the show keymap command at the wc3270> prompt, which displays the current keymap. This tells you exactly which keymap entries are active. Often times it will point out that wc3270 isn't using the keymap you thought it was, or that some of your keymap entries are interfering with one another.

    Keymaps as Resources

    It is also possible to put your keymap directly in your wc3270 session file, using resource definitions. This leaves fewer files to carry around if you want to move your session from one workstation to another.

    Keymap resource definitions go at the very end of a wc3270 session file. The above example would look like this:

        ! Note that in this file, backslash ('\') characters are used to specify
        ! escape sequences, such as '\r' for a Carriage Return character or '\t'
        ! for a Tab character.  To include literal backslashes in this file, such as
        ! in Windows pathnames or UNC paths, they must be doubled, for example:
        !
        !   Desired text            Must be specified this way
        !    C:\xdir\file            C:\\xdir\\file
        !    \\server\printer        \\\\server\\printer
        !
        !*Additional resource definitions can go after this line.
        ! Define my meymap.
        wc3270.keymap.mine: \n\
          <Key>PRIOR: PF(7) \n\
          <Key>Next: PF(8) \n
        ! Select my keymap.
        wc3270.keymap: mine
        
    Note that wc3270 resource definitions use backslash quoting conventions, so a backslash ('\') inside a keymap must be quoted with another backslash. Also, keymaps are multi-line resource definitions, so each line except the last must end with a newline ('\n') and a backslash ('\'), as shown above.

    Note that similar naming conventions are used to define the mode-specific keymap resources are are used to name the files: the wc3270.keymap.foo resource would define the mappings that are used in all modes; the wc3270.keymap.mine.nvt resource would define the mappings that apply only to NVT mode, and the wc3270.keymap.mine.3270 resource would define the mappings that apply only to 3270 mode. The one, two or three keymap resources above are taken together to define a single keymap, mine.

    More Information

    This document is not an exhaustive definition of keymaps -- the complete reference is the wc3270 manual page. It describes the many possible, subtle variations of the rules described above. suite3270-3.6/wc3270/html/Lineage.html0000664000076500007650000000445713221577163015331 0ustar pdmpdm wc3270 Lineage

    wc3270 Lineage

    Here is the official copyright notice for wc3270 3.3. It is a standard 3-element BSD license.

    Copyright © 1993-2015, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    suite3270-3.6/wc3270/html.m40000664000076500007650000000642213221577163013333 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/wc3270/html/README.html0000664000076500007650000000501413221577163014710 0ustar pdmpdm wc3270 3.5 General Release

    wc3270 3.5 General Release

    wc3270 is a Windows console-based IBM 3278/3279 terminal emulator.

    The online documentation includes:

    Manual
    The full wc3270 manual
    Manual
    The full ws3270 manual
    Manual
    The manual page for scripting functions.
    Manual
    The manual page for the x3270if utility
    Intro
    What wc3270 is
    Lineage
    Where wc3270 came from (copyright stuff)
    Build
    How to build wc3270 from source
    FAQ
    Frequently Asked Questions (what to do when something goes wrong)
    Keymap
    How to create and debug a custom keymap
    ReleaseNotes
    What's new in this release
    Resources
    A complete list of wc3270 resources (configuration items)
    Resources
    How to use wc3270 with the Secure Sockets Layer (SSL)
    Bugs
    What's broken in this release
    Wishlist
    What isn't in this release
    If you have a problem, scan through FAQ; there are lots of interesting answers there.

    Updates to wc3270, as well as the current status of development and bugs, are available from the x3270 Web Page.

    Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit.

    There is also an x3270 announcement list, which includes information about wc3270 and news about new releases. You can subscribe to this list here. suite3270-3.6/wc3270/html/ReleaseNotes.html0000664000076500007650000032733413221600613016343 0ustar pdmpdm wc3270 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/wc3270/html/Resources.html0000664000076500007650000026450613221600613015725 0ustar pdmpdm wc3270 Resources

    wc3270 Resources

    Resources are used to configure wc3270. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into wc3270.
    • If a session file foo.wc3270 is specified on the command line, its contents are applied. These definitions override resource values defined by compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example wc3270.bsdTm can be set by the following command-line option:
         -xrm "wc3270.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file (session file) has the following syntax.
    • Each definition consists of:
          wc3270.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          wc3270.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        

    Alphabetical Resource List

    Name: wc3270.acceptHostname
    Type: String
    Command Line: -accepthostname
    Description:

    Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.)

    Name: wc3270.altCursor
    Type: Boolean
    Default: false
    Command Line: -set altCursor , -clear altCursor
    Description:

    When true, this causes wc3270 to use the alternate (underscore) cursor. When false, it will use a block cursor.

    Name: wc3270.asciiBoxDraw
    Type: Boolean
    Default: false
    Description:

    When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width.

    Name: wc3270.autoShortcut
    Type: Boolean
    Default: false
    Command Line: -S , +S
    Description:

    When true, wc3270 will run in auto-shortcut mode. In auto-shortcut mode, wc3270 automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x.

    Name: wc3270.bellMode
    Type: String
    Description:

    Controls how wc3270 responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the wc3270 window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides wc3270.visualBell.

    Name: wc3270.bindLimit
    Type: Boolean
    Default: true
    Description:

    When true, wc3270 will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not.

    Name: wc3270.bindUnlock
    Type: Boolean
    Default: false
    Description:

    When true, wc3270 will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing wc3270 to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op.

    Name: wc3270.blankFill
    Type: Boolean
    Default: false
    Command Line: -set blankFill , -clear blankFill
    Description:

    When true, in 3270 mode wc3270 will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals.

    Name: wc3270.bsdTm
    Type: Boolean
    Default: false
    Description:

    Defines wc3270's response to the TELNET DO TIMING MARK option. When set to false, wc3270 will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, wc3270 will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of wc3270. In either case, wc3270 will never respond to a DONT TIMING MARK option.

    Name: wc3270.charset
    Type: String
    Default: bracket
    Command Line: -charset
    Description:

    This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by wc3270, use the -v command-line option.

    Note that wc3270 DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language.

    Name: wc3270.clientCert
    Type: String
    Command Line: -clientcert
    Description:

    Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store.

    Name: wc3270.color8
    Type: Boolean
    Default: false
    Description:

    If true, wc3270 will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported.

    Name: wc3270.composeMap
    Type: String
    Default: latin1
    Description:

    Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource wc3270.composeMap.foo.

    Name: wc3270.composeMap.foo
    Type: String
    Description:

    An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive.

    Name: wc3270.confDir
    Type: String
    Default: .
    Description:

    Defines the wc3270 configuration directory, where wc3270 will search for the ibm_hosts file by default. (See wc3270.hostsFile.)

    The default is to search the directory where wc3270 was started, which usually its installation directory.

    Name: wc3270.connectTimeout
    Type: Integer
    Command Line: -connecttimeout
    Description:

    Specifies a timeout, in seconds, that wc3270 will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that wc3270 will wait for the lesser of the two times (the specified timeout and the system-defined timeout).

    Name: wc3270.consoleColorForHostColor0
    Name: wc3270.consoleColorForHostColorNeutralBlack
    Name: wc3270.consoleColorForHostColor1
    Name: wc3270.consoleColorForHostColorBlue
    Name: wc3270.consoleColorForHostColor2
    Name: wc3270.consoleColorForHostColorRed
    Name: wc3270.consoleColorForHostColor3
    Name: wc3270.consoleColorForHostColorPink
    Name: wc3270.consoleColorForHostColor4
    Name: wc3270.consoleColorForHostColorGreen
    Name: wc3270.consoleColorForHostColor5
    Name: wc3270.consoleColorForHostColorTurquoise
    Name: wc3270.consoleColorForHostColor6
    Name: wc3270.consoleColorForHostColorYellow
    Name: wc3270.consoleColorForHostColor7
    Name: wc3270.consoleColorForHostColorNeutralWhite
    Name: wc3270.consoleColorForHostColor8
    Name: wc3270.consoleColorForHostColorBlack
    Name: wc3270.consoleColorForHostColor9
    Name: wc3270.consoleColorForHostColorDeepBlue
    Name: wc3270.consoleColorForHostColor10
    Name: wc3270.consoleColorForHostColorOrange
    Name: wc3270.consoleColorForHostColor12
    Name: wc3270.consoleColorForHostColorPurple
    Name: wc3270.consoleColorForHostColor13
    Name: wc3270.consoleColorForHostColorPaleGreen
    Name: wc3270.consoleColorForHostColor14
    Name: wc3270.consoleColorForHostColorPaleTurquoise
    Name: wc3270.consoleColorForHostColor15
    Name: wc3270.consoleColorForHostColorGrey
    Name: wc3270.consoleColorForHostColor16
    Name: wc3270.consoleColorForHostColorWhite
    Type: Integer
    Description:

    Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource wc3270.consoleColorForHostColorGreen or the resource wc3270.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the wc3270 Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, wc3270 maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with wc3270.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         wc3270.consoleColorForHostColorNeutralBlack: 15
         wc3270.consoleColorForHostColorNeutralWhite: 0
        

    Name: wc3270.crosshair
    Type: Boolean
    Default: false
    Command Line: -set crosshair , -clear crosshair
    Description:

    When true, causes wc3270 to display a crosshair over the cursor: lines extending with height and width of the screen.

    Name: wc3270.crosshairColor
    Type: String
    Default: purple
    Description:

    Defines the color used for the crosshair cursor (see wc3270.crosshair). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15

    Name: wc3270.cursorPos
    Type: Boolean
    Default: true
    Command Line: -set cursorPos , -clear cursorPos
    Description:

    When true, causes wc3270 to display the cursor location in the OIA (the status line).

    Name: wc3270.dbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use wc3270.sbcsCgcsgid for the single-byte (SBCS) character set.

    Name: wc3270.dftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Deprecated resource -- replaced by wc3270.ftBufferSize

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: wc3270.devName
    Type: String
    Command Line: -devname
    Description:

    Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: wc3270.dsTrace
    Type: Boolean
    Default: false
    Command Line: -trace , -set dsTrace , -clear dsTrace
    Description:

    Deprecated resource -- replaced by wc3270.trace

    When true, wc3270 writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.process-id.txt. It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. The directory where the file is written is defined by wc3270.traceDir. If wc3270.traceFile is defined, it gives the entire pathname and wc3270.traceDir is ignored.

    Name: wc3270.eof
    Type: String
    Default: ^D
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when wc3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    Name: wc3270.erase
    Type: String
    Default: ^?
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (wc3270 gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause wc3270 to discard the last character on the input line.

    When connected in character-at-a-time mode (wc3270 sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action.

    Name: wc3270.eventTrace
    Type: Boolean
    Default: false
    Command Line: -set eventTrace , -clear eventTrace
    Description:

    Deprecated resource -- replaced by wc3270.trace

    When true, wc3270 traces information about keyboard and mouse events into a file. The default file name is x3trc.process-id.txt. It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. The directory where the file is written is defined by wc3270.traceDir. If wc3270.traceFile is defined, it gives the entire pathname and wc3270.traceDir is ignored.

    Name: wc3270.extended
    Type: Boolean
    Default: false
    Command Line: -extended
    Description:

    Deprecated resource -- replaced by wc3270.model syntax

    Indicates support for the 3270 Extended Data Stream.

    Name: wc3270.ftAllocation
    Type: String
    Default: default
    Description:

    Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock.

    Name: wc3270.ftAvblock
    Type: Integer
    Description:

    Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers.

    Name: wc3270.ftBlksize
    Type: Integer
    Description:

    Defines the default block size for files sent to TSO hosts by IND$FILE file transfers.

    Name: wc3270.ftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: wc3270.ftCodePage
    Type: Integer
    Description:

    Deprecated resource -- replaced by wc3270.ftWindowsCodePage

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: wc3270.ftCr
    Type: String
    Default: auto
    Description:

    Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done.

    Name: wc3270.ftDirection
    Type: String
    Default: receive
    Description:

    Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation).

    Name: wc3270.ftExist
    Type: String
    Default: keep
    Description:

    Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be aborted, replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file.

    Name: wc3270.ftHost
    Type: String
    Default: tso
    Description:

    Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics.

    Name: wc3270.ftHostFile
    Type: String
    Description:

    Defines the default host file name for IND$FILE file transfers.

    Name: wc3270.ftLocalFile
    Type: String
    Description:

    Defines the default local file name for IND$FILE file transfers.

    Name: wc3270.ftLrecl
    Type: Integer
    Description:

    Defines the default logical record length for files sent to the host via IND$FILE.

    Name: wc3270.ftMode
    Type: String
    Default: ascii
    Description:

    Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation).

    Name: wc3270.ftPrimarySpace
    Type: Integer
    Description:

    Defines the default primary space allocation for files sent to TSO hosts via IND$FILE.

    Name: wc3270.ftRecfm
    Type: String
    Default: default
    Description:

    Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format.

    Name: wc3270.ftRemap
    Type: String
    Default: yes
    Description:

    Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by wc3270 to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37.

    Name: wc3270.ftSecondarySpace
    Type: Integer
    Description:

    Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE.

    Name: wc3270.ftWindowsCodePage
    Type: Integer
    Description:

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: wc3270.hostColorForDefault
    Name: wc3270.hostColorForIntensified
    Name: wc3270.hostColorForProtected
    Name: wc3270.hostColorForProtectedIntensified
    Type: String
    Description:

    Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See wc3270.consoleColorForHostColor0 for the definitions of host colors.

    The default values are:
    wc3270 Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite

    Name: wc3270.hostname
    Type: String
    Description:

    Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over wc3270.hostname.

    The most common use of wc3270.hostname is in session files, where a file is used to pass all of the options to establish a wc3270 session.

    Name: wc3270.hostsFile
    Type: String
    Default: ibm_hosts
    Description:

    The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page.

    Name: wc3270.httpd
    Type: String
    Command Line: -httpd
    Description:

    Defines the TCP port and optional address to listen on for HTTP connections. (wc3270 implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: wc3270.icrnl
    Type: Boolean
    Default: true
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines.

    Name: wc3270.idleCommand
    Type: String
    Description:

    When wc3270.idleCommand is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The wc3270.idleCommand can be an arbitrary sequence of wc3270 actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). wc3270.idleCommandEnabled must be true in order for the wc3270.idleCommand to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) wc3270.idleTimeout specifies the inactivity interval.

    Name: wc3270.idleCommandEnabled
    Type: Boolean
    Default: false
    Description:

    Controls whether wc3270.idleCommand has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.)

    Name: wc3270.idleTimeout
    Type: String
    Default: ~7m
    Description:

    The timeout value for wc3270.idleCommand. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified.

    Name: wc3270.inlcr
    Type: Boolean
    Default: false
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns.

    Name: wc3270.intr
    Type: String
    Default: ^C
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host.

    Name: wc3270.keymap
    Type: String
    Command Line: -keymap
    Description:

    The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a wc3270.keymap value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270.

    wc3270.keymap is only the name; the actual keymap for name foo can be defined either by the resource wc3270.keymap.foo, or by a keymap file. Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km.

    Name: wc3270.keymap.foo
    Type: String
    Description:

    The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax.

    Name: wc3270.kill
    Type: String
    Default: ^U
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when wc3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when wc3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action.

    Name: wc3270.lightPenPrimary
    Type: Boolean
    Default: false
    Description:

    Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste.

    Name: wc3270.lineWrap
    Type: Boolean
    Default: true
    Command Line: -set lineWrap , -clear lineWrap
    Description:

    This setting is used only in NVT mode. When true, wc3270 will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence.

    Name: wc3270.loginMacro
    Type: String
    Command Line: -loginmacro
    Description:

    Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a wc3270.hostsFile is in use and a matching entry is found, the login macro from that entry will be used in preference to the wc3270.loginMacro.

    Name: wc3270.lnext
    Type: String
    Default: ^V
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when wc3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered.

    Name: wc3270.m3279
    Type: Boolean
    Default: true
    Command Line: -color
    Description:

    Deprecated resource -- replaced by wc3270.model syntax

    Indicates support for color (a 3279 terminal).

    Name: wc3270.marginedPaste
    Type: Boolean
    Default: false
    Command Line: -set marginedPaste , -clear marginedPaste
    Description:

    When true, wc3270 will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon.

    Name: wc3270.menuBar
    Type: Boolean
    Default: true
    Description:

    If false, the menu bar will not be displayed at the top of the wc3270 main window.

    Name: wc3270.model
    Type: String
    Default: 3279-4-E
    Command Line: -model
    Description:

    The terminal model that wc3270 is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display.
      3279 specifies a color 3270 display.
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is the largest model that will fit on the console or terminal emulator window where wc3270 is running. Displaying the OIA (status line) requires one more row than what is listed above.
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.

    Name: wc3270.monoCase
    Type: Boolean
    Default: false
    Command Line: -set monoCase , -clear monoCase
    Description:

    When true, causes wc3270 to run in uppercase-only mode.

    Name: wc3270.newEnviron
    Type: Boolean
    Default: true
    Description:

    If true, wc3270 will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not.

    Name: wc3270.noPrompt
    Type: Boolean
    Default: false
    Description:

    If true, the interactive wc3270> prompt will be disabled. In particular, this means that when wc3270 is not connected to a host, a keymap or an external script is the only way to start a new host connection.

    Name: wc3270.nopSeconds
    Type: Integer
    Description:

    If nonzero, wc3270 will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity.

    Name: wc3270.numericLock
    Type: Boolean
    Default: false
    Description:

    When true, causes wc3270 to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute.

    Name: wc3270.nvtMode
    Type: Boolean
    Default: false
    Command Line: -nvt
    Description:

    When true, causes wc3270 to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname.

    Name: wc3270.onlcr
    Type: Boolean
    Default: true
    Description:

    Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences.

    Name: wc3270.oerrLock
    Type: Boolean
    Default: true
    Description:

    If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message.

    Name: wc3270.once
    Type: Boolean
    Default: false
    Command Line: -once
    Description:

    When true, wc3270 will exit as soon as a host disconnects. The default is false if no hostname is specified on the command line or in a session file, true otherwise.

    Name: wc3270.overlayPaste
    Type: Boolean
    Default: false
    Command Line: -set overlayPaste , -clear overlayPaste
    Description:

    When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause wc3270 to act as if the wc3270.marginedPaste toggle were also set.

    Name: wc3270.oversize
    Type: String
    Command Line: -oversize
    Description:

    Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. It can also be the string auto, which will cause wc3270 to use the entire screen area of the console window it is running in. It is used only if the wc3270.model includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with wc3270 in this mode.

    Name: wc3270.port
    Type: String
    Default: telnet
    Command Line: -port
    Description:

    The name of the default TCP port for wc3270 to connect to. This can be either a symbolic name from /etc/services, or an integer.

    Name: wc3270.proxy
    Type: String
    Command Line: -proxy
    Description:

    Defines a proxy server that wc3270 will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the wc3270 manual page.

    Name: wc3270.printerLu
    Type: String
    Command Line: -printerlu
    Description:

    If a value is set, wc3270 will automatically start a wpr3287 printer session when a host connection is established. If the value is ".", the wpr3287 session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session.

    Name: wc3270.printer.assocCommandLine
    Type: String
    Default: wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H%
    Description:

    Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use wc3270.printer.options.

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when wc3270.printerLU is "."). Within the string, the following substitutions are made:

    • %H% is replaced with the current host name
    • %I% is replaced with an option to pass wc3270.printer.codepage
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of wc3270.printer.options
    • %P% is replaced with the current session's proxy option (wc3270.proxy)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options

    Name: wc3270.printer.codepage
    Type: Integer
    Description:

    The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage.

    Name: wc3270.printer.luCommandLine
    Type: String
    Default: wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H%
    Description:

    Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use wc3270.printer.options.

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

    • %H% is replaced with the current host name
    • %I% is replaced with an option to pass wc3270.printer.codepage
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of wc3270.printer.options
    • %P% is replaced with current session's proxy option (wc3270.proxy)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options

    Name: wc3270.printer.name
    Type: String
    Description:

    Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer.

    Name: wc3270.printer.options
    Type: String
    Description:

    Defines extra parameters to substutute for the %O% token in the printer command line.

    Name: wc3270.printTextFont
    Type: String
    Default: Courier New
    Description:

    The font used by the PrintText action.

    Name: wc3270.printTextHorizontalMargin
    Type: Integer
    Default: 0.5
    Description:

    The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units.

    Name: wc3270.printTextOrientation
    Type: Integer
    Description:

    The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is.

    Name: wc3270.printTextScreensPerPage
    Type: Integer
    Default: 1
    Description:

    The number of screens to display on a page when tracing screens to the printer.

    Name: wc3270.printTextSize
    Type: Integer
    Default: auto (GDI), 8 (WordPad)
    Description:

    The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points.

    Name: wc3270.printTextVerticalMargin
    Type: Integer
    Default: 0.5
    Description:

    The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units.

    Name: wc3270.qrBgColor
    Type: Boolean
    Default: false
    Description:

    When true, wc3270 will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash.

    Name: wc3270.quit
    Type: String
    Default: ^\
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when wc3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host.

    Name: wc3270.reconnect
    Type: Boolean
    Default: false
    Description:

    When true, wc3270 will automatically reconnect to a host after it disconnects.

    Name: wc3270.rprnt
    Type: String
    Default: ^R
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when wc3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed.

    Name: wc3270.saveLines
    Type: Integer
    Default: 4096
    Command Line: -sl
    Description:

    The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved.

    Name: wc3270.sbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use wc3270.dbcsCgcsgid for the double-byte (DBCS) character set.

    Name: wc3270.screenTrace
    Type: Boolean
    Default: false
    Command Line: -set screenTrace , -clear screenTrace
    Description:

    When true, wc3270 will save an ASCII version of the screen image in a file every time it changes. The file name defaults to x3scr.pid.txt. The directory where the file is written is defined by wc3270.traceDir. If wc3270.screenTraceFile is defined, it defines the file name and wc3270.traceDir is ignored. file name.

    Name: wc3270.screenTraceFile
    Type: String
    Description:

    If defined, gives the name of the file that screen traces will be written into.

    Name: wc3270.scriptPort
    Type: Integer
    Command Line: -scriptport
    Description:

    If defined, wc3270 will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: wc3270.scriptPortOnce
    Type: Boolean
    Default: false
    Command Line: -scriptportonce
    Description:

    If defined, wc3270 will accept only one script connection. When that connection is broken, it will exit.

    Name: wc3270.startTls
    Type: Boolean
    Default: true
    Description:

    If true, wc3270 will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them.

    Name: wc3270.suppressActions
    Type: String
    Description:

    A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options.

    Name: wc3270.termName
    Type: String
    Command Line: -tn
    Description:

    An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of wc3270.model.

    Name: wc3270.title
    Type: String
    Command Line: -title
    Description:

    Sets the title for the wc3270 window, overriding the default of constructing the name from the host that is connected to.

    Name: wc3270.trace
    Type: Boolean
    Default: false
    Command Line: -trace , -set trace , -clear trace
    Description:

    When true, wc3270 writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.process-id.txt. It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. The directory where the file is written is defined by wc3270.traceDir. If wc3270.traceFile is defined, it gives the entire pathname and wc3270.traceDir is ignored.

    Name: wc3270.traceDir
    Type: String
    Default: current user's Desktop
    Description:

    Defines the directory that trace files are written into.

    Name: wc3270.traceFile
    Type: String
    Command Line: -tracefile
    Description:

    If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file.

    Name: wc3270.traceFileSize
    Type: String
    Command Line: -tracefilesize
    Description:

    If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started.

    Name: wc3270.traceMonitor
    Type: Boolean
    Default: true
    Description:

    When true, wc3270 will create a window to monitor data stream and event traces. When false, no monitor window will be created.

    Name: wc3270.typeahead
    Type: Boolean
    Default: true
    Description:

    When true, wc3270 will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped.

    Name: wc3270.underscore
    Type: Boolean
    Default: true
    Command Line: -set underscore , -clear underscore
    Description:

    When true, wc3270 will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed to overcome the fact that Windows consoles are unable to display real underlined text.

    Name: wc3270.unlockDelay
    Type: Boolean
    Default: true
    Description:

    When wc3270 sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, wc3270 implements a hack to briefly delay actually unlocking the keyboard. When wc3270.unlockDelay is true (the default), the keyboard unlock will be delayed for wc3270.unlockDelayMs milliseconds. Setting it to false removes this delay.

    Name: wc3270.unlockDelayMs
    Type: Integer
    Default: 350
    Description:

    Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and wc3270 actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros.

    Name: wc3270.user
    Type: String
    Command Line: -user
    Description:

    Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: wc3270.verifyHostCert
    Type: Boolean
    Default: true
    Command Line: -noverifycert , -verifycert
    Description:

    If true (the default), wc3270 will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, wc3270 will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking.

    Name: wc3270.visibleControl
    Type: Boolean
    Default: false
    Command Line: -set visibleControl , -clear visibleControl
    Description:

    If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, displayed in reverse-video yellow, are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified

    Name: wc3270.visualBell
    Type: Boolean
    Default: false
    Description:

    Deprecated resource -- replaced by wc3270.bellMode

    When true, wc3270 will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, wc3270 will beep the console and flash the screen.

    Note that this resource is overridden by wc3270.bellMode. wc3270.bellMode is the preferred method of controlling the console bell behavior.

    Name: wc3270.werase
    Type: String
    Default: ^W
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when wc3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when wc3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action.

    Index of All Resources

    acceptHostname altCursor asciiBoxDraw autoShortcut
    bellMode bindLimit bindUnlock blankFill
    bsdTm charset clientCert color8
    composeMap composeMap.foo confDir connectTimeout
    consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue
    consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink
    consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise
    consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite
    consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue
    consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple
    consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise
    consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite
    crosshair crosshairColor cursorPos dbcsCgcsgid
    dftBufferSize devName dsTrace eof
    erase eventTrace extended ftAllocation
    ftAvblock ftBlksize ftBufferSize ftCodePage
    ftCr ftDirection ftExist ftHost
    ftHostFile ftLocalFile ftLrecl ftMode
    ftPrimarySpace ftRecfm ftRemap ftSecondarySpace
    ftWindowsCodePage hostColorForDefault hostColorForIntensified hostColorForProtected
    hostColorForProtectedIntensified hostname hostsFile httpd
    icrnl idleCommand idleCommandEnabled idleTimeout
    inlcr intr keymap keymap.foo
    kill lightPenPrimary lineWrap loginMacro
    lnext m3279 marginedPaste menuBar
    model monoCase newEnviron noPrompt
    nopSeconds numericLock nvtMode onlcr
    oerrLock once overlayPaste oversize
    port proxy printerLu printer.assocCommandLine
    printer.codepage printer.luCommandLine printer.name printer.options
    printTextFont printTextHorizontalMargin printTextOrientation printTextScreensPerPage
    printTextSize printTextVerticalMargin qrBgColor quit
    reconnect rprnt saveLines sbcsCgcsgid
    screenTrace screenTraceFile scriptPort scriptPortOnce
    startTls suppressActions termName title
    trace traceDir traceFile traceFileSize
    traceMonitor typeahead underscore unlockDelay
    unlockDelayMs user verifyHostCert visibleControl
    visualBell werase

    Basic Configuration Resources

    charset connectTimeout hostname keymap
    model port proxy printerLu

    Appearance Resources

    altCursor consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1
    consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3
    consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5
    consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7
    consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9
    consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12
    consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14
    consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16
    consoleColorForHostColorWhite crosshair crosshairColor cursorPos
    hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified
    menuBar title underscore

    NVT-Mode Resources

    eof erase icrnl inlcr
    intr kill lineWrap lnext
    onlcr quit rprnt werase

    Protocol Resources

    bindLimit bindUnlock bsdTm color8
    dbcsCgcsgid dftBufferSize devName ftBufferSize
    sbcsCgcsgid termName user

    Terminal Interaction Resources

    bellMode blankFill ftAllocation ftAvblock
    ftBlksize ftCodePage ftCr ftDirection
    ftExist ftHost ftHostFile ftLocalFile
    ftLrecl ftMode ftPrimarySpace ftRecfm
    ftRemap ftSecondarySpace ftWindowsCodePage idleCommand
    idleCommandEnabled idleTimeout lightPenPrimary marginedPaste
    nopSeconds numericLock nvtMode oerrLock
    overlayPaste visualBell

    Security Resources

    acceptHostname clientCert noPrompt startTls
    suppressActions verifyHostCert

    Tracing Resources

    dsTrace eventTrace screenTrace screenTraceFile
    trace traceDir traceFile traceFileSize
    traceMonitor

    Other Resources

    asciiBoxDraw autoShortcut composeMap composeMap.foo
    confDir hostsFile httpd keymap.foo
    loginMacro monoCase newEnviron once
    oversize printer.assocCommandLine printer.codepage printer.luCommandLine
    printer.name printer.options printTextFont printTextHorizontalMargin
    printTextOrientation printTextScreensPerPage printTextSize printTextVerticalMargin
    qrBgColor reconnect saveLines scriptPort
    scriptPortOnce typeahead unlockDelay unlockDelayMs
    visibleControl

    Deprecated Resources

    extended m3279

    wc3270 version 3.6ga4 Fri Dec 29 21:01:31 CST 2017 suite3270-3.6/wc3270/html/SSL.html0000664000076500007650000002104013221600613014374 0ustar pdmpdm wc3270 and TLS

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/wc3270/html/wc3270-man.html0000664000076500007650000017531713221600613015452 0ustar pdmpdm wc3270 Manual Page

    wc3270 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Modes
    Character Sets
    Menu Bar and Keypad
    NVT Mode
    Toggles
    Status Line
    Actions
    Keymaps
    File Transfer
    The PrintText Action
    Nested Scripts
    Printer Session Support
    Proxy
    Resources
    See Also
    Copyrights
    Version

    Name

    wc3270 - IBM host access tool

    Synopsis

    wc3270 [options] [host]
    wc3270 [options] session-file.wc3270

    Description

    wc3270 opens a telnet connection to an IBM host in a console window. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The full syntax for host is:
    [prefix:]...[LUname@]hostname[:port][=accept]

    Prepending an S: onto hostname removes the "extended data stream" option reported to the host. See -tn below for further information.

    Prepending an N: onto hostname turns off TN3270E support for the session.

    Prepending an L: onto hostname causes wc3270 to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if wc3270 was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the L: prefix should not be used.

    Prepending a Y: onto hostname causes wc3270 to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options.

    Prepending an A: onto hostname is equivalent to setting the -nvt option; it forces an NVT-mode session instead of a 3270-mode session.

    A specific Logical Unit (LU) name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.)

    The hostname may optionally be placed inside square-bracket characters `[' and `]'. This will prevent any colon `:' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames.

    The port to connect to defaults to telnet. This can be overridden with the -port option, or by appending a port to the hostname with a colon `:'. (For compatability with previous versions of wc3270 and with tn3270(1), the port may also be specified as a second, separate argument.)

    An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`='). The accept name can also be specified with the -accepthostname option.

    Options

    wc3270 understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
    -allbold
    Forces all characters to be displayed using the `bold' colors (colors 8 through 15, rather than colors 0 through 7). This helps with PC console windows in which colors 0 through 7 are unreadably dim. All-bold mode is the default for color (3279) emulation, but not for monochrome (3278) emulation.
    -clientcert name
    Specifies the name of a client certificate to provide to the host.
    -charset name
    Specifies an EBCDIC host character set. See CHARACTER SETS below.
    -clear toggle
    Sets the initial value of toggle to false. The list of toggle names is under TOGGLES below.
    -connecttimeout seconds
    Specifies the time that wc3270 will wait for a host connection to complete.
    -devname name
    Specifies a device name (workstation ID) for RFC 4777 support.
    -hostsfile file
    Uses file as the hosts file, which allows aliases for host names and scripts to be executed at login. See ibm_hosts(1) for details.
    -httpd [addr:]port
    Specifies a port and optional address to listen on for HTTP connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080.

    Note that this option is mutually-exclusive with the -scriptport option .

    -loginmacro Action(arg...) ...
    Specifies a macro to run at login time.
    -model name
    The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted:

    The first part is the base model, which is either 3278 or 3279. 3278 specifies a monochrome (green on black) 3270 display; 3279 specifies a color 3270 display.

    The second part is the model number, which specifies the number of rows and columns. Model 4 is the default.

    Model Number
    Columns
    Rows
    2
    80
    24
    3
    80
    32
    4
    80
    43
    5
    132
    27

    Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway.

    The default model is 3279-4.

    -noverifycert
    For SSL/TLS connections, do not verify the host certificate.
    -nvt
    Start in NVT mode instead of waiting for the host to send data, and make the default terminal type xterm.
    -oversize colsxrows
    Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "wc3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing.

    It can also be specified as auto, which causes wc3270 to fill the entire terminal or console window.

    -port n
    Specifies a different TCP port to connect to. n can be a name from /etc/services like telnet, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.)
    -proxy type:host[:port]
    Causes wc3270 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -reconnect
    Causes wc3270 to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line.
    -sl n
    Specifies that n lines should be saved for scrolling back. The default is 4096.
    -S
    Runs wc3270 in auto-shortcut mode. wc3270 will create a temporary shorcut (.LNK file) that matches the parameters in the session file (model number, characterset, etc.) and re-run itself from the shortcut.
    +S
    Disables auto-shortcut mode. It is generally a good idea to put this option on the command lines of all shortcuts, to avoid infinite looping.
    -scriptport [addr:]port
    Specifies a port and optional address to listen on for scripting connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081.

    Note that this option is mutually-exclusive with the -httpd option .

    -scriptportonce
    Allows wc3270 to accept only one script connection. When that connection is broken, wc3270 will exit.
    -set toggle
    Sets the initial value of toggle to true. The list of toggle names is under TOGGLES below. The -p option of x3270if causes it to use this socket, instead of pipes specified by environment variables.
    -title text
    Sets the console window title to text, overriding the automatic setting of the hostname and the string wc3270.
    -tn name
    Specifies the terminal name to be transmitted over the telnet connection. The default name is IBM-model_name-E, for example, IBM-3278-4-E.

    Some hosts are confused by the -E suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an s: on the hostname, or setting the "wc3270.extended" resource to "false", removes the -E from the terminal name when connecting to such hosts.

    The name can also be specified with the "wc3270.termName" resource.

    -trace
    Turns on data stream and event tracing at startup. The default trace file name is x3trc.pid.txt on the current user's Desktop.
    -tracefile file
    Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file.
    -tracefilesize size
    Places a limit on the size of a trace file. If this option is not specified, or is specified as 0 or none, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of size can have a K or M suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started.
    -user name
    Specifies the user name for RFC 4777 support.
    -utf8
    Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage.
    -v
    Display the version and build options for wc3270 and exit.
    -verifycert
    For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a y: prepended to the hostname when connecting.
    -xrm "wc3270.resource: value"
    Sets the value of the named resource to value. Resources control less common wc3270 options, and are defined under RESOURCES below.

    Modes

    wc3270 has two basic modes: command-prompt and session.

    Command-prompt mode is where the wc3270> prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit wc3270, etc. The complete list of interactive commands is listed under ACTIONS.

    Session mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host.

    To switch from display mode to command-prompt mode, press the Escape key. To switch from command-prompt mode to display mode, press Enter (without entering a command) at the wc3270> prompt.

    Character Sets

    The -charset option or the "wc3270.charset" resource controls the EBCDIC host character set used by wc3270. Available sets include:

    Charset Name
    Host Code Page
    belgian
    500
    belgian-euro
    1148
    bracket
    037
    brazilian
    275
    chinese-gb18030
    1388
    cp1047
    1047
    cp870
    870
    finnish
    278
    finnish-euro
    1143
    french
    297
    french-euro
    1147
    german
    273
    german-euro
    1141
    greek
    423
    hebrew
    424
    icelandic
    871
    icelandic-euro
    1149
    italian
    280
    italian-euro
    1144
    japanese-kana
    930
    japanese-latin
    939
    norwegian
    277
    norwegian-euro
    1142
    russian
    880
    simplified-chinese
    935
    slovenian
    870
    spanish
    284
    spanish-euro
    1145
    swedish
    278
    swedish-euro
    1143
    thai
    1160
    traditional-chinese
    937
    turkish
    1026
    uk
    285
    uk-euro
    1146
    us-euro
    1140
    us-intl
    037

    The default character set is bracket, which is useful for common U.S. IBM hosts which use EBCDIC codes AD and BD for the `[' and `]' characters, respectively.

    Note that any of the host code pages listed above can be specified by adding cp to the host code page, e.g., cp037 for host code page 037. Also note that the code pages available for a given version of wc3270 are displayed by the -v command-line option.

    Note that DBCS character sets (Chinese, Japanese) display properly only on 32-bit Windows XP. Work is proceeding on other platforms.

    Menu Bar and Keypad

    wc3270 supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the wc3270> prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen.

    The on-screen menu title bar can be turned off via the "wc3270.menuBar" resource.

    The pop-up keypad allows the 3270-specific keys (PF keys, PA keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the wc3270> prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option.

    NVT Mode

    Some hosts use an ASCII front-end to do initial login negotiation, then later switch to 3270 mode. wc3270 will emulate an ANSI X3.64 terminal until the host places it in 3270 mode (telnet BINARY and SEND EOR modes, or TN3270E mode negotiation).

    If the host later negotiates to stop functioning in 3270 mode, wc3270 will return to NVT emulation.

    In NVT mode, wc3270 supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources:

    Mode/Character Resource Default
    Translate CR to NL wc3270.icrnl true
    Translate NL to CR wc3270.inlcr false
    Erase previous character wc3270.erase ^?
    Erase entire line wc3270.kill ^U
    Erase previous word wc3270.werase ^W
    Redisplay line wc3270.rprnt ^R
    Ignore special meaning of next character wc3270.lnext ^V
    Interrupt wc3270.intr ^C
    Quit wc3270.quit ^\
    End of file wc3270.eof ^D

    Separate keymaps can be defined for use only when wc3270 is in 3270 mode or NVT mode. See KEYMAPS for details.

    Toggles

    wc3270 has a number of configurable modes which may be selected by the -set and -clear options. These names can also be used as the first parameter to the Toggle action, and are the names of resources that can be used to set or clear the value of each toggle at start-up.
    aidWait
    Changes the behavior of actions that send an AID to the host (Enter, Clear, PA and PF). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the Wait(Unlock) action to wait for the unlock.
    altCursor
    If set, the cursor will be an underline. If clear, it will be a solid block.
    blankFill
    If set, wc3270 modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying `lock-up' that often occurs when inserting into an field with (apparent) space at the end.
    crosshair
    When set, wc3270 will display a crosshair to help locate the cursor on the screen.
    lineWrap
    If set, the NVT terminal emulator automatically assumes a NEWLINE character when it reaches the end of a line.
    marginedPaste
    If set, pasting multi-line input via the Paste action will maintain a left margin (it will not move the cursor further left than where the paste begins).
    monoCase
    If set, wc3270 operates in uppercase-only mode.
    overlayPaste
    If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    screenTrace
    Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file x3scr.pid.txt on the current user's desktop.
    showTiming
    If set, the time taken by the host to process an AID is displayed on the status line.
    trace
    Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file x3trc.pid.txt on the current user's desktop. The directory for the trace file can be changed with the "wc3270.traceDir" resource. Script commands are also traced.
    underscore
    If set, wc3270 will display underlined fields by substituting underscore `_' characters for blanks or nulls in the field. Otherwise, these fields will be displayed with a highlighted background. Note that setting underscore also disables the highlighted background for blinking fields. underscore is set by default.
    visibleControl
    If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes `<', SI becomes `>'. Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in reverse-video yellow. Field attribute mappings are part of the wc3270 Resources documentation for the visibleControl resource.

    Status Line

    The wc3270 status line contains a variety of information. From left to right, the fields are:
    comm status
    The first symbol is always a 4. If wc3270 is in TN3270E mode, the second symbol is a B; otherwise it is an A. If wc3270 is in SSCP-LU mode, the third symbol is an S. Otherwise it is blank.
    keyboard lock
    If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock.
    typeahead
    The letter "T" indicates that one or more keystrokes are in the typeahead buffer.
    temporary keymap
    The letter "K" indicates that a temporary keymap is in effect.
    reverse
    The letter "R" indicates that the keyboard is in reverse field entry mode.
    insert mode
    The letter "I" indicates that the keyboard is in insert mode.
    printer session
    The letter "P" indicates that a pr3287 session is active.
    secure connection
    A green letter "S" indicates that the connection is secured via SSL/TLS.
    LU name
    The LU name associated with the session, if there is one.
    cursor position
    The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0.

    Actions

    Here is a complete list of basic wc3270 actions. Script-specific actions are described on the wc3270-script(1) manual page. )

    Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response.

    *Attn attention key
    BackSpace move cursor left (or send ASCII BS)
    BackTab tab to start of previous input field
    CircumNot input "^" in NVT mode, or "¬" in 3270 mode
    *Clear clear screen
    Cols report screen size
    Compose next two keys form a special symbol
    *Connect(host) connect to host
    Copy copy highlighted area to clipboard
    *CursorSelect Cursor Select AID
    Cut copy highlighted area to clipboard and erase
    Delete delete character under cursor (or send ASCII DEL)
    DeleteField delete the entire field
    DeleteWord delete the current or previous word
    *Disconnect disconnect from host
    Down move cursor down
    Dup duplicate field
    *Enter Enter AID (or send ASCII CR)
    Erase erase previous character (or send ASCII BS)
    EraseEOF erase to end of current field
    EraseInput erase all input fields
    Execute(cmd) execute a command in a shell
    FieldEnd move cursor to end of field
    FieldMark mark field
    HexString(hex_digits) insert control-character string
    Home move cursor to first input field
    Insert set insert mode
    *Interrupt send TELNET IP to host
    Keypad Display pop-up keypad
    Key(keysym) insert key keysym
    Key(0xxx) insert key with character code xx
    Left move cursor left
    Left2 move cursor left 2 positions
    Menu Display menu bar
    MonoCase toggle uppercase-only mode
    MoveCursor(row, col) move cursor to zero-origin (row,col)
    Newline move cursor to first field on next line (or send ASCII LF)
    NextWord move cursor to next word
    *PA(n) Program Attention AID (n from 1 to 3)
    *PF(n) Program Function AID (n from 1 to 24)
    PreviousWord move cursor to previous word
    Paste insert clipboard contents
    Printer(Start[,lu]|Stop) start or stop printer session
    PrintText([gdi|wordpad,][dialog|nodialog,][printer-name]) print screen text on printer
    Quit exit wc3270
    Redraw redraw window
    Reset reset locked keyboard
    Right move cursor right
    Right2 move cursor right 2 positions
    Rows report screen size
    *Script(command[,arg...]) run a script
    Scroll(Forward|Backward) scroll screen
    *String(string) insert string (simple macro facility)
    *SelectDown Extend selection down
    SelectLeft Extend selection left
    SelectUp Extend selection up
    SelectDown Extend selection down
    SysReq System Request AID
    Tab move cursor to next input field
    Toggle(option[,set|clear]) toggle an option
    ToggleInsert toggle insert mode
    ToggleReverse toggle reverse-input mode
    *Transfer(option=value...') file transfer
    Up move cursor up

    Any of the above actions may be entered at the wc3270> prompt; these commands are also available for use in keymaps (see KEYMAPS). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.:

    PF(1)
    or with spaces, e.g.:
    PF 1
    Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used.

    wc3270 also supports the following interactive commands:

    Help
    Displays a list of available commands.
    ScreenTrace
    Turns screen tracing (saving screen images to a file) on or off. The command screentrace on enables screen tracing; the command screentrace off disables it. After on, a filename may be specified to override the default trace file name of x3scr.pid.txt. The keyaord on can also be followed by the keyword printer and an optional printer name to direct screen traces directly to the printer.
    Show
    Displays statistics and settings.
    Trace
    Turns tracing on or off. The command trace on enables data stream and keyboard event tracing; the command trace off disables it. The qualifier data or keyboard can be specified before on or off to enable or disable a particular trace. After on, a filename may be specified to override the default trace file name of x3trc.pid.txt.

    Note that certain parameters to wc3270 actions (such as the names of files and keymaps) are subject to substitutions:

    The character ~ at the beginning of a string is replaced with the user's home directory.

    Environment variables are substituted using the Unix shell convention of $name or ${name}.

    Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names.

    Keymaps

    The -keymap option or the wc3270.keymap resource allow a custom keymap to be specified. If the option -keymap xxx is given (or the wc3270.keymap resource has the value xxx), wc3270 will look for a resource named wc3270.keymap.xxx. If no resource definition is found, it will look for a file named xxx.wc3270km.

    Multiple keymaps may be specified be separating their names with commas. Definitions in later keymaps supercede those in earlier keymaps.

    In addition, separate keymaps may be defined that apply only in 3270 mode or NVT mode. For example, the resource definition wc3270.keymap.xxx.nvt or the file xxx.nvt.wc3270km will augment the definition of keymap xxx in NVT mode. Similarly, the resource definition wc3270.keymap.xxx.3270 or the file xxx.3270.wc3270km will augment the definition of keymap xxx in 3270 mode.

    Temporary keymaps can also be added or removed while wc3270 is running with the Keymap action. See wc3270-script(1) for details.

    Each line (rule) in a keymap specifies actions to perform when a particular key or sequence of keys is pressed. Keymap rules have the following syntax:

    [modifier...]<Key>key...: action[(param[,...])] ...

    Here is a sample keymap definition from a file:

    ! Lines beginning with ! are ignored and can
    ! occur anywhere.
    ! The line below will be displayed
    ! by the New Session Wizard.
    !description: An example.
    ! Definition of keymap xxx
    !  When Alt-c is pressed, clear the screen.
    Alt<Key>c: Clear()
    !  When PageUp is pressed, send PF7 to the host.
    <Key>PRIOR: PF(7)
    !  When Ctrl-a is pressed, then F1, send PF13
    !  to the host.
    Ctrl<Key>a <Key>F1: PF(13)

    Here is the same definition as a resource:

    ! Lines beginning with ! are ignored, but NOT
    ! within a definition.
    ! Note that the \ is required at the end of the
    ! first line, and \n\ is
    ! required at the end of every other line except
    ! the last.
    ! Definition of keymap xxx
    wc3270.keymap.xxx: \
     Alt<Key>c: Clear() \n\
     <Key>PRIOR: PF(7) \n\
     Ctrl<Key>A <Key>F1: PF(13)

    The optional Shift, Alt or Ctrl modifiers specify that the Shift, Alt and Ctrl keys are pressed along with the specified key, respectively. The LeftCtrl, RightCtrl, LeftAlt, and RightAlt modifiers specifify a particular Ctrl or Alt key. The Enhanced modifier is also available; Enhanced <Key>ENTER is the keypad Enter key. Key is either an ISO 8859-1 symbol name, such as equal for `=' and a for `a', or a symbolic Windows key name, such as UP. More than one key can be specified, indicating that a sequence of keys must be pressed in order for the rule to be matched. The action is an action from the ACTIONS list above. More than one action may be specified; they will be executed in order.

    Keymap entries are case-sensitive and modifier-specific. This means that a keymap for the b key will match only a lowercase b. Actions for uppercase B, or for Alt-B, must be specified separately.

    Available symbolic key names are: ADD, ALT, APPS, BACK (BackSpace), BackSpace (alias for BACK), CLEAR, CTRL, DECIMAL, DELETE, DIVIDE, DOWN, END, Enter (alias for RETURN), ESCAPE, Esc (alias for ESCAPE), EXECUTE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, HELP, HOME, INSERT, LEFT, LMENU, LWIN (Left Windows key), MULTIPLY, NEXT (Page Down), NUMLOCK, NUMPAD0, NUMPAD1, NUMPAD2, NUMPAD3, NUMPAD4, NUMPAD5, NUMPAD6, NUMPAD7, NUMPAD8, NUMPAD9, PageUp (alias for PRIOR), PageDown (alias for Next), PAUSE, PRINT, PRIOR (Page Up), RETURN (Enter), RIGHT, RMENU, RWIN (Right Windows key), SCROLL, SELECT, SEPARATOR, SHIFT, SLEEP, SNAPSHOT, SUBTRACT, TAB and UP. In addition, any Windows VKey code can be specified in hexadecimal with the syntax VKEY-0xnn.

    The base keymap is:

    Key Action
    Alt<Key>1 PA(1)
    Alt<Key>2 PA(2)
    Alt<Key>3 PA(3)
    Alt Ctrl<Key>] Key(0x1d)
    Ctrl<Key>] Escape
    Alt<Key>^ Key(notsign)
    Ctrl<Key>c Copy
    Alt<Key>k Keymap
    Alt<Key>l Redraw
    Alt<Key>m Compose
    Alt<Key>n Menu
    Ctrl<Key>p Paste
    Alt<Key>p PrintText
    Ctrl<Key>x Cut
    <Key>PRIOR Scroll(Backward)
    <Key>NEXT Scroll(Forward)
    Shift<Key>Fn PF(n+12)

    The base 3270-mode keymap adds:

    Key Action
    Ctrl<Key>a Attn
    Alt<Key>a Attn
    Alt<Key>c Clear
    Ctrl<Key>d Dup
    Alt<Key>d Dup
    Ctrl<Key>f FieldMark
    Alt<Key>f FieldMark
    Ctrl<Key>h Erase
    Alt<Key>i Insert
    Shift Ctrl<Key>i BackTab
    Ctrl<Key>i Tab
    Ctrl<Key>j Newline
    Ctrl<Key>l Redraw
    Ctrl<Key>m Enter
    Ctrl<Key>r Reset
    Alt<Key>r Reset
    Ctrl<Key>u DeleteField
    <Key>INSERT ToggleInsert
    Shift<Key>TAB BackTab
    <Key>BACK Erase
    Shift<Key>END EraseEOF
    <Key>END FieldEnd
    Ctrl<Key>LEFT PreviousWord
    Ctrl<Key>RIGHT NextWord
    Shift<Key>LEFT SelectLeft
    Shift<Key>RIGHT SelectRight
    Shift<Key>UP SelectUp
    Shift<Key>DOWN SelectDown
    <Key>PRIOR PF(7)
    <Key>NEXT PF(8)

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    The Transfer action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes wc3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes wc3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.
    WindowsCodePage
    Overrides the workstation code page used for ASCII file transfers. By default, the system ANSI code page is used.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the wc3270.ftMode resource.

    The PrintText Action

    The PrintText produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the name of the printer to use. The font defaults to Courier New and the point size defaults to auto (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the printTextFont and printTextSize resources, respectively. Unless the wordpad keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. printTextHorizontalMargin defines the left- and right-hand margins. printTextVerticalMargin defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with mm or cm. printTextOrientation defines the page orientation as portrait or landscape.

    Multiple arguments can include keywords to control the output of PrintText:

    gdi
    Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default).
    wordpad
    Create an RTF file and run WordPad to print it. (This was the former default).
    dialog
    In GDI mode, pop up the Windows print dialog. (This is the default.)
    nodialog
    In GDI mode, skip the usual Windows print dialog.
    file filename
    Save the output in a file.
    html
    Save the output as HTML. This option implies file.
    rtf
    Save the output as RichText. This option implies file. The font defaults to Courier New and the point size defaults to 8. These can be overridden by the printTextFont and printTextSize resources, respectively.
    modi
    Render modified fields in italics.
    caption text
    Add the specified text as a caption above the output. Within text, the special sequence %T% will be replaced with a timestamp.

    Nested Scripts

    The String Action
    The simplest method for nested scripts is provided via the String action. The arguments to String are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the AID code to the host, wc3270 will wait for the host to unlock the keyboard before further processing the string.)
    \b Left
    \exxxx EBCDIC character in hex
    \f Clear*
    \n Enter*
    \pan PA(n)*
    \pfnn PF(nn)*
    \r Newline
    \t Tab
    \T BackTab
    \uxxxx Unicode character in hex
    \xxxxx Unicode character in hex

    Note that the numeric values for the \e, \u and \x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if wc3270 is built with DBCS support and the host allows DBCS input in the current field.

    An example keymap entry would be:

    Alt<Key>p: String("probs clearrdr\n")

    Note: The strings are in ASCII and converted to EBCDIC, so beware of inserting control codes.

    There is also an alternate form of the String action, HexString, which is used to enter non-printing data. The argument to HexString is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent EBCDIC characters, which are entered into the current field. In NVT mode, the hexadecimal data represent ASCII characters, which are sent directly to the host.

    The Script Action
    This action causes wc3270 to start a child process which can execute wc3270 actions. wc3270 listens for connections from the child process on a dynamically-generated TCP port. The Script action is fully documented in wc3270-script(1).

    Printer Session Support

    wc3270 supports associated printer sessions via the wpr3287(1) program. The Printer action is used to start or stop a wpr3287 session.

    The action Printer Start starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.)

    The action Printer Start lu starts a printer session, associated with a specific lu.

    The action Printer Stop stops a printer session.

    The resource wc3270.printer.name specifies the Windows printer used to print each job. It defaults to the value of the $PRINTER environment variable, if set. Otherwise the default system printer is used. This resource also controls the printer used by the PrintText action.

    The resource wc3270.printer.options specifies extra options, such as -trace to pass to wpr3287.

    See wpr3287(1) for further details.

    The resource wc3270.printerLu controls automatic printer session start-up. If it is set to `.', then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU.

    Proxy

    The -proxy option or the wc3270.proxy resource causes wc3270 to use a proxy server to connect to the host. The syntax of the option or resource is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    Resources

    Certain wc3270 options can be configured via resources. Resources are defined in the session file, or by -xrm options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in wc3270 are:

    Resource Default Option Purpose
    blankFill False -set blankFill Blank Fill mode
    charset bracket -charset EBCDIC character set
    consoleColorForHostColorn (note 6)   Color mapping
    dbcsCgcsgid     Override DBCS CGCSGID
    dsTrace False -trace Data stream tracing
    eof ^D   NVT-mode EOF character
    erase ^H   NVT-mode erase character
    extended True   Use 3270 extended data stream
    eventTrace False -trace Event tracing
    hostColorForDefault green   Default color mapping
    hostColorForIntensified red   Default color mapping
    hostColorForProtected blue   Default color mapping
    hostColorForProtectedIntensified neutralWhite   Default color mapping
    icrnl False   Map CR to NL on NVT-mode input
    inlcr False   Map NL to CR in NVT-mode input
    intr ^C   NVT-mode interrupt character
    kill ^U   NVT-mode kill character
    lineWrap False -set lineWrap NVT line wrap mode
    lnext ^V   NVT-mode lnext character
    m3279 (note 1) -model 3279 (color) emulation
    marginedPaste False -set marginedPaste Keep left margin when pasting
    monoCase False -set monoCase Mono-case mode
    noPrompt False -noprompt Disable command-prompt mode
    numericLock False   Lock keyboard for numeric field error
    oerrLock False   Lock keyboard for input error
    overlayPaste False -set overlayPaste Overlay protected fields when pasting
    oversize   -oversize Oversize screen dimensions
    port telnet -port Non-default TCP port
    printer.* (note 4)   Printer session config
    printerLu (note 4)   Printer session config
    printTextFont Courier New   PrintText font name
    printTextSize 8   PrintText font size
    quit ^\   NVT-mode quit character
    reconnect False -reconnect Automatically reconnect to host
    rprnt ^R   NVT-mode reprint character
    sbcsCgcsgid     Override SBCS CGCSGID
    secure False   Disable "dangerous" options
    termName (note 2) -tn TELNET terminal type string
    title     Console window title
    traceFile (note 3) -tracefile File for trace output
    visualBell False   Disable bell sound
    werase ^W   NVT-mode word-erase character

    Note 1: m3279 defaults to True. It can be forced to False with the proper -model option.

    Note 2: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as IBM-3279-2-E. Note also that when TN3270E mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities.

    Note 3: The default trace file is x3trc.pid.txt on the current user's desktop.

    Note 4: See PRINTER SUPPORT for details.

    Note 6: The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.

    If more than one -xrm option is given for the same resource, the last one on the command line is used.

    See Also

    wpr3287(1), ws3270(1), wc3270-script(1), telnet(1), tn3270(1)
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    wc3270 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/wc3270/html/wc3270-script.html0000664000076500007650000007746513221600613016210 0ustar pdmpdm wc3270-script Manual Page

    wc3270-script Manual Page

    Contents

    Name
    Synopsis
    Description
    Status Format
    Differences
    Basic Programming Strategies
    Script-Specific Actions
    File Transfer
    See Also
    Version

    Name

    Scripting Facilities for wc3270 and ws3270

    Synopsis

    wc3270 -scriptport port [ ws3270-options ]
    ws3270 [ ws3270-options ]
    Script ( command [ ,arg... ] )

    Description

    The x3270 scripting facilities allow the interactive 3270 emulator wc3270 to be operated under the control of another program, and forms the basis for the script-only emulator ws3270.

    There are three basic scripting methods. The first is the peer script facility, the default mode for ws3270. This runs the emulator as a child of another process. Typically this would be a script using expect(1), perl(1), or the co-process facility of the Korn Shell ksh(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output.

    The second method is the child script facility, invoked by the emulator's Script action. This runs a script as a child process of the emulator. The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196).

    The third method uses a TCP socket. The -scrpiptport command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. (Note that if the Script action is used with -scriptport, it will pass the scriptport port number to child scripts, rather than creating a new socket.)

    It is possible to nest the methods. For example, a peer or TCP socket script can invoke the Script action. The calling script will be resumed when the nested script completes.

    Commands are emulator actions; the syntax is the same as for the right-hand side of a wc3270 keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with # or ! is treaded as a comment and will be ignored.

    Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script.

    Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error".

    Status Format

    The status message consists of 12 blank-separated fields:
    1 Keyboard State
    If the keyboard is unlocked, the letter U. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter L. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter E.
    2 Screen Formatting
    If the screen is formatted, the letter F. If unformatted or in NVT mode, the letter U.
    3 Field Protection
    If the field containing the cursor is protected, the letter P. If unprotected or unformatted, the letter U.
    4 Connection State
    If connected to a host, the string C(hostname). Otherwise, the letter N.
    5 Emulator Mode
    If connected in 3270 mode, the letter I. If connected in NVT line mode, the letter L. If connected in NVT character mode, the letter C. If connected in unnegotiated mode (no BIND active from the host), the letter P. If not connected, the letter N.
    6 Model Number (2-5)
    7 Number of Rows
    The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model.
    8 Number of Columns
    The current number of columns defined on the screen, subject to the same difference for rows, above.
    9 Cursor Row
    The current cursor row (zero-origin).
    10 Cursor Column
    The current cursor column (zero-origin).
    11 Window ID
    The X window identifier for the main x3270 window, in hexadecimal preceded by 0x. For ws3270 and wc3270, this is zero.
    12 Command Execution Time
    The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash.

    Differences

    When an action is initiated by a script, the emulators behave in several different ways:

    If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output.

    If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the CloseScript action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the Script action to complete.

    The Quit action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.)

    Normally, the AID actions (Clear, Enter, PF, and PA) will not complete until the host unlocks the keyboard. If the parameter to a String action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding.

    The AidWait toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The Wait(Output) action can then be used to delay a script until the host changes something on the screen, and the Wait(Unlock) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the AidWait toggle.

    Note that the Script action does not complete until the CloseScript action is called by the child process. This behavior is not affected by the state of the AidWait toggle.

    Basic Programming Strategies

    3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete.

    Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the Snap action. The Snap(Save) action saves a snapshot of the screen in a special buffer. Then the script can use Snap variants of the Ascii and Ebcdic actions (Snap(Ascii) and Snap(Ebcdic)) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, Snap(Wait Output) blocks the script until the host modifies the screen, specifically since the last call to Snap(Save). Thus a script can poll the screen efficiently by writing a loop that begins with Snap(Save) and ends with Snap(Wait Output).

    Script-Specific Actions

    The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, row and col coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]).
    AnsiText
    Outputs whatever data that has been output by the host in NVT mode since the last time that AnsiText was called. The data is preceded by the string "data: ", and has had all control characters expanded into C backslash sequences.

    This is a convenient way to capture NVT mode output in a synchronous manner without trying to decode the screen contents.

    Ascii(row,col,rows,cols)
    Ascii(row,col,length)
    Ascii(length)
    Ascii
    Outputs an ASCII text representation of the screen contents. Each line is preceded by the string "data: ", and there are no control characters.

    If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.)

    If three parameters are given, length characters are output, starting at the specified zero-origin row and column.

    If only the length parameter is given, that many characters are output, starting at the cursor position.

    If no parameters are given, the entire screen is output.

    The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the -charset option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f.

    AsciiField
    Outputs an ASCII text representation of the field containing the cursor. The text is preceded by the string "data: ".
    Connect(hostname)
    Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails.
    CloseScript(status)
    Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the Script action, the optional status is used as the return status of Script; if nonzero, Script will complete with an error, and if this script was invoked as part of login through the ibm_hosts file, the connection will be broken.
    ContinueScript([param])
    Allows a script that is waiting in a PauseScript action, below, to continue. The optional param string is output by the PauseScript action.
    Disconnect
    Disconnects from the host.
    Ebcdic(row,col,rows,cols)
    Ebcdic(row,col,length)
    Ebcdic(length)
    Ebcdic
    The same function as Ascii above, except that rather than generating ASCII text, each character is output as a 2-digit or 4-digit hexadecimal EBCDIC code.
    EbcdicField
    The same function as AsciiField above, except that it generates hexadecimal EBCDIC codes.
    Info(message)
    In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270.
    Expect(text[,timeout])
    Pauses the script until the specified text appears in the data stream from the host, or the specified timeout (in seconds) expires. If no timeout is specified, the default is 30 seconds. Text can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. Expect is valid only in NVT mode.
    Keymap([keymap])
    Adds or removes a temporary keymap. If the keymap parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed.
    MoveCursor(row,col)
    Moves the cursor to the specified zero-origin coordinates.
    PauseScript
    Stops a script until the ContinueScript action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to ContinueScript, if one is given.
    PrintText([command,]filter)
    Pipes an ASCII representation of the current screen image through the named filter, e.g., lpr.
    PrintText([html,][append,][replace,]file,filename)
    Saves the current screen contents in a file. With the html option, saves it as HTML, otherwise saves it as plain ASCII. The append option (the default) causes the data to be appended to the file if it already exists. The replace option causes the file to be overwritten instead.
    PrintText(html,string)
    Returns the current screen contents as HTML.
    Query(keyword)
    Returns state information. Keywords are:

    Keyword Output
    BindPluName BIND PLU returned by the host
    ConnectionState TN3270/TN3270E mode and submode
    CodePage Host code page
    Cursor Cursor position (row col)
    Formatted 3270 format state (formatted or unformatted)
    Host Host name and port
    LocalEncoding Local character encoding
    LuName Host name LU name
    Model 3270 model name (IBM-327x-n)
    ScreenCurSize Current screen size (rows cols)
    ScreenMaxSize Maximum screen size (rows cols)
    Ssl SSL state (secure or not-secure) and host validation state (host-verified or host-unverified)

    Without a keyword, Query returns each of the defined attributes, one per line, labeled by its name.

    ReadBuffer(Ascii)
    Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as SF(aa=nn[,...]), where aa is a field attribute type and nn is its value.

    Attribute
    Values
    c0 basic 3270
    20 protected
    10 numeric
    04 detectable
    08 intensified
    0c non-display
    01 modified
    41 highlighting
    f1 blink
    f2 reverse
    f4 underscore
    f8 intensify
    42 foreground
    f0 neutral black
    f1 blue
    f2 red
    f3 pink
    f4 green
    f5 turquoise
    f6 yellow
    f7 neutral white
    f8 black
    f9 deep blue
    fa orange
    fb purple
    fc pale green
    fd pale turquoise
    fe grey
    ff white
    43 character set
    f0 default
    f1 APL
    f8 DBCS

    Extended attributes (which do not take up display positions) are output as SA(aa=nn), with aa and nn having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute).

    In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks.

    ReadBuffer(Ebcdic)
    Equivalent to ReadBuffer(Ascii), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as GE(xx).
    Script(path[,arg...])
    Runs a child script, passing it optional command-line arguments. path must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the Source action.
    Snap
    Equivalent to Snap(Save) (see below).
    Snap(Ascii,...)
    Performs the Ascii action on the saved screen image.
    Snap(Cols)
    Returns the number of columns in the saved screen image.
    Snap(Ebcdic,...)
    Performs the Ebcdic action on the saved screen image.
    Snap(ReadBuffer)
    Performs the ReadBuffer action on the saved screen image.
    Snap(Rows)
    Returns the number of rows in the saved screen image.
    Snap(Save)
    Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other Snap actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically.
    Snap(Status)
    Returns the status line from when the screen was last saved.
    Snap(Wait[,timeout],Output)
    Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an Enter, PF or PA action), but has not finished updating the screen. This action is usually invoked in a loop that uses the Snap(Ascii) or Snap(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Snap action. The default is to wait indefinitely.

    Source(file)
    Read and execute commands from file. Any output from those commands will become the output from Source. If any of the commands fails, the Source command will not abort; it will continue reading commands until EOF.
    Title(text)
    Changes the wc3270 window title to text.
    Transfer(keyword=value,...)
    Invokes IND$FILE file transfer. See FILE TRANSFER below.
    Wait([timeout,] 3270Mode)
    Used when communicating with a host that switches between NVT mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(3270) is equivalent to Wait(3270Mode)

    Wait([timeout,] Disconnect)
    Pauses the script until the host disconnects. Often used to after sending a logoff command to a VM/CMS host, to ensure that the session is not unintentionally set to disconnected state.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] InputField)
    A useful utility for use at the beginning of scripts and after the Connect action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In NVT mode, waits until the host sends at least one byte of data.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait is equivalent to Wait(InputField).

    Wait([timeout,] NVTMode)
    Used when communicating with a host that switches between 3270 mode and NVT mode. Pauses the script or macro until the host negotiates NVT mode, then waits for a byte from the host as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(ansi) is equivalent to Wait(NVTMode).

    Wait([timeout,] Output)
    Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a Clear, Enter, PF or PA action), but has not finished updating the screen. Also used in non-blocking AID mode (see DIFFERENCES for details). This action is usually invoked in a loop that uses the Ascii or Ebcdic action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] Unlock)
    Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (toggle AidWait clear), to wait for a host command to complete. See DIFFERENCES for details).

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait(timeout, Seconds)
    Delays the script timeout seconds. Unlike the other forms of Wait, the timeout is not optional.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    The Transfer action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes wc3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes wc3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.
    WindowsCodePage
    Overrides the workstation code page used for ASCII file transfers. By default, the system ANSI code page is used.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the wc3270.ftMode resource.

    See Also

    expect(1)
    perl(1)
    ksh(1)
    x3270if(1)
    wc3270(1)
    ws3270(1)

    Version

    Version 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/wc3270/html/Wishlist.html0000664000076500007650000000126313221577163015563 0ustar pdmpdm The wc3270 Wish List

    The wc3270 Wish List

    Here is a list of some of the more interesting suggestions and requests made for wc3270. You may also take this as a list of functions that are definitely not in this version of wc3270.

    There is no guarantee that anyone is actively working on these, but feel free to yourself...

    • A utility to define and edit keymaps.
    suite3270-3.6/wc3270/keymap.c0000664000076500007650000007304213221577163013561 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * keymap.c * A Windows Console-based 3270 Terminal Emulator * Keyboard mapping */ #include "globals.h" #include #include "appres.h" #include "resources.h" #include "actions.h" #include "glue.h" #include "host.h" #include "keymap.h" #include "lazya.h" #include "macros.h" #include "popups.h" #include "screen.h" #include "status.h" #include "trace.h" #include "utils.h" #define ISREALLYSPACE(c) ((((c) & 0xff) <= ' ') && isspace(c)) #define WC3270KM_SUFFIX "wc3270km" #define SUFFIX_LEN sizeof(WC3270KM_SUFFIX) #define KM_3270_ONLY 0x0100 /* used in 3270 mode only */ #define KM_NVT_ONLY 0x0200 /* used in NVT mode only */ #define KM_INACTIVE 0x0400 /* wrong NVT/3270 mode, or overridden */ #define KM_KEYMAP 0x8000 #define KM_HINTS (KM_SHIFT | KM_CTRL | KM_ALT | KM_ENHANCED) struct keymap { struct keymap *next; /* next element in the keymap */ struct keymap *successor; /* mapping that overrules this one */ int ncodes; /* number of key codes */ int *codes; /* key codes (ASCII or vkey symbols) */ int *hints; /* hints (modifiers and restrictions) */ char *name; /* keymap name */ char *file; /* file path or resource name */ int line; /* keymap line number */ bool temp; char *action; /* action(s) to perform */ }; #define IS_INACTIVE(k) ((k)->hints[0] & KM_INACTIVE) static struct keymap *master_keymap = NULL; static bool last_3270 = false; static bool last_nvt = false; static int lookup_ccode(const char *s); static void keymap_3270_mode(bool); static void read_one_keymap(const char *name, const char *fn, bool temp, const char *r0, int flags); static void clear_keymap(void); static void set_inactive(void); /* * Parse a key definition. * Returns <0 for error, 1 for key found and parsed, 0 for nothing found. * Returns the balance of the string and the character code. * Is destructive. */ enum { PKE_MKEY = -1, PKE_UMOD = -2, PKE_MSYM = -3, PKE_USYM = -4 } pk_error; static char *pk_errmsg[] = { "Missing ", "Unknown modifier", "Missing key", "Unknown key" }; static int parse_keydef(char **str, int *ccode, int *hint) { char *s = *str; char *t; char *ks; int flags = 0; ks_t Ks; int xccode; /* Check for nothing. */ while (ISREALLYSPACE(*s)) { s++; } if (!*s) { return 0; } *str = s; s = strstr(s, ""); if (s == NULL) { return PKE_MKEY; } ks = s + 5; *s = '\0'; s = *str; while (*s) { while (ISREALLYSPACE(*s)) { s++; } if (!*s) { break; } if (!strncasecmp(s, "Shift", 5)) { flags |= KM_SHIFT; s += 5; } else if (!strncasecmp(s, "Ctrl", 4)) { flags |= KM_CTRL; s += 4; } else if (!strncasecmp(s, "LeftCtrl", 8)) { flags |= KM_LCTRL; s += 8; } else if (!strncasecmp(s, "RightCtrl", 9)) { flags |= KM_RCTRL; s += 9; } else if (!strncasecmp(s, "Alt", 3)) { flags |= KM_ALT; s += 3; } else if (!strncasecmp(s, "LeftAlt", 7)) { flags |= KM_LALT; s += 7; } else if (!strncasecmp(s, "RightAlt", 8)) { flags |= KM_RALT; s += 8; } else if (!strncasecmp(s, "Enhanced", 8)) { flags |= KM_ENHANCED; s += 8; } else { return PKE_UMOD; } } s = ks; while (ISREALLYSPACE(*s)) { s++; } if (!*s) { return PKE_MSYM; } t = s; while (*t && !ISREALLYSPACE(*t)) { t++; } if (*t) { *t++ = '\0'; } xccode = lookup_ccode(s); if (xccode != -1) { *ccode = xccode; } else { if (!strncasecmp(s, "U+", 2) || !strncasecmp(s, "0x", 2)) { unsigned long l; char *ptr; /* * Explicit Unicode. * We limit ourselves to UCS-2 for now, becuase of how * we represent keymaps and keys (VK_xxx in upper 16 * bits, Unicode in lower 16 bits). */ l = strtoul(s, &ptr, 16); if (!((l == 0) || (l & ~0xffff) || *ptr != '\0')) { *ccode = (int)l; } else { return PKE_USYM; } } else if (strlen(s) == 1) { int nc; WCHAR w; /* Single (ANSI CP) character. */ nc = MultiByteToWideChar(CP_ACP, 0, s, 1, &w, 1); if (nc == 1) { *ccode = (int)w; } else { return PKE_USYM; } } else { /* Try for a Latin-1 name. */ Ks = string_to_key(s); if (Ks != KS_NONE) { *ccode = (int)Ks; } else { return PKE_USYM; } } } /* Canonicalize Ctrl. */ if ((flags & KM_CTRL) && *ccode >= '@' && *ccode <= '~') { *ccode &= 0x1f; flags &= ~KM_CTRL; } /* Return the remaining string, and success. */ *str = t; *hint = flags; return 1; } /* * Locate a keymap resource or file. * Returns 0 for do-nothing, 1 for success, -1 for error. * On success, returns the full name of the resource or file (which must be * freed) in '*fullname'. * On success, returns a resource string (which must be closed) or NULL * (indicating a file name to open is in *fullname) in '*r'. */ static int locate_keymap(const char *name, char **fullname, char **r) { char *rs; /* resource value */ char *fnx; /* expanded file name */ char *fny; char *fnp; int a; /* Return nothing, to begin with. */ *fullname = NULL; *r = NULL; /* See if it's a resource. */ rs = get_fresource(ResKeymap ".%s", name); /* If there's a plain version, return it. */ if (rs != NULL) { *fullname = NewString(name); *r = NewString(rs); return 1; } /* See if it's a file. */ fnx = do_subst(name, DS_VARS | DS_TILDE); fny = xs_buffer("%s.%s", fnx, WC3270KM_SUFFIX); /* My Documents\wc3270\foo.wc3270km? */ if (mydocs3270 != NULL) { fnp = xs_buffer("%s%s", mydocs3270, fny); a = access(fnp, R_OK); if (a == 0) { *fullname = fnp; Free(fny); Free(fnx); return 1; } Free(fnp); } /* Public Documents\wc3270\foo.wc3270km? */ if (commondocs3270 != NULL) { fnp = xs_buffer("%s%s", commondocs3270, fny); a = access(fnp, R_OK); if (a == 0) { *fullname = fnp; Free(fny); Free(fnx); return 1; } Free(fnp); } /* InstDir\foo.wc3270km? */ fnp = xs_buffer("%s%s", instdir, fny); a = access(fnp, R_OK); if (a == 0) { Free(fny); Free(fnx); *fullname = fnp; return 1; } Free(fnp); /* foo.wc3270km? */ a = access(fny, R_OK); if (a == 0) { Free(fnx); *fullname = fny; return 1; } Free(fny); /* foo? */ a = access(fnx, R_OK); if (a == 0) { *fullname = fnx; return 1; } Free(fnx); /* No dice. */ return -1; } /* * Compare a pair of keymaps for compatablity (could k2 match k1). * N.B.: This functon may need to be further parameterized for equality versus * (ambiguous) matching. */ static int codecmp(struct keymap *k1, struct keymap *k2, int len) { int r; int i; /* Compare the raw codes first. */ r = memcmp(k1->codes, k2->codes, len * sizeof(int)); if (r) { return r; } /* The codes agree, now try the modifiers. */ for (i = 0; i < len; i++) { if ((k1->hints[i] & KM_HINTS) != (k2->hints[i] & KM_HINTS)) { return -1; } } /* Same same. */ return 0; } /* Add a keymap entry. */ static void add_keymap_entry(int ncodes, int *codes, int *hints, const char *name, const char *file, int line, bool temp, const char *action, struct keymap ***nextkp) { struct keymap *k; /* Allocate a new node. */ k = Malloc(sizeof(struct keymap)); k->next = NULL; k->successor = NULL; k->ncodes = ncodes; k->codes = Malloc(ncodes * sizeof(int)); (void) memcpy(k->codes, codes, ncodes * sizeof(int)); k->hints = Malloc(ncodes * sizeof(int)); (void) memcpy(k->hints, hints, ncodes * sizeof(int)); k->name = NewString(name); k->file = NewString(file); k->line = line; k->temp = temp; k->action = NewString(action); /* Link it in. */ **nextkp = k; *nextkp = &k->next; } /* * Read a keymap from a file. * Returns true for success, false for an error. * * Keymap files look suspiciously like x3270 keymaps, but aren't. */ static bool read_keymap(const char *name, bool temp) { char *name_3270 = xs_buffer("%s.3270", name); char *name_nvt = xs_buffer("%s.nvt", name); int rc, rc_3270, rc_nvt; char *fn, *fn_3270, *fn_nvt; char *r0, *r0_3270, *r0_nvt; if (master_keymap != NULL && !strcmp(name, master_keymap->name)) { popup_an_error("Duplicate keymap: %s", name); return false; } rc = locate_keymap(name, &fn, &r0); rc_3270 = locate_keymap(name_3270, &fn_3270, &r0_3270); rc_nvt = locate_keymap(name_nvt, &fn_nvt, &r0_nvt); if (rc < 0 && rc_3270 < 0 && rc_nvt < 0) { popup_an_error("No such keymap resource or file: %s", name); Free(name_3270); Free(name_nvt); return false; } if (rc >= 0) { read_one_keymap(name, fn, temp, r0, 0); Free(fn); Free(r0); } if (rc_3270 >= 0) { read_one_keymap(name_3270, fn_3270, temp, r0_3270, KM_3270_ONLY); Free(fn_3270); Free(r0_3270); } if (rc_nvt >= 0) { read_one_keymap(name_nvt, fn_nvt, temp, r0_nvt, KM_NVT_ONLY); Free(fn_nvt); Free(r0_nvt); } Free(name_3270); Free(name_nvt); return true; } /* * Read a keymap from a file. * Accumulates the keymap onto the list pointed to by nextkp. * Returns 0 for success, -1 for an error. * * Keymap files look suspiciously like x3270 keymaps, but aren't. */ static void read_one_keymap_internal(const char *name, const char *fn, bool temp, const char *r0, int flags, struct keymap ***nextkp) { char *r = NULL; /* resource value */ char *r_copy = NULL; /* initial value of r */ FILE *f = NULL; /* resource file */ char buf[1024]; /* file read buffer */ int line = 0; /* line number */ char *left, *right; /* chunks of line */ static int ncodes = 0; static int maxcodes = 0; static int *codes = NULL, *hints = NULL; int rc = 0; char *xfn = NULL; /* Find the resource or file. */ if (r0 != NULL) { r = r_copy = NewString(r0); xfn = (char *)fn; } else { size_t sl; f = fopen(fn, "r"); if (f == NULL) { popup_an_error("File '%s' exists but cannot open: %s", fn, strerror(errno)); return; } sl = strlen(fn); if (sl > SUFFIX_LEN && !strcmp(fn + sl - SUFFIX_LEN, "." WC3270KM_SUFFIX)) { xfn = NewString(fn); xfn[sl - SUFFIX_LEN] = '\0'; } else { xfn = (char *)fn; } } while ((r != NULL)? (rc = split_dresource(&r, &left, &right)): fgets(buf, sizeof(buf), f) != NULL) { char *s; int ccode; int pkr; int hint; line++; /* Skip empty lines and comments. */ if (r == NULL) { s = buf; while (ISREALLYSPACE(*s)) { s++; } if (!*s || *s == '!' || *s == '#') { continue; } } /* Split. */ if (rc < 0 || (r == NULL && split_dresource(&s, &left, &right) < 0)) { popup_an_error("Keymap %s, line %d: syntax error", name, line); goto done; } pkr = parse_keydef(&left, &ccode, &hint); if (pkr == 0) { popup_an_error("Keymap %s, line %d: Missing ", name, line); goto done; } if (pkr < 0) { popup_an_error("Keymap %s, line %d: %s", name, line, pk_errmsg[-1 - pkr]); goto done; } /* Accumulate keycodes. */ ncodes = 0; do { if (++ncodes > maxcodes) { maxcodes = ncodes; codes = Realloc(codes, maxcodes * sizeof(int)); hints = Realloc(hints, maxcodes * sizeof(int)); } codes[ncodes - 1] = ccode; hints[ncodes - 1] = hint; pkr = parse_keydef(&left, &ccode, &hint); if (pkr < 0) { popup_an_error("Keymap %s, line %d: %s", name, line, pk_errmsg[-1 - pkr]); goto done; } } while (pkr != 0); /* Add it to the list. */ hints[0] |= flags; add_keymap_entry(ncodes, codes, hints, name, name, line, temp, right, nextkp); } done: Free(r_copy); if (f != NULL) { fclose(f); } if (xfn != fn) { Free(xfn); } } /* * Read a keymap from a file. * Adds the keymap to the front of the 'master_keymap' list. * Returns 0 for success, -1 for an error. */ static void read_one_keymap(const char *name, const char *fn, bool temp, const char *r0, int flags) { struct keymap *one_master; struct keymap **one_nextk; /* Read in the keymap. */ one_master = NULL; one_nextk = &one_master; read_one_keymap_internal(name, fn, temp, r0, flags, &one_nextk); if (one_master == NULL) { /* Nothing added. */ return; } if (master_keymap == NULL) { /* Something added, nothing there before. */ master_keymap = one_master; return; } /* Insert this keymap ahead of the previous ones. */ *one_nextk = master_keymap; master_keymap = one_master; } /* Multi-key keymap support. */ static struct keymap *current_match = NULL; static int consumed = 0; static char *ignore = "[ignore]"; /* Find the shortest keymap with a longer match than k. */ static struct keymap * longer_match(struct keymap *k, int nc) { struct keymap *j; struct keymap *shortest = NULL; for (j = master_keymap; j != NULL; j = j->next) { if (IS_INACTIVE(j)) { continue; } if (j != k && j->ncodes > nc && !codecmp(j, k, nc)) { if (j->ncodes == nc+1) { return j; } if (shortest == NULL || j->ncodes < shortest->ncodes) { shortest = j; } } } return shortest; } /* * Helper function that returns a keymap action, sets the status line, and * traces the result. * * If s is NULL, then this is a failed initial lookup. * If s is 'ignore', then this is a lookup in progress (k non-NULL) or a * failed multi-key lookup (k NULL). * Otherwise, this is a successful lookup. */ static char * status_ret(char *s, struct keymap *k) { /* Set the compose indicator based on the new value of current_match. */ if (k != NULL) { status_compose(true, ' ', KT_STD); } else { status_compose(false, 0, KT_STD); } if (s != NULL && s != ignore) { vtrace(" %s:%d -> %s\n", current_match->file, current_match->line, s); } if ((current_match = k) == NULL) { consumed = 0; } return s; } /* Timeout for ambiguous keymaps. */ static struct keymap *timeout_match = NULL; static ioid_t kto = NULL_IOID; static void key_timeout(ioid_t id _is_unused) { vtrace("Timeout, using shortest keymap match\n"); kto = NULL_IOID; current_match = timeout_match; push_keymap_action(status_ret(timeout_match->action, NULL)); timeout_match = NULL; } static struct keymap * ambiguous(struct keymap *k, int nc) { struct keymap *j; if ((j = longer_match(k, nc)) != NULL) { vtrace(" ambiguous keymap match, shortest is %s:%d, setting timeout\n", j->file, j->line); timeout_match = k; kto = AddTimeOut(500L, key_timeout); } return j; } /* * Check for compatability between a keymap and a key's modifier state. * Returns 1 for success, 0 for failure. */ static int compatible_hint(int hint, int state) { int h = hint & KM_HINTS; int s = state & KM_HINTS; if (!h) { return 1; } /* * This used to be fairly straightforward, but it got murky when * we split the left and right ctrl and alt keys. * * Basically, what we want is if both left and right Alt or Ctrl * are set in 'hint', then either left or right Alt or Ctrl set in * 'state' would be a match. If only left or right is set in 'hint', * then the match in 'state' has to be exact. * * We do this by checking for both being set in 'hint' and either * being set in 'state'. If this is the case, we set both in 'state' * and try for an exact match. */ if ((h & KM_CTRL) == KM_CTRL) { if (s & KM_CTRL) { s |= KM_CTRL; } } if ((h & KM_ALT) == KM_ALT) { if (s & KM_ALT) { s |= KM_ALT; } } return (h & s) == h; } /* * Look up an key in the keymap, return the matching action if there is one. * * This code implements the mutli-key lookup, by returning dummy actions for * partial matches. */ char * lookup_key(unsigned long code, unsigned long state) { struct keymap *j, *k; int n_shortest = 0; int state_match = 0; vtrace("lookup_key(0x%08lx, 0x%lx)\n", code, state); /* If there's a timeout pending, cancel it. */ if (kto != NULL_IOID) { RemoveTimeOut(kto); kto = NULL_IOID; timeout_match = NULL; } /* Translate the Windows state to KM flags. */ if (state & SHIFT_PRESSED) { state_match |= KM_SHIFT; } if (state & LEFT_ALT_PRESSED) { state_match |= KM_LALT; } if (state & RIGHT_ALT_PRESSED) { state_match |= KM_RALT; } if (state & LEFT_CTRL_PRESSED) { state_match |= KM_LCTRL; } if (state & RIGHT_CTRL_PRESSED) { state_match |= KM_RCTRL; } if (state & ENHANCED_KEY) { state_match |= KM_ENHANCED; } /* If there's no match pending, find the shortest one. */ if (current_match == NULL) { struct keymap *shortest = NULL; for (k = master_keymap; k != NULL; k = k->next) { if (IS_INACTIVE(k)) { continue; } if (code == k->codes[0] && compatible_hint(k->hints[0], state_match)) { if (k->ncodes == 1) { shortest = k; break; } if (shortest == NULL || k->ncodes < shortest->ncodes) { shortest = k; n_shortest++; } } } if (shortest != NULL) { current_match = shortest; consumed = 0; } else { return NULL; } } /* See if this character matches the next one we want. */ if (code == current_match->codes[consumed] && compatible_hint(current_match->hints[consumed], state_match)) { consumed++; if (consumed == current_match->ncodes) { /* Final match. */ j = ambiguous(current_match, consumed); if (j == NULL) { return status_ret(current_match->action, NULL); } else { return status_ret(ignore, j); } } else { /* Keep looking. */ vtrace(" partial keymap match in %s:%d %s\n", current_match->file, current_match->line, (n_shortest > 1)? " and other(s)": ""); return status_ret(ignore, current_match); } } /* It doesn't. Try for a better candidate. */ for (k = master_keymap; k != NULL; k = k->next) { if (IS_INACTIVE(k)) continue; if (k == current_match) continue; if (k->ncodes > consumed && !codecmp(k, current_match, consumed) && k->codes[consumed] == code && compatible_hint(k->hints[consumed], state_match)) { consumed++; if (k->ncodes == consumed) { j = ambiguous(k, consumed); if (j == NULL) { current_match = k; return status_ret(k->action, NULL); } else { return status_ret(ignore, j); } } else { return status_ret(ignore, k); } } } /* Complain. */ Beep(750, 150); vtrace(" keymap lookup failure after partial match\n"); return status_ret(ignore, NULL); } static struct { const char *name; unsigned long code; } vk_key[] = { { "SHIFT", VK_SHIFT << 16 }, { "CTRL", VK_CONTROL << 16 }, { "ALT", 0x12 << 16 }, { "CAPSLOCK", 0x14 << 16 }, { "BACK", VK_BACK << 16 }, { "RETURN", VK_RETURN << 16 }, { "TAB", VK_TAB << 16 }, { "ESCAPE", VK_ESCAPE << 16 }, { "CLEAR", VK_CLEAR << 16 }, { "PAUSE", VK_PAUSE << 16 }, { "PRIOR", VK_PRIOR << 16 }, { "NEXT", VK_NEXT << 16 }, { "END", VK_END << 16 }, { "HOME", VK_HOME << 16 }, { "LEFT", VK_LEFT << 16 }, { "UP", VK_UP << 16 }, { "RIGHT", VK_RIGHT << 16 }, { "DOWN", VK_DOWN << 16 }, { "SELECT", VK_SELECT << 16 }, { "PRINT", VK_PRINT << 16 }, { "EXECUTE", VK_EXECUTE << 16 }, { "SNAPSHOT", VK_SNAPSHOT << 16 }, { "INSERT", VK_INSERT << 16 }, { "DELETE", VK_DELETE << 16 }, { "HELP", VK_HELP << 16 }, { "LWIN", VK_LWIN << 16 }, { "RWIN", VK_RWIN << 16 }, { "APPS", VK_APPS << 16 }, { "SLEEP", VK_SLEEP << 16 }, { "NUMPAD0", VK_NUMPAD0 << 16 }, { "NUMPAD1", VK_NUMPAD1 << 16 }, { "NUMPAD2", VK_NUMPAD2 << 16 }, { "NUMPAD3", VK_NUMPAD3 << 16 }, { "NUMPAD4", VK_NUMPAD4 << 16 }, { "NUMPAD5", VK_NUMPAD5 << 16 }, { "NUMPAD6", VK_NUMPAD6 << 16 }, { "NUMPAD7", VK_NUMPAD7 << 16 }, { "NUMPAD8", VK_NUMPAD8 << 16 }, { "NUMPAD9", VK_NUMPAD9 << 16 }, { "MULTIPLY", VK_MULTIPLY << 16 }, { "ADD", VK_ADD << 16 }, { "SEPARATOR", VK_SEPARATOR << 16 }, { "SUBTRACT", VK_SUBTRACT << 16 }, { "DECIMAL", VK_DECIMAL << 16 }, { "DIVIDE", VK_DIVIDE << 16 }, { "F1", VK_F1 << 16 }, { "F2", VK_F2 << 16 }, { "F3", VK_F3 << 16 }, { "F4", VK_F4 << 16 }, { "F5", VK_F5 << 16 }, { "F6", VK_F6 << 16 }, { "F7", VK_F7 << 16 }, { "F8", VK_F8 << 16 }, { "F9", VK_F9 << 16 }, { "F10", VK_F10 << 16 }, { "F11", VK_F11 << 16 }, { "F12", VK_F12 << 16 }, { "F13", VK_F13 << 16 }, { "F14", VK_F14 << 16 }, { "F15", VK_F15 << 16 }, { "F16", VK_F16 << 16 }, { "F17", VK_F17 << 16 }, { "F18", VK_F18 << 16 }, { "F19", VK_F19 << 16 }, { "F20", VK_F20 << 16 }, { "F21", VK_F21 << 16 }, { "F22", VK_F22 << 16 }, { "F23", VK_F23 << 16 }, { "F24", VK_F24 << 16 }, { "NUMLOCK", VK_NUMLOCK << 16 }, { "SCROLL", VK_SCROLL << 16 }, { "LMENU", VK_LMENU << 16 }, { "RMENU", VK_RMENU << 16 }, /* Some handy aliases */ { "BackSpace", VK_BACK << 16 }, { "Enter", VK_RETURN << 16 }, { "PageUp", VK_PRIOR << 16 }, { "PageDown", VK_NEXT << 16 }, { "Esc", VK_ESCAPE << 16 }, { NULL, 0 } }; /* Look up a symbolic vkey name and return its code. */ static int lookup_ccode(const char *s) { int i; /* Look it up in the table. */ for (i = 0; vk_key[i].name != NULL; i++) { if (!strcasecmp(s, vk_key[i].name)) { return vk_key[i].code; } } /* Check for a numeric encoding: VKEY-nnn or VKEY-0xnnn. */ if (!strncasecmp(s, "VKEY-", 5)) { const char *t; int base; unsigned long u; char *ptr; if (!strncasecmp(s + 5, "0x", 2)) { t = s + 7; base = 16; } else { t = s + 5; base = 10; } u = strtoul(t, &ptr, base); if (ptr != t && *ptr == '\0' && u > 0 && u <= 0xfe) { return (int)(u << 16); } } return -1; } /* Look up a vkey code and return its name. */ const char * lookup_cname(unsigned long ccode) { int i; for (i = 0; vk_key[i].name != NULL; i++) { if (ccode == vk_key[i].code) { return vk_key[i].name; } } if (ccode >= (' ' << 16) && ccode <= ('~' << 16)) { static char cbuf[2]; cbuf[0] = (char)(ccode >> 16); cbuf[1] = '\0'; return cbuf; } if (ccode >= (1 << 16) && ccode <= (0xfe << 16)) { return lazyaf("VKEY-0x%02x", ccode >> 16); } return NULL; } /** * Free a temporary keymap entry. */ static void free_keymap(struct keymap *k) { Free(k->codes); Free(k->hints); Free(k->name); Free(k->file); Free(k->action); Free(k); } /** * Push or pop a temporary keymap. */ static bool Keymap_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Keymap", ia, argc, argv); if (check_argc("Keymap", argc, 0, 1) < 0) { return false; } if (argc > 0) { /* Push this keymap. */ if (!read_keymap(argv[0], true)) { return false; } /* Set the inactive flags. */ set_inactive(); } else { struct keymap *k; char *km_name = NULL; if (master_keymap == NULL || !master_keymap->temp) { return true; } km_name = NewString(master_keymap->name); /* Pop the top keymap. */ while ((k = master_keymap) != NULL) { if (!k->temp || strcmp(k->name, km_name)) { break; } master_keymap = k->next; free_keymap(k); } Free(km_name); /* Set the inactive flags. */ set_inactive(); } return true; } /** * Keymap module registration. */ void keymap_register(void) { static action_table_t keymap_actions[] = { { "Keymap", Keymap_action, ACTION_KE }, { "TemporaryKeymap", Keymap_action, ACTION_KE } }; /* Register for state changes. */ register_schange(ST_3270_MODE, keymap_3270_mode); register_schange(ST_CONNECT, keymap_3270_mode); /* Register the actions. */ register_actions(keymap_actions, array_count(keymap_actions)); } /* Read each of the keymaps specified by the keymap resource. */ void keymap_init(void) { char *s0, *s; char *comma; /* In case this is a subsequent call, wipe out the current keymap. */ clear_keymap(); /* Read the base keymap. */ (void) read_keymap("base", false); /* Read the user-defined keymaps. */ if (appres.interactive.key_map != NULL) { s = s0 = NewString(appres.interactive.key_map); while ((comma = strchr(s, ',')) != NULL) { *comma = '\0'; if (*s) { (void) read_keymap(s, false); } s = comma + 1; } if (*s) { (void) read_keymap(s, false); } Free(s0); } last_3270 = IN_3270; last_nvt = IN_NVT; set_inactive(); } /* Erase the current keymap. */ static void clear_keymap(void) { struct keymap *k, *next; for (k = master_keymap; k != NULL; k = next) { next = k->next; free_keymap(k); } master_keymap = NULL; } /* Set the inactive flags for the current keymap. */ static void set_inactive(void) { struct keymap *k, *j; /* Clear the inactive flags and successors. */ for (k = master_keymap; k != NULL; k = k->next) { k->hints[0] &= ~KM_INACTIVE; k->successor = NULL; } /* Turn off elements which have the wrong mode. */ for (k = master_keymap; k != NULL; k = k->next) { /* If the mode is wrong, turn it off. */ if ((!last_3270 && (k->hints[0] & KM_3270_ONLY)) || (!last_nvt && (k->hints[0] & KM_NVT_ONLY))) { k->hints[0] |= KM_INACTIVE; } } /* Compute superceded entries. */ for (k = master_keymap; k != NULL; k = k->next) { if (k->hints[0] & KM_INACTIVE) { continue; } for (j = k->next; j != NULL; j = j->next) { if (j->hints[0] & KM_INACTIVE) { continue; } /* It may supercede other entries. */ if (j->ncodes == k->ncodes && !codecmp(j, k, k->ncodes)) { j->hints[0] |= KM_INACTIVE; j->successor = k; } } } } /* 3270/NVT mode change. */ static void keymap_3270_mode(bool ignored _is_unused) { if (last_3270 != IN_3270 || last_nvt != IN_NVT) { last_3270 = IN_3270; last_nvt = IN_NVT; set_inactive(); } } /* Decode hints (modifiers). */ static const char * decode_hint(int hint) { static char buf[128]; char *s = buf; *s = '\0'; if (hint & KM_SHIFT) { s += sprintf(s, "Shift "); } if ((hint & KM_CTRL) == KM_CTRL) { s += sprintf(s, "Ctrl "); } else if (hint & KM_LCTRL) { s += sprintf(s, "LeftCtrl"); } else if (hint & KM_RCTRL) { s += sprintf(s, "RightCtrl"); } if ((hint & KM_ALT) == KM_ALT) { s += sprintf(s, "Alt "); } else if (hint & KM_LALT) { s += sprintf(s, "LeftAlt"); } else if (hint & KM_RALT) { s += sprintf(s, "RightAlt"); } else if (hint & KM_ENHANCED) { s += sprintf(s, "Enhanced"); } return buf; } /* * Decode a key. * Accepts a hint as to which form was used to specify it, if it came from a * keymap definition. */ const char * decode_key(int k, int hint, char *buf) { char *s = buf; if (k & 0xffff0000) { const char *n; /* VK_xxx */ n = lookup_cname(k); (void) sprintf(buf, "%s%s", decode_hint(hint), n? n: "???"); } else if (k < ' ') { (void) sprintf(s, "%sCtrl %c", decode_hint(hint & ~KM_CTRL), k + '@'); } else if (k == ':') { (void) sprintf(s, "%scolon", decode_hint(hint)); } else if (k == ' ') { (void) sprintf(s, "%sspace", decode_hint(hint)); } else { wchar_t w = k; char c; BOOL udc = FALSE; /* Try translating to OEM for display on the console. */ (void)WideCharToMultiByte(CP_OEMCP, 0, &w, 1, &c, 1, "?", &udc); if (!udc) { (void) sprintf(s, "%s%c", decode_hint(hint), c); } else { (void) sprintf(s, "%sU+%04x", decode_hint(hint), k); } } return buf; } /* Dump the current keymap. */ void keymap_dump(void) { struct keymap *k; for (k = master_keymap; k != NULL; k = k->next) { if (k->successor != NULL) { action_output("[%s:%d%s] -- superceded by %s:%d --", k->file, k->line, k->temp? " temp": "", k->successor->file, k->successor->line); } else if (!IS_INACTIVE(k)) { int i; char buf[1024]; char *s = buf; char dbuf[128]; char *t = safe_string(k->action); for (i = 0; i < k->ncodes; i++) { s += sprintf(s, " %s", decode_key(k->codes[i], (k->hints[i] & KM_HINTS) | KM_KEYMAP, dbuf)); } action_output("[%s:%d%s]%s: %s", k->file, k->line, k->temp? " temp": "", buf, t); Free(t); } } } suite3270-3.6/wc3270/keymap.h0000775000076500007650000000375613221577163013576 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* wc3270 version of keymap.h */ #define KM_SHIFT 0x0001 #define KM_LCTRL 0x0002 #define KM_RCTRL 0x0004 #define KM_CTRL (KM_LCTRL | KM_RCTRL) #define KM_LALT 0x0008 #define KM_RALT 0x0010 #define KM_ALT (KM_LALT | KM_RALT) #define KM_ENHANCED 0x0020 void keymap_init(void); char *lookup_key(unsigned long xk, unsigned long state); void keymap_dump(void); const char *decode_key(int k, int hint, char *buf); const char *lookup_cname(unsigned long ccode); void keymap_register(void); suite3270-3.6/wc3270/keymaps.inc0000664000076500007650000002777013221577163014302 0ustar pdmpdmXX_SH(Keymaps) The XX_FB(XX_DASHED(keymap)) option or the XX_FB(XX_PRODUCT`'.keymap) resource allow a custom keymap to be specified. If the option XX_FB(XX_DASHED(keymap)) XX_FI(xxx) is given (or the XX_FB(XX_PRODUCT`'.keymap) resource has the value XX_FI(xxx)), XX_FB(XX_PRODUCT) will look for a resource named XX_FB(XX_PRODUCT.keymap.)`'XX_FI(xxx). If no resource definition is found, it will look for a file named ifelse(XX_PRODUCT,c3270,`XX_FI(xxx)',XX_PRODUCT,wc3270,`XX_FI(xxx)XX_FB(.wc3270km)'). XX_LP Multiple keymaps may be specified be separating their names with commas. Definitions in later keymaps supercede those in earlier keymaps. XX_LP In addition, separate keymaps may be defined that apply only in 3270 mode or XX_SM(NVT) mode. For example, the resource definition XX_FB(XX_PRODUCT.keymap.)`'XX_FI(xxx)`'XX_FB(.nvt) or the file ifelse(XX_PRODUCT,c3270,`'XX_FI(xxx)`'XX_FB(.nvt), XX_PRODUCT,wc3270,`XX_FI(xxx)XX_FB(.nvt.wc3270km)') will augment the definition of keymap XX_FI(xxx) in XX_SM(NVT) mode. Similarly, the resource definition XX_FB(XX_PRODUCT.keymap.)`'XX_FI(xxx)`'XX_FB(.3270) or the file ifelse(XX_PRODUCT,c3270,`'XX_FI(xxx)`'XX_FB(.3270), XX_PRODUCT,wc3270,`XX_FI(xxx)XX_FB(.3270.wc3270km)') will augment the definition of keymap XX_FI(xxx) in 3270 mode. XX_LP Temporary keymaps can also be added or removed while XX_PRODUCT is running with the XX_FB(Keymap) action. See XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) for details. XX_LP Each line (rule) in a keymap specifies actions to perform when a particular key or sequence of keys is pressed. Keymap rules have the following syntax: XX_LP ifelse(XX_PRODUCT,c3270, `XX_RS(`[XX_FB(Meta)][XX_FB(Ctrl)]XX_FB(XX_KEY())`'XX_FI(key)...: XX_FI(action)[(XX_FI(param)[,...])] ...') ', `XX_RS(`[XX_FI(modifier)...]XX_FB(XX_KEY())`'XX_FI(key)...: XX_FI(action)[(XX_FI(param)[,...])] ...') ')dnl XX_LP Here is a sample keymap definition from a file: XX_LP XX_RS(`! Lines beginning with ! are ignored and can XX_BR() ! occur anywhere. XX_BR() ifelse(XX_PRODUCT,wc3270,`! The line below will be displayed XX_BR() ! by the New Session Wizard. XX_BR !description: An example. XX_BR ')dnl ! Definition of keymap xxx XX_BR() ! XX_NBSP()When Alt-c is pressed, clear the screen. XX_BR() XX_KEY(Alt,c): Clear() XX_BR() ! XX_NBSP()When PageUp is pressed, send PF7 to the host. XX_BR() ifelse(XX_PRODUCT,c3270,`XX_KEY(,PPAGE): PF(7)', `XX_KEY(,PRIOR): PF(7)') XX_BR() ! XX_NBSP()When Ctrl-a is pressed, then F1, send PF13 XX_BR() ! XX_NBSP()to the host. XX_BR() XX_KEY(Ctrl,a) XX_KEY(,F1): PF(13)') XX_LP Here is the same definition as a resource: XX_LP XX_RS(`! Lines beginning with ! are ignored, but NOT XX_BR() ! within a definition. XX_BR() ! Note that the XX_BACKSLASH() is required at the end of the XX_BR() ! first line, and XX_BACKSLASH(n)`'XX_BACKSLASH() is XX_BR() ! required at the end of every other line except XX_BR() ! the last. XX_BR() ! Definition of keymap xxx XX_BR() XX_PRODUCT.keymap.xxx: XX_BACKSLASH() XX_BR() XX_NBSP()XX_KEY(Alt,c): Clear() XX_BACKSLASH(n)`'XX_BACKSLASH() XX_BR() XX_NBSP()ifelse(XX_PRODUCT,c3270,`XX_KEY(,PPAGE): PF(7) XX_BACKSLASH(n)`'XX_BACKSLASH()', `XX_KEY(,PRIOR): PF(7) \n\') XX_BR() XX_NBSP()XX_KEY(Ctrl,A) XX_KEY(,F1): PF(13)') XX_LP The optional ifelse(XX_PRODUCT,wc3270,`XX_FB(Shift), ')dnl XX_FB(Alt) or XX_FB(Ctrl) modifiers specify that the ifelse(XX_PRODUCT,wc3270,`XX_FB(Shift), ')dnl XX_FB(Alt) and XX_FB(Ctrl) keys are pressed along with the specified XX_FI(key), respectively. ifelse(XX_PRODUCT,wc3270, `The XX_FB(LeftCtrl), XX_FB(RightCtrl), XX_FB(LeftAlt), and XX_FB(RightAlt) modifiers specifify a particular XX_FB(Ctrl) or XX_FB(Alt) key. ')dnl ifelse(XX_PRODUCT,wc3270,`The XX_FB(Enhanced) modifier is also available; XX_FB(Enhanced XX_LT()Key>ENTER) is the keypad XX_FB(Enter) key. ')dnl XX_FI(Key) is either an XX_SM(ISO) 8859-1 symbol name, such as XX_FB(equal) for XX_DQUOTED(=) and XX_FB(a) for XX_DQUOTED(a), or a symbolic ifelse(XX_PRODUCT,c3270,`XX_FB(ncurses)',XX_PRODUCT,wc3270,`Windows') key name, such as XX_FB(UP). More than one XX_FI(key) can be specified, indicating that a sequence of keys must be pressed in order for the rule to be matched. The XX_FI(action) is an action from the XX_LINK(#Actions,XX_SM(ACTIONS)) list above. More than one XX_FI(action) may be specified; they will be executed in order. XX_LP Keymap entries are case-sensitive and modifier-specific. This means that a keymap for the XX_FB(b) key will match only a lowercase XX_FB(b). Actions for uppercase XX_FB(B), or for XX_FB(Alt-B), must be specified separately. ifelse(XX_PRODUCT,wc3270, `XX_LP Available symbolic key names are: XX_FB(ADD), XX_FB(ALT), XX_FB(APPS), XX_FB(BACK) (BackSpace), XX_FB(BackSpace) (alias for BACK), XX_FB(CLEAR), XX_FB(CTRL), XX_FB(DECIMAL), XX_FB(DELETE), XX_FB(DIVIDE), XX_FB(DOWN), XX_FB(END), XX_FB(Enter) (alias for RETURN), XX_FB(ESCAPE), XX_FB(Esc) (alias for ESCAPE), XX_FB(EXECUTE), XX_FB(F1), XX_FB(F2), XX_FB(F3), XX_FB(F4), XX_FB(F5), XX_FB(F6), XX_FB(F7), XX_FB(F8), XX_FB(F9), XX_FB(F10), XX_FB(F11), XX_FB(F12), XX_FB(F13), XX_FB(F14), XX_FB(F15), XX_FB(F16), XX_FB(F17), XX_FB(F18), XX_FB(F19), XX_FB(F20), XX_FB(F21), XX_FB(F22), XX_FB(F23), XX_FB(F24), XX_FB(HELP), XX_FB(HOME), XX_FB(INSERT), XX_FB(LEFT), XX_FB(LMENU), XX_FB(LWIN) (Left Windows key), XX_FB(MULTIPLY), XX_FB(NEXT) (Page Down), XX_FB(NUMLOCK), XX_FB(NUMPAD0), XX_FB(NUMPAD1), XX_FB(NUMPAD2), XX_FB(NUMPAD3), XX_FB(NUMPAD4), XX_FB(NUMPAD5), XX_FB(NUMPAD6), XX_FB(NUMPAD7), XX_FB(NUMPAD8), XX_FB(NUMPAD9), XX_FB(PageUp) (alias for PRIOR), XX_FB(PageDown) (alias for Next), XX_FB(PAUSE), XX_FB(PRINT), XX_FB(PRIOR) (Page Up), XX_FB(RETURN) (Enter), XX_FB(RIGHT), XX_FB(RMENU), XX_FB(RWIN) (Right Windows key), XX_FB(SCROLL), XX_FB(SELECT), XX_FB(SEPARATOR), XX_FB(SHIFT), XX_FB(SLEEP), XX_FB(SNAPSHOT), XX_FB(SUBTRACT), XX_FB(TAB) and XX_FB(UP). In addition, any Windows VKey code can be specified in hexadecimal with the syntax XX_FB(VKEY-0x)XX_FI(nn). ')dnl XX_LP The base keymap is: XX_LP XX_TS(2,l l.) XX_TR(XX_TD(Key) XX_TD(Action)) XX_T_() ifelse(XX_PRODUCT,c3270, `XX_TR(XX_TD(XX_KEY(Ctrl,`]')) XX_TD(Escape)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(Ctrl,a)) XX_TD(`Key(0x01)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(Ctrl,`]')) XX_TD(`Key(0x1d)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,Tab)) XX_TD(BackTab)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,c)) XX_TD(Clear)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,e)) XX_TD(Escape)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,k)) XX_TD(Keypad)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,m)) XX_TD(Compose)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,n)) XX_TD(Menu)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,p)) XX_TD(PrintText)) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,^)) XX_TD(Key(notsign))) XX_TR(XX_TD(XX_KEY(Ctrl,k)) XX_TD(Keypad)) XX_TR(XX_TD(XX_KEY(Ctrl,n)) XX_TD(Menu)) XX_TR(XX_TD(XX_KEY(,UP)) XX_TD(Up)) XX_TR(XX_TD(XX_KEY(,DOWN)) XX_TD(Down)) XX_TR(XX_TD(XX_KEY(,LEFT)) XX_TD(Left)) XX_TR(XX_TD(XX_KEY(,RIGHT)) XX_TD(Right)) XX_TR(XX_TD(XX_KEY(,`F(XX_FI(n))')) XX_TD(`PF(XX_FI(n))')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,`F(XX_FI(n))')) XX_TD(`PF(XX_FI(n)+12)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,1)) XX_TD(`PA(1)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,2)) XX_TD(`PA(2)')) XX_TR(XX_TD(XX_KEY(Ctrl,a) XX_KEY(,3)) XX_TD(`PA(3)')) XX_TR(XX_TD(XX_KEY(,PPAGE)) XX_TD(`Scroll(Backward)')) XX_TR(XX_TD(XX_KEY(,NPAGE)) XX_TD(`Scroll(Forward)'))', XX_PRODUCT,wc3270, `XX_TR(XX_TD(XX_KEY(Alt,1)) XX_TD(`PA(1)')) XX_TR(XX_TD(XX_KEY(Alt,2)) XX_TD(`PA(2)')) XX_TR(XX_TD(XX_KEY(Alt,3)) XX_TD(`PA(3)')) XX_TR(XX_TD(XX_KEY(Alt Ctrl,`]')) XX_TD(`Key(0x1d)')) XX_TR(XX_TD(XX_KEY(Ctrl,`]')) XX_TD(Escape)) XX_TR(XX_TD(XX_KEY(Alt,^)) XX_TD(Key(notsign))) XX_TR(XX_TD(XX_KEY(Ctrl,c)) XX_TD(Copy)) XX_TR(XX_TD(XX_KEY(Alt,k)) XX_TD(Keymap)) XX_TR(XX_TD(XX_KEY(Alt,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Alt,m)) XX_TD(Compose)) XX_TR(XX_TD(XX_KEY(Alt,n)) XX_TD(Menu)) XX_TR(XX_TD(XX_KEY(Ctrl,p)) XX_TD(Paste)) XX_TR(XX_TD(XX_KEY(Alt,p)) XX_TD(PrintText)) XX_TR(XX_TD(XX_KEY(Ctrl,x)) XX_TD(Cut)) XX_TR(XX_TD(XX_KEY(,PRIOR)) XX_TD(`Scroll(Backward)')) XX_TR(XX_TD(XX_KEY(,NEXT)) XX_TD(`Scroll(Forward)')) XX_TR(XX_TD(XX_KEY(Shift,`F`'XX_FI(n)')) XX_TD(`PF(XX_FI(n)+12)'))') XX_TE() XX_LP The base 3270-mode keymap adds: XX_LP XX_TS(2,l l.) XX_TR(XX_TD(Key) XX_TD(Action)) XX_T_() ifelse(XX_PRODUCT,c3270, `XX_TR(XX_TD(XX_KEY(Ctrl,c)) XX_TD(Clear)) XX_TR(XX_TD(XX_KEY(Ctrl,d)) XX_TD(Dup)) XX_TR(XX_TD(XX_KEY(Ctrl,f)) XX_TD(FieldMark)) XX_TR(XX_TD(XX_KEY(Ctrl,i)) XX_TD(Tab)) XX_TR(XX_TD(XX_KEY(Ctrl,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Ctrl,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Ctrl,u)) XX_TD(DeleteField)) XX_TR(XX_TD(XX_KEY(,BackSpace)) XX_TD(BackSpace)) XX_TR(XX_TD(XX_KEY(,Return)) XX_TD(Enter)) XX_TR(XX_TD(XX_KEY(,Tab)) XX_TD(Tab)) XX_TR(XX_TD(XX_KEY(,Linefeed)) XX_TD(Newline)) XX_TR(XX_TD(XX_KEY(,BACKSPACE)) XX_TD(BackSpace)) XX_TR(XX_TD(XX_KEY(,DC)) XX_TD(Delete)) XX_TR(XX_TD(XX_KEY(,HOME)) XX_TD(Home)) XX_TR(XX_TD(XX_KEY(,IC)) XX_TD(ToggleInsert))', XX_PRODUCT,wc3270, `XX_TR(XX_TD(XX_KEY(Ctrl,a)) XX_TD(Attn)) XX_TR(XX_TD(XX_KEY(Alt,a)) XX_TD(Attn)) XX_TR(XX_TD(XX_KEY(Alt,c)) XX_TD(Clear)) XX_TR(XX_TD(XX_KEY(Ctrl,d)) XX_TD(Dup)) XX_TR(XX_TD(XX_KEY(Alt,d)) XX_TD(Dup)) XX_TR(XX_TD(XX_KEY(Ctrl,f)) XX_TD(FieldMark)) XX_TR(XX_TD(XX_KEY(Alt,f)) XX_TD(FieldMark)) XX_TR(XX_TD(XX_KEY(Ctrl,h)) XX_TD(Erase)) XX_TR(XX_TD(XX_KEY(Alt,i)) XX_TD(Insert)) XX_TR(XX_TD(XX_KEY(Shift Ctrl,i)) XX_TD(BackTab)) XX_TR(XX_TD(XX_KEY(Ctrl,i)) XX_TD(Tab)) XX_TR(XX_TD(XX_KEY(Ctrl,j)) XX_TD(Newline)) XX_TR(XX_TD(XX_KEY(Ctrl,l)) XX_TD(Redraw)) XX_TR(XX_TD(XX_KEY(Ctrl,m)) XX_TD(Enter)) XX_TR(XX_TD(XX_KEY(Ctrl,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Alt,r)) XX_TD(Reset)) XX_TR(XX_TD(XX_KEY(Ctrl,u)) XX_TD(DeleteField)) XX_TR(XX_TD(XX_KEY(,INSERT)) XX_TD(ToggleInsert)) XX_TR(XX_TD(XX_KEY(Shift,TAB)) XX_TD(BackTab)) XX_TR(XX_TD(XX_KEY(,BACK)) XX_TD(Erase)) XX_TR(XX_TD(XX_KEY(Shift,END)) XX_TD(EraseEOF)) XX_TR(XX_TD(XX_KEY(,END)) XX_TD(FieldEnd)) XX_TR(XX_TD(XX_KEY(Ctrl,LEFT)) XX_TD(PreviousWord)) XX_TR(XX_TD(XX_KEY(Ctrl,RIGHT)) XX_TD(NextWord)) XX_TR(XX_TD(XX_KEY(Shift,LEFT)) XX_TD(SelectLeft)) XX_TR(XX_TD(XX_KEY(Shift,RIGHT)) XX_TD(SelectRight)) XX_TR(XX_TD(XX_KEY(Shift,UP)) XX_TD(SelectUp)) XX_TR(XX_TD(XX_KEY(Shift,DOWN)) XX_TD(SelectDown)) XX_TR(XX_TD(XX_KEY(,PRIOR)) XX_TD(`PF(7)')) XX_TR(XX_TD(XX_KEY(,NEXT)) XX_TD(`PF(8)'))') XX_TE() ifelse(XX_PRODUCT,c3270, `XX_SH(The Meta or Alt Key) Some keyboards do not have a XX_FB(Meta) key. Instead, they have an XX_FB(Alt) key. Sometimes this key acts as a proper XX_FB(Meta) key, that is, it is a modifier key that sets the high-order bit (0x80) in the code that is transmitted for each key. Other keyboards send a two-character sequence when the XX_FB(Alt) key is pressed with another key: the Escape character (0x1b), followed by the code for the other key. XX_LP The resource XX_FB(XX_PRODUCT.metaEscape) and the termcap XX_FB(km) attribute control how XX_FB(XX_PRODUCT) will interpret these sequences. When XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(true), or when XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(auto) and the termcap XX_FB(km) attribute is set, the keyboard is assumed to have a separate XX_FB(Meta) key. The Escape key can be used as an ordinary data key and has no special meaning. XX_LP When XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(true), or when XX_FB(XX_PRODUCT.metaEscape) is set to XX_FB(auto) and the termcap XX_FB(km) attribute is not set, the keyboard is assumed to use the Escape character as a prefix to indicate that the following character is supposed to have the high-order bit set. When XX_FB(XX_PRODUCT) sees an Escape character from the keyboard, it sets a short timeout. If another character arrives before the timeout expires, then XX_FB(XX_PRODUCT) will combine the two characters, setting the high-order bit of the second. In an event trace file, the combined character is listed as XX_FI(derived). In a keymap, only the combined character or the XX_FB(Meta) prefix may be used. The Escape key can still be used by itself, but only if there is a short pause before pressing another key. XX_LP The default value for XX_FB(XX_PRODUCT.metaEscape) is XX_FB(auto).')dnl suite3270-3.6/wc3270/LICENSE.txt0000664000076500007650000000346513221600613013737 0ustar pdmpdmCopyright (c) 1993-2017, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/wc3270/LICENSE.txt.tmpl0000664000076500007650000000347013221577163014723 0ustar pdmpdmCopyright (c) 1993-%CYEAR%, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/wc3270/m4man0000775000076500007650000000342013221577163013062 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/wc3270/Makefile0000775000076500007650000000423113221577163013564 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for wc3270, can build either 32- or 64-bit ifdef WIN64 objdir = ../obj/win64/wc3270 else objdir = ../obj/win32/wc3270 endif top = ../../.. this = $(top)/wc3270 export VPATH = $(this):$(top)/Common/Win32:$(top)/Common/c3270:$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(top)/Common -I$(top)/Common/Win32 all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/wc3270/Makefile.aux0000664000076500007650000001226613221577163014364 0ustar pdmpdm# Copyright (c) 1995-2015, 2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for wc3270 PRODUCT = wc3270 all: @echo "Must pick a specific make target." DOCS = LICENSE.txt html/$(PRODUCT)-man.html html/ReleaseNotes.html \ html/Resources.html html/SSL.html html/wc3270-script.html src.tgz: $(DOCS) wc3270.iss Makefile.aux MANDEP = html.m4 m4man Makefile.aux version.txt MKHTML = ./m4man -t html -p $(PRODUCT) # Rule for building the documentation. man: $(DOCS) # Rules for building man pages and derived HTML documentation. html/$(PRODUCT)-man.html: x3270.man.m4 ft.inc resources.inc hostname.inc \ keymaps.inc $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ x3270.man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ html/wc3270-script.html: x3270-script.man.m4 ft.inc $(MANDEP) $(MKHTML) -n wc3270-script -o $@ x3270-script.man.m4 html/Resources.html: resource-body make-resource-doc.pl version.txt ./make-resource-doc.pl -o $@ $(PRODUCT) wc3270.iss LICENSE.txt: version.txt LICENSE.txt.tmpl mkiss ./mkiss LICENSE.txt # Find Inno Setup and kSign. # On 32-bit Wine, they are in C:\Program Files. # On 64-bit Wine, they are in C:\Program Files (x86). ifeq ($(shell test -d "`winepath -u \"C:\\Program Files (x86)\"`" && echo yes),yes) PFX = C:\Program Files (x86) QPFX = C:\\Program Files (x86) QQPFX = C:\\Program\ Files\ \(x86\) else PFX = C:\Program Files QPFX = C:\\Program Files QQPFX = C:\\Program\ Files endif # Generate the Inno Setup .exe and the no-install zip file. # This depends on external targets, and is intended to be built recursively # from the top-level Makefile, which builds those targets first. VERSION = $(shell . ./version.txt && echo $$version) release-files: wc3270-$(VERSION)-setup.exe wc3270-$(VERSION)-noinstall-32.zip wc3270-$(VERSION)-noinstall-64.zip windows-release: release-files $(RM) /tmp/pass # Sign the binaries using ksign. SIGNFILES = $(shell awk '/Source:.*exe/ { print substr($$2,2,length($$2)-3) }' *.iss.tmpl | sed 's-\\-\\\\-g') CERT = z:\\hd\\xfer\\Certificate3.p12 PASS = /p `cat /tmp/pass` sign-files: ./readpass @(/bin/echo '@echo off'; \ for i in $(SIGNFILES); \ do /bin/echo -E "\"$(QPFX)\\kSign\\ksigncmd.exe\" /f $(CERT) /p \"`sed 's/%/%%/' /tmp/pass`\" $$i"; \ /bin/echo "if errorlevel 1 ("; \ /bin/echo " goto :EOF"; \ /bin/echo ")"; \ /bin/echo -E "echo ==== $$i ===="; \ done) >/tmp/sign.bat wine cmd /c Z:\\tmp\\sign.bat $(RM) /tmp/sign.bat # Rule for building the Inno Setup .exe file, deriving dependencies from the # .iss.tmpl file. ISSDEP = $(shell awk '/Source:/ { print substr($$2,2,length($$2)-3) }' *.iss.tmpl | sed 's-\\-/-g') wc3270-$(VERSION)-setup.exe: $(ISSDEP) wc3270.iss Makefile.aux sign-files wine $(QQPFX)\\Inno\ Setup\ 5\\ISCC.EXE \ /smystandard="$(QPFX)\\ksign\\ksigncmd.exe /f $(CERT) $(PASS) \$$p" \ wc3270.iss # Rule for building the noinstall.zip file, deriving dependencies from the # .zipit file. ZIPITDEP32 = $(shell awk '/^F/ { print $$2; }' wc3270-32.zipit) wc3270-$(VERSION)-noinstall-32.zip: $(ZIPITDEP32) wc3270-32.zipit version.txt Makefile.aux sign-files ./zipit -c "wc3270 $(VERSION)" -o wc3270-$(VERSION)-noinstall-32.zip wc3270-32.zipit ZIPITDEP64 = $(shell awk '/^F/ { print $$2; }' wc3270-64.zipit) wc3270-$(VERSION)-noinstall-64.zip: $(ZIPITDEP64) wc3270-64.zipit version.txt Makefile.aux sign-files ./zipit -c "wc3270 $(VERSION)" -o wc3270-$(VERSION)-noinstall-64.zip wc3270-64.zipit suite3270-3.6/wc3270/Makefile.obj0000664000076500007650000000776313221577163014347 0ustar pdmpdm# Copyright (c) 2007-2009, 2013-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Makefile for wc3270 # Set GT_PFX, NATIVE_SFX, NATIVECC, CC, WINDRES and WIN32_FLAGS. include winenv.mk MKFB = mkfb$(NATIVE_SFX) MKKEYPAD = mkkeypad$(NATIVE_SFX) XCPPFLAGS = $(WIN32_FLAGS) -I. -I$(THIS) -I$(TOP)/Common/c3270 -I$(TOP)/Common -I$(TOP)/include CFLAGS = $(EXTRA_FLAGS) -g -Wall -Werror -MMD -MP $(XCPPFLAGS) ifdef WIN64 HOST = win64 else HOST = win32 endif W = w include $(THIS)/wc3270_files.mk libs.mk VOBJS = $(WC3270_OBJECTS) fallbacks.o wc3270res.o OBJECTS = $(VOBJS) version.o WOBJECTS = wizard.o wc3270res.o wversion.o shortcut.o relink.o MKSHORTOBJECTS = mkshort.o shortcut.o wc3270res.o LIBS = -lws2_32 -lole32 -luuid -lcomdlg32 -lgdi32 -lwinspool -lcrypt32 -lsecur32 SHRTLIBS = $(LD32XX) -lole32 -luuid WIZLIBS = $(LD32XX) -lole32 -luuid -lwinspool DLLFLAGS = $(EXTRA_FLAGS) -mno-cygwin -shared -Wl,--export-all-symbols -Wl,--enable-auto-import PROGS = wc3270.exe mkshort.exe wc3270wiz.exe catf.exe all: $(PROGS) version.o: mkversion.sh $(VOBJS) version.txt $(RM) xversion.c sh $< wc3270 $(filter %.txt,$^) >xversion.c $(CC) $(CFLAGS) -c -o $@ xversion.c $(RM) xversion.c FALLBACKS = fb-common fb-printSession fb-messages fb-composeMap fb-c3270 fallbacks.c: $(MKFB) $(FALLBACKS) $(RM) $@ ./$(MKFB) -c -o $@ $(filter-out $(MKFB),$^) $(MKFB): mkfb.c $(NATIVECC) -DFOR_WIN32 -MMD -MP -I$(THIS) -o $@ $^ keypad.o: keypad.c compiled_keypad.h compiled_keypad.h: keypad.full keypad.labels keypad.map keypad.outline keypad.callbacks $(MKKEYPAD) ./$(MKKEYPAD) -I$(TOP)/Common/c3270 >$@ $(MKKEYPAD): mkkeypad.c $(NATIVECC) -MMD -MP -I$(THIS) -o $@ $^ wc3270.exe.manifest: mkmanifest.sh version.txt manifest.tmpl sh $< $(filter %.txt,$^) $(filter %.tmpl,$^) wc3270 "wc3270 terminal emulator" $(WIN64) >$@.tmp /bin/mv -f $@.tmp $@ wc3270res.o: wc3270.rc wc3270.ico wc3270km.ico wc3270.exe.manifest $(WINDRES) -i $< -o $@ wc3270.exe: $(OBJECTS) Makefile $(DEP3270) $(DEP3270I) $(DEP3270STUBS) $(DEP32XX) $(CC) -o wc3270.exe $(CFLAGS) $(OBJECTS) $(LD3270) $(LD3270I) $(LD32XX) $(LD3270STUBS) $(LIBS) mkshort.exe: $(MKSHORTOBJECTS) $(DEP32XX) $(CC) -o mkshort.exe $(CFLAGS) $(MKSHORTOBJECTS) $(SHRTLIBS) wversion.o: mkwversion.sh version.txt sh $< $(CC) $(filter %.txt,$^) wc3270wiz.exe: $(WOBJECTS) $(DEP32XX) $(CC) -o wc3270wiz.exe $(CFLAGS) $(WOBJECTS) $(WIZLIBS) catf.exe: catf.c $(CC) $(CFLAGS) -o $@ $^ clean: rm -f *.o $(MKFB) $(MKKEYPAD) compiled_keypad.h fallbacks.c wc3270.exe.manifest clobber: clean rm -f $(PROGS) *.d # Include auto-generated dependencies. -include $(OBJS:.o=.d) mkbf.d mkkeypad.d wc3270wiz.d suite3270-3.6/wc3270/make-resource-doc.pl0000775000076500007650000001752213221577163015775 0ustar pdmpdm#!/usr/bin/env perl use strict; my $outfile; if ($ARGV[0] eq "-o") { die "Missing filename after -o.\n" unless ($#ARGV >= 1); shift; $outfile = $ARGV[0]; shift; } die "Must specify product.\n" unless ($#ARGV >= 0); my $product = $ARGV[0]; # Figure out the version name. my $version; open VERSION, ") { chomp; if (/^version="(.*)"/) { $version=$1 } } close VERSION; # Sort out the product, and %approd. my %approd; $approd{'a'} = 1; if ($product eq "x3270") { $approd{'u'} = 1; } elsif ($product eq "c3270") { $approd{'C'} = 1; $approd{'u'} = 1; } elsif ($product eq "s3270") { $approd{'S'} = 1; $approd{'u'} = 1; } elsif ($product eq "tcl3270") { $approd{'u'} = 1; } elsif ($product eq "wc3270") { $approd{'C'} = 1; $approd{'w'} = 1; } elsif ($product eq "ws3270") { $approd{'S'} = 1; $approd{'w'} = 1; } else { die "Unknown product '$product'.\n"; } my $prefix = $product; $prefix =~ s/3270//; $approd{$prefix} = 1; # Dump out %approd. #foreach my $k (keys %approd) { # print STDERR "$k: $approd{$k}\n" #} my %types = ( i => 'Integer', b => 'Boolean', s => 'String' ); # Set up output file. my $out; my $tmpfile; if ($outfile) { $tmpfile = "/tmp/mkr" . $$; unlink $tmpfile; open TMPFILE, ">", $tmpfile or die "Can't open $tmpfile.\n"; $out = *TMPFILE; } else { $out = *STDOUT; } # From here on out, unlink the tempfile if we bail. END { unlink $tmpfile if ($tmpfile); } # Unlink the tempfile if we get a termination signal. sub sighandler { unlink $tmpfile if ($tmpfile); exit(0); } $SIG{'INT'} = \&sighandler; $SIG{'QUIT'} = \&sighandler; $SIG{'HUP'} = \&sighandler; $SIG{'TERM'} = \&sighandler; # Remove HTML attributes from a resource name. sub nix { my $txt = shift(@_); $txt =~ s/<\/?[\w.]+>//g; return $txt; } # The indices. my @index; # overall index my @c_index; # configuration index my @a_index; # appearance index my @n_index; # NVT-mode index my @p_index; # protocol index my @i_index; # interaction index my @s_index; # security index my @t_index; # tracing index my @o_index; # other index my @d_index; # deprecated index my @indices = ( \@c_index, \@a_index, \@n_index, \@p_index, \@i_index, \@s_index, \@t_index, \@o_index, \@d_index ); my @index_name = ( "Basic Configuration", "Appearance", "NVT-Mode", "Protocol", "Terminal Interaction", "Security", "Tracing", "Other", "Deprecated" ); # The elements of an entry. my $name; my @names; my $applies; my $type; my $default; my @switch; my @option; my $description; my $groups; sub dump { if ($name && $applies) { # The minimum set of required attributes are type and description. die "$name missing type\n" if (!$type); die "$name missing description\n" if (!$description); foreach my $n (@names) { # Add this name to the general index. push @index, $n; # Add this name to the specified indices... if (defined($groups)) { foreach (split /\s+/, $groups) { if ($_ eq "c") { push @c_index, $n; } elsif ($_ eq "a") { push @a_index, $n; } elsif ($_ eq "n") { push @n_index, $n; } elsif ($_ eq "p") { push @p_index, $n; } elsif ($_ eq "i") { push @i_index, $n; } elsif ($_ eq "s") { push @s_index, $n; } elsif ($_ eq "t") { push @t_index, $n; } elsif ($_ eq "d") { push @d_index, $n; } else { die "Unknown group '$_'\n"; } } } else { # ... or to the 'other' index. push @o_index, $n; } my $tgt = nix($n); print $out "\nName: $product.$n
    \n"; } print $out "Type: $type
    \n"; if ($default) { print $out "Default: $default
    \n"; } if (@switch) { my $comma; print $out "Command Line:"; foreach my $s (@switch) { print $out "$comma $s\n"; $comma = ","; } print $out "
    \n"; } if ($product eq "x3270") { foreach my $o (@option) { print $out "Option: $o
    \n"; } } $description =~ s/%p%/$product/g; while ($description =~ /%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $description =~ s/%-[\w.<>\/*]+%/$product.$full<\/a>/; } #$description =~ s/%-([\w.]+)%/$product.\1<\/tt><\/a>/g; print $out "Description:
    \n"; print $out "

    $description

    \n"; } undef $name; undef @names; undef $applies; undef $type; undef $default; undef @switch; undef @option; undef $description; undef $groups; } print $out <<"EOS"; $product Resources

    $product Resources

    EOS my $on = 1; my $in_desc; my $in_intro; my @ifstack; while () { chomp; # Skip blank lines. next if (/^\s*$/); # Handle if/endif. if (/^if\s+(.*)/) { push @ifstack, $on; my $desc_applies; foreach (split /\s+/, $1) { $desc_applies = 1 if ($approd{$_}); } $on = $desc_applies if ($ifstack[$#ifstack]); next; } elsif (/^else/) { die "dangling else\n" if ($#ifstack < 0); $on = !$on if ($ifstack[$#ifstack]); next; } elsif (/^endif/) { die "dangling endif\n" if ($#ifstack < 0); $on = pop(@ifstack); next; } next unless $on; # Handle desc. if ($in_desc) { if (/^\./) { undef $in_desc; } else { $description .= $_ . "\n"; } next; } # Handle intro. if (/^intro/) { $in_intro = 1; next; } elsif ($in_intro) { if (/^\./) { undef $in_intro; print $out "

    Alphabetical Resource List

    \n"; } else { s/%p%/$product/g; while (/%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $_ =~ s/%-[\w.<>\/*]+%/
    $product.$full<\/a>/; } print $out "$_\n"; } next; } # Handle normal keywords. if (/name\s(.*)/) { &dump; @names = split /\s+/, $1; $name = $names[0]; next; } if (/applies\s(.*)/) { undef $applies; foreach (split /\s+/, $1) { $applies = 1 if ($approd{$_}); } next; } if (/groups\s(.*)/) { $groups = $1; next; } if (/type\s([^\s]*)/) { $type = $types{$1}; next; } if (/default\s(.*)/) { $default = $1; next; } if (/switch\s(.*)/) { push @switch, $1; next; } if (/option\s(.*)/) { push @option, $1; next; } if (/^desc/) { $in_desc = 1; next; } last if (/^EOF$/); die "Unknown keyword '$_'.\n"; } &dump; print $out <Index of All Resources EOT my $ix = 0; foreach my $i (@index) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; my $q = 0; foreach my $j (@indices) { my @arr = @$j; if ($#arr >= 0) { print $out "

    $index_name[$q] Resources

    \n"; print $out "\n"; my $ix = 0; foreach my $i (@arr) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; } $q = $q + 1; } print $out "

    $product version $version ", `date`, "\n"; print $out "\n"; # Wrap up the outfile. if ($outfile) { close TMPFILE; system("mv $tmpfile $outfile") == 0 or die "Can't rename $tmpfile to $outfile.\n"; } suite3270-3.6/wc3270/mkiss0000775000076500007650000000013613221577163013175 0ustar pdmpdm#!/usr/bin/env bash . ./version.txt sed -e "s/%VERSION%/$version/g" -e "s/%CYEAR%/$cyear/g" suite3270-3.6/wc3270/mkshort.c0000664000076500007650000000477513221577163013771 0ustar pdmpdm/* * Copyright (c) 2006-2010, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * mkshort.c * A Windows console-based 3270 Terminal Emulator * Quick standalone utility to Create a shortcut to * wc3270.exe on the desktop with the right properties. */ #include "globals.h" #include #include "shortcutc.h" #include "winvers.h" int main(int argc, char *argv[]) { char exe_path[MAX_PATH]; HRESULT hres; char *install_dir; char *exe_name; char *link_path; (void) get_version_info(); /* Pull in the parameter. */ if (argc != 4) { fprintf(stderr, "usage: %s install-dir exe-name link-path\n", argv[0]); return 1; } install_dir = argv[1]; exe_name = argv[2]; link_path = argv[3]; sprintf(exe_path, "%s\\%s", install_dir, exe_name); /* Create the link. */ hres = create_link( exe_path, link_path, NULL, NULL, install_dir, 46, 80, L"Lucida Console", 0, 0); if (hres) { fprintf(stderr, "link creation \"%s\" failed\n", link_path); } return hres; } suite3270-3.6/wc3270/mkstand.bash0000775000076500007650000000100313221577163014416 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/wc3270/mkversion.sh0000775000076500007650000000466413221577163014507 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <wversion.c char *wversion = "v$version"; EOF ${1-cc} -c wversion.c suite3270-3.6/wc3270/NO-INSTALL.txt0000664000076500007650000000525113221577163014305 0ustar pdmpdmRunning wc3270 Without Installing It ------------------------------------ It is possible to run wc3270 without installing it. This allows it to be run from a USB flash drive or CD without modifying the system it is run on, or to be bundled with another application without needing to include the full wc3270 installation. When wc3270.exe or wc3270wiz.exe are run without doing a full software installation, they will not use the wc3270 Application Data directory. Instead, keymaps will be searched for in the working directory first, then in the directory where the executable file is. wc3270wiz.exe will write new keymaps to the working directory. wc3270 trace files will be written to the working directory as well. A new feature, auto-shortcut mode, also facilitates installation-free execution. Auto-shortcut mode is controlled by the wc3270.autoShortcut resource. If this resource is set to True in a session file or via the -S command-line option, then wc3270.exe will automatically create a temporary shortcut file (.LNK file) that matches the parameters in a session file (model number, character set, font, etc.) and re-run itself from the shortcut. (Without auto-shortcut mode, wc3270.exe will generally run as a Model 2 in a 25x80 console window, using the system default ANSI code page, and the system default font, which is usually not a Unicode font and thus cannot display all of the EBCDIC characters.) Note that auto-shortcut mode is set in all session files created by the Session Wizard, starting with version 3.3.10. Also note that all shortcuts created by the Session Wizard and by wc3270 itself as part of auto-shortcut mode include the +S command-line switch, to turn auto-shortcut mode off and avoid infinite looping. Thus, the easiest way to create a 'standalone' copy of wc3270 is to simply create a session file with the Session Wizard. Then you can run wc3270 via a 1-line .BAT file (substituting your session name for the session file): wc3270.exe xxx.wc3270 This command can also be passed to the 'system' library call from an application. Only wc3270.exe and the session file need to be present on the flash drive or copied to the target system. Note that custom keymaps can still be used in no-install mode. Keymap files can either be placed in the same directory as wc3270.exe, or the definitions can be included in the session file via a Session Wizard option ('Embed Keymaps'). Note also that it is possible to create a session file that does not specify a hostname. This allows the creation of session files that define things like the model number and character set, but allow the hostname to be entered interactively. suite3270-3.6/wc3270/nvt_gui.c0000664000076500007650000000400313221577163013735 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * nvt_gui.c * X11-specific functions for NVT mode. */ #include "globals.h" #include "appres.h" #include "cscreen.h" #include "nvt_gui.h" #include "screen.h" /** * X11 version of the xterm text escape * * @param[in] opcode Operation to perform * @param[in] text Associated text */ void xterm_text_gui(int code, const char *text) { switch (code) { case 0: /* icon name and window title */ case 2: /* window_title */ screen_title(text); break; default: break; } } suite3270-3.6/wc3270/README-zip.txt0000664000076500007650000000164613221577163014426 0ustar pdmpdmwc3270 No-Install README File This is the installer-free distribution of wc3270. Normally these files are installed in "C:\Program Files\wc3270" and the suffix ".wc3270" is registered to associate wc3270 session files with the wc3270 app. It includes the following executable files: wc3270.exe The wc3270 program, runs in a console window wc3270wiz.exe The wc3270 Session Wizard, creates and edits session files and desktop shortcuts ws3270.exe The scripting (screen-scraping) version of wc3270 catf.exe Helper application to monitor trace files x3270if.exe Helper application for wc3270 scripting The documentation is here: html\ HTML documentation, the root is html\README.html LICENSE.txt Legal necessities NO-INSTALL.txt How to run wc3270 without installing it (it can be a bit tricky) suite3270-3.6/wc3270/readpass0000775000076500007650000000031613221577163013651 0ustar pdmpdm#!/usr/bin/env bash # Get a password and put it in /tmp/pass read -p "Enter certificate password: " -r -s pass echo #echo -E $pass | sed -e 's-\\-\\\\-g' -e 's-!-\\!-g' >/tmp/pass echo -E $pass >/tmp/pass suite3270-3.6/wc3270/relink.c0000664000076500007650000002326213221577163013556 0ustar pdmpdm/* * Copyright (c) 2006-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * relink.c * A Windows console-based 3270 Terminal Emulator * Utility functions to read a session file and create a * compatible shortcut. */ #include "globals.h" #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "ctlr.h" #include "ctlrc.h" #include "host.h" #include "macros.h" #include "screen.h" #include "trace.h" #include "utils.h" #include #include "winvers.h" #include "shortcutc.h" #include "windirs.h" #include "relinkc.h" charsets_t charsets[] = { { "belgian", "500", 0, L"1252" }, { "belgian-euro", "1148", 0, L"1252" }, { "bracket", "37*", 0, L"1252" }, { "brazilian", "275", 0, L"1252" }, { "cp1047", "1047", 0, L"1252" }, { "cp870", "870", 0, L"1250" }, { "chinese-gb18030","1388", 1, L"936" }, { "finnish", "278", 0, L"1252" }, { "finnish-euro", "1143", 0, L"1252" }, { "french", "297", 0, L"1252" }, { "french-euro", "1147", 0, L"1252" }, { "german", "273", 0, L"1252" }, { "german-euro", "1141", 0, L"1252" }, { "greek", "875", 0, L"1253" }, { "hebrew", "424", 0, L"1255" }, { "icelandic", "871", 0, L"1252" }, { "icelandic-euro", "1149", 0, L"1252" }, { "italian", "280", 0, L"1252" }, { "italian-euro", "1144", 0, L"1252" }, { "japanese-kana", "930", 1, L"932" }, { "japanese-latin", "939", 1, L"932" }, { "norwegian", "277", 0, L"1252" }, { "norwegian-euro", "1142", 0, L"1252" }, { "russian", "880", 0, L"1251" }, { "simplified-chinese","935",1,L"936" }, { "spanish", "284", 0, L"1252" }, { "spanish-euro", "1145", 0, L"1252" }, { "thai", "838", 0, L"1252" }, { "traditional-chinese","937",1,L"950" }, { "turkish", "1026", 0, L"1254" }, { "uk", "285", 0, L"1252" }, { "uk-euro", "1146", 0, L"1252" }, { "us-euro", "1140", 0, L"1252" }, { "us-intl", "37", 0, L"1252" }, { NULL, NULL, 0, NULL } }; size_t num_charsets = (sizeof(charsets) / sizeof(charsets[0])) - 1; /* 2 3 4 5 */ int wrows[6] = { 0, 0, MODEL_2_ROWS, MODEL_3_ROWS, MODEL_4_ROWS, MODEL_5_ROWS }; int wcols[6] = { 0, 0, MODEL_2_COLS, MODEL_3_COLS, MODEL_4_COLS, MODEL_5_COLS }; static wchar_t * reg_font_from_cset(char *cset, int *codepage) { unsigned i, j; wchar_t *cpname = NULL; wchar_t data[1024]; DWORD dlen; HKEY key; static wchar_t font[1024]; DWORD type; *codepage = 0; /* Search the table for a match. */ for (i = 0; charsets[i].name != NULL; i++) { if (!strcmp(cset, charsets[i].name)) { cpname = charsets[i].codepage; break; } } /* If no match, use Lucida Console. */ if (cpname == NULL) { return L"Lucida Console"; } /* * Look in the registry for the console font associated with the * Windows code page. */ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\" "Console\\TrueTypeFont", 0, KEY_READ, &key) != ERROR_SUCCESS) { printf("RegOpenKey failed -- cannot find font\n"); return L"Lucida Console"; } dlen = sizeof(data); if (RegQueryValueExW(key, cpname, NULL, &type, (LPVOID)data, &dlen) != ERROR_SUCCESS) { /* No codepage-specific match, try the default. */ dlen = sizeof(data); if (RegQueryValueExW(key, L"0", NULL, &type, (LPVOID)data, &dlen) != ERROR_SUCCESS) { RegCloseKey(key); printf("RegQueryValueEx failed -- cannot find font\n"); return L"Lucida Console"; } } RegCloseKey(key); if (type == REG_MULTI_SZ) { for (i = 0; i < dlen/sizeof(wchar_t); i++) { if (data[i] == 0x0000) { break; } } if (i + 1 >= dlen / sizeof(wchar_t) || data[i + 1] == 0x0000) { printf("Bad registry value -- cannot find font\n"); return L"Lucida Console"; } i++; } else { i = 0; } for (j = 0; i < dlen; i++, j++) { if (j == 0 && data[i] == L'*') { i++; } if ((font[j] = data[i]) == 0x0000) { break; } } *codepage = _wtoi(cpname); return font; } /* Convert a hexadecimal digit to a nybble. */ static unsigned hex(char c) { static char *digits = "0123456789abcdef"; char *pos; pos = strchr(digits, c); if (pos == NULL) { return 0; /* XXX */ } return (unsigned)(pos - digits); } //#define DEBUG_EDIT 1 int read_user_settings(FILE *f, char **usp) { int saw_star; char buf[1024]; if (usp == NULL) { return 1; /* success */ } *usp = NULL; /* * Read the balance of the file into a temporary buffer, ignoring * the '!*' line. */ saw_star = 0; while (fgets(buf, sizeof(buf), f) != NULL) { if (!saw_star) { if (buf[0] == '!' && buf[1] == '*') { saw_star = 1; } continue; } if (*usp == NULL) { *usp = malloc(strlen(buf) + 1); (*usp)[0] = '\0'; } else { *usp = realloc(*usp, strlen(*usp) + strlen(buf) + 1); } if (*usp == NULL) { #if defined(DEBUG_EDIT) /*[*/ printf("out of memory]\n"); #endif /*]*/ return 0; } strcat(*usp, buf); } return 1; } /* * Read an existing session file. * Returns 1 for success (file read and editable), 0 for failure. */ int read_session(FILE *f, session_t *s, char **usp) { char buf[1024]; int saw_hex = 0; int saw_star = 0; unsigned long csum; unsigned long fcsum = 0; int ver; int s_off = 0; /* * Look for the checksum and version. Verify the version. * * XXX: It might be a good idea to validate each '!x' line and * make sure that the length is right. */ while (fgets(buf, sizeof(buf), f) != NULL) { if (buf[0] == '!' && buf[1] == 'x') saw_hex = 1; else if (buf[0] == '!' && buf[1] == '*') saw_star = 1; else if (buf[0] == '!' && buf[1] == 'c') { if (sscanf(buf + 2, "%lx %d", &csum, &ver) != 2) { #if defined(DEBUG_EDIT) /*[*/ printf("[bad !c line '%s']\n", buf); #endif /*]*/ return 0; } if (ver > WIZARD_VER) { #if defined(DEBUG_EDIT) /*[*/ printf("[bad ver %d > %d]\n", ver, WIZARD_VER); #endif /*]*/ return 0; } } } if (!saw_hex || !saw_star) { #if defined(DEBUG_EDIT) /*[*/ printf("[missing%s%s]\n", saw_hex? "": "hex", saw_star? "": "star"); #endif /*]*/ return 0; } /* Checksum from the top up to the '!c' line. */ fflush(f); fseek(f, 0, SEEK_SET); fcsum = 0; while (fgets(buf, sizeof(buf), f) != NULL) { char *t; if (buf[0] == '!' && buf[1] == 'c') { break; } for (t = buf; *t; t++) { fcsum += *t & 0xff; } } if (fcsum != csum) { #if defined(DEBUG_EDIT) /*[*/ printf("[checksum mismatch, want 0x%08lx got 0x%08lx]\n", csum, fcsum); #endif /*]*/ return 0; } /* Once more, with feeling. Scribble onto the session structure. */ fflush(f); fseek(f, 0, SEEK_SET); s_off = 0; while (fgets(buf, sizeof(buf), f) != NULL) { if (buf[0] == '!' && buf[1] == 'x') { char *t; for (t = buf + 2; *t; t += 2) { if (*t == '\n') { break; } if (s_off > sizeof(*s)) { #if defined(DEBUG_EDIT) /*[*/ printf("[s overflow: %d > %d]\n", s_off, sizeof(*s)); #endif /*]*/ return 0; } ((char *)s)[s_off++] = (hex(*t) << 4) | hex(*(t + 1)); } } else if (buf[0] == '!' && buf[1] == 'c') { break; } } /* * Read the balance of the file into a temporary buffer, ignoring * the '!*' line. */ if (usp != NULL && read_user_settings(f, usp) == 0) { return 0; } /* Success */ return 1; } HRESULT create_shortcut(session_t *session, char *exepath, char *linkpath, char *args, char *workingdir) { wchar_t *font; int codepage = 0; int extra_height = 1; font = reg_font_from_cset(session->charset, &codepage); if (!(session->flags & WF_NO_MENUBAR)) { extra_height += 2; } return create_link( exepath, /* path to executable */ linkpath, /* where to put the link */ "wc3270 session", /* description */ args, /* arguments */ workingdir, /* working directory */ (session->ov_rows? session->ov_rows: wrows[session->model]) + extra_height, /* console rows */ session->ov_cols? session->ov_cols: wcols[session->model], /* console columns */ font, /* font */ session->point_size,/* point size */ codepage); /* code page */ } suite3270-3.6/wc3270/relinkc.h0000664000076500007650000000703313221577163013724 0ustar pdmpdm/* * Copyright (c) 2006-2012, 2014, 2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * relinkc.h * A Windows console-based 3270 Terminal Emulator * Utility functions to read a session file and create a * compatible shortcut. */ #define STR_SIZE 256 #define WIZARD_VER 2 typedef struct { /* Fields for wc3270 3.3.9 (Wizard version 1) */ char session[STR_SIZE]; /* session name */ char host[STR_SIZE]; /* host name */ DWORD port; /* TCP port */ char luname[STR_SIZE]; /* LU name */ DWORD ssl; /* SSL tunnel flag */ char proxy_type[STR_SIZE]; /* proxy type */ char proxy_host[STR_SIZE]; /* proxy host */ char proxy_port[STR_SIZE]; /* proxy port */ DWORD model; /* model number */ char charset[STR_SIZE]; /* character set name */ DWORD is_dbcs; DWORD wpr3287; /* wpr3287 flag */ char printerlu[STR_SIZE]; /* printer LU */ char printer[STR_SIZE]; /* Windows printer name */ char printercp[STR_SIZE]; /* wpr3287 code page */ char keymaps[STR_SIZE]; /* keymap names */ /* Field added for wc3270 3.3.10 (Wizard version 2) */ unsigned char flags; /* miscellaneous flags */ unsigned char ov_rows; /* oversize rows */ unsigned char ov_cols; /* oversize columns */ unsigned char point_size; /* font point size */ } session_t; #define WF_EMBED_KEYMAPS 0x01 /* embed keymaps in session */ #define WF_AUTO_SHORTCUT 0x02 /* 'auto-shortcut' mode */ #define WF_WHITE_BG 0x04 /* white background */ #define WF_NO_MENUBAR 0x08 /* don't leave room for menu bar */ #define WF_VERIFY_HOST_CERTS 0x10 /* verify host certificate */ #define WF_TRACE 0x20 /* trace at start-up */ #define WF_CROSSHAIR 0x40 /* crosshair cursor */ #define WF_ALTCURSOR 0x80 /* underscore cursor */ typedef struct { char *name; char *hostcp; int is_dbcs; wchar_t *codepage; } charsets_t; extern charsets_t charsets[]; extern size_t num_charsets; extern int wrows[6]; extern int wcols[6]; extern int read_user_settings(FILE *f, char **usp); extern int read_session(FILE *f, session_t *s, char **usp); extern HRESULT create_shortcut(session_t *session, char *exepath, char *linkpath, char *args, char *workingdir); suite3270-3.6/wc3270/resource-body0000664000076500007650000031354113221577163014635 0ustar pdmpdmintro Resources are used to configure %p%. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into %p%.
    • if x
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The %p% app-defaults file (only if %p% is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
      endif
    • If a session file foo.%p% is specified on the command line, its contents are applied. if x c Otherwise, if the %p% profile (~/.%p%pro) exists, it is read and its contents are applied. endif These definitions override resource values defined by if x X11 methods and endif compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example %-bsdTm% can be set by the following command-line option:
         -xrm "%p%.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file if x (app-defaults file, profile or session file) else if c (profile or session file) else (session file) endif endif has the following syntax.
    • Each definition consists of:
          %p%.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • if x C
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          %p%.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        
    • endif
    . name acceptHostname applies a type s groups s switch -accepthostname description Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.) . name acs applies c type b default true desc When true, %p% will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, %p% will use Unicode box-drawing characters. . name activeIcon applies x groups a type b default false switch -activeicon description When true, %p%'s icon becomes a live miniature of the screen display. . name aidWait applies x c s tcl type b default false switch -set aidWait switch -clear aidWait desc When true, %p% will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll %p%'s status until it shows that the keyboard is no longer unlocked. . name allBold applies c groups a type s default auto switch -allbold desc When true, %p% will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation. . name allowResize applies x type b default true description When true, the %p% window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it. . name altCursor applies x wc groups a type b default false switch -set altCursor switch -clear altCursor option Options -> Toggles -> Underline Cursor option Options -> Toggles -> Block Cursor description When true, this causes %p% to use the alternate (underscore) cursor. When false, it will use a block cursor. . name altScreen applies c type s switch -altscreen desc Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-defScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name aplCircledAlpha applies x groups a type b default false description When set to true, allows %p% to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with %p%.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point. . name aplMode applies x type b default false switch -apl desc Enables %p% APL mode. APL mode appends apl to the list of names in %-keymap% (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets %-composeMap% to apl (allowing Compose key sequences to construct complex APL symbols), and sets %-charset% to apl (allowing the display of APL symbols using several of the 3270 fonts). . name asciiBoxDraw applies C type b default false desc When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width. . name autoShortcut applies wc type b default false switch -S switch +S desc When true, %p% will run in auto-shortcut mode. In auto-shortcut mode, %p% automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x. . name background applies x groups a type s default white switch -bg switch -rv description The background color for menus, buttons, and on monochrome X11 displays, the emulator window. . name bellMode applies wc type s groups i description Controls how %p% responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the %p% window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides %-visualBell%. . name bellVolume applies x type i default 0 description Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by %-visualBell%, which if true, will replace the bell with a flash of the screen. . name bindLimit applies a groups p type b default true description When true, %p% will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not. . name bindUnlock applies a type b groups p default false description When true, %p% will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing %p% to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op. . name blankFill applies a groups i type b default false option Options -> Toggles -> Blank Fill switch -set blankFill switch -clear blankFill description When true, in 3270 mode %p% will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals. . name boldColor applies x groups a default green type s description This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan. . name bsdTm applies a groups p type b default false description Defines %p%'s response to the TELNET DO TIMING MARK option. When set to false, %p% will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, %p% will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of %p%. In either case, %p% will never respond to a DONT TIMING MARK option. . name caDir applies u type s groups s switch -cadir description Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name caFile applies u type s groups s switch -cafile description Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name cbreak applies c type b default false switch -cbreak desc If true, %p% will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters. . name certFile applies u groups s type s switch -certfile desc Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by %-certFileType%. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%.

    On the Mac, the file must be in PKCS12 format. . name certFileType applies u groups s type s default pem switch -certfiletype desc Gives the type of the certificate file specified by %-certFile%. The value can be pem or asn1. (OpenSSL only) . name chainFile applies u groups s type s switch -chainfile desc Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%. (OpenSSL only) . name charClass applies x type s desc Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name. . name charset applies a groups c type s default bracket switch -charset option Options -> Character Set description This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by %p%, use the -v command-line option. if wc

    Note that %p% DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language. endif . name clientCert applies w groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store. . name clientCert applies u groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only) . name color8 applies a groups p type b default false description If true, %p% will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported. if c

    This setting will also cause %p% to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen. endif . name colorBackground applies x groups a type s default black description The background color for the emulator window. This resource is used only on color X11 displays when %-model% specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by %-colorScheme%. . name colorScheme applies x groups a type s default default option Options -> Color Scheme description Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when %-model% specifies a 3279 display. %-colorScheme% is just the name of the color scheme. The actual color scheme definition for color scheme foo is %-colorScheme.foo%. . name colorScheme.foo applies x groups a type s description An individual color scheme definition. I.e., to define color scheme foo, a resource named %p%.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer. . name commandTimeout applies tcl type i description Defines the number of seconds to wait for a command to complete before failing it with a timeout error. . name composeMap applies x C type s default latin1 description Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource %-composeMap.foo%. . name composeMap.foo applies x C type s description An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive. . name confDir applies a type s if u default /usr/local/etc/x3270 else default . endif desc Defines the %p% configuration directory, where %p% will search for the ibm_hosts file by default. (See %-hostsFile%.) if w

    The default is to search the directory where %p% was started, which usually its installation directory. endif . name connectFileName applies x type s default ~/.x3270connect description Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of %p% that run under the same username. . name connectTimeout applies a type i groups c switch -connecttimeout description Specifies a timeout, in seconds, that %p% will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that %p% will wait for the lesser of the two times (the specified timeout and the system-defined timeout). . name consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite applies wc groups a type i desc Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource %p%.consoleColorForHostColorGreen or the resource %p%.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the %p% Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with %p%.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         %p%.consoleColorForHostColorNeutralBlack: 15
         %p%.consoleColorForHostColorNeutralWhite: 0
        
    . name crosshair applies x C groups a type b default false option Options -> Toggles -> Crosshair Cursor switch -set crosshair switch -clear crosshair description When true, causes %p% to display a crosshair over the cursor: lines extending with height and width of the screen. . name crosshairColor applies x C groups a type s default purple description Defines the color used for the crosshair cursor (see %-crosshair%). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15
    . name cursesColorForDefault cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified applies c groups a type s desc Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    %p% Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)
    . name cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite applies c groups a type s desc Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource %p%.cursesColorForHostColorGreen or the resource %p%.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, %p% only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with %p%.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See %-cursesColorForDefault% for the definitions of curses colors. . name cursesKeypad applies c type b default false desc When true, %p% will set up the terminal in curses keypad mode. . name cursorBlink applies x groups a type b default false option Options -> Toggles -> Blinking Cursor switch -set cursorBlink switch -clear cursorBlink description When true, causes %p% to use a blinking cursor. . name cursorColor applies x groups a type s default red description On color X11 displays, this is the color of the text cursor. This resource is used only if %-useCursorColor% is true. . name cursorPos applies x C groups a type b default true switch -set cursorPos switch -clear cursorPos option Options -> Toggles -> Track Cursor description When true, causes %p% to display the cursor location in the OIA (the status line). . name dbcsCgcsgid applies a groups p type s description Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use %-sbcsCgcsgid% for the single-byte (SBCS) character set. . name debugTracing applies x groups t s type b default true description If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed. . name defaultFgBg applies c type b groups a default false switch -defaultfgbg description If true, %p% will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that %p%'s screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if %p% has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9). . name defScreen applies c type s switch -defscreen desc Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-altScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name dftBufferSize applies a groups p type i default 4096 description Deprecated resource -- replaced by %-ftBufferSize%

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name devName applies a type s switch -devname groups p description Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name disconnectClear applies x type b default false description If true, %p% will clear the screen when a host disconnects. . name doConfirms applies x type b default true description When true, %p% will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed. . name dsTrace applies a groups t type b default false switch -trace switch -set dsTrace switch -clear dsTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name emulatorFont type s applies x groups a default 3270 switch -efont option Options -> Font description The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (%-charset%). However, the special OIA (status line) symbols are only available with the 3270 fonts. . name eof type s applies a groups n default ^D description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    . name erase type s applies a groups n default ^? description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (%p% gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause %p% to discard the last character on the input line.

    When connected in character-at-a-time mode (%p% sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action. . name eventTrace groups t type b applies a default false switch -set eventTrace switch -clear eventTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% traces information about keyboard and mouse events into a file. The default file name is if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name extended type b applies a default false groups d switch -extended description Deprecated resource -- replaced by %-model% syntax

    Indicates support for the 3270 Extended Data Stream. . name fixedSize type s applies x groups a description Specifies a fixed size for the %p% display window. If set, %p% will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary. . name foreground type s applies x groups a default black switch -fg switch -rv description The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display. . name ftAllocation type s applies a groups i default default description Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock. . name ftAvblock type i applies a groups i description Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers. . name ftBlksize type i applies a groups i description Defines the default block size for files sent to TSO hosts by IND$FILE file transfers. . name ftBufferSize applies a groups p type i default 4096 description Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCodePage type i applies w groups i description Deprecated resource -- replaced by %-ftWindowsCodePage%

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCr type s applies a groups i default auto description Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done. . name ftDirection type s applies a groups i default receive description Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation). . name ftExist type s applies a groups i default keep description Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be if x aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), else aborted, endif replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file. . name ftHost type s applies a groups i default tso description Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics. . name ftHostFile type s applies a groups i description Defines the default host file name for IND$FILE file transfers. . name ftLocalFile type s applies a groups i description Defines the default local file name for IND$FILE file transfers. . name ftLrecl type i applies a groups i description Defines the default logical record length for files sent to the host via IND$FILE. . name ftMode type s applies a groups i default ascii description Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation). . name ftPrimarySpace type i applies a groups i description Defines the default primary space allocation for files sent to TSO hosts via IND$FILE. . name ftRecfm type s applies a groups i default default description Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format. . name ftRemap type s applies a groups i default yes description Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by %p% to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37. . name ftSecondarySpace type i applies a groups i description Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE. . name ftWindowsCodePage type i applies w groups i description The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name highlightBold type b applies x groups a default false description If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font. . name hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified applies wc groups a type s desc Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See %-consoleColorForHostColor0% for the definitions of host colors.

    The default values are:
    %p% Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite
    . name hostname type s applies a groups c desc Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over %-hostname%.

    The most common use of %-hostname% is in session files, where a file is used to pass all of the options to establish a %p% session. . name hostsFile type s applies x default /usr/local/etc/x3270/ibm_hosts description The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by %-confDir%. . name hostsFile type s applies C S tcl if u default /usr/local/etc/x3270/ibm_hosts else default ibm_hosts endif description The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. if u The default pathname is actually ibm_hosts in the directory defined by %-confDir%. endif . name httpd type s applies C S x switch -httpd description Defines the TCP port and optional address to listen on for HTTP connections. (%p% implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name iconFont type s applies x groups a default nil2 description The font used to paint the text inside the active icon (see %-activeIcon%). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image. . name iconLabelFont type s applies x groups a default 8x13 description When %-activeIcon% and %-labelIcon% are true, this is the name of the font used to paint the icon label. . name icrnl type b applies a groups n default true description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines. . name idleCommand applies x C S groups i type s description When %-idleCommand% is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The %-idleCommand% can be an arbitrary sequence of %p% actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). %-idleCommandEnabled% must be true in order for the %-idleCommand% to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) %-idleTimeout% specifies the inactivity interval. . name idleCommandEnabled applies x C S groups i type b default false description Controls whether %-idleCommand% has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.) . name idleTimeout applies x C S groups i type s default ~7m description The timeout value for %-idleCommand%. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified. . name inlcr applies a groups n type b default false description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns. . name inputColor applies x groups a type s default green description This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan.

    If the resource %-modifiedSel% is true, modified fields are also displayed using %-inputColor%. . name inputMethod applies x type s switch -im description Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale. . name intr applies a groups n type s default ^C description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host. . name invertKeypadShift applies x type b default false description When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed. . name keyFile applies u groups s type s switch -keyfile desc Gives the name of a file containg the private key for the certificate specified by %-certFile% or %-chainFile%. The default file type is PEM; it can be overridden by %-keyFileType%. If the private key is encrypted, the password is specified by %-keyPasswd%. (OpenSSL only) . name keyFileType applies u groups s type s default pem switch -keyfileType desc Gives the type of the private key file specified by %-keyFile%. The value can be pem or asn1. (OpenSSL only) . name keyHeight applies x groups a type i default 24 desc Defines the height of the keys on the pop-up keypad. . name keymap applies x C groups c type s switch -keymap description The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a %-keymap% value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270. if x

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six. endif

    if x If no %-keymap% is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. %-keymap% is only the name; the keymap definition for name foo is the resource %-keymap.foo%. endif if C %-keymap% is only the name; the actual keymap for name foo can be defined either by the resource %-keymap.foo%, or by a keymap file. if c The keymap file is not searched for in any particular location, nor does it have a special suffix, so %-keymap% can specify the full pathname of the keymap file. else Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km. endif endif . name keymap.foo applies x C type s description The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax. . name keypad applies x groups a type s default right description. This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main %p% window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main %p% window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar
    . name keypad.keyHeight applies x groups a type i default 24 description The height in pixels of all of the buttons on the keypad. . name keyPasswd applies u groups s type s switch -keypasswd desc On OpenSSL, gives the password for the private key file specified by %-keyFile%, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the %-certfile% certifiate file. . name keyWidth applies x groups a type i default 48 description The width in pixels of the lower tier of buttons on a horizontal keypad. . name keypad.largeKeyWidth applies x groups a type i default 56 description The width in pixels of the lower tier of buttons on a vertical keypad. . name keypad.paWidth applies x groups a type i default 36 description The width in pixels of PA and cursor keys on the keypad. . name keypad.pfWidth applies x groups a type i default 32 description The width in pixels of PF keys on the keypad. . name keypadBackground applies x groups a type s default grey70 description On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap. . name keypadOn applies x type b groups a default false description If true, the keypad will automatically appear when %p% is started. . name kill applies a groups n type s default ^U description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action. . name labelIcon applies x groups a type b default false description When %-activeIcon% is true, the twm window manager will not put a label on %p%'s icon. Setting %-labelIcon% to true causes %p% to supply its own label for the icon.

    The icon label is drawn using the font specified by %-iconLabelFont%. . name largeKeyWidth applies x groups a type i default 56 desc Defines the width of the "large" keys in the lower section of the pop-up keypad. . name lightPenPrimary applies wc groups i type b default false description Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste. . name lineWrap applies a groups n type b default true switch -set lineWrap switch -clear lineWrap option Options -> Toggles -> Wraparound description This setting is used only in NVT mode. When true, %p% will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence. . name loginMacro applies a type s switch -loginmacro desc Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a %-hostsFile% is in use and a matching entry is found, the login macro from that entry will be used in preference to the %-loginMacro%. . name lnext applies a groups n type s default ^V description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered. . name localCp applies ws type i desc Forces %p% to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files. . name lockedCursor applies x groups a type s default X_cursor description The name of the mouse cursor displayed with %p% is not connected to a host. . name m3279 applies a type b default true groups d switch -color description Deprecated resource -- replaced by %-model% syntax

    Indicates support for color (a 3279 terminal). . name macros applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    %-macros% defines a set of macros for all hosts. To specify a set of macros for host foo, use %-macros.foo%. . name macros.foo applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of %-macros%. See %-macros% for details on its syntax. . name marginedPaste applies x wc groups i type b default false switch -set marginedPaste switch -clear marginedPaste option Options -> Toggles -> Paste With Left Margin description When true, %p% will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon. . name maxRecent applies x groups i type i default 5 description The maximum number of entries in the Connect menu's recent host list. . name menuBar applies x wc groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% main window. if x The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons. endif . name menuBar applies c groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% display, even if the terminal supports a mouse. . name metaEscape applies c type b default true desc When true, %p% will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus %p% will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character. . name minVersion applies S type s switch -minversion description Defines a minimum required version for %p%. If the version of %p% is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal. . name model applies a groups c type s default 3279-4-E switch -model option Options -> Screen Size description The terminal model that %p% is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. if x If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays. endif
      3279 specifies a color 3270 display. if x This is the default for color X11 displays. endif
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is if C the largest model that will fit on the console or terminal emulator window where %p% is running. Displaying the OIA (status line) requires one more row than what is listed above. else 4. endif
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.
    . name modifiedSel applies x groups a type b default false description When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by %-inputColor%. In 3279 mode, this is the color whose index is defined by %-modifiedSelColor%. When %-modifiedSel% is false, modified fields are displayed in the same colors as unmodified fields. . name modifiedSelColor applies x groups a type i default 10 description In 3279 mode, when %-modifiedSel% is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See %-colorSchemes% for the host color index definitions.) . name mono applies x c type b default false switch -mono description if x If true, %p% will operate as if it were running on a monochrome X11 display. else If true, %p% will emulate a 3278, and will not use any of the terminal's color attributes. endif . name monoCase applies a type b default false switch -set monoCase switch -clear monoCase option Options -> Toggles -> Monocase description When true, causes %p% to run in uppercase-only mode. . name mouse applies c groups i type b default true description If true, enables %p% to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled. . name newEnviron applies a type b default true description If true, %p% will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not. . name noOther applies x groups s type b default false description If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus. . name noPrompt applies C groups s type b default false desc If true, the interactive %p%> prompt will be disabled. In particular, this means that when %p% is not connected to a host, a keymap or an external script is the only way to start a new host connection. . name normalCursor applies x type s groups a default top_left_arrow desc Defines the mouse cursor that %p% uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked. . name nopSeconds applies a type i groups i default 0 desc If nonzero, %p% will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity. . name normalColor applies x groups a type s default green desc On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color. . name numericLock applies a groups i type b default false desc When true, causes %p% to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute. . name nvtMode applies a groups i type b default false switch -nvt desc When true, causes %p% to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname. . name onlcr applies a groups n type b default true desc Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences. . name oerrLock applies a groups i type b default true desc If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message. . name once applies a type b default false switch -once desc When true, %p% will exit as soon as a host disconnects. The default is false if no hostname is specified on the command if x C line or in a session file, else line, endif true otherwise. . name overlayPaste applies wc x groups i type b default false switch -set overlayPaste switch -clear overlayPaste option Options -> Toggles -> Overlay Paste desc When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause %p% to act as if the %-marginedPaste% toggle were also set. . name oversize applies a type s switch -oversize desc Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. if C It can also be the string auto, which will cause %p% to use the entire screen area of the endif if c terminal. endif if wc console window it is running in. endif It is used only if the %-model% includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with %p% in this mode. . name paWidth applies x groups a type i default 36 desc Defines the width of the PA keys in the lower section of the pop-up keypad. . name pfWidth applies x groups a type i default 32 desc Defines the width of the PF keys on the pop-up keypad. . name port applies a groups c type s default telnet switch -port desc The name of the default TCP port for %p% to connect to. This can be either a symbolic name from /etc/services, or an integer. . name proxy applies a groups c type s switch -proxy desc Defines a proxy server that %p% will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the %p% manual page. . name preeditType applies x type s default OverTheSpot+1 switch -pt desc The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. . name printerLu type s applies x C groups c switch -printerlu desc If a value is set, %p% will automatically start a if u pr3287 else wpr3287 endif printer session when a host connection is established. If the value is ".", the if u pr3287 else wpr3287 endif session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session. . name printer.assocCommandLine applies x C type s if x c default pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H% else default wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when %-printerLU% is "."). Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with the %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with the current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.codepage applies wc type i desc The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage. . name printer.command applies x c type s default lpr desc The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in %-printer.assocCommandLine% and %-printer.luCommandLine% resources. . name printer.luCommandLine applies x C type s if x c default pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H% else default wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.name applies wc type s desc Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer. . name printer.options applies x C type s desc Defines extra parameters to substutute for the %O% token in the printer command line. . name printTextCommand applies x c type s default lpr desc The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. if x If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear. endif . name printTextFont applies wc type s default Courier New desc The font used by the PrintText action. . name printTextHorizontalMargin applies wc type i default 0.5 desc The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printTextOrientation applies wc type i desc The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is. . name printTextScreensPerPage applies wc c x type i default 1 desc The number of screens to display on a page when tracing screens to the printer. . name printTextSize applies wc type i default auto (GDI), 8 (WordPad) desc The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points. . name printTextVerticalMargin applies wc type i default 0.5 desc The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printWindowCommand applies x type s default xwd -id %d | xpr | lpr desc The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear. . name qrBgColor applies C s tcl type b default false desc When true, %p% will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash. . name quit applies a groups n type s default ^\ desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host. . name reconnect applies x C type b default false desc When true, %p% will automatically reconnect to a host after it disconnects. . name rectangleSelect applies x groups i type b default false switch -set rectangleSelect switch -clear rectangleSelect option Options -> Toggles -> Select by Rectangles desc When true, %p% will always select rectangular areas of the screen. When false, %p% will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm. . name reverseVideo applies c type b groups a default false option -rv desc When true, %p% will use a white background instead of a black one. . name rprnt applies a groups n type s default ^R desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed. . name saveLines applies x C type i default 4096 switch -sl desc The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved. . name sbcsCgcsgid applies a groups p type s desc Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use %-dbcsCgcsgid% for the double-byte (DBCS) character set. . name schemeList applies x type s desc Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme. . name screenTrace applies a groups t type b default false switch -set screenTrace switch -clear screenTrace option File -> Save Screen(s) in File desc When true, %p% will save an ASCII version of the screen image in a file every time it changes. The file name defaults to if u x3scr.pid. else x3scr.pid.txt. endif The directory where the file is written is defined by %-traceDir%. If %-screenTraceFile% is defined, it defines the file name and %-traceDir% is ignored. if w file name. endif . name screenTraceFile applies a groups t type s desc If defined, gives the name of the file that screen traces will be written into. . name scripted applies x type b default false switch -script desc When true, %p% will read commands from standard input. The rules for these commands are documented in the x3270-script manual page. . name scriptPort applies a type i switch -scriptport desc If defined, %p% will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name scriptPortOnce applies a type b default false switch -scriptportonce desc If defined, %p% will accept only one script connection. When that connection is broken, it will exit. . name scrollBar applies x type b default false switch -sb switch +sb switch -set scrollBar switch -clear scrollBar desc When true, %p% will display a scroll bar to the right of the emulator window. . name secure applies x groups s type b default false desc When true, %p% will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and %-disconnectClear% is true. See %-noOther% and %-suppressActions% for additional security options. . name selectBackground applies x groups a type s default dimGrey desc On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video. . name showTiming applies x groups a type b default false switch -set showTiming switch -clear showTiming option Options -> Toggles -> Show Timing desc When true, %p% will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent. . name socket applies u type b default false switch -socket desc When true, %p% will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket. . name startTls applies a type b groups s default true description If true, %p% will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them. . name *suppress applies x groups s type b desc When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress . name suppressActions applies a groups s type s desc A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options. . name suppressFontMenu applies x type b default false desc If true, the Options -> Font menu will not be displayed. . name suppressHost applies x type b default false desc If true, %p% will omit the hostname from the File -> About %p% -> Connection Status pop-up. . name termName applies a groups p type s switch -tn desc An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of %-model%. . name title applies x wc groups a type s switch -title desc Sets the title for the %p% window, overriding the default of constructing the name from the host that is connected to. . name trace applies a groups t type b default false switch -trace switch -set trace switch -clear trace option File -> Trace Data and Events description When true, %p% writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name traceCommand applies x type s default tail -f desc Defines the command that runs in the trace window. . name traceDir applies a groups t type s if u default /tmp endif if wc default current user's Desktop endif if ws default current directory endif desc Defines the directory that trace files are written into. . name traceFile applies a groups t type s switch -tracefile desc If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. if x If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created. endif . name traceFileSize applies a groups t type s switch -tracefilesize desc If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started. . name traceMonitor applies x wc groups t type b default true desc When true, %p% will create a window to monitor data stream and event traces. When false, no monitor window will be if x created (and the value of none for %-traceFile% will be considered invalid). else created. endif . name typeahead applies w C type b default true desc When true, %p% will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped. . name underscore applies C groups a type b if c default false else default true endif switch -set underscore switch -clear underscore desc When true, %p% will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed if c on terminals that else to overcome the fact that Windows consoles endif are unable to display real underlined text. . name unlockDelay applies x c wc type b default true desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% implements a hack to briefly delay actually unlocking the keyboard. When %-unlockDelay% is true (the default), the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. Setting it to false removes this delay. . name unlockDelay applies s ws tcl type b default false desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. . name unlockDelayMs applies a type i default 350 desc Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and %p% actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros. . name useCursorColor applies x groups a type b default false desc If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by %-cursorColor%. . name user applies a type s switch -user groups p description Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name utf8 applies S type b switch -utf8 description Forces local I/O to use UTF-8 encoding, regardless of the local codepage. . name verifyHostCert applies a type b groups s switch -noverifycert switch -verifycert default true description If true (the default), %p% will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, %p% will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking. . name visibleControl applies x C type b default false switch -set visibleControl switch -clear visibleControl option Options -> Toggles -> Visible Control Characters desc If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, if x c displayed with underlines, endif are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, if x c displayed in yellow with underlines, endif if wc displayed in reverse-video yellow, endif are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified
    . name visualBell applies x groups i type b default false desc When true, %p% will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell. . name visualBell applies wc groups i type b default false desc Deprecated resource -- replaced by %-bellMode%

    When true, %p% will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, %p% will beep the console and flash the screen.

    Note that this resource is overridden by %-bellMode%. %-bellMode% is the preferred method of controlling the console bell behavior. . name visualSelect applies x groups a type b default false desc This resource controls how %p% displays light pen selectable fields that do not have a color explicitly set by the host. When true, %p% will display these fields using the color defined by %-visualSelectColor%. When false, %p% will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode. . name visualSelectColor applies x groups a type i default 6 desc The host color index of the color to use to display light pen selectable fields. This resource is used only if %-visualSelect% is true. The default is 6 (yellow). . name waitCursor applies x groups a type s default watch desc The name of the mouse cursor displayed when %p% is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>. . name werase applies a groups n type s default ^W desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action. . EOF suite3270-3.6/wc3270/resources.inc0000664000076500007650000003113613221577163014632 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ifelse(XX_PRODUCT,c3270,`XX_SH(Screen Size Switching) When running as a 3270 Model 5, XX_FB(c3270) can take advantage of terminals that can switch between 80 and 132 column modes. XX_LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to XX_FB(c3270). These are specified with the XX_FB(XX_DASHED(altscreen)) and XX_FB(XX_DASHED(defscreen)) command-line options, or the XX_FB(altScreen) and XX_FB(defScreen) resources. XX_FB(XX_DASHED(altscreen)) or XX_FB(altScreen) defines the alternate (132-column) mode; XX_FB(XX_DASHED(defscreen)) or XX_FB(defScreen) defines the default (80-column) mode. XX_LP The syntax for the options and resources is XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string), where XX_FI(rows) and XX_FI(cols) give the screen dimensions, and XX_FI(init_string) is the escape sequence to transmit to the terminal to enter that mode. For XX_FB(defscreen), the minimum dimensions are 24 rows and 80 columns. For XX_FB(altscreen), the minimum dimensions are 27 rows and 132 columns. Within XX_FI(init_string), the usual escape sequences are supported (XX_BACKSLASH(E) for escape, XX_BACKSLASH(r), XX_BACKSLASH(b), etc.). For example, the init string for a 132-column xterm is: XX_IP XX_BACKSLASH(E)[?40h`'XX_BACKSLASH(E)[?3h XX_LP Note: When XX_FB(defscreen) and XX_FB(altscreen) are specified, the model number is always set to 5. ')dnl XX_SH(Resources) Certain XX_FB(XX_PRODUCT) options can be configured via resources. Resources are defined ifelse(XX_PRODUCT,c3270,`in the file XX_FB(.c3270pro) in the XX_POSESSIVE(user) home directory, and ')dnl ifelse(XX_PRODUCT,wc3270,`in the session file, or ')dnl by XX_FB(XX_DASHED(xrm)) options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in XX_FB(XX_PRODUCT) are: XX_LP XX_TS(4, l l l l.) XX_TR(XX_TD(Resource) XX_TD(Default) XX_TD(Option) XX_TD(Purpose)) XX_T_() ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(allBold) XX_TD(Auto) XX_TD(XX_DASHED(allbold)) XX_TD(Display all characters bold)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(altScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(altscreen)) XX_TD(132-col screen definition)) ')dnl XX_TR(XX_TD(blankFill) XX_TD(False) XX_TD(XX_DASHED(set) blankFill) XX_TD(Blank Fill mode)) XX_TR(XX_TD(charset) XX_TD(bracket) XX_TD(XX_DASHED(charset)) XX_TD(XX_SM(EBCDIC) character set)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(composeMap) XX_TD(latin1) XX_TD(XX_NBSP) XX_TD(Name of composed-character map)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(consoleColorForHostColor`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForHostColor)`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForDefault)) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForIntensified)) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtected)) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtectedIntensified)) XX_TD(white) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(cursesKeymap) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Set curses keymap option)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(defScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(defscreen)) XX_TD(80-col screen definition)) ')dnl XX_TR(XX_TD(dbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override DBCS CGCSGID)) XX_TR(XX_TD(dsTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Data stream tracing)) XX_TR(XX_TD(eof) XX_TD(^D) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode XX_SM(EOF) character)) XX_TR(XX_TD(erase) XX_TD(^H) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode erase character)) XX_TR(XX_TD(extended) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Use 3270 extended data stream)) XX_TR(XX_TD(eventTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Event tracing)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForDefault) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForIntensified) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtected) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtectedIntensified) XX_TD(neutralWhite) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(hostsFile) XX_TD(XX_NBSP) XX_TD(XX_DASHED(hostsfile)) XX_TD(Host alias/macro file)) ')dnl XX_TR(XX_TD(icrnl) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(CR) to XX_SM(NL) on XX_SM(NVT)-mode input)) XX_TR(XX_TD(inlcr) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(NL) to XX_SM(CR) in XX_SM(NVT)-mode input)) XX_TR(XX_TD(intr) XX_TD(^C) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode interrupt character)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(keymap) XX_TD(XX_NBSP) XX_TD(XX_DASHED(keymap)) XX_TD(Keyboard map name)) XX_TR(XX_TD(keymap.XX_FI(foo)) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Definition of keymap XX_FI(foo))) ')dnl XX_TR(XX_TD(kill) XX_TD(^U) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode kill character)) XX_TR(XX_TD(lineWrap) XX_TD(False) XX_TD(XX_DASHED(set) lineWrap) XX_TD(XX_SM(NVT) line wrap mode)) XX_TR(XX_TD(lnext) XX_TD(^V) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode lnext character)) ifelse(XX_PRODUCT,ws3270,`XX_TR(XX_TD(localCp) XX_TD((system ANSI code page)) XX_TD(XX_DASHED(localcp)) XX_TD(Windows code page for local I/O)) ')dnl XX_TR(XX_TD(m3279) XX_TD(XX_LINK(#rn1,`(note 1)')) XX_TD(XX_DASHED(model)) XX_TD(3279 (color) emulation)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(metaEscape) XX_TD(Auto) XX_TD(XX_NBSP) XX_TD(Interpret ESC-x as Meta-x)) ')dnl ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(marginedPaste) XX_TD(False) XX_TD(XX_DASHED(set) marginedPaste) XX_TD(Keep left margin when pasting)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(mono) XX_TD(XX_LINK(#rn5, `(note 5)')) XX_TD(XX_DASHED(mono)) XX_TD(Ignore terminal color capabilities)) ')dnl XX_TR(XX_TD(monoCase) XX_TD(False) XX_TD(XX_DASHED(set) monoCase) XX_TD(Mono-case mode)) ifelse(XX_MODE,console,`XX_TR(XX_TD(noPrompt) XX_TD(False) XX_TD(XX_DASHED(noprompt)) XX_TD(Disable command-prompt mode)) ')dnl XX_TR(XX_TD(numericLock) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Lock keyboard for numeric field error)) XX_TR(XX_TD(oerrLock) XX_TD(ifelse(XX_PRODUCT,c3270,True,False)) XX_TD(XX_NBSP) XX_TD(Lock keyboard for input error)) ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(overlayPaste) XX_TD(False) XX_TD(XX_DASHED(set) overlayPaste) XX_TD(Overlay protected fields when pasting)) ')dnl XX_TR(XX_TD(oversize) XX_TD(XX_NBSP) XX_TD(XX_DASHED(oversize)) XX_TD(Oversize screen dimensions)) XX_TR(XX_TD(port) XX_TD(telnet) XX_TD(XX_DASHED(port)) XX_TD(Non-default TCP port)) ifelse(XX_MODE,console,`XX_TR(XX_TD(printer.*) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) XX_TR(XX_TD(printerLu) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(printTextFont) XX_TD(Courier New) XX_TD(XX_NBSP) XX_TD(PrintText font name)) XX_TR(XX_TD(printTextSize) XX_TD(8) XX_TD(XX_NBSP) XX_TD(PrintText font size)) ')dnl XX_TR(XX_TD(quit) XX_TD(^XX_BS) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode quit character)) ifelse(XX_MODE,console,`XX_TR(XX_TD(reconnect) XX_TD(False) XX_TD(XX_DASHED(reconnect)) XX_TD(Automatically reconnect to host)) ')dnl XX_TR(XX_TD(rprnt) XX_TD(^R) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode reprint character)) XX_TR(XX_TD(sbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override SBCS CGCSGID)) XX_TR(XX_TD(secure) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable "dangerous" options)) XX_TR(XX_TD(termName) XX_TD(XX_LINK(#rn2,`(note 2)')) XX_TD(XX_DASHED(tn)) XX_TD(XX_SM(TELNET) terminal type string)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(title) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Console window title)) ')dnl ifelse(XX_PLATFORM,windows,,`XX_TR(XX_TD(traceDir) XX_TD(/tmp) XX_TD(XX_NBSP) XX_TD(Directory for trace files)) ')dnl XX_TR(XX_TD(traceFile) XX_TD(XX_LINK(#rn3,`(note 3)')) XX_TD(XX_DASHED(tracefile)) XX_TD(File for trace output)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(typeahead) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Allow typeahead)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(visualBell) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable bell sound)) ')dnl XX_TR(XX_TD(werase) XX_TD(^W) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode word-erase character)) XX_TE() XX_LP XX_RS(`XX_TARGET(rn1)XX_FI(Note 1): XX_FB(m3279) defaults to ifelse(XX_PRODUCT,c3270,`XX_FB(True) if the terminal supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,wc3270,`XX_FB(True). It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,x3270,`XX_FB(True) if the display supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', `XX_FB(False). It can be forced to XX_FB(True) with the proper XX_FB(XX_DASHED(model)) option.') XX_LP XX_TARGET(rn2)XX_FI(Note 2): The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as XX_FB(IBM-3279-2-E). Note also that when XX_SM(TN3270E) mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. XX_LP XX_TARGET(rn3)XX_FI(Note 3): The default trace file is ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(x3trc.)`'XX_FI(pid) in the directory specified by the XX_FB(traceDir) resource'). ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.')' ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn5)XX_FI(Note 5): XX_FB(mono) defaults to XX_FB(false) if the terminal supports at least 8 colors and to XX_FB(true) otherwise.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.' ')dnl ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.' ')) XX_LP ifelse(XX_PRODUCT,c3270,`In XX_FB(.c3270pro), lines are continued with a backslash character. XX_LP XX_FB(XX_DASHED(xrm)) options override definitions found in XX_FB(.c3270pro). ')dnl If more than one XX_FB(XX_DASHED(xrm)) option is given for the same resource, the last one on the command line is used. suite3270-3.6/wc3270/screen.c0000664000076500007650000023632313221577163013555 0ustar pdmpdm/* * Copyright (c) 2000-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * screen.c * A Windows console-based 3270 Terminal Emulator * Screen drawing */ #include "globals.h" #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "ctlr.h" #include "toggles.h" #include "actions.h" #include "cmenubar.h" #include "cscreen.h" #include "cstatus.h" #include "ctlrc.h" #include "glue.h" #include "host.h" #include "keymap.h" #include "kybd.h" #include "lazya.h" #include "macros.h" #include "popups.h" #include "screen.h" #include "see.h" #include "selectc.h" #include "status.h" #include "telnet.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #include "varbuf.h" #include "w3misc.h" #include "wselectc.h" #include "xio.h" #include "xscroll.h" #include #include "winvers.h" #define STATUS_SCROLL_START_MS 1500 #define STATUS_SCROLL_MS 100 #define STATUS_PUSH_MS 5000 #define CM (60*10) /* csec per minute */ #define XTRA_ROWS (1 + 2 * (appres.interactive.menubar == true)) #if !defined(COMMON_LVB_LEAD_BYTE) /*[*/ # define COMMON_LVB_LEAD_BYTE 0x100 #endif /*]*/ #if !defined(COMMON_LVB_TRAILING_BYTE) /*[*/ # define COMMON_LVB_TRAILING_BYTE 0x200 #endif /*]*/ /* Unicode line-drawing characters for crosshair. */ #define LINEDRAW_VERT 0x2502 #define LINEDRAW_CROSS 0x253c #define LINEDRAW_HORIZ 0x2500 #define MAX_COLORS 16 /* * N.B.: F0 "neutral black" means black on a screen (white-on-black device) and * white on a printer (black-on-white device). * F7 "neutral white" means white on a screen (white-on-black device) and * black on a printer (black-on-white device). */ static int cmap_fg[MAX_COLORS] = { 0, /* F0 neutral black */ FOREGROUND_INTENSITY | FOREGROUND_BLUE, /* F1 blue */ FOREGROUND_INTENSITY | FOREGROUND_RED, /* F2 red */ FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE, /* F3 pink */ FOREGROUND_INTENSITY | FOREGROUND_GREEN, /* F4 green */ FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE, /* F5 turquoise */ FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED, /* F6 yellow */ FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE, /* F7 neutral white */ 0, /* F8 black */ FOREGROUND_BLUE, /* F9 deep blue */ FOREGROUND_INTENSITY | FOREGROUND_RED, /* FA orange */ FOREGROUND_RED | FOREGROUND_BLUE, /* FB purple */ FOREGROUND_GREEN, /* FC pale green */ FOREGROUND_GREEN | FOREGROUND_BLUE, /* FD pale turquoise */ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, /* FE gray */ FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, /* FF white */ }; static int cmap_bg[MAX_COLORS] = { 0, /* neutral black */ BACKGROUND_INTENSITY | BACKGROUND_BLUE, /* blue */ BACKGROUND_INTENSITY | BACKGROUND_RED, /* red */ BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE, /* pink */ BACKGROUND_INTENSITY | BACKGROUND_GREEN, /* green */ BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE, /* turquoise */ BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_RED, /* yellow */ BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE, /* neutral white */ 0, /* black */ BACKGROUND_BLUE, /* deep blue */ BACKGROUND_INTENSITY | BACKGROUND_RED, /* orange */ BACKGROUND_RED | BACKGROUND_BLUE, /* purple */ BACKGROUND_GREEN, /* pale green */ BACKGROUND_GREEN | BACKGROUND_BLUE, /* pale turquoise */ BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE, /* gray */ BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE, /* white */ }; static int field_colors[4] = { HOST_COLOR_GREEN, /* default */ HOST_COLOR_RED, /* intensified */ HOST_COLOR_BLUE, /* protected */ HOST_COLOR_NEUTRAL_WHITE /* protected, intensified */ }; static int defattr = 0; static int xhattr = 0; static ioid_t input_id; bool escaped = true; bool isendwin = true; enum ts { TS_AUTO, TS_ON, TS_OFF }; enum ts ab_mode = TS_AUTO; int windows_cp = 0; #if defined(MAYBE_SOMETIME) /*[*/ /* * A bit of a cheat. We know that Windows console attributes are really just * colors, with bits 0-3 for foreground and bits 4-7 for background. That * leaves 8 bits we can play with for our own devious purposes, as long as we * don't accidentally pass one of those bits to Windows. * * The attributes we define are: * WCATTR_UNDERLINE: The character is underlined. Windows does not support * underlining, but we do, by displaying underlined spaces as underscores. * Some people may find this absolutely maddening. */ #endif /*]*/ static CHAR_INFO *onscreen; /* what's on the screen now */ static CHAR_INFO *toscreen; /* what's supposed to be on the screen */ static int onscreen_valid = FALSE; /* is onscreen valid? */ static int status_row = 0; /* Row to display the status line on */ static int status_skip = 0; /* Row to blank above the status line */ static int screen_yoffset = 0; /* Vertical offset to top of screen. If 0, there is no menu bar. If nonzero (2, actually), menu bar is at the top of the display. */ static int rmargin; static void kybd_input(iosrc_t fd, ioid_t id); static void kybd_input2(INPUT_RECORD *ir); static void draw_oia(void); static void status_half_connect(bool ignored); static void status_connect(bool ignored); static void status_3270_mode(bool ignored); static void status_printer(bool on); static int get_color_pair(int fg, int bg); static int color_from_fa(unsigned char fa); static void screen_connect(bool connected); static void set_status_row(int screen_rows, int emulator_rows); static bool ts_value(const char *s, enum ts *tsp); static void relabel(bool ignored); static void init_user_colors(void); static void init_user_attribute_colors(void); static HWND get_console_hwnd(void); static HANDLE chandle; /* console input handle */ static HANDLE cohandle; /* console screen buffer handle */ static HANDLE sbuf; /* dynamically-allocated screen buffer */ HWND console_window; static ctrlc_fn_t ctrlc_fn = NULL; static int console_rows; static int console_cols; static COORD console_max; static int screen_swapped = FALSE; static bool blink_on = true; /* are we displaying them or not? */ static bool blink_ticking = false; /* is the timeout pending? */ static ioid_t blink_id = NULL_IOID; /* timeout ID */ static bool blink_wasticking = false; static void blink_em(ioid_t id); static bool in_focus = true; static int crosshair_color = HOST_COLOR_PURPLE; static char *window_title; static bool selecting; static BOOL cursor_visible = TRUE; static action_t Paste_action; static action_t Redraw_action; static action_t Title_action; static void win32_perror_fatal(const char *fmt, ...) { va_list ap; char *buf; va_start(ap, fmt); buf = xs_vbuffer(fmt, ap); va_end(ap); win32_perror("%s", buf); x3270_exit(1); } /* * Control-C handler registration. */ void screen_set_ctrlc_fn(ctrlc_fn_t fn) { ctrlc_fn = fn; } /* * Console event handler. */ BOOL WINAPI cc_handler(DWORD type) { if (type == CTRL_C_EVENT) { char *action; /* Process it as a Ctrl-C. */ vtrace("Control-C received via Console Event Handler%s\n", escaped? " (should be ignored)": ""); if (escaped) { if (ctrlc_fn) { (*ctrlc_fn)(); } return TRUE; } action = lookup_key(0x03, LEFT_CTRL_PRESSED); if (action != NULL) { if (strcmp(action, "[ignore]")) { push_keymap_action(action); } } else { run_action("Key", IA_DEFAULT, "0x03", NULL); } return TRUE; } else if (type == CTRL_CLOSE_EVENT) { vtrace("Window closed\n"); x3270_exit(0); return TRUE; } else { /* Let Windows have its way with it. */ return FALSE; } } /* * Return the number of rows implied by the given model number. */ static int model_rows(int m) { switch (m) { default: case 2: return MODEL_2_ROWS; case 3: return MODEL_3_ROWS; case 4: return MODEL_4_ROWS; case 5: return MODEL_5_ROWS; } } /* * Return the number of colums implied by the given model number. */ static int model_cols(int m) { switch (m) { default: case 2: return MODEL_2_COLS; case 3: return MODEL_3_COLS; case 4: return MODEL_4_COLS; case 5: return MODEL_5_COLS; } } /* * Resize the newly-created console. * * This function may make the console bigger (if the model number or oversize * requests it) or may make it smaller (if it is larger than what the model * requires). It may also call set_rows_cols() to update other globals derived * from the ov_cols and ov_rows. */ static int resize_console(void) { COORD want_bs; SMALL_RECT sr; bool ov_changed = false; /* * Calculate the rows and columns we want -- start with the * model-number-derived size, increase with oversize, decrease with * the physical limit of the console. */ want_bs.Y = model_rows(model_num) + XTRA_ROWS; if (ov_rows + XTRA_ROWS > want_bs.Y) { want_bs.Y = ov_rows + XTRA_ROWS; } if (console_max.Y && want_bs.Y > console_max.Y) { want_bs.Y = console_max.Y; } want_bs.X = model_cols(model_num); if (ov_cols > want_bs.X) { want_bs.X = ov_cols; } if (console_max.X && want_bs.X > console_max.X) { want_bs.X = console_max.X; } if (want_bs.Y != console_rows || want_bs.X != console_cols) { /* * If we are making anything smaller, we need to shrink the * console window to the least common area first. */ if (want_bs.Y < console_rows || want_bs.X < console_cols) { SMALL_RECT tsr; tsr.Top = 0; if (want_bs.Y < console_rows) { tsr.Bottom = want_bs.Y - 1; } else { tsr.Bottom = console_rows - 1; } tsr.Left = 0; if (want_bs.X < console_cols) { tsr.Right = want_bs.X - 1; } else { tsr.Right = console_cols - 1; } if (SetConsoleWindowInfo(sbuf, TRUE, &tsr) == 0) { win32_perror("SetConsoleWindowInfo(1) failed"); return -1; } } /* Set the console buffer size. */ if (SetConsoleScreenBufferSize(sbuf, want_bs) == 0) { win32_perror("SetConsoleScreenBufferSize failed"); return -1; } /* Set the console window. */ sr.Top = 0; sr.Bottom = want_bs.Y - 1; sr.Left = 0; sr.Right = want_bs.X - 1; if (SetConsoleWindowInfo(sbuf, TRUE, &sr) == 0) { win32_perror("SetConsoleWindowInfo(2) failed"); return -1; } /* Remember the new physical screen dimensions. */ console_rows = want_bs.Y; console_cols = want_bs.X; /* * Calculate new oversize and maximum logical screen * dimensions. * * This gets a bit tricky, because the menu bar and OIA can * disappear if we are constrained by the physical screen, but * we will not turn them off to make oversize fit. */ if (ov_cols > model_cols(model_num)) { if (ov_cols > console_cols) { popup_an_error("Oversize columns (%d) truncated to maximum " "window width (%d)", ov_cols, console_cols); ov_cols = console_cols; ov_changed = true; } } if (ov_rows > model_rows(model_num)) { if (ov_rows + XTRA_ROWS > console_rows) { popup_an_error("Oversize rows (%d) truncated to maximum " "window height (%d) - %d -> %d rows", ov_rows, console_rows, XTRA_ROWS, console_rows - XTRA_ROWS); ov_rows = console_rows - XTRA_ROWS; if (ov_rows <= model_rows(model_num)) { ov_rows = 0; } ov_changed = true; } } } if (ov_changed) { set_rows_cols(model_num, ov_cols, ov_rows); } return 0; } /* * Get a handle for the console. */ static HANDLE initscr(void) { CONSOLE_SCREEN_BUFFER_INFO info; size_t buffer_size; CONSOLE_CURSOR_INFO cursor_info; /* Get a handle to the console. */ chandle = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (chandle == NULL) { win32_perror("CreateFile(CONIN$) failed"); return NULL; } if (SetConsoleMode(chandle, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT) == 0) { win32_perror("SetConsoleMode failed"); return NULL; } cohandle = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (cohandle == NULL) { win32_perror("CreateFile(CONOUT$) failed"); return NULL; } console_window = get_console_hwnd(); /* Get its dimensions. */ if (GetConsoleScreenBufferInfo(cohandle, &info) == 0) { win32_perror("GetConsoleScreenBufferInfo failed"); return NULL; } console_rows = info.srWindow.Bottom - info.srWindow.Top + 1; console_cols = info.srWindow.Right - info.srWindow.Left + 1; /* Get its cursor configuration. */ if (GetConsoleCursorInfo(cohandle, &cursor_info) == 0) { win32_perror("GetConsoleCursorInfo failed"); return NULL; } /* Get its maximum dimensions. */ console_max = GetLargestConsoleWindowSize(cohandle); /* Create the screen buffer. */ sbuf = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); if (sbuf == NULL) { win32_perror("CreateConsoleScreenBuffer failed"); return NULL; } /* Set its dimensions. */ if (!ov_auto) { if (resize_console() < 0) { return NULL; } } /* Define a console handler. */ if (!SetConsoleCtrlHandler(cc_handler, TRUE)) { win32_perror("SetConsoleCtrlHandler failed"); return NULL; } /* Allocate and initialize the onscreen and toscreen buffers. */ buffer_size = sizeof(CHAR_INFO) * console_rows * console_cols; onscreen = (CHAR_INFO *)Malloc(buffer_size); (void) memset(onscreen, '\0', buffer_size); onscreen_valid = FALSE; toscreen = (CHAR_INFO *)Malloc(buffer_size); (void) memset(toscreen, '\0', buffer_size); /* More will no doubt follow. */ return chandle; } /* * Virtual curses functions. */ static int cur_row = 0; static int cur_col = 0; static int cur_attr = 0; static void move(int row, int col) { cur_row = row; cur_col = col; } static void attrset(int a) { cur_attr = a; } static void addch(int c) { CHAR_INFO *ch = &toscreen[(cur_row * console_cols) + cur_col]; /* Save the desired character. */ if (ch->Char.UnicodeChar != c || ch->Attributes != cur_attr) { ch->Char.UnicodeChar = c; ch->Attributes = cur_attr; } /* Increment and wrap. */ if (++cur_col >= console_cols) { cur_col = 0; if (++cur_row >= console_rows) { cur_row = 0; } } } static int mvinch(int y, int x) { move(y, x); return toscreen[(y * console_cols) + x].Char.UnicodeChar; } #define A_CHARTEXT 0xffff #if 0 /* unused for now */ static void printw(char *fmt, ...) { va_list ap; char *buf; size_t sl; WCHAR *wbuf; int nc; int i; va_start(ap, fmt); buf = xs_vbuffer(fmt, ap); va_end(ap); sl = strlen(buf); wbuf = (WCHAR *)Malloc(sl * sizeof(WCHAR)); nc = MultiByteToWideChar(CP_ACP, 0, buf, (int)sl, wbuf, (int)sl); Free(buf); for (i = 0; i < nc; i++) { addch(wbuf[i]); } Free(wbuf); } #endif static void mvprintw(int row, int col, char *fmt, ...) { va_list ap; char *buf; size_t sl; WCHAR *wbuf; int nc; int i; cur_row = row; cur_col = col; va_start(ap, fmt); buf = xs_vbuffer(fmt, ap); va_end(ap); sl = strlen(buf); wbuf = (WCHAR *)Malloc(sl * sizeof(WCHAR)); nc = MultiByteToWideChar(CP_ACP, 0, buf, (int)sl, wbuf, (int)sl); Free(buf); for (i = 0; i < nc; i++) { addch(wbuf[i]); } Free(wbuf); } static int ix(int row, int col) { return (row * console_cols) + col; } static char *done_array = NULL; static void none_done(void) { if (done_array == NULL) { done_array = Malloc(console_rows * console_cols); } memset(done_array, '\0', console_rows * console_cols); } static int is_done(int row, int col) { return done_array[ix(row, col)]; } static void mark_done(int start_row, int end_row, int start_col, int end_col) { int row; for (row = start_row; row <= end_row; row++) { memset(&done_array[ix(row, start_col)], 1, end_col - start_col + 1); } } static int tos_a(int row, int col) { return toscreen[ix(row, col)].Attributes; } /* * Local version of select_changed() that deals in screen coordinates, not * 3270 display buffer coordinates. */ static bool select_changed_s(unsigned row, unsigned col, unsigned rows, unsigned cols) { int row_adj, rows_adj; int cols_adj; /* Adjust for menu bar. */ row_adj = row - screen_yoffset; rows_adj = rows; if (row_adj < 0) { rows_adj += row_adj; row_adj = 0; if (rows_adj <= 0) { return false; } } /* Adjust for overflow at the bottom. */ if (row_adj >= ROWS) { return false; } if (row_adj + rows_adj >= ROWS) { rows_adj = ROWS - row_adj; if (rows_adj <= 0) { return false; } } /* Adjust for overflow at the right. */ if ((int)col >= COLS) { return false; } cols_adj = cols; if ((int)(col + cols_adj) >= COLS) { cols_adj = COLS - col; if (cols_adj <= 0) { return false; } } /* Now see if the area on the 3270 display has changed. */ return select_changed(row_adj, col, rows_adj, cols_adj); } /* * Local version of select_sync() that deals in screen coordinates, not * 3270 display buffer coordinates. */ static void select_sync_s(unsigned row, unsigned col, unsigned rows, unsigned cols) { int row_adj, rows_adj; int cols_adj; /* Adjust for menu bar. */ row_adj = row - screen_yoffset; rows_adj = rows; if (row_adj < 0) { rows_adj -= row_adj; row_adj = 0; if (rows_adj <= 0) { return; } } /* Adjust for overflow at the bottom. */ if (row_adj >= ROWS) { return; } if (row_adj + rows_adj >= ROWS) { rows_adj = ROWS - row_adj; if (rows_adj <= 0) { return; } } /* Adjust for overflow at the right. */ if ((int)col >= COLS) { return; } cols_adj = cols; if ((int)(col + cols_adj) >= COLS) { cols_adj = COLS - col; if (cols_adj <= 0) { return; } } /* Now see if the area on the 3270 display has changed. */ select_sync(row_adj, col, rows_adj, cols_adj); } #if defined(DEBUG_SCREEN_DRAW) /*[*/ static int changed(int row, int col) { return !onscreen_valid || memcmp(&onscreen[ix(row, col)], &toscreen[ix(row, col)], sizeof(CHAR_INFO)) || select_changed_s(row, col, 1, 1); } #endif /*]*/ /* * Draw a rectangle of homogeneous text. */ static void hdraw(int row, int lrow, int col, int lcol) { COORD bufferSize; COORD bufferCoord; SMALL_RECT writeRegion; int xrow; int rc; #if defined(DEBUG_SCREEN_DRAW) /*[*/ /* * Trace what we've been asked to draw. * Drawn areas are 'h', done areas are 'd'. */ { int trow, tcol; vtrace("hdraw row %d-%d col %d-%d attr 0x%x:\n", row, lrow, col, lcol, tos_a(row, col)); for (trow = 0; trow < console_rows; trow++) { for (tcol = 0; tcol < console_cols; tcol++) { if (trow >= row && trow <= lrow && tcol >= col && tcol <= lcol) { vtrace("h"); } else if (is_done(trow, tcol)) { vtrace("d"); } else { vtrace("."); } } vtrace("\n"); } } #endif /*]*/ /* Write it. */ bufferSize.X = console_cols; bufferSize.Y = console_rows; bufferCoord.X = col; bufferCoord.Y = row; writeRegion.Left = col; writeRegion.Top = row; writeRegion.Right = lcol; writeRegion.Bottom = lrow; rc = WriteConsoleOutputW(sbuf, toscreen, bufferSize, bufferCoord, &writeRegion); if (rc == 0) { win32_perror_fatal("WriteConsoleOutput failed"); } /* Sync 'onscreen'. */ for (xrow = row; xrow <= lrow; xrow++) { memcpy(&onscreen[ix(xrow, col)], &toscreen[ix(xrow, col)], sizeof(CHAR_INFO) * (lcol - col + 1)); } select_sync_s(row, col, lrow - row + 1, lcol - col + 1); /* Mark the region as done. */ mark_done(row, lrow, col, lcol); } /* * Draw a rectanglar region from 'toscreen' onto the screen, without regard to * what is already there. * If the attributes for the entire region are the same, we can draw it in * one go; otherwise we will need to break it into little pieces (fairly * stupidly) with common attributes. * When done, copy the region from 'toscreen' to 'onscreen'. */ static void draw_rect(const char *why, int pc_start, int pc_end, int pr_start, int pr_end) { int a; int ul_row, ul_col, xrow, xcol, lr_row, lr_col; #if defined(DEBUG_SCREEN_DRAW) /*[*/ /* * Trace what we've been asked to draw. * Modified areas are 'r', unmodified (excess) areas are 'x'. */ { int trow, tcol; vtrace("draw_rect %s row %d-%d col %d-%d\n", why, pr_start, pr_end, pc_start, pc_end); for (trow = 0; trow < console_rows; trow++) { for (tcol = 0; tcol < console_cols; tcol++) { if (trow >= pr_start && trow <= pr_end && tcol >= pc_start && tcol <= pc_end) { if (changed(trow, tcol)) { vtrace("r"); } else { vtrace("x"); } } else { vtrace("."); } } vtrace("\n"); } } #endif /*]*/ for (ul_row = pr_start; ul_row <= pr_end; ul_row++) { for (ul_col = pc_start; ul_col <= pc_end; ul_col++) { int col_found = 0; if (is_done(ul_row, ul_col)) { continue; } /* * [ul_row,ul_col] is the upper left-hand corner of an * undrawn region. * * Find the the lower right-hand corner of the * rectangle with common attributes. */ a = tos_a(ul_row, ul_col); lr_col = pc_end; lr_row = pr_end; for (xrow = ul_row; !col_found && xrow <= pr_end; xrow++) { if (is_done(xrow, ul_col) || tos_a(xrow, ul_col) != a) { lr_row = xrow - 1; break; } for (xcol = ul_col; xcol <= lr_col; xcol++) { if (is_done(xrow, xcol) || tos_a(xrow, xcol) != a) { lr_col = xcol - 1; lr_row = xrow; col_found = 1; break; } } } if (tos_a(ul_row, ul_col) & COMMON_LVB_LEAD_BYTE) { continue; } hdraw(ul_row, lr_row, ul_col, lr_col); if (tos_a(ul_row, ul_col) & COMMON_LVB_TRAILING_BYTE) { hdraw(ul_row, lr_row, ul_col-1, lr_col-1); } } } } /* * Compare 'onscreen' (what's on the screen right now) with 'toscreen' (what * we want on the screen) and draw what's changed. Hopefully it will be in * a reasonably optimized fashion. * * Windows lets us draw a rectangular areas with one call, provided that the * whole area has the same attributes. We will take advantage of this where * it is relatively easy to figure out, by walking row by row, holding on to * and widening a vertical band of modified columns and drawing only when we * hit a row that needs no modifications. This will cause us to miss some * easy-seeming cases that require recognizing multiple bands per row. */ static void sync_onscreen(void) { int row; int col; int pending = FALSE; /* is there a draw pending? */ int pc_start, pc_end; /* first and last columns in pending band */ int pr_start; /* first row in pending band */ /* Clear out the 'what we've seen' array. */ none_done(); #if defined(DEBUG_SCREEN_DRAW) /*[*/ /* * Trace what's been modified. * Modified areas are 'm'. */ { int trow, tcol; vtrace("sync_onscreen:\n"); for (trow = 0; trow < console_rows; trow++) { for (tcol = 0; tcol < console_cols; tcol++) { if (changed(trow, tcol)) { vtrace("m"); } else { vtrace("."); } } vtrace("\n"); } } #endif /*]*/ #if 0 hdraw(0, console_rows - 1, 0, console_cols - 1); onscreen_valid = TRUE; #endif /* Sometimes you have to draw everything. */ if (!onscreen_valid) { draw_rect("invalid", 0, console_cols - 1, 0, console_rows - 1); onscreen_valid = TRUE; return; } for (row = 0; row < console_rows; row++) { /* Check the whole row for a match first. */ if (!memcmp(&onscreen[ix(row, 0)], &toscreen[ix(row, 0)], sizeof(CHAR_INFO) * console_cols) && !select_changed_s(row, 0, 1, console_cols)) { if (pending) { draw_rect("middle", pc_start, pc_end, pr_start, row - 1); pending = FALSE; } continue; } for (col = 0; col < console_cols; col++) { if (memcmp(&onscreen[ix(row, col)], &toscreen[ix(row, col)], sizeof(CHAR_INFO)) || select_changed_s(row, col, 1, 1)) { /* * This column differs. * Start or expand the band, and start pending. */ if (!pending || col < pc_start) { pc_start = col; } if (!pending || col > pc_end) { pc_end = col; } if (!pending) { pr_start = row; pending = TRUE; } } } } if (pending) { draw_rect("end", pc_start, pc_end, pr_start, console_rows - 1); } } /* * Set the console cursor size. */ static void set_cursor_size(HANDLE handle) { CONSOLE_CURSOR_INFO cci; memset(&cci, 0, sizeof(cci)); cci.bVisible = cursor_visible; if (toggled(ALT_CURSOR)) { cci.dwSize = 25; } else { cci.dwSize = 100; } if (SetConsoleCursorInfo(handle, &cci) == 0) { win32_perror_fatal("\nSetConsoleCursorInfo failed"); } } /* Repaint the screen. */ static void refresh(void) { CONSOLE_SCREEN_BUFFER_INFO info; COORD coord; isendwin = false; /* Draw the differences between 'onscreen' and 'toscreen' into sbuf. */ sync_onscreen(); /* Move the cursor. */ coord.X = cur_col; coord.Y = cur_row; if (onscreen[ix(cur_row, cur_col)].Attributes & COMMON_LVB_TRAILING_BYTE) { coord.X--; } if (GetConsoleScreenBufferInfo(sbuf, &info) == 0) { win32_perror_fatal("\nrefresh: GetConsoleScreenBufferInfo failed"); } if ((info.dwCursorPosition.X != coord.X || info.dwCursorPosition.Y != coord.Y)) { if (SetConsoleCursorPosition(sbuf, coord) == 0) { win32_perror_fatal("\nrefresh: SetConsoleCursorPosition(x=%d,y=%d) " "failed", coord.X, coord.Y); } } /* Swap in this buffer. */ if (screen_swapped == FALSE) { if (SetConsoleActiveScreenBuffer(sbuf) == 0) { win32_perror_fatal("\nSetConsoleActiveScreenBuffer failed"); } screen_swapped = TRUE; } /* Set the cursor size. */ set_cursor_size(sbuf); /* Start blinking again. */ if (blink_wasticking) { blink_wasticking = false; blink_id = AddTimeOut(750, blink_em); } } /* Set the console to 'cooked' mode. */ static void set_console_cooked(void) { if (SetConsoleMode(chandle, ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT) == 0) { win32_perror_fatal("\nSetConsoleMode(CONIN$) failed"); } if (SetConsoleMode(cohandle, ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT) == 0) { win32_perror_fatal("\nSetConsoleMode(CONOUT$) failed"); } } /* Go back to the original screen. */ static void endwin(void) { if (isendwin) { return; } isendwin = true; if (blink_ticking) { RemoveTimeOut(blink_id); blink_id = NULL_IOID; blink_ticking = false; blink_on = true; blink_wasticking = true; } set_console_cooked(); /* Swap in the original buffer. */ if (SetConsoleActiveScreenBuffer(cohandle) == 0) { win32_perror_fatal("\nSetConsoleActiveScreenBuffer failed"); } screen_swapped = FALSE; system("cls"); printf("[wc3270]\n\n"); fflush(stdout); } /* Initialize the screen. */ void screen_init(void) { int want_ov_rows; int want_ov_cols; bool oversize = false; if (appres.interactive.menubar) { menu_init(); } /* Initialize the console. */ if (initscr() == NULL) { (void) fprintf(stderr, "Can't initialize terminal.\n"); x3270_exit(1); } want_ov_rows = ov_rows; want_ov_cols = ov_cols; windows_cp = GetConsoleCP(); /* * Respect the console size we are given. */ while (console_rows < maxROWS || console_cols < maxCOLS) { /* * First, cancel any oversize. This will get us to the correct * model number, if there is any. */ if ((ov_cols && ov_cols > console_cols) || (ov_rows && ov_rows > console_rows)) { ov_cols = 0; ov_rows = 0; oversize = true; } /* If we're at the smallest screen now, give up. */ if (model_num == 2) { (void) fprintf(stderr, "Emulator won't fit on a %dx%d display.\n", console_rows, console_cols); x3270_exit(1); } /* Try a smaller model. */ set_rows_cols(model_num - 1, 0, 0); } /* * Now, if they wanted an oversize, but didn't get it, try applying it * again. */ if (oversize) { if (want_ov_rows > console_rows - 2) { want_ov_rows = console_rows - 2; } if (want_ov_rows < maxROWS) { want_ov_rows = maxROWS; } if (want_ov_cols > console_cols) { want_ov_cols = console_cols; } set_rows_cols(model_num, want_ov_cols, want_ov_rows); } /* * Finally, if they want automatic oversize, see if that's possible. */ if (ov_auto && (maxROWS < console_rows - 3 || maxCOLS < console_cols)) { set_rows_cols(model_num, console_cols, console_rows - 3); } /* Figure out where the status line goes, if it fits. */ /* Start out in altscreen mode. */ set_status_row(console_rows, maxROWS); /* Initialize selections. */ select_init(maxROWS, maxCOLS); /* Set up callbacks for state changes. */ register_schange(ST_CONNECT, screen_connect); register_schange(ST_HALF_CONNECT, status_half_connect); register_schange(ST_CONNECT, status_connect); register_schange(ST_3270_MODE, status_3270_mode); register_schange(ST_PRINTER, status_printer); register_schange(ST_HALF_CONNECT, relabel); register_schange(ST_CONNECT, relabel); register_schange(ST_3270_MODE, relabel); /* See about all-bold behavior. */ if (appres.c3270.all_bold_on) { ab_mode = TS_ON; } else if (!ts_value(appres.c3270.all_bold, &ab_mode)) { (void) fprintf(stderr, "invalid %s value: '%s', assuming 'auto'\n", ResAllBold, appres.c3270.all_bold); } if (ab_mode == TS_AUTO) { ab_mode = appres.m3279? TS_ON: TS_OFF; } /* If the want monochrome, assume they want green. */ /* XXX: I believe that init_user_colors makes this a no-op. */ if (!appres.m3279) { defattr |= FOREGROUND_GREEN; xhattr |= FOREGROUND_GREEN; if (ab_mode == TS_ON) { defattr |= FOREGROUND_INTENSITY; } } /* Pull in the user's color mappings. */ init_user_colors(); init_user_attribute_colors(); /* Set up the controller. */ ctlr_init(ALL_CHANGE); /* Set up the scrollbar. */ scroll_buf_init(); /* Set the window label. */ if (appres.c3270.title != NULL) { screen_title(appres.c3270.title); } else if (profile_name != NULL) { screen_title(profile_name); } else { screen_title("wc3270"); } /* Finish screen initialization. */ set_console_cooked(); } static void screen_connect(bool connected) { static bool initted = false; if (!initted && connected) { initted = true; screen_resume(); } } /* Calculate where the status line goes now. */ static void set_status_row(int screen_rows, int emulator_rows) { if (screen_rows < emulator_rows + 1) { status_row = status_skip = 0; } else if (screen_rows == emulator_rows + 1) { status_skip = 0; status_row = emulator_rows; } else { status_skip = screen_rows - 2; status_row = screen_rows - 1; } /* Then check for menubar room. Use 2 rows, 1 in a pinch. */ if (appres.interactive.menubar) { if (screen_rows >= emulator_rows + (status_row != 0) + 2) { screen_yoffset = 2; } else if (screen_rows >= emulator_rows + (status_row != 0) + 1) { screen_yoffset = 1; } else { screen_yoffset = 0; } } } /* * Parse a tri-state resource value. * Returns true for success, false for failure. */ static bool ts_value(const char *s, enum ts *tsp) { *tsp = TS_AUTO; if (s != NULL && s[0]) { size_t sl = strlen(s); if (!strncasecmp(s, "true", sl)) { *tsp = TS_ON; } else if (!strncasecmp(s, "false", sl)) { *tsp = TS_OFF; } else if (strncasecmp(s, "auto", sl)) { return false; } } return true; } /* Allocate a color pair. */ static int get_color_pair(int fg, int bg) { int mfg = fg & 0xf; int mbg = bg & 0xf; if (mfg >= MAX_COLORS) { mfg = 0; } if (mbg >= MAX_COLORS) { mbg = 0; } return cmap_fg[mfg] | cmap_bg[mbg]; } /* * Initialize the user-specified attribute color mappings. */ static void init_user_attribute_color(int *a, const char *resname) { char *r; unsigned long l; char *ptr; int i; if ((r = get_resource(resname)) == NULL) { return; } for (i = 0; host_color[i].name != NULL; i++) { if (!strcasecmp(r, host_color[i].name)) { *a = host_color[i].index; return; } } l = strtoul(r, &ptr, 0); if (ptr == r || *ptr != '\0' || l >= MAX_COLORS) { xs_warning("Invalid %s value: %s", resname, r); return; } *a = (int)l; } static void init_user_attribute_colors(void) { init_user_attribute_color(&field_colors[0], ResHostColorForDefault); init_user_attribute_color(&field_colors[1], ResHostColorForIntensified); init_user_attribute_color(&field_colors[2], ResHostColorForProtected); init_user_attribute_color(&field_colors[3], ResHostColorForProtectedIntensified); } /* * Map a field attribute to a 3270 color index. * Applies only to m3279 mode -- does not work for mono. */ static int color3270_from_fa(unsigned char fa) { # define DEFCOLOR_MAP(f) \ ((((f) & FA_PROTECT) >> 4) | (((f) & FA_INT_HIGH_SEL) >> 3)) return field_colors[DEFCOLOR_MAP(fa)]; } /* Map a field attribute to its default colors. */ static int color_from_fa(unsigned char fa) { if (appres.m3279) { int fg; fg = color3270_from_fa(fa); return get_color_pair(fg, HOST_COLOR_NEUTRAL_BLACK); } else return FOREGROUND_GREEN | (((ab_mode == TS_ON) || FA_IS_HIGH(fa))? FOREGROUND_INTENSITY: 0) | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; } /* Swap foreground and background colors. */ static int reverse_colors(int a) { int rv = 0; /* Move foreground colors to background colors. */ if (a & FOREGROUND_RED) { rv |= BACKGROUND_RED; } if (a & FOREGROUND_BLUE) { rv |= BACKGROUND_BLUE; } if (a & FOREGROUND_GREEN) { rv |= BACKGROUND_GREEN; } if (a & FOREGROUND_INTENSITY) { rv |= BACKGROUND_INTENSITY; } /* And vice versa. */ if (a & BACKGROUND_RED) { rv |= FOREGROUND_RED; } if (a & BACKGROUND_BLUE) { rv |= FOREGROUND_BLUE; } if (a & BACKGROUND_GREEN) { rv |= FOREGROUND_GREEN; } if (a & BACKGROUND_INTENSITY) { rv |= FOREGROUND_INTENSITY; } return rv; } /* * Set up the user-specified color mappings. */ static void init_user_color(const char *name, int ix) { char *r; unsigned long l; char *ptr; r = get_fresource("%s%s", ResConsoleColorForHostColor, name); if (r == NULL) { r = get_fresource("%s%d", ResConsoleColorForHostColor, ix); } if (r == NULL) { return; } l = strtoul(r, &ptr, 0); if (ptr != r && *ptr == '\0' && l <= 15) { cmap_fg[ix] = (int)l; cmap_bg[ix] = (int)l << 4; return; } xs_warning("Invalid %s value '%s'", ResConsoleColorForHostColor, r); } /* * Crosshair color init. */ static void crosshair_color_init(void) { int c; if (appres.interactive.crosshair_color != NULL) { c = decode_host_color(appres.interactive.crosshair_color); if (c >= 0) { crosshair_color = c; return; } else { xs_warning("Invalid %s: %s", ResCrosshairColor, appres.interactive.crosshair_color); } } crosshair_color = HOST_COLOR_PURPLE; } static void init_user_colors(void) { int i; for (i = 0; host_color[i].name != NULL; i++) { init_user_color(host_color[i].name, host_color[i].index); } if (appres.m3279) { defattr = cmap_fg[HOST_COLOR_NEUTRAL_WHITE] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; crosshair_color_init(); xhattr = cmap_fg[crosshair_color] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; } else { defattr = cmap_fg[HOST_COLOR_PALE_GREEN] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; xhattr = cmap_fg[HOST_COLOR_PALE_GREEN] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; } } /* Invert colors (selections). */ static int invert_colors(int a) { unsigned char fg = a & (FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY); /* * Make the background gray. * If the foreground is gray, make it black. * Otherwise leave it. */ if (fg == FOREGROUND_INTENSITY) { fg = 0; } return (a & ~0xff) | BACKGROUND_INTENSITY | fg; } /* Apply selection status. */ static int apply_select(int attr, int baddr) { if (area_is_selected(baddr, 1)) { return invert_colors(attr); } else { return attr; } } /* * Find the display attributes for a baddr, fa_addr and fa. */ static int calc_attrs(int baddr, int fa_addr, int fa, bool *underlined, bool *blinking) { int fg, bg, gr, a; /* Nondisplay fields are simply blank. */ if (FA_IS_ZERO(fa)) { a = get_color_pair(HOST_COLOR_NEUTRAL_BLACK, HOST_COLOR_NEUTRAL_BLACK); goto done; } /* Compute the color. */ /* Monochrome is easy, and so is color if nothing is specified. */ if (!appres.m3279 || (!ea_buf[baddr].fg && !ea_buf[fa_addr].fg && !ea_buf[baddr].bg && !ea_buf[fa_addr].bg)) { a = color_from_fa(fa); } else { /* The current location or the fa specifies the fg or bg. */ if (ea_buf[baddr].fg) { fg = ea_buf[baddr].fg & 0x0f; } else if (ea_buf[fa_addr].fg) { fg = ea_buf[fa_addr].fg & 0x0f; } else { fg = color3270_from_fa(fa); } if (ea_buf[baddr].bg) { bg = ea_buf[baddr].bg & 0x0f; } else if (ea_buf[fa_addr].bg) { bg = ea_buf[fa_addr].bg & 0x0f; } else { bg = HOST_COLOR_NEUTRAL_BLACK; } a = get_color_pair(fg, bg); } /* Compute the display attributes. */ if (ea_buf[baddr].gr) { gr = ea_buf[baddr].gr; } else if (ea_buf[fa_addr].gr) { gr = ea_buf[fa_addr].gr; } else { gr = 0; } if (!toggled(UNDERSCORE) && appres.m3279 && (gr & (GR_BLINK | GR_UNDERLINE)) && !(gr & GR_REVERSE) && !bg) { a |= BACKGROUND_INTENSITY; } if (!appres.m3279 && ((gr & GR_INTENSIFY) || (ab_mode == TS_ON) || FA_IS_HIGH(fa))) { a |= FOREGROUND_INTENSITY; } if (gr & GR_REVERSE) { a = reverse_colors(a); } if (toggled(UNDERSCORE) && (gr & GR_UNDERLINE)) { *underlined = true; } else { *underlined = false; } if (toggled(UNDERSCORE) && (gr & GR_BLINK)) { *blinking = true; } else { *blinking = false; } done: return a; } /* * Blink timeout handler. */ static void blink_em(ioid_t id _is_unused) { vtrace("blink timeout\n"); /* We're not ticking any more. */ blink_id = NULL_IOID; blink_ticking = false; blink_wasticking = false; /* Swap blink state and redraw the screen. */ blink_on = !blink_on; screen_changed = true; screen_disp(false); } /* * Map a character onto itself or a space, depending on whether it is supposed * to blink and the current global blink state. * Note that blinked-off spaces are underscores, if in underscore mode. * Also sets up the timeout for the next blink if needed. */ static int blinkmap(bool blinking, bool underlined, int c) { if (!blinking) { return c; } if (!blink_ticking) { blink_id = AddTimeOut(500, blink_em); blink_ticking = true; } return blink_on? c: (underlined? '_': ' '); } /* * Return a visible control character for a field attribute. */ static unsigned char visible_fa(unsigned char fa) { static unsigned char varr[32] = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; unsigned ix; /* * This code knows that: * FA_PROTECT is 0b100000, and we map it to 0b010000 * FA_NUMERIC is 0b010000, and we map it to 0b001000 * FA_INTENSITY is 0b001100, and we map it to 0b000110 * FA_MODIFY is 0b000001, and we copy to 0b000001 */ ix = ((fa & (FA_PROTECT | FA_NUMERIC | FA_INTENSITY)) >> 1) | (fa & FA_MODIFY); return varr[ix]; } static int crosshair_blank(int baddr) { if (in_focus && toggled(CROSSHAIR)) { bool same_row = ((baddr / cCOLS) == (cursor_addr / cCOLS)); bool same_col = ((baddr % cCOLS) == (cursor_addr % cCOLS)); if (same_row && same_col) { return LINEDRAW_CROSS; } else if (same_row) { return LINEDRAW_HORIZ; } else if (same_col) { return LINEDRAW_VERT; } } return ' '; } /* Display what's in the buffer. */ void screen_disp(bool erasing _is_unused) { int row, col; int a; bool a_underlined = false; bool a_blinking = false; int c; unsigned char fa; enum dbcs_state d; int fa_addr; /* This may be called when it isn't time. */ if (escaped) { return; } if (!screen_changed) { /* Draw the status line. */ if (status_row) { draw_oia(); } /* Move the cursor. */ if (menu_is_up) { menu_cursor(&row, &col); move(row, col); } else if (flipped) { move((cursor_addr / cCOLS) + screen_yoffset, cCOLS-1 - (cursor_addr % cCOLS)); } else { move((cursor_addr / cCOLS) + screen_yoffset, cursor_addr % cCOLS); } if (status_row) { refresh(); } else { COORD coord; coord.X = cur_col; coord.Y = cur_row; if (onscreen[ix(cur_row, cur_col)].Attributes & COMMON_LVB_TRAILING_BYTE) { coord.X--; } if (SetConsoleCursorPosition(sbuf, coord) == 0) { win32_perror_fatal("\nscreen_disp: " "SetConsoleCursorPosition(x=%d,y=%d) failed", coord.X, coord.Y); } } return; } /* If the menubar is separate, draw it first. */ if (screen_yoffset) { ucs4_t u; bool highlight; unsigned char acs; int norm0, high0; int norm1, high1; if (menu_is_up) { /* * Menu is up. Both rows are white on black for normal, * black on white for highlighted. */ if (menu_is_up & KEYPAD_IS_UP) { high0 = high1 = cmap_fg[HOST_COLOR_NEUTRAL_BLACK] | cmap_bg[HOST_COLOR_NEUTRAL_WHITE]; norm0 = norm1 = cmap_fg[HOST_COLOR_NEUTRAL_WHITE] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; } else { norm0 = cmap_bg[HOST_COLOR_GREY] | cmap_fg[HOST_COLOR_NEUTRAL_BLACK]; high0 = cmap_bg[HOST_COLOR_NEUTRAL_WHITE] | cmap_fg[HOST_COLOR_NEUTRAL_BLACK]; norm1 = cmap_fg[HOST_COLOR_NEUTRAL_WHITE] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]; high1 = cmap_fg[HOST_COLOR_NEUTRAL_BLACK] | cmap_bg[HOST_COLOR_NEUTRAL_WHITE]; } } else { /* * Menu is not up. * Row 0 is a gray-background stripe. * Row 1 has a black background. */ norm0 = high0 = cmap_bg[HOST_COLOR_GREY] | cmap_fg[HOST_COLOR_NEUTRAL_BLACK]; norm1 = high1 = cmap_bg[HOST_COLOR_NEUTRAL_BLACK] | cmap_fg[HOST_COLOR_GREY]; } for (row = 0; row < screen_yoffset; row++) { int norm, high; move(row, 0); if (row) { norm = norm1; high = high1; } else { norm = norm0; high = high0; } for (col = 0; col < cCOLS; col++) { if (menu_char(row, col, true, &u, &highlight, &acs)) { attrset(highlight? high: norm); addch(u); } else { attrset(norm); addch(' '); } } } } fa = get_field_attribute(0); fa_addr = find_field_attribute(0); /* may be -1, that's okay */ a = calc_attrs(fa_addr, fa_addr, fa, &a_underlined, &a_blinking); for (row = 0; row < ROWS; row++) { int baddr; if (!flipped) { move(row + screen_yoffset, 0); } for (col = 0; col < cCOLS; col++) { bool underlined = false; bool blinking = false; bool is_menu = false; ucs4_t u; bool highlight; unsigned char acs; if (flipped) { move(row + screen_yoffset, cCOLS-1 - col); } is_menu = menu_char(row + screen_yoffset, flipped? (cCOLS-1 - col): col, false, &u, &highlight, &acs); if (is_menu) { if (highlight) { attrset(cmap_fg[HOST_COLOR_NEUTRAL_BLACK] | cmap_bg[HOST_COLOR_NEUTRAL_WHITE]); } else { attrset(cmap_fg[HOST_COLOR_NEUTRAL_WHITE] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]); } addch(u); } baddr = row*cCOLS+col; if (ea_buf[baddr].fa) { /* Field attribute. */ fa_addr = baddr; fa = ea_buf[baddr].fa; a = calc_attrs(baddr, baddr, fa, &a_underlined, &a_blinking); if (!is_menu) { if (toggled(VISIBLE_CONTROL)) { attrset(apply_select(cmap_fg[HOST_COLOR_NEUTRAL_BLACK] | cmap_bg[HOST_COLOR_YELLOW], baddr)); addch(visible_fa(fa)); } else { c = crosshair_blank(baddr); if (c != ' ') { attrset(apply_select(xhattr, baddr)); } else { attrset(apply_select(defattr, baddr)); } addch(c); } } } else if (FA_IS_ZERO(fa)) { /* Blank. */ if (!is_menu) { c = crosshair_blank(baddr); if (c == ' ') { attrset(apply_select(a, baddr)); } else { attrset(apply_select(xhattr, baddr)); } addch(c); } } else { int attr_this; if (is_menu) { continue; } /* Normal text. */ if (!(ea_buf[baddr].gr || ea_buf[baddr].fg || ea_buf[baddr].bg)) { attr_this = apply_select(a, baddr); underlined = a_underlined; blinking = a_blinking; } else { int b; bool b_underlined; bool b_blinking; /* * Override some of the field * attributes. */ b = calc_attrs(baddr, fa_addr, fa, &b_underlined, &b_blinking); attr_this = apply_select(b, baddr); underlined = b_underlined; blinking = b_blinking; } d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { int xaddr = baddr; INC_BA(xaddr); if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_null && ea_buf[xaddr].cc == EBC_null) { attrset(apply_select(cmap_fg[HOST_COLOR_NEUTRAL_BLACK] | cmap_bg[HOST_COLOR_YELLOW], baddr)); addch('.'); addch('.'); } else { c = ebcdic_to_unicode( (ea_buf[baddr].cc << 8) | ea_buf[xaddr].cc, CS_BASE, EUO_NONE); attrset(attr_this); cur_attr |= COMMON_LVB_LEAD_BYTE; addch(c); cur_attr &= ~COMMON_LVB_LEAD_BYTE; cur_attr |= COMMON_LVB_TRAILING_BYTE; addch(' '); cur_attr &= ~COMMON_LVB_TRAILING_BYTE; } } else if (!IS_RIGHT(d)) { if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_null) { c = '.'; } else if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_so) { c = '<'; } else if (toggled(VISIBLE_CONTROL) && ea_buf[baddr].cc == EBC_si) { c = '>'; } else { c = ebcdic_to_unicode(ea_buf[baddr].cc, ea_buf[baddr].cs, appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0); if (c == 0) { c = crosshair_blank(baddr); if (c != ' ') { attr_this = apply_select(xhattr, baddr); } } else if (c == ' ' && in_focus && toggled(CROSSHAIR)) { c = crosshair_blank(baddr); if (c != ' ') { attr_this = apply_select(xhattr, baddr); } } if (underlined && c == ' ') { c = '_'; } if (toggled(MONOCASE) && iswlower(c)) { c = towupper(c); } } attrset(attr_this); addch(blinkmap(blinking, underlined, c)); } } } } if (status_row) { draw_oia(); } attrset(defattr); if (flipped) { move((cursor_addr / cCOLS) + screen_yoffset, cCOLS-1 - (cursor_addr % cCOLS)); } else { move((cursor_addr / cCOLS) + screen_yoffset, cursor_addr % cCOLS); } refresh(); screen_changed = FALSE; } static const char * decode_state(int state, bool limited, const char *skip) { char *space = ""; varbuf_t r; vb_init(&r); if (skip == NULL) { skip = ""; } if (state & LEFT_CTRL_PRESSED) { state &= ~LEFT_CTRL_PRESSED; if (strcasecmp(skip, "LeftCtrl")) { vb_appendf(&r, "%sLeftCtrl", space); space = " "; } } if (state & RIGHT_CTRL_PRESSED) { state &= ~RIGHT_CTRL_PRESSED; if (strcasecmp(skip, "RightCtrl")) { vb_appendf(&r, "%sRightCtrl", space); space = " "; } } if (state & LEFT_ALT_PRESSED) { state &= ~LEFT_ALT_PRESSED; if (strcasecmp(skip, "LeftAlt")) { vb_appendf(&r, "%sLeftAlt", space); space = " "; } } if (state & RIGHT_ALT_PRESSED) { state &= ~RIGHT_ALT_PRESSED; if (strcasecmp(skip, "RightAlt")) { vb_appendf(&r, "%sRightAlt", space); space = " "; } } if (state & SHIFT_PRESSED) { state &= ~SHIFT_PRESSED; if (strcasecmp(skip, "Shift")) { vb_appendf(&r, "%sShift", space); space = " "; } } if (state & NUMLOCK_ON) { state &= ~NUMLOCK_ON; if (!limited) { vb_appendf(&r, "%sNumLock", space); space = " "; } } if (state & SCROLLLOCK_ON) { state &= ~SCROLLLOCK_ON; if (!limited) { vb_appendf(&r, "%sScrollLock", space); space = " "; } } if (state & ENHANCED_KEY) { state &= ~ENHANCED_KEY; if (!limited) { vb_appendf(&r, "%sEnhanced", space); space = " "; } } if (state & !limited) { vb_appendf(&r, "%s?0x%x", space, state); } if (vb_len(&r) == 0) { vb_free(&r); return "none"; } return lazya(vb_consume(&r)); } /* Handle mouse events. */ static void handle_mouse_event(MOUSE_EVENT_RECORD *me) { int x, y; int row, col; select_event_t event; bool is_alt; x = me->dwMousePosition.X; y = me->dwMousePosition.Y; /* Check for menu selection. */ if (menu_is_up) { if (me->dwEventFlags == 0 && me->dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) { menu_click(x, y); } return; } /* Check for menu pop-up. */ if (screen_yoffset && y == 0) { if (me->dwEventFlags == 0 && me->dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) { popup_menu(x, (screen_yoffset != 0)); screen_disp(false); return; } } /* Check for SSL pop-up. */ if (me->dwEventFlags == 0 && me->dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && status_row && x == rmargin - 28 && y == status_row) { run_action("Show", IA_DEFAULT, "Stats", NULL); return; } /* Figure out what sort of event it is. */ if ((me->dwEventFlags & DOUBLE_CLICK) && (me->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)) { event = SE_DOUBLE_CLICK; } else if (me->dwEventFlags & MOUSE_MOVED) { event = SE_MOVE; } else if (me->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) { event = SE_BUTTON_DOWN; } else if (me->dwButtonState & RIGHTMOST_BUTTON_PRESSED) { event = SE_RIGHT_BUTTON_DOWN; } else if (me->dwButtonState & (FROM_LEFT_2ND_BUTTON_PRESSED | FROM_LEFT_3RD_BUTTON_PRESSED | FROM_LEFT_4TH_BUTTON_PRESSED)) { /* We only are about left and right button-down events. */ return; } else { event = SE_BUTTON_UP; } /* * Check for out of bounds. * * Some events we just ignore, but others we map to the edge of the * display. */ if ((x >= COLS) || (y - screen_yoffset < 0) || (y - screen_yoffset >= ROWS)) { if (event != SE_MOVE && event != SE_BUTTON_UP) { return; } if (x >= COLS) { x = COLS - 1; } if (y - screen_yoffset < 0) { y = screen_yoffset; } if (y - screen_yoffset >= ROWS) { y = screen_yoffset + ROWS - 1; } } /* Compute the buffer coordinates. */ row = y - screen_yoffset; if (flipped) { col = COLS - x; } else { col = x; } /* * Check for lightpen select. * * The lightPenPrimary resource controls the meaning of left-click with and * without the Alt key: * * lightPenSelect * Event false true * --------------- ---------------- ----------------- * Left-click Cursor move Lightpen select * or copy/select * * Alt-Left-click Lightpen select Cursor move * or copy/select */ is_alt = (me->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) != 0; if (appres.c3270.lightpen_primary? !is_alt: is_alt) { if (event == SE_BUTTON_DOWN) { vtrace(" lightpen select\n"); lightpen_select((row * COLS) + col); } return; } /* * Pass it to the selection logic. If the event is not consumed, treat * it as a cursor move. */ if (!select_event(row, col, event, (me->dwControlKeyState & SHIFT_PRESSED) != 0)) { vtrace(" cursor move\n"); cursor_move((row * COLS) + col); } } typedef struct { const char *name; unsigned flag; } decode_t; static decode_t decode_button_state[] = { { "left1", FROM_LEFT_1ST_BUTTON_PRESSED }, { "left2", FROM_LEFT_2ND_BUTTON_PRESSED }, { "left3", FROM_LEFT_3RD_BUTTON_PRESSED }, { "left4", FROM_LEFT_4TH_BUTTON_PRESSED }, { "right", RIGHTMOST_BUTTON_PRESSED }, { NULL, 0 } }; static decode_t decode_control_key_state[] = { { "capsLock", CAPSLOCK_ON }, { "enhanced", ENHANCED_KEY }, { "leftAlt", LEFT_ALT_PRESSED }, { "leftCtrl", LEFT_CTRL_PRESSED }, { "numLock", NUMLOCK_ON }, { "rightAlt", RIGHT_ALT_PRESSED }, { "rightCtrl", RIGHT_CTRL_PRESSED }, { "scrollLock", SCROLLLOCK_ON }, { "shift", SHIFT_PRESSED }, { NULL, 0 } }; static decode_t decode_event_flags[] = { { "doubleClick", DOUBLE_CLICK }, #if defined(MOUSE_HWHEELED) /*[*/ { "mouseHwheeled", MOUSE_HWHEELED }, #endif /*]*/ { "mouseMoved", MOUSE_MOVED }, { "mouseWheeled", MOUSE_WHEELED }, { NULL, 0 } }; /* Mouse event decoders. */ static const char * decode_mflags(DWORD flags, decode_t names[]) { unsigned f = flags; varbuf_t r; int i; bool any = false; vb_init(&r); vb_appendf(&r, "0x%x", (unsigned)f); for (i = 0; names[i].name != NULL; i++) { if (f & names[i].flag) { vb_appendf(&r, "%s%s", any? "|": " ", names[i].name); f &= ~names[i].flag; any = true; } } if (f != 0 && f != flags) { vb_appendf(&r, "%s0x%x", any? "|": " ", f); } return lazya(vb_consume(&r)); } /* Keyboard input. */ static void kybd_input(iosrc_t fd _is_unused, ioid_t id _is_unused) { int rc; INPUT_RECORD ir; DWORD nr; const char *s; /* Get the next input event. */ rc = ReadConsoleInputW(chandle, &ir, 1, &nr); if (rc == 0) { win32_perror_fatal("ReadConsoleInput failed"); } if (nr == 0) { return; } switch (ir.EventType) { case FOCUS_EVENT: vtrace("Focus %s\n", ir.Event.FocusEvent.bSetFocus? "set": "unset"); /* * When we get a focus event, the system may have (incorrectly) redrawn * our window. Do it again ourselves. * * We also want to redraw to get the crosshair cursor to appear or * disappear. */ in_focus = (ir.Event.FocusEvent.bSetFocus == TRUE); screen_changed = true; screen_disp(false); break; case KEY_EVENT: if (!ir.Event.KeyEvent.bKeyDown) { return; } s = lookup_cname(ir.Event.KeyEvent.wVirtualKeyCode << 16); if (s == NULL) { s = "?"; } vtrace("Key%s vkey 0x%x (%s) scan 0x%x char U+%04x state 0x%x (%s)\n", ir.Event.KeyEvent.bKeyDown? "Down": "Up", ir.Event.KeyEvent.wVirtualKeyCode, s, ir.Event.KeyEvent.wVirtualScanCode, ir.Event.KeyEvent.uChar.UnicodeChar, (int)ir.Event.KeyEvent.dwControlKeyState, decode_state(ir.Event.KeyEvent.dwControlKeyState, false, NULL)); if (!ir.Event.KeyEvent.bKeyDown) { return; } kybd_input2(&ir); break; case MENU_EVENT: vtrace("Menu\n"); break; case MOUSE_EVENT: vtrace("Mouse (%d,%d) ButtonState %s " "ControlKeyState %s EventFlags %s\n", ir.Event.MouseEvent.dwMousePosition.X, ir.Event.MouseEvent.dwMousePosition.Y, decode_mflags(ir.Event.MouseEvent.dwButtonState, decode_button_state), decode_mflags(ir.Event.MouseEvent.dwControlKeyState, decode_control_key_state), decode_mflags(ir.Event.MouseEvent.dwEventFlags, decode_event_flags)); handle_mouse_event(&ir.Event.MouseEvent); break; case WINDOW_BUFFER_SIZE_EVENT: vtrace("WindowBufferSize\n"); break; default: vtrace("Unknown input event %d\n", ir.EventType); break; } } static void trace_as_keymap(unsigned long xk, KEY_EVENT_RECORD *e) { const char *s; varbuf_t r; vb_init(&r); vb_appendf(&r, "[xk 0x%lx] ", xk); s = decode_state(e->dwControlKeyState, true, NULL); if (strcmp(s, "none")) { vb_appendf(&r, "%s ", s); } if (xk & 0xffff0000) { const char *n = lookup_cname(xk); vb_appendf(&r, "%s", n? n: "???"); } else if (xk > 0x7f) { wchar_t w = (wchar_t)xk; char c; BOOL udc = FALSE; /* * Translate to the ANSI codepage for storage in the trace * file. It will be converted to OEM by 'catf' for display * in the trace window. */ (void) WideCharToMultiByte(CP_ACP, 0, &w, 1, &c, 1, "?", &udc); if (udc) { vb_appendf(&r, "U+%04lx", xk); } else { vb_appendf(&r, "%c", (unsigned char)xk); } } else if (xk < ' ') { /* assume dwControlKeyState includes Ctrl... */ vb_appendf(&r, "%c", (unsigned char)xk + '@'); } else if (xk == ' ') { vb_appendf(&r, "space"); } else if (xk == ':') { vb_appendf(&r, "colon"); } else { vb_appendf(&r, "%c", (unsigned char)xk); } vtrace(" %s ->", lazya(vb_consume(&r))); } /* Translate a Windows virtual key to a menubar abstract key. */ static menu_key_t key_to_mkey(int k) { switch (k) { case VK_UP: return MK_UP; case VK_DOWN: return MK_DOWN; case VK_LEFT: return MK_LEFT; case VK_RIGHT: return MK_RIGHT; case VK_HOME: return MK_HOME; case VK_END: return MK_END; case VK_RETURN: return MK_ENTER; case 0: return MK_NONE; default: return MK_OTHER; } } static void kybd_input2(INPUT_RECORD *ir) { int k; unsigned long xk; char *action; /* First see if this is a select/copy completion. */ if (ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN && select_return_key()) { return; } /* * Translate the INPUT_RECORD into an integer we can match keymaps * against. * * If VK and ASCII are the same and are a control char, use VK. * If VK is 0x6x, use VK. These are aliases like ADD and NUMPAD0. * Otherwise, if there's Unicode, use it. * Otherwise, use VK. */ if ((ir->Event.KeyEvent.wVirtualKeyCode == ir->Event.KeyEvent.uChar.AsciiChar) && ir->Event.KeyEvent.wVirtualKeyCode < ' ') { xk = (ir->Event.KeyEvent.wVirtualKeyCode << 16) & 0xffff0000; } else if ((ir->Event.KeyEvent.wVirtualKeyCode & 0xf0) == 0x60) { xk = (ir->Event.KeyEvent.wVirtualKeyCode << 16) & 0xffff0000; } else if (ir->Event.KeyEvent.uChar.UnicodeChar) { xk = ir->Event.KeyEvent.uChar.UnicodeChar; } else if (ir->Event.KeyEvent.wVirtualKeyCode >= 0x30 && ir->Event.KeyEvent.wVirtualKeyCode <= 0x5a) { xk = ir->Event.KeyEvent.wVirtualKeyCode; } else { xk = (ir->Event.KeyEvent.wVirtualKeyCode << 16) & 0xffff0000; } if (menu_is_up) { menu_key(key_to_mkey(xk >> 16), xk & 0xffff); return; } if (xk) { trace_as_keymap(xk, &ir->Event.KeyEvent); action = lookup_key(xk, ir->Event.KeyEvent.dwControlKeyState); if (action != NULL) { if (strcmp(action, "[ignore]")) { push_keymap_action(action); } return; } } ia_cause = IA_DEFAULT; k = ir->Event.KeyEvent.wVirtualKeyCode; /* These first cases apply to both 3270 and NVT modes. */ switch (k) { case VK_ESCAPE: run_action("Escape", IA_DEFAULT, NULL, NULL); return; case VK_UP: run_action("Up", IA_DEFAULT, NULL, NULL); return; case VK_DOWN: run_action("Down", IA_DEFAULT, NULL, NULL); return; case VK_LEFT: run_action("Left", IA_DEFAULT, NULL, NULL); return; case VK_RIGHT: run_action("Right", IA_DEFAULT, NULL, NULL); return; case VK_HOME: run_action("Home", IA_DEFAULT, NULL, NULL); return; default: break; } /* Then look for 3270-only cases. */ if (IN_3270) { switch(k) { /* These cases apply only to 3270 mode. */ case VK_TAB: run_action("Tab", IA_DEFAULT, NULL, NULL); return; case VK_DELETE: run_action("Delete", IA_DEFAULT, NULL, NULL); return; case VK_BACK: run_action("BackSpace", IA_DEFAULT, NULL, NULL); return; case VK_RETURN: run_action("Enter", IA_DEFAULT, NULL, NULL); return; default: break; } } /* Catch PF keys. */ if (k >= VK_F1 && k <= VK_F24) { run_action("PF", IA_DEFAULT, lazyaf("%d", k - VK_F1 + 1), NULL); return; } /* Then any other character. */ if (ir->Event.KeyEvent.uChar.UnicodeChar) { run_action("Key", IA_DEFAULT, lazyaf("U+%04x", ir->Event.KeyEvent.uChar.UnicodeChar), NULL); } else { vtrace(" dropped (no default)\n"); } } bool screen_suspend(void) { static bool need_to_scroll = false; if (!isendwin) { endwin(); } if (!escaped) { escaped = true; if (need_to_scroll) { printf("\n"); } else { need_to_scroll = true; } RemoveInput(input_id); } return false; } /* * Get mouse events back after calling system(), which apparently cancels them. */ void screen_system_fixup(void) { if (!escaped) { if (SetConsoleMode(chandle, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT) == 0) { win32_perror("SetConsoleMode failed"); } } } void screen_resume(void) { escaped = false; screen_disp(false); onscreen_valid = FALSE; refresh(); input_id = AddInput(chandle, kybd_input); if (SetConsoleMode(chandle, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT) == 0) { win32_perror("SetConsoleMode failed"); } } void cursor_move(int baddr) { cursor_addr = baddr; if (in_focus && toggled(CROSSHAIR)) { screen_changed = true; screen_disp(false); } } static void toggle_altCursor(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { if (!isendwin) { set_cursor_size(sbuf); } } static void toggle_monocase(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_changed = true; screen_disp(false); } static void toggle_underscore(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_changed = true; screen_disp(false); } static void toggle_crosshair(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_changed = true; screen_disp(false); } /** * Toggle timing display. */ static void toggle_showTiming(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { if (!toggled(SHOW_TIMING)) { status_untiming(); } } static void toggle_visibleControl(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { screen_changed = true; screen_disp(false); } /* Status line stuff. */ static bool status_ta = false; static bool status_rm = false; static bool status_im = false; static enum { SS_INSECURE, SS_UNVERIFIED, SS_SECURE } status_secure = SS_INSECURE; static bool oia_boxsolid = false; static bool oia_undera = true; static bool oia_compose = false; static bool oia_printer = false; static unsigned char oia_compose_char = 0; static enum keytype oia_compose_keytype = KT_STD; #define LUCNT 8 static char oia_lu[LUCNT+1]; static char oia_timing[6]; /* :ss.s*/ static char oia_screentrace = ' '; static char *status_msg = "X Not Connected"; static char *saved_status_msg = NULL; static ioid_t saved_status_timeout = NULL_IOID; static ioid_t oia_scroll_timeout = NULL_IOID; static void cancel_status_push(void) { saved_status_msg = NULL; if (saved_status_timeout != NULL_IOID) { RemoveTimeOut(saved_status_timeout); saved_status_timeout = NULL_IOID; } if (oia_scroll_timeout != NULL_IOID) { RemoveTimeOut(oia_scroll_timeout); oia_scroll_timeout = NULL_IOID; } } void status_ctlr_done(void) { oia_undera = true; } void status_insert_mode(bool on) { status_im = on; } static void status_pop(ioid_t id _is_unused) { status_msg = saved_status_msg; saved_status_msg = NULL; saved_status_timeout = NULL_IOID; } static void oia_scroll(ioid_t id _is_unused) { status_msg++; if (strlen(status_msg) > 35) { oia_scroll_timeout = AddTimeOut(STATUS_SCROLL_MS, oia_scroll); } else { saved_status_timeout = AddTimeOut(STATUS_PUSH_MS, status_pop); oia_scroll_timeout = NULL_IOID; } } void status_push(char *msg) { if (saved_status_msg != NULL) { /* Already showing something. */ RemoveTimeOut(saved_status_timeout); saved_status_timeout = NULL_IOID; } else { saved_status_msg = status_msg; } status_msg = msg; if (strlen(msg) > 35) { oia_scroll_timeout = AddTimeOut(STATUS_SCROLL_START_MS, oia_scroll); } else { saved_status_timeout = AddTimeOut(STATUS_PUSH_MS, status_pop); } } void status_minus(void) { cancel_status_push(); status_msg = "X -f"; } void status_oerr(int error_type) { cancel_status_push(); switch (error_type) { case KL_OERR_PROTECTED: status_msg = "X Protected"; break; case KL_OERR_NUMERIC: status_msg = "X Numeric"; break; case KL_OERR_OVERFLOW: status_msg = "X Overflow"; break; } } void status_reset(void) { cancel_status_push(); if (!CONNECTED) { status_msg = "X Not Connected"; } else if (kybdlock & KL_ENTER_INHIBIT) { status_msg = "X Inhibit"; } else if (kybdlock & KL_DEFERRED_UNLOCK) { status_msg = "X"; } else { status_msg = ""; } } void status_reverse_mode(bool on) { status_rm = on; } void status_syswait(void) { cancel_status_push(); status_msg = "X SYSTEM"; } void status_twait(void) { cancel_status_push(); oia_undera = false; status_msg = "X Wait"; } void status_typeahead(bool on) { status_ta = on; } void status_compose(bool on, unsigned char c, enum keytype keytype) { oia_compose = on; oia_compose_char = c; oia_compose_keytype = keytype; } void status_lu(const char *lu) { if (lu != NULL) { (void) strncpy(oia_lu, lu, LUCNT); oia_lu[LUCNT] = '\0'; } else { (void) memset(oia_lu, '\0', sizeof(oia_lu)); } } static void status_half_connect(bool half_connected) { if (half_connected) { /* Push the 'Connecting' status under whatever is popped up. */ if (saved_status_msg != NULL) { saved_status_msg = "X Connecting"; } else { status_msg = "X Connecting"; } oia_boxsolid = false; status_secure = SS_INSECURE; } } static void status_connect(bool connected) { cancel_status_push(); if (connected) { oia_boxsolid = IN_3270 && !IN_SSCP; if (kybdlock & KL_AWAITING_FIRST) { status_msg = "X"; } else { status_msg = ""; } if (net_secure_connection()) { if (net_secure_unverified()) { status_secure = SS_UNVERIFIED; } else { status_secure = SS_SECURE; } } else { status_secure = SS_INSECURE; } } else { oia_boxsolid = false; status_msg = "X Not Connected"; status_secure = SS_INSECURE; } } static void status_3270_mode(bool ignored _is_unused) { oia_boxsolid = IN_3270 && !IN_SSCP; if (oia_boxsolid) { oia_undera = true; } } static void status_printer(bool on) { oia_printer = on; } void status_timing(struct timeval *t0, struct timeval *t1) { static char no_time[] = ":??.?"; if (t1->tv_sec - t0->tv_sec > (99*60)) { strcpy(oia_timing, no_time); } else { unsigned long cs; /* centiseconds */ cs = (t1->tv_sec - t0->tv_sec) * 10 + (t1->tv_usec - t0->tv_usec + 50000) / 100000; if (cs < CM) { (void) sprintf(oia_timing, ":%02ld.%ld", cs / 10, cs % 10); } else { (void) sprintf(oia_timing, "%02ld:%02ld", cs / CM, (cs % CM) / 10); } } } void status_untiming(void) { oia_timing[0] = '\0'; } void status_scrolled(int n) { static char ssbuf[128]; cancel_status_push(); if (n) { snprintf(ssbuf, sizeof(ssbuf), "X Scrolled %d", n); status_msg = ssbuf; } else { status_msg = ""; } } void status_screentrace(int n) { if (n < 0) { oia_screentrace = ' '; } else if (n < 9) { oia_screentrace = "123456789"[n]; } else { oia_screentrace = '+'; } } void status_script(bool on _is_unused) { /* for now, nothing */ } static void draw_oia(void) { int i, j; int cursor_col = (cursor_addr % cCOLS); int fl_cursor_col = flipped? (console_cols - 1 - cursor_col): cursor_col; int oia_attr = appres.m3279 ? (cmap_fg[HOST_COLOR_GREY] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]): defattr; rmargin = maxCOLS - 1; /* Extend or erase the crosshair. */ attrset(xhattr); if (in_focus && toggled(CROSSHAIR)) { if (!menu_is_up && (mvinch(0, fl_cursor_col) & A_CHARTEXT) == ' ') { attrset(cmap_fg[crosshair_color] | cmap_bg[HOST_COLOR_GREY]); addch(LINEDRAW_VERT); attrset(xhattr); } if (screen_yoffset > 1 && (mvinch(1, fl_cursor_col) & A_CHARTEXT) == ' ') { addch(LINEDRAW_VERT); } } for (i = ROWS + screen_yoffset; i < status_row; i++) { for (j = 0; j < maxCOLS; j++) { move(i, j); if (in_focus && toggled(CROSSHAIR) && (j == fl_cursor_col)) { addch(LINEDRAW_VERT); } else { addch(' '); } } } for (i = 0; i < ROWS; i++) { for (j = cCOLS; j < maxCOLS; j++) { move(i + screen_yoffset, j); if (in_focus && toggled(CROSSHAIR) && i == (cursor_addr / cCOLS)) { addch(LINEDRAW_HORIZ); } else { addch(' '); } } } /* Make sure the status line region is filled in properly. */ attrset(defattr); move(maxROWS + screen_yoffset, 0); for (i = maxROWS + screen_yoffset; i < status_row; i++) { for (j = 0; j <= rmargin; j++) { addch(' '); } } move(status_row, 0); attrset(defattr); for (i = 0; i <= rmargin; i++) { addch(' '); } /* Offsets 0, 1, 2 */ if (appres.m3279) { attrset(cmap_fg[HOST_COLOR_NEUTRAL_BLACK] | cmap_bg[HOST_COLOR_GREY]); } else { attrset(reverse_colors(defattr)); } mvprintw(status_row, 0, "4"); if (oia_undera) { addch(IN_E? 'B': 'A'); } else { addch(' '); } if (IN_NVT) { addch('N'); } else if (oia_boxsolid) { addch(' '); } else if (IN_SSCP) { addch('S'); } else { addch('?'); } /* Offset 8 */ attrset(oia_attr); mvprintw(status_row, 8, "%-35.35s", status_msg); mvprintw(status_row, rmargin-35, "%c%c %c%c%c%c", oia_compose? 'C': ' ', oia_compose? oia_compose_char: ' ', status_ta? 'T': ' ', status_rm? 'R': ' ', status_im? 'I': ' ', oia_printer? 'P': ' '); if (status_secure != SS_INSECURE) { attrset(cmap_fg[(status_secure == SS_SECURE)? HOST_COLOR_GREEN: HOST_COLOR_YELLOW] | cmap_bg[HOST_COLOR_NEUTRAL_BLACK]); addch('S'); attrset(oia_attr); } else { addch(' '); } addch(oia_screentrace); mvprintw(status_row, rmargin-25, "%s", oia_lu); if (toggled(SHOW_TIMING)) { mvprintw(status_row, rmargin-14, "%s", oia_timing); } if (toggled(CURSOR_POS)) { mvprintw(status_row, rmargin-7, "%03d/%03d", cursor_addr/cCOLS + 1, cursor_addr%cCOLS + 1); } /* Now fill in the crosshair cursor in the status line. */ if (in_focus && toggled(CROSSHAIR) && cursor_col > 2 && (mvinch(status_row, fl_cursor_col) & A_CHARTEXT) == ' ') { attrset(xhattr); addch(LINEDRAW_VERT); } } static bool Redraw_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Redraw", ia, argc, argv); if (check_argc("Redraw", argc, 0, 0) < 0) { return false; } if (!escaped) { onscreen_valid = FALSE; refresh(); } return true; } void ring_bell(void) { static enum { BELL_NOTHING = 0, /* do nothing */ BELL_KNOWN = 0x1, /* have we decoded the option? */ BELL_BEEP = 0x2, /* ring the annoying console bell */ BELL_FLASH = 0x4 /* flash the screen or icon */ } bell_mode = 0; if (!(bell_mode & BELL_KNOWN)) { if (appres.c3270.bell_mode != NULL) { /* * New config: wc3270.bellMode * none do nothing * beep just beep * flash just flash * beepFlash beep and flash * flashBeep beep and flash * anything else do nothing */ if (!strcasecmp(appres.c3270.bell_mode, "none")) { bell_mode = BELL_NOTHING; } else if (!strcasecmp(appres.c3270.bell_mode, "beep")) { bell_mode = BELL_BEEP; } else if (!strcasecmp(appres.c3270.bell_mode, "flash")) { bell_mode = BELL_FLASH; } else if (!strcasecmp(appres.c3270.bell_mode, "beepFlash") || !strcasecmp(appres.c3270.bell_mode, "flashBeep")) { bell_mode = BELL_BEEP | BELL_FLASH; } else { /* * Should cough up a warning here, but it's * a bit late. */ bell_mode = BELL_NOTHING; } } else if (appres.interactive.visual_bell) { /* * Old config: wc3270.visualBell * true just flash * false beep and flash */ bell_mode = BELL_FLASH; } else { /* * No config: beep and flash. */ bell_mode = BELL_BEEP | BELL_FLASH; } /* In any case, only do this once. */ bell_mode |= BELL_KNOWN; } if ((bell_mode & BELL_FLASH) && console_window != NULL) { FLASHWINFO w; memset(&w, '\0', sizeof(FLASHWINFO)); w.cbSize = sizeof(FLASHWINFO); w.hwnd = console_window; w.dwFlags = FLASHW_ALL; w.uCount = 2; w.dwTimeout = 250; /* 1/4s */ FlashWindowEx(&w); } if (bell_mode & BELL_BEEP) { MessageBeep(-1); } } void screen_flip(void) { flipped = !flipped; screen_changed = true; screen_disp(false); } /* * Windows-specific Paste action, that takes advantage of the existing x3270 * instrastructure for multi-line paste. */ static bool Paste_action(ia_t ia, unsigned argc, const char **argv) { HGLOBAL hglb; LPTSTR lptstr; UINT format = CF_UNICODETEXT; action_debug("Paste", ia, argc, argv); if (check_argc("Paste", argc, 0, 0) < 0) { return false; } if (!IsClipboardFormatAvailable(format)) { return false; } if (!OpenClipboard(NULL)) { return false; } hglb = GetClipboardData(format); if (hglb != NULL) { lptstr = GlobalLock(hglb); if (lptstr != NULL) { int sl = 0; wchar_t *w = (wchar_t *)lptstr; ucs4_t *u; ucs4_t *us; int i; for (i = 0; *w != 0x0000; i++, w++) { sl++; } us = u = Malloc(sl * sizeof(ucs4_t)); /* * Expand from UCS-2 to UCS-4. * XXX: It isn't UCS-2, it's UTF-16. */ w = (wchar_t *)lptstr; for (i = 0; i < sl; i++) { *us++ = *w++; } emulate_uinput(u, sl, true); Free(u); } GlobalUnlock(hglb); } CloseClipboard(); return true; } /* Set the window title. */ static void set_console_title(const char *text, bool selecting) { if (selecting) { (void) SetConsoleTitle(lazyaf("%s [select]", text)); } else { (void) SetConsoleTitle(text); } } void screen_title(const char *text) { Replace(window_title, NewString(text)); set_console_title(text, selecting); } static bool Title_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Title", ia, argc, argv); if (check_argc("Title", argc, 1, 1) < 0) { return false; } screen_title(argv[0]); return true; } static void relabel(bool ignored _is_unused) { if (appres.c3270.title != NULL) { return; } if (PCONNECTED) { char *hostname; if (profile_name != NULL) { hostname = profile_name; } else { hostname = reconnect_host; } screen_title(lazyaf("%s - wc3270", hostname)); } else { screen_title("wc3270"); } } /** * Callback for changes in screen selection state. * * @param[in] selecting true if selection in progress */ static void screen_selecting_changed(bool now_selecting) { selecting = now_selecting; set_console_title(window_title? window_title: "wc3270", selecting); } /* Get the window handle for the console. */ static HWND get_console_hwnd(void) { # define MY_BUFSIZE 1024 /* buffer size for console window titles */ HWND hwnd_found; /* returned to the caller */ char new_window_title[MY_BUFSIZE]; /* fabricated WindowTitle */ char old_window_title[MY_BUFSIZE]; /* original WindowTitle */ /* Fetch current window title. */ GetConsoleTitle(old_window_title, MY_BUFSIZE); /* Format a "unique" NewWindowTitle. */ wsprintf(new_window_title, "%d/%d", GetTickCount(), GetCurrentProcessId()); /* Change current window title. */ SetConsoleTitle(new_window_title); /* Ensure window title has been updated. */ Sleep(40); /* Look for NewWindowTitle. */ hwnd_found = FindWindow(NULL, new_window_title); /* Restore original window title. */ SetConsoleTitle(old_window_title); return hwnd_found; } /* * Read and discard a (printable) key-down event from the console. * Returns true if the key is 'q'. */ bool screen_wait_for_key(char *c) { INPUT_RECORD ir; DWORD nr; /* Get the next keyboard input event. */ do { ReadConsoleInputA(chandle, &ir, 1, &nr); } while ((ir.EventType != KEY_EVENT) || !ir.Event.KeyEvent.bKeyDown); if (c != NULL) { *c = ir.Event.KeyEvent.uChar.AsciiChar; } return (ir.Event.KeyEvent.uChar.AsciiChar == 'q') || (ir.Event.KeyEvent.uChar.AsciiChar == 'Q'); } /** * Query the screen for selections, wc3270 version. * This just defers over to the select logic. * * @param[in] baddr Buffer address. */ bool screen_selected(int baddr) { return area_is_selected(baddr, 1); } void screen_final(void) { } /** * Get the current dimensions of the console. * * @param[out] rows Returned rows * @param[out] cols Returned cols */ void get_console_size(int *rows, int *cols) { CONSOLE_SCREEN_BUFFER_INFO info; if (GetConsoleScreenBufferInfo(cohandle, &info) == 0) { *rows = 25; *cols = 80; return; } *rows = info.srWindow.Bottom - info.srWindow.Top + 1; *cols = info.srWindow.Right - info.srWindow.Left + 1; } /** * Stub for scrollbar function. * * @param[in] top Where the top of the scrollbar should be (percentage) * @param[in] shown How much of the scrollbar to show (percentage) */ void screen_set_thumb(float top _is_unused, float shown _is_unused) { } /** * Enable or disable the cursor when scrolling. * * @param[in] on Enable (true) or disable (false) the cursor display. */ void enable_cursor(bool on) { cursor_visible = on? TRUE: FALSE; set_cursor_size(sbuf); } /** * Screen module registration. */ void screen_register(void) { static toggle_register_t toggles[] = { { ALT_CURSOR, toggle_altCursor, 0 }, { MONOCASE, toggle_monocase, 0 }, { SHOW_TIMING, toggle_showTiming, 0 }, { UNDERSCORE, toggle_underscore, 0 }, { MARGINED_PASTE, NULL, 0 }, { OVERLAY_PASTE, NULL, 0 }, { VISIBLE_CONTROL, toggle_visibleControl, 0 }, { CROSSHAIR, toggle_crosshair, 0 } }; static action_table_t screen_actions[] = { { "Paste", Paste_action, ACTION_KE }, { "Redraw", Redraw_action, ACTION_KE }, { "Title", Title_action, ACTION_KE } }; /* Register the toggles. */ register_toggles(toggles, array_count(toggles)); /* Register the actions. */ register_actions(screen_actions, array_count(screen_actions)); /* Register for selection state changes. */ register_schange(ST_SELECTING, screen_selecting_changed); } suite3270-3.6/wc3270/select.c0000664000076500007650000005204713221577163013554 0ustar pdmpdm/* * Copyright (c) 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * select.c * A Windows console-based 3270 Terminal Emulator * Screen selections */ #include "globals.h" #include #include #include "3270ds.h" #include "appres.h" #include "actions.h" #include "cscreen.h" #include "ctlr.h" #include "ctlrc.h" #include "kybd.h" #include "popups.h" #include "screen.h" #include "trace.h" #include "unicodec.h" #include "utils.h" #include "winvers.h" #include "wselectc.h" #include "selectc.h" /* Unicode DBCS (double-width) blank. */ #define IDEOGRAPHIC_SPACE 0x3000 static char *s_pending; static char *s_onscreen; /* Event names. */ static char *event_name[] = { "BUTTON_DOWN", "RIGHT_BUTTON_DOWN", "BUTTON_UP", "MOVE", "DOUBLE_CLICK" }; /* If true, we are rubber-banding a selection right now. */ static bool rubber_banding = false; /* If true, we have a stored start point. */ static bool select_started = false; /* If true, the current selection was from a double-click. */ static bool word_selected = false; /* Start of selected area. */ static int select_start_row; static int select_start_col; /* End of selected area. */ static int select_end_row; static int select_end_col; /* * Initialize the selection logic, given the maximum screen dimensions. */ void select_init(unsigned max_rows, unsigned max_cols) { s_pending = Malloc(max_rows * max_cols); s_onscreen = Malloc(max_rows * max_cols); unselect(0, max_rows * max_cols); memset(s_onscreen, 0, max_rows * max_cols); } /* * Inform the selection logic of a screen clear. * This does not include redisplaying the screen. */ void unselect(int baddr, int len) { /* * Technically, only the specified area has changed, but intuitively, * the whole selected rectangle has. */ rubber_banding = false; select_started = false; word_selected = false; memset(s_pending, 0, ROWS * COLS); screen_changed = true; st_changed(ST_SELECTING, false); } static void reselect(bool generate_event) { int rowA, colA, rowZ, colZ; int row, col; bool any = false; /* Clear out the current selection. */ memset(s_pending, 0, ROWS * COLS); /* Fill in from start to end, which may be backwards. */ rowA = (select_start_row < select_end_row)? select_start_row: select_end_row; rowZ = (select_start_row > select_end_row)? select_start_row: select_end_row; colA = (select_start_col < select_end_col)? select_start_col: select_end_col; colZ = (select_start_col > select_end_col)? select_start_col: select_end_col; for (row = rowA; row <= rowZ; row++) { for (col = colA; col <= colZ; col++) { s_pending[(row * COLS) + col] = 1; any = true; } } screen_changed = true; if (generate_event && any) { st_changed(ST_SELECTING, true); } } /* * Returns true if the character at the given location is displayed as a * blank. */ static bool is_blank(int baddr) { unsigned char fa; int xbaddr; int c; /* Check for FA or blanked field. */ fa = get_field_attribute(baddr); if (ea_buf[baddr].fa || FA_IS_ZERO(fa)) { return true; } /* Translate to Unicode, exactly as we would display it. */ if (IS_LEFT(baddr)) { xbaddr = baddr; DEC_BA(xbaddr); c = ebcdic_to_unicode((ea_buf[xbaddr].cc << 8) | ea_buf[baddr].cc, CS_BASE, EUO_NONE); if (c == 0 || c == IDEOGRAPHIC_SPACE) { return true; } } else if (IS_RIGHT(baddr)) { xbaddr = baddr; INC_BA(xbaddr); c = ebcdic_to_unicode((ea_buf[baddr].cc << 8) | ea_buf[xbaddr].cc, CS_BASE, EUO_NONE); if (c == 0 || c == IDEOGRAPHIC_SPACE) { return true; } } else { c = ebcdic_to_unicode(ea_buf[baddr].cc, ea_buf[baddr].cs, appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0); if (c == 0 || c == ' ') { return true; } } return false; } /* * Find the starting and ending columns of a 'word'. * * The rules, from Windows, are a bit strange. * A 'word' is a block of non-blank text, plus one blank to the right. * So if you double-click on a blank, you get just the blank, unless it is to * the right of a non-blank, in which case you get the word to the left as * well. */ static void find_word_end(int row, int col, int *startp, int *endp) { int baddr = (row * COLS) + col; assert(row <= ROWS); assert(col <= COLS); /* * If on a blank now, return just that, or that plus the word to the * left. */ if (is_blank(baddr)) { *endp = col; while (col && !is_blank((row * COLS) + (col - 1))) { col--; } *endp = col; return; } /* Search left. */ while (col && !is_blank((row * COLS) + (col - 1))) { col--; } *startp = col; /* Search right. */ while (col < (COLS - 1) && !is_blank((row * COLS) + (col + 1))) { col++; } if (col < (COLS -1)) { col++; } *endp = col; } /* * Pass a mouse event to the select logic. * * Only the essentials of the event are passed in -- the row and column in * display coordinates (not screen coordinates), and the status of the left * mouse button. select_event() infers the user's actions from that. * * Returns true if the event was consumed, or false if it was a cursor-move * event (button up without movement). */ bool select_event(unsigned row, unsigned col, select_event_t event, bool shift) { static int click_cursor_addr = -1; assert((int)row <= ROWS); assert((int)col <= COLS); vtrace(" select_event(%u,%u,%s,%s)\n", row, col, event_name[event], shift? "shift": "no-shift"); if (!rubber_banding) { switch (event) { case SE_BUTTON_DOWN: if (shift && select_started) { /* Extend selection. */ vtrace(" Extending selection\n"); } else { vtrace(" New selection\n"); select_start_row = row; select_start_col = col; /* If there was a previous selection, turn it off. */ st_changed(ST_SELECTING, false); } rubber_banding = true; select_started = true; word_selected = false; select_end_row = row; select_end_col = col; reselect(false); break; case SE_DOUBLE_CLICK: vtrace(" Word select\n"); rubber_banding = false; select_start_row = row; select_end_row = row; find_word_end(row, col, &select_start_col, &select_end_col); word_selected = true; reselect(true); /* If we moved the cursor for the first click, move it back now. */ if (click_cursor_addr != -1) { cursor_move(click_cursor_addr); click_cursor_addr = -1; } break; case SE_RIGHT_BUTTON_DOWN: if (memchr(s_pending, 1, COLS * ROWS) == NULL) { /* No selection pending: Paste. */ vtrace(" Paste\n"); run_action("Paste", IA_KEY, NULL, NULL); } else { /* Selection pending: Copy. */ vtrace(" Copy\n"); run_action("Copy", IA_KEY, NULL, NULL); } break; default: break; } } else { /* A selection is pending (rubber-banding). */ switch (event) { case SE_BUTTON_UP: rubber_banding = false; word_selected = false; if (row == select_start_row && col == select_start_col) { /* * No movement. Call it a cursor move, * but they might extend it later. */ vtrace(" Cursor move\n"); s_pending[(row * COLS) + col] = 0; screen_changed = true; click_cursor_addr = cursor_addr; /* We did not consume the event. */ return false; } vtrace(" Finish selection\n"); select_end_row = row; select_end_col = col; reselect(true); break; case SE_MOVE: /* Extend. */ vtrace(" Extend\n"); select_end_row = row; select_end_col = col; reselect(true); break; default: break; } } /* We consumed the event. */ return true; } /** * Handle a Return key (usually marked Enter) for completing a select/copy * action. * * @return true if key consumed, false otherwise. */ bool select_return_key(void) { if (memchr(s_pending, 1, COLS * ROWS) != NULL) { run_action("Copy", IA_KEY, NULL, NULL); return true; } else { return false; } } /* * Unicode text version of copy-to-clipboard. */ static size_t copy_clipboard_unicode(LPTSTR lptstr) { int r, c; int any_row = -1; int ns = 0; bool last_cjk_space = false; wchar_t *bp = (wchar_t *)lptstr; enum dbcs_state d; int ch; unsigned char fa; /* Fill in the buffer. */ fa = get_field_attribute(0); for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { int baddr = (r * COLS) + c; if (ea_buf[baddr].fa) { fa = ea_buf[baddr].fa; } if (!s_pending[baddr]) { continue; } if (any_row >= 0 && any_row != r) { *bp++ = '\r'; *bp++ = '\n'; ns = 0; last_cjk_space = false; } any_row = r; d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { int xbaddr = baddr; if (ea_buf[baddr].fa || FA_IS_ZERO(fa)) { ch = IDEOGRAPHIC_SPACE; } else { xbaddr = baddr; INC_BA(xbaddr); ch = ebcdic_to_unicode( (ea_buf[baddr].cc << 8) | ea_buf[xbaddr].cc, CS_BASE, EUO_NONE); if (ch == 0) { ch = IDEOGRAPHIC_SPACE; } } } else if (!IS_RIGHT(d)) { if (ea_buf[baddr].fa || FA_IS_ZERO(fa)) { ch = ' '; } else { ch = ebcdic_to_unicode(ea_buf[baddr].cc, ea_buf[baddr].cs, appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0); if (ch == 0) { ch = ' '; } if (toggled(MONOCASE) && islower(ch)) { ch = toupper(ch); } } } if (ch == ' ') { if (!word_selected || last_cjk_space) { *bp++ = ' '; } else { ns++; } } else { while (ns) { *bp++ = ' '; ns--; } *bp++ = ch; last_cjk_space = (ch == IDEOGRAPHIC_SPACE); } } } *bp++ = 0; return bp - (wchar_t *)lptstr; } /* * OEM text version of copy-to-clipboard. */ static size_t copy_clipboard_oemtext(LPTSTR lptstr) { int r, c; int any_row = -1; int ns = 0; bool last_cjk_space = false; char *bp = lptstr; enum dbcs_state d; wchar_t ch; unsigned char fa; /* Fill in the buffer. */ fa = get_field_attribute(0); for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { int baddr = (r * COLS) + c; if (ea_buf[baddr].fa) { fa = ea_buf[baddr].fa; } if (!s_pending[baddr]) { continue; } if (any_row >= 0 && any_row != r) { *bp++ = '\r'; *bp++ = '\n'; ns = 0; last_cjk_space = false; } any_row = r; d = ctlr_dbcs_state(baddr); if (IS_LEFT(d)) { int xbaddr = baddr; if (ea_buf[baddr].fa || FA_IS_ZERO(fa)) { ch = IDEOGRAPHIC_SPACE; } else { xbaddr = baddr; INC_BA(xbaddr); ch = ebcdic_to_unicode( (ea_buf[baddr].cc << 8) | ea_buf[xbaddr].cc, CS_BASE, EUO_NONE); if (ch == 0) { ch = IDEOGRAPHIC_SPACE; } } while (ns) { *bp++ = ' '; ns--; } bp += WideCharToMultiByte(CP_OEMCP, 0, &ch, 1, bp, 1, "?", NULL); last_cjk_space = (ch == IDEOGRAPHIC_SPACE); } else if (!IS_RIGHT(d)) { if (ea_buf[baddr].fa || FA_IS_ZERO(fa)) { ch = ' '; } else { ch = ebcdic_to_unicode(ea_buf[baddr].cc, ea_buf[baddr].cs, appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0); if (ch == 0) { ch = ' '; } if (toggled(MONOCASE) && islower(ch)) { ch = toupper(ch); } } if (ch == ' ') { if (!word_selected || last_cjk_space) { *bp++ = ' '; } else { ns++; } } else { while (ns) { *bp++ = ' '; ns--; } bp += WideCharToMultiByte(CP_OEMCP, 0, &ch, 1, bp, 1, "?", NULL); last_cjk_space = false; } } } } *bp++ = 0; return bp - lptstr; } /* * 8-bit text version of clipboard copy. */ static size_t copy_clipboard_text(LPTSTR lptstr) { int r, c; int any_row = -1; int ns = 0; char *bp = lptstr; enum dbcs_state d; int ch; unsigned char fa; /* Fill in the buffer. */ fa = get_field_attribute(0); for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { int baddr = (r * COLS) + c; char buf[16]; size_t nc; ucs4_t u; if (ea_buf[baddr].fa) { fa = ea_buf[baddr].fa; } if (!s_pending[baddr]) { continue; } if (any_row >= 0 && any_row != r) { *bp++ = '\r'; *bp++ = '\n'; ns = 0; } any_row = r; d = ctlr_dbcs_state(baddr); if (IS_LEFT(d) || IS_RIGHT(d) || ea_buf[baddr].fa || FA_IS_ZERO(fa)) { ch = ' '; } else { nc = ebcdic_to_multibyte_x(ea_buf[baddr].cc, ea_buf[baddr].cs, buf, sizeof(buf), EUO_BLANK_UNDEF | (appres.c3270.ascii_box_draw? EUO_ASCII_BOX: 0), &u); if (nc == 2) { ch = buf[0]; } else { ch = ' '; } if (toggled(MONOCASE) && islower(ch)) { ch = toupper(ch); } } if (ch == ' ' && word_selected) { ns++; } else { while (ns) { *bp++ = ' '; ns--; } *bp++ = ch; } } } *bp++ = 0; return bp - lptstr; } /* * Common code for Copy and Cut. */ void copy_cut_action(bool cutting) { size_t sl; HGLOBAL hglb; LPTSTR lptstr; int r, c; int any_row = -1; #define NUM_TYPES 3 struct { const char *name; int type; size_t esize; size_t (*copy_fn)(LPTSTR); } types[NUM_TYPES] = { { "Unicode", CF_UNICODETEXT, sizeof(wchar_t), copy_clipboard_unicode }, { "OEM text", CF_OEMTEXT, sizeof(char), copy_clipboard_oemtext }, { "text", CF_TEXT, sizeof(char), copy_clipboard_text }, }; int i; /* Make sure we have something to do. */ if (memchr(s_pending, 1, COLS * ROWS) == NULL) { return; } vtrace("Word %sselected\n", word_selected? "": "not "); /* Open the clipboard. */ if (!OpenClipboard(console_window)) { return; } EmptyClipboard(); /* Compute the size of the output buffer. */ sl = 0; for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { int baddr = (r * COLS) + c; if (s_pending[baddr]) { if (any_row >= 0 && any_row != r) { sl += 2; /* CR/LF */ } any_row = r; sl++; } } } sl++; /* NUL */ /* Copy it out in the formats we understand. */ for (i = 0; i < NUM_TYPES; i++) { /* Allocate the buffer. */ hglb = GlobalAlloc(GMEM_MOVEABLE, sl * types[i].esize); if (hglb == NULL) { break; } /* Copy the screen data to it. */ lptstr = GlobalLock(hglb); sl = (types[i].copy_fn)(lptstr); GlobalUnlock(hglb); /* Place the handle on the clipboard. */ SetClipboardData(types[i].type, hglb); vtrace("Copy(): Put %ld %s characters on the clipboard\n", (long)sl, types[i].name); } CloseClipboard(); /* Do the 'cutting' part of 'Cut'. */ if (cutting) { unsigned char fa; int baddr; int ba2; char *sp_save; /* * Save the contents of s_pending and use the copy instead of * s_pending, because the first call to ctlr_add() will zero * it. */ sp_save = Malloc(ROWS * COLS); memcpy(sp_save, s_pending, ROWS * COLS); fa = get_field_attribute(0); for (baddr = 0; baddr < ROWS * COLS; baddr++) { if (ea_buf[baddr].fa) { fa = ea_buf[baddr].fa; } else { if (!sp_save[baddr] || FA_IS_PROTECTED(fa) || ea_buf[baddr].cc == EBC_so || ea_buf[baddr].cc == EBC_si) { continue; } switch (ctlr_dbcs_state(baddr)) { case DBCS_NONE: case DBCS_SB: ctlr_add(baddr, EBC_space, ea_buf[baddr].cs); break; case DBCS_LEFT: ctlr_add(baddr, EBC_space, ea_buf[baddr].cs); ba2 = baddr; INC_BA(ba2); ctlr_add(ba2, EBC_space, ea_buf[baddr].cs); break; case DBCS_RIGHT: ba2 = baddr; DEC_BA(ba2); ctlr_add(ba2, EBC_space, ea_buf[baddr].cs); ctlr_add(baddr, EBC_space, ea_buf[baddr].cs); break; default: break; } mdt_set(baddr); } } Free(sp_save); } /* Unselect. */ unselect(0, ROWS * COLS); } /* * The Copy() action, generally mapped onto ^C. */ static bool Copy_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Copy", ia, argc, argv); if (check_argc("Copy", argc, 0, 0) < 0) { return false; } copy_cut_action(false); return true; } /* * The Cut() action, generally mapped onto ^X. */ static bool Cut_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Cut", ia, argc, argv); if (check_argc("Cut", argc, 0, 0) < 0) { return false; } copy_cut_action(true); return true; } /* * Return true if a cell in the specified region is out of sync with the * screen with regard to selection. */ bool select_changed(unsigned row, unsigned col, unsigned rows, unsigned cols) { unsigned r; assert((int)(row + rows) <= ROWS); assert((int)(col + cols) <= COLS); for (r = row; r < row + rows; r++) { if (memcmp(&s_pending [(r * COLS) + col], &s_onscreen[(r * COLS) + col], cols)) { return true; } } return false; } /* * Return TRUE if any cell in a region is selected. */ bool area_is_selected(int baddr, int len) { return memchr(&s_pending[baddr], 1, len) != NULL; } /* * Synchronize the pending and on-screen select state (copies pending to * on-screen). */ void select_sync(unsigned row, unsigned col, unsigned rows, unsigned cols) { unsigned r; assert((int)(row + rows) <= ROWS); assert((int)(col + cols) <= COLS); for (r = row; r < row + rows; r++) { memcpy(&s_onscreen[(r * COLS) + col], &s_pending [(r * COLS) + col], cols); } } /* * Add the current location to the selection. Called from the four SelectXxx * actions. */ static void keyboard_cursor_select(void) { if (select_started) { /* Extend selection. */ vtrace(" Extending selection\n"); } else { vtrace(" New selection\n"); select_start_row = cursor_addr / COLS; select_start_col = cursor_addr % COLS; } /*rubber_banding = true;*/ select_started = true; word_selected = false; select_end_row = cursor_addr / COLS; select_end_col = cursor_addr % COLS; reselect(true); } /* * SelectLeft adds the current column to the selection and moves the cursor * to the left. */ static bool SelectLeft_action(ia_t ia, unsigned argc, const char **argv) { action_debug("SelectLeft", ia, argc, argv); if (check_argc("SelectLeft", argc, 0, 0) < 0) { return false; } keyboard_cursor_select(); Left_action(ia, 0, NULL); return true; } /* * SelectRight adds the current column to the selection and moves the cursor * to the right. */ static bool SelectRight_action(ia_t ia, unsigned argc, const char **argv) { action_debug("SelectRight", ia, argc, argv); if (check_argc("SelectRight", argc, 0, 0) < 0) { return false; } keyboard_cursor_select(); Right_action(ia, 0, NULL); return true; } /* * SelectUp adds the current row to the selection and moves the cursor up. */ static bool SelectUp_action(ia_t ia, unsigned argc, const char **argv) { action_debug("SelectUp", ia, argc, argv); if (check_argc("SelectUp", argc, 0, 0) < 0) { return false; } keyboard_cursor_select(); Up_action(ia, 0, NULL); return true; } /* * SelectDown adds the current row to the selection and moves the cursor down. */ static bool SelectDown_action(ia_t ia, unsigned argc, const char **argv) { action_debug("SelectDown", ia, argc, argv); if (check_argc("SelectDown", argc, 0, 0) < 0) { return false; } keyboard_cursor_select(); Down_action(ia, 0, NULL); return true; } /** * Selection module registration. */ void select_register(void) { static action_table_t select_actions[] = { { "Copy", Copy_action, ACTION_KE }, { "Cut", Cut_action, ACTION_KE }, { "SelectDown", SelectDown_action, ACTION_KE }, { "SelectLeft", SelectLeft_action, ACTION_KE }, { "SelectRight",SelectRight_action, ACTION_KE }, { "SelectUp", SelectUp_action, ACTION_KE } }; register_actions(select_actions, array_count(select_actions)); } suite3270-3.6/wc3270/shortcut.c0000664000076500007650000002733113221577163014146 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2015-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * shortcut.c * A Windows console-based 3270 Terminal Emulator * Shell link creation */ #if !defined(_WIN32) /*[*/ # error For Windows only. #endif /*]*/ #include "globals.h" #include "shortcutc.h" #include "winvers.h" #if !defined EXP_PROPERTYSTORAGE_SIG /*[*/ # define EXP_PROPERTYSTORAGE_SIG 0xa0000009 #endif /*]*/ #define MASK16 0xffff /* * An opaque EXP_PROPERTYSTORAGE block that has "Ctrl key shortcuts" disabled. */ static unsigned short new9block[] = { 0x0150, 0x0000, 0x0009, 0xa000, 0x0089, 0x0000, 0x5331, 0x5350, 0x8ae2, 0x4658, 0x4cbc, 0x4338, 0xfcbb, 0x9313, 0x9826, 0xce6d, 0x006d, 0x0000, 0x0004, 0x0000, 0x1f00, 0x0000, 0x2d00, 0x0000, 0x5300, 0x2d00, 0x3100, 0x2d00, 0x3500, 0x2d00, 0x3200, 0x3100, 0x2d00, 0x3800, 0x3300, 0x3400, 0x3400, 0x3900, 0x3900, 0x3600, 0x3400, 0x2d00, 0x3100, 0x3800, 0x3200, 0x3100, 0x3900, 0x3100, 0x3900, 0x3700, 0x3600, 0x3300, 0x2d00, 0x3200, 0x3100, 0x3000, 0x3600, 0x3900, 0x3500, 0x3300, 0x3200, 0x3700, 0x3700, 0x2d00, 0x3100, 0x3000, 0x3000, 0x3100, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x0000, 0x3100, 0x5053, 0x0753, 0x5706, 0x960c, 0xde03, 0x9d43, 0xe361, 0xd721, 0x50df, 0x1126, 0x0000, 0x0300, 0x0000, 0x0000, 0x000b, 0x0000, 0xffff, 0x0000, 0x0011, 0x0000, 0x0001, 0x0000, 0x0b00, 0x0000, 0xff00, 0x00ff, 0x1100, 0x0000, 0x0200, 0x0000, 0x0000, 0x000b, 0x0000, 0xffff, 0x0000, 0x0011, 0x0000, 0x0004, 0x0000, 0x0b00, 0x0000, 0xff00, 0x00ff, 0x1100, 0x0000, 0x0600, 0x0000, 0x0000, 0x0002, 0x0000, 0x00ff, 0x0000, 0x0011, 0x0000, 0x0005, 0x0000, 0x0b00, 0x0000, 0xff00, 0x00ff, 0x0000, 0x0000, 0x3900, 0x0000, 0x3100, 0x5053, 0xb153, 0x6d16, 0xad44, 0x708d, 0xa748, 0x4048, 0xa42e, 0x783d, 0x1d8c, 0x0000, 0x6800, 0x0000, 0x0000, 0x0048, 0x0000, 0xf10d, 0x4e87, 0x0000, 0x0000, 0x0000, 0x0660, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; static void substitute9block(const char *path_link); /* * create_link - uses the shell's IShellLink and IPersistFile interfaces to * create and store a shortcut to the specified object. * Returns the result of calling the member functions of the interfaces. * path_obj - address of a buffer containing the path of the object * path_link - address of a buffer containing the path where the shell link * is to be stored * desc - address of a buffer containing the description of the shell link */ HRESULT create_link(LPCSTR path_obj, LPSTR path_link, LPSTR desc, LPSTR args, LPSTR dir, int rows, int cols, wchar_t *font, int pointsize, int codepage) { HRESULT hres; int initialized; IShellLink* psl = NULL; IShellLinkDataList* psldl = NULL; IPersistFile* ppf = NULL; NT_CONSOLE_PROPS p; WORD wsz[MAX_PATH]; hres = CoInitialize(NULL); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: CoInitialize failed: %ld\n", hres); goto out; } initialized = 1; /* Get a pointer to the IShellLink interface. */ hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (LPVOID *)&psl); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: CoCreateInstance failed: %ld\n", hres); goto out; } /* Set the path to the shortcut target, and add the description. */ psl->lpVtbl->SetPath(psl, path_obj); if (desc) { psl->lpVtbl->SetDescription(psl, desc); } if (args) { psl->lpVtbl->SetArguments(psl, args); } if (dir) { psl->lpVtbl->SetWorkingDirectory(psl, dir); } /* Add the icon. */ psl->lpVtbl->SetIconLocation(psl, path_obj, 0); hres = psl->lpVtbl->QueryInterface(psl, &IID_IShellLinkDataList, (void **)&psldl); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: QueryInterface(DataList) failed: %ld\n", hres); goto out; } memset(&p, '\0', sizeof(NT_CONSOLE_PROPS)); p.cbSize = sizeof(p); p.dwSignature = NT_CONSOLE_PROPS_SIG; p.wFillAttribute = 7; /* ? */ p.wPopupFillAttribute = 245; /* ? */ p.dwScreenBufferSize.X = cols; p.dwScreenBufferSize.Y = 0x012c; p.dwWindowSize.X = cols; p.dwWindowSize.Y = rows; p.dwWindowOrigin.X = 0; p.dwWindowOrigin.Y = 0; p.nFont = 0; p.nInputBufferSize = 0; p.dwFontSize.X = 0; p.dwFontSize.Y = pointsize? pointsize: 12; p.uFontFamily = 0; /* FF_DONTCARE */ p.uFontWeight = 400; /* FW_NORMAL */ wcsncpy(p.FaceName, font, LF_FACESIZE - 1); p.FaceName[LF_FACESIZE - 1] = 0; p.uCursorSize = 100; p.bFullScreen = 0; p.bQuickEdit = 0; p.bInsertMode = 1; p.bAutoPosition = 1; p.uHistoryBufferSize = 0x32; p.uNumberOfHistoryBuffers = 4; p.bHistoryNoDup = 0; p.ColorTable[0] = 0; p.ColorTable[1] = 0x00800000; p.ColorTable[2] = 0x00008000; p.ColorTable[3] = 0x00808000; p.ColorTable[4] = 0x00000080; p.ColorTable[5] = 0x00800080; p.ColorTable[6] = 0x00008080; p.ColorTable[7] = 0x00c0c0c0; p.ColorTable[8] = 0x00808080; p.ColorTable[9] = 0x00ff8000; p.ColorTable[10] = 0x0000ff00; p.ColorTable[11] = 0x00ffff00; p.ColorTable[12] = 0x000a0adc; p.ColorTable[13] = 0x00ff00ff; p.ColorTable[14] = 0x0000ffff; p.ColorTable[15] = 0x00ffffff; hres = psldl->lpVtbl->AddDataBlock(psldl, &p); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: AddDataBlock(NT_CONSOLE_PROPS) failed: " "%ld\n", hres); goto out; } if (codepage) { NT_FE_CONSOLE_PROPS pfe; memset(&pfe, '\0', sizeof(pfe)); pfe.cbSize = sizeof(pfe); pfe.dwSignature = NT_FE_CONSOLE_PROPS_SIG; pfe.uCodePage = codepage; hres = psldl->lpVtbl->AddDataBlock(psldl, &pfe); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: AddDataBlock(NT_FE_CONSOLE_PROPS) " "failed: %ld\n", hres); goto out; } } /* * Query IShellLink for the IPersistFile interface for saving the * shortcut in persistent storage. */ hres = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (void **)&ppf); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: QueryInterface(Persist) failed: %ld\n", hres); goto out; } /* Ensure that the string is ANSI. */ MultiByteToWideChar(CP_ACP, 0, path_link, -1, wsz, MAX_PATH); /* Save the link by calling IPersistFile::Save. */ hres = ppf->lpVtbl->Save(ppf, wsz, TRUE); if (!SUCCEEDED(hres)) { fprintf(stderr, "create_link: Save failed: %ld\n", hres); goto out; } out: if (ppf != NULL) { ppf->lpVtbl->Release(ppf); } if (psldl != NULL) { psldl->lpVtbl->Release(psldl); } if (psl != NULL) { psl->lpVtbl->Release(psl); } if (initialized) { CoUninitialize(); } if (SUCCEEDED(hres) && IsWindowsVersionOrGreater(10, 0, 0)) { substitute9block(path_link); } return hres; } /* * Substitute the opaque EXP_PROPERTYSTORAGE block in a completed link with * one that disables Windows 10 "Ctrl key shortcuts". * * Obviously this is a hack, owing to the lack of documentation of the opaque * block, and the apparent lack of any other way to accomplish this. */ static void substitute9block(const char *path_link) { # define WINDOW 4 char temp_path[MAX_PATH]; FILE *f, *g; unsigned short window[WINDOW]; int head = 0; int tail = 0; int count = 0; bool matched = false; /* Create the temporary name. */ strcpy(temp_path, path_link); strcat(temp_path, ".tmp"); /* Open the existing link. */ f = fopen(path_link, "rb+"); if (f == NULL) { fprintf(stderr, "substitute9block: Re-open of link '%s' failed: %s\n", path_link, strerror(errno)); return; } /* Open the temporary link. */ g = fopen(temp_path, "wb"); if (g == NULL) { fclose(f); fprintf(stderr, "substitute9block: Open of temporary link '%s' " "failed: %s\n", temp_path, strerror(errno)); return; } /* * Read until we get to the two-DWORD sequence: * xxxxyyyy a0000009 * xxxxyyyy is the length. * a0000009 identifies the EXP_PROPERTYSTORAGE block. * * The file is 16-bit (but not 32-bit) aligned, so we need to read two * bytes at a time. * * Store the chunks in a 4-element array. As we read new value into the * tail, write out the head. */ for (;;) { unsigned skip_short; unsigned short skip_buf; /* Write out the head. */ if (count == WINDOW) { if (fwrite(&window[head], sizeof(unsigned short), 1, g) != 1) { fprintf(stderr, "substitute9block: Write/copy to temp link " "failed: %s\n", strerror(errno)); } head = (head + 1) % WINDOW; } /* Read into the tail. */ if (fread(&window[tail], sizeof(unsigned short), 1, f) != 1) { /* All done. */ break; } if (++count > WINDOW) { count = WINDOW; } tail = (tail + 1) % WINDOW; /* Check for a match. */ if ((count != WINDOW) || (window[(head + 2) % WINDOW] != (EXP_PROPERTYSTORAGE_SIG & MASK16)) || (window[(head + 3) % WINDOW] != EXP_PROPERTYSTORAGE_SIG >> 16)) { /* No match. */ continue; } /* * A match. The two elements at the head are the length in bytes to * skip, including what has already been read into the window. */ matched = true; skip_short = (((window[(head + 1) % WINDOW] << 16) + window[head]) / sizeof(unsigned short)) - WINDOW; while (skip_short--) { fread(&skip_buf, sizeof(unsigned short), 1, f); } /* Substitute a different block. */ if (fwrite(new9block, sizeof(new9block), 1, g) != 1) { fprintf(stderr, "substitute9block: Write/subst to temp link " "failed: %s\n", strerror(errno)); } /* Keep on reading. */ count = 0; head = 0; tail = 0; } fclose(f); /* Write out the remainder of the window. */ while (count--) { if (fwrite(&window[head], sizeof(unsigned short), 1, g) != 1) { fprintf(stderr, "substitute9block: Write/tail to temp link " "failed: %s\n", strerror(errno)); } head = (head + 1) % WINDOW; } fclose(g); /* Delete the old file and rename the temporary to that name. */ if (unlink(path_link) < 0) { fprintf(stderr, "substitute9block: Unlink of original link failed: " "%s\n", strerror(errno)); } if (rename(temp_path, path_link) < 0) { fprintf(stderr, "substitute9block: Rename of temp link failed: %s\n", strerror(errno)); } if (!matched) { fprintf(stderr, "substitute9block: No match for EXP_PROPERTYSTORAGE " "block!\n"); } } suite3270-3.6/wc3270/shortcutc.h0000664000076500007650000000324613221577163014315 0ustar pdmpdm/* * Copyright (c) 2006-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ HRESULT create_link(LPCSTR path_obj, LPSTR path_link, LPSTR desc, LPSTR args, LPSTR dir, int rows, int cols, wchar_t *font, int pointsize, int codepage); suite3270-3.6/wc3270/version.txt0000775000076500007650000000006013221577443014347 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/wc3270/wc3270-32.zipit0000664000076500007650000000141113221577163014346 0ustar pdmpdm# zipit template for wc3270 D html F README-zip.txt F LICENSE.txt F NO-INSTALL.txt F html/Bugs.html F html/Build.html F html/FAQ.html F html/Intro.html F html/Keymap.html F html/Lineage.html F html/README.html F html/ReleaseNotes.html F html/Resources.html F html/SSL.html F html/wc3270-man.html F html/Wishlist.html F ../ws3270/html/Windows-x3270if.html html/x3270if.html F html/wc3270-script.html F ../wpr3287/html/wpr3287-man.html html/wpr3287.html F ../ws3270/html/ws3270-man.html html/ws3270-man.html F ../obj/win32/wc3270/wc3270.exe wc3270.exe F ../obj/win32/wc3270/wc3270wiz.exe wc3270wiz.exe F ../obj/win32/wpr3287/wpr3287.exe wpr3287.exe F ../obj/win32/ws3270/ws3270.exe ws3270.exe F ../obj/win32/ws3270/x3270if.exe x3270if.exe F ../obj/win32/wc3270/catf.exe catf.exe suite3270-3.6/wc3270/wc3270-64.zipit0000664000076500007650000000142613221577163014361 0ustar pdmpdm# zipit template for wc3270, 64-bit mode D html F README-zip.txt F LICENSE.txt F NO-INSTALL.txt F html/Bugs.html F html/Build.html F html/FAQ.html F html/Intro.html F html/Keymap.html F html/Lineage.html F html/README.html F html/ReleaseNotes.html F html/Resources.html F html/SSL.html F html/wc3270-man.html F html/Wishlist.html F ../ws3270/html/Windows-x3270if.html html/x3270if.html F html/wc3270-script.html F ../wpr3287/html/wpr3287-man.html html/wpr3287.html F ../ws3270/html/ws3270-man.html html/ws3270-man.html F ../obj/win64/wc3270/wc3270.exe wc3270.exe F ../obj/win64/wc3270/wc3270wiz.exe wc3270wiz.exe F ../obj/win64/wpr3287/wpr3287.exe wpr3287.exe F ../obj/win64/ws3270/ws3270.exe ws3270.exe F ../obj/win64/ws3270/x3270if.exe x3270if.exe F ../obj/win64/wc3270/catf.exe catf.exe suite3270-3.6/wc3270/wc3270_files.mk0000664000076500007650000000025713221577163014565 0ustar pdmpdm# wc3270-specific object files WC3270_OBJECTS = c3270.o ft_gui.o help.o icmd.o keymap.o keypad.o menubar.o \ nvt_gui.o relink.o screen.o select.o shortcut.o ssl_passwd_gui.o suite3270-3.6/wc3270/wc3270.h0000664000076500007650000000327713221577163013230 0ustar pdmpdm/* * Copyright (c) 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * wc3270.h * A curses-based 3270 Terminal Emulator * Declarations for functions that are exclusive to wc3270. */ void start_html_help(void); void start_wizard(const char *session); suite3270-3.6/wc3270/wc3270.ico0000775000076500007650000004107613221577163013555 0ustar pdmpdm@@ (B(@€ •¦²­·”¥±aq|Rcs~›j{‰ÿfvƒÿRboÿXjxÿVhvÿUfsÿRbnÛR_i²WgrÛ]jvÌcnv´hwƒÂl~‰ÿl}‹ÿ\o|ÿ\p|ÿo€Žÿo‚Žÿh|‰ÿfw„ÿhz†ÿfy…ÿfy…ÿdv„ÿYmzÿThuøYkxöZn{ñ^q}ÿ^p|ÿXjxÿauÿdx„ÿh|‰ÿlŒÿm€Žÿn‚ÿn‚‘ÿh|‰Òl~‰õq€‹ÿlw°v‹ÿdr~ÿRcpÿFWcÿHZhÿThwÿYm|ÿWjzüYn}ìWm}ÿZpÿZpÿ]rÿ_u„ÿdz‰ÿdyŠÿcz‰ÿdyˆÿey‰ÿi~ÿh~Œÿl€ÿl‚ÿp…“ÿuˆ–ÿ}œÿ‚•¡ÿ}žÿ…˜¦ÿ‰œ¨ÿ‘£°ÿ’¤²ÿ£°ÿ“¦³ÿ”£ÿqˆ–ÿo…”ÿlÿfzˆÿu†‘ÿly‚ÿH[hÿG[jÿH\mÿI_nÿPgwÿQizÿax‰ÿd{Œÿd{‹ÿg~Žÿhÿo…”ÿsˆ–ÿw‹šÿyžÿ”¢ÿ€”£ÿ”¢ÿ|‘¡ÿ}’¡ÿ–¤ÿ–¤ÿ–¥ÿ…™¨ÿ‡œ©ÿŠ«ÿŠž«ÿ¡®ÿ‰«ÿƒ—¦ÿ¡®ÿ£±ÿ‘¤±ÿ¢°ÿ“¥³ÿ‘¤²ÿu‹›ÿqˆ˜ÿu‹›ÿt‰˜ÿs‡—ÿŠ™¥ÿ|Œ–ÿv„Œÿ_rÿe{‰ÿi€ÿl‚’ÿtŠ™ÿxŽœÿ„™§ÿ†›¨ÿ‡›©ÿ‡›©ÿˆœªÿ‹ž¬ÿ‹Ÿ¬ÿ‡›ªÿ„™§ÿ‚—¦ÿ„˜§ÿ€•¤ÿ€•¤ÿ~”£ÿ~”£ÿ{‘ ÿ|‘ ÿ|‘ ÿ–¥ÿ”£ÿ”£ÿ„™§ÿ†š©ÿ„˜§ÿ…™¨ÿŽ¡¯ÿ‹ž­ÿŠž­ÿŽ¡¯ÿ–¨µÿŠž«ÿuŠšÿ~“¢ÿ–¥ÿ€•¤ÿzŸÿzŒ˜ÿt‚Œÿ_iq´Œ•ÿ›ÿŸ­ÿŽ¢¯ÿ£±ÿ“¥³ÿ’¥²ÿ’¦²ÿ”§´ÿ’¥³ÿ¡¯ÿ‹ž­ÿ‡œªÿ€•¤ÿzŸÿvŒœÿxŽÿvŒœÿsŠ™ÿu‹šÿt‰˜ÿwÿtŠ™ÿs‡–ÿs…“ÿyŠ—ÿx‰–ÿ{Œ˜ÿy‹—ÿs…’ÿi|ŠÿWgtÿz‹—ÿŠž¬ÿ…˜¦ÿ†˜¤ÿ‹›¥ÿ’¥²ÿ…™§ÿ| ÿ†š©ÿ‡›©ÿ…™¨ÿ€”£ÿy‹—ÿnz„Ùš¢ÿ¢¯ÿ’¥²ÿ’¥²ÿ“¦³ÿ”§´ÿ’¥³ÿŽ¡¯ÿžªÿ…—£ÿ‚”¡ÿ}ÿs‡•ÿk€ÿeyˆÿ^p}ÿSeqÿJ[iÿQbnÿ7EPÿ1;Dÿ!-6ÿ*ÿ ÿÿ ÿ ÿÿ ÿ  ÿÿ!+4ÿ>MZÿ *4ÿ&ÿ ÿVeqÿŠ«ÿ{Ÿÿ€”£ÿŒ ­ÿ¡®ÿ‹Ÿ­ÿˆœ©ÿ{‹—ÿm{†ÿ©³ÿ‘£°ÿŽ¡¯ÿ’¦³ÿ˜ª·ÿ’¥³ÿ•§´ÿ]goÿ8@Iÿ8>Gÿ;CJÿ.8Aÿ%/8ÿ&0ÿ"ÿÿÿ#ÿ&ÿ&ÿ!*ÿ&0ÿ".9ÿ3@Jÿ;HQÿHVbÿTbmÿ$,4ÿ ÿ  ÿ'ÿ*3;ÿ ÿ "ÿ !ÿ!*ÿTbmÿ„™¨ÿ~“¢ÿˆœªÿŽ¡¯ÿ¡¯ÿ“¦³ÿ‹©ÿ|Œ–ÿ¢¯·ÿŒ ­ÿ•¨µÿ„• ÿZjuÿNZcÿ$.7ÿ ÿ ÿKZfÿ/9Cÿ&-ÿ!+5ÿ.;Gÿ8DNÿBOZÿK[hÿPcqÿ_rÿhz‡ÿkŒÿvŠ˜ÿ„—¤ÿŒŸ«ÿœ®¹ÿž°¼ÿ}Š“ÿP\fÿXclÿÿ+4=ÿ&/ÿ !ÿ%ÿ ÿ$ÿqƒ‘ÿ‰¬ÿ…™§ÿ¡¯ÿ£°ÿ˜«·ÿ“¤°ÿ}Š•ÿ ®·ÿ’¥²ÿfqzÿ ÿ ÿ",ÿ ÿ ÿfu€ÿ†–¡ÿ‚•¡ÿ”¢ÿ‡š¨ÿ…™¦ÿƒ—¦ÿ„˜¦ÿ‚—¥ÿ‰«ÿ¡¯ÿ“¦³ÿ—ª¶ÿ™«·ÿ ±¼ÿ£´Àÿ¦·Âÿ¬¼Æÿ­½Çÿ·ÅÌÿQW]ÿ#ÿ/;Eÿ&ÿ#ÿ ÿÿ9DLÿŠªÿŠž¬ÿ†›©ÿ¢°ÿ’¥³ÿ ­ÿK]kÿn~ˆÿ’£¬ë‚’œÿ!)2ÿ ÿ"-ÿ'2ÿÿ$+1ÿ;?BÿŠš¥ÿœ®»ÿ—ª¶ÿ“¦³ÿ¢°ÿ¢°ÿ£°ÿ£±ÿ•¨µÿ—ª·ÿ—ª·ÿ¯ºÿ ±½ÿŸ±½ÿ¢²¾ÿ¦·Áÿ®¿Èÿ±ÁÊÿ‚Ž–ÿ ÿ&ÿ+7Aÿ )ÿ ÿ*ÿ*4=ÿ}‘žÿ£°ÿ‡œ©ÿˆœªÿ¡¯ÿ‰›¨ÿATbÿcv…ÿiyƒÿn|†ÿ¤¯¶Ù™ÿ7?Hÿ ÿ%1ÿ*6ÿ"ÿ*18ÿu…ÿ¢´Àÿœ®ºÿ”§³ÿ“¥²ÿ¢¯ÿŒŸ­ÿŒŸ¬ÿŽ¡®ÿ¡®ÿ¢¯ÿ“¥±ÿ’¤±ÿ–§³ÿ¡­ÿ‘¡¬ÿ”¤¯ÿ’Ÿÿw…‘ÿ-9Cÿ#.7ÿ1>Hÿ*7Cÿ+ÿ)ÿ!)ÿ1?Iÿq…“ÿŽ¢°ÿ‰ªÿˆ«ÿ’ ÿ;P_ÿdzˆÿ]p~ÿ_o{ÿev€ÿu…’ÿ”£—o{†ÿ#)2ÿ(ÿ(6Aÿ7DNÿ{ˆ‘ÿˆ™¤ÿŽŸªÿ{šÿu…‘ÿo|…ÿlw€ÿly‚ÿlyÿnz‚ÿdq{ÿcpyÿXgrÿL[fÿCQ]ÿ4>Gÿ2;Cÿ-7?ÿ$.7ÿ*4ÿ%ÿ$ÿ ÿÿ ÿÿÿÿ3@Lÿ~’Ÿÿ‘¥²ÿ†›©ÿp‚ÿ6K\ÿd{Œÿ`xˆÿ_t‚ÿ[o|ÿ`p|ÿdv‚ÿKU]ÿ9BJÿ+6@ÿ%.ÿ")ÿ%ÿ ÿÿÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿ ÿÿ ÿÿ ÿ ÿÿÿ ÿ8FQÿu…’ÿs„‘ÿGXfÿ;O_ÿe}ÿe|Œÿc{‹ÿbx‡ÿ_rÿ]p{ÿ`q}ÿdtÿ069ÿ ÿ*ÿ ÿÿÿÿÿÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿÿ  ÿ ÿ  ÿ !ÿ $ÿ "ÿ ÿ ÿ ÿ ÿ*ÿ#1=ÿ"0<ÿ,;ÿAVfÿf~Žÿe|ÿhÿi€‘ÿf|Œÿbw…ÿ^o{ÿ[kxÿfw„ÿk{†ÿ…Šÿ=DJÿ'18ÿ*3;ÿ%.ÿ)ÿ$/ÿ*6ÿ .:ÿ)5ÿ*6ÿ.<ÿ"3Aÿ$5Cÿ$6Dÿ&8Eÿ&8Fÿ%7Fÿ':Iÿ"2Aÿ#4Cÿ 1Aÿ,;ÿ+:ÿ)9ÿ*9ÿ .ÿ,ÿ&ÿ&ÿ)ÿ)ÿ!0ÿ"0ÿ%4ÿMcsÿh€ÿi€‘ÿlƒ’ÿi€‘ÿj’ÿj‘ÿe{‰ÿbv…ÿ^t„ÿZmzÿals…box¿‹“ÿuƒÿXkyÿRfvÿRiyÿE\nÿ?Vhÿ9Pbÿ7N`ÿ6L^ÿ5K]ÿ.DUÿ,BSÿ-CTÿ.CUÿ/EVÿ*?Pÿ)=Oÿ$8Iÿ"5Eÿ.?ÿ*9ÿ'6ÿ-ÿ*ÿ&ÿ $ÿ "ÿ "ÿ'ÿ+ÿ!/ÿNdsÿlƒ“ÿk‚’ÿm„”ÿk‚’ÿm„”ÿn…”ÿk‚’ÿi€ÿf}ŒÿYn~ÿ^o|ÿu†“ÿbyŠÿ[s„ÿUm~ÿH`rÿE[mÿ>Ugÿ8N`ÿ4J\ÿ4J\ÿ0FWÿ+ARÿ.CTÿ/EVÿ-CTÿ)=Nÿ';Lÿ%8Iÿ"5Fÿ-=ÿ&4ÿ!/ÿ)ÿ 'ÿ ÿ !ÿ "ÿ ÿ "ÿ #ÿ $ÿMbrÿkƒ’ÿm„“ÿlƒ’ÿlƒ“ÿk‚’ÿn…•ÿm„”ÿj’ÿf~ŽÿZp€ÿ\n{ÿl|‡ÿ_v…ÿTl}ÿOgyÿF^pÿBYkÿ=Tfÿ8Oaÿ4K\ÿ3J[ÿ.CUÿ,ASÿ/DUÿ/EVÿ)=Nÿ%9Jÿ%8Iÿ%8Iÿ$7Hÿ1Bÿ&6ÿ -ÿ'ÿ !ÿ !ÿ ÿ ÿ ÿ  ÿ ÿ !ÿTjzÿkƒ’ÿlƒ“ÿn…•ÿo†•ÿlƒ“ÿn…•ÿlƒ“ÿhÿd{‹ÿ]r‚ÿYkyÿl{ˆÿ[s€ÿJbtÿKbtÿAXjÿÿ,<ÿ"/ÿ)ÿ $ÿ &ÿ ÿ  ÿ "ÿ  ÿ ÿ "ÿ^u„ÿn…•ÿm„”ÿo†–ÿp‡—ÿn…”ÿp‡—ÿm„”ÿhÿf}Žÿ^t„ÿWjxÿl{‡ÿYm|ÿOewÿQi{ÿJbsÿG^pÿF^oÿC[mÿ;Rdÿ9Oaÿ6M^ÿ4J\ÿ5L^ÿ/EVÿ(=Nÿ&:Kÿ%:Kÿ';Lÿ#7Hÿ 3Cÿ0@ÿ(6ÿ%4ÿ -ÿ -ÿ -ÿ,ÿ!/ÿ+ÿ!.9ÿ?N\ÿp‡–ÿr‰˜ÿp‡—ÿn…•ÿp‡—ÿp‡—ÿq‡—ÿo†–ÿj‘ÿg~Žÿ]sƒÿj|ˆÿo{†ÿ\o|ÿ`v†ÿ`wˆÿXp€ÿNfwÿLctÿE\mÿ>Ufÿ=Seÿ:Pbÿ4J\ÿ3J\ÿ/DVÿ*?Pÿ';Kÿ%9Iÿ(ÿ0@ÿ#4Cÿ4HWÿ`u…ÿv‹šÿvŒœÿt‹šÿr‰™ÿqˆ˜ÿqˆ—ÿo†–ÿm„”ÿm„”ÿk‚’ÿg~ÿ^t„ÿs‚ÿXgrÿCUdÿAUfÿ?Teÿ>Teÿ:O`ÿ>TdÿDYjÿLbsÿLbrÿQfwÿWm}ÿ^u…ÿ\r‚ÿWm~ÿXo~ÿWm}ÿZp€ÿUk|ÿNeuÿI`qÿ@Ugÿ?Ugÿ?Vgÿ6K]ÿ7K\ÿ4HWÿd{Šÿrˆ˜ÿwÿxŽÿt‹šÿsŠ™ÿt‹šÿuŒ›ÿrˆ˜ÿlƒ“ÿj‘ÿmƒ“ÿj‘ÿg~ÿ_u‚ÿguÿ†‘™ÿt„Žÿn~‡ÿiz‡ÿl}‹ÿqƒ‘ÿzŒ™ÿ’Ÿÿˆ™¦ÿŒž«ÿ¡­ÿ¡­ÿ¢®ÿ¡­ÿŽŸªÿ‹›§ÿˆ™¥ÿ‰š¥ÿ‰š¦ÿŠœ¨ÿ†™¥ÿ†™¦ÿ…˜¥ÿ€”¡ÿxŒšÿm‚’ÿUm}ÿe{‹ÿu‹šÿzŸÿyŸÿxŽÿxÿu‹šÿt‹šÿtŠšÿwÿt‹šÿlƒ“ÿj‘ÿl‚’ÿj‚‘ÿd|Œÿ\qÿdr{ÿ”¡ªÿ¢¯¶ÿ›ªµÿŠ— ÿyƒŠÿm{„ÿ]isÿY`fÿ^diÿ^dhÿ]dhÿV]bÿQY`ÿJSYÿDOVÿ=GNÿ7>Dÿ4:@ÿ29Cÿ4;Dÿ5Dÿ&,2ÿ!$ÿ"ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ%+ÿ‡œªÿ†š©ÿ…š¨ÿ–¥ÿ~“¢ÿzŸÿxŽÿu‹›ÿtŠšÿsŠ™ÿuŒ›ÿu‹›ÿr‰˜ÿo†–ÿm„”ÿlƒ’ÿd|ÿ_t„ÿds}ÿ…–ÿ#&ÿÿÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿÿÿŠœ©ÿ†›ªÿˆœªÿ‡›ªÿ…™¨ÿ~“¢ÿ•£ÿxÿxÿwÿwœÿuŒ›ÿsŠ™ÿo†•ÿo†–ÿn…”ÿi€ÿcxˆÿdrÿfnsÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ (ÿ%ÿ ÿ‰š¥ÿ“§´ÿ‘¤²ÿ¡®ÿŠž¬ÿ„˜§ÿ~”£ÿzŸÿ{žÿxŽžÿu‹›ÿvŒœÿu‹›ÿn…•ÿm„”ÿo†–ÿk‚’ÿg|‹ÿct€ÿQ[bÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿÿ ÿ‡™¤ÿ™¬¹ÿ“¦³ÿŽ¢¯ÿŒŸ­ÿ…™¨ÿ€•¤ÿ}“¢ÿ|’ ÿyŽžÿvŒœÿvŒ›ÿu‹šÿp†–ÿk‚’ÿm„”ÿj‘ÿg}Œÿ`q~ÿ8@Gÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿˆ™¤ÿš¬¹ÿ•§µÿ”§´ÿ‘¤²ÿˆœªÿ–¥ÿ|’¡ÿ}“¢ÿ{ŸÿxŽžÿvœÿr‰˜ÿp‡—ÿm„”ÿlƒ“ÿlƒ“ÿk€ÿarÿJRXÿ037ÿ ÿ ÿ ÿ ÿ ÿm9ÿm9ÿm9ÿG,ÿ ÿG,ÿG,ÿG,ÿ ÿ ÿG,ÿÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ…—¢ÿš­ºÿ—©¶ÿ–©¶ÿ•©µÿ‹Ÿ­ÿ‚—¦ÿ}’¢ÿ”£ÿ}’¡ÿ{ ÿwÿr‰˜ÿp‡—ÿm„”ÿlƒ”ÿlƒ“ÿiŽÿ]p|ÿ_gmÿ%*.ÿ ÿ ÿÿ ÿ ÿm9ÿÿG,ÿ ÿm9ÿÿ ÿ ÿÿÿ ÿ ÿÿm;ÿÿ ÿ ÿÿ ÿ ÿÿ$ÿ ÿ ÿ“Ÿÿœ¯»ÿ›¬¹ÿ˜«·ÿ˜«·ÿ‹Ÿ­ÿ–¥ÿ|‘¡ÿ€•¤ÿ~“¢ÿzŸÿuŒ›ÿtŠšÿr‰˜ÿn…”ÿn…”ÿn…•ÿj€ÿ\o{ÿ_elÿ#ÿ ÿ ÿ ÿ ÿ ÿ ÿÿm9ÿm9ÿ ÿ ÿ ÿ ÿ ÿ ÿ w6ÿÿÿÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ‚”Ÿÿ¡²¾ÿž°¼ÿ›­¹ÿ›­¹ÿŽ¡¯ÿƒ˜§ÿ”£ÿƒ˜¦ÿ€•¤ÿ{‘ ÿyžÿzŸÿs‰™ÿp‡–ÿo†–ÿo†•ÿj€ÿ\o{ÿkqtÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ‚“ ÿ ²¿ÿŸ±½ÿœ®ºÿ™«¸ÿ¢°ÿ…š©ÿƒ˜¦ÿ„˜§ÿ‚—¦ÿ{‘ ÿ{‘ ÿxŽžÿu‹›ÿtŠšÿq‡—ÿn…•ÿl‚’ÿ`r€ÿouxÿ ÿÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿz1ÿ ÿ ÿ ÿz1ÿg8ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿƒ”Ÿÿ¤µÁÿ¢³¿ÿž°¼ÿ™«·ÿ“¦³ÿŒŸ®ÿ‰«ÿ†š©ÿ‚˜§ÿ~“£ÿ}’¢ÿ{ ÿu‹›ÿvŒœÿs‰™ÿo†–ÿm„”ÿcw„ÿemtÿ ÿÿ ÿÿ ÿÿÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿÿÿÿÿm;ÿ ÿ ÿ ÿ ÿ ÿ"+ÿ ÿ‡˜£ÿ¦·Ãÿ¢³¿ÿž¯»ÿ˜ª·ÿ”§´ÿ’¤²ÿ‹Ÿ­ÿˆœ«ÿ…š¨ÿ‚˜§ÿ–¦ÿ–¥ÿz ÿt‹šÿtŠšÿqˆ—ÿqˆ—ÿfz‰ÿJT`ÿ$«ÿJÿ ÿ ÿ ÿ ÿ ÿÿG,ÿ ÿÿj/ÿG,ÿ ÿÿj/ÿ[8ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ+ÿ ÿŠš¥ÿ§¹Ãÿ£µÀÿ ±½ÿ›­¹ÿ–©µÿ”§´ÿŽ¡¯ÿ‹ ®ÿ‰«ÿ‡œªÿ…™¨ÿ„™§ÿ|‘¡ÿwœÿvŒœÿxÿr‰˜ÿeyˆÿOT[ÿ ¼ÿ Yÿ ÿ ÿ ÿ ÿÿÿ ÿ o,ÿv.ÿx4ÿ ÿ o,ÿv.ÿx4ÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ&ÿ ÿŸªÿªºÅÿ¦·Âÿ¡²¾ÿž°¼ÿ™¬¸ÿ–©¶ÿ‘¥²ÿ¡®ÿŠž¬ÿˆœªÿ†›©ÿ…™¨ÿ”¤ÿzŸÿwœÿvŒ›ÿq‡–ÿcw†ÿ\_bÿ¢ÿPÿÿ ÿÿG,ÿ ÿÿo:ÿm9ÿm0ÿ3ÿo:ÿm9ÿm0ÿ3ÿ ÿÿ ÿm;ÿÿ ÿÿ ÿ ÿ ÿ ÿÿ (1ÿ ÿ”¤­ÿ©»Åÿ§¸Ãÿ¤µÀÿŸ±¼ÿ™«¸ÿ•§´ÿ”§´ÿ£±ÿŒŸ­ÿ‰«ÿ†›©ÿ†š©ÿ”¢ÿ|‘ ÿ|‘ ÿxŽÿrˆ—ÿfzˆÿW[^ÿ Aÿ 9ÿ ÿÿÿ ÿ o,ÿÿr*ÿn:ÿm;ÿ ÿr*ÿn:ÿ ÿ ÿÿ ÿÿm;ÿm;ÿ ÿ ÿ !ÿ ÿ ÿ ÿ ÿ/=ÿ ÿ—§°ÿ«»Åÿ©¹Äÿ¦·Âÿ ²½ÿš­¹ÿ–¨µÿ’¥²ÿ£±ÿŽ¢¯ÿ‰ž¬ÿ…š¨ÿ†›¨ÿ€•¤ÿ€•¤ÿƒ˜¦ÿ}’¡ÿsˆ˜ÿgzˆÿRY^ÿ ÿ ÿ ÿ ÿÿo:ÿm9ÿ ÿ ÿ ÿ k;ÿ z!ÿ ÿ ÿ k;ÿ z!ÿ ÿ ÿ ÿÿ ÿÿÿÿÿ ÿÿÿ(2<ÿÿš©²ÿ©ºÅÿ¬¼Æÿ¦·Âÿ ±½ÿ˜«·ÿ–©µÿ’¥³ÿ‘¤±ÿ¡¯ÿˆœªÿ†š¨ÿˆœªÿ†›©ÿƒ˜¦ÿ–¥ÿ|‘¡ÿxŒšÿi|ŠÿKSZÿ ÿ ÿ ÿ ÿÿr*ÿn:ÿ ÿ$ÿ'ÿ q6ÿ ‹(ÿ$ÿ'ÿ ÿ ÿÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ™¨±ÿ©ºÄÿ¬¼Æÿ¥¶ÁÿŸ±½ÿ—ª·ÿ–¨µÿ’¥³ÿ’¥²ÿ¡¯ÿ‹ž¬ÿ‡›ªÿŒ ­ÿ‡œªÿ„™§ÿ–¥ÿ~“¢ÿy›ÿi}ŠÿAJQÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ" ÿ ÿÿ ÿ ÿÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿšªµÿ©¹Äÿ¬¼Æÿ¥¶Áÿ ±½ÿš­¹ÿ–©µÿ•¨´ÿ“¦³ÿ¤±ÿŒ ®ÿŠž¬ÿŠŸ­ÿˆœªÿ†š¨ÿ„˜§ÿ€•£ÿzŽœÿk}‹ÿ4Dÿª»ÇÿªºÅÿ¨¸Ãÿ¤µÀÿŸ²½ÿœ¯»ÿš¬¸ÿ˜«·ÿ•©µÿ—©¶ÿ’¥³ÿ¢°ÿŒ ®ÿŠž¬ÿˆœ«ÿ‡œªÿ†š©ÿ~‘Ÿÿm€ÿ).4ÿÿ ÿ ÿ ÿÿm8ÿ‚ ÿÿ ÿ t.ÿ ÿ†1ÿ ÿ t.ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿ?DIÿ§¸ÃÿªºÄÿ©¹Äÿ¦·Áÿ¡²¾ÿž°¼ÿ˜ª·ÿ˜«·ÿ–ª¶ÿ–¨µÿ’¥²ÿŽ¢¯ÿ‹Ÿ­ÿŠž¬ÿЬÿŠž«ÿ…™¨ÿ’ ÿoŽÿ).4ÿ ÿ ÿ ÿ ÿÿ !ÿÿÿ !ÿ !ÿˆ&ÿ 'ÿ !ÿ !ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿCILÿ¥·Âÿ«¼ÅÿªºÄÿ¦¶Áÿ¢³¾ÿŸ±¼ÿœ®ºÿ™«·ÿ”§´ÿ•§´ÿ‘¤±ÿ¢¯ÿŠŸ­ÿ‹ ­ÿŠž¬ÿˆœ«ÿ€•£ÿ}‘Ÿÿqƒÿ'+0ÿ ÿ ÿ ÿ ÿÿ ÿ t.ÿ ÿ†1ÿ ÿ t.ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿXciÿ¨ºÅÿ­½ÇÿªºÅÿ¨¹Ãÿ£´¿ÿž°»ÿŸ±½ÿ™«·ÿ’¥³ÿ”§´ÿ“¦³ÿ¢°ÿ ®ÿŒ ®ÿŠž¬ÿ…š©ÿ–¤ÿ{ŽžÿnŽÿ'+0ÿ ÿ ÿ ÿ ÿÿ !ÿ !ÿˆ&ÿ 'ÿ !ÿ !ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿju}ÿ¨¹Äÿ®¾ÈÿªºÄÿ¨¹Äÿ¤µÁÿŸ²½ÿž°¼ÿ™¬¸ÿ“¦³ÿ•§´ÿ“¦³ÿ‘¤²ÿ£°ÿŽ¢¯ÿŒŸ®ÿ‰¬ÿ†š¨ÿ|žÿkŒér‰˜)17ÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ  ÿ  ÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿÿÿu†ÿ¤µÁÿ®¾ÈÿªºÄÿ¨¹Äÿ¤µÀÿ¡³¾ÿ®ºÿ™¬¸ÿ“¦³ÿ”¦³ÿ“¥²ÿ“¦³ÿ‘¤±ÿ ®ÿŠž­ÿˆœªÿ…™¨ÿ~‘¡ÿsˆ—çd|+4<ÿ ÿ ÿ ÿ ÿÿ !ÿ !ÿ !ÿ 'ÿ !ÿ !ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿ ÿÿ ÿx…Žÿ£µÀÿ­½ÇÿªºÄÿ¨¸Ãÿ£´Àÿ ±½ÿ¯»ÿš¬¸ÿ”§´ÿ“¦³ÿ”§´ÿ”§´ÿ‘¤²ÿ¢°ÿˆ«ÿ†›©ÿƒ˜¦ÿ~”£ÿs‰™æd|6@Gÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ  ÿ  ÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿ ÿ&ÿ‰™£ÿ¥¶Áÿ­½ÈÿªºÅÿ§¸Ãÿ¤µÀÿ¡²¾ÿ¯»ÿ™«·ÿ”§´ÿ”§´ÿ“¦³ÿ•¨µÿ”§´ÿ’¥²ÿŒ ®ÿˆœªÿƒ—¦ÿ”£ÿvŠšçZm{FMÿ/6;ÿ/6;ÿ-4:ÿ'/7ÿ!)1ÿ#*ÿ )ÿ)ÿ 'ÿ$(ÿ$ÿ#ÿ (ÿ!*ÿ'ÿ )ÿ$,ÿ!)3ÿ$,4ÿ)07ÿ.6=ÿ;IUÿMXaÿXclÿˆ–¡ÿ­¹ÿ©¹Ãÿ§·Áÿ¦µÀÿ¥´¿ÿ£³¾ÿž¯»ÿ®¹ÿ™«¸ÿ™«·ÿ—ª¶ÿš¬·ÿ–§´ÿ¡­ÿƒ”¡ÿŸ¨ÿsƒŽÿ{ƒˆÓv€‡ÿdmsÿw€†ÿw€†ÿ~„ˆÿox~ÿkv~ÿ`mvÿR\eÿt}„ÿv}‚ÿtz~ÿsx|ÿvzÿt{€ÿx€…ÿu~„ÿryÿr{ÿz…ÿ…‘™ÿ‘œ£ÿš£ªÿŸ¨°ÿ¡¬´ÿ¦²ºÿ§´»ÿ¦³¼ÿ§³¼ÿ§´¼ÿ©µ¾ÿª¶¿ÿ§´¼ÿ«·¿ÿš¨³ÿ—¦±ÿ™©³ÿž­·ÿ¤±ºÿž©±Ç“¥Öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿàÿÿÿÿð?ÿÿàÿÿÀÿÿÀÿÿÀÿÿàÿðÿøÿü?ÿþÿÿÿÿ€ÿÿðÿøÿøÿüÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿþÿøÿðÿàÿàÿàÿàÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsuite3270-3.6/wc3270/wc3270.iss0000664000076500007650000002366613221600613013566 0ustar pdmpdm; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AllowNoIcons=yes AppCopyright=Copyright (C) 1989-2017 by Paul Mattes, GTRC and others AppName=wc3270 AppPublisher=Paul Mattes AppPublisherURL=http://x3270.bgp.nu AppSupportURL=http://x3270.bgp.nu AppUpdatesURL=http://x3270.bgp.nu AppVerName=wc3270 3.6ga4 ArchitecturesInstallIn64BitMode=x64 ChangesAssociations=yes Compression=lzma DefaultDirName={pf}\wc3270 DefaultGroupName=wc3270 DisableDirPage=no MinVersion=0,5.1 OutputBaseFilename=wc3270-3.6ga4-setup OutputDir=. SolidCompression=yes WizardSmallImageFile=x3270-icon2.bmp SignTool=mystandard $f [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Components] Name: "base"; Description: "Basic executables"; Types: full compact custom; Flags: fixed Name: "wizard"; Description: "Session Wizard"; Types: full compact custom Name: "ws3270"; Description: "ws3270 (scripting app)"; Types: full custom Name: "help"; Description: "Help files"; Types: full custom [InstallDelete] ; Get rid of the AppData CA root certs files. The new install puts it in {app}. ;; Skip the rule below because it interferes with installing as SYSTEM and is ;; likely unnecessary now. ;Type: files; Name: "{userappdata}\root_certs.txt" Type: files; Name: "{commonappdata}\root_certs.txt" Type: files; Name: "{app}\root_certs.txt" ; Get rid of the old New wc3270 Session desktop icon. ;; Skip the rule below because it interferes with installing as SYSTEM and is ;; likely unnecessary now. ;Type: files; Name: "{userdesktop}\New wc3270 Session.lnk" ; Get rid of the old 'New wc3270 Session' start menu item. It might be in ; the common programs group or the user programs group. Type: files; Name: "{commonprograms}\{groupname}\New wc3270 Session.lnk" ;; Skip the rule below because it interferes with installing as SYSTEM and is ;; likely unnecessary now. ;Type: files; Name: "{userprograms}\{groupname}\New wc3270 Session.lnk" ; Get rid of the old networking DLLs. Type: files; Name: "{app}\w3n4.dll" Type: files; Name: "{app}\w3n46.dll" Type: files; Name: "{app}\shf.dll" ; Get rid of ead3270. Type: files; Name: "{app}\ead3270.exe" ; Get rid of Explore AppData on the Start menu. Type: files; Name: "{group}\wc3270 Explore AppData" [Files] Source: "..\obj\win32\wc3270\wc3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "..\obj\win64\wc3270\wc3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "..\obj\win32\ws3270\ws3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode; Components: ws3270 Source: "..\obj\win64\ws3270\ws3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode; Components: ws3270 Source: "..\obj\win32\wpr3287\wpr3287.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "..\obj\win64\wpr3287\wpr3287.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "..\obj\win32\wc3270\catf.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "..\obj\win64\wc3270\catf.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "..\obj\win32\wc3270\mkshort.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall; Check: not Is64BitInstallMode Source: "..\obj\win64\wc3270\mkshort.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall; Check: Is64BitInstallMode Source: "..\obj\win32\wc3270\wc3270wiz.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode; Components: wizard Source: "..\obj\win64\wc3270\wc3270wiz.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode; Components: wizard Source: "..\obj\win32\ws3270\x3270if.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode; Components: ws3270 Source: "..\obj\win64\ws3270\x3270if.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode; Components: ws3270 Source: "html\Bugs.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Build.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\FAQ.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Intro.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Keymap.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Lineage.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\ReleaseNotes.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Resources.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\README.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\SSL.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\wc3270-man.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\wc3270-script.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "..\ws3270\html\ws3270-man.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "..\wpr3287\html\wpr3287-man.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Wishlist.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "..\ws3270\html\Windows-x3270if.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Tasks] Name: "desktopicons"; Description: "Create desktop icons"; GroupDescription: "{cm:AdditionalIcons}" Name: "migratefiles"; Description: "Migrate existing session files from AppData to Documents (can choose files)"; GroupDescription: "File Migration:" [Code] function myHelp(Param: String): String; begin ; result := '/c start /b ' + GetShortName(ExpandConstant('{app}') + '\html\README.html'); result := '/c start ' + GetShortName(ExpandConstant('{app}') + '\html\README.html'); end; function InitializeSetup(): Boolean; var uninstaller: String; ErrorCode: Integer; begin if (Is64BitInstallMode) and (RegKeyExists(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wc3270_is1')) then begin // We are in 64-bit mode and a 32-bit version is already installed. // Ask if they want to remove it. if (not WizardSilent) and (MsgBox('A 32-bit version of wc3270 is already installed and must be removed before a 64-bit version can be installed. Remove it now?', mbConfirmation, MB_YESNO) = IDNO) then begin // They don't want to remove the old version. Can't proceed. Result := False end // IDNO else begin // They do want to remove the old version. RegQueryStringValue(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wc3270_is1', 'UninstallString', uninstaller); ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); // We can continue. Result := True end // IDYES end else // There is no old 32-bit version to remove. begin result := True end // no 32-bit to remove end; // InitializeSetup [Icons] Name: "{group}\Session Wizard"; Filename: "{app}\wc3270wiz.exe"; WorkingDir: "{app}"; Components: wizard Name: "{group}\Run wc3270"; Filename: "{app}\wc3270.exe"; WorkingDir: "{app}" Name: "{group}\wc3270 Documentation"; Filename: "{app}\html\README.html"; Components: help [Registry] Root: HKCR; Subkey: ".wc3270"; ValueType: string; ValueName: ""; ValueData: "wc3270"; Flags: uninsdeletevalue Root: HKCR; Subkey: "wc3270"; ValueType: string; ValueName: ""; ValueData: "wc3270 Emulator Session"; Flags: uninsdeletekey Root: HKCR; Subkey: "wc3270\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\wc3270.exe,0" Root: HKCR; Subkey: "wc3270\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\wc3270.exe"" ""%1""" Root: HKCR; Subkey: "wc3270\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: """{app}\wc3270wiz.exe"" -e ""%1"""; Components: wizard Root: HKCR; Subkey: ".wc3270km"; ValueType: string; ValueName: ""; ValueData: "wc3270 keymap"; Flags: uninsdeletevalue Root: HKCR; Subkey: "wc3270 keymap"; ValueType: string; ValueName: ""; ValueData: "wc3270 emulator keymap"; Flags: uninsdeletekey Root: HKCR; Subkey: "wc3270 keymap\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\wc3270.exe,1" Root: HKCR; Subkey: "wc3270 keymap\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "notepad.exe ""%1""" Root: HKCR; Subkey: "wc3270 keymap\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: "notepad.exe ""%1""" [Run] Filename: "{app}\wc3270wiz.exe"; Description: "{cm:LaunchProgram,Session Wizard}"; Components: wizard; Flags: nowait postinstall skipifsilent Filename: "{cmd}"; Parameters: {code:MyHelp}; Description: "{cm:LaunchProgram,Online Documentation}"; Components: help; Flags: nowait postinstall skipifsilent Filename: "{app}\mkshort.exe"; Parameters: """{app}"" wc3270.exe ""{commondesktop}\wc3270.lnk"""; Flags: nowait runhidden; Tasks: desktopicons Filename: "{app}\mkshort.exe"; Parameters: """{app}"" wc3270wiz.exe ""{commondesktop}\Session Wizard.lnk"""; Flags: nowait runhidden; Tasks: desktopicons; Components: wizard ; Run the upgrade wizard. Filename: "{app}\wc3270wiz.exe"; Parameters: "-U"; Flags: nowait skipifsilent; Components: wizard; Tasks: migratefiles Filename: "{app}\wc3270wiz.exe"; Parameters: "-Ua"; Flags: nowait runhidden skipifnotsilent; Components: wizard; Tasks: migratefiles [UninstallDelete] Type: files; Name: "{commondesktop}\wc3270.lnk"; Tasks: desktopicons Type: files; Name: "{commondesktop}\Session Wizard.lnk"; Tasks: desktopicons Type: dirifempty; Name: "{app}" suite3270-3.6/wc3270/wc3270.iss.tmpl0000775000076500007650000002367713221577163014563 0ustar pdmpdm; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AllowNoIcons=yes AppCopyright=Copyright (C) 1989-%CYEAR% by Paul Mattes, GTRC and others AppName=wc3270 AppPublisher=Paul Mattes AppPublisherURL=http://x3270.bgp.nu AppSupportURL=http://x3270.bgp.nu AppUpdatesURL=http://x3270.bgp.nu AppVerName=wc3270 %VERSION% ArchitecturesInstallIn64BitMode=x64 ChangesAssociations=yes Compression=lzma DefaultDirName={pf}\wc3270 DefaultGroupName=wc3270 DisableDirPage=no MinVersion=0,5.1 OutputBaseFilename=wc3270-%VERSION%-setup OutputDir=. SolidCompression=yes WizardSmallImageFile=x3270-icon2.bmp SignTool=mystandard $f [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Components] Name: "base"; Description: "Basic executables"; Types: full compact custom; Flags: fixed Name: "wizard"; Description: "Session Wizard"; Types: full compact custom Name: "ws3270"; Description: "ws3270 (scripting app)"; Types: full custom Name: "help"; Description: "Help files"; Types: full custom [InstallDelete] ; Get rid of the AppData CA root certs files. The new install puts it in {app}. ;; Skip the rule below because it interferes with installing as SYSTEM and is ;; likely unnecessary now. ;Type: files; Name: "{userappdata}\root_certs.txt" Type: files; Name: "{commonappdata}\root_certs.txt" Type: files; Name: "{app}\root_certs.txt" ; Get rid of the old New wc3270 Session desktop icon. ;; Skip the rule below because it interferes with installing as SYSTEM and is ;; likely unnecessary now. ;Type: files; Name: "{userdesktop}\New wc3270 Session.lnk" ; Get rid of the old 'New wc3270 Session' start menu item. It might be in ; the common programs group or the user programs group. Type: files; Name: "{commonprograms}\{groupname}\New wc3270 Session.lnk" ;; Skip the rule below because it interferes with installing as SYSTEM and is ;; likely unnecessary now. ;Type: files; Name: "{userprograms}\{groupname}\New wc3270 Session.lnk" ; Get rid of the old networking DLLs. Type: files; Name: "{app}\w3n4.dll" Type: files; Name: "{app}\w3n46.dll" Type: files; Name: "{app}\shf.dll" ; Get rid of ead3270. Type: files; Name: "{app}\ead3270.exe" ; Get rid of Explore AppData on the Start menu. Type: files; Name: "{group}\wc3270 Explore AppData" [Files] Source: "..\obj\win32\wc3270\wc3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "..\obj\win64\wc3270\wc3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "..\obj\win32\ws3270\ws3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode; Components: ws3270 Source: "..\obj\win64\ws3270\ws3270.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode; Components: ws3270 Source: "..\obj\win32\wpr3287\wpr3287.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "..\obj\win64\wpr3287\wpr3287.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "..\obj\win32\wc3270\catf.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "..\obj\win64\wc3270\catf.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "..\obj\win32\wc3270\mkshort.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall; Check: not Is64BitInstallMode Source: "..\obj\win64\wc3270\mkshort.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall; Check: Is64BitInstallMode Source: "..\obj\win32\wc3270\wc3270wiz.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode; Components: wizard Source: "..\obj\win64\wc3270\wc3270wiz.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode; Components: wizard Source: "..\obj\win32\ws3270\x3270if.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode; Components: ws3270 Source: "..\obj\win64\ws3270\x3270if.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode; Components: ws3270 Source: "html\Bugs.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Build.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\FAQ.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Intro.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Keymap.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Lineage.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\ReleaseNotes.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Resources.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\README.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\SSL.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\wc3270-man.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\wc3270-script.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "..\ws3270\html\ws3270-man.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "..\wpr3287\html\wpr3287-man.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "html\Wishlist.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "..\ws3270\html\Windows-x3270if.html"; DestDir: "{app}\html"; Components: help; Flags: ignoreversion Source: "LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Tasks] Name: "desktopicons"; Description: "Create desktop icons"; GroupDescription: "{cm:AdditionalIcons}" Name: "migratefiles"; Description: "Migrate existing session files from AppData to Documents (can choose files)"; GroupDescription: "File Migration:" [Code] function myHelp(Param: String): String; begin ; result := '/c start /b ' + GetShortName(ExpandConstant('{app}') + '\html\README.html'); result := '/c start ' + GetShortName(ExpandConstant('{app}') + '\html\README.html'); end; function InitializeSetup(): Boolean; var uninstaller: String; ErrorCode: Integer; begin if (Is64BitInstallMode) and (RegKeyExists(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wc3270_is1')) then begin // We are in 64-bit mode and a 32-bit version is already installed. // Ask if they want to remove it. if (not WizardSilent) and (MsgBox('A 32-bit version of wc3270 is already installed and must be removed before a 64-bit version can be installed. Remove it now?', mbConfirmation, MB_YESNO) = IDNO) then begin // They don't want to remove the old version. Can't proceed. Result := False end // IDNO else begin // They do want to remove the old version. RegQueryStringValue(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wc3270_is1', 'UninstallString', uninstaller); ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); // We can continue. Result := True end // IDYES end else // There is no old 32-bit version to remove. begin result := True end // no 32-bit to remove end; // InitializeSetup [Icons] Name: "{group}\Session Wizard"; Filename: "{app}\wc3270wiz.exe"; WorkingDir: "{app}"; Components: wizard Name: "{group}\Run wc3270"; Filename: "{app}\wc3270.exe"; WorkingDir: "{app}" Name: "{group}\wc3270 Documentation"; Filename: "{app}\html\README.html"; Components: help [Registry] Root: HKCR; Subkey: ".wc3270"; ValueType: string; ValueName: ""; ValueData: "wc3270"; Flags: uninsdeletevalue Root: HKCR; Subkey: "wc3270"; ValueType: string; ValueName: ""; ValueData: "wc3270 Emulator Session"; Flags: uninsdeletekey Root: HKCR; Subkey: "wc3270\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\wc3270.exe,0" Root: HKCR; Subkey: "wc3270\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\wc3270.exe"" ""%1""" Root: HKCR; Subkey: "wc3270\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: """{app}\wc3270wiz.exe"" -e ""%1"""; Components: wizard Root: HKCR; Subkey: ".wc3270km"; ValueType: string; ValueName: ""; ValueData: "wc3270 keymap"; Flags: uninsdeletevalue Root: HKCR; Subkey: "wc3270 keymap"; ValueType: string; ValueName: ""; ValueData: "wc3270 emulator keymap"; Flags: uninsdeletekey Root: HKCR; Subkey: "wc3270 keymap\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\wc3270.exe,1" Root: HKCR; Subkey: "wc3270 keymap\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "notepad.exe ""%1""" Root: HKCR; Subkey: "wc3270 keymap\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: "notepad.exe ""%1""" [Run] Filename: "{app}\wc3270wiz.exe"; Description: "{cm:LaunchProgram,Session Wizard}"; Components: wizard; Flags: nowait postinstall skipifsilent Filename: "{cmd}"; Parameters: {code:MyHelp}; Description: "{cm:LaunchProgram,Online Documentation}"; Components: help; Flags: nowait postinstall skipifsilent Filename: "{app}\mkshort.exe"; Parameters: """{app}"" wc3270.exe ""{commondesktop}\wc3270.lnk"""; Flags: nowait runhidden; Tasks: desktopicons Filename: "{app}\mkshort.exe"; Parameters: """{app}"" wc3270wiz.exe ""{commondesktop}\Session Wizard.lnk"""; Flags: nowait runhidden; Tasks: desktopicons; Components: wizard ; Run the upgrade wizard. Filename: "{app}\wc3270wiz.exe"; Parameters: "-U"; Flags: nowait skipifsilent; Components: wizard; Tasks: migratefiles Filename: "{app}\wc3270wiz.exe"; Parameters: "-Ua"; Flags: nowait runhidden skipifnotsilent; Components: wizard; Tasks: migratefiles [UninstallDelete] Type: files; Name: "{commondesktop}\wc3270.lnk"; Tasks: desktopicons Type: files; Name: "{commondesktop}\Session Wizard.lnk"; Tasks: desktopicons Type: dirifempty; Name: "{app}" suite3270-3.6/wc3270/wc3270km.ico0000664000076500007650000003107613221577163014101 0ustar pdmpdm@@(2(@€¸»»²µµ®°°ª««¨¨¨œœœžžžŸŸ›žž›Ÿžž¡¡šœœžž˜ššŸŸ˜››eooœª¨°»¹·ÁÀ·¿¾¶½»°¸·¬´´¤¬¬™ Ÿ˜  š¡ ¥£Ÿ§¥¡©¨ž§¦›¤¢›¢¡œ¢¡¬²±")(t}| ¬ª¯¸··½¼¶½º´»¹±¸¶¬±²¬¯¯™žœ¡ ¡¡Ÿ¢¢ž£¢œ¥¤¥¤¥¤š¡ œ£¢›¡  bhgœ¤£°¹¸·¾½½ÃÃÊËËÇÇÇÆÆÆÉÊÉÁÁÁ¼¼¼»»»½½½¿ÂÁÀÂÂÀÂÂÂÄÄÂÄÄÄÆÆÙÛÚ¢¥£cmm–¡¡ÀÇÇÊÐÏÇÎÍÉÌÌÆËÊÇÎÍÂÈǺ¿¾¹¾¿ÀÆÅÀÆÅÁÇÆÅËÊÁÇÅÄÊÉÅÊÉÎÔÓ½ÂÁ#)(x‚€¡¬ªÂÊÉÊÏÎÌÑÐÌÒÑËÐÏÉÎÎÅÈɾÀÀ¾ÀÀÀÃÃÁÃÃÄÅÅÂÇÆÅÊÉÆËÊÈÍÌÖÛÚª°¯ ]ed𢡽ÅÄÏÔÓÓ××ÈÈÈÊÊÊÎÎÎÍÎÌÇÈÆÄÄÄÆÅÅÉÊÊÊÊÊÎÎÎÐÐÐÒÒÒ×××êêéèéç žcmn–  ¨¯®ÃÈÈÉÌËÊÌÌÎÑÐÎÓÒÉÍÌÄÈÇÇÉÊÊÏÎÌÑÐÑÕÕÑÕÔÕÖÖÕÖÖàââéîí¶»º &%t}|œ§¥ª±°ÂÇÆËÎÍÎÏÐÑÓÒÒÖÕÎÒÑÊÊÊÉÉÉÍÎÎÏÐÐÑÐÐÔÓÓÕ××ÙÜÛåççòöõ¨¬« ^gf¡ª¨¤¬«ÂÆÅÒÓÓÅÅÅÊÉÉÍÍÍÌÌÌÈÇÇÇÅÅÊÈÈÊÊÊÍÍÍÎÎÎÑÑÑÔÔÔëëëúûùâãá‘ _jj§§•œ›¯´³ÂÆÆÆÌËÍÎÎÐÒÒÈËËÇÇÇÅÊÊÊÏÎÌÑÐÎÑÑÕÕÕ×××äääøøøíîª!"nvv£ª«—›œ§¬­ÁÆÅÉÊÊÏÏÏÓÓÓËËËÈÈÈÊÊÊÌÌÌÎÎÎÑÑÑÖÖÖØØØåååùùùùùù£¤¤ X_^Ÿª¨¤¬«Ÿ¤£ÂÃÃÀ¾¾ËÊÊÑÎËÐÌÌÎÉÊÎÉÊÍÊËÎÌÌÏÍÍÎÎÎ×××êêêþþþüýûÚÛÙ~ akk¨¨–“˜—²´´ÄÄÄÌÌÌÏÏÏËËËËËËÊÊÊÏÏÐÑÑÑÕÖÖ×××ãããùùùÿÿÿçè虜žhpp¦®® ¥¦–™šª°¯ÀÂÁÍÍÍÑÑÑÍÎÎÍÍÍÍÍÍÑÑÑÓÓÓÒÒÒ×××âââðððÿÿÿùùù•š™ U]\ž©§¬´³œ ¡¢£¤ÕÑÒÖÏÐÔÎÊÓÌÊÒÉÉÓÈÉÓÆÈÍÇÄÍÇÆÌÅÆÚØØúúúÿÿÿûüúÓÒÐnpo Zdd ©© ¨§ˆŒ»»¼ÓÍÍÔÏÎÑÎÎÏÎÎÎÍÍÐËÌÌÉÉËÉÉÎÌÌÓÒÒëëëÿÿÿÿÿÿßãâ„‹Žeoo¢««¨­®Ž’–¤¥¥ÑÎÏØÔÔÙÖÕÖÒÓÕÐÑÓÏÑÑÍÎÑÎÍÓÏÏÏÎÎ×××úúúÿÿÿøøø‹Ž PWV¦¥­µ´¥©©“”•ñêçßÙÓÖÍÊÒÊÇÔÉÆÐÄÂÎÂÀÊÄ¿À¹¶±ªª¢žÚÛÛÿÿÿüýüÄÅÄdhg Ydc¢ªªŸ¦¥¥«ªÜÚÙÞÙØ×ÒÑÔÐÐÒÍÎÍÈÉËÄÆÇÃÃÁÀÀÁ¿¿¾¼¼ÆÇÇýýýÿÿÿÚÞÝx€„[ee¡¬«¨¯¯”–šÛØÖèäáÞÙØÛÖÕ×ÒÑÒÍÌÒÍÍÑËËÍÈÇÌÇÆÃÀÁºººÔÔÔþþþ÷÷÷€‚ƒ KRR™¡ ¯¶µ­²±°±±ûøôíçáâÖÔÐÄÃÖÊÈÐÄÂÐÅÂȽ¼µ²¦Ÿž‰Š£¤¤ÿÿÿúûú·ººafe Zec¡ª¨Ÿ¤¤ÀÂÁçäáäßÞÞÙØÚÔÔÛÕÕÓÌÍÏÉËÄÁÁÁÀÀ¼ººµ´´´´´÷÷÷ÿþþÑÕÔnwx Yccœ¨§¦¯®«¬­øóòðëêåàßàÚØàÛØÔÎÌÑÌÊÓÍÍÐËÊÇÂÀ¾»»±°°½¼¼ýýýôôôprs HQP”œ¯´³«°¯ÑÒÒþþûøñìéàÝ&ÑÄÄÔÈÆÐÄÂû¸´­ªš““ƒƒƒ‹‹ÿÿÿúûù«¯®Z`_ Yccž©§™¡ŸÑÓÔéééèãââÝÜâÜÙwpn2--qmnhhh´´´®®®«««ïïïÿÿÿÌÎÍfpnR^^š¨¦§¯¯»¼ºü÷öôïîíçæãÝÙVONÝÕÓÖÏ̧¡Ÿ\VWÉÄ÷³´§§§³±±üüüðññorr GPOŽ˜–°µ´¬®®ÛÛÛýþþþúöóêç*ÕÈÉØÌÊÍÂÀº³°§ŸŸ”‘’~|}†…‡ÿÿÿøù÷¥©§W]\ Ycc «©›¤¢ÛÝÝîëììçåäßÞ|vtd]Zļº‘Šeee²²²ªªª¦¦¦èèèÿÿÿÄÆÆ]ihS__–£¢§¯¯ÆÈÅü÷ööñððééçàÞG?@âÛØÖÏË¡š˜MHGÆÀÁ·²³¨©¨«ªªüüüëëëgji EOM˜—°µ´¬®®áááÿÿþþùøöîê."!ÝÓÒ×ËÈÇ»º°©§¥žŽ‚‚ÿÿÿõöôŸ£¢V]\ Zdd›¦¤ž¦¥ãããñîîíèçèãâICAÞ×Ôž¼£žž.)*igh¯¯¯¨¨¨ŸŸŸãããÿÿÿ»¾¿]gj U`_—£¢¦¯­ÈÊÊýùøõðïñêéèáÞIBBãÝÜ×ÑТœœPIIÅ¿À²¯¯§¦§§¦§ûûûëêê]bb HPOŽ˜–°µ´«®®äääþþüýú÷òëç-! B69B68““²«¨¢š›‘Ž‚‚ƒ‚ÿÿÿõöôž£¢SZY [eež©§ž¦¥åååñííìçæëæåJCCäÜÛÀ¸¸gcb_Y[‘ް°°¦¦¦¡¡¡àààÿÿÿµ¸¹]fi T_]–¢Ÿ§­®ËÌÌþùøõðïðêèéáß801f]^d\]KCDPHIÆÀÁµ²²¥¤¦¥¥¦ûûûèèè]ab JRQ‹–”®µ´¬°¯æææþþûüøôðêæ*·«ª®¥£»´´³¬© ˜™Œ€€€€ÿÿÿôõóŸ¥£PXX^iiŸª¨Ÿ¦¥èææòììîéèçâáB<=Ý×ÙÔÏÏÐËÊËÅŽºº²²²§§§¡¡¢ãããþÿÿ²·¶]ee Wa_—¢Ÿ©¯²ÊÊËþø÷öñððêêêââA:;Š‹‰ƒ„c\]RJKľ¿µ²²¥¥¥¦¦¦üüüæææ]aa KSRŒ—•¬·µ¬±°äääÿÿûøôñîèã(ØÏÎÖÏÌÌÅÂÀ¹µ£žœŽŽ‚‚‚ŠŠŠÿÿÿöõ󥨥RZZ `kl¡«©ž¥¥ãááïêçëæåæááuoob]]ØÑÓü¾-''™––´´´ªªª¤£¥èèèþþþ´¸¸Xaa Xca–¡Ÿ¥®¯ÃÃÄþùø÷òñîéèæááG>BâÜÜØÓÒž˜˜QKLÉÃij±±¨¨¨©©©üüüççç[a` ISQš˜«³²¬´²áááþýùøóðëãáQHJLCGKAFF@?>DCDIHGJJGKJADD?DCEJIGIJ<@A'(*  #)(.435:99=<9<<677'** #%%'-,+--QVVKRRHMMDIHAGF@GF>ED@ED=CB7=< !"*./]ddbhhhnnipo^edX^]TZZOVURYXJPOION?FE;CBC™¡¢©±±˜žž–šš¼½½ËÉÉÑÎÎÔÑÒ×ÓÔØÔÔÐÉÊÏÆÇÌÆÇÉÂÃÀ½½ÍÌÍüüüÿÿÿïïï ¦¥.35’›Ÿ¤¤ÓÔÑóòíìêåäâãßÙÚÛÖÖ–Ž‚}~ËÉÉÁ¾¾µ´µ«««£££»¹¼þþþéë뉋yƒ‡¥¬°¡¨©àááùôóñìëçâàåÞÜæßÝjce–ÏÉÊÇÁ¿¹º²°°¥¥¥ÅÅÅÿÿþ¹»½6±ª­¹´´¯¬«¤££¼¼¼ÿÿÿÔÕÕx$-,0BŒ™šœ¥¥ÖÖ×ñððíèææâå×ÕÓÖÐχˆ’‹Å¿Â¿º¼º¹¹«««¢£¤ÁÃÅþÿþßàÞ|ƒ‚! x‚¢®¬¢¬ªäààùôóòíëíæäÕÍÍJBCÞÙØ¸³±:45ÈÁ¾·¹³°±¢¡¤ÌÊÍýýý§ª¬%)*289€‰Š¥°­¥¬«§«ªýúøóíëòêè°¨¨\VXàÜÙ[RW‹‚„ÆÁÁÁ»¼¶²²«©©×××ÿÿÿÙÚØ€ˆ‡$--3>AŽœž§§ÏÑÒîîíêæâåãá|SKTHAGA<=945}yzÀ¾À°±±¨ªªÉÊÌÿÿþÞàß|‚"!|‡…¡­«¡ª§áÞÝöñðòëèîæå¯§§¸°°ÛÖÕÙÔÓwqqÆ¿ÀÁ»¼¶²³¥¥¦×ÕÖüýû¥©ª!&&/77ŒŠ¨±°¥«ª£§§üõõóîìñêèÀ¹¹yrußÜÙÖÔÎÌÊÆËÄÅÆÀÁ¹··¬ªªçççÿÿÿÜÞÛ†Ž'009DGŒššŸ¨©ÂÆÆíëëååâàÝÜÜÝÜÞÞÙÙ×Ö×ÔÕ×ÔÓËÉʾ¾¾³µµ¯²±ÓÕÖÿÿþßâà‚‡†"!z…ƒ¡¬ª¢«©ÑÑÍ÷òñíæäçàÞåÝÜà××ÚÕÔÚÕÔÖÑÑÏÊËÇÁº¶·«««åääúûù¥¨©"!-86ŒŠ¥¯®§®­œ ŸöððñìëíèçéãäçàâÜרÑÍÉÑÌÉÎÉÊÈÄļºººººùùùÿÿûÜÝÙ’™–&,+5@?Œ•™§¨§®­ääãßÞÝÚÚÚÕÕÕÓÒÒÎÍÍÐÍÍÑÎÎËËËÂÃ÷ºº±¶µîîîþþýààÞ‰ŽŽ!!x…ƒŸ©§¨¦¹ººñëêêåäãÞÛàÛÚÜÕÖ×ÔÔØÓÔÔÏÐÐÎÎÊÇÇ¿¾¾²²²÷÷õö÷󧪩/64ˆ‡ž©§¦®­–™™æããîëëéâåäÝàߨÛÛØØÑÐÎÒÏÎÎËÌÏÊËÌËËÞÞÞùùùööôÒÕÓŸ¤¢-10$+*~‰ˆ——Ž——ºÂÁ×ÙØ×ÖÖÔÔÔÔÓÓÒÒÒÓÒÒÍÎÎÌÎÍÇÊÉÂÅÄÓÙ×ýýý÷øöÑÒÑŒ‘’oxxŽš™”Ÿ”š˜ÍÎÍàÞÝÞÛÚÛÚÙØÖÖÙ××ÕÓÓÕÒÓÑÑÑÍÌÌËÌËààßþþýèé碤¤#('z„‚›™š¢¡’™˜½¾¾âââçáâßÚÜßÙÜÝÙÙž ­¬°°°´±±µ¯¯²«ª­œŸŽŽŽhjj477 4<;]cdu|~‘“ ¤§¨­®¯µµ°³´¥¦§²¸¹¹¿¿¼ÁÁÂÅÆÅÊÊÀÄÆ±¶¸…ŠŠ499  6==Y`_x~}•”Ÿ¤£²¶¶º»»ÁÁÁ¼»ºÁ¿ÀÇÅÇÊËÌÊËÌËÎÍÇÊÉÆÈʨ«­UWY  -43jqqŒ’’ž¤£¦¨¨³µµÂÃÄÅÅÇÇÆÈÅÅÇ "!%"&)$',(,/&+,'-+-421667::698188.54-44.56-451590684>>+11 31:=/79+34*.0-02165*.-')*!#$"""('%*))-.*.3,15)/0!+53~‡…Ž––‘––šŸœ–œ›’š™’›š’™˜˜—ˆ‘އނ‹†‘…Ž‚ŽŒ…‘…ކ‹™—mut ]jm›š˜¥¢ ¬¨¥±¬¡­«¨¦˜¤¢”¡žŠ’…„Ž‚ŽŒ‹~‹‰{‡…y…ƒx„‚t€}{„‚ NVU‡‘œ˜—¤  «©¨¥›¦¥—¢¡—  ”“•”Š”’‰•’‡“‘ˆ’‘ƒ‚ŽŒ‹}ŠˆŠŠ%(-+53‘œšªµ³·¼»»À¿¹¾½¸½¼±¶µ­²±«°¯ ¥¤›¢¡ž§¦ ¨§ ©§Ÿ¨§¡«©¤®®¥¯¯¶ÁÀmtsktxŸ«­¸ÃÁ¾ÉÇÁÌʽÉǹIJ¾»ª¶´ž©§œ¨¦¡«©¦¥§¥ž§¦›¦¤œ§¥›§¥œ§¥˜¤£ MVV‘œ›°»¹ºÆÄ¾ÉÇÀËɸÃÁ¯»¸«¶´Ÿ©¨Ÿ©§ «©ž©§ «©£®¬ «©Ÿª¨ «©¢­«¨³±),1*11™™·À¿ÄÉÈÈËËÊÍÌÇÉÉÆÉÉÄÆÆÁʽ»¹»ºº¾½º¾½¼À¿¾ÀÀÂÅÄÄÉÉÌÓÒÍÔÔqutq{{©©ÁÊÈÌÔÓËÔÓÍÓÒÉÏÎÊÑÐÂÉȽùÁÀ¹À¿»¿¾¼¿¿½ÀÀ¸ÁÀºÄ¼ÅÃÇÏΠ¦¥ NWW‘œœµ¿¿ÄÎÎÌÔÓÊÒÑÉÐÏÇÎÍÁÉȺÁÀºÀ¿ºÁÀ¹À¿¹À¿¹ÃÁ¹ÂÁ½ÆÅ½ÆÅÄÍÌÆÑÏ+-2'--‘œœ©¯®¾ÂÂÇÉÉÉÊÊÉÊÊËÌÌÍÎÎÊÍÊÅÇÆÇÇÈÉÊÉÊÌËÍÎÎÐÐÐÒÓÓÙÛÛéêêÙÚÚjmm t~•  ¯··ÃÊÉÈÏÎÌÐÍÎÐÏÏÒÑÊÎÍÆÌËÉÏÎÌÑÐËÏÎÏÒÒÏÑÑÒÔÒÔ××ÛÝÝàââ¡¥¤ NVV’œŸ¨«ºÃÄÈÎÍËÐÏÍÓÐÑÕÕÍÑÑÉÎÍÊÏÎÊÏÎËÑÐÌÒÑÐÖÕÏÕÓÔØØÖÛÚâçæÓÛÙ,/2#))’œ™ž²·¶¾À¿ÃÃÃÅÅÅÀÀÀÏÏÏÅÅŸ¹¹ÆÇdz³³ºººÑÑÑÒÒÒÙÙÙæææñññØÚÙehg z…ƒ˜¢¢›¢¢·½¼ÀÆÅÆÊÈËÎÍ·»ºÎÓÒ©®­ÈÍÌÌÏϨ««ÆÊÉÐÒÒ×Ö×ÝÝÝêëëçéé—œœ IRR–Ÿ¡’›Ÿ¥¬¯¼ÁÂÃÈÇÉÍÌËÎÏÁÇÅÊÍ;ÁÁÍÑÐÌÑÐÈÍÌÏÔÓÓÖÖÙÚÚàââîððÖÛÚ*./#"‘š™’˜—£¨§¸¹¹ÁÀÀÅÅʼn‰‰–––²±±WVV¿¾½—–—yxy¼¼¼ÓÓÓÜÜÜóóóõõõÒÖÕ^cb u}¨¥—–¦¬«¹À¿ÄÆÆËÏΆ…x|{|~~ˆŒŒ‰ŠŠ„„„jjjÑÓÔÙÚØäåãôõóååæŽ’ DMM•Ÿ š£§–™­²´¾ÂÂÅÊÉËÏÎvrw‘‘‘———†‡‡ÆËÊ“˜—ÀÄÃÓÕÕÛÜÜèêêõööÑÖÕ(,-‹‘”›š’•–°°±¼¼¼ÃÄÄ¿½¼Á¿ÁÇÄÄ»¹¹ÅÄÄ»¼¼¾¾¾ÓÓÓÙÙÙêêêþþþôôôÉÍÌTZY w‚¨¦—–˜Ÿž·»º¾ÂÂÉËÊÅÅÅÃÄÄÇÇÇÅÆÆÍÍÍÈÈÈÌÌÌÚÚÚßßßðððûûûßàà€‚ƒ CKJ’žœ¥§“˜›ž¤¸º»ÃÆÆËÌÎþÁ¿¾¾ÉÉɾ¾¾ÍÍÍÅÅŲ²²×××àààõõõúúúÍÒÑ"('ˆŽ˜Ÿž‰Œªª«ÈÆÆÎÌÉÑÌÌØÔÒÍÉÉÊÆÅÔÓÑÎÌÌÍËËÐÏÏÝÝÝûûûÿÿÿóóó¾ÂÁRWW r}{¨¦”œ’––ÆÇÇÑÒÒÑÑÑÌÌÌÒÒÒÍÎÎÑÐÑÍÍÎÌÌÍÎÎÎÕÕÕèèèþþþüýýÚÜÜnrs >FEŒ™—ž¨¨”šžŽ’˜···ÑÑÑ×ÔÔÖÕÕÔÔÔÓÔÔÒÒÒÓÓÓÓÓÓÔÔÔÖÖÖæææüüüüýýÄÈÇ!'&…Œ‹˜žˆŒŒÖÓÓßÚÚÞÖÓÚÔÑd\^! #"LFHÇÃÄÄ¿¿¼¹¹¹¹¹óóóÿÿÿóôô´··KPP oyxœ¦¥“œ±²±ãããÛÙÙÔÓÓÔÓÒa``"%”’”ÄÃý½½¸¸¸ÈÈÈþþþüüüÖÚÙaff 8?>‹˜–š¥£˜¢¢Ž‘”ÞÜÝåãâÝÙØÛØ×ÖÓÓœ™™fdeÎÍÍÆÆÆÆÆÆ½½½ÅÅÅúúúþþþÂÇÆ!$%~ˆ†”𙡥¤ëççèâááÚ×ÜÔÕ¸±¯ÖÏÌÚÒÐ|tthacÁºº¸µµª©©ÉÉÉÿÿÿôöö©¬­ILN mww›¥¥™™ÜÛÛèççâààÝÙÚ{xyb]^ËÅŶ´³¨§¨¹¹¹¯¯¯¬¬¬òòòýýýÏÓÒW]\ 7>=…“‘›¨¦’œ­¯°ïííìéçåâÞàÝØÝÙØ«¦¥LGIÊÈÈÄÄĽ½½µµµ±±±ØØØÿÿÿº½¾!%y„‚’˜—­°¯ðìëíçæçàÝãÜÙ¸°±Æ½¾Æ¾¿mffmgiº´´²¯¯©¨¨¯¯¯ÿÿÿñóó¡¥¥FJK juuœ¦¦”ŸêêêëèèæääâÜÜUNPd^_ÉÁĽ»» ¤££´´´ªªª£££áááþÿÿÈÌËMSR 5<;Ž™§¥‘›ÁÄÄòððïíëêçãäáÝßÜØàÝÚ>;<ÂÁÁ¿¿¿···°°°¬¬¬ÀÀÀÿÿÿ³·¸ %t}|‘—–¸¼»óïíîéèåàßéäàE<=WLSE;?yrt½¶·µ²²®­­¤£¤¦¥§üüüòó󛟠DGN hrr𤤛¤£ñððîëìíèçæààWQQ‹……NHM@8=Їˆ»º¹°°°©©©¢¢¢ÔÔÔþþþÀÅÄFNM 077‹š¦¥Ž™™ÏÐÏõóñõñíïìèèæáãÝÛÝØÖ‘ŽŽUTVÀÀÀ³³³­¬­¥¤¦®­¯ÿÿÿ¬°±$ mvu””ÁÄÃóïîðëêêåäìæäE<<—“¡œœ‡…„¨¥¥µ³³«ªª¤£¤¡Ÿ¥÷÷÷óóó•››>EJ dqp™¥¥§¦ñððïìíëæåæáàœ——LEFº²°£ž›—•”¹¸¹°°°¥¥¥¢¢¢ÎÎÎþþþ¹¾½>FE /77|Љ›§¦——ÚÚÚùöõõòíñîêÞÛ×¢ ¡œ™›•“• ‡‡†°°°ª©ª¥¤¦¯®°üüû§««! lvuŒ’’ÉÍÌõñïðëêéäãèáÞ¬¤£Ž‡‡ˆ‡€{{¬©¨µ²³ª©©££¤ ž£ôôôñññ—–9DG eus•¡  §¦ðïïîìëíçæçâáâÝÛÀ¹ºf]brkn¯­®º¹¹­­­¥¥¥ŸŸŸÌÌÍýýý±µµ8?? .66}‹‰—¥£Ž——ÞßÞ÷õóöòïñîêäàÝ™““ž–”ˆ…ƒ}|{œœ±°±«ª¬¢¡£­¬®ûûû ¤¦ hqq‰‘ÅÈÇõñïîéèêåääÞÛâÜÙÈÂÁÏÊÉÊÅÃÆÀÁ·´´­¬­£¢¤¡ ¢ôôôðððŽ““8BC gtr–¢ ¦¬«óòñïíëëæäåáàÞÚÙ×ÔÓÒÔÑÎËÊÀÀÀ·¸¸¯¯¯¨¨¨¢¡£ÔÔÔûüü«­¬7<= .43|‰‡•£ Œ””ÛÝÜôõñõñïñîëëçåßÚÙƒ‡¥¢£ƒ„¢¡£°¯±ª©«¥¤¦®­¯üüü¡£ dnmŠ’¿ÂÀõñïïêéèãââÝÜÙÔÓgbaÐËÊnihA;<°­­°¯°¤£¥£¢¤ööõððð’“?FH kvt™¡¡£©¨ðïïêèèëèäâÝÝÛר×ÕÕÍÌÌÆÇŶ¶¶¼»»²²²©©¨¢¡¤ÛÚÛûûùª«©6:: 276}‡†—£ Œ’“ØÙÙóôðóïîíëëìêê}~ÐÈÊ[XYvvw¨¦¦¶µ·««¬¨§©±±³üüü™žždlkЏº·ôñììèææááÝרÝÙØ¸²²wrrLFG—‘’›•˜´±²¦¦¦§§§ùùùñðï———AHJovuš Ÿ¤¦¥ëëëêêëæääßÝÝÔÓÔÙÙÛÖÕØÕÒÒJGG¹·····«««¦¤§ãääúù÷ª¬¬799 698‰ˆ– žŽ•”ÒÓÓñòïðïêéçæèææ‚€º¶¶|xxOKLÄÁÁ¶··¯°±©««³¶¶ûýýž£¢hml”“­°®ñîêèäââÜÜÁ»»a[]š”•wqr«¥¦|wv¾¿¶µµªªª«««ûüû÷ôñ­¨¤PSRrxw¢¡¡ çééçççâááÙØØ{_V_[RZ\TXIFGÀÀÀ¹¹¹°°°¨§¨ïððúùõ¶¶±:=: ?AA…Љ£¢‘—–ÃÅÅòòðììæåäáÜÚÚÍÎÍ,')¶°°ÓÏÎÄÃü¿¿´··ª­¬¿ÁÁýýý¬ªª hii›Ÿž—œšíëêäáÞÝØØ›”–Æ¿Àsll¹²± ˜šÈÂÁÿ¾¼»»±±±ºº»ÿÿÿöñïÅÀ½upo„ƒ§ªª“––ÛÞÝâââÞÞÞÔÕÕÐÐÏÍÏÍÊËÉËÊÉÉÈÇÀÁ¿½¾½´´µ±±²ùúùõôïÄÁ»HHE =>>ŽŽª­¬˜œ¨­¬ëìëçæäßÝÝÖ××ÉÈɘ“–‰ƒ„ÉÈÇÈÇÈÀÆÄº¿¾¯³²ÔÔÔùøø±²² DDD}~~ottÝÛÜàÜÛÛÕ×ÏÌÎ…‚ƒµ±³ÇÃÂtqnËÉÇÇÄÃÀ¿¿··µÚÛÙÿÿüíèäÒËÉmji CEErtuorr´·¸ÜÞÞרØÐÐÑÎÎÎÍÍÍËËËÌÌÌÊÊÈÅÆÃÃÃÁ¹¹¹ÉÇÆþýùéåáÄ¿DDC noo€‚‚wz}~…„ãääßààÚÚÙØÕÕÑÏÏvqr|wwÉÉÇËÍËÆÉÉÀÃþÀ¿öõõèææ£££ *.-Y__’•ËÌËÓÒÔÑÐÐÐÐÐÎÌËÎËÌÐÍÌÉÊÉÉÊÊÄÅÅËËÊ×××¼¼¼|||"#" 167`ciŸ¢ÁÄÅÇÉÊÌËÌËËËÌÌÌËËËÊËËÊÊËÇÇÇÇÇÇÝÝÜÔÕÕ¶µ´XXW )+,WZ_hlkž¢¡ÒÒÒÏÐÑÐÔÓÐÒÒÒÓÓÑÓÓÏÏÏÎÎÎÌÌÌÈÈÈÕÕÖÎÎÐ…†‡ *+.:8>>?CGHLJKLKMPBFK??D89=/01'((    &()/12578:;<=788/43%(*  &**368?ADDHLKNRMOTKJSDCL<<@125&&) suite3270-3.6/wc3270/wc3270.rc0000664000076500007650000000016113221577163013372 0ustar pdmpdm#define RT_MANIFEST 24 LANGUAGE 0, 0 1 RT_MANIFEST wc3270.exe.manifest 100 ICON wc3270.ico 200 ICON wc3270km.ico suite3270-3.6/wc3270/wizard.c0000664000076500007650000036362413221577163013603 0ustar pdmpdm/* * Copyright (c) 2006-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * wizard.c * A Windows console-based 3270 Terminal Emulator * Session creation wizard */ #include "globals.h" #include #include "3270ds.h" #include "resources.h" #include "ctlr.h" #include "ctlrc.h" #include "host.h" #include "proxy_names.h" #include "resources.h" #include "screen.h" #include "trace.h" #include "utils.h" #include #include #include #include "winvers.h" #include "shortcutc.h" #include "windirs.h" #include "relinkc.h" #define LEGAL_CNAME "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ "abcedfghijklmnopqrstuvwxyz" \ "0123456789_- " #define KEYMAP_SUFFIX ".wc3270km" #define KS_LEN strlen(KEYMAP_SUFFIX) #define KM_3270 ".3270" #define LEN_3270 strlen(KM_3270) #define KM_NVT ".nvt" #define LEN_NVT strlen(KM_NVT) #define KM_DESC "!description: " #define LEN_DESC strlen(KM_DESC) #define SESS_SUFFIX ".wc3270" #define SESS_LEN strlen(SESS_SUFFIX) #define CHOICE_NONE "none" #define DISPLAY_NONE "(none)" #define DONE_FILE "migrated" enum { MN_NONE = 0, MN_HOST, /* host name */ MN_LU, /* logical unit */ MN_PORT, /* TCP port */ MN_MODEL, /* model number */ MN_OVERSIZE, /* oversize */ MN_CHARSET, /* character set */ MN_CROSSHAIR, /* crosshair cursor */ MN_CURSORTYPE, /* cursor type */ MN_SSL, /* SSL tunnel */ MN_VERIFY, /* verify host certificate */ MN_PROXY, /* use proxy host */ MN_PROXY_SERVER, /* proxy host name */ MN_PROXY_PORT, /* proxy port number */ MN_3287, /* printer session */ MN_3287_MODE, /* printer mode */ MN_3287_LU, /* printer logical unit */ MN_3287_PRINTER, /* printer Windows printer */ MN_3287_CODEPAGE, /* printer code page */ MN_KEYMAPS, /* keymaps */ MN_EMBED_KEYMAPS, /* embed keymaps */ MN_FONT_SIZE, /* font size */ MN_BG, /* background color */ MN_MENUBAR, /* menu bar */ MN_TRACE, /* trace at start-up */ MN_NOTEPAD, /* use Notepad to edit file (last option) */ MN_N_OPTS } menu_option_t; /* Return value from get_session(). */ typedef enum { GS_NEW, /* file does not exist */ GS_EDIT, /* file does exist and is editable, edit it */ GS_NOEDIT, /* file does exist and is editable, do not edit it */ GS_OVERWRITE, /* file exists but is uneditable, overwrite it */ GS_ERR = -1, /* error */ GS_NOEDIT_LEAVE = -2 /* uneditable and they don't want to overwrite it */ } gs_t; /* Return value from edit_menu(). */ typedef enum { SRC_PUBLIC_DOCUMENTS,/* success, in public Documents\wc3270 */ SRC_DOCUMENTS, /* success, in My Documents\wc3270 */ SRC_PUBLIC_DESKTOP, /* success, on public Desktop */ SRC_DESKTOP, /* success, on Desktop */ SRC_OTHER, /* not sure where the file is */ SRC_NONE, /* don't rewrite the file */ SRC_ERR = -1 /* error */ } src_t; /* Return value from main_menu(). */ typedef enum { MO_CREATE = 1, /* create new session */ MO_EDIT, /* edit existing session */ MO_DELETE, /* delete existing session */ MO_COPY, /* copy existing session */ MO_RENAME, /* rename existing session */ MO_SHORTCUT, /* create shortcut */ MO_MIGRATE, /* migrate AppData files */ MO_QUIT, /* quit wizard */ MO_ERR = -1 /* error */ } menu_op_t; #define MO_FIRST MO_CREATE #define MO_LAST MO_QUIT /* Return value from session_wizard(). */ typedef enum { SW_SUCCESS, /* successful operation */ SW_QUIT, /* quit */ SW_ERR = -1 /* error */ } sw_t; #define YN_ERR (-1) /* error return from getyn() */ #define YN_RETRY (-2) /* user input error from getyn() */ /* Return value from write_shorcut(). */ typedef enum { WS_NOP, /* did nothing */ WS_CREATED, /* new shortcut */ WS_REPLACED, /* replaced shortcut */ WS_FAILED, /* operation failed */ WS_ERR = -1 /* error */ } ws_t; extern char *wversion; /* Aliases for obsolete character set names. */ struct { char *alias; char *real; } charset_alias[] = { { "japanese-290", "japanese-kana" }, { "japanese-1027", "japanese-latin" }, { NULL, NULL } }; #define CS_WIDTH 19 #define CP_WIDTH 8 #define WP_WIDTH 6 #define CS_COLS 2 #define MAX_PRINTERS 256 PRINTER_INFO_1 printer_info[MAX_PRINTERS]; unsigned num_printers = 0; char default_printer[1024]; static struct { char *name; char *description; } builtin_keymaps[] = { { "rctrl", "Map PC Right Ctrl key to 3270 'Enter' and PC Enter key to 3270 'Newline'" }, { NULL, NULL } }; static struct { char *name; char *protocol; char *port; } proxies[] = { { PROXY_HTTP, "HTTP tunnel (RFC 2817, e.g., squid)", PORT_HTTP }, { PROXY_PASSTHRU, "Sun telnet-passthru", NULL }, { PROXY_SOCKS4, "SOCKS version 4", PORT_SOCKS4 }, { PROXY_SOCKS5, "SOCKS version 5 (RFC 1928)", PORT_SOCKS5 }, { PROXY_TELNET, "None (just send 'connect host port')", NULL }, { NULL, NULL, NULL } }; static int write_session_file(const session_t *s, char *us, const char *path); static char *program; static char *appdata_wc3270 = NULL; /* user's wc3270 AppData directory */ static char *common_appdata_wc3270 = NULL;/* common wc327 AppData directory */ static char *installdir = NULL; /* installation directory */ static char *desktop = NULL; /* Desktop */ static char *public_desktop = NULL; /* Public Desktop */ static char *documents; /* My Documents directory */ static char *public_documents; /* public Documents directory */ static char *documents_wc3270; /* My Documents\wc3270 directory */ static char *public_documents_wc3270; /* public Documents\wc3270 directory */ static char *searchdir; /* where to look for current user's sessions */ static char *public_searchdir; /* where to look for shared sessions */ unsigned windirs_flags; static TCHAR username[UNLEN + 1]; static int get_printerlu(session_t *s, int explain); static int num_xs; static const char *xs_name(int n, src_t *lp); static void xs_init(bool include_public); typedef struct xs { /* Existing session: */ src_t location; /* location (current user or all users) */ char *name; /* session name */ struct xs *next; /* list linkage */ } xs_t; typedef struct { /* Set of existing sessions: */ int count; /* count */ xs_t *list; /* list of sessions */ } xsb_t; static xsb_t xs_my; /* current-user sessions */ static xsb_t xs_public; /* public sessions */ static session_t empty_session; static HANDLE stdout_handle = INVALID_HANDLE_VALUE; static void write_user_settings(char *us, FILE *f); static void display_sessions(bool with_numbers, bool include_public); static ws_t write_shortcut(const session_t *s, bool ask, src_t src, const char *path, bool change_shortcut); static void create_wc3270_folder(src_t src); static sw_t do_upgrade(bool); static BOOL admin(void); static bool ad_exist(void); /* Set up the stdout handle. */ static bool setup_stdout(void) { if (stdout_handle != INVALID_HANDLE_VALUE) { return true; } stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); return (stdout_handle != INVALID_HANDLE_VALUE); } /* Clear the screen. */ static void cls(void) { system("cls"); if (setup_stdout()) { SetConsoleTextAttribute(stdout_handle, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); } } /* Generate output in specific colors. */ static void color_out(char *fmt, int colors, va_list ap) { if (!setup_stdout()) { vprintf(fmt, ap); fflush(stdout); return; } fflush(stdout); SetConsoleTextAttribute(stdout_handle, colors); vprintf(fmt, ap); fflush(stdout); SetConsoleTextAttribute(stdout_handle, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); } /* Generate error (actually just red) output. */ static void errout(char *fmt, ...) { va_list ap; va_start(ap, fmt); color_out(fmt, FOREGROUND_RED | FOREGROUND_INTENSITY, ap); va_end(ap); } /* Generate green output. */ static void greenout(char *fmt, ...) { va_list ap; va_start(ap, fmt); color_out(fmt, FOREGROUND_GREEN | FOREGROUND_INTENSITY, ap); va_end(ap); } /* Generate reverse output. */ static void reverseout(char *fmt, ...) { va_list ap; va_start(ap, fmt); color_out(fmt, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN, ap); va_end(ap); } /* Generate gray output. */ static void grayout(char *fmt, ...) { va_list ap; va_start(ap, fmt); color_out(fmt, FOREGROUND_INTENSITY, ap); va_end(ap); } /** * Fetch a line of input from the console. * * The input is stripped of any leading whitespace and trailing whitespace, * and is NULL-terminated. * * @param[out] buf Buffer to read input into * @param[in] bufsize Size of buffer * * @return buf, or NULL if an error such as EOF is encountered. */ static char * get_input(char *buf, int bufsize) { char *s; size_t sl; /* Make sure all of the output gets out. */ fflush(stdout); /* Get the raw input from stdin. */ if (fgets(buf, bufsize, stdin) == NULL) { return NULL; } /* Trim leading whitespace. */ s = buf; sl = strlen(buf); while (*s && isspace(*s)) { s++; sl--; } if (s != buf) { memmove(buf, s, sl + 1); } /* Trim trailing whitespace. */ while (sl && isspace(buf[--sl])) { buf[sl] = '\0'; } return buf; } /** * Ask a yes or no question. * * @param[in] defval Default response (TRUE or FALSE). * * @return TRUE or FALSE Proper respoonse * YN_ERR I/O error occurred (usually EOF) * YN_RETRY User entry error, error message already printed */ static int getyn(int defval) { char yn[STR_SIZE]; if (get_input(yn, STR_SIZE) == NULL) { return YN_ERR; } if (!yn[0]) { return defval; } if (!strncasecmp(yn, "quit", strlen(yn))) { return YN_ERR; } if (!strncasecmp(yn, "yes", strlen(yn))) { return TRUE; } if (!strncasecmp(yn, "no", strlen(yn))) { return FALSE; } errout("\nPlease answer (y)es or (n)o."); return YN_RETRY; } /** * Gather the list of system printers from Windows. */ static void enum_printers(void) { DWORD needed = 0; DWORD returned = 0; /* Get the default printer name. */ default_printer[0] = '\0'; if (GetProfileString("windows", "device", "", default_printer, sizeof(default_printer)) != 0) { char *comma; if ((comma = strchr(default_printer, ',')) != NULL) { *comma = '\0'; } } /* Get the list of printers. */ if (EnumPrinters( PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 1, (LPBYTE)&printer_info, sizeof(printer_info), &needed, &returned) == 0) { return; } num_printers = returned; } /** * Get an 'other' printer name from the console. * * Accepts the name 'default' to mean the system default printer. * * @param[in] defname Default printer name to use for empty input, or * NULL * @param[out] printername Resulting printer name * @param[in] bufsize Size of printername buffer * * @return 0 for success, -1 for error such as EOF * Returns an empty string in 'printername' to indicate the default printer */ static int get_printer_name(const char *defname, char *printername, int bufsize) { for (;;) { printf("\nEnter Windows printer name: [%s] ", defname[0]? defname: "use system default"); fflush(stdout); if (get_input(printername, bufsize) == NULL) { return -1; } if (!printername[0]) { if (defname[0]) { snprintf(printername, bufsize, "%s", defname); } break; } if (!strcmp(printername, "default")) { printername[0] = '\0'; } if (strchr(printername, '!') || strchr(printername, ',')) { errout("\nInvalid printer name."); continue; } else { break; } } return 0; } typedef struct km { /* Keymap: */ struct km *next; /* List linkage */ char name[MAX_PATH]; /* Name */ char description[STR_SIZE]; /* Description */ char *def_both; /* Definition (common) */ char *def_3270; /* Definition (3270 mode) */ char *def_nvt; /* Definition (NVT mode) */ src_t src; /* Where it is: */ /* SRC_DOCUMENTS per-user */ /* SRC_PUBLIC_DOCUMENTS all-users */ /* SRC_NONE built-in */ /* SRC_OTHER install dir */ } km_t; km_t *km_first = NULL; km_t *km_last = NULL; /** * Save a keymap name. Return its node. * * @param[in] path Pathname of keymap file * @param[in] keymap_name Name of keymap * @param[in] description Keymap description, or NULL * @param[in] src Where it is * * @return Keymap node, possibly newly-allocated. */ static km_t * save_keymap_name(const char *path, char *keymap_name, const char *description, src_t src) { km_t *km; size_t sl; km_t *kms; FILE *f; enum { KMF_BOTH, KMF_3270, KMF_NVT } km_mode = KMF_BOTH; char **def = NULL; km = (km_t *)malloc(sizeof(km_t)); if (km == NULL) { errout("Out of memory\n"); return NULL; } memset(km, '\0', sizeof(km_t)); strcpy(km->name, keymap_name); km->description[0] = '\0'; sl = strlen(km->name); km->src = src; /* Slice off the '.wc3270km' suffix. */ if (sl > KS_LEN && !strcasecmp(km->name + sl - KS_LEN, KEYMAP_SUFFIX)) { km->name[sl - KS_LEN] = '\0'; sl -= KS_LEN; } /* Slice off any '.3270' or '.nvt' before that. */ if (sl > LEN_3270 && !strcasecmp(km->name + sl - LEN_3270, KM_3270)) { km->name[sl - LEN_3270] = '\0'; sl -= LEN_3270; km_mode = KMF_3270; } else if (sl > LEN_NVT && !strcasecmp(km->name + sl - LEN_NVT, KM_NVT)) { km->name[sl - LEN_NVT] = '\0'; sl -= LEN_NVT; km_mode = KMF_NVT; } for (kms = km_first; kms != NULL; kms = kms->next) { if (!strcasecmp(kms->name, km->name)) { break; } } if (kms != NULL) { free(km); km = kms; } else { km->next = NULL; if (km_last != NULL) { km_last->next = km; } else { km_first = km; } km_last = km; } /* Check if we've already seen this keymap. */ switch (km_mode) { case KMF_BOTH: def = &km->def_both; break; case KMF_3270: def = &km->def_3270; break; case KMF_NVT: def = &km->def_nvt; break; } if (*def != NULL) { return km; } if (description != NULL) { strcpy(km->description, description); return km; } /* Dig for a description and save the definition. */ if (path != NULL) { f = fopen(path, "r"); if (f != NULL) { char buf[STR_SIZE]; while (fgets(buf, STR_SIZE, f) != NULL) { int any = 0; sl = strlen(buf); if (sl > 0 && buf[sl - 1] == '\n') { buf[--sl] = '\0'; } if (!strncasecmp(buf, KM_DESC, LEN_DESC)) { strncpy(km->description, buf + LEN_DESC, sl - LEN_DESC + 1); continue; } if (buf[0] == '!' || !buf[0]) { continue; } if (*def == NULL) { *def = malloc(strlen(buf) + 2); } else { *def = realloc(*def, strlen(*def) + 5 + strlen(buf) + 1); any = 1; } if (*def == NULL) { errout("Out of memory\n"); exit(1); } if (!any) { strcat(strcpy(*def, " "), buf); } else { strcat(strcat(*def, "\\n\\\n "), buf); } } fclose(f); } } return km; } /** * Initialize keymaps from one directory. * * @param[in] src type of directory * @param[in] dirname name of directory */ static void save_keymaps_type(src_t src, const char *dirname) { char dpath[MAX_PATH]; char fpath[MAX_PATH]; HANDLE h; WIN32_FIND_DATA find_data; sprintf(dpath, "%s%s", dirname, DONE_FILE); if (access(dpath, R_OK) != 0) { sprintf(dpath, "%s*%s", searchdir, KEYMAP_SUFFIX); h = FindFirstFile(dpath, &find_data); if (h != INVALID_HANDLE_VALUE) { do { sprintf(fpath, "%s%s", dirname, find_data.cFileName); (void) save_keymap_name(fpath, find_data.cFileName, NULL, src); } while (FindNextFile(h, &find_data) != 0); FindClose(h); } } } /** * Initialize the set of available keymaps. * * Adds the builtin keymaps to a database, then searches the two Docs * directories for user-defined keymaps and adds those. * * @param[in] include_public if true, include public folder */ static void save_keymaps(bool include_public) { int i; for (i = 0; builtin_keymaps[i].name != NULL; i++) { (void) save_keymap_name(NULL, builtin_keymaps[i].name, builtin_keymaps[i].description, SRC_NONE); } save_keymaps_type(SRC_DOCUMENTS, searchdir); if (include_public) { save_keymaps_type(SRC_PUBLIC_DOCUMENTS, public_searchdir); } } /** * Fix up a UNC printer path in an old session file. * * The session wizard was originally written without understanding that * backslashes needed to be doubled. So it created session files with UNC * printer paths using incorrect syntax. This function patches that up. * * @param[in,out] s Session * * @return 1 if the name needed fixing, 0 otherwise. */ static int fixup_printer(session_t *s) { char buf[STR_SIZE]; int i, j; char c; if (s->printer[0] == '\\' && s->printer[1] == '\\' && s->printer[2] != '\\') { /* * The session file was created by an earlier version of the * session wizard, and contains a UNC printer path that has * not had its backslashes expanded. Expand them. */ j = 0; for (i = 0; i < (STR_SIZE - 1) && (c = s->printer[i]) != '\0'; i++) { if (c == '\\') { if (j < (STR_SIZE - 1)) { buf[j++] = '\\'; } if (j < (STR_SIZE - 1)) { buf[j++] = '\\'; } } else { if (j < (STR_SIZE - 1)) { buf[j++] = c; } } } buf[j] = '\0'; strncpy(s->printer, buf, STR_SIZE); return 1; } else { return 0; } } /** * Reformat a quoted UNC path for display. * * @param[in] expanded UNC path in session file (quoted) format * @param[out] condensed UNC path in display format * * @return 1 if it was reformatted, 0 otherwise. */ static int redisplay_printer(const char *expanded, char *condensed) { int i; int j; int bsl = 0; int reformatted = 0; j = 0; for (i = 0; i < STR_SIZE; i++) { char c = expanded[i]; if (c == '\0') { if (bsl) { goto abort; } condensed[j] = c; break; } if (bsl) { if (c == '\\') { reformatted = 1; bsl = 0; } else { goto abort; } } else { condensed[j++] = c; if (c == '\\') { bsl = 1; } } } return reformatted; abort: strcpy(condensed, expanded); return 0; } /** * Clear the screen, print a common banner and a title. * * @param[in] s Session (its name is displayed, if defined) * @param[in] path Pathname of session file, or NULL * @param[in] title Text to display after session and path */ static void new_screen(session_t *s, const char *path, const char *title) { static char wizard[] = "wc3270 Session Wizard"; cls(); reverseout("%s%*s%s\n", wizard, (int)(79 - strlen(wizard) - strlen(wversion)), " ", wversion); if (s->session[0]) { printf("\nSession: %s\n", s->session); } if (path != NULL) { printf("Path: %s\n", path); } printf("\n%s\n", title); } /* * List of main menu operations. * * N.B.: This list is sorted in menu_op_t (MO_XXX) order. If you re-order one, * you *must* re-order the other. */ struct { /* Menu options: */ const char *text; /* long name */ const char *name; /* short name */ const char *alias; /* short name alias */ bool requires_xs; /* if true, requires existing sessions */ bool requires_ad; /* if true, requires unmigrated files */ int num_params; /* number of command-line parameters to accept */ } main_option[] = { { NULL, NULL, FALSE, 0 }, /* intentional hole */ { "Create new session", "new", "create", false, false, 1 }, { "Edit session", "edit", NULL, true, false, 1 }, { "Delete session", "delete", "rm", true, false, 1 }, { "Copy session", "copy", "cp", true, false, 2 }, { "Rename session", "rename", "mv", true, false, 2 }, { "Create shortcut", "shortcut", NULL, true, false, 1 }, { "Migrate files from AppData", "migrate", NULL, false, true, 0 }, { "Quit", "quit", "exit", false, false, 0 }, { NULL, NULL, FALSE, 0 } /* end marker */ }; /** * Main screen. * * Displays a list of existing sessions (as a mnemonic) and a list of * available operations. Prompts for an operation. Returns the operation * selected. * * @param[out] argcp Returned number of parameters * @param[out] argvp Returned parameters * @param[in,out] result Result of previous operation * * @return menu_op_t describing selected operation */ #define MAX_TOKENS 3 static menu_op_t main_menu(int *argcp, char ***argvp, char *result) { static char enq[256]; static char *token[MAX_TOKENS + 1]; int num_tokens; int i; *argcp = 0; *argvp = NULL; new_screen(&empty_session, NULL, "\ Overview\n\ \n\ This wizard allows you to set up a new wc3270 session or modify an existing\n\ one. It also lets you create or replace a shortcut on the desktop.\n"); display_sessions(false, true); printf("\n"); for (i = MO_FIRST; main_option[i].text != NULL; i++) { if ((main_option[i].requires_xs && !num_xs) || (main_option[i].requires_ad && !ad_exist())) { #if 0 grayout(" %d. %s (%s)\n", i, main_option[i].text, main_option[i].name); #endif continue; } else { printf(" %d. %s (%s)\n", i, main_option[i].text, main_option[i].name); } } for (;;) { size_t sl; int mo; if (result && result[0]) { if (result[0] == 1) { greenout("\n%s", result + 1); } else { errout("\n%s", result + 1); } result[0] = '\0'; } printf("\nEnter command name or number (%d..%d) [%s] ", MO_FIRST, MO_LAST, main_option[MO_CREATE].name); fflush(stdout); if (get_input(enq, sizeof(enq)) == NULL) { return MO_ERR; } /* Check the default. */ sl = strlen(enq); if (!sl) { return MO_CREATE; } /* Split into tokens. */ num_tokens = 0; token[0] = strtok(enq, " \t"); if (token[0] == NULL) { errout("\nWow, am I confused.\n"); continue; } sl = strlen(token[0]); num_tokens++; while (num_tokens < MAX_TOKENS) { if ((token[num_tokens] = strtok(NULL, " \t")) != NULL) { num_tokens++; } else { break; } } if (strtok(NULL, " \t") != NULL) { goto extra; } token[num_tokens] = NULL; /* Check numbers. */ mo = atoi(token[0]); if (mo >= MO_FIRST && mo <= MO_LAST) { if (num_tokens > 1) { goto extra; } if (!num_xs && main_option[mo].requires_xs) { errout("\nUnknown command."); continue; } if (main_option[mo].requires_ad && !ad_exist()) { errout("\nUnknown command."); continue; } return (menu_op_t)mo; } /* Check keywords. */ for (i = MO_FIRST; main_option[i].text != NULL; i++) { if (!num_xs && main_option[i].requires_xs) { continue; } if (!strncasecmp(token[0], main_option[i].name, sl)) { if (num_tokens - 1 > main_option[i].num_params) { goto extra; } *argcp = num_tokens - 1; *argvp = token + 1; return (menu_op_t)i; } } /* Check again for aliases. */ for (i = MO_FIRST; main_option[i].text != NULL; i++) { if (!num_xs && main_option[i].requires_xs) { continue; } if (main_option[i].alias != NULL && !strncasecmp(token[0], main_option[i].alias, sl)) { if (num_tokens - 1 > main_option[i].num_params) { goto extra; } *argcp = num_tokens - 1; *argvp = token + 1; return (menu_op_t)i; } } errout("\nUnknown command."); continue; extra: errout("\nExtra parameter(s)."); continue; } } /** * Search a well-defined series of locations for a session file. * * @param[in] session_name Name of session * @param[out] path Returned pathname * * @return SRC_XXX enumeration */ static src_t find_session_file(const char *session_name, char *path) { /* Try the user's My Documents\wc3270. */ snprintf(path, MAX_PATH, "%s%s%s", documents_wc3270, session_name, SESS_SUFFIX); if (access(path, R_OK) == 0) { return SRC_DOCUMENTS; } /* Try the public Documents\wc3270. */ if (admin()) { snprintf(path, MAX_PATH, "%s%s%s", public_documents_wc3270, session_name, SESS_SUFFIX); if (access(path, R_OK) == 0) { return SRC_PUBLIC_DOCUMENTS; } } /* Try the user's Desktop. */ snprintf(path, MAX_PATH, "%s%s%s", desktop, session_name, SESS_SUFFIX); if (access(path, R_OK) == 0) { return SRC_DESKTOP; } /* Try the public Desktop. */ if (admin()) { snprintf(path, MAX_PATH, "%s%s%s", public_desktop, session_name, SESS_SUFFIX); if (access(path, R_OK) == 0) { return SRC_PUBLIC_DESKTOP; } } /* Try cwd. */ snprintf(path, MAX_PATH, "%s%s", session_name, SESS_SUFFIX); if (access(path, R_OK) == 0) { return SRC_OTHER; } /* * Put the new one in My Documents\wc3270. * XXX: I don't think this value is actually used. */ snprintf(path, MAX_PATH, "%s%s%s", documents_wc3270, session_name, SESS_SUFFIX); return SRC_OTHER; } /** * Check a session name for illegal characters. * * Displays an error message. * * @param[in] name Name to check * @param[in] result Result buffer for error message, or NULL * @param[in] result_size Size of result buffer * * @return true for success, false for error. */ #define SESSION_NAME_ERR \ "Illegal character(s).\n\ Session names can only have letters, numbers, spaces, underscores and dashes." static bool legal_session_name(const char *name, char *result, size_t result_size) { if (strspn(name, LEGAL_CNAME) != strlen(name)) { if (result != NULL) { snprintf(result, result_size, "%c%s", 2, SESSION_NAME_ERR); } else { errout("\n%s", SESSION_NAME_ERR); } return false; } else { return true; } } /** * Preliminary triage of session file. * * Prompts for a session name if one was not provided on the command line. * Figures out if the file is editable. Asks if an existing file should be * edited or (if not editable) replaced. * * @param[in] session_name Session name. If NULL, prompt for one * If non-NULL and does not end in .wc3270, take * this as the session name, and fail if it * contains invalid characters. * If non-NULL and ends in .wc3270, take this as * the path to the session file. * @param[out] s Session structure to fill in with name and (if * the file exists) current contents * @param[out] us User parameters * @param[out] path Pathname of session file * @param[in] explicit_edit If true, -e was passed on command line; skip * the 'exists. Edit?' dialog * @param[out] src Where the session file was found, if it exists * * Returns: gs_t * GS_NEW file does not exist * GS_EDIT file does exist and is editable, edit it * GS_NOEDIT file does exist and is editable, do not edit it * GS_OVERWRITE file exists but is uneditable, overwrite it * GS_ERR fatal error * GS_NOEDIT_LEAVE uneditable and they don't want to overwrite it */ static gs_t get_session(const char *session_name, session_t *s, char **us, char *path, bool explicit_edit, src_t *src) { FILE *f; int rc; int editable; *src = SRC_OTHER; if (session_name != NULL) { size_t sl = strlen(session_name); size_t slen = sizeof(s->session); /* * Session file pathname or session name specified on the * command line. */ if (sl > SESS_LEN && !strcasecmp(session_name + sl - SESS_LEN, SESS_SUFFIX)) { char *bsl; char *colon; /* Ends in .wc3270km. Pathname. */ path[MAX_PATH - 1] = '\0'; bsl = strrchr(session_name, '\\'); colon = strrchr(session_name, ':'); if (bsl == NULL && colon == NULL) { /* * No directory or drive prefix -- just a file name. */ if (sl - SESS_LEN + 1 < slen) { slen = sl - SESS_LEN + 1; } strncpy(s->session, session_name, slen); s->session[slen - 1] = '\0'; *src = find_session_file(s->session, path); } else { /* * Full pathname. Copy what's between the last [:\] and * ".wc3270" as the session name. */ char *start; strncpy(path, session_name, MAX_PATH); if (bsl != NULL && colon == NULL) { start = bsl + 1; } else if (bsl == NULL && colon != NULL) { start = colon + 1; } else if (bsl > colon) { start = bsl + 1; } else { start = colon + 1; } if (strlen(start) - SESS_LEN + 1 < slen) { slen = strlen(start) - SESS_LEN + 1; } strncpy(s->session, start, slen); s->session[slen - 1] = '\0'; /* * Try to figure out where it is. This is inherently * imperfect. */ if (!strncmp(path, documents_wc3270, strlen(documents_wc3270))) { *src = SRC_DOCUMENTS; } else if (!strncmp(path, public_documents_wc3270, strlen(public_documents_wc3270))) { *src = SRC_PUBLIC_DOCUMENTS; } else if (!strncmp(path, desktop, strlen(desktop))) { *src = SRC_DESKTOP; } else if (!strncmp(path, public_desktop, strlen(public_desktop))) { *src = SRC_PUBLIC_DESKTOP; } else { *src = SRC_OTHER; } } } else { /* Session name, no suffix. */ strncpy(s->session, session_name, slen); s->session[slen - 1] = '\0'; *src = find_session_file(s->session, path); } /* Validate the session name. */ if (!legal_session_name(s->session, NULL, 0)) { return GS_ERR; } } else { /* Get the session name interactively. */ new_screen(s, NULL, "\ New Session Name\n\ \n\ This is a unique name for the wc3270 session. It is the name of the file\n\ containing the session configuration parameters and the name of the desktop\n\ shortcut."); for (;;) { printf("\nEnter session name: "); fflush(stdout); if (get_input(s->session, sizeof(s->session)) == NULL) { return GS_ERR; } if (!s->session[0]) { continue; } if (!legal_session_name(s->session, NULL, 0)) { continue; } break; } *src = find_session_file(s->session, path); } f = fopen(path, "r"); if (f != NULL) { editable = read_session(f, s, us); fclose(f); if (editable) { if (fixup_printer(s)) { printf("\n" "NOTE: This session file contains a UNC printer name that needs to be updated\n" " to be compatible with the current version of wc3270. Even if you do not\n" " need to make any other changes to the session, please select the Edit and\n" " Update options to have this name automatically corrected.\n"); } } if (editable) { if (explicit_edit) { return GS_EDIT; /* edit it */ } for (;;) { printf("\nSession '%s' exists", s->session); switch (*src) { case SRC_PUBLIC_DOCUMENTS: printf(" (defined for all users)"); break; case SRC_DOCUMENTS: printf(" (defined for user '%s')", username); break; default: break; } printf(".\nEdit it? (y/n) [y] "); fflush(stdout); rc = getyn(TRUE); if (rc == YN_ERR) { return GS_ERR; } else if (rc == FALSE) { return GS_NOEDIT; /* do not edit */ } else if (rc == TRUE) { return GS_EDIT; /* edit it */ } } } else { for (;;) { printf("\nSession '%s' already exists but cannot be edited. " "Replace it? (y/n) [n] ", s->session); fflush(stdout); rc = getyn(FALSE); if (rc == YN_ERR) { return GS_ERR; } else if (rc == FALSE) { return GS_NOEDIT_LEAVE; /* don't overwrite */ } else if (rc == TRUE) { return GS_OVERWRITE; /* overwrite */ } } } } else { /* * Set the auto-shortcut flag in all new session files, * but not in old ones. This will prevent unintended * interactions with old shortcuts that don't specify +S, but * will allow new session files to be started with a * double-click. */ s->flags |= WF_AUTO_SHORTCUT; return GS_NEW; /* create it */ } } /** * Prompt for a hostname or address. * * Allows IPv6 addresses if the underlying OS supports them. * * @param[in,out] s Session * * @return 0 for success, -1 for failure. */ static int get_host(session_t *s) { char buf[STR_SIZE]; #define COMMON_HOST_TEXT1 "\ Host Name\n\ \n\ This specifies the IBM host to connect to. It can be a symbolic name like\n\ 'foo.company.com'" #define COMMON_HOST_TEXT2 "\ an IPv4 address in dotted-decimal notation such as\n\ '1.2.3.4'" #define IPV6_HOST_TEXT "\ an IPv6 address in colon notation, such as 'fec0:0:0:1::27'" #define COMMON_HOST_TEXT3 "\ \n\ \n\ To create a session file with no hostname (one that just specifies the model\n\ number, character set, etc.), enter '" CHOICE_NONE "'." new_screen(s, NULL, COMMON_HOST_TEXT1 ", " COMMON_HOST_TEXT2 " or " IPV6_HOST_TEXT "." COMMON_HOST_TEXT3); for (;;) { size_t n_good; if (s->host[0]) { printf("\nEnter host name or IP address: [%s] ", s->host); } else { printf("\nEnter host name or IP address: "); } fflush(stdout); if (get_input(buf, sizeof(s->host)) == NULL) { return -1; } else if (!strcmp(buf, CHOICE_NONE)) { strcpy(s->host, buf); break; } n_good = strcspn(buf, " @[]"); if (n_good != strlen(buf)) { errout("\nInvalid character '%c' in host name.", buf[n_good]); continue; } if (!buf[0]) { if (!s->host[0]) { continue; } } else { strcpy(s->host, buf); } break; } return 0; } /** * Prompt for a port number. * * Allows an non-zero 16-bit number, or the name 'telnet' (23). * * @return 0 for success, -1 for error. */ static int get_port(session_t *s) { char inbuf[STR_SIZE]; char *ptr; unsigned long u; new_screen(s, NULL, "\ TCP Port\n\ \n\ This specifies the TCP Port to use to connect to the host. It is a number from\n\ 1 to 65535 or the name 'telnet'. The default is the 'telnet' port, port 23."); for (;;) { printf("\nTCP port: [%d] ", (int)s->port); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } else if (!inbuf[0]) { break; } else if (!strcasecmp(inbuf, "telnet")) { s->port = 23; break; } u = strtoul(inbuf, &ptr, 10); if (u < 1 || u > 65535 || *ptr != '\0') { errout("\nInvalid port."); } else { s->port = (int)u; break; } } return 0; } static int get_lu(session_t *s) { char buf[STR_SIZE]; new_screen(s, NULL, "\ Logical Unit (LU) Name\n\ \n\ This specifies a particular Logical Unit or Logical Unit group to connect to\n\ on the host. The default is to allow the host to select the Logical Unit."); for (;;) { size_t n_good; printf("\nEnter Logical Unit (LU) name: [%s] ", s->luname[0]? s->luname: CHOICE_NONE); fflush(stdout); if (get_input(buf, sizeof(buf)) == NULL) { return -1; } else if (!buf[0]) { break; } else if (!strcmp(buf, CHOICE_NONE)) { s->luname[0] = '\0'; break; } n_good = strcspn(buf, ":@[]"); if (n_good != strlen(buf)) { errout("\nLU name contains invalid character '%c'", buf[n_good]); continue; } strcpy(s->luname, buf); break; } return 0; } /** * Prompt for a model number. * * @param[in,out] s Session * * @return 0 for success, -1 for error. */ static int get_model(session_t *s) { unsigned long i; char inbuf[STR_SIZE]; char *ptr; unsigned long u; unsigned long max_model = 5; new_screen(s, NULL, "\ Model Number\n\ \n\ This specifies the dimensions of the screen."); printf("\n"); for (i = 2; i <= max_model; i++) { if (wrows[i]) { printf(" Model %lu has %2d rows and %3d columns.\n", i, wrows[i], wcols[i]); } } for (;;) { printf("\nEnter model number: (2, 3, 4 or 5) [%d] ", (int)s->model); fflush(stdout); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } else if (!inbuf[0]) { break; } u = strtoul(inbuf, &ptr, 10); if (u < 2 || u > max_model || *ptr != '\0') { errout("\nInvalid model number."); continue; } else if (s->model != (int)u) { s->model = (int)u; s->ov_rows = 0; s->ov_cols = 0; } break; } return 0; } /** * Prompt for an oversize option. * * @param[in,out] s Session * * @return 0 for success, -1 for error */ static int get_oversize(session_t *s) { char inbuf[STR_SIZE]; unsigned r, c; char xc; new_screen(s, NULL, "\ Oversize\n\ \n\ This specifies 'oversize' dimensions for the screen, beyond the number of\n\ rows and columns specified by the model number. Some hosts are able to use\n\ this additional screen area; some are not. Enter '"CHOICE_NONE"' to specify no\n\ oversize."); printf("\n\ The oversize must be larger than the default for a model %d (%u rows x %u\n\ columns).\n", (int)s->model, wrows[s->model], wcols[s->model]); for (;;) { printf("\nEnter oversize dimensions (rows x columns) "); if (s->ov_rows || s->ov_cols) { printf("[%ux%u]: ", s->ov_rows, s->ov_cols); } else { printf("["CHOICE_NONE"]: "); } fflush(stdout); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } else if (!inbuf[0]) { break; } else if (!strcasecmp(inbuf, CHOICE_NONE)) { s->ov_rows = 0; s->ov_cols = 0; break; } else if (sscanf(inbuf, "%u x %u%c", &r, &c, &xc) != 2) { errout("\nPlease enter oversize in the form 'rows x cols'."); continue; } else if ((int)r < wrows[s->model] || (int)c < wcols[s->model]) { errout("\nOversize must be larger than the default for a model %d " "(%u x %u).", (int)s->model, wrows[s->model], wcols[s->model]); continue; } else if (r > 255 || c > 255) { errout("\nRows and columns must be 255 or less."); continue; } else if (r * c > 0x4000) { errout("\nThe total screen area (rows multiplied by columns) must " "be less than %d.", 0x4000); continue; } s->ov_rows = (unsigned char)r; s->ov_cols = (unsigned char)c; break; } return 0; } /** * Issue a warning for DBCS characters sets. */ static void dbcs_check(void) { if (IsWindowsVersionOrGreater(6, 0, 0)) { printf("\n\ Note: wc3270 DBCS support on Windows Vista and later requires setting the\n\ Windows System Locale to a matching language.\n"); } else { printf("\n\ Note: wc3270 DBCS support on Windows XP requires installation of Windows East\n\ Asian language support.\n"); } printf("[Press Enter to continue] "); fflush(stdout); (void) getchar(); } /** * Prompt for a character set. * * @param[in,out] s Session * * @return 0 for success, -1 for error */ static int get_charset(session_t *s) { char buf[STR_SIZE]; unsigned i, k; char *ptr; unsigned long u; int was_dbcs = s->is_dbcs; new_screen(s, NULL, "\ Character Set\n\ \n\ This specifies the EBCDIC character set (code page) used by the host."); printf("\ \nAvailable character sets:\n\n\ # Name Host CP # Name Host CP\n\ --- ------------------- -------- --- ------------------- --------\n"); k = 0; for (i = 0; charsets[i].name != NULL; i++) { size_t j; if (i) { if (!(i % CS_COLS)) { printf("\n"); } else { printf(" "); } } if (!(i % 2)) { j = k; } else { j += num_charsets / 2; k++; } printf(" %2d. %-*s %-*s", (int)(j + 1), CS_WIDTH, charsets[j].name, CP_WIDTH, charsets[j].hostcp); } printf("\n"); for (;;) { printf("\nCharacter set: [%s] ", s->charset); if (get_input(buf, sizeof(buf)) == NULL) { return -1; } if (!buf[0]) { break; } /* Check for numeric value. */ u = strtoul(buf, &ptr, 10); if (u > 0 && u <= i && *ptr == '\0') { strcpy(s->charset, charsets[u - 1].name); s->is_dbcs = charsets[u - 1].is_dbcs; break; } /* Check for alias. */ for (i = 0; charset_alias[i].alias != NULL; i++) { if (!strcmp(buf, charset_alias[i].alias)) { strcpy(buf, charset_alias[i].real); break; } } /* Check for name match. */ for (i = 0; charsets[i].name != NULL; i++) { if (!strcmp(buf, charsets[i].name)) { strcpy(s->charset, charsets[i].name); s->is_dbcs = charsets[i].is_dbcs; break; } } if (charsets[i].name != NULL) { break; } errout("\nInvalid character set name."); } if (!was_dbcs && s->is_dbcs) { dbcs_check(); } return 0; } /** * Prompt for crosshair cursor mode. * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_crosshair(session_t *s) { int rc; new_screen(s, NULL, "\ Crosshair Cursor\n\ \n\ This option causes wc3270 to use a crosshair cursor."); do { printf("\nCrosshair cursor? [%s] ", (s->flags & WF_CROSSHAIR)? "y" : "n"); fflush(stdout); rc = getyn((s->flags & WF_CROSSHAIR) != 0); switch (rc) { case YN_ERR: return -1; case TRUE: s->flags |= WF_CROSSHAIR; break; case FALSE: s->flags &= ~WF_CROSSHAIR; break; } } while (rc < 0); return 0; } /** * Prompt for alternate cursor mode. * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_cursor_type(session_t *s) { char inbuf[STR_SIZE]; new_screen(s, NULL, "\ Cursor Type\n\ \n\ This option controls whether the wc3270 cursor is a block or an underscore."); do { printf("\nCursor type? (block/underscore) [%s] ", (s->flags & WF_ALTCURSOR)? "underscore" : "block"); fflush(stdout); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } if (!inbuf[0]) { break; } if (!strncasecmp(inbuf, "quit", strlen(inbuf))) { return -1; } if (!strncasecmp(inbuf, "underscore", strlen(inbuf))) { s->flags |= WF_ALTCURSOR; break; } if (!strncasecmp(inbuf, "block", strlen(inbuf))) { s->flags &= ~WF_ALTCURSOR; break; } errout("\nPlease answer 'underscore' or 'block'."); } while (true); return 0; } /** * Prompt for SSL tunnel mode. * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_ssl(session_t *s) { new_screen(s, NULL, "\ SSL Tunnel\n\ \n\ This option causes wc3270 to first create a tunnel to the host using the\n\ Secure Sockets Layer (SSL), then to run the TN3270 session inside the tunnel."); do { printf("\nUse an SSL tunnel? (y/n) [%s] ", s->ssl? "y" : "n"); fflush(stdout); s->ssl = getyn(s->ssl); if (s->ssl == YN_ERR) { return -1; } } while (s->ssl < 0); return 0; } /** * Prompt for verify-host-certificate mode * * @param[in,out] s Session * * @return 0 for success, -1 for error */ static int get_verify(session_t *s) { int rc; new_screen(s, NULL, "\ Verify Host Certificates\n\ \n\ This option causes wc3270 to verify the certificates presented by the host\n\ if an SSL tunnel is used, or if the TELNET TLS option is negotiated. If the\n\ certificates are not valid, the connection will be aborted."); do { printf("\nVerify host certificates? (y/n) [%s] ", (s->flags & WF_VERIFY_HOST_CERTS)? "y" : "n"); fflush(stdout); rc = getyn((s->flags & WF_VERIFY_HOST_CERTS) != 0); switch (rc) { case YN_ERR: return -1; case TRUE: s->flags |= WF_VERIFY_HOST_CERTS; break; case FALSE: s->flags &= ~WF_VERIFY_HOST_CERTS; break; } } while (rc < 0); return 0; } /** * Prompt for proxy server name * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_proxy_server(session_t *s) { char hbuf[STR_SIZE]; /* Get the hostname. */ for (;;) { if (s->proxy_host[0]) { printf("\nProxy server name: [%s] ", s->proxy_host); } else { printf("\nProxy server name: "); } if (get_input(hbuf, STR_SIZE) == NULL) { return -1; } if (!hbuf[0]) { if (s->proxy_host[0]) { break; } else { continue; } } if (strchr(hbuf, '[') != NULL || strchr(hbuf, ']') != NULL) { errout("\nServer name cannot include '[' or ']'."); continue; } strcpy(s->proxy_host, hbuf); break; } return 0; } /** * Prompt for proxy server port * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_proxy_server_port(session_t *s) { char pbuf[STR_SIZE]; int i; for (i = 0; proxies[i].name != NULL; i++) { if (!strcmp(s->proxy_type, proxies[i].name)) break; } if (proxies[i].name == NULL) { errout("Internal error\n"); return -1; } for (;;) { unsigned long l; char *ptr; if (s->proxy_port[0]) { printf("\nProxy server TCP port: [%s] ", s->proxy_port); } else if (proxies[i].port != NULL) { printf("\nProxy server TCP port: [%s] ", proxies[i].port); } else { printf("\nProxy server TCP port: "); } if (get_input(pbuf, STR_SIZE) == NULL) { return -1; } else if (!strcmp(pbuf, "default") && proxies[i].port != NULL) { strcpy(s->proxy_port, proxies[i].port); break; } else if (!pbuf[0]) { if (s->proxy_port[0]) { break; } else if (proxies[i].port != NULL) { strcpy(s->proxy_port, proxies[i].port); break; } else { continue; } } l = strtoul(pbuf, &ptr, 10); if (l == 0 || *ptr != '\0' || (l & ~0xffffL)) { errout("\nInvalid port."); } else { strcpy(s->proxy_port, pbuf); break; } } return 0; } /** * Prompt for proxy type * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_proxy(session_t *s) { int i, j; char tbuf[STR_SIZE]; char old_proxy[STR_SIZE]; new_screen(s, NULL, "\ Proxy\n\ \n\ If you do not have a direct connection to your host, this option allows\n\ wc3270 to use a proxy server to make the connection."); printf("\nProxy types available:\n"); printf(" 1. none Direct connection to host\n"); for (i = 0; proxies[i].name != NULL; i++) { printf(" %d. %-8s %s\n", i + 2, proxies[i].name, proxies[i].protocol); } strcpy(old_proxy, s->proxy_type); /* Get the proxy type. */ for (;;) { int n; printf("\nProxy type: [%s] ", s->proxy_type[0]? s->proxy_type: CHOICE_NONE ); if (get_input(tbuf, STR_SIZE) == NULL) { return -1; } else if (!tbuf[0]) { return 0; } else if (!strcasecmp(tbuf, CHOICE_NONE)) { s->proxy_type[0] = '\0'; s->proxy_host[0] = '\0'; s->proxy_port[0] = '\0'; return 0; } for (j = 0; proxies[j].name != NULL; j++) { if (!strcasecmp(tbuf, proxies[j].name)) { break; } } if (proxies[j].name != NULL) { strcpy(s->proxy_type, tbuf); break; } n = atoi(tbuf); if (n > 0 && n <= i+1) { if (n == 1) { s->proxy_type[0] = '\0'; s->proxy_host[0] = '\0'; s->proxy_port[0] = '\0'; return 0; } else { j = n - 2; strcpy(s->proxy_type, proxies[j].name); break; } } errout("\nInvalid proxy type."); } /* If the type changed, the rest of the information is invalid. */ if (strcmp(old_proxy, s->proxy_type)) { s->proxy_host[0] = '\0'; s->proxy_port[0] = '\0'; if (get_proxy_server(s) < 0) { return -1; } if (proxies[j].port != NULL) { strcpy(s->proxy_port, proxies[j].port); } else if (get_proxy_server_port(s) < 0) { return -1; } } return 0; } /** * Prompt for wpr3287 session * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_wpr3287(session_t *s) { new_screen(s, NULL, "\ wpr3287 Session\n\ \n\ This option allows wc3270 to automatically start a wpr3287 printer session\n\ when it connects to the host, allowing the host to direct print jobs to a\n\ Windows printer."); do { printf("\nAutomatically start a wpr3287 printer session? (y/n) [n] "); fflush(stdout); s->wpr3287 = getyn(s->wpr3287); if (s->wpr3287 == YN_ERR) { return -1; } } while (s->wpr3287 < 0); if (s->wpr3287 == 0) { strcpy(s->printerlu, "."); } return 0; } /** * Prompt for wpr3287 session mode (associate/LU) * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_printer_mode(session_t *s) { int rc; new_screen(s, NULL, "\ wpr3287 Session -- Printer Mode\n\ \n\ The wpr3287 printer session can be configured in one of two ways. The first\n\ method automatically associates the printer session with the current login\n\ session. The second method specifies a particular Logical Unit (LU) to use\n\ for the printer session."); do { printf("\nAssociate the printer session with the current login " "session (y/n) [%s]: ", strcmp(s->printerlu, ".")? "n": "y"); fflush(stdout); rc = getyn(!strcmp(s->printerlu, ".")); switch (rc) { case YN_ERR: return -1; case FALSE: if (!strcmp(s->printerlu, ".")) { s->printerlu[0] = '\0'; } break; case TRUE: strcpy(s->printerlu, "."); break; } } while (rc < 0); if (strcmp(s->printerlu, ".") && get_printerlu(s, 0) < 0) { return -1; } return 0; } /** * Prompt for wpr3287 session LU name * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_printerlu(session_t *s, int explain) { if (explain) { new_screen(s, NULL, "\ wpr3287 Session -- Printer Logical Unit (LU) Name\n\ \n\ If the wpr3287 printer session is associated with a particular Logical Unit,\n\ then that Logical Unit must be configured explicitly."); } for (;;) { char tbuf[STR_SIZE]; if (s->printerlu[0]) { printf("\nEnter printer Logical Unit (LU) name: [%s] ", s->printerlu); } else { printf("\nEnter printer Logical Unit (LU) name: "); } fflush(stdout); if (get_input(tbuf, STR_SIZE) == NULL) { return -1; } if (!tbuf[0]) { if (s->printerlu[0]) { break; } else { continue; } } else { strcpy(s->printerlu, tbuf); break; } } return 0; } /** * Prompt for wpr3287 session printer name * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_printer(session_t *s) { char tbuf[STR_SIZE]; unsigned i; char *ptr; unsigned long u; char cbuf[STR_SIZE]; int matching_printer = -1; new_screen(s, NULL, "\ wpr3287 Session -- Windows Printer Name\n\ \n\ The wpr3287 session can use the Windows default printer as its real printer,\n\ or you can specify a particular Windows printer. You can specify a local\n\ printer, or specify a remote printer with a UNC path, e.g.,\n\ '\\\\server\\printer22'. You can specify the Windows default printer with\n\ the name 'default'."); (void) redisplay_printer(s->printer, cbuf); enum_printers(); if (num_printers) { printf("\nWindows printers (system default is '*'):\n"); for (i = 0; i < num_printers; i++) { printf(" %2d. %c %s\n", i + 1, strcasecmp(default_printer, printer_info[i].pName)? ' ': '*', printer_info[i].pName); if (!strcasecmp(cbuf, printer_info[i].pName)) { matching_printer = i; } } printf(" %2d. Other\n", num_printers + 1); if (cbuf[0] && matching_printer < 0) { matching_printer = num_printers; } for (;;) { if (s->printer[0]) { printf("\nEnter Windows printer (1-%d): [%d] ", num_printers + 1, matching_printer + 1); } else { printf("\nEnter Windows printer (1-%d): [use system " "default] ", num_printers + 1); } fflush(stdout); if (get_input(tbuf, STR_SIZE) == NULL) { return -1; } else if (!tbuf[0]) { if (!s->printer[0] || matching_printer < (int)num_printers) { break; } /* * An interesting hack. If they entered nothing, and the * default is 'other', pretend they typed in the number for * 'other'. */ snprintf(tbuf, sizeof(tbuf), "%d", matching_printer + 1); } else if (!strcmp(tbuf, "default")) { s->printer[0] = '\0'; break; } u = strtoul(tbuf, &ptr, 10); if (*ptr != '\0' || u == 0 || u > num_printers + 1) { continue; } else if (u == num_printers + 1) { if (get_printer_name(cbuf, tbuf, STR_SIZE) < 0) { return -1; } strcpy(s->printer, tbuf); break; } strcpy(s->printer, printer_info[u - 1].pName); break; } } else { if (get_printer_name(cbuf, tbuf, STR_SIZE) < 0) { return -1; } strcpy(s->printer, tbuf); } /* * If the resulting printer name is a UNC path, double the * backslashes. */ (void) fixup_printer(s); return 0; } /** * Prompt for wpr3287 session printer code page * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_printercp(session_t *s) { char buf[STR_SIZE]; new_screen(s, NULL, "\ wpr3287 Session -- Printer Code Page\n\ \n\ By default, wpr3287 uses the system's default ANSI code page. You can\n\ override that code page here, or specify 'default' to use the system ANSI code\n\ page."); for (;;) { int cp; printf("\nPrinter code page [%s]: ", s->printercp[0]? s->printercp: "default"); fflush(stdout); if (get_input(buf, STR_SIZE) == NULL) { return -1; } else if (!buf[0]) { break; } else if (!strcmp(buf, "default")) { s->printercp[0] = '\0'; break; } cp = atoi(buf); if (cp <= 0) { errout("\nInvald code page."); } else { strcpy(s->printercp, buf); break; } } return 0; } /** * Prompt for keymap names * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_keymaps(session_t *s) { km_t *km; new_screen(s, NULL, "\ Keymaps\n\ \n\ A keymap is a mapping from the PC keyboard to the virtual 3270 keyboard.\n\ You can override the default keymap and specify one or more built-in or \n\ user-defined keymaps, separated by commas."); printf("\n"); for (km = km_first; km != NULL; km = km->next) { printf(" %s\n", km->name); if (km->description[0]) { printf(" %s", km->description); } printf("\n"); } for (;;) { char inbuf[STR_SIZE]; char tknbuf[STR_SIZE]; char *t; char *buf; bool wrong = false; printf("\nEnter keymap name(s) [%s]: ", s->keymaps[0]? s->keymaps: CHOICE_NONE); fflush(stdout); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } else if (!inbuf[0]) { break; } else if (!strcmp(inbuf, CHOICE_NONE)) { s->keymaps[0] = '\0'; break; } strcpy(tknbuf, inbuf); wrong = false; buf = tknbuf; while (!wrong && (t = strtok(buf, ",")) != NULL) { buf = NULL; for (km = km_first; km != NULL; km = km->next) { if (!strcasecmp(t, km->name)) { break; } } if (km == NULL) { errout("Invalid keymap name '%s'.", t); wrong = true; break; } } if (!wrong) { strcpy(s->keymaps, inbuf); break; } } return 0; } /** * Prompt for keymap embedding (copying keymaps into session file) * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_embed(session_t *s) { int rc; new_screen(s, NULL, "\ Embed Keymaps\n\ \n\ If selected, this option causes any selected keymaps to be copied into the\n\ session file, instead of being found at runtime."); do { printf("\nEmbed keymaps? (y/n) [%s] ", (s->flags & WF_EMBED_KEYMAPS)? "y": "n"); fflush(stdout); rc = getyn((s->flags & WF_EMBED_KEYMAPS) != 0); switch (rc) { case YN_ERR: return -1; case TRUE: s->flags |= WF_EMBED_KEYMAPS; break; case FALSE: s->flags &= ~WF_EMBED_KEYMAPS; break; } } while (rc < 0); return 0; } /** * Prompt for screen font size * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_fontsize(session_t *s) { new_screen(s, NULL, "\ Font Size\n\ \n\ Allows the font size (character height in pixels) to be specified for the\n\ wc3270 window. The size must be between 5 and 72. The default is 12."); for (;;) { char inbuf[STR_SIZE]; unsigned long u; char *ptr; printf("\nFont size (5 to 72) [%u]: ", s->point_size? s->point_size: 12); fflush(stdout); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } else if (!inbuf[0]) { break; } else if (!strcasecmp(inbuf, CHOICE_NONE)) { s->point_size = 0; break; } u = strtoul(inbuf, &ptr, 10); if (*ptr != '\0' || u == 0 || u < 5 || u > 72) { errout("\nInvalid font size."); continue; } s->point_size = (unsigned char)u; break; } return 0; } /** * Prompt for screen background color * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_background(session_t *s) { new_screen(s, NULL, "\ Background Color\n\ \n\ This option selects whether the screen background is black (the default) or\n\ white."); for (;;) { char inbuf[STR_SIZE]; printf("\nBackground color? (black/white) [%s] ", (s->flags & WF_WHITE_BG)? "white": "black"); fflush(stdout); if (get_input(inbuf, sizeof(inbuf)) == NULL) { return -1; } else if (!inbuf[0]) { break; } else if (!strcasecmp(inbuf, "black")) { s->flags &= ~WF_WHITE_BG; break; } else if (!strcasecmp(inbuf, "white")) { s->flags |= WF_WHITE_BG; break; } errout("\nPlease answer 'black' or 'white'."); } return 0; } /** * Prompt for menubar mode * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_menubar(session_t *s) { int rc; new_screen(s, NULL, "\ Menu Bar\n\ \n\ This option selects whether the menu bar is displayed on the screen."); do { printf("\nDisplay menu bar? (y/n) [%s] ", (s->flags & WF_NO_MENUBAR)? "n": "y"); fflush(stdout); rc = getyn(!(s->flags & WF_NO_MENUBAR)); switch (rc) { case YN_ERR: return -1; case FALSE: s->flags |= WF_NO_MENUBAR; break; case TRUE: s->flags &= ~WF_NO_MENUBAR; break; } } while (rc < 0); return 0; } /** * Prompt for trace-at-startup mode * * @param[in,out] s Session * * @return 0 for success, -1 for failure */ static int get_trace(session_t *s) { int rc; new_screen(s, NULL, "\ Tracing\n\ \n\ This option causes wc3270 to begin tracing at start-up. The trace file will\n\ be left on your desktop."); do { printf("\nTrace at start-up? (y/n) [%s] ", (s->flags & WF_TRACE)? "y" : "n"); fflush(stdout); rc = getyn((s->flags & WF_TRACE) != 0); switch (rc) { case YN_ERR: return -1; case TRUE: s->flags |= WF_TRACE; break; case FALSE: s->flags &= ~WF_TRACE; break; } } while (rc < 0); return 0; } /** * Run Notepad on the session file, allowing arbitrary resources to be * edited. * * @param[in] s Session * @param[in,out] us User settings * * @return 0 for success, -1 for failure */ static int run_notepad(session_t *s, char **us) { int rc; char *t = NULL; char cmd[MAX_PATH + 64]; FILE *f; char *new_us; char buf[2]; new_screen(s, NULL, "\ Notepad\n\ \n\ This option will start up the Windows Notepad editor to allow you to edit\n\ miscellaneous resources in your session file."); do { printf("\nProceed? (y/n) [y] "); fflush(stdout); rc = getyn(TRUE); switch (rc) { case YN_ERR: return -1; case FALSE: return 0; case TRUE: break; } } while (rc < 0); t = _tempnam(NULL, "w3270wiz"); if (t == NULL) { errout("Error creating temporary session file name.\n"); goto failed; } f = fopen(t, "w"); if (f == NULL) { errout("Error creating temporary session file: %s\n", strerror(errno)); goto failed; } fprintf(f, "! Comment lines begin with '!', like this one.\n\ ! Resource values look like this (without the '!'):\n\ ! wc3270.printTestScreensPerPage: 3\n"); write_user_settings(*us, f); fclose(f); f = NULL; printf("Starting Notepad... "); fflush(stdout); snprintf(cmd, sizeof(cmd), "start/wait notepad.exe \"%s\"", t); system(cmd); printf("done\n"); f = fopen(t, "r"); if (f == NULL) { errout("Error reading back temporary session file: %s\n", strerror(errno)); goto failed; } new_us = NULL; if (read_user_settings(f, &new_us) == 0) { errout("Error reading back temporary session file.\n"); goto failed; } fclose(f); if (*us != NULL) { free(*us); } *us = new_us; unlink(t); free(t); return 0; failed: grayout("[Press ] "); fflush(stdout); (void) fgets(buf, 2, stdin); if (t != NULL) { free(t); } return -1; } typedef enum { SP_REPLACE, /* replace uneditable file */ SP_CREATE, /* create new file */ SP_UPDATE, /* update editable file */ N_SP } sp_t; static char *how_name[N_SP] = { "Replace", "Create", "Update" }; /** * Prompt for where a session file should go (all-users or current user's * Docs). * * @param[in] s Session * * @return 0 for success, -1 for failure */ static src_t get_src(const char *name, src_t def) { char ac[STR_SIZE]; src_t src_out = def; /* Ask where they want the file. */ if (admin()) { for (;;) { printf("\nCreate '%s' in My Documents or Public Documents? " "(my/public) [%s] ", name, (def == SRC_PUBLIC_DOCUMENTS)? "public": "my"); fflush(stdout); if (get_input(ac, STR_SIZE) == NULL) { return SRC_ERR; } else if (!ac[0]) { break; } else if (!strncasecmp(ac, "public", strlen(ac))) { src_out = SRC_PUBLIC_DOCUMENTS; break; } else if (!strncasecmp(ac, "my", strlen(ac)) || !strcasecmp(ac, username)) { src_out = SRC_DOCUMENTS; break; } else if (!strncasecmp(ac, "quit", strlen(ac))) { return SRC_NONE; } else { errout("\nPlease answer 'my' or 'public'."); } } } else { return SRC_DOCUMENTS; } /* Make sure the subfolder exists. */ create_wc3270_folder(src_out); return src_out; } /** * Translate a wc3270 character set name to a font for the console. * * @param[in] cset Character set name * @param[out] codepage Windows codepage * * @return Font name */ static wchar_t * reg_font_from_cset(const char *cset, int *codepage) { unsigned i, j; wchar_t *cpname = NULL; wchar_t data[1024]; DWORD dlen; HKEY key; static wchar_t font[1024]; DWORD type; *codepage = 0; /* Search the table for a match. */ for (i = 0; charsets[i].name != NULL; i++) { if (!strcmp(cset, charsets[i].name)) { cpname = charsets[i].codepage; break; } } /* If no match, use Lucida Console. */ if (cpname == NULL) { return L"Lucida Console"; } /* * Look in the registry for the console font associated with the * Windows code page. */ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\" "Console\\TrueTypeFont", 0, KEY_READ, &key) != ERROR_SUCCESS) { errout("RegOpenKey failed -- cannot find font\n"); return L"Lucida Console"; } dlen = sizeof(data); if (RegQueryValueExW(key, cpname, NULL, &type, (LPVOID)data, &dlen) != ERROR_SUCCESS) { /* No codepage-specific match, try the default. */ dlen = sizeof(data); if (RegQueryValueExW(key, L"0", NULL, &type, (LPVOID)data, &dlen) != ERROR_SUCCESS) { RegCloseKey(key); errout("RegQueryValueEx failed -- cannot find font\n"); return L"Lucida Console"; } } RegCloseKey(key); if (type == REG_MULTI_SZ) { for (i = 0; i < dlen/sizeof(wchar_t); i++) { if (data[i] == 0x0000) { break; } } if (i+1 >= dlen/sizeof(wchar_t) || data[i+1] == 0x0000) { errout("Bad registry value -- cannot find font\n"); return L"Lucida Console"; } i++; } else { i = 0; } for (j = 0; i < dlen; i++, j++) { if (j == 0 && data[i] == L'*') { i++; } else if ((font[j] = data[i]) == 0x0000) { break; } } *codepage = _wtoi(cpname); return font; } /** * Display the current settings for a session and allow them to be edited. * * @param[in,out] s Session * @param[in,out] us User settings * @param[in] how How session is being edited (replace/create/update) * @param[in] path Session pathname * @param[in] session_name Name of session * @param[out] change_shortcut Returned as true if the shortcut should be * changed * * @return 0 for success, -1 for failure */ static src_t edit_menu(session_t *s, char **us, sp_t how, const char *path, const char *session_name, bool *change_shortcut) { int rc; char choicebuf[32]; session_t old_session; char *old_us = NULL; src_t ret = SRC_NONE; *change_shortcut = false; switch (how) { case SP_REPLACE: case SP_CREATE: case N_SP: /* can't happen, but the compiler wants it */ memset(&old_session, '\0', sizeof(session_t)); break; case SP_UPDATE: memcpy(&old_session, s, sizeof(session_t)); break; } /* Save a copy of the original user settings. */ if (*us != NULL) { old_us = strdup(*us); if (old_us == NULL) { errout("Out of memory.\n"); exit(1); } } for (;;) { int done = 0; char *cp = "?"; int i; for (i = 0; charsets[i].name != NULL; i++) { if (!strcmp(charsets[i].name, s->charset)) { cp = charsets[i].hostcp; break; } } new_screen(s, (how == SP_CREATE)? NULL: path, "Options"); printf("%3d. Host ................... : %s\n", MN_HOST, strcmp(s->host, CHOICE_NONE)? s->host: DISPLAY_NONE); printf("%3d. Logical Unit Name ...... : %s\n", MN_LU, s->luname[0]? s->luname: DISPLAY_NONE); printf("%3d. TCP Port ............... : %d\n", MN_PORT, (int)s->port); printf("%3d. Model Number ........... : %d " "(%d rows x %d columns)\n", MN_MODEL, (int)s->model, wrows[s->model], wcols[s->model]); printf("%3d. Oversize .............. : ", MN_OVERSIZE); if (s->ov_rows || s->ov_cols) { printf("%u rows x %u columns\n", s->ov_rows, s->ov_cols); } else { printf(DISPLAY_NONE"\n"); } printf("%3d. Character Set .......... : %s (CP %s)\n", MN_CHARSET, s->charset, cp); printf("%3d. Crosshair Cursor ....... : %s\n", MN_CROSSHAIR, (s->flags & WF_CROSSHAIR)? "Yes": "No"); printf("%3d. Cursor Type ............ : %s\n", MN_CURSORTYPE, (s->flags & WF_ALTCURSOR)? "Underscore": "Block"); printf("%3d. SSL Tunnel ............. : %s\n", MN_SSL, s->ssl? "Yes": "No"); printf("%3d. Verify host certificates : %s\n", MN_VERIFY, (s->flags & WF_VERIFY_HOST_CERTS)? "Yes": "No"); printf("%3d. Proxy .................. : %s\n", MN_PROXY, s->proxy_type[0]? s->proxy_type: DISPLAY_NONE); if (s->proxy_type[0]) { printf("%3d. Proxy Server .......... : %s\n", MN_PROXY_SERVER, s->proxy_host); if (s->proxy_port[0]) { printf("%3d. Proxy Server TCP Port . : %s\n", MN_PROXY_PORT, s->proxy_port); } } printf("%3d. wpr3287 Printer Session : %s\n", MN_3287, s->wpr3287? "Yes": "No"); if (s->wpr3287) { char pbuf[STR_SIZE]; printf("%3d. wpr3287 Mode .......... : ", MN_3287_MODE); if (!strcmp(s->printerlu, ".")) { printf("Associate\n"); } else { printf("LU\n"); printf("%3d. wpr3287 LU ............ : %s\n", MN_3287_LU, s->printerlu); } (void) redisplay_printer(s->printer, pbuf); printf("%3d. wpr3287 Windows printer : %s\n", MN_3287_PRINTER, s->printer[0]? pbuf: "(system default)"); printf("%3d. wpr3287 Code Page ..... : ", MN_3287_CODEPAGE); if (s->printercp[0]) { printf("%s\n", s->printercp); } else { printf("(system ANSI default of %d)\n", GetACP()); } } printf("%3d. Keymaps ................ : %s\n", MN_KEYMAPS, s->keymaps[0]? s->keymaps: DISPLAY_NONE); if (s->keymaps[0]) { printf("%3d. Embed Keymaps ......... : %s\n", MN_EMBED_KEYMAPS, (s->flags & WF_EMBED_KEYMAPS)? "Yes": "No"); } printf("%3d. Font Size .............. : %u\n", MN_FONT_SIZE, s->point_size? s->point_size: 12); printf("%3d. Background Color ....... : %s\n", MN_BG, (s->flags & WF_WHITE_BG)? "white": "black"); printf("%3d. Menu Bar ............... : %s\n", MN_MENUBAR, (s->flags & WF_NO_MENUBAR)? "No": "Yes"); printf("%3d. Trace at start-up ...... : %s\n", MN_TRACE, (s->flags & WF_TRACE)? "Yes": "No"); printf("%3d. Edit miscellaneous resources with Notepad\n", MN_NOTEPAD); for (;;) { int invalid = 0; int was_wpr3287 = 0; printf("\nEnter item number to change: [%s] ", CHOICE_NONE); fflush(stdout); if (get_input(choicebuf, sizeof(choicebuf)) == NULL) { ret = SRC_ERR; goto done; } else if (!choicebuf[0] || !strcasecmp(choicebuf, CHOICE_NONE)) { /* none */ done = 1; break; } if (!strncasecmp(choicebuf, "quit", strlen(choicebuf))) { ret = SRC_ERR; goto done; } switch (atoi(choicebuf)) { case MN_HOST: if (get_host(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_LU: if (get_lu(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_PORT: if (get_port(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_MODEL: if (get_model(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_OVERSIZE: if (get_oversize(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_CHARSET: if (get_charset(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_CROSSHAIR: if (get_crosshair(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_CURSORTYPE: if (get_cursor_type(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_SSL: if (get_ssl(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_VERIFY: if (get_verify(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_PROXY: if (get_proxy(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_PROXY_SERVER: if (s->proxy_type[0]) { if (get_proxy_server(s) < 0) { ret = SRC_ERR; goto done; } } else { errout("Invalid entry.\n"); invalid = 1; } break; case MN_PROXY_PORT: if (s->proxy_type[0]) { if (get_proxy_server_port(s) < 0) { ret = SRC_ERR; goto done; } } else { errout("Invalid entry.\n"); invalid = 1; } break; case MN_3287: was_wpr3287 = s->wpr3287; if (get_wpr3287(s) < 0) { ret = SRC_ERR; goto done; } if (s->wpr3287 && !was_wpr3287) { if (get_printer_mode(s) < 0) { ret = SRC_ERR; goto done; } } break; case MN_3287_MODE: if (s->wpr3287) { if (get_printer_mode(s) < 0) { ret = SRC_ERR; goto done; } } else { errout("Invalid entry.\n"); invalid = 1; } break; case MN_3287_LU: if (s->wpr3287 && strcmp(s->printerlu, ".")) { if (get_printerlu(s, 1) < 0) { ret = SRC_ERR; goto done; } } else { errout("Invalid entry.\n"); invalid = 1; } break; case MN_3287_PRINTER: if (s->wpr3287) { if (get_printer(s) < 0) { ret = SRC_ERR; goto done; } } else { errout("Invalid entry.\n"); invalid = 1; } break; case MN_3287_CODEPAGE: if (s->wpr3287) { if (get_printercp(s) < 0) { ret = SRC_ERR; goto done; } } else { errout("Invalid entry.\n"); invalid = 1; } break; case MN_KEYMAPS: if (get_keymaps(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_EMBED_KEYMAPS: if (get_embed(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_FONT_SIZE: if (get_fontsize(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_BG: if (get_background(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_MENUBAR: if (get_menubar(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_TRACE: if (get_trace(s) < 0) { ret = SRC_ERR; goto done; } break; case MN_NOTEPAD: if (run_notepad(s, us) < 0) { ret = SRC_ERR; goto done; } break; default: errout("\nInvalid entry."); invalid = 1; break; } if (!invalid) { break; } } if (done) { break; } } /* Ask if they want to write the file. */ if (memcmp(s, &old_session, sizeof(session_t)) || ((old_us != NULL) ^ (*us != NULL)) || (old_us != NULL && strcmp(old_us, *us))) { for (;;) { printf("\n%s session file '%s'? (y/n) [y] ", how_name[how], session_name); fflush(stdout); rc = getyn(TRUE); if (rc == YN_ERR) { ret = SRC_ERR; goto done; } else if (rc == FALSE) { ret = SRC_NONE; goto done; } else if (rc == TRUE) { break; } } } else { ret = SRC_NONE; goto done; } /* If creating, ask where they want it written. */ if (how == SP_CREATE) { ret = get_src(session_name, SRC_DOCUMENTS); goto done; } /* Return where the file ended up. */ if (!strncasecmp(documents_wc3270, path, strlen(documents_wc3270))) { ret = SRC_DOCUMENTS; goto done; } else if (!strncasecmp(public_documents_wc3270, path, strlen(public_documents_wc3270))) { ret = SRC_PUBLIC_DOCUMENTS; goto done; } else if (!strncasecmp(desktop, path, strlen(desktop))) { ret = SRC_DESKTOP; goto done; } else if (!strncasecmp(public_desktop, path, strlen(public_desktop))) { ret = SRC_PUBLIC_DESKTOP; goto done; } else { ret = SRC_OTHER; goto done; } done: { int old_codepage; wchar_t *old_font = reg_font_from_cset(old_session.charset, &old_codepage); int codepage; wchar_t *font = reg_font_from_cset(s->charset, &codepage); if (old_session.model != s->model || old_session.ov_rows != s->ov_rows || old_session.ov_cols != s->ov_cols || wcscmp(old_font, font) || old_codepage != codepage) { *change_shortcut = true; } } if (old_us != NULL) { free(old_us); } return ret; } /** * Print the prefix for a session name (ordinal or blank) * * @param[in] n Ordinal to display * @param[in] with_numbers If true, display number, otherwise blanks */ static void print_n(int n, bool with_numbers) { if (with_numbers) { printf(" %2d.", n + 1); } else { printf(" "); } } /** * Display the current set of sessions. * * @param[in] with_numbers If true, display with ordinals * @param[in] include_public If true, include public sessions */ static void display_sessions(bool with_numbers, bool include_public) { int i; int col = 0; const char *n; /* * Display the session names in four colums. Each 20-character column * looks like: * <.> * So there is room for 15 characters of session name in the first * three columns, and 14 in the last column (since we avoid writing in * column 80 of the display). */ for (i = 0; (n = xs_name(i + 1, NULL)) != NULL; i++) { size_t slen; if (i == xs_my.count && !include_public) { break; } if (i == 0 && xs_my.count != 0) { printf("Sessions for user '%s'in %.*s:\n", username, (int)(strlen(documents_wc3270) - 1), documents_wc3270); } else if (i == xs_my.count) { if (col) { printf("\n"); col = 0; } printf("Sessions for all users in %.*s:\n", (int)(strlen(public_documents_wc3270) - 1), public_documents_wc3270); } slen = strlen(n); retry: switch (col) { default: case 0: print_n(i, with_numbers); printf(" %s", n); if (slen <= 15) { /* fits in column 0 */ printf("%*s", (int)(15 - slen), ""); col = 1; } else if (slen <= 15 + 20) { /* covers 0 and 1 */ printf("%*s", (int)(15 + 20 - slen), ""); col = 2; } else if (slen <= 15 + 20 + 20) { /* covers 0, 1, 2 */ printf("%*s", (int)(15 + 20 + 20 - slen), ""); col = 3; } else { /* whole line */ printf("\n"); } break; case 1: if (slen > 15 + 20 + 19) { /* overflows */ printf("\n"); col = 0; goto retry; } print_n(i, with_numbers); printf(" %s", n); if (slen <= 15) { /* fits in column 1 */ printf("%*s", (int)(15 - slen), ""); col = 2; } else if (slen <= 15 + 20) { /* covers 1 and 2 */ printf("%*s", (int)(15 + 20 - slen), ""); col = 3; } else { /* rest of the line */ printf("\n"); col = 0; } break; case 2: if (slen > 15 + 19) { /* overflows */ printf("\n"); col = 0; goto retry; } print_n(i, with_numbers); printf(" %s", n); if (slen <= 15) { /* fits in column 2 */ printf("%*s", (int)(15 - slen), ""); col = 3; } else { /* rest of the line */ printf("\n"); col = 0; } break; case 3: if (slen > 14) { /* overflows */ printf("\n"); col = 0; goto retry; } print_n(i, with_numbers); printf(" %s\n", n); col = 0; break; } } if (col) { printf("\n"); } } /** * Display the list of existing sessions, and return a selected session name. * * @param[in] why Name of operation in progress * @param[in] include_public true if public sessions should be included * @param[out] name Returned selected session name * @param[out] lp Returned selected session location * * @return -1 for error, 0 for success * If no name is chosen, returns 0, but also returns NULL in name. */ static int get_existing_session(const char *why, bool include_public, const char **name, src_t *lp) { char nbuf[64]; int max = include_public? num_xs: num_xs - xs_public.count; display_sessions(true, include_public); for (;;) { int n; printf("\nEnter session name or number"); if (max > 1) { printf(" (1..%d)", max); } printf(" to %s, or 'q' to quit: ", why); fflush(stdout); if (get_input(nbuf, sizeof(nbuf)) == NULL) { return -1; } else if (nbuf[0] == '\0') { continue; } else if (nbuf[0] == 'q' || nbuf[0] == 'Q') { *name = NULL; return 0; } n = atoi(nbuf); if (n == 0) { int i; for (i = 0; i < max; i++) { if (!strcasecmp(nbuf, xs_name(i + 1, NULL))) { *name = xs_name(i + 1, lp); return 0; } } errout("\nNo such session."); continue; } else if (n < 0 || n > max) { errout("\nNo such session."); continue; } *name = xs_name(n, lp); return 0; } } /** * Look up a session specified by the user on the main menu. * * @param[in] name Session name to look up * @param[in] include_public true to include public sessions * @param[out] lp Returned location of session * @param[out] result Buffer to put error message in * @param[in] result_size Size of 'result' buffer * * @return Session name, or NULL if not found */ static char * menu_existing_session(char *name, bool include_public, src_t *lp, char *result, size_t result_size) { int i; int max = include_public? num_xs: num_xs - xs_public.count; for (i = 0; i < max; i++) { if (!strcasecmp(name, xs_name(i + 1, lp))) { break; } } if (i >= max) { snprintf(result, result_size, "%cNo such session: '%s'", 2, name); return NULL; } else { return name; } } /** * Request that the user press the Enter key. * * This generally happens after displaying an error message. */ static void ask_enter(void) { char buf[2]; grayout("[Press ] "); fflush(stdout); (void) fgets(buf, sizeof(buf), stdin); } /** * Delete a session. * * Prompts for a session name, if none is provided in argc/argv. * * @param[in] argc Command argument count (from main menu prompt) * @param[in] argv Command argumens (from main menu prompt) * @param[out] result Result returned here * @param[in] result_size Size of 'result' buffer * * @return 0 for success, -1 for failure */ static int delete_session(int argc, char **argv, char *result, size_t result_size) { const char *name = NULL; src_t l; char path[MAX_PATH]; if (argc > 0) { name = menu_existing_session(argv[0], admin(), &l, result, result_size); if (name == NULL) { return 0; } } if (argc == 0) { new_screen(&empty_session, NULL, "\ Delete Session\n"); if (get_existing_session("delete", admin(), &name, &l) < 0) { return -1; } else if (name == NULL) { return 0; } } for (;;) { gs_t rc; printf("\nAre you sure you want to delete session '%s'? (y/n) [n] ", name); fflush(stdout); rc = getyn(FALSE); if (rc == YN_ERR) { return -1; } else if (rc == FALSE) { return 0; } else if (rc == TRUE) { break; } } snprintf(path, MAX_PATH, "%s%s%s", (l == SRC_DOCUMENTS)? documents_wc3270: public_documents_wc3270, name, SESS_SUFFIX); if (unlink(path) < 0) { errout("\nDelete of '%s' failed: %s\n", path, strerror(errno)); goto failed; } snprintf(path, MAX_PATH, "%s%s.lnk", (l == SRC_DOCUMENTS)? desktop: public_desktop, name); if (access(path, R_OK) == 0 && unlink(path) < 0) { errout("\nDelete of '%s' failed: %s\n", path, strerror(errno)); goto failed; } snprintf(result, result_size, "%cSession '%s' deleted.", 1, name); return 0; failed: ask_enter(); return 0; } /** * Rename or copy a session. * * Prompts for from/to session names, if not provided in argc/argv. * * @param[in] argc Command argument count (from main menu prompt) * @param[in] argv Command argumens (from main menu prompt) * @param[in] is_rename true if rename, false if copy * @param[out] result Result returned here * @param[in] result_size Size of 'result' buffer * * @return 0 for success, -1 for failure */ static int rename_or_copy_session(int argc, char **argv, bool is_rename, char *result, size_t result_size) { char to_name[64]; const char *from_name = NULL; src_t from_l, to_l; char from_path[MAX_PATH]; char to_path[MAX_PATH]; char from_linkpath[MAX_PATH]; int i; FILE *f; session_t s; ws_t wsrc; char *us; if (argc > 0) { from_name = menu_existing_session(argv[0], !is_rename || admin(), &from_l, result, result_size); if (from_name == NULL) { return 0; } } if (argc == 0) { if (is_rename) { new_screen(&empty_session, NULL, "\ Rename Session\n"); } else { new_screen(&empty_session, NULL, "\ Copy Session\n"); } if (get_existing_session(is_rename? "rename": "copy", !is_rename || admin(), &from_name, &from_l) < 0) { return -1; } else if (from_name == NULL) { return 0; } } if (is_rename && !admin() && from_l == SRC_PUBLIC_DOCUMENTS) { errout("Cannot rename public session\n"); goto failed; } for (;;) { if (argc > 1) { strncpy(to_name, argv[1], sizeof(to_name)); to_name[sizeof(to_name) - 1] = '\0'; argc = 1; /* a bit of a hack */ } else { if (is_rename) { printf("\nEnter new session name for '%s', or 'q' to quit: ", from_name); } else { printf("\nEnter new session name to copy '%s' into, or 'q' to " "quit: ", from_name); } fflush(stdout); if (get_input(to_name, sizeof(to_name)) == NULL) { return -1; } else if (to_name[0] == '\0') { continue; } else if ((to_name[0] == 'q' || to_name[0] == 'Q') && to_name[1] == '\0') { return 0; } } for (i = 0; i < num_xs; i++) { if (!strcasecmp(to_name, xs_name(i + 1, NULL))) { break; } } if (i < num_xs) { errout("\nSession '%s' already exists. To replace it, you must " "delete it first.", to_name); continue; } if (!legal_session_name(to_name, NULL, 0)) { continue; } break; } switch (from_l) { case SRC_PUBLIC_DOCUMENTS: snprintf(from_path, MAX_PATH, "%s%s%s", public_documents_wc3270, from_name, SESS_SUFFIX); break; default: case SRC_DOCUMENTS: snprintf(from_path, MAX_PATH, "%s%s%s", documents_wc3270, from_name, SESS_SUFFIX); break; } switch ((to_l = get_src(to_name, from_l))) { case SRC_PUBLIC_DOCUMENTS: snprintf(to_path, MAX_PATH, "%s%s%s", public_documents_wc3270, to_name, SESS_SUFFIX); break; case SRC_DOCUMENTS: snprintf(to_path, MAX_PATH, "%s%s%s", documents_wc3270, to_name, SESS_SUFFIX); break; case SRC_NONE: return 0; default: return -1; } /* Read in the existing session. */ f = fopen(from_path, "r"); if (f == NULL) { errout("Cannot open %s for reading: %s\n", from_path, strerror(errno)); goto failed; } if (!read_session(f, &s, &us)) { fclose(f); errout("Cannot read '%s'.\n", from_path); goto failed; } fclose(f); /* Change its name and write it back out. */ strncpy(s.session, to_name, STR_SIZE); if (write_session_file(&s, us, to_path) < 0) { errout("Cannot write '%s'.\n", to_path); goto failed; } /* Remove the orginal. */ if (is_rename) { if (unlink(from_path) < 0) { errout("Cannot remove '%s'.\n", from_path); goto failed; } } /* See about the shortcut as well. */ snprintf(from_linkpath, sizeof(from_linkpath), "%s%s.lnk", (from_l == SRC_PUBLIC_DOCUMENTS)? public_desktop: desktop, from_name); if (access(from_linkpath, R_OK) == 0) { for (;;) { gs_t rc; printf("\n%s desktop shortcut as well? (y/n) [y] ", is_rename? "Rename": "Copy"); fflush(stdout); rc = getyn(TRUE); if (rc == YN_ERR) { return -1; } else if (rc == FALSE) { return 0; } else if (rc == TRUE) { break; } } /* Create the new shortcut. */ wsrc = write_shortcut(&s, false, to_l, to_path, false); switch (wsrc) { case WS_ERR: return -1; case WS_FAILED: goto failed; case WS_CREATED: case WS_REPLACED: case WS_NOP: break; } /* Remove the original. */ if (is_rename) { if (unlink(from_linkpath) < 0) { errout("Cannot remove '%s'.\n", from_linkpath); goto failed; } } } snprintf(result, result_size, "%cSession '%s' %s to '%s'.", 1, from_name, is_rename? "renamed": "copied", to_name); return 0; failed: ask_enter(); return 0; } /** * Create a shortcut for a session. * * Prompts for a session name, if none is provided in argc/argv. * * @param[in] argc Command argument count (from main menu prompt) * @param[in] argv Command argumens (from main menu prompt) * @param[out] result Result returned here * @param[in] result_size Size of 'result' buffer * * @return 0 for success, -1 for failure */ static int new_shortcut(int argc, char **argv, char *result, size_t result_size) { const char *name = NULL; src_t l; char from_path[MAX_PATH]; FILE *f; ws_t rc; session_t s; if (argc > 0) { name = menu_existing_session(argv[0], true, &l, result, result_size); if (name == NULL) { return 0; } } if (argc == 0) { new_screen(&empty_session, NULL, "\ Create Shortcut\n"); if (get_existing_session("create shortcut for", true, &name, &l) < 0) { return -1; } else if (name == NULL) { return 0; } } switch (l) { case SRC_PUBLIC_DOCUMENTS: snprintf(from_path, MAX_PATH, "%s%s%s", public_documents_wc3270, name, SESS_SUFFIX); break; default: case SRC_DOCUMENTS: snprintf(from_path, MAX_PATH, "%s%s%s", documents_wc3270, name, SESS_SUFFIX); break; } /* * If public document but not admin, create shortcut on per-user desktop. */ if (l == SRC_PUBLIC_DOCUMENTS && !admin()) { l = SRC_DOCUMENTS; } f = fopen(from_path, "r"); if (f == NULL) { errout("Cannot open %s for reading: %s\n", from_path, strerror(errno)); goto failed; } else if (!read_session(f, &s, NULL)) { fclose(f); printf("Cannot read '%s'.\n", from_path); goto failed; } fclose(f); rc = write_shortcut(&s, false, l, from_path, false); switch (rc) { case WS_NOP: break; case WS_ERR: return -1; case WS_FAILED: goto failed; case WS_CREATED: case WS_REPLACED: snprintf(result, result_size, "%cShortcut %s for '%s'.", 1, (rc == WS_CREATED)? "created": "replaced", name); break; } return 0; failed: ask_enter(); return 0; } /** * Initialize a set of session names from a directory. * * @param[in] dirname Directory to search * @param[out] xsb Returned list of entries * @param[in] location Which directory this is (current/all) */ static void xs_init_type(const char *dirname, xsb_t *xsb, src_t location) { char dpath[MAX_PATH]; HANDLE h; WIN32_FIND_DATA find_data; xs_t *xs; /* Check for migration complete. */ snprintf(dpath, MAX_PATH, "%s%s", dirname, DONE_FILE); if (access(dpath, R_OK) == 0) { return; } sprintf(dpath, "%s*%s", dirname, SESS_SUFFIX); h = FindFirstFile(dpath, &find_data); if (h != INVALID_HANDLE_VALUE) { do { char *sname; size_t nlen; xs_t *xss, *prev; sname = find_data.cFileName; nlen = strlen(sname) - strlen(SESS_SUFFIX); if (location == SRC_PUBLIC_DOCUMENTS) { int skip = 0; xs_t *xsc; /* * Skip public documents that are the same as private ones. * This will get us into trouble. */ for (xsc = xs_my.list; xsc != NULL; xsc = xsc->next) { char *n = xsc->name; if (strlen(n) == nlen && !strncasecmp(n, sname, nlen)) { skip = 1; break; } } if (skip) { continue; } } xs = (xs_t *)malloc(sizeof(xs_t) + nlen + 1); if (xs == NULL) { errout("Out of memory\n"); exit(1); } xs->location = location; xs->name = (char *)(xs + 1); strncpy(xs->name, sname, nlen); xs->name[nlen] = '\0'; for (xss = xsb->list, prev = NULL; xss != NULL; prev = xss, xss = xss->next) { if (strcasecmp(xs->name, xss->name) < 0) { break; } } /* xs goes before xss, which may be NULL. */ xs->next = xss; if (prev != NULL) { prev->next = xs; } else { xsb->list = xs; } xsb->count++; } while (FindNextFile(h, &find_data) != 0); FindClose(h); } } /** * Free a set of session names. * * @param[in,out] xsb Set of names to free */ static void free_xs(xsb_t *xsb) { xs_t *list; xs_t *next; list = xsb->list; while (list != NULL) { next = list->next; free(list); list = next; } xsb->count = 0; xsb->list = NULL; } /** * Initialize the session names. * * @param[in] include_public if true, include public sessions */ static void xs_init(bool include_public) { free_xs(&xs_my); free_xs(&xs_public); num_xs = 0; xs_init_type(searchdir, &xs_my, SRC_DOCUMENTS); if (include_public) { xs_init_type(public_searchdir, &xs_public, SRC_PUBLIC_DOCUMENTS); } num_xs = xs_my.count + xs_public.count; } /** * Look up a session name by index. * * @param[in] n Index (first session is 1) * @param[out] lp Location of entry (current/all) * * @return Session name */ static const char * xs_name(int n, src_t *lp) { xs_t *xs; for (xs = xs_my.list; xs != NULL; xs = xs->next) { if (!--n) { if (lp != NULL) { *lp = xs->location; } return xs->name; } } for (xs = xs_public.list; xs != NULL; xs = xs->next) { if (!--n) { if (lp != NULL) { *lp = xs->location; } return xs->name; } } return NULL; } /** * Create or re-create a shortcut. * * @param[in] s Session * @param[in] ask If true, ask first * @param[in] src Where the session file is (all or current user) * @param[in] sess_path Pathname of session file * @param[in] change_shortcut If true, the shortcut needs updating * * @return ws_t (no-op, create, replace, error) */ static ws_t write_shortcut(const session_t *s, bool ask, src_t src, const char *sess_path, bool change_shortcut) { char linkpath[MAX_PATH]; char exepath[MAX_PATH]; char args[MAX_PATH]; int shortcut_exists; int extra_height = 1; wchar_t *font; int codepage = 0; HRESULT hres; /* If writing to the desktop, don't ask about a shortcut. */ if (src == SRC_PUBLIC_DESKTOP || src == SRC_DESKTOP || !strncasecmp(sess_path, desktop, strlen(desktop)) || !strncasecmp(sess_path, public_desktop, strlen(public_desktop))) { return WS_NOP; } /* Ask about the shortcut. */ sprintf(linkpath, "%s%s.lnk", (src == SRC_PUBLIC_DOCUMENTS)? public_desktop: desktop, s->session); shortcut_exists = (access(linkpath, R_OK) == 0); if (ask) { if (shortcut_exists && change_shortcut) { printf("\nOne or more parameters changed that require replacing the desktop shortcut."); } for (;;) { int rc; printf("\n%s desktop shortcut (y/n) [y]: ", shortcut_exists? "Replace": "Create"); rc = getyn(TRUE); if (rc == YN_ERR) { return WS_ERR; } else if (rc == FALSE) { return WS_NOP; } else if (rc == TRUE) { break; } } } /* Create the desktop shorcut. */ sprintf(exepath, "%swc3270.exe", installdir); sprintf(args, "+S \"%s\"", sess_path); if (!(s->flags & WF_NO_MENUBAR)) { extra_height += 2; } font = reg_font_from_cset(s->charset, &codepage); hres = create_link( exepath, /* path to executable */ linkpath, /* where to put the link */ "wc3270 session", /* description */ args, /* arguments */ installdir, /* working directory */ (s->ov_rows? /* console rows */ s->ov_rows: wrows[s->model]) + extra_height, s->ov_cols? /* console cols */ s->ov_cols: wcols[s->model], font, /* font */ s->point_size, /* point size */ codepage); /* code page */ if (SUCCEEDED(hres)) { return shortcut_exists? WS_REPLACED: WS_CREATED; } else { printf("Writing shortcut '%s' failed\n", linkpath); return WS_FAILED; } } /** * One pass of the session wizard. * * @param[in] session_name Name of session to edit, or NULL * @param[in] explicit_edit If true, '-e' option was used (no need to * confirm they want to edit it) * @param[out] result Buffer containing previous operation's result, * and to write current operation's result into * @param[in] result_size Size of 'result' buffer * * @return Status of operation (success/error/user-quit) */ static sw_t session_wizard(const char *session_name, bool explicit_edit, char *result, size_t result_size) { session_t session; gs_t rc; src_t src; char save_session_name[STR_SIZE]; char path[MAX_PATH]; int argc; char **argv; ws_t wsrc; size_t sl; char *us = NULL; bool change_shortcut; /* Start with nothing. */ (void) memset(&session, '\0', sizeof(session)); /* Find the existing sessions. */ xs_init(true); /* Intro screen. */ if (session_name == NULL) { switch (main_menu(&argc, &argv, result)) { case MO_ERR: return SW_ERR; case MO_QUIT: return SW_QUIT; case MO_EDIT: if (argc > 0) { session_name = menu_existing_session(argv[0], admin(), NULL, result, result_size); if (session_name == NULL) { return SW_SUCCESS; } } else { new_screen(&session, NULL, "\ Edit Session\n"); if (get_existing_session("edit", admin(), &session_name, NULL) < 0) { return SW_ERR; } else if (session_name == NULL) { return SW_SUCCESS; } } explicit_edit = true; break; case MO_DELETE: if (delete_session(argc, argv, result, result_size) < 0) { return SW_ERR; } else { return SW_SUCCESS; } case MO_COPY: if (rename_or_copy_session(argc, argv, false, result, result_size) < 0) { return SW_ERR; } else { return SW_SUCCESS; } case MO_RENAME: if (rename_or_copy_session(argc, argv, true, result, result_size) < 0) { return SW_ERR; } else { return SW_SUCCESS; } case MO_SHORTCUT: if (new_shortcut(argc, argv, result, result_size) < 0) { return SW_ERR; } else { return SW_SUCCESS; } case MO_CREATE: if (argc > 0) { if (!legal_session_name(argv[0], result, result_size)) { return SW_SUCCESS; } session_name = argv[0]; } /* fall through below */ break; case MO_MIGRATE: { char *cmd = malloc(strlen(program) + strlen(" -U") + 1); if (cmd == NULL) { errout("Out of memory.\n"); return SW_ERR; } sprintf(cmd, "%s -U", program); system(cmd); free(cmd); return SW_SUCCESS; } } } else { new_screen(&session, NULL, ""); } /* Get the session name. */ rc = get_session(session_name, &session, &us, path, explicit_edit, &src); switch (rc) { case GS_NOEDIT_LEAVE: /* Uneditable, and they don't want to overwrite it. */ if (us != NULL) { free(us); } return SW_SUCCESS; default: case GS_ERR: /* EOF */ return SW_ERR; case GS_OVERWRITE: /* Overwrite old (uneditable). */ /* Clean out the session. */ strcpy(save_session_name, session.session); memset(&session, '\0', sizeof(session)); strcpy(session.session, save_session_name); if (us != NULL) { free(us); us = NULL; } /* fall through... */ case GS_NEW: /* New. */ /* Get the host name, which defaults to the session name. */ if (strchr(session.session, ' ') == NULL) { strcpy(session.host, session.session); } if (get_host(&session) < 0) { return SW_ERR; } /* Default eveything else. */ session.port = 23; session.model = 4; strcpy(session.charset, "bracket"); strcpy(session.printerlu, "."); /* fall through... */ case GS_EDIT: /* Edit existing file. */ /* See what they want to change. */ src = edit_menu(&session, &us, (rc == GS_OVERWRITE)? SP_REPLACE: ((rc == GS_NEW)? SP_CREATE: SP_UPDATE), path, session.session, &change_shortcut); if (src == SRC_ERR) { return SW_ERR; } else if (src == SRC_NONE) { if (rc == GS_NEW) { return SW_SUCCESS; } else { break; } } else if (src == SRC_PUBLIC_DOCUMENTS) { /* All users. */ create_wc3270_folder(src); snprintf(path, MAX_PATH, "%s%s%s", public_documents_wc3270, session.session, SESS_SUFFIX); } else if (src == SRC_DOCUMENTS) { /* Current user. */ create_wc3270_folder(src); snprintf(path, MAX_PATH, "%s%s%s", documents_wc3270, session.session, SESS_SUFFIX); } else if (src == SRC_PUBLIC_DESKTOP) { snprintf(path, MAX_PATH, "%s%s%s", public_desktop, session.session, SESS_SUFFIX); } else if (src == SRC_DESKTOP) { snprintf(path, MAX_PATH, "%s%s%s", desktop, session.session, SESS_SUFFIX); } /* else keep path as-is */ /* Create the session file. */ if (write_session_file(&session, us, path) < 0) { if (us != NULL) { free(us); us = NULL; } goto failed; } snprintf(result, result_size, "%cCreated session '%s'.", 1, session.session); if (us != NULL) { free(us); us = NULL; } break; case GS_NOEDIT: /* Don't edit existing file, but we do have a copy of the session. */ break; } /* Ask about creating or updating the shortcut. */ wsrc = write_shortcut(&session, true, src, path, change_shortcut); switch (wsrc) { case WS_NOP: break; case WS_ERR: return SW_ERR; case WS_FAILED: goto failed; case WS_CREATED: case WS_REPLACED: sl = strlen(result); snprintf(result + sl, result_size - sl, "%c%s shortcut '%s'.", sl? '\n': 1, (wsrc == WS_CREATED)? "Created": "Replaced", session.session); break; } return SW_SUCCESS; failed: ask_enter(); return SW_SUCCESS; } /** * Embed the selected keymaps in the session file. * * @param[in] session Session * @param[in,out] f File to append them to */ static void embed_keymaps(const session_t *session, FILE *f) { char keymaps[STR_SIZE]; char *keymap; char *ptr = keymaps; km_t *km; char *pfx = "! Embedded user-defined keymaps\n"; strcpy(keymaps, session->keymaps); while ((keymap = strtok(ptr, ",")) != NULL) { ptr = NULL; for (km = km_first; km != NULL; km = km->next) { if (!strcasecmp(keymap, km->name)) { if (km->def_both) { fprintf(f, "%swc3270.%s.%s:\\n\\\n%s\n", pfx, ResKeymap, keymap, km->def_both); pfx = ""; } if (km->def_3270) { fprintf(f, "%swc3270.%s.%s.3270:\\n\\\n%s\n", pfx, ResKeymap, keymap, km->def_3270); pfx = ""; } if (km->def_nvt) { fprintf(f, "%swc3270.%s.%s.nvt:\\n\\\n%s\n", pfx, ResKeymap, keymap, km->def_nvt); pfx = ""; } break; } } } } /** * Write miscellaneous user settings into an open file. * * @param[in] us User settings, or NULL * @param[in] f File to write into */ static void write_user_settings(char *us, FILE *f) { fprintf(f, "!\n\ ! Note that in this file, backslash ('\\') characters are used to specify\n\ ! escape sequences, such as '\\r' for a Carriage Return character or '\\t'\n\ ! for a Tab character. To include literal backslashes in this file, such as\n\ ! in Windows pathnames or UNC paths, they must be doubled, for example:\n\ !\n\ ! Desired text Must be specified this way\n\ ! C:\\xdir\\file C:\\\\xdir\\\\file\n\ ! \\\\server\\printer \\\\\\\\server\\\\printer\n\ !\n\ !*Additional resource definitions can go after this line.\n"); /* Write out the user's previous extra settings. */ if (us != NULL) { fprintf(f, "%s", us); } } /** * Write a session file. * * @param[in] session Session to write * @param[in] us User settings * @param[in] path Pathname to write session into * * @return 0 for success, -1 for failure. */ static int write_session_file(const session_t *session, char *us, const char *path) { FILE *f; time_t t; int bracket; long eot; unsigned long csum; int i; char buf[1024]; /* Make sure the wc3270 subdirectory exists. */ if (!strncasecmp(path, documents_wc3270, strlen(documents_wc3270))) { create_wc3270_folder(SRC_DOCUMENTS); } else if (!strncasecmp(path, public_documents_wc3270, strlen(public_documents_wc3270))) { create_wc3270_folder(SRC_PUBLIC_DOCUMENTS); } f = fopen(path, "w+"); if (f == NULL) { errout("Cannot create session file %s: %s", path, strerror(errno)); return -1; } fprintf(f, "! wc3270 session '%s'\n", session->session); t = time(NULL); fprintf(f, "! Created or modified by the wc3270 %s Session Wizard %s", wversion, ctime(&t)); if (strcmp(session->host, CHOICE_NONE)) { bracket = (strchr(session->host, ':') != NULL); fprintf(f, "wc3270.%s: ", ResHostname); if (session->ssl) { fprintf(f, "L:"); } if (session->luname[0]) { fprintf(f, "%s@", session->luname); } fprintf(f, "%s%s%s", bracket? "[": "", session->host, bracket? "]": ""); if (session->port != 23) { fprintf(f, ":%d", (int)session->port); } fprintf(f, "\n"); } else if (session->port != 23) { fprintf(f, "wc3270.%s: %d\n", ResPort, (int)session->port); } if (session->proxy_type[0]) { fprintf(f, "wc3270.%s: %s:%s%s%s%s%s\n", ResProxy, session->proxy_type, strchr(session->proxy_host, ':')? "[": "", session->proxy_host, strchr(session->proxy_host, ':')? "]": "", session->proxy_port[0]? ":": "", session->proxy_port); } fprintf(f, "wc3270.%s: %d\n", ResModel, (int)session->model); if (session->ov_rows || session->ov_cols) { fprintf(f, "wc3270.%s: %ux%u\n", ResOversize, session->ov_cols, session->ov_rows); } fprintf(f, "wc3270.%s: %s\n", ResCharset, session->charset); if (session->flags & WF_CROSSHAIR) { fprintf(f, "wc3270.%s: %s\n", ResCrosshair, ResTrue); } if (session->flags & WF_ALTCURSOR) { fprintf(f, "wc3270.%s: %s\n", ResAltCursor, ResTrue); } if (session->is_dbcs) { fprintf(f, "wc3270.%s: %s\n", ResAsciiBoxDraw, ResTrue); } if (session->wpr3287) { fprintf(f, "wc3270.%s: %s\n", ResPrinterLu, session->printerlu); if (session->printer[0]) { fprintf(f, "wc3270.%s: %s\n", ResPrinterName, session->printer); } if (session->printercp[0]) { fprintf(f, "wc3270.%s: %s\n", ResPrinterCodepage, session->printercp); } } if (session->keymaps[0]) { fprintf(f, "wc3270.%s: %s\n", ResKeymap, session->keymaps); if (session->flags & WF_EMBED_KEYMAPS) { embed_keymaps(session, f); } } if (session->flags & WF_AUTO_SHORTCUT) { fprintf(f, "wc3270.%s: %s\n", ResAutoShortcut, ResTrue); } if (session->flags & WF_WHITE_BG) { fprintf(f, "\ ! These resources set the background to white\n\ wc3270." ResConsoleColorForHostColor "NeutralBlack: 15\n\ wc3270." ResConsoleColorForHostColor "NeutralWhite: 0\n"); } if (session->flags & WF_VERIFY_HOST_CERTS) { fprintf(f, "wc3270.%s: %s\n", ResVerifyHostCert, ResTrue); } if (session->flags & WF_NO_MENUBAR) { fprintf(f, "wc3270.%s: %s\n", ResMenuBar, ResFalse); } if (session->flags & WF_TRACE) { fprintf(f, "wc3270.%s: %s\n", ResTrace, ResTrue); } /* Emit the warning. */ fprintf(f, "\ !\n\ ! The following block of text is used to read the contents of this file back\n\ ! into the Session Wizard. If any of the text from the top of the file\n\ ! through the line below reading \"Additional resource definitions...\" is\n\ ! modified, the Session Wizard will not be able to edit this file.\n\ !"); /* Write out the session structure in hex. */ for (i = 0; i < sizeof(*session); i++) { if (!(i % 32)) { fprintf(f, "\n!x"); } fprintf(f, "%02x", ((unsigned char *)session)[i]); } fprintf(f, "\n"); /* Save where we are in the file. */ fflush(f); eot = ftell(f); /* Go back and read what we wrote. */ rewind(f); csum = 0; while (fgets(buf, sizeof(buf), f) != NULL) { for (i = 0; buf[i]; i++) { csum += buf[i] & 0xff; } if (ftell(f) >= eot) { break; } } fflush(f); /* Write out the checksum and structure version. */ fseek(f, 0, SEEK_END); fprintf(f, "!c%08lx %d\n", csum, WIZARD_VER); write_user_settings(us, f); fclose(f); printf("Wrote session file %s.\n", path); return 0; } /** * Make sure the console window is long enough. * * @param[in] rows Number of rows desired * * @return 0 for success, -1 for failure */ static int resize_window(int rows) { int rv = 0; HANDLE h; CONSOLE_SCREEN_BUFFER_INFO info; do { /* Get a handle to the console. */ h = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (h == NULL) { rv = -1; break; } /* Get its current geometry. */ if (GetConsoleScreenBufferInfo(h, &info) == 0) { rv = -1; break; } /* If the buffer isn't big enough, make it bigger. */ if (info.dwSize.Y < rows) { COORD new_size; new_size.X = info.dwSize.X; new_size.Y = rows; if (SetConsoleScreenBufferSize(h, new_size) == 0) { rv = -1; break; } } /* If the window isn't big enough, make it bigger. */ if (info.srWindow.Bottom - info.srWindow.Top < rows) { SMALL_RECT sr; sr.Top = 0; sr.Bottom = rows; sr.Left = 0; sr.Right = info.srWindow.Right - info.srWindow.Left; if (SetConsoleWindowInfo(h, TRUE, &sr) == 0) { rv = -1; break; } } } while(0); if (h != NULL) { CloseHandle(h); } return rv; } /* Compute the values of the directories where user files live. */ static void get_base_dirs(bool new_way) { if (!new_way) { /* Old way: Use AppData instead of the Documents diretories. */ searchdir = appdata_wc3270; public_searchdir = common_appdata_wc3270; return; } } /** * Usage message. Display syntax and exit. */ static void w_usage(void) { fprintf(stderr, "\ Usage: wc3270wiz [session-name]\n\ wc3270wiz [-e] [session-file]\n\ wc3270wiz -U[a]\n"); exit(1); } /** * Main procedure. * * @param[in] argc Command-line argument count * @param[in] argv Command-line arguments * * @return Exit status */ int main(int argc, char *argv[]) { sw_t rc; char *session_name = NULL; bool explicit_edit = false; bool upgrade = false; bool automatic_upgrade = false; DWORD name_size; char result[STR_SIZE]; /* * Parse command-line arguments. * For now, there is only one -- the optional name of the session. */ program = argv[0]; if (argc > 1 && !strcmp(argv[1], "-U")) { upgrade = true; argc--; argv--; } if (argc > 1 && !strcmp(argv[1], "-Ua")) { upgrade = true; automatic_upgrade = true; argc--; argv--; } if (argc > 1 && !strcmp(argv[1], "-e")) { explicit_edit = true; argc--; argv++; } switch (argc) { case 1: break; case 2: session_name = argv[1]; break; default: w_usage(); break; } if (upgrade && explicit_edit) { w_usage(); } /* Figure out the version. */ if (get_version_info() < 0) { return 1; } /* Get some paths from Windows. */ if (!get_dirs("wc3270", &installdir, &desktop, &appdata_wc3270, &public_desktop, &common_appdata_wc3270, &documents, &public_documents, &documents_wc3270, &public_documents_wc3270, &windirs_flags)) { return 1; } searchdir = documents_wc3270; public_searchdir = public_documents_wc3270; name_size = sizeof(username) / sizeof(TCHAR); if (GetUserName(username, &name_size) == 0) { errout("GetUserName failed, error %ld\n", (long)GetLastError()); return 1; } /* Resize the console window. */ resize_window(44); signal(SIGINT, SIG_IGN); if (upgrade) { /* Do an upgrade. */ get_base_dirs(false); save_keymaps(admin()); xs_init(admin()); rc = do_upgrade(automatic_upgrade); } else { get_base_dirs(true); save_keymaps(true); /* Display the main menu until they quit or something goes wrong. */ result[0] = '\0'; do { rc = session_wizard(session_name, explicit_edit, result, sizeof(result)); if (session_name != NULL) { break; } } while (rc == SW_SUCCESS); } /* * Wait for Enter before exiting, so the console window does not * disappear without the user seeing what it did. */ if (rc != SW_QUIT) { printf("\n%sWizard %s. ", upgrade? "Migration ": "", (rc == SW_ERR)? "aborted": "complete"); if (!automatic_upgrade) { ask_enter(); } } return 0; } /** * Check whether the current user is currently elevated (Vista or newer) or * in the Administrators group (XP). * * @return TRUE if administrator */ static BOOL admin(void) { BOOL b; SID_IDENTIFIER_AUTHORITY nt_authority = { SECURITY_NT_AUTHORITY }; PSID administrators_group; if (getenv("NOTADMIN")) { return FALSE; } b = AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &administrators_group); if (b) { if (!CheckTokenMembership( NULL, administrators_group, &b)) { b = FALSE; } FreeSid(administrators_group); } return(b); } /** * Are there any wc3270 files in a directory? * * @param[in] dirname directory name * * @return true if there are any wc3270 files present */ static bool any_in(char *dirname) { char path[MAX_PATH]; HANDLE h; WIN32_FIND_DATA find_data; bool any = false; snprintf(path, sizeof(path), "%s%s", dirname, DONE_FILE); if (access(path, R_OK) == 0) { return false; } snprintf(path, sizeof(path), "%s*" SESS_SUFFIX, dirname); if ((h = FindFirstFile(path, &find_data)) != INVALID_HANDLE_VALUE) { any = true; FindClose(h); } if (any) { return true; } snprintf(path, sizeof(path), "%s*" KEYMAP_SUFFIX, dirname); if ((h = FindFirstFile(path, &find_data)) != INVALID_HANDLE_VALUE) { any = true; FindClose(h); } return any; } /** * Check whether there are files to be migrated. */ static bool ad_exist(void) { return (any_in(appdata_wc3270) || (admin() && any_in(common_appdata_wc3270))); } /*********** Migration Wizard. ***********/ /* Write a wchar_t string to a file. */ static void wwrite(FILE *f, wchar_t *s) { fwrite(s, sizeof(wchar_t), wcslen(s), f); } /* Create a wc3270 folder. */ static void create_wc3270_folder(src_t src) { char *parent = (src == SRC_DOCUMENTS)? documents: public_documents; char wc3270_dir[MAX_PATH]; char desktop_ini[MAX_PATH]; char wc3270_exe[MAX_PATH]; wchar_t lwc3270_exe[MAX_PATH]; /* Create My Documents\wc3270. */ snprintf(wc3270_dir, MAX_PATH, "%swc3270", parent); if (access(wc3270_dir, R_OK) != 0) { /* Create the folder. */ if (_mkdir(wc3270_dir) < 0) { errout("Cannot create %s: %s\n", wc3270_dir, strerror(errno)); exit(1); } printf("Created folder %s.\n", wc3270_dir); /* Make it a system folder. */ if (!SetFileAttributes(wc3270_dir, FILE_ATTRIBUTE_SYSTEM)) { errout("SetFileAttributes(%s) failed", wc3270_dir); exit(1); } } snprintf(desktop_ini, MAX_PATH, "%swc3270\\Desktop.ini", parent); if (access(desktop_ini, R_OK) != 0) { /* Create Desktop.ini. */ FILE *f = fopen(desktop_ini, "wb"); if (f == NULL) { errout("Cannot create %s: %s\n", desktop_ini, strerror(errno)); return; } fwrite("\xff\xfe", 1, 2, f); /* BOM */ wwrite(f, L"[.ShellClassInfo]\r\n"); wwrite(f, L"ConfirmFileOp=0\r\n"); wwrite(f, L"IconFile="); snprintf(wc3270_exe, MAX_PATH, "%swc3270.exe", installdir); (void) mbstowcs(lwc3270_exe, wc3270_exe, strlen(wc3270_exe) + 1); wwrite(f, lwc3270_exe); wwrite(f, L"\r\n"); wwrite(f, L"IconIndex=0\r\n"); fclose(f); /* Make it a hidden system file. */ if (!SetFileAttributes(desktop_ini, FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN)) { errout("SetFileAttributes(%s) failed", desktop_ini); return; } } } /* Copy one session file (Migration Wizard). */ static sw_t migrate_session(xs_t *xs, int automatic, bool fully_automatic) { FILE *f, *g; int c; char link_path[MAX_PATH]; char from_path[MAX_PATH]; char to_path[MAX_PATH]; session_t s; char exepath[MAX_PATH]; char args[MAX_PATH]; HRESULT hres; int rc; src_t to_src = xs->location; bool shortcut_exists; if (!automatic) { printf("\nFound "); if (xs->location == SRC_DOCUMENTS) { printf("user '%s'", username); } else { printf("shared"); } printf(" session '%s'.", xs->name); if (admin()) { do { char answer[16]; size_t sl; printf("\n\ Copy session to My Documents, Public Documents or neither?\n\ (my/public/neither) [%s] ", xs->location == SRC_DOCUMENTS? "my": "public"); if (!get_input(answer, sizeof(answer))) { return SW_ERR; } sl = strlen(answer); if (!sl) { break; } if (!strncasecmp(answer, "quit", sl)) { return SW_QUIT; } if (!strncasecmp(answer, "neither", sl)) { return SW_SUCCESS; } if (!strncasecmp(answer, "my", sl)) { to_src = SRC_DOCUMENTS; break; } if (!strncasecmp(answer, "public", sl)) { to_src = SRC_PUBLIC_DOCUMENTS; break; } errout("Please answer 'my', 'public' or 'neither'.\n"); } while (true); } else { do { int rc; printf("\nCopy session to My Documents? (y/n) [y]: "); rc = getyn(true); if (rc == YN_ERR) { return SW_ERR; } if (rc == FALSE) { return SW_SUCCESS; } if (rc == TRUE) { to_src = SRC_DOCUMENTS; break; } } while (true); } } snprintf(from_path, MAX_PATH, "%s%s.wc3270", (xs->location == SRC_DOCUMENTS)? appdata_wc3270: common_appdata_wc3270, xs->name); snprintf(to_path, MAX_PATH, "%s%s.wc3270", (to_src == SRC_DOCUMENTS)? documents_wc3270: public_documents_wc3270, xs->name); /* Check for overwrite. */ if (!fully_automatic) { if (access(to_path, R_OK) == 0) { do { printf("\nReplace %s? (y/n) [y]: ", to_path); rc = getyn(TRUE); if (rc == YN_ERR) { return SW_ERR; } else if (rc == FALSE) { return SW_SUCCESS; } } while (rc == YN_RETRY); } } f = fopen(from_path, "r"); if (f == NULL) { errout("Cannot open %s for reading: %s\n", from_path, strerror(errno)); return SW_ERR; } create_wc3270_folder(to_src); g = fopen(to_path, "w"); if (g == NULL) { errout("Cannot open %s for writing: %s\n", to_path, strerror(errno)); fclose(f); return SW_ERR; } while ((c = fgetc(f)) != EOF) { fputc(c, g); } fclose(f); fclose(g); printf("Copied session '%s' to %s.\n", xs->name, to_path); snprintf(link_path, MAX_PATH, "%s%s.lnk", (xs->location == SRC_DOCUMENTS)? desktop: public_desktop, xs->name); shortcut_exists = (access(link_path, R_OK) == 0); if (automatic) { /* Automatic -- only replace the shortcut it if exists. */ if (!shortcut_exists) { return SW_SUCCESS; } } else { /* Manual -- ask. */ do { printf("\n%s desktop shortcut? (y/n) [y]: ", shortcut_exists? "Replace": "Create"); rc = getyn(TRUE); if (rc == YN_ERR) { return SW_ERR; } else if (rc == FALSE) { return SW_SUCCESS; } } while (rc == YN_RETRY); } /* Read in the session. */ f = fopen(to_path, "r"); if (!read_session(f, &s, NULL)) { errout("Invalid session file '%s'.\n", to_path); fclose(f); return SW_ERR; } fclose(f); /* Create the shortcut. */ snprintf(exepath, MAX_PATH, "%s%s", installdir, "wc3270.exe"); snprintf(args, MAX_PATH, "+S \"%s\"", to_path); hres = create_shortcut(&s, exepath, link_path, args, installdir); if (!SUCCEEDED(hres)) { errout("Cannot create shortcut '%s'.\n", link_path); return SW_ERR; } printf("%s shortcut %s\n", shortcut_exists? "Replaced": "Created", link_path); /* Done. */ return SW_SUCCESS; } /* Copy one keymap (Migration Wizard). */ static sw_t migrate_one_keymap(const char *from_dir, const char *to_dir, const char *name, const char *suffix, bool fully_automatic) { char from_path[MAX_PATH]; char to_path[MAX_PATH]; FILE *f, *g; int c; /* Construct the paths. */ snprintf(from_path, MAX_PATH, "%s%s%s%s", from_dir, name, KEYMAP_SUFFIX, suffix); snprintf(to_path, MAX_PATH, "%s%s%s%s", to_dir, name, KEYMAP_SUFFIX, suffix); if (!fully_automatic) { /* Check for overwrite. */ if (access(to_path, R_OK) == 0) { int rc; do { printf("\nReplace %s? (y/n) [y]: ", to_path); rc = getyn(TRUE); if (rc == TRUE) { break; } if (rc == FALSE) { return SW_SUCCESS; } if (rc == YN_ERR) { return SW_ERR; } } while (rc == YN_RETRY); } } /* Create the documents folder. */ if (!strcasecmp(to_dir, documents_wc3270)) { create_wc3270_folder(SRC_DOCUMENTS); } else { create_wc3270_folder(SRC_PUBLIC_DOCUMENTS); } /* Copy. */ f = fopen(from_path, "r"); if (f == NULL) { errout("Cannot open %s for reading: %s\n", from_path, strerror(errno)); return SW_ERR; } g = fopen(to_path, "w"); if (g == NULL) { errout("Cannot open %s for reading: %s\n", to_path, strerror(errno)); fclose(f); return SW_ERR; } while ((c = fgetc(f)) != EOF) { fputc(c, g); } /* Done. */ fclose(f); fclose(g); printf("Copied keymap '%s' to %s.\n", name, to_path); return SW_SUCCESS; } /* Copy the keymaps (Migration Wizard). */ static sw_t migrate_keymaps(bool fully_automatic) { km_t *km; sw_t sw; for (km = km_first; km != NULL; km = km->next) { char *from_dir; char to_dir[MAX_PATH]; switch (km->src) { case SRC_DOCUMENTS: from_dir = appdata_wc3270; snprintf(to_dir, MAX_PATH, "%swc3270\\", documents); break; case SRC_PUBLIC_DOCUMENTS: from_dir = common_appdata_wc3270; snprintf(to_dir, MAX_PATH, "%swc3270\\", public_documents); break; default: continue; } if (km->def_both != NULL) { sw = migrate_one_keymap(from_dir, to_dir, km->name, "", fully_automatic); if (sw != SW_SUCCESS) { return sw; } } if (km->def_3270 != NULL) { sw = migrate_one_keymap(from_dir, to_dir, km->name, KM_3270, fully_automatic); if (sw != SW_SUCCESS) { return sw; } } if (km->def_nvt != NULL) { sw = migrate_one_keymap(from_dir, to_dir, km->name, KM_NVT, fully_automatic); if (sw != SW_SUCCESS) { return sw; } } } return SW_SUCCESS; } /* Do an upgrade. */ static sw_t do_upgrade(bool automatic_from_cmdline) { char done_path[MAX_PATH]; static char wizard[] = "wc3270 Migration Wizard"; int nkm = 0; int nf = 0; int rc; int automatic; xs_t *xs; FILE *f; /* If there are no sessions and no keymaps, we're done. */ if (km_first) { km_t *km; for (km = km_first; km != NULL; km = km->next) { if (km->src != SRC_NONE) { nkm++; } } } if (!xs_my.count && !xs_public.count && !nkm) { printf("No session files or keymaps to migrate.\n"); return SW_QUIT; } if (!automatic_from_cmdline) { /* Say hello. */ cls(); reverseout("%s%*s%s\n", wizard, (int)(79 - strlen(wizard) - strlen(wversion)), " ", wversion); /* Ask if they want to upgrade. */ printf("\n\ wc3270 %s no longer keeps user-defined files in AppData. Session and\n\ keymap files are kept in Documents folders instead.\n\n\ The following files were found in %s:\n", wversion, admin()? "wc3270 AppData folders": "your wc3270 AppData folder"); if (xs_my.count || xs_public.count) { int nxs = xs_my.count + xs_public.count; printf(" %d session file%s\n", nxs, (nxs != 1)? "s": ""); nf = nxs; } if (nkm) { printf(" %d keymap file%s\n", nkm, (nkm != 1)? "s": ""); nf += nkm; } while (true) { printf("\nCopy %s to %s? (y/n) [y]: ", (nf == 1)? "this file": "these files", admin()? "Documents folders": "My Documents"); rc = getyn(TRUE); if (rc == YN_ERR) { return SW_ERR; } if (rc == FALSE) { return SW_SUCCESS; } if (rc == TRUE) { break; } } printf("\n\ The files can be copied automatically, which means that:\n\ - Session files and keymap files in your wc3270 AppDefaults folder will be\n\ copied to My Documents.\n"); if (admin()) { printf("\ - Session files and keymap files in the all-users wc3270 AppDefaults folder\n\ will be copied to Public Documents.\n"); } printf("\ - Existing desktop shortcuts will be re-written to point at the new sessions,\n\ which means that any customizations will be lost.\n"); while (true) { printf("\nCopy automatically? (y/n) [y]: "); automatic = getyn(TRUE); if (automatic == YN_ERR) { return SW_ERR; } if (automatic == TRUE || automatic ==FALSE) { break; } } printf("\n"); } else { /* Just do it all automatically. */ automatic = TRUE; } /* Copy each session file. */ for (xs = xs_my.list; xs != NULL; xs = xs->next) { rc = migrate_session(xs, automatic, automatic_from_cmdline); if (rc != SW_SUCCESS) { return rc; } } for (xs = xs_public.list; xs != NULL; xs = xs->next) { rc = migrate_session(xs, automatic, automatic_from_cmdline); if (rc != SW_SUCCESS) { return rc; } } /* Copy each keymap. */ rc = migrate_keymaps(automatic_from_cmdline); if (rc != SW_SUCCESS) { return rc; } /* Don't do this again. */ snprintf(done_path, sizeof(done_path), "%s%s", searchdir, DONE_FILE); if ((f = fopen(done_path, "w")) != NULL) { fclose(f); } if (admin()) { snprintf(done_path, sizeof(done_path), "%s%s", public_searchdir, DONE_FILE); if ((f = fopen(done_path, "w")) != NULL) { fclose(f); } } /* Done. */ return SW_SUCCESS; } suite3270-3.6/wc3270/wselectc.h0000664000076500007650000000410413221577163014102 0ustar pdmpdm/* * Copyright (c) 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * selectc.h * A Windows console-based 3270 Terminal Emulator * Screen selections */ /* Used by the screen logic. */ bool select_changed(unsigned row, unsigned col, unsigned rows, unsigned cols); typedef enum { SE_BUTTON_DOWN, SE_RIGHT_BUTTON_DOWN, SE_BUTTON_UP, SE_MOVE, SE_DOUBLE_CLICK } select_event_t; bool select_event(unsigned row, unsigned col, select_event_t event, bool shift); void select_init(unsigned max_rows, unsigned max_cols); void select_sync(unsigned row, unsigned col, unsigned rows, unsigned cols); bool select_return_key(void); suite3270-3.6/wc3270/x3270-icon2.bmp0000664000076500007650000004006613221577163014422 0ustar pdmpdmBM6@6(@@ @  •¦²­·”¥±aq|Rcs~›j{‰ÿfvƒÿRboÿXjxÿVhvÿUfsÿRbnÛR_i²WgrÛ]jvÌcnv´hwƒÂl~‰ÿl}‹ÿ\o|ÿ\p|ÿo€Žÿo‚Žÿh|‰ÿfw„ÿhz†ÿfy…ÿfy…ÿdv„ÿYmzÿThuøYkxöZn{ñ^q}ÿ^p|ÿXjxÿauÿdx„ÿh|‰ÿlŒÿm€Žÿn‚ÿn‚‘ÿh|‰Òl~‰õq€‹ÿlw°v‹ÿdr~ÿRcpÿFWcÿHZhÿThwÿYm|ÿWjzüYn}ìWm}ÿZpÿZpÿ]rÿ_u„ÿdz‰ÿdyŠÿcz‰ÿdyˆÿey‰ÿi~ÿh~Œÿl€ÿl‚ÿp…“ÿuˆ–ÿ}œÿ‚•¡ÿ}žÿ…˜¦ÿ‰œ¨ÿ‘£°ÿ’¤²ÿ£°ÿ“¦³ÿ”£ÿqˆ–ÿo…”ÿlÿfzˆÿu†‘ÿly‚ÿH[hÿG[jÿH\mÿI_nÿPgwÿQizÿax‰ÿd{Œÿd{‹ÿg~Žÿhÿo…”ÿsˆ–ÿw‹šÿyžÿ”¢ÿ€”£ÿ”¢ÿ|‘¡ÿ}’¡ÿ–¤ÿ–¤ÿ–¥ÿ…™¨ÿ‡œ©ÿŠ«ÿŠž«ÿ¡®ÿ‰«ÿƒ—¦ÿ¡®ÿ£±ÿ‘¤±ÿ¢°ÿ“¥³ÿ‘¤²ÿu‹›ÿqˆ˜ÿu‹›ÿt‰˜ÿs‡—ÿŠ™¥ÿ|Œ–ÿv„Œÿ_rÿe{‰ÿi€ÿl‚’ÿtŠ™ÿxŽœÿ„™§ÿ†›¨ÿ‡›©ÿ‡›©ÿˆœªÿ‹ž¬ÿ‹Ÿ¬ÿ‡›ªÿ„™§ÿ‚—¦ÿ„˜§ÿ€•¤ÿ€•¤ÿ~”£ÿ~”£ÿ{‘ ÿ|‘ ÿ|‘ ÿ–¥ÿ”£ÿ”£ÿ„™§ÿ†š©ÿ„˜§ÿ…™¨ÿŽ¡¯ÿ‹ž­ÿŠž­ÿŽ¡¯ÿ–¨µÿŠž«ÿuŠšÿ~“¢ÿ–¥ÿ€•¤ÿzŸÿzŒ˜ÿt‚Œÿ_iq´Œ•ÿ›ÿŸ­ÿŽ¢¯ÿ£±ÿ“¥³ÿ’¥²ÿ’¦²ÿ”§´ÿ’¥³ÿ¡¯ÿ‹ž­ÿ‡œªÿ€•¤ÿzŸÿvŒœÿxŽÿvŒœÿsŠ™ÿu‹šÿt‰˜ÿwÿtŠ™ÿs‡–ÿs…“ÿyŠ—ÿx‰–ÿ{Œ˜ÿy‹—ÿs…’ÿi|ŠÿWgtÿz‹—ÿŠž¬ÿ…˜¦ÿ†˜¤ÿ‹›¥ÿ’¥²ÿ…™§ÿ| ÿ†š©ÿ‡›©ÿ…™¨ÿ€”£ÿy‹—ÿnz„Ùš¢ÿ¢¯ÿ’¥²ÿ’¥²ÿ“¦³ÿ”§´ÿ’¥³ÿŽ¡¯ÿžªÿ…—£ÿ‚”¡ÿ}ÿs‡•ÿk€ÿeyˆÿ^p}ÿSeqÿJ[iÿQbnÿ7EPÿ1;Dÿ!-6ÿ*ÿ ÿÿ ÿ ÿÿ ÿ  ÿÿ!+4ÿ>MZÿ *4ÿ&ÿ ÿVeqÿŠ«ÿ{Ÿÿ€”£ÿŒ ­ÿ¡®ÿ‹Ÿ­ÿˆœ©ÿ{‹—ÿm{†ÿ©³ÿ‘£°ÿŽ¡¯ÿ’¦³ÿ˜ª·ÿ’¥³ÿ•§´ÿ]goÿ8@Iÿ8>Gÿ;CJÿ.8Aÿ%/8ÿ&0ÿ"ÿÿÿ#ÿ&ÿ&ÿ!*ÿ&0ÿ".9ÿ3@Jÿ;HQÿHVbÿTbmÿ$,4ÿ ÿ  ÿ'ÿ*3;ÿ ÿ "ÿ !ÿ!*ÿTbmÿ„™¨ÿ~“¢ÿˆœªÿŽ¡¯ÿ¡¯ÿ“¦³ÿ‹©ÿ|Œ–ÿ¢¯·ÿŒ ­ÿ•¨µÿ„• ÿZjuÿNZcÿ$.7ÿ ÿ ÿKZfÿ/9Cÿ&-ÿ!+5ÿ.;Gÿ8DNÿBOZÿK[hÿPcqÿ_rÿhz‡ÿkŒÿvŠ˜ÿ„—¤ÿŒŸ«ÿœ®¹ÿž°¼ÿ}Š“ÿP\fÿXclÿÿ+4=ÿ&/ÿ !ÿ%ÿ ÿ$ÿqƒ‘ÿ‰¬ÿ…™§ÿ¡¯ÿ£°ÿ˜«·ÿ“¤°ÿ}Š•ÿ ®·ÿ’¥²ÿfqzÿ ÿ ÿ",ÿ ÿ ÿfu€ÿ†–¡ÿ‚•¡ÿ”¢ÿ‡š¨ÿ…™¦ÿƒ—¦ÿ„˜¦ÿ‚—¥ÿ‰«ÿ¡¯ÿ“¦³ÿ—ª¶ÿ™«·ÿ ±¼ÿ£´Àÿ¦·Âÿ¬¼Æÿ­½Çÿ·ÅÌÿQW]ÿ#ÿ/;Eÿ&ÿ#ÿ ÿÿ9DLÿŠªÿŠž¬ÿ†›©ÿ¢°ÿ’¥³ÿ ­ÿK]kÿn~ˆÿ’£¬ë‚’œÿ!)2ÿ ÿ"-ÿ'2ÿÿ$+1ÿ;?BÿŠš¥ÿœ®»ÿ—ª¶ÿ“¦³ÿ¢°ÿ¢°ÿ£°ÿ£±ÿ•¨µÿ—ª·ÿ—ª·ÿ¯ºÿ ±½ÿŸ±½ÿ¢²¾ÿ¦·Áÿ®¿Èÿ±ÁÊÿ‚Ž–ÿ ÿ&ÿ+7Aÿ )ÿ ÿ*ÿ*4=ÿ}‘žÿ£°ÿ‡œ©ÿˆœªÿ¡¯ÿ‰›¨ÿATbÿcv…ÿiyƒÿn|†ÿ¤¯¶Ù™ÿ7?Hÿ ÿ%1ÿ*6ÿ"ÿ*18ÿu…ÿ¢´Àÿœ®ºÿ”§³ÿ“¥²ÿ¢¯ÿŒŸ­ÿŒŸ¬ÿŽ¡®ÿ¡®ÿ¢¯ÿ“¥±ÿ’¤±ÿ–§³ÿ¡­ÿ‘¡¬ÿ”¤¯ÿ’Ÿÿw…‘ÿ-9Cÿ#.7ÿ1>Hÿ*7Cÿ+ÿ)ÿ!)ÿ1?Iÿq…“ÿŽ¢°ÿ‰ªÿˆ«ÿ’ ÿ;P_ÿdzˆÿ]p~ÿ_o{ÿev€ÿu…’ÿ”£—o{†ÿ#)2ÿ(ÿ(6Aÿ7DNÿ{ˆ‘ÿˆ™¤ÿŽŸªÿ{šÿu…‘ÿo|…ÿlw€ÿly‚ÿlyÿnz‚ÿdq{ÿcpyÿXgrÿL[fÿCQ]ÿ4>Gÿ2;Cÿ-7?ÿ$.7ÿ*4ÿ%ÿ$ÿ ÿÿ ÿÿÿÿ3@Lÿ~’Ÿÿ‘¥²ÿ†›©ÿp‚ÿ6K\ÿd{Œÿ`xˆÿ_t‚ÿ[o|ÿ`p|ÿdv‚ÿKU]ÿ9BJÿ+6@ÿ%.ÿ")ÿ%ÿ ÿÿÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿ ÿÿ ÿÿ ÿ ÿÿÿ ÿ8FQÿu…’ÿs„‘ÿGXfÿ;O_ÿe}ÿe|Œÿc{‹ÿbx‡ÿ_rÿ]p{ÿ`q}ÿdtÿ069ÿ ÿ*ÿ ÿÿÿÿÿÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿÿ  ÿ ÿ  ÿ !ÿ $ÿ "ÿ ÿ ÿ ÿ ÿ*ÿ#1=ÿ"0<ÿ,;ÿAVfÿf~Žÿe|ÿhÿi€‘ÿf|Œÿbw…ÿ^o{ÿ[kxÿfw„ÿk{†ÿ…Šÿ=DJÿ'18ÿ*3;ÿ%.ÿ)ÿ$/ÿ*6ÿ .:ÿ)5ÿ*6ÿ.<ÿ"3Aÿ$5Cÿ$6Dÿ&8Eÿ&8Fÿ%7Fÿ':Iÿ"2Aÿ#4Cÿ 1Aÿ,;ÿ+:ÿ)9ÿ*9ÿ .ÿ,ÿ&ÿ&ÿ)ÿ)ÿ!0ÿ"0ÿ%4ÿMcsÿh€ÿi€‘ÿlƒ’ÿi€‘ÿj’ÿj‘ÿe{‰ÿbv…ÿ^t„ÿZmzÿals…box¿‹“ÿuƒÿXkyÿRfvÿRiyÿE\nÿ?Vhÿ9Pbÿ7N`ÿ6L^ÿ5K]ÿ.DUÿ,BSÿ-CTÿ.CUÿ/EVÿ*?Pÿ)=Oÿ$8Iÿ"5Eÿ.?ÿ*9ÿ'6ÿ-ÿ*ÿ&ÿ $ÿ "ÿ "ÿ'ÿ+ÿ!/ÿNdsÿlƒ“ÿk‚’ÿm„”ÿk‚’ÿm„”ÿn…”ÿk‚’ÿi€ÿf}ŒÿYn~ÿ^o|ÿu†“ÿbyŠÿ[s„ÿUm~ÿH`rÿE[mÿ>Ugÿ8N`ÿ4J\ÿ4J\ÿ0FWÿ+ARÿ.CTÿ/EVÿ-CTÿ)=Nÿ';Lÿ%8Iÿ"5Fÿ-=ÿ&4ÿ!/ÿ)ÿ 'ÿ ÿ !ÿ "ÿ ÿ "ÿ #ÿ $ÿMbrÿkƒ’ÿm„“ÿlƒ’ÿlƒ“ÿk‚’ÿn…•ÿm„”ÿj’ÿf~ŽÿZp€ÿ\n{ÿl|‡ÿ_v…ÿTl}ÿOgyÿF^pÿBYkÿ=Tfÿ8Oaÿ4K\ÿ3J[ÿ.CUÿ,ASÿ/DUÿ/EVÿ)=Nÿ%9Jÿ%8Iÿ%8Iÿ$7Hÿ1Bÿ&6ÿ -ÿ'ÿ !ÿ !ÿ ÿ ÿ ÿ  ÿ ÿ !ÿTjzÿkƒ’ÿlƒ“ÿn…•ÿo†•ÿlƒ“ÿn…•ÿlƒ“ÿhÿd{‹ÿ]r‚ÿYkyÿl{ˆÿ[s€ÿJbtÿKbtÿAXjÿÿ,<ÿ"/ÿ)ÿ $ÿ &ÿ ÿ  ÿ "ÿ  ÿ ÿ "ÿ^u„ÿn…•ÿm„”ÿo†–ÿp‡—ÿn…”ÿp‡—ÿm„”ÿhÿf}Žÿ^t„ÿWjxÿl{‡ÿYm|ÿOewÿQi{ÿJbsÿG^pÿF^oÿC[mÿ;Rdÿ9Oaÿ6M^ÿ4J\ÿ5L^ÿ/EVÿ(=Nÿ&:Kÿ%:Kÿ';Lÿ#7Hÿ 3Cÿ0@ÿ(6ÿ%4ÿ -ÿ -ÿ -ÿ,ÿ!/ÿ+ÿ!.9ÿ?N\ÿp‡–ÿr‰˜ÿp‡—ÿn…•ÿp‡—ÿp‡—ÿq‡—ÿo†–ÿj‘ÿg~Žÿ]sƒÿj|ˆÿo{†ÿ\o|ÿ`v†ÿ`wˆÿXp€ÿNfwÿLctÿE\mÿ>Ufÿ=Seÿ:Pbÿ4J\ÿ3J\ÿ/DVÿ*?Pÿ';Kÿ%9Iÿ(ÿ0@ÿ#4Cÿ4HWÿ`u…ÿv‹šÿvŒœÿt‹šÿr‰™ÿqˆ˜ÿqˆ—ÿo†–ÿm„”ÿm„”ÿk‚’ÿg~ÿ^t„ÿs‚ÿXgrÿCUdÿAUfÿ?Teÿ>Teÿ:O`ÿ>TdÿDYjÿLbsÿLbrÿQfwÿWm}ÿ^u…ÿ\r‚ÿWm~ÿXo~ÿWm}ÿZp€ÿUk|ÿNeuÿI`qÿ@Ugÿ?Ugÿ?Vgÿ6K]ÿ7K\ÿ4HWÿd{Šÿrˆ˜ÿwÿxŽÿt‹šÿsŠ™ÿt‹šÿuŒ›ÿrˆ˜ÿlƒ“ÿj‘ÿmƒ“ÿj‘ÿg~ÿ_u‚ÿguÿ†‘™ÿt„Žÿn~‡ÿiz‡ÿl}‹ÿqƒ‘ÿzŒ™ÿ’Ÿÿˆ™¦ÿŒž«ÿ¡­ÿ¡­ÿ¢®ÿ¡­ÿŽŸªÿ‹›§ÿˆ™¥ÿ‰š¥ÿ‰š¦ÿŠœ¨ÿ†™¥ÿ†™¦ÿ…˜¥ÿ€”¡ÿxŒšÿm‚’ÿUm}ÿe{‹ÿu‹šÿzŸÿyŸÿxŽÿxÿu‹šÿt‹šÿtŠšÿwÿt‹šÿlƒ“ÿj‘ÿl‚’ÿj‚‘ÿd|Œÿ\qÿdr{ÿ”¡ªÿ¢¯¶ÿ›ªµÿŠ— ÿyƒŠÿm{„ÿ]isÿY`fÿ^diÿ^dhÿ]dhÿV]bÿQY`ÿJSYÿDOVÿ=GNÿ7>Dÿ4:@ÿ29Cÿ4;Dÿ5Dÿ&,2ÿ!$ÿ"ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ%+ÿ‡œªÿ†š©ÿ…š¨ÿ–¥ÿ~“¢ÿzŸÿxŽÿu‹›ÿtŠšÿsŠ™ÿuŒ›ÿu‹›ÿr‰˜ÿo†–ÿm„”ÿlƒ’ÿd|ÿ_t„ÿds}ÿ…–ÿ#&ÿÿÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿÿÿŠœ©ÿ†›ªÿˆœªÿ‡›ªÿ…™¨ÿ~“¢ÿ•£ÿxÿxÿwÿwœÿuŒ›ÿsŠ™ÿo†•ÿo†–ÿn…”ÿi€ÿcxˆÿdrÿfnsÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ (ÿ%ÿ ÿ‰š¥ÿ“§´ÿ‘¤²ÿ¡®ÿŠž¬ÿ„˜§ÿ~”£ÿzŸÿ{žÿxŽžÿu‹›ÿvŒœÿu‹›ÿn…•ÿm„”ÿo†–ÿk‚’ÿg|‹ÿct€ÿQ[bÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿÿ ÿ‡™¤ÿ™¬¹ÿ“¦³ÿŽ¢¯ÿŒŸ­ÿ…™¨ÿ€•¤ÿ}“¢ÿ|’ ÿyŽžÿvŒœÿvŒ›ÿu‹šÿp†–ÿk‚’ÿm„”ÿj‘ÿg}Œÿ`q~ÿ8@Gÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿˆ™¤ÿš¬¹ÿ•§µÿ”§´ÿ‘¤²ÿˆœªÿ–¥ÿ|’¡ÿ}“¢ÿ{ŸÿxŽžÿvœÿr‰˜ÿp‡—ÿm„”ÿlƒ“ÿlƒ“ÿk€ÿarÿJRXÿ037ÿ ÿ ÿ ÿ ÿ ÿm9ÿm9ÿm9ÿG,ÿ ÿG,ÿG,ÿG,ÿ ÿ ÿG,ÿÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ…—¢ÿš­ºÿ—©¶ÿ–©¶ÿ•©µÿ‹Ÿ­ÿ‚—¦ÿ}’¢ÿ”£ÿ}’¡ÿ{ ÿwÿr‰˜ÿp‡—ÿm„”ÿlƒ”ÿlƒ“ÿiŽÿ]p|ÿ_gmÿ%*.ÿ ÿ ÿÿ ÿ ÿm9ÿÿG,ÿ ÿm9ÿÿ ÿ ÿÿÿ ÿ ÿÿm;ÿÿ ÿ ÿÿ ÿ ÿÿ$ÿ ÿ ÿ“Ÿÿœ¯»ÿ›¬¹ÿ˜«·ÿ˜«·ÿ‹Ÿ­ÿ–¥ÿ|‘¡ÿ€•¤ÿ~“¢ÿzŸÿuŒ›ÿtŠšÿr‰˜ÿn…”ÿn…”ÿn…•ÿj€ÿ\o{ÿ_elÿ#ÿ ÿ ÿ ÿ ÿ ÿ ÿÿm9ÿm9ÿ ÿ ÿ ÿ ÿ ÿ ÿ w6ÿÿÿÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ‚”Ÿÿ¡²¾ÿž°¼ÿ›­¹ÿ›­¹ÿŽ¡¯ÿƒ˜§ÿ”£ÿƒ˜¦ÿ€•¤ÿ{‘ ÿyžÿzŸÿs‰™ÿp‡–ÿo†–ÿo†•ÿj€ÿ\o{ÿkqtÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ‚“ ÿ ²¿ÿŸ±½ÿœ®ºÿ™«¸ÿ¢°ÿ…š©ÿƒ˜¦ÿ„˜§ÿ‚—¦ÿ{‘ ÿ{‘ ÿxŽžÿu‹›ÿtŠšÿq‡—ÿn…•ÿl‚’ÿ`r€ÿouxÿ ÿÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿz1ÿ ÿ ÿ ÿz1ÿg8ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿƒ”Ÿÿ¤µÁÿ¢³¿ÿž°¼ÿ™«·ÿ“¦³ÿŒŸ®ÿ‰«ÿ†š©ÿ‚˜§ÿ~“£ÿ}’¢ÿ{ ÿu‹›ÿvŒœÿs‰™ÿo†–ÿm„”ÿcw„ÿemtÿ ÿÿ ÿÿ ÿÿÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿÿÿÿÿm;ÿ ÿ ÿ ÿ ÿ ÿ"+ÿ ÿ‡˜£ÿ¦·Ãÿ¢³¿ÿž¯»ÿ˜ª·ÿ”§´ÿ’¤²ÿ‹Ÿ­ÿˆœ«ÿ…š¨ÿ‚˜§ÿ–¦ÿ–¥ÿz ÿt‹šÿtŠšÿqˆ—ÿqˆ—ÿfz‰ÿJT`ÿ$«ÿJÿ ÿ ÿ ÿ ÿ ÿÿG,ÿ ÿÿj/ÿG,ÿ ÿÿj/ÿ[8ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ+ÿ ÿŠš¥ÿ§¹Ãÿ£µÀÿ ±½ÿ›­¹ÿ–©µÿ”§´ÿŽ¡¯ÿ‹ ®ÿ‰«ÿ‡œªÿ…™¨ÿ„™§ÿ|‘¡ÿwœÿvŒœÿxÿr‰˜ÿeyˆÿOT[ÿ ¼ÿ Yÿ ÿ ÿ ÿ ÿÿÿ ÿ o,ÿv.ÿx4ÿ ÿ o,ÿv.ÿx4ÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ&ÿ ÿŸªÿªºÅÿ¦·Âÿ¡²¾ÿž°¼ÿ™¬¸ÿ–©¶ÿ‘¥²ÿ¡®ÿŠž¬ÿˆœªÿ†›©ÿ…™¨ÿ”¤ÿzŸÿwœÿvŒ›ÿq‡–ÿcw†ÿ\_bÿ¢ÿPÿÿ ÿÿG,ÿ ÿÿo:ÿm9ÿm0ÿ3ÿo:ÿm9ÿm0ÿ3ÿ ÿÿ ÿm;ÿÿ ÿÿ ÿ ÿ ÿ ÿÿ (1ÿ ÿ”¤­ÿ©»Åÿ§¸Ãÿ¤µÀÿŸ±¼ÿ™«¸ÿ•§´ÿ”§´ÿ£±ÿŒŸ­ÿ‰«ÿ†›©ÿ†š©ÿ”¢ÿ|‘ ÿ|‘ ÿxŽÿrˆ—ÿfzˆÿW[^ÿ Aÿ 9ÿ ÿÿÿ ÿ o,ÿÿr*ÿn:ÿm;ÿ ÿr*ÿn:ÿ ÿ ÿÿ ÿÿm;ÿm;ÿ ÿ ÿ !ÿ ÿ ÿ ÿ ÿ/=ÿ ÿ—§°ÿ«»Åÿ©¹Äÿ¦·Âÿ ²½ÿš­¹ÿ–¨µÿ’¥²ÿ£±ÿŽ¢¯ÿ‰ž¬ÿ…š¨ÿ†›¨ÿ€•¤ÿ€•¤ÿƒ˜¦ÿ}’¡ÿsˆ˜ÿgzˆÿRY^ÿ ÿ ÿ ÿ ÿÿo:ÿm9ÿ ÿ ÿ ÿ k;ÿ z!ÿ ÿ ÿ k;ÿ z!ÿ ÿ ÿ ÿÿ ÿÿÿÿÿ ÿÿÿ(2<ÿÿš©²ÿ©ºÅÿ¬¼Æÿ¦·Âÿ ±½ÿ˜«·ÿ–©µÿ’¥³ÿ‘¤±ÿ¡¯ÿˆœªÿ†š¨ÿˆœªÿ†›©ÿƒ˜¦ÿ–¥ÿ|‘¡ÿxŒšÿi|ŠÿKSZÿ ÿ ÿ ÿ ÿÿr*ÿn:ÿ ÿ$ÿ'ÿ q6ÿ ‹(ÿ$ÿ'ÿ ÿ ÿÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ™¨±ÿ©ºÄÿ¬¼Æÿ¥¶ÁÿŸ±½ÿ—ª·ÿ–¨µÿ’¥³ÿ’¥²ÿ¡¯ÿ‹ž¬ÿ‡›ªÿŒ ­ÿ‡œªÿ„™§ÿ–¥ÿ~“¢ÿy›ÿi}ŠÿAJQÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ" ÿ ÿÿ ÿ ÿÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿšªµÿ©¹Äÿ¬¼Æÿ¥¶Áÿ ±½ÿš­¹ÿ–©µÿ•¨´ÿ“¦³ÿ¤±ÿŒ ®ÿŠž¬ÿŠŸ­ÿˆœªÿ†š¨ÿ„˜§ÿ€•£ÿzŽœÿk}‹ÿ4Dÿª»ÇÿªºÅÿ¨¸Ãÿ¤µÀÿŸ²½ÿœ¯»ÿš¬¸ÿ˜«·ÿ•©µÿ—©¶ÿ’¥³ÿ¢°ÿŒ ®ÿŠž¬ÿˆœ«ÿ‡œªÿ†š©ÿ~‘Ÿÿm€ÿ).4ÿÿ ÿ ÿ ÿÿm8ÿ‚ ÿÿ ÿ t.ÿ ÿ†1ÿ ÿ t.ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿ?DIÿ§¸ÃÿªºÄÿ©¹Äÿ¦·Áÿ¡²¾ÿž°¼ÿ˜ª·ÿ˜«·ÿ–ª¶ÿ–¨µÿ’¥²ÿŽ¢¯ÿ‹Ÿ­ÿŠž¬ÿЬÿŠž«ÿ…™¨ÿ’ ÿoŽÿ).4ÿ ÿ ÿ ÿ ÿÿ !ÿÿÿ !ÿ !ÿˆ&ÿ 'ÿ !ÿ !ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿCILÿ¥·Âÿ«¼ÅÿªºÄÿ¦¶Áÿ¢³¾ÿŸ±¼ÿœ®ºÿ™«·ÿ”§´ÿ•§´ÿ‘¤±ÿ¢¯ÿŠŸ­ÿ‹ ­ÿŠž¬ÿˆœ«ÿ€•£ÿ}‘Ÿÿqƒÿ'+0ÿ ÿ ÿ ÿ ÿÿ ÿ t.ÿ ÿ†1ÿ ÿ t.ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿXciÿ¨ºÅÿ­½ÇÿªºÅÿ¨¹Ãÿ£´¿ÿž°»ÿŸ±½ÿ™«·ÿ’¥³ÿ”§´ÿ“¦³ÿ¢°ÿ ®ÿŒ ®ÿŠž¬ÿ…š©ÿ–¤ÿ{ŽžÿnŽÿ'+0ÿ ÿ ÿ ÿ ÿÿ !ÿ !ÿˆ&ÿ 'ÿ !ÿ !ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿju}ÿ¨¹Äÿ®¾ÈÿªºÄÿ¨¹Äÿ¤µÁÿŸ²½ÿž°¼ÿ™¬¸ÿ“¦³ÿ•§´ÿ“¦³ÿ‘¤²ÿ£°ÿŽ¢¯ÿŒŸ®ÿ‰¬ÿ†š¨ÿ|žÿkŒér‰˜)17ÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ  ÿ  ÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿÿÿu†ÿ¤µÁÿ®¾ÈÿªºÄÿ¨¹Äÿ¤µÀÿ¡³¾ÿ®ºÿ™¬¸ÿ“¦³ÿ”¦³ÿ“¥²ÿ“¦³ÿ‘¤±ÿ ®ÿŠž­ÿˆœªÿ…™¨ÿ~‘¡ÿsˆ—çd|+4<ÿ ÿ ÿ ÿ ÿÿ !ÿ !ÿ !ÿ 'ÿ !ÿ !ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿ ÿÿ ÿx…Žÿ£µÀÿ­½ÇÿªºÄÿ¨¸Ãÿ£´Àÿ ±½ÿ¯»ÿš¬¸ÿ”§´ÿ“¦³ÿ”§´ÿ”§´ÿ‘¤²ÿ¢°ÿˆ«ÿ†›©ÿƒ˜¦ÿ~”£ÿs‰™æd|6@Gÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ  ÿ  ÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿ ÿ&ÿ‰™£ÿ¥¶Áÿ­½ÈÿªºÅÿ§¸Ãÿ¤µÀÿ¡²¾ÿ¯»ÿ™«·ÿ”§´ÿ”§´ÿ“¦³ÿ•¨µÿ”§´ÿ’¥²ÿŒ ®ÿˆœªÿƒ—¦ÿ”£ÿvŠšçZm{FMÿ/6;ÿ/6;ÿ-4:ÿ'/7ÿ!)1ÿ#*ÿ )ÿ)ÿ 'ÿ$(ÿ$ÿ#ÿ (ÿ!*ÿ'ÿ )ÿ$,ÿ!)3ÿ$,4ÿ)07ÿ.6=ÿ;IUÿMXaÿXclÿˆ–¡ÿ­¹ÿ©¹Ãÿ§·Áÿ¦µÀÿ¥´¿ÿ£³¾ÿž¯»ÿ®¹ÿ™«¸ÿ™«·ÿ—ª¶ÿš¬·ÿ–§´ÿ¡­ÿƒ”¡ÿŸ¨ÿsƒŽÿ{ƒˆÓv€‡ÿdmsÿw€†ÿw€†ÿ~„ˆÿox~ÿkv~ÿ`mvÿR\eÿt}„ÿv}‚ÿtz~ÿsx|ÿvzÿt{€ÿx€…ÿu~„ÿryÿr{ÿz…ÿ…‘™ÿ‘œ£ÿš£ªÿŸ¨°ÿ¡¬´ÿ¦²ºÿ§´»ÿ¦³¼ÿ§³¼ÿ§´¼ÿ©µ¾ÿª¶¿ÿ§´¼ÿ«·¿ÿš¨³ÿ—¦±ÿ™©³ÿž­·ÿ¤±ºÿž©±Ç“¥Ösuite3270-3.6/wc3270/x3270.man.m40000664000076500007650000023655313221577163013736 0ustar pdmpdmdnl Copyright (c) 1993-2017, Paul Mattes. dnl Copyright (c) 1990, Jeff Sparkes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their dnl contributors may be used to endorse or promote products derived from dnl this software without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR dnl ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER dnl CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH dnl DAMAGE. define(XX_KEY,$1`'XX_LT()Key>$2)dnl define(XX_BTN,$1`'XX_LT()Btn$2>)dnl define(XX_action,`ifelse(XX_PRODUCT,tcl3270,command,action)')dnl define(XX_Action,`ifelse(XX_PRODUCT,tcl3270,Command,Action)')dnl XX_TH(XX_PRODUCT,1,XX_DATE) XX_SH(Name) XX_PRODUCT XX_DASH ifelse(XX_PRODUCT,c3270,`curses-based ')dnl XX_SM(IBM) host access tool XX_SH(Synopsis) XX_FB(XX_PRODUCT) ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')dnl [XX_FI(options)] [XX_FI(host)] ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_BR XX_FB(XX_PRODUCT) [XX_FI(options)] ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')XX_FI(session-file).XX_PRODUCT ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_SH(Description) XX_FB(XX_PRODUCT) opens a telnet connection to an XX_SM(IBM) ifelse(XX_PRODUCT,x3270,`host in an X window.', XX_PRODUCT,s3270,`host, then allows a script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_PRODUCT,ws3270,`host, then allows a script to control the host login session.', XX_PRODUCT,tcl3270,`host, then allows a tcl script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_MODE,console,`host in a console window.') It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. ifelse(XX_PRODUCT,x3270, `The window created by XX_FB(XX_PRODUCT) can use its own font for displaying characters, so it is a fairly accurate representation of an XX_SM(IBM) 3278 or 3279. It is similar to XX_FI(tn3270)(1) except that it is X-based, not curses-based. ')dnl ifelse(XX_PRODUCT,c3270, `If the console is capable of displaying colors, then XX_FB(c3270) emulates an XX_SM(IBM) 3279. Otherwise, it emulates a 3278. ')dnl include(hostname.inc) XX_SH(Options) ifelse(XX_PRODUCT,x3270,`XX_FB(x3270) is a toolkit based program, so it understands standard Xt options and resources. It also understands',` XX_FB(XX_PRODUCT) understands') the following options:XX_TPS() ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ', `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(activeicon))) Specifies that the icon should be a miniature version of the screen image. See XX_LINK(#Icons,XX_SM(ICONS)) below. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed using the XX_DQUOTED(bold) colors (colors 8 through 15, rather than colors 0 through 7). This helps with PC console windows in which colors 0 through 7 are unreadably dim. All-bold mode is the default for color (3279) emulation, but not for monochrome (3278) emulation. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays. XX_TP(XX_FB(XX_DASHED(altscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(apl))) Sets up XX_SM(APL) mode. ifelse(XX_PRODUCT,x3270,`This is actually an abbreviation for several options. ')dnl See XX_LINK(#APL-Support,XX_SM(APL SUPPORT)) below. ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(cadir)) XX_FI(directory)) Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) XX_TP(XX_FB(XX_DASHED(cafile)) XX_FI(filename)) Specifies a XX_SM(PEM)-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(cbreak))) Causes XX_FB(c3270) to operate in XX_FI(cbreak) mode, instead of XX_FI(raw) mode. In XX_FI(cbreak) mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for XX_FB(interrupt), XX_FB(quit), and XX_FB(lnext) (usually ^C, ^XX_BACKSLASH and ^V respectively) will be seen by XX_FB(c3270) only if preceded by the XX_FB(lnext) character. The XX_FB(susp) character (usually ^Z) cannot be seen by XX_FB(c3270) at all. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(cc)) XX_FI(range):XX_FI(value)[`,'...]) Sets character classes. XX_HO(`See XX_LINK(#Character-Classes,XX_SM(CHARACTER CLASSES)), below. ')dnl ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfile)) XX_FI(filename)) Specifies a file containing a client certificate to provide to the host. The default file type is XX_SM(PEM). ')dnl XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. ifelse(XX_PLATFORM,unix,`(MacOS only) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfiletype)) XX_FI(type)) Specifies the type of the certificate file specified by XX_FB(XX_DASHED(certfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(chainfile) XX_FI(filename))) Specifies a certificate chain file in XX_SM(PEM) format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If XX_FB(XX_DASHED(chainfile)) is specified, it overrides XX_FB(XX_DASHED(certfile)). (OpenSSL only) ')dnl XX_TP(XX_FB(XX_DASHED(charset)) XX_FI(name)) Specifies an XX_SM(EBCDIC) host character set. XX_HO(`See XX_LINK(#Character-Sets,XX_SM(CHARACTER SETS)) below. ')dnl XX_TP(XX_FB(XX_DASHED(clear)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(false). define(XX_TOGGLEREF,`ifelse(XX_PRODUCT,x3270,Menus,Toggles)')dnl define(XX_TOGGLEREFNM,`ifelse(XX_PRODUCT,x3270,MENUS,TOGGLES)')dnl XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl XX_TP(XX_FB(XX_DASHED(connecttimeout)) XX_FI(seconds)) Specifies the time that XX_PRODUCT will wait for a host connection to complete. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defaultfgbg))) Causes XX_PRODUCT to use the XX_POSESSIVE(terminal) default foreground color instead of the curses color XX_FB(black), and the XX_POSESSIVE(terminal) default background color instead of the curses color XX_FB(white). This is helpful for emulators such as XX_FI(gnome-terminal) whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable XX_FB(COLORTERM) is set to XX_FB(gnome-terminal). It is available only if XX_PRODUCT was compiled with a version of XX_FI(ncurses) that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the default (80-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl XX_TP(XX_FB(XX_DASHED(devname)) XX_FI(name)) Specifies a device name (workstation ID) for RFC 4777 support. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(efont)) XX_FI(name)) Specifies a font for the emulator window. XX_HO(`See XX_LINK(#Fonts,XX_SM(FONTS)) below. ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(hostsfile)) XX_FI(file)) Uses XX_FI(file) as the hosts file, which allows aliases for host names and scripts to be executed at login. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(1)) for details. ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(XX_DASHED(httpd)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for HTTP connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(scriptport) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(iconname)) XX_FI(name)) Specifies an alternate title for the program icon. XX_TP(XX_FB(XX_DASHED(iconx)) XX_FI(x)) Specifies the initial x coordinate for the program icon. XX_TP(XX_FB(XX_DASHED(icony)) XX_FI(y)) Specifies the initial y coordinate for the program icon. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(im)) XX_FI(method)) Specifies the name of the input method to use for multi-byte input. (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(keyfile)) XX_FI(filename)) Specifies a file containing the private key for the certificate file (specified via XX_FB(XX_DASHED(certfile)) or XX_FB(XX_DASHED(chainfile))). The default file type is XX_SM(PEM). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keyfiletype)) XX_FI(type)) Specifies the type of the private key file specified by XX_FB(XX_DASHED(keyfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keypasswd)) XX_FI(type):XX_FI(value)) Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be XX_FB(file):XX_FI(filename), specifying that the password is in a file, or XX_FB(string):XX_FI(string), specifying the password on the command-line directly. If the private key file is encrypted and no XX_FB(XX_DASHED(keypasswd)) option is given, ifelse(XX_INTERACTIVE,yes,`the password will be prompted for interactively.', `secure connections will not be allowed.') ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keymap name and optional modifiers. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keyboard map to be found in the resource XX_FB(c3270.keymap.)`'XX_FI(name) or the file XX_FI(name). See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below for details. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keypad))) Turns on the keypad as soon as XX_FB(XX_PRODUCT) starts. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(km)) XX_FI(name)) Specifies the local encoding method for multi-byte text. XX_FI(name) is an encoding name recognized by the ICU library. (Supported only when XX_PRODUCT is compiled with DBCS support, and necessary only when XX_PRODUCT cannot figure it out from the locale.) ')dnl XX_TP(XX_FB(XX_DASHED(loginmacro)) XX_FI(Action(arg...) ...)) Specifies a macro to run at login time. ifelse(XX_PRODUCT,ws3270,`XX_TP(XX_FB(XX_DASHED(localcp) XX_FI(codepage))) Specifies the Windows code page to use for local I/O. The default is to use the XX_POSESSIVE(system) ANSI code page. ')dnl ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(minversion)) XX_FI(version)) The minimum required version of XX_FB(XX_PRODUCT), e.g., XX_VERSION_NUMBER. If the running version is less than the specified version, XX_FB(XX_PRODUCT) will abort. The format of a version is XX_FI(major)`'XX_FB(.)`'XX_FI(minor)`'XX_FB(type)`'XX_FI(iteration). XX_FB(type) is ignored, and XX_FI(minor) and XX_FI(iteration) can be omitted. ')dnl XX_TP(XX_FB(XX_DASHED(model)) XX_FI(name)) The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: XX_IP The first part is the XX_FB(base model), which is either XX_FB(3278) or XX_FB(3279). XX_FB(3278) specifies a monochrome (green on black) 3270 display; XX_FB(3279) specifies a color 3270 display. XX_IP The second part is the XX_FB(model number), which specifies the number of rows and columns. Model 4 is the default. XX_PP XX_TS(3,`center; c c c .') XX_TR(XX_TD(XX_TC(Model Number)) XX_TD(XX_TC(Columns)) XX_TD(XX_TC(Rows))) XX_T_ XX_TR(XX_TD(XX_TC(2)) XX_TD(XX_TC(80)) XX_TD(XX_TC(24))) XX_TR(XX_TD(XX_TC(3)) XX_TD(XX_TC(80)) XX_TD(XX_TC(32))) XX_TR(XX_TD(XX_TC(4)) XX_TD(XX_TC(80)) XX_TD(XX_TC(43))) XX_TR(XX_TD(XX_TC(5)) XX_TD(XX_TC(132)) XX_TD(XX_TC(27))) XX_TE() XX_IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. XX_IP The default model ifelse(XX_PRODUCT,x3270,`for a color X display is XX_FB(`3279'XX_DASHED(4)). For a monochrome X display, it is XX_FB(`3278'XX_DASHED(4)).', XX_PRODUCT,c3270,`for a color display is XX_FB(`3279'XX_DASHED(4)). For a monochrome display, it is XX_FB(`3278'XX_DASHED(4)).', `is XX_FB(`3279'XX_DASHED(4)).') ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(mono))) Forces XX_FB(XX_PRODUCT) to believe it is running on a monochrome X display. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(mono))) Prevents XX_FB(XX_PRODUCT) from using color, ignoring any color capabilities reported by the terminal. XX_TP(XX_FB(XX_DASHED(noprompt))) An alias for XX_DASHED(secure). ')dnl XX_TP(XX_FB(XX_DASHED(noverifycert))) For SSL/TLS connections, do not verify the host certificate. XX_TP(XX_FB(XX_DASHED(nvt))) Start in NVT mode instead of waiting for the host to send data, and make the default terminal type XX_FB(xterm). ifelse(XX_PRODUCT,x3270, XX_TP(XX_FB(XX_DASHED(once))) Causes XX_FB(XX_PRODUCT) to exit after a host disconnects. This option has effect only if a hostname is specified on the command line. )dnl XX_TP(XX_FB(XX_DASHED(oversize)) XX_FI(cols)`'XX_FB(x)`'XX_FI(rows)) Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "XX_PRODUCT.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. ifelse(XX_MODE,console,`XX_IP It can also be specified as XX_FB(auto), which causes XX_FB(XX_PRODUCT) to fill the entire terminal or console window. ')dnl XX_TP(XX_FB(XX_DASHED(port)) XX_FI(n)) Specifies a different XX_SM(TCP) port to connect to. XX_FI(n) can be a name from XX_FB(/etc/services) like XX_FB(telnet), or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(pt)) XX_FI(type)) Specifies the preedit type for the multi-byte input method. Valid values are XX_FB(OverTheSpot), XX_FB(OffTheSpot), XX_FB(Root) and XX_FB(OnTheSpot). The value for XX_FB(OverTheSpot) can `include' an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. XX_FB(OverTheSpot+1) or XX_FB(OverTheSpot-2). The default value is XX_FB(OverTheSpot+1). (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FB(XX_PRODUCT) to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(rv))) Switches XX_PRODUCT from a white-on-black display to a black-on-white display. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(sb))) Turns on the scrollbar. XX_TP(XX_FB(+sb)) Turns the scrollbar off. XX_TP(XX_FB(XX_DASHED(scheme)) XX_FI(name)) Specifes a color scheme to use in 3279 mode. This option has effect only in combination with 3279 emulation. XX_HO(`See XX_LINK(#Color-Schemes,XX_SM(COLOR SCHEMES)) below. ')dnl XX_TP(XX_FB(XX_DASHED(script))) Causes XX_FB(XX_PRODUCT) to read commands from standard input, with the results written to standard output. The protocol for these commands is documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(sl)) XX_FI(n)) Specifies that XX_FI(n) lines should be saved for scrolling back. The default is 4096. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(S))) Runs XX_PRODUCT in auto-shortcut mode. XX_PRODUCT will create a temporary shorcut (.LNK file) that matches the parameters in the session file (model number, characterset, etc.) and re-run itself from the shortcut. XX_TP(XX_FB(+S)) Disables auto-shortcut mode. It is generally a good idea to put this option on the command lines of all shortcuts, to avoid infinite looping. ')dnl ifelse(XX_PRODUCT,tcl3270,, `XX_TP(XX_FB(XX_DASHED(scriptport)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for scripting connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(httpd) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) XX_TP(XX_FB(XX_DASHED(scriptportonce))) Allows XX_PRODUCT to accept only one script connection. When that connection is broken, XX_PRODUCT will exit. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables the interactive XX_FB(c3270>) prompt. When used, a hostname must be provided on the command line. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables run-time features that could compromise system security (user-specified file names and commands, etc.). ')dnl XX_TP(XX_FB(XX_DASHED(set)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(true). XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_TP(XX_FB(XX_DASHED(socket))) Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named XX_FB(/tmp/x3sck.)`'XX_FI(pid). ')dnl The XX_FB(XX_DASHED(p)) option of XX_FI(x3270if) causes it to use this socket, instead of pipes specified by environment variables. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(title)) XX_FI(text)) Sets the console window title to XX_FI(text), overriding the automatic setting of the hostname and the string XX_FB(wc3270). ')dnl XX_TP(XX_TARGET(tn)XX_FB(XX_DASHED(tn)) XX_FI(name)) Specifies the terminal name to be transmitted over the telnet connection. The default name is XX_FB(`IBM'XX_DASH)`'XX_FI(model_name)`'XX_FB(XX_DASHED(E)), for example, ifelse(XX_PRODUCT,x3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', XX_PRODUCT,c3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', `XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)).') XX_IP Some hosts are confused by the XX_FB(XX_DASHED(E)) suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an XX_FB(s:) on the hostname, or setting the "XX_PRODUCT.extended" resource to "false", removes the XX_FB(XX_DASHED(E)) from the terminal name when connecting to such hosts. XX_IP The name can also be specified with the "XX_PRODUCT.termName" resource. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream ifelse(XX_PRODUCT,x3270,,`and event ')tracing at startup. ifelse(XX_PRODUCT,x3270,`Unlike turning it on from a menu option, there is no pop-up to confirm the file name, which defaults to', `The default trace file name is') ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) on the current XX_POSESSIVE(user) Desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3trc)'). XX_TP(XX_FB(XX_DASHED(tracefile)) XX_FI(file)) Specifies a file to save data stream and event traces into. If the name starts with XX_DQUOTED(>>), data will be appended to the file. ifelse(XX_PRODUCT,x3270,`If the value XX_FB(stdout) is given, then traces will be written to standard output. If the value XX_FB(none) is given, then traces will be piped directly to the monitor window, and no file will be created. ')dnl XX_TP(XX_FB(XX_DASHED(tracefilesize)) XX_FI(size)) Places a limit on the size of a trace file. If this option is not specified, or is specified as XX_FB(0) or XX_FB(none), the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of XX_FI(size) can have a XX_FB(K) or XX_FB(M) suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a XX_DQUOTED(-) appended and a new file started. XX_TP(XX_FB(XX_DASHED(user)) XX_FI(name)) Specifies the user name for RFC 4777 support. ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl XX_TP(XX_FB(XX_DASHED(v))) Display the version and build options for XX_FB(XX_PRODUCT) and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a XX_FB(y:) prepended to the hostname when connecting. ifelse(XX_PRODUCT,x3270,, `XX_TP(XX_FB(XX_DASHED(xrm)) "XX_PRODUCT.XX_FI(resource): XX_FI(value)") Sets the value of the named XX_FI(resource) to XX_FI(value). Resources control less common XX_FB(XX_PRODUCT) options, and are defined under XX_LINK(#Resources,XX_SM(RESOURCES)) below. ')dnl ifelse(XX_PRODUCT,tcl3270, `XX_TP(XX_FB(XX_DASHED()XX_DASHED())) Terminates the list of XX_FB(tcl3270) options. Whatever follows will be available to the script in the XX_FB($argv) tcl variable. ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,x3270,`XX_LP After reading resource definitions from the X server and any standandard X11 resource definition files (XX_FB($HOME/.Xdefaults), etc.), XX_FB(XX_PRODUCT) will read definitions from the file XX_FB($HOME/.x3270pro). This file contains local customizations and is also used to save changed options by the XX_FB(Save Changed Options in File) menu option. XX_LP Note that XX_FB(XX_DASHED(xrm)) options override any definitions in the XX_FB(.x3270pro) file. ')dnl XX_HO(`ifelse(XX_PRODUCT,x3270,`XX_SH(Fonts) XX_FB(XX_PRODUCT) does not use the "*font" resource for its main window. Instead, it uses a custom 14-point font called XX_FB(3270), which is a close approximation of a real 3270 display and allows XX_FB(XX_PRODUCT) to display the XX_SM(ISO) `8859'XX_DASHED(1) (`Latin'XX_DASH()1) character set and special status-line symbols. A more compact font, XX_FB(`3270'XX_DASHED(12)), is also supported, as are the various sized fonts XX_FB(3270gt8), XX_FB(3270gt12), XX_FB(3270gt16), XX_FB(3270-20), XX_FB(3270gt24), and XX_FB(3270gt32). The fonts XX_FB(3270h) and XX_FB(3270gr) are also included to allow display of Hebrew and Greek text, respectively. XX_LP The font may be specified with the XX_FB(XX_DASHED(efont)) option or the "XX_PRODUCT.emulatorFont" resource. XX_LP XX_FB(XX_PRODUCT) can also use any X11 font that implements the display character set required by the host XX_SM(EBCDIC) character set. XX_PP An additional font, XX_FB(3270d), is supplied. This font is identical to the default XX_FB(3270) font, except that it has bitmaps defined for field attribute characters. This means that field attributes, which are normally displayed as blanks, are now visible on the screen. The characters displayed are hexadecimal codes, which can be translated using a document provided with the XX_FB(XX_PRODUCT) sources. XX_LP The font can be changed at any time through a menu option. It can also be implicitly changed by changing the size of the XX_FB(XX_PRODUCT) window with the mouse: if the window is made larger, XX_PRODUCT will try to change to a larger font, and vice-versa. ')dnl ifelse(XX_MODE,console,`XX_SH(Modes) XX_FB(XX_PRODUCT) has two basic modes: XX_FI(command-prompt) and XX_FI(session). XX_PP XX_FI(Command-prompt) mode is where the XX_FB(XX_PRODUCT`'>) prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit XX_FB(XX_PRODUCT), etc. The complete list of interactive commands is listed under XX_LINK(#Actions,XX_SM(ACTIONS)). XX_PP XX_FI(Session) mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host. XX_PP To switch from display mode to command-prompt mode, press ifelse(XX_PRODUCT,c3270,`Ctrl-]',`the Escape key'). To switch from command-prompt mode to display mode, press XX_FB(Enter) (without entering a command) at the XX_FB(XX_PRODUCT`'>) prompt. ')dnl XX_SH(Character Sets) The XX_FB(XX_DASHED(charset)) option or the "XX_PRODUCT.charset" resource controls the XX_SM(EBCDIC) host character set used by XX_FB(XX_PRODUCT). Available sets `include': XX_PP define(XX_CG1A,ifelse(XX_PRODUCT,x3270,3270cg-1a))dnl define(XX_CG1,ifelse(XX_PRODUCT,x3270,3270cg-1))dnl define(XX_CG7,ifelse(XX_PRODUCT,x3270,3270cg-7))dnl define(XX_CG8,ifelse(XX_PRODUCT,x3270,3270cg-8))dnl define(XX_CG9,ifelse(XX_PRODUCT,x3270,3270cg-9))dnl define(XX_CG11,ifelse(XX_PRODUCT,x3270,3270cg-11))dnl define(XX_CG15A,ifelse(XX_PRODUCT,x3270,3270cg-15a))dnl define(XX_CG15,ifelse(XX_PRODUCT,x3270,3270cg-15))dnl define(XX_88591,ifelse(XX_PLATFORM,windows,`',iso8859-1))dnl define(XX_88592,ifelse(XX_PLATFORM,windows,`',iso8859-2))dnl define(XX_88597,ifelse(XX_PLATFORM,windows,`',iso8859-7))dnl define(XX_88598,ifelse(XX_PLATFORM,windows,`',iso8859-8))dnl define(XX_88599,ifelse(XX_PLATFORM,windows,`',iso8859-9))dnl define(XX_885911,ifelse(XX_PLATFORM,windows,`',iso8859-11))dnl define(XX_885915,ifelse(XX_PLATFORM,windows,`',iso8859-15))dnl define(XX_KOI8R,ifelse(XX_PLATFORM,windows,`',koi8-r))dnl define(XX_TIS,ifelse(XX_PLATFORM,windows,`',tis620.2529-0))dnl define(XX_GB,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + gb2312.1980-0))dnl define(XX_GBX,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + iso10646-1))dnl define(XX_BIG5,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + Big5-0))dnl define(XX_JIS,ifelse(XX_PLATFORM,windows,`',jisx0201.1976-0 + jisx0208.1983-0))dnl XX_TS(3,`center; l l l lfB l l.') XX_TR(XX_TD(XX_TC(Charset Name)) XX_TD(XX_TC(Host Code Page)) XX_TD(XX_TC(ifelse(XX_PRODUCT,x3270,Display Character Sets,XX_PRODUCT,c3270,Display Character Set,XX_PLATFORM,windows,`',Character Set)))) XX_T_() ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TD(XX_TC(apl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A))) ')dnl XX_TR(XX_TD(XX_TC(belgian)) XX_TD(XX_TC(500)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(belgian-euro)) XX_TD(XX_TC(1148)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(bracket)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(brazilian)) XX_TD(XX_TC(275)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(chinese-gb18030)) XX_TD(XX_TC(1388)) XX_TD(XX_TC(XX_GBX))) XX_TR(XX_TD(XX_TC(cp1047)) XX_TD(XX_TC(1047)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(cp870)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88592))) XX_TR(XX_TD(XX_TC(finnish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(finnish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(french)) XX_TD(XX_TC(297)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(french-euro)) XX_TD(XX_TC(1147)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(german)) XX_TD(XX_TC(273)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(german-euro)) XX_TD(XX_TC(1141)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(greek)) XX_TD(XX_TC(423)) XX_TD(XX_TC(XX_CG7 XX_88597))) XX_TR(XX_TD(XX_TC(hebrew)) XX_TD(XX_TC(424)) XX_TD(XX_TC(XX_CG8 XX_88598))) XX_TR(XX_TD(XX_TC(icelandic)) XX_TD(XX_TC(871)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(icelandic-euro)) XX_TD(XX_TC(1149)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(italian)) XX_TD(XX_TC(280)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(italian-euro)) XX_TD(XX_TC(1144)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(japanese-kana)) XX_TD(XX_TC(930)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(japanese-latin)) XX_TD(XX_TC(939)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(norwegian)) XX_TD(XX_TC(277)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(norwegian-euro)) XX_TD(XX_TC(1142)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(russian)) XX_TD(XX_TC(880)) XX_TD(XX_TC(XX_KOI8R))) XX_TR(XX_TD(XX_TC(simplified-chinese)) XX_TD(XX_TC(935)) XX_TD(XX_TC(XX_GB))) XX_TR(XX_TD(XX_TC(slovenian)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_88592))) XX_TR(XX_TD(XX_TC(spanish)) XX_TD(XX_TC(284)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(spanish-euro)) XX_TD(XX_TC(1145)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(swedish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(swedish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(thai)) XX_TD(XX_TC(1160)) XX_TD(XX_TC(XX_885911 XX_TIS))) XX_TR(XX_TD(XX_TC(traditional-chinese)) XX_TD(XX_TC(937)) XX_TD(XX_TC(XX_BIG5))) XX_TR(XX_TD(XX_TC(turkish)) XX_TD(XX_TC(1026)) XX_TD(XX_TC(XX_88599))) XX_TR(XX_TD(XX_TC(uk)) XX_TD(XX_TC(285)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(uk-euro)) XX_TD(XX_TC(1146)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-euro)) XX_TD(XX_TC(1140)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-intl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TE() XX_PP The default character set is XX_FB(bracket), which is useful for common U.S. XX_SM(IBM) hosts which use XX_SM(EBCDIC) codes AD and BD for the XX_DQUOTED([) and XX_DQUOTED(]) characters, respectively. XX_PP Note that any of the host code pages listed above can be specified by adding XX_FB(cp) to the host code page, e.g., XX_FB(cp037) for host code page 037. Also note that the code pages available for a given version of XX_FB(XX_PRODUCT) are displayed by the XX_FB(XX_DASHED(v)) command-line option. ifelse(XX_PRODUCT,wc3270,`XX_PP Note that DBCS character sets (Chinese, Japanese) display properly only on 32-bit Windows XP. Work is proceeding on other platforms. ')dnl ifelse(XX_PRODUCT,x3270, `XX_PP Most 3270 fonts implement the 3270cg-1 display character set, which is a reordered version of the XX_SM(ISO) `8859'XX_DASHED(1) character set. Some implement the 3270cg-1a display character set, which is a superset of 3270cg-1 that includes APL2 characters. 3270h and 3270gr implement special character sets for Hebrew and Greek, respectively. XX_PP You can also specify national-language translations for your keyboard; see XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Character Classes) XX_FB(XX_PRODUCT) supports character classes (groupings of characters chosen with a double mouse click) in the same manner as XX_FI(xterm)(1). The "XX_PRODUCT.charClass" resource or the XX_FB(XX_DASHED(cc)) option can be used to alter the character class table. The default table is the same as XX_POSESSIVE(XX_FI(xterm)); It groups letters together, and puts most punctuation characters in individual classes. To put all non-whitespace characters together in the same class (and duplicate the behavior of some early versions of XX_FB(XX_PRODUCT), use the following value: XX_PP XX_RS(`33-127:48,161-255:48') XX_PP See XX_FI(xterm)(1) for further syntax details. XX_SH(Keypad) A keypad may optionally be displayed, with a mouse-clickable button for each 3270 function key (these functions are also available from the keyboard). The keypad can be turned on and off by clicking on the "keypad" button in the upper-right-hand corner of the window. The "XX_PRODUCT.keypad" resource controls where it is displayed. Options are: XX_PP XX_TS(2,center; l l.) XX_TR(`XX_TD(left) XX_TD(`in a separate window, to the left of the screen')') XX_TR(`XX_TD(right) XX_TD(`in a separate window, to the right of the screen')') XX_TR(`XX_TD(bottom) XX_TD(`in a separate window, below the screen')') XX_TR(`XX_TD(integral) XX_TD(`in the same window as the screen, below it')') XX_TE() XX_PP The default is XX_FB(right). XX_PP If the "XX_PRODUCT.keypadOn" resource is set to XX_FB(true), the keypad will be displayed at startup. ')dnl ifelse(XX_MODE,console,`XX_SH(Menu Bar and Keypad) XX_FB(XX_PRODUCT) supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the XX_FB(XX_PRODUCT>) prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen. XX_LP The on-screen menu title bar can be turned off via the "XX_PRODUCT.menuBar" resource. XX_LP The pop-up keypad allows the 3270-specific keys (XX_SM(PF) keys, XX_SM(PA) keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the XX_FB(XX_PRODUCT>) prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option. ')dnl ifelse(XX_MODE,script,,XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_SH(Hosts Database) XX_FB(XX_PRODUCT) uses the XX_FI(ibm_hosts) database to ifelse(XX_PRODUCT,x3270,`construct a pull-down menu of hosts to connect to. It also allows host name aliases to be defined, as well as specifying ',XX_PRODUCT,c3270,``define' aliases for host names, and to specify ')dnl macros to be executed when a connection is first made. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(5)) for details. XX_LP You may specify a different XX_FI(ibm_hosts) database with the "XX_PRODUCT.hostsFile" resource. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Color Schemes) When emulating a 3279 display, the X colors used to draw the display are selected by two resources: the "XX_PRODUCT.colorScheme" resource, which gives the name of the color scheme to use, and the individual "XX_PRODUCT.colorScheme.XX_FI(xxx)" resources, which give the actual definitions. The color scheme resources are documented in the XX_FB(Resources) file with the XX_FB(XX_PRODUCT) source. XX_LP The color scheme may also be changed while XX_FB(XX_PRODUCT) is running with a selection from the XX_FB(Options) menu. ')dnl XX_SH(NVT Mode) Some hosts use an XX_SM(ASCII) front-end to do initial login negotiation, then later switch to 3270 mode. XX_FB(XX_PRODUCT) will emulate an XX_SM(ANSI) X3.64 terminal until the host places it in 3270 mode (telnet XX_SM(BINARY) and XX_SM(SEND EOR) modes, or XX_SM(TN3270E) mode negotiation). ifelse(XX_PRODUCT,x3270,`The emulation is fairly complete; however, it is not intended to make XX_FB(XX_PRODUCT) a replacement for XX_FI(xterm)(1). ')dnl XX_PP If the host later negotiates to stop functioning in 3270 mode, XX_FB(XX_PRODUCT) will return to XX_SM(NVT) emulation. XX_PP In XX_SM(NVT) mode, XX_FB(XX_PRODUCT) supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources: XX_PP XX_TS(3,center; l c c.) XX_TR(XX_TD(Mode/Character) XX_TD(Resource) XX_TD(Default)) XX_T_() XX_TR(XX_TD(Translate CR to NL) XX_TD(XX_PRODUCT.icrnl) XX_TD(true)) XX_TR(XX_TD(Translate NL to CR) XX_TD(XX_PRODUCT.inlcr) XX_TD(false)) XX_TR(XX_TD(Erase previous character) XX_TD(XX_PRODUCT.erase) XX_TD(^?)) XX_TR(XX_TD(Erase entire line) XX_TD(XX_PRODUCT.kill) XX_TD(^U)) XX_TR(XX_TD(Erase previous word) XX_TD(XX_PRODUCT.werase) XX_TD(^W)) XX_TR(XX_TD(Redisplay line) XX_TD(XX_PRODUCT.rprnt) XX_TD(^R)) XX_TR(XX_TD(Ignore special meaning of next character) XX_TD(XX_PRODUCT.lnext) XX_TD(^V)) XX_TR(XX_TD(Interrupt) XX_TD(XX_PRODUCT.intr) XX_TD(^C)) XX_TR(XX_TD(Quit) XX_TD(XX_PRODUCT.quit) XX_TD(^XX_BS())) XX_TR(XX_TD(End of file) XX_TD(XX_PRODUCT.eof) XX_TD(^D)) XX_TE() ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_LP Separate keymaps can be defined for use only when XX_FB(XX_PRODUCT) is in 3270 mode or XX_SM(NVT) mode. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) for details. ')dnl ifelse(XX_PRODUCT,x3270,`include(menus.inc)',`XX_SH(Toggles) XX_FB(XX_PRODUCT) has a number of configurable modes which may be selected by the XX_FB(XX_DASHED(set)) and XX_FB(XX_DASHED(clear)) options. These names can also be used as the first parameter to the XX_FB(Toggle) action, and are the names of resources that can be used to set or clear the value of each toggle at start-up. XX_TPS()dnl XX_TP(XX_FB(aidWait)) Changes the behavior of actions that send an XX_SM(AID) to the host (XX_FB(Enter), XX_FB(Clear), XX_FB(PA) and XX_FB(PF)). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the XX_FB(Wait(Unlock)) action to wait for the unlock. ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(altCursor)) If set, the cursor will be an underline. If clear, it will be a solid block. ')dnl XX_TP(XX_FB(blankFill)) If set, XX_FB(XX_PRODUCT) modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying XX_DQUOTED(lock-up) that often occurs when inserting into an field with (apparent) space at the end. ifelse(XX_MODE,console,`XX_TP(XX_FB(crosshair)) When set, XX_PRODUCT will display a crosshair to help locate the cursor on the screen. ')dnl XX_TP(XX_FB(lineWrap)) If set, the XX_SM(NVT) terminal emulator automatically assumes a XX_SM(NEWLINE) character when it reaches the end of a line. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(marginedPaste)) If set, pasting multi-line input via the XX_FB(Paste) action will maintain a left margin (it will not move the cursor further left than where the paste begins). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(monoCase)) If set, XX_FB(XX_PRODUCT) operates in uppercase-only mode. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(overlayPaste)) If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the XX_FB(marginedPaste) toggle. ')dnl XX_TP(XX_FB(screenTrace)) Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). ifelse(XX_MODE,console,`XX_TP(XX_FB(showTiming)) If set, the time taken by the host to process an XX_SM(AID) is displayed on the status line. ')dnl XX_TP(XX_FB(trace)) Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the wc3270 AppData directory',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). The directory for the trace file can be changed with the "XX_PRODUCT.traceDir" resource. Script commands are also traced. ifelse(XX_MODE,console,`XX_TP(XX_FB(underscore)) If set, XX_PRODUCT will display underlined fields by substituting underscore XX_DQUOTED(_) characters for blanks or nulls in the field. Otherwise, these fields will be displayed ifelse(XX_PRODUCT,c3270,`using the XX_POSESSIVE(terminal) native underlining mode, if one is defined. ',`with a highlighted background. Note that setting XX_FB(underscore) also disables the highlighted background for blinking fields. XX_FB(underscore) is set by default. ')dnl ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(visibleControl)) If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes XX_DQUOTED(XX_LT()), SI becomes XX_DQUOTED(>). Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in ifelse(c3270,`underlined',wc3270,`reverse-video') yellow. Field attribute mappings are part of the XX_FB(XX_PRODUCT) Resources documentation for the XX_FB(visibleControl) resource. ')dnl XX_TPE()dnl XX_LP ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_SH(Status Line) ifelse(XX_PRODUCT,c3270,`If the terminal that XX_FB(XX_PRODUCT) is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), XX_FB(XX_PRODUCT) will display a status line. ')dnl The XX_FB(XX_PRODUCT) status line contains a variety of information. From left to right, the fields are: XX_TPS()dnl XX_TP(XX_FB(comm status)) The first symbol is always a XX_FB(4). If XX_FB(XX_PRODUCT) is in TN3270E mode, the second symbol is a XX_FB(B); otherwise it is an XX_FB(A). ifelse(XX_PRODUCT,x3270,`If XX_FB(x3270) is disconnected, the third symbol is a question mark. Otherwise, if ',`If ') XX_FB(XX_PRODUCT) is in SSCP-LU mode, the third symbol is an XX_FB(S). Otherwise it is blank. XX_TP(XX_FB(keyboard lock)) If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock. ifelse(XX_PRODUCT,x3270,`XX_TP(`XX_FB(`shift')') Three characters indicate the keyboard modifier status. "M" indicates the Meta key, "A" the Alt key, and an up-arrow or "^" indicates the Shift key. XX_TP(XX_FB(compose)) The letter "C" indicates that a composite character is in progress. If another symbol follows the "C", it is the first character of the composite. ')dnl XX_TP(XX_FB(typeahead)) The letter "T" indicates that one or more keystrokes are in the typeahead buffer. XX_TP(XX_FB(temporary keymap)) The letter "K" indicates that a temporary keymap is in effect. XX_TP(XX_FB(reverse)) The letter "R" indicates that the keyboard is in reverse field entry mode. XX_TP(XX_FB(insert mode)) ifelse(XX_PRODUCT,x3270,`A thick caret "^" or the ', `The ') letter "I" indicates that the keyboard is in insert mode. XX_TP(XX_FB(printer session)) The letter "P" indicates that a XX_FI(pr3287) session is active. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(script)) The letter "S" indicates that a script is active. ')dnl ifelse(XX_PRODUCT,x3270,,`XX_TP(XX_FB(secure connection)) A green letter "S" indicates that the connection is secured via SSL/TLS. ')dnl XX_TP(XX_FB(LU name)) The LU name associated with the session, if there is one. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(timing)) A clock symbol and a time in seconds indicate the time it took to process the last XX_SM(AID) or the time to connect to a host. This display is optional. ')dnl XX_TP(XX_FB(cursor position)) The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0. XX_TPE()dnl ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Icons) If the XX_FB(XX_DASHED(activeicon)) option is given (or the "XX_PRODUCT.activeIcon" resource is set to XX_FB(true)`)', XX_FB(XX_PRODUCT) will attempt to make its icon a miniature version of the current screen image. This function is highly dependent on your window manager: XX_TPS()dnl XX_TP(XX_FB(mwm)) The size of the icon is limited by the "Mwm.iconImageMaximum" resource, which defaults to XX_FB(50x50). The image will be clipped at the bottom and right. The icon cannot accept keyboard input. XX_TP(XX_FB(olwm)) The full screen image of all 3270 models can be displayed on the icon. However, the icon cannot be resized, so if the model is later changed with an XX_FB(XX_PRODUCT) menu option, the icon image will be corrupted. The icon cannot accept keyboard input. XX_TP(XX_FB(twm) and XX_FB(tvtwm)) The full screen image of all 3270 models can be displayed on the icon, and the icon can be resized. The icon can accept keyboard input. XX_IP However, XX_FB(twm) does not put labels on application-supplied icon windows. You can have XX_FB(XX_PRODUCT) add its own label to the icon by setting the "XX_PRODUCT.labelIcon" resource to XX_FB(true). The default font for icon labels is XX_FB(8x13); you may change it with the "XX_PRODUCT.iconLabelFont" resource. XX_TPE()dnl include(xkeymaps.inc)') define(XX_LPAREN,`ifelse(XX_PRODUCT,tcl3270,` ',`(')')dnl define(XX_RPAREN,`ifelse(XX_PRODUCT,tcl3270,,`)')')dnl define(XX_COMMA,`ifelse(XX_PRODUCT,tcl3270,` ',`, ')')dnl define(XX_SPACE,`ifelse(XX_PRODUCT,tcl3270,` ',`')')dnl define(XX_WAIT,`ifelse(XX_PRODUCT,tcl3270,`Wait [XX_FI(timeout)] $1', `Wait$1(XX_FI(timeout))')')dnl XX_TARGET(actions)dnl ifelse(XX_PRODUCT,x3270,, XX_PRODUCT,tcl3270, `XX_SH(Commands) XX_FB(XX_PRODUCT) supports the following additional tcl commands: ', `XX_SH(Actions) Here is a complete list of basic XX_PRODUCT actions. Script-specific actions are described on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. ')dnl define(XX_BLOCK,*))dnl XX_PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. XX_PP XX_TS(2,center; lw(3i) lw(3i).) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ascii'`') XX_TD(return entire screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region as text)) XX_TR(XX_TDH(`AsciiField') XX_TD(return current field as text)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Attn') XX_TD(attention key)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(AltCursor) XX_TD(switch between block and underscore cursor)) ')dnl XX_TR(XX_TDH(`BackSpace') XX_TD(move cursor left (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`BackTab') XX_TD(tab to start of previous input field)) XX_TR(`XX_TDH(CircumNot) XX_TD(`input "^" in XX_SM(NVT) mode, or "XX_NOT" in 3270 mode'')) XX_TR(XX_TDH(XX_BLOCK()`Clear') XX_TD(clear screen)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Cols') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Compose) XX_TD(next two keys form a special symbol)) ')dnl XX_TR(XX_TDH(XX_BLOCK()Connect`'XX_LPAREN`'XX_FI(host)`'XX_RPAREN) XX_TD(connect to XX_FI(host))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Copy') XX_TD(copy highlighted area to clipboard)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`CursorSelect') XX_TD(Cursor Select XX_SM(AID))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Cut) XX_TD(copy highlighted area to clipboard and erase)) XX_TR(XX_TDH(Default) XX_TD(enter key literally)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Cut') XX_TD(copy highlighted area to clipboard and erase)) ')dnl XX_TR(XX_TDH(`Delete') XX_TD(delete character under cursor (or send XX_SM(ASCII DEL)))) XX_TR(XX_TDH(`DeleteField') XX_TD(delete the entire field)) XX_TR(XX_TDH(`DeleteWord') XX_TD(delete the current or previous word)) XX_TR(XX_TDH(XX_BLOCK()`Disconnect') XX_TD(disconnect from host)) XX_TR(XX_TDH(`Down') XX_TD(move cursor down)) XX_TR(XX_TDH(`Dup') XX_TD(duplicate field)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ebcdic'`') XX_TD(return entire screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region in XX_SM(EBCDIC))) XX_TR(XX_TDH(`EbcdicField') XX_TD(return current field in XX_SM(EBCDIC))) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Enter') XX_TD(Enter XX_SM(AID) (or send XX_SM(ASCII CR)))) XX_TR(XX_TDH(`Erase') XX_TD(erase previous character (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`EraseEOF') XX_TD(erase to end of current field)) XX_TR(XX_TDH(`EraseInput') XX_TD(erase all input fields)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(Escape) XX_TD(escape to XX_FB(c3270>) prompt)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Execute(XX_FI(cmd))) XX_TD(execute a command in a shell)) ')dnl XX_TR(XX_TDH(`FieldEnd') XX_TD(move cursor to end of field)) XX_TR(XX_TDH(`FieldMark') XX_TD(mark field)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(HandleMenu(XX_FI(name))) XX_TD(pop up a menu)) ')dnl XX_TR(XX_TDH(`HexString'`'XX_LPAREN`'XX_FI(hex_digits)`'XX_RPAREN) XX_TD(insert control-character string)) XX_TR(XX_TDH(`Home') XX_TD(move cursor to first input field)) XX_TR(XX_TDH(`Insert') XX_TD(set insert mode)) XX_TR(XX_TDH(XX_BLOCK()`Interrupt') XX_TD(send XX_SM(TELNET IP) to host)) ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Keypad') XX_TD(Display pop-up keypad)) ')dnl XX_TR(XX_TDH(Key`'XX_LPAREN`'XX_FI(keysym)`'XX_RPAREN) XX_TD(insert key XX_FI(keysym))) XX_TR(XX_TDH(Key`'XX_LPAREN`'0x`'XX_FI(xx)`'XX_RPAREN) XX_TD(insert key with character code XX_FI(xx))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Keymap(XX_FI(keymap))) XX_TD(toggle alternate XX_FI(keymap) (or remove with XX_FB(None)))) XX_TR(XX_TDH(KybdSelect(XX_FI(direction) [,XX_FI(atom)...])) XX_TD(Extend selection by one row or column)) ')dnl XX_TR(XX_TDH(`Left') XX_TD(move cursor left)) XX_TR(XX_TDH(`Left2') XX_TD(move cursor left 2 positions)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Macro(XX_FI(macro))) XX_TD(run a macro)) ')dnl ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Menu') XX_TD(Display menu bar)) ')dnl XX_TR(XX_TDH(`MonoCase') XX_TD(toggle uppercase-only mode)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(MoveCursor) XX_TD(move cursor to mouse position)) ')dnl XX_TR(XX_TDH(MoveCursor`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_RPAREN) XX_TD(move cursor to zero-origin (XX_FI(row),XX_FI(col)))) ifelse(XX_PRODUCT,x3270,`XX_TR(`XX_TDH(XX_BLOCK()MoveCursorSelect) XX_TD(`move cursor to mouse position, light pen selection'')) ')dnl XX_TR(XX_TDH(`Newline') XX_TD(move cursor to first field on next line (or send XX_SM(ASCII LF)))) XX_TR(XX_TDH(`NextWord') XX_TD(move cursor to next word)) XX_TR(XX_TDH(XX_BLOCK()PA`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Attention XX_SM(AID) (XX_FI(n) from 1 to 3))) XX_TR(XX_TDH(XX_BLOCK()PF`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Function XX_SM(AID) (XX_FI(n) from 1 to 24))) XX_TR(XX_TDH(`PreviousWord') XX_TD(move cursor to previous word)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Paste') XX_TD(insert clipboard contents))')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(Printer(Start[,XX_FI(lu)]|Stop)) XX_TD(start or stop printer session)) ')dnl ifelse(XX_PLATFORM,windows,`XX_TR(XX_TDH(PrintText([gdi|wordpad,][dialog|nodialog,]XX_FI([printer-name]))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(PrintText(XX_FI(command))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(PrintWindow(XX_FI(command))) XX_TD(print screen image (bitmap) on printer)) ')dnl XX_TR(XX_TDH(Quit) XX_TD(exit XX_FB(XX_PRODUCT))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Reconnect) XX_TD(reconnect to previous host)) ')dnl XX_TR(XX_TDH(`Redraw') XX_TD(redraw window)) XX_TR(XX_TDH(`Reset') XX_TD(reset locked keyboard)) XX_TR(XX_TDH(`Right') XX_TD(move cursor right)) XX_TR(XX_TDH(`Right2') XX_TD(move cursor right 2 positions)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ascii`') XX_TD(dump screen buffer as text)) XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ebcdic`') XX_TD(dump screen buffer in EBCDIC)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Rows') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Script(XX_FI(command)[,XX_FI(arg)...])) XX_TD(run a script)) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TR(XX_TDH(Scroll(Forward|Backward)) XX_TD(scroll screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SelectAll(XX_FI(atom))) XX_TD(select entire screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SetFont(XX_FI(font))) XX_TD(change emulator font)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `ifelse(XX_PRODUCT,tcl3270,`XX_TR(XX_TDH(Snap) XX_TD(same as XX_FB(Snap Save))) ')dnl XX_TR(XX_TDH(Snap`'XX_SPACE`'Ascii`') XX_TD(report saved screen data (see XX_FB(Ascii)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Cols`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Ebcdic`') XX_TD(report saved screen data (see XX_FB(Ebcdic)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'ReadBuffer`') XX_TD(report saved screen data (see XX_FB(ReadBuffer)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Rows`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Save`') XX_TD(save screen image)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Status`') XX_TD(report saved connection status)) XX_TR(XX_TDH(`ifelse(XX_PRODUCT,tcl3270,`XX_BLOCK()Snap Wait [XX_FI(timeout)] Output', `XX_BLOCK()SnapWaitOuput(XX_FI(timeout))')') XX_TD(wait for host output and save screen image)) ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Source(XX_FI(file))) XX_TD(read commands from XX_FI(file))) ')dnl XX_TR(XX_TDH(Status`') XX_TD(report connection status)) ')dnl XX_TR(XX_TDH(XX_BLOCK()String`'XX_LPAREN`'XX_FI(string)`'XX_RPAREN) XX_TD(insert string (simple macro facility))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(XX_BLOCK()`SelectDown') XX_TD(Extend selection down)) XX_TR(XX_TDH(SelectLeft) XX_TD(Extend selection left)) XX_TR(XX_TDH(SelectUp) XX_TD(Extend selection up)) XX_TR(XX_TDH(SelectDown) XX_TD(Extend selection down)) XX_TR(XX_TDH(SysReq) XX_TD(System Request XX_SM(AID))) ')dnl XX_TR(XX_TDH(`Tab') XX_TD(move cursor to next input field)) XX_TR(XX_TDH(`Toggle'XX_LPAREN`'XX_FI(option)[,XX_FI(set|clear)]XX_RPAREN) XX_TD(toggle an option)) XX_TR(XX_TDH(`ToggleInsert') XX_TD(toggle insert mode)) XX_TR(XX_TDH(`ToggleReverse') XX_TD(toggle reverse-input mode)) XX_TR(XX_TDH(XX_BLOCK()Transfer`'XX_LPAREN`'XX_FI(option)=XX_FI(value)...'`'XX_RPAREN) XX_TD(file transfer)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Unselect) XX_TD(release selection)) ')dnl XX_TR(XX_TDH(`Up') XX_TD(move cursor up)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(ignore) XX_TD(do nothing)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(3270mode)) XX_TD(wait for 3270 mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Disconnect)) XX_TD(wait for host to disconnect)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(InputField)) XX_TD(wait for valid input field)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(NVTMode)) XX_TD(wait for NVT mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Output)) XX_TD(wait for more host output)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_T_() XX_TR(XX_TDH((the following are similar to xterm),COLSPAN="2")) XX_T_() XX_TR(XX_TDH(ignore) XX_TD(do nothing)) XX_TR(`XX_TDH(insert-selection([XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(``paste' selection')') XX_TR(XX_TDH(move-select) XX_TD(a combination of XX_FB(MoveCursor) and XX_FB(select-start))) XX_TR(XX_TDH(select-end(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(complete selection and assign to atom(s))) XX_TR(XX_TDH(select-extend) XX_TD(move the end of a selection)) XX_TR(XX_TDH(select-start) XX_TD(mark the beginning of a selection)) XX_TR(XX_TDH(set-select(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(assign existing selection to atom(s))) XX_TR(XX_TDH(start-extend) XX_TD(begin marking the end of a selection)) ')dnl XX_TE() ifelse(XX_MODE,console,`XX_LP Any of the above actions may be entered at the XX_FB(XX_PRODUCT>) prompt; these commands are also available for use in keymaps (see XX_LINK(#Keymaps,XX_SM(KEYMAPS))). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.: XX_RS(PF(1)) or with spaces, e.g.: XX_RS(PF 1) Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used. XX_LP XX_FB(XX_PRODUCT) also supports the following interactive commands: XX_TPS()dnl XX_TP(XX_FB(Help)) Displays a list of available commands. XX_TP(XX_FB(ScreenTrace)) Turns screen tracing (saving screen images to a file) on or off. The command XX_FB(screentrace on) enables screen tracing; the command XX_FB(screentrace off) disables it. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). The keyaord XX_FB(on) can also be followed by the keyword XX_FB(printer) and an optional ifelse(XX_PRODUCT,wc3270,printer name,print command) to direct screen traces directly to the printer. XX_TP(XX_FB(Show)) Displays statistics and settings. XX_TP(XX_FB(Trace)) Turns tracing on or off. The command XX_FB(trace on) enables data stream and keyboard event tracing; the command XX_FB(trace off) disables it. The qualifier XX_FB(data) or XX_FB(keyboard) can be specified before XX_FB(on) or XX_FB(off) to enable or disable a particular trace. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). XX_TPE()dnl ')dnl XX_LP Note that certain parameters to XX_PRODUCT actions (such as the names of files and keymaps) are subject to XX_FI(substitutions): XX_LP The character XX_FB(~) at the beginning of a string is replaced with the user's home directory. ifelse(XX_PLATFORM,unix,`A XX_FB(~) character followed by a username is replaced with that XX_POSESSIVE(user) home directory. ')dnl XX_LP Environment variables are substituted using the Unix shell convention of $XX_FI(name) or ${XX_FI(name)}. XX_LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. ifelse(XX_PRODUCT,c3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,wc3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,x3270,,`include(ft.inc) ')dnl XX_SH(The PrintText Action) The XX_FB(PrintText) produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is ifelse(XX_PLATFORM,windows,`the name of the printer to use', `the command to use to print, e.g., XX_FB(lpr)'). ifelse(XX_PLATFORM,windows,`The font defaults to XX_FB(Courier New) and the point size defaults to XX_FI(auto) (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. Unless the XX_FB(wordpad) keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. XX_FB(printTextHorizontalMargin) defines the left- and right-hand margins. XX_FB(printTextVerticalMargin) defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with XX_FB(mm) or XX_FB(cm). XX_FB(printTextOrientation) defines the page orientation as XX_FB(portrait) or XX_FB(landscape). ')dnl XX_LP Multiple arguments can include keywords to control the output of XX_FB(PrintText): XX_TPS()dnl ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(gdi)) Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default). XX_TP(XX_FB(wordpad)) Create an RTF file and run WordPad to print it. (This was the former default). XX_TP(XX_FB(dialog)) In GDI mode, pop up the Windows print dialog. ifelse(XX_PRODUCT,wc3270,`(This is the default.) ')dnl XX_TP(XX_FB(nodialog)) In GDI mode, skip the usual Windows print dialog. ifelse(XX_PRODUCT,ws3270,`(This is the default.) ')dnl ')dnl XX_TP(XX_FB(file) XX_FI(filename)) Save the output in a file. XX_TP(XX_FB(html)) Save the output as HTML. This option implies XX_FB(file). XX_TP(XX_FB(rtf)) Save the output as RichText. This option implies XX_FB(file). The font defaults to XX_FB(Courier New) and the point size defaults to 8. These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(string)) Return the output as a string. This can only be used from scripts. ')dnl XX_TP(XX_FB(modi)) Render modified fields in italics. XX_TP(XX_FB(caption) XX_FI(text)) Add the specified XX_FI(text) as a caption above the output. Within XX_FI(text), the special sequence XX_FB(%T%) will be replaced with a timestamp. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(secure)) Disables the pop-up dialog. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(command) XX_FI(command)) Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. ')dnl XX_TPE() define(XX_SCRIPTS,`ifelse(XX_PRODUCT,x3270,Macros and Scripts, XX_PRODUCT,c3270,Scripts, Nested Scripts)')dnl XX_SH(XX_SCRIPTS) ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`There are several types of ifelse(XX_PRODUCT,x3270,`macros and ', XX_PRODUCT,x3270,,XX_PRODUCT,c3270,, `nested ')dnl script functions available. ')dnl XX_TPS()dnl XX_TP(XX_FB(The String XX_Action)) The simplest method for ifelse(XX_PRODUCT,x3270,`macros ', XX_PRODUCT,c3270,`scripting ', `nested scripts ')dnl is provided via the XX_FB(String) XX_action`'ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,tcl3270,,`, which can be bound to any key in a keymap'). The arguments to XX_FB(String) are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the XX_SM(AID) code to the host, XX_FB(XX_PRODUCT) will wait for the host to unlock the keyboard before further processing the string.) XX_TS(2,l l.) XX_TR(XX_TD(XX_BS()b) XX_TD(Left)) XX_TR(XX_TD(XX_BS()`e'XX_FI(xxxx)) XX_TD(EBCDIC character in hex)) XX_TR(XX_TD(XX_BS()f) XX_TD(Clear*)) XX_TR(XX_TD(XX_BS()n) XX_TD(Enter*)) XX_TR(XX_TD(XX_BS()`pa'XX_FI(n)) XX_TD(PA(XX_FI(n))*)) XX_TR(XX_TD(XX_BS()`pf'XX_FI(nn)) XX_TD(PF(XX_FI(nn))*)) XX_TR(XX_TD(XX_BS()r) XX_TD(Newline)) XX_TR(XX_TD(XX_BS()t) XX_TD(Tab)) XX_TR(XX_TD(XX_BS()T) XX_TD(BackTab)) XX_TR(XX_TD(XX_BS()`u'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TR(XX_TD(XX_BS()`x'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TE() XX_IP Note that the numeric values for the XX_BS()e, XX_BS()u and XX_BS()x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if XX_PRODUCT is built with DBCS support and the host allows DBCS input in the current field. ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270, `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Alt,p): String("probs clearrdr`'XX_BS()n")) ', `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Meta,p): String("probs clearrdr`'XX_BS()n")) ')dnl XX_IP XX_FB(Note:) The strings are in XX_SM(ASCII) and converted to XX_SM(EBCDIC), so beware of inserting control codes. ifelse(XX_PRODUCT,x3270,`Also, a backslash before a XX_FB(p) may need to be doubled so it will not be removed when a resource file is read. ')dnl XX_IP There is also an alternate form of the XX_FB(String) XX_action, XX_FB(HexString), which is used to enter non-printing data. The argument to XX_FB(HexString) is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent XX_SM(EBCDIC) characters, which are entered into the current field. In XX_SM(NVT) mode, the hexadecimal data represent XX_SM(ASCII) characters, which are sent directly to the host. ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(The Script Action)) This action causes XX_FB(XX_PRODUCT) to start a child process which can execute XX_FB(XX_PRODUCT) actions. ifelse(XX_PLATFORM,windows, `XX_FB(XX_PRODUCT) listens for connections from the child process on a dynamically-generated TCP port. ', `Standard input and output from the child process are piped back to XX_FB(XX_PRODUCT). ')dnl The XX_FB(Script) action is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(The macros Resource)) An alternate method of defining macros is the "XX_PRODUCT.macros" resource. This resource is similar to a keymap, but instead of defining keyboard mappings, it associates a list of X actions with a name. These names are displayed on a Macros menu that appears when XX_FB(XX_PRODUCT) is connected to a host. Selecting one of the names on the menu executes the X actions associated with it. Typically the actions are XX_FB(String) calls, but any action may be specified. Here is a sample macros resource definition, which would result in a four-entry Macros menu: XX_RS(XX_PRODUCT.macros: XX_BS() XX_BR log off: String("logout`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR vtam: String("dial vtam`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR pa1: PA(1)XX_BS()n`'XX_BS() XX_BR alt printer: PrintText("lpr -Plw2")) XX_IP You can also define a different set of macros for each host. If there is a resource named XX_DQUOTED(XX_PRODUCT.XX_FI(macros).XX_FI(somehost)), it defines the macros menu for when XX_FB(XX_PRODUCT) is connected to XX_FI(somehost). XX_TP(XX_FB(The XX_DASHED(script) Option)) This facility allows XX_FB(XX_PRODUCT) to operate under the complete control of a script. XX_FB(XX_PRODUCT) accepts actions from standard input, and prints results on standard output. The XX_FB(XX_DASHED(script)) option is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`XX_SH(Composite Characters) XX_FB(XX_PRODUCT) allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A `C' on the status line indicates a pending composite character. XX_PP The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "XX_PRODUCT.composeMap" resource; it gives the name of the map to use. The maps themselves are named "XX_PRODUCT.composeMap.XX_FI(name)". The default is "latin1", which gives mappings for most of the symbols in the XX_SM(ISO) 8859-1 Latin-1 character set that are not in the 7-bit XX_SM(ASCII) character set. XX_PP XX_FB(Note:) The default keymap defines ifelse(XX_PRODUCT,x3270,`the "Multi_key" keysym',`XX_KEY(Meta,m)') as the "Compose" key. ifelse(XX_PRODUCT,x3270,`If your keyboard lacks such a key, you',`You') may set up your own "Compose" key with a keymap that maps some other keysym onto the XX_FB(Compose) action. ')dnl ifelse(XX_PRODUCT,x3270,`include(apl.inc)')dnl ifelse(XX_PRODUCT,c3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(pr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(pr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(c3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(pr3287). XX_LP See XX_FI(pr3287)(1) for further details. XX_LP The resource XX_FB(c3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(wpr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(wpr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(wc3270.printer.name) specifies the Windows printer used to print each job. It defaults to the value of the XX_FB($PRINTER) environment variable, if set. Otherwise the default system printer is used. This resource also controls the printer used by the XX_FB(PrintText) action. XX_LP The resource XX_FB(wc3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(wpr3287). XX_LP See XX_FI(wpr3287)(1) for further details. XX_LP The resource XX_FB(wc3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Screen Printing) Screen printing is handled through options on the XX_FB(File) menu or by the XX_FB(PrintText) and XX_FB(PrintWindow) actions. Each results in a pop-up to confirm the print command. XX_PP The XX_FB(PrintText) action (usually assigned to the key XX_LT()Meta>p) sends the current screen image to the printer as XX_SM(ASCII) characters. The default command used to print the data is controlled by the "XX_PRODUCT.printTextCommand" resource; the default is XX_FB(lpr). You may also use a keymap definition to pass a print command the XX_FB(PrintText) action itself. The command receives the screen text as its standard input. For example, the following keymap will save the screen text in a file: XX_IP XX_RS(XX_KEY(Meta,f): PrintText("cat >screen.image")) XX_PP Note: XX_FB(HardPrint) is an alias for XX_FB(PrintText). XX_PP The XX_FB(PrintWindow) action (usually assigned to the key XX_LT()Meta>b) sends the current screen image to the printer as a bitmap. The default command used to print the data is controlled by the "XX_PRODUCT.printWindowCommand" resource; the default is XX_IP XX_RS(XX_FB(xwd XX_DASHED(id) %d | xpr | lpr).) XX_PP You may also use a keymap definition to pass a print command to the XX_FB(PrintWindow) action itself. If the command contains the text "%d", the window ID of XX_FB(XX_PRODUCT) will be substituted before it is run. For example, the following keymap will pop up a duplicate of the current screen image: XX_IP XX_RS(XX_KEY(Meta,g): PrintWindow("xwd XX_DASHED(id) %d | xwud &")) XX_LP If the command for PrintWindow or PrintText begins with an "@" character, the initial pop-up menu to confirm the print command is not displayed and the command cannot be edited. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Bugs) Cursor highlighting will not work with if you use the XX_FB(NoTitleFocus) option in your .twmrc file. ')dnl ifelse(XX_PRODUCT,wc3270,,` XX_SH(Passthru) XX_FB(XX_PRODUCT) supports the Sun XX_FI(telnet-passthru) service provided by the XX_FI(in.telnet-gw) server. This allows outbound telnet connections through a firewall machine. When a XX_FB(p:) is prepended to a hostname, XX_FB(XX_PRODUCT) acts much like the XX_FI(itelnet)(1) command. It contacts the machine named XX_FB(internet-gateway) at the port defined in XX_FB(/etc/services) as XX_FB(telnet-passthru) (which defaults to 3514). It then passes the requested hostname and port to the XX_FB(in.telnet-gw) server. ')dnl XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option or the XX_FB(XX_PRODUCT.proxy) resource causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option or resource is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. ifelse(XX_PRODUCT,x3270,,`include(resources.inc)')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_SH(Files) ifelse(XX_PRODUCT,x3270,/usr/lib/X11,/usr/local/lib)/x3270/ibm_hosts XX_BR ifelse(XX_PRODUCT,x3270,`$HOME/.x3270pro ',XX_PRODUCT,c3270,`$HOME/.c3270pro ') ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Environment Variables) XX_FB(3270PRO) Path of profile file, containing resource definitions. Merged after the system resource database, but before XX_FB(X3270RDB). Defaults to $HOME/.x3270pro. XX_BR XX_FB(NOX3270PRO) If set, do not read the profile. XX_BR XX_FB(X3270RDB) Additional resource definitions, merged after the profile file but before the command-line options. XX_BR XX_FB(KEYMAP) Keymap name. XX_BR XX_FB(KEYBD) Keymap name. ')dnl XX_SH(See Also) ifelse(XX_INTERACTIVE,yes,XX_LINK(XX_PR3287-man.html,XX_PR3287`'(1))`, ')dnl ifelse(XX_PRODUCT,XX_S3270,,XX_LINK(XX_S3270-man.html,XX_S3270`'(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(XX_X3270-script.html,`XX_X3270-script`'(1)), ')dnl ifelse(XX_PLATFORM,unix,`ifelse(XX_PRODUCT,x3270,,XX_LINK(x3270-man.html,x3270(1))`, ')dnl ifelse(XX_PRODUCT,c3270,,XX_LINK(c3270-man.html,c3270(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(tcl3270-man.html,tcl3270(1))`, ')dnl ')dnl telnet(1), tn3270(1)dnl ifelse(XX_PRODUCT,x3270,`, XX_LINK(ibm_hosts.html,ibm_hosts(5)) XX_BR X Toolkit Intrinsics ',` ')dnl XX_BR Data Stream XX_POSESSIVE(Programmer) Reference, IBM GA23-0059 XX_BR Character Set Reference, IBM GA27-3831 XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()2004-2005, Don Russell. XX_BR Copyright`'XX_COPY()2004, Dick Altenbern. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/wc3270/x3270-script.man.m40000664000076500007650000006544613221577163015241 0ustar pdmpdmdnl Copyright (c) 2000-2014, 2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270-SCRIPT,1,XX_DATE) XX_SH(Name) Scripting Facilities for ifelse(XX_PLATFORM,unix,`x3270,') XX_C3270 and XX_S3270 XX_SH(Synopsis) ifelse(XX_PLATFORM,unix,`XX_FB(x3270) XX_FB(XX_DASHED(script)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(socket)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(scriptport) XX_FI(port)) [ XX_FI(x3270-options) ] XX_BR ')dnl ifelse(XX_PLATFORM,unix,`XX_FB(XX_C3270) XX_FB(XX_DASHED(socket)) [ XX_FI(XX_C3270-options) ] XX_BR ')dnl XX_FB(XX_C3270) XX_FB(XX_DASHED(scriptport)) XX_FI(port) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(XX_S3270) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(`Script') ( XX_FI(command) [ `,'XX_FI(arg)... ] ) XX_SH(Description) The XX_FB(x3270) scripting facilities allow the interactive 3270 ifelse(XX_PLATFORM,unix,`emulators XX_FB(x3270) and XX_FB(c3270)', `emulator XX_FB(wc3270)') to be operated under the control of another program, and forms the basis for the script-only emulator XX_FB(XX_S3270). XX_PP There are ifelse(XX_PLATFORM,unix,four,three) basic scripting methods. The first is the XX_FB(peer script) facility, ifelse(XX_PLATFORM,unix,`invoked by the XX_FB(x3270) XX_FB(XX_DASHED(script)) switch, and ')dnl the default mode for XX_FB(XX_S3270). This runs the emulator as a child of another process. Typically this would be a script using XX_FI(expect)(1), XX_FI(perl)(1), or the co-process facility of the Korn Shell XX_FI(ksh)(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. XX_PP The second method is the XX_FB(child script) facility, invoked by the emulator's XX_FB(Script) action. This runs a script as a child process of the emulator. ifelse(XX_PLATFORM,unix,`The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. ',`The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196). ')dnl XX_PP The third method uses a TCP socket. The XX_FB(XX_DASHED(scrpiptport)) command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. ifelse(XX_PLATFORM,windows,`(Note that if the XX_FB(Script) action is used with XX_FB(XX_DASHED(scriptport)), it will pass the scriptport port number to child scripts, rather than creating a new socket.) ')dnl ifelse(XX_PLATFORM,unix,`XX_PP The fourth method uses a Unix-domain socket. The XX_FB(XX_DASHED(socket)) command-line option causes the emulator to create a Unix-domain stream socket named XX_FB(/tmp/x3sck.)`'XX_FI(pid). The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. ')dnl XX_PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the XX_FB(Script) action. The calling script will be resumed when the nested script completes. XX_PP Commands are emulator XX_FI(actions); the syntax is the same as for the right-hand side of ifelse(XX_PLATFORM,unix,`an XX_FB(x3270) or',`a') XX_FB(XX_C3270) keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with XX_FB(#) or XX_FB(!) is treaded as a comment and will be ignored. XX_PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. XX_PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". XX_SH(Status Format) The status message consists of 12 blank-separated fields: XX_TPS()dnl XX_TP(1 Keyboard State) If the keyboard is unlocked, the letter XX_FB(U). If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter XX_FB(L). If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter XX_FB(E). XX_TP(2 Screen Formatting) If the screen is formatted, the letter XX_FB(F). If unformatted or in XX_SM(NVT) mode, the letter XX_FB(U). XX_TP(3 Field Protection) If the field containing the cursor is protected, the letter XX_FB(P). If unprotected or unformatted, the letter XX_FB(U). XX_TP(4 Connection State) If connected to a host, the string XX_FB(`C(')`'XX_FI(hostname)`'XX_FB(`)'). Otherwise, the letter XX_FB(N). XX_TP(5 Emulator Mode) If connected in 3270 mode, the letter XX_FB(I). If connected in XX_SM(NVT) line mode, the letter XX_FB(L). If connected in XX_SM(NVT) character mode, the letter XX_FB(C). If connected in unnegotiated mode (no BIND active from the host), the letter XX_FB(P). If not connected, the letter XX_FB(N). XX_TP(6 Model Number (2-5)) XX_TP(7 Number of Rows) The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. XX_TP(8 Number of Columns) The current number of columns defined on the screen, subject to the same difference for rows, above. XX_TP(9 Cursor Row) The current cursor row (zero-origin). XX_TP(10 Cursor Column) The current cursor column (zero-origin). XX_TP(11 Window ID) The X window identifier for the main XX_FB(x3270) window, in hexadecimal preceded by XX_FB(0x). For XX_FB(XX_S3270) and XX_FB(XX_C3270), this is zero. XX_TP(12 Command Execution Time) The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. XX_TPE()dnl XX_SH(Differences) When an action is initiated by a script, the emulators behave in several different ways: XX_PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. XX_PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the XX_FB(CloseScript) action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the XX_FB(Script) action to complete. XX_PP The XX_FB(Quit) action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) XX_PP Normally, the AID actions (XX_FB(Clear), XX_FB(Enter), XX_FB(PF), and XX_FB(PA)) will not complete until the host unlocks the keyboard. If the parameter to a XX_FB(String) action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. XX_PP The XX_FB(AidWait) toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The XX_FB(Wait(Output)) action can then be used to delay a script until the host changes something on the screen, and the XX_FB(Wait(Unlock)) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the XX_FB(AidWait) toggle. XX_PP Note that the XX_FB(Script) action does not complete until ifelse(XX_PLATFORM,unix,`end-of-file is detected on the pipe or ')dnl the XX_FB(CloseScript) action is called by the child process. This behavior is not affected by the state of the XX_FB(AidWait) toggle. XX_SH(Basic Programming Strategies) 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. XX_LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the XX_FB(Snap) action. The XX_FB(Snap(Save)) action saves a snapshot of the screen in a special buffer. Then the script can use XX_FB(Snap) variants of the XX_FB(Ascii) and XX_FB(Ebcdic) actions (XX_FB(Snap(Ascii)) and XX_FB(Snap(Ebcdic))) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, XX_FB(Snap(Wait Output)) blocks the script until the host modifies the screen, specifically since the last call to XX_FB(Snap(Save)). Thus a script can poll the screen efficiently by writing a loop that begins with XX_FB(Snap(Save)) and ends with XX_FB(Snap(Wait Output)). XX_SH(Script-Specific Actions) The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, XX_FI(row) and XX_FI(col) coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). XX_TPS()dnl XX_TP(XX_FB(AnsiText)) Outputs whatever data that has been output by the host in XX_SM(NVT) mode since the last time that XX_FB(AnsiText) was called. The data is preceded by the string "data:XX_NBSP", and has had all control characters expanded into C backslash sequences. XX_IP This is a convenient way to capture XX_SM(NVT) mode output in a synchronous manner without trying to decode the screen contents. XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ascii)(XX_FI(length))) XX_TP(XX_FB(Ascii)) Outputs an XX_SM(ASCII) text representation of the screen contents. Each line is preceded by the string "data:XX_NBSP", and there are no control characters. XX_IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) XX_IP If three parameters are given, XX_FI(length) characters are output, starting at the specified zero-origin row and column. XX_IP If only the XX_FI(length) parameter is given, that many characters are output, starting at the cursor position. XX_IP If no parameters are given, the entire screen is output. XX_IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the XX_FB(XX_DASHED(charset)) option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. XX_TP(XX_FB(AsciiField)) Outputs an XX_SM(ASCII) text representation of the field containing the cursor. The text is preceded by the string "data:XX_NBSP". XX_TP(XX_FB(Connect)(XX_FI(hostname))) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. XX_TP(XX_FB(CloseScript)(XX_FI(status))) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the XX_FB(Script) action, the optional XX_FI(status) is used as the return status of XX_FB(Script); if nonzero, XX_FB(Script) will complete with an error, and if this script was invoked as part of login through the XX_FB(ibm_hosts) file, the connection will be broken. XX_TP(XX_FB(ContinueScript)([XX_FI(param)])) Allows a script that is waiting in a XX_FB(PauseScript) action, below, to continue. The optional XX_FI(param) string is output by the XX_FB(PauseScript) action. XX_TP(XX_FB(Disconnect)) Disconnects from the host. XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ebcdic)(XX_FI(length))) XX_TP(XX_FB(Ebcdic)) The same function as XX_FB(Ascii) above, except that rather than generating XX_SM(ASCII) text, each character is output as a 2-digit or 4-digit hexadecimal XX_SM(EBCDIC) code. XX_TP(XX_FB(EbcdicField)) The same function as XX_FB(AsciiField) above, except that it generates hexadecimal XX_SM(EBCDIC) codes. XX_TP(XX_FB(Info)(XX_FI(message))) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. XX_TP(XX_FB(Expect)(XX_FI(text)[,XX_FI(timeout)])) Pauses the script until the specified XX_FI(text) appears in the data stream from the host, or the specified XX_FI(timeout) (in seconds) expires. If no XX_FI(timeout) is specified, the default is 30 seconds. XX_FI(Text) can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. XX_FB(Expect) is valid only in XX_SM(NVT) mode. ifelse(XX_MODE,console,`XX_TP(XX_FB(Keymap([XX_FI(keymap)]))) Adds or removes a temporary keymap. If the XX_FI(keymap) parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed. ')dnl XX_TP(XX_FB(MoveCursor)(XX_FI(row),XX_FI(col))) Moves the cursor to the specified zero-origin coordinates. XX_TP(XX_FB(PauseScript)) Stops a script until the XX_FB(ContinueScript) action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to XX_FB(ContinueScript), if one is given. XX_TP(XX_FB(PrintText)([XX_FB(command),]XX_FI(filter))) Pipes an ASCII representation of the current screen image through the named XX_FI(filter), e.g., XX_FB(lpr). XX_TP(XX_FB(PrintText)([XX_FB(html),][XX_FB(append),][XX_FB(replace),]XX_FB(file),XX_FI(filename))) Saves the current screen contents in a file. With the XX_FB(html) option, saves it as HTML, otherwise saves it as plain ASCII. The XX_FB(append) option (the default) causes the data to be appended to the file if it already exists. The XX_FB(replace) option causes the file to be overwritten instead. XX_TP(XX_FB(PrintText)(XX_FB(`html,string'))) Returns the current screen contents as HTML. XX_TP(XX_FB(Query)(XX_FI(keyword))) Returns state information. Keywords are: XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(Keyword) XX_TD(Output)) XX_T_ XX_TR(XX_TD(BindPluName) XX_TD(BIND PLU returned by the host)) XX_TR(XX_TD(ConnectionState) XX_TD(TN3270/TN3270E mode and submode)) XX_TR(XX_TD(CodePage) XX_TD(Host code page)) XX_TR(XX_TD(Cursor) XX_TD(Cursor position (row col), zero-origin)) XX_TR(XX_TD(Formatted) XX_TD(3270 format state (formatted or unformatted))) XX_TR(XX_TD(Host) XX_TD(Host name and port)) XX_TR(XX_TD(LocalEncoding) XX_TD(Local character encoding)) XX_TR(XX_TD(LuName) XX_TD(Host name LU name)) XX_TR(XX_TD(Model) XX_TD(3270 model name (IBM-327x-n))) XX_TR(XX_TD(ScreenCurSize) XX_TD(Current screen size (rows cols))) XX_TR(XX_TD(ScreenMaxSize) XX_TD(Maximum screen size (rows cols))) XX_TR(XX_TD(Ssl) XX_TD(SSL state (secure or not-secure) and host validation state (host-verified or host-unverified))) XX_TE XX_IP Without a XX_FI(keyword), XX_FB(Query) returns each of the defined attributes, one per line, labeled by its name. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ascii))) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as XX_FB(SF`(aa=nn[,...])'), where XX_FI(aa) is a field attribute type and XX_FI(nn) is its value. XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(XX_TC(Attribute)) XX_TD(XX_TC(Values))) XX_T_ XX_TR(XX_TD(XX_TC(c0 basic 3270)) XX_TD(XX_TC(20 protected))) XX_TR(XX_TD() XX_TD(XX_TC(10 numeric))) XX_TR(XX_TD() XX_TD(XX_TC(04 detectable))) XX_TR(XX_TD() XX_TD(XX_TC(08 intensified))) XX_TR(XX_TD() XX_TD(XX_TC(0c non-display))) XX_TR(XX_TD() XX_TD(XX_TC(01 modified))) XX_TR(XX_TD(XX_TC(41 highlighting)) XX_TD(XX_TC(f1 blink))) XX_TR(XX_TD() XX_TD(XX_TC(f2 reverse))) XX_TR(XX_TD() XX_TD(XX_TC(f4 underscore))) XX_TR(XX_TD() XX_TD(XX_TC(f8 intensify))) XX_TR(XX_TD(XX_TC(42 foreground)) XX_TD(XX_TC(f0 neutral black))) XX_TR(XX_TD() XX_TD(XX_TC(f1 blue))) XX_TR(XX_TD() XX_TD(XX_TC(f2 red))) XX_TR(XX_TD() XX_TD(XX_TC(f3 pink))) XX_TR(XX_TD() XX_TD(XX_TC(f4 green))) XX_TR(XX_TD() XX_TD(XX_TC(f5 turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(f6 yellow))) XX_TR(XX_TD() XX_TD(XX_TC(f7 neutral white))) XX_TR(XX_TD() XX_TD(XX_TC(f8 black))) XX_TR(XX_TD() XX_TD(XX_TC(f9 deep blue))) XX_TR(XX_TD() XX_TD(XX_TC(fa orange))) XX_TR(XX_TD() XX_TD(XX_TC(fb purple))) XX_TR(XX_TD() XX_TD(XX_TC(fc pale green))) XX_TR(XX_TD() XX_TD(XX_TC(fd pale turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(fe grey))) XX_TR(XX_TD() XX_TD(XX_TC(ff white))) XX_TR(XX_TD(XX_TC(43 character set)) XX_TD(XX_TC(f0 default))) XX_TR(XX_TD() XX_TD(XX_TC(f1 APL))) XX_TR(XX_TD() XX_TD(XX_TC(f8 DBCS))) XX_TE() XX_IP Extended attributes (which do not take up display positions) are output as XX_FB(SA`('aa=nn`)'), with XX_FI(aa) and XX_FI(nn) having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). XX_IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ebcdic))) Equivalent to XX_FB(ReadBuffer)(XX_FB(Ascii)), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as XX_FB(GE`('XX_FI(xx)`)'). XX_TP(XX_FB(Script)(XX_FI(path)[,arg...])) Runs a child script, passing it optional command-line arguments. XX_FI(path) must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the XX_FB(Source) action. XX_TP(XX_FB(Snap)) Equivalent to XX_FB(Snap)(XX_FB(Save)) (see XX_LINK(#save,below)). XX_TP(XX_FB(Snap)(XX_FB(Ascii),...)) Performs the XX_FB(Ascii) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(Cols))) Returns the number of columns in the saved screen image. XX_TP(XX_FB(Snap)(`XX_FB(Ebcdic),...')) Performs the XX_FB(Ebcdic) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(ReadBuffer))) Performs the XX_FB(ReadBuffer) action on the saved screen image. XX_TP(XX_FB(Snap(XX_FB(Rows)))) Returns the number of rows in the saved screen image. XX_TARGET(save)dnl XX_TP(XX_FB(Snap)(XX_FB(Save))) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other XX_FB(Snap) actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. XX_TP(XX_FB(Snap)(XX_FB(Status))) Returns the status line from when the screen was last saved. XX_TP(XX_FB(Snap)(XX_FB(Wait)[`,'XX_FI(timeout)]`,'XX_FB(Output))) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. This action is usually invoked in a loop that uses the XX_FB(Snap)(XX_FB(Ascii)) or XX_FB(Snap)(XX_FB(Ebcdic)) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Snap) action. The default is to wait indefinitely. XX_TP(XX_FB(Source)(XX_FI(file))) Read and execute commands from XX_FI(file). Any output from those commands will become the output from XX_FB(Source). If any of the commands fails, the XX_FB(Source) command will XX_FI(not) abort; it will continue reading commands until EOF. XX_TP(XX_FB(Title)(XX_FI(text))) Changes the ifelse(XX_PLATFORM,unix,x3270,wc3270) window title to XX_FI(text). XX_TP(XX_FB(Transfer)(XX_FI(keyword)=XX_FI(value),...)) Invokes IND$FILE file transfer. See XX_LINK(#File-Transfer,XX_SM(FILE TRANSFER)) below. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(3270Mode))) Used when communicating with a host that switches between XX_SM(NVT) mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait(3270)) is equivalent to XX_FB(Wait)(XX_FB(3270Mode)) XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Disconnect))) Pauses the script until the host disconnects. Often used to after sending a XX_FI(logoff) command to a XX_SM(VM/CMS) host, to ensure that the session is not unintentionally set to XX_FB(disconnected) state. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(InputField))) A useful utility for use at the beginning of scripts and after the XX_FB(Connect) action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In XX_SM(NVT) mode, waits until the host sends at least one byte of data. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait) is equivalent to XX_FB(Wait)(XX_FB(InputField)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(NVTMode))) Used when communicating with a host that switches between 3270 mode and XX_SM(NVT) mode. Pauses the script or macro until the host negotiates XX_SM(NVT) mode, then waits for a byte from the host as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait)(XX_FB(ansi)) is equivalent to XX_FB(Wait)(XX_FB(NVTMode)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Output))) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a XX_FB(Clear), XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. Also used in non-blocking AID mode (see XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). This action is usually invoked in a loop that uses the XX_FB(Ascii) or XX_FB(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Unlock))) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (XX_FB(toggle AidWait clear)), to wait for a host command to complete. See XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)(XX_FI(timeout)`,' XX_FB(Seconds))) Delays the script XX_FI(timeout) seconds. Unlike the other forms of XX_FB(Wait), the timeout is not optional. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(WindowState)(XX_FI(mode))) If XX_FI(mode) is XX_FB(Iconic), changes the x3270 window into an icon. If XX_FI(mode) is XX_FB(Normal), changes the x3270 window from an icon to a normal window. ')dnl XX_TPE()dnl define(XX_action,action)dnl include(ft.inc)dnl XX_SH(See Also) expect(1) XX_BR perl(1) XX_BR ksh(1) ifelse(XX_PLATFORM,unix,`XX_BR XX_LINK(x3270-man.html,x3270(1)) ')dnl XX_BR ifelse(XX_PLATFORM,unix,`XX_LINK(Unix-x3270if.html,x3270if(1))',`XX_LINK(Windows-x3270if.html,x3270if(1))') XX_BR XX_LINK(XX_C3270-man.html,XX_C3270`(1)') XX_BR XX_LINK(XX_S3270-man.html,XX_S3270`(1)') XX_SH(Version) Version XX_VERSION_NUMBER suite3270-3.6/wc3270/zipit0000775000076500007650000000275513221577163013217 0ustar pdmpdm#!/usr/bin/env bash # Create a staged zip file # Change a possibly-relative pathname to a full pathname. function repath { case $1 in /*) echo "$1" ;; *) echo "$PWD/$1" ;; esac } # Pick off '-c' if [ "X$1" = "X-c" ] then comment="$2" shift 2 fi # Pick off '-o' if [ "X$1" = "X-o" ] then ofile="$(repath $2)" shift 2 fi if [ $# -ne 1 ] then echo >&2 "Usage: ZipIt [-c comment] [-o ofile] template-file" exit 1 fi zd=/tmp/zi$$ rm -rf $zd trap "rm -rf $zd" EXIT trap "exit 0" INT mkdir $zd exec 5<$1 || exit 1 while read -u5 kw p1 p2 p3 do case "$kw" in \#*) ;; O) # Output file if [ -z "$p1" ] then echo >&2 "Missing parameter for O" exit 1 fi if [ -n "$p2" ] then echo >&2 "Too many parameters for O" exit 1 fi ofile=$(repath $p1) ;; D) # Create subdir if [ -z "$p1" ] then echo >&2 "Missing parameter for D" exit 1 fi if [ -n "$p2" ] then echo >&2 "Too many parameters for D" exit 1 fi mkdir -p $zd/$p1 ;; F) # File if [ -z "$p1" ] then echo >&2 "Missing parameter(s) for F" exit 1 fi if [ -z "$p2" ] then p2=$p1 fi if [ -n "$p3" ] then echo >&2 "Too many parameters for F" exit 1 fi if [ ! -f "$p1" ] then echo >&2 "No such file: $p1" exit 1 fi ln -s $(repath $p1) $zd/$p2 ;; *) echo >&2 "Unknown keyword '$kw'" exit 1 esac done if [ -z "$ofile" ] then echo >&2 "Must specify output file" exit 1 fi cd $zd if [ -n "$comment" ] then echo "$comment" | zip -r -z -X $ofile . else zip -r -X $ofile . fi cd - suite3270-3.6/Webpage/Build-c3270.html0000664000076500007650000000440713221577163015234 0ustar pdmpdm c3270 Additional Build and Install Instructions

    c3270 Additional Build and Install Instructions

    This file describes build and install information specific to c3270. For general build information, look
    here.

    Wide Curses Requirement

    c3270 needs the 'wide' version of the curses or ncurses library (one that supports multi-byte character encodings). Without wide curses or ncurses, c3270 will be restricted to using the 7-bit basic ASCII character set.

    On some platforms, the standard curses or ncurses library is the wide version and no extra packages need be installed. On others, a special wide ncurses package is needed. On still others (such as on Solaris, documented below) the wide curses library is installed in a special location and configure must be told where to locate it using CPPFLAGS and LDFLAGS.

    Notes for Ubuntu

    Additonal packages needed to compile c3270 are:
    • libncursesw5-dev

    Notes for Cygwin

    Additional Cygwin packages are needed to compile c3270:
    • The libncurses-devel package from the Devel group
    • For command-line editing and history, the readline package from the Devel group

    Notes for Solaris

    c3270 prefers wide curses, which on Solaris is in the /usr/xpg4 directory. To use this version of curses, set CPPFLAGS and LDFLAGS when running configure:
       ./configure CPPFLAGS=-I/usr/xpg4/include LDFLAGS=-L/usr/xpg4/lib

    c3270-Specific configure Options

    The c3270 configure script accepts the following c3270-specific option:
    --without-readline Don't use the readline command-line editing library, even if it is found on the system.
    suite3270-3.6/Webpage/Build.html0000664000076500007650000002307213221577163014477 0ustar pdmpdm suite3270 Build and Install Instructions

    suite3270 Build and Install Instructions

    Building on Unix or Cygwin

    To build the entire 3270 emulation suite, including native Unix programs and cross-compiled Windows programs, use:
       ./configure
       make

    To install Unix binaries in the default install directory (/usr/local), use:

       make install
    To install Unix manual pages, use:
       make install.man
    To remove intermediate files, use:
       make clean
    To remove all derived files, use:
       make clobber

    Object files will be placed in directories named obj/architecture. For example, 64-bit Linux object files are placed in obj/x86_64-unknown-gnu-linux. 32-bit Windows object files are placed in obj/win32. 64-bit Windows object files are placed in obj/win64.

    Selective configure

    If you only want to build a subset of the programs, you can limit the scope of the configure script with the following options. Note that the options are cumulative, so you can specify exactly the set of programs you want:
    --enable-unix Include all of the Unix programs
    --enable-windows Include all of the Windows programs
    --enable-x3270 Include x3270
    --enable-c3270 Include c3270
    --enable-s3270 Include s3270
    --enable-tcl3270 Include tcl3270
    --enable-pr3287 Include pr3287
    --enable-ws3270 Include ws3270
    --enable-wc3270 Include wc3270
    --enable-wpr3287 Include wpr3287
    When you limit the configuration this way, it changes the top-level make targets, so make, make install, make clean and make clobber will operate only on the programs you have configured.

    Summary of Common configure Options

    The top-level configure script accepts the following options. Note that these apply only to Unix; the options for Windows programs are fixed.
    --help Print a help message.
    --prefix=prefix Install architecture-independent files under prefix (defaults to /usr/local)
    --exec-prefix=eprefix Install architecture-dependent files (executables) under eprefix (defaults to same as prefix)
    --bindir=dir Install user executables dir (defaults to eprefix/bin
    --sysconfdir=dir Install configuration files (ibm_hosts, character sets) in dir (defaults to prefix/etc).
    --disable-apl Leave out APL character support.
    --disable-dbcs Leave out DBCS (Double Byte Character Set) support.
    --disable-local-process Leave out local process (connecting to "-e shell_command") support. This will be automatically disabled if the local system does not support the forkpty() library call.
    --disable-ssl Leave out SSL/TLS (Secure Sockets Layer) support.
    --with-openssl=dir Specify the directory where the OpenSSL library is installed. Note that this option was previously called --with-ssl=.
    There are also configure options that are specific to individual programs. These can be passed to the top-level configure script. See each individual program's additional build information for details.

    Selective Build Targets

    To build just the Unix programs, use:
       make unix
    To cross-compile just the Windows programs, use:
       make windows
    To build an individual program, such as s3270, just make it:
       make s3270
    Each of the top-level symbolic targets can be limited to a group (unix or windows) or to a program, by adding the desired prefix:
       make unix-install
       make unix-install.man
       make program-install
       make program-install.man
       make group-clean
       make program-clean
       make group-clobber
       make program-clobber

    Notes for Ubuntu

    Base packages needed to compile any of programs in the suite are:
    • libssl-dev (for SSL/TLS support)
    • mingw-w64 (for Windows cross-compilation)
    • m4 (to build man pages)
    Other packages are listed in the program-specific instructions.

    Notes for Cygwin

    The minimum set of extra Cygwin packages needed to build the 3270 suite are:
    • The make package from the Devel group
    • The gcc-core package from the Devel group
    • For SSL support, the openssl-devel package from the Devel group
    To cross-compile native Windows binaries, you need this package:
    • mingw-w64-gcc from the Devel group
    Other packages are needed by the specific programs, and are listed in those programs' build instructions.

    Notes for MacOS X

    Everything except x3270 is built the usual (Unix) way on MacOS X. But to build x3270, you first need to install XQuartz (http://xquartz.macosforge.org/). Then to build all of the emulators, use the following commands:
       export PATH=$PATH:/opt/X11/bin
       ./configure --enable-unix --x-includes=/opt/X11/include
       make

    By default, the MacOS build uses Secure Transport for SSL/TLS. To switch to OpenSSL, pass the --disable-stransport option to the configure script.

    Notes for Solaris 2.x and Sun's C Compiler

    Do not use Sun's BSD-compatibility compiler, /usr/ucb/cc. This is good advice in general, but in particular, the 3270 suite will not build with it. You should have a directory containing gcc (recommended) or Sun's standard compiler in your $PATH ahead of /usr/ucb.

    Building on FreeBSD

    FreeBSD's iconv library is installed in /usr/local, so the the following options must be passed to the configure script:
       ./configure LDFLAGS=-L/usr/local/lib CPPFLAGS=-I/usr/local/include

    Also, the generated makefiles must be run with GNU make (gmake), not BSD make.

    Building with Visual Studio 2013

    Visual Studio GUI

    The Visual Studio solution is called suite3270.sln in the VS2013 folder. There are individual projects for each of the programs and components.

    Visual Studio Command Line

    To build with Microsoft Visual Studio from the command prompt, first open a command console with Visual Studio build environment variables set. Switch to the VS2013 directory, and type:
       msbuild
    The usual msbuild options are available, such as /m, /p:Configuration (which can specify Debug or Release) and /p:Platform (which can specify x86 or x64).

    Building with Visual Studio 2013

    Visual Studio GUI

    The Visual Studio solution is called suite3270.sln in the VS2013 folder. There are individual projects for each of the programs and components. The Debug and Release configurations build code without OpenSSL support. The SSL-Debug and SSL-Release configurations build code with OpenSSL support, and require standard OpenSSL header files to be installed in the folder C:\OpenSSL-Win64\include.

    Visual Studio Command Line

    To build with Microsoft Visual Studio from the command prompt, first open a command console with Visual Studio build environment variables set. Switch to the VS2013 directory, and type:
       msbuild
    The usual msbuild options are available, such as /m, /p:Configuration (which can specify Debug, Release, SSL-Debug or SSL-Release) and /p:Platform (which can specify x86 or x64). suite3270-3.6/Webpage/Build-tcl3270.html0000664000076500007650000000325513221577163015574 0ustar pdmpdm tcl3270 Additional Build and Install Instructions

    tcl3270 Additional Build and Install Instructions

    This file describes build and install information specific to tcl3270. For general build information, look here.

    Notes for Ubuntu

    Additional packages needed to compile tcl3270 are:
    • tcl-dev

    Notes on the Tcl Library

    tcl3270 uses the tclsh command to determine the version of the Tcl library to use. When you run the configure script, make sure that your $PATH points to the version of tclsh that corresponds to the version of the Tcl library you want tcl3270 to use.

    tcl3270-specific configure Options

    The tcl3270 configure script accepts the following tcl3270-specific options:
    --with-tcl=version Use a specific version of the Tcl library. The default is 8.4.
    --with-tclx
    --with-tclx=version
    Use the Extended Tcl library. The TclX library must be the same version as the Tcl library. If an explicit version is specified, this changes the Tcl library version as well.
    suite3270-3.6/Webpage/Build-x3270.html0000664000076500007650000001550213221577164015260 0ustar pdmpdm x3270 Build and Install Instructions

    x3270 Additional Build and Install Instructions

    This file describes build and install information specific to x3270. For general build information, look here.

    Installing Fonts

    x3270 prefers that its fonts be installed in order to run. However, a script is provided for testing a local copy of x3270 in the current directory:
       ./dryrun            # test x3270
    Before running x3270, you will also need to (once):
       xset fp rehash

    Vanilla X11R6

    x3270 is set up to build and install without modifications under any complete X11R6 installation.

    A "complete" installation means that besides the usual X and Xt libraries, the Xaw and Xmu libraries and header files are installed. Some vendors (HP, IBM, SCO) consider these optional software and do not always install them.

    Notes for Ubuntu

    Additional packages needed to compile x3270 are:
    • libx11-dev
    • libxt-dev
    • libxmu-dev
    • libxaw7-dev
    • xfonts-100dpi (must log out and log back in again after installing)

    IBM AIX

    The default installation of AIX may also not include the bdftopcf utility, which may need to be installed separately as part of the X11.fnt.util package.

    HP-UX

    HP's X11 distribution may not include the Xaw and Xmu libraries or their header files. As HP's X man page says,
    A number of unsupported core MIT clients and miscellaneous utilities are provided in /usr/contrib/bin. In addition, the entire core MIT distribution, compiled for Hewlett-Packard platforms, can be obtained from HP's users group INTERWORKS for a nominal fee. See the release notes for details.

    Sun Solaris 2.x

    To run x3270, your LD_LIBRARY_PATH environment variable must include /usr/openwin/lib.

    Mixed X Environments

    The Makefile and Imakefile that come with x3270 assume that you plan to run the x3270 client on the same kind of workstation as your X server. If you are running a mixture of X environments, such as a Sun XNews server and standard X11R6 libraries and header files, or using an X terminal, the supplied Makefile and Imakefile may not work properly, because then assume that your server and libraries are of the same type. This generally means that you will need to build and install the fonts separately, using server-specific tools. It is impossible to give comprehensive instructions here; however, here is an outline of how to do it:
      Copy all of the .bdf files from the x3270 directory into a new directory, say XXX.

      cd into XXX.

      For each .bdf file, run the server-specific version of bdftosnf or bdftopcf to create a .snf or .pcf file. For example, for to build an NCD font on a Sun-4, the command is:

         /usr/local/NCD/binSun4/bdftosnf 3270.bdf >3270.snf
      Run the server-specific version of mkfontdir. For example:
         /usr/local/NCD/binSun4/mkfontdir .
      Then tell your X server to use this directory:
         xset fp+ XXX
         xset fp rehash

    SCO Open Desktop 3

    x3270 requires the Athena Widgets library, which is available from sosco.sco.com.

    Using an app-defaults File

    Earlier versions of x3270 required a separate app-defaults file. The app-defaults file contains definitions for options, text strings, fonts, colors, etc. The file allows x3270 to be reconfigured without recompiling by simply editing the file.

    Unfortunately, using an app-defaults file is a pain. The mechanism for finding the file is so flexible as to be almost incomprehensible, and it is difficult to run the program without doing a full installation, requiring root access to your system. Also, the app-defaults file generally changes whenever the program changes, and making sure that x3270 finds the correct app-defaults file compounds the above problems.

    Starting with version 3.1, x3270 no longer uses a separate app-defaults file. Instead, the file is compiled into x3270 itself. If however, you prefer to have a separate app-defaults file, you can compile x3270 to use it:

    • For a color display, use configure --enable-app-defaults
    • For a monochrome display, use configure --enable-app-defaults=-UCOLOR

    x3270-specific configure Options

    The configure script accepts the following x3270-specific options:
    --prefix=prefix Install common architecture-independent files under prefix (defaults to /usr/local). By default, this affects only the configuration files. In combination with --without-xmkmf, this affects all files.
    --exec-prefix=eprefix Install common architecture-dependent files (executables) under eprefix (defaults to same as prefix). See the note under --prefix, above.
    --bindir=dir Install common user executables in dir (defaults to eprefix/bin). See the note under --prefix, above.
    --sysconfdir=dir Install configuration files (ibm_hosts, character sets) in dir/x3270 (defaults to prefix/etc). See the note under --prefix, above.
    --enable-app-defaults
    --enable-app-defaults=-UCOLOR
    Use a separate app-defaults file, instead of compiling one into the x3270 executable. With the =-UCOLOR option, builds for a monochrome display.
    --with-fontdir=/full-path
    --with-fontdir=relative-path
    Install fonts in an alternate directory. If the parameter starts with "/", it specifies the full pathname of a directory. If not, it specifies a subdirectory of the usual font directory. The default is misc.
    suite3270-3.6/Webpage/WindowsInstall.html0000664000076500007650000000771613221577163016430 0ustar pdmpdm wc3270 Installer Documentation

    wc3270 Installer Documentation

    Windows Installer Options

    The Windows installer for wc3270 uses Inno Setup. Complete documentation for the command-line options is here:

    http://www.jrsoftware.org/ishelp/index.php?topic=setupcmdline

    Options of interest are:

    Option Purpose
    /SILENT Run the installer without user interation
    /COMPONENTS="component,component..." Install only specific components
    /TASKS="task,task..." Perform only specific install tasks

    By default, all components are installed. The components are:

    Component Definition
    base wc3270.exe (interactive emulator)
    wpr3287.exe (printer session emulator)
    catf.exe (helper program for displaying trace files)
    root_certs.txt (root CA certificate database)
    wizard wc3270wiz.exe (Session Wizard)
    ws3270 ws3270.exe (scripting emulator)
    x3270if.exe (command-line interface to ws3270 and wc3270 scrpting)
    help HTML documentation

    By default, all tasks are performed. The tasks are:

    Task Definition
    desktopicons Create desktop shortcuts for wc3270 and the Session Wizard
    migratefiles Copy session files from the AppDefaults folders (from older versions of wc3270) to Documents folders

    Notes for Installing as SYSTEM

    To install wc3270 as the SYSTEM user, which does not have any per-user special folders, you must disable the desktopicons and migratefiles tasks by specifying the following option:
        /TASKS=""

    Notes for Version Upgrades

    AppData File Migration

    Release 3.5beta5 stopped the use of the wc3270 AppData folders. When upgrading from an earlier release to 3.5beta5 or later, session and keymap files in an wc3270 AppData folder must be copied to a Documents folder (a user's My Documents or the Public Documents folder) and desktop session shortcuts must be replaced. A Migration Wizard will be run automatically by the installer to handle this, allowing the user to control which files are copied. (Note that when using unattended installation, the Migration Wizard will copy all of the files.)

    The Migration wizard will copy only files for the user running the installer and shared files. After the upgrade, other users will be offered an option in the Session Wizard to migrate their own files.

    File migration will only happen once per user and for shared files. The files will be preserved in the AppData folders, but will be ignored.

    Upgrading from 32-bit to 64-bit

    Release 3.5alpha4 was the first with 64-bit Windows support. When upgrading on 64-bit Windows from an earlier release to 3.5alpha4 or later, the old 32-bit version must be uninstalled before 64-bit installation can proceed. This will be done automatically by the 64-bit installer (with the user's permission; if installing unattended, it will always be performed). suite3270-3.6/wpr3287/conf.h0000664000076500007650000000347513221577163013437 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. */ /* Libraries. */ /* Header files. */ /* Uncommon functions. */ /* #undef HAVE_VASPRINTF */ /* Configuration options. */ /* #undef USE_ICONV */ /* Optional parts. */ #define X3270_DBCS 1 #define X3270_IPV6 1 suite3270-3.6/wpr3287/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021633 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/wpr3287/html.m40000664000076500007650000000642213221577163013542 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/wpr3287/html/ReleaseNotes.html0000664000076500007650000032733513221600611016551 0ustar pdmpdm wpr3287 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/wpr3287/html/wpr3287-man.html0000664000076500007650000003047113221600611016055 0ustar pdmpdm wpr3287 Manual Page

    wpr3287 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Environment
    Proxy
    See Also
    Copyrights
    Version

    Name

    wpr3287 - IBM host printing tool

    Synopsis

    wpr3287 [options] [L:][Y:][LUname[,LUname...]@]hostname[:port][=accept]

    Description

    wpr3287 opens a telnet connection to an IBM host, and emulates an IBM 3287 printer. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection).

    If the hostname is prefixed with L:, the connection will be made through an SSL/TLS tunnel. If the hostname is also prefixed with Y:, the host's SSL/TLS certificate will not be checked. wpr3287 also supports TELNET START-TLS option negotiation without any need for command-line options.

    A specific LU name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma.

    The port to connect to defaults to telnet. This can be overridden by appending a port to the hostname with a colon `:'.

    An accept name (a name to compare to the host's SSL/TLS certificate) may be specified by appending it with an equals sign.

    Options

    wpr3287 understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
    -assoc LUname
    Causes the session to be associated with the specified LUname.
    -blanklines
    In LU3 formatted mode, print blank lines even if they are all NULLs or control characters. (This is a violation of the 3270 printer protocol, but some hosts require it.)
    -clientcert name
    Specifies the name of a client certificate to provide to the host. It must be in the Personal certificate store.
    -charset name
    Specifies an alternate host code page (input EBCDIC mapping). The default maps the U.S. English (037) code page to the the system ANSI code page (unless overridden by the -printercp option). wpr3287 generally supports the same host character sets as wc3270.
    -nocrlf
    Causes newline characters in the output to be left as-is, and not expanded to carriage-return/linefeed sequences.
    -crthru
    In unformatted 3270 mode, causes EBCDIC CR orders to be passed to directly to the printer as ASCII CR characters, and the output buffer to be flushed, instead of being specially interpreted by wpr3287.

    By default, EBCDIC CRs cause the (virtual) print head to return to column 0, so that subsequent text overwrites what is already in the buffer, and the buffer is flushed only when an EBCDIC NL or EM order is received.

    -eojtimeout seconds
    Causes wpr3287 to complete the print job after seconds seconds of inactivity.
    -emflush
    Causes wpr3287 to flush any pending printer output whenever an EM (End of Medium) order arrives in unformatted 3270 mode. This can help preserve multi-page output with hosts that do not clear the 3270 buffer between pages. (Note: This option is defined for historical purposes only; -emflush is now the default.)
    -noemflush
    Causes wpr3287 not to flush any pending printer output when an EM (End of Medium) order arrives in unformatted 3270 mode.
    -ignoreeoj
    Ignore TN3270E PRINT-EOJ commands, relying on UNBIND commands to indicate the ends of print jobs.
    -ffeoj
    Causes wpr3287 to add a FF (formfeed) at the end of each print job.
    -ffskip
    Causes wpr3287 to ignore a FF (formfeed) order if it occurs at the top of a page.
    -ffthru
    In SCS mode, causes wpr3287 to pass FF (formfeed) orders through to the printer as ASCII formfeed characters, rather than simulating them based on the values of the MPL (maximum presentation line) and TM (top margin) parameters.
    -mpp n
    Specifies a non-default value for the Maximum Presentation Position (the line length for unformatted Write commands). The default is 132. The minimum is 40 and the maximum is 256.
    -printer printer
    Specifies the Windows printer to use for each print job. The default is to use the printer specified by the $PRINTER environment variable, if defined, and otherwise to use the default Windows printer.

    The printer can be the name of a local printer, or a UNC path to a remote printer, e.g., \\server\printer1.

    -printercp codepage
    Specifies the code page to use when generating printer output. The default is to use the system ANSI code page.
    -noverifycert
    Do not verify the host certificate for SSL/TLS connections.
    -proxy type:host[:port]
    Causes wpr3287 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -reconnect
    Causes wpr3287 to reconnect to the host, whenever the connection is broken. There is a 5-second delay between reconnect attempts, to reduce network thrashing for down or misconfigured hosts.
    -skipcc
    For unformatted writes, skip ASA carriage control characters (e.g., blank for single-space, 0 for double-space, 1 for formfeed, etc.) in the first position of each line of host output.
    -trace
    Turns on data stream tracing. Trace information is usually saved in the file x3trc.pid.txt.
    -tracedir dir
    Specifies the directory to save trace files in, instead of the current directory.
    -trnpre file
    Specifies a file containing data that will be sent to the printer before each print job. The file contents are treated as transparent data, i.e., they are not translated in any way.
    -trnpost file
    Specifies a file containing data that will be sent to the printer after each print job. The file contents are treated as transparent data, i.e., they are not translated in any way.
    -v
    Display build and version information and exit.
    -verifycert
    Verify the host certificate for SSL/TLS connections. (This is the default setting.)
    -xtable file
    Specifies a file containing transparent data translations. The file specifies EBCDIC characters that will be translated into transparent ASCII data (data that will not be further translated and will not count as taking up column(s) on the print line). Any printable ECBDIC code can be translated to zero or more ASCII characters.

    The table consists of lines that look like:

    ebcdic ebcdic-code ascii ascii-code...

    The ebcdic-code can be specified in hexadecimal X'nn' notation or as numbers in decimal, octal (with a leading 0) or hexadecimal (with a leading 0x). The ascii-codes can be specified as numbers in decimal, octal or hexadecimal, control codes such as ^X, symbolic control codes such as CR or Escape, or as double-quoted strings, following the full C-language conventions, such as \r for a carriage return. Comments begin with #, ! or //.

    Here are some examples of translations.
    # Expand EBCDIC D to an escape sequence.
    ebcdic X'C4' ascii Esc "]1,3" 0x6d
    # Delete EBCDIC B's
    ebcdic X'C2' ascii

    The full list of symbolic control codes is: BS CR BEL ESC ESCAPE FF HT LF NL NUL SPACE TAB VT.

    Environment

    PRINTER
    Specifies the Windows printer to use for print jobs. The -printer command-line option overrides $PRINTER.

    Proxy

    The -proxy option causes wpr3287 to use a proxy server to connect to the host. The syntax of the option is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    See Also

    wc3270(1)
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    3174 Establishment Controller Functional Description, IBM GA23-0218
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC `AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    wpr3287 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/wpr3287/LICENSE0000664000076500007650000000315713221577163013343 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/wpr3287/m4man0000775000076500007650000000342013221577163013271 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/wpr3287/Makefile0000775000076500007650000000427613221577163014004 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for wpr3287 can build either 32- or 64-bit ifdef WIN64 objdir = ../obj/win64/wpr3287 else objdir = ../obj/win32/wpr3287 endif top = ../../.. this = $(top)/wpr3287 export VPATH = $(this):$(top)/Common/pr3287:$(top)/Common:$(top)/Common/Win32 export TOP = $(top) export THIS = $(this) MAKEINC = -I$(this) -I$(top)/Common/pr3287 -I$(top)/Common -I$(top)/Common/Win32 all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/wpr3287/Makefile.aux0000664000076500007650000000414313221577163014566 0ustar pdmpdm# Copyright (c) 2000-2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for wpr3287 PRODUCT = wpr3287 all: @echo "Must pick a specific make target." DOCS = html/$(PRODUCT)-man.html html/ReleaseNotes.html src.tgz: $(DOCS) Makefile.aux MANDEP = html.m4 m4man Makefile.aux version.txt MKHTML = ./m4man -t html -p $(PRODUCT) # Rule for building the documentation. man: $(DOCS) # Rules for building man pages and derived HTML documentation. html/$(PRODUCT)-man.html: pr3287.man.m4 $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ pr3287.man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ suite3270-3.6/wpr3287/Makefile.obj0000664000076500007650000000526013221577163014544 0ustar pdmpdm# Copyright (c) 2007-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Makefile for wpr3287 # Set GT_PFX, NATIVE_SFX, NATIVECC, CC, WINDRES and WIN32_FLAGS. include winenv.mk XCPPFLAGS = $(WIN32_FLAGS) -I$(THIS) -I$(TOP)/Common/pr3287 -I$(TOP)/include CFLAGS = -g -Wall -Werror -MMD -MP $(XCPPFLAGS) $(CDEBUGFLAGS) include pr3287_files.mk include wpr3287_files.mk VOBJS = $(PR3287_OBJECTS) $(WPR3287_OBJECTS) OBJECTS = $(VOBJS) version.o LIBS = -lws2_32 -lwinspool -lcrypt32 -lsecur32 ifdef WIN64 HOST = win64 else HOST = win32 endif W = w include libs.mk all: wpr3287.exe XVERSION = xversion.c version.o: mkversion.sh $(VOBJS) version.txt $(RM) $(XVERSION) sh $< wpr3287 $(filter %.txt,$^) >$(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) wpr3287.exe.manifest: mkmanifest.sh version.txt manifest.tmpl sh $< $(filter %.txt,$^) $(filter %.tmpl,$^) wpr3287 "wpr3287 printer emulator" $(WIN64) >$@.tmp /bin/mv -f $@.tmp $@ wpr3287res.o: wpr3287.rc pr3287.ico wpr3287.exe.manifest $(WINDRES) -i $< -o $@ wpr3287.exe: $(OBJECTS) $(DEP32XX) $(DEP3270STUBS) $(CC) -o wpr3287.exe $(CFLAGS) $(OBJECTS) $(LD32XX) $(LD3270STUBS) $(LIBS) clean: rm -f *.o wpr3287.exe.manifest clobber: clean rm -f wpr3287.exe *.d # Include auto-generated dependencies. -include $(OBJS:.o=.d) suite3270-3.6/wpr3287/man.m40000664000076500007650000000513013221577163013344 0ustar pdmpdmdnl Copyright (c) 2000-2012, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces output for nroff -man changecom()dnl changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl define(XX_SH,.SH `"translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)"')dnl define(XX_TH,.TH $1 $2 "$3")dnl define(XX_SM,\s-1$1\s+1)dnl define(XX_LP,.LP)dnl define(XX_IP,.IP)dnl define(XX_BR,.br)dnl define(XX_RS,.RS $1 .RE)dnl define(XX_TS,.TS $2)dnl define(XX_TR,$1)dnl define(XX_TD,T{ .na .nh $1 T})dnl define(XX_TDH,T{ .na .nh .in +2 .ti -2 $1 T})dnl define(XX_T_,_)dnl define(XX_TC,$1)dnl define(XX_TE,.TE)dnl define(XX_TPS)dnl define(XX_TP,.TP $1)dnl define(XX_TPE)dnl define(XX_PP,.PP)dnl define(XX_RI2,.RI $1 $2)dnl define(XX_DASH,\-)dnl define(XX_DASHED,\-$1)dnl define(XX_FI,\fI$1\fP)dnl define(XX_FB,\fB$1\fP)dnl define(XX_NBSP,`\ ')dnl define(XX_LT,<)dnl define(XX_BS,\e)dnl define(XX_TARGET)dnl define(XX_LINK,$2)dnl define(XX_COPY,` ')dnl define(XX_NOT,notsign)dnl define(XX_BACKSLASH,\\$1)dnl define(XX_HO)dnl define(XX_HY,$1\%$2)dnl dnl Make sure it gets run through tbl first. '\" t suite3270-3.6/wpr3287/mkstand.bash0000775000076500007650000000100313221577163014625 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/wpr3287/mkversion.sh0000775000076500007650000000466413221577163014716 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <K;DTAAPAD`C;P@ILCEZADn‡HAPSEGYFEYDK`FIaIESGSPIW`LL[LOeKNTNObLSPO][QVlTPbQZcSVhSV^R^_U[ZSb‚\B\V_XUge\[OSuk[^f\bc_cc\kn]f_]nfaidfehappeklfowifmikxhlhfxpjsqmoxmswkxypotl|{rqRh˜§uaƒsv}q~tzan›‰x|}x„{z€|~zz……{ŸxŠ…†€‰fx¨……¸†z„‚•Ÿ‹„—Œ†‰‰’”‰ŒŽŠ“q‚®š„·w²‚‹¢ív ´“Œ’˜Œ‰³™“œ –•~Œ¹iˆË³—”¢•¢Ÿ™¢¥š ßŸÉŽ›œ¡“¹Š”»È©Ÿ ¥¥¡£«Ÿ¦¦ ©³£Ÿ•›º¥•­¤£²Í¤£¯·¨¤‘žÏ¢¥»µ©°ª©¶°¬®°ª³ž¥Ä¤¥Â·­¬Ò®¤¯®½»°¶¶°¹È±±¸´¶º´¾Â¸·Ã·¾¾º¼¸¸Ä¿¹ÃªÀ¿ÄÀÃſɿ¾ÎÌÂÂÌÀÇÒÿÝżͽÓÃÆÇÉÅÇÊÃÍÆÅÒÛÍÁÎÊÌÛËÇÎÈÒÚÉÌÊËÐÕÉÐÑÑÄËÊ×ÒËÕÙÎÎÏÑÖÏÏÛ×ÒÕãÓÏÖÐÚÝÓÒãÑÔÝÑØÓÖÔÚØÒÚÖØáÙÐÚÔÞÕÖÜÔÔáèÔßÞÙÜØÚßÞØâåÛÚàÛÞìÜØÛÞÜæÚáâßÚáÝßÜÝââÛåÛÛèÝßääàâäÞèÞÞëàãáßáæìâáìàççâåáâèõçÚçáëêçâäçåêåèäåëðæåêãîåäòêàùçêèçæóíéëíçñèéïïìçõèïõëêëìòìïíòíðòëõïòðïðöõñóöôîýòòüð÷ññþùõ÷ùòýÿø÷ö÷ýùúÿÿúýÿýøôýþüÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÿÿpG?Gÿ9+ÿÿÿÿdÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ_;A[™Ðò‰M1%=aÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢‰T9Dq˜´¼ÈÒÒÞçÛȬ˜zP9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸpWARŠÀÏÒÒ²ÆÏÏÒÐÒÒÞáÚÔË—W<40ÿTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿA6^‰²ÝçÒÏÒ¬ÆÃÏÏËÎÏÏÑÖÑéåìÝȤ{i;:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPBgœÑáÞÒËÈÊÈðÏÜåØÒÏÒÑÏÏÏÏÏÒÒØçðÞÞ¬qD-,5Qk¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÕŸ”ØçÛÏÓÏÏÏÏÏÔ²϶ŸÏÍÏÒÏÏÎÒÏÎÒÏÔÐÃÊÓÝõëϨ™kG%/<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿóéÀ²ÞØÓËÏÏÃÊÆÈËÂò´är =ÃÒÐÍÎÐÏØÔÐÔÃÃÏÃÏÏËÏØàîîÞ¶“lr}ÿÿÿÿÿÿÿÿÿÿÿÿô¶¶°¹ÊÈÃÏÏÊÈÏöª²¾ÃÝz&<ËÒÐÎÏÏÔÛÜåÚÞáÑÍÐËÏÏÐÃÏËÚÞåçÞѼ°ÿÿÿÿÿÿÿÿÿÿó¥—‰œÂ¾¹¶­¥¥°ÃÒÄ´ÃÒβÏËÎÏÒÒØãÞÝÕ¡©»ÅËÔÐÐÃÑÐÑËÎÒÒÑÑÖ×´£ÿÿÿÿÿÿÿ÷ꉃœ¾¾¶°ª¦¶¦¯¾ÆÎ¼ÃÆÏÞÝÑÒÒÏÒÏÛØÞí·Žÿ’’’±åÐËÝÝØÐÑÐÔÏÑÖÒ¾ÿÿÿÿÿÿÿÿÿß”ˆˆœ²¶¾À¦­¶³¶¾ÒÐÉÍÏרÏÏÏÏÒÏÔÞãØÚÝÉ·½©©ÿס֫½èÛÜåÝ×ÏØÛªÿÿÿÿÿÿÿÿÿ陑™ªÀÏϳ{k¥¶ÃÔϲϤ}˜´ÏÒÔÞÏ×ÞÓËÊÂÑÐÛÛêßÕÅß¡ÛøÊªáëÏÍÑ˺ÿÿÿÿÿÿÿÿÿàœ”¯ËÆÂ_4‰¥»ÄÂÏ´çŠ0=5Bu¼ÛäïëÞÔÓ¾ÄÃÃÚßÖ×îëêÂåÞ¼ÓÛÜÏÿÿÿÿÿÿÿÿôÚ“˜˜ªËË´r|&T´È³²Ã´Ør ÄT>a‰¤¶Îëö÷å×ÊËÏÐéßêÞìÃÃÜåÞØÿÿÿÿÿÿÿÿÿÚ‰œ´ÏϲaY^¾¾Ã¿×Þã¤`5# &Î)  (Da¨ÞððïðìãËËÚ¶ÃÞÓãÿÿÿÿÿÿÿÿÿÿ騢³ÃÎÄ”WkÃ×ÚåèææçççÛäYˆ¬  >TO|”ž»ìöùѨÃÑ×ÿÿÿÿÿÿÿÿÿÿÿêÂÏÏÏ¿²ÃÐÒùïçåÝÞèìèçÞÒèëå²¼k !\@ $7i‘”¶×ÛûcÿÿÿÿÿÿÿÿÿôÀÂÂØ×Ûëïñè×ÛÜØØÓÔÛÔþœˆ`{‡ŠV@33)! !¦ÞÜïÿÿÿÿÿÿÿÿÿÿÿÿÖçììëÞÝÝÞÝåÞåÝØÞæëãðØq¥¶¼­¶¶²°Ÿœ™‡_OD3""" ,ÀÜíÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿïëç×éÖàéÄÄ´¤–Ôççç²—¬´»ÃÐÉÂÂÃÂÏϾ´°œ¨™|VF**$HáÛð»ÿÿÿÿÿÿÿÿÿÿÿÿÿâ÷ÿö÷ëððå­ª´Ç½ÞççÞ˜qí𘱶¾¾ÉÉÑÝÞåÖÅÄÀ¶¾ªk&*3Eižèë×~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôîôéÑÑôíëááäÃrŸúþíÝçßдª¶ÅÑ×ÐÏÑÑ´­P@_”‹Œ…ÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÄÉÉÕÞØãÞÞÞijþþþþþþþûöçØÓ˶ÆÔË·¥{YGÔwIbn2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÉÖ«ßÞÞðëëç´¨üþþþþþþþþþþþûñòïòWD|œmXmxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÕ¹¥ÒÛÛÅ·„ñüþþþþþþþþþþþþþþþþúò¸¥+-¬wÿjÿ]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉ–qyUJJŽþúþþþþþþþþþþþþþþþþþêå¤*P•åÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡¢¤“yNeoZhÙûüþþþþþþþþþþþþþþþþþñ—O*Ððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹ª–wXbts«þûüþþþþþþþþþþþþþþþúþû_Fèÿ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸Ö¹«†ˆ¸ÿüþþþþþþþþþþþþþþþþþþþûå´íÿÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÚÅÕñóòüþþþþþþþþþþþþþþþþþþþþúö­»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬áùþúûþþúþþþþüþþþþþþþþþþþþþþüüêÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿûûýúÿþÿúûûþþþúþúüúþþûóôéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÖÿùÿüôüþþûÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfÿÿÿÿÿÿÿÿsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿì'¿ÿÿÿÿÿàÿÿÿÿþÿÿÿÿø_ÿÿÿÐÿÿ€ÿüÿøøøð€øøøðøø?øø?ü?ÿ?þ@?ÿðÿúßÿüÿÿüÿþÿÿü?ÿÿþ_ÿÿü¿ÿÿüÿÿÿøÿÿÿÿРÿÿÿÿÿü _ÿÿÿÿÿÿÿ¿ÿÿÿï÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsuite3270-3.6/wpr3287/pr3287.man.m40000664000076500007650000003543313221577163014321 0ustar pdmpdmXX_TH(PR3287,1,XX_DATE) XX_SH(Name) XX_PRODUCT XX_DASHED() XX_SM(IBM) host printing tool XX_SH(Synopsis) XX_FB(XX_PRODUCT) [XX_FI(options)] [L:][Y:][XX_FI(LUname)[,XX_FI(LUname)...]@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)] XX_SH(Description) XX_FB(XX_PRODUCT) opens a telnet connection to an XX_SM(IBM) host, and emulates an XX_SM(IBM) 3287 printer. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection). XX_LP If the XX_FI(hostname) is prefixed with XX_FB(L:), the connection will be made through an SSL/TLS tunnel. If the XX_FI(hostname) is also prefixed with XX_FB(Y:), the host's SSL/TLS certificate will not be checked. XX_FB(XX_PRODUCT) also supports TELNET START-TLS option negotiation without any need for command-line options. XX_LP A specific LU name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). XX_LP An accept name (a name to compare to the host's SSL/TLS certificate) may be specified by appending it with an equals sign. XX_SH(Options) XX_FB(XX_PRODUCT) understands the following options: XX_TPS()dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. XX_FI(name) can either be XX_FB(any) (OpenSSL only), which disables name validation, or a specific name. ', `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ')dnl XX_TP(XX_FB(XX_DASHED(assoc)) XX_FI(LUname)) Causes the session to be associated with the specified XX_FI(LUname). XX_TP(XX_FB(XX_DASHED(blanklines))) In LU3 formatted mode, print blank lines even if they are all NULLs or control characters. (This is a violation of the 3270 printer protocol, but some hosts require it.) ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(cadir)) XX_FI(directory)) Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) XX_TP(XX_FB(XX_DASHED(cafile)) XX_FI(filename)) Specifies a XX_SM(PEM)-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfile)) XX_FI(filename)) Specifies a file containing a certificate to provide to the host. The default file type is XX_SM(PEM) (OpenSSL) or PKCS12 (MacOS). XX_TP(XX_FB(XX_DASHED(certfiletype)) XX_FI(type)) Specifies the type of the certificate file specified by XX_FB(XX_DASHED(certfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(chainfile) XX_FI(filename))) Specifies a certificate chain file in XX_SM(PEM) format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If XX_FB(XX_DASHED(chainfile)) is specified, it overrides XX_FB(XX_DASHED(certfile)). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. It must be installed in the keychain. (MacOS only) ', `XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. It must be in the Personal certificate store. ')dnl XX_TP(XX_FB(XX_DASHED(charset)) XX_FI(name)) Specifies an alternate host code page (input XX_SM(EBCDIC) mapping). The default maps the U.S. English (037) code page to the ifelse(XX_PRODUCT,pr3287,`current locale character encoding.', `the system ANSI code page (unless overridden by the XX_DASHED(printercp) option).') XX_PRODUCT generally supports the same host character sets as ifelse(XX_PRODUCT,pr3287,x3270,wc3270). ifelse(XX_PRODUCT,pr3287,`XX_TP(XX_FB(XX_DASHED(command)) XX_FI(command)) Specifies the command to run for each print job. The default is XX_FB(lpr).') ifelse(XX_PRODUCT,pr3287,`XX_TP(XX_FB(XX_DASHED(crlf))) Causes newline characters in the output to be expanded to carriage-return/linefeed sequences.', `XX_TP(XX_FB(XX_DASHED(nocrlf))) Causes newline characters in the output to be left as-is, and not expanded to carriage-return/linefeed sequences.') XX_TP(XX_FB(XX_DASHED(crthru))) In unformatted 3270 mode, causes XX_SM(EBCDIC) CR orders to be passed to directly to the printer as XX_SM(ASCII) CR characters, and the output buffer to be flushed, instead of being specially interpreted by XX_FI(XX_PRODUCT). XX_IP By default, XX_SM(EBCDIC) CRs cause the (virtual) print head to return to column 0, so that subsequent text overwrites what is already in the buffer, and the buffer is flushed only when an XX_SM(EBCDIC) NL or EM order is received. ifelse(XX_PRODUCT,pr3287,`XX_TP(XX_FB(XX_DASHED(daemon))) Causes XX_FI(XX_PRODUCT) to become a daemon (background) process.') XX_TP(XX_FB(XX_DASHED(eojtimeout)) XX_FI(seconds)) Causes XX_FI(XX_PRODUCT) to complete the print job after XX_FI(seconds) seconds of inactivity. XX_TP(XX_FB(XX_DASHED(emflush))) Causes XX_FI(XX_PRODUCT) to flush any pending printer output whenever an EM (End of Medium) order arrives in unformatted 3270 mode. This can help preserve multi-page output with hosts that do not clear the 3270 buffer between pages. (Note: This option is defined for historical purposes only; XX_FB(XX_DASHED(emflush)) is now the default.) XX_TP(XX_FB(XX_DASHED(noemflush))) Causes XX_FI(XX_PRODUCT) not to flush any pending printer output when an EM (End of Medium) order arrives in unformatted 3270 mode. XX_TP(XX_FB(XX_DASHED(ignoreeoj))) Ignore TN3270E PRINT-EOJ commands, relying on UNBIND commands to indicate the ends of print jobs. XX_TP(XX_FB(XX_DASHED(ffeoj))) Causes XX_FI(XX_PRODUCT) to add a FF (formfeed) at the end of each print job. XX_TP(XX_FB(XX_DASHED(ffskip))) Causes XX_FI(XX_PRODUCT) to ignore a FF (formfeed) order if it occurs at the top of a page. XX_TP(XX_FB(XX_DASHED(ffthru))) In SCS mode, causes XX_FI(XX_PRODUCT) to pass FF (formfeed) orders through to the printer as ASCII formfeed characters, rather than simulating them based on the values of the MPL (maximum presentation line) and TM (top margin) parameters. ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(keyfile)) XX_FI(filename)) Specifies a file containing the private key for the certificate file (specified via XX_FB(XX_DASHED(certfile)) or XX_FB(XX_DASHED(chainfile))). The default file type is XX_SM(PEM). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keyfiletype)) XX_FI(type)) Specifies the type of the private key file specified by XX_FB(XX_DASHED(keyfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keypasswd)) XX_FI(type):XX_FI(value)) Specifies the password for the private key file, if it is encrypted. The argument can be XX_FB(file):XX_FI(filename), specifying that the password is in a file, or XX_FB(string):XX_FI(string), specifying the password on the command-line directly. ')dnl XX_TP(XX_FB(XX_DASHED(mpp) XX_FI(n))) Specifies a non-default value for the Maximum Presentation Position (the line length for unformatted Write commands). The default is 132. The minimum is 40 and the maximum is 256. ifelse(XX_PRODUCT,wpr3287,`XX_TP(XX_FB(XX_DASHED(printer)) XX_FI(printer)) Specifies the Windows printer to use for each print job. The default is to use the printer specified by the XX_FB($PRINTER) environment variable, if defined, and otherwise to use the default Windows printer. XX_LP The printer can be the name of a local printer, or a UNC path to a remote printer, e.g., \\server\printer1. XX_TP(XX_FB(XX_DASHED(printercp)) XX_FI(codepage)) Specifies the code page to use when generating printer output. The default is to use the system ANSI code page.') XX_TP(XX_FB(XX_DASHED(noverifycert))) Do not verify the host certificate for SSL/TLS connections. XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FI(XX_PRODUCT) to reconnect to the host, whenever the connection is broken. There is a 5-second delay between reconnect attempts, to reduce network thrashing for down or misconfigured hosts. XX_TP(XX_FB(XX_DASHED(skipcc))) For unformatted writes, skip ASA carriage control characters (e.g., blank for single-space, `0' for double-space, `1' for formfeed, etc.) in the first position of each line of host output. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream tracing. Trace information is usually saved in the file ifelse(XX_PRODUCT,pr3287,`XX_FB(/tmp/x3trc.)`'XX_FI(pid).', `XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt).') XX_TP(XX_FB(XX_DASHED(tracedir)) XX_FI(dir)) Specifies the directory to save trace files in, instead of ifelse(XX_PRODUCT,pr3287,XX_FB(/tmp), the current directory). XX_TP(XX_FB(XX_DASHED(trnpre) XX_FI(file))) Specifies a file containing data that will be sent to the printer before each print job. The file contents are treated as transparent data, i.e., they are not translated in any way. XX_TP(XX_FB(XX_DASHED(trnpost) XX_FI(file))) Specifies a file containing data that will be sent to the printer after each print job. The file contents are treated as transparent data, i.e., they are not translated in any way. XX_TP(XX_FB(XX_DASHED(v))) Display build and version information and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) Verify the host certificate for SSL/TLS connections. (This is the default setting.) XX_TP(XX_FB(XX_DASHED(xtable) XX_FI(file))) Specifies a file containing transparent data translations. The file specifies EBCDIC characters that will be translated into transparent ASCII data (data that will not be further translated and will not count as taking up column(s) on the print line). Any printable ECBDIC code can be translated to zero or more ASCII characters. XX_IP The table consists of lines that look like: XX_RS(XX_FB(ebcdic) XX_FI(ebcdic-code) XX_FB(ascii) XX_FI(ascii-code)... ) XX_IP The XX_FI(ebcdic-code) can be specified in hexadecimal X'XX_FI(nn)' notation or as numbers in decimal, octal (with a leading 0) or hexadecimal (with a leading 0x). The XX_FI(ascii-code)s can be specified as numbers in decimal, octal or hexadecimal, control codes such as XX_FB(^X), symbolic control codes such as XX_FB(CR) or XX_FB(Escape), or as double-quoted strings, following the full C-language conventions, such as XX_FB(XX_BACKSLASH(r)) for a carriage return. Comments begin with XX_FB(#), XX_FB(!) or XX_FB(//). XX_IP Here are some examples of translations. XX_BR # Expand EBCDIC D to an escape sequence. XX_BR ebcdic X'C4' ascii Esc "]1,3" 0x6d XX_BR # Delete EBCDIC XX_POSESSIVE(B) XX_BR ebcdic X'C2' ascii XX_IP The full list of symbolic control codes is: XX_FB(BS CR BEL ESC ESCAPE FF HT LF NL NUL SPACE TAB VT). XX_TPE()dnl ifelse(XX_PRODUCT,pr3287,`XX_SH(Signals) SIGINT, SIGHUP and SIGTERM cause the current print job to be flushed (any pending data to be printed) and XX_FI(XX_PRODUCT) to exit. XX_LP() SIGUSR1 causes the current print job to be flushed without otherwise affecting the XX_FI(XX_PRODUCT) process.') ifelse(XX_PRODUCT,wpr3287,`XX_SH(Environment) XX_TPS()dnl XX_TP(XX_FB(PRINTER)) Specifies the Windows printer to use for print jobs. The XX_FB(XX_DASHED(printer)) command-line option overrides XX_FB($PRINTER). XX_TPE()dnl') XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. XX_SH(See Also) ifelse(XX_PRODUCT,pr3287,`x3270(1), c3270(1), telnet(1), tn3270(1)', `wc3270(1)') XX_BR Data Stream Programmer's Reference, IBM GA23`'XX_DASHED(0059) XX_BR Character Set Reference, IBM GA27`'XX_DASHED(3831) XX_BR 3174 Establishment Controller Functional Description, IBM GA23`'XX_DASHED(0218) XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP() Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_LP() THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC XX_DQUOTED(AS IS) AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/wpr3287/version.txt0000775000076500007650000000006013221577443014556 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/wpr3287/wpr3287_files.mk0000664000076500007650000000007213221577163015176 0ustar pdmpdm# Object files specific to wpr3287 WPR3287_OBJECTS = ws.o suite3270-3.6/wpr3287/wpr3287.rc0000664000076500007650000000010513221577163014006 0ustar pdmpdmLANGUAGE 0, 0 1 RT_MANIFEST wpr3287.exe.manifest 100 ICON pr3287.ico suite3270-3.6/wpr3287/ws.c0000664000076500007650000001436413221577163013135 0ustar pdmpdm/* * Copyright (c) 2007-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ws.c * Interactions with the Win32 print spooler (winspool). */ #include #include #include "localdefs.h" #include "wsc.h" #define PRINTER_BUFSIZE 16384 static enum { PRINTER_IDLE, /* not doing anything */ PRINTER_OPEN, /* open, but no pending print job */ PRINTER_JOB /* print job pending */ } printer_state = PRINTER_IDLE; static HANDLE printer_handle; static char printer_buf[PRINTER_BUFSIZE]; static int pbcnt = 0; /* * This is not means a general-purpose interface to the Win32 Print Spooler, * but rather the minimum subset needed by wpr3287. * * The functions generally return 0 for success, and -1 for failure. * If a failure occurs, they issue an error message via the 'errmsg' call. */ /* * Start talking to the named printer. * If printer_name is NULL, uses the default printer. * This call should should only be made once. */ int ws_start(const char *printer_name) { PRINTER_DEFAULTS defaults; /* If they didn't specify a printer, grab the default. */ if (printer_name == NULL) { printer_name = ws_default_printer(); if (printer_name == NULL) { errmsg("ws_start: No default printer"); return -1; } } /* Talk to the printer. */ (void) memset(&defaults, '\0', sizeof(defaults)); defaults.pDatatype = "RAW"; defaults.pDevMode = NULL; defaults.DesiredAccess = PRINTER_ACCESS_USE; if (OpenPrinter((char *)printer_name, &printer_handle, &defaults) == 0) { errmsg("ws_start: OpenPrinter failed, " "Win32 error %d", GetLastError()); return -1; } printer_state = PRINTER_OPEN; return 0; } /* * flush the print buffer. */ int ws_flush(void) { DWORD wrote; int rv = 0; switch (printer_state) { case PRINTER_IDLE: errmsg("ws_endjob: printer not open"); return -1; case PRINTER_OPEN: return 0; case PRINTER_JOB: break; } if (pbcnt != 0) { if (WritePrinter(printer_handle, printer_buf, pbcnt, &wrote) == 0) { errmsg("ws_flush: WritePrinter failed, " "Win32 error %d", GetLastError()); rv = -1; } pbcnt = 0; } return rv; } /* * Write a byte to the current print job. */ int ws_putc(char c) { DOC_INFO_1 doc_info; switch (printer_state) { case PRINTER_IDLE: errmsg("ws_putc: printer not open"); return -1; case PRINTER_OPEN: /* Start a new document. */ doc_info.pDocName = "wpr3287 print job"; doc_info.pOutputFile = NULL; doc_info.pDatatype = "RAW"; if (StartDocPrinter(printer_handle, 1, (LPBYTE)&doc_info) == 0) { errmsg("ws_putc: StartDocPrinter failed, " "Win32 error %d", GetLastError()); return -1; } printer_state = PRINTER_JOB; pbcnt = 0; break; case PRINTER_JOB: break; } /* Flush if needed. */ if ((pbcnt >= PRINTER_BUFSIZE) && (ws_flush() < 0)) return -1; /* Buffer this character. */ printer_buf[pbcnt++] = c; return 0; } /* * Write multiple bytes to the current print job. */ int ws_write(char *s, int len) { while (len--) { if (ws_putc(*s++) < 0) return -1; } return 0; } /* * Complete the current print job. * Leaves the connection open for the next job, which is implicitly started * by the next call to ws_putc() or ws_write(). */ int ws_endjob(void) { int rv = 0; switch (printer_state) { case PRINTER_IDLE: errmsg("ws_endjob: printer not open"); return -1; case PRINTER_OPEN: return 0; case PRINTER_JOB: break; } /* Flush whatever's pending. */ if (ws_flush() < 0) rv = 1; /* Close out the job. */ if (EndDocPrinter(printer_handle) == 0) { errmsg("ws_endjob: EndDocPrinter failed, " "Win32 error %d", GetLastError()); rv = -1; } /* Done. */ printer_state = PRINTER_OPEN; return rv; } /* * Antique method for figuring out the default printer. * Needed for compatibility with pre-Win2K systems. * * For Win2K and later, we could just call GetDefaultPrinter(), but that would * require delay-loading winspool.dll, which appears to be beyond MinGW and * GNU ld's capabilities at the moment. */ char * ws_default_printer(void) { static char pstring[1024]; char *comma; /* Get the default printer, driver and port "from the .ini file". */ pstring[0] = '\0'; if (GetProfileString("windows", "device", "", pstring, sizeof(pstring)) == 0) { return NULL; } /* * Separate the printer name. Note that commas are illegal in printer * names, so this method is safe. */ comma = strchr(pstring, ','); if (comma != NULL) *comma = '\0'; /* * If there is no default printer, I don't know if GetProfileString() * will fail, or if it will return nothing. Perpare for the latter. */ if (!*pstring) return NULL; return pstring; } suite3270-3.6/wpr3287/wsc.h0000664000076500007650000000332213221577163013275 0ustar pdmpdm/* * Copyright (c) 2007-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * wsc.h * Declarations for ws.c. */ char *ws_default_printer(void); int ws_endjob(void); int ws_flush(void); int ws_putc(char c); int ws_start(const char *printer_name); int ws_write(char *s, int len); suite3270-3.6/ws3270/conf.h0000664000076500007650000000014713221577163013241 0ustar pdmpdm/* Hard-coded conf.h for ws3270 */ #define LIBX3270DIR "." #define X3270_DBCS 1 #define X3270_IPV6 1 suite3270-3.6/ws3270/documentation-ssl-body.html0000664000076500007650000002056613221577163017443 0ustar pdmpdm

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/ws3270/Examples/cms_cmd.expect0000775000076500007650000001121613221577163016542 0ustar pdmpdm#!/bin/sh # \ exec tclsh "$0" ${1+"$@"} # Copyright (c) 2000-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Add the Expect module. package require Expect # Read in the glue functions. source x3270_glue.expect # Pluck the username, password and command from the command line. if {$argc != 4} { puts stderr "Usage: $argv0 hostname username password command" exit 1 } set hostname [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] set command [lindex $argv 3] # Procedure to wait for a READ prompt from CMS or CP. proc waitread {} { Snap Save while {[Snap Ascii [expr [Snap Rows]-1] [expr [Snap Cols]-17] 4] != "READ"} { Snap Wait Output } } # Procedure to check for the CMS "Ready" prompt. # Returns its row number, or -1 for "MORE..." state, and leaves a screen with # data to read in the Snap buffer. proc cmd_done {} { global verbose Snap Save while {1} { if {[Snap Ascii [expr [Snap Rows]-1] [expr [Snap Cols]-20] 7] == "MORE..."} { if {$verbose} {puts "MORE..."} return -1 } set i [expr [Snap Rows]-2] while {$i >= 0} { set text [Snap Ascii $i 0 [Snap Cols]] switch -regexp $text { "Ready; T=.*" {return $i} "Ready\(.*\); T=.*" { error [Snap Ascii [expr $i-1] 0 \ [Snap Cols]] } "^ *\$" {} default { if {$verbose} {puts "Incomplete $i '[string trimright $text]'"} set i 0 } } incr i -1 } Snap Wait Output } } # Execute a command, return the output. proc cms_cmd {text} { global verbose # Clear the screen. Clear # Send the command. String "$text\n" # 'first' is the row where the first line of output will appear. For # the first screenful it's 1; after that it's 0. set first 1 # r is the result. set r {} while {1} { # Wait for a screenful. set d [cmd_done] # Dump out what's there. set i $first set first 0 if {$d < 0} {set last [expr [Snap Rows]-2]} {set last $d} while {$i < $last} { set r [linsert $r end [string trimright \ [Snap Ascii $i 0 [Snap Cols]]]] incr i } if {$d >= 0} {break} # Clear the screen and go around again. Clear } return $r } # Start of main procedure. # Set 'verbose' to 1 to get debug output from the glue functions. set verbose 0 # Start ws3270 Start # Setverbose 1 # Connect to the host and wait for an input field. Connect $hostname Wait InputField # Log in and wait for CP READ or VM READ mode. String "$username\t$password\n" waitread # If we can't log on, we're hosed. if {[Ascii 1 11 7] == "Already"} { puts stderr "Can't run -- already logged in." exit 1 } # If we're in CP mode, which means we disconnected last time, boot CMS. if {[Ascii [expr [Rows]-1] [expr [Cols]-20] 2] == "CP"} { Clear String "i cms\n" waitread } # Enter an empty command to get a CMS prompt. If we don't do this, there will # be a Ready prompt as the first line of output below. Clear Enter cmd_done # Get the output of the user's command and display it. if {[catch {cms_cmd $command} result]} { puts stderr $result set rc 1 } { for {set i 0} {$i < [llength $result]} {incr i} { puts [lindex $result $i] } set rc 0 } # Log off, and wait for the host to hang up on us, so we don't unintentionally # create a disconnected session. Clear if {! [catch {String "logoff\n"}]} {Wait Disconnect} exit $rc suite3270-3.6/ws3270/ft.inc0000664000076500007650000001355013221577163013251 0ustar pdmpdmXX_SH(File Transfer) The XX_FB(Transfer) XX_action implements XX_FB(IND$FILE) file transfer. This XX_action requires that the XX_FB(IND$FILE) program be installed on the XX_SM(IBM) host, and that the 3270 cursor be located in a field that will accept a XX_SM(TSO) or XX_SM(VM/CMS) command. XX_LP ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`The XX_FB(Transfer) XX_action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. ')dnl XX_LP Because of the complexity and number of options for file transfer, the parameters to the XX_FB(Transfer) XX_action take the unique form of XX_FI(option)=XX_FI(value), and can appear in any order. Note that if the XX_FI(value) contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: XX_LP XX_TS(4,l c l l.) XX_TR(XX_TD(Option) XX_TD(Required?) XX_TD(Default) XX_TD(Other Values)) XX_T_() XX_TR(XX_TD(Direction) XX_TD(No) XX_TD(receive) XX_TD(send)) XX_TR(XX_TD(HostFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(LocalFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Host) XX_TD(No) XX_TD(tso) `XX_TD(`vm, cics')') XX_TR(XX_TD(Mode) XX_TD(No) XX_TD(ascii) XX_TD(binary)) XX_TR(XX_TD(Cr) XX_TD(No) XX_TD(remove) `XX_TD(`add, keep')') XX_TR(XX_TD(Remap) XX_TD(No) XX_TD(yes) XX_TD(no)) XX_TR(XX_TD(Exist) XX_TD(No) XX_TD(keep) `XX_TD(`replace, append')') XX_TR(XX_TD(Recfm) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`fixed, variable, undefined')') XX_TR(XX_TD(Lrecl) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Blksize) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Allocation) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`tracks, cylinders, avblock')') XX_TR(XX_TD(PrimarySpace) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(SecondarySpace) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Avblock) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(BufferSize) XX_TD(No) XX_TD(4096) XX_TD(XX_NBSP)) XX_TE() XX_LP The option details are as follows. XX_TPS()dnl XX_TP(XX_FB(Direction)) XX_FB(send) to send a file to the host, XX_FB(receive) to receive a file from the host. XX_TP(XX_FB(HostFile)) The name of the file on the host. XX_TP(XX_FB(LocalFile)) The name of the file on the local workstation. XX_TP(XX_FB(Host)) The type of host (which dictates the form of the XX_FB(IND$FILE) command): XX_FB(tso) (the default), XX_FB(vm) or XX_FB(cics). XX_TP(XX_FB(Mode)) Use XX_FB(ascii) (the default) for a text file, which will be translated between XX_SM(EBCDIC) and XX_SM(ASCII) as necessary. Use XX_FB(binary) for non-text files. XX_TP(XX_FB(Cr)) Controls how XX_FB(Newline) characters are handled when transferring XX_FB(Mode=ascii) files. XX_FB(remove) (the default) strips XX_FB(Newline) characters in local files before transferring them to the host. XX_FB(add) adds XX_FB(Newline) characters to each host file record before transferring it to the local workstation. XX_FB(keep) preserves XX_FB(Newline) characters when transferring a local file to the host. XX_TP(XX_FB(Remap)) Controls text translation for XX_FB(Mode=ascii) files. The value XX_FB(yes) (the default) causes XX_PRODUCT to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's XX_SM(EBCDIC) code page. The value XX_FB(no) causes XX_PRODUCT to pass the text to or from the host as-is, leaving all translation to the XX_FB(IND$FILE) program on the host. XX_TP(XX_FB(Exist)) Controls what happens when the destination file already exists. XX_FB(keep) (the default) preserves the file, causing the XX_FB(Transfer) XX_action to fail. XX_FB(replace) overwrites the destination file with the source file. XX_FB(append) appends the source file to the destination file. XX_TP(XX_FB(Recfm)) Controls the record format of files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_FB(fixed) creates a file with fixed-length records. XX_FB(variable) creates a file with variable-length records. XX_FB(undefined) creates a file with undefined-length records (XX_SM(TSO) hosts only). The XX_FB(Lrecl) option controls the record length or maximum record length for XX_FB(Recfm=fixed) and XX_FB(Recfm=variable) files, respectively. XX_TP(XX_FB(Lrecl)) Specifies the record length (or maximum record length) for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Blksize)) Specifies the block size for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Allocation)) Specifies the units for the XX_FB(PrimarySpace) and XX_FB(SecondarySpace) options: XX_FB(tracks), XX_FB(cylinders) or XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(PrimarySpace)) Primary allocation for a file. The units are given by the XX_FB(Allocation) option. Required when the XX_FB(Allocation) is specified as something other than XX_FB(default). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(SecondarySpace)) Secondary allocation for a file. The units are given by the XX_FB(Allocation) option. (XX_SM(TSO) hosts only.) XX_TP(XX_FB(Avblock)) Average block size, required when XX_FB(Allocation) specifies XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(BufferSize)) Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(WindowsCodePage)) Overrides the workstation code page used for XX_SM(ASCII) file transfers. By default, the system XX_SM(ANSI) code page is used. ')dnl XX_TPE()dnl XX_LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the XX_FB(Transfer) keywords, but with XX_FB(ft) prepended. E.g., the default for the XX_FB(Mode) keyword is the XX_FB(XX_PRODUCT.ftMode) resource. suite3270-3.6/ws3270/hostname.inc0000664000076500007650000000600213221577163014450 0ustar pdmpdmThe full syntax for XX_FI(host) is: XX_RS([XX_FI(prefix):]...[XX_FI(LUname)@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)]) ifelse(XX_PRODUCT,wc3270,,`XX_LP Prepending a XX_FB(P:) onto XX_FI(hostname) causes the connection to go through the XX_FI(telnet-passthru) service rather than directly to the host. See XX_LINK(#Passthru,XX_SM(PASSTHRU)) below. ')dnl XX_LP Prepending an XX_FB(S:) onto XX_FI(hostname) removes the "extended data stream" option reported to the host. See XX_LINK(#tn,XX_FB(XX_DASHED(tn))) below for further information. XX_LP Prepending an XX_FB(N:) onto XX_FI(hostname) turns off TN3270E support for the session. XX_LP Prepending an XX_FB(L:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if XX_FB(XX_PRODUCT) was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the XX_FB(L:) prefix should not be used. XX_LP Prepending a XX_FB(Y:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. XX_LP Prepending an XX_FB(A:) onto XX_FI(hostname) is equivalent to setting the XX_FB(XX_DASHED(nvt)) option; it forces an NVT-mode session instead of a 3270-mode session. XX_LP A specific Logical Unit (LU) name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) XX_LP The XX_FI(hostname) may optionally be placed inside square-bracket characters XX_DQUOTED(XX_FB([)) and XX_DQUOTED(XX_FB(])). This will prevent any colon XX_DQUOTED(XX_FB(:)) characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. ifelse(XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_LP On systems that support the XX_FI(forkpty) library call, the XX_FI(hostname) may be replaced with XX_FB(XX_DASHED(e)) and a command string. This will cause XX_FB(XX_PRODUCT) to connect to a local child process, such as a shell. ')dnl XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden with the XX_FB(XX_DASHED(port)) option, or by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). (For compatability with previous versions of XX_FB(XX_PRODUCT) and with XX_FI(tn3270)(1), the XX_FI(port) may also be specified as a second, separate argument.) XX_LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (XX_DQUOTED(XX_FB(=))). The accept name can also be specified with the XX_FB(XX_DASHED(accepthostname)) option. suite3270-3.6/ws3270/html/Bugs.html0000664000076500007650000000056213221577163014676 0ustar pdmpdm Known Bugs in s3270 3.3

    Known Bugs in ws3270 3.3

    (none)
    suite3270-3.6/ws3270/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021444 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/ws3270/html/FAQ.html0000664000076500007650000000375313221577163014412 0ustar pdmpdm ws3270 Frequently Asked Questions

    ws3270 Frequently Asked Questions

    If you have a problem building, installing, or running ws3270, please browse through this file first.

    General Questions

    Am I allowed to use it?

    Yes. Full copyright information is in the Lineage file, but the gist is that anyone is free to use the code, and anyone is free to sell copies of the code.

    You are also free to modify it and to redistribute it, provided you preserve the existing copyright notices.

    Getting Help

    If you are still having a problem with ws3270, feel free to send e-mail to Paul Mattes, Paul.Mattes@usa.net No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. It will also get you on an x3270 mailing list, which also includes information on ws3270, and where you can find out about new releases and bug fixes.

    When you send a question about ws3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of ws3270 you are using, including all patches, e.g., "3.3.6p1".
    2. What kind of machine you are running on, e.g., "64-bit dual-core".
    3. What operating system you are running, and what version, e.g., "Windows XP SP2".
    Complaints, suggestions, requests for enhancements, and porting experiences are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) under the x3270 license. suite3270-3.6/ws3270/html/Intro.html0000664000076500007650000000221013221577163015061 0ustar pdmpdm ws3270 Introduction

    ws3270 Introduction

    ws3270 is a scripted IBM 3270 terminal emulator. It can be used to communicate with any IBM host that supports 3270-style connections over TELNET. It can also communicate with hosts that use line-by-line ASCII mode to do initial login negotiation before switching to full-screen 3270 mode.

    ws3270 emulates one of four models of an IBM 3278 or 3279 terminal. The difference between the various models is the screen size. The emulation is not quite complete; ws3270 understands extended field orders but does not implement some of the extended attributes (outlining, extended validation, etc.). It does not support 3179G bit-mapped graphics (GDDM).

    ws3270 supports the APL character set and several international character sets. Many APL and international symbols may be entered by their X11 symbol names. suite3270-3.6/ws3270/html/Lineage.html0000664000076500007650000000445713221577163015351 0ustar pdmpdm ws3270 Lineage

    ws3270 Lineage

    Here is the official copyright notice for ws3270 3.3. It is a standard 3-element BSD license.

    Copyright © 1993-2015, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    suite3270-3.6/ws3270/html.m40000664000076500007650000000642213221577163013353 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/ws3270/html/README.html0000664000076500007650000000423513221577163014734 0ustar pdmpdm ws3270 3.3 General Release

    ws3270 3.3 General Release

    ws3270 is a scripted IBM 3278/3279 terminal emulator.

    Documentation is in the directory. The files are:

    Intro
    What ws3270 is
    Lineage
    Where ws3270 came from (copyright stuff)
    Build
    How to build ws3270 from source
    FAQ
    Frequently Asked Questions (what to do when something goes wrong)
    ReleaseNotes
    What's new in this release
    Resources
    A complete list of ws3270 resources (configuration items)
    SSL
    How to use ws3270 with the Secure Sockets Layer (SSL)
    Bugs
    What's broken in this release
    Wishlist
    What isn't in this release
    There is hypertext version of the ws3270 man page, and of the man page for wc3270-script. Please read Build before going ahead and building the program. Also, if you have a problem, scan through FAQ; there are lots of interesting answers there.

    Updates to ws3270, as well as the current status of development and bugs, are available from the x3270 Web Page.

    Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit.

    There is also an x3270 mailing list, which also includes information about ws3270, and which receives news about new releases. You can subscribe to this list here. suite3270-3.6/ws3270/html/ReleaseNotes.html0000664000076500007650000032733413221600611016361 0ustar pdmpdm ws3270 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/ws3270/html/Resources.html0000664000076500007650000014110213221600612015726 0ustar pdmpdm ws3270 Resources

    ws3270 Resources

    Resources are used to configure ws3270. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into ws3270.
    • If a session file foo.ws3270 is specified on the command line, its contents are applied. These definitions override resource values defined by compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example ws3270.bsdTm can be set by the following command-line option:
         -xrm "ws3270.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file (session file) has the following syntax.
    • Each definition consists of:
          ws3270.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.

    Alphabetical Resource List

    Name: ws3270.acceptHostname
    Type: String
    Command Line: -accepthostname
    Description:

    Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.)

    Name: ws3270.bindLimit
    Type: Boolean
    Default: true
    Description:

    When true, ws3270 will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not.

    Name: ws3270.bindUnlock
    Type: Boolean
    Default: false
    Description:

    When true, ws3270 will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing ws3270 to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op.

    Name: ws3270.blankFill
    Type: Boolean
    Default: false
    Command Line: -set blankFill , -clear blankFill
    Description:

    When true, in 3270 mode ws3270 will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals.

    Name: ws3270.bsdTm
    Type: Boolean
    Default: false
    Description:

    Defines ws3270's response to the TELNET DO TIMING MARK option. When set to false, ws3270 will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, ws3270 will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of ws3270. In either case, ws3270 will never respond to a DONT TIMING MARK option.

    Name: ws3270.charset
    Type: String
    Default: bracket
    Command Line: -charset
    Description:

    This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by ws3270, use the -v command-line option.

    Name: ws3270.clientCert
    Type: String
    Command Line: -clientcert
    Description:

    Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store.

    Name: ws3270.color8
    Type: Boolean
    Default: false
    Description:

    If true, ws3270 will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported.

    Name: ws3270.confDir
    Type: String
    Default: .
    Description:

    Defines the ws3270 configuration directory, where ws3270 will search for the ibm_hosts file by default. (See ws3270.hostsFile.)

    The default is to search the directory where ws3270 was started, which usually its installation directory.

    Name: ws3270.connectTimeout
    Type: Integer
    Command Line: -connecttimeout
    Description:

    Specifies a timeout, in seconds, that ws3270 will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that ws3270 will wait for the lesser of the two times (the specified timeout and the system-defined timeout).

    Name: ws3270.dbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use ws3270.sbcsCgcsgid for the single-byte (SBCS) character set.

    Name: ws3270.dftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Deprecated resource -- replaced by ws3270.ftBufferSize

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: ws3270.devName
    Type: String
    Command Line: -devname
    Description:

    Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: ws3270.dsTrace
    Type: Boolean
    Default: false
    Command Line: -trace , -set dsTrace , -clear dsTrace
    Description:

    Deprecated resource -- replaced by ws3270.trace

    When true, ws3270 writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.process-id.txt. The directory where the file is written is defined by ws3270.traceDir. If ws3270.traceFile is defined, it gives the entire pathname and ws3270.traceDir is ignored.

    Name: ws3270.eof
    Type: String
    Default: ^D
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when ws3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    Name: ws3270.erase
    Type: String
    Default: ^?
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (ws3270 gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause ws3270 to discard the last character on the input line.

    When connected in character-at-a-time mode (ws3270 sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action.

    Name: ws3270.eventTrace
    Type: Boolean
    Default: false
    Command Line: -set eventTrace , -clear eventTrace
    Description:

    Deprecated resource -- replaced by ws3270.trace

    When true, ws3270 traces information about keyboard and mouse events into a file. The default file name is x3trc.process-id.txt. The directory where the file is written is defined by ws3270.traceDir. If ws3270.traceFile is defined, it gives the entire pathname and ws3270.traceDir is ignored.

    Name: ws3270.extended
    Type: Boolean
    Default: false
    Command Line: -extended
    Description:

    Deprecated resource -- replaced by ws3270.model syntax

    Indicates support for the 3270 Extended Data Stream.

    Name: ws3270.ftAllocation
    Type: String
    Default: default
    Description:

    Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock.

    Name: ws3270.ftAvblock
    Type: Integer
    Description:

    Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers.

    Name: ws3270.ftBlksize
    Type: Integer
    Description:

    Defines the default block size for files sent to TSO hosts by IND$FILE file transfers.

    Name: ws3270.ftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: ws3270.ftCodePage
    Type: Integer
    Description:

    Deprecated resource -- replaced by ws3270.ftWindowsCodePage

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: ws3270.ftCr
    Type: String
    Default: auto
    Description:

    Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done.

    Name: ws3270.ftDirection
    Type: String
    Default: receive
    Description:

    Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation).

    Name: ws3270.ftExist
    Type: String
    Default: keep
    Description:

    Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be aborted, replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file.

    Name: ws3270.ftHost
    Type: String
    Default: tso
    Description:

    Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics.

    Name: ws3270.ftHostFile
    Type: String
    Description:

    Defines the default host file name for IND$FILE file transfers.

    Name: ws3270.ftLocalFile
    Type: String
    Description:

    Defines the default local file name for IND$FILE file transfers.

    Name: ws3270.ftLrecl
    Type: Integer
    Description:

    Defines the default logical record length for files sent to the host via IND$FILE.

    Name: ws3270.ftMode
    Type: String
    Default: ascii
    Description:

    Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation).

    Name: ws3270.ftPrimarySpace
    Type: Integer
    Description:

    Defines the default primary space allocation for files sent to TSO hosts via IND$FILE.

    Name: ws3270.ftRecfm
    Type: String
    Default: default
    Description:

    Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format.

    Name: ws3270.ftRemap
    Type: String
    Default: yes
    Description:

    Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by ws3270 to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37.

    Name: ws3270.ftSecondarySpace
    Type: Integer
    Description:

    Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE.

    Name: ws3270.ftWindowsCodePage
    Type: Integer
    Description:

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: ws3270.hostname
    Type: String
    Description:

    Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over ws3270.hostname.

    The most common use of ws3270.hostname is in session files, where a file is used to pass all of the options to establish a ws3270 session.

    Name: ws3270.hostsFile
    Type: String
    Default: ibm_hosts
    Description:

    The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page.

    Name: ws3270.httpd
    Type: String
    Command Line: -httpd
    Description:

    Defines the TCP port and optional address to listen on for HTTP connections. (ws3270 implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: ws3270.icrnl
    Type: Boolean
    Default: true
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines.

    Name: ws3270.idleCommand
    Type: String
    Description:

    When ws3270.idleCommand is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The ws3270.idleCommand can be an arbitrary sequence of ws3270 actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). ws3270.idleCommandEnabled must be true in order for the ws3270.idleCommand to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) ws3270.idleTimeout specifies the inactivity interval.

    Name: ws3270.idleCommandEnabled
    Type: Boolean
    Default: false
    Description:

    Controls whether ws3270.idleCommand has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.)

    Name: ws3270.idleTimeout
    Type: String
    Default: ~7m
    Description:

    The timeout value for ws3270.idleCommand. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified.

    Name: ws3270.inlcr
    Type: Boolean
    Default: false
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns.

    Name: ws3270.intr
    Type: String
    Default: ^C
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host.

    Name: ws3270.kill
    Type: String
    Default: ^U
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when ws3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when ws3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action.

    Name: ws3270.lineWrap
    Type: Boolean
    Default: true
    Command Line: -set lineWrap , -clear lineWrap
    Description:

    This setting is used only in NVT mode. When true, ws3270 will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence.

    Name: ws3270.loginMacro
    Type: String
    Command Line: -loginmacro
    Description:

    Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a ws3270.hostsFile is in use and a matching entry is found, the login macro from that entry will be used in preference to the ws3270.loginMacro.

    Name: ws3270.lnext
    Type: String
    Default: ^V
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when ws3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered.

    Name: ws3270.localCp
    Type: Integer
    Description:

    Forces ws3270 to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files.

    Name: ws3270.m3279
    Type: Boolean
    Default: true
    Command Line: -color
    Description:

    Deprecated resource -- replaced by ws3270.model syntax

    Indicates support for color (a 3279 terminal).

    Name: ws3270.minVersion
    Type: String
    Command Line: -minversion
    Description:

    Defines a minimum required version for ws3270. If the version of ws3270 is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal.

    Name: ws3270.model
    Type: String
    Default: 3279-4-E
    Command Line: -model
    Description:

    The terminal model that ws3270 is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display.
      3279 specifies a color 3270 display.
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is 4.
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.

    Name: ws3270.monoCase
    Type: Boolean
    Default: false
    Command Line: -set monoCase , -clear monoCase
    Description:

    When true, causes ws3270 to run in uppercase-only mode.

    Name: ws3270.newEnviron
    Type: Boolean
    Default: true
    Description:

    If true, ws3270 will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not.

    Name: ws3270.nopSeconds
    Type: Integer
    Description:

    If nonzero, ws3270 will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity.

    Name: ws3270.numericLock
    Type: Boolean
    Default: false
    Description:

    When true, causes ws3270 to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute.

    Name: ws3270.nvtMode
    Type: Boolean
    Default: false
    Command Line: -nvt
    Description:

    When true, causes ws3270 to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname.

    Name: ws3270.onlcr
    Type: Boolean
    Default: true
    Description:

    Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences.

    Name: ws3270.oerrLock
    Type: Boolean
    Default: true
    Description:

    If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message.

    Name: ws3270.once
    Type: Boolean
    Default: false
    Command Line: -once
    Description:

    When true, ws3270 will exit as soon as a host disconnects. The default is false if no hostname is specified on the command line, true otherwise.

    Name: ws3270.oversize
    Type: String
    Command Line: -oversize
    Description:

    Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. It is used only if the ws3270.model includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with ws3270 in this mode.

    Name: ws3270.port
    Type: String
    Default: telnet
    Command Line: -port
    Description:

    The name of the default TCP port for ws3270 to connect to. This can be either a symbolic name from /etc/services, or an integer.

    Name: ws3270.proxy
    Type: String
    Command Line: -proxy
    Description:

    Defines a proxy server that ws3270 will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the ws3270 manual page.

    Name: ws3270.quit
    Type: String
    Default: ^\
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when ws3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host.

    Name: ws3270.rprnt
    Type: String
    Default: ^R
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when ws3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed.

    Name: ws3270.sbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use ws3270.dbcsCgcsgid for the double-byte (DBCS) character set.

    Name: ws3270.screenTrace
    Type: Boolean
    Default: false
    Command Line: -set screenTrace , -clear screenTrace
    Description:

    When true, ws3270 will save an ASCII version of the screen image in a file every time it changes. The file name defaults to x3scr.pid.txt. The directory where the file is written is defined by ws3270.traceDir. If ws3270.screenTraceFile is defined, it defines the file name and ws3270.traceDir is ignored. file name.

    Name: ws3270.screenTraceFile
    Type: String
    Description:

    If defined, gives the name of the file that screen traces will be written into.

    Name: ws3270.scriptPort
    Type: Integer
    Command Line: -scriptport
    Description:

    If defined, ws3270 will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: ws3270.scriptPortOnce
    Type: Boolean
    Default: false
    Command Line: -scriptportonce
    Description:

    If defined, ws3270 will accept only one script connection. When that connection is broken, it will exit.

    Name: ws3270.startTls
    Type: Boolean
    Default: true
    Description:

    If true, ws3270 will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them.

    Name: ws3270.suppressActions
    Type: String
    Description:

    A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options.

    Name: ws3270.termName
    Type: String
    Command Line: -tn
    Description:

    An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of ws3270.model.

    Name: ws3270.trace
    Type: Boolean
    Default: false
    Command Line: -trace , -set trace , -clear trace
    Description:

    When true, ws3270 writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.process-id.txt. The directory where the file is written is defined by ws3270.traceDir. If ws3270.traceFile is defined, it gives the entire pathname and ws3270.traceDir is ignored.

    Name: ws3270.traceDir
    Type: String
    Default: current directory
    Description:

    Defines the directory that trace files are written into.

    Name: ws3270.traceFile
    Type: String
    Command Line: -tracefile
    Description:

    If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file.

    Name: ws3270.traceFileSize
    Type: String
    Command Line: -tracefilesize
    Description:

    If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started.

    Name: ws3270.typeahead
    Type: Boolean
    Default: true
    Description:

    When true, ws3270 will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped.

    Name: ws3270.unlockDelay
    Type: Boolean
    Default: false
    Description:

    When ws3270 sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, ws3270 can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for ws3270.unlockDelayMs milliseconds.

    Name: ws3270.unlockDelayMs
    Type: Integer
    Default: 350
    Description:

    Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and ws3270 actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros.

    Name: ws3270.user
    Type: String
    Command Line: -user
    Description:

    Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: ws3270.utf8
    Type: Boolean
    Command Line: -utf8
    Description:

    Forces local I/O to use UTF-8 encoding, regardless of the local codepage.

    Name: ws3270.verifyHostCert
    Type: Boolean
    Default: true
    Command Line: -noverifycert , -verifycert
    Description:

    If true (the default), ws3270 will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, ws3270 will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking.

    Name: ws3270.werase
    Type: String
    Default: ^W
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when ws3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when ws3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action.

    Index of All Resources

    acceptHostname bindLimit bindUnlock blankFill
    bsdTm charset clientCert color8
    confDir connectTimeout dbcsCgcsgid dftBufferSize
    devName dsTrace eof erase
    eventTrace extended ftAllocation ftAvblock
    ftBlksize ftBufferSize ftCodePage ftCr
    ftDirection ftExist ftHost ftHostFile
    ftLocalFile ftLrecl ftMode ftPrimarySpace
    ftRecfm ftRemap ftSecondarySpace ftWindowsCodePage
    hostname hostsFile httpd icrnl
    idleCommand idleCommandEnabled idleTimeout inlcr
    intr kill lineWrap loginMacro
    lnext localCp m3279 minVersion
    model monoCase newEnviron nopSeconds
    numericLock nvtMode onlcr oerrLock
    once oversize port proxy
    quit rprnt sbcsCgcsgid screenTrace
    screenTraceFile scriptPort scriptPortOnce startTls
    suppressActions termName trace traceDir
    traceFile traceFileSize typeahead unlockDelay
    unlockDelayMs user utf8 verifyHostCert
    werase

    Basic Configuration Resources

    charset connectTimeout hostname model
    port proxy

    NVT-Mode Resources

    eof erase icrnl inlcr
    intr kill lineWrap lnext
    onlcr quit rprnt werase

    Protocol Resources

    bindLimit bindUnlock bsdTm color8
    dbcsCgcsgid dftBufferSize devName ftBufferSize
    sbcsCgcsgid termName user

    Terminal Interaction Resources

    blankFill ftAllocation ftAvblock ftBlksize
    ftCodePage ftCr ftDirection ftExist
    ftHost ftHostFile ftLocalFile ftLrecl
    ftMode ftPrimarySpace ftRecfm ftRemap
    ftSecondarySpace ftWindowsCodePage idleCommand idleCommandEnabled
    idleTimeout nopSeconds numericLock nvtMode
    oerrLock

    Security Resources

    acceptHostname clientCert startTls suppressActions
    verifyHostCert

    Tracing Resources

    dsTrace eventTrace screenTrace screenTraceFile
    trace traceDir traceFile traceFileSize

    Other Resources

    confDir hostsFile httpd loginMacro
    localCp minVersion monoCase newEnviron
    once oversize scriptPort scriptPortOnce
    typeahead unlockDelay unlockDelayMs utf8

    Deprecated Resources

    extended m3279

    ws3270 version 3.6ga4 Fri Dec 29 21:01:30 CST 2017 suite3270-3.6/ws3270/html/SSL.html0000664000076500007650000002104013221600612014413 0ustar pdmpdm ws3270 and SSL

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/ws3270/html/wc3270-script.html0000664000076500007650000007713413221600612016220 0ustar pdmpdm ws3270-script Manual Page

    ws3270-script Manual Page

    Contents

    Name
    Synopsis
    Description
    Status Format
    Differences
    Basic Programming Strategies
    Script-Specific Actions
    File Transfer
    See Also
    Version

    Name

    Scripting Facilities for wc3270 and ws3270

    Synopsis

    wc3270 -scriptport port [ ws3270-options ]
    ws3270 [ ws3270-options ]
    Script ( command [ ,arg... ] )

    Description

    The x3270 scripting facilities allow the interactive 3270 emulator wc3270 to be operated under the control of another program, and forms the basis for the script-only emulator ws3270.

    There are three basic scripting methods. The first is the peer script facility, the default mode for ws3270. This runs the emulator as a child of another process. Typically this would be a script using expect(1), perl(1), or the co-process facility of the Korn Shell ksh(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output.

    The second method is the child script facility, invoked by the emulator's Script action. This runs a script as a child process of the emulator. The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196).

    The third method uses a TCP socket. The -scrpiptport command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. (Note that if the Script action is used with -scriptport, it will pass the scriptport port number to child scripts, rather than creating a new socket.)

    It is possible to nest the methods. For example, a peer or TCP socket script can invoke the Script action. The calling script will be resumed when the nested script completes.

    Commands are emulator actions; the syntax is the same as for the right-hand side of a wc3270 keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with # or ! is treaded as a comment and will be ignored.

    Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script.

    Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error".

    Status Format

    The status message consists of 12 blank-separated fields:
    1 Keyboard State
    If the keyboard is unlocked, the letter U. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter L. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter E.
    2 Screen Formatting
    If the screen is formatted, the letter F. If unformatted or in NVT mode, the letter U.
    3 Field Protection
    If the field containing the cursor is protected, the letter P. If unprotected or unformatted, the letter U.
    4 Connection State
    If connected to a host, the string C(hostname). Otherwise, the letter N.
    5 Emulator Mode
    If connected in 3270 mode, the letter I. If connected in NVT line mode, the letter L. If connected in NVT character mode, the letter C. If connected in unnegotiated mode (no BIND active from the host), the letter P. If not connected, the letter N.
    6 Model Number (2-5)
    7 Number of Rows
    The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model.
    8 Number of Columns
    The current number of columns defined on the screen, subject to the same difference for rows, above.
    9 Cursor Row
    The current cursor row (zero-origin).
    10 Cursor Column
    The current cursor column (zero-origin).
    11 Window ID
    The X window identifier for the main x3270 window, in hexadecimal preceded by 0x. For ws3270 and wc3270, this is zero.
    12 Command Execution Time
    The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash.

    Differences

    When an action is initiated by a script, the emulators behave in several different ways:

    If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output.

    If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the CloseScript action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the Script action to complete.

    The Quit action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.)

    Normally, the AID actions (Clear, Enter, PF, and PA) will not complete until the host unlocks the keyboard. If the parameter to a String action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding.

    The AidWait toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The Wait(Output) action can then be used to delay a script until the host changes something on the screen, and the Wait(Unlock) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the AidWait toggle.

    Note that the Script action does not complete until the CloseScript action is called by the child process. This behavior is not affected by the state of the AidWait toggle.

    Basic Programming Strategies

    3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete.

    Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the Snap action. The Snap(Save) action saves a snapshot of the screen in a special buffer. Then the script can use Snap variants of the Ascii and Ebcdic actions (Snap(Ascii) and Snap(Ebcdic)) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, Snap(Wait Output) blocks the script until the host modifies the screen, specifically since the last call to Snap(Save). Thus a script can poll the screen efficiently by writing a loop that begins with Snap(Save) and ends with Snap(Wait Output).

    Script-Specific Actions

    The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, row and col coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]).
    AnsiText
    Outputs whatever data that has been output by the host in NVT mode since the last time that AnsiText was called. The data is preceded by the string "data: ", and has had all control characters expanded into C backslash sequences.

    This is a convenient way to capture NVT mode output in a synchronous manner without trying to decode the screen contents.

    Ascii(row,col,rows,cols)
    Ascii(row,col,length)
    Ascii(length)
    Ascii
    Outputs an ASCII text representation of the screen contents. Each line is preceded by the string "data: ", and there are no control characters.

    If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.)

    If three parameters are given, length characters are output, starting at the specified zero-origin row and column.

    If only the length parameter is given, that many characters are output, starting at the cursor position.

    If no parameters are given, the entire screen is output.

    The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the -charset option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f.

    AsciiField
    Outputs an ASCII text representation of the field containing the cursor. The text is preceded by the string "data: ".
    Connect(hostname)
    Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails.
    CloseScript(status)
    Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the Script action, the optional status is used as the return status of Script; if nonzero, Script will complete with an error, and if this script was invoked as part of login through the ibm_hosts file, the connection will be broken.
    ContinueScript([param])
    Allows a script that is waiting in a PauseScript action, below, to continue. The optional param string is output by the PauseScript action.
    Disconnect
    Disconnects from the host.
    Ebcdic(row,col,rows,cols)
    Ebcdic(row,col,length)
    Ebcdic(length)
    Ebcdic
    The same function as Ascii above, except that rather than generating ASCII text, each character is output as a 2-digit or 4-digit hexadecimal EBCDIC code.
    EbcdicField
    The same function as AsciiField above, except that it generates hexadecimal EBCDIC codes.
    Info(message)
    In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270.
    Expect(text[,timeout])
    Pauses the script until the specified text appears in the data stream from the host, or the specified timeout (in seconds) expires. If no timeout is specified, the default is 30 seconds. Text can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. Expect is valid only in NVT mode.
    MoveCursor(row,col)
    Moves the cursor to the specified zero-origin coordinates.
    PauseScript
    Stops a script until the ContinueScript action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to ContinueScript, if one is given.
    PrintText([command,]filter)
    Pipes an ASCII representation of the current screen image through the named filter, e.g., lpr.
    PrintText([html,][append,][replace,]file,filename)
    Saves the current screen contents in a file. With the html option, saves it as HTML, otherwise saves it as plain ASCII. The append option (the default) causes the data to be appended to the file if it already exists. The replace option causes the file to be overwritten instead.
    PrintText(html,string)
    Returns the current screen contents as HTML.
    Query(keyword)
    Returns state information. Keywords are:

    Keyword Output
    BindPluName BIND PLU returned by the host
    ConnectionState TN3270/TN3270E mode and submode
    CodePage Host code page
    Cursor Cursor position (row col)
    Formatted 3270 format state (formatted or unformatted)
    Host Host name and port
    LocalEncoding Local character encoding
    LuName Host name LU name
    Model 3270 model name (IBM-327x-n)
    ScreenCurSize Current screen size (rows cols)
    ScreenMaxSize Maximum screen size (rows cols)
    Ssl SSL state (secure or not-secure) and host validation state (host-verified or host-unverified)

    Without a keyword, Query returns each of the defined attributes, one per line, labeled by its name.

    ReadBuffer(Ascii)
    Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as SF(aa=nn[,...]), where aa is a field attribute type and nn is its value.

    Attribute
    Values
    c0 basic 3270
    20 protected
    10 numeric
    04 detectable
    08 intensified
    0c non-display
    01 modified
    41 highlighting
    f1 blink
    f2 reverse
    f4 underscore
    f8 intensify
    42 foreground
    f0 neutral black
    f1 blue
    f2 red
    f3 pink
    f4 green
    f5 turquoise
    f6 yellow
    f7 neutral white
    f8 black
    f9 deep blue
    fa orange
    fb purple
    fc pale green
    fd pale turquoise
    fe grey
    ff white
    43 character set
    f0 default
    f1 APL
    f8 DBCS

    Extended attributes (which do not take up display positions) are output as SA(aa=nn), with aa and nn having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute).

    In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks.

    ReadBuffer(Ebcdic)
    Equivalent to ReadBuffer(Ascii), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as GE(xx).
    Script(path[,arg...])
    Runs a child script, passing it optional command-line arguments. path must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the Source action.
    Snap
    Equivalent to Snap(Save) (see below).
    Snap(Ascii,...)
    Performs the Ascii action on the saved screen image.
    Snap(Cols)
    Returns the number of columns in the saved screen image.
    Snap(Ebcdic,...)
    Performs the Ebcdic action on the saved screen image.
    Snap(ReadBuffer)
    Performs the ReadBuffer action on the saved screen image.
    Snap(Rows)
    Returns the number of rows in the saved screen image.
    Snap(Save)
    Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other Snap actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically.
    Snap(Status)
    Returns the status line from when the screen was last saved.
    Snap(Wait[,timeout],Output)
    Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an Enter, PF or PA action), but has not finished updating the screen. This action is usually invoked in a loop that uses the Snap(Ascii) or Snap(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Snap action. The default is to wait indefinitely.

    Source(file)
    Read and execute commands from file. Any output from those commands will become the output from Source. If any of the commands fails, the Source command will not abort; it will continue reading commands until EOF.
    Title(text)
    Changes the wc3270 window title to text.
    Transfer(keyword=value,...)
    Invokes IND$FILE file transfer. See FILE TRANSFER below.
    Wait([timeout,] 3270Mode)
    Used when communicating with a host that switches between NVT mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(3270) is equivalent to Wait(3270Mode)

    Wait([timeout,] Disconnect)
    Pauses the script until the host disconnects. Often used to after sending a logoff command to a VM/CMS host, to ensure that the session is not unintentionally set to disconnected state.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] InputField)
    A useful utility for use at the beginning of scripts and after the Connect action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In NVT mode, waits until the host sends at least one byte of data.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait is equivalent to Wait(InputField).

    Wait([timeout,] NVTMode)
    Used when communicating with a host that switches between 3270 mode and NVT mode. Pauses the script or macro until the host negotiates NVT mode, then waits for a byte from the host as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(ansi) is equivalent to Wait(NVTMode).

    Wait([timeout,] Output)
    Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a Clear, Enter, PF or PA action), but has not finished updating the screen. Also used in non-blocking AID mode (see DIFFERENCES for details). This action is usually invoked in a loop that uses the Ascii or Ebcdic action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] Unlock)
    Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (toggle AidWait clear), to wait for a host command to complete. See DIFFERENCES for details).

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait(timeout, Seconds)
    Delays the script timeout seconds. Unlike the other forms of Wait, the timeout is not optional.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    The Transfer action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes ws3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes ws3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.
    WindowsCodePage
    Overrides the workstation code page used for ASCII file transfers. By default, the system ANSI code page is used.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the ws3270.ftMode resource.

    See Also

    expect(1)
    perl(1)
    ksh(1)
    x3270if(1)
    wc3270(1)
    ws3270(1)

    Version

    Version 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/ws3270/html/Windows-x3270if.html0000664000076500007650000001436013221600612016513 0ustar pdmpdm x3270if Manual Page

    x3270if Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Exit Status
    Environment
    See Also
    Copyright

    Name

    x3270if - command interface to wc3270 and ws3270

    Synopsis

    x3270if [option]... [ action ]
    x3270if -i

    Description

    x3270if provides an interface between scripts and the 3270 emulators wc3270 and ws3270.

    x3270if operates in one of two modes. In action mode, it passes a single action and parameters to the emulator for execution. The result of the action is written to standard output, along with the (optional) status of the emulator. (The action is optional as well, so that x3270if can just reports the emulator status.) In iterative mode, it forms a continuous conduit between a script and the emulator.

    The action takes the form:

    action-name(param[,param]...)

    The parentheses are manatory, and usually must be quoted when x3270if is called from a shell script.

    If any param contains a space or comma, it must be surrounded by double quotes.

    Options

    -s field
    Causes x3270if to write to stdout the value of one of the emulator status fields. Field is an integer in the range 0 through 11. The value 0 is a no-op and is used only to return exit status indicating the state of the emulator. The indices 1-11 and meanings of each field are documented on the wc3270-script(1) manual page. If an action is specified as well, the status field is written after the output of the action, separated by a newline. The -s option is mutually exclusive with the -S and -i options.
    -S
    Causes x3270if to write to stdout the value of all of the emulator status fields. If an action is specified as well, the status fields are written after the output of the action, separated by a newline. The -S option is mutually exclusive with the -s and -i options.
    -i
    Puts x3270if in iterative mode. Data from x3270if's standard input is copied to the emulator's script input; data from the emulator's script output is copied to x3270if's standard output. The -i option is mutually exclusive with the -s and -S options. x3270if runs until it detects end-of-file on its standard input or on the output from the emulator. (This mode exists primarily to give expect(1) a process to run, on systems which do not support bidirectional pipes.)
    -t port
    Causes x3270if to use a TCP socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the -scriptport option.
    -v
    Turns on verbose debug messages, showing on stderr the literal data that is passed between the emulator and x3270if.

    Exit Status

    In action mode, if the requested action succeeds, x3270if exits with status 0. If the action fails, x3270if exits with status 1. In iterative mode, x3270if exits with status 0 when it encounters end-of-file. If there is an operational error within x3270if itself, such as a command-line syntax error, missing environment variable, or an unexpectedly closed pipe, x3270if exits with status 2.

    Environment

    When a script is run as a child process of one of the emulators via the Script action, the emulator passes information about how to control it in environment variables.

    The emulator will pass the scriptport port number encoded as text in the X3270PORT environment variable. x3270if will use that value as if it had been passed to it via the -t option.

    See Also

    wc3270(1), ws3270(1), wc3270-script(1)

    Copyright

    Copyright © 1999-2009, 2017 Paul Mattes.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES `AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/ws3270/html/Wishlist.html0000664000076500007650000000124113221577163015577 0ustar pdmpdm The ws3270 Wish List

    The ws3270 Wish List

    Here is a list of some of the more interesting suggestions and requests made for ws3270. You may also take this as a list of functions that are definitely not in this version of ws3270.

    There is no guarantee that anyone is actively working on these, but feel free to yourself...

    • (nothing at the moment...)
    suite3270-3.6/ws3270/html/ws3270-man.html0000664000076500007650000013006513221600611015477 0ustar pdmpdm ws3270 Manual Page

    ws3270 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Character Sets
    NVT Mode
    Toggles
    Actions
    File Transfer
    The PrintText Action
    Nested Scripts
    Passthru
    Proxy
    Resources
    See Also
    Copyrights
    Version

    Name

    ws3270 - IBM host access tool

    Synopsis

    ws3270 [options] [host]
    ws3270 [options] session-file.ws3270

    Description

    ws3270 opens a telnet connection to an IBM host, then allows a script to control the host login session. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The full syntax for host is:
    [prefix:]...[LUname@]hostname[:port][=accept]

    Prepending a P: onto hostname causes the connection to go through the telnet-passthru service rather than directly to the host. See PASSTHRU below.

    Prepending an S: onto hostname removes the "extended data stream" option reported to the host. See -tn below for further information.

    Prepending an N: onto hostname turns off TN3270E support for the session.

    Prepending an L: onto hostname causes ws3270 to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if ws3270 was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the L: prefix should not be used.

    Prepending a Y: onto hostname causes ws3270 to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options.

    Prepending an A: onto hostname is equivalent to setting the -nvt option; it forces an NVT-mode session instead of a 3270-mode session.

    A specific Logical Unit (LU) name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.)

    The hostname may optionally be placed inside square-bracket characters `[' and `]'. This will prevent any colon `:' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames.

    The port to connect to defaults to telnet. This can be overridden with the -port option, or by appending a port to the hostname with a colon `:'. (For compatability with previous versions of ws3270 and with tn3270(1), the port may also be specified as a second, separate argument.)

    An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`='). The accept name can also be specified with the -accepthostname option.

    Options

    ws3270 understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
    -clientcert name
    Specifies the name of a client certificate to provide to the host.
    -charset name
    Specifies an EBCDIC host character set. See CHARACTER SETS below.
    -clear toggle
    Sets the initial value of toggle to false. The list of toggle names is under TOGGLES below.
    -connecttimeout seconds
    Specifies the time that ws3270 will wait for a host connection to complete.
    -devname name
    Specifies a device name (workstation ID) for RFC 4777 support.
    -httpd [addr:]port
    Specifies a port and optional address to listen on for HTTP connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080.

    Note that this option is mutually-exclusive with the -scriptport option and disables reading commands from standard input.

    -loginmacro Action(arg...) ...
    Specifies a macro to run at login time.
    -localcp codepage
    Specifies the Windows code page to use for local I/O. The default is to use the system's ANSI code page.
    -minversion version
    The minimum required version of ws3270, e.g., 3.6ga4. If the running version is less than the specified version, ws3270 will abort. The format of a version is major.minortypeiteration. type is ignored, and minor and iteration can be omitted.
    -model name
    The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted:

    The first part is the base model, which is either 3278 or 3279. 3278 specifies a monochrome (green on black) 3270 display; 3279 specifies a color 3270 display.

    The second part is the model number, which specifies the number of rows and columns. Model 4 is the default.

    Model Number
    Columns
    Rows
    2
    80
    24
    3
    80
    32
    4
    80
    43
    5
    132
    27

    Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway.

    The default model is 3279-4.

    -noverifycert
    For SSL/TLS connections, do not verify the host certificate.
    -nvt
    Start in NVT mode instead of waiting for the host to send data, and make the default terminal type xterm.
    -oversize colsxrows
    Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "ws3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing.
    -port n
    Specifies a different TCP port to connect to. n can be a name from /etc/services like telnet, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.)
    -proxy type:host[:port]
    Causes ws3270 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -scriptport [addr:]port
    Specifies a port and optional address to listen on for scripting connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081.

    Note that this option is mutually-exclusive with the -httpd option and disables reading commands from standard input.

    -scriptportonce
    Allows ws3270 to accept only one script connection. When that connection is broken, ws3270 will exit.
    -set toggle
    Sets the initial value of toggle to true. The list of toggle names is under TOGGLES below. The -p option of x3270if causes it to use this socket, instead of pipes specified by environment variables.
    -tn name
    Specifies the terminal name to be transmitted over the telnet connection. The default name is IBM-model_name-E, for example, IBM-3278-4-E.

    Some hosts are confused by the -E suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an s: on the hostname, or setting the "ws3270.extended" resource to "false", removes the -E from the terminal name when connecting to such hosts.

    The name can also be specified with the "ws3270.termName" resource.

    -trace
    Turns on data stream and event tracing at startup. The default trace file name is x3trc.pid.txt in the current directory.
    -tracefile file
    Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file.
    -tracefilesize size
    Places a limit on the size of a trace file. If this option is not specified, or is specified as 0 or none, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of size can have a K or M suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started.
    -user name
    Specifies the user name for RFC 4777 support.
    -utf8
    Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage.
    -v
    Display the version and build options for ws3270 and exit.
    -verifycert
    For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a y: prepended to the hostname when connecting.
    -xrm "ws3270.resource: value"
    Sets the value of the named resource to value. Resources control less common ws3270 options, and are defined under RESOURCES below.

    Character Sets

    The -charset option or the "ws3270.charset" resource controls the EBCDIC host character set used by ws3270. Available sets include:

    Charset Name
    Host Code Page
    belgian
    500
    belgian-euro
    1148
    bracket
    037
    brazilian
    275
    chinese-gb18030
    1388
    cp1047
    1047
    cp870
    870
    finnish
    278
    finnish-euro
    1143
    french
    297
    french-euro
    1147
    german
    273
    german-euro
    1141
    greek
    423
    hebrew
    424
    icelandic
    871
    icelandic-euro
    1149
    italian
    280
    italian-euro
    1144
    japanese-kana
    930
    japanese-latin
    939
    norwegian
    277
    norwegian-euro
    1142
    russian
    880
    simplified-chinese
    935
    slovenian
    870
    spanish
    284
    spanish-euro
    1145
    swedish
    278
    swedish-euro
    1143
    thai
    1160
    traditional-chinese
    937
    turkish
    1026
    uk
    285
    uk-euro
    1146
    us-euro
    1140
    us-intl
    037

    The default character set is bracket, which is useful for common U.S. IBM hosts which use EBCDIC codes AD and BD for the `[' and `]' characters, respectively.

    Note that any of the host code pages listed above can be specified by adding cp to the host code page, e.g., cp037 for host code page 037. Also note that the code pages available for a given version of ws3270 are displayed by the -v command-line option.

    NVT Mode

    Some hosts use an ASCII front-end to do initial login negotiation, then later switch to 3270 mode. ws3270 will emulate an ANSI X3.64 terminal until the host places it in 3270 mode (telnet BINARY and SEND EOR modes, or TN3270E mode negotiation).

    If the host later negotiates to stop functioning in 3270 mode, ws3270 will return to NVT emulation.

    In NVT mode, ws3270 supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources:

    Mode/Character Resource Default
    Translate CR to NL ws3270.icrnl true
    Translate NL to CR ws3270.inlcr false
    Erase previous character ws3270.erase ^?
    Erase entire line ws3270.kill ^U
    Erase previous word ws3270.werase ^W
    Redisplay line ws3270.rprnt ^R
    Ignore special meaning of next character ws3270.lnext ^V
    Interrupt ws3270.intr ^C
    Quit ws3270.quit ^\
    End of file ws3270.eof ^D

    Toggles

    ws3270 has a number of configurable modes which may be selected by the -set and -clear options. These names can also be used as the first parameter to the Toggle action, and are the names of resources that can be used to set or clear the value of each toggle at start-up.
    aidWait
    Changes the behavior of actions that send an AID to the host (Enter, Clear, PA and PF). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the Wait(Unlock) action to wait for the unlock.
    blankFill
    If set, ws3270 modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying `lock-up' that often occurs when inserting into an field with (apparent) space at the end.
    lineWrap
    If set, the NVT terminal emulator automatically assumes a NEWLINE character when it reaches the end of a line.
    screenTrace
    Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file .
    trace
    Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file . The directory for the trace file can be changed with the "ws3270.traceDir" resource. Script commands are also traced.

    Actions

    Here is a complete list of basic ws3270 actions. Script-specific actions are described on the wc3270-script(1) manual page. )

    Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response.

    *Attn attention key
    BackSpace move cursor left (or send ASCII BS)
    BackTab tab to start of previous input field
    CircumNot input "^" in NVT mode, or "¬" in 3270 mode
    *Clear clear screen
    *Connect(host) connect to host
    *CursorSelect Cursor Select AID
    Delete delete character under cursor (or send ASCII DEL)
    DeleteField delete the entire field
    DeleteWord delete the current or previous word
    *Disconnect disconnect from host
    Down move cursor down
    Dup duplicate field
    *Enter Enter AID (or send ASCII CR)
    Erase erase previous character (or send ASCII BS)
    EraseEOF erase to end of current field
    EraseInput erase all input fields
    Execute(cmd) execute a command in a shell
    FieldEnd move cursor to end of field
    FieldMark mark field
    HexString(hex_digits) insert control-character string
    Home move cursor to first input field
    Insert set insert mode
    *Interrupt send TELNET IP to host
    Key(keysym) insert key keysym
    Key(0xxx) insert key with character code xx
    Left move cursor left
    Left2 move cursor left 2 positions
    MonoCase toggle uppercase-only mode
    MoveCursor(row, col) move cursor to zero-origin (row,col)
    Newline move cursor to first field on next line (or send ASCII LF)
    NextWord move cursor to next word
    *PA(n) Program Attention AID (n from 1 to 3)
    *PF(n) Program Function AID (n from 1 to 24)
    PreviousWord move cursor to previous word
    PrintText([gdi|wordpad,][dialog|nodialog,][printer-name]) print screen text on printer
    Quit exit ws3270
    Redraw redraw window
    Reset reset locked keyboard
    Right move cursor right
    Right2 move cursor right 2 positions
    *Script(command[,arg...]) run a script
    *String(string) insert string (simple macro facility)
    Tab move cursor to next input field
    Toggle(option[,set|clear]) toggle an option
    ToggleInsert toggle insert mode
    ToggleReverse toggle reverse-input mode
    *Transfer(option=value...') file transfer
    Up move cursor up

    Note that certain parameters to ws3270 actions (such as the names of files and keymaps) are subject to substitutions:

    The character ~ at the beginning of a string is replaced with the user's home directory.

    Environment variables are substituted using the Unix shell convention of $name or ${name}.

    Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    The Transfer action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes ws3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes ws3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.
    WindowsCodePage
    Overrides the workstation code page used for ASCII file transfers. By default, the system ANSI code page is used.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the ws3270.ftMode resource.

    The PrintText Action

    The PrintText produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the name of the printer to use. The font defaults to Courier New and the point size defaults to auto (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the printTextFont and printTextSize resources, respectively. Unless the wordpad keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. printTextHorizontalMargin defines the left- and right-hand margins. printTextVerticalMargin defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with mm or cm. printTextOrientation defines the page orientation as portrait or landscape.

    Multiple arguments can include keywords to control the output of PrintText:

    gdi
    Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default).
    wordpad
    Create an RTF file and run WordPad to print it. (This was the former default).
    dialog
    In GDI mode, pop up the Windows print dialog.
    nodialog
    In GDI mode, skip the usual Windows print dialog. (This is the default.)
    file filename
    Save the output in a file.
    html
    Save the output as HTML. This option implies file.
    rtf
    Save the output as RichText. This option implies file. The font defaults to Courier New and the point size defaults to 8. These can be overridden by the printTextFont and printTextSize resources, respectively.
    modi
    Render modified fields in italics.
    caption text
    Add the specified text as a caption above the output. Within text, the special sequence %T% will be replaced with a timestamp.

    Nested Scripts

    There are several types of nested script functions available.
    The String Action
    The simplest method for nested scripts is provided via the String action. The arguments to String are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the AID code to the host, ws3270 will wait for the host to unlock the keyboard before further processing the string.)
    \b Left
    \exxxx EBCDIC character in hex
    \f Clear*
    \n Enter*
    \pan PA(n)*
    \pfnn PF(nn)*
    \r Newline
    \t Tab
    \T BackTab
    \uxxxx Unicode character in hex
    \xxxxx Unicode character in hex

    Note that the numeric values for the \e, \u and \x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if ws3270 is built with DBCS support and the host allows DBCS input in the current field.

    Note: The strings are in ASCII and converted to EBCDIC, so beware of inserting control codes.

    There is also an alternate form of the String action, HexString, which is used to enter non-printing data. The argument to HexString is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent EBCDIC characters, which are entered into the current field. In NVT mode, the hexadecimal data represent ASCII characters, which are sent directly to the host.

    The Script Action
    This action causes ws3270 to start a child process which can execute ws3270 actions. ws3270 listens for connections from the child process on a dynamically-generated TCP port. The Script action is fully documented in wc3270-script(1).

    Passthru

    ws3270 supports the Sun telnet-passthru service provided by the in.telnet-gw server. This allows outbound telnet connections through a firewall machine. When a p: is prepended to a hostname, ws3270 acts much like the itelnet(1) command. It contacts the machine named internet-gateway at the port defined in /etc/services as telnet-passthru (which defaults to 3514). It then passes the requested hostname and port to the in.telnet-gw server.

    Proxy

    The -proxy option or the ws3270.proxy resource causes ws3270 to use a proxy server to connect to the host. The syntax of the option or resource is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    Resources

    Certain ws3270 options can be configured via resources. Resources are defined by -xrm options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in ws3270 are:

    Resource Default Option Purpose
    blankFill False -set blankFill Blank Fill mode
    charset bracket -charset EBCDIC character set
    dbcsCgcsgid     Override DBCS CGCSGID
    dsTrace False -trace Data stream tracing
    eof ^D   NVT-mode EOF character
    erase ^H   NVT-mode erase character
    extended True   Use 3270 extended data stream
    eventTrace False -trace Event tracing
    icrnl False   Map CR to NL on NVT-mode input
    inlcr False   Map NL to CR in NVT-mode input
    intr ^C   NVT-mode interrupt character
    kill ^U   NVT-mode kill character
    lineWrap False -set lineWrap NVT line wrap mode
    lnext ^V   NVT-mode lnext character
    localCp (system ANSI code page) -localcp Windows code page for local I/O
    m3279 (note 1) -model 3279 (color) emulation
    marginedPaste False -set marginedPaste Keep left margin when pasting
    monoCase False -set monoCase Mono-case mode
    numericLock False   Lock keyboard for numeric field error
    oerrLock False   Lock keyboard for input error
    overlayPaste False -set overlayPaste Overlay protected fields when pasting
    oversize   -oversize Oversize screen dimensions
    port telnet -port Non-default TCP port
    quit ^\   NVT-mode quit character
    rprnt ^R   NVT-mode reprint character
    sbcsCgcsgid     Override SBCS CGCSGID
    secure False   Disable "dangerous" options
    termName (note 2) -tn TELNET terminal type string
    traceFile (note 3) -tracefile File for trace output
    werase ^W   NVT-mode word-erase character

    Note 1: m3279 defaults to False. It can be forced to True with the proper -model option.

    Note 2: The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as IBM-3279-2-E. Note also that when TN3270E mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities.

    Note 3: The default trace file is x3trc.pid.txt in the current directory.

    If more than one -xrm option is given for the same resource, the last one on the command line is used.

    See Also

    wc3270-script(1), telnet(1), tn3270(1)
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    ws3270 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/ws3270/ibm_hosts.man.m40000664000076500007650000001122513221577163015145 0ustar pdmpdmdnl Copyright (c) 1994-2009, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(IBM_HOSTS,5,XX_DATE) XX_SH(Name) ibm_hosts XX_DASHED() host database for x3270 and c3270 XX_SH(Synopsis) /usr/lib/X11/x3270/ibm_hosts XX_SH(Description) The XX_FB(ibm_hosts) file contains information regarding IBM hosts on the network. An XX_FI(IBM host) is a host which can communicate with a 3270 terminal emulator such as XX_FB(x3270) or XX_FB(c3270). Each line defines a name in the following format (optional fields are shown in brackets): XX_LP XX_FI(name) XX_FI(type) [XX_FI(opt):]...[XX_FI(luname)@]XX_FI(hostname)[:XX_FI(port)] [XX_FI(actions)] XX_LP Items are separated by any number of blanks and/or TAB characters. A line beginning with `#' is taken as a comment (note that `#' anywhere else on a line does XX_FI(not) indicate a comment). XX_LP The XX_FI(name) field is a mnemonic used to identify the host. XX_LP The XX_FI(type) field is a keyword that indicates the type of entry. The value XX_FB(primary) means that the XX_FI(name) will be included in host-selection menus that may be displayed by a 3270 emulator. The value XX_FB(alias) means that the XX_FI(name) will not be included in menus, but will still be accepted as valid input when a host name is required. XX_LP The XX_FI(hostname) field is the Internet hostname or dot-notation Internet address of the host. XX_LP The XX_FI(hostname) can `include' ``s:'' or ``p:'' prefixes, e.g., XX_FB(s:finicky) (see the XX_LINK(x3270-man.html,XX_FI(x3270)(1)) or XX_LINK(c3270-man.html,XX_FI(c3270)(1)) man page sfor details). It can also include an LU name, separated by an ``@'' character, e.g., XX_FB(oddlu@bluehost). Finally, it can include a non-default XX_FI(port) number, appended to the XX_FI(hostname) with a colon ``:'' character, e.g., XX_FB(bluehost:97). (For compatability with earlier versions of XX_FI(x3270), the XX_FI(port) can also be separated by a slash ``/'' character.) XX_LP The optional XX_FI(actions) field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., XX_FB(PF(1)), it is unmodified; otherwise it is taken as the parameter to the XX_FB(String()) action. The XX_FI(actions) are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. XX_SH(Example) Given the following XX_FB(ibm_hosts) file: XX_LP XX_RS(`mvs primary mvs-host XX_BR tso alias mvs-host XX_BR mvs2 primary mvs-host:4012 XX_BR vm primary vtam Tab() String(3) Enter() ') A 3270 emulator will display four names (XX_FB(mvs), XX_FB(mvs2), XX_FB(afhost) and XX_FB(vm)) on its hosts menu. The names XX_FB(mvs) and XX_FB(tso) will cause connections to the host XX_FB(mvs-host). The name XX_FB(mvs2) will also cause a connection to XX_FB(mvs-host), but to port 4012 rather than the emulator's default port (usually 23). The name XX_FB(vm) will cause the 3270 emulator to connect to the host XX_FB(vtam) (presumably some sort of host-selection front-end), enter the string ``3'' on the second data-entry field on the screen, and send the Enter XX_SM(AID) sequence. XX_SH(Files) /usr/lib/X11/x3270/ibm_hosts XX_SH(See Also) XX_LINK(x3270-man.html,x3270(1)), XX_LINK(c3270-man.html,c3270(1)) suite3270-3.6/ws3270/LICENSE.txt0000664000076500007650000000346513221577163013774 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/ws3270/m4man0000775000076500007650000000342013221577163013102 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/ws3270/Makefile0000775000076500007650000000424313221577163013607 0ustar pdmpdm# Copyright (c) 2016 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH-based Makefile for ws3270, can build either 32- or 64-bit ifdef WIN64 objdir = ../obj/win64/ws3270 else objdir = ../obj/win32/ws3270 endif top = ../../.. this = $(top)/ws3270 export VPATH = $(this):$(top)/Common/Win32:$(top)/Common/s3270:$(top)/Common export TOP = $(top) export THIS = $(this) MAKEINC = -I$(this) -I$(top)/Common -I$(top)/Common/Win32 all: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clean: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ clobber: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ depend: $(objdir) cd $(objdir) && $(MAKE) $(MAKEINC) -f $(this)/Makefile.obj $@ $(objdir): mkdir -p $(objdir) suite3270-3.6/ws3270/Makefile.aux0000664000076500007650000000513113221577163014375 0ustar pdmpdm# Copyright (c) 1995-2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for ws3270 PRODUCT = ws3270 all: @echo "Must pick a specific make target." DOCS = html/$(PRODUCT)-man.html html/ReleaseNotes.html html/Resources.html \ html/SSL.html html/wc3270-script.html html/Windows-x3270if.html src.tgz: $(DOCS) Makefile.aux MANDEP = html.m4 m4man Makefile.aux version.txt MKHTML = ./m4man -t html -p $(PRODUCT) man: $(DOCS) html/$(PRODUCT)-man.html: x3270.man.m4 hostname.inc $(MANDEP) $(MKHTML) -n $(PRODUCT) -o $@ x3270.man.m4 html/wc3270-script.html: x3270-script.man.m4 ft.inc $(MANDEP) $(MKHTML) -n ws3270-script -o $@ x3270-script.man.m4 html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ html/Resources.html: resource-body make-resource-doc.pl version.txt ./make-resource-doc.pl -o $@ $(PRODUCT) $(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) FALLBACKS = fb-common fallbacks.c: $(MKFB) $(FALLBACKS) $(RM) $@ ./$(MKFB) -c -o $@ $(filter-out $(MKFB),$^) $(MKFB): mkfb.c $(NATIVECC) -DFOR_WIN32 -I$(THIS) -MMD -MP -o $@ $^ ws3270.exe.manifest: mkmanifest.sh version.txt manifest.tmpl sh $< $(filter %.txt,$^) $(filter %.tmpl,$^) ws3270 "ws3270 scripting terminal emulator" $(WIN64) >$@.tmp /bin/mv -f $@.tmp $@ ws3270res.o: ws3270.rc ws3270.ico Makefile ws3270.exe.manifest $(WINDRES) -i $< -o $@ ws3270.exe: $(OBJECTS) Makefile $(DEP3270) $(DEP32XX) $(DEP3270STUBS) $(CC) -o ws3270.exe $(CFLAGS) $(OBJECTS) $(LD3270) $(LD32XX) $(LD3270STUBS) $(LIBS) x3270if.exe: x3270if.o $(DEP32XX) $(CC) -o $@ $(CFLAGS) x3270if.o $(LD32XX) -lws2_32 wversion.o: mkwversion.sh version.txt sh $< ws3270 $(CC) $(filter %.txt,$^) clean: rm -f *.o mkfb mkfb.exe fallbacks.c ws3270.exe.manifest clobber: clean rm -f $(PROGS) *.d # Include auto-generated eependencies -include $(OBJS:.o=.d) x3270if.d mkfb.d suite3270-3.6/ws3270/make-resource-doc.pl0000775000076500007650000001752213221577163016015 0ustar pdmpdm#!/usr/bin/env perl use strict; my $outfile; if ($ARGV[0] eq "-o") { die "Missing filename after -o.\n" unless ($#ARGV >= 1); shift; $outfile = $ARGV[0]; shift; } die "Must specify product.\n" unless ($#ARGV >= 0); my $product = $ARGV[0]; # Figure out the version name. my $version; open VERSION, ") { chomp; if (/^version="(.*)"/) { $version=$1 } } close VERSION; # Sort out the product, and %approd. my %approd; $approd{'a'} = 1; if ($product eq "x3270") { $approd{'u'} = 1; } elsif ($product eq "c3270") { $approd{'C'} = 1; $approd{'u'} = 1; } elsif ($product eq "s3270") { $approd{'S'} = 1; $approd{'u'} = 1; } elsif ($product eq "tcl3270") { $approd{'u'} = 1; } elsif ($product eq "wc3270") { $approd{'C'} = 1; $approd{'w'} = 1; } elsif ($product eq "ws3270") { $approd{'S'} = 1; $approd{'w'} = 1; } else { die "Unknown product '$product'.\n"; } my $prefix = $product; $prefix =~ s/3270//; $approd{$prefix} = 1; # Dump out %approd. #foreach my $k (keys %approd) { # print STDERR "$k: $approd{$k}\n" #} my %types = ( i => 'Integer', b => 'Boolean', s => 'String' ); # Set up output file. my $out; my $tmpfile; if ($outfile) { $tmpfile = "/tmp/mkr" . $$; unlink $tmpfile; open TMPFILE, ">", $tmpfile or die "Can't open $tmpfile.\n"; $out = *TMPFILE; } else { $out = *STDOUT; } # From here on out, unlink the tempfile if we bail. END { unlink $tmpfile if ($tmpfile); } # Unlink the tempfile if we get a termination signal. sub sighandler { unlink $tmpfile if ($tmpfile); exit(0); } $SIG{'INT'} = \&sighandler; $SIG{'QUIT'} = \&sighandler; $SIG{'HUP'} = \&sighandler; $SIG{'TERM'} = \&sighandler; # Remove HTML attributes from a resource name. sub nix { my $txt = shift(@_); $txt =~ s/<\/?[\w.]+>//g; return $txt; } # The indices. my @index; # overall index my @c_index; # configuration index my @a_index; # appearance index my @n_index; # NVT-mode index my @p_index; # protocol index my @i_index; # interaction index my @s_index; # security index my @t_index; # tracing index my @o_index; # other index my @d_index; # deprecated index my @indices = ( \@c_index, \@a_index, \@n_index, \@p_index, \@i_index, \@s_index, \@t_index, \@o_index, \@d_index ); my @index_name = ( "Basic Configuration", "Appearance", "NVT-Mode", "Protocol", "Terminal Interaction", "Security", "Tracing", "Other", "Deprecated" ); # The elements of an entry. my $name; my @names; my $applies; my $type; my $default; my @switch; my @option; my $description; my $groups; sub dump { if ($name && $applies) { # The minimum set of required attributes are type and description. die "$name missing type\n" if (!$type); die "$name missing description\n" if (!$description); foreach my $n (@names) { # Add this name to the general index. push @index, $n; # Add this name to the specified indices... if (defined($groups)) { foreach (split /\s+/, $groups) { if ($_ eq "c") { push @c_index, $n; } elsif ($_ eq "a") { push @a_index, $n; } elsif ($_ eq "n") { push @n_index, $n; } elsif ($_ eq "p") { push @p_index, $n; } elsif ($_ eq "i") { push @i_index, $n; } elsif ($_ eq "s") { push @s_index, $n; } elsif ($_ eq "t") { push @t_index, $n; } elsif ($_ eq "d") { push @d_index, $n; } else { die "Unknown group '$_'\n"; } } } else { # ... or to the 'other' index. push @o_index, $n; } my $tgt = nix($n); print $out "\nName: $product.$n
    \n"; } print $out "Type: $type
    \n"; if ($default) { print $out "Default: $default
    \n"; } if (@switch) { my $comma; print $out "Command Line:"; foreach my $s (@switch) { print $out "$comma $s\n"; $comma = ","; } print $out "
    \n"; } if ($product eq "x3270") { foreach my $o (@option) { print $out "Option: $o
    \n"; } } $description =~ s/%p%/$product/g; while ($description =~ /%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $description =~ s/%-[\w.<>\/*]+%/$product.$full<\/a>/; } #$description =~ s/%-([\w.]+)%/$product.\1<\/tt><\/a>/g; print $out "Description:
    \n"; print $out "

    $description

    \n"; } undef $name; undef @names; undef $applies; undef $type; undef $default; undef @switch; undef @option; undef $description; undef $groups; } print $out <<"EOS"; $product Resources

    $product Resources

    EOS my $on = 1; my $in_desc; my $in_intro; my @ifstack; while () { chomp; # Skip blank lines. next if (/^\s*$/); # Handle if/endif. if (/^if\s+(.*)/) { push @ifstack, $on; my $desc_applies; foreach (split /\s+/, $1) { $desc_applies = 1 if ($approd{$_}); } $on = $desc_applies if ($ifstack[$#ifstack]); next; } elsif (/^else/) { die "dangling else\n" if ($#ifstack < 0); $on = !$on if ($ifstack[$#ifstack]); next; } elsif (/^endif/) { die "dangling endif\n" if ($#ifstack < 0); $on = pop(@ifstack); next; } next unless $on; # Handle desc. if ($in_desc) { if (/^\./) { undef $in_desc; } else { $description .= $_ . "\n"; } next; } # Handle intro. if (/^intro/) { $in_intro = 1; next; } elsif ($in_intro) { if (/^\./) { undef $in_intro; print $out "

    Alphabetical Resource List

    \n"; } else { s/%p%/$product/g; while (/%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $_ =~ s/%-[\w.<>\/*]+%/
    $product.$full<\/a>/; } print $out "$_\n"; } next; } # Handle normal keywords. if (/name\s(.*)/) { &dump; @names = split /\s+/, $1; $name = $names[0]; next; } if (/applies\s(.*)/) { undef $applies; foreach (split /\s+/, $1) { $applies = 1 if ($approd{$_}); } next; } if (/groups\s(.*)/) { $groups = $1; next; } if (/type\s([^\s]*)/) { $type = $types{$1}; next; } if (/default\s(.*)/) { $default = $1; next; } if (/switch\s(.*)/) { push @switch, $1; next; } if (/option\s(.*)/) { push @option, $1; next; } if (/^desc/) { $in_desc = 1; next; } last if (/^EOF$/); die "Unknown keyword '$_'.\n"; } &dump; print $out <Index of All Resources EOT my $ix = 0; foreach my $i (@index) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; my $q = 0; foreach my $j (@indices) { my @arr = @$j; if ($#arr >= 0) { print $out "

    $index_name[$q] Resources

    \n"; print $out "\n"; my $ix = 0; foreach my $i (@arr) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; } $q = $q + 1; } print $out "

    $product version $version ", `date`, "\n"; print $out "\n"; # Wrap up the outfile. if ($outfile) { close TMPFILE; system("mv $tmpfile $outfile") == 0 or die "Can't rename $tmpfile to $outfile.\n"; } suite3270-3.6/ws3270/mkstand.bash0000775000076500007650000000100313221577163014436 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/ws3270/mkversion.sh0000775000076500007650000000466413221577163014527 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat <Resources are used to configure %p%. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into %p%.
    • if x
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The %p% app-defaults file (only if %p% is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
      endif
    • If a session file foo.%p% is specified on the command line, its contents are applied. if x c Otherwise, if the %p% profile (~/.%p%pro) exists, it is read and its contents are applied. endif These definitions override resource values defined by if x X11 methods and endif compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example %-bsdTm% can be set by the following command-line option:
         -xrm "%p%.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file if x (app-defaults file, profile or session file) else if c (profile or session file) else (session file) endif endif has the following syntax.
    • Each definition consists of:
          %p%.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • if x C
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          %p%.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        
    • endif
    . name acceptHostname applies a type s groups s switch -accepthostname description Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.) . name acs applies c type b default true desc When true, %p% will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, %p% will use Unicode box-drawing characters. . name activeIcon applies x groups a type b default false switch -activeicon description When true, %p%'s icon becomes a live miniature of the screen display. . name aidWait applies x c s tcl type b default false switch -set aidWait switch -clear aidWait desc When true, %p% will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll %p%'s status until it shows that the keyboard is no longer unlocked. . name allBold applies c groups a type s default auto switch -allbold desc When true, %p% will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation. . name allowResize applies x type b default true description When true, the %p% window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it. . name altCursor applies x wc groups a type b default false switch -set altCursor switch -clear altCursor option Options -> Toggles -> Underline Cursor option Options -> Toggles -> Block Cursor description When true, this causes %p% to use the alternate (underscore) cursor. When false, it will use a block cursor. . name altScreen applies c type s switch -altscreen desc Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-defScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name aplCircledAlpha applies x groups a type b default false description When set to true, allows %p% to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with %p%.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point. . name aplMode applies x type b default false switch -apl desc Enables %p% APL mode. APL mode appends apl to the list of names in %-keymap% (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets %-composeMap% to apl (allowing Compose key sequences to construct complex APL symbols), and sets %-charset% to apl (allowing the display of APL symbols using several of the 3270 fonts). . name asciiBoxDraw applies C type b default false desc When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width. . name autoShortcut applies wc type b default false switch -S switch +S desc When true, %p% will run in auto-shortcut mode. In auto-shortcut mode, %p% automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x. . name background applies x groups a type s default white switch -bg switch -rv description The background color for menus, buttons, and on monochrome X11 displays, the emulator window. . name bellMode applies wc type s groups i description Controls how %p% responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the %p% window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides %-visualBell%. . name bellVolume applies x type i default 0 description Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by %-visualBell%, which if true, will replace the bell with a flash of the screen. . name bindLimit applies a groups p type b default true description When true, %p% will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not. . name bindUnlock applies a type b groups p default false description When true, %p% will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing %p% to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op. . name blankFill applies a groups i type b default false option Options -> Toggles -> Blank Fill switch -set blankFill switch -clear blankFill description When true, in 3270 mode %p% will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals. . name boldColor applies x groups a default green type s description This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan. . name bsdTm applies a groups p type b default false description Defines %p%'s response to the TELNET DO TIMING MARK option. When set to false, %p% will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, %p% will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of %p%. In either case, %p% will never respond to a DONT TIMING MARK option. . name caDir applies u type s groups s switch -cadir description Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name caFile applies u type s groups s switch -cafile description Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name cbreak applies c type b default false switch -cbreak desc If true, %p% will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters. . name certFile applies u groups s type s switch -certfile desc Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by %-certFileType%. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%.

    On the Mac, the file must be in PKCS12 format. . name certFileType applies u groups s type s default pem switch -certfiletype desc Gives the type of the certificate file specified by %-certFile%. The value can be pem or asn1. (OpenSSL only) . name chainFile applies u groups s type s switch -chainfile desc Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%. (OpenSSL only) . name charClass applies x type s desc Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name. . name charset applies a groups c type s default bracket switch -charset option Options -> Character Set description This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by %p%, use the -v command-line option. if wc

    Note that %p% DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language. endif . name clientCert applies w groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store. . name clientCert applies u groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only) . name color8 applies a groups p type b default false description If true, %p% will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported. if c

    This setting will also cause %p% to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen. endif . name colorBackground applies x groups a type s default black description The background color for the emulator window. This resource is used only on color X11 displays when %-model% specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by %-colorScheme%. . name colorScheme applies x groups a type s default default option Options -> Color Scheme description Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when %-model% specifies a 3279 display. %-colorScheme% is just the name of the color scheme. The actual color scheme definition for color scheme foo is %-colorScheme.foo%. . name colorScheme.foo applies x groups a type s description An individual color scheme definition. I.e., to define color scheme foo, a resource named %p%.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer. . name commandTimeout applies tcl type i description Defines the number of seconds to wait for a command to complete before failing it with a timeout error. . name composeMap applies x C type s default latin1 description Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource %-composeMap.foo%. . name composeMap.foo applies x C type s description An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive. . name confDir applies a type s if u default /usr/local/etc/x3270 else default . endif desc Defines the %p% configuration directory, where %p% will search for the ibm_hosts file by default. (See %-hostsFile%.) if w

    The default is to search the directory where %p% was started, which usually its installation directory. endif . name connectFileName applies x type s default ~/.x3270connect description Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of %p% that run under the same username. . name connectTimeout applies a type i groups c switch -connecttimeout description Specifies a timeout, in seconds, that %p% will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that %p% will wait for the lesser of the two times (the specified timeout and the system-defined timeout). . name consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite applies wc groups a type i desc Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource %p%.consoleColorForHostColorGreen or the resource %p%.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the %p% Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with %p%.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         %p%.consoleColorForHostColorNeutralBlack: 15
         %p%.consoleColorForHostColorNeutralWhite: 0
        
    . name crosshair applies x C groups a type b default false option Options -> Toggles -> Crosshair Cursor switch -set crosshair switch -clear crosshair description When true, causes %p% to display a crosshair over the cursor: lines extending with height and width of the screen. . name crosshairColor applies x C groups a type s default purple description Defines the color used for the crosshair cursor (see %-crosshair%). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15
    . name cursesColorForDefault cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified applies c groups a type s desc Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    %p% Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)
    . name cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite applies c groups a type s desc Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource %p%.cursesColorForHostColorGreen or the resource %p%.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, %p% only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with %p%.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See %-cursesColorForDefault% for the definitions of curses colors. . name cursesKeypad applies c type b default false desc When true, %p% will set up the terminal in curses keypad mode. . name cursorBlink applies x groups a type b default false option Options -> Toggles -> Blinking Cursor switch -set cursorBlink switch -clear cursorBlink description When true, causes %p% to use a blinking cursor. . name cursorColor applies x groups a type s default red description On color X11 displays, this is the color of the text cursor. This resource is used only if %-useCursorColor% is true. . name cursorPos applies x C groups a type b default true switch -set cursorPos switch -clear cursorPos option Options -> Toggles -> Track Cursor description When true, causes %p% to display the cursor location in the OIA (the status line). . name dbcsCgcsgid applies a groups p type s description Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use %-sbcsCgcsgid% for the single-byte (SBCS) character set. . name debugTracing applies x groups t s type b default true description If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed. . name defaultFgBg applies c type b groups a default false switch -defaultfgbg description If true, %p% will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that %p%'s screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if %p% has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9). . name defScreen applies c type s switch -defscreen desc Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-altScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name dftBufferSize applies a groups p type i default 4096 description Deprecated resource -- replaced by %-ftBufferSize%

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name devName applies a type s switch -devname groups p description Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name disconnectClear applies x type b default false description If true, %p% will clear the screen when a host disconnects. . name doConfirms applies x type b default true description When true, %p% will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed. . name dsTrace applies a groups t type b default false switch -trace switch -set dsTrace switch -clear dsTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name emulatorFont type s applies x groups a default 3270 switch -efont option Options -> Font description The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (%-charset%). However, the special OIA (status line) symbols are only available with the 3270 fonts. . name eof type s applies a groups n default ^D description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    . name erase type s applies a groups n default ^? description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (%p% gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause %p% to discard the last character on the input line.

    When connected in character-at-a-time mode (%p% sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action. . name eventTrace groups t type b applies a default false switch -set eventTrace switch -clear eventTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% traces information about keyboard and mouse events into a file. The default file name is if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name extended type b applies a default false groups d switch -extended description Deprecated resource -- replaced by %-model% syntax

    Indicates support for the 3270 Extended Data Stream. . name fixedSize type s applies x groups a description Specifies a fixed size for the %p% display window. If set, %p% will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary. . name foreground type s applies x groups a default black switch -fg switch -rv description The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display. . name ftAllocation type s applies a groups i default default description Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock. . name ftAvblock type i applies a groups i description Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers. . name ftBlksize type i applies a groups i description Defines the default block size for files sent to TSO hosts by IND$FILE file transfers. . name ftBufferSize applies a groups p type i default 4096 description Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCodePage type i applies w groups i description Deprecated resource -- replaced by %-ftWindowsCodePage%

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCr type s applies a groups i default auto description Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done. . name ftDirection type s applies a groups i default receive description Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation). . name ftExist type s applies a groups i default keep description Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be if x aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), else aborted, endif replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file. . name ftHost type s applies a groups i default tso description Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics. . name ftHostFile type s applies a groups i description Defines the default host file name for IND$FILE file transfers. . name ftLocalFile type s applies a groups i description Defines the default local file name for IND$FILE file transfers. . name ftLrecl type i applies a groups i description Defines the default logical record length for files sent to the host via IND$FILE. . name ftMode type s applies a groups i default ascii description Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation). . name ftPrimarySpace type i applies a groups i description Defines the default primary space allocation for files sent to TSO hosts via IND$FILE. . name ftRecfm type s applies a groups i default default description Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format. . name ftRemap type s applies a groups i default yes description Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by %p% to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37. . name ftSecondarySpace type i applies a groups i description Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE. . name ftWindowsCodePage type i applies w groups i description The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name highlightBold type b applies x groups a default false description If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font. . name hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified applies wc groups a type s desc Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See %-consoleColorForHostColor0% for the definitions of host colors.

    The default values are:
    %p% Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite
    . name hostname type s applies a groups c desc Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over %-hostname%.

    The most common use of %-hostname% is in session files, where a file is used to pass all of the options to establish a %p% session. . name hostsFile type s applies x default /usr/local/etc/x3270/ibm_hosts description The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by %-confDir%. . name hostsFile type s applies C S tcl if u default /usr/local/etc/x3270/ibm_hosts else default ibm_hosts endif description The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. if u The default pathname is actually ibm_hosts in the directory defined by %-confDir%. endif . name httpd type s applies C S x switch -httpd description Defines the TCP port and optional address to listen on for HTTP connections. (%p% implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name iconFont type s applies x groups a default nil2 description The font used to paint the text inside the active icon (see %-activeIcon%). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image. . name iconLabelFont type s applies x groups a default 8x13 description When %-activeIcon% and %-labelIcon% are true, this is the name of the font used to paint the icon label. . name icrnl type b applies a groups n default true description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines. . name idleCommand applies x C S groups i type s description When %-idleCommand% is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The %-idleCommand% can be an arbitrary sequence of %p% actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). %-idleCommandEnabled% must be true in order for the %-idleCommand% to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) %-idleTimeout% specifies the inactivity interval. . name idleCommandEnabled applies x C S groups i type b default false description Controls whether %-idleCommand% has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.) . name idleTimeout applies x C S groups i type s default ~7m description The timeout value for %-idleCommand%. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified. . name inlcr applies a groups n type b default false description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns. . name inputColor applies x groups a type s default green description This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan.

    If the resource %-modifiedSel% is true, modified fields are also displayed using %-inputColor%. . name inputMethod applies x type s switch -im description Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale. . name intr applies a groups n type s default ^C description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host. . name invertKeypadShift applies x type b default false description When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed. . name keyFile applies u groups s type s switch -keyfile desc Gives the name of a file containg the private key for the certificate specified by %-certFile% or %-chainFile%. The default file type is PEM; it can be overridden by %-keyFileType%. If the private key is encrypted, the password is specified by %-keyPasswd%. (OpenSSL only) . name keyFileType applies u groups s type s default pem switch -keyfileType desc Gives the type of the private key file specified by %-keyFile%. The value can be pem or asn1. (OpenSSL only) . name keyHeight applies x groups a type i default 24 desc Defines the height of the keys on the pop-up keypad. . name keymap applies x C groups c type s switch -keymap description The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a %-keymap% value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270. if x

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six. endif

    if x If no %-keymap% is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. %-keymap% is only the name; the keymap definition for name foo is the resource %-keymap.foo%. endif if C %-keymap% is only the name; the actual keymap for name foo can be defined either by the resource %-keymap.foo%, or by a keymap file. if c The keymap file is not searched for in any particular location, nor does it have a special suffix, so %-keymap% can specify the full pathname of the keymap file. else Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km. endif endif . name keymap.foo applies x C type s description The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax. . name keypad applies x groups a type s default right description. This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main %p% window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main %p% window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar
    . name keypad.keyHeight applies x groups a type i default 24 description The height in pixels of all of the buttons on the keypad. . name keyPasswd applies u groups s type s switch -keypasswd desc On OpenSSL, gives the password for the private key file specified by %-keyFile%, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the %-certfile% certifiate file. . name keyWidth applies x groups a type i default 48 description The width in pixels of the lower tier of buttons on a horizontal keypad. . name keypad.largeKeyWidth applies x groups a type i default 56 description The width in pixels of the lower tier of buttons on a vertical keypad. . name keypad.paWidth applies x groups a type i default 36 description The width in pixels of PA and cursor keys on the keypad. . name keypad.pfWidth applies x groups a type i default 32 description The width in pixels of PF keys on the keypad. . name keypadBackground applies x groups a type s default grey70 description On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap. . name keypadOn applies x type b groups a default false description If true, the keypad will automatically appear when %p% is started. . name kill applies a groups n type s default ^U description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action. . name labelIcon applies x groups a type b default false description When %-activeIcon% is true, the twm window manager will not put a label on %p%'s icon. Setting %-labelIcon% to true causes %p% to supply its own label for the icon.

    The icon label is drawn using the font specified by %-iconLabelFont%. . name largeKeyWidth applies x groups a type i default 56 desc Defines the width of the "large" keys in the lower section of the pop-up keypad. . name lightPenPrimary applies wc groups i type b default false description Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste. . name lineWrap applies a groups n type b default true switch -set lineWrap switch -clear lineWrap option Options -> Toggles -> Wraparound description This setting is used only in NVT mode. When true, %p% will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence. . name loginMacro applies a type s switch -loginmacro desc Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a %-hostsFile% is in use and a matching entry is found, the login macro from that entry will be used in preference to the %-loginMacro%. . name lnext applies a groups n type s default ^V description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered. . name localCp applies ws type i desc Forces %p% to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files. . name lockedCursor applies x groups a type s default X_cursor description The name of the mouse cursor displayed with %p% is not connected to a host. . name m3279 applies a type b default true groups d switch -color description Deprecated resource -- replaced by %-model% syntax

    Indicates support for color (a 3279 terminal). . name macros applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    %-macros% defines a set of macros for all hosts. To specify a set of macros for host foo, use %-macros.foo%. . name macros.foo applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of %-macros%. See %-macros% for details on its syntax. . name marginedPaste applies x wc groups i type b default false switch -set marginedPaste switch -clear marginedPaste option Options -> Toggles -> Paste With Left Margin description When true, %p% will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon. . name maxRecent applies x groups i type i default 5 description The maximum number of entries in the Connect menu's recent host list. . name menuBar applies x wc groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% main window. if x The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons. endif . name menuBar applies c groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% display, even if the terminal supports a mouse. . name metaEscape applies c type b default true desc When true, %p% will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus %p% will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character. . name minVersion applies S type s switch -minversion description Defines a minimum required version for %p%. If the version of %p% is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal. . name model applies a groups c type s default 3279-4-E switch -model option Options -> Screen Size description The terminal model that %p% is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. if x If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays. endif
      3279 specifies a color 3270 display. if x This is the default for color X11 displays. endif
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is if C the largest model that will fit on the console or terminal emulator window where %p% is running. Displaying the OIA (status line) requires one more row than what is listed above. else 4. endif
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.
    . name modifiedSel applies x groups a type b default false description When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by %-inputColor%. In 3279 mode, this is the color whose index is defined by %-modifiedSelColor%. When %-modifiedSel% is false, modified fields are displayed in the same colors as unmodified fields. . name modifiedSelColor applies x groups a type i default 10 description In 3279 mode, when %-modifiedSel% is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See %-colorSchemes% for the host color index definitions.) . name mono applies x c type b default false switch -mono description if x If true, %p% will operate as if it were running on a monochrome X11 display. else If true, %p% will emulate a 3278, and will not use any of the terminal's color attributes. endif . name monoCase applies a type b default false switch -set monoCase switch -clear monoCase option Options -> Toggles -> Monocase description When true, causes %p% to run in uppercase-only mode. . name mouse applies c groups i type b default true description If true, enables %p% to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled. . name newEnviron applies a type b default true description If true, %p% will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not. . name noOther applies x groups s type b default false description If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus. . name noPrompt applies C groups s type b default false desc If true, the interactive %p%> prompt will be disabled. In particular, this means that when %p% is not connected to a host, a keymap or an external script is the only way to start a new host connection. . name normalCursor applies x type s groups a default top_left_arrow desc Defines the mouse cursor that %p% uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked. . name nopSeconds applies a type i groups i default 0 desc If nonzero, %p% will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity. . name normalColor applies x groups a type s default green desc On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color. . name numericLock applies a groups i type b default false desc When true, causes %p% to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute. . name nvtMode applies a groups i type b default false switch -nvt desc When true, causes %p% to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname. . name onlcr applies a groups n type b default true desc Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences. . name oerrLock applies a groups i type b default true desc If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message. . name once applies a type b default false switch -once desc When true, %p% will exit as soon as a host disconnects. The default is false if no hostname is specified on the command if x C line or in a session file, else line, endif true otherwise. . name overlayPaste applies wc x groups i type b default false switch -set overlayPaste switch -clear overlayPaste option Options -> Toggles -> Overlay Paste desc When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause %p% to act as if the %-marginedPaste% toggle were also set. . name oversize applies a type s switch -oversize desc Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. if C It can also be the string auto, which will cause %p% to use the entire screen area of the endif if c terminal. endif if wc console window it is running in. endif It is used only if the %-model% includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with %p% in this mode. . name paWidth applies x groups a type i default 36 desc Defines the width of the PA keys in the lower section of the pop-up keypad. . name pfWidth applies x groups a type i default 32 desc Defines the width of the PF keys on the pop-up keypad. . name port applies a groups c type s default telnet switch -port desc The name of the default TCP port for %p% to connect to. This can be either a symbolic name from /etc/services, or an integer. . name proxy applies a groups c type s switch -proxy desc Defines a proxy server that %p% will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the %p% manual page. . name preeditType applies x type s default OverTheSpot+1 switch -pt desc The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. . name printerLu type s applies x C groups c switch -printerlu desc If a value is set, %p% will automatically start a if u pr3287 else wpr3287 endif printer session when a host connection is established. If the value is ".", the if u pr3287 else wpr3287 endif session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session. . name printer.assocCommandLine applies x C type s if x c default pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H% else default wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when %-printerLU% is "."). Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with the %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with the current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.codepage applies wc type i desc The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage. . name printer.command applies x c type s default lpr desc The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in %-printer.assocCommandLine% and %-printer.luCommandLine% resources. . name printer.luCommandLine applies x C type s if x c default pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H% else default wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.name applies wc type s desc Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer. . name printer.options applies x C type s desc Defines extra parameters to substutute for the %O% token in the printer command line. . name printTextCommand applies x c type s default lpr desc The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. if x If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear. endif . name printTextFont applies wc type s default Courier New desc The font used by the PrintText action. . name printTextHorizontalMargin applies wc type i default 0.5 desc The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printTextOrientation applies wc type i desc The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is. . name printTextScreensPerPage applies wc c x type i default 1 desc The number of screens to display on a page when tracing screens to the printer. . name printTextSize applies wc type i default auto (GDI), 8 (WordPad) desc The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points. . name printTextVerticalMargin applies wc type i default 0.5 desc The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printWindowCommand applies x type s default xwd -id %d | xpr | lpr desc The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear. . name qrBgColor applies C s tcl type b default false desc When true, %p% will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash. . name quit applies a groups n type s default ^\ desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host. . name reconnect applies x C type b default false desc When true, %p% will automatically reconnect to a host after it disconnects. . name rectangleSelect applies x groups i type b default false switch -set rectangleSelect switch -clear rectangleSelect option Options -> Toggles -> Select by Rectangles desc When true, %p% will always select rectangular areas of the screen. When false, %p% will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm. . name reverseVideo applies c type b groups a default false option -rv desc When true, %p% will use a white background instead of a black one. . name rprnt applies a groups n type s default ^R desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed. . name saveLines applies x C type i default 4096 switch -sl desc The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved. . name sbcsCgcsgid applies a groups p type s desc Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use %-dbcsCgcsgid% for the double-byte (DBCS) character set. . name schemeList applies x type s desc Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme. . name screenTrace applies a groups t type b default false switch -set screenTrace switch -clear screenTrace option File -> Save Screen(s) in File desc When true, %p% will save an ASCII version of the screen image in a file every time it changes. The file name defaults to if u x3scr.pid. else x3scr.pid.txt. endif The directory where the file is written is defined by %-traceDir%. If %-screenTraceFile% is defined, it defines the file name and %-traceDir% is ignored. if w file name. endif . name screenTraceFile applies a groups t type s desc If defined, gives the name of the file that screen traces will be written into. . name scripted applies x type b default false switch -script desc When true, %p% will read commands from standard input. The rules for these commands are documented in the x3270-script manual page. . name scriptPort applies a type i switch -scriptport desc If defined, %p% will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name scriptPortOnce applies a type b default false switch -scriptportonce desc If defined, %p% will accept only one script connection. When that connection is broken, it will exit. . name scrollBar applies x type b default false switch -sb switch +sb switch -set scrollBar switch -clear scrollBar desc When true, %p% will display a scroll bar to the right of the emulator window. . name secure applies x groups s type b default false desc When true, %p% will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and %-disconnectClear% is true. See %-noOther% and %-suppressActions% for additional security options. . name selectBackground applies x groups a type s default dimGrey desc On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video. . name showTiming applies x groups a type b default false switch -set showTiming switch -clear showTiming option Options -> Toggles -> Show Timing desc When true, %p% will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent. . name socket applies u type b default false switch -socket desc When true, %p% will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket. . name startTls applies a type b groups s default true description If true, %p% will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them. . name *suppress applies x groups s type b desc When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress . name suppressActions applies a groups s type s desc A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options. . name suppressFontMenu applies x type b default false desc If true, the Options -> Font menu will not be displayed. . name suppressHost applies x type b default false desc If true, %p% will omit the hostname from the File -> About %p% -> Connection Status pop-up. . name termName applies a groups p type s switch -tn desc An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of %-model%. . name title applies x wc groups a type s switch -title desc Sets the title for the %p% window, overriding the default of constructing the name from the host that is connected to. . name trace applies a groups t type b default false switch -trace switch -set trace switch -clear trace option File -> Trace Data and Events description When true, %p% writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name traceCommand applies x type s default tail -f desc Defines the command that runs in the trace window. . name traceDir applies a groups t type s if u default /tmp endif if wc default current user's Desktop endif if ws default current directory endif desc Defines the directory that trace files are written into. . name traceFile applies a groups t type s switch -tracefile desc If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. if x If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created. endif . name traceFileSize applies a groups t type s switch -tracefilesize desc If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started. . name traceMonitor applies x wc groups t type b default true desc When true, %p% will create a window to monitor data stream and event traces. When false, no monitor window will be if x created (and the value of none for %-traceFile% will be considered invalid). else created. endif . name typeahead applies w C type b default true desc When true, %p% will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped. . name underscore applies C groups a type b if c default false else default true endif switch -set underscore switch -clear underscore desc When true, %p% will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed if c on terminals that else to overcome the fact that Windows consoles endif are unable to display real underlined text. . name unlockDelay applies x c wc type b default true desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% implements a hack to briefly delay actually unlocking the keyboard. When %-unlockDelay% is true (the default), the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. Setting it to false removes this delay. . name unlockDelay applies s ws tcl type b default false desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. . name unlockDelayMs applies a type i default 350 desc Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and %p% actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros. . name useCursorColor applies x groups a type b default false desc If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by %-cursorColor%. . name user applies a type s switch -user groups p description Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name utf8 applies S type b switch -utf8 description Forces local I/O to use UTF-8 encoding, regardless of the local codepage. . name verifyHostCert applies a type b groups s switch -noverifycert switch -verifycert default true description If true (the default), %p% will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, %p% will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking. . name visibleControl applies x C type b default false switch -set visibleControl switch -clear visibleControl option Options -> Toggles -> Visible Control Characters desc If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, if x c displayed with underlines, endif are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, if x c displayed in yellow with underlines, endif if wc displayed in reverse-video yellow, endif are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified
    . name visualBell applies x groups i type b default false desc When true, %p% will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell. . name visualBell applies wc groups i type b default false desc Deprecated resource -- replaced by %-bellMode%

    When true, %p% will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, %p% will beep the console and flash the screen.

    Note that this resource is overridden by %-bellMode%. %-bellMode% is the preferred method of controlling the console bell behavior. . name visualSelect applies x groups a type b default false desc This resource controls how %p% displays light pen selectable fields that do not have a color explicitly set by the host. When true, %p% will display these fields using the color defined by %-visualSelectColor%. When false, %p% will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode. . name visualSelectColor applies x groups a type i default 6 desc The host color index of the color to use to display light pen selectable fields. This resource is used only if %-visualSelect% is true. The default is 6 (yellow). . name waitCursor applies x groups a type s default watch desc The name of the mouse cursor displayed when %p% is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>. . name werase applies a groups n type s default ^W desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action. . EOF suite3270-3.6/ws3270/resources.inc0000664000076500007650000003113613221577163014652 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ifelse(XX_PRODUCT,c3270,`XX_SH(Screen Size Switching) When running as a 3270 Model 5, XX_FB(c3270) can take advantage of terminals that can switch between 80 and 132 column modes. XX_LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to XX_FB(c3270). These are specified with the XX_FB(XX_DASHED(altscreen)) and XX_FB(XX_DASHED(defscreen)) command-line options, or the XX_FB(altScreen) and XX_FB(defScreen) resources. XX_FB(XX_DASHED(altscreen)) or XX_FB(altScreen) defines the alternate (132-column) mode; XX_FB(XX_DASHED(defscreen)) or XX_FB(defScreen) defines the default (80-column) mode. XX_LP The syntax for the options and resources is XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string), where XX_FI(rows) and XX_FI(cols) give the screen dimensions, and XX_FI(init_string) is the escape sequence to transmit to the terminal to enter that mode. For XX_FB(defscreen), the minimum dimensions are 24 rows and 80 columns. For XX_FB(altscreen), the minimum dimensions are 27 rows and 132 columns. Within XX_FI(init_string), the usual escape sequences are supported (XX_BACKSLASH(E) for escape, XX_BACKSLASH(r), XX_BACKSLASH(b), etc.). For example, the init string for a 132-column xterm is: XX_IP XX_BACKSLASH(E)[?40h`'XX_BACKSLASH(E)[?3h XX_LP Note: When XX_FB(defscreen) and XX_FB(altscreen) are specified, the model number is always set to 5. ')dnl XX_SH(Resources) Certain XX_FB(XX_PRODUCT) options can be configured via resources. Resources are defined ifelse(XX_PRODUCT,c3270,`in the file XX_FB(.c3270pro) in the XX_POSESSIVE(user) home directory, and ')dnl ifelse(XX_PRODUCT,wc3270,`in the session file, or ')dnl by XX_FB(XX_DASHED(xrm)) options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in XX_FB(XX_PRODUCT) are: XX_LP XX_TS(4, l l l l.) XX_TR(XX_TD(Resource) XX_TD(Default) XX_TD(Option) XX_TD(Purpose)) XX_T_() ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(allBold) XX_TD(Auto) XX_TD(XX_DASHED(allbold)) XX_TD(Display all characters bold)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(altScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(altscreen)) XX_TD(132-col screen definition)) ')dnl XX_TR(XX_TD(blankFill) XX_TD(False) XX_TD(XX_DASHED(set) blankFill) XX_TD(Blank Fill mode)) XX_TR(XX_TD(charset) XX_TD(bracket) XX_TD(XX_DASHED(charset)) XX_TD(XX_SM(EBCDIC) character set)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(composeMap) XX_TD(latin1) XX_TD(XX_NBSP) XX_TD(Name of composed-character map)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(consoleColorForHostColor`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForHostColor)`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForDefault)) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForIntensified)) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtected)) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtectedIntensified)) XX_TD(white) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(cursesKeymap) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Set curses keymap option)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(defScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(defscreen)) XX_TD(80-col screen definition)) ')dnl XX_TR(XX_TD(dbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override DBCS CGCSGID)) XX_TR(XX_TD(dsTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Data stream tracing)) XX_TR(XX_TD(eof) XX_TD(^D) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode XX_SM(EOF) character)) XX_TR(XX_TD(erase) XX_TD(^H) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode erase character)) XX_TR(XX_TD(extended) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Use 3270 extended data stream)) XX_TR(XX_TD(eventTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Event tracing)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForDefault) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForIntensified) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtected) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtectedIntensified) XX_TD(neutralWhite) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(hostsFile) XX_TD(XX_NBSP) XX_TD(XX_DASHED(hostsfile)) XX_TD(Host alias/macro file)) ')dnl XX_TR(XX_TD(icrnl) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(CR) to XX_SM(NL) on XX_SM(NVT)-mode input)) XX_TR(XX_TD(inlcr) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(NL) to XX_SM(CR) in XX_SM(NVT)-mode input)) XX_TR(XX_TD(intr) XX_TD(^C) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode interrupt character)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(keymap) XX_TD(XX_NBSP) XX_TD(XX_DASHED(keymap)) XX_TD(Keyboard map name)) XX_TR(XX_TD(keymap.XX_FI(foo)) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Definition of keymap XX_FI(foo))) ')dnl XX_TR(XX_TD(kill) XX_TD(^U) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode kill character)) XX_TR(XX_TD(lineWrap) XX_TD(False) XX_TD(XX_DASHED(set) lineWrap) XX_TD(XX_SM(NVT) line wrap mode)) XX_TR(XX_TD(lnext) XX_TD(^V) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode lnext character)) ifelse(XX_PRODUCT,ws3270,`XX_TR(XX_TD(localCp) XX_TD((system ANSI code page)) XX_TD(XX_DASHED(localcp)) XX_TD(Windows code page for local I/O)) ')dnl XX_TR(XX_TD(m3279) XX_TD(XX_LINK(#rn1,`(note 1)')) XX_TD(XX_DASHED(model)) XX_TD(3279 (color) emulation)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(metaEscape) XX_TD(Auto) XX_TD(XX_NBSP) XX_TD(Interpret ESC-x as Meta-x)) ')dnl ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(marginedPaste) XX_TD(False) XX_TD(XX_DASHED(set) marginedPaste) XX_TD(Keep left margin when pasting)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(mono) XX_TD(XX_LINK(#rn5, `(note 5)')) XX_TD(XX_DASHED(mono)) XX_TD(Ignore terminal color capabilities)) ')dnl XX_TR(XX_TD(monoCase) XX_TD(False) XX_TD(XX_DASHED(set) monoCase) XX_TD(Mono-case mode)) ifelse(XX_MODE,console,`XX_TR(XX_TD(noPrompt) XX_TD(False) XX_TD(XX_DASHED(noprompt)) XX_TD(Disable command-prompt mode)) ')dnl XX_TR(XX_TD(numericLock) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Lock keyboard for numeric field error)) XX_TR(XX_TD(oerrLock) XX_TD(ifelse(XX_PRODUCT,c3270,True,False)) XX_TD(XX_NBSP) XX_TD(Lock keyboard for input error)) ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(overlayPaste) XX_TD(False) XX_TD(XX_DASHED(set) overlayPaste) XX_TD(Overlay protected fields when pasting)) ')dnl XX_TR(XX_TD(oversize) XX_TD(XX_NBSP) XX_TD(XX_DASHED(oversize)) XX_TD(Oversize screen dimensions)) XX_TR(XX_TD(port) XX_TD(telnet) XX_TD(XX_DASHED(port)) XX_TD(Non-default TCP port)) ifelse(XX_MODE,console,`XX_TR(XX_TD(printer.*) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) XX_TR(XX_TD(printerLu) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(printTextFont) XX_TD(Courier New) XX_TD(XX_NBSP) XX_TD(PrintText font name)) XX_TR(XX_TD(printTextSize) XX_TD(8) XX_TD(XX_NBSP) XX_TD(PrintText font size)) ')dnl XX_TR(XX_TD(quit) XX_TD(^XX_BS) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode quit character)) ifelse(XX_MODE,console,`XX_TR(XX_TD(reconnect) XX_TD(False) XX_TD(XX_DASHED(reconnect)) XX_TD(Automatically reconnect to host)) ')dnl XX_TR(XX_TD(rprnt) XX_TD(^R) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode reprint character)) XX_TR(XX_TD(sbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override SBCS CGCSGID)) XX_TR(XX_TD(secure) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable "dangerous" options)) XX_TR(XX_TD(termName) XX_TD(XX_LINK(#rn2,`(note 2)')) XX_TD(XX_DASHED(tn)) XX_TD(XX_SM(TELNET) terminal type string)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(title) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Console window title)) ')dnl ifelse(XX_PLATFORM,windows,,`XX_TR(XX_TD(traceDir) XX_TD(/tmp) XX_TD(XX_NBSP) XX_TD(Directory for trace files)) ')dnl XX_TR(XX_TD(traceFile) XX_TD(XX_LINK(#rn3,`(note 3)')) XX_TD(XX_DASHED(tracefile)) XX_TD(File for trace output)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(typeahead) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Allow typeahead)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(visualBell) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable bell sound)) ')dnl XX_TR(XX_TD(werase) XX_TD(^W) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode word-erase character)) XX_TE() XX_LP XX_RS(`XX_TARGET(rn1)XX_FI(Note 1): XX_FB(m3279) defaults to ifelse(XX_PRODUCT,c3270,`XX_FB(True) if the terminal supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,wc3270,`XX_FB(True). It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,x3270,`XX_FB(True) if the display supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', `XX_FB(False). It can be forced to XX_FB(True) with the proper XX_FB(XX_DASHED(model)) option.') XX_LP XX_TARGET(rn2)XX_FI(Note 2): The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as XX_FB(IBM-3279-2-E). Note also that when XX_SM(TN3270E) mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. XX_LP XX_TARGET(rn3)XX_FI(Note 3): The default trace file is ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(x3trc.)`'XX_FI(pid) in the directory specified by the XX_FB(traceDir) resource'). ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.')' ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn5)XX_FI(Note 5): XX_FB(mono) defaults to XX_FB(false) if the terminal supports at least 8 colors and to XX_FB(true) otherwise.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.' ')dnl ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.' ')) XX_LP ifelse(XX_PRODUCT,c3270,`In XX_FB(.c3270pro), lines are continued with a backslash character. XX_LP XX_FB(XX_DASHED(xrm)) options override definitions found in XX_FB(.c3270pro). ')dnl If more than one XX_FB(XX_DASHED(xrm)) option is given for the same resource, the last one on the command line is used. suite3270-3.6/ws3270/version.txt0000775000076500007650000000006013221577443014367 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/ws3270/ws3270_files.mk0000664000076500007650000000003113221577163014613 0ustar pdmpdmWS3270_OBJECTS = s3270.o suite3270-3.6/ws3270/ws3270.ico0000775000076500007650000004107613221577163013615 0ustar pdmpdm@@ (B(@€ cnvhwƒcs}1eu“j{ˆæTcpàWixàTfsâQamÅP]g›Xgr¼blu©pzyƒ\lxFWbIZhVjyLasfwƒäk}‰ÿ]p~ÿ^r~ÿoŽÿh|Šÿew„ÿgy†ÿfy†ÿcv„ÿXlyÿ[mzÿ]q~øbt€ÿ]o}ÿg{‡ÿl€Œÿq…’ÿr†”ÿs‡•ÿjÜmŠÿo‹—t…p|…:WfqÕ^myÿPbpÿI]jÿLapÿ[qÿ[p€ÿ]t„ø_u…ÿdz‰ÿi~ÿm„’ÿr†–ÿq‡•ÿp…”ÿuŠ™ÿu‹™ÿyŽÿ}’ ÿ‚•£ÿ‰œ©ÿ†š§ÿ‡›©ÿ‘¤±ÿ”§´ÿ’¥³ÿ‘¤²ÿu‹šÿp‡–ÿm‚’ÿr„’ÿ›¦y{‹•7_iqw„Œ]o|ÿ_v„ÿdz‹ÿmƒ“ÿtŠ˜ÿ–¤ÿ‚—¥ÿƒ—¦ÿ†š¨ÿ‰ªÿ†š©ÿƒ˜¦ÿ…™§ÿ–¥ÿ€•¤ÿ•¤ÿ|’¡ÿ}’¡ÿ‚—¦ÿ–¥ÿƒ˜§ÿˆœ«ÿ†š©ÿŒ ¯ÿŒŸ®ÿ‹Ÿ®ÿ”¦´ÿŠž«ÿt‰™ÿ”£ÿ~“£ÿ{žÿx‡’õakt­—žnƒ“ÿ£±ÿ‘¥²ÿ”§´ÿ”§³ÿ“§³ÿ“¦´ÿ¡®ÿ‰«ÿ€•¤ÿwŽÿuŠšÿrˆ˜ÿn…”ÿoƒ’ÿnƒ’ÿi~Œÿfx…ÿkz†ÿjz†ÿl|‡ÿgwƒÿYkxÿZiuÿ€“ ÿxŠ—ÿxˆ’ÿŠœ©ÿ…™¨ÿ€”£ÿˆœªÿ†š©ÿ’ ÿrŠïhv‚Žš¡f—¦²ÿ£±þ’¥²ÿ—ª·ÿ—«¹ÿ}‹•ÿ`lwÿ^jtÿQ`kÿFVbÿ:HSÿ.8Aÿ'2<ÿ$0;ÿ"+ÿ#ÿ ÿ#ÿ!(ÿ%/7ÿÿ ÿÿ.:Dÿ ÿ ÿ+6@ÿyŠ—ÿ•¤ÿ‰ªÿŽ¢¯ÿŽ¢°ÿ…—£ÿs‚Œï ¬µ>–§±ÿ”¨µÿƒ• ÿapzÿ3=Fÿÿ+6?ÿ.9Cÿ&ÿ*5ÿ,7@ÿ9EOÿBS`ÿQcoÿ]nzÿdw„ÿwŠ—ÿ„–¢ÿ—©µÿw„ÿALWÿ*2;ÿ)1:ÿ(ÿ "ÿ  ÿ'1:ÿ…™¨ÿ…™§ÿŽ¢°ÿ”§´ÿ”¦²ÿŒ–Þ¤±¹f–©µþYclÿ ÿ *ÿ ÿ0:Cÿ—ÿ‰ªÿŒŸ®ÿŒ ­ÿˆœ«ÿ‡œªÿ‹Ÿ­ÿ‘¥³ÿ˜«·ÿš¬¸ÿ¢³¾ÿ¤µÁÿ­½ÈÿµÆÏÿ‘›¡ÿ&ÿ,8Aÿ%ÿ ÿ ÿapzÿŒ ®ÿ†›©ÿ£²ÿ“¤±ÿHZhÿp€‹—o}†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×Ýàÿ›£ÿ5>Hÿ"ÿ'3ÿ"ÿ!%*ÿˆ™¤ÿ¢´Àÿ—ª·ÿ”¦´ÿ’¥²ÿ¤±ÿ”¨µÿ–©¶ÿ›­¹ÿž¯¼ÿŸ°¼ÿ ±¼ÿ§¸Âÿ˜§²ÿ+5>ÿ(1ÿ,9Dÿ&ÿ!,ÿ;HRÿ“¡ÿ‹ ­ÿ‰«ÿ‰œªÿ>Raÿex…ÿgu€ÿiyƒy}›7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿçççÿöööÿçççÿíííÿæææÿàààÿêêêÿÜÜÜÿÚÜÝÿ‹–žÿ*09ÿ(ÿ)7Bÿmz‚ÿ ¬ÿ¢®ÿ€‘žÿy‡ÿvƒÿv„ÿw„ÿn|‡ÿfu€ÿWgrÿHU`ÿ@JRÿ:EMÿ.:Dÿ"-ÿ&ÿ"ÿ ÿ ÿÿ3@LÿŠŸ¬ÿ£±ÿzŒšÿ8N_ÿd|Œÿ_sÿ]p|ÿduÿi}‰dtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿÓÓÓÿäääÿÏÏÏÿàààÿÙÙÙÿÑÑÑÿØØØÿæææÿüüüÿÿÿÿÿÿÿÿÿU^eÿ/8@ÿ!*ÿÿ ÿ ÿ ÿÿ ÿÿÿÿ ÿÿ ÿ ÿ ÿÿÿÿÿ ÿÿ ÿ9GSÿoŒÿEUcÿAUeÿh€ÿd|Œÿcyˆÿ^q~þ_p|ÿcs~ñp€m}‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÿ»»»ÿÿÿÿÿÕÕÕÿ···ÿÕÕÕÿÕÕÕÿÄÄÄÿAFJÿ%.ÿ%ÿ ÿ ÿ%ÿ$ÿ$ÿ*ÿ)ÿ#/ÿ$0ÿ$/ÿ&2ÿ*ÿ"/ÿ -ÿ!-ÿ!/ÿ*ÿ%ÿ "ÿ $ÿ)ÿ%2ÿ#1ÿNdtÿi€‘ÿjÿi€‘ÿg~Žÿbvƒÿ^p~ÿcu‚ÿhyƒ^o|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÃÃÃÿÔÔÔÿÆÆÆÿ¾¾¾ÿØØØÿÊÊÊÿ¼¼¼ÿ«««ÿ£¦©ÿisyÿx‚Šÿ]lxÿK^mÿJ`pÿ=Seÿ6L]ÿ4J\ÿ4J[ÿ.CTÿ,ARÿ-BSÿ/DUÿ)=Nÿ&:Lÿ"5Eÿ->ÿ)9ÿ /ÿ*ÿ %ÿ #ÿ $ÿ*ÿ,ÿUl{ÿm„”ÿm„”ÿk‚’ÿn…”ÿk‚‘ÿhŽÿ^t„ÿ]o|ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÁÁÁÿÄÄÄÿÕÕÕÿÍÍÍÿ¼¼¼ÿÆÆÆÿÍÍÍÿÐÐÐÿ¸¸¸ÿרÙÿl€ÿ\t…ÿSk|ÿF]oÿ?Vhÿ7M_ÿ4J\ÿ1GXÿ+ARÿ/DUÿ-CTÿ(Ufÿ=Seÿ7N_ÿ6L^ÿ0EVÿ,@Pÿ,@Qÿ-@Qÿ';Lÿ#7Gÿ 2Bÿ1Aÿ!2Aÿ 2Bÿ.@OÿRgwÿxœÿvŒœÿsŠšÿr‰™ÿqˆ—ÿm„”ÿm„”ÿj’ÿax‰ÿp‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÅÅÿÎÎÎÿÇÇÇÿÛÛÛÿÑÑÑÿ¶¶¶ÿÌÌÌÿ¾¾¾ÿçççÿ£¨«ÿ’œ¡ÿZkwÿUhwÿXl|ÿ]qÿdx‡ÿmÿs‡–ÿvŠ™ÿ{žÿ}’ŸÿxŒ›ÿyŽ›ÿzŽœÿv‹šÿq†•ÿiÿawˆÿVm~ÿG^oÿRgwÿuŒ›ÿzŸÿyŽžÿt‹šÿtŠšÿvœÿrˆ˜ÿj‘ÿl‚’ÿi‘ÿax‡ÿds|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿ×××ÿºººÿäääÿÓÓÓÿÈÈÈÿÜÜÜÿ·¸¸ÿ¤°·ÿ ¯ºÿŠ— ÿw„ÿfs~ÿbjpÿhotÿhpuÿajpÿZdkÿR^fÿJU\ÿCKQÿ@HRÿBJSÿDMVÿEOWÿMX_ÿU`hÿWagÿiwÿ|“¢ÿƒ˜§ÿ}’¡ÿzŸÿwÿs‰˜ÿrˆ˜ÿuŒ›ÿt‹šÿo†–ÿk‘ÿi€ÿ_v†ÿbp{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿ¾¾¾ÿ¸¸¸ÿ´´´ÿÆÆÆÿ½½½ÿ±²³ÿs|‚ÿMW^ÿ-4:ÿ %ÿÿ ÿÿ ÿÿÿ ÿÿ ÿ ÿ ÿÿ ÿÿÿÿÿ'07ÿŽ£²ÿ†š¨ÿ–¥ÿ}’¡ÿyžÿu‹›ÿtŠšÿuŒ›ÿu‹›ÿqˆ—ÿn…•ÿkƒ’ÿax‰ÿcs~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶¶¶ÿ¼¼¼ÿªªªÿ³³³ÿÃÃÃÿ©©©ÿŠÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿÿÿÿ ÿÿ"*ÿ“§´ÿ ®ÿŠž¬ÿ„™§ÿ•¤ÿyŽžÿyŽžÿvŒœÿuŒ›ÿqˆ—ÿn…•ÿn…•ÿh~Žÿdtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿöööÿûûûÿÿÿÿÿàààÿ¸¸¸ÿksyÿÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿÿ ÿ$ÿ˜«¸ÿ”§´ÿ¡®ÿˆœªÿ€•¤ÿ|“¡ÿzŸÿvŒœÿvŒ›ÿs‰˜ÿk‚’ÿm„”ÿiÿas€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÀÀÀÿ®®®ÿGNTÿ ÿ ÿ ÿ ÿÿÿÿ ÿÿÿ ÿ ÿ ÿÿ ÿÿÿ ÿ ÿÿ ÿ&ÿ™«¸ÿ–¨¶ÿ”§´ÿ¡¯ÿ‚—¦ÿ|’¡ÿ}’¡ÿyŸÿvœÿqˆ—ÿm…•ÿlƒ“ÿl‚’ÿbsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿóóóÿ¡¥ÿ37;ÿ ÿ ÿ ÿÿ a2ÿ]3ÿ %ÿ ;%ÿ *ÿ 'ÿ ÿ0"ÿ ÿ -$ÿÿÿ ÿ ÿ ÿ ÿ ÿ!ÿ—ª·ÿš«¸ÿ—ª·ÿ‘¥²ÿƒ˜¦ÿ|‘¡ÿ”£ÿ{‘ ÿuŒ›ÿr‰˜ÿn…”ÿm„”ÿlƒ’ÿ^q}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿ²µ¹ÿ#*0ÿ ÿ ÿ ÿ ÿ ÿa3ÿ ]3ÿ ÿ ÿ ÿ ÿ m3ÿÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿ$ÿ™«·ÿŸ°¼ÿ›­¹ÿ•§´ÿ„™¨ÿ”£ÿ‚—¥ÿ|‘ ÿxŽžÿvŒœÿp‡–ÿo†–ÿm„”ÿ]q}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿ´´´ÿ···ÿÕÕÕÿ«««ÿ©¬®ÿÿÿ ÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ"ÿ™«¹ÿ ²¾ÿœ®ºÿ•§´ÿ‡œ«ÿ„™§ÿ„˜§ÿ|’¡ÿ{‘ ÿvŒœÿu‹›ÿq‡—ÿn…•ÿbtƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÕÕÿ×××ÿÕÕÕÿîîîÿÎÎÎÿ§ª­ÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ;!ÿÿ ÿ 8 ÿ @"ÿ ÿÿ ÿÿ*ÿ ÿ ÿ ÿ"ÿ!ÿ¯»ÿ£´Àÿ¯»ÿ–¨µÿ¢±ÿŠž¬ÿ…š©ÿ€–¥ÿ”¤ÿ{ ÿuŒ›ÿs‰™ÿp‡—ÿfzˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨®­ÿ#)•ÿ 7ÿÿ ÿ ÿ ÿ='ÿ ÿ;%ÿI+ÿ ÿ:$ÿ[5ÿ ÿÿ ÿ ÿÿ ÿÿ ÿ)ÿ%ÿ ²½ÿ¤¶ÁÿŸ°¼ÿ˜ª¶ÿ”§´ÿ ®ÿ‰ž¬ÿ‡œªÿ„™¨ÿ€•¤ÿwœÿvŒœÿvŒ›ÿg{Šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿîîîÿàààÿìììÿêêêÿ¦¨¡ÿ´ÿ Jÿÿ ÿÿ ÿ ÿ y0ÿ€3ÿ *ÿ y0ÿ4ÿ (ÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿ 'ÿ &ÿ¥¶Áÿ§¸Ãÿ¡²¾ÿœ®ºÿ—©¶ÿ‘¥²ÿŒ ­ÿ‰œªÿ†›©ÿ‚—¦ÿ{‘ ÿwœÿtŠ™ÿeyˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´´´ÿ¸¸¸ÿ´´´ÿÐÐÐÿ¬¬¬ÿ›˜ÿsÿ=ÿÿÿ6"ÿ"ÿ n0ÿq<ÿw-ÿ }3ÿj9ÿ ^"ÿ 'ÿ ÿ F+ÿ O/ÿ ÿÿ ÿ ÿ ÿ+6ÿ &ÿ©ºÃÿ©¹Äÿ¤¶Àÿ¯»ÿ–¨µÿ“¦³ÿŽ¢°ÿŠž¬ÿ…š¨ÿƒ—¦ÿ~“¢ÿ€•£ÿwœÿh|ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿ­­­ÿÎÎÎÿÕÕÕÿÂÂÂÿ”˜šÿ ÿÿ ÿ ÿl9ÿ ;#ÿÿ *#ÿ }0ÿ#ÿ )"ÿ }/ÿ )ÿÿÿÿÿÿÿ ÿ ÿ&1;ÿ%,ÿª»Åÿ¬¼Æÿ¥¶Áÿœ®ºÿ–©µÿ’¥³ÿ£°ÿ‰«ÿ†š¨ÿ‡›©ÿƒ˜¦ÿ–¥ÿzžÿj}‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÿ½½½ÿ···ÿÕÕÕÿ¿¿¿ÿ„ˆÿ ÿ ÿ ÿ ÿl*ÿ 6#ÿ  ÿ.ÿ ~.ÿ %#ÿ #ÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿÿ#(ÿªºÄÿ¬¼Æÿ¤µÀÿ›­ºÿ–¨µÿ’¥³ÿ£±ÿŒŸ­ÿˆœ«ÿŠŸ¬ÿ…š¨ÿ–¥ÿ}‘ ÿkŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿçççÿîîîÿõõõÿçççÿ”™ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿÿ ÿÿÿ ÿ ÿ ÿÿ ÿÿ&/5ÿ¬¼Èÿ¬¼Æÿ¤µÀÿž°¼ÿ–ª¶ÿ•¨´ÿ“¦³ÿ£°ÿ¡¯ÿ‰¬ÿˆœªÿ…™¨ÿ€•¢ÿnŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšž¢ÿ ÿ ÿ ÿ ÿÿÿ[2ÿiÿA!ÿh6ÿoÿ ?!ÿ$…Eÿÿ7ÿ ~ÿÿ ÿÿÿ ÿ ÿ8BHÿ±ÂÍÿ©¹Ãÿ£´¿ÿž¯»ÿ˜«·ÿ—ª·ÿ•¨µÿ’¥²ÿ’¤²ÿŒ ®ÿ‰¬ÿ‰«ÿ‚—¥ÿm€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿÖÖÖÿÍÍÍÿ¸¸¸ÿãããÿruxÿ ÿ ÿÿ ÿÿÿ ÿ…ÿ…)ÿ)ÿÿ…'ÿÿÿFÿÿÿÿb7ÿÿÿÿJQXÿ±ÂÎÿ©¸Ãÿ£µÀÿž±¼ÿš¬¸ÿ˜«·ÿ–©¶ÿ“¦´ÿŽ¡¯ÿ‹Ÿ­ÿˆœ«ÿ‡œªÿƒ–¥ÿo‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿùùùÿûûûÿôôôÿüüüÿ’•ÿÿ ÿÿÿY)ÿKÿ ÿ T)ÿ r#ÿ ÿ S(ÿÿ ÿÿ(ÿ Hÿ ÿ ÿ ÿ ÿ ÿ ÿPV[ÿ®ÀËÿªºÄÿ¥¶Àÿ ²½ÿš¬¹ÿ˜«·ÿ•¨µÿ’¥²ÿŽ¡®ÿŠŸ­ÿŠž¬ÿ‰«ÿ•£ÿr„‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•—™ÿ ÿ ÿ ÿÿ *ÿ {"ÿ‚/ÿ #ÿ ‡&ÿÿ ÿGÿÿ qÿÿ ÿÿ ÿ ÿ ÿÿ ÿcntÿ°ÁÌÿ«ºÅÿ§¸Âÿ ²½ÿŸ±½ÿ˜ª¶ÿ“¦³ÿ“¦³ÿŽ¡¯ÿŒ ®ÿŠž¬ÿ„™¨ÿ~’¡ÿpƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿˆˆˆÿºººÿÀÀÀÿ†††ÿ¬¬¬ÿ¥¥¥ÿèèèÿÿÎÎÎÿ]_aÿ ÿ ÿ ÿ ÿ !ÿ P#ÿ ,ÿ "ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿÿ ÿÿ ÿ ÿÿy…ÿ¯ÀÊÿ«»Äÿ§¹Äÿ¢´¿ÿž°¼ÿ˜«·ÿ”¦³ÿ“¦³ÿ‘¤²ÿ£°ÿŒŸ®ÿ‰«ÿ‚•¤ÿn‚÷šÌíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿØØØÿêêêÿöööÿ×××ÿÞÞÞÿØØØÿùùùÿÒÒÒÿóóóÿˆŒÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ !ÿÿ ÿÿÿÿÿÿ ÿÿ ÿÿ ÿ ÿ ÿ‚Ž–ÿ«½Èÿ«»Äÿ§¸Ãÿ¢³¿ÿž¯»ÿ™«·ÿ“¦³ÿ”¦³ÿ“¦³ÿ¢°ÿ‰ž¬ÿ†›©ÿ–¥ÿuŠšöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿåååÿåååÿßßßÿêêêÿˆŽ‘ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ !ÿÿÿÿÿÿÿ ÿ ÿÿÿÿ ÿ ÿ ÿ‘¡«ÿ«¼Çÿ«»Åÿ§¸Ãÿ¢³¿ÿž°¼ÿ˜ª·ÿ”§´ÿ“¦³ÿ•¨µÿ“¦³ÿŒ ®ÿ‡›©ÿ–¥ÿw‹›ö&/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÉÉÿÇÇÇÿÎÎÎÿ¼¼¼ÿÝÝÝÿ}…ÿ ÿ ÿ ÿ ÿÿÿÿ ÿÿ ÿ ÿÿ ÿ ÿ ÿÿÿÿÿ ÿ ÿÿ˜¨²ÿ«»Æÿ©¹Äÿ¥¶Áÿ¡²¾ÿ¯»ÿ–©µÿ•¨µÿ•¨´ÿ”§´ÿ’¦²ÿ¡¯ÿ‡›©ÿ”¤ÿsˆ—ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯ÿ›››ÿÂÂÂÿ°°°ÿ±±±ÿˆŒÿ ÿ ÿÿ ÿ ÿÿÿÿÿ ÿ'4ÿ ÿ ÿÿÿ ÿÿ ÿ ÿ ÿÿ%+1ÿ®ºÿ¨¹Äÿ¤¶Áÿ¢³¿ÿŸ°¼ÿœ®ºÿ”¨µÿ’¤²ÿ‘¤²ÿ‘¥²ÿ£±ÿˆœ«ÿƒ—¥ÿw‹šÿhy…Ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿ÷÷÷ÿúúúÿýýýÿúúúÿ¸¾ÂÿenwÿQX\ÿ=DKÿ(.4ÿ&-2ÿ"*1ÿ#+ÿ$ÿ"ÿ"ÿ!'ÿÿ ÿ#ÿ!ÿ#ÿ *ÿ#+ÿ!)0ÿ1?KÿCMUÿvƒÿŸ°¼ÿ©¹Ãÿ¦µÀÿ¤´¿ÿ ±½ÿ¯ºÿ˜«¸ÿ–©¶ÿ˜«·ÿ•¦´ÿ‰š§ÿž©ÿsƒñl€’X^fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®³¶ÿ„“ÿ~†‹ÿˆ‘–ÿ•˜ÿ‚‹‘ÿx„Œÿmu}ÿŒ”™ÿŠ’ÿ‰‘ÿ‹“ÿ”™ÿ‹’—ÿ‡Ž“ÿŽ—žÿ›¦­ÿ¨±·ÿ°¸¿ÿ¨³»à­¹Áà©¶¾à¨³¼à¨´½àª¶¿à¨´¼à£°¹à—¥°àšª³à¢°¹ä «³±’›££sƒŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹ÿŸŸŸÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿïïïÿÿÿÿÿíííÿøøøÿñññÿúúúÿîîîÿöööÿûûûÿûûûÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿÆÆÆÿ×××ÿ¹¹¹ÿ½½½ÿ®®®ÿÓÓÓÿ½½½ÿ¾¾¾ÿÇÇÇÿÓÓÓÿÊÊÊÿíííÿðððÿíííÿãããÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÍÍÍÿ¶¶¶ÿÂÂÂÿ©©©ÿÃÃÃÿÚÚÚÿÉÉÉÿÏÏÏÿÁÁÁÿÅÅÅÿÍÍÍÿÆÆÆÿÝÝÝÿÆÆÆÿ···ÿéééÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿÊÊÊÿÐÐÐÿ´´´ÿ¾¾¾ÿôôôÿâââÿÆÆÆÿÆÆÆÿÿÌÌÌÿ¯¯¯ÿ°°°ÿÏÏÏÿºººÿ¦¦¦ÿ¬¬¬ÿÍÍÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶¶¶ÿŸŸŸÿÌÌÌÿšššÿ®®®ÿïïïÿ¡¡¡ÿ©©©ÿ©©©ÿÊÊÊÿÁÁÁÿ···ÿ®®®ÿÆÆÆÿ­­­ÿœœœÿÉÉÉÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÿ³³³ÿÁÁÁÿÉÉÉÿÀÀÀÿÛÛÛÿ°°°ÿÄÄÄÿíííÿÄÄÄÿ¸¸¸ÿÜÜÜÿ°°°ÿÚÚÚÿÍÍÍÿÅÅÅÿÔÔÔÿ¿¿¿ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿÅÅÅÿÁÁÁÿ¾¾¾ÿ³³³ÿÆÆÆÿËËËÿÎÎÎÿØØØÿ¯¯¯ÿ³³³ÿÔÔÔÿ¾¾¾ÿÏÏÏÿãããÿ¸¸¸ÿ¼¼¼ÿÑÑÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿìììÿíííÿäääÿæææÿðððÿìììÿïïïÿ···ÿªªªÿÊÊÊÿðððÿìììÿàààÿúúúÿÞÞÞÿæææÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿøøøÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÄÄÄÿïïïÿÀÀÀÿ¿¿¿ÿáááÿºººÿ´´´ÿÜÜÜÿöööÿºººÿ³³³ÿçççÿ´´´ÿÕÕÕÿÀÀÀÿÆÆÆÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿóóóÿþþþÿóóóÿ÷÷÷ÿøøøÿóóóÿóóóÿûûûÿÿÿÿÿóóóÿðððÿýýýÿóóóÿöööÿõõõÿ÷÷÷ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿðÿÿÿÿÀÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿÀÿÿÿàÿÿÿðÿÿ€ÿ€/ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ïÿ€ÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsuite3270-3.6/ws3270/ws3270.rc0000664000076500007650000000010413221577163013427 0ustar pdmpdmLANGUAGE 0, 0 1 RT_MANIFEST ws3270.exe.manifest 100 ICON ws3270.ico suite3270-3.6/ws3270/x3270_glue.expect0000664000076500007650000002102713221577163015154 0ustar pdmpdm# Copyright (c) 2000-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes nor the names of his contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Glue functions between 'expect' and x3270 # Usage: source x3270_glue.expect namespace eval x3270 { variable verbose 0 variable pid 0 # Start function: Start ?-nohup? ?program? ?options? # # Sets up the 'expect' environment correctly and spawns a 3270 # interface process. # # The 'program' and 'options' can be: # "x3270 -script" to drive an x3270 session # "s3270" to drive a displayless 3270 session # "x3270if -i" to run as a child script of x3270 (via the Script() # action) # # If "args" is empty, or starts with an option besides '-nohup', # guesses which process to start. # It will only guess "x3270if -i" or "s3270"; if you want to start # x3270, you need to specify it explicitly. # # Returns the process ID of the spawned process. proc Start {args} { global stty_init timeout spawn_id env variable verbose variable pid if {$pid != 0} {return -code error "Already started."} # If the first argument is "-nohup", remember that as an # argument to 'spawn'. if {[lindex $args 0] == "-nohup"} { set nohup {-ignore HUP} set args [lrange $args 1 end] } { set nohup {} } # If there are no arguments, or the first argument is an # option, guess what to start. # If X3270INPUT is defined in the environment, this must be a # child script; start x3270if. Otherwise, this must be a peer # script; start s3270. if {$args == {} || [string index [lindex $args 0] 0] == "-"} { if {[info exists env(X3270INPUT)]} { set args [concat x3270if -i $args] } { if {$::tcl_platform(platform) == "windows"} { set args [concat ws3270 $args] } { set args [concat s3270 $args] } } } # Set up the pty initialization default. set stty_init -echo # Spawn the process. if {$verbose} { set pid [eval [concat spawn $nohup $args]] } { set pid [eval [concat spawn -noecho $nohup $args]] log_user 0 } # Set the 'expect' timeout. set timeout -1 return $pid } # Basic interface command. Used internally by the action functions # below. proc cmd {cmd} { variable verbose variable pid if {$pid==0} { return -code error "Not started yet." } if {$verbose} {puts "+$cmd"} send "$cmd\r" expect { -re "data: (.*)\r?\n.*\r?\nok\r?\n$" { set r $expect_out(buffer) } -re ".*ok\r?\n" { return {} } -re "(.*)\r?\n.*?\r?\nerror\r?\n" { return -code error "$expect_out(1,string)" } -re ".*error\r?\n" { return -code error \ "$cmd failed: $expect_out(buffer)" } eof { set pid 0; error "process died" } } # Convert result to a list. set ret {} set iter 0 while {1} { if {! [regexp "data: (.*?)\r?\n" $r dummy elt]} {break} if {$iter==1} {set ret [list $ret]} set r [string range $r [expr [string length $elt]+7] \ end] if {$iter > 0} { set ret [linsert $ret end $elt] } { set ret $elt } set iter [expr $iter + 1] } if {$verbose} {puts "ret $iter"} return $ret } # Convert an argument list to a comma-separated list that x3270 will # accept. proc commafy {alist} { set i 0 set a "" while {$i < [llength $alist]} { if {$i > 0} { set a "$a,[lindex $alist $i]" } { set a [lindex $alist $i] } incr i } return $a } # Quote a text string into x3270-acceptable format. proc stringify {text} { set a "\"" set i 0 while {$i < [string len $text]} { set c [string range $text $i $i] switch -- $c { "\n" { set a "$a\\n" } "\r" { set a "$a\\r" } " " { set a "$a\\ " } "\"" { set a "$a\\\"" } default { set a "$a$c" } } incr i } set a "$a\"" return $a } # User-accessible actions. # Some of these apply only to x3270 and x3270if, and not to s3270. proc AltCursor {} { return [cmd "AltCursor"] } proc Ascii {args} { return [cmd "Ascii([commafy $args])"] } proc AsciiField {} { return [cmd "AsciiField"] } proc Attn {} { return [cmd "Attn"] } proc BackSpace {} { return [cmd "BackSpace"] } proc BackTab {} { return [cmd "BackTab"] } proc CircumNot {} { return [cmd "CircumNot"] } proc Clear {} { return [cmd "Clear"] } proc CloseScript {} { return [cmd "CloseScript"] } proc Cols {} { return [lindex [Status] 7] } proc Compose {} { return [cmd "Compose"] } proc Connect {host} { return [cmd "Connect($host)"] } proc CursorSelect {} { return [cmd "CursorSelect"] } proc Delete {} { return [cmd "Delete"] } proc DeleteField {} { return [cmd "DeleteField"] } proc DeleteWord {} { return [cmd "DeleteWord"] } proc Disconnect {} { return [cmd "Disconnect"] } proc Down {} { return [cmd "Down"] } proc Dup {} { return [cmd "Dup"] } proc Ebcdic {args} { return [cmd "Ebcdic([commafy $args])"] } proc EbcdicField {} { return [cmd "EbcdicField"] } proc Enter {} { return [cmd "Enter"] } proc Erase {} { return [cmd "Erase"] } proc EraseEOF {} { return [cmd "EraseEOF"] } proc EraseInput {} { return [cmd "EraseInput"] } proc FieldEnd {} { return [cmd "FieldEnd"] } proc FieldMark {} { return [cmd "FieldMark"] } proc FieldExit {} { return [cmd "FieldExit"] } proc Flip {} { return [cmd "Flip"] } proc HexString {x} { return [cmd "HexString($x)"] } proc Home {} { return [cmd "Home"] } proc Info {text} { return [cmd "Info([stringify $text])"] } proc Insert {} { return [cmd "Insert"] } proc Interrupt {} { return [cmd "Interrupt"] } proc Key {k} { return [cmd "Key($k)"] } proc Keymap {k} { return [cmd "Keymap($k)"] } proc Left {} { return [cmd "Left"] } proc Left2 {} { return [cmd "Left2"] } proc MonoCase {} { return [cmd "MonoCase"] } proc MoveCursor {r c} { return [cmd "MoveCursor($r,$c)"] } proc Newline {} { return [cmd "Newline"] } proc NextWord {} { return [cmd "NextWord"] } proc PA {n} { return [cmd "PA($n)"] } proc PF {n} { return [cmd "PF($n)"] } proc PreviousWord {} { return [cmd "PreviousWord"] } proc Quit {} { exit } proc Reset {} { return [cmd "Reset"] } proc Right {} { return [cmd "Right"] } proc Right2 {} { return [cmd "Right2"] } proc Rows {} { return [lindex [Status] 6] } proc SetFont {font} { return [cmd "SetFont($font)"] } proc Snap {args} { return [cmd "Snap([commafy $args])"] } proc Status {} { variable verbose variable pid if {$pid==0} { return -code error "Not started yet." } if {$verbose} {puts "+(nothing)"} send "\r" expect { -re ".*ok\r?\n" { set r $expect_out(buffer) } eof { set pid 0; error "process died" } } return [string range $r 0 [expr [string length $r]-7]] } proc String {text} { return [cmd "String([stringify $text])"] } proc SysReq {} { return [cmd "SysReq"] } proc Tab {} { return [cmd "Tab"] } proc ToggleInsert {} { return [cmd "ToggleInsert"] } proc ToggleReverse {} { return [cmd "ToggleReverse"] } proc TemporaryKeymap {args} { return [cmd "TemporaryKeymap($args)"] } proc Transfer {args} { return [cmd "Transfer([commafy $args])"] } proc Up {} { return [cmd "Up"] } proc Wait {args} { return [cmd "Wait([commafy $args])"] } # Extra function to toggle verbosity on the fly. proc Setverbose {level} { variable verbose set verbose $level return } # Export all the user-visible functions. namespace export \[A-Z\]* } # Import all of the exported functions. namespace import x3270::* suite3270-3.6/ws3270/x3270if.man.m40000664000076500007650000002026413221577163014263 0ustar pdmpdmdnl Copyright (c) 1999-2009, 2013 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270IF,1,XX_DATE) XX_SH(Name) x3270if XX_DASHED() command interface to ifelse(XX_PLATFORM,unix,`x3270, ')dnl XX_C3270 and XX_S3270 XX_SH(Synopsis) XX_FB(x3270if) [option]... [ XX_FI(action) ] XX_BR XX_FB(x3270if XX_DASHED(i)) XX_SH(Description) XX_FB(x3270if) provides an interface between scripts and the 3270 emulators ifelse(XX_PLATFORM,unix,`XX_FI(x3270), ')dnl XX_FI(XX_C3270) and XX_FI(XX_S3270). XX_LP() XX_FB(x3270if) operates in one of two modes. In XX_FB(action mode), it passes a single action and parameters to the emulator for execution. The result of the action is written to standard output, along with the (optional) status of the emulator. (The action is optional as well, so that XX_FB(x3270if) can just reports the emulator status.) In XX_FB(iterative mode), it forms a continuous conduit between a script and the emulator. XX_LP() The XX_FI(action) takes the form: XX_IP() XX_FI(action-name)(XX_FI(param)[,XX_FI(param)]...) XX_LP() The parentheses are manatory, and usually must be quoted when XX_FB(x3270if) is called from a shell script. XX_LP() If any XX_FI(param) contains a space or comma, it must be surrounded by double quotes. XX_SH(Options) XX_TPS()dnl XX_TP(XX_FB(XX_DASHED(s)) XX_FI(field)) Causes XX_FB(x3270if) to write to stdout the value of one of the emulator status fields. XX_FI(Field) is an integer in the range 0 through 11. The value 0 is a no-op and is used only to return exit status indicating the state of the emulator. The indices 1-11 and meanings of each field are documented on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. If an XX_FI(action) is specified as well, the status field is written after the output of the action, separated by a newline. The XX_FB(XX_DASHED(s)) option is mutually exclusive with the XX_FB(XX_DASHED(S)) and XX_FB(XX_DASHED(i)) options. XX_TP(XX_FB(XX_DASHED(S))) Causes XX_FB(x3270if) to write to stdout the value of all of the emulator status fields. If an XX_FI(action) is specified as well, the status fields are written after the output of the action, separated by a newline. The XX_FB(XX_DASHED(S)) option is mutually exclusive with the XX_FB(XX_DASHED(s)) and XX_FB(XX_DASHED(i)) options. XX_TP(XX_FB(XX_DASHED(i))) Puts XX_FB(x3270if) in iterative mode. Data from XX_POSESSIVE(XX_FB(x3270if)) standard input is copied to the XX_POSESSIVE(emulator) script input; data from the XX_POSESSIVE(emulator) script output is copied to XX_POSESSIVE(XX_FB(x3270if)) standard output. The XX_FB(XX_DASHED(i)) option is mutually exclusive with the XX_FB(XX_DASHED(s)) and XX_FB(XX_DASHED(S)) options. XX_FB(x3270if) runs until it detects end-of-file on its standard input or on the output from the emulator. (This mode exists primarily to give XX_FI(expect)(1) a process to run, on systems which do not support bidirectional pipes.) ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(p)) XX_FI(process-id)) Causes XX_FI(x3270if) to use a Unix-domain socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the XX_FB(XX_DASHED(socket)) option. ')dnl XX_TP(XX_FB(XX_DASHED(t)) XX_FI(port)) Causes XX_FI(x3270if) to use a TCP socket to connect to the emulator, rather than pipe file descriptors given in environment variables. The emulator must have been started with the XX_FB(XX_DASHED(scriptport)) option. XX_TP(XX_FB(XX_DASHED(v))) Turns on verbose debug messages, showing on stderr the literal data that is passed between the emulator and XX_FB(x3270if). XX_TPE()dnl XX_SH(Exit Status) In action mode, if the requested XX_FI(action) succeeds, XX_FB(x3270if) exits with status 0. If the action fails, XX_FB(x3270if) exits with status 1. In iterative mode, XX_FB(x3270if) exits with status 0 when it encounters end-of-file. If there is an operational error within XX_FB(x3270if) itself, such as a command-line syntax error, missing environment variable, or an unexpectedly closed pipe, XX_FB(x3270if) exits with status 2. XX_SH(Environment) When a script is run as a child process of one of the emulators via the XX_FB(Script) action, the emulator passes information about how to control it in environment variables. ifelse(XX_PLATFORM,unix,`XX_LP() On Unix, the emulator process creates a pair of pipes for communication with the child script process. The values of the file descriptors for these pipes are encoded as text in two environment variables: XX_TPS()dnl XX_TP(XX_FB(X3270OUTPUT)) Output from the emulator, input to the child process. XX_TP(XX_FB(X3270INPUT)) Input to the emulator, output from the child process. XX_TPE()dnl ')dnl XX_LP() ifelse(XX_PLATFORM,unix,`When an emulator is started with the XX_FB(XX_DASHED(scriptport)) option, the ',`The') emulator will pass the scriptport port number encoded as text in the XX_FB(X3270PORT) environment variable. XX_FI(x3270if) will use that value as if it had been passed to it via the XX_FB(XX_DASHED(t)) option. ifelse(XX_PLATFORM,unix,`XX_FB(X3270PORT) takes precedence over XX_FB(X3270OUTPUT) and XX_FB(X3270INPUT). ')dnl XX_SH(See Also) ifelse(XX_PLATFORM,unix,`XX_LINK(x3270-man.html,x3270(1)), ')dnl XX_LINK(XX_C3270-man.html,XX_C3270`'(1)), XX_LINK(XX_S3270-man.html,XX_S3270`'(1)), XX_LINK(XX_X3270-script.html,XX_X3270-script(1)) XX_SH(Copyright) Copyright`'XX_COPY()1999-2009, XX_CYEAR Paul Mattes. XX_BR All rights reserved. XX_LP() Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP() THIS SOFTWARE IS PROVIDED BY PAUL MATTES XX_DQUOTED(AS IS) AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. suite3270-3.6/ws3270/x3270.man.m40000664000076500007650000023655313221577163013756 0ustar pdmpdmdnl Copyright (c) 1993-2017, Paul Mattes. dnl Copyright (c) 1990, Jeff Sparkes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes, Jeff Sparkes nor the names of their dnl contributors may be used to endorse or promote products derived from dnl this software without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND JEFF SPARKES "AS IS" AND dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR JEFF SPARKES BE LIABLE FOR dnl ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER dnl CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH dnl DAMAGE. define(XX_KEY,$1`'XX_LT()Key>$2)dnl define(XX_BTN,$1`'XX_LT()Btn$2>)dnl define(XX_action,`ifelse(XX_PRODUCT,tcl3270,command,action)')dnl define(XX_Action,`ifelse(XX_PRODUCT,tcl3270,Command,Action)')dnl XX_TH(XX_PRODUCT,1,XX_DATE) XX_SH(Name) XX_PRODUCT XX_DASH ifelse(XX_PRODUCT,c3270,`curses-based ')dnl XX_SM(IBM) host access tool XX_SH(Synopsis) XX_FB(XX_PRODUCT) ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')dnl [XX_FI(options)] [XX_FI(host)] ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_BR XX_FB(XX_PRODUCT) [XX_FI(options)] ifelse(XX_PRODUCT,tcl3270,`[XX_FI(script)] ')XX_FI(session-file).XX_PRODUCT ifelse(XX_PRODUCT,tcl3270,`[XX_DASHED(XX_DASH) XX_FI(script-arg)...] ') XX_SH(Description) XX_FB(XX_PRODUCT) opens a telnet connection to an XX_SM(IBM) ifelse(XX_PRODUCT,x3270,`host in an X window.', XX_PRODUCT,s3270,`host, then allows a script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_PRODUCT,ws3270,`host, then allows a script to control the host login session.', XX_PRODUCT,tcl3270,`host, then allows a tcl script to control the host login session. It is derived from XX_LINK(x3270-man.html,XX_FI(x3270)(1)), an X-windows IBM 3270 emulator.', XX_MODE,console,`host in a console window.') It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. ifelse(XX_PRODUCT,x3270, `The window created by XX_FB(XX_PRODUCT) can use its own font for displaying characters, so it is a fairly accurate representation of an XX_SM(IBM) 3278 or 3279. It is similar to XX_FI(tn3270)(1) except that it is X-based, not curses-based. ')dnl ifelse(XX_PRODUCT,c3270, `If the console is capable of displaying colors, then XX_FB(c3270) emulates an XX_SM(IBM) 3279. Otherwise, it emulates a 3278. ')dnl include(hostname.inc) XX_SH(Options) ifelse(XX_PRODUCT,x3270,`XX_FB(x3270) is a toolkit based program, so it understands standard Xt options and resources. It also understands',` XX_FB(XX_PRODUCT) understands') the following options:XX_TPS() ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ', `XX_TP(XX_FB(XX_DASHED(accepthostname)) XX_FI(name)) Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(activeicon))) Specifies that the icon should be a miniature version of the screen image. See XX_LINK(#Icons,XX_SM(ICONS)) below. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed using the XX_DQUOTED(bold) colors (colors 8 through 15, rather than colors 0 through 7). This helps with PC console windows in which colors 0 through 7 are unreadably dim. All-bold mode is the default for color (3279) emulation, but not for monochrome (3278) emulation. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(allbold))) Forces all characters to be displayed in bold. This helps with PC consoles which display non-bold characters in unreadably dim colors. All-bold mode is the default for color displays, but not for monochrome displays. XX_TP(XX_FB(XX_DASHED(altscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the alternate (132-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(apl))) Sets up XX_SM(APL) mode. ifelse(XX_PRODUCT,x3270,`This is actually an abbreviation for several options. ')dnl See XX_LINK(#APL-Support,XX_SM(APL SUPPORT)) below. ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(cadir)) XX_FI(directory)) Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) XX_TP(XX_FB(XX_DASHED(cafile)) XX_FI(filename)) Specifies a XX_SM(PEM)-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only) ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(cbreak))) Causes XX_FB(c3270) to operate in XX_FI(cbreak) mode, instead of XX_FI(raw) mode. In XX_FI(cbreak) mode, the TTY driver will properly process XOFF and XON characters, which are required by some terminals for proper operation. However, those characters (usually ^S and ^Q), as well as the characters for XX_FB(interrupt), XX_FB(quit), and XX_FB(lnext) (usually ^C, ^XX_BACKSLASH and ^V respectively) will be seen by XX_FB(c3270) only if preceded by the XX_FB(lnext) character. The XX_FB(susp) character (usually ^Z) cannot be seen by XX_FB(c3270) at all. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(cc)) XX_FI(range):XX_FI(value)[`,'...]) Sets character classes. XX_HO(`See XX_LINK(#Character-Classes,XX_SM(CHARACTER CLASSES)), below. ')dnl ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfile)) XX_FI(filename)) Specifies a file containing a client certificate to provide to the host. The default file type is XX_SM(PEM). ')dnl XX_TP(XX_FB(XX_DASHED(clientcert)) XX_FI(name)) Specifies the name of a client certificate to provide to the host. ifelse(XX_PLATFORM,unix,`(MacOS only) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(certfiletype)) XX_FI(type)) Specifies the type of the certificate file specified by XX_FB(XX_DASHED(certfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(chainfile) XX_FI(filename))) Specifies a certificate chain file in XX_SM(PEM) format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If XX_FB(XX_DASHED(chainfile)) is specified, it overrides XX_FB(XX_DASHED(certfile)). (OpenSSL only) ')dnl XX_TP(XX_FB(XX_DASHED(charset)) XX_FI(name)) Specifies an XX_SM(EBCDIC) host character set. XX_HO(`See XX_LINK(#Character-Sets,XX_SM(CHARACTER SETS)) below. ')dnl XX_TP(XX_FB(XX_DASHED(clear)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(false). define(XX_TOGGLEREF,`ifelse(XX_PRODUCT,x3270,Menus,Toggles)')dnl define(XX_TOGGLEREFNM,`ifelse(XX_PRODUCT,x3270,MENUS,TOGGLES)')dnl XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl XX_TP(XX_FB(XX_DASHED(connecttimeout)) XX_FI(seconds)) Specifies the time that XX_PRODUCT will wait for a host connection to complete. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defaultfgbg))) Causes XX_PRODUCT to use the XX_POSESSIVE(terminal) default foreground color instead of the curses color XX_FB(black), and the XX_POSESSIVE(terminal) default background color instead of the curses color XX_FB(white). This is helpful for emulators such as XX_FI(gnome-terminal) whose representation of a black background is a murky gray, and for emulators configured to use black text on a white background. It is set automatically if the environment variable XX_FB(COLORTERM) is set to XX_FB(gnome-terminal). It is available only if XX_PRODUCT was compiled with a version of XX_FI(ncurses) that supports default colors, if the emulator supports default colors, and if the termcap/terminfo entry indicates this capability. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(defscreen) XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string))) Defines the dimensions and escape sequence for the default (80-column) screen mode. See XX_LINK(#Screen-Size-Switching,XX_SM(SCREEN SIZE SWITCHING)), below. ')dnl XX_TP(XX_FB(XX_DASHED(devname)) XX_FI(name)) Specifies a device name (workstation ID) for RFC 4777 support. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(efont)) XX_FI(name)) Specifies a font for the emulator window. XX_HO(`See XX_LINK(#Fonts,XX_SM(FONTS)) below. ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(hostsfile)) XX_FI(file)) Uses XX_FI(file) as the hosts file, which allows aliases for host names and scripts to be executed at login. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(1)) for details. ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(XX_DASHED(httpd)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for HTTP connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(scriptport) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(iconname)) XX_FI(name)) Specifies an alternate title for the program icon. XX_TP(XX_FB(XX_DASHED(iconx)) XX_FI(x)) Specifies the initial x coordinate for the program icon. XX_TP(XX_FB(XX_DASHED(icony)) XX_FI(y)) Specifies the initial y coordinate for the program icon. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(im)) XX_FI(method)) Specifies the name of the input method to use for multi-byte input. (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_PLATFORM,unix, `XX_TP(XX_FB(XX_DASHED(keyfile)) XX_FI(filename)) Specifies a file containing the private key for the certificate file (specified via XX_FB(XX_DASHED(certfile)) or XX_FB(XX_DASHED(chainfile))). The default file type is XX_SM(PEM). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keyfiletype)) XX_FI(type)) Specifies the type of the private key file specified by XX_FB(XX_DASHED(keyfile)). XX_FI(Type) can be XX_FB(pem) or XX_FB(asn1). (OpenSSL only) XX_TP(XX_FB(XX_DASHED(keypasswd)) XX_FI(type):XX_FI(value)) Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be XX_FB(file):XX_FI(filename), specifying that the password is in a file, or XX_FB(string):XX_FI(string), specifying the password on the command-line directly. If the private key file is encrypted and no XX_FB(XX_DASHED(keypasswd)) option is given, ifelse(XX_INTERACTIVE,yes,`the password will be prompted for interactively.', `secure connections will not be allowed.') ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keymap name and optional modifiers. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(keymap)) XX_FI(name)) Specifies a keyboard map to be found in the resource XX_FB(c3270.keymap.)`'XX_FI(name) or the file XX_FI(name). See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below for details. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(keypad))) Turns on the keypad as soon as XX_FB(XX_PRODUCT) starts. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(XX_DASHED(km)) XX_FI(name)) Specifies the local encoding method for multi-byte text. XX_FI(name) is an encoding name recognized by the ICU library. (Supported only when XX_PRODUCT is compiled with DBCS support, and necessary only when XX_PRODUCT cannot figure it out from the locale.) ')dnl XX_TP(XX_FB(XX_DASHED(loginmacro)) XX_FI(Action(arg...) ...)) Specifies a macro to run at login time. ifelse(XX_PRODUCT,ws3270,`XX_TP(XX_FB(XX_DASHED(localcp) XX_FI(codepage))) Specifies the Windows code page to use for local I/O. The default is to use the XX_POSESSIVE(system) ANSI code page. ')dnl ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(minversion)) XX_FI(version)) The minimum required version of XX_FB(XX_PRODUCT), e.g., XX_VERSION_NUMBER. If the running version is less than the specified version, XX_FB(XX_PRODUCT) will abort. The format of a version is XX_FI(major)`'XX_FB(.)`'XX_FI(minor)`'XX_FB(type)`'XX_FI(iteration). XX_FB(type) is ignored, and XX_FI(minor) and XX_FI(iteration) can be omitted. ')dnl XX_TP(XX_FB(XX_DASHED(model)) XX_FI(name)) The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted: XX_IP The first part is the XX_FB(base model), which is either XX_FB(3278) or XX_FB(3279). XX_FB(3278) specifies a monochrome (green on black) 3270 display; XX_FB(3279) specifies a color 3270 display. XX_IP The second part is the XX_FB(model number), which specifies the number of rows and columns. Model 4 is the default. XX_PP XX_TS(3,`center; c c c .') XX_TR(XX_TD(XX_TC(Model Number)) XX_TD(XX_TC(Columns)) XX_TD(XX_TC(Rows))) XX_T_ XX_TR(XX_TD(XX_TC(2)) XX_TD(XX_TC(80)) XX_TD(XX_TC(24))) XX_TR(XX_TD(XX_TC(3)) XX_TD(XX_TC(80)) XX_TD(XX_TC(32))) XX_TR(XX_TD(XX_TC(4)) XX_TD(XX_TC(80)) XX_TD(XX_TC(43))) XX_TR(XX_TD(XX_TC(5)) XX_TD(XX_TC(132)) XX_TD(XX_TC(27))) XX_TE() XX_IP Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway. XX_IP The default model ifelse(XX_PRODUCT,x3270,`for a color X display is XX_FB(`3279'XX_DASHED(4)). For a monochrome X display, it is XX_FB(`3278'XX_DASHED(4)).', XX_PRODUCT,c3270,`for a color display is XX_FB(`3279'XX_DASHED(4)). For a monochrome display, it is XX_FB(`3278'XX_DASHED(4)).', `is XX_FB(`3279'XX_DASHED(4)).') ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(mono))) Forces XX_FB(XX_PRODUCT) to believe it is running on a monochrome X display. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(mono))) Prevents XX_FB(XX_PRODUCT) from using color, ignoring any color capabilities reported by the terminal. XX_TP(XX_FB(XX_DASHED(noprompt))) An alias for XX_DASHED(secure). ')dnl XX_TP(XX_FB(XX_DASHED(noverifycert))) For SSL/TLS connections, do not verify the host certificate. XX_TP(XX_FB(XX_DASHED(nvt))) Start in NVT mode instead of waiting for the host to send data, and make the default terminal type XX_FB(xterm). ifelse(XX_PRODUCT,x3270, XX_TP(XX_FB(XX_DASHED(once))) Causes XX_FB(XX_PRODUCT) to exit after a host disconnects. This option has effect only if a hostname is specified on the command line. )dnl XX_TP(XX_FB(XX_DASHED(oversize)) XX_FI(cols)`'XX_FB(x)`'XX_FI(rows)) Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "XX_PRODUCT.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing. ifelse(XX_MODE,console,`XX_IP It can also be specified as XX_FB(auto), which causes XX_FB(XX_PRODUCT) to fill the entire terminal or console window. ')dnl XX_TP(XX_FB(XX_DASHED(port)) XX_FI(n)) Specifies a different XX_SM(TCP) port to connect to. XX_FI(n) can be a name from XX_FB(/etc/services) like XX_FB(telnet), or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.) ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl XX_TP(XX_FB(XX_DASHED(proxy) XX_FI(type):XX_FI(host)[:XX_FI(port)])) Causes XX_FB(XX_PRODUCT) to connect via the specified proxy, instead of using a direct connection. The XX_FI(host) can be an IP address or hostname. The optional XX_FI(port) can be a number or a service name. For a list of supported proxy XX_FI(types), see XX_LINK(#Proxy,XX_SM(PROXY)) below. ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(printerlu) XX_FI(luname))) Causes XX_FB(XX_PRODUCT) to automatically start a XX_FI(pr3287) printer session. If XX_FI(luname) is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(pt)) XX_FI(type)) Specifies the preedit type for the multi-byte input method. Valid values are XX_FB(OverTheSpot), XX_FB(OffTheSpot), XX_FB(Root) and XX_FB(OnTheSpot). The value for XX_FB(OverTheSpot) can `include' an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. XX_FB(OverTheSpot+1) or XX_FB(OverTheSpot-2). The default value is XX_FB(OverTheSpot+1). (Supported only when XX_PRODUCT is compiled with DBCS support.) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(reconnect))) Causes XX_FB(XX_PRODUCT) to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line. ')dnl ifelse(XX_PRODUCT,c3270,`XX_TP(XX_FB(XX_DASHED(rv))) Switches XX_PRODUCT from a white-on-black display to a black-on-white display. ')dnl ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(XX_DASHED(sb))) Turns on the scrollbar. XX_TP(XX_FB(+sb)) Turns the scrollbar off. XX_TP(XX_FB(XX_DASHED(scheme)) XX_FI(name)) Specifes a color scheme to use in 3279 mode. This option has effect only in combination with 3279 emulation. XX_HO(`See XX_LINK(#Color-Schemes,XX_SM(COLOR SCHEMES)) below. ')dnl XX_TP(XX_FB(XX_DASHED(script))) Causes XX_FB(XX_PRODUCT) to read commands from standard input, with the results written to standard output. The protocol for these commands is documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(XX_DASHED(sl)) XX_FI(n)) Specifies that XX_FI(n) lines should be saved for scrolling back. The default is 4096. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(S))) Runs XX_PRODUCT in auto-shortcut mode. XX_PRODUCT will create a temporary shorcut (.LNK file) that matches the parameters in the session file (model number, characterset, etc.) and re-run itself from the shortcut. XX_TP(XX_FB(+S)) Disables auto-shortcut mode. It is generally a good idea to put this option on the command lines of all shortcuts, to avoid infinite looping. ')dnl ifelse(XX_PRODUCT,tcl3270,, `XX_TP(XX_FB(XX_DASHED(scriptport)) XX_FB(`[')`'XX_FI(addr)`'XX_FB(`:]')`'XX_FI(port)) Specifies a port and optional address to listen on for scripting connections. XX_FI(Addr) can be specified as XX_DQUOTED(*) to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081. XX_IP Note that this option is mutually-exclusive with the XX_DASHED(httpd) option ifelse(XX_MODE,script,`and disables reading commands from standard input.',.) XX_TP(XX_FB(XX_DASHED(scriptportonce))) Allows XX_PRODUCT to accept only one script connection. When that connection is broken, XX_PRODUCT will exit. ')dnl ifelse(XX_PRODUCT,c3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables the interactive XX_FB(c3270>) prompt. When used, a hostname must be provided on the command line. ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(XX_DASHED(secure))) Disables run-time features that could compromise system security (user-specified file names and commands, etc.). ')dnl XX_TP(XX_FB(XX_DASHED(set)) XX_FI(toggle)) Sets the initial value of XX_FI(toggle) to XX_FB(true). XX_HO(`The list of toggle names is under XX_LINK(`#'XX_TOGGLEREF,XX_SM(XX_TOGGLEREFNM)) below. ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_TP(XX_FB(XX_DASHED(socket))) Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named XX_FB(/tmp/x3sck.)`'XX_FI(pid). ')dnl The XX_FB(XX_DASHED(p)) option of XX_FI(x3270if) causes it to use this socket, instead of pipes specified by environment variables. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(XX_DASHED(title)) XX_FI(text)) Sets the console window title to XX_FI(text), overriding the automatic setting of the hostname and the string XX_FB(wc3270). ')dnl XX_TP(XX_TARGET(tn)XX_FB(XX_DASHED(tn)) XX_FI(name)) Specifies the terminal name to be transmitted over the telnet connection. The default name is XX_FB(`IBM'XX_DASH)`'XX_FI(model_name)`'XX_FB(XX_DASHED(E)), for example, ifelse(XX_PRODUCT,x3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', XX_PRODUCT,c3270,`XX_FB(`IBM'XX_DASHED(3279)XX_DASHED(4)XX_DASHED(E)) for a color ifelse(XX_PRODUCT,x3270,`X ')display, or XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)) for a monochrome ifelse(XX_PRODUCT,x3270,`X ')display.', `XX_FB(`IBM'XX_DASHED(3278)XX_DASHED(4)XX_DASHED(E)).') XX_IP Some hosts are confused by the XX_FB(XX_DASHED(E)) suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an XX_FB(s:) on the hostname, or setting the "XX_PRODUCT.extended" resource to "false", removes the XX_FB(XX_DASHED(E)) from the terminal name when connecting to such hosts. XX_IP The name can also be specified with the "XX_PRODUCT.termName" resource. XX_TP(XX_FB(XX_DASHED(trace))) Turns on data stream ifelse(XX_PRODUCT,x3270,,`and event ')tracing at startup. ifelse(XX_PRODUCT,x3270,`Unlike turning it on from a menu option, there is no pop-up to confirm the file name, which defaults to', `The default trace file name is') ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) on the current XX_POSESSIVE(user) Desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3trc)'). XX_TP(XX_FB(XX_DASHED(tracefile)) XX_FI(file)) Specifies a file to save data stream and event traces into. If the name starts with XX_DQUOTED(>>), data will be appended to the file. ifelse(XX_PRODUCT,x3270,`If the value XX_FB(stdout) is given, then traces will be written to standard output. If the value XX_FB(none) is given, then traces will be piped directly to the monitor window, and no file will be created. ')dnl XX_TP(XX_FB(XX_DASHED(tracefilesize)) XX_FI(size)) Places a limit on the size of a trace file. If this option is not specified, or is specified as XX_FB(0) or XX_FB(none), the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of XX_FI(size) can have a XX_FB(K) or XX_FB(M) suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a XX_DQUOTED(-) appended and a new file started. XX_TP(XX_FB(XX_DASHED(user)) XX_FI(name)) Specifies the user name for RFC 4777 support. ifelse(XX_MODE,script,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(XX_DASHED(utf8))) Forces the local codeset to be UTF-8, ignoring the locale or Windows codepage. ')dnl XX_TP(XX_FB(XX_DASHED(v))) Display the version and build options for XX_FB(XX_PRODUCT) and exit. XX_TP(XX_FB(XX_DASHED(verifycert))) For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a XX_FB(y:) prepended to the hostname when connecting. ifelse(XX_PRODUCT,x3270,, `XX_TP(XX_FB(XX_DASHED(xrm)) "XX_PRODUCT.XX_FI(resource): XX_FI(value)") Sets the value of the named XX_FI(resource) to XX_FI(value). Resources control less common XX_FB(XX_PRODUCT) options, and are defined under XX_LINK(#Resources,XX_SM(RESOURCES)) below. ')dnl ifelse(XX_PRODUCT,tcl3270, `XX_TP(XX_FB(XX_DASHED()XX_DASHED())) Terminates the list of XX_FB(tcl3270) options. Whatever follows will be available to the script in the XX_FB($argv) tcl variable. ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,x3270,`XX_LP After reading resource definitions from the X server and any standandard X11 resource definition files (XX_FB($HOME/.Xdefaults), etc.), XX_FB(XX_PRODUCT) will read definitions from the file XX_FB($HOME/.x3270pro). This file contains local customizations and is also used to save changed options by the XX_FB(Save Changed Options in File) menu option. XX_LP Note that XX_FB(XX_DASHED(xrm)) options override any definitions in the XX_FB(.x3270pro) file. ')dnl XX_HO(`ifelse(XX_PRODUCT,x3270,`XX_SH(Fonts) XX_FB(XX_PRODUCT) does not use the "*font" resource for its main window. Instead, it uses a custom 14-point font called XX_FB(3270), which is a close approximation of a real 3270 display and allows XX_FB(XX_PRODUCT) to display the XX_SM(ISO) `8859'XX_DASHED(1) (`Latin'XX_DASH()1) character set and special status-line symbols. A more compact font, XX_FB(`3270'XX_DASHED(12)), is also supported, as are the various sized fonts XX_FB(3270gt8), XX_FB(3270gt12), XX_FB(3270gt16), XX_FB(3270-20), XX_FB(3270gt24), and XX_FB(3270gt32). The fonts XX_FB(3270h) and XX_FB(3270gr) are also included to allow display of Hebrew and Greek text, respectively. XX_LP The font may be specified with the XX_FB(XX_DASHED(efont)) option or the "XX_PRODUCT.emulatorFont" resource. XX_LP XX_FB(XX_PRODUCT) can also use any X11 font that implements the display character set required by the host XX_SM(EBCDIC) character set. XX_PP An additional font, XX_FB(3270d), is supplied. This font is identical to the default XX_FB(3270) font, except that it has bitmaps defined for field attribute characters. This means that field attributes, which are normally displayed as blanks, are now visible on the screen. The characters displayed are hexadecimal codes, which can be translated using a document provided with the XX_FB(XX_PRODUCT) sources. XX_LP The font can be changed at any time through a menu option. It can also be implicitly changed by changing the size of the XX_FB(XX_PRODUCT) window with the mouse: if the window is made larger, XX_PRODUCT will try to change to a larger font, and vice-versa. ')dnl ifelse(XX_MODE,console,`XX_SH(Modes) XX_FB(XX_PRODUCT) has two basic modes: XX_FI(command-prompt) and XX_FI(session). XX_PP XX_FI(Command-prompt) mode is where the XX_FB(XX_PRODUCT`'>) prompt is displayed. Interactive commands can be entered at this prompt, to connect to a host, disconnect from a host, transfer files, display statistics, exit XX_FB(XX_PRODUCT), etc. The complete list of interactive commands is listed under XX_LINK(#Actions,XX_SM(ACTIONS)). XX_PP XX_FI(Session) mode is where the emulated 3270 screen is displayed; keyboard commands cause the display buffer to be modified or data to be sent to the host. XX_PP To switch from display mode to command-prompt mode, press ifelse(XX_PRODUCT,c3270,`Ctrl-]',`the Escape key'). To switch from command-prompt mode to display mode, press XX_FB(Enter) (without entering a command) at the XX_FB(XX_PRODUCT`'>) prompt. ')dnl XX_SH(Character Sets) The XX_FB(XX_DASHED(charset)) option or the "XX_PRODUCT.charset" resource controls the XX_SM(EBCDIC) host character set used by XX_FB(XX_PRODUCT). Available sets `include': XX_PP define(XX_CG1A,ifelse(XX_PRODUCT,x3270,3270cg-1a))dnl define(XX_CG1,ifelse(XX_PRODUCT,x3270,3270cg-1))dnl define(XX_CG7,ifelse(XX_PRODUCT,x3270,3270cg-7))dnl define(XX_CG8,ifelse(XX_PRODUCT,x3270,3270cg-8))dnl define(XX_CG9,ifelse(XX_PRODUCT,x3270,3270cg-9))dnl define(XX_CG11,ifelse(XX_PRODUCT,x3270,3270cg-11))dnl define(XX_CG15A,ifelse(XX_PRODUCT,x3270,3270cg-15a))dnl define(XX_CG15,ifelse(XX_PRODUCT,x3270,3270cg-15))dnl define(XX_88591,ifelse(XX_PLATFORM,windows,`',iso8859-1))dnl define(XX_88592,ifelse(XX_PLATFORM,windows,`',iso8859-2))dnl define(XX_88597,ifelse(XX_PLATFORM,windows,`',iso8859-7))dnl define(XX_88598,ifelse(XX_PLATFORM,windows,`',iso8859-8))dnl define(XX_88599,ifelse(XX_PLATFORM,windows,`',iso8859-9))dnl define(XX_885911,ifelse(XX_PLATFORM,windows,`',iso8859-11))dnl define(XX_885915,ifelse(XX_PLATFORM,windows,`',iso8859-15))dnl define(XX_KOI8R,ifelse(XX_PLATFORM,windows,`',koi8-r))dnl define(XX_TIS,ifelse(XX_PLATFORM,windows,`',tis620.2529-0))dnl define(XX_GB,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + gb2312.1980-0))dnl define(XX_GBX,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + iso10646-1))dnl define(XX_BIG5,ifelse(XX_PLATFORM,windows,`',XX_CG1A XX_88591 + Big5-0))dnl define(XX_JIS,ifelse(XX_PLATFORM,windows,`',jisx0201.1976-0 + jisx0208.1983-0))dnl XX_TS(3,`center; l l l lfB l l.') XX_TR(XX_TD(XX_TC(Charset Name)) XX_TD(XX_TC(Host Code Page)) XX_TD(XX_TC(ifelse(XX_PRODUCT,x3270,Display Character Sets,XX_PRODUCT,c3270,Display Character Set,XX_PLATFORM,windows,`',Character Set)))) XX_T_() ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TD(XX_TC(apl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A))) ')dnl XX_TR(XX_TD(XX_TC(belgian)) XX_TD(XX_TC(500)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(belgian-euro)) XX_TD(XX_TC(1148)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(bracket)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(brazilian)) XX_TD(XX_TC(275)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(chinese-gb18030)) XX_TD(XX_TC(1388)) XX_TD(XX_TC(XX_GBX))) XX_TR(XX_TD(XX_TC(cp1047)) XX_TD(XX_TC(1047)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(cp870)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88592))) XX_TR(XX_TD(XX_TC(finnish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(finnish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(french)) XX_TD(XX_TC(297)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(french-euro)) XX_TD(XX_TC(1147)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(german)) XX_TD(XX_TC(273)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(german-euro)) XX_TD(XX_TC(1141)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(greek)) XX_TD(XX_TC(423)) XX_TD(XX_TC(XX_CG7 XX_88597))) XX_TR(XX_TD(XX_TC(hebrew)) XX_TD(XX_TC(424)) XX_TD(XX_TC(XX_CG8 XX_88598))) XX_TR(XX_TD(XX_TC(icelandic)) XX_TD(XX_TC(871)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(icelandic-euro)) XX_TD(XX_TC(1149)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(italian)) XX_TD(XX_TC(280)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(italian-euro)) XX_TD(XX_TC(1144)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(japanese-kana)) XX_TD(XX_TC(930)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(japanese-latin)) XX_TD(XX_TC(939)) XX_TD(XX_TC(XX_JIS))) XX_TR(XX_TD(XX_TC(norwegian)) XX_TD(XX_TC(277)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(norwegian-euro)) XX_TD(XX_TC(1142)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(russian)) XX_TD(XX_TC(880)) XX_TD(XX_TC(XX_KOI8R))) XX_TR(XX_TD(XX_TC(simplified-chinese)) XX_TD(XX_TC(935)) XX_TD(XX_TC(XX_GB))) XX_TR(XX_TD(XX_TC(slovenian)) XX_TD(XX_TC(870)) XX_TD(XX_TC(XX_88592))) XX_TR(XX_TD(XX_TC(spanish)) XX_TD(XX_TC(284)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(spanish-euro)) XX_TD(XX_TC(1145)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(swedish)) XX_TD(XX_TC(278)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(swedish-euro)) XX_TD(XX_TC(1143)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(thai)) XX_TD(XX_TC(1160)) XX_TD(XX_TC(XX_885911 XX_TIS))) XX_TR(XX_TD(XX_TC(traditional-chinese)) XX_TD(XX_TC(937)) XX_TD(XX_TC(XX_BIG5))) XX_TR(XX_TD(XX_TC(turkish)) XX_TD(XX_TC(1026)) XX_TD(XX_TC(XX_88599))) XX_TR(XX_TD(XX_TC(uk)) XX_TD(XX_TC(285)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TR(XX_TD(XX_TC(uk-euro)) XX_TD(XX_TC(1146)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-euro)) XX_TD(XX_TC(1140)) XX_TD(XX_TC(XX_CG15A XX_CG15 XX_885915))) XX_TR(XX_TD(XX_TC(us-intl)) XX_TD(XX_TC(037)) XX_TD(XX_TC(XX_CG1A XX_CG1 XX_88591))) XX_TE() XX_PP The default character set is XX_FB(bracket), which is useful for common U.S. XX_SM(IBM) hosts which use XX_SM(EBCDIC) codes AD and BD for the XX_DQUOTED([) and XX_DQUOTED(]) characters, respectively. XX_PP Note that any of the host code pages listed above can be specified by adding XX_FB(cp) to the host code page, e.g., XX_FB(cp037) for host code page 037. Also note that the code pages available for a given version of XX_FB(XX_PRODUCT) are displayed by the XX_FB(XX_DASHED(v)) command-line option. ifelse(XX_PRODUCT,wc3270,`XX_PP Note that DBCS character sets (Chinese, Japanese) display properly only on 32-bit Windows XP. Work is proceeding on other platforms. ')dnl ifelse(XX_PRODUCT,x3270, `XX_PP Most 3270 fonts implement the 3270cg-1 display character set, which is a reordered version of the XX_SM(ISO) `8859'XX_DASHED(1) character set. Some implement the 3270cg-1a display character set, which is a superset of 3270cg-1 that includes APL2 characters. 3270h and 3270gr implement special character sets for Hebrew and Greek, respectively. XX_PP You can also specify national-language translations for your keyboard; see XX_LINK(#Keymaps,XX_SM(KEYMAPS)) below. ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Character Classes) XX_FB(XX_PRODUCT) supports character classes (groupings of characters chosen with a double mouse click) in the same manner as XX_FI(xterm)(1). The "XX_PRODUCT.charClass" resource or the XX_FB(XX_DASHED(cc)) option can be used to alter the character class table. The default table is the same as XX_POSESSIVE(XX_FI(xterm)); It groups letters together, and puts most punctuation characters in individual classes. To put all non-whitespace characters together in the same class (and duplicate the behavior of some early versions of XX_FB(XX_PRODUCT), use the following value: XX_PP XX_RS(`33-127:48,161-255:48') XX_PP See XX_FI(xterm)(1) for further syntax details. XX_SH(Keypad) A keypad may optionally be displayed, with a mouse-clickable button for each 3270 function key (these functions are also available from the keyboard). The keypad can be turned on and off by clicking on the "keypad" button in the upper-right-hand corner of the window. The "XX_PRODUCT.keypad" resource controls where it is displayed. Options are: XX_PP XX_TS(2,center; l l.) XX_TR(`XX_TD(left) XX_TD(`in a separate window, to the left of the screen')') XX_TR(`XX_TD(right) XX_TD(`in a separate window, to the right of the screen')') XX_TR(`XX_TD(bottom) XX_TD(`in a separate window, below the screen')') XX_TR(`XX_TD(integral) XX_TD(`in the same window as the screen, below it')') XX_TE() XX_PP The default is XX_FB(right). XX_PP If the "XX_PRODUCT.keypadOn" resource is set to XX_FB(true), the keypad will be displayed at startup. ')dnl ifelse(XX_MODE,console,`XX_SH(Menu Bar and Keypad) XX_FB(XX_PRODUCT) supports a menu bar and pop-up keypad. The menu bar allows common functions to be executed without needing to switch to the XX_FB(XX_PRODUCT>) prompt. It is available by pressing Alt-N, or if the console supports a mouse, by clicking on the menu titles displayed at the top of the screen. XX_LP The on-screen menu title bar can be turned off via the "XX_PRODUCT.menuBar" resource. XX_LP The pop-up keypad allows the 3270-specific keys (XX_SM(PF) keys, XX_SM(PA) keys, Clear, Reset, etc.) to be invoked without memorizing their key mappings or switching to the XX_FB(XX_PRODUCT>) prompt. The keypad can be popped up by pressing Alt-K, or can be invoked via a menu option. ')dnl ifelse(XX_MODE,script,,XX_PRODUCT,tcl3270,,XX_PLATFORM,windows,, `XX_SH(Hosts Database) XX_FB(XX_PRODUCT) uses the XX_FI(ibm_hosts) database to ifelse(XX_PRODUCT,x3270,`construct a pull-down menu of hosts to connect to. It also allows host name aliases to be defined, as well as specifying ',XX_PRODUCT,c3270,``define' aliases for host names, and to specify ')dnl macros to be executed when a connection is first made. See XX_LINK(ibm_hosts.html,XX_FI(ibm_hosts)(5)) for details. XX_LP You may specify a different XX_FI(ibm_hosts) database with the "XX_PRODUCT.hostsFile" resource. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Color Schemes) When emulating a 3279 display, the X colors used to draw the display are selected by two resources: the "XX_PRODUCT.colorScheme" resource, which gives the name of the color scheme to use, and the individual "XX_PRODUCT.colorScheme.XX_FI(xxx)" resources, which give the actual definitions. The color scheme resources are documented in the XX_FB(Resources) file with the XX_FB(XX_PRODUCT) source. XX_LP The color scheme may also be changed while XX_FB(XX_PRODUCT) is running with a selection from the XX_FB(Options) menu. ')dnl XX_SH(NVT Mode) Some hosts use an XX_SM(ASCII) front-end to do initial login negotiation, then later switch to 3270 mode. XX_FB(XX_PRODUCT) will emulate an XX_SM(ANSI) X3.64 terminal until the host places it in 3270 mode (telnet XX_SM(BINARY) and XX_SM(SEND EOR) modes, or XX_SM(TN3270E) mode negotiation). ifelse(XX_PRODUCT,x3270,`The emulation is fairly complete; however, it is not intended to make XX_FB(XX_PRODUCT) a replacement for XX_FI(xterm)(1). ')dnl XX_PP If the host later negotiates to stop functioning in 3270 mode, XX_FB(XX_PRODUCT) will return to XX_SM(NVT) emulation. XX_PP In XX_SM(NVT) mode, XX_FB(XX_PRODUCT) supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources: XX_PP XX_TS(3,center; l c c.) XX_TR(XX_TD(Mode/Character) XX_TD(Resource) XX_TD(Default)) XX_T_() XX_TR(XX_TD(Translate CR to NL) XX_TD(XX_PRODUCT.icrnl) XX_TD(true)) XX_TR(XX_TD(Translate NL to CR) XX_TD(XX_PRODUCT.inlcr) XX_TD(false)) XX_TR(XX_TD(Erase previous character) XX_TD(XX_PRODUCT.erase) XX_TD(^?)) XX_TR(XX_TD(Erase entire line) XX_TD(XX_PRODUCT.kill) XX_TD(^U)) XX_TR(XX_TD(Erase previous word) XX_TD(XX_PRODUCT.werase) XX_TD(^W)) XX_TR(XX_TD(Redisplay line) XX_TD(XX_PRODUCT.rprnt) XX_TD(^R)) XX_TR(XX_TD(Ignore special meaning of next character) XX_TD(XX_PRODUCT.lnext) XX_TD(^V)) XX_TR(XX_TD(Interrupt) XX_TD(XX_PRODUCT.intr) XX_TD(^C)) XX_TR(XX_TD(Quit) XX_TD(XX_PRODUCT.quit) XX_TD(^XX_BS())) XX_TR(XX_TD(End of file) XX_TD(XX_PRODUCT.eof) XX_TD(^D)) XX_TE() ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_LP Separate keymaps can be defined for use only when XX_FB(XX_PRODUCT) is in 3270 mode or XX_SM(NVT) mode. See XX_LINK(#Keymaps,XX_SM(KEYMAPS)) for details. ')dnl ifelse(XX_PRODUCT,x3270,`include(menus.inc)',`XX_SH(Toggles) XX_FB(XX_PRODUCT) has a number of configurable modes which may be selected by the XX_FB(XX_DASHED(set)) and XX_FB(XX_DASHED(clear)) options. These names can also be used as the first parameter to the XX_FB(Toggle) action, and are the names of resources that can be used to set or clear the value of each toggle at start-up. XX_TPS()dnl XX_TP(XX_FB(aidWait)) Changes the behavior of actions that send an XX_SM(AID) to the host (XX_FB(Enter), XX_FB(Clear), XX_FB(PA) and XX_FB(PF)). When set, these actions no longer block until the host unlocks the keyboard. It is up to the script to poll the prompt for the unlocked state, or to use the XX_FB(Wait(Unlock)) action to wait for the unlock. ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(altCursor)) If set, the cursor will be an underline. If clear, it will be a solid block. ')dnl XX_TP(XX_FB(blankFill)) If set, XX_FB(XX_PRODUCT) modifies interactive 3270 behavior in two ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying XX_DQUOTED(lock-up) that often occurs when inserting into an field with (apparent) space at the end. ifelse(XX_MODE,console,`XX_TP(XX_FB(crosshair)) When set, XX_PRODUCT will display a crosshair to help locate the cursor on the screen. ')dnl XX_TP(XX_FB(lineWrap)) If set, the XX_SM(NVT) terminal emulator automatically assumes a XX_SM(NEWLINE) character when it reaches the end of a line. ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(marginedPaste)) If set, pasting multi-line input via the XX_FB(Paste) action will maintain a left margin (it will not move the cursor further left than where the paste begins). ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TP(XX_FB(monoCase)) If set, XX_FB(XX_PRODUCT) operates in uppercase-only mode. ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TP(XX_FB(overlayPaste)) If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the XX_FB(marginedPaste) toggle. ')dnl XX_TP(XX_FB(screenTrace)) Turns on screen tracing at start-up. Each time the screen changes, its contents are appended to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). ifelse(XX_MODE,console,`XX_TP(XX_FB(showTiming)) If set, the time taken by the host to process an XX_SM(AID) is displayed on the status line. ')dnl XX_TP(XX_FB(trace)) Turns on data stream and event tracing at start-up. Network traffic (both a hexadecimal representation and its interpretation) is logged to the file ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the wc3270 AppData directory',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). The directory for the trace file can be changed with the "XX_PRODUCT.traceDir" resource. Script commands are also traced. ifelse(XX_MODE,console,`XX_TP(XX_FB(underscore)) If set, XX_PRODUCT will display underlined fields by substituting underscore XX_DQUOTED(_) characters for blanks or nulls in the field. Otherwise, these fields will be displayed ifelse(XX_PRODUCT,c3270,`using the XX_POSESSIVE(terminal) native underlining mode, if one is defined. ',`with a highlighted background. Note that setting XX_FB(underscore) also disables the highlighted background for blinking fields. XX_FB(underscore) is set by default. ')dnl ')dnl ifelse(XX_MODE,console,`XX_TP(XX_FB(visibleControl)) If set, control characters (NULLs, SI/SO and field attributes), which are usually displayed as blanks, are visible on the display. NULs become periods, SO becomes XX_DQUOTED(XX_LT()), SI becomes XX_DQUOTED(>). Field attributes are mapped onto the characters 0 through 9 and A through V and are displayed in ifelse(c3270,`underlined',wc3270,`reverse-video') yellow. Field attribute mappings are part of the XX_FB(XX_PRODUCT) Resources documentation for the XX_FB(visibleControl) resource. ')dnl XX_TPE()dnl XX_LP ')dnl ')dnl ifelse(XX_INTERACTIVE,yes,`XX_SH(Status Line) ifelse(XX_PRODUCT,c3270,`If the terminal that XX_FB(XX_PRODUCT) is running on has at least one more row that the 3270 model requires (e.g., 25 rows for a model 2), XX_FB(XX_PRODUCT) will display a status line. ')dnl The XX_FB(XX_PRODUCT) status line contains a variety of information. From left to right, the fields are: XX_TPS()dnl XX_TP(XX_FB(comm status)) The first symbol is always a XX_FB(4). If XX_FB(XX_PRODUCT) is in TN3270E mode, the second symbol is a XX_FB(B); otherwise it is an XX_FB(A). ifelse(XX_PRODUCT,x3270,`If XX_FB(x3270) is disconnected, the third symbol is a question mark. Otherwise, if ',`If ') XX_FB(XX_PRODUCT) is in SSCP-LU mode, the third symbol is an XX_FB(S). Otherwise it is blank. XX_TP(XX_FB(keyboard lock)) If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock. ifelse(XX_PRODUCT,x3270,`XX_TP(`XX_FB(`shift')') Three characters indicate the keyboard modifier status. "M" indicates the Meta key, "A" the Alt key, and an up-arrow or "^" indicates the Shift key. XX_TP(XX_FB(compose)) The letter "C" indicates that a composite character is in progress. If another symbol follows the "C", it is the first character of the composite. ')dnl XX_TP(XX_FB(typeahead)) The letter "T" indicates that one or more keystrokes are in the typeahead buffer. XX_TP(XX_FB(temporary keymap)) The letter "K" indicates that a temporary keymap is in effect. XX_TP(XX_FB(reverse)) The letter "R" indicates that the keyboard is in reverse field entry mode. XX_TP(XX_FB(insert mode)) ifelse(XX_PRODUCT,x3270,`A thick caret "^" or the ', `The ') letter "I" indicates that the keyboard is in insert mode. XX_TP(XX_FB(printer session)) The letter "P" indicates that a XX_FI(pr3287) session is active. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(script)) The letter "S" indicates that a script is active. ')dnl ifelse(XX_PRODUCT,x3270,,`XX_TP(XX_FB(secure connection)) A green letter "S" indicates that the connection is secured via SSL/TLS. ')dnl XX_TP(XX_FB(LU name)) The LU name associated with the session, if there is one. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(timing)) A clock symbol and a time in seconds indicate the time it took to process the last XX_SM(AID) or the time to connect to a host. This display is optional. ')dnl XX_TP(XX_FB(cursor position)) The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0. XX_TPE()dnl ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Icons) If the XX_FB(XX_DASHED(activeicon)) option is given (or the "XX_PRODUCT.activeIcon" resource is set to XX_FB(true)`)', XX_FB(XX_PRODUCT) will attempt to make its icon a miniature version of the current screen image. This function is highly dependent on your window manager: XX_TPS()dnl XX_TP(XX_FB(mwm)) The size of the icon is limited by the "Mwm.iconImageMaximum" resource, which defaults to XX_FB(50x50). The image will be clipped at the bottom and right. The icon cannot accept keyboard input. XX_TP(XX_FB(olwm)) The full screen image of all 3270 models can be displayed on the icon. However, the icon cannot be resized, so if the model is later changed with an XX_FB(XX_PRODUCT) menu option, the icon image will be corrupted. The icon cannot accept keyboard input. XX_TP(XX_FB(twm) and XX_FB(tvtwm)) The full screen image of all 3270 models can be displayed on the icon, and the icon can be resized. The icon can accept keyboard input. XX_IP However, XX_FB(twm) does not put labels on application-supplied icon windows. You can have XX_FB(XX_PRODUCT) add its own label to the icon by setting the "XX_PRODUCT.labelIcon" resource to XX_FB(true). The default font for icon labels is XX_FB(8x13); you may change it with the "XX_PRODUCT.iconLabelFont" resource. XX_TPE()dnl include(xkeymaps.inc)') define(XX_LPAREN,`ifelse(XX_PRODUCT,tcl3270,` ',`(')')dnl define(XX_RPAREN,`ifelse(XX_PRODUCT,tcl3270,,`)')')dnl define(XX_COMMA,`ifelse(XX_PRODUCT,tcl3270,` ',`, ')')dnl define(XX_SPACE,`ifelse(XX_PRODUCT,tcl3270,` ',`')')dnl define(XX_WAIT,`ifelse(XX_PRODUCT,tcl3270,`Wait [XX_FI(timeout)] $1', `Wait$1(XX_FI(timeout))')')dnl XX_TARGET(actions)dnl ifelse(XX_PRODUCT,x3270,, XX_PRODUCT,tcl3270, `XX_SH(Commands) XX_FB(XX_PRODUCT) supports the following additional tcl commands: ', `XX_SH(Actions) Here is a complete list of basic XX_PRODUCT actions. Script-specific actions are described on the XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)) manual page. ')dnl define(XX_BLOCK,*))dnl XX_PP Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response. XX_PP XX_TS(2,center; lw(3i) lw(3i).) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ascii'`') XX_TD(return entire screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents as text)) XX_TR(XX_TDH(`Ascii'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region as text)) XX_TR(XX_TDH(`AsciiField') XX_TD(return current field as text)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Attn') XX_TD(attention key)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(AltCursor) XX_TD(switch between block and underscore cursor)) ')dnl XX_TR(XX_TDH(`BackSpace') XX_TD(move cursor left (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`BackTab') XX_TD(tab to start of previous input field)) XX_TR(`XX_TDH(CircumNot) XX_TD(`input "^" in XX_SM(NVT) mode, or "XX_NOT" in 3270 mode'')) XX_TR(XX_TDH(XX_BLOCK()`Clear') XX_TD(clear screen)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Cols') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Compose) XX_TD(next two keys form a special symbol)) ')dnl XX_TR(XX_TDH(XX_BLOCK()Connect`'XX_LPAREN`'XX_FI(host)`'XX_RPAREN) XX_TD(connect to XX_FI(host))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Copy') XX_TD(copy highlighted area to clipboard)) ')dnl XX_TR(XX_TDH(XX_BLOCK()`CursorSelect') XX_TD(Cursor Select XX_SM(AID))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Cut) XX_TD(copy highlighted area to clipboard and erase)) XX_TR(XX_TDH(Default) XX_TD(enter key literally)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Cut') XX_TD(copy highlighted area to clipboard and erase)) ')dnl XX_TR(XX_TDH(`Delete') XX_TD(delete character under cursor (or send XX_SM(ASCII DEL)))) XX_TR(XX_TDH(`DeleteField') XX_TD(delete the entire field)) XX_TR(XX_TDH(`DeleteWord') XX_TD(delete the current or previous word)) XX_TR(XX_TDH(XX_BLOCK()`Disconnect') XX_TD(disconnect from host)) XX_TR(XX_TDH(`Down') XX_TD(move cursor down)) XX_TR(XX_TDH(`Dup') XX_TD(duplicate field)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(`Ebcdic'`') XX_TD(return entire screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(length)`'XX_RPAREN`') XX_TD(return screen contents at cursor in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(length)`'XX_RPAREN) XX_TD(return screen contents in XX_SM(EBCDIC))) XX_TR(XX_TDH(`Ebcdic'`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_COMMA`'XX_FI(rows)`'XX_COMMA`'XX_FI(cols)`'XX_RPAREN`') XX_TD(return screen region in XX_SM(EBCDIC))) XX_TR(XX_TDH(`EbcdicField') XX_TD(return current field in XX_SM(EBCDIC))) ')dnl XX_TR(XX_TDH(XX_BLOCK()`Enter') XX_TD(Enter XX_SM(AID) (or send XX_SM(ASCII CR)))) XX_TR(XX_TDH(`Erase') XX_TD(erase previous character (or send XX_SM(ASCII BS)))) XX_TR(XX_TDH(`EraseEOF') XX_TD(erase to end of current field)) XX_TR(XX_TDH(`EraseInput') XX_TD(erase all input fields)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(Escape) XX_TD(escape to XX_FB(c3270>) prompt)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(Execute(XX_FI(cmd))) XX_TD(execute a command in a shell)) ')dnl XX_TR(XX_TDH(`FieldEnd') XX_TD(move cursor to end of field)) XX_TR(XX_TDH(`FieldMark') XX_TD(mark field)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(HandleMenu(XX_FI(name))) XX_TD(pop up a menu)) ')dnl XX_TR(XX_TDH(`HexString'`'XX_LPAREN`'XX_FI(hex_digits)`'XX_RPAREN) XX_TD(insert control-character string)) XX_TR(XX_TDH(`Home') XX_TD(move cursor to first input field)) XX_TR(XX_TDH(`Insert') XX_TD(set insert mode)) XX_TR(XX_TDH(XX_BLOCK()`Interrupt') XX_TD(send XX_SM(TELNET IP) to host)) ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Keypad') XX_TD(Display pop-up keypad)) ')dnl XX_TR(XX_TDH(Key`'XX_LPAREN`'XX_FI(keysym)`'XX_RPAREN) XX_TD(insert key XX_FI(keysym))) XX_TR(XX_TDH(Key`'XX_LPAREN`'0x`'XX_FI(xx)`'XX_RPAREN) XX_TD(insert key with character code XX_FI(xx))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Keymap(XX_FI(keymap))) XX_TD(toggle alternate XX_FI(keymap) (or remove with XX_FB(None)))) XX_TR(XX_TDH(KybdSelect(XX_FI(direction) [,XX_FI(atom)...])) XX_TD(Extend selection by one row or column)) ')dnl XX_TR(XX_TDH(`Left') XX_TD(move cursor left)) XX_TR(XX_TDH(`Left2') XX_TD(move cursor left 2 positions)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Macro(XX_FI(macro))) XX_TD(run a macro)) ')dnl ifelse(XX_MODE,console,`XX_TR(XX_TDH(`Menu') XX_TD(Display menu bar)) ')dnl XX_TR(XX_TDH(`MonoCase') XX_TD(toggle uppercase-only mode)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(MoveCursor) XX_TD(move cursor to mouse position)) ')dnl XX_TR(XX_TDH(MoveCursor`'XX_LPAREN`'XX_FI(row)`'XX_COMMA`'XX_FI(col)`'XX_RPAREN) XX_TD(move cursor to zero-origin (XX_FI(row),XX_FI(col)))) ifelse(XX_PRODUCT,x3270,`XX_TR(`XX_TDH(XX_BLOCK()MoveCursorSelect) XX_TD(`move cursor to mouse position, light pen selection'')) ')dnl XX_TR(XX_TDH(`Newline') XX_TD(move cursor to first field on next line (or send XX_SM(ASCII LF)))) XX_TR(XX_TDH(`NextWord') XX_TD(move cursor to next word)) XX_TR(XX_TDH(XX_BLOCK()PA`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Attention XX_SM(AID) (XX_FI(n) from 1 to 3))) XX_TR(XX_TDH(XX_BLOCK()PF`'XX_LPAREN`'XX_FI(n)`'XX_RPAREN) XX_TD(Program Function XX_SM(AID) (XX_FI(n) from 1 to 24))) XX_TR(XX_TDH(`PreviousWord') XX_TD(move cursor to previous word)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(`Paste') XX_TD(insert clipboard contents))')dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(Printer(Start[,XX_FI(lu)]|Stop)) XX_TD(start or stop printer session)) ')dnl ifelse(XX_PLATFORM,windows,`XX_TR(XX_TDH(PrintText([gdi|wordpad,][dialog|nodialog,]XX_FI([printer-name]))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,tcl3270,, `XX_TR(XX_TDH(PrintText(XX_FI(command))) XX_TD(print screen text on printer)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(PrintWindow(XX_FI(command))) XX_TD(print screen image (bitmap) on printer)) ')dnl XX_TR(XX_TDH(Quit) XX_TD(exit XX_FB(XX_PRODUCT))) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(XX_BLOCK()Reconnect) XX_TD(reconnect to previous host)) ')dnl XX_TR(XX_TDH(`Redraw') XX_TD(redraw window)) XX_TR(XX_TDH(`Reset') XX_TD(reset locked keyboard)) XX_TR(XX_TDH(`Right') XX_TD(move cursor right)) XX_TR(XX_TDH(`Right2') XX_TD(move cursor right 2 positions)) ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,XX_PRODUCT,wc3270,,`XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ascii`') XX_TD(dump screen buffer as text)) XX_TR(XX_TDH(ReadBuffer`'XX_SPACE`'Ebcdic`') XX_TD(dump screen buffer in EBCDIC)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,c3270,,`XX_TR(XX_TDH(`Rows') XX_TD(report screen size)) ')dnl ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Script(XX_FI(command)[,XX_FI(arg)...])) XX_TD(run a script)) ')dnl ifelse(XX_INTERACTIVE,yes,`XX_TR(XX_TDH(Scroll(Forward|Backward)) XX_TD(scroll screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SelectAll(XX_FI(atom))) XX_TD(select entire screen)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(SetFont(XX_FI(font))) XX_TD(change emulator font)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `ifelse(XX_PRODUCT,tcl3270,`XX_TR(XX_TDH(Snap) XX_TD(same as XX_FB(Snap Save))) ')dnl XX_TR(XX_TDH(Snap`'XX_SPACE`'Ascii`') XX_TD(report saved screen data (see XX_FB(Ascii)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Cols`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Ebcdic`') XX_TD(report saved screen data (see XX_FB(Ebcdic)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'ReadBuffer`') XX_TD(report saved screen data (see XX_FB(ReadBuffer)))) XX_TR(XX_TDH(Snap`'XX_SPACE`'Rows`') XX_TD(report saved screen size)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Save`') XX_TD(save screen image)) XX_TR(XX_TDH(Snap`'XX_SPACE`'Status`') XX_TD(report saved connection status)) XX_TR(XX_TDH(`ifelse(XX_PRODUCT,tcl3270,`XX_BLOCK()Snap Wait [XX_FI(timeout)] Output', `XX_BLOCK()SnapWaitOuput(XX_FI(timeout))')') XX_TD(wait for host output and save screen image)) ifelse(XX_PRODUCT,tcl3270,,`XX_TR(XX_TDH(XX_BLOCK()Source(XX_FI(file))) XX_TD(read commands from XX_FI(file))) ')dnl XX_TR(XX_TDH(Status`') XX_TD(report connection status)) ')dnl XX_TR(XX_TDH(XX_BLOCK()String`'XX_LPAREN`'XX_FI(string)`'XX_RPAREN) XX_TD(insert string (simple macro facility))) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TDH(XX_BLOCK()`SelectDown') XX_TD(Extend selection down)) XX_TR(XX_TDH(SelectLeft) XX_TD(Extend selection left)) XX_TR(XX_TDH(SelectUp) XX_TD(Extend selection up)) XX_TR(XX_TDH(SelectDown) XX_TD(Extend selection down)) XX_TR(XX_TDH(SysReq) XX_TD(System Request XX_SM(AID))) ')dnl XX_TR(XX_TDH(`Tab') XX_TD(move cursor to next input field)) XX_TR(XX_TDH(`Toggle'XX_LPAREN`'XX_FI(option)[,XX_FI(set|clear)]XX_RPAREN) XX_TD(toggle an option)) XX_TR(XX_TDH(`ToggleInsert') XX_TD(toggle insert mode)) XX_TR(XX_TDH(`ToggleReverse') XX_TD(toggle reverse-input mode)) XX_TR(XX_TDH(XX_BLOCK()Transfer`'XX_LPAREN`'XX_FI(option)=XX_FI(value)...'`'XX_RPAREN) XX_TD(file transfer)) ifelse(XX_PRODUCT,x3270,`XX_TR(XX_TDH(Unselect) XX_TD(release selection)) ')dnl XX_TR(XX_TDH(`Up') XX_TD(move cursor up)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TDH(ignore) XX_TD(do nothing)) ')dnl ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,wc3270,, `XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(3270mode)) XX_TD(wait for 3270 mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Disconnect)) XX_TD(wait for host to disconnect)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(InputField)) XX_TD(wait for valid input field)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(NVTMode)) XX_TD(wait for NVT mode)) XX_TR(XX_TDH(XX_BLOCK()XX_WAIT(Output)) XX_TD(wait for more host output)) ')dnl ifelse(XX_PRODUCT,x3270,`XX_T_() XX_TR(XX_TDH((the following are similar to xterm),COLSPAN="2")) XX_T_() XX_TR(XX_TDH(ignore) XX_TD(do nothing)) XX_TR(`XX_TDH(insert-selection([XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(``paste' selection')') XX_TR(XX_TDH(move-select) XX_TD(a combination of XX_FB(MoveCursor) and XX_FB(select-start))) XX_TR(XX_TDH(select-end(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(complete selection and assign to atom(s))) XX_TR(XX_TDH(select-extend) XX_TD(move the end of a selection)) XX_TR(XX_TDH(select-start) XX_TD(mark the beginning of a selection)) XX_TR(XX_TDH(set-select(XX_FI(atom)[,XX_FI(atom)...]])) XX_TD(assign existing selection to atom(s))) XX_TR(XX_TDH(start-extend) XX_TD(begin marking the end of a selection)) ')dnl XX_TE() ifelse(XX_MODE,console,`XX_LP Any of the above actions may be entered at the XX_FB(XX_PRODUCT>) prompt; these commands are also available for use in keymaps (see XX_LINK(#Keymaps,XX_SM(KEYMAPS))). Command names are case-insensitive. Parameters can be specified with parentheses and commas, e.g.: XX_RS(PF(1)) or with spaces, e.g.: XX_RS(PF 1) Parameters can be quoted with double-quote characters, to allow spaces, commas, and parentheses to be used. XX_LP XX_FB(XX_PRODUCT) also supports the following interactive commands: XX_TPS()dnl XX_TP(XX_FB(Help)) Displays a list of available commands. XX_TP(XX_FB(ScreenTrace)) Turns screen tracing (saving screen images to a file) on or off. The command XX_FB(screentrace on) enables screen tracing; the command XX_FB(screentrace off) disables it. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3scr.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3scr.)`'XX_FI(pid)'). The keyaord XX_FB(on) can also be followed by the keyword XX_FB(printer) and an optional ifelse(XX_PRODUCT,wc3270,printer name,print command) to direct screen traces directly to the printer. XX_TP(XX_FB(Show)) Displays statistics and settings. XX_TP(XX_FB(Trace)) Turns tracing on or off. The command XX_FB(trace on) enables data stream and keyboard event tracing; the command XX_FB(trace off) disables it. The qualifier XX_FB(data) or XX_FB(keyboard) can be specified before XX_FB(on) or XX_FB(off) to enable or disable a particular trace. After XX_FB(on), a filename may be specified to override the default trace file name of ifelse(XX_PLATFORM,windows,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt)',`XX_FB(/tmp/x3trc.)`'XX_FI(pid)'). XX_TPE()dnl ')dnl XX_LP Note that certain parameters to XX_PRODUCT actions (such as the names of files and keymaps) are subject to XX_FI(substitutions): XX_LP The character XX_FB(~) at the beginning of a string is replaced with the user's home directory. ifelse(XX_PLATFORM,unix,`A XX_FB(~) character followed by a username is replaced with that XX_POSESSIVE(user) home directory. ')dnl XX_LP Environment variables are substituted using the Unix shell convention of $XX_FI(name) or ${XX_FI(name)}. XX_LP Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names. ifelse(XX_PRODUCT,c3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,wc3270,`include(keymaps.inc) ')dnl ifelse(XX_PRODUCT,x3270,,`include(ft.inc) ')dnl XX_SH(The PrintText Action) The XX_FB(PrintText) produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is ifelse(XX_PLATFORM,windows,`the name of the printer to use', `the command to use to print, e.g., XX_FB(lpr)'). ifelse(XX_PLATFORM,windows,`The font defaults to XX_FB(Courier New) and the point size defaults to XX_FI(auto) (by default -- pick the widest font that will fit across the page) or 8 (if using WordPad). These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. Unless the XX_FB(wordpad) keyword is used to force the output to be run through the Windows WordPad utility, additional resources can control the output. XX_FB(printTextHorizontalMargin) defines the left- and right-hand margins. XX_FB(printTextVerticalMargin) defines the top and bottom margins. Both default to 0.5 inches; the values are in inches by default but can be suffixed with XX_FB(mm) or XX_FB(cm). XX_FB(printTextOrientation) defines the page orientation as XX_FB(portrait) or XX_FB(landscape). ')dnl XX_LP Multiple arguments can include keywords to control the output of XX_FB(PrintText): XX_TPS()dnl ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(gdi)) Print directly to the printer using GDI, instead of creating an RTF file and running WordPad to print it. (This is the default). XX_TP(XX_FB(wordpad)) Create an RTF file and run WordPad to print it. (This was the former default). XX_TP(XX_FB(dialog)) In GDI mode, pop up the Windows print dialog. ifelse(XX_PRODUCT,wc3270,`(This is the default.) ')dnl XX_TP(XX_FB(nodialog)) In GDI mode, skip the usual Windows print dialog. ifelse(XX_PRODUCT,ws3270,`(This is the default.) ')dnl ')dnl XX_TP(XX_FB(file) XX_FI(filename)) Save the output in a file. XX_TP(XX_FB(html)) Save the output as HTML. This option implies XX_FB(file). XX_TP(XX_FB(rtf)) Save the output as RichText. This option implies XX_FB(file). The font defaults to XX_FB(Courier New) and the point size defaults to 8. These can be overridden by the XX_FB(printTextFont) and XX_FB(printTextSize) resources, respectively. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(string)) Return the output as a string. This can only be used from scripts. ')dnl XX_TP(XX_FB(modi)) Render modified fields in italics. XX_TP(XX_FB(caption) XX_FI(text)) Add the specified XX_FI(text) as a caption above the output. Within XX_FI(text), the special sequence XX_FB(%T%) will be replaced with a timestamp. ifelse(XX_PRODUCT,x3270,`XX_TP(XX_FB(secure)) Disables the pop-up dialog. ')dnl ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(command) XX_FI(command)) Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer. ')dnl XX_TPE() define(XX_SCRIPTS,`ifelse(XX_PRODUCT,x3270,Macros and Scripts, XX_PRODUCT,c3270,Scripts, Nested Scripts)')dnl XX_SH(XX_SCRIPTS) ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`There are several types of ifelse(XX_PRODUCT,x3270,`macros and ', XX_PRODUCT,x3270,,XX_PRODUCT,c3270,, `nested ')dnl script functions available. ')dnl XX_TPS()dnl XX_TP(XX_FB(The String XX_Action)) The simplest method for ifelse(XX_PRODUCT,x3270,`macros ', XX_PRODUCT,c3270,`scripting ', `nested scripts ')dnl is provided via the XX_FB(String) XX_action`'ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,tcl3270,,`, which can be bound to any key in a keymap'). The arguments to XX_FB(String) are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the XX_SM(AID) code to the host, XX_FB(XX_PRODUCT) will wait for the host to unlock the keyboard before further processing the string.) XX_TS(2,l l.) XX_TR(XX_TD(XX_BS()b) XX_TD(Left)) XX_TR(XX_TD(XX_BS()`e'XX_FI(xxxx)) XX_TD(EBCDIC character in hex)) XX_TR(XX_TD(XX_BS()f) XX_TD(Clear*)) XX_TR(XX_TD(XX_BS()n) XX_TD(Enter*)) XX_TR(XX_TD(XX_BS()`pa'XX_FI(n)) XX_TD(PA(XX_FI(n))*)) XX_TR(XX_TD(XX_BS()`pf'XX_FI(nn)) XX_TD(PF(XX_FI(nn))*)) XX_TR(XX_TD(XX_BS()r) XX_TD(Newline)) XX_TR(XX_TD(XX_BS()t) XX_TD(Tab)) XX_TR(XX_TD(XX_BS()T) XX_TD(BackTab)) XX_TR(XX_TD(XX_BS()`u'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TR(XX_TD(XX_BS()`x'XX_FI(xxxx)) XX_TD(Unicode character in hex)) XX_TE() XX_IP Note that the numeric values for the XX_BS()e, XX_BS()u and XX_BS()x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if XX_PRODUCT is built with DBCS support and the host allows DBCS input in the current field. ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270, `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Alt,p): String("probs clearrdr`'XX_BS()n")) ', `XX_IP An example keymap entry would be: XX_RS(XX_KEY(Meta,p): String("probs clearrdr`'XX_BS()n")) ')dnl XX_IP XX_FB(Note:) The strings are in XX_SM(ASCII) and converted to XX_SM(EBCDIC), so beware of inserting control codes. ifelse(XX_PRODUCT,x3270,`Also, a backslash before a XX_FB(p) may need to be doubled so it will not be removed when a resource file is read. ')dnl XX_IP There is also an alternate form of the XX_FB(String) XX_action, XX_FB(HexString), which is used to enter non-printing data. The argument to XX_FB(HexString) is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent XX_SM(EBCDIC) characters, which are entered into the current field. In XX_SM(NVT) mode, the hexadecimal data represent XX_SM(ASCII) characters, which are sent directly to the host. ifelse(XX_PRODUCT,tcl3270,,`XX_TP(XX_FB(The Script Action)) This action causes XX_FB(XX_PRODUCT) to start a child process which can execute XX_FB(XX_PRODUCT) actions. ifelse(XX_PLATFORM,windows, `XX_FB(XX_PRODUCT) listens for connections from the child process on a dynamically-generated TCP port. ', `Standard input and output from the child process are piped back to XX_FB(XX_PRODUCT). ')dnl The XX_FB(Script) action is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl ifelse(XX_PRODUCT,x3270, `XX_TP(XX_FB(The macros Resource)) An alternate method of defining macros is the "XX_PRODUCT.macros" resource. This resource is similar to a keymap, but instead of defining keyboard mappings, it associates a list of X actions with a name. These names are displayed on a Macros menu that appears when XX_FB(XX_PRODUCT) is connected to a host. Selecting one of the names on the menu executes the X actions associated with it. Typically the actions are XX_FB(String) calls, but any action may be specified. Here is a sample macros resource definition, which would result in a four-entry Macros menu: XX_RS(XX_PRODUCT.macros: XX_BS() XX_BR log off: String("logout`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR vtam: String("dial vtam`'XX_BS()n")XX_BS()n`'XX_BS() XX_BR pa1: PA(1)XX_BS()n`'XX_BS() XX_BR alt printer: PrintText("lpr -Plw2")) XX_IP You can also define a different set of macros for each host. If there is a resource named XX_DQUOTED(XX_PRODUCT.XX_FI(macros).XX_FI(somehost)), it defines the macros menu for when XX_FB(XX_PRODUCT) is connected to XX_FI(somehost). XX_TP(XX_FB(The XX_DASHED(script) Option)) This facility allows XX_FB(XX_PRODUCT) to operate under the complete control of a script. XX_FB(XX_PRODUCT) accepts actions from standard input, and prints results on standard output. The XX_FB(XX_DASHED(script)) option is fully documented in XX_LINK(XX_X3270-script.html,XX_FI(XX_X3270-script)(1)). ')dnl XX_TPE()dnl ifelse(XX_PRODUCT,s3270,,XX_PRODUCT,ws3270,,XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,`XX_SH(Composite Characters) XX_FB(XX_PRODUCT) allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A `C' on the status line indicates a pending composite character. XX_PP The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "XX_PRODUCT.composeMap" resource; it gives the name of the map to use. The maps themselves are named "XX_PRODUCT.composeMap.XX_FI(name)". The default is "latin1", which gives mappings for most of the symbols in the XX_SM(ISO) 8859-1 Latin-1 character set that are not in the 7-bit XX_SM(ASCII) character set. XX_PP XX_FB(Note:) The default keymap defines ifelse(XX_PRODUCT,x3270,`the "Multi_key" keysym',`XX_KEY(Meta,m)') as the "Compose" key. ifelse(XX_PRODUCT,x3270,`If your keyboard lacks such a key, you',`You') may set up your own "Compose" key with a keymap that maps some other keysym onto the XX_FB(Compose) action. ')dnl ifelse(XX_PRODUCT,x3270,`include(apl.inc)')dnl ifelse(XX_PRODUCT,c3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(pr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(pr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(c3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(pr3287). XX_LP See XX_FI(pr3287)(1) for further details. XX_LP The resource XX_FB(c3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,wc3270, `XX_SH(Printer Session Support) XX_PRODUCT supports associated printer sessions via the XX_FI(wpr3287)(1) program. The XX_FB(Printer) action is used to start or stop a XX_FI(wpr3287) session. XX_LP The action XX_FB(Printer Start) starts a printer session, associated with the current LU. (This works only if the host supports TN3270E.) XX_LP The action XX_FB(Printer Start) XX_FI(lu) starts a printer session, associated with a specific XX_FI(lu). XX_LP The action XX_FB(Printer Stop) stops a printer session. XX_LP The resource XX_FB(wc3270.printer.name) specifies the Windows printer used to print each job. It defaults to the value of the XX_FB($PRINTER) environment variable, if set. Otherwise the default system printer is used. This resource also controls the printer used by the XX_FB(PrintText) action. XX_LP The resource XX_FB(wc3270.printer.options) specifies extra options, such as XX_FB(-trace) to pass to XX_FI(wpr3287). XX_LP See XX_FI(wpr3287)(1) for further details. XX_LP The resource XX_FB(wc3270.printerLu) controls automatic printer session start-up. If it is set to XX_DQUOTED(XX_FB(.)), then whenever a login session is started, a printer session will automatically be started, associated with the login session. If it is set an LU name, then the automatic printer session will be associated with the specified LU. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Screen Printing) Screen printing is handled through options on the XX_FB(File) menu or by the XX_FB(PrintText) and XX_FB(PrintWindow) actions. Each results in a pop-up to confirm the print command. XX_PP The XX_FB(PrintText) action (usually assigned to the key XX_LT()Meta>p) sends the current screen image to the printer as XX_SM(ASCII) characters. The default command used to print the data is controlled by the "XX_PRODUCT.printTextCommand" resource; the default is XX_FB(lpr). You may also use a keymap definition to pass a print command the XX_FB(PrintText) action itself. The command receives the screen text as its standard input. For example, the following keymap will save the screen text in a file: XX_IP XX_RS(XX_KEY(Meta,f): PrintText("cat >screen.image")) XX_PP Note: XX_FB(HardPrint) is an alias for XX_FB(PrintText). XX_PP The XX_FB(PrintWindow) action (usually assigned to the key XX_LT()Meta>b) sends the current screen image to the printer as a bitmap. The default command used to print the data is controlled by the "XX_PRODUCT.printWindowCommand" resource; the default is XX_IP XX_RS(XX_FB(xwd XX_DASHED(id) %d | xpr | lpr).) XX_PP You may also use a keymap definition to pass a print command to the XX_FB(PrintWindow) action itself. If the command contains the text "%d", the window ID of XX_FB(XX_PRODUCT) will be substituted before it is run. For example, the following keymap will pop up a duplicate of the current screen image: XX_IP XX_RS(XX_KEY(Meta,g): PrintWindow("xwd XX_DASHED(id) %d | xwud &")) XX_LP If the command for PrintWindow or PrintText begins with an "@" character, the initial pop-up menu to confirm the print command is not displayed and the command cannot be edited. ')dnl ifelse(XX_PRODUCT,x3270, `XX_SH(Bugs) Cursor highlighting will not work with if you use the XX_FB(NoTitleFocus) option in your .twmrc file. ')dnl ifelse(XX_PRODUCT,wc3270,,` XX_SH(Passthru) XX_FB(XX_PRODUCT) supports the Sun XX_FI(telnet-passthru) service provided by the XX_FI(in.telnet-gw) server. This allows outbound telnet connections through a firewall machine. When a XX_FB(p:) is prepended to a hostname, XX_FB(XX_PRODUCT) acts much like the XX_FI(itelnet)(1) command. It contacts the machine named XX_FB(internet-gateway) at the port defined in XX_FB(/etc/services) as XX_FB(telnet-passthru) (which defaults to 3514). It then passes the requested hostname and port to the XX_FB(in.telnet-gw) server. ')dnl XX_SH(Proxy) The XX_FB(XX_DASHED(proxy)) option or the XX_FB(XX_PRODUCT.proxy) resource causes XX_PRODUCT to use a proxy server to connect to the host. The syntax of the option or resource is: XX_RS(XX_FI(type):XX_FI(host)[:XX_FI(port)] ) The supported values for XX_FI(type) are: XX_TS(3,`center; c l c .') XX_TR(XX_TD(XX_TC(Proxy Type)) XX_TD(XX_TC(Protocol)) XX_TD(XX_TC(Default Port))) XX_T_ XX_TR(XX_TD(XX_TC(http)) XX_TD(XX_TC(RFC 2817 HTTP tunnel (squid))) XX_TD(XX_TC(3128))) XX_TR(XX_TD(XX_TC(passthru)) XX_TD(XX_TC(Sun in.telnet-gw)) XX_TD(XX_TC(none))) XX_TR(XX_TD(XX_TC(socks4)) XX_TD(XX_TC(SOCKS version 4)) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(socks5)) XX_TD(XX_TC(SOCKS version 5 (RFC 1928))) XX_TD(XX_TC(1080))) XX_TR(XX_TD(XX_TC(telnet)) XX_TD(XX_TC(No protocol (just send XX_FB(connect) XX_FI(host port)))) XX_TD(XX_TC(none))) XX_TE() XX_LP() The special types XX_FB(socks4a) and XX_FB(socks5d) can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol. ifelse(XX_PRODUCT,x3270,,`include(resources.inc)')dnl ifelse(XX_PRODUCT,tcl3270,,XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_SH(Files) ifelse(XX_PRODUCT,x3270,/usr/lib/X11,/usr/local/lib)/x3270/ibm_hosts XX_BR ifelse(XX_PRODUCT,x3270,`$HOME/.x3270pro ',XX_PRODUCT,c3270,`$HOME/.c3270pro ') ')dnl ifelse(XX_PRODUCT,x3270,`XX_SH(Environment Variables) XX_FB(3270PRO) Path of profile file, containing resource definitions. Merged after the system resource database, but before XX_FB(X3270RDB). Defaults to $HOME/.x3270pro. XX_BR XX_FB(NOX3270PRO) If set, do not read the profile. XX_BR XX_FB(X3270RDB) Additional resource definitions, merged after the profile file but before the command-line options. XX_BR XX_FB(KEYMAP) Keymap name. XX_BR XX_FB(KEYBD) Keymap name. ')dnl XX_SH(See Also) ifelse(XX_INTERACTIVE,yes,XX_LINK(XX_PR3287-man.html,XX_PR3287`'(1))`, ')dnl ifelse(XX_PRODUCT,XX_S3270,,XX_LINK(XX_S3270-man.html,XX_S3270`'(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(XX_X3270-script.html,`XX_X3270-script`'(1)), ')dnl ifelse(XX_PLATFORM,unix,`ifelse(XX_PRODUCT,x3270,,XX_LINK(x3270-man.html,x3270(1))`, ')dnl ifelse(XX_PRODUCT,c3270,,XX_LINK(c3270-man.html,c3270(1))`, ')dnl ifelse(XX_PRODUCT,tcl3270,,XX_LINK(tcl3270-man.html,tcl3270(1))`, ')dnl ')dnl telnet(1), tn3270(1)dnl ifelse(XX_PRODUCT,x3270,`, XX_LINK(ibm_hosts.html,ibm_hosts(5)) XX_BR X Toolkit Intrinsics ',` ')dnl XX_BR Data Stream XX_POSESSIVE(Programmer) Reference, IBM GA23-0059 XX_BR Character Set Reference, IBM GA27-3831 XX_BR RFC 1576, TN3270 Current Practices XX_BR RFC 1646, TN3270 Extensions for LUname and Printer Selection XX_BR RFC 2355, TN3270 Enhancements XX_SH(Copyrights) Copyright`'XX_COPY()1993-XX_CYEAR, Paul Mattes. XX_BR Copyright`'XX_COPY()2004-2005, Don Russell. XX_BR Copyright`'XX_COPY()2004, Dick Altenbern. XX_BR Copyright`'XX_COPY()1990, Jeff Sparkes. XX_BR Copyright`'XX_COPY()1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. XX_BR All rights reserved. XX_LP Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: XX_TPS() XX_TP(*) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. XX_TP(*) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. XX_TP(*) Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. XX_TPE() XX_LP THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_SH(Version) XX_PRODUCT XX_VERSION_NUMBER suite3270-3.6/ws3270/x3270-script.man.m40000664000076500007650000006544613221577163015261 0ustar pdmpdmdnl Copyright (c) 2000-2014, 2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. XX_TH(X3270-SCRIPT,1,XX_DATE) XX_SH(Name) Scripting Facilities for ifelse(XX_PLATFORM,unix,`x3270,') XX_C3270 and XX_S3270 XX_SH(Synopsis) ifelse(XX_PLATFORM,unix,`XX_FB(x3270) XX_FB(XX_DASHED(script)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(socket)) [ XX_FI(x3270-options) ] XX_BR XX_FB(x3270) XX_FB(XX_DASHED(scriptport) XX_FI(port)) [ XX_FI(x3270-options) ] XX_BR ')dnl ifelse(XX_PLATFORM,unix,`XX_FB(XX_C3270) XX_FB(XX_DASHED(socket)) [ XX_FI(XX_C3270-options) ] XX_BR ')dnl XX_FB(XX_C3270) XX_FB(XX_DASHED(scriptport)) XX_FI(port) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(XX_S3270) [ XX_FI(XX_S3270-options) ] XX_BR XX_FB(`Script') ( XX_FI(command) [ `,'XX_FI(arg)... ] ) XX_SH(Description) The XX_FB(x3270) scripting facilities allow the interactive 3270 ifelse(XX_PLATFORM,unix,`emulators XX_FB(x3270) and XX_FB(c3270)', `emulator XX_FB(wc3270)') to be operated under the control of another program, and forms the basis for the script-only emulator XX_FB(XX_S3270). XX_PP There are ifelse(XX_PLATFORM,unix,four,three) basic scripting methods. The first is the XX_FB(peer script) facility, ifelse(XX_PLATFORM,unix,`invoked by the XX_FB(x3270) XX_FB(XX_DASHED(script)) switch, and ')dnl the default mode for XX_FB(XX_S3270). This runs the emulator as a child of another process. Typically this would be a script using XX_FI(expect)(1), XX_FI(perl)(1), or the co-process facility of the Korn Shell XX_FI(ksh)(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output. XX_PP The second method is the XX_FB(child script) facility, invoked by the emulator's XX_FB(Script) action. This runs a script as a child process of the emulator. ifelse(XX_PLATFORM,unix,`The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT. ',`The emulator creates a TCP listening socket on the IPv4 loopback address, 127.0.0.1, and places the TCP port in the environment variable X3270PORT (e.g., the text string "47196" if the TCP port is 47196). ')dnl XX_PP The third method uses a TCP socket. The XX_FB(XX_DASHED(scrpiptport)) command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection. ifelse(XX_PLATFORM,windows,`(Note that if the XX_FB(Script) action is used with XX_FB(XX_DASHED(scriptport)), it will pass the scriptport port number to child scripts, rather than creating a new socket.) ')dnl ifelse(XX_PLATFORM,unix,`XX_PP The fourth method uses a Unix-domain socket. The XX_FB(XX_DASHED(socket)) command-line option causes the emulator to create a Unix-domain stream socket named XX_FB(/tmp/x3sck.)`'XX_FI(pid). The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection. ')dnl XX_PP It is possible to nest the methods. For example, a peer or TCP socket script can invoke the XX_FB(Script) action. The calling script will be resumed when the nested script completes. XX_PP Commands are emulator XX_FI(actions); the syntax is the same as for the right-hand side of ifelse(XX_PLATFORM,unix,`an XX_FB(x3270) or',`a') XX_FB(XX_C3270) keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with XX_FB(#) or XX_FB(!) is treaded as a comment and will be ignored. XX_PP Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script. XX_PP Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error". XX_SH(Status Format) The status message consists of 12 blank-separated fields: XX_TPS()dnl XX_TP(1 Keyboard State) If the keyboard is unlocked, the letter XX_FB(U). If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter XX_FB(L). If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter XX_FB(E). XX_TP(2 Screen Formatting) If the screen is formatted, the letter XX_FB(F). If unformatted or in XX_SM(NVT) mode, the letter XX_FB(U). XX_TP(3 Field Protection) If the field containing the cursor is protected, the letter XX_FB(P). If unprotected or unformatted, the letter XX_FB(U). XX_TP(4 Connection State) If connected to a host, the string XX_FB(`C(')`'XX_FI(hostname)`'XX_FB(`)'). Otherwise, the letter XX_FB(N). XX_TP(5 Emulator Mode) If connected in 3270 mode, the letter XX_FB(I). If connected in XX_SM(NVT) line mode, the letter XX_FB(L). If connected in XX_SM(NVT) character mode, the letter XX_FB(C). If connected in unnegotiated mode (no BIND active from the host), the letter XX_FB(P). If not connected, the letter XX_FB(N). XX_TP(6 Model Number (2-5)) XX_TP(7 Number of Rows) The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model. XX_TP(8 Number of Columns) The current number of columns defined on the screen, subject to the same difference for rows, above. XX_TP(9 Cursor Row) The current cursor row (zero-origin). XX_TP(10 Cursor Column) The current cursor column (zero-origin). XX_TP(11 Window ID) The X window identifier for the main XX_FB(x3270) window, in hexadecimal preceded by XX_FB(0x). For XX_FB(XX_S3270) and XX_FB(XX_C3270), this is zero. XX_TP(12 Command Execution Time) The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash. XX_TPE()dnl XX_SH(Differences) When an action is initiated by a script, the emulators behave in several different ways: XX_PP If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output. XX_PP If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the XX_FB(CloseScript) action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the XX_FB(Script) action to complete. XX_PP The XX_FB(Quit) action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.) XX_PP Normally, the AID actions (XX_FB(Clear), XX_FB(Enter), XX_FB(PF), and XX_FB(PA)) will not complete until the host unlocks the keyboard. If the parameter to a XX_FB(String) action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding. XX_PP The XX_FB(AidWait) toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The XX_FB(Wait(Output)) action can then be used to delay a script until the host changes something on the screen, and the XX_FB(Wait(Unlock)) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the XX_FB(AidWait) toggle. XX_PP Note that the XX_FB(Script) action does not complete until ifelse(XX_PLATFORM,unix,`end-of-file is detected on the pipe or ')dnl the XX_FB(CloseScript) action is called by the child process. This behavior is not affected by the state of the XX_FB(AidWait) toggle. XX_SH(Basic Programming Strategies) 3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete. XX_LP Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the XX_FB(Snap) action. The XX_FB(Snap(Save)) action saves a snapshot of the screen in a special buffer. Then the script can use XX_FB(Snap) variants of the XX_FB(Ascii) and XX_FB(Ebcdic) actions (XX_FB(Snap(Ascii)) and XX_FB(Snap(Ebcdic))) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, XX_FB(Snap(Wait Output)) blocks the script until the host modifies the screen, specifically since the last call to XX_FB(Snap(Save)). Thus a script can poll the screen efficiently by writing a loop that begins with XX_FB(Snap(Save)) and ends with XX_FB(Snap(Wait Output)). XX_SH(Script-Specific Actions) The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, XX_FI(row) and XX_FI(col) coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]). XX_TPS()dnl XX_TP(XX_FB(AnsiText)) Outputs whatever data that has been output by the host in XX_SM(NVT) mode since the last time that XX_FB(AnsiText) was called. The data is preceded by the string "data:XX_NBSP", and has had all control characters expanded into C backslash sequences. XX_IP This is a convenient way to capture XX_SM(NVT) mode output in a synchronous manner without trying to decode the screen contents. XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ascii)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ascii)(XX_FI(length))) XX_TP(XX_FB(Ascii)) Outputs an XX_SM(ASCII) text representation of the screen contents. Each line is preceded by the string "data:XX_NBSP", and there are no control characters. XX_IP If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.) XX_IP If three parameters are given, XX_FI(length) characters are output, starting at the specified zero-origin row and column. XX_IP If only the XX_FI(length) parameter is given, that many characters are output, starting at the cursor position. XX_IP If no parameters are given, the entire screen is output. XX_IP The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the XX_FB(XX_DASHED(charset)) option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f. XX_TP(XX_FB(AsciiField)) Outputs an XX_SM(ASCII) text representation of the field containing the cursor. The text is preceded by the string "data:XX_NBSP". XX_TP(XX_FB(Connect)(XX_FI(hostname))) Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails. XX_TP(XX_FB(CloseScript)(XX_FI(status))) Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the XX_FB(Script) action, the optional XX_FI(status) is used as the return status of XX_FB(Script); if nonzero, XX_FB(Script) will complete with an error, and if this script was invoked as part of login through the XX_FB(ibm_hosts) file, the connection will be broken. XX_TP(XX_FB(ContinueScript)([XX_FI(param)])) Allows a script that is waiting in a XX_FB(PauseScript) action, below, to continue. The optional XX_FI(param) string is output by the XX_FB(PauseScript) action. XX_TP(XX_FB(Disconnect)) Disconnects from the host. XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(rows),XX_FI(cols))) XX_TP(XX_FB(Ebcdic)(XX_FI(row),XX_FI(col),XX_FI(length))) XX_TP(XX_FB(Ebcdic)(XX_FI(length))) XX_TP(XX_FB(Ebcdic)) The same function as XX_FB(Ascii) above, except that rather than generating XX_SM(ASCII) text, each character is output as a 2-digit or 4-digit hexadecimal XX_SM(EBCDIC) code. XX_TP(XX_FB(EbcdicField)) The same function as XX_FB(AsciiField) above, except that it generates hexadecimal XX_SM(EBCDIC) codes. XX_TP(XX_FB(Info)(XX_FI(message))) In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270. XX_TP(XX_FB(Expect)(XX_FI(text)[,XX_FI(timeout)])) Pauses the script until the specified XX_FI(text) appears in the data stream from the host, or the specified XX_FI(timeout) (in seconds) expires. If no XX_FI(timeout) is specified, the default is 30 seconds. XX_FI(Text) can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. XX_FB(Expect) is valid only in XX_SM(NVT) mode. ifelse(XX_MODE,console,`XX_TP(XX_FB(Keymap([XX_FI(keymap)]))) Adds or removes a temporary keymap. If the XX_FI(keymap) parameter is given, the named keymap is added. If no parameter is given, the most recently added keymap is removed. ')dnl XX_TP(XX_FB(MoveCursor)(XX_FI(row),XX_FI(col))) Moves the cursor to the specified zero-origin coordinates. XX_TP(XX_FB(PauseScript)) Stops a script until the XX_FB(ContinueScript) action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to XX_FB(ContinueScript), if one is given. XX_TP(XX_FB(PrintText)([XX_FB(command),]XX_FI(filter))) Pipes an ASCII representation of the current screen image through the named XX_FI(filter), e.g., XX_FB(lpr). XX_TP(XX_FB(PrintText)([XX_FB(html),][XX_FB(append),][XX_FB(replace),]XX_FB(file),XX_FI(filename))) Saves the current screen contents in a file. With the XX_FB(html) option, saves it as HTML, otherwise saves it as plain ASCII. The XX_FB(append) option (the default) causes the data to be appended to the file if it already exists. The XX_FB(replace) option causes the file to be overwritten instead. XX_TP(XX_FB(PrintText)(XX_FB(`html,string'))) Returns the current screen contents as HTML. XX_TP(XX_FB(Query)(XX_FI(keyword))) Returns state information. Keywords are: XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(Keyword) XX_TD(Output)) XX_T_ XX_TR(XX_TD(BindPluName) XX_TD(BIND PLU returned by the host)) XX_TR(XX_TD(ConnectionState) XX_TD(TN3270/TN3270E mode and submode)) XX_TR(XX_TD(CodePage) XX_TD(Host code page)) XX_TR(XX_TD(Cursor) XX_TD(Cursor position (row col), zero-origin)) XX_TR(XX_TD(Formatted) XX_TD(3270 format state (formatted or unformatted))) XX_TR(XX_TD(Host) XX_TD(Host name and port)) XX_TR(XX_TD(LocalEncoding) XX_TD(Local character encoding)) XX_TR(XX_TD(LuName) XX_TD(Host name LU name)) XX_TR(XX_TD(Model) XX_TD(3270 model name (IBM-327x-n))) XX_TR(XX_TD(ScreenCurSize) XX_TD(Current screen size (rows cols))) XX_TR(XX_TD(ScreenMaxSize) XX_TD(Maximum screen size (rows cols))) XX_TR(XX_TD(Ssl) XX_TD(SSL state (secure or not-secure) and host validation state (host-verified or host-unverified))) XX_TE XX_IP Without a XX_FI(keyword), XX_FB(Query) returns each of the defined attributes, one per line, labeled by its name. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ascii))) Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as XX_FB(SF`(aa=nn[,...])'), where XX_FI(aa) is a field attribute type and XX_FI(nn) is its value. XX_PP XX_TS(3,`center; l l .') XX_TR(XX_TD(XX_TC(Attribute)) XX_TD(XX_TC(Values))) XX_T_ XX_TR(XX_TD(XX_TC(c0 basic 3270)) XX_TD(XX_TC(20 protected))) XX_TR(XX_TD() XX_TD(XX_TC(10 numeric))) XX_TR(XX_TD() XX_TD(XX_TC(04 detectable))) XX_TR(XX_TD() XX_TD(XX_TC(08 intensified))) XX_TR(XX_TD() XX_TD(XX_TC(0c non-display))) XX_TR(XX_TD() XX_TD(XX_TC(01 modified))) XX_TR(XX_TD(XX_TC(41 highlighting)) XX_TD(XX_TC(f1 blink))) XX_TR(XX_TD() XX_TD(XX_TC(f2 reverse))) XX_TR(XX_TD() XX_TD(XX_TC(f4 underscore))) XX_TR(XX_TD() XX_TD(XX_TC(f8 intensify))) XX_TR(XX_TD(XX_TC(42 foreground)) XX_TD(XX_TC(f0 neutral black))) XX_TR(XX_TD() XX_TD(XX_TC(f1 blue))) XX_TR(XX_TD() XX_TD(XX_TC(f2 red))) XX_TR(XX_TD() XX_TD(XX_TC(f3 pink))) XX_TR(XX_TD() XX_TD(XX_TC(f4 green))) XX_TR(XX_TD() XX_TD(XX_TC(f5 turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(f6 yellow))) XX_TR(XX_TD() XX_TD(XX_TC(f7 neutral white))) XX_TR(XX_TD() XX_TD(XX_TC(f8 black))) XX_TR(XX_TD() XX_TD(XX_TC(f9 deep blue))) XX_TR(XX_TD() XX_TD(XX_TC(fa orange))) XX_TR(XX_TD() XX_TD(XX_TC(fb purple))) XX_TR(XX_TD() XX_TD(XX_TC(fc pale green))) XX_TR(XX_TD() XX_TD(XX_TC(fd pale turquoise))) XX_TR(XX_TD() XX_TD(XX_TC(fe grey))) XX_TR(XX_TD() XX_TD(XX_TC(ff white))) XX_TR(XX_TD(XX_TC(43 character set)) XX_TD(XX_TC(f0 default))) XX_TR(XX_TD() XX_TD(XX_TC(f1 APL))) XX_TR(XX_TD() XX_TD(XX_TC(f8 DBCS))) XX_TE() XX_IP Extended attributes (which do not take up display positions) are output as XX_FB(SA`('aa=nn`)'), with XX_FI(aa) and XX_FI(nn) having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute). XX_IP In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks. XX_TP(XX_FB(ReadBuffer)(XX_FB(Ebcdic))) Equivalent to XX_FB(ReadBuffer)(XX_FB(Ascii)), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as XX_FB(GE`('XX_FI(xx)`)'). XX_TP(XX_FB(Script)(XX_FI(path)[,arg...])) Runs a child script, passing it optional command-line arguments. XX_FI(path) must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the XX_FB(Source) action. XX_TP(XX_FB(Snap)) Equivalent to XX_FB(Snap)(XX_FB(Save)) (see XX_LINK(#save,below)). XX_TP(XX_FB(Snap)(XX_FB(Ascii),...)) Performs the XX_FB(Ascii) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(Cols))) Returns the number of columns in the saved screen image. XX_TP(XX_FB(Snap)(`XX_FB(Ebcdic),...')) Performs the XX_FB(Ebcdic) action on the saved screen image. XX_TP(XX_FB(Snap)(XX_FB(ReadBuffer))) Performs the XX_FB(ReadBuffer) action on the saved screen image. XX_TP(XX_FB(Snap(XX_FB(Rows)))) Returns the number of rows in the saved screen image. XX_TARGET(save)dnl XX_TP(XX_FB(Snap)(XX_FB(Save))) Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other XX_FB(Snap) actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically. XX_TP(XX_FB(Snap)(XX_FB(Status))) Returns the status line from when the screen was last saved. XX_TP(XX_FB(Snap)(XX_FB(Wait)[`,'XX_FI(timeout)]`,'XX_FB(Output))) Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. This action is usually invoked in a loop that uses the XX_FB(Snap)(XX_FB(Ascii)) or XX_FB(Snap)(XX_FB(Ebcdic)) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Snap) action. The default is to wait indefinitely. XX_TP(XX_FB(Source)(XX_FI(file))) Read and execute commands from XX_FI(file). Any output from those commands will become the output from XX_FB(Source). If any of the commands fails, the XX_FB(Source) command will XX_FI(not) abort; it will continue reading commands until EOF. XX_TP(XX_FB(Title)(XX_FI(text))) Changes the ifelse(XX_PLATFORM,unix,x3270,wc3270) window title to XX_FI(text). XX_TP(XX_FB(Transfer)(XX_FI(keyword)=XX_FI(value),...)) Invokes IND$FILE file transfer. See XX_LINK(#File-Transfer,XX_SM(FILE TRANSFER)) below. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(3270Mode))) Used when communicating with a host that switches between XX_SM(NVT) mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait(3270)) is equivalent to XX_FB(Wait)(XX_FB(3270Mode)) XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Disconnect))) Pauses the script until the host disconnects. Often used to after sending a XX_FI(logoff) command to a XX_SM(VM/CMS) host, to ensure that the session is not unintentionally set to XX_FB(disconnected) state. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(InputField))) A useful utility for use at the beginning of scripts and after the XX_FB(Connect) action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In XX_SM(NVT) mode, waits until the host sends at least one byte of data. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait) is equivalent to XX_FB(Wait)(XX_FB(InputField)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(NVTMode))) Used when communicating with a host that switches between 3270 mode and XX_SM(NVT) mode. Pauses the script or macro until the host negotiates XX_SM(NVT) mode, then waits for a byte from the host as above. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_IP For backwards compatibility, XX_FB(Wait)(XX_FB(ansi)) is equivalent to XX_FB(Wait)(XX_FB(NVTMode)). XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Output))) Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a XX_FB(Clear), XX_FB(Enter), XX_FB(PF) or XX_FB(PA) action), but has not finished updating the screen. Also used in non-blocking AID mode (see XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). This action is usually invoked in a loop that uses the XX_FB(Ascii) or XX_FB(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command. XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)([XX_FI(timeout)`,'] XX_FB(Unlock))) Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (XX_FB(toggle AidWait clear)), to wait for a host command to complete. See XX_LINK(#Differences,XX_SM(DIFFERENCES)) for details). XX_IP The optional XX_FI(timeout) parameter specifies a number of seconds to wait before failing the XX_FB(Wait) action. The default is to wait indefinitely. XX_TP(XX_FB(Wait)(XX_FI(timeout)`,' XX_FB(Seconds))) Delays the script XX_FI(timeout) seconds. Unlike the other forms of XX_FB(Wait), the timeout is not optional. ifelse(XX_PLATFORM,unix,`XX_TP(XX_FB(WindowState)(XX_FI(mode))) If XX_FI(mode) is XX_FB(Iconic), changes the x3270 window into an icon. If XX_FI(mode) is XX_FB(Normal), changes the x3270 window from an icon to a normal window. ')dnl XX_TPE()dnl define(XX_action,action)dnl include(ft.inc)dnl XX_SH(See Also) expect(1) XX_BR perl(1) XX_BR ksh(1) ifelse(XX_PLATFORM,unix,`XX_BR XX_LINK(x3270-man.html,x3270(1)) ')dnl XX_BR ifelse(XX_PLATFORM,unix,`XX_LINK(Unix-x3270if.html,x3270if(1))',`XX_LINK(Windows-x3270if.html,x3270if(1))') XX_BR XX_LINK(XX_C3270-man.html,XX_C3270`(1)') XX_BR XX_LINK(XX_S3270-man.html,XX_S3270`(1)') XX_SH(Version) Version XX_VERSION_NUMBER suite3270-3.6/x3270/3270-12b.bdf0000664000076500007650000011456413221577164013425 0ustar pdmpdmSTARTFONT 2.1 COMMENT "12-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the name of Paul Mattes nor his contributors may" COMMENT " be used to endorse or promote products derived from this" COMMENT " software without specific prior written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES 'AS IS' AND ANY" COMMENT "EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO," COMMENT "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL," COMMENT "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED" COMMENT "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE," COMMENT "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED" COMMENT "AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT" COMMENT "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING" COMMENT "IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF" COMMENT "THE POSSIBILITY OF SUCH DAMAGE." FONT 3270-12bold SIZE 12 72 72 FONTBOUNDINGBOX 7 12 0 -2 STARTPROPERTIES 17 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 12 POINT_SIZE 120 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" AVERAGE_WIDTH 60 FONT_ASCENT 10 FONT_DESCENT 2 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 314 STARTCHAR null ENCODING 0 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3C 66 60 FC 60 F8 60 66 3C 00 00 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 7e 7e 7e 7e 3c 00 00 00 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 7e 00 00 00 00 00 00 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP c0 60 30 18 0c 06 0c 18 30 60 c0 00 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 06 0c 18 30 60 c0 60 30 18 0c 06 00 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3e 30 30 30 30 30 30 30 30 30 3e 00 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 7c 0c 0c 0c 0c 0c 0c 0c 0c 0c 7c 00 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 18 0c 0c 0c 0c 0c 18 18 30 00 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 18 30 30 30 30 30 18 18 0c 00 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 70 18 18 18 18 0e 18 18 18 18 70 00 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0e 18 18 18 18 70 18 18 18 18 0e 00 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7e 00 00 00 7e 00 00 00 00 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 0c 18 30 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 6c 6c 6c 6c 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 06 06 0c 0c 18 18 30 30 60 60 00 00 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 60 60 30 30 18 18 0c 0c 06 06 00 00 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 00 00 00 18 18 18 18 00 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 66 66 06 0c 18 18 00 00 18 00 00 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 18 18 00 00 18 00 00 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 7e 78 78 3c 1e 1e 7e 3c 18 00 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 3c 7e 78 78 78 7e 3c 18 18 00 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1c 36 30 30 fc 30 30 30 f0 fe 00 00 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 66 66 3c 3c 18 7e 18 7e 18 18 00 00 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP f8 cc cc cc f8 c0 cc de cc cc 0c 00 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 c6 6c 38 6c 6c 38 6c c6 00 00 00 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 66 7e 66 66 66 3c 00 00 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 38 78 18 18 18 18 18 7e 00 00 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 06 06 0c 18 30 60 7e 00 00 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 06 06 1c 06 06 66 3c 00 00 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 0c 6c 6c 6c 6c 7e 0c 0c 0c 00 00 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 60 60 7c 06 06 66 66 3c 00 00 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 60 60 7c 66 66 66 3c 00 00 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 66 06 0c 0c 0c 18 18 18 00 00 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 66 3c 66 66 66 3c 00 00 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 66 3e 06 06 66 3c 00 00 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 78 d8 f0 d8 cc c6 c6 e6 fc 00 00 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 60 60 f0 d8 cc 66 36 1e 0c 0c 78 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 36 36 36 7e 36 6c fe 6c 6c 6c 00 00 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 66 7e 7e 7e 7e 60 36 1c 00 00 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 76 de dc 7c 18 18 3e 3a 7a 6e 00 00 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 fe 00 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 6c 6c 38 30 7a ce cc cc 7e 00 00 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 7e 00 00 00 00 00 00 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 1c 1c 00 00 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 1c 1c 0c 38 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 1c 1c 00 00 00 1c 1c 00 00 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 18 18 7e 18 18 00 00 00 00 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 fe 06 06 00 00 00 00 00 00 00 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 fe 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 6c 6c 38 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 1c 1c 00 00 00 00 00 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 3c 66 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 36 7e 6c 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 ee ee 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 18 0c 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 0c 18 30 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 0c 0c 0c 38 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 00 3c 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 00 3c 66 7e 60 66 3c 00 00 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 00 78 18 18 18 18 18 00 00 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 00 3c 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 00 66 66 66 66 6e 3e 00 00 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 3c 00 00 3c 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 3c 00 00 3c 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 36 00 00 66 36 36 1e 1c 0c 0c 78 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 06 0c 18 66 66 66 3c 18 18 18 00 00 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 06 0c 18 00 66 36 36 1e 1c 0c 0c 78 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 00 3c 66 7e 60 66 3c 00 00 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 70 30 30 78 00 1e 1e 1e 06 06 00 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 70 30 30 78 00 1c 06 0c 18 1e 00 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 70 18 30 18 70 00 1e 1e 1e 06 06 00 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 00 66 66 66 66 6e 3e 00 00 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 66 60 60 60 66 3c 18 78 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 00 3c 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 00 3c 66 7e 60 66 3c 00 00 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 6c 00 00 78 18 18 18 18 18 00 00 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 00 3c 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 66 66 66 66 7e 7e 60 60 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 00 3c 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 00 3c 66 7e 60 66 3c 00 00 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 00 78 18 18 18 18 18 00 00 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 00 3c 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 00 66 66 66 66 6e 3e 00 00 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 00 3c 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 3c 18 3c 66 00 00 00 00 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 00 78 18 18 18 18 18 00 00 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 00 3c 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 00 66 66 66 66 6e 3e 00 00 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 3c 00 00 7c 76 66 66 66 66 00 00 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 0c 00 18 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 0c 00 7e 60 60 7e 60 60 7e 00 00 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 7e 18 18 18 18 18 7e 00 00 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 3c 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 18 00 66 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 3c 00 18 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 3c 00 3c 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 38 18 18 3c 00 00 00 00 00 00 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 0c 18 30 3c 00 00 00 00 00 00 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 0c 18 0c 38 00 00 00 00 00 00 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 0c 3c 6c 3c 00 7c 00 00 00 00 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 6c 6c 6c 38 00 7c 00 00 00 00 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 36 6c 36 00 00 00 00 00 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 6c 36 6c 00 00 00 00 00 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 00 00 18 18 18 18 18 18 18 00 00 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 00 00 18 18 30 60 66 66 3c 00 00 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 18 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 7e 60 60 7e 60 60 7e 00 00 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 7e 18 18 18 18 18 7e 00 00 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 3c 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 00 66 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 18 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 7e 60 60 7e 60 60 7e 00 00 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 7e 18 18 18 18 18 7e 00 00 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 3c 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 3c 00 66 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 18 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 7e 60 60 7e 60 60 7e 00 00 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 7e 18 18 18 18 18 7e 00 00 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 3c 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 18 00 66 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 3c 00 66 76 76 7e 6e 6e 66 00 00 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 66 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 60 7c 76 66 66 66 76 7c 00 00 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 66 60 60 60 66 3c 00 00 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 06 06 3e 6e 66 66 66 6e 3e 00 00 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 66 66 7e 60 66 3c 00 00 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 0e 18 18 7e 18 18 18 18 18 00 00 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3e 6e 66 66 6e 3e 06 66 3c ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 60 7c 76 66 66 66 66 66 00 00 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 00 78 18 18 18 18 18 18 00 00 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 0c 00 3c 0c 0c 0c 0c 0c 0c 6c 38 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 60 6c 78 70 70 78 6c 66 00 00 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 0c 0c 0c 0c 0c 0c 0c 0c 00 00 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7c 7e 7e 7e 7e 7e 7e 00 00 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7c 76 66 66 66 66 66 00 00 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7c 76 66 66 66 76 7c 60 60 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3e 6e 66 66 66 6e 3e 06 06 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7c 76 60 60 60 60 60 00 00 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 66 60 3c 06 66 3c 00 00 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 18 7e 18 18 18 18 18 0e 00 00 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 66 66 66 66 6e 3e 00 00 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 66 66 3c 3c 18 18 00 00 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 66 7e 7e 7e 7e 3c 00 00 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 66 3c 18 3c 66 66 00 00 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 66 66 36 36 1e 1c 0c 0c 78 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7e 06 0c 18 30 60 7e 00 00 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 fe 18 38 7e d8 d8 7e 00 00 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3e 66 6e 7e 76 66 fc 00 00 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 3c 00 3c 66 06 3e 66 66 3e 00 00 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 38 00 7c 00 38 38 00 00 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 7e 7e 00 00 1c 1c 00 00 1c 1c 0c 38 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 7e 7e 00 18 7e 3c 3c 7e 18 00 00 00 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 18 3c 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 6c 6c 6c 7c 66 66 66 7c 00 00 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 60 60 60 66 66 3c 00 00 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 6c 66 66 66 66 66 6c 78 00 00 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 60 60 60 7c 60 60 60 7e 00 00 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 60 60 60 7c 60 60 60 60 00 00 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 60 60 6e 66 66 6e 3e 00 00 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 66 66 66 7e 66 66 66 66 00 00 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 18 18 18 18 18 18 18 7e 00 00 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3e 0c 0c 0c 0c 0c 6c 6c 38 00 00 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 6c 78 70 78 6c 6c 66 66 00 00 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 60 60 60 60 60 60 60 7e 00 00 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 c6 c6 ee ee fe fe c6 c6 c6 00 00 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 76 76 7e 7e 6e 6e 66 66 00 00 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 66 66 66 7c 60 60 60 60 00 00 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 66 66 66 66 66 3c 18 0e ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 66 66 66 7c 6c 66 66 66 00 00 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 60 30 1c 06 06 66 3c 00 00 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 18 18 18 18 18 18 18 18 00 00 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 66 66 66 66 66 66 66 3c 00 00 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 66 66 3c 3c 3c 18 18 18 00 00 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 c2 c2 c2 da 7e 7e 7e 3c 3c 00 00 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 66 3c 3c 18 3c 3c 66 66 00 00 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 66 66 66 3c 18 18 18 18 18 00 00 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7e 06 06 0c 18 30 60 60 7e 00 00 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 1e 38 38 78 7e 78 d8 d8 de 00 00 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 6e 7e 7e 76 66 66 3c 00 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 3c 00 18 3c 3c 66 7e 66 66 00 00 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 66 66 60 60 60 66 66 3c 18 78 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 1c 1c 00 00 00 1c 1c 0c 38 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 7e 3c 3c 7e 18 00 00 00 00 00 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 54 64 54 44 38 00 00 00 00 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 74 74 6c 44 38 00 00 00 00 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 50 88 88 f8 88 88 00 fe 82 82 fe ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 10 38 7c ee c6 82 00 00 00 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1c 12 12 1c 12 12 1c 00 fe 82 82 fe ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 82 92 a2 b2 aa 92 82 82 fe 00 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 18 18 7e 18 18 00 7e 00 00 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 6c 66 66 fe 66 66 6c 78 00 00 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 08 0c fe 0c 08 00 00 00 00 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 60 7c 66 66 66 7c 60 60 00 00 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 44 82 ee 28 28 28 28 28 38 00 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 28 38 10 fe 10 10 28 44 82 00 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 78 24 24 38 24 24 78 00 fe 00 00 00 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 28 28 28 28 28 ee 82 44 28 10 00 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 92 aa 8a 92 92 82 92 82 fe 00 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe fe fe fe fe fe fe fe fe fe fe 00 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 80 80 40 40 20 fe 10 10 08 08 04 04 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fc 08 10 20 7e 00 00 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 fe 00 00 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 02 10 00 40 00 02 82 02 02 42 02 10 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 00 28 40 80 04 00 00 08 00 20 00 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 82 c6 ee 7c 38 38 38 7c ee c6 82 00 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 18 3c 06 3e 6e 66 66 6e 3e 00 00 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 20 60 fe 60 20 00 00 00 00 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 7c 76 66 66 66 76 7c 60 00 00 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 38 44 46 44 38 00 00 00 00 00 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 fe 36 36 06 00 00 00 00 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 8a 9a aa ba 8a 8a 82 82 fe 00 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 44 44 7c 44 44 00 fe 00 00 00 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 fe 82 82 82 fe 82 fe 00 00 00 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 ba aa ba 92 fe 92 92 aa c6 fe ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 7c 0c 0c 0c 0c 0c 0c 0c 0c 0c 7c 00 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3e 30 30 30 30 30 30 30 30 30 3e 00 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_uparrow ENCODING 364 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 18 3c 7f 18 18 18 18 18 00 00 ENDCHAR STARTCHAR apl_downarrow ENCODING 365 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 18 18 18 18 18 7f 3c 18 00 00 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 66 66 66 66 66 66 66 66 66 66 66 66 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 fe 00 00 00 00 00 00 00 00 fe 00 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 60 60 60 60 60 60 60 60 60 60 60 60 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 06 06 06 06 06 06 06 06 06 06 06 06 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe fe fe fe fe fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 fe fe fe fe fe fe ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe fe fe fe fe fe fe fe fe fe fe fe ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 f8 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 3c 3c 3c 3c 3c 3c 3c 3c 3c 3c 3c ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 18 3c 7e 3c 18 00 00 00 00 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP aa 54 aa 54 aa 54 aa 54 aa 54 aa 54 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 78 78 78 78 00 1e 0c 0c 0c 0c ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 60 70 60 60 00 1e 18 1c 18 18 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 60 60 60 38 00 1c 1e 1c 1e 1e ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 60 60 60 60 78 00 1e 18 1c 18 18 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 6c 6c 38 00 00 00 00 00 00 00 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 18 18 7e 18 18 00 7e 00 00 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 6c 7c 7c 6c 6c 00 18 18 18 18 1e ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 78 78 30 30 00 1e 0c 0c 0c 0c ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 f8 00 00 00 00 00 00 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 fe 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 fe 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 fe 00 00 00 00 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 fe 00 00 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 0c 18 30 60 30 18 0c 00 7e 00 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 30 18 0c 06 0c 18 30 00 7e 00 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 7e 3c 3c 3c 3c 6c 00 00 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 06 0c 7e 18 7e 30 60 00 00 00 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 1c 36 30 30 78 30 30 36 7c 00 00 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 38 38 00 00 00 00 00 ENDCHAR ENDFONT suite3270-3.6/x3270/3270-12.bdf0000664000076500007650000011245213221577164013255 0ustar pdmpdmSTARTFONT 2.1 COMMENT "12-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright 1993-2008 by Paul Mattes." COMMENT " Permission to use, copy, modify, and distribute this software and" COMMENT " its documentation for any purpose and without fee is hereby" COMMENT " granted, provided that the above copyright notice appear in all" COMMENT " copies and that both that copyright notice and this permission" COMMENT " notice appear in supporting documentation." COMMENT "" COMMENT "x3270 is distributed in the hope that it will be useful, but WITHOUT" COMMENT "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY" COMMENT "or FITNESS FOR A PARTICULAR PURPOSE. See the file LICENSE for more" COMMENT "details." FONT 3270-12 SIZE 12 72 72 FONTBOUNDINGBOX 7 12 0 -2 STARTPROPERTIES 17 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 12 POINT_SIZE 120 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 60 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" FONT_ASCENT 10 FONT_DESCENT 2 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 314 STARTCHAR null ENCODING 0 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 40 f8 40 f8 40 44 38 00 00 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3c 7e 7e 7e 7e 3c 00 00 00 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 7c 00 00 00 00 00 00 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 80 40 20 10 08 04 08 10 20 40 80 00 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 04 08 10 20 40 80 40 20 10 08 04 00 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 20 20 20 20 20 20 20 20 20 3c 00 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 78 08 08 08 08 08 08 08 08 08 78 00 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 10 08 08 08 08 08 10 10 20 00 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 10 20 20 20 20 20 10 10 08 00 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 60 10 10 10 10 0c 10 10 10 10 60 00 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 0c 10 10 10 10 60 10 10 10 10 0c 00 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7c 00 00 00 7c 00 00 00 00 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 08 10 20 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 48 48 48 48 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 04 04 08 08 10 10 20 20 40 40 00 00 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 40 40 20 20 10 10 08 08 04 04 00 00 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 00 00 00 10 10 10 10 00 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 44 44 04 08 10 10 00 00 10 00 00 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 10 10 00 00 10 00 00 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 38 54 50 50 38 14 14 54 38 10 00 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 38 54 50 50 50 54 38 10 10 00 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 18 24 20 20 f8 20 20 20 e0 dc 00 00 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 44 44 28 38 10 7c 10 7c 10 10 00 00 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP f0 88 88 88 f0 80 88 9c 88 88 08 00 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 84 48 30 48 48 30 48 84 00 00 00 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 44 54 44 44 44 38 00 00 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 30 50 10 10 10 10 10 7c 00 00 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 04 04 08 10 20 40 7c 00 00 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 04 04 18 04 04 44 38 00 00 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 08 48 48 48 48 7c 08 08 08 00 00 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 40 40 78 04 04 44 44 38 00 00 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 40 40 78 44 44 44 38 00 00 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 44 04 08 08 08 10 10 10 00 00 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 44 38 44 44 44 38 00 00 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 44 3c 04 04 44 38 00 00 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 50 90 a0 90 88 84 84 c4 b8 00 00 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 40 40 a0 90 88 44 24 14 08 08 70 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 24 24 24 7e 24 48 fc 48 48 48 00 00 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 44 5c 54 54 5c 40 24 18 00 00 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 64 94 98 68 10 10 2c 32 52 4c 00 00 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 fc 00 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 48 48 30 20 52 8c 88 88 76 00 00 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 7c 00 00 00 00 00 00 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 18 18 00 00 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 18 18 08 30 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 18 18 00 00 00 18 18 00 00 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 10 10 7c 10 10 00 00 00 00 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 fc 04 04 00 00 00 00 00 00 00 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 fc 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 30 48 48 30 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 18 18 00 00 00 00 00 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 28 44 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 24 54 48 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 cc cc 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 20 10 08 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 08 10 20 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 08 08 08 30 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 00 38 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 00 38 44 7c 40 44 38 00 00 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 00 70 10 10 10 10 10 00 00 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 00 38 44 44 44 44 38 00 00 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 00 44 44 44 44 4c 34 00 00 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 14 28 00 00 38 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 14 28 00 00 38 44 44 44 44 38 00 00 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 24 00 00 44 24 24 14 18 08 08 70 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 04 08 10 44 44 44 28 10 10 10 00 00 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 04 08 10 00 44 24 24 14 18 08 08 70 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 00 38 44 7c 40 44 38 00 00 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 60 20 20 70 00 14 14 1c 04 04 00 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 60 20 20 70 00 18 04 08 10 1c 00 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 60 10 20 10 60 00 14 14 1c 04 04 00 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 00 44 44 44 44 4c 34 00 00 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 44 40 40 40 44 38 10 70 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 00 38 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 00 38 44 7c 40 44 38 00 00 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 48 00 00 70 10 10 10 10 10 00 00 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 00 38 44 44 44 44 38 00 00 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 44 44 44 44 6c 54 40 40 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 00 38 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 00 38 44 7c 40 44 38 00 00 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 00 70 10 10 10 10 10 00 00 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 00 38 44 44 44 44 38 00 00 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 00 44 44 44 44 4c 34 00 00 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 00 38 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 28 10 28 44 00 00 00 00 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 00 70 10 10 10 10 10 00 00 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 00 38 44 44 44 44 38 00 00 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 00 44 44 44 44 4c 34 00 00 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 14 28 00 00 58 64 44 44 44 44 00 00 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 08 00 10 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 08 00 7c 40 40 7c 40 40 7c 00 00 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 7c 10 10 10 10 10 7c 00 00 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 38 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 10 00 44 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 14 28 00 10 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 14 28 00 38 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 30 10 10 38 00 00 00 00 00 00 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 08 10 20 38 00 00 00 00 00 00 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 08 10 08 30 00 00 00 00 00 00 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 08 38 48 38 00 78 00 00 00 00 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 48 48 48 30 00 78 00 00 00 00 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 24 48 24 00 00 00 00 00 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 48 24 48 00 00 00 00 00 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 00 00 10 10 10 10 10 10 10 00 00 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 00 00 10 10 20 40 44 44 38 00 00 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 10 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 7c 40 40 7c 40 40 7c 00 00 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 7c 10 10 10 10 10 7c 00 00 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 38 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 00 44 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 10 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 7c 40 40 7c 40 40 7c 00 00 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 7c 10 10 10 10 10 7c 00 00 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 38 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 00 44 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 10 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 7c 40 40 7c 40 40 7c 00 00 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 7c 10 10 10 10 10 7c 00 00 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 38 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 08 10 00 44 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 14 28 00 44 64 64 54 4c 4c 44 00 00 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 44 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 40 58 64 44 44 44 64 58 00 00 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 44 40 40 40 44 38 00 00 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 04 04 34 4c 44 44 44 4c 34 00 00 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 44 44 7c 40 44 38 00 00 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 0c 10 10 7c 10 10 10 10 10 00 00 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 34 4c 44 44 4c 34 04 44 38 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 40 58 64 44 44 44 44 44 00 00 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 00 70 10 10 10 10 10 10 00 00 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 08 00 38 08 08 08 08 08 08 48 30 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 40 48 50 60 60 50 48 44 00 00 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 08 08 08 08 08 08 08 08 00 00 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 68 54 54 54 54 54 54 00 00 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 58 64 44 44 44 44 44 00 00 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 58 64 44 44 44 64 58 40 40 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 34 4c 44 44 44 4c 34 04 04 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 58 64 40 40 40 40 40 00 00 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 38 44 40 38 04 44 38 00 00 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 10 7c 10 10 10 10 10 0c 00 00 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 44 44 44 44 4c 34 00 00 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 44 44 28 28 10 10 00 00 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 44 54 54 54 54 28 00 00 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 44 28 10 28 44 44 00 00 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 44 44 24 24 14 18 08 08 70 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 7c 04 08 10 20 40 7c 00 00 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 ee 10 30 5e 90 90 6e 00 00 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 3a 44 4c 54 64 44 b8 00 00 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 38 00 38 44 04 3c 44 44 3c 00 00 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 30 30 00 78 00 30 30 00 00 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 7c 7c 00 00 18 18 00 00 18 18 08 30 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 7c 7c 00 10 54 38 38 54 10 00 00 00 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 10 28 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 70 48 48 48 78 44 44 44 78 00 00 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 40 40 40 44 44 38 00 00 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 70 48 44 44 44 44 44 48 70 00 00 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 40 40 40 78 40 40 40 7c 00 00 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 40 40 40 78 40 40 40 40 00 00 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 40 40 4c 44 44 4c 34 00 00 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 44 44 44 7c 44 44 44 44 00 00 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 10 10 10 10 10 10 10 7c 00 00 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 3c 08 08 08 08 08 48 48 30 00 00 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 48 50 60 50 48 48 44 44 00 00 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 40 40 40 40 40 40 40 7c 00 00 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 84 84 cc cc b4 b4 84 84 84 00 00 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 64 64 54 54 4c 4c 44 44 00 00 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 44 44 44 78 40 40 40 40 00 00 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 44 44 44 44 44 38 10 0c ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 78 44 44 44 78 48 44 44 44 00 00 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 40 20 18 04 04 44 38 00 00 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 10 10 10 10 10 10 10 10 00 00 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 44 44 44 44 44 44 44 38 00 00 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 44 44 28 28 28 10 10 10 00 00 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 82 82 82 92 54 54 54 28 28 00 00 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 44 28 28 10 28 28 44 44 00 00 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 44 44 44 28 10 10 10 10 10 00 00 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 7c 04 04 08 10 20 40 40 7c 00 00 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 1c 30 30 50 5c 70 90 90 9c 00 00 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 4c 54 54 64 44 44 38 00 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 38 00 10 28 28 44 7c 44 44 00 00 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 44 40 40 40 44 44 38 10 70 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 18 18 00 00 00 18 18 08 30 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 10 54 38 38 54 10 00 00 00 00 00 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 54 64 54 44 38 00 00 00 00 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 44 74 74 6c 44 38 00 00 00 00 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 50 88 88 f8 88 88 00 fe 82 82 fe ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 10 38 7c ee c6 82 00 00 00 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1c 12 12 1c 12 12 1c 00 fe 82 82 fe ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 82 92 a2 b2 aa 92 82 82 fe 00 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 10 10 7c 10 10 00 7c 00 00 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 70 48 44 44 f4 44 44 48 70 00 00 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 08 0c fe 0c 08 00 00 00 00 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 40 78 44 44 44 78 40 40 00 00 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 44 82 ee 28 28 28 28 28 38 00 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 38 28 38 10 fe 10 10 28 44 82 00 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 78 24 24 38 24 24 78 00 fe 00 00 00 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 28 28 28 28 28 ee 82 44 28 10 00 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 92 aa 8a 92 92 82 92 82 fe 00 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe fe fe fe fe fe fe fe fe fe fe 00 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 80 80 40 40 20 fe 10 10 08 08 04 04 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fc 08 10 20 7e 00 00 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 fe 00 00 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 02 10 00 40 00 02 82 02 02 42 02 10 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 20 00 28 40 80 04 00 00 08 00 20 00 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 82 c6 ee 7c 38 38 38 7c ee c6 82 00 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 28 10 28 04 34 4c 44 44 4c 34 00 00 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 20 60 fe 60 20 00 00 00 00 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 58 64 44 44 44 64 58 40 00 00 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 38 44 46 44 38 00 00 00 00 00 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 fe 36 36 06 00 00 00 00 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 8a 9a aa ba 8a 8a 82 82 fe 00 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 28 44 44 7c 44 44 00 fe 00 00 00 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 fe 82 82 82 fe 82 fe 00 00 00 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe 82 ba aa ba 92 fe 92 92 aa c6 fe ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 78 08 08 08 08 08 08 08 08 08 78 00 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 3c 20 20 20 20 20 20 20 20 20 3c 00 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_uparrow ENCODING 364 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 08 1c 3e 08 08 08 08 08 00 00 ENDCHAR STARTCHAR apl_downarrow ENCODING 365 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 08 08 08 08 08 3e 1c 08 00 00 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 44 44 44 44 44 44 44 44 44 44 44 44 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 fe 00 00 00 00 00 00 00 00 fe 00 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 40 40 40 40 40 40 40 40 40 40 40 40 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 04 04 04 04 04 04 04 04 04 04 04 04 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe fe fe fe fe fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 fe fe fe fe fe fe ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP fe fe fe fe fe fe fe fe fe fe fe fe ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 f0 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 38 38 38 38 38 38 38 38 38 38 38 38 ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 10 38 7c 38 10 00 00 00 00 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP aa 54 aa 54 aa 54 aa 54 aa 54 aa 54 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 50 50 70 50 50 00 1c 08 08 08 08 ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 70 40 60 40 40 00 1c 10 18 10 10 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 40 40 40 30 00 18 14 18 14 14 ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 40 40 40 40 70 00 1c 10 18 10 10 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 30 48 48 30 00 00 00 00 00 00 00 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 10 10 7c 10 10 00 7c 00 00 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 48 68 58 48 48 00 10 10 10 10 1c ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 50 50 50 20 20 00 1c 08 08 08 08 ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 f0 00 00 00 00 00 00 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 fe 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 fe 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 fe 00 00 00 00 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 00 00 00 00 fe 00 00 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 08 10 20 40 20 10 08 00 7c 00 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 20 10 08 04 08 10 20 00 7c 00 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 7c 28 28 28 28 48 00 00 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 04 08 7c 10 7c 20 40 00 00 00 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 18 24 20 20 70 20 20 24 58 00 00 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 42 0 DWIDTH 7 0 BBX 7 12 0 -2 BITMAP 00 00 00 00 00 30 30 00 00 00 00 00 ENDCHAR ENDFONT suite3270-3.6/x3270/3270-20b.bdf0000664000076500007650000017007713221577164013425 0ustar pdmpdmSTARTFONT 2.1 COMMENT "20-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1995-2009, Paul Mattes." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the name of Paul Mattes nor his contributors may" COMMENT " be used to endorse or promote products derived from this" COMMENT " software without specific prior written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES 'AS IS' AND ANY" COMMENT "EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO," COMMENT "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL," COMMENT "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED" COMMENT "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE," COMMENT "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED" COMMENT "AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT" COMMENT "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING" COMMENT "IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF" COMMENT "THE POSSIBILITY OF SUCH DAMAGE." COMMENT "" COMMENT $XConsortium: 10x20.bdf,v 1.12 92/04/02 14:25:55 gildea Exp $ COMMENT "$NCDId: @(#)10x20.bdf,v 1.11 1991/07/02 14:50:48 jim Exp $" COMMENT "" COMMENT "Copyright 1989-1991 Network Computing Devices, Inc." COMMENT "NCD is a registered trademark of Network Computing Devices, Inc." COMMENT "" COMMENT "Permission to use, copy, modify, and distribute this software and" COMMENT "its documentation for any purpose and without fee is hereby" COMMENT "granted, provided that the above copyright notice appear in all" COMMENT "copies and that both that copyright notice and this permission" COMMENT "notice appear in supporting documentation, and that the name of" COMMENT "NCD may not be used in advertising or publicity pertaining to" COMMENT "distribution of the software without specific, written prior" COMMENT "permission. NCD makes no representations about the" COMMENT "suitability of this software for any purpose. It is provided ``as" COMMENT "is'' without express or implied warranty." COMMENT "" COMMENT "NCD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE," COMMENT "INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN" COMMENT "NO EVENT SHALL NCD BE LIABLE FOR ANY SPECIAL, INDIRECT OR" COMMENT "CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS" COMMENT "OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT," COMMENT "NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN" COMMENT "CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE." FONT 3270-20bold SIZE 20 75 75 FONTBOUNDINGBOX 10 20 0 -5 STARTPROPERTIES 17 FOUNDRY "NCD" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 20 POINT_SIZE 200 RESOLUTION_X 75 RESOLUTION_Y 75 AVERAGE_WIDTH 100 DEFAULT_CHAR 514 FONT_DESCENT 5 FONT_ASCENT 15 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" SPACING "C" COPYRIGHT "Copyright 1989-1991 Network Computing Devices, Inc." ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1E00 3F00 6180 6000 FF00 FF00 6000 FE00 FE00 6000 6180 3F00 1E00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 1e00 3f00 7f80 7f80 7f80 7f80 3f00 1e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f80 3f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 3800 1c00 0e00 0700 0380 01c0 0380 0700 0e00 1c00 3800 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0180 0380 0700 0e00 1c00 3800 7000 3800 1c00 0e00 0700 0380 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f80 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f80 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0e00 0700 0700 0700 0700 0700 0e00 0e00 1c00 3800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0380 0700 0e00 0e00 1c00 1c00 1c00 1c00 1c00 0e00 0e00 0700 0380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7c00 0e00 0e00 0e00 0e00 0e00 07c0 0e00 0e00 0e00 0e00 0e00 7c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 07c0 0e00 0e00 0e00 0e00 0e00 7c00 0e00 0e00 0e00 0e00 0e00 07c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 0f00 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 3b80 1b00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 01c0 01c0 0380 0380 0700 0700 0e00 0e00 1c00 1c00 3800 3800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3800 3800 1c00 1c00 0e00 0e00 0700 0700 0380 0380 01c0 01c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 71c0 0380 0700 0e00 0e00 0e00 0000 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0000 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 3f80 7fc0 7e00 7e00 7e00 3f80 0fc0 0fc0 0fc0 7fc0 3f80 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0e00 0e00 1f00 3b80 7180 7000 7000 7180 3b80 1f00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0f80 1dc0 1dc0 1c00 1c00 7f00 1c00 1c00 1c00 7e00 7fc0 7bc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 60c0 71c0 3b80 1f00 3f80 0e00 3f80 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1fc0 3fc0 7fc0 7fc0 7fc0 3fc0 1fc0 07c0 07c0 07c0 07c0 07c0 07c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 6040 3fc0 1f80 39c0 39c0 39c0 1f80 3fc0 6040 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 3b80 71c0 71c0 71c0 71c0 71c0 3b80 3b80 1f00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1e00 3e00 7e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 01c0 01c0 0380 0f00 1c00 3800 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 01c0 0380 0f00 0380 01c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0180 0380 0780 0f80 1f80 3b80 7380 7380 7fc0 0380 0380 0380 0380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 7000 7000 7000 7000 7f00 7b80 01c0 01c0 01c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 7180 7000 7000 7f00 7b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 01c0 01c0 0380 0380 0700 0700 0e00 0e00 1c00 1c00 3800 3800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 71c0 3b80 1f00 3b80 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3bc0 1fc0 01c0 01c0 31c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1e00 3f00 7b80 7380 7380 7700 7e00 7700 7380 7180 7380 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 7380 7000 7800 7c00 6e00 7700 3b80 1d80 0f80 0380 7380 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0fc0 0fc0 0fc0 3fc0 1f80 1f80 1f80 7fc0 3f00 3f00 3f00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 77c0 7fc0 7fc0 7fc0 7fc0 7f80 7700 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3dc0 7fc0 7f80 3f80 0700 0700 0e00 0e00 1fc0 1fc0 3fc0 3bc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3f00 3f00 3f00 3e00 1c00 3c00 7e00 77c0 73c0 7380 7fc0 3ec0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0f00 0f00 0f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0f00 0f00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0f00 0f00 0000 0000 0000 0000 0f00 0f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0e00 7fc0 0e00 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7fc0 7fc0 01c0 01c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 7f80 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 3b80 1f00 0e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0f00 0f00 0f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 71c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3dc0 7fc0 7780 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3e00 1e00 0700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0600 1b00 0e00 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 0000 3f80 71c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 0000 1f00 3b80 71c0 7fc0 7000 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 0000 3e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1d80 3f80 3700 0000 0000 3f80 71c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1d80 3f80 3700 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 0000 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 01c0 71c0 3b80 1f00 0000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0380 0700 0e00 0000 60c0 71c0 3b80 1f00 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 0000 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 01c0 71c0 3b80 1f00 0000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 1f00 3b80 71c0 7fc0 7000 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 7000 30c0 3180 7b00 0600 0d80 1b80 3780 6f80 0180 0180 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 7000 30c0 3180 7b00 0600 0f80 1ec0 30c0 6180 0300 07c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7800 0c00 38c0 0d80 7b00 0600 0d80 1b80 3780 6fc0 0180 0180 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f80 39c0 7000 7000 7000 7000 39c0 1f80 0e00 0600 1b00 0e00 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 3f80 71c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 1f00 3b80 71c0 7fc0 7000 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 3e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 7380 7380 7380 7380 7380 7f80 7f80 7000 7000 7000 0000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 0000 3f80 71c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 0000 1f00 3b80 71c0 7fc0 7000 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 0000 3e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 3f80 71c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 30c0 39c0 1f80 0f00 0f00 1f80 39c0 30c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 3e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1d80 3f80 3700 0000 0000 7f00 7b80 71c0 71c0 71c0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 0e00 1f00 3b80 71c0 71c0 7fc0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 7fc0 7000 7000 7000 7f00 7000 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 3f80 0e00 0e00 0e00 0e00 0e00 0e00 0e00 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3800 1c00 0e00 0000 71c0 71c0 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1d80 3f80 3700 0000 0e00 1f00 3b80 71c0 71c0 7fc0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1d80 3f80 3700 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3c00 1c00 1c00 1c00 3e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3f00 0700 0e00 1c00 3800 3f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3f00 0300 0f00 0300 3f00 1e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f80 31c0 01c0 3fc0 71c0 71c0 3fc0 0000 7fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3f00 7380 7380 7380 3f00 1e00 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 06c0 0fc0 1f80 3f00 7e00 fc00 7e00 3f00 1f80 0fc0 06c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6c00 7e00 3f00 1f80 0fc0 07c0 0fc0 1f80 3f00 7e00 6c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 0e00 0000 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 0e00 0000 0e00 0e00 0e00 1c00 3800 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 0e00 1f00 3b80 71c0 71c0 7fc0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 7fc0 7000 7000 7000 7f00 7000 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 3f80 0e00 0e00 0e00 0e00 0e00 0e00 0e00 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3b80 3b80 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 0e00 1f00 3b80 71c0 71c0 7fc0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 7fc0 7000 7000 7000 7f00 7000 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 3f80 0e00 0e00 0e00 0e00 0e00 0e00 0e00 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 0000 71c0 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0380 0700 0e00 0000 0e00 1f00 3b80 71c0 71c0 7fc0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 7fc0 7000 7000 7000 7f00 7000 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0700 0e00 1c00 0000 3f80 0e00 0e00 0e00 0e00 0e00 0e00 0e00 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0380 0700 0e00 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0380 0700 0e00 0000 71c0 71c0 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1d80 3f80 3700 0000 61c0 71c0 79c0 7dc0 7fc0 7fc0 77c0 73c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f80 39c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7000 7000 7000 7000 7000 7f00 7b80 71c0 71c0 71c0 71c0 7b80 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f80 39c0 7000 7000 7000 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 01c0 01c0 01c0 01c0 01c0 1fc0 3bc0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3b80 71c0 7fc0 7000 7000 39c0 1f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 1dc0 1dc0 1c00 1c00 1c00 1c00 7f00 1c00 1c00 1c00 1c00 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3fc0 73c0 7380 7380 7380 3f00 7000 3f80 71c0 71c0 71c0 3f80 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7000 7000 7000 7000 7000 7f00 7b80 71c0 71c0 71c0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0e00 0e00 0000 3e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 01c0 01c0 0000 07c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 39c0 39c0 39c0 1f80 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7000 7000 7000 7000 7000 7380 7700 7e00 7c00 7e00 7700 7380 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f80 7fc0 7fc0 7fc0 7fc0 7fc0 7fc0 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f00 7b80 71c0 71c0 71c0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f00 7b80 71c0 71c0 71c0 71c0 7b80 7f00 7000 7000 7000 7000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1fc0 3bc0 71c0 71c0 71c0 71c0 3bc0 1fc0 01c0 01c0 01c0 01c0 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f80 3dc0 3800 3800 3800 3800 3800 3800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f80 71c0 7000 3f80 01c0 01c0 71c0 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1c00 1c00 1c00 7f00 1c00 1c00 1c00 1c00 1c00 1dc0 0f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 71c0 71c0 3b80 3b80 1f00 1f00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 71c0 71c0 71c0 7fc0 7fc0 7fc0 7fc0 3b80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 71c0 3b80 1f00 0e00 0e00 1f00 3b80 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 3bc0 1fc0 01c0 71c0 3b80 1f00 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3fc0 01c0 0380 0700 0e00 1c00 3800 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f80 6fc0 0fc0 0f80 3e00 7e00 7ec0 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 00c0 1f80 3b80 77c0 77c0 7dc0 7dc0 3b80 3f00 6000 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0e00 1b00 1b00 0e00 3f80 71c0 01c0 3fc0 71c0 71c0 71c0 3fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0e00 0e00 0000 0000 7fc0 7fc0 0000 0000 0e00 0e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0f00 0f00 0000 0000 0000 0000 0f00 0f00 1e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3b80 3b80 1f00 7fc0 1f00 3b80 3b80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1f00 3b80 3b80 71c0 71c0 71c0 7fc0 71c0 71c0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 7700 7380 7380 7380 7700 7f00 7380 71c0 71c0 71c0 7380 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 7000 7000 7000 7000 7000 7000 7000 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f00 7380 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 7380 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 7000 7000 7000 7000 7000 7f00 7000 7000 7000 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 7000 7000 7000 7000 7000 7f00 7000 7000 7000 7000 7000 7000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 7000 7000 7000 77c0 71c0 71c0 71c0 71c0 3bc0 1fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 7fc0 71c0 71c0 71c0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0fc0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 7380 7380 7700 7700 7e00 7700 7700 7380 7380 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 7bc0 7bc0 7fc0 7fc0 7fc0 7fc0 7fc0 71c0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 79c0 79c0 7dc0 7dc0 7fc0 7fc0 77c0 77c0 73c0 73c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f00 7380 71c0 71c0 71c0 71c0 7380 7f00 7000 7000 7000 7000 7000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 71c0 71c0 71c0 71c0 71c0 71c0 7fc0 77c0 3b80 1f80 01c0 0000 0000 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f00 7380 71c0 71c0 71c0 71c0 7380 7f00 7700 7380 7380 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 7000 7000 3800 1f00 0380 01c0 01c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 71c0 71c0 3b80 3b80 3b80 1f00 1f00 1f00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 71c0 71c0 71c0 7fc0 7fc0 7fc0 7fc0 7bc0 7bc0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 3b80 3b80 1f00 1f00 0e00 1f00 1f00 3b80 3b80 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 71c0 71c0 3b80 3b80 1f00 1f00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7fc0 01c0 01c0 0380 0700 0700 0e00 1c00 1c00 3800 7000 7000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0fc0 1f00 3f00 3f00 7700 7700 7fc0 7700 7700 7700 7700 7700 77c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 00c0 1f80 3b80 73c0 73c0 77c0 77c0 77c0 7dc0 7dc0 7dc0 79c0 3b80 3f00 6000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 1b00 1b00 0e00 0e00 1f00 3b80 71c0 71c0 7fc0 71c0 71c0 71c0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 71c0 7000 7000 7000 7000 7000 7000 7000 71c0 3b80 1f00 0e00 0600 1b00 0e00 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0f00 0f00 0000 0000 0000 0000 0f00 0f00 1e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3b80 3b80 1f00 7fc0 1f00 3b80 3b80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1e00 3300 6180 5e80 5280 5080 5280 5e80 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1e00 3300 6180 5e80 5280 5e80 5480 5680 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1800 1800 2400 2400 4200 4200 7e00 4200 4200 4200 0000 ffc0 8040 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0c00 1e00 3f00 7f80 f3c0 e1c0 c0c0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 1100 1100 1100 1f00 1080 1080 1080 1080 1f00 0000 ffc0 8040 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 8c40 9240 a040 a040 ac40 b240 a140 a140 a140 9240 8c40 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0e00 0e00 7fc0 7fc0 0e00 0e00 0000 7fc0 7fc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f00 7380 71c0 71c0 71c0 71c0 fdc0 71c0 71c0 71c0 71c0 7380 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0400 0600 0700 ff80 ff80 0700 0600 0400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3e00 1c00 1f80 1dc0 1dc0 1dc0 1f80 1c00 1c00 1c00 3e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1200 1200 2100 2100 4080 7380 1200 1200 1200 1200 1200 1200 1200 1e00 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1c00 2200 2200 2200 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 3c00 2200 2100 2200 3c00 2200 2100 2100 2200 3c00 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 1200 1200 1200 1200 1200 1200 1200 7380 4080 2100 2100 1200 1200 0c00 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 9e40 a140 a140 8140 8240 8440 8840 8840 8040 8840 8840 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 0000 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 8000 c000 e000 7000 ffc0 ffc0 0e00 0700 0380 01c0 00c0 0040 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 fe00 fe00 0c00 1800 3fc0 3fc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0080 0400 0000 1000 0000 0040 2080 0080 0080 1080 0080 0400 0080 0000 0000 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 2000 0000 2800 4000 8000 0000 0400 0000 0000 0800 0000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 8040 c0c0 e1c0 f3c0 7f80 3f00 1e00 3f00 7f80 f3c0 e1c0 c0c0 8040 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6600 7e00 3c00 3c00 7e00 6700 1f80 3bc0 71c0 71c0 71c0 3b80 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0800 1800 3800 7fc0 7fc0 3800 1800 0800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3c00 1f00 1f80 1f80 1f00 1c00 1c00 3c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0e00 1f00 3180 31c0 3180 1f00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 8240 8640 8a40 9240 a240 a240 bf40 8240 8240 8240 8240 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 1200 1200 2100 3f00 2100 2100 2100 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 ffc0 8040 8040 8040 8040 ffc0 8040 8040 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8e40 9140 9140 8e40 8440 bfc0 8440 8440 8440 8440 8a40 9140 a0c0 ffc0 0000 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f80 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f80 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 71c0 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 7000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 01c0 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0fc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ffc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 fe00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fe00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 fe00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 1f00 3f80 7fc0 7fc0 3f80 1f00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7700 7700 7700 7f00 7700 7700 7700 0000 1fc0 0700 0700 0700 0700 0700 0000 0000 ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7e00 7000 7000 7c00 7000 7000 7000 0fc0 0e00 0e00 0f80 0e00 0e00 0e00 0000 0000 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3e00 7700 7000 7000 7700 3e00 0000 1f80 1dc0 1dc0 1f80 1f00 1f80 1dc0 0000 0000 ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3800 3800 3800 3800 3800 3f00 0000 0fc0 0e00 0e00 0f80 0e00 0e00 0e00 0000 0000 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 3b80 3b80 3b80 1f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 7fc0 0e00 0e00 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7700 7f00 7f00 7f00 7f00 7700 0000 0e00 0e00 0e00 0e00 0e00 0e00 0fc0 0000 0000 ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7700 7700 7700 3e00 3e00 1c00 1c00 0000 1fc0 0700 0700 0700 0700 0700 0000 0000 ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 fe00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fe00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ffc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0fc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 fe00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 01c0 0780 1e00 7800 1e00 0780 01c0 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 7800 1e00 0780 01c0 0780 1e00 7800 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 00c0 3fc0 7f80 1f80 1f80 1f80 1f80 3b80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 01c0 0380 7fc0 0700 0e00 7fc0 1c00 3800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 1dc0 1dc0 1c00 1c00 1c00 7f00 1c00 1c00 1c00 7e00 7fc0 7bc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270-20.bdf0000664000076500007650000017006713221577164013262 0ustar pdmpdmSTARTFONT 2.1 COMMENT "20-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1995-2009, Paul Mattes." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the name of Paul Mattes nor his contributors may" COMMENT " be used to endorse or promote products derived from this" COMMENT " software without specific prior written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES 'AS IS' AND ANY" COMMENT "EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO," COMMENT "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL," COMMENT "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED" COMMENT "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE," COMMENT "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED" COMMENT "AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT" COMMENT "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING" COMMENT "IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF" COMMENT "THE POSSIBILITY OF SUCH DAMAGE." COMMENT "" COMMENT $XConsortium: 10x20.bdf,v 1.12 92/04/02 14:25:55 gildea Exp $ COMMENT "$NCDId: @(#)10x20.bdf,v 1.11 1991/07/02 14:50:48 jim Exp $" COMMENT "" COMMENT "Copyright 1989-1991 Network Computing Devices, Inc." COMMENT "NCD is a registered trademark of Network Computing Devices, Inc." COMMENT "" COMMENT "Permission to use, copy, modify, and distribute this software and" COMMENT "its documentation for any purpose and without fee is hereby" COMMENT "granted, provided that the above copyright notice appear in all" COMMENT "copies and that both that copyright notice and this permission" COMMENT "notice appear in supporting documentation, and that the name of" COMMENT "NCD may not be used in advertising or publicity pertaining to" COMMENT "distribution of the software without specific, written prior" COMMENT "permission. NCD makes no representations about the" COMMENT "suitability of this software for any purpose. It is provided ``as" COMMENT "is'' without express or implied warranty." COMMENT "" COMMENT "NCD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE," COMMENT "INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN" COMMENT "NO EVENT SHALL NCD BE LIABLE FOR ANY SPECIAL, INDIRECT OR" COMMENT "CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS" COMMENT "OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT," COMMENT "NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN" COMMENT "CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE." FONT 3270-20 SIZE 20 75 75 FONTBOUNDINGBOX 10 20 0 -5 STARTPROPERTIES 17 FOUNDRY "NCD" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 20 POINT_SIZE 200 RESOLUTION_X 75 RESOLUTION_Y 75 AVERAGE_WIDTH 100 DEFAULT_CHAR 514 FONT_DESCENT 5 FONT_ASCENT 15 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" SPACING "C" COPYRIGHT "Copyright 1989-1991 Network Computing Devices, Inc." ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 3080 3000 3000 7f80 3000 7f00 3000 3000 3080 1980 0f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 1e00 3f00 7f80 7f80 7f80 7f80 3f00 1e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 3f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 2000 3000 1800 0c00 0600 0300 0180 0300 0600 0c00 1800 3000 2000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0100 0300 0600 0c00 1800 3000 6000 3000 1800 0c00 0600 0300 0100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0c00 0600 0600 0600 0600 0600 0c00 0c00 1800 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0c00 1800 1800 1800 1800 1800 0c00 0c00 0600 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7800 0c00 0c00 0c00 0c00 0c00 0780 0c00 0c00 0c00 0c00 0c00 7800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0780 0c00 0c00 0c00 0c00 0c00 7800 0c00 0c00 0c00 0c00 0c00 0780 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 0e00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 3300 1200 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0180 0180 0300 0300 0600 0600 0c00 0c00 1800 1800 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3000 3000 1800 1800 0c00 0c00 0600 0600 0300 0300 0180 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 0300 0600 0c00 0c00 0c00 0000 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 3f00 6d80 6c00 6c00 6c00 3f00 0d80 0d80 0d80 6d80 3f00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0c00 0c00 1e00 3300 6100 6000 6000 6100 3300 1e00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0f00 1980 1980 1800 1800 7e00 1800 1800 1800 7c00 56c0 7380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 4080 6180 3300 1e00 3f00 0c00 3f00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f80 3f80 7d80 7d80 7d80 3d80 1d80 0580 0580 0580 0580 0580 0580 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 4040 2e80 1f00 3180 3180 3180 1f00 2e80 4040 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 6180 6180 6180 6180 6180 3300 3300 1e00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1c00 3c00 6c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 0180 0180 0300 0e00 1800 3000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 0180 0300 0e00 0300 0180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0100 0300 0700 0f00 1b00 3300 6300 6300 7f80 0300 0300 0300 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6e00 7300 0180 0180 0180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6100 6000 6000 6e00 7300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0180 0180 0300 0300 0600 0600 0c00 0c00 1800 1800 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 3300 1e00 3300 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 3380 1d80 0180 0180 2180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1c00 3e00 7300 6300 6300 6600 6c00 6600 6300 6100 6300 6e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3e00 6300 6000 7000 7800 4c00 6600 3300 1900 0f00 0300 6300 3e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0d80 0d80 0d80 3fc0 1b00 1b00 1b00 7f80 3600 3600 3600 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6780 6f80 6d80 6d80 6d80 6f00 6600 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3980 6d80 6f00 3b00 0600 0600 0c00 0c00 1b80 1ec0 36c0 3380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 3600 3600 3c00 1800 3800 6c00 66c0 6380 6300 7780 3cc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f80 7f80 0180 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 7f00 7f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 1e00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3980 6d80 6700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3c00 1c00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0400 1200 0c00 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 0000 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 4080 6180 3300 1e00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 0000 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 2000 6000 2080 2100 7200 0400 0900 1300 2500 4f00 0100 0100 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 2000 6000 2080 2100 7200 0400 0b00 1480 2080 4100 0200 0780 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7000 0800 3080 0900 7200 0400 0900 1300 2500 4f80 0100 0100 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 6000 6000 6000 6000 3180 1f00 0c00 0400 1200 0c00 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 6300 6300 6300 6300 6300 7700 7d00 6000 6000 6000 0000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 2080 3180 1b00 0e00 0e00 1b00 3180 2080 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1800 3800 1800 1800 1800 3c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 0600 0c00 1800 3000 3e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 0200 0e00 0200 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1f00 2180 0180 3f80 6180 6180 3e80 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 6300 6300 6300 3600 1c00 0000 7f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0480 0d80 1b00 3600 6c00 d800 6c00 3600 1b00 0d80 0480 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 4800 6c00 3600 1b00 0d80 06c0 0d80 1b00 3600 6c00 4800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0000 0c00 0c00 0c00 1800 3000 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 6180 6180 6180 6180 6180 6180 6180 3380 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 4180 6180 7180 7980 7d80 6f80 6780 6380 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6e00 7300 6180 6180 6180 6180 7300 6e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 6000 6000 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0180 0180 0180 0180 0180 1d80 3380 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 1980 1800 1800 1800 1800 7e00 1800 1800 1800 1800 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3e80 6380 6300 6300 6300 3e00 6000 3f00 6180 6180 6180 3f00 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0180 0180 0000 0780 0180 0180 0180 0180 0180 0180 0180 3180 3180 3180 1f00 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6300 6600 6c00 7800 7c00 6600 6300 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 5b00 7f80 6d80 6d80 6d80 6d80 6d80 6d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6e00 7300 6180 6180 6180 6180 7300 6e00 6000 6000 6000 6000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1d80 3380 6180 6180 6180 6180 3380 1d80 0180 0180 0180 0180 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6f00 3980 3000 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 6180 6000 3f00 0180 0180 6180 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1800 1800 1800 7e00 1800 1800 1800 1800 1800 1980 0f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6d80 6d80 6d80 7f80 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 3300 1e00 0c00 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f80 0180 0300 0600 0c00 1800 3000 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3b00 4d80 0d80 0f00 3c00 6c00 6c80 3700 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0080 1f00 3300 6580 6580 6980 6980 3300 3e00 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0c00 1200 1200 0c00 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 0000 7f80 7f80 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3300 3300 1e00 7f80 1e00 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 6180 6180 6180 7f80 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7c00 6600 6300 6300 6300 6600 7e00 6300 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6000 6000 6000 6000 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6180 6180 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6000 7e00 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6000 7e00 6000 6000 6000 6000 6000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6780 6180 6180 6180 6180 3380 1e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 7f80 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 0180 0180 0180 0180 0180 0180 0180 0180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6300 6300 6600 6600 7c00 6600 6600 6300 6300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 7380 7380 7f80 6d80 6d80 6d80 6d80 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 7180 7180 7980 7980 6d80 6d80 6780 6780 6380 6380 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6300 7e00 6000 6000 6000 6000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6180 6180 6180 6d80 6780 3300 1f00 0180 0000 0000 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6300 7e00 6600 6300 6300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 3000 1e00 0300 0180 0180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 3300 3300 3300 1e00 1e00 1e00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6d80 6d80 6d80 6d80 7380 7380 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 1e00 1e00 3300 3300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0180 0180 0300 0600 0600 0c00 1800 1800 3000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 1e00 3600 3600 6600 6600 7f80 6600 6600 6600 6600 6600 6780 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0080 1f00 3300 6380 6380 6580 6580 6580 6980 6980 6980 7180 3300 3e00 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1200 1200 0c00 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6000 6000 6000 6000 6180 3300 1e00 0c00 0400 1200 0c00 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3300 3300 1e00 7f80 1e00 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1e00 3300 6180 5e80 5280 5080 5280 5e80 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1e00 3300 6180 5e80 5280 5e80 5480 5680 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1800 1800 2400 2400 4200 4200 7e00 4200 4200 4200 0000 ffc0 8040 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0c00 1e00 3f00 7f80 f3c0 e1c0 c0c0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 1100 1100 1100 1f00 1080 1080 1080 1080 1f00 0000 ffc0 8040 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 8c40 9240 a040 a040 ac40 b240 a140 a140 a140 9240 8c40 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 7f80 7f80 0c00 0c00 0000 7f80 7f80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 f980 6180 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0400 0600 0700 ff80 ff80 0700 0600 0400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3c00 1800 1f00 1980 1980 1980 1f00 1800 1800 1800 3c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1200 1200 2100 2100 4080 7380 1200 1200 1200 1200 1200 1200 1200 1e00 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1c00 2200 2200 2200 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 3c00 2200 2100 2200 3c00 2200 2100 2100 2200 3c00 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 1200 1200 1200 1200 1200 1200 1200 7380 4080 2100 2100 1200 1200 0c00 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 878 0 DWIDTH 10 0 BBX 12 20 0 -5 BITMAP 0000 ffc0 8040 8040 9e40 a140 a140 8140 8240 8440 8840 8840 8040 8840 8840 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 878 0 DWIDTH 10 0 BBX 12 20 0 -5 BITMAP 0000 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 0000 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 8000 c000 e000 7000 ffc0 ffc0 0e00 0700 0380 01c0 00c0 0040 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 fe00 fe00 0c00 1800 3fc0 3fc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0080 0400 0000 1000 0000 0040 2080 0080 0080 1080 0080 0400 0080 0000 0000 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 2000 0000 2800 4000 8000 0000 0400 0000 0000 0800 0000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 8040 c0c0 e1c0 f3c0 7f80 3f00 1e00 3f00 7f80 f3c0 e1c0 c0c0 8040 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 4400 6c00 3800 3800 6c00 4600 1f00 3380 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0800 1800 3800 7fc0 7fc0 3800 1800 0800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3800 1e00 1b00 1b00 1e00 1800 1800 3800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0e00 1f00 3180 31c0 3180 1f00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 8240 8640 8a40 9240 a240 a240 bf40 8240 8240 8240 8240 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 1200 1200 2100 3f00 2100 2100 2100 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 ffc0 8040 8040 8040 8040 ffc0 8040 8040 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8e40 9140 9140 8e40 8440 bfc0 8440 8440 8440 8440 8a40 9140 a0c0 ffc0 0000 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0c00 1e00 3f00 7f80 7f80 3f00 1e00 0c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 6600 6600 7e00 6600 6600 6600 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7c00 6000 6000 7800 6000 6000 6000 0f80 0c00 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3c00 6600 6000 6000 6600 3c00 0000 1f00 1980 1980 1f00 1e00 1b00 1980 0000 0000 ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3000 3000 3000 3000 3000 3e00 0000 0f80 0c00 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 3300 3300 1e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 7f80 0c00 0c00 0000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 7600 7e00 7e00 6e00 6600 0000 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 6600 6600 3c00 3c00 1800 1800 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 01c0 0700 1c00 7000 1c00 0700 01c0 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 7000 1c00 0700 01c0 0700 1c00 7000 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0080 3f80 5b00 1b00 1b00 1b00 1b00 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0180 0300 7fc0 0600 0c00 7fc0 1800 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 1980 1800 1800 1800 7e00 1800 1800 1800 7c00 56c0 7380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270b.bdf0000664000076500007650000020555413221577164013205 0ustar pdmpdmSTARTFONT 2.1 COMMENT "14-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "Copyright (c) 1990, Jeff Sparkes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, Jeff Sparkes, GTRC" COMMENT " nor their contributors may be used to endorse or promote" COMMENT " products derived from this software without specific prior" COMMENT " written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC" COMMENT "'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT" COMMENT "NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND" COMMENT "FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT" COMMENT "SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT," COMMENT "INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL" COMMENT "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE" COMMENT "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS" COMMENT "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY," COMMENT "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING" COMMENT "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF" COMMENT "THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270bold SIZE 14 72 72 FONTBOUNDINGBOX 9 14 0 -3 STARTPROPERTIES 17 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 14 POINT_SIZE 140 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1a" AVERAGE_WIDTH 90 DEFAULT_CHAR 514 FONT_ASCENT 11 FONT_DESCENT 3 ENDPROPERTIES CHARS 427 STARTCHAR null ENCODING 0 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1F00 3980 3000 7E00 3000 7C00 3000 3980 1F00 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 3e00 7f00 7f00 7f00 3e00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3000 1800 0c00 0600 0300 0600 0c00 1800 3000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0300 0600 0c00 1800 3000 1800 0c00 0600 0300 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 1800 1800 1800 1800 1800 1800 1800 1800 1800 1e00 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 0600 0600 0600 0600 0600 0600 0600 0600 0600 1e00 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1800 0c00 0600 0600 0600 0600 0600 0c00 1800 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0600 0c00 1800 1800 1800 1800 1800 0c00 0600 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 0c00 0c00 0c00 0c00 0600 0c00 0c00 0c00 0c00 3800 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0e00 1800 1800 1800 1800 3000 1800 1800 1800 1800 0e00 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f80 0000 0000 7f80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3600 3600 3600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0180 0300 0600 0c00 1800 3000 6000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 6000 3000 1800 0c00 0600 0300 0180 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1f00 3180 3180 0300 0600 0c00 0c00 0000 0000 0c00 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0c00 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 3f80 6c00 6c00 3f00 0d80 0d80 7f00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 3f00 6c00 6c00 6c00 3f00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0e00 1b00 1800 1800 7e00 1800 1800 1800 7980 7f00 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6180 3300 1e00 0c00 7f80 0c00 0c00 7f80 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7c00 6600 6600 6600 7c00 6000 6600 6f00 6600 6600 0600 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 3300 1e00 3300 3300 3300 1e00 3300 6180 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 3300 6180 6180 6d80 6d80 6180 6180 3300 1e00 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1c00 3c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1f00 3180 6180 0180 0300 0600 0c00 1800 3000 7f80 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3f80 0180 0300 0600 0e00 0300 0180 0180 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0700 0f00 1b00 3300 6300 6300 7f80 0300 0300 0300 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f80 6000 6000 7e00 0300 0180 0180 0180 0300 7e00 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 3000 6000 6000 7e00 7300 6180 6180 3300 1e00 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f80 0180 0300 0600 0c00 1800 1800 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 3300 3300 3300 1e00 3300 6180 6180 3300 1e00 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1f00 3180 6180 6380 6780 3d80 0180 0180 0180 0300 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3600 6600 6c00 6600 6300 6180 6180 7980 6f00 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 3000 3000 7800 6c00 6600 3300 1b00 0f00 0600 0600 3c00 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3600 7f00 3600 3600 7f00 3600 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3f00 6180 6180 6f80 7f80 7f00 6000 6000 6000 3f80 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 7800 3180 0300 0600 0c00 1800 3000 6300 0780 0300 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7f80 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3800 6c00 6c00 6c00 3800 7980 6f00 6600 3f00 0180 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 1c00 3800 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 1c00 1c00 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 0180 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3600 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1e00 3300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 6d80 0700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7380 7380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 0c00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0600 0c00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0c00 3800 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1800 0c00 0600 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1d80 3700 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3b00 6e00 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3600 0000 0000 6300 6300 6300 6300 3300 1e00 0c00 1800 3000 6000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0300 0600 6d80 3300 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0600 0c00 1800 0000 6300 6300 6300 6300 3300 1e00 0c00 1800 3000 6000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0300 0600 0c00 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3000 7000 3000 3000 7b00 0700 0f00 0f80 0300 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3000 7000 3000 3000 7f00 0180 0300 0600 0780 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3800 6c00 1800 6c00 3b00 0700 0f00 0f80 0300 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3600 0000 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3000 6000 6000 6000 3000 1f00 0c00 3c00 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3600 0000 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3600 0000 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3300 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3600 0000 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 6300 6300 6300 6300 6300 6300 7f80 6000 6000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1e00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1e00 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1e00 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1e00 0000 1e00 3300 3300 3300 3300 3300 1e00 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 3c00 0000 6600 6600 6600 6600 6600 6600 3f00 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0300 0600 0c00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3300 1e00 0c00 1e00 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0600 0c00 1800 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0600 0c00 1800 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0600 0c00 1800 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1d80 3700 0000 7f00 3180 3180 3180 3180 3180 3180 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0600 0300 0c00 1e00 3300 6180 7f80 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 7f80 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1800 0c00 0600 0000 1e00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 3f00 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 1800 0c00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1d80 3700 0000 0c00 1e00 3300 6180 7f80 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1d80 3700 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 1c00 0c00 0c00 1e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 3600 0c00 1800 3e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 3600 0c00 3600 1c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1e00 0300 1f00 3300 1f00 0000 3f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1e00 3300 3300 3300 1e00 0000 3f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1980 3300 6600 3300 1980 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 6600 3300 1980 3300 6600 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0600 0000 0000 0600 0600 0c00 1800 3180 3180 1f00 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3300 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3300 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3300 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3300 0000 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3300 0000 6180 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 1e00 0000 0c00 1e00 3300 6180 7f80 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 1e00 0000 7f80 6000 6000 6000 7e00 6000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 1e00 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 1e00 0000 3f00 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 1e00 0000 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 1800 3000 0c00 1e00 3300 6180 7f80 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0300 0600 0c00 7f80 6000 6000 6000 7e00 6000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0600 0c00 1800 0000 1e00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0300 0600 0c00 3f00 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0300 0600 0c00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1d80 3700 0000 6180 7180 7980 6d80 6780 6380 6180 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6000 6000 6000 7c00 6600 6300 6300 6300 6600 7c00 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3000 6000 6000 6000 3000 1f00 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0300 0300 0300 1f00 3300 6300 6300 6300 3300 1f00 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0f00 1800 1800 7e00 1800 1800 1800 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3180 6180 6180 3380 1f80 0180 3180 1f00 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6000 6000 6000 7e00 7300 6300 6300 6300 6300 6300 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0300 0000 0000 0300 0300 0300 0300 0300 0300 0300 3300 1e00 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 3000 3000 3300 3600 3c00 3800 3c00 3600 3300 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0e00 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3f00 6d80 6d80 6d80 6d80 6d80 6d80 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f00 3180 3180 3180 3180 3180 3180 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7c00 6600 6300 6300 6300 6600 7c00 6000 6000 6000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3300 6300 6300 3300 1f00 0300 0300 0380 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 6f00 3980 3000 3000 3000 3000 3000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 6300 3000 1c00 0600 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 0c00 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 6180 6180 6180 6d80 6d80 7f80 3300 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 6180 3300 1e00 0c00 1e00 3300 6180 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 6300 6300 6300 6300 3300 1e00 0c00 1800 3000 6000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f80 0300 0600 0c00 1800 3000 7f80 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f00 0d80 1d80 3f80 6c00 6c00 3f80 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f80 3300 3700 3f00 3b00 3300 7e00 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 1e00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 1c00 0000 7f00 0000 1c00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f80 7f80 0000 0e00 0e00 0000 0000 0e00 0e00 1c00 3800 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f80 7f80 0000 0c00 6d80 3f00 1e00 3f00 6d80 0c00 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 3300 3180 3300 3e00 3300 3180 3300 7e00 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f00 1980 3000 6000 6000 6000 3000 1980 0f00 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 3300 3180 3180 3180 3180 3180 3300 7e00 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 6000 6000 6000 7f00 6000 6000 6000 6000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 3300 6000 6000 6000 6f80 6300 3300 1f00 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 6180 6180 7f80 6180 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f00 0600 0600 0600 0600 0600 6600 6600 3c00 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6300 6600 6c00 7800 7c00 6600 6300 6180 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6000 6000 6000 6000 6000 6000 6000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 7380 7f80 6d80 6d80 6180 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 7180 7980 6d80 6780 6380 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 6300 6180 6180 6300 7e00 6000 6000 6000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6d80 3f00 1e00 0300 0180 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 6180 6180 6180 7f00 6c00 6600 6300 6180 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3f00 6180 6000 3800 0c00 0700 0180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 3300 3300 3300 1e00 1e00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 6180 6180 6d80 6d80 6d80 7f80 3300 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 3300 1e00 0c00 1e00 3300 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 3300 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 0180 0300 0600 0c00 1800 3000 6000 7f80 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f80 1e00 3600 6600 6780 7e00 6600 6600 6780 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3f00 6180 6380 6780 6d80 7980 7180 6180 3f00 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1e00 1e00 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f00 1980 3000 6000 6000 6000 3000 1980 0f00 0600 3e00 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0e00 0e00 1c00 3800 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 6d80 3f00 1e00 3f00 6d80 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2200 4d00 5100 5100 4d00 2200 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2200 5900 5500 5900 5500 2200 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 5000 8800 8800 f800 8800 8800 0000 ff80 8080 8080 ff80 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0800 1c00 3e00 7700 e380 c180 8080 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0f00 0480 0480 0700 0480 0480 0f00 0000 ff80 8080 8080 ff80 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 ff80 8080 9080 a080 a080 ac80 b280 a280 9c80 8080 ff80 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 7f80 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 3300 3180 3180 7d80 3180 3180 3300 7e00 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0400 0600 ff00 0600 0400 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6000 6000 7e00 6300 6300 6300 7e00 6000 6000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 2200 4100 7700 1400 1400 1400 1400 1400 1c00 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1400 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3c00 1200 1200 1c00 1200 1200 3c00 0000 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1400 1400 1400 1400 1400 7700 4100 2200 1400 0800 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 8080 9c80 a280 a280 8280 8480 8880 8880 8080 8880 8080 ff80 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 8000 c000 e000 7000 3800 ff80 0e00 0700 0380 0180 0080 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 fc00 0800 1000 2000 7f80 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0100 0800 0000 2000 0000 0080 4100 0100 0100 2100 0100 0800 0100 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2000 0000 2800 4000 8000 0400 0000 0000 0800 0000 2000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 8080 c180 e380 f780 7f00 3e00 3e00 7f00 f780 e380 c180 8080 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3c00 1800 3c00 0600 3f00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1000 3000 7f80 3000 1000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6000 6000 7e00 7300 6300 6300 6300 7300 7e00 6000 6000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0e00 1100 1180 1100 0e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 ff80 8080 8480 8c80 9480 a480 be80 8480 8480 8080 ff80 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 2200 2200 3e00 2200 2200 0000 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 ff80 8080 8080 8080 ff80 8080 ff80 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 8080 9c80 9480 9c80 8880 ff80 8880 8880 9480 a280 c180 ff80 0000 ENDCHAR STARTCHAR apl_Aunderbar ENCODING 257 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_upcarettilde ENCODING 263 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3800 6d80 0700 0000 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_del ENCODING 266 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 7f80 6180 3300 3300 1e00 1e00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_delta ENCODING 267 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0c00 0c00 1e00 1e00 3300 3300 6180 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_braceright ENCODING 270 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 0c00 0c00 0c00 0c00 0600 0c00 0c00 0c00 0c00 3800 0000 0000 ENDCHAR STARTCHAR apl_braceleft ENCODING 271 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0e00 1800 1800 1800 1800 3000 1800 1800 1800 1800 0e00 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_equalunderbar ENCODING 277 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f80 0000 7f80 0000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_epsilon ENCODING 284 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3000 6000 7e00 6000 3000 1f00 0000 0000 0000 ENDCHAR STARTCHAR apl_iota ENCODING 285 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3000 3000 3000 3000 3000 3600 1c00 0000 0000 0000 ENDCHAR STARTCHAR apl_multiply ENCODING 286 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3300 1e00 0c00 1e00 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_leftarrow ENCODING 287 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1800 3800 7f80 3800 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super0 ENCODING 288 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3600 3600 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super1 ENCODING 289 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1c00 0c00 0c00 1e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super2 ENCODING 290 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3c00 0600 1c00 3000 3e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super3 ENCODING 291 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3c00 0600 1c00 0600 3c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super4 ENCODING 292 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1c00 3c00 3e00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super5 ENCODING 293 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3e00 3000 3c00 0600 3c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super6 ENCODING 294 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3000 3c00 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super7 ENCODING 295 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3e00 0600 0c00 1800 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super8 ENCODING 296 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3600 1c00 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super9 ENCODING 297 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3600 1e00 0600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Runderbar ENCODING 298 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 6180 6180 6180 7f00 6c00 6600 6300 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_uptack ENCODING 311 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_quad ENCODING 312 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f80 6180 6180 6180 6180 6180 6180 6180 6180 6180 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_rho ENCODING 313 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 3300 6180 6180 6180 7300 7e00 6000 6000 6000 ENDCHAR STARTCHAR apl_alpha ENCODING 314 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1d80 3780 6300 6300 6300 3780 1d80 0000 0000 0000 ENDCHAR STARTCHAR apl_degree ENCODING 315 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 1b00 1b00 0e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 0600 0600 0600 0600 0600 0600 0600 0600 0600 1e00 0000 0000 ENDCHAR STARTCHAR apl_notequal ENCODING 318 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0300 0600 7f00 0c00 1800 7f00 3000 6000 0000 0000 0000 ENDCHAR STARTCHAR apl_circle ENCODING 319 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1e00 3300 6180 6180 6180 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Dunderbar ENCODING 320 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 3300 3180 3180 3180 3180 3180 3300 7e00 0000 7f80 0000 ENDCHAR STARTCHAR apl_Munderbar ENCODING 321 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 7380 7f80 6d80 6d80 6180 6180 6180 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_Qunderbar ENCODING 322 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6d80 3f00 1e00 0300 7f80 0000 ENDCHAR STARTCHAR apl_circlestile ENCODING 323 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 1e00 3f00 6d80 6d80 6d80 3f00 1e00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR apl_deltastile ENCODING 324 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 1e00 1e00 3f00 3f00 6d80 7f80 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_Funderbar ENCODING 325 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 6000 6000 6000 7f00 6000 6000 6000 6000 0000 7f80 0000 ENDCHAR STARTCHAR apl_circleslope ENCODING 326 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 7e00 3300 7980 6d80 6780 3300 1f80 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upshoejot ENCODING 327 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 3300 3f00 3f00 3300 3300 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 1800 1800 1800 1800 1800 1800 1800 1800 1800 1e00 0000 0000 ENDCHAR STARTCHAR apl_upstile ENCODING 329 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 1800 1800 1800 1800 1800 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR apl_Junderbar ENCODING 330 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f00 0600 0600 0600 0600 0600 6600 6600 3c00 0000 7f00 0000 ENDCHAR STARTCHAR apl_slope ENCODING 331 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3000 1800 0c00 0600 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_divide ENCODING 332 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 1c00 0000 7f00 0000 1c00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_delstile ENCODING 334 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 7f80 6d80 3f00 3f00 1e00 1e00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_Hunderbar ENCODING 335 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 6180 6180 7f80 6180 6180 6180 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_Cunderbar ENCODING 336 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f00 1980 3000 6000 6000 6000 3000 1980 0f00 0000 7f80 0000 ENDCHAR STARTCHAR apl_Lunderbar ENCODING 337 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6000 6000 6000 6000 6000 6000 6000 6000 7f80 0000 7f80 0000 ENDCHAR STARTCHAR apl_Punderbar ENCODING 338 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 6300 6180 6180 6300 7e00 6000 6000 6000 0000 7f80 0000 ENDCHAR STARTCHAR apl_squad ENCODING 339 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3e00 3600 3600 3600 3600 3600 3600 3600 3600 3600 3e00 0000 0000 0000 ENDCHAR STARTCHAR apl_overbar ENCODING 340 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Bunderbar ENCODING 341 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 3300 3180 3300 3e00 3300 3180 3300 7e00 0000 7f80 0000 ENDCHAR STARTCHAR apl_Kunderbar ENCODING 342 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6300 6600 6c00 7800 7c00 6600 6300 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_Ounderbar ENCODING 343 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 7f80 0000 ENDCHAR STARTCHAR apl_downcarettilde ENCODING 344 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3800 6d80 0700 0000 6180 3300 1e00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_quotedot ENCODING 345 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1c00 0c00 0c00 0c00 0000 0000 0000 1c00 1c00 0000 0000 0000 ENDCHAR STARTCHAR apl_Eunderbar ENCODING 346 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 7f80 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_Nunderbar ENCODING 348 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 7180 7980 6d80 6780 6380 6180 6180 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_quadslope ENCODING 349 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f80 6180 6180 7180 7980 6d80 6780 6380 6180 6180 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_quadquote ENCODING 350 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f80 7d80 6d80 6d80 6d80 6180 6180 6180 6180 6180 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_Iunderbar ENCODING 351 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 1e00 0000 ENDCHAR STARTCHAR apl_Uunderbar ENCODING 352 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 6180 6180 3f00 0000 7f80 0000 ENDCHAR STARTCHAR apl_iotaunderbar ENCODING 353 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3000 3000 3000 3000 3000 3600 1c00 0000 3e00 0000 ENDCHAR STARTCHAR apl_downcaret ENCODING 354 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3300 1e00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_circlebar ENCODING 355 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1e00 3300 6180 7f80 6180 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_circlestar ENCODING 356 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1e00 3f00 7f80 6d80 7f80 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Wunderbar ENCODING 357 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 6180 6180 6d80 6d80 6d80 7f80 3300 0000 7f80 0000 ENDCHAR STARTCHAR apl_uptackjot ENCODING 358 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 3f00 0c00 1e00 3f00 3f00 1e00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_downtackup ENCODING 359 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3f00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 ENDCHAR STARTCHAR apl_slashbar ENCODING 360 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0300 0600 7f80 1800 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_rightshoe ENCODING 362 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 0300 0300 0300 3e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_leftshoe ENCODING 363 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3000 3000 3000 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_uparrow ENCODING 364 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0c00 1e00 3f00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_downarrow ENCODING 365 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0c00 0c00 0c00 0c00 0c00 3f00 1e00 0c00 0000 0000 0000 ENDCHAR STARTCHAR apl_upshoe ENCODING 366 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 3300 3300 3300 3300 3300 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_downshoe ENCODING 367 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 3300 3300 3300 3300 3300 1e00 0000 0000 0000 ENDCHAR STARTCHAR apl_Tunderbar ENCODING 368 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 7f80 0000 ENDCHAR STARTCHAR apl_quadjot ENCODING 369 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f80 6180 6180 7f80 7380 7380 7380 7f80 6180 6180 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_righttack ENCODING 370 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0300 0300 0300 3f00 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_diaeresisdot ENCODING 371 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7380 7380 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_deltaunderbar ENCODING 372 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0c00 1e00 1e00 3300 3300 6180 7f80 0000 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_Sunderbar ENCODING 373 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3f00 6180 6000 3800 0c00 0700 0180 6180 3f00 0000 7f80 0000 ENDCHAR STARTCHAR apl_diaeresis ENCODING 374 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7380 7380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lefttack ENCODING 375 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 3000 3000 3000 3f00 3000 3000 3000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_slopebar ENCODING 376 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3000 1800 7f80 0600 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_deltilde ENCODING 377 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 6180 3300 3b00 7f80 1f00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Vunderbar ENCODING 378 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 3300 3300 3300 1e00 1e00 0c00 0c00 0000 7f80 0000 ENDCHAR STARTCHAR apl_upcaret ENCODING 379 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1e00 3300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_epsilonunderbar ENCODING 380 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1f00 3000 6000 7e00 6000 3000 1f00 0000 7f00 0000 ENDCHAR STARTCHAR apl_quaddivide ENCODING 381 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f80 6180 6d80 6d80 6180 7f80 6180 6d80 6d80 6180 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_downtackjot ENCODING 382 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0c00 0c00 1e00 3f00 3f00 1e00 0c00 3f00 0000 0000 0000 ENDCHAR STARTCHAR apl_Zunderbar ENCODING 383 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f80 0180 0300 0600 0c00 1800 3000 6000 7f80 0000 7f80 0000 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_solidcircle ENCODING 403 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1e00 1e00 1e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_subn ENCODING 404 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 3c00 3600 3600 3600 0000 0000 0000 ENDCHAR STARTCHAR apl_splat ENCODING 410 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6180 3f00 3300 3300 3300 3300 3300 3300 3f00 6180 0000 0000 0000 ENDCHAR STARTCHAR apl_diamond ENCODING 411 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 1e00 3300 6180 3300 1e00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Gunderbar ENCODING 412 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 3300 6000 6000 6000 6f80 6300 3300 1f00 0000 7f80 0000 ENDCHAR STARTCHAR apl_sub1 ENCODING 413 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0c00 1c00 0c00 0c00 1e00 0000 0000 ENDCHAR STARTCHAR apl_superlparen ENCODING 416 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1800 1800 1800 1800 0c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_plus2 ENCODING 417 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0c00 0c00 3f00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_solidbox ENCODING 418 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3f00 3f00 3f00 3f00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_section ENCODING 423 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 3000 3000 7800 6c00 6600 3300 1b00 0f00 0600 0600 3c00 0000 ENDCHAR STARTCHAR apl_superrparen ENCODING 425 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 0600 0600 0600 0600 0c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_minus2 ENCODING 426 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_paragraph ENCODING 432 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 3f80 7f00 7f00 3f00 0f00 0f00 0f00 0f00 0000 0000 0000 ENDCHAR STARTCHAR apl_sub2 ENCODING 434 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 3c00 0600 1c00 3000 3e00 0000 0000 ENDCHAR STARTCHAR apl_sub3 ENCODING 435 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 3c00 0600 1c00 0600 3c00 0000 0000 ENDCHAR STARTCHAR apl_plusminus ENCODING 442 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 7f80 0000 0000 0000 ENDCHAR STARTCHAR apl_tilde ENCODING 443 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 6d80 0700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Xunderbar ENCODING 444 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 6180 3300 1e00 0c00 1e00 3300 6180 6180 0000 7f80 0000 ENDCHAR STARTCHAR apl_Yunderbar ENCODING 445 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6180 3300 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0000 7f80 0000 ENDCHAR STARTCHAR apl_omega ENCODING 464 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3300 6180 6d80 6d80 3f00 0000 0000 0000 ENDCHAR STARTCHAR apl_jot ENCODING 465 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1c00 3600 3600 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_rightarrow ENCODING 470 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0600 0700 ff80 0700 0600 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_downtack ENCODING 471 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 ENDCHAR STARTCHAR apl_notless ENCODING 473 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 7000 1c00 0700 1c00 7000 0000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_notgreater ENCODING 503 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0700 1c00 7000 1c00 0700 0000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_downstile ENCODING 505 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1800 1800 1800 1800 1800 1800 1800 1800 1e00 0000 0000 0000 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0c00 1e00 3f00 1e00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7800 7800 7800 7800 7800 0000 0780 0300 0300 0300 0300 0000 0000 ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7800 6000 7000 6000 6000 0000 0780 0600 0700 0600 0600 0000 0000 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 6000 6000 6000 3800 0000 0700 0780 0700 0780 0780 0000 0000 ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6000 6000 6000 6000 7800 0000 0780 0600 0700 0600 0600 0000 0000 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 3600 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0c00 0c00 3f00 0c00 0c00 0000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6c00 7c00 7c00 6c00 6c00 0000 0600 0600 0600 0600 0780 0000 0000 ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7800 7800 7800 3000 3000 0000 0780 0300 0300 0300 0300 0000 0000 ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0700 1c00 7000 1c00 0700 0000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 7000 1c00 0700 1c00 7000 0000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3f80 1b00 1b00 1b00 1b00 1b00 3300 0000 0000 0000 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0300 0600 7f00 0c00 1800 7f00 3000 6000 0000 0000 0000 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 3600 3000 3000 7c00 3000 3000 7980 7f00 0000 0000 0000 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270.bdf0000664000076500007650000020674613221577164013047 0ustar pdmpdmSTARTFONT 2.1 COMMENT "14-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "Copyright (c) 1990, Jeff Sparkes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, Jeff Sparkes, GTRC" COMMENT " nor their contributors may be used to endorse or promote" COMMENT " products derived from this software without specific prior" COMMENT " written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC" COMMENT "'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT" COMMENT "NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND" COMMENT "FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT" COMMENT "SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT," COMMENT "INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL" COMMENT "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE" COMMENT "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS" COMMENT "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY," COMMENT "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING" COMMENT "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF" COMMENT "THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270 SIZE 14 72 72 FONTBOUNDINGBOX 9 14 0 -3 STARTPROPERTIES 17 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 14 POINT_SIZE 140 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1a" AVERAGE_WIDTH 90 DEFAULT_CHAR 514 FONT_ASCENT 11 FONT_DESCENT 3 ENDPROPERTIES CHARS 431 STARTCHAR null ENCODING 0 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 2100 2000 de00 2000 dc00 2000 2100 1e00 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 3e00 7f00 7f00 7f00 3e00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 2000 1000 0800 0400 0200 0400 0800 1000 2000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0200 0400 0800 1000 2000 1000 0800 0400 0200 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1000 1000 1000 1000 1000 1000 1000 1000 1000 1c00 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 0400 0400 0400 0400 0400 0400 0400 0400 0400 1c00 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1000 0800 0400 0400 0400 0400 0400 0800 1000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0400 0800 1000 1000 1000 1000 1000 0800 0400 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 0800 0800 0800 0800 0400 0800 0800 0800 0800 3000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1000 1000 1000 1000 2000 1000 1000 1000 1000 0c00 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f00 0000 0000 7f00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 0800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2400 2400 2400 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0100 0200 0400 0800 1000 2000 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 4000 2000 1000 0800 0400 0200 0100 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 0800 0800 0800 0000 0000 0800 0800 0800 0800 0800 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 2100 2100 0200 0400 0800 0800 0000 0000 0800 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0800 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 3f00 4800 4800 3e00 0900 0900 7e00 0800 0800 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 3e00 4800 4800 4800 3e00 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1200 1000 1000 7c00 1000 1000 1000 7100 6e00 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 4100 2200 1400 0800 7f00 0800 0800 7f00 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7800 4400 4400 4400 7800 4000 4400 4e00 4400 4400 0400 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 2200 1c00 2200 2200 2200 1c00 2200 4100 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2200 4100 4100 4900 4900 4100 4100 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1800 2800 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 2100 4100 0100 0200 0400 0800 1000 2000 7f00 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3f00 0100 0200 0400 0c00 0200 0100 0100 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0600 0a00 1200 2200 4200 4200 7f00 0200 0200 0200 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f00 4000 4000 7c00 0200 0100 0100 0100 0200 7c00 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1000 2000 4000 4000 5c00 6200 4100 4100 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f00 0100 0200 0400 0800 1000 1000 1000 1000 1000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2200 2200 2200 1c00 2200 4100 4100 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1e00 2100 4100 4300 4500 3900 0100 0100 0100 0200 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 4400 4800 4400 4200 4100 4100 5100 4e00 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2000 2000 5000 4800 4400 2200 1200 0a00 0400 0400 3800 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 2400 7e00 2400 2400 7e00 2400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3e00 4100 4100 4d00 5500 5e00 4000 4000 4000 3f00 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2000 5000 2100 0200 0400 0800 1000 2000 4200 0500 0200 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7f00 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3000 4800 4800 4800 3000 5100 4a00 4400 3a00 0100 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 1800 3000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1800 1800 0000 0000 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0800 0800 0800 7f00 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 0100 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 2200 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 4900 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1000 0800 0400 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0400 0800 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0800 0800 0800 3000 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1000 0800 0400 0000 0000 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1900 2600 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3200 4c00 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2400 0000 0000 4200 4200 4200 4200 2200 1400 0800 1000 2000 4000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 4900 2200 1400 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0400 0800 1000 0000 4200 4200 4200 4200 2200 1400 0800 1000 2000 4000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 0800 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 2000 6000 2000 2000 7200 0600 0a00 0f00 0200 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 2000 6000 2000 2000 7600 0100 0200 0400 0700 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3000 4800 1000 4800 3200 0600 0a00 0f00 0200 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2400 0000 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2000 4000 4000 4000 2000 1e00 0800 3800 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2400 0000 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2400 0000 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2200 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2400 0000 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 4200 4200 4200 4200 4200 4200 7d00 4000 4000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 0000 0000 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 0000 1c00 2200 2200 2200 2200 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1000 2800 0000 4400 4400 4400 4400 4400 4400 3a00 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 0800 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 2200 1400 0800 1400 2200 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0400 0800 1000 0000 0000 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0400 0800 1000 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0400 0800 1000 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1900 2600 0000 5e00 2100 2100 2100 2100 2100 2100 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0400 0200 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 7f00 4000 4000 7c00 4000 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1000 0800 0400 0000 1c00 0800 0800 0800 0800 0800 1c00 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 3e00 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 1000 0800 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1900 2600 0000 0800 1400 2200 4100 7f00 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1900 2600 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 1800 0800 0800 1c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1800 2400 0800 1000 3c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1800 2400 0800 2400 1800 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1c00 0200 1e00 2200 1e00 0000 3e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1c00 2200 2200 2200 1c00 0000 3e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1100 2200 4400 2200 1100 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 4400 2200 1100 2200 4400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0400 0000 0000 0400 0400 0800 1000 2100 2100 1e00 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2200 0000 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2200 0000 7f00 4000 4000 4000 7c00 4000 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2200 0000 1c00 0800 0800 0800 0800 0800 0800 0800 1c00 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2200 0000 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2200 0000 4100 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 0000 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 0000 7f00 4000 4000 4000 7c00 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 0000 1c00 0800 0800 0800 0800 0800 0800 1c00 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 0000 3e00 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 0000 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1000 2000 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 0800 7f00 4000 4000 4000 7c00 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0400 0800 1000 0000 1c00 0800 0800 0800 0800 0800 1c00 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 0800 3e00 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 0800 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1900 2600 0000 4100 6100 5100 4900 4500 4300 4100 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 4000 4000 4000 7800 4400 4200 4200 4200 4400 7800 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2000 4000 4000 4000 2000 1e00 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0200 0200 0200 1e00 2200 4200 4200 4200 2200 1e00 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0e00 1000 1000 7c00 1000 1000 1000 1000 1000 1000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2100 4100 4100 2300 1d00 0100 2100 1e00 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 4000 4000 4000 5c00 6200 4200 4200 4200 4200 4200 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0200 0000 0000 0200 0200 0200 0200 0200 0200 0200 2200 1c00 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2000 2000 2000 2200 2400 2800 3000 2800 2400 2200 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 0800 0800 0800 0800 0800 0800 0800 0c00 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3600 4900 4900 4900 4900 4900 4900 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 5e00 2100 2100 2100 2100 2100 2100 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7800 4400 4200 4200 4200 4400 7800 4000 4000 4000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2200 4200 4200 2200 1e00 0200 0200 0300 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 4e00 3100 2000 2000 2000 2000 2000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3c00 4200 2000 1800 0400 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 0800 3e00 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 4100 4100 2200 2200 1400 1400 0800 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 4100 4100 4100 4900 4900 5500 2200 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 4100 2200 1400 0800 1400 2200 4100 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 4200 4200 4200 4200 2200 1400 0800 1000 2000 4000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f00 0200 0400 0800 1000 2000 7f00 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7600 0900 1900 2f00 4800 4800 3700 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1d00 2200 2600 2a00 3200 2200 5c00 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1c00 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1800 1800 0000 7e00 0000 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f00 7f00 0000 0c00 0c00 0000 0000 0c00 0c00 1800 3000 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f00 7f00 0000 0800 4900 2a00 1400 2a00 4900 0800 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 2200 2100 2200 3c00 2200 2100 2200 7c00 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 1100 2000 4000 4000 4000 2000 1100 0e00 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 2200 2100 2100 2100 2100 2100 2200 7c00 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 4000 4000 4000 7c00 4000 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 4000 4000 4000 7e00 4000 4000 4000 4000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 2200 4000 4000 4000 4f00 4200 2200 1e00 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 4100 4100 7f00 4100 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 0800 0800 0800 0800 0800 0800 0800 1c00 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 0400 0400 0400 0400 0400 4400 4400 3800 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4200 4400 4800 5000 6800 4400 4200 4100 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4000 4000 4000 4000 4000 4000 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 6300 5500 4900 4900 4100 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 6100 5100 4900 4500 4300 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 4200 4100 4100 4200 7c00 4000 4000 4000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 2200 4100 4100 4100 4100 4900 2a00 1c00 0200 0100 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 4100 4100 4100 7e00 4800 4400 4200 4100 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3e00 4100 4000 3000 0800 0600 0100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 0800 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 2200 2200 2200 1400 1400 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 4100 4100 4900 4900 4900 5500 2200 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 2200 1400 0800 1400 2200 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 2200 1400 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 0100 0200 0400 0800 1000 2000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0f00 1400 2400 4400 4700 7c00 4400 4400 4700 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3e00 4100 4300 4500 4900 5100 6100 4100 3e00 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1c00 1c00 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 1100 2000 4000 4000 4000 2000 1100 0e00 0400 3c00 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0c00 0c00 1800 3000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 4900 2a00 1400 2a00 4900 0800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2200 4d00 5100 5100 4d00 2200 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2200 5900 5500 5900 5500 2200 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2000 5000 8800 8800 f800 8800 8800 0000 ff80 8080 8080 ff80 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0800 1c00 3e00 7700 e380 c180 8080 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0f00 0480 0480 0700 0480 0480 0f00 0000 ff80 8080 8080 ff80 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 ff80 8080 9080 a080 a080 ac80 b280 a280 9c80 8080 ff80 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 0800 0800 7f00 0800 0800 0800 0000 7f00 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 2200 2100 2100 7900 2100 2100 2200 7c00 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0400 0600 ff00 0600 0400 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4000 4000 7c00 4200 4200 4200 7c00 4000 4000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 2200 4100 7700 1400 1400 1400 1400 1400 1c00 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1400 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3c00 1200 1200 1c00 1200 1200 3c00 0000 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1400 1400 1400 1400 1400 7700 4100 2200 1400 0800 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 8080 9c80 a280 a280 8280 8480 8880 8880 8080 8880 8080 ff80 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 8000 c000 e000 7000 3800 ff80 0e00 0700 0380 0180 0080 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 fc00 0800 1000 2000 7f80 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0100 0800 0000 2000 0000 0080 4100 0100 0100 2100 0100 0800 0100 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2000 0000 2800 4000 8000 0400 0000 0000 0800 0000 2000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 8080 c180 e380 f780 7f00 3e00 3e00 7f00 f780 e380 c180 8080 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2800 1000 2800 0400 3e00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1000 3000 7f80 3000 1000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4000 4000 5c00 6200 4200 4200 4200 6200 5c00 4000 4000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0e00 1100 1180 1100 0e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 ff80 8080 8480 8c80 9480 a480 be80 8480 8480 8080 ff80 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 2200 2200 3e00 2200 2200 0000 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 ff80 8080 8080 8080 ff80 8080 ff80 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 8080 9c80 9480 9c80 8880 ff80 8880 8880 9480 a280 c180 ff80 0000 ENDCHAR STARTCHAR apl_Aunderbar ENCODING 257 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_upcarettilde ENCODING 263 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 4900 0600 0000 0800 1400 2200 4100 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_del ENCODING 266 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 7f00 4100 2200 2200 1400 1400 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_delta ENCODING 267 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0800 0800 1400 1400 2200 2200 4100 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_braceright ENCODING 270 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 0800 0800 0800 0800 0400 0800 0800 0800 0800 3000 0000 0000 ENDCHAR STARTCHAR apl_braceleft ENCODING 271 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0c00 1000 1000 1000 1000 2000 1000 1000 1000 1000 0c00 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_equalunderbar ENCODING 277 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 7f00 0000 7f00 0000 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_epsilon ENCODING 284 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2000 4000 7c00 4000 2000 1e00 0000 0000 0000 ENDCHAR STARTCHAR apl_iota ENCODING 285 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 2000 2000 2000 2000 2000 2400 1800 0000 0000 0000 ENDCHAR STARTCHAR apl_multiply ENCODING 286 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 2200 1400 0800 1400 2200 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_leftarrow ENCODING 287 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1000 3000 7f80 3000 1000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super0 ENCODING 288 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 2400 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super1 ENCODING 289 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1800 0800 0800 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super2 ENCODING 290 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 0400 1800 2000 3c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super3 ENCODING 291 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3800 0400 1800 0400 3800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super4 ENCODING 292 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1800 2800 3c00 0800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super5 ENCODING 293 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3c00 2000 3800 0400 3800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super6 ENCODING 294 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2000 3800 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super7 ENCODING 295 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3c00 0400 0800 1000 1000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super8 ENCODING 296 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 1800 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_super9 ENCODING 297 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 1c00 0400 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Runderbar ENCODING 298 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7e00 4100 4100 4100 7e00 4800 4400 4200 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_uptack ENCODING 311 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 0800 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_quad ENCODING 312 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f00 4100 4100 4100 4100 4100 4100 4100 4100 4100 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_rho ENCODING 313 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1c00 2200 4100 4100 4100 6200 5c00 4000 4000 4000 ENDCHAR STARTCHAR apl_alpha ENCODING 314 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1900 2500 4200 4200 4200 2500 1900 0000 0000 0000 ENDCHAR STARTCHAR apl_degree ENCODING 315 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0c00 1200 1200 0c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 0400 0400 0400 0400 0400 0400 0400 0400 0400 1c00 0000 0000 ENDCHAR STARTCHAR apl_notequal ENCODING 318 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0200 0400 7e00 0800 1000 7e00 2000 4000 0000 0000 0000 ENDCHAR STARTCHAR apl_circle ENCODING 319 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 2200 4100 4100 4100 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Dunderbar ENCODING 320 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 2200 2100 2100 2100 2100 2100 2200 7c00 0000 7f00 0000 ENDCHAR STARTCHAR apl_Munderbar ENCODING 321 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 6300 5500 4900 4900 4100 4100 4100 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_Qunderbar ENCODING 322 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 2200 4100 4100 4100 4100 4900 2a00 1c00 0200 7f00 0000 ENDCHAR STARTCHAR apl_circlestile ENCODING 323 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 1c00 2a00 4900 4900 4900 2a00 1c00 0800 0800 0000 0000 ENDCHAR STARTCHAR apl_deltastile ENCODING 324 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 1c00 1c00 2a00 2a00 4900 7f00 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_Funderbar ENCODING 325 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 4000 4000 4000 7e00 4000 4000 4000 4000 0000 7f00 0000 ENDCHAR STARTCHAR apl_circleslope ENCODING 326 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 5c00 2200 5100 4900 4500 2200 1d00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upshoejot ENCODING 327 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1c00 2200 3600 2a00 2200 2200 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 1000 1000 1000 1000 1000 1000 1000 1000 1000 1c00 0000 0000 ENDCHAR STARTCHAR apl_upstile ENCODING 329 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 1000 1000 1000 1000 1000 1000 1000 1000 0000 0000 0000 ENDCHAR STARTCHAR apl_Junderbar ENCODING 330 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 0400 0400 0400 0400 0400 4400 4400 3800 0000 7e00 0000 ENDCHAR STARTCHAR apl_slope ENCODING 331 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 2000 1000 0800 0400 0200 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_divide ENCODING 332 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1800 1800 0000 7e00 0000 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_delstile ENCODING 334 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 7f00 4900 2a00 2a00 1c00 1c00 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_Hunderbar ENCODING 335 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 4100 4100 7f00 4100 4100 4100 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_Cunderbar ENCODING 336 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 1100 2000 4000 4000 4000 2000 1100 0e00 0000 7f00 0000 ENDCHAR STARTCHAR apl_Lunderbar ENCODING 337 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4000 4000 4000 4000 4000 4000 4000 4000 7f00 0000 7f00 0000 ENDCHAR STARTCHAR apl_Punderbar ENCODING 338 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 4200 4100 4100 4200 7c00 4000 4000 4000 0000 7f00 0000 ENDCHAR STARTCHAR apl_squad ENCODING 339 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3c00 2400 2400 2400 2400 2400 2400 2400 2400 2400 3c00 0000 0000 0000 ENDCHAR STARTCHAR apl_overbar ENCODING 340 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Bunderbar ENCODING 341 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7c00 2200 2100 2200 3c00 2200 2100 2200 7c00 0000 7f00 0000 ENDCHAR STARTCHAR apl_Kunderbar ENCODING 342 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4200 4400 4800 5000 6800 4400 4200 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_Ounderbar ENCODING 343 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 7f00 0000 ENDCHAR STARTCHAR apl_downcarettilde ENCODING 344 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3000 4900 0600 0000 4100 2200 1400 0800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_quotedot ENCODING 345 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 1800 0800 0800 0800 0000 0000 0000 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR apl_Eunderbar ENCODING 346 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 4000 4000 4000 7c00 4000 4000 4000 7f00 0000 7f00 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_Nunderbar ENCODING 348 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 6100 5100 4900 4500 4300 4100 4100 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_quadslope ENCODING 349 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f00 4100 4100 6100 5100 4900 4500 4300 4100 4100 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_quadquote ENCODING 350 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f00 5900 4900 4900 4900 4100 4100 4100 4100 4100 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_Iunderbar ENCODING 351 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 0800 0800 0800 0800 0800 0800 0800 1c00 0000 1c00 0000 ENDCHAR STARTCHAR apl_Uunderbar ENCODING 352 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 4100 4100 4100 4100 4100 4100 3e00 0000 7f00 0000 ENDCHAR STARTCHAR apl_iotaunderbar ENCODING 353 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 2000 2000 2000 2000 2000 2400 1800 0000 3c00 0000 ENDCHAR STARTCHAR apl_downcaret ENCODING 354 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 2200 1400 0800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_circlebar ENCODING 355 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 2200 4100 7f00 4100 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_circlestar ENCODING 356 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 1c00 2a00 5d00 4900 5500 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Wunderbar ENCODING 357 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 4100 4100 4900 4900 4900 5500 2200 0000 7f00 0000 ENDCHAR STARTCHAR apl_uptackjot ENCODING 358 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 3e00 0800 1c00 2a00 2a00 1c00 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_downtackup ENCODING 359 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 0800 0800 0800 0800 0800 3e00 0000 0000 0000 ENDCHAR STARTCHAR apl_slashbar ENCODING 360 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0200 0400 7f00 1000 2000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_rightshoe ENCODING 362 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3c00 0200 0200 0200 3c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_leftshoe ENCODING 363 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2000 2000 2000 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_uparrow ENCODING 364 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0800 1c00 3e00 0800 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_downarrow ENCODING 365 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0800 0800 0800 0800 0800 3e00 1c00 0800 0000 0000 0000 ENDCHAR STARTCHAR apl_upshoe ENCODING 366 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1c00 2200 2200 2200 2200 2200 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_downshoe ENCODING 367 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 2200 2200 2200 2200 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR apl_Tunderbar ENCODING 368 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 0800 0800 0800 0800 0800 0800 0800 0800 0000 7f00 0000 ENDCHAR STARTCHAR apl_quadjot ENCODING 369 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f00 4100 4100 5d00 6300 6300 6300 5d00 4100 4100 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_righttack ENCODING 370 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0200 0200 0200 3e00 0200 0200 0200 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_diaeresisdot ENCODING 371 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6300 6300 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_deltaunderbar ENCODING 372 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0800 1400 1400 2200 2200 4100 7f00 0000 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_Sunderbar ENCODING 373 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 3e00 4100 4000 3000 0800 0600 0100 4100 3e00 0000 7f00 0000 ENDCHAR STARTCHAR apl_diaeresis ENCODING 374 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lefttack ENCODING 375 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 2000 2000 2000 3e00 2000 2000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_slopebar ENCODING 376 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 2000 1000 7f00 0400 0200 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_deltilde ENCODING 377 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 4100 2200 3200 5d00 1600 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Vunderbar ENCODING 378 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 2200 2200 2200 1400 1400 0800 0800 0000 7f00 0000 ENDCHAR STARTCHAR apl_upcaret ENCODING 379 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1400 2200 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_epsilonunderbar ENCODING 380 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 1e00 2000 4000 7c00 4000 2000 1e00 0000 7e00 0000 ENDCHAR STARTCHAR apl_quaddivide ENCODING 381 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 7f00 4100 4900 4900 4100 7f00 4100 4900 4900 4100 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_downtackjot ENCODING 382 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0800 0800 1c00 2a00 2a00 1c00 0800 3e00 0000 0000 0000 ENDCHAR STARTCHAR apl_Zunderbar ENCODING 383 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 7f00 0100 0200 0400 0800 1000 2000 4000 7f00 0000 7f00 0000 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_solidcircle ENCODING 403 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1c00 1c00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_subn ENCODING 404 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 3800 2400 2400 2400 0000 0000 0000 ENDCHAR STARTCHAR apl_splat ENCODING 410 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 4100 3e00 2200 2200 2200 2200 2200 2200 3e00 4100 0000 0000 0000 ENDCHAR STARTCHAR apl_diamond ENCODING 411 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 1400 2200 4100 2200 1400 0800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Gunderbar ENCODING 412 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1c00 2200 4000 4000 4000 4f00 4200 2200 1e00 0000 7f00 0000 ENDCHAR STARTCHAR apl_sub1 ENCODING 413 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0800 1800 0800 0800 1c00 0000 0000 ENDCHAR STARTCHAR apl_superlparen ENCODING 416 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 1000 1000 1000 1000 0800 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_plus2 ENCODING 417 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0800 0800 3e00 0800 0800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_solidbox ENCODING 418 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3e00 3e00 3e00 3e00 3e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 0f80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0f80 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 0f80 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 ff80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_section ENCODING 423 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1c00 2000 2000 5000 4800 4400 2200 1200 0a00 0400 0400 3800 0000 ENDCHAR STARTCHAR apl_superrparen ENCODING 425 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0800 0400 0400 0400 0400 0800 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_minus2 ENCODING 426 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 ff80 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 f800 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 f800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 f800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 ff80 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_paragraph ENCODING 432 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 3f00 7a00 7a00 3a00 0a00 0a00 0a00 0a00 0000 0000 0000 ENDCHAR STARTCHAR apl_sub2 ENCODING 434 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 3800 0400 1800 2000 3c00 0000 0000 ENDCHAR STARTCHAR apl_sub3 ENCODING 435 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 3800 0400 1800 0400 3800 0000 0000 ENDCHAR STARTCHAR apl_dieresisjot ENCODING 436 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 6300 6300 0000 1800 2400 2400 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_dieresiscircle ENCODING 437 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 6300 6300 0000 1c00 2200 4100 4100 4100 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR apl_commabar ENCODING 438 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 3e00 0000 0000 0c00 0c00 1800 3000 0000 ENDCHAR STARTCHAR apl_euro ENCODING 439 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1e00 2100 2000 de00 2000 dc00 2000 2100 1e00 0000 0000 0000 ENDCHAR STARTCHAR apl_plusminus ENCODING 442 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0800 0800 0800 7f00 0800 0800 0800 0000 7f00 0000 0000 0000 ENDCHAR STARTCHAR apl_tilde ENCODING 443 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 4900 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_Xunderbar ENCODING 444 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 4100 2200 1400 0800 1400 2200 4100 4100 0000 7f00 0000 ENDCHAR STARTCHAR apl_Yunderbar ENCODING 445 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 4100 2200 1400 0800 0800 0800 0800 0800 0800 0000 7f00 0000 ENDCHAR STARTCHAR apl_omega ENCODING 464 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 2200 4100 4900 4900 3600 0000 0000 0000 ENDCHAR STARTCHAR apl_jot ENCODING 465 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1800 2400 2400 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_rightarrow ENCODING 470 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0400 0600 ff00 0600 0400 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_downtack ENCODING 471 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0800 0800 0800 0800 0800 0800 3e00 0000 0000 0000 ENDCHAR STARTCHAR apl_notless ENCODING 473 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 6000 1800 0600 1800 6000 0000 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_notgreater ENCODING 503 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0600 1800 6000 1800 0600 0000 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_downstile ENCODING 505 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1000 1000 1000 1000 1000 1000 1000 1000 1c00 0000 0000 0000 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0800 1c00 3e00 1c00 0800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 5000 5000 7000 5000 5000 0000 0700 0200 0200 0200 0200 0000 0000 ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 7000 4000 6000 4000 4000 0000 0700 0400 0600 0400 0400 0000 0000 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 3000 4000 4000 4000 3000 0000 0600 0500 0600 0500 0500 0000 0000 ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 4000 4000 4000 4000 7000 0000 0700 0400 0600 0400 0400 0000 0000 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0800 0800 3e00 0800 0800 0000 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 4800 6800 5800 4800 4800 0000 0400 0400 0400 0400 0700 0000 0000 ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 5000 5000 5000 2000 2000 0000 0700 0200 0200 0200 0200 0000 0000 ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 f800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 f800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0f80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 ff80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0f80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 f800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 ff80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0600 1800 6000 1800 0600 0000 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 6000 1800 0600 1800 6000 0000 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 3f00 1200 1200 1200 1200 1200 2200 0000 0000 0000 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0200 0400 7e00 0800 1000 7e00 2000 4000 0000 0000 0000 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 1800 2400 2000 2000 7800 2000 2000 7100 6e00 0000 0000 0000 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gr.bdf0000664000076500007650000016447613221577164013403 0ustar pdmpdmSTARTFONT 2.1 COMMENT "20-point 3270 font, Greek character set" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC Greek set (CP 875), CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1995-2009, Paul Mattes." COMMENT "Copyright (c) 2000, Mantzios Achilleus" COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the name of Paul Mattes, Mantzios Achilleus nor their" COMMENT " contributors may be used to endorse or promote products " COMMENT " derived from this software without specific prior written " COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND MANTZIOR ACHILLEUS" COMMENT "'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT " COMMENT "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR MANTZIOS ACHILLEUS BE LIABLE FOR ANY DIRECT, INDIRECT, " COMMENT "INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING," COMMENT "BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; " COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT" COMMENT "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING" COMMENT "IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF" COMMENT "THE POSSIBILITY OF SUCH DAMAGE." COMMENT "" COMMENT $XConsortium: 10x20.bdf,v 1.12 92/04/02 14:25:55 gildea Exp $ COMMENT "$NCDId: @(#)10x20.bdf,v 1.11 1991/07/02 14:50:48 jim Exp $" COMMENT "" COMMENT "Copyright 1989-1991 Network Computing Devices, Inc." COMMENT "NCD is a registered trademark of Network Computing Devices, Inc." COMMENT "" COMMENT "Permission to use, copy, modify, and distribute this software and" COMMENT "its documentation for any purpose and without fee is hereby" COMMENT "granted, provided that the above copyright notice appear in all" COMMENT "copies and that both that copyright notice and this permission" COMMENT "notice appear in supporting documentation, and that the name of" COMMENT "NCD may not be used in advertising or publicity pertaining to" COMMENT "distribution of the software without specific, written prior" COMMENT "permission. NCD makes no representations about the" COMMENT "suitability of this software for any purpose. It is provided ``as" COMMENT "is'' without express or implied warranty." COMMENT "" COMMENT "NCD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE," COMMENT "INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN" COMMENT "NO EVENT SHALL NCD BE LIABLE FOR ANY SPECIAL, INDIRECT OR" COMMENT "CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS" COMMENT "OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT," COMMENT "NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN" COMMENT "CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE." FONT 3270gr SIZE 20 75 75 FONTBOUNDINGBOX 10 20 0 -5 STARTPROPERTIES 17 FOUNDRY "NCD" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" SPACING "C" PIXEL_SIZE 20 POINT_SIZE 200 RESOLUTION_X 75 RESOLUTION_Y 75 AVERAGE_WIDTH 100 DEFAULT_CHAR 514 FONT_DESCENT 5 FONT_ASCENT 15 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "7" COPYRIGHT "Copyright 1989-1991 Network Computing Devices, Inc." ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ff ENCODING 2 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 1e00 3f00 7f80 7f80 7f80 7f80 3f00 1e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 3f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 2000 3000 1800 0c00 0600 0300 0180 0300 0600 0c00 1800 3000 2000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0100 0300 0600 0c00 1800 3000 6000 3000 1800 0c00 0600 0300 0100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0c00 0600 0600 0600 0600 0600 0c00 0c00 1800 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0c00 1800 1800 1800 1800 1800 0c00 0c00 0600 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7800 0c00 0c00 0c00 0c00 0c00 0780 0c00 0c00 0c00 0c00 0c00 7800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0780 0c00 0c00 0c00 0c00 0c00 7800 0c00 0c00 0c00 0c00 0c00 0780 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 0e00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 3300 1200 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0180 0180 0300 0300 0600 0600 0c00 0c00 1800 1800 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3000 3000 1800 1800 0c00 0c00 0600 0600 0300 0300 0180 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 0300 0600 0c00 0c00 0c00 0000 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 3f00 6d80 6c00 6c00 6c00 3f00 0d80 0d80 0d80 6d80 3f00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR modifier_letter_apostrophe ENCODING 27 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0e00 0e00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0f00 1980 1980 1800 1800 7e00 1800 1800 1800 7c00 56c0 7380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR undefined_a5 ENCODING 29 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_alpha_with_tonos ENCODING 30 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 0 0 BITMAP 6000 6000 4000 4c00 0c00 0e00 1e00 1300 3300 3180 3f80 6180 60c0 40c0 f1c0 ENDCHAR STARTCHAR undefined_a4 ENCODING 31 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 6180 6180 6180 6180 6180 3300 3300 1e00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1c00 3c00 6c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 0180 0180 0300 0e00 1800 3000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 0180 0300 0e00 0300 0180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0100 0300 0700 0f00 1b00 3300 6300 6300 7f80 0300 0300 0300 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6e00 7300 0180 0180 0180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6100 6000 6000 6e00 7300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0180 0180 0300 0300 0600 0600 0c00 0c00 1800 1800 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 3300 1e00 3300 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 3380 1d80 0180 0180 2180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_small_letter_iota_with_tonos ENCODING 42 SWIDTH 878 0 DWIDTH 10 0 BBX 8 14 2 0 BITMAP 18 18 10 10 00 00 70 98 18 18 18 18 19 0e ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3e00 6300 6000 7000 7800 4c00 6600 3300 1900 0f00 0300 6300 3e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0d80 0d80 0d80 3fc0 1b00 1b00 1b00 7f80 3600 3600 3600 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6780 6f80 6d80 6d80 6d80 6f00 6600 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3980 6d80 6f00 3b00 0600 0600 0c00 0c00 1b80 1ec0 36c0 3380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 3600 3600 3c00 1800 3800 6c00 66c0 6380 6300 7780 3cc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f80 7f80 0180 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 7f00 7f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 1e00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3980 6d80 6700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3c00 1c00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_epsilon_with_tonos ENCODING 63 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 1 0 BITMAP c000 c000 8000 bfc0 1840 1840 1800 1880 1f80 1880 1800 1800 1840 1840 3fc0 ENDCHAR STARTCHAR greek_small_letter_upsilon_with_dialytika_and_tonos ENCODING 64 SWIDTH 878 0 DWIDTH 10 0 BBX 9 15 1 0 BITMAP 0c00 0c00 0800 6b00 6300 0000 0000 6300 b180 3180 3180 3180 3180 3300 1e00 ENDCHAR STARTCHAR greek_small_letter_theta ENCODING 65 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP 3c 66 66 c3 c3 ff c3 c3 c3 66 66 3c ENDCHAR STARTCHAR greek_small_letter_mu ENCODING 66 SWIDTH 878 0 DWIDTH 10 0 BBX 9 11 1 -3 BITMAP 4200 c600 c600 c600 c600 c600 ee80 bb00 8000 8000 8000 ENDCHAR STARTCHAR greek_small_letter_final_sigma ENCODING 67 SWIDTH 878 0 DWIDTH 10 0 BBX 7 11 2 -3 BITMAP 3c 7e c2 80 80 80 fc 7e 02 02 1c ENDCHAR STARTCHAR greek_small_letter_omega ENCODING 68 SWIDTH 878 0 DWIDTH 10 0 BBX 10 8 1 0 BITMAP 6100 c080 80c0 8cc0 8cc0 ccc0 ffc0 7380 ENDCHAR STARTCHAR greek_small_letter_gamma ENCODING 69 SWIDTH 878 0 DWIDTH 10 0 BBX 10 11 1 -3 BITMAP 3040 7880 4d80 8500 8700 0600 0600 0c00 1c00 1c00 0800 ENDCHAR STARTCHAR greek_small_letter_upsilon ENCODING 70 SWIDTH 878 0 DWIDTH 10 0 BBX 9 8 1 0 BITMAP 6300 b180 3180 3180 3180 3180 3300 1e00 ENDCHAR STARTCHAR undefined_ff ENCODING 71 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_small_letter_epsilon_with_tonos ENCODING 72 SWIDTH 878 0 DWIDTH 10 0 BBX 7 14 2 0 BITMAP 18 18 10 10 00 00 7c c6 c0 78 c0 c0 e2 3c ENDCHAR STARTCHAR greek_small_letter_upsilon_with_tonos ENCODING 73 SWIDTH 878 0 DWIDTH 10 0 BBX 9 13 1 0 BITMAP 0c00 0c00 0800 0800 0000 6300 b180 3180 3180 3180 3180 3300 1e00 ENDCHAR STARTCHAR greek_small_letter_iota ENCODING 74 SWIDTH 878 0 DWIDTH 10 0 BBX 8 8 2 0 BITMAP 70 98 18 18 18 18 19 0e ENDCHAR STARTCHAR greek_capital_letter_omicron_with_tonos ENCODING 75 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 1 0 BITMAP c000 c000 8000 9e00 7380 6180 c0c0 c0c0 c0c0 c0c0 c0c0 c0c0 6180 7380 1e00 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 2000 6000 2080 2100 7200 0400 0b00 1480 2080 4100 0200 0780 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_upsilon_with_tonos ENCODING 77 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 1 0 BITMAP 6000 c000 8000 6180 f3c0 9240 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 ENDCHAR STARTCHAR greek_small_letter_omicron_with_tonos ENCODING 78 SWIDTH 878 0 DWIDTH 10 0 BBX 8 13 2 0 BITMAP 0c 0c 08 08 00 3c 66 c3 c3 c3 c3 66 3c ENDCHAR STARTCHAR greek_small_letter_eta ENCODING 79 SWIDTH 878 0 DWIDTH 10 0 BBX 9 11 1 -3 BITMAP 6e00 bb00 b180 3180 3180 3180 3180 3180 1180 0180 0080 ENDCHAR STARTCHAR greek_small_letter_delta ENCODING 80 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP 1c 36 32 18 3c 66 c3 c3 c3 c3 66 3c ENDCHAR STARTCHAR greek_small_letter_lamda ENCODING 81 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 6000 b000 3000 1800 1800 1c00 3c00 2600 6600 4300 c340 8180 ENDCHAR STARTCHAR greek_small_letter_xi ENCODING 82 SWIDTH 878 0 DWIDTH 10 0 BBX 8 8 2 0 BITMAP 3c 66 c3 c3 c3 c3 66 3c ENDCHAR STARTCHAR greek_small_letter_phi ENCODING 83 SWIDTH 878 0 DWIDTH 10 0 BBX 9 15 1 -3 BITMAP 0800 0800 0800 0800 3e00 6b00 c980 c980 c980 c980 6b00 3e00 0800 0800 0800 ENDCHAR STARTCHAR greek_dialytika_tonos ENCODING 84 SWIDTH 878 0 DWIDTH 10 0 BBX 8 15 2 0 BITMAP 0c 0c 08 6b 63 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR greek_small_letter_alpha ENCODING 85 SWIDTH 878 0 DWIDTH 10 0 BBX 8 15 2 -3 BITMAP 3c 6e c6 c6 cc dc c6 c3 c3 c3 e6 dc c0 c0 80 ENDCHAR STARTCHAR greek_small_letter_kappa ENCODING 86 SWIDTH 878 0 DWIDTH 10 0 BBX 9 8 1 0 BITMAP 6300 e700 6c00 7800 6c00 6600 6300 f180 ENDCHAR STARTCHAR greek_small_letter_xi ENCODING 87 SWIDTH 878 0 DWIDTH 10 0 BBX 7 16 2 -3 BITMAP 30 20 1e 30 30 1e 30 60 c0 c0 c0 70 1c 02 12 1c ENDCHAR STARTCHAR greek_small_letter_tau ENCODING 88 SWIDTH 878 0 DWIDTH 10 0 BBX 9 8 1 0 BITMAP 3f80 7f00 8800 0800 0800 0880 0f00 0600 ENDCHAR STARTCHAR greek_small_letter_upsilon_with_dialytika ENCODING 89 SWIDTH 878 0 DWIDTH 10 0 BBX 9 12 1 0 BITMAP 3300 3300 0000 0000 6300 b180 3180 3180 3180 3180 3300 1e00 ENDCHAR STARTCHAR greek_small_letter_alpha ENCODING 90 SWIDTH 878 0 DWIDTH 10 0 BBX 10 8 1 0 BITMAP 3880 6d80 c500 c700 c600 c600 6f40 3980 ENDCHAR STARTCHAR greek_capital_letter_chi ENCODING 91 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP f3c0 6180 3300 1200 1e00 0c00 1e00 1600 3300 2300 6180 f3c0 ENDCHAR STARTCHAR greek_small_letter_nu ENCODING 92 SWIDTH 878 0 DWIDTH 10 0 BBX 9 8 1 0 BITMAP e180 6180 3100 3100 1a00 1a00 0c00 0c00 ENDCHAR STARTCHAR greek_small_letter_sigma ENCODING 93 SWIDTH 878 0 DWIDTH 10 0 BBX 9 8 2 0 BITMAP 3f80 6600 c300 c300 c300 c300 6600 3c00 ENDCHAR STARTCHAR greek_small_letter_iota_with_dialytika ENCODING 94 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 1 0 BITMAP 66 66 00 00 70 98 18 18 18 18 19 0e ENDCHAR STARTCHAR greek_small_letter_rho ENCODING 95 SWIDTH 878 0 DWIDTH 10 0 BBX 8 11 2 -3 BITMAP 3c 66 c3 c3 c3 c3 e6 dc c0 c0 c0 ENDCHAR STARTCHAR greek_small_letter_iota_with_dialytika_and_tonos ENCODING 96 SWIDTH 878 0 DWIDTH 10 0 BBX 8 15 2 0 BITMAP 0c 0c 08 6b 63 00 00 70 98 18 18 18 18 19 0e ENDCHAR STARTCHAR greek_capital_letter_theta ENCODING 97 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 1e00 7380 6180 c0c0 d2c0 dec0 dec0 d2c0 c0c0 6180 7380 1e00 ENDCHAR STARTCHAR greek_capital_letter_mu ENCODING 98 SWIDTH 878 0 DWIDTH 10 0 BBX 11 12 0 0 BITMAP e0e0 60c0 71c0 71c0 71c0 5bc0 5ac0 5ec0 4cc0 4cc0 4cc0 e1e0 ENDCHAR STARTCHAR undefined_d2 ENCODING 99 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR greek_capital_letter_omega ENCODING 100 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 1e00 7380 6180 c0c0 c0c0 c0c0 c0c0 6180 3300 9240 f3c0 7380 ENDCHAR STARTCHAR greek_capital_letter_gamma ENCODING 101 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP ff 61 61 60 60 60 60 60 60 60 60 f8 ENDCHAR STARTCHAR greek_capital_letter_upsilon ENCODING 102 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 6180 f3c0 9240 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 ENDCHAR STARTCHAR greek_capital_letter_eta_with_tonos ENCODING 103 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 1 0 BITMAP c000 c000 8000 f3c0 6180 6180 6180 6180 7f80 6180 6180 6180 6180 6180 f3c0 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 0600 0c00 1800 3000 3e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 0200 0e00 0200 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR undefined_aa ENCODING 106 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_iota_with_tonos ENCODING 107 SWIDTH 878 0 DWIDTH 10 0 BBX 8 15 1 0 BITMAP c0 c0 80 bf 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 3f ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0480 0d80 1b00 3600 6c00 d800 6c00 3600 1b00 0d80 0480 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 4800 6c00 3600 1b00 0d80 06c0 0d80 1b00 3600 6c00 4800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR modifier_letter_reversed_comma ENCODING 110 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 1c00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_omega_with_tonos ENCODING 111 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 1 0 BITMAP c000 c000 8000 9e00 7380 6180 c0c0 c0c0 c0c0 c0c0 6180 3300 9240 f3c0 7380 ENDCHAR STARTCHAR greek_capital_letter_delta ENCODING 112 SWIDTH 878 0 DWIDTH 10 0 BBX 9 12 1 0 BITMAP 1800 1800 1c00 3c00 2c00 2600 6600 4600 4300 c300 ff80 ff80 ENDCHAR STARTCHAR greek_capital_letter_lamda ENCODING 113 SWIDTH 878 0 DWIDTH 10 0 BBX 11 12 0 0 BITMAP 0c00 0c00 0e00 1e00 1300 3300 2180 2180 6180 40c0 40c0 f1e0 ENDCHAR STARTCHAR greek_capital_letter_omicron ENCODING 114 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 1e00 7380 6180 c0c0 c0c0 c0c0 c0c0 c0c0 c0c0 6180 7380 1e00 ENDCHAR STARTCHAR greek_capital_letter_upsilon ENCODING 115 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 1e00 0c00 3f00 6d80 ccc0 ccc0 ccc0 ccc0 6d80 3f00 0c00 1e00 ENDCHAR STARTCHAR greek_small_letter_alpha_with_tonos ENCODING 116 SWIDTH 878 0 DWIDTH 10 0 BBX 10 14 1 0 BITMAP 0c00 0c00 0800 0800 0000 0000 3880 6d80 c500 c700 c600 c600 6f40 3980 ENDCHAR STARTCHAR greek_capital_letter_beta ENCODING 117 SWIDTH 878 0 DWIDTH 10 0 BBX 9 12 1 0 BITMAP fe00 6700 6300 6300 6600 7e00 6300 6180 6180 6180 6300 fe00 ENDCHAR STARTCHAR greek_capital_letter_kappa ENCODING 118 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP f3c0 6180 6300 6600 6c00 7c00 7600 6600 6300 6300 6180 f3c0 ENDCHAR STARTCHAR greek_capital_letter_xi ENCODING 119 SWIDTH 878 0 DWIDTH 10 0 BBX 10 14 1 -1 BITMAP 4080 7f80 7f80 4080 0000 1100 1f00 1f00 1100 0000 8040 ffc0 ffc0 8040 ENDCHAR STARTCHAR greek_capital_letter_tau ENCODING 120 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP ffc0 8c40 8c40 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 ENDCHAR STARTCHAR greek_capital_letter_upsilon_with_dialytika ENCODING 121 SWIDTH 878 0 DWIDTH 10 0 BBX 10 15 1 0 BITMAP 3300 3300 0000 6180 f3c0 9240 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 ENDCHAR STARTCHAR greek_capital_letter_alpha ENCODING 122 SWIDTH 878 0 DWIDTH 10 0 BBX 11 12 0 0 BITMAP 0c00 0c00 0e00 1e00 1300 3300 3180 3f80 6180 60c0 40c0 f1e0 ENDCHAR STARTCHAR greek_capital_letter_iota ENCODING 123 SWIDTH 878 0 DWIDTH 10 0 BBX 6 12 3 0 BITMAP fc 30 30 30 30 30 30 30 30 30 30 fc ENDCHAR STARTCHAR greek_capital_letter_nu ENCODING 124 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP e3c0 6180 7180 7180 6980 6980 6580 6580 6380 6380 6180 f180 ENDCHAR STARTCHAR greek_capital_letter_sigma ENCODING 125 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP ff c1 e1 60 70 38 30 60 40 c1 81 ff ENDCHAR STARTCHAR greek_capital_letter_iota_with_dialytika ENCODING 126 SWIDTH 878 0 DWIDTH 10 0 BBX 8 15 1 0 BITMAP 33 33 00 3f 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 3f ENDCHAR STARTCHAR greek_capital_letter_rho ENCODING 127 SWIDTH 878 0 DWIDTH 10 0 BBX 9 12 1 0 BITMAP fe00 6300 6180 6180 6180 6300 7e00 6000 6000 6000 6000 f800 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6e00 7300 6180 6180 6180 6180 7300 6e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 6000 6000 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0180 0180 0180 0180 0180 1d80 3380 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 1980 1800 1800 1800 1800 7e00 1800 1800 1800 1800 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3e80 6380 6300 6300 6300 3e00 6000 3f00 6180 6180 6180 3f00 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0180 0180 0000 0780 0180 0180 0180 0180 0180 0180 0180 3180 3180 3180 1f00 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6300 6600 6c00 7800 7c00 6600 6300 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 5b00 7f80 6d80 6d80 6d80 6d80 6d80 6d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6e00 7300 6180 6180 6180 6180 7300 6e00 6000 6000 6000 6000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1d80 3380 6180 6180 6180 6180 3380 1d80 0180 0180 0180 0180 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6f00 3980 3000 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 6180 6000 3f00 0180 0180 6180 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1800 1800 1800 7e00 1800 1800 1800 1800 1800 1980 0f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6d80 6d80 6d80 7f80 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 3300 1e00 0c00 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f80 0180 0300 0600 0c00 1800 3000 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_small_letter_zeta ENCODING 154 SWIDTH 878 0 DWIDTH 10 0 BBX 8 16 0 -3 BITMAP 60 33 1f 3e 70 e0 c0 c0 c0 e0 70 38 0c 06 32 3c ENDCHAR STARTCHAR greek_small_letter_psi ENCODING 155 SWIDTH 878 0 DWIDTH 10 0 BBX 11 15 0 -3 BITMAP 0400 0400 0400 0400 c460 64c0 64c0 64c0 64c0 3580 3580 1f00 0400 0400 0400 ENDCHAR STARTCHAR greek_small_letter_epsilon ENCODING 156 SWIDTH 878 0 DWIDTH 10 0 BBX 7 8 2 0 BITMAP 7c c6 c0 78 c0 c0 e2 3c ENDCHAR STARTCHAR greek_small_letter_chi ENCODING 157 SWIDTH 878 0 DWIDTH 10 0 BBX 10 11 1 -3 BITMAP c040 a0c0 3180 1300 1e00 0c00 1e00 3200 6300 c140 80c0 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3300 3300 1e00 7f80 1e00 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 6180 6180 6180 7f80 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7c00 6600 6300 6300 6300 6600 7e00 6300 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6000 6000 6000 6000 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6180 6180 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6000 7e00 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6000 7e00 6000 6000 6000 6000 6000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6780 6180 6180 6180 6180 3380 1e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 7f80 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 0180 0180 0180 0180 0180 0180 0180 0180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6300 6300 6600 6600 7c00 6600 6600 6300 6300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 7380 7380 7f80 6d80 6d80 6d80 6d80 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 7180 7180 7980 7980 6d80 6d80 6780 6780 6380 6380 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6300 7e00 6000 6000 6000 6000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6180 6180 6180 6d80 6780 3300 1f00 0180 0000 0000 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6300 7e00 6600 6300 6300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 3000 1e00 0300 0180 0180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 3300 3300 3300 1e00 1e00 1e00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6d80 6d80 6d80 6d80 7380 7380 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 1e00 1e00 3300 3300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0180 0180 0300 0600 0600 0c00 1800 1800 3000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_zeta ENCODING 186 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP ff 83 86 0c 0c 18 30 30 60 c1 c1 ff ENDCHAR STARTCHAR greek_capital_letter_psi ENCODING 187 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP 1e00 0c00 0c00 0c00 ccc0 6d80 6d80 6d80 3f00 0c00 0c00 3f00 ENDCHAR STARTCHAR greek_capital_letter_epsilon ENCODING 188 SWIDTH 878 0 DWIDTH 10 0 BBX 8 12 2 0 BITMAP ff 61 61 60 62 7e 62 60 60 61 61 ff ENDCHAR STARTCHAR greek_capital_letter_eta ENCODING 189 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP f3c0 6180 6180 6180 6180 7f80 6180 6180 6180 6180 6180 f3c0 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3300 3300 1e00 7f80 1e00 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1e00 3300 6180 5e80 5280 5080 5280 5e80 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR undefined_ae ENCODING 209 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1800 1800 2400 2400 4200 4200 7e00 4200 4200 4200 0000 ffc0 8040 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0c00 1e00 3f00 7f80 f3c0 e1c0 c0c0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 1100 1100 1100 1f00 1080 1080 1080 1080 1f00 0000 ffc0 8040 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 8c40 9240 a040 a040 ac40 b240 a140 a140 a140 9240 8c40 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 7f80 7f80 0c00 0c00 0000 7f80 7f80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_capital_letter_pi ENCODING 215 SWIDTH 878 0 DWIDTH 10 0 BBX 10 12 1 0 BITMAP ffc0 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 f3c0 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0400 0600 0700 ff80 ff80 0700 0600 0400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_small_letter_eta_with_tonos ENCODING 217 SWIDTH 878 0 DWIDTH 10 0 BBX 9 17 1 -3 BITMAP 0600 0600 0400 0400 0000 0000 6e00 bb00 3180 3180 3180 3180 3180 3180 1180 0180 0080 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1200 1200 2100 2100 4080 7380 1200 1200 1200 1200 1200 1200 1200 1e00 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1c00 2200 2200 2200 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 3c00 2200 2100 2200 3c00 2200 2100 2100 2200 3c00 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 1200 1200 1200 1200 1200 1200 1200 7380 4080 2100 2100 1200 1200 0c00 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 878 0 DWIDTH 10 0 BBX 12 20 0 -5 BITMAP 0000 ffc0 8040 8040 9e40 a140 a140 8140 8240 8440 8840 8840 8040 8840 8840 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 878 0 DWIDTH 10 0 BBX 12 20 0 -5 BITMAP 0000 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 0000 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 8000 c000 e000 7000 ffc0 ffc0 0e00 0700 0380 01c0 00c0 0040 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 fe00 fe00 0c00 1800 3fc0 3fc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0080 0400 0000 1000 0000 0040 2080 0080 0080 1080 0080 0400 0080 0000 0000 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 2000 0000 2800 4000 8000 0000 0400 0000 0000 0800 0000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 8040 c0c0 e1c0 f3c0 7f80 3f00 1e00 3f00 7f80 f3c0 e1c0 c0c0 8040 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_small_letter_pi ENCODING 247 SWIDTH 878 0 DWIDTH 10 0 BBX 10 8 1 0 BITMAP 3fc0 7f80 9200 1200 1200 3240 33c0 6180 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0800 1800 3800 7fc0 7fc0 3800 1800 0800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greek_small_letter_omega_with_tonos ENCODING 249 SWIDTH 878 0 DWIDTH 10 0 BBX 10 13 1 0 BITMAP 0c00 0c00 0800 0800 0000 6100 c080 80c0 8cc0 8cc0 ccc0 ffc0 7380 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0e00 1f00 3180 31c0 3180 1f00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8040 8240 8640 8a40 9240 a240 a240 bf40 8240 8240 8240 8240 8040 ffc0 0000 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 1200 1200 2100 3f00 2100 2100 2100 0000 ffc0 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 ffc0 8040 8040 8040 8040 ffc0 8040 8040 ffc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 ffc0 8040 8e40 9140 9140 8e40 8440 bfc0 8440 8440 8440 8440 8a40 9140 a0c0 ffc0 0000 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 07c0 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 200 ENCODING 512 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 201 ENCODING 513 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0c00 1e00 3f00 7f80 7f80 3f00 1e00 0c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 202 ENCODING 514 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 ENDCHAR STARTCHAR 203 ENCODING 515 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 6600 6600 7e00 6600 6600 6600 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR 204 ENCODING 516 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7c00 6000 6000 7800 6000 6000 6000 0f80 0c00 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR 205 ENCODING 517 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3c00 6600 6000 6000 6600 3c00 0000 1f00 1980 1980 1f00 1e00 1b00 1980 0000 0000 ENDCHAR STARTCHAR 206 ENCODING 518 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3000 3000 3000 3000 3000 3e00 0000 0f80 0c00 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR 207 ENCODING 519 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 3300 3300 1e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 208 ENCODING 520 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 7f80 0c00 0c00 0000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 209 ENCODING 521 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 7600 7e00 7e00 6e00 6600 0000 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 ENDCHAR STARTCHAR 20a ENCODING 522 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 6600 6600 3c00 3c00 1800 1800 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR 20b ENCODING 523 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20c ENCODING 524 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 20d ENCODING 525 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 20e ENCODING 526 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 20f ENCODING 527 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 210 ENCODING 528 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 211 ENCODING 529 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 212 ENCODING 530 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 213 ENCODING 531 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 214 ENCODING 532 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 ENDCHAR STARTCHAR 215 ENCODING 533 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 216 ENCODING 534 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 217 ENCODING 535 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 218 ENCODING 536 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 219 ENCODING 537 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR 21a ENCODING 538 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 01c0 0700 1c00 7000 1c00 0700 01c0 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21b ENCODING 539 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 7000 1c00 0700 01c0 0700 1c00 7000 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21c ENCODING 540 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0080 3f80 5b00 1b00 1b00 1b00 1b00 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21d ENCODING 541 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0180 0300 7fc0 0600 0c00 7fc0 1800 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21e ENCODING 542 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 1980 1800 1800 1800 7e00 1800 1800 1800 7c00 56c0 7380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 21f ENCODING 543 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt12b.bdf0000664000076500007650000011573613221577164013705 0ustar pdmpdmSTARTFONT 2.1 COMMENT "12-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1994-2009, Paul Mattes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt12bold SIZE 12 72 72 FONTBOUNDINGBOX 7 12 0 -3 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 12 POINT_SIZE 120 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 70 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 7 NORM_SPACE 7 MAX_SPACE 7 END_SPACE 7 AVG_CAPITAL_WIDTH 70 AVG_LOWERCASE_WIDTH 70 CAP_HEIGHT 7 X_HEIGHT 5 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 9 FONT_DESCENT 3 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 6C 60 F8 60 F0 6C 38 00 00 00 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 38 7c 7c 7c 38 00 00 00 00 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 7e 00 00 00 00 00 00 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 30 18 0c 06 0c 18 30 00 00 00 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 0c 18 30 60 30 18 0c 00 00 00 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 30 30 30 30 30 30 30 3c 00 00 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 0c 0c 0c 0c 0c 0c 0c 3c 00 00 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 0c 0c 0c 0c 0c 18 30 00 00 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 30 30 30 30 30 18 0c 00 00 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 18 18 0c 18 18 18 30 00 00 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 18 18 30 18 18 18 0c 00 00 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7e 00 7e 00 00 00 00 00 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 3c 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 06 06 0c 0c 18 18 30 30 60 00 00 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 60 30 30 18 18 0c 0c 06 00 00 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 18 18 18 18 18 18 18 18 00 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 18 18 00 00 18 18 18 18 00 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 06 0c 18 18 00 18 18 00 00 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 18 18 18 18 00 18 18 00 00 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3e 78 78 3c 1e 1e 7c 18 00 00 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 18 3e 78 78 3e 18 00 00 00 00 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 30 7c 30 30 36 7c 00 00 00 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 3c 18 7e 18 7e 18 18 00 00 00 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 6c 6c 78 60 6c 7e 6c 0c 00 00 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 66 3c 3c 3c 3c 3c 66 00 00 00 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 66 7e 7e 66 66 3c 00 00 00 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 1c 3c 0c 0c 0c 0c 0c 00 00 00 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 06 06 0c 18 30 7e 00 00 00 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 06 0c 1c 06 06 06 7c 00 00 00 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 1c 3c 3c 6c 7e 0c 0c 00 00 00 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 60 60 7c 06 06 06 7c 00 00 00 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 30 60 7c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 06 0c 18 30 30 30 30 00 00 00 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 66 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 66 6e 3e 06 06 0c 00 00 00 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 6c 6c 78 6c 66 76 7c 00 00 00 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 30 30 78 6c 36 1e 0c 0c 38 00 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 7e 3c 7e 3c 00 00 00 00 00 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 7e 7e 7c 60 60 3e 00 00 00 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 78 36 0c 18 30 6c 1e 0c 00 00 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 7e 00 00 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 78 78 30 70 7e 6c 3c 06 00 00 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 7e 00 00 00 00 00 00 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 18 18 00 00 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 18 18 30 00 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 18 18 00 00 18 18 00 00 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 18 18 7e 18 18 00 00 00 00 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 06 06 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 7e 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 18 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 18 18 00 00 00 00 00 00 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 3c 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3e 7c 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 30 18 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 18 38 00 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 00 3c 66 7e 60 3c 00 00 00 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 00 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 00 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 18 00 66 66 66 66 3e 00 00 00 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3e 7c 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3e 7c 00 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 00 66 66 66 66 3e 06 3c 00 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 66 66 3c 18 18 18 18 00 00 00 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 00 66 66 66 66 3e 06 3c 00 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 00 3c 66 7e 60 3c 00 00 00 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 70 30 30 30 1e 1e 1e 06 06 00 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 70 30 30 30 1c 06 0c 18 1e 00 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 70 18 30 18 70 1e 1e 1e 06 06 00 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 00 66 66 66 66 3e 00 00 00 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3e 60 60 60 3e 18 38 00 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 00 3c 66 7e 60 3c 00 00 00 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 00 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 3c 00 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 66 66 66 66 7c 60 60 60 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 00 3c 66 7e 60 3c 00 00 00 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 00 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 00 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 00 66 66 66 66 3e 00 00 00 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 66 3c 18 3c 66 00 00 00 00 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 00 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 00 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 18 00 66 66 66 66 3e 00 00 00 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3e 7c 00 7c 66 66 66 66 00 00 00 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 30 18 18 3c 66 66 7e 66 66 00 00 00 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 30 18 7e 60 60 7c 60 60 7e 00 00 00 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 30 18 3c 18 18 18 18 18 3c 00 00 00 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 30 18 3c 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 30 18 66 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3e 7c 18 3c 66 66 7e 66 66 00 00 00 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3e 7c 3c 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 38 18 18 18 00 00 00 00 00 00 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 0c 18 30 3c 00 00 00 00 00 00 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 0c 18 0c 38 00 00 00 00 00 00 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 06 3e 66 3e 00 7e 00 00 00 00 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 66 66 3c 00 7e 00 00 00 00 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 1a 36 6c 36 1a 00 00 00 00 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 d8 6c 36 6c d8 00 00 00 00 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 00 18 18 18 18 18 18 00 00 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 00 18 18 30 60 66 3c 00 00 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 00 18 3c 66 66 7e 66 66 00 00 00 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 00 7e 60 60 7c 60 60 7e 00 00 00 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 00 3c 18 18 18 18 18 3c 00 00 00 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 00 3c 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 00 66 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 3c 18 3c 66 66 7e 66 66 00 00 00 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 3c 7e 60 60 7c 60 60 7e 00 00 00 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 3c 3c 18 18 18 18 18 3c 00 00 00 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 3c 3c 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 3c 66 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 18 3c 66 66 7e 66 66 00 00 00 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 7e 60 60 7c 60 60 7e 00 00 00 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 3c 18 18 18 18 18 3c 00 00 00 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 3c 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 0c 18 66 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3e 7c 66 76 7e 6e 66 66 66 00 00 00 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 60 60 7c 66 66 66 7c 00 00 00 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3e 60 60 60 3e 00 00 00 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 06 06 06 3e 66 66 66 3e 00 00 00 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 66 7e 60 3c 00 00 00 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0e 18 18 7e 18 18 18 18 00 00 00 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3e 66 66 66 3e 06 3c 00 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 60 60 7c 76 66 66 66 00 00 00 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 18 00 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 06 00 06 06 06 06 06 66 3c 00 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 60 60 66 6c 78 7c 66 00 00 00 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 18 18 18 18 18 0c 00 00 00 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 7e 7e 7e 7e 00 00 00 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 66 66 66 66 00 00 00 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 66 66 66 7c 60 60 00 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3e 66 66 66 3e 06 06 00 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 76 60 60 60 00 00 00 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3e 60 3c 06 7c 00 00 00 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 18 7e 18 18 18 1c 00 00 00 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 66 66 66 66 3e 00 00 00 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 66 66 3c 3c 18 00 00 00 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 66 66 7e 7e 3c 00 00 00 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 66 3c 18 3c 66 00 00 00 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 66 66 66 66 3e 06 3c 00 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7e 0c 18 30 7e 00 00 00 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 1e 3e 78 7e 00 00 00 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3e 6e 7e 76 7c 00 00 00 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 3c 00 3c 06 3e 66 3e 00 00 00 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 18 18 00 7e 00 18 18 00 00 00 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 00 00 18 18 00 00 18 18 30 00 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 00 18 7e 3c 3c 7e 18 00 00 00 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 66 66 7e 66 66 66 00 00 00 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 66 66 7c 66 66 66 7c 00 00 00 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 36 60 60 60 60 36 1c 00 00 00 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 66 66 66 66 66 66 7c 00 00 00 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 60 60 7c 60 60 60 7e 00 00 00 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 60 60 7c 60 60 60 60 00 00 00 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 60 6e 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 66 66 7e 66 66 66 66 00 00 00 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 18 18 18 18 18 18 3c 00 00 00 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1e 0c 0c 0c 0c 6c 6c 38 00 00 00 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 6c 78 70 70 78 6c 66 00 00 00 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 60 60 60 60 60 60 7e 00 00 00 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 7e 7e 7e 66 66 66 66 00 00 00 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 76 7e 7e 6e 66 66 66 00 00 00 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 66 66 7c 60 60 60 60 00 00 00 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 66 66 66 66 7e 3c 0c 06 00 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 66 66 7c 78 6c 6c 66 00 00 00 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 66 60 3c 06 06 66 3c 00 00 00 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 18 18 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 66 66 66 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 66 66 3c 3c 3c 18 18 00 00 00 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 66 66 66 7e 7e 7e 3c 00 00 00 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 66 3c 18 18 3c 66 66 00 00 00 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 66 66 3c 18 18 18 18 18 00 00 00 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7e 06 0c 18 18 30 60 7e 00 00 00 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3e 78 78 7e 78 78 78 7e 00 00 00 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 6e 6e 7e 7e 76 76 3c 00 00 00 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 3c 18 3c 66 66 7e 66 66 00 00 00 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 36 60 60 60 60 36 1c 0c 3c 00 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 18 18 00 00 18 18 30 00 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 18 7e 3c 3c 7e 18 00 00 00 00 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 54 64 64 54 44 38 00 00 00 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 74 6c 74 6c 44 38 00 00 00 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 90 90 f0 90 00 fe 82 fe 00 00 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 38 7c ee c6 82 00 00 00 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 12 1c 12 1c 00 fe 82 fe 00 00 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 fe 82 a2 a2 ba aa ba 82 fe 00 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 18 18 7e 18 18 00 7e 00 00 00 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 36 36 7e 36 36 36 7c 00 00 00 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 18 fc 18 10 00 00 00 00 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 7c 66 66 7c 60 60 60 00 00 00 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 44 6c 28 28 28 28 38 00 00 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 38 28 38 10 7c 10 10 28 44 00 00 00 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 28 30 28 30 00 fe 00 00 00 00 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 28 28 28 28 6c 44 28 10 00 00 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe 82 92 aa 8a 92 82 92 82 fe 00 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe fe fe fe fe fe fe fe fe fe 00 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 80 c0 60 fe 18 0c 06 02 00 00 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 f8 10 20 7e 00 00 00 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 fe 00 00 00 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 02 10 00 00 22 22 02 02 10 02 00 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 20 40 80 08 08 00 00 20 00 00 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 82 c6 ee 7c 38 7c ee c6 82 00 00 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1e 0c 06 3e 66 66 66 3c 00 00 00 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 30 7e 30 10 00 00 00 00 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 60 60 7c 66 66 66 7c 60 60 00 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 18 26 24 18 00 00 00 00 00 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 fe 36 36 06 00 00 00 00 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 fe 82 8a 9a aa ba 8a 82 fe 00 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 28 38 28 00 fe 00 00 00 00 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 fe 82 82 fe 82 fe 00 00 00 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe ba aa ba fe 92 92 aa c6 fe 00 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 0c 0c 0c 0c 0c 0c 0c 3c 00 00 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 30 30 30 30 30 30 30 3c 00 00 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 66 66 66 66 66 66 66 66 66 66 66 66 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe 00 00 00 00 00 00 00 00 fe 00 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 60 60 60 60 60 60 60 60 60 60 60 60 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 06 06 06 06 06 06 06 06 06 06 06 06 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP fe fe fe fe fe fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 fe fe fe fe fe fe ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP fe fe fe fe fe fe fe fe fe fe fe fe ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 f8 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 3c 3c 3c 3c 3c 3c 3c 3c 3c 3c 3c 3c ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 18 3c 7e 3c 18 00 00 00 00 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP aa 54 aa 54 aa 54 aa 54 aa 54 aa 54 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 78 78 78 78 1e 0c 0c 0c 0c 00 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 60 70 60 60 1e 18 1c 18 18 00 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 60 60 60 38 1c 1e 1c 1e 1e 00 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 60 60 60 78 1e 18 1c 18 18 00 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 18 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 18 18 7e 18 18 00 7e 00 00 00 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 6c 7c 7c 6c 6c 18 18 18 18 1e 00 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 78 78 30 30 1e 0c 0c 0c 0c 00 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 f8 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 fe 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 fe 00 00 00 00 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 fe 00 00 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 1e 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 18 18 18 18 18 18 18 18 18 18 18 18 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 0c 18 30 60 30 18 0c 00 7c 00 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 30 18 0c 06 0c 18 30 00 3e 00 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 7e 3c 3c 3c 3c 6c 00 00 00 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 06 0c 7e 18 7e 30 60 00 00 00 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 3c 30 7c 30 30 36 7c 00 00 00 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 18 18 00 00 00 00 00 00 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt12.bdf0000664000076500007650000011572713221577164013543 0ustar pdmpdmSTARTFONT 2.1 COMMENT "20-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt12 SIZE 12 72 72 FONTBOUNDINGBOX 7 12 0 -3 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 12 POINT_SIZE 120 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 70 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 7 NORM_SPACE 7 MAX_SPACE 7 END_SPACE 7 AVG_CAPITAL_WIDTH 70 AVG_LOWERCASE_WIDTH 70 CAP_HEIGHT 7 X_HEIGHT 5 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 9 FONT_DESCENT 3 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 24 20 78 20 78 20 24 18 00 00 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 38 7c 7c 7c 38 00 00 00 00 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 7c 00 00 00 00 00 00 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 20 10 08 04 08 10 20 00 00 00 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 08 10 20 40 20 10 08 00 00 00 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 20 20 20 20 20 20 20 38 00 00 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 08 08 08 08 08 08 08 38 00 00 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 08 08 08 08 08 10 20 00 00 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 20 20 20 20 20 10 08 00 00 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 10 10 08 10 10 10 20 00 00 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 10 10 20 10 10 10 08 00 00 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 00 7c 00 00 00 00 00 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 28 28 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 04 04 08 08 10 10 20 20 40 00 00 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 40 20 20 10 10 08 08 04 00 00 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 10 10 10 10 10 10 10 10 00 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 10 10 00 00 10 10 10 10 00 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 04 08 10 10 00 10 10 00 00 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 10 10 10 10 00 10 10 00 00 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 3c 50 50 38 14 14 78 10 00 00 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 10 3c 50 50 3c 10 00 00 00 00 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 20 78 20 20 24 58 00 00 00 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 28 10 7c 10 7c 10 10 00 00 00 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 70 48 48 70 40 48 5c 48 08 00 00 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 44 28 38 28 38 28 44 00 00 00 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 44 54 54 44 44 38 00 00 00 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 18 28 08 08 08 08 08 00 00 00 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 04 04 08 10 20 7c 00 00 00 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 04 08 18 04 04 04 78 00 00 00 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 18 28 28 48 7c 08 08 00 00 00 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 40 40 78 04 04 04 78 00 00 00 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 20 40 78 44 44 44 38 00 00 00 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 04 08 10 20 20 20 20 00 00 00 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 44 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 44 4c 34 04 04 08 00 00 00 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 48 48 50 48 44 64 58 00 00 00 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 20 20 50 48 24 14 08 08 30 00 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 7c 28 7c 28 00 00 00 00 00 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 54 6c 78 40 40 3c 00 00 00 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 50 24 08 10 20 48 14 08 00 00 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 7c 00 00 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 50 50 20 60 54 48 38 04 00 00 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 7c 00 00 00 00 00 00 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 10 10 00 00 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 10 10 20 00 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 10 10 00 00 10 10 00 00 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 10 7c 10 10 00 00 00 00 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 04 04 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 7c 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 10 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 10 10 00 00 00 00 00 00 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 28 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 34 58 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 28 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 20 10 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 10 30 00 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 00 38 44 7c 40 38 00 00 00 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 00 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 00 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 10 00 44 44 44 44 3c 00 00 00 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 34 58 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 34 58 00 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 00 44 44 44 44 3c 04 38 00 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 44 44 28 10 10 10 10 00 00 00 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 00 44 44 44 44 3c 04 38 00 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 00 38 44 7c 40 38 00 00 00 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 60 20 20 20 14 14 1c 04 04 00 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 20 60 20 20 20 18 04 08 10 1c 00 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 10 20 10 60 14 14 1c 04 04 00 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 00 44 44 44 44 3c 00 00 00 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 40 40 40 3c 10 30 00 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 00 38 44 7c 40 38 00 00 00 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 00 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 28 00 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 44 44 44 44 78 40 40 40 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 00 38 44 7c 40 38 00 00 00 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 00 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 00 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 00 44 44 44 44 3c 00 00 00 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 44 28 10 28 44 00 00 00 00 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 00 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 00 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 08 10 00 44 44 44 44 3c 00 00 00 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 34 58 00 78 44 44 44 44 00 00 00 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 20 10 10 28 44 44 7c 44 44 00 00 00 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 20 10 7c 40 40 78 40 40 7c 00 00 00 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 20 10 38 10 10 10 10 10 38 00 00 00 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 20 10 38 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 20 10 44 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 34 58 10 28 44 44 7c 44 44 00 00 00 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 34 58 38 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 30 10 10 10 00 00 00 00 00 00 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 08 10 20 38 00 00 00 00 00 00 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 08 10 08 30 00 00 00 00 00 00 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 04 3c 44 3c 00 7c 00 00 00 00 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 44 44 38 00 7c 00 00 00 00 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 12 24 48 24 12 00 00 00 00 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 90 48 24 48 90 00 00 00 00 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 00 10 10 10 10 10 10 00 00 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 00 10 10 20 40 44 38 00 00 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 28 00 10 28 44 44 7c 44 44 00 00 00 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 28 00 7c 40 40 78 40 40 7c 00 00 00 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 28 00 38 10 10 10 10 10 38 00 00 00 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 28 00 38 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 28 00 44 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 28 10 28 44 44 7c 44 44 00 00 00 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 28 7c 40 40 78 40 40 7c 00 00 00 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 28 38 10 10 10 10 10 38 00 00 00 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 28 38 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 28 44 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 10 28 44 44 7c 44 44 00 00 00 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 7c 40 40 78 40 40 7c 00 00 00 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 38 10 10 10 10 10 38 00 00 00 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 38 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 08 10 44 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 34 58 44 64 54 4c 44 44 44 00 00 00 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 40 40 78 44 44 44 78 00 00 00 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 40 40 40 3c 00 00 00 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 04 04 04 3c 44 44 44 3c 00 00 00 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 38 44 7c 40 38 00 00 00 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 0c 10 10 7c 10 10 10 10 00 00 00 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 44 44 44 3c 04 38 00 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 40 40 58 64 44 44 44 00 00 00 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 10 00 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 04 00 04 04 04 04 04 44 38 00 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 40 40 44 48 50 68 44 00 00 00 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 10 10 10 10 10 08 00 00 00 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 78 54 54 54 54 00 00 00 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 78 44 44 44 44 00 00 00 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 38 44 44 44 38 00 00 00 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 78 44 44 44 78 40 40 00 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 44 44 44 3c 04 04 00 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 58 64 40 40 40 00 00 00 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 40 38 04 78 00 00 00 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 10 10 7c 10 10 10 18 00 00 00 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 44 44 44 44 3c 00 00 00 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 44 44 28 28 10 00 00 00 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 44 44 54 54 28 00 00 00 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 44 28 10 28 44 00 00 00 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 44 44 44 44 3c 04 38 00 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 7c 08 10 20 7c 00 00 00 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 78 14 3c 50 7c 00 00 00 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 3c 4c 54 64 78 00 00 00 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 38 00 38 04 3c 44 3c 00 00 00 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 10 10 00 7c 00 10 10 00 00 00 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 00 00 10 10 00 00 10 10 20 00 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 00 10 54 38 38 54 10 00 00 00 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 44 44 7c 44 44 44 00 00 00 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 44 44 78 44 44 44 78 00 00 00 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 24 40 40 40 40 24 18 00 00 00 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 44 44 44 44 44 44 78 00 00 00 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 40 40 78 40 40 40 7c 00 00 00 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 40 40 78 40 40 40 40 00 00 00 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 40 4c 44 44 44 38 00 00 00 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 44 44 7c 44 44 44 44 00 00 00 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 10 10 10 10 10 10 38 00 00 00 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 08 08 08 08 48 48 30 00 00 00 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 48 50 60 60 50 48 44 00 00 00 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 40 40 40 40 40 40 7c 00 00 00 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 6c 54 54 44 44 44 44 00 00 00 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 64 54 54 4c 44 44 44 00 00 00 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 44 44 78 40 40 40 40 00 00 00 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 44 44 44 44 54 38 08 04 00 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 44 44 78 50 48 48 44 00 00 00 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 40 38 04 04 44 38 00 00 00 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 10 10 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 44 44 44 44 44 44 38 00 00 00 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 44 44 28 28 28 10 10 00 00 00 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 44 44 44 54 54 54 28 00 00 00 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 44 28 10 10 28 44 44 00 00 00 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 44 44 28 10 10 10 10 10 00 00 00 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 7c 04 08 10 10 20 40 7c 00 00 00 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 3c 50 50 7c 50 50 50 5c 00 00 00 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 4c 4c 54 54 64 64 38 00 00 00 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 38 38 10 28 44 44 7c 44 44 00 00 00 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 18 24 40 40 40 40 24 18 08 38 00 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 10 10 00 00 10 10 20 00 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 10 54 38 38 54 10 00 00 00 00 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 54 64 64 54 44 38 00 00 00 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 44 74 6c 74 6c 44 38 00 00 00 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 60 90 90 f0 90 00 fe 82 fe 00 00 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 38 7c ee c6 82 00 00 00 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 1c 12 1c 12 1c 00 fe 82 fe 00 00 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 fe 82 a2 a2 ba aa ba 82 fe 00 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 10 10 7c 10 10 00 7c 00 00 00 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 78 24 24 74 24 24 24 78 00 00 00 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 18 fc 18 10 00 00 00 00 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 78 44 44 78 40 40 40 00 00 00 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 44 6c 28 28 28 28 38 00 00 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 38 28 38 10 7c 10 10 28 44 00 00 00 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 28 30 28 30 00 fe 00 00 00 00 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 28 28 28 28 6c 44 28 10 00 00 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe 82 92 aa 8a 92 82 92 82 fe 00 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe fe fe fe fe fe fe fe fe fe 00 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 80 c0 60 fe 18 0c 06 02 00 00 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 f8 10 20 7e 00 00 00 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 fe 00 00 00 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 02 10 00 00 22 22 02 02 10 02 00 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 20 40 80 08 08 00 00 20 00 00 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 82 c6 ee 7c 38 7c ee c6 82 00 00 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 14 08 04 3c 44 44 44 38 00 00 00 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 30 7e 30 10 00 00 00 00 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 40 40 78 44 44 44 78 40 40 00 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 18 26 24 18 00 00 00 00 00 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 fe 36 36 06 00 00 00 00 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 fe 82 8a 9a aa ba 8a 82 fe 00 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 28 38 28 00 fe 00 00 00 00 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 fe 82 82 fe 82 fe 00 00 00 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe ba aa ba fe 92 92 aa c6 fe 00 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 08 08 08 08 08 08 08 38 00 00 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 38 20 20 20 20 20 20 20 38 00 00 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 44 44 44 44 44 44 44 44 44 44 44 44 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe 00 00 00 00 00 00 00 00 fe 00 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 40 40 40 40 40 40 40 40 40 40 40 40 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 04 04 04 04 04 04 04 04 04 04 04 04 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e 1e ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP fe fe fe fe fe fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 fe fe fe fe fe fe ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP fe fe fe fe fe fe fe fe fe fe fe fe ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 f0 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 38 38 38 38 38 38 38 38 38 38 38 38 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 10 38 7c 38 10 00 00 00 00 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP aa 54 aa 54 aa 54 aa 54 aa 54 aa 54 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 50 50 70 50 50 1c 08 08 08 08 00 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 70 40 60 40 40 1c 10 18 10 10 00 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 30 40 40 40 30 18 14 18 14 14 00 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 40 40 40 40 70 1c 10 18 10 10 00 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 10 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 10 10 7c 10 10 00 7c 00 00 00 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 48 68 58 48 48 10 10 10 10 1c 00 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 50 50 50 20 20 1c 08 08 08 08 00 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 f0 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 1e 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 fe 00 00 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 fe 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 fe 00 00 00 00 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 00 00 00 00 fe 00 00 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 1e 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 f0 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 fe 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 00 fe 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 10 10 10 10 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 08 10 20 40 20 10 08 00 78 00 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 20 10 08 04 08 10 20 00 3c 00 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 7c 28 28 28 28 48 00 00 00 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 04 08 7c 10 7c 20 40 00 00 00 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 10 28 20 78 20 20 24 58 00 00 00 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 7 0 BBX 7 12 0 -3 BITMAP 00 00 00 00 10 10 00 00 00 00 00 00 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt16b.bdf0000664000076500007650000015057713221577164013713 0ustar pdmpdmSTARTFONT 2.1 COMMENT "16-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1994-2009, Paul Mattes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt16bold SIZE 16 72 72 FONTBOUNDINGBOX 9 16 0 -4 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 16 POINT_SIZE 160 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 90 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 9 NORM_SPACE 9 MAX_SPACE 9 END_SPACE 9 AVG_CAPITAL_WIDTH 90 AVG_LOWERCASE_WIDTH 90 CAP_HEIGHT 9 X_HEIGHT 7 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 12 FONT_DESCENT 4 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1E00 3300 6000 FF00 6000 FE00 6000 3300 1E00 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 1c00 3e00 7f00 7f00 7f00 3e00 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3000 1800 0c00 0600 0300 0600 0c00 1800 3000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0300 0600 0c00 1800 3000 1800 0c00 0600 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 1800 1800 1800 1800 1800 1800 1800 1800 1800 1e00 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 0600 0600 0600 0600 0600 0600 0600 0600 0600 1e00 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1800 0c00 0600 0600 0600 0600 0600 0c00 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0600 0c00 1800 1800 1800 1800 1800 0c00 0600 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3800 0c00 0c00 0c00 0c00 0600 0c00 0c00 0c00 0c00 3800 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0e00 1800 1800 1800 1800 3000 1800 1800 1800 1800 0e00 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7f80 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3600 3600 3600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0180 0300 0600 0c00 1800 3000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 6000 3000 1800 0c00 0600 0300 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 0c00 0c00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1f00 3180 3180 0300 0600 0c00 0c00 0000 0000 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 3f80 6c00 6c00 3f00 0d80 0d80 7f00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 3f00 6c00 6c00 6c00 3f00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0e00 1b00 1800 1800 7e00 1800 1800 1800 7980 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 6180 3300 1e00 0c00 7f80 0c00 0c00 7f80 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7c00 6600 6600 6600 7c00 6000 6600 6f00 6600 6600 0600 0000 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 3300 1e00 3300 3300 3300 1e00 3300 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 3300 6180 6180 6d80 6d80 6180 6180 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1c00 3c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1f00 3180 6180 0180 0300 0600 0c00 1800 3000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3f80 0180 0300 0600 0e00 0300 0180 0180 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0700 0f00 1b00 3300 6300 6300 7f80 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f80 6000 6000 7e00 0300 0180 0180 0180 0300 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 3000 6000 6000 7e00 7300 6180 6180 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f80 0180 0300 0600 0c00 1800 1800 1800 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 3300 3300 3300 1e00 3300 6180 6180 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1f00 3180 6180 6380 6780 3d80 0180 0180 0180 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 3600 6600 6c00 6600 6300 6180 6180 7980 6f00 0000 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 3000 3000 7800 6c00 6600 3300 1b00 0f00 0600 0600 3c00 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3600 7f00 3600 3600 7f00 3600 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3f00 6180 6180 6f80 7f80 7f00 6000 6000 6000 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3000 7800 3180 0300 0600 0c00 1800 3000 6300 0780 0300 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3800 6c00 6c00 6c00 3800 7980 6f00 6600 3f00 0180 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 1c00 3800 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 1c00 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f80 0180 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 3600 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3800 6d80 0700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7380 7380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 0c00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0600 0c00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0c00 3800 0000 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1800 0c00 0600 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1d80 3700 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3b00 6e00 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3600 0000 0000 6300 6300 6300 6300 3300 1e00 0c00 1800 3000 6000 0000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 6180 3300 1e00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 0000 6300 6300 6300 6300 3300 1e00 0c00 1800 3000 6000 0000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 7000 3000 3000 3000 3000 0300 0700 0f00 0f80 0300 0300 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 7000 3000 3000 3000 3000 0700 0d80 0180 0700 0c00 0f80 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 7800 1800 3000 1800 7800 3000 0300 0700 0f00 0f80 0300 0300 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3600 0000 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1f00 3000 6000 6000 6000 3000 1f00 0c00 3c00 0000 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3600 0000 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3600 0000 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3300 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3600 0000 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6300 6300 6300 6300 6300 7300 7f80 6000 6000 6000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1e00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1e00 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1e00 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1e00 0000 1e00 3300 3300 3300 3300 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 3c00 0000 6600 6600 6600 6600 6600 6600 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 3300 1e00 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0600 0c00 1800 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0600 0c00 1800 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0600 0c00 1800 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1d80 3700 0000 7f00 3180 3180 3180 3180 3180 3180 0000 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 0600 0300 0c00 1e00 3300 6180 7f80 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 7f80 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1800 0c00 0600 0000 1e00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 3f00 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 1800 0c00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1d80 3700 0000 0c00 1e00 3300 6180 7f80 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1d80 3700 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 3600 0600 0c00 1800 3e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3e00 0600 0c00 0600 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3f00 6180 6180 6180 6180 6180 3f00 0000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0d80 1b00 3600 6c00 3600 1b00 0d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 6c00 3600 1b00 0d80 1b00 3600 6c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0000 0000 0c00 0c00 0600 0300 3180 3180 1f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3300 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3300 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3300 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3300 0000 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3300 0000 6180 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 1e00 0000 0c00 1e00 3300 6180 7f80 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 1e00 0000 7f80 6000 6000 6000 7e00 6000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 1e00 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 1e00 0000 3f00 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 1e00 0000 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0c00 1800 3000 0c00 1e00 3300 6180 7f80 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 7f80 6000 6000 6000 7e00 6000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0600 0c00 1800 0000 1e00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 3f00 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0300 0600 0c00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1d80 3700 0000 6180 7180 7980 6d80 6780 6380 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 6000 6000 6000 7c00 6600 6300 6300 6300 6600 7c00 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1f00 3000 6000 6000 6000 3000 1f00 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0300 0300 0300 1f00 3300 6300 6300 6300 3300 1f00 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3e00 6300 6300 7f00 6000 6000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0f00 1800 1800 7e00 1800 1800 1800 1800 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1f00 3180 6180 6180 3380 1f80 0180 3180 1f00 0000 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 6000 6000 6000 7e00 7300 6300 6300 6300 6300 6300 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0300 0000 0000 0300 0300 0300 0300 0300 0300 0300 3300 1e00 0000 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3000 3000 3000 3300 3600 3c00 3800 3c00 3600 3300 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0e00 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3f00 6d80 6d80 6d80 6d80 6d80 6d80 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7f00 3180 3180 3180 3180 3180 3180 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3e00 6300 6300 6300 6300 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7c00 6600 6300 6300 6300 6600 7c00 6000 6000 6000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1f00 3300 6300 6300 3300 1f00 0300 0300 0380 0000 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6f00 3980 3000 3000 3000 3000 3000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3e00 6300 3000 1c00 0600 6300 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6300 6300 6300 6300 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6180 6180 6180 6d80 6d80 7f80 3300 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6180 3300 1e00 0c00 1e00 3300 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 6300 6300 6300 6300 3300 1e00 0c00 1800 3000 6000 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7f80 0300 0600 0c00 1800 3000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7f00 0d80 1d80 3f80 6c00 6c00 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1f80 3300 3700 3f00 3b00 3300 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 1e00 0000 3e00 0300 0300 3f00 6300 6300 3f80 0000 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 1c00 1c00 0000 7f00 0000 1c00 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f80 7f80 0000 0e00 0e00 0000 0000 0e00 0e00 1c00 3800 0000 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f80 7f80 0000 0c00 6d80 3f00 1e00 3f00 6d80 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7e00 3300 3180 3300 3e00 3300 3180 3300 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0f00 1980 3000 6000 6000 6000 3000 1980 0f00 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7e00 3300 3180 3180 3180 3180 3180 3300 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f80 6000 6000 6000 7f00 6000 6000 6000 6000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1e00 3300 6000 6000 6000 6f80 6300 3300 1f00 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 6180 6180 6180 7f80 6180 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0f00 0600 0600 0600 0600 0600 6600 6600 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 6300 6600 6c00 7800 7c00 6600 6300 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6000 6000 6000 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 7380 7f80 6d80 6d80 6180 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 7180 7980 6d80 6780 6380 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3f00 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7e00 6300 6180 6180 6300 7e00 6000 6000 6000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1e00 3300 6180 6180 6180 6180 6d80 3f00 1e00 0300 0180 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 6180 6180 6180 7f00 6c00 6600 6300 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3f00 6180 6000 3800 0c00 0700 0180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 6180 6180 6180 6180 6180 6180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 6180 3300 3300 3300 1e00 1e00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 6180 6180 6180 6d80 6d80 6d80 7f80 3300 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 6180 3300 1e00 0c00 1e00 3300 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6180 3300 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f80 0180 0300 0600 0c00 1800 3000 6000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0f80 1e00 3600 6600 6780 7e00 6600 6600 6780 0000 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3f00 6180 6380 6780 6d80 7980 7180 6180 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1e00 1e00 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0f00 1980 3000 6000 6000 6000 3000 1980 0f00 0600 3e00 0000 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0e00 0e00 1c00 3800 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0c00 6d80 3f00 1e00 3f00 6d80 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 4900 5500 5100 5500 4900 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 5900 5500 5900 5500 5500 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 5000 8800 8800 f800 8800 8800 0000 ff80 8080 8080 ff80 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0800 1c00 3e00 7700 e380 c180 8080 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0f00 0480 0480 0700 0480 0480 0f00 0000 ff80 8080 8080 ff80 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 ff80 8080 9080 a080 a080 ac80 b280 a280 9c80 8080 ff80 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7e00 3300 3180 3180 7d80 3180 3180 3300 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0400 0600 ff00 0600 0400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 6000 6000 7e00 6300 6180 6300 7e00 6000 6000 0000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 2200 4100 7700 1400 1400 1400 1400 1400 1c00 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1400 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3c00 1200 1200 1c00 1200 1200 3c00 0000 ff80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1400 1400 1400 1400 1400 7700 4100 2200 1400 0800 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 8080 9c80 a280 a280 8280 8480 8880 8880 8080 8880 8080 ff80 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 8000 c000 e000 7000 3800 ff80 0e00 0700 0380 0180 0080 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 fc00 0800 1000 2000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0100 0800 0000 2000 0000 0080 4100 0100 0100 2100 0100 0800 0100 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2000 0000 2800 4000 8000 0400 0000 0000 0800 0000 2000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 8080 c180 e380 f780 7f00 3e00 3e00 7f00 f780 e380 c180 8080 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0f00 0600 0f00 0300 1f00 3300 6300 6300 6300 3300 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1000 3000 7f80 3000 1000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 6000 6000 6000 7c00 6600 6300 6300 6300 6600 7c00 6000 6000 6000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0e00 1100 1180 1100 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 ff80 8080 8480 8c80 9480 a480 be80 8480 8480 8080 ff80 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 2200 2200 3e00 2200 2200 0000 ff80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 ff80 8080 8080 8080 ff80 8080 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 8080 9c80 9480 9c80 8880 ff80 8880 8880 9480 a280 c180 ff80 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 0600 0600 0600 0600 0600 0600 0600 0600 0600 1e00 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 1800 1800 1800 1800 1800 1800 1800 1800 1800 1e00 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 0180 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 fc00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1e00 3f00 3f00 3f00 1e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 6c00 6c00 7c00 6c00 6c00 6c00 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 7c00 6000 7800 6000 6000 6000 0000 0f80 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3800 6c00 6000 6000 6c00 3800 0000 0f00 0d80 0f00 0d80 0d80 0d80 0000 0000 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 6000 6000 6000 6000 6000 7c00 0000 0f80 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 3600 3600 1c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 6c00 7c00 7c00 6c00 6c00 6c00 0000 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 6600 6600 6600 3c00 3c00 1800 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0300 0600 0c00 1800 3000 1800 0c00 0600 0300 0000 3f00 0000 0000 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3000 1800 0c00 0600 0300 0600 0c00 1800 3000 0000 3f00 0000 0000 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f80 3300 3300 3300 3300 3300 3300 3300 6300 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0180 0300 7f80 0c00 7f80 1800 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0e00 1b00 1800 1800 7e00 1800 1800 1800 7980 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 1c00 1c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt16.bdf0000664000076500007650000015057013221577164013542 0ustar pdmpdmSTARTFONT 2.1 COMMENT "16-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "Copyright (c) 1990, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt16 SIZE 16 72 72 FONTBOUNDINGBOX 9 16 0 -4 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 16 POINT_SIZE 160 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 90 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 9 NORM_SPACE 9 MAX_SPACE 9 END_SPACE 9 AVG_CAPITAL_WIDTH 90 AVG_LOWERCASE_WIDTH 90 CAP_HEIGHT 9 X_HEIGHT 7 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 12 FONT_DESCENT 4 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0e00 1100 2000 7f00 2000 7e00 2000 1100 0e00 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 1c00 3e00 7f00 7f00 7f00 3e00 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 3e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 2000 1000 0800 0400 0200 0400 0800 1000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0200 0400 0800 1000 2000 1000 0800 0400 0200 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1000 1000 1000 1000 1000 1000 1000 1000 1000 1c00 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 0400 0400 0400 0400 0400 0400 0400 0400 0400 1c00 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1000 0800 0400 0400 0400 0400 0400 0800 1000 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0400 0800 1000 1000 1000 1000 1000 0800 0400 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3000 0800 0800 0800 0800 0400 0800 0800 0800 0800 3000 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1000 1000 1000 1000 2000 1000 1000 1000 1000 0c00 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7f00 0000 0000 7f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2400 2400 2400 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0100 0200 0400 0800 1000 2000 4000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 4000 2000 1000 0800 0400 0200 0100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 0800 0800 0000 0000 0800 0800 0800 0800 0800 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 2100 2100 0200 0400 0800 0800 0000 0000 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 3f00 4800 4800 3e00 0900 0900 7e00 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 3e00 4800 4800 4800 3e00 0800 0800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1200 1000 1000 7c00 1000 1000 1000 7100 6e00 0000 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 4100 2200 1400 0800 7f00 0800 0800 7f00 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7800 4400 4400 4400 7800 4000 4400 4e00 4400 4400 0400 0000 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 2200 1c00 2200 2200 2200 1c00 2200 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 2200 4100 4100 4900 4900 4100 4100 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1800 2800 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 2100 4100 0100 0200 0400 0800 1000 2000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3f00 0100 0200 0400 0c00 0200 0100 0100 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0600 0a00 1200 2200 4200 4200 7f00 0200 0200 0200 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f00 4000 4000 7c00 0200 0100 0100 0100 0200 7c00 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1000 2000 4000 4000 5c00 6200 4100 4100 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f00 0100 0200 0400 0800 1000 1000 1000 1000 1000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 2200 2200 2200 1c00 2200 4100 4100 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1e00 2100 4100 4300 4500 3900 0100 0100 0100 0200 0000 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 2400 4400 4800 4400 4200 4100 4100 5100 4e00 0000 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 2000 2000 5000 4800 4400 2200 1200 0a00 0400 0400 3800 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 2400 7e00 2400 2400 7e00 2400 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3e00 4100 4100 4d00 5500 5e00 4000 4000 4000 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2000 5000 2100 0200 0400 0800 1000 2000 4200 0500 0200 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7f00 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3000 4800 4800 4800 3000 5100 4a00 4400 3a00 0100 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 3e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 1800 3000 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0800 0800 0800 7f00 0800 0800 0800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 0100 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 2400 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 2200 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3000 4900 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 6300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1000 0800 0400 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0400 0800 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0800 0800 0800 3000 0000 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1000 0800 0400 0000 0000 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1900 2600 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3200 4c00 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2400 0000 0000 4200 4200 4200 4200 2200 1400 0800 1000 2000 4000 0000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 4100 2200 1400 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 0000 4200 4200 4200 4200 2200 1400 0800 1000 2000 4000 0000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 6000 2000 2000 2000 2000 0200 0600 0a00 0f00 0200 0200 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 6000 2000 2000 2000 2000 0600 0900 0100 0600 0800 0f00 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 7000 1000 2000 1000 5000 2000 0200 0600 0a00 0f00 0200 0200 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2400 0000 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1e00 2000 4000 4000 4000 2000 1e00 0800 3800 0000 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2400 0000 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2400 0000 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2200 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2400 0000 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4200 4200 4200 4200 4200 6200 5d00 4000 4000 4000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 0000 0000 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 0000 1c00 2200 2200 2200 2200 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1000 2800 0000 4400 4400 4400 4400 4400 4400 3a00 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 2200 1400 0800 1400 2200 4100 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0400 0800 1000 0000 0000 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0400 0800 1000 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0400 0800 1000 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1900 2600 0000 5e00 2100 2100 2100 2100 2100 2100 0000 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 0400 0200 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 7f00 4000 4000 7c00 4000 4000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1000 0800 0400 0000 1c00 0800 0800 0800 0800 0800 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 3e00 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 1000 0800 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1900 2600 0000 0800 1400 2200 4100 7f00 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1900 2600 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1800 0800 0800 0800 0800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 2400 0400 0800 1000 3c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 3c00 0400 0800 0400 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 4100 4100 4100 4100 3e00 0000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0900 1200 2400 4800 2400 1200 0900 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 4800 2400 1200 0900 1200 2400 4800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0000 0000 0800 0800 0400 0200 2100 2100 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2200 0000 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2200 0000 7f00 4000 4000 4000 7c00 4000 4000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2200 0000 1c00 0800 0800 0800 0800 0800 0800 0800 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2200 0000 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2200 0000 4100 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 0000 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 0000 7f00 4000 4000 4000 7c00 4000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 0000 1c00 0800 0800 0800 0800 0800 0800 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 0000 3e00 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 0000 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1000 2000 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 7f00 4000 4000 4000 7c00 4000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0400 0800 1000 0000 1c00 0800 0800 0800 0800 0800 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 3e00 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0200 0400 0800 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1900 2600 0000 4100 6100 5100 4900 4500 4300 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 4000 4000 4000 7800 4400 4200 4200 4200 4400 7800 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1e00 2000 4000 4000 4000 2000 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0200 0200 0200 1e00 2200 4200 4200 4200 2200 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3c00 4200 4200 7e00 4000 4000 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0e00 1000 1000 7c00 1000 1000 1000 1000 1000 1000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1e00 2100 4100 4100 2300 1d00 0100 2100 1e00 0000 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 4000 4000 4000 5c00 6200 4200 4200 4200 4200 4200 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0000 0000 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0200 0000 0000 0200 0200 0200 0200 0200 0200 0200 2200 1c00 0000 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2000 2000 2000 2200 2400 2800 3000 2800 2400 2200 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 0800 0800 0800 0800 0800 0800 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3600 4900 4900 4900 4900 4900 4900 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 5e00 2100 2100 2100 2100 2100 2100 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3c00 4200 4200 4200 4200 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7800 4400 4200 4200 4200 4400 7800 4000 4000 4000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1e00 2200 4200 4200 2200 1e00 0200 0200 0300 0000 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4e00 3100 2000 2000 2000 2000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 3c00 4200 2000 1800 0400 4200 3c00 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 3e00 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4200 4200 4200 4200 4200 4200 3d00 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4100 4100 2200 2200 1400 1400 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4100 4100 4100 4900 4900 5500 2200 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4100 2200 1400 0800 1400 2200 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 4200 4200 4200 4200 2200 1400 0800 1000 2000 4000 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7f00 0200 0400 0800 1000 2000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 7600 0900 1900 2f00 4800 4800 3700 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1d00 2200 2600 2a00 3200 2200 5c00 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1c00 0000 3c00 0200 0200 3e00 4200 4200 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 1800 1800 0000 7e00 0000 1800 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f00 7f00 0000 0c00 0c00 0000 0000 0c00 0c00 1800 3000 0000 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 7f00 7f00 0000 0800 4900 2a00 1400 2a00 4900 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7c00 2200 2100 2200 3c00 2200 2100 2200 7c00 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0e00 1100 2000 4000 4000 4000 2000 1100 0e00 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7c00 2200 2100 2100 2100 2100 2100 2200 7c00 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 4000 4000 4000 7c00 4000 4000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 4000 4000 4000 7e00 4000 4000 4000 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1c00 2200 4000 4000 4000 4f00 4200 2200 1e00 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 4100 4100 4100 7f00 4100 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1c00 0800 0800 0800 0800 0800 0800 0800 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0e00 0400 0400 0400 0400 0400 4400 4400 3800 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 4200 4400 4800 5000 6800 4400 4200 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4000 4000 4000 4000 4000 4000 4000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 6300 5500 4900 4900 4100 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 6100 5100 4900 4500 4300 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7c00 4200 4100 4100 4200 7c00 4000 4000 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 1c00 2200 4100 4100 4100 4100 4900 2a00 1c00 0200 0100 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7e00 4100 4100 4100 7e00 4800 4400 4200 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 4000 3000 0800 0600 0100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 0800 0800 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 4100 4100 4100 4100 4100 4100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 4100 2200 2200 2200 1400 1400 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 4100 4100 4100 4900 4900 4900 5500 2200 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 4100 2200 1400 0800 1400 2200 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4100 2200 1400 0800 0800 0800 0800 0800 0800 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 0100 0200 0400 0800 1000 2000 4000 7f00 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0f00 1400 2400 4400 4700 7c00 4400 4400 4700 0000 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 4300 4500 4900 5100 6100 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 1c00 1c00 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0e00 1100 2000 4000 4000 4000 2000 1100 0e00 0400 3c00 0000 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0c00 0c00 1800 3000 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0800 4900 2a00 1400 2a00 4900 0800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 4900 5500 5100 5500 4900 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 3e00 4100 5900 5500 5900 5500 5500 4100 3e00 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 2000 5000 8800 8800 f800 8800 8800 0000 ff80 8080 8080 ff80 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0800 1c00 3e00 7700 e380 c180 8080 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0f00 0480 0480 0700 0480 0480 0f00 0000 ff80 8080 8080 ff80 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 ff80 8080 9080 a080 a080 ac80 b280 a280 9c80 8080 ff80 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 7f00 0800 0800 0800 0000 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7c00 2200 2100 2100 7900 2100 2100 2200 7c00 0000 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0400 0600 ff00 0600 0400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 4000 4000 7c00 4200 4100 4200 7c00 4000 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 1400 2200 4100 7700 1400 1400 1400 1400 1400 1c00 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1400 1c00 0800 7f00 0800 0800 1400 2200 4100 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3c00 1200 1200 1c00 1200 1200 3c00 0000 ff80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1400 1400 1400 1400 1400 7700 4100 2200 1400 0800 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 8080 9c80 a280 a280 8280 8480 8880 8880 8080 8880 8080 ff80 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 8000 c000 e000 7000 3800 ff80 0e00 0700 0380 0180 0080 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 fc00 0800 1000 2000 7f80 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0100 0800 0000 2000 0000 0080 4100 0100 0100 2100 0100 0800 0100 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 2000 0000 2800 4000 8000 0400 0000 0000 0800 0000 2000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 8080 c180 e380 f780 7f00 3e00 3e00 7f00 f780 e380 c180 8080 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0a00 0400 0a00 0200 1e00 2200 4200 4200 4200 2200 1c00 0000 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1000 3000 7f80 3000 1000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 4000 4000 4000 7800 4400 4200 4200 4200 4400 7800 4000 4000 4000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0e00 1100 1180 1100 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 ff80 1d80 1d80 0180 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 ff80 8080 8480 8c80 9480 a480 be80 8480 8480 8080 ff80 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0800 1400 2200 2200 3e00 2200 2200 0000 ff80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 ff80 8080 8080 8080 ff80 8080 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 8080 9c80 9480 9c80 8880 ff80 8880 8880 9480 a280 c180 ff80 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 0400 0400 0400 0400 0400 0400 0400 0400 0400 1c00 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1c00 1000 1000 1000 1000 1000 1000 1000 1000 1000 1c00 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 4100 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 4000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 f800 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 0f80 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0f80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0f80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 ff80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 f800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 f800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 f800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 3e00 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 1c00 3e00 3e00 3e00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 aa80 5500 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 4800 4800 7800 4800 4800 4800 0000 1f00 0400 0400 0400 0400 0400 0000 0000 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 7800 4000 7000 4000 4000 4000 0000 0f00 0800 0e00 0800 0800 0800 0000 0000 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 3000 4800 4000 4000 4800 3000 0000 0e00 0900 0e00 0900 0900 0900 0000 0000 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 4000 4000 4000 4000 4000 7800 0000 0f00 0800 0e00 0800 0800 0800 0000 0000 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 1800 2400 2400 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0800 0800 0800 7f00 0800 0800 0800 0000 7f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 4800 6800 5800 4800 4800 4800 0000 0800 0800 0800 0800 0800 0f00 0000 0000 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 4400 4400 4400 2800 2800 1000 0000 1f00 0400 0400 0400 0400 0400 0000 0000 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 f800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 f800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0f80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 ff80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff80 0000 0000 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0f80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 f800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 ff80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff80 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 0800 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0200 0400 0800 1000 2000 1000 0800 0400 0200 0000 3e00 0000 0000 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 2000 1000 0800 0400 0200 0400 0800 1000 2000 0000 3e00 0000 0000 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 7f00 2200 2200 2200 2200 2200 2200 2200 4200 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0100 0200 7f00 0800 7f00 1000 2000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0c00 1200 1000 1000 7c00 1000 1000 1000 7100 6e00 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 9 0 BBX 9 16 0 -4 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt24b.bdf0000664000076500007650000020227113221577164013677 0ustar pdmpdmSTARTFONT 2.1 COMMENT "24-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1994-2009, Paul Mattes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt24bold SIZE 24 72 72 FONTBOUNDINGBOX 14 24 0 -6 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 24 POINT_SIZE 240 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 140 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 14 NORM_SPACE 14 MAX_SPACE 14 END_SPACE 14 AVG_CAPITAL_WIDTH 140 AVG_LOWERCASE_WIDTH 140 CAP_HEIGHT 14 X_HEIGHT 10 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 18 FONT_DESCENT 6 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03F0 07FC 0FFC 1E04 1C00 7FF0 FFF0 1C00 1C00 7FE0 FFC0 1C00 1E00 0FFC 07F8 03F0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0380 0fe0 0fe0 1ff0 1ff0 1ff0 0fe0 0fe0 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0e00 0f00 0780 03c0 01e0 00f0 0078 0078 00f0 01e0 03c0 0780 0f00 0e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 00e0 01e0 03c0 0780 0f00 1e00 3c00 3c00 1e00 0f00 0780 03c0 01e0 00e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0fe0 0fe0 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 0fe0 0fe0 0000 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 03c0 01e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 01e0 03c0 0780 0f00 0e00 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0780 0f00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0f00 0780 03c0 01e0 00e0 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 0380 0380 0380 0380 03c0 01e0 01e0 03c0 0380 0380 0380 0380 0780 0f00 0e00 0000 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0380 0380 0380 0780 0f00 0f00 0780 0380 0380 0380 0380 03c0 01e0 00e0 0000 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3ff8 3ff8 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0ee0 0ee0 0ee0 0ee0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0038 0038 0038 0078 00f0 00e0 00e0 01e0 03c0 0380 0380 0780 0f00 0e00 0e00 1e00 3c00 3800 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3800 3800 3800 3c00 1e00 0e00 0e00 0f00 0780 0380 0380 03c0 01e0 00e0 00e0 00f0 0078 0038 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 0038 0078 00f0 01e0 03c0 0380 0380 0380 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0ff8 1ff8 3f80 3b80 3b80 3f80 1fe0 0ff0 03f8 03b8 03b8 03f8 3ff0 3fe0 0380 0380 0000 0000 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0380 0380 0ff8 1ff8 3f80 3b80 3b80 3f80 1ff8 0ff8 0380 0380 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0e00 0e00 3fe0 3fe0 0e00 0e00 0e00 0e00 0e38 1f78 3ff0 3be0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3c78 1ef0 0fe0 07c0 0380 3ff8 3ff8 0380 0380 3ff8 3ff8 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3f80 3fc0 39e0 38e0 38e0 39e0 3fc0 3f80 3800 3800 38e0 38e0 3bf8 3bf8 38e0 38e0 00e0 00e0 0000 0000 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 3838 3c78 1ef0 0fe0 0fe0 1ff0 1c70 1c70 1ff0 0fe0 0fe0 1ef0 3c78 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3bb8 3bb8 3bb8 3bb8 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03e0 07e0 0fe0 0ee0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 0038 0038 0038 0078 00f0 01e0 03c0 0780 0f00 1e00 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0038 0078 00f0 01e0 03e0 07f0 0078 0038 0038 0038 0038 0078 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03e0 03e0 03e0 07e0 0fe0 0ee0 0ee0 1ee0 3ce0 38e0 3ff8 3ff8 00e0 00e0 00e0 00e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 3800 3800 3800 3800 3fe0 3ff0 0078 0038 0038 0038 0038 0078 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0780 0f00 1e00 3c00 3800 3fe0 3ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0038 0078 00f0 01e0 03c0 0780 0f00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3838 3c78 1ff0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3838 3878 38f8 3df8 1ff8 0fb8 0038 0038 0038 0078 00f0 00e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f80 1fc0 3de0 38e0 38e0 39e0 3b80 3fc0 39e0 38f0 3878 3c38 3e38 3f78 3ff0 3be0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03e0 07e0 0f00 0e00 0e00 1f00 3f80 3bc0 39e0 3cf0 1e78 0f38 07b8 03f8 01f0 00e0 00e0 01e0 0fc0 0f80 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 3ff8 3ff8 0ee0 0ee0 3ff8 3ff8 0ee0 0ee0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3bb8 3ff8 3ff8 3ff8 3ff0 3be0 3800 3800 3800 3c00 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 1f00 3b80 3b80 1f38 0e78 00f0 01e0 03c0 0780 0f00 1e00 3ce0 39f0 03b8 03b8 01f0 00e0 0000 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3ff8 3ff8 0000 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 1f00 3f80 3b80 3b80 3f80 1f00 1e00 3e00 3f00 3fb8 3ff8 39f0 3ce0 1ff0 0ff8 003c 001c 0000 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0380 0780 0f00 0e00 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0380 0380 0380 0380 3ff8 3ff8 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0038 0038 0038 0038 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 07c0 0fe0 0ee0 0ee0 0fe0 07c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 07c0 0fe0 0ee0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0f38 1ff8 3ff0 39e0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0ee0 0ee0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e00 0f00 0780 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0f80 0f00 0000 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 0380 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 0380 0000 0000 0fe0 1ff0 3c78 3838 3ff8 3ff8 3800 3c00 1fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 0380 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 0380 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e00 0f00 0780 0380 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f38 1ff8 3ff0 39e0 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f38 1ff8 3ff0 39e0 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0038 0078 0ff0 0fe0 0000 0000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 3838 3838 3838 3c78 1ef0 0fe0 07c0 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0038 0078 0ff0 0fe0 0000 0000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0000 0000 0fe0 1ff0 3c78 3838 3ff8 3ff8 3800 3c00 1fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 1c00 3c00 7c00 7c00 1c00 1c00 1c00 1c00 1c00 1cf0 01f0 03f0 07f0 0770 07fc 07fc 0070 0070 0070 0000 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 1c00 3c00 7c00 7c00 1c00 1c00 1c00 1c00 1c00 1df0 03f8 03bc 003c 0078 00f0 01e0 03c0 03fc 03fc 0000 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7f00 7f00 0e00 1c00 3e00 0f00 0700 0700 7f00 7ef0 01f0 03f0 07f0 0770 07fc 07fc 0070 0070 0070 0000 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff8 1ff8 3c00 3800 3800 3800 3800 3c00 1ff8 0ff8 0380 0380 0f80 0f00 0000 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 0000 0000 0fe0 1ff0 3c78 3838 3ff8 3ff8 3800 3c00 1fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0ee0 0ee0 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 3ff8 3ff8 3800 3800 3800 3800 0000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0000 0000 0fe0 1ff0 3c78 3838 3ff8 3ff8 3800 3c00 1fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 3838 3c78 1ef0 0fe0 07c0 07c0 0fe0 1ef0 3c78 3838 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00e0 01e0 03c0 0380 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f38 1ff8 3ff0 39e0 0000 0000 3fe0 3ff0 3c78 3838 3838 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e00 0f00 0780 0380 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e00 0f00 0780 0380 3ff8 3ff8 3800 3800 3800 3800 3fe0 3fe0 3800 3800 3800 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e00 0f00 0780 0380 0fe0 0fe0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e00 0f00 0780 0380 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e00 0f00 0780 0380 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0f38 1ff8 3ff0 39e0 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0f38 1ff8 3ff0 39e0 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 01c0 03c0 07c0 07c0 01c0 01c0 01c0 01c0 01c0 01c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 07c0 0fe0 0ef0 00f0 01e0 03c0 0780 0f00 0ff0 0ff0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0ff0 0ff0 00e0 01c0 03e0 00f0 0070 0070 0ff0 0fe0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0fe0 0ff0 0070 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 039c 07bc 0f78 1ef0 3de0 3de0 1ef0 0f78 07bc 039c 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 39c0 3de0 1ef0 0f78 07bc 07bc 0f78 1ef0 3de0 39c0 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0000 0000 0380 0380 0380 0780 0f00 1e00 3c00 3800 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0ee0 0ee0 0000 0000 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0ee0 0ee0 0000 0000 3ff8 3ff8 3800 3800 3800 3800 3fe0 3fe0 3800 3800 3800 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0ee0 0ee0 0000 0000 0fe0 0fe0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0ee0 0ee0 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0ee0 0ee0 0000 0000 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 07c0 0fe0 0ee0 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 07c0 0fe0 0ee0 3ff8 3ff8 3800 3800 3800 3800 3fe0 3fe0 3800 3800 3800 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 07c0 0fe0 0ee0 0fe0 0fe0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 07c0 0fe0 0ee0 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 07c0 0fe0 0ee0 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 3ff8 3ff8 3800 3800 3800 3800 3fe0 3fe0 3800 3800 3800 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 0fe0 0fe0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00e0 01e0 03c0 0380 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0f38 1ff8 3ff0 39e0 3838 3c38 3e38 3f38 3fb8 3bf8 39f8 38f8 3878 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3800 3800 3800 3800 3800 3800 3fe0 3ff0 3878 3838 3838 3838 3838 3878 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff8 1ff8 3c00 3800 3800 3800 3800 3c00 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0038 0038 0038 0038 0038 0038 0ff8 1ff8 3c38 3838 3838 3838 3838 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0fe0 1ff0 3c78 3838 3ff8 3ff8 3800 3c00 1fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00f8 01f8 03c0 0380 0380 0380 3ff8 3ff8 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff8 1ff8 3c38 3838 3838 3838 3838 3c78 1ff8 0ff8 0038 0078 0ff0 0fe0 0000 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3800 3800 3800 3800 3800 3800 3be0 3ff0 3f78 3e38 3c38 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0380 0380 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0038 0038 0000 0000 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 3838 3c78 1ff0 0fe0 0000 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3800 3800 3800 3800 3800 3800 3838 3878 38f0 39e0 3bc0 3fc0 3fe0 3ef0 3c78 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 03c0 01e0 00e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3fe0 3ff0 3ff8 3bb8 3bb8 3bb8 3bb8 3bb8 3bb8 3bb8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3fe0 3ff0 3c78 3838 3838 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3fe0 3ff0 3878 3838 3838 3838 3838 3878 3ff0 3fe0 3800 3800 3800 3800 0000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff8 1ff8 3c38 3838 3838 3838 3838 3c78 1ff8 0ff8 0038 0038 0038 0038 0000 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3be0 3ff0 3f78 3e38 3c00 3800 3800 3800 3800 3800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff8 1ff8 3c00 3c00 1fe0 0ff0 0078 0078 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 0380 0380 3ff8 3ff8 0380 0380 0380 0380 0380 0380 03e0 01e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3838 3838 3838 3c78 1ef0 0ee0 0ee0 0fe0 07c0 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3838 3838 3838 3838 3bb8 3bb8 3bb8 3ff8 1ff0 0ee0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3838 3c78 1ef0 0fe0 07c0 07c0 0fe0 1ef0 3c78 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3838 3838 3838 3838 3838 3838 3838 3c78 1ff8 0ff8 0038 0078 0ff0 0fe0 0000 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3ff8 3ff8 00f0 01e0 03c0 0780 0f00 1e00 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3ff0 3ff8 03b8 03b8 1ff8 3ff8 3b80 3b80 3ff8 1ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff8 1ff8 3cf8 39f8 3bf8 3fb8 3f38 3e78 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 0fe0 0fe0 0000 0000 0fe0 0ff0 0078 0038 0ff8 1ff8 3c38 3c38 1ff8 0ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0380 0380 0380 0000 0000 3ff8 3ff8 0000 0000 0380 0380 0380 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 0380 0380 0380 0780 0f00 0e00 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0000 0000 0380 0380 3bb8 3ff8 1ff0 0ee0 0ee0 1ff0 3ff8 3bb8 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fe0 3ff0 3878 3838 3838 3878 3ff0 3ff0 3878 3838 3838 3838 3838 3878 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03e0 07f0 0f78 1e38 3c00 3800 3800 3800 3800 3800 3800 3c00 1e38 0f78 07f0 03e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fe0 3ff0 3878 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3878 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 3800 3800 3800 3800 3fe0 3fe0 3800 3800 3800 3800 3800 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 3800 3800 3800 3800 3fe0 3fe0 3800 3800 3800 3800 3800 3800 3800 3800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3800 3800 38f8 38f8 3838 3838 3838 3838 3838 3c78 1ff8 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3838 3838 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0fe0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03f8 03f8 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 38e0 38e0 38e0 3de0 1fc0 0f80 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3878 38f0 39e0 3bc0 3f80 3f00 3e00 3e00 3f00 3f80 3bc0 39e0 38f0 3878 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3c78 3ef8 3ff8 3ff8 3bb8 3bb8 3bb8 3838 3838 3838 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3c38 3e38 3f38 3fb8 3bb8 3bb8 3bf8 39f8 38f8 3878 3838 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fe0 3ff0 3878 3838 3838 3878 3ff0 3fe0 3800 3800 3800 3800 3800 3800 3800 3800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3838 3838 3838 3838 3838 3838 3838 3838 3bb8 3ff8 1ff0 0fe0 01e0 00f0 0078 0038 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fe0 3ff0 3878 3838 3838 3878 3ff0 3fe0 3b80 3bc0 39c0 38e0 38e0 3870 3878 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3c78 3838 3800 3c00 1fe0 0ff0 0078 0038 0038 0038 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3838 3838 1c70 1c70 1c70 0ee0 0ee0 0ee0 07c0 07c0 07c0 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3838 3838 3838 3838 3838 3838 3838 3bb8 3bb8 3bb8 3bb8 3bb8 3ff8 1ff0 0ee0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3838 3838 3c78 1ef0 0fe0 07c0 0380 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3838 3838 3838 3c78 1ef0 0fe0 07c0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff8 3ff8 0038 0078 00f0 01e0 03c0 0380 0380 0780 0f00 1e00 3c00 3800 3ff8 3ff8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0ff8 1ff8 3dc0 39c0 39c0 39c0 3ff8 3ff8 39c0 39c0 39c0 39c0 39c0 39c0 39f8 39f8 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 1ff0 3cf8 38f8 38f8 39f8 3bf8 3bb8 3bb8 3fb8 3f38 3e38 3e38 3e78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0fe0 0fe0 0fe0 0fe0 0380 07c0 0fe0 1ef0 3c78 3838 3838 3838 3ff8 3ff8 3838 3838 3838 3838 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03e0 07f0 0f78 1e38 3c00 3800 3800 3800 3800 3800 3800 3c00 1e38 0f78 07f0 03e0 00e0 00e0 0fe0 0fc0 0000 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 0380 0380 0380 0780 0f00 0e00 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0380 0380 3bb8 3ff8 1ff0 0ee0 0ee0 1ff0 3ff8 3bb8 0380 0380 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 7038 6018 6318 6498 6418 6418 6498 6318 6018 7038 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 7038 6018 6718 6498 6498 6718 6498 6498 6018 7038 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3c00 7e00 e700 c300 c300 c300 ff00 ff00 c300 c300 0000 0000 fffc fffc c00c c00c fffc fffc 0000 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0300 0780 0fc0 1fe0 3ff0 7ff8 fffc fcfc f87c f03c e01c c00c 8004 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03f0 03f8 031c 031c 03f8 03f8 031c 031c 03f8 03f0 0000 0000 fffc fffc c00c c00c fffc fffc 0000 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 fffc fffc c00c c30c c70c ce0c cc0c cc0c cf8c cfcc cccc cccc cfcc c78c c00c c00c fffc fffc 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 3ff8 3ff8 0380 0380 0380 0380 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fe0 3ff0 0e78 0e38 0e38 0e38 0e38 3fb8 3fb8 0e38 0e38 0e38 0e38 0e78 3ff0 3fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0180 01c0 01e0 fff0 fff0 01e0 01c0 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3800 3800 3800 3fe0 3ff0 3878 3838 3838 3878 3ff0 3fe0 3800 3800 3800 3800 3800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 1ce0 3870 3030 3cf0 3cf0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0fc0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0780 0fc0 0cc0 0cc0 0fc0 0780 0300 0300 3ff0 3ff0 0300 0300 0300 0780 0fc0 1ce0 3870 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f00 0f80 0cc0 0cc0 0f80 0f80 0cc0 0cc0 0f80 0f00 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 3cf0 3cf0 3030 3870 1ce0 0fc0 0780 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc c00c c00c c30c c78c cfcc cccc c0cc c1cc c38c c30c c30c c00c c30c c30c c00c c00c fffc fffc 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 8000 c000 e000 f000 f800 7c00 3e00 fffc fffc 07c0 03e0 01f0 00f8 007c 003c 001c 000c 0004 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0380 0700 0e00 1c00 3ffc 3ffc 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 000c 000c 0300 0300 0000 0000 0000 0004 000c 0c0c 0c0c 000c 000c 000c 000c 000c 0300 0300 000c 000c 0000 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0c00 0c00 3000 7000 e000 c000 8000 00c0 00c0 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 8004 c00c e01c f03c f87c fcfc fffc 7ff8 3ff0 1fe0 1fe0 3ff0 7ff8 fffc fcfc f87c f03c e01c c00c 8004 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0ee0 0fe0 07c0 0fe0 0ef0 0078 0ff8 1ff8 3c38 3838 3838 3838 3838 3c78 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0600 0e00 1e00 3ffc 3ffc 1e00 0e00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 3800 3800 3800 3800 3fe0 3ff0 3878 3838 3838 3838 3838 3878 3ff0 3fe0 3800 3800 3800 3800 0000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 03c0 07e0 0e70 0c3c 0c3c 0e70 07e0 03c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0f3c 0f3c 0f3c 003c 003c 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 fffc fffc c00c c00c c0cc c1cc c3cc c7cc cecc cccc cfcc cfcc c0cc c0cc c00c c00c fffc fffc 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0cc0 0cc0 0fc0 0fc0 0cc0 0cc0 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 fffc fffc c00c c00c c00c c00c fffc fffc c00c c00c fffc fffc 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc c78c cfcc cccc cccc cfcc c78c fffc fffc c30c c30c c30c c78c cfcc dcec f87c f03c fffc fffc 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 0fe0 0fe0 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0e00 0fe0 0fe0 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 3838 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 3800 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 0038 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 03c0 03fc 01fc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 01fc 03fc 03c0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 03fc 03fc 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 fffc fffc 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0780 ff80 ff00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff00 ff80 0780 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ff80 ff80 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 0fe0 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 03c0 07e0 0ff0 0ff0 0ff0 07e0 03c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7700 7700 7700 7700 7f00 7f00 7700 7700 7700 7700 0000 0000 03f8 03f8 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 0000 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7f00 7f00 7000 7000 7e00 7e00 7000 7000 7000 7000 0000 0000 03f8 03f8 0380 0380 03f0 03f0 0380 0380 0380 0380 0000 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 3e00 7f00 7f00 7000 7000 7000 7000 7f00 7f00 3e00 0000 0000 03f0 03f8 03b8 03b8 03f0 03e0 03f0 03f8 03b8 03b8 0000 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7000 7000 7000 7000 7000 7000 7000 7000 7f00 7f00 0000 0000 03f8 03f8 0380 0380 03f0 03f0 0380 0380 0380 0380 0000 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 07c0 0fe0 0ee0 0ee0 0fe0 07c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 0380 0380 0380 3ff8 3ff8 0380 0380 0380 0380 0000 0000 3ff8 3ff8 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7380 7b80 7b80 7f80 7f80 7f80 7780 7780 7380 7380 0000 0000 0380 0380 0380 0380 0380 0380 0380 0380 03f8 03f8 0000 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7380 7380 7380 7380 7380 7380 7f80 3f00 1e00 0c00 0000 0000 03f8 03f8 00e0 00e0 00e0 00e0 00e0 00e0 00e0 00e0 0000 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0780 ff80 ff00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff00 ff80 0780 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 01fc 03fc 03c0 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 03c0 03fc 01fc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 fffc fffc 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 03fc 03fc 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ff80 ff80 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 0380 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 00e0 01e0 03c0 0780 0f00 1e00 3c00 3c00 1e00 0f00 0780 03c0 01e0 00e0 0000 0000 7ff0 7ff0 0000 0000 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0e00 0f00 0780 03c0 01e0 00f0 0078 0078 00f0 01e0 03c0 0780 0f00 0e00 0000 0000 1ffc 1ffc 0000 0000 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 7ffc 7ffc 1c70 1c70 1c70 1c70 1c70 1c70 1c70 3c70 3c70 3870 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0038 0038 0078 00f0 00e0 3ff8 3ff8 03c0 0380 3ff8 3ff8 0f00 0e00 0e00 1e00 1c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0380 07c0 0fe0 0ee0 0e00 0e00 3fe0 3fe0 0e00 0e00 0e00 0e00 0e38 1f78 3ff0 3be0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0380 0380 0380 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt24.bdf0000664000076500007650000020226213221577164013535 0ustar pdmpdmSTARTFONT 2.1 COMMENT "24-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1994-2009, Paul Mattes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt24 SIZE 24 72 72 FONTBOUNDINGBOX 14 24 0 -6 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 24 POINT_SIZE 240 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 140 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 14 NORM_SPACE 14 MAX_SPACE 14 END_SPACE 14 AVG_CAPITAL_WIDTH 140 AVG_LOWERCASE_WIDTH 140 CAP_HEIGHT 14 X_HEIGHT 10 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 18 FONT_DESCENT 6 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03e0 07f0 0e30 0c00 1800 7ff0 7fe0 1800 1800 7fe0 7fc0 1800 0c00 0e30 07f0 03e0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0380 0fe0 0fe0 1ff0 1ff0 1ff0 0fe0 0fe0 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0c00 0e00 0700 0380 01c0 00e0 0070 0070 00e0 01c0 0380 0700 0e00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 00c0 01c0 0380 0700 0e00 1c00 3800 3800 1c00 0e00 0700 0380 01c0 00c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 0fc0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0380 01c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 01c0 0380 0700 0e00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0700 0e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0e00 0700 0380 01c0 00c0 0000 0000 0000 0000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0300 0300 0300 0300 0380 01c0 01c0 0380 0300 0300 0300 0300 0700 0e00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0300 0300 0300 0700 0e00 0e00 0700 0300 0300 0300 0300 0380 01c0 00c0 0000 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3ff0 3ff0 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0cc0 0cc0 0cc0 0cc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0030 0030 0030 0070 00e0 00c0 00c0 01c0 0380 0300 0300 0700 0e00 0c00 0c00 1c00 3800 3000 0000 0000 0000 0000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3000 3000 3000 3800 1c00 0c00 0c00 0e00 0700 0300 0300 0380 01c0 00c0 00c0 00e0 0070 0030 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 0030 0070 00e0 01c0 0380 0300 0300 0300 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0ff0 1ff0 3b00 3300 3300 3b00 1fc0 0fe0 0370 0330 0330 0370 3fe0 3fc0 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0300 0300 0ff0 1ff0 3b00 3300 3300 3b00 1ff0 0ff0 0300 0300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0c00 0c00 3fc0 3fc0 0c00 0c00 0c00 0c00 0c30 1e70 3fe0 33c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3870 1ce0 0fc0 0780 0300 3ff0 3ff0 0300 0300 3ff0 3ff0 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3f00 3f80 31c0 30c0 30c0 31c0 3f80 3f00 3000 3000 30c0 30c0 33f0 33f0 30c0 30c0 00c0 00c0 0000 0000 0000 0000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 3030 3870 1ce0 0fc0 0fc0 1fe0 1860 1860 1fe0 0fc0 0fc0 1ce0 3870 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3330 3330 3330 3330 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 03c0 07c0 0ec0 0cc0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 0030 0030 0030 0070 00e0 01c0 0380 0700 0e00 1c00 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0030 0070 00e0 01c0 03c0 07e0 0070 0030 0030 0030 0030 0070 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03c0 03c0 03c0 07c0 0ec0 0cc0 0cc0 1cc0 38c0 30c0 3ff0 3ff0 00c0 00c0 00c0 00c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fe0 0070 0030 0030 0030 0030 0070 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0700 0e00 1c00 3800 3000 3fc0 3fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0030 0070 00e0 01c0 0380 0700 0e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3030 3870 1fe0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3030 3070 30f0 39f0 1fb0 0f30 0030 0030 0030 0070 00e0 00c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f00 1f80 39c0 30c0 30c0 31c0 3300 3780 31c0 30e0 3070 3830 3c30 3670 37e0 33c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03c0 07c0 0e00 0c00 0c00 1e00 3f00 3380 31c0 38e0 1c70 0e30 0730 03f0 01e0 00c0 00c0 01c0 0f80 0f00 0000 0000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 3ff0 3ff0 0cc0 0cc0 3ff0 3ff0 0cc0 0cc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3330 37b0 37f0 36f0 37e0 33c0 3000 3000 3000 3800 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 1e00 3300 3300 1e30 0c70 00e0 01c0 0380 0700 0e00 1c00 38c0 31e0 0330 0330 01e0 00c0 0000 0000 0000 0000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3ff0 3ff0 0000 0000 0000 0000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 1e00 3f00 3300 3300 3700 1e00 1c00 3c00 3e00 3730 3bf0 31e0 38c0 1fe0 0ff0 0038 0018 0000 0000 0000 0000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0300 0700 0e00 0c00 0000 0000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0300 0300 0300 0300 3ff0 3ff0 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0030 0030 0030 0030 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0780 0fc0 0cc0 0cc0 0fc0 0780 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0780 0fc0 0cc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e30 1f70 3be0 31c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0cc0 0cc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0c00 0e00 0700 0300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0f00 0e00 0000 0000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0300 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0300 0000 0000 0fc0 1fe0 3870 3030 3ff0 3ff0 3000 3800 1fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0300 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0300 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0c00 0e00 0700 0300 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e30 1f70 3be0 31c0 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e30 1f70 3be0 31c0 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0030 0070 0fe0 0fc0 0000 0000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 3030 3030 3030 3870 1ce0 0fc0 0780 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0030 0070 0fe0 0fc0 0000 0000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0000 0000 0fc0 1fe0 3870 3030 3ff0 3ff0 3000 3800 1fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 1800 3800 7800 7800 1800 1800 1800 1800 1800 18e0 01e0 03e0 0760 0660 07f8 07f8 0060 0060 0060 0000 0000 0000 0000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 1800 3800 7800 7800 1800 1800 1800 1800 1800 19e0 03f0 0338 0038 0070 00e0 01c0 0380 03f8 03f8 0000 0000 0000 0000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7e00 7e00 0c00 1800 3c00 0e00 0600 0600 7e00 7ce0 01e0 03e0 0760 0660 07f8 07f8 0060 0060 0060 0000 0000 0000 0000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff0 1ff0 3800 3000 3000 3000 3000 3800 1ff0 0ff0 0300 0300 0f00 0e00 0000 0000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 0000 0000 0fc0 1fe0 3870 3030 3ff0 3ff0 3000 3800 1fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0cc0 0cc0 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 3ff0 3ff0 3000 3000 3000 3000 0000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0000 0000 0fc0 1fe0 3870 3030 3ff0 3ff0 3000 3800 1fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 3030 3870 1ce0 0fc0 0780 0780 0fc0 1ce0 3870 3030 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00c0 01c0 0380 0300 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0e30 1f70 3be0 31c0 0000 0000 3fc0 3fe0 3870 3030 3030 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0c00 0e00 0700 0300 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0c00 0e00 0700 0300 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fc0 3000 3000 3000 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0c00 0e00 0700 0300 0fc0 0fc0 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0c00 0e00 0700 0300 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0c00 0e00 0700 0300 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e30 1f70 3be0 31c0 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e30 1f70 3be0 31c0 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0180 0380 0780 0780 0180 0180 0180 0180 0180 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0780 0fc0 0ce0 00e0 01c0 0380 0700 0e00 0fe0 0fe0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fe0 0fe0 00c0 0180 03c0 00e0 0060 0060 0fe0 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0fc0 0fe0 0060 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0318 0738 0e70 1ce0 39c0 39c0 1ce0 0e70 0738 0318 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 3180 39c0 1ce0 0e70 0738 0738 0e70 1ce0 39c0 3180 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0000 0000 0300 0300 0300 0700 0e00 1c00 3800 3000 3030 3870 1fe0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0cc0 0cc0 0000 0000 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0cc0 0cc0 0000 0000 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fc0 3000 3000 3000 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0cc0 0cc0 0000 0000 0fc0 0fc0 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0cc0 0cc0 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0cc0 0cc0 0000 0000 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0780 0fc0 0cc0 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0780 0fc0 0cc0 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fc0 3000 3000 3000 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0780 0fc0 0cc0 0fc0 0fc0 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0780 0fc0 0cc0 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0780 0fc0 0cc0 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fc0 3000 3000 3000 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 0fc0 0fc0 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 00c0 01c0 0380 0300 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0e30 1f70 3be0 31c0 3030 3830 3c30 3e30 3730 33b0 31f0 30f0 3070 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3000 3000 3000 3000 3000 3000 3fc0 3fe0 3070 3030 3030 3030 3030 3070 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff0 1ff0 3800 3000 3000 3000 3000 3800 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0030 0030 0030 0030 0030 0030 0ff0 1ff0 3830 3030 3030 3030 3030 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 1fe0 3870 3030 3ff0 3ff0 3000 3800 1fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 00f0 01f0 0380 0300 0300 0300 3ff0 3ff0 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff0 1ff0 3830 3030 3030 3030 3030 3870 1ff0 0ff0 0030 0070 0fe0 0fc0 0000 0000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3000 3000 3000 3000 3000 3000 33c0 37e0 3e70 3c30 3830 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0300 0300 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0030 0030 0000 0000 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 3030 3870 1fe0 0fc0 0000 0000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3000 3000 3000 3000 3000 3000 3030 3070 30e0 31c0 3380 3780 3fc0 3ce0 3870 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0380 01c0 00c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3fc0 3fe0 3b70 3330 3330 3330 3330 3330 3330 3330 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3fc0 3fe0 3870 3030 3030 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3fc0 3fe0 3070 3030 3030 3030 3030 3070 3fe0 3fc0 3000 3000 3000 3000 0000 0000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff0 1ff0 3830 3030 3030 3030 3030 3870 1ff0 0fb0 0030 0030 0030 0030 0000 0000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 33c0 37e0 3e70 3c30 3800 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff0 1ff0 3800 3800 1fc0 0fe0 0070 0070 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 0300 0300 3ff0 3ff0 0300 0300 0300 0300 0300 0300 03c0 01c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3030 3030 3030 3870 1ce0 0cc0 0cc0 0fc0 0780 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3030 3030 3030 3030 3330 3330 3330 3ff0 1fe0 0cc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3030 3870 1ce0 0fc0 0780 0780 0fc0 1ce0 3870 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3030 3030 3030 3030 3030 3030 3030 3870 1ff0 0ff0 0030 0070 0fe0 0fc0 0000 0000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3ff0 3ff0 00e0 01c0 0380 0700 0e00 1c00 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3de0 3ff0 0330 0330 1ff0 3ff0 3300 3300 3ff0 1ee0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0ff0 1ff0 38f0 31f0 33b0 3730 3e30 3c70 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 0fc0 0fc0 0000 0000 0fc0 0fe0 0070 0030 0ff0 1ff0 3830 3830 1ff0 0ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0300 0300 0300 0000 0000 3ff0 3ff0 0000 0000 0300 0300 0300 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 0300 0300 0300 0700 0e00 0c00 0000 0000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0000 0000 0300 0300 3330 3b70 1fe0 0cc0 0cc0 1fe0 3b70 3330 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fc0 3fe0 3070 3030 3030 3070 3fe0 3fe0 3070 3030 3030 3030 3030 3070 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03c0 07e0 0e70 1c30 3800 3000 3000 3000 3000 3000 3000 3800 1c30 0e70 07e0 03c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fc0 3fe0 3070 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3070 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fc0 3000 3000 3000 3000 3000 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 3000 3000 3000 3000 3fc0 3fc0 3000 3000 3000 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3000 3000 30f0 30f0 3030 3030 3030 3030 3030 3870 1ff0 0fe0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3030 3030 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0fc0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03f0 03f0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 30c0 30c0 30c0 39c0 1f80 0f00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3070 30e0 31c0 3380 3700 3e00 3c00 3c00 3e00 3700 3380 31c0 30e0 3070 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3870 3cf0 3ff0 37b0 3330 3330 3330 3030 3030 3030 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3830 3c30 3e30 3730 3330 3330 33b0 31f0 30f0 3070 3030 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fc0 3fe0 3070 3030 3030 3070 3fe0 3fc0 3000 3000 3000 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3030 3030 3030 3030 3030 3030 3030 3030 3330 3b70 1fe0 0fc0 01c0 00e0 0070 0030 0000 0000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fc0 3fe0 3070 3030 3030 3070 3fe0 3fc0 3300 3380 3180 30c0 30c0 3060 3070 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 3030 3000 3800 1fc0 0fe0 0070 0030 0030 0030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3030 3030 1860 1860 1860 0cc0 0cc0 0cc0 0780 0780 0780 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3030 3030 3030 3030 3030 3030 3030 3330 3330 3330 3330 3330 3ff0 1fe0 0cc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3030 3030 3870 1ce0 0fc0 0780 0300 0300 0780 0fc0 1ce0 3870 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3030 3030 3030 3870 1ce0 0fc0 0780 0300 0300 0300 0300 0300 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3ff0 3ff0 0030 0070 00e0 01c0 0380 0300 0300 0700 0e00 1c00 3800 3000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0ff0 1ff0 3980 3180 3180 3180 3ff0 3ff0 3180 3180 3180 3180 3180 3180 31f0 31f0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 38f0 30f0 30f0 31f0 33b0 3330 3330 3730 3e30 3c30 3c30 3c70 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0fc0 0fc0 0fc0 0fc0 0300 0780 0fc0 1ce0 3870 3030 3030 3030 3ff0 3ff0 3030 3030 3030 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03c0 07e0 0e70 1c30 3800 3000 3000 3000 3000 3000 3000 3800 1c30 0e70 07e0 03c0 00c0 00c0 0fc0 0f80 0000 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 0300 0300 0300 0700 0e00 0c00 0000 0000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0300 0300 3330 3b70 1fe0 0cc0 0cc0 1fe0 3b70 3330 0300 0300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 7038 6018 6318 6498 6418 6418 6498 6318 6018 7038 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 1fe0 3870 7038 6018 6718 6498 6498 6718 6498 6498 6018 7038 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3c00 7e00 e700 c300 c300 c300 ff00 ff00 c300 c300 0000 0000 fffc fffc c00c c00c fffc fffc 0000 0000 0000 0000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0300 0780 0fc0 1fe0 3ff0 7ff8 fffc fcfc f87c f03c e01c c00c 8004 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 03f0 03f8 031c 031c 03f8 03f8 031c 031c 03f8 03f0 0000 0000 fffc fffc c00c c00c fffc fffc 0000 0000 0000 0000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 fffc fffc c00c c30c c70c ce0c cc0c cc0c cf8c cfcc cccc cccc cfcc c78c c00c c00c fffc fffc 0000 0000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 3ff0 3ff0 0300 0300 0300 0300 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3fc0 3fe0 0c70 0c30 0c30 0c30 0c30 3f30 3f30 0c30 0c30 0c30 0c30 0c70 3fe0 3fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0180 01c0 01e0 fff0 fff0 01e0 01c0 0180 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 3000 3000 3000 3fc0 3fe0 3070 3030 3030 3070 3fe0 3fc0 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 1ce0 3870 3030 3cf0 3cf0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0fc0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0780 0fc0 0cc0 0cc0 0fc0 0780 0300 0300 3ff0 3ff0 0300 0300 0300 0780 0fc0 1ce0 3870 3030 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0f00 0f80 0cc0 0cc0 0f80 0f80 0cc0 0cc0 0f80 0f00 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 0cc0 3cf0 3cf0 3030 3870 1ce0 0fc0 0780 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc c00c c00c c30c c78c cfcc cccc c0cc c1cc c38c c30c c30c c00c c30c c30c c00c c00c fffc fffc 0000 0000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc 0000 0000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 8000 c000 e000 f000 f800 7c00 3e00 fffc fffc 07c0 03e0 01f0 00f8 007c 003c 001c 000c 0004 0000 0000 0000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 ffc0 0380 0700 0e00 1c00 3ffc 3ffc 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 000c 000c 0300 0300 0000 0000 0000 0004 000c 0c0c 0c0c 000c 000c 000c 000c 000c 0300 0300 000c 000c 0000 0000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0c00 0c00 3000 7000 e000 c000 8000 00c0 00c0 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 8004 c00c e01c f03c f87c fcfc fffc 7ff8 3ff0 1fe0 1fe0 3ff0 7ff8 fffc fcfc f87c f03c e01c c00c 8004 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0cc0 0fc0 0780 0fc0 0ce0 0070 0ff0 1ff0 3830 3030 3030 3030 3030 3870 1fe0 0fc0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0600 0e00 1e00 3ffc 3ffc 1e00 0e00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 3000 3000 3000 3000 3fc0 3fe0 3070 3030 3030 3030 3030 3070 3fe0 3fc0 3000 3000 3000 3000 0000 0000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 03c0 07e0 0e70 0c3c 0c3c 0e70 07e0 03c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0f3c 0f3c 0f3c 003c 003c 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 fffc fffc c00c c00c c0cc c1cc c3cc c7cc cecc cccc cfcc cfcc c0cc c0cc c00c c00c fffc fffc 0000 0000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0cc0 0cc0 0fc0 0fc0 0cc0 0cc0 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 fffc fffc c00c c00c c00c c00c fffc fffc c00c c00c fffc fffc 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc c78c cfcc cccc cccc cfcc c78c fffc fffc c30c c30c c30c c78c cfcc dcec f87c f03c fffc fffc 0000 0000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 0fc0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0fc0 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 3030 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 0030 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 fe00 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc 01fc ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc fffc ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0380 03fc 01fc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 01fc 03fc 0380 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 03fc 03fc 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 fffc fffc 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0700 ff00 fe00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fe00 ff00 0700 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ff00 ff00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 0fc0 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0380 07c0 0fe0 0fe0 0fe0 07c0 0380 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 aaa8 5554 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 6600 6600 6600 6600 7e00 7e00 6600 6600 6600 6600 0000 0000 03f0 03f0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 0000 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 7e00 7e00 6000 6000 7c00 7c00 6000 6000 6000 6000 0000 0000 03f0 03f0 0300 0300 03e0 03e0 0300 0300 0300 0300 0000 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 3c00 7e00 7600 6000 6000 6000 6000 7600 7e00 3c00 0000 0000 03e0 03f0 0330 0330 03e0 03c0 0360 0370 0330 0330 0000 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 6000 6000 6000 6000 6000 6000 6000 6000 7e00 7e00 0000 0000 03f0 03f0 0300 0300 03e0 03e0 0300 0300 0300 0300 0000 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0780 0fc0 0cc0 0cc0 0fc0 0780 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0300 0300 0300 3ff0 3ff0 0300 0300 0300 0300 0000 0000 3ff0 3ff0 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 6300 7300 7300 7b00 6b00 6f00 6700 6700 6300 6300 0000 0000 0300 0300 0300 0300 0300 0300 0300 0300 03f0 03f0 0000 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 6300 6300 6300 6300 6300 6300 7700 3e00 1c00 0800 0000 0000 03f0 03f0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 00c0 0000 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0700 ff00 fe00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fe00 ff00 0700 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 01fc 03fc 0380 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0380 03fc 01fc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 fffc fffc 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 03fc 03fc 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ff00 ff00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 fffc fffc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 fffc fffc 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 00c0 01c0 0380 0700 0e00 1c00 3800 3800 1c00 0e00 0700 0380 01c0 00c0 0000 0000 7fe0 7fe0 0000 0000 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0c00 0e00 0700 0380 01c0 00e0 0070 0070 00e0 01c0 0380 0700 0e00 0c00 0000 0000 1ff8 1ff8 0000 0000 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 7ff8 7ff8 1860 1860 1860 1860 1860 1860 1860 3860 3860 3060 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0030 0030 0070 00e0 00c0 3ff0 3ff0 0380 0300 3ff0 3ff0 0e00 0c00 0c00 1c00 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0300 0780 0fc0 0cc0 0c00 0c00 3fc0 3fc0 0c00 0c00 0c00 0c00 0c30 1e70 3fe0 33c0 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 14 0 BBX 14 24 0 -6 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0300 0300 0300 0300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt32b.bdf0000664000076500007650000030135113221577164013675 0ustar pdmpdmSTARTFONT 2.1 COMMENT "32-point bold 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1994-2009, Paul Mattes." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the name of Paul Mattes nor his contributors may" COMMENT " be used to endorse or promote products derived from this" COMMENT " software without specific prior written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES 'AS IS' AND ANY" COMMENT "EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO," COMMENT "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL," COMMENT "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED" COMMENT "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE," COMMENT "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED" COMMENT "AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT" COMMENT "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING" COMMENT "IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF" COMMENT "THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt32bold SIZE 32 72 72 FONTBOUNDINGBOX 18 32 0 -8 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Bold" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 32 POINT_SIZE 320 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 180 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 18 NORM_SPACE 18 MAX_SPACE 18 END_SPACE 18 AVG_CAPITAL_WIDTH 180 AVG_LOWERCASE_WIDTH 180 CAP_HEIGHT 18 X_HEIGHT 14 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 24 FONT_DESCENT 8 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 01FC00 03FE00 078F00 0F0700 1E0000 1C0000 1C0000 7FFF00 7FFE00 1C0000 1C0000 7FFE00 7FFC00 1C0000 1C0000 1E0000 0F0700 078F00 03FE00 01FC00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 01e000 03f000 07f800 0ffc00 0ffc00 0ffc00 0ffc00 07f800 03f000 01e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0e0000 0f0000 078000 03c000 01e000 00f000 007800 003c00 001e00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 0e0000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000e00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 0f0000 078000 03c000 01e000 00f000 007800 003c00 001e00 000e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 03f800 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 03f800 03f800 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 03f800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 03f800 03f800 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 038000 03c000 01e000 00f000 007800 003800 003800 003800 003800 003800 003800 003800 003800 007800 00f000 01e000 03c000 038000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 003800 007800 00f000 01e000 03c000 038000 038000 038000 038000 038000 038000 038000 038000 03c000 01e000 00f000 007800 003800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0f8000 0fc000 01e000 00e000 00e000 00e000 00e000 00e000 00e000 00f000 007800 007800 00f000 00e000 00e000 00e000 00e000 00e000 00e000 01e000 0fc000 0f8000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00f800 01f800 03c000 038000 038000 038000 038000 038000 038000 078000 0f0000 0f0000 078000 038000 038000 038000 038000 038000 038000 03c000 01f800 00f800 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fff80 3fff80 000000 000000 000000 000000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e3800 0e3800 0e3800 0e3800 0e3800 0e3800 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000380 000780 000f00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 1e0000 3c0000 380000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 380000 3c0000 1e0000 0f0000 078000 03c000 01e000 00f000 007800 003c00 001e00 000f00 000780 000380 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03fe00 07ff00 0f0780 0e0380 0e0380 0e0780 000f00 001e00 003c00 007800 00f000 00e000 00e000 00e000 000000 000000 000000 000000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 0fff80 1fff80 3ce000 38e000 38e000 3ce000 1ffe00 0fff00 00e780 00e380 00e380 00e780 3fff00 3ffe00 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 0ffe00 1ffe00 3ce000 38e000 38e000 38e000 38e000 3ce000 1ffe00 0ffe00 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00f800 01fc00 03de00 038e00 038000 038000 038000 038000 3ff800 3ff800 038000 038000 038000 038000 038000 038000 3f8380 3fc780 3fff00 3efe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 380380 3c0780 1e0f00 0f1e00 07bc00 03f800 01f000 00e000 3fff80 3fff80 00e000 00e000 00e000 00e000 3fff80 3fff80 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fe000 3ff000 387800 383800 383800 383800 383800 387800 3ff000 3fe000 380000 380000 383800 383800 38fe00 38fe00 383800 383800 383800 383800 003800 003800 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 3c0780 1e0f00 0f1e00 07fc00 03f800 071c00 0e0e00 0e0e00 0e0e00 0e0e00 071c00 03f800 07fc00 0f1e00 1e0f00 3c0780 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 07fc00 0f1e00 1e0f00 3c0780 380380 380380 380380 38e380 38e380 38e380 38e380 380380 380380 380380 3c0780 1e0f00 0f1e00 07fc00 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01e000 03e000 07e000 0fe000 0ee000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03fe00 07ff00 0f0780 1e0380 3c0380 380380 000380 000780 000f00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 1e0000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0fff80 0fff80 000380 000780 000f00 001e00 003c00 007800 00f800 01fc00 001e00 000f00 000780 000380 000380 000780 380f00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 003e00 007e00 00fe00 01ee00 03ce00 078e00 0f0e00 1e0e00 3c0e00 380e00 380e00 380e00 3fff80 3fff80 000e00 000e00 000e00 000e00 000e00 000e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff80 3fff80 380000 380000 380000 380000 3ff800 3ffc00 001e00 000f00 000780 000380 000380 000380 000380 000780 000f00 001e00 3ffc00 3ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 038000 078000 0f0000 1e0000 3c0000 380000 380000 380000 3bf800 3ffc00 3f1e00 3e0f00 3c0780 380380 380380 3c0780 1e0f00 0f1e00 07fc00 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff80 3fff80 000380 000780 000f00 001e00 003c00 007800 00f000 01e000 03c000 038000 038000 038000 038000 038000 038000 038000 038000 038000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 07fc00 0f1e00 0e0e00 0e0e00 0e0e00 0e0e00 0f1e00 07fc00 07fc00 0f1e00 1e0f00 3c0780 380380 380380 3c0780 1e0f00 0f1e00 07fc00 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03fe00 07ff00 0f0780 1e0380 3c0380 380780 380f80 381f80 383f80 3c7b80 1ff380 0fe380 000380 000380 000380 000380 000380 000780 000f00 000e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e000 07f000 0f7800 1e3800 3c3800 387800 38f000 39f000 387800 383c00 381e00 380f00 380780 380380 380380 380380 3b8380 3bc780 39ff00 38fe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 07f800 0f0000 0e0000 0e0000 1f0000 3f8000 3bc000 39e000 38f000 387800 3c3c00 1e1e00 0f0e00 078e00 03ce00 01ee00 00fe00 007c00 003800 003800 007800 0ff000 0fe000 000000 000000 000000 000000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0e3800 0e3800 3ffe00 3ffe00 0e3800 0e3800 0e3800 0e3800 3ffe00 3ffe00 0e3800 0e3800 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0ffe00 1fff00 3c0780 380380 380380 380380 38fb80 39fb80 3bbb80 3bbf80 3bff00 3bfe00 380000 380000 380000 380000 380000 3c0000 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e0000 1f0000 3b8000 3b8000 1f0380 0e0780 000f00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 1e0000 3c0e00 381f00 003b80 003b80 001f00 000e00 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0f8000 1fc000 3de000 38e000 38e000 38e000 38e000 3de000 1fc000 1f8000 3b8380 3bc780 39ef00 38fe00 387c00 3c7c00 1ffe00 0fef00 000780 000380 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03e000 03e000 03e000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00f800 00f800 00f800 01f800 03f000 07e000 0fc000 0f8000 000000 000000 000000 000000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03e000 03e000 03e000 03e000 000000 000000 000000 000000 03e000 03e000 03e000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 3fff80 3fff80 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff80 3fff80 000380 000380 000380 000380 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e000 07f000 0f7800 0e3800 0e3800 0f7800 07f000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03e000 03e000 03e000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01f000 03f800 07bc00 0f1e00 0e0e00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0f8000 1fc000 3de380 38f780 007f00 003e00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3e0f80 3e0f80 3e0f80 3e0f80 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 038000 03c000 01e000 00f000 007800 003800 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 003800 007800 00f000 01e000 03c000 038000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 01e000 0fc000 0f8000 000000 000000 000000 000000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 3ffe00 3ffe00 380000 380000 380000 3c0000 1ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 038000 03c000 01e000 00f000 007800 003800 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1fff80 0ffb80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e380 07f780 0f7f00 0e3e00 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0f8e00 1fde00 3dfc00 38f800 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e3800 0e3800 000000 000000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c0e00 1e0e00 0f1e00 07bc00 03f800 01f000 01e000 03c000 078000 0f0000 1e0000 3c0000 380000 000000 000000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 380380 3c0780 1e0f00 0f1e00 07bc00 03f800 01f000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c0e00 1e0e00 0f1e00 07bc00 03f800 01f000 01e000 03c000 078000 0f0000 1e0000 3c0000 380000 000000 000000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 3ffe00 3ffe00 380000 380000 380000 3c0000 1ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 070000 0f0000 1f0000 070000 070380 070780 070f00 071e00 073c00 007800 00f000 01e000 03c780 078f80 0f1f80 1e3f80 3c3b80 383fc0 003fc0 000380 000380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 070000 0f0000 1f0000 070000 070380 070780 070f00 071e00 073c00 007800 00f000 01e000 03cf80 079fc0 0f1dc0 1e03c0 3c0780 380f00 001e00 001fc0 001fc0 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 3f8000 3f8000 078000 0f0000 1f0380 078780 038f00 3b9e00 3fbc00 1f7800 00f000 01e000 03c780 078f80 0f1f80 1e3f80 3c3b80 383fc0 003fc0 000380 000380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e3800 0e3800 000000 000000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1f00 1fff80 0ffb80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fe00 07fe00 0f0000 1e0000 3c0000 380000 380000 380000 380000 3c0000 1e0000 0f0000 07fe00 03fe00 00f000 00e000 0fe000 0fc000 000000 000000 000000 000000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e3800 0e3800 000000 000000 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e3800 0e3800 000000 000000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 3ffe00 3ffe00 380000 380000 380000 3c0000 1ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e0e00 0e0e00 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e3800 0e3800 000000 000000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3e1f00 3fff80 3ffb80 380000 380000 380000 380000 380000 380000 000000 000000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01f000 03f800 03b800 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01f000 03f800 03b800 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 3ffe00 3ffe00 380000 380000 380000 3c0000 1ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01f000 03f800 03b800 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01f000 03f800 03b800 000000 000000 03f800 07fc00 0f1e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0f1e00 07fc00 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 038000 07c000 0fe000 0ee000 000000 000000 383800 383800 383800 383800 383800 383800 383800 383800 383800 383800 383800 3c7c00 1ffe00 0fee00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0e0e00 0f1e00 07bc00 03f800 01f000 01f000 03f800 07bc00 0f1e00 0e0e00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003800 007800 00f000 01e000 03c000 038000 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003800 007800 00f000 01e000 03c000 038000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003800 007800 00f000 01e000 03c000 038000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1f00 1fff80 0ffb80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e380 07f780 0f7f00 0e3e00 000000 000000 3bfe00 3fff00 1f0780 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 00f000 007800 003c00 001e00 000e00 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 3fff80 3fff80 380000 380000 380000 380000 3ff800 3ff800 380000 380000 380000 380000 380000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 038000 03c000 01e000 00f000 007800 003800 000000 000000 03f800 03f800 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 03f800 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 0ffe00 1fff00 3c0780 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0000 0f0000 078000 03c000 01e000 00e000 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e380 07f780 0f7f00 0e3e00 000000 000000 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 3fff80 3fff80 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 03e380 07f780 0f7f00 0e3e00 0ffe00 1fff00 3c0780 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 01e000 03e000 07e000 07e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 01f000 03f800 07bc00 071c00 001c00 003c00 007800 00f000 01e000 03c000 078000 07fc00 07fc00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 07fc00 07fc00 003c00 007800 00f000 01f000 03f800 003c00 001c00 001c00 073c00 07f800 03f000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 1fff80 000000 000000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1ffc00 0ff800 000000 000000 3ffe00 3ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 00e380 01e780 03cf00 079e00 0f3c00 1e7800 3cf000 79e000 79e000 3cf000 1e7800 0f3c00 079e00 03cf00 01e780 00e380 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 38e000 3cf000 1e7800 0f3c00 079e00 03cf00 01e780 00f3c0 00f3c0 01e780 03cf00 079e00 0f3c00 1e7800 3cf000 38e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 003800 003800 000000 000000 000000 000000 003800 003800 003800 007800 00f000 01e000 03c000 078000 0f0380 0e0380 0e0380 0f0780 07ff00 03fe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0e00 0e0e00 000000 000000 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 380380 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0e00 0e0e00 000000 000000 3fff80 3fff80 380000 380000 380000 380000 380000 380000 3ff800 3ff800 380000 380000 380000 380000 380000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0e00 0e0e00 000000 000000 03f800 03f800 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 03f800 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0e00 0e0e00 000000 000000 0ffe00 1fff00 3c0780 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0e0e00 0e0e00 000000 000000 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 01f000 03f800 03b800 000000 000000 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 01f000 03f800 03b800 000000 000000 3fff80 3fff80 380000 380000 380000 380000 380000 380000 3ff800 3ff800 380000 380000 380000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 01f000 03f800 03b800 000000 000000 03f800 03f800 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 03f800 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 01f000 03f800 03b800 000000 000000 0ffe00 1fff00 3c0780 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 01f000 03f800 03b800 000000 000000 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00e000 01e000 03c000 078000 0f0000 0e0000 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 3fff80 3fff80 380000 380000 380000 380000 380000 380000 3ff800 3ff800 380000 380000 380000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003800 007800 00f000 01e000 03c000 038000 000000 000000 03f800 03f800 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 03f800 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 0ffe00 1fff00 3c0780 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000e00 001e00 003c00 007800 00f000 00e000 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e380 07f780 0f7f00 0e3e00 000000 000000 380380 3c0380 3e0380 3f0380 3f8380 3bc380 39e380 38f380 387b80 383f80 381f80 380f80 380780 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 380000 380000 380000 380000 380000 380000 3fe000 3ff000 387800 383c00 381e00 380e00 380e00 380e00 380e00 381e00 383c00 387800 3ff000 3fe000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fe00 07fe00 0f0000 1e0000 3c0000 380000 380000 380000 380000 3c0000 1e0000 0f0000 07fe00 03fe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000e00 000e00 000e00 000e00 000e00 000e00 03fe00 07fe00 0f0e00 1e0e00 3c0e00 380e00 380e00 380e00 380e00 3c0e00 1e0e00 0f0e00 07fe00 03fe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 3ffe00 3ffe00 380000 380000 380000 3c0000 1ffe00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00fe00 01fe00 03c000 038000 038000 038000 3ff800 3ff800 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fe00 07ff00 0f0780 1e0380 3c0380 380380 380380 3c0380 1e0f80 0f1f80 07ff80 03fb80 000380 000380 0e0380 0f0780 07ff00 03fe00 000000 000000 000000 000000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 380000 380000 380000 380000 380000 380000 3bf800 3ffc00 3f1e00 3e0e00 3c0e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000e00 000e00 000000 000000 000000 000000 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 000e00 0e0e00 0f1e00 07fc00 03f800 000000 000000 000000 000000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0e0000 0e0000 0e0000 0e0000 0e0000 0e0000 0e0e00 0e1e00 0e3c00 0e7800 0ef000 0fe000 0fc000 0fc000 0fe000 0ef000 0e7800 0e3c00 0e1e00 0e0e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00f800 00f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0fbe00 1fff00 3df780 38e380 38e380 38e380 38e380 38e380 38e380 38e380 38e380 38e380 38e380 38e380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3bfe00 3fff00 0e0780 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff800 1ffc00 3c1e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fe000 3ff000 387800 383c00 381e00 380e00 380e00 380e00 380e00 381e00 383c00 387800 3ff000 3fe000 380000 380000 380000 380000 380000 380000 000000 000000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fe00 07fe00 0f0e00 1e0e00 3c0e00 380e00 380e00 3c0e00 1e0e00 0f0e00 07fe00 03fe00 000e00 000e00 000e00 000e00 000f80 000f80 000000 000000 000000 000000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3cfe00 3dff00 1fc780 0f8380 0f0000 0e0000 0e0000 0e0000 0e0000 0e0000 0e0000 0e0000 0e0000 0e0000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff800 1ffc00 3c1e00 3c0e00 1e0000 0f0000 07e000 03f000 007800 003c00 381e00 3c1e00 1ffc00 0ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 0ffe00 0ffe00 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c1f00 1fff80 0ffb80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 380380 380380 380380 3c0780 1e0f00 0e0e00 0e0e00 0f1e00 07bc00 03b800 03b800 03f800 01f000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 380380 380380 380380 380380 380380 380380 38e380 38e380 38e380 39f380 3bfb80 3fbf80 1f1f00 0e0e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 380380 3c0780 1e0f00 0f1e00 07bc00 03f800 01f000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 380e00 380e00 380e00 380e00 380e00 380e00 380e00 3c0e00 1e0e00 0f1e00 07bc00 03f800 01f000 01e000 03c000 078000 0f0000 1e0000 3c0000 380000 000000 000000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fff80 3fff80 000f00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 1e0000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fbe00 3fff00 01f780 00e380 03e380 07e380 0fff80 1eff80 3ce000 38e000 38e000 3df000 1fff80 0fbf80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fb80 07ff80 0f1f00 0e1e00 0e3e00 0e7e00 0efe00 0fee00 0fce00 0f8e00 0f0e00 1f1e00 3ffc00 3bf800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 03f800 03f800 03f800 000000 000000 0ff800 0ffc00 001e00 000e00 000e00 000e00 0ffe00 1ffe00 3c0e00 380e00 380e00 3c0e00 1fff80 0fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 01f000 01f000 01f000 01f000 000000 000000 000000 3fff80 3fff80 000000 000000 000000 01f000 01f000 01f000 01f000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff80 3fff80 3fff80 3fff80 000000 000000 00f800 00f800 00f800 00f800 000000 000000 000000 000000 00f800 00f800 00f800 01f800 03f000 07e000 0fc000 0f8000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff80 3fff80 3fff80 3fff80 000000 000000 00e000 00e000 38e380 3ce780 1eef00 0ffe00 07bc00 07bc00 0ffe00 1eef00 3ce780 38e380 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 380380 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff800 3ffc00 0e1e00 0e0f00 0e0780 0e0780 0e0f00 0e1e00 0ffc00 0ffc00 0e1e00 0e0f00 0e0780 0e0780 0e0f00 0e1e00 3ffc00 3ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00fe00 01ff00 03c780 078380 0f0000 1e0000 3c0000 380000 380000 380000 380000 3c0000 1e0000 0f0000 078380 03c780 01ff00 00fe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff800 3ffc00 0e1e00 0e0f00 0e0780 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0380 0e0780 0e0f00 0e1e00 3ffc00 3ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff80 3fff80 380000 380000 380000 380000 380000 380000 3ff800 3ff800 380000 380000 380000 380000 380000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff80 3fff80 380000 380000 380000 380000 380000 380000 3ffe00 3ffe00 380000 380000 380000 380000 380000 380000 380000 380000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 03f800 07fc00 0f1e00 1e0e00 3c0000 380000 380000 380000 380000 380000 38ff80 38ff80 380e00 3c0e00 1e0e00 0f0e00 07fe00 03fe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 380380 380380 380380 380380 380380 380380 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 03f800 03f800 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 03f800 03f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00fe00 00fe00 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 383800 383800 383800 3c7800 1ff000 0fe000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 380780 380f00 381e00 383c00 387800 38f000 39e000 3bc000 3fc000 3fe000 3ef000 3c7800 383c00 381e00 380f00 380780 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 3c0780 3e0f80 3f1f80 3fbf80 3bfb80 39f380 38e380 38e380 38e380 380380 380380 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 3c0380 3e0380 3f0380 3f8380 3bc380 39e380 38f380 387b80 383f80 381f80 380f80 380780 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ffe00 1fff00 3c0780 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff800 3ffc00 381e00 380f00 380780 380380 380380 380780 380f00 381e00 3ffc00 3ff800 380000 380000 380000 380000 380000 380000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 03f800 07fc00 0f1e00 1e0f00 3c0780 380380 380380 380380 380380 380380 380380 380380 38e380 3ce780 1eef00 0f7e00 07fc00 03fc00 001e00 000f00 000780 000380 000000 000000 000000 000000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ffe00 3fff00 380780 380380 380380 380380 380380 380780 3fff00 3ffe00 39e000 38f000 387800 383c00 381e00 380f00 380780 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ffe00 1fff00 3c0780 380380 380000 3c0000 1f8000 0fc000 01e000 00f000 007e00 003f00 000780 000380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff80 3fff80 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 380380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 380380 380380 3c0780 1e0f00 0e0e00 0e0e00 0e0e00 0e0e00 0f1e00 07bc00 03b800 03b800 03f800 01f000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 380380 380380 380380 380380 380380 380380 380380 38e380 38e380 38e380 38e380 38e380 39f380 3bfb80 3fbf80 1f1f00 0e0e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 380380 380380 3c0780 1e0f00 0f1e00 07bc00 03f800 01f000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380380 3c0780 1e0f00 0f1e00 07bc00 03f800 01f000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff80 3fff80 000380 000780 000f00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 1e0000 3c0000 380000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00ff80 01ff80 03f800 07b800 0f3800 1e3800 3c3800 383800 383f80 383f80 3ff800 3ff800 383800 383800 383800 383800 383f80 383f80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ffe00 1fff00 3c0780 380780 380f80 381f80 383f80 387b80 38f380 39e380 3bc380 3f8380 3f0380 3e0380 3c0380 3c0780 1fff00 0ffe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 03f800 03f800 03f800 03f800 00e000 01f000 03f800 07bc00 0f1e00 1e0f00 3c0780 380380 380380 380380 3fff80 3fff80 380380 380380 380380 380380 380380 380380 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00fe00 01ff00 03c780 078380 0f0000 1e0000 3c0000 380000 380000 380000 380000 3c0000 1e0000 0f0000 078380 03c780 01ff00 00fe00 003c00 003800 0ff800 0ff000 000000 000000 000000 000000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00f800 00f800 00f800 00f800 000000 000000 000000 000000 00f800 00f800 00f800 01f800 03f000 07e000 0fc000 0f8000 000000 000000 000000 000000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00e000 00e000 38e380 3ce780 1eef00 0ffe00 07bc00 07bc00 0ffe00 1eef00 3ce780 38e380 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 07f800 0ffc00 1c0e00 380700 30f300 31f300 338300 330300 330300 330300 330300 338300 31f300 30f300 380700 1c0e00 0ffc00 07f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 07f800 0ffc00 1c0e00 380700 33e300 33f300 333300 333300 33f300 33e300 336300 337300 333300 333300 380700 1c0e00 0ffc00 07f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 1e0000 3f0000 738000 e1c000 c0c000 c0c000 c0c000 ffc000 ffc000 c0c000 c0c000 c0c000 c0c000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00c000 01e000 03f000 07f800 0ffc00 1ffe00 3fff00 7f3f80 fe1fc0 fc0fc0 f807c0 f003c0 e001c0 c000c0 800040 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00ff00 00ff80 0031c0 0030c0 0030c0 0031c0 003f80 003f80 0031c0 0030c0 0030c0 0031c0 00ff80 00ff00 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c300c0 c700c0 ce00c0 cc00c0 cc00c0 cc00c0 ccf0c0 cdf8c0 cf9cc0 cf0cc0 cc0cc0 ce1cc0 c7f8c0 c3f0c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 3fff80 3fff80 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff800 3ffc00 0e1e00 0e0f00 0e0780 0e0380 0e0380 0e0380 3fe380 3fe380 0e0380 0e0380 0e0380 0e0780 0e0f00 0e1e00 3ffc00 3ff800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 003000 003800 003c00 003e00 ffff00 ffff00 003e00 003c00 003800 003000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 380000 380000 380000 3ff800 3ffc00 381e00 380f00 380780 380380 380380 380780 380f00 381e00 3ffc00 3ff800 380000 380000 380000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 3f3f00 3f3f00 033000 033000 033000 033000 033000 033000 033000 033000 033000 033000 03f000 03f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 033000 033000 03f000 03f000 00c000 00c000 3fff00 3fff00 00c000 00c000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0ff000 0ff800 031c00 030c00 030c00 031c00 03f800 03f800 031c00 030c00 030c00 031c00 0ff800 0ff000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 033000 033000 033000 033000 033000 033000 033000 033000 033000 033000 3f3f00 3f3f00 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 00c000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c3f0c0 c7f8c0 ce1cc0 cc0cc0 cc0cc0 cc0cc0 c00cc0 c01cc0 c038c0 c070c0 c0e0c0 c0c0c0 c0c0c0 c0c0c0 c000c0 c000c0 c0c0c0 c0c0c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 800000 c00000 e00000 f00000 f80000 fc0000 fe0000 7f0000 3f8000 1fc000 0fe000 ffffc0 ffffc0 01fc00 00fe00 007f00 003f80 001fc0 000fc0 0007c0 0003c0 0001c0 0000c0 000040 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 fff000 fff000 00e000 01c000 038000 070000 0e0000 1c0000 3fffc0 3fffc0 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000300 000300 00c000 00c000 000000 000000 0c0000 0c0000 000000 000040 0000c0 0001c0 300380 300300 000300 000300 000300 000300 0c0300 0c0300 000300 000300 00c000 00c000 000300 000300 000000 000000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c0000 0c0000 000000 000000 0cc000 1cc000 380000 700000 e00000 c00000 803000 003000 000000 000000 000000 000000 00c000 00c000 000000 000000 0c0000 0c0000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 800040 c000c0 e001c0 f003c0 f807c0 fc0fc0 fe1fc0 ff3fc0 ffffc0 7fff80 3fff00 1ffe00 0ffc00 0ffc00 1ffe00 3fff00 7fff80 ffffc0 ff3fc0 fe1fc0 fc0fc0 f807c0 f003c0 e001c0 c000c0 800040 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 039c00 03fc00 01f800 00f000 01f800 03fc00 039e00 000e00 03fe00 07fe00 0f0e00 1e0e00 3c0e00 380e00 380e00 380e00 380e00 3c0e00 1e1e00 0f3c00 07f800 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 030000 070000 0f0000 1f0000 3fffc0 3fffc0 1f0000 0f0000 070000 030000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 380000 380000 380000 380000 380000 380000 3fe000 3ff000 387800 383c00 381e00 380e00 380e00 380e00 380e00 381e00 383c00 387800 3ff000 3fe000 380000 380000 380000 380000 380000 380000 000000 000000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 00fc00 01fe00 038700 030300 0303c0 0303c0 030300 038700 01fe00 00fc00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 03f3c0 03f3c0 03f3c0 03f3c0 0003c0 0003c0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c030c0 c070c0 c0f0c0 c1f0c0 c3b0c0 c730c0 ce30c0 cc30c0 cffcc0 cffcc0 c030c0 c030c0 c030c0 c030c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 073800 0e1c00 0c0c00 0c0c00 0c0c00 0ffc00 0ffc00 0c0c00 0c0c00 0c0c00 0c0c00 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c000c0 c000c0 c000c0 c000c0 ffffc0 ffffc0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c3f0c0 c3f0c0 c330c0 c330c0 c3f0c0 c3f0c0 c0c0c0 c0c0c0 ffffc0 ffffc0 c0c0c0 c0c0c0 c0c0c0 c1e0c0 c3f0c0 c738c0 ce1cc0 dc0ec0 f807c0 f003c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 03f800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 003800 03f800 03f800 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f800 03f800 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 038000 03f800 03f800 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 1c0700 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 000700 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ffc000 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00f000 00ffc0 007fc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 007fc0 00ffc0 00f000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00ffc0 00ffc0 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ffffc0 ffffc0 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 01e000 ffe000 ffc000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffc000 ffe000 01e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ffe000 ffe000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 07fc00 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 01f000 03f800 07fc00 07fc00 07fc00 07fc00 03f800 01f000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 1dc000 1dc000 1dc000 1dc000 1fc000 1fc000 1dc000 1dc000 1dc000 1dc000 000000 000000 00fe00 00fe00 003800 003800 003800 003800 003800 003800 003800 003800 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 1fc000 1fc000 1c0000 1c0000 1f8000 1f8000 1c0000 1c0000 1c0000 1c0000 000000 000000 00fe00 00fe00 00e000 00e000 00fc00 00fc00 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 0f8000 1fc000 1fc000 1c0000 1c0000 1c0000 1c0000 1fc000 1fc000 0f8000 000000 000000 00fc00 00fe00 00ee00 00ee00 00fc00 00f800 00fc00 00fc00 00ee00 00ee00 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1c0000 1fc000 1fc000 000000 000000 00fe00 00fe00 00e000 00e000 00fc00 00fc00 00e000 00e000 00e000 00e000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03e000 07f000 0f7800 0e3800 0e3800 0f7800 07f000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 3fff80 3fff80 00e000 00e000 00e000 00e000 00e000 00e000 000000 000000 3fff80 3fff80 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 1ce000 1ee000 1ee000 1fe000 1fe000 1fe000 1de000 1de000 1ce000 1ce000 000000 000000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00fe00 00fe00 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 1ce000 1ce000 1ce000 1ce000 1ce000 1ce000 1fe000 0fc000 078000 030000 000000 000000 00fe00 00fe00 003800 003800 003800 003800 003800 003800 003800 003800 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 01e000 ffe000 ffc000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffc000 ffe000 01e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 007fc0 00ffc0 00f000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00f000 00ffc0 007fc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ffffc0 ffffc0 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00ffc0 00ffc0 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ffe000 ffe000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 00e000 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000e00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 0f0000 078000 03c000 01e000 00f000 007800 003c00 001e00 000e00 000000 000000 1fff00 1fff00 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0e0000 0f0000 078000 03c000 01e000 00f000 007800 003c00 001e00 001e00 003c00 007800 00f000 01e000 03c000 078000 0f0000 0e0000 000000 000000 1fff00 1fff00 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 3fff80 3fff80 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 0e0e00 1e0e00 1c0e00 1c0e00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000380 000780 000f00 001e00 3fff80 3fff80 00f000 01e000 3fff80 3fff80 0f0000 1e0000 3c0000 380000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00f800 01fc00 03de00 038e00 038000 038000 038000 038000 3ff800 3ff800 038000 038000 038000 038000 038000 038000 3f8380 3fc780 3fff00 3efe00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03e000 03e000 03e000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt32.bdf0000664000076500007650000030156213221577164013537 0ustar pdmpdmSTARTFONT 2.1 COMMENT "32-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "Copyright (c) 1990, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt32 SIZE 32 72 72 FONTBOUNDINGBOX 18 32 0 -8 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 32 POINT_SIZE 320 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 180 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 18 NORM_SPACE 18 MAX_SPACE 18 END_SPACE 18 AVG_CAPITAL_WIDTH 180 AVG_LOWERCASE_WIDTH 180 CAP_HEIGHT 18 X_HEIGHT 14 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 24 FONT_DESCENT 8 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00fc00 01fe00 038700 070300 0e0000 0c0000 0c0000 3fff00 3ffe00 0c0000 0c0000 3ffe00 3ffc00 0c0000 0c0000 0e0000 070300 038700 01fe00 00fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 01e000 03f000 07f800 0ffc00 0ffc00 0ffc00 0ffc00 07f800 03f000 01e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0c0000 0e0000 070000 038000 01c000 00e000 007000 003800 001c00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 0c0000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000c00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 0e0000 070000 038000 01c000 00e000 007000 003800 001c00 000c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 03f000 03f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 03f000 03f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 030000 038000 01c000 00e000 007000 003000 003000 003000 003000 003000 003000 003000 003000 007000 00e000 01c000 038000 030000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 003000 007000 00e000 01c000 038000 030000 030000 030000 030000 030000 030000 030000 030000 038000 01c000 00e000 007000 003000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0f0000 0f8000 01c000 00c000 00c000 00c000 00c000 00c000 00c000 00e000 007000 007000 00e000 00c000 00c000 00c000 00c000 00c000 00c000 01c000 0f8000 0f0000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00f000 01f000 038000 030000 030000 030000 030000 030000 030000 070000 0e0000 0e0000 070000 030000 030000 030000 030000 030000 030000 038000 01f000 00f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fff00 3fff00 000000 000000 000000 000000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c3000 0c3000 0c3000 0c3000 0c3000 0c3000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000300 000700 000e00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 1c0000 380000 300000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 300000 380000 1c0000 0e0000 070000 038000 01c000 00e000 007000 003800 001c00 000e00 000700 000300 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03fc00 07fe00 0e0700 0c0300 0c0300 0c0700 000e00 001c00 003800 007000 00e000 00c000 00c000 00c000 000000 000000 000000 000000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 0fff00 1fff00 38c000 30c000 30c000 38c000 1ffc00 0ffe00 00c700 00c300 00c300 00c700 3ffe00 3ffc00 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 0ffc00 1ffc00 38c000 30c000 30c000 30c000 30c000 38c000 1ffc00 0ffc00 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00f000 01f800 039c00 030c00 030000 030000 030000 030000 3ff000 3ff000 030000 030000 030000 030000 030000 030000 3f0300 3f8700 3ffe00 3cfc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 00c000 3fff00 3fff00 00c000 00c000 00c000 00c000 3fff00 3fff00 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fc000 3fe000 307000 303000 303000 303000 303000 307000 3fe000 3fc000 300000 300000 303000 303000 30fc00 30fc00 303000 303000 303000 303000 003000 003000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 380700 1c0e00 0e1c00 07f800 03f000 061800 0c0c00 0c0c00 0c0c00 0c0c00 061800 03f000 07f800 0e1c00 1c0e00 380700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 07f800 0e1c00 1c0e00 380700 300300 300300 300300 30c300 30c300 30c300 30c300 300300 300300 300300 380700 1c0e00 0e1c00 07f800 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01c000 03c000 07c000 0ec000 0cc000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03fc00 07fe00 0e0700 1c0300 380300 300300 000300 000700 000e00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 1c0000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0fff00 0fff00 000300 000700 000e00 001c00 003800 007000 00f000 01f800 001c00 000e00 000700 000300 000300 000700 300e00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 003c00 007c00 00ec00 01cc00 038c00 070c00 0e0c00 1c0c00 380c00 300c00 300c00 300c00 3fff00 3fff00 000c00 000c00 000c00 000c00 000c00 000c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff00 3fff00 300000 300000 300000 300000 3ff000 3ff800 001c00 000e00 000700 000300 000300 000300 000300 000700 000e00 001c00 3ff800 3ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 030000 070000 0e0000 1c0000 380000 300000 300000 300000 33f000 37f800 3e1c00 3c0e00 380700 300300 300300 380700 1c0e00 0e1c00 07f800 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff00 3fff00 000300 000700 000e00 001c00 003800 007000 00e000 01c000 038000 030000 030000 030000 030000 030000 030000 030000 030000 030000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 07f800 0e1c00 0c0c00 0c0c00 0c0c00 0c0c00 0e1c00 07f800 07f800 0e1c00 1c0e00 380700 300300 300300 380700 1c0e00 0e1c00 07f800 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03fc00 07fe00 0e0700 1c0300 380300 300700 300f00 301f00 303b00 387300 1fe300 0fc300 000300 000300 000300 000300 000300 000700 000e00 000c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c000 07e000 0e7000 1c3000 383000 307000 30e000 31e000 307000 303800 301c00 300e00 300700 300300 300300 300300 330300 338700 31fe00 30fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 07f000 0e0000 0c0000 0c0000 1e0000 3f0000 338000 31c000 30e000 307000 383800 1c1c00 0e0c00 070c00 038c00 01cc00 00fc00 007800 003000 003000 007000 0fe000 0fc000 000000 000000 000000 000000 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0c3000 0c3000 3ffc00 3ffc00 0c3000 0c3000 0c3000 0c3000 3ffc00 3ffc00 0c3000 0c3000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0ffc00 1ffe00 380700 300300 300300 300300 30f300 31f300 333300 333700 33fe00 33fc00 300000 300000 300000 300000 300000 380000 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c0000 1e0000 330000 330000 1e0300 0c0700 000e00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 1c0000 380c00 301e00 003300 003300 001e00 000c00 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0f0000 1f8000 39c000 30c000 30c000 30c000 30c000 39c000 1f8000 1f0000 330300 338700 31ce00 30fc00 307800 387800 1ffc00 0fce00 000700 000300 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03c000 03c000 03c000 03c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00f000 00f000 00f000 01f000 03e000 07c000 0f8000 0f0000 000000 000000 000000 000000 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03c000 03c000 03c000 03c000 000000 000000 000000 000000 03c000 03c000 03c000 03c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 3fff00 3fff00 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff00 3fff00 000300 000300 000300 000300 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c000 07e000 0e7000 0c3000 0c3000 0e7000 07e000 03c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03c000 03c000 03c000 03c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 073800 0e1c00 0c0c00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0f0000 1f8000 39c300 30e700 007e00 003c00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3c0f00 3c0f00 3c0f00 3c0f00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 030000 038000 01c000 00e000 007000 003000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 003000 007000 00e000 01c000 038000 030000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 01c000 0f8000 0f0000 000000 000000 000000 000000 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 3ffc00 3ffc00 300000 300000 300000 380000 1ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 030000 038000 01c000 00e000 007000 003000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1fff00 0ff300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c300 07e700 0e7e00 0c3c00 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0f0c00 1f9c00 39f800 30f000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c3000 0c3000 000000 000000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 380c00 1c0c00 0e1c00 073800 03f000 01e000 01c000 038000 070000 0e0000 1c0000 380000 300000 000000 000000 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 380c00 1c0c00 0e1c00 073800 03f000 01e000 01c000 038000 070000 0e0000 1c0000 380000 300000 000000 000000 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 3ffc00 3ffc00 300000 300000 300000 380000 1ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 060000 0e0000 1e0000 060000 060300 060700 060e00 061c00 063800 007000 00e000 01c000 038700 070f00 0e1f00 1c3b00 383300 303f80 003f80 000300 000300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 060000 0e0000 1e0000 060000 060300 060700 060e00 061c00 063800 007000 00e000 01c000 038f00 071f80 0e1980 1c0380 380700 300e00 001c00 001f80 001f80 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 3f0000 3f0000 070000 0e0000 1e0300 070700 030e00 331c00 3f3800 1e7000 00e000 01c000 038700 070f00 0e1f00 1c3b00 383300 303f80 003f80 000300 000300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c3000 0c3000 000000 000000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381e00 1fff00 0ff300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fc00 07fc00 0e0000 1c0000 380000 300000 300000 300000 300000 380000 1c0000 0e0000 07fc00 03fc00 00e000 00c000 0fc000 0f8000 000000 000000 000000 000000 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c3000 0c3000 000000 000000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c3000 0c3000 000000 000000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 3ffc00 3ffc00 300000 300000 300000 380000 1ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c0c00 0c0c00 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c3000 0c3000 000000 000000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 3c1e00 3fff00 37f300 300000 300000 300000 300000 300000 300000 000000 000000 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 033000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 033000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 3ffc00 3ffc00 300000 300000 300000 380000 1ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 033000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 033000 000000 000000 03f000 07f800 0e1c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0e1c00 07f800 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 030000 078000 0fc000 0cc000 000000 000000 303000 303000 303000 303000 303000 303000 303000 303000 303000 303000 303000 387800 1ffc00 0fcc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0c0c00 0e1c00 073800 03f000 01e000 01e000 03f000 073800 0e1c00 0c0c00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003000 007000 00e000 01c000 038000 030000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003000 007000 00e000 01c000 038000 030000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003000 007000 00e000 01c000 038000 030000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381e00 1fff00 0ff300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c300 07e700 0e7e00 0c3c00 000000 000000 33fc00 3ffe00 1e0700 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 00e000 007000 003800 001c00 000c00 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 3fff00 3fff00 300000 300000 300000 300000 3ff000 3ff000 300000 300000 300000 300000 300000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 030000 038000 01c000 00e000 007000 003000 000000 000000 03f000 03f000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 03f000 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 0ffc00 1ffe00 380700 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 0e0000 070000 038000 01c000 00c000 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c300 07e700 0e7e00 0c3c00 000000 000000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 3fff00 3fff00 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 03c300 07e700 0e7e00 0c3c00 0ffc00 1ffe00 380700 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01c000 03c000 07c000 06c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 01e000 03f000 073800 061800 001800 003800 007000 00e000 01c000 038000 070000 07f800 07f800 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 07f800 07f800 003800 007000 00e000 01e000 03f000 003800 001800 001800 063800 07f000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 1fff00 000000 000000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1ff800 0ff000 000000 000000 3ffc00 3ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 00c300 01c700 038e00 071c00 0e3800 1c7000 38e000 71c000 71c000 38e000 1c7000 0e3800 071c00 038e00 01c700 00c300 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 30c000 38e000 1c7000 0e3800 071c00 038e00 01c700 00e380 00e380 01c700 038e00 071c00 0e3800 1c7000 38e000 30c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 003000 003000 000000 000000 000000 000000 003000 003000 003000 007000 00e000 01c000 038000 070000 0e0300 0c0300 0c0300 0e0700 07fe00 03fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0c00 0c0c00 000000 000000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 300300 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0c00 0c0c00 000000 000000 3fff00 3fff00 300000 300000 300000 300000 300000 300000 3ff000 3ff000 300000 300000 300000 300000 300000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0c00 0c0c00 000000 000000 03f000 03f000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 03f000 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0c00 0c0c00 000000 000000 0ffc00 1ffe00 380700 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0c00 0c0c00 000000 000000 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 033000 000000 000000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 033000 000000 000000 3fff00 3fff00 300000 300000 300000 300000 300000 300000 3ff000 3ff000 300000 300000 300000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 033000 000000 000000 03f000 03f000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 03f000 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 033000 000000 000000 0ffc00 1ffe00 380700 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 033000 000000 000000 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01c000 038000 070000 0e0000 0c0000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 3fff00 3fff00 300000 300000 300000 300000 300000 300000 3ff000 3ff000 300000 300000 300000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 003000 007000 00e000 01c000 038000 030000 000000 000000 03f000 03f000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 03f000 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 0ffc00 1ffe00 380700 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000c00 001c00 003800 007000 00e000 00c000 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c300 07e700 0e7e00 0c3c00 000000 000000 300300 380300 3c0300 3e0300 370300 338300 31c300 30e300 307300 303b00 301f00 300f00 300700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 300000 300000 300000 300000 300000 300000 3fc000 3fe000 307000 303800 301c00 300c00 300c00 300c00 300c00 301c00 303800 307000 3fe000 3fc000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fc00 07fc00 0e0000 1c0000 380000 300000 300000 300000 300000 380000 1c0000 0e0000 07fc00 03fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000c00 000c00 000c00 000c00 000c00 000c00 03fc00 07fc00 0e0c00 1c0c00 380c00 300c00 300c00 300c00 300c00 380c00 1c0c00 0e0c00 07fc00 03fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 3ffc00 3ffc00 300000 300000 300000 380000 1ffc00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00fc00 01fc00 038000 030000 030000 030000 3ff000 3ff000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fc00 07fe00 0e0700 1c0300 380300 300300 300300 380300 1c0f00 0e1f00 07fb00 03f300 000300 000300 0c0300 0e0700 07fe00 03fc00 000000 000000 000000 000000 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 300000 300000 300000 300000 300000 300000 33f000 37f800 3e1c00 3c0c00 380c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000c00 000c00 000000 000000 000000 000000 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 000c00 0c0c00 0e1c00 07f800 03f000 000000 000000 000000 000000 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c0000 0c0000 0c0000 0c0000 0c0000 0c0000 0c0c00 0c1c00 0c3800 0c7000 0ce000 0dc000 0f8000 0f8000 0dc000 0ce000 0c7000 0c3800 0c1c00 0c0c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00f000 00f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0f3c00 1ffe00 39e700 30c300 30c300 30c300 30c300 30c300 30c300 30c300 30c300 30c300 30c300 30c300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 33fc00 3ffe00 0c0700 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff000 1ff800 381c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fc000 3fe000 307000 303800 301c00 300c00 300c00 300c00 300c00 301c00 303800 307000 3fe000 3fc000 300000 300000 300000 300000 300000 300000 000000 000000 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03fc00 07fc00 0e0c00 1c0c00 380c00 300c00 300c00 380c00 1c0c00 0e0c00 07fc00 03fc00 000c00 000c00 000c00 000c00 000f00 000f00 000000 000000 000000 000000 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 38fc00 39fe00 1f8700 0f0300 0e0000 0c0000 0c0000 0c0000 0c0000 0c0000 0c0000 0c0000 0c0000 0c0000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 0ff000 1ff800 381c00 380c00 1c0000 0e0000 07c000 03e000 007000 003800 301c00 381c00 1ff800 0ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 0ffc00 0ffc00 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 300c00 381e00 1fff00 0ff300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 300300 300300 300300 380700 1c0e00 0c0c00 0c0c00 0e1c00 073800 033000 033000 03f000 01e000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 300300 300300 300300 300300 300300 300300 30c300 30c300 30c300 31e300 33f300 3f3f00 1e1e00 0c0c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 300c00 300c00 300c00 300c00 300c00 300c00 300c00 380c00 1c0c00 0e1c00 073800 03f000 01e000 01c000 038000 070000 0e0000 1c0000 380000 300000 000000 000000 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3fff00 3fff00 000e00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 1c0000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 3f3c00 3ffe00 01e700 00c300 03c300 07c300 0eff00 1cff00 38c000 30c000 30c000 39e000 1fff00 0f3f00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03f300 07ff00 0e1e00 0c1c00 0c3c00 0c7c00 0cec00 0dcc00 0f8c00 0f0c00 0e0c00 1e1c00 3ff800 33f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 03f000 03f000 000000 000000 0ff000 0ff800 001c00 000c00 000c00 000c00 0ffc00 1ffc00 380c00 300c00 300c00 380c00 1fff00 0fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 01e000 01e000 01e000 01e000 000000 000000 000000 3fff00 3fff00 000000 000000 000000 01e000 01e000 01e000 01e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff00 3fff00 3fff00 3fff00 000000 000000 00f000 00f000 00f000 00f000 000000 000000 000000 000000 00f000 00f000 00f000 01f000 03e000 07c000 0f8000 0f0000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 3fff00 3fff00 3fff00 3fff00 000000 000000 00c000 00c000 30c300 38c700 1cce00 0edc00 073800 073800 0edc00 1cce00 38c700 30c300 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 300300 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff000 3ff800 0c1c00 0c0e00 0c0700 0c0700 0c0e00 0c1c00 0ff800 0ff800 0c1c00 0c0e00 0c0700 0c0700 0c0e00 0c1c00 3ff800 3ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00fc00 01fe00 038700 070300 0e0000 1c0000 380000 300000 300000 300000 300000 380000 1c0000 0e0000 070300 038700 01fe00 00fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff000 3ff800 0c1c00 0c0e00 0c0700 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0300 0c0700 0c0e00 0c1c00 3ff800 3ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff00 3fff00 300000 300000 300000 300000 300000 300000 3ff000 3ff000 300000 300000 300000 300000 300000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff00 3fff00 300000 300000 300000 300000 300000 300000 3ffc00 3ffc00 300000 300000 300000 300000 300000 300000 300000 300000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 03f000 07f800 0e1c00 1c0c00 380000 300000 300000 300000 300000 300000 30ff00 30ff00 300c00 380c00 1c0c00 0e0c00 07fc00 03fc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 300300 300300 300300 300300 300300 300300 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 03f000 03f000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 03f000 03f000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00fc00 00fc00 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 303000 303000 303000 387000 1fe000 0fc000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 300700 300e00 301c00 303800 307000 30e000 31c000 338000 378000 3fc000 3ce000 387000 303800 301c00 300e00 300700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 380700 3c0f00 3e1f00 373b00 33f300 31e300 30c300 30c300 30c300 300300 300300 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 380300 3c0300 3e0300 370300 338300 31c300 30e300 307300 303b00 301f00 300f00 300700 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ffc00 1ffe00 380700 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff000 3ff800 301c00 300e00 300700 300300 300300 300700 300e00 301c00 3ff800 3ff000 300000 300000 300000 300000 300000 300000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 03f000 07f800 0e1c00 1c0e00 380700 300300 300300 300300 300300 300300 300300 300300 30c300 38c700 1cce00 0e7c00 07f800 03f800 001c00 000e00 000700 000300 000000 000000 000000 000000 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ffc00 3ffe00 300700 300300 300300 300300 300300 300700 3ffe00 3ffc00 31c000 30e000 307000 303800 301c00 300e00 300700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ffc00 1ffe00 380700 300300 300000 380000 1f0000 0f8000 01c000 00e000 007c00 003e00 000700 000300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff00 3fff00 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 300300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 300300 300300 380700 1c0e00 0c0c00 0c0c00 0c0c00 0c0c00 0e1c00 073800 033000 033000 03f000 01e000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 300300 300300 300300 300300 300300 300300 300300 30c300 30c300 30c300 30c300 30c300 31e300 33f300 3f3f00 1e1e00 0c0c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 300300 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3fff00 3fff00 000300 000700 000e00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 1c0000 380000 300000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00ff00 01ff00 03b000 073000 0e3000 1c3000 383000 303000 303f00 303f00 3ff000 3ff000 303000 303000 303000 303000 303f00 303f00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0ffc00 1ffe00 380700 300700 300f00 301f00 303b00 307300 30e300 31c300 338300 370300 3e0300 3c0300 380300 380700 1ffe00 0ffc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 03f000 03f000 03f000 03f000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 300300 300300 3fff00 3fff00 300300 300300 300300 300300 300300 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00fc00 01fe00 038700 070300 0e0000 1c0000 380000 300000 300000 300000 300000 380000 1c0000 0e0000 070300 038700 01fe00 00fc00 003800 003000 0ff000 0fe000 000000 000000 000000 000000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00f000 00f000 00f000 00f000 000000 000000 000000 000000 00f000 00f000 00f000 01f000 03e000 07c000 0f8000 0f0000 000000 000000 000000 000000 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 00c000 00c000 30c300 38c700 1cce00 0edc00 073800 073800 0edc00 1cce00 38c700 30c300 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 07f800 0ffc00 1c0e00 380700 30f300 31f300 338300 330300 330300 330300 330300 338300 31f300 30f300 380700 1c0e00 0ffc00 07f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 07f800 0ffc00 1c0e00 380700 33e300 33f300 333300 333300 33f300 33e300 336300 337300 333300 333300 380700 1c0e00 0ffc00 07f800 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0c0000 1e0000 3f0000 738000 e1c000 c0c000 c0c000 c0c000 ffc000 ffc000 c0c000 c0c000 c0c000 c0c000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 00c000 01e000 03f000 07f800 0ffc00 1ffe00 3fff00 7f3f80 fe1fc0 fc0fc0 f807c0 f003c0 e001c0 c000c0 800040 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00ff00 00ff80 0031c0 0030c0 0030c0 0031c0 003f80 003f80 0031c0 0030c0 0030c0 0031c0 00ff80 00ff00 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c300c0 c700c0 ce00c0 cc00c0 cc00c0 cc00c0 ccf0c0 cdf8c0 cf9cc0 cf0cc0 cc0cc0 ce1cc0 c7f8c0 c3f0c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 3fff00 3fff00 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 3ff000 3ff800 0c1c00 0c0e00 0c0700 0c0300 0c0300 0c0300 3fc300 3fc300 0c0300 0c0300 0c0300 0c0700 0c0e00 0c1c00 3ff800 3ff000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 003000 003800 003c00 003e00 ffff00 ffff00 003e00 003c00 003800 003000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 300000 300000 300000 3ff000 3ff800 301c00 300e00 300700 300300 300300 300700 300e00 301c00 3ff800 3ff000 300000 300000 300000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 3f3f00 3f3f00 033000 033000 033000 033000 033000 033000 033000 033000 033000 033000 03f000 03f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 033000 033000 03f000 03f000 00c000 00c000 3fff00 3fff00 00c000 00c000 00c000 01e000 03f000 073800 0e1c00 1c0e00 380700 300300 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 0ff000 0ff800 031c00 030c00 030c00 031c00 03f800 03f800 031c00 030c00 030c00 031c00 0ff800 0ff000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 033000 033000 033000 033000 033000 033000 033000 033000 033000 033000 3f3f00 3f3f00 300300 380700 1c0e00 0e1c00 073800 03f000 01e000 00c000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c3f0c0 c7f8c0 ce1cc0 cc0cc0 cc0cc0 cc0cc0 c00cc0 c01cc0 c038c0 c070c0 c0e0c0 c0c0c0 c0c0c0 c0c0c0 c000c0 c000c0 c0c0c0 c0c0c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 800000 c00000 e00000 f00000 f80000 fc0000 fe0000 7f0000 3f8000 1fc000 0fe000 ffffc0 ffffc0 01fc00 00fe00 007f00 003f80 001fc0 000fc0 0007c0 0003c0 0001c0 0000c0 000040 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 fff000 fff000 00e000 01c000 038000 070000 0e0000 1c0000 3fffc0 3fffc0 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000300 000300 00c000 00c000 000000 000000 0c0000 0c0000 000000 000040 0000c0 0001c0 300380 300300 000300 000300 000300 000300 0c0300 0c0300 000300 000300 00c000 00c000 000300 000300 000000 000000 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 0c0000 0c0000 000000 000000 0cc000 1cc000 380000 700000 e00000 c00000 803000 003000 000000 000000 000000 000000 00c000 00c000 000000 000000 0c0000 0c0000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 800040 c000c0 e001c0 f003c0 f807c0 fc0fc0 fe1fc0 ff3fc0 ffffc0 7fff80 3fff00 1ffe00 0ffc00 0ffc00 1ffe00 3fff00 7fff80 ffffc0 ff3fc0 fe1fc0 fc0fc0 f807c0 f003c0 e001c0 c000c0 800040 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 031800 03b800 01f000 00e000 01f000 03b800 031c00 000c00 03fc00 07fc00 0e0c00 1c0c00 380c00 300c00 300c00 300c00 300c00 380c00 1c1c00 0e3800 07f000 03e000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 030000 070000 0f0000 1f0000 3fffc0 3fffc0 1f0000 0f0000 070000 030000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 300000 300000 300000 300000 300000 300000 3fc000 3fe000 307000 303800 301c00 300c00 300c00 300c00 300c00 301c00 303800 307000 3fe000 3fc000 300000 300000 300000 300000 300000 300000 000000 000000 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 00fc00 01fe00 038700 030300 0303c0 0303c0 030300 038700 01fe00 00fc00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 03f3c0 03f3c0 03f3c0 03f3c0 0003c0 0003c0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c030c0 c070c0 c0f0c0 c1f0c0 c3b0c0 c730c0 ce30c0 cc30c0 cffcc0 cffcc0 c030c0 c030c0 c030c0 c030c0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 00c000 01e000 03f000 073800 0e1c00 0c0c00 0c0c00 0c0c00 0ffc00 0ffc00 0c0c00 0c0c00 0c0c00 0c0c00 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c000c0 c000c0 c000c0 c000c0 ffffc0 ffffc0 c000c0 c000c0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 c000c0 c000c0 c3f0c0 c3f0c0 c330c0 c330c0 c3f0c0 c3f0c0 c0c0c0 c0c0c0 ffffc0 ffffc0 c0c0c0 c0c0c0 c0c0c0 c1e0c0 c3f0c0 c738c0 ce1cc0 dc0ec0 f807c0 f003c0 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 003000 03f000 03f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03f000 03f000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 030000 03f000 03f000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 180600 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 180000 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 000600 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ff8000 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 007fc0 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ffffc0 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00e000 00ffc0 007fc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 007fc0 00ffc0 00e000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00ffc0 00ffc0 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ffffc0 ffffc0 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 01c000 ffc000 ff8000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ff8000 ffc000 01c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ffc000 ffc000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 07f800 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 01e000 03f000 07f800 07f800 07f800 07f800 03f000 01e000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 aaaa80 555540 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 198000 198000 198000 198000 1f8000 1f8000 198000 198000 198000 198000 000000 000000 00fc00 00fc00 003000 003000 003000 003000 003000 003000 003000 003000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 1f8000 1f8000 180000 180000 1f0000 1f0000 180000 180000 180000 180000 000000 000000 00fc00 00fc00 00c000 00c000 00f800 00f800 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 0f0000 1f8000 1d8000 180000 180000 180000 180000 1d8000 1f8000 0f0000 000000 000000 00f800 00fc00 00cc00 00cc00 00f800 00f000 00d800 00d800 00cc00 00cc00 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 180000 180000 180000 180000 180000 180000 180000 180000 1f8000 1f8000 000000 000000 00fc00 00fc00 00c000 00c000 00f800 00f800 00c000 00c000 00c000 00c000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 03c000 07e000 0e7000 0c3000 0c3000 0e7000 07e000 03c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 3fff00 3fff00 00c000 00c000 00c000 00c000 00c000 00c000 000000 000000 3fff00 3fff00 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 18c000 1cc000 1cc000 1ec000 1ec000 1bc000 19c000 19c000 18c000 18c000 000000 000000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00fc00 00fc00 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 18c000 18c000 18c000 18c000 18c000 18c000 1dc000 0f8000 070000 020000 000000 000000 00fc00 00fc00 003000 003000 003000 003000 003000 003000 003000 003000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 01c000 ffc000 ff8000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ff8000 ffc000 01c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 007fc0 00ffc0 00e000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00e000 00ffc0 007fc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ffffc0 ffffc0 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00ffc0 00ffc0 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ffc000 ffc000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ffffc0 ffffc0 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ffffc0 ffffc0 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 00c000 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000c00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 0e0000 070000 038000 01c000 00e000 007000 003800 001c00 000c00 000000 000000 1ffe00 1ffe00 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 0c0000 0e0000 070000 038000 01c000 00e000 007000 003800 001c00 001c00 003800 007000 00e000 01c000 038000 070000 0e0000 0c0000 000000 000000 1ffe00 1ffe00 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 3fff00 3fff00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 0c0c00 1c0c00 180c00 180c00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000300 000700 000e00 001c00 3fff00 3fff00 00e000 01c000 3fff00 3fff00 0e0000 1c0000 380000 300000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 00f000 01f800 039c00 030c00 030000 030000 030000 030000 3ff000 3ff000 030000 030000 030000 030000 030000 030000 3f0300 3f8700 3ffe00 3cfc00 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 18 0 BBX 18 32 0 -8 BITMAP 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 03c000 03c000 03c000 03c000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 ENDCHAR ENDFONT suite3270-3.6/x3270/3270gt8.bdf0000664000076500007650000010577113221577164013466 0ustar pdmpdmSTARTFONT 2.1 COMMENT "8-point 3270 font" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1994-2009, Paul Mattes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, GTRC nor their" COMMENT " contributors may be used to endorse or promote products" COMMENT " derived from this software without specific prior written" COMMENT " permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND GTRC 'AS IS' AND" COMMENT "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED" COMMENT "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR" COMMENT "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL" COMMENT "MATTES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL," COMMENT "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT" COMMENT "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;" COMMENT "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER" COMMENT "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT," COMMENT "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)" COMMENT "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF" COMMENT "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." FONT 3270gt8 SIZE 8 72 72 FONTBOUNDINGBOX 5 8 0 -2 STARTPROPERTIES 27 FOUNDRY "GaTech" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 8 POINT_SIZE 80 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 50 CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "1" MIN_SPACE 5 NORM_SPACE 5 MAX_SPACE 5 END_SPACE 5 AVG_CAPITAL_WIDTH 50 AVG_LOWERCASE_WIDTH 50 CAP_HEIGHT 6 X_HEIGHT 4 RELATIVE_WEIGHT 50 DESTINATION "Video Text" FONT_ASCENT 6 FONT_DESCENT 2 DEFAULT_CHAR 514 ENDPROPERTIES CHARS 312 STARTCHAR null ENCODING 0 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR euro ENCODING 2 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 e0 40 e0 48 30 00 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 70 f8 70 20 00 00 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 70 00 00 00 00 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 40 20 10 20 40 00 00 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 10 20 40 20 10 00 00 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 20 20 20 20 20 30 00 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 60 20 20 20 20 20 60 00 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 20 20 20 20 20 40 00 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 20 20 20 20 10 00 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 20 20 10 20 20 40 00 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 20 40 20 20 10 00 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 70 00 70 00 00 00 ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 00 00 00 00 00 00 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 50 00 00 00 00 00 00 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 08 10 20 40 80 00 00 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 80 40 20 10 08 00 00 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 20 20 00 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 00 20 20 20 00 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 08 10 20 00 20 00 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 00 20 00 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 78 a0 70 28 f0 20 00 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 70 60 70 20 00 00 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 20 20 70 20 68 70 00 ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 88 50 20 70 20 20 20 00 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 60 50 60 58 48 48 00 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 d8 70 50 70 d8 00 00 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 48 48 48 30 00 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 30 10 10 10 10 10 00 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 08 10 20 40 78 00 ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 08 30 08 48 30 00 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 08 28 28 48 78 08 08 00 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 40 40 70 08 08 70 00 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 40 70 48 48 30 00 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 08 10 20 20 20 20 00 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 30 48 48 30 00 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 38 08 10 20 00 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 50 48 48 50 00 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 18 20 50 48 28 10 60 00 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 30 78 30 78 30 00 00 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 58 58 40 38 00 ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 10 10 20 28 48 00 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 78 00 ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 30 60 50 48 38 00 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 70 00 00 00 00 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 20 20 00 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 20 20 40 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 20 20 00 20 20 00 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 20 70 20 00 00 00 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 08 00 00 00 00 00 00 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 00 00 00 00 00 00 00 ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 20 00 00 00 00 00 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 20 20 00 00 00 00 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 00 00 00 00 00 00 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 28 50 00 00 00 00 00 00 ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 00 00 00 00 00 00 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 10 00 00 00 00 00 00 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 00 00 00 00 00 00 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 20 60 ENDCHAR STARTCHAR agrave ENCODING 64 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 10 70 08 78 48 38 00 ENDCHAR STARTCHAR egrave ENCODING 65 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 10 30 48 78 40 38 00 ENDCHAR STARTCHAR igrave ENCODING 66 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 10 20 20 20 20 20 00 ENDCHAR STARTCHAR ograve ENCODING 67 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 10 30 48 48 48 30 00 ENDCHAR STARTCHAR ugrave ENCODING 68 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 10 48 48 48 48 30 00 ENDCHAR STARTCHAR atilde ENCODING 69 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 28 50 78 08 78 48 38 00 ENDCHAR STARTCHAR otilde ENCODING 70 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 28 50 30 48 48 48 30 00 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 48 48 48 28 10 60 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 68 48 48 38 08 70 00 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 48 48 48 28 10 60 ENDCHAR STARTCHAR eacute ENCODING 74 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 30 48 78 40 38 00 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 40 10 30 78 10 00 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 40 30 08 10 38 00 ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 60 20 50 30 78 10 00 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 48 48 48 48 30 00 ENDCHAR STARTCHAR ccedilla ENCODING 79 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 38 40 40 40 38 10 ENDCHAR STARTCHAR adiaeresis ENCODING 80 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 70 08 78 48 38 00 ENDCHAR STARTCHAR ediaeresis ENCODING 81 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 30 48 78 40 38 00 ENDCHAR STARTCHAR idiaeresis ENCODING 82 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 20 20 20 20 20 00 ENDCHAR STARTCHAR odiaeresis ENCODING 83 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 30 48 48 48 30 00 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 00 48 48 48 48 30 00 ENDCHAR STARTCHAR acircumflex ENCODING 85 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 70 08 78 48 38 00 ENDCHAR STARTCHAR ecircumflex ENCODING 86 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 30 48 78 40 38 00 ENDCHAR STARTCHAR icircumflex ENCODING 87 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 20 20 20 20 20 00 ENDCHAR STARTCHAR ocircumflex ENCODING 88 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 30 48 48 48 30 00 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 48 48 48 48 30 00 ENDCHAR STARTCHAR aacute ENCODING 90 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 70 08 78 48 38 00 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 50 20 50 00 00 00 ENDCHAR STARTCHAR iacute ENCODING 92 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 40 20 20 20 20 20 00 ENDCHAR STARTCHAR oacute ENCODING 93 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 30 48 48 48 30 00 ENDCHAR STARTCHAR uacute ENCODING 94 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 48 48 48 48 30 00 ENDCHAR STARTCHAR ntilde ENCODING 95 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 28 50 70 48 48 48 48 00 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 30 48 48 78 48 48 00 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 78 40 78 40 40 78 00 ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 30 20 20 20 20 20 00 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 30 48 48 48 48 30 00 ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 58 48 48 48 48 30 00 ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 30 48 48 78 48 48 00 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 30 48 48 48 48 30 00 ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 60 20 20 20 00 00 00 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 563 0 DWIDTH 5 0 BBX 6 8 0 -2 BITMAP 60 10 20 40 70 00 00 00 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 60 10 20 10 60 00 00 00 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 08 78 48 38 00 78 00 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 48 30 00 78 00 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 28 50 a0 50 28 00 00 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 a0 50 28 50 a0 00 00 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 00 20 20 20 20 20 00 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 00 20 40 80 90 60 00 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 30 48 48 78 48 48 00 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 78 40 78 40 40 78 00 ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 20 20 20 20 20 20 00 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 30 48 48 48 48 30 00 ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 48 48 48 48 48 30 00 ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 30 48 48 78 48 48 00 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 78 40 78 40 40 78 00 ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 20 20 20 20 20 20 00 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 30 48 48 48 48 30 00 ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 48 48 48 30 00 ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 30 48 48 78 48 48 00 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 78 40 78 40 40 78 00 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 20 20 20 20 20 20 00 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 30 48 48 48 48 30 00 ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 68 48 48 48 48 30 00 ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 38 48 68 58 48 48 48 00 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 30 08 78 48 38 00 ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 70 48 48 48 70 00 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 38 40 40 40 38 00 ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 08 08 38 48 48 48 38 00 ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 30 48 78 40 38 00 ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 18 20 20 78 20 20 20 00 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 30 48 48 38 08 70 ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 70 48 48 48 48 00 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 00 20 20 20 20 20 00 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 00 10 10 10 10 50 20 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 48 50 60 50 48 00 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 20 10 00 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 50 78 78 78 78 00 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 70 48 48 48 48 00 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 30 48 48 48 30 00 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 70 48 48 48 70 40 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 38 48 48 48 38 08 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 70 48 40 40 40 00 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 38 40 30 08 70 00 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 78 20 20 20 10 00 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 48 48 48 48 30 00 ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 48 48 48 30 30 00 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 78 78 78 78 50 00 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 48 48 30 48 48 00 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 48 48 48 38 08 70 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 78 08 30 40 78 00 ENDCHAR STARTCHAR ae ENCODING 154 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 78 10 78 50 38 00 ENDCHAR STARTCHAR oslash ENCODING 155 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 30 58 78 68 30 00 ENDCHAR STARTCHAR aring ENCODING 156 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 30 70 08 78 48 38 00 ENDCHAR STARTCHAR division ENCODING 157 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 00 70 00 20 00 00 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 00 20 20 00 20 20 40 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 00 20 a8 70 a8 20 00 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 78 48 48 48 00 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 48 48 70 48 48 70 00 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 40 40 40 48 30 00 ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 48 48 48 48 48 70 00 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 40 40 78 40 40 78 00 ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 40 40 78 40 40 40 00 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 40 58 48 48 30 00 ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 48 78 48 48 48 00 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 20 20 00 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 08 08 08 08 08 48 30 00 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 50 60 50 50 48 48 00 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 40 40 40 40 78 00 ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 78 78 48 48 48 48 00 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 68 58 48 48 48 00 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 48 48 48 30 00 ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 48 48 70 40 40 40 00 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 48 48 48 58 38 00 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 48 48 70 60 50 48 00 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 40 30 08 48 30 00 ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 20 20 20 20 20 20 00 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 48 48 48 48 30 00 ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 48 48 48 30 30 00 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 48 48 78 78 48 00 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 48 30 48 48 48 00 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 48 48 48 38 08 08 70 00 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 78 08 10 20 20 40 78 00 ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 38 50 50 78 50 50 58 00 ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 58 78 68 48 30 00 ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 30 48 48 78 48 48 00 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 48 40 40 40 48 30 10 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 20 20 00 20 20 40 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 a8 70 a8 20 00 00 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 88 a8 c8 a8 88 70 00 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 88 e8 e8 d8 88 70 00 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 a0 e0 a0 f8 88 f8 00 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 70 d8 88 00 00 00 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 28 30 28 f8 88 f8 00 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 a8 c8 c8 f8 d8 f8 f8 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 70 20 00 70 00 00 ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 28 28 78 28 28 70 00 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 10 f8 10 00 00 00 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 70 48 48 70 40 40 00 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 88 d8 50 50 70 00 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 20 f8 20 20 50 88 00 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 60 50 60 50 f8 00 00 00 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 50 50 d8 88 50 20 00 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 a8 d8 98 a8 88 a8 f8 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 f8 f8 f8 f8 f8 f8 f8 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 20 f8 10 10 08 00 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f8 00 00 00 00 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f0 20 40 f8 00 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 f8 00 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 08 20 00 40 48 08 28 08 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 40 40 a0 20 00 40 00 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 88 88 50 20 20 50 88 88 ENDCHAR STARTCHAR eth ENCODING 247 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 18 38 48 48 48 30 00 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 40 f8 40 00 00 00 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 40 70 48 48 48 70 40 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 70 58 70 00 00 00 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f0 30 10 00 00 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 d8 d8 f8 98 98 98 f8 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 70 50 f8 00 00 00 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 f8 88 f8 f8 00 00 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 a8 a8 f8 a8 a8 d8 f8 ENDCHAR STARTCHAR apl_space ENCODING 272 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 00 00 00 ENDCHAR STARTCHAR apl_bracketright ENCODING 316 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 60 20 20 20 20 20 60 00 ENDCHAR STARTCHAR apl_bracketleft ENCODING 328 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 20 20 20 20 20 30 00 ENDCHAR STARTCHAR apl_stile ENCODING 347 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 20 20 20 ENDCHAR STARTCHAR apl_2vertical ENCODING 384 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 50 50 50 50 50 50 50 50 ENDCHAR STARTCHAR apl_2horizontal ENCODING 385 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 f8 00 00 00 00 f8 00 ENDCHAR STARTCHAR apl_leftvbar ENCODING 386 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 40 40 40 40 40 40 40 40 ENDCHAR STARTCHAR apl_rightvbar ENCODING 387 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR apl_midvbar ENCODING 388 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 20 20 20 ENDCHAR STARTCHAR apl_leftsolid ENCODING 393 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP e0 e0 e0 e0 e0 e0 e0 e0 ENDCHAR STARTCHAR apl_rightsolid ENCODING 394 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 38 38 38 38 38 38 38 38 ENDCHAR STARTCHAR apl_topsolid ENCODING 395 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 f8 f8 f8 00 00 00 00 ENDCHAR STARTCHAR apl_bottomsolid ENCODING 396 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 f8 f8 f8 f8 ENDCHAR STARTCHAR apl_solid ENCODING 397 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP f8 f8 f8 f8 f8 f8 f8 f8 ENDCHAR STARTCHAR apl_midhbar ENCODING 402 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f8 00 00 00 00 ENDCHAR STARTCHAR apl_lowerleft ENCODING 419 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 38 00 00 00 00 ENDCHAR STARTCHAR apl_upperleft ENCODING 420 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 38 20 20 20 20 ENDCHAR STARTCHAR apl_leftjoin ENCODING 421 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 38 20 20 20 20 ENDCHAR STARTCHAR apl_bottomjoin ENCODING 422 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 f8 00 00 00 00 ENDCHAR STARTCHAR apl_intersect ENCODING 427 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 f8 20 20 20 20 ENDCHAR STARTCHAR apl_lowerright ENCODING 428 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 e0 00 00 00 00 ENDCHAR STARTCHAR apl_upperright ENCODING 429 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 e0 20 20 20 20 ENDCHAR STARTCHAR apl_rightjoin ENCODING 430 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 e0 20 20 20 20 ENDCHAR STARTCHAR apl_topjoin ENCODING 431 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f8 20 20 20 20 ENDCHAR STARTCHAR dec_solid ENCODING 512 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 70 70 70 70 70 70 70 70 ENDCHAR STARTCHAR dec_filled_circle ENCODING 513 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 20 70 20 00 00 00 ENDCHAR STARTCHAR dec_halftone_block ENCODING 514 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP a8 50 a8 50 a8 50 a8 50 ENDCHAR STARTCHAR dec_ht ENCODING 515 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 60 60 60 30 30 30 00 ENDCHAR STARTCHAR dec_ff ENCODING 516 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 60 60 40 30 30 20 00 ENDCHAR STARTCHAR dec_cr ENCODING 517 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 60 40 60 30 30 30 00 ENDCHAR STARTCHAR dec_lf ENCODING 518 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 40 40 60 30 30 20 00 ENDCHAR STARTCHAR dec_degree ENCODING 519 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 50 20 00 00 00 00 00 ENDCHAR STARTCHAR dec_plusminus ENCODING 520 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 20 70 20 00 70 00 00 ENDCHAR STARTCHAR dec_nl ENCODING 521 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 60 60 60 20 20 30 00 ENDCHAR STARTCHAR dec_vt ENCODING 522 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 60 60 60 30 30 30 00 ENDCHAR STARTCHAR dec_lowerright ENCODING 523 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 e0 00 00 00 00 ENDCHAR STARTCHAR dec_upperright ENCODING 524 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 e0 20 20 20 20 ENDCHAR STARTCHAR dec_upperleft ENCODING 525 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 38 20 20 20 20 ENDCHAR STARTCHAR dec_lowerleft ENCODING 526 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 38 00 00 00 00 ENDCHAR STARTCHAR dec_intersect ENCODING 527 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 f8 20 20 20 20 ENDCHAR STARTCHAR dec_hbar1 ENCODING 528 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 f8 00 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar2 ENCODING 529 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 f8 00 00 00 00 00 ENDCHAR STARTCHAR dec_hbar3 ENCODING 530 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f8 00 00 00 00 ENDCHAR STARTCHAR dec_hbar4 ENCODING 531 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 f8 00 00 00 ENDCHAR STARTCHAR dec_hbar5 ENCODING 532 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 00 00 f8 00 00 ENDCHAR STARTCHAR dec_leftjoin ENCODING 533 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 38 20 20 20 20 ENDCHAR STARTCHAR dec_rightjoin ENCODING 534 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 e0 20 20 20 20 ENDCHAR STARTCHAR dec_bottomjoin ENCODING 535 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 f8 00 00 00 00 ENDCHAR STARTCHAR dec_topjoin ENCODING 536 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 00 f8 20 20 20 20 ENDCHAR STARTCHAR dec_vbar ENCODING 537 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 20 20 20 20 20 20 20 20 ENDCHAR STARTCHAR dec_notgreater ENCODING 538 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 10 20 40 20 10 70 00 ENDCHAR STARTCHAR dec_notless ENCODING 539 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 40 20 10 20 40 70 00 ENDCHAR STARTCHAR dec_pi ENCODING 540 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 f8 50 50 50 50 00 ENDCHAR STARTCHAR dec_notequal ENCODING 541 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 10 70 20 70 40 00 00 ENDCHAR STARTCHAR dec_sterling ENCODING 542 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 30 20 20 70 20 68 70 00 ENDCHAR STARTCHAR dec_periodcentered ENCODING 543 SWIDTH 563 0 DWIDTH 5 0 BBX 5 8 0 -2 BITMAP 00 00 20 20 00 00 00 00 ENDCHAR ENDFONT suite3270-3.6/x3270/3270h.bdf0000664000076500007650000010176113221577164013206 0ustar pdmpdmSTARTFONT 2.1 COMMENT "14-point 3270 font with Hebrew characters" COMMENT "Uses nonstandard ordering:" COMMENT " Page 0: EBCDIC US-International set, CG order" COMMENT " Page 1: EBCDIC APL/APL2 set, CG order (incomplete)" COMMENT " Page 2: (first 16 characters only) DEC line-drawing characters from" COMMENT " fixed-width X fonts" COMMENT "" COMMENT "Copyright (c) 1993-2009, Paul Mattes." COMMENT "Copyright (c) 1995, Roman Mitnitski" COMMENT "Copyright (c) 1990, Jeff Sparkes." COMMENT "Copyright (c) 1989, Georgia Tech Research Corporation (GTRC)," COMMENT " Atlanta, GA 30332." COMMENT "All rights reserved." COMMENT "" COMMENT "Redistribution and use in source and binary forms, with or" COMMENT "without modification, are permitted provided that the following" COMMENT "conditions are met:" COMMENT " * Redistributions of source code must retain the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer." COMMENT " * Redistributions in binary form must reproduce the above" COMMENT " copyright notice, this list of conditions and the following" COMMENT " disclaimer in the documentation and/or other materials" COMMENT " provided with the distribution." COMMENT " * Neither the names of Paul Mattes, Roman Mitnitski, Jeff " COMMENT " Sparkes, GTRC nor their contributors may be used to endorse" COMMENT " or promote products derived from this software without" COMMENT " specific prior written permission." COMMENT "" COMMENT "THIS SOFTWARE IS PROVIDED BY PAUL MATTES, ROMAN MITNITSKI, JEFF " COMMENT "SPARKES AND GTRC 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES," COMMENT "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF " COMMENT "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED." COMMENT "IN NO EVENT SHALL PAUL MATTES, ROMAN MITNITSKI, JEFF SPARKES OR GTRC" COMMENT "BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY," COMMENT "OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO," COMMENT "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR " COMMENT "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY" COMMENT "OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT" COMMENT "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE" COMMENT "USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH" COMMENT "DAMAGE." FONT 3270h SIZE 14 72 72 FONTBOUNDINGBOX 9 14 0 -3 STARTPROPERTIES 19 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "3270" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" PIXEL_SIZE 14 POINT_SIZE 140 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" CHARSET_REGISTRY "3270cg" CHARSET_ENCODING "8" AVERAGE_WIDTH 90 DEFAULT_CHAR 0 FONT_ASCENT 11 FONT_DESCENT 3 CAP_HEIGHT 9 X_HEIGHT 7 ENDPROPERTIES CHARS 256 STARTCHAR null ENCODING 0 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nobreakspace ENCODING 1 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ff ENCODING 2 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cr ENCODING 3 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR nl ENCODING 4 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR em ENCODING 5 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eightones ENCODING 6 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 1 BITMAP 38 7c fe fe fe 7c 38 ENDCHAR STARTCHAR hyphen ENCODING 7 SWIDTH 562 0 DWIDTH 9 0 BBX 5 1 2 4 BITMAP f8 ENDCHAR STARTCHAR greater ENCODING 8 SWIDTH 562 0 DWIDTH 9 0 BBX 5 9 2 0 BITMAP 80 40 20 10 08 10 20 40 80 ENDCHAR STARTCHAR less ENCODING 9 SWIDTH 562 0 DWIDTH 9 0 BBX 5 9 2 0 BITMAP 08 10 20 40 80 40 20 10 08 ENDCHAR STARTCHAR bracketleft ENCODING 10 SWIDTH 562 0 DWIDTH 9 0 BBX 3 11 3 -1 BITMAP e0 80 80 80 80 80 80 80 80 80 e0 ENDCHAR STARTCHAR bracketright ENCODING 11 SWIDTH 562 0 DWIDTH 9 0 BBX 3 11 3 -1 BITMAP e0 20 20 20 20 20 20 20 20 20 e0 ENDCHAR STARTCHAR parenright ENCODING 12 SWIDTH 562 0 DWIDTH 9 0 BBX 3 9 3 0 BITMAP 80 40 20 20 20 20 20 40 80 ENDCHAR STARTCHAR parenleft ENCODING 13 SWIDTH 562 0 DWIDTH 9 0 BBX 3 9 3 0 BITMAP 20 40 80 80 80 80 80 40 20 ENDCHAR STARTCHAR braceright ENCODING 14 SWIDTH 562 0 DWIDTH 9 0 BBX 4 11 2 -1 BITMAP c0 20 20 20 20 10 20 20 20 20 c0 ENDCHAR STARTCHAR braceleft ENCODING 15 SWIDTH 562 0 DWIDTH 9 0 BBX 4 11 2 -1 BITMAP 30 40 40 40 40 80 40 40 40 40 30 ENDCHAR STARTCHAR space ENCODING 16 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR equal ENCODING 17 SWIDTH 562 0 DWIDTH 9 0 BBX 7 4 1 3 BITMAP fe 00 00 fe ENDCHAR STARTCHAR apostrophe ENCODING 18 SWIDTH 562 0 DWIDTH 9 0 BBX 1 3 4 7 BITMAP 80 80 80 ENDCHAR STARTCHAR quotedbl ENCODING 19 SWIDTH 562 0 DWIDTH 9 0 BBX 4 3 2 7 BITMAP 90 90 90 ENDCHAR STARTCHAR slash ENCODING 20 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 1 BITMAP 02 04 08 10 20 40 80 ENDCHAR STARTCHAR backslash ENCODING 21 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 1 BITMAP 80 40 20 10 08 04 02 ENDCHAR STARTCHAR bar ENCODING 22 SWIDTH 562 0 DWIDTH 9 0 BBX 1 13 4 -2 BITMAP 80 80 80 80 80 80 80 80 80 80 80 80 80 ENDCHAR STARTCHAR brokenbar ENCODING 23 SWIDTH 562 0 DWIDTH 9 0 BBX 1 12 4 -2 BITMAP 80 80 80 80 80 00 00 80 80 80 80 80 ENDCHAR STARTCHAR question ENCODING 24 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 2 0 BITMAP 78 84 84 08 10 20 20 00 00 20 ENDCHAR STARTCHAR exclam ENCODING 25 SWIDTH 562 0 DWIDTH 9 0 BBX 1 10 4 0 BITMAP 80 80 80 80 80 80 80 00 00 80 ENDCHAR STARTCHAR dollar ENCODING 26 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -1 BITMAP 10 10 7e 90 90 7c 12 12 fc 10 10 ENDCHAR STARTCHAR cent ENCODING 27 SWIDTH 562 0 DWIDTH 9 0 BBX 6 9 1 1 BITMAP 10 10 7c 90 90 90 7c 10 10 ENDCHAR STARTCHAR sterling ENCODING 28 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 18 24 20 20 f8 20 20 20 e2 dc ENDCHAR STARTCHAR yen ENCODING 29 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 82 44 28 10 fe 10 10 fe 10 10 ENDCHAR STARTCHAR paragraph ENCODING 30 SWIDTH 562 0 DWIDTH 9 0 BBX 6 11 1 -1 BITMAP f0 88 88 88 f0 80 88 9c 88 88 08 ENDCHAR STARTCHAR currency ENCODING 31 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 44 38 44 44 44 38 44 82 ENDCHAR STARTCHAR 0 ENCODING 32 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 38 44 82 82 92 92 82 82 44 38 ENDCHAR STARTCHAR 1 ENCODING 33 SWIDTH 562 0 DWIDTH 9 0 BBX 3 10 2 0 BITMAP 20 60 a0 20 20 20 20 20 20 20 ENDCHAR STARTCHAR 2 ENCODING 34 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 3c 42 82 02 04 08 10 20 40 fe ENDCHAR STARTCHAR 3 ENCODING 35 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 7e 02 04 08 18 04 02 02 84 78 ENDCHAR STARTCHAR 4 ENCODING 36 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 0c 14 24 44 84 84 fe 04 04 04 ENDCHAR STARTCHAR 5 ENCODING 37 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP fe 80 80 f8 04 02 02 02 04 f8 ENDCHAR STARTCHAR 6 ENCODING 38 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 20 40 80 80 b8 c4 82 82 44 38 ENDCHAR STARTCHAR 7 ENCODING 39 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP fe 02 04 08 10 20 20 20 20 20 ENDCHAR STARTCHAR 8 ENCODING 40 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 38 44 44 44 38 44 82 82 44 38 ENDCHAR STARTCHAR 9 ENCODING 41 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 3c 42 82 86 8a 72 02 02 02 04 ENDCHAR STARTCHAR ssharp ENCODING 42 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1800 2400 4400 4800 4400 4200 4100 4100 5100 4e00 0000 0000 0000 ENDCHAR STARTCHAR section ENCODING 43 SWIDTH 562 0 DWIDTH 9 0 BBX 6 12 1 -2 BITMAP 38 40 40 a0 90 88 44 24 14 08 08 70 ENDCHAR STARTCHAR numbersign ENCODING 44 SWIDTH 562 0 DWIDTH 9 0 BBX 6 6 1 3 BITMAP 48 fc 48 48 fc 48 ENDCHAR STARTCHAR at ENCODING 45 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 7c 82 82 9a aa bc 80 80 80 7e ENDCHAR STARTCHAR percent ENCODING 46 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -1 BITMAP 40 a0 42 04 08 10 20 40 84 0a 04 ENDCHAR STARTCHAR underscore ENCODING 47 SWIDTH 562 0 DWIDTH 9 0 BBX 7 1 1 -1 BITMAP fe ENDCHAR STARTCHAR ampersand ENCODING 48 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 -1 BITMAP 60 90 90 90 60 a2 94 88 74 02 ENDCHAR STARTCHAR minus ENCODING 49 SWIDTH 562 0 DWIDTH 9 0 BBX 5 1 2 4 BITMAP f8 ENDCHAR STARTCHAR period ENCODING 50 SWIDTH 562 0 DWIDTH 9 0 BBX 2 2 3 0 BITMAP c0 c0 ENDCHAR STARTCHAR comma ENCODING 51 SWIDTH 562 0 DWIDTH 9 0 BBX 4 4 2 -2 BITMAP 30 30 60 c0 ENDCHAR STARTCHAR colon ENCODING 52 SWIDTH 562 0 DWIDTH 9 0 BBX 2 6 3 0 BITMAP c0 c0 00 00 c0 c0 ENDCHAR STARTCHAR plus ENCODING 53 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 1 BITMAP 10 10 10 fe 10 10 10 ENDCHAR STARTCHAR notsign ENCODING 54 SWIDTH 562 0 DWIDTH 9 0 BBX 7 3 1 6 BITMAP fe 02 02 ENDCHAR STARTCHAR macron ENCODING 55 SWIDTH 562 0 DWIDTH 9 0 BBX 7 1 1 9 BITMAP fe ENDCHAR STARTCHAR degree ENCODING 56 SWIDTH 562 0 DWIDTH 9 0 BBX 4 4 2 6 BITMAP 60 90 90 60 ENDCHAR STARTCHAR periodcentered ENCODING 57 SWIDTH 562 0 DWIDTH 9 0 BBX 2 2 4 3 BITMAP c0 c0 ENDCHAR STARTCHAR asciicircum ENCODING 58 SWIDTH 562 0 DWIDTH 9 0 BBX 5 3 2 7 BITMAP 20 50 88 ENDCHAR STARTCHAR asciitilde ENCODING 59 SWIDTH 562 0 DWIDTH 9 0 BBX 7 3 1 7 BITMAP 60 92 0c ENDCHAR STARTCHAR diaeresis ENCODING 60 SWIDTH 562 0 DWIDTH 9 0 BBX 7 2 1 8 BITMAP c6 c6 ENDCHAR STARTCHAR grave ENCODING 61 SWIDTH 562 0 DWIDTH 9 0 BBX 3 3 3 7 BITMAP 80 40 20 ENDCHAR STARTCHAR acute ENCODING 62 SWIDTH 562 0 DWIDTH 9 0 BBX 3 3 3 7 BITMAP 20 40 80 ENDCHAR STARTCHAR cedilla ENCODING 63 SWIDTH 562 0 DWIDTH 9 0 BBX 3 4 2 -2 BITMAP 20 20 20 c0 ENDCHAR STARTCHAR hebrew_aleph ENCODING 64 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 2600 3200 3200 2a00 2a00 2400 2400 2200 3200 0000 0000 0000 ENDCHAR STARTCHAR hebrew_tet ENCODING 65 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 2c00 2a00 2a00 2a00 2200 2200 2200 2200 1c00 0000 0000 0000 ENDCHAR STARTCHAR hebrew_lamed ENCODING 66 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 4000 4000 7e00 0200 0200 0200 0400 1800 1000 1800 0000 0000 0000 ENDCHAR STARTCHAR hebrew_ayin ENCODING 67 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3600 1200 1200 1200 1200 1200 1200 1600 3c00 0000 0000 0000 ENDCHAR STARTCHAR hebrew_shin ENCODING 68 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 2a00 2a00 2a00 2a00 2a00 3200 2200 3600 1c00 0000 0000 0000 ENDCHAR STARTCHAR hebrew_dalet ENCODING 69 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3e00 0400 0400 0400 0400 0400 0400 0400 0400 0000 0000 0000 ENDCHAR STARTCHAR hebrew_finalzade ENCODING 70 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 2200 2200 2200 2200 2400 3800 2000 2000 2000 2000 3000 0000 ENDCHAR STARTCHAR ydiaeresis ENCODING 71 SWIDTH 562 0 DWIDTH 9 0 BBX 6 13 1 -3 BITMAP 48 00 00 84 84 84 84 44 28 10 20 40 80 ENDCHAR STARTCHAR Yacute ENCODING 72 SWIDTH 562 0 DWIDTH 9 0 BBX 7 12 1 0 BITMAP 04 08 10 82 44 28 10 10 10 10 10 10 ENDCHAR STARTCHAR yacute ENCODING 73 SWIDTH 562 0 DWIDTH 9 0 BBX 6 14 1 -3 BITMAP 08 10 20 00 84 84 84 84 44 28 10 20 40 80 ENDCHAR STARTCHAR hebrew_yod ENCODING 74 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1c00 0400 0400 0400 0400 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR onequarter ENCODING 75 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 40 c0 40 40 e4 0c 14 1e 04 ENDCHAR STARTCHAR onehalf ENCODING 76 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 40 c0 40 40 ec 02 04 08 0e ENDCHAR STARTCHAR threequarters ENCODING 77 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 60 90 20 90 64 0c 14 1e 04 ENDCHAR STARTCHAR udiaeresis ENCODING 78 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 48 00 00 84 84 84 84 84 84 7a ENDCHAR STARTCHAR hebrew_chet ENCODING 79 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3c00 2200 2200 2200 2200 2200 2200 2200 2200 0000 0000 0000 ENDCHAR STARTCHAR hebrew_he ENCODING 80 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3e00 0200 0200 2200 2200 2200 2200 2200 2200 0000 0000 0000 ENDCHAR STARTCHAR hebrew_kaph ENCODING 81 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3c00 0200 0200 0200 0200 0200 0200 0200 3c00 0000 0000 0000 ENDCHAR STARTCHAR hebrew_finalnun ENCODING 82 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1800 0400 0400 0400 0400 0400 0400 0400 0400 0400 0600 0000 ENDCHAR STARTCHAR hebrew_zade ENCODING 83 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3600 1200 1200 0a00 0c00 0400 0200 0200 3e00 0000 0000 0000 ENDCHAR STARTCHAR mu ENCODING 84 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 -3 BITMAP 84 84 84 84 84 84 fa 80 80 ENDCHAR STARTCHAR hebrew_gimel ENCODING 85 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1c00 0400 0400 0400 0400 0c00 1400 2200 2200 0000 0000 0000 ENDCHAR STARTCHAR hebrew_finalkaph ENCODING 86 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3e00 0200 0200 0200 0200 0200 0200 0200 0200 0200 0300 0000 ENDCHAR STARTCHAR hebrew_mem ENCODING 87 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 6c00 3200 3200 2200 2200 2200 2200 2200 2e00 0000 0000 0000 ENDCHAR STARTCHAR hebrew_pe ENCODING 88 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1c00 2200 2200 1200 3a00 0200 0200 0200 3c00 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 89 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 0 BITMAP 20 50 00 88 88 88 88 88 88 74 ENDCHAR STARTCHAR hebrew_bet ENCODING 90 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 7c00 0200 0200 0200 0200 0200 0200 0200 7f00 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 91 SWIDTH 562 0 DWIDTH 9 0 BBX 5 5 2 2 BITMAP 88 50 20 50 88 ENDCHAR STARTCHAR hebrew_finalmem ENCODING 92 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3c00 2200 2200 2200 2200 2200 2200 2200 3e00 0000 0000 0000 ENDCHAR STARTCHAR hebrew_finalpe ENCODING 93 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1c00 2200 2200 1200 3a00 0200 0200 0200 0200 0200 0300 0000 ENDCHAR STARTCHAR hebrew_taw ENCODING 94 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3c00 2200 2200 2200 2200 2200 2200 2200 6200 0000 0000 0000 ENDCHAR STARTCHAR hebrew_samech ENCODING 95 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3e00 2200 2200 2200 2200 2200 2200 1400 1c00 0000 0000 0000 ENDCHAR STARTCHAR Agrave ENCODING 96 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 0400 0200 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Egrave ENCODING 97 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 40 20 10 fe 80 80 f8 80 80 80 fe ENDCHAR STARTCHAR Igrave ENCODING 98 SWIDTH 562 0 DWIDTH 9 0 BBX 3 11 3 0 BITMAP 80 40 20 00 e0 40 40 40 40 40 e0 ENDCHAR STARTCHAR Ograve ENCODING 99 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 40 20 10 7c 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Ugrave ENCODING 100 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 40 20 10 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Atilde ENCODING 101 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1900 2600 0000 0800 1400 2200 4100 7f00 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 102 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 32 4c 7c 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR onesuperior ENCODING 103 SWIDTH 562 0 DWIDTH 9 0 BBX 3 5 3 4 BITMAP 40 c0 40 40 e0 ENDCHAR STARTCHAR twosuperior ENCODING 104 SWIDTH 562 0 DWIDTH 9 0 BBX 4 5 2 4 BITMAP 60 90 20 40 f0 ENDCHAR STARTCHAR threesuperior ENCODING 105 SWIDTH 562 0 DWIDTH 9 0 BBX 4 5 2 4 BITMAP 60 90 20 90 60 ENDCHAR STARTCHAR ordfeminine ENCODING 106 SWIDTH 562 0 DWIDTH 9 0 BBX 5 7 2 4 BITMAP 70 08 78 88 78 00 f8 ENDCHAR STARTCHAR masculine ENCODING 107 SWIDTH 562 0 DWIDTH 9 0 BBX 5 7 2 4 BITMAP 70 88 88 88 70 00 f8 ENDCHAR STARTCHAR guillemotleft ENCODING 108 SWIDTH 562 0 DWIDTH 9 0 BBX 7 5 1 3 BITMAP 22 44 88 44 22 ENDCHAR STARTCHAR guillemotright ENCODING 109 SWIDTH 562 0 DWIDTH 9 0 BBX 7 5 1 3 BITMAP 88 44 22 44 88 ENDCHAR STARTCHAR exclamdown ENCODING 110 SWIDTH 562 0 DWIDTH 9 0 BBX 1 10 4 0 BITMAP 80 00 00 80 80 80 80 80 80 80 ENDCHAR STARTCHAR questiondown ENCODING 111 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 2 0 BITMAP 10 00 00 10 10 20 40 84 84 78 ENDCHAR STARTCHAR Adiaeresis ENCODING 112 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 2200 0000 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Ediaeresis ENCODING 113 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 44 00 fe 80 80 80 f8 80 80 80 fe ENDCHAR STARTCHAR Idiaeresis ENCODING 114 SWIDTH 562 0 DWIDTH 9 0 BBX 5 11 2 0 BITMAP 88 00 70 20 20 20 20 20 20 20 70 ENDCHAR STARTCHAR Odiaeresis ENCODING 115 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 44 00 7c 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Udiaeresis ENCODING 116 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 44 00 82 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Acircumflex ENCODING 117 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1400 0000 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 118 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 10 28 00 fe 80 80 80 f8 80 80 fe ENDCHAR STARTCHAR Icircumflex ENCODING 119 SWIDTH 562 0 DWIDTH 9 0 BBX 3 11 3 0 BITMAP 40 a0 00 e0 40 40 40 40 40 40 e0 ENDCHAR STARTCHAR Ocircumflex ENCODING 120 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 10 28 00 7c 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Ucircumflex ENCODING 121 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 10 28 00 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Aacute ENCODING 122 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0800 1000 2000 0800 1400 2200 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 123 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0200 0400 0800 7f00 4000 4000 4000 7c00 4000 4000 7f00 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 124 SWIDTH 562 0 DWIDTH 9 0 BBX 3 11 3 0 BITMAP 20 40 80 00 e0 40 40 40 40 40 e0 ENDCHAR STARTCHAR Oacute ENCODING 125 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 04 08 10 7c 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Uacute ENCODING 126 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 0 BITMAP 04 08 10 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR Ntilde ENCODING 127 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 1900 2600 0000 4100 6100 5100 4900 4500 4300 4100 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 128 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 78 04 04 7c 84 84 7e ENDCHAR STARTCHAR b ENCODING 129 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 0 BITMAP 80 80 80 f0 88 84 84 84 88 f0 ENDCHAR STARTCHAR c ENCODING 130 SWIDTH 562 0 DWIDTH 9 0 BBX 6 7 1 0 BITMAP 3c 40 80 80 80 40 3c ENDCHAR STARTCHAR d ENCODING 131 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 0 BITMAP 04 04 04 3c 44 84 84 84 44 3c ENDCHAR STARTCHAR e ENCODING 132 SWIDTH 562 0 DWIDTH 9 0 BBX 6 7 1 0 BITMAP 78 84 84 fc 80 80 7c ENDCHAR STARTCHAR f ENCODING 133 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 0 BITMAP 1c 20 20 f8 20 20 20 20 20 20 ENDCHAR STARTCHAR g ENCODING 134 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 -2 BITMAP 3c 42 82 82 46 3a 02 42 3c ENDCHAR STARTCHAR h ENCODING 135 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 0 BITMAP 80 80 80 b8 c4 84 84 84 84 84 ENDCHAR STARTCHAR i ENCODING 136 SWIDTH 562 0 DWIDTH 9 0 BBX 1 10 4 0 BITMAP 80 00 00 80 80 80 80 80 80 80 ENDCHAR STARTCHAR j ENCODING 137 SWIDTH 562 0 DWIDTH 9 0 BBX 5 12 2 -2 BITMAP 08 00 00 08 08 08 08 08 08 08 88 70 ENDCHAR STARTCHAR k ENCODING 138 SWIDTH 562 0 DWIDTH 9 0 BBX 5 10 2 0 BITMAP 80 80 80 88 90 a0 c0 a0 90 88 ENDCHAR STARTCHAR l ENCODING 139 SWIDTH 562 0 DWIDTH 9 0 BBX 2 10 4 0 BITMAP 80 80 80 80 80 80 80 80 80 c0 ENDCHAR STARTCHAR m ENCODING 140 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 6c 92 92 92 92 92 92 ENDCHAR STARTCHAR n ENCODING 141 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP bc 42 42 42 42 42 42 ENDCHAR STARTCHAR o ENCODING 142 SWIDTH 562 0 DWIDTH 9 0 BBX 6 7 1 0 BITMAP 78 84 84 84 84 84 78 ENDCHAR STARTCHAR p ENCODING 143 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 -3 BITMAP f0 88 84 84 84 88 f0 80 80 80 ENDCHAR STARTCHAR q ENCODING 144 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 -2 BITMAP 3c 44 84 84 44 3c 04 04 06 ENDCHAR STARTCHAR r ENCODING 145 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 9c 62 40 40 40 40 40 ENDCHAR STARTCHAR s ENCODING 146 SWIDTH 562 0 DWIDTH 9 0 BBX 6 7 1 0 BITMAP 78 84 40 30 08 84 78 ENDCHAR STARTCHAR t ENCODING 147 SWIDTH 562 0 DWIDTH 9 0 BBX 5 10 2 0 BITMAP 20 20 20 f8 20 20 20 20 20 20 ENDCHAR STARTCHAR u ENCODING 148 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 84 84 84 84 84 84 7a ENDCHAR STARTCHAR v ENCODING 149 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 82 82 44 44 28 28 10 ENDCHAR STARTCHAR w ENCODING 150 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 82 82 82 92 92 aa 44 ENDCHAR STARTCHAR x ENCODING 151 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP 82 44 28 10 28 44 82 ENDCHAR STARTCHAR y ENCODING 152 SWIDTH 562 0 DWIDTH 9 0 BBX 6 10 1 -3 BITMAP 84 84 84 84 44 28 10 20 40 80 ENDCHAR STARTCHAR z ENCODING 153 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 0 BITMAP fe 04 08 10 20 40 fe ENDCHAR STARTCHAR hebrew_zain ENCODING 154 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3c00 1000 1000 1000 1000 0800 0800 0800 0800 0000 0000 0000 ENDCHAR STARTCHAR hebrew_resh ENCODING 155 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3c00 0200 0200 0200 0200 0200 0200 0200 0200 0000 0000 0000 ENDCHAR STARTCHAR hebrew_waw ENCODING 156 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1c00 0400 0400 0400 0400 0400 0400 0400 0400 0000 0000 0000 ENDCHAR STARTCHAR hebrew_qoph ENCODING 157 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 3e00 0200 0200 2200 2400 2800 2800 2c00 2000 2000 3000 0000 ENDCHAR STARTCHAR fm ENCODING 158 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -1 BITMAP fe fe 00 18 18 00 00 18 18 30 60 ENDCHAR STARTCHAR dup ENCODING 159 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP fe fe 00 10 92 54 28 54 92 10 ENDCHAR STARTCHAR A ENCODING 160 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 10 28 44 82 82 fe 82 82 82 ENDCHAR STARTCHAR B ENCODING 161 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP f8 44 42 44 78 44 42 44 f8 ENDCHAR STARTCHAR C ENCODING 162 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 1c 22 40 80 80 80 40 22 1c ENDCHAR STARTCHAR D ENCODING 163 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP f8 44 42 42 42 42 42 44 f8 ENDCHAR STARTCHAR E ENCODING 164 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP fe 80 80 80 f8 80 80 80 fe ENDCHAR STARTCHAR F ENCODING 165 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP fe 80 80 80 fc 80 80 80 80 ENDCHAR STARTCHAR G ENCODING 166 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 38 44 80 80 80 9e 84 44 3c ENDCHAR STARTCHAR H ENCODING 167 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 82 82 82 fe 82 82 82 82 ENDCHAR STARTCHAR I ENCODING 168 SWIDTH 562 0 DWIDTH 9 0 BBX 3 9 3 0 BITMAP e0 40 40 40 40 40 40 40 e0 ENDCHAR STARTCHAR J ENCODING 169 SWIDTH 562 0 DWIDTH 9 0 BBX 6 9 1 0 BITMAP 1c 08 08 08 08 08 88 88 70 ENDCHAR STARTCHAR K ENCODING 170 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 84 88 90 a0 d0 88 84 82 ENDCHAR STARTCHAR L ENCODING 171 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 80 80 80 80 80 80 80 80 fe ENDCHAR STARTCHAR M ENCODING 172 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 c6 aa 92 92 82 82 82 82 ENDCHAR STARTCHAR N ENCODING 173 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 c2 a2 92 8a 86 82 82 82 ENDCHAR STARTCHAR O ENCODING 174 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 7c 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR P ENCODING 175 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP f8 84 82 82 84 f8 80 80 80 ENDCHAR STARTCHAR Q ENCODING 176 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -2 BITMAP 38 44 82 82 82 82 92 54 38 04 02 ENDCHAR STARTCHAR R ENCODING 177 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP fc 82 82 82 fc 90 88 84 82 ENDCHAR STARTCHAR S ENCODING 178 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 7c 82 80 60 10 0c 02 82 7c ENDCHAR STARTCHAR T ENCODING 179 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP fe 10 10 10 10 10 10 10 10 ENDCHAR STARTCHAR U ENCODING 180 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 82 82 82 82 82 82 82 7c ENDCHAR STARTCHAR V ENCODING 181 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 82 44 44 44 28 28 10 10 ENDCHAR STARTCHAR W ENCODING 182 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 82 82 82 92 92 92 aa 44 ENDCHAR STARTCHAR X ENCODING 183 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 82 44 28 10 28 44 82 82 ENDCHAR STARTCHAR Y ENCODING 184 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 82 44 28 10 10 10 10 10 10 ENDCHAR STARTCHAR Z ENCODING 185 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP fe 02 04 08 10 20 40 80 fe ENDCHAR STARTCHAR AE ENCODING 186 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 1e 28 48 88 8e f8 88 88 8e ENDCHAR STARTCHAR Ooblique ENCODING 187 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 7c 82 86 8a 92 a2 c2 82 7c ENDCHAR STARTCHAR Aring ENCODING 188 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 1c00 1c00 0800 1400 2200 4100 4100 7f00 4100 4100 4100 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 189 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0e00 1100 2000 4000 4000 4000 2000 1100 0e00 0400 3c00 0000 ENDCHAR STARTCHAR semicolon ENCODING 190 SWIDTH 562 0 DWIDTH 9 0 BBX 4 8 2 -2 BITMAP 30 30 00 00 30 30 60 c0 ENDCHAR STARTCHAR asterisk ENCODING 191 SWIDTH 562 0 DWIDTH 9 0 BBX 7 7 1 2 BITMAP 10 92 54 28 54 92 10 ENDCHAR STARTCHAR c0 ENCODING 192 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c1 ENCODING 193 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c2 ENCODING 194 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c3 ENCODING 195 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c4 ENCODING 196 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c5 ENCODING 197 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c6 ENCODING 198 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c7 ENCODING 199 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c8 ENCODING 200 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c9 ENCODING 201 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ca ENCODING 202 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cb ENCODING 203 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cc ENCODING 204 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cd ENCODING 205 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ce ENCODING 206 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR cf ENCODING 207 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR copyright ENCODING 208 SWIDTH 562 0 DWIDTH 9 0 BBX 7 8 1 2 BITMAP 38 44 9a a2 a2 9a 44 38 ENDCHAR STARTCHAR registered ENCODING 209 SWIDTH 562 0 DWIDTH 9 0 BBX 7 8 1 2 BITMAP 38 44 b2 aa b2 aa 44 38 ENDCHAR STARTCHAR boxA ENCODING 210 SWIDTH 562 0 DWIDTH 9 0 BBX 9 12 0 -1 BITMAP 2000 5000 8800 8800 f800 8800 8800 0000 ff80 8080 8080 ff80 ENDCHAR STARTCHAR insert ENCODING 211 SWIDTH 562 0 DWIDTH 9 0 BBX 9 7 0 0 BITMAP 0800 1c00 3e00 7700 e380 c180 8080 ENDCHAR STARTCHAR boxB ENCODING 212 SWIDTH 562 0 DWIDTH 9 0 BBX 9 12 0 -1 BITMAP 0f00 0480 0480 0700 0480 0480 0f00 0000 ff80 8080 8080 ff80 ENDCHAR STARTCHAR box6 ENCODING 213 SWIDTH 562 0 DWIDTH 9 0 BBX 9 11 0 -2 BITMAP ff80 8080 9080 a080 a080 ac80 b280 a280 9c80 8080 ff80 ENDCHAR STARTCHAR plusminus ENCODING 214 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 10 10 10 fe 10 10 10 00 fe ENDCHAR STARTCHAR ETH ENCODING 215 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP f8 44 42 42 f2 42 42 44 f8 ENDCHAR STARTCHAR rightarrow ENCODING 216 SWIDTH 562 0 DWIDTH 9 0 BBX 8 5 0 2 BITMAP 04 06 ff 06 04 ENDCHAR STARTCHAR THORN ENCODING 217 SWIDTH 562 0 DWIDTH 9 0 BBX 7 9 1 0 BITMAP 80 80 f8 84 84 84 f8 80 80 ENDCHAR STARTCHAR upshift ENCODING 218 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -1 BITMAP 10 28 44 82 ee 28 28 28 28 28 38 ENDCHAR STARTCHAR human ENCODING 219 SWIDTH 562 0 DWIDTH 9 0 BBX 7 10 1 0 BITMAP 38 28 38 10 fe 10 10 28 44 82 ENDCHAR STARTCHAR underB ENCODING 220 SWIDTH 562 0 DWIDTH 9 0 BBX 9 9 0 2 BITMAP 3c00 1200 1200 1c00 1200 1200 3c00 0000 ff80 ENDCHAR STARTCHAR downshift ENCODING 221 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -1 BITMAP 38 28 28 28 28 28 ee 82 44 28 10 ENDCHAR STARTCHAR boxquestion ENCODING 222 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP ff80 8080 9c80 a280 a280 8280 8480 8880 8880 8080 8880 8080 ff80 ENDCHAR STARTCHAR boxsolid ENCODING 223 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ff80 ENDCHAR STARTCHAR e0 ENCODING 224 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e1 ENCODING 225 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e2 ENCODING 226 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e3 ENCODING 227 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e4 ENCODING 228 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e5 ENCODING 229 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e6 ENCODING 230 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e7 ENCODING 231 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e8 ENCODING 232 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e9 ENCODING 233 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ea ENCODING 234 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eb ENCODING 235 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ec ENCODING 236 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ed ENCODING 237 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ee ENCODING 238 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ef ENCODING 239 SWIDTH 562 0 DWIDTH 9 0 BBX 9 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR badcommhi ENCODING 240 SWIDTH 562 0 DWIDTH 9 0 BBX 9 11 0 -1 BITMAP 8000 c000 e000 7000 3800 ff80 0e00 0700 0380 0180 0080 ENDCHAR STARTCHAR commhi ENCODING 241 SWIDTH 562 0 DWIDTH 9 0 BBX 9 1 0 4 BITMAP ff80 ENDCHAR STARTCHAR commjag ENCODING 242 SWIDTH 562 0 DWIDTH 9 0 BBX 9 5 0 0 BITMAP fc00 0800 1000 2000 7f80 ENDCHAR STARTCHAR commlo ENCODING 243 SWIDTH 562 0 DWIDTH 9 0 BBX 9 1 0 0 BITMAP ff80 ENDCHAR STARTCHAR clockleft ENCODING 244 SWIDTH 562 0 DWIDTH 9 0 BBX 8 13 1 -3 BITMAP 02 10 00 40 00 01 82 02 02 42 02 10 02 ENDCHAR STARTCHAR clockright ENCODING 245 SWIDTH 562 0 DWIDTH 9 0 BBX 6 11 0 -1 BITMAP 20 00 28 40 80 04 00 00 08 00 20 ENDCHAR STARTCHAR lock ENCODING 246 SWIDTH 562 0 DWIDTH 9 0 BBX 9 12 0 -1 BITMAP 8080 c180 e380 f780 7f00 3e00 3e00 7f00 f780 e380 c180 8080 ENDCHAR STARTCHAR hebrew_nun ENCODING 247 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP 0000 1800 0400 0400 0400 0400 0400 0400 0400 1c00 0000 0000 0000 ENDCHAR STARTCHAR leftarrow ENCODING 248 SWIDTH 562 0 DWIDTH 9 0 BBX 8 5 1 2 BITMAP 20 60 ff 60 20 ENDCHAR STARTCHAR thorn ENCODING 249 SWIDTH 562 0 DWIDTH 9 0 BBX 7 11 1 -2 BITMAP 80 80 b8 c4 84 84 84 c4 b8 80 80 ENDCHAR STARTCHAR keyleft ENCODING 250 SWIDTH 562 0 DWIDTH 9 0 BBX 6 5 3 3 BITMAP 70 88 8c 88 70 ENDCHAR STARTCHAR keyright ENCODING 251 SWIDTH 562 0 DWIDTH 9 0 BBX 9 4 0 2 BITMAP ff80 1d80 1d80 0180 ENDCHAR STARTCHAR box4 ENCODING 252 SWIDTH 562 0 DWIDTH 9 0 BBX 9 11 0 -2 BITMAP ff80 8080 8480 8c80 9480 a480 be80 8480 8480 8080 ff80 ENDCHAR STARTCHAR underA ENCODING 253 SWIDTH 562 0 DWIDTH 9 0 BBX 9 9 0 2 BITMAP 0800 1400 2200 2200 3e00 2200 2200 0000 ff80 ENDCHAR STARTCHAR magcard ENCODING 254 SWIDTH 562 0 DWIDTH 9 0 BBX 9 7 0 1 BITMAP ff80 8080 8080 8080 ff80 8080 ff80 ENDCHAR STARTCHAR boxhuman ENCODING 255 SWIDTH 562 0 DWIDTH 9 0 BBX 9 13 0 -2 BITMAP ff80 8080 9c80 9480 9c80 8880 ff80 8880 8880 9480 a280 c180 ff80 ENDCHAR ENDFONT suite3270-3.6/x3270/about.c0000664000076500007650000004722113221577164013244 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 2004, Don Russell. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * about.c * Pop-up window with the current state of x3270. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include "appres.h" #include "objects.h" #include "resources.h" #include "about.h" #include "charset.h" #include "keymap.h" #include "lazya.h" #include "linemode.h" #include "popups.h" #include "split_host.h" #include "telnet.h" #include "utf8.h" #include "utils.h" #include "varbuf.h" #include "xappres.h" #include "xscreen.h" #include "xpopups.h" static Widget about_shell = NULL; static Widget about_form; /* Called when OK is pressed on the about popup */ static void saw_about(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(about_shell); } /* Called when the about popup is popped down */ static void destroy_about(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtDestroyWidget(about_shell); about_shell = NULL; } /* Return a time difference in English */ static char * hms(time_t ts) { time_t t, td; long hr, mn, sc; (void) time(&t); td = t - ts; hr = td / 3600; mn = (td % 3600) / 60; sc = td % 60; if (hr > 0) { return lazyaf("%ld %s %ld %s %ld %s", hr, (hr == 1)? get_message("hour"): get_message("hours"), mn, (mn == 1)? get_message("minute"): get_message("minutes"), sc, (sc == 1)? get_message("second"): get_message("seconds")); } else if (mn > 0) { return lazyaf("%ld %s %ld %s", mn, (mn == 1)? get_message("minute"): get_message("minutes"), sc, (sc == 1)? get_message("second"): get_message("seconds")); } else { return lazyaf("%ld %s", sc, (sc == 1)? get_message("second"): get_message("seconds")); } } #define MAKE_SMALL(label, n) { \ w_prev = w; \ w = XtVaCreateManagedWidget( \ ObjSmallLabel, labelWidgetClass, about_form, \ XtNborderWidth, 0, \ XtNlabel, label, \ XtNfromVert, w, \ XtNleft, XtChainLeft, \ XtNvertDistance, (n), \ NULL); \ vd = n; \ } #define MAKE_LABEL(label, n) { \ w_prev = w; \ w = XtVaCreateManagedWidget( \ ObjNameLabel, labelWidgetClass, about_form, \ XtNborderWidth, 0, \ XtNlabel, label, \ XtNfromVert, w, \ XtNfromHoriz, left_anchor, \ XtNleft, XtChainLeft, \ XtNvertDistance, (n), \ NULL); \ vd = n; \ } #define MAKE_VALUE(label) { \ v = XtVaCreateManagedWidget( \ ObjDataLabel, labelWidgetClass, about_form, \ XtNborderWidth, 0, \ XtNlabel, label, \ XtNfromVert, w_prev, \ XtNfromHoriz, w, \ XtNhorizDistance, 0, \ XtNvertDistance, vd, \ XtNleft, XtChainLeft, \ NULL); \ } #define MAKE_LABEL2(label) { \ w = XtVaCreateManagedWidget( \ ObjNameLabel, labelWidgetClass, about_form, \ XtNborderWidth, 0, \ XtNlabel, label, \ XtNfromVert, w_prev, \ XtNfromHoriz, v, \ XtNhorizDistance, 0, \ XtNvertDistance, vd, \ XtNleft, XtChainLeft, \ NULL); \ } static void ignore_vd(int vd _is_unused) { } static void ignore_w_prev(Widget w_prev _is_unused) { } /* Called when the "About x3270->Copyright" button is pressed */ void popup_about_copyright(void) { Widget w = NULL, w_prev = NULL; Widget left_anchor = NULL; int vd = 4; static bool catted = false; static char *s1 = NULL; static char *s2 = NULL; static char *s1a = "* Redistributions of source code must retain the above copyright\n\ notice, this list of conditions and the following disclaimer.\n\ * Redistributions in binary form must reproduce the above copyright\n\ notice, this list of conditions and the following disclaimer in the\n"; static char *s1b = "documentation and/or other materials provided with the distribution.\n\ * Neither the names of Paul Mattes, Don Russell, Dick Altenbern,\n\ Jeff Sparkes, GTRC nor their contributors may be used to endorse or\n\ promote products derived from this software without specific prior\n\ written permission."; static char *s2a = "THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN,\n\ JEFF SPARKES AND GTRC \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n\ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n\ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL\n\ MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY\n\ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n"; static char *s2b = "(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n\ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n\ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n\ DAMAGE."; static char *line1 = NULL; if (!catted) { /* Make up for the ANSI C listerl string length limit. */ s1 = Malloc(strlen(s1a) + strlen(s1b) + 1); strcpy(s1, s1a); strcat(s1, s1b); s2 = Malloc(strlen(s2a) + strlen(s2b) + 1); strcpy(s2, s2a); strcat(s2, s2b); catted = true; } /* Create the popup */ about_shell = XtVaCreatePopupShell( "aboutCopyrightPopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(about_shell, XtNpopupCallback, place_popup, (XtPointer) CenterP); XtAddCallback(about_shell, XtNpopdownCallback, destroy_about, NULL); /* Create a form in the popup */ about_form = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, about_shell, NULL); /* Pretty picture */ left_anchor = XtVaCreateManagedWidget( "icon", labelWidgetClass, about_form, XtNborderWidth, 0, XtNbitmap, x3270_icon, XtNfromVert, w, XtNleft, XtChainLeft, NULL); /* Miscellany */ MAKE_LABEL(build, 4); /* Everything else at the left margin under the bitmap */ w = left_anchor; left_anchor = NULL; if (line1 == NULL) { line1 = xs_buffer( "Copyright \251 1993-%s, Paul Mattes.\n\ Copyright \251 2004-2005, Don Russell.\n\ Copyright \251 1995, Dick Altenbern.\n\ Copyright \251 1990, Jeff Sparkes.\n\ Copyright \251 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.\n\ All rights reserved.", cyear); } MAKE_SMALL(line1, 4); MAKE_SMALL( "Redistribution and use in source and binary forms, with or without\n\ modification, are permitted provided that the following conditions\n\ are met:", 4); MAKE_SMALL(s1, 4); MAKE_SMALL(s2, 4); /* Add "OK" button at the lower left */ w = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, about_form, XtNfromVert, w, XtNleft, XtChainLeft, XtNbottom, XtChainBottom, NULL); XtAddCallback(w, XtNcallback, saw_about, 0); /* Pop it up */ popup_popup(about_shell, XtGrabExclusive); /* Make gcc happy. */ ignore_vd(vd); ignore_w_prev(w_prev); } /* Called when the "About x3270->Configuration" button is pressed */ void popup_about_config(void) { Widget w = NULL, w_prev = NULL; Widget v = NULL; Widget left_anchor = NULL; int vd = 4; const char *ftype; char *xbuf; /* Create the popup */ about_shell = XtVaCreatePopupShell( "aboutConfigPopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(about_shell, XtNpopupCallback, place_popup, (XtPointer) CenterP); XtAddCallback(about_shell, XtNpopdownCallback, destroy_about, NULL); /* Create a form in the popup */ about_form = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, about_shell, NULL); /* Pretty picture */ left_anchor = XtVaCreateManagedWidget( "icon", labelWidgetClass, about_form, XtNborderWidth, 0, XtNbitmap, x3270_icon, XtNfromVert, w, XtNleft, XtChainLeft, NULL); /* Miscellany */ MAKE_LABEL(build, 4); MAKE_LABEL(get_message("processId"), 4); MAKE_VALUE(lazyaf("%d", getpid())); MAKE_LABEL2(get_message("windowId")); MAKE_VALUE(lazyaf("0x%lx", XtWindow(toplevel))); /* Everything else at the left margin under the bitmap */ w = left_anchor; left_anchor = NULL; MAKE_LABEL(lazyaf("%s %s: %d %s x %d %s, %s, %s", get_message("model"), model_name, maxCOLS, get_message("columns"), maxROWS, get_message("rows"), appres.interactive.mono? get_message("mono"): (appres.m3279? get_message("fullColor"): get_message("pseudoColor")), (appres.extended && !HOST_FLAG(STD_DS_HOST))? get_message("extendedDs"): get_message("standardDs")), 4); MAKE_LABEL(get_message("terminalName"), 4); MAKE_VALUE(termtype); MAKE_LABEL(get_message("emulatorFont"), 4); MAKE_VALUE(full_efontname); if (*standard_font) { ftype = get_message("xFont"); } else { ftype = get_message("cgFont"); } xbuf = xs_buffer(" %s", ftype); MAKE_LABEL(xbuf, 0); XtFree(xbuf); if (dbcs) { MAKE_LABEL(get_message("emulatorFontDbcs"), 4); MAKE_VALUE(full_efontname_dbcs); } MAKE_LABEL(get_message("displayCharacterSet"), 4); if (!efont_matches) { xbuf = xs_buffer("ascii-7 (%s %s, %s %s)", get_message("require"), display_charset(), get_message("have"), efont_charset); MAKE_VALUE(xbuf); XtFree(xbuf); } else { MAKE_VALUE(efont_charset); } if (dbcs) { MAKE_LABEL(get_message("displayCharacterSetDbcs"), 4); MAKE_VALUE(efont_charset_dbcs); } MAKE_LABEL(get_message("charset"), 4); xbuf = xs_buffer("%s (code page %s)", get_charset_name(), get_host_codepage()); MAKE_VALUE(xbuf); XtFree(xbuf); MAKE_LABEL(get_message("sbcsCgcsgid"), 4); xbuf = xs_buffer("GCSGID %u, CPGID %u", (unsigned short)((cgcsgid >> 16) & 0xffff), (unsigned short)(cgcsgid & 0xffff)); MAKE_VALUE(xbuf); XtFree(xbuf); if (dbcs) { MAKE_LABEL(get_message("dbcsCgcsgid"), 4); xbuf = xs_buffer("GCSGID %u, CPGID %u", (unsigned short)((cgcsgid_dbcs >> 16) & 0xffff), (unsigned short)(cgcsgid_dbcs & 0xffff)); MAKE_VALUE(xbuf); XtFree(xbuf); MAKE_LABEL(get_message("inputMethod"), 4); if (xappres.input_method) { MAKE_VALUE(xappres.input_method); } else if (getenv("XMODIFIERS") != NULL) { MAKE_VALUE("(via environment)"); } else { MAKE_VALUE("(unspecified)"); } MAKE_LABEL2(get_message("ximState")); if (xim_error) { ftype = get_message("ximDisabled"); } else if (im == NULL) { ftype = get_message("ximNotFound"); } else { ftype = get_message("ximActive"); } MAKE_VALUE(ftype); MAKE_LABEL2(get_message("ximLocale")); if (locale_name != NULL) { MAKE_VALUE(locale_name); } else { MAKE_VALUE("(error)"); } } MAKE_LABEL(get_message("localeCodeset"), 4); MAKE_VALUE(locale_codeset); if (trans_list != NULL || temp_keymaps != NULL) { struct trans_list *t; varbuf_t r; vb_init(&r); for (t = trans_list; t; t = t->next) { if (vb_len(&r)) { vb_appends(&r, ","); } vb_appends(&r, t->name); } for (t = temp_keymaps; t; t = t->next) { if (vb_len(&r)) { vb_appends(&r, " "); } vb_appends(&r, "+"); vb_appends(&r, t->name); } MAKE_LABEL(get_message("keyboardMap"), 4) MAKE_VALUE(vb_buf(&r)); vb_free(&r); } else { MAKE_LABEL(get_message("defaultKeyboardMap"), 4); } if (appres.interactive.compose_map) { MAKE_LABEL(get_message("composeMap"), 4); MAKE_VALUE(appres.interactive.compose_map); } else { MAKE_LABEL(get_message("noComposeMap"), 4); } if (xappres.active_icon) { MAKE_LABEL(get_message("activeIcon"), 4); xbuf = xs_buffer(" %s", get_message("iconFont")); MAKE_LABEL(xbuf, 0); XtFree(xbuf); MAKE_VALUE(xappres.icon_font); if (xappres.label_icon) { xbuf = xs_buffer(" %s", get_message("iconLabelFont")); MAKE_LABEL(xbuf, 0); XtFree(xbuf); MAKE_VALUE(xappres.icon_label_font); } } else { MAKE_LABEL(get_message("staticIcon"), 4); } /* Add "OK" button at the lower left */ w = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, about_form, XtNfromVert, w, XtNleft, XtChainLeft, XtNbottom, XtChainBottom, NULL); XtAddCallback(w, XtNcallback, saw_about, 0); /* Pop it up */ popup_popup(about_shell, XtGrabExclusive); } /* Called when the "About x3270->Connection Status" button is pressed */ void popup_about_status(void) { Widget w = NULL, w_prev = NULL; Widget v = NULL; Widget left_anchor = NULL; int vd = 4; const char *fbuf; const char *ftype; const char *emode; const char *eopts; const char *ptype; const char *bplu; /* Create the popup */ about_shell = XtVaCreatePopupShell( "aboutStatusPopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(about_shell, XtNpopupCallback, place_popup, (XtPointer) CenterP); XtAddCallback(about_shell, XtNpopdownCallback, destroy_about, NULL); /* Create a form in the popup */ about_form = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, about_shell, NULL); /* Pretty picture */ left_anchor = XtVaCreateManagedWidget( "icon", labelWidgetClass, about_form, XtNborderWidth, 0, XtNbitmap, x3270_icon, XtNfromVert, w, XtNleft, XtChainLeft, NULL); /* Miscellany */ MAKE_LABEL(build, 4); /* Everything else at the left margin under the bitmap */ w = left_anchor; left_anchor = NULL; if (CONNECTED) { MAKE_LABEL(get_message("connectedTo"), 4); #if defined(LOCAL_PROCESS) /*[*/ if (local_process && !strlen(current_host)) { MAKE_VALUE("(shell)"); } else #endif /*]*/ { if (!xappres.suppress_host) { MAKE_VALUE(current_host); } } #if defined(LOCAL_PROCESS) /*[*/ if (!local_process) { #endif /*]*/ MAKE_LABEL2(lazyaf(" %s", get_message("port"))); MAKE_VALUE(lazyaf("%d", current_port)); #if defined(LOCAL_PROCESS) /*[*/ } #endif /*]*/ if (net_secure_connection()) { const char *session, *cert; const char *newline; MAKE_LABEL2(lazyaf("%s%s%s", get_message("secure"), net_secure_unverified()? ", ": "", net_secure_unverified()? get_message("unverified"): "")); MAKE_LABEL(lazyaf("%s %s", get_message("provider"), net_sio_provider()), 2); if ((session = net_session_info()) != NULL) { MAKE_LABEL(get_message("sessionInfo"), 2); while ((newline = strchr(session, '\n')) != NULL) { MAKE_LABEL(lazyaf(" %.*s", (int)(newline - session), session), 0); session = newline + 1; } MAKE_LABEL(lazyaf(" %s", session), 0); } if ((cert = net_server_cert_info()) != NULL) { int line_len; # define CERT_WRAP 80 char *break_indent = ""; MAKE_LABEL(get_message("serverCert"), 2); while ((newline = strchr(cert, '\n')) != NULL) { line_len = (int)(newline - cert); while (line_len > CERT_WRAP) { MAKE_LABEL(lazyaf(" %s%.*s", break_indent, CERT_WRAP, cert), 0); cert += CERT_WRAP; line_len -= CERT_WRAP; break_indent = " "; } MAKE_LABEL(lazyaf(" %s%.*s", break_indent, line_len, cert), 0); cert = newline + 1; break_indent = ""; } line_len = (int)strlen(cert); while (line_len > CERT_WRAP) { MAKE_LABEL(lazyaf(" %s%.*s", break_indent, CERT_WRAP, cert), 0); cert += CERT_WRAP; line_len -= CERT_WRAP; break_indent = " "; } MAKE_LABEL(lazyaf(" %s%s", break_indent, cert), 0); } } ptype = net_proxy_type(); if (ptype) { MAKE_LABEL(get_message("proxyType"), 4); MAKE_VALUE(ptype); MAKE_LABEL2(lazyaf(" %s", get_message("server"))); MAKE_VALUE(net_proxy_host()); MAKE_LABEL2(lazyaf(" %s", get_message("port"))); MAKE_VALUE(net_proxy_port()); } if (IN_E) { emode = "TN3270E "; } else { emode = ""; } if (IN_NVT) { if (linemode) { ftype = get_message("lineMode"); } else { ftype = get_message("charMode"); } fbuf = lazyaf("%s%s, ", emode, ftype); } else if (IN_SSCP) { fbuf = lazyaf("%s%s, ", emode, get_message("sscpMode")); } else if (IN_3270) { fbuf = lazyaf("%s%s, ", emode, get_message("dsMode")); } else if (cstate == CONNECTED_UNBOUND) { fbuf = lazyaf("%s%s, ", emode, get_message("unboundMode")); } else { fbuf = ""; } fbuf = lazyaf("%s%s", fbuf, hms(ns_time)); MAKE_LABEL(fbuf, 0); if (connected_lu != NULL && connected_lu[0]) { MAKE_LABEL(lazyaf(" %s", get_message("luName")), 0); MAKE_VALUE(connected_lu); } bplu = net_query_bind_plu_name(); if (bplu != NULL && bplu[0]) { MAKE_LABEL(lazyaf(" %s", get_message("bindPluName")), 0); MAKE_VALUE(bplu); } eopts = tn3270e_current_opts(); if (eopts != NULL) { MAKE_LABEL(lazyaf(" %s", get_message("tn3270eOpts")), 0); MAKE_VALUE(eopts); } else if (IN_E) { MAKE_LABEL(lazyaf(" %s", get_message("tn3270eNoOpts")), 0); } if (IN_3270) { fbuf = lazyaf("%s %d %s, %d %s\n%s %d %s, %d %s", get_message("sent"), ns_bsent, (ns_bsent == 1)? get_message("byte"): get_message("bytes"), ns_rsent, (ns_rsent == 1)? get_message("record"): get_message("records"), get_message("Received"), ns_brcvd, (ns_brcvd == 1)? get_message("byte"): get_message("bytes"), ns_rrcvd, (ns_rrcvd == 1)? get_message("record"): get_message("records")); } else { fbuf = lazyaf("%s %d %s, %s %d %s", get_message("sent"), ns_bsent, (ns_bsent == 1)? get_message("byte"): get_message("bytes"), get_message("received"), ns_brcvd, (ns_brcvd == 1)? get_message("byte"): get_message("bytes")); } MAKE_LABEL(fbuf, 4); if (IN_NVT) { struct ctl_char *c = linemode_chars(); int i; MAKE_LABEL(get_message("specialCharacters"), 4); for (i = 0; c[i].name; i++) { if (!i || !(i % 4)) { MAKE_LABEL(lazyaf(" %s", c[i].name), 0); } else { MAKE_LABEL2(c[i].name); } MAKE_VALUE(c[i].value); } } } else if (HALF_CONNECTED) { MAKE_LABEL(get_message("connectionPending"), 4); MAKE_VALUE(current_host); } else { MAKE_LABEL(get_message("notConnected"), 4); } /* Add "OK" button at the lower left */ w = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, about_form, XtNfromVert, w, XtNleft, XtChainLeft, XtNbottom, XtChainBottom, NULL); XtAddCallback(w, XtNcallback, saw_about, 0); /* Pop it up */ popup_popup(about_shell, XtGrabExclusive); } #undef MAKE_LABEL #undef MAKE_VALUE suite3270-3.6/x3270/about.h0000664000076500007650000000323513221577164013246 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * about.h * Global declarations for about.c. */ void popup_about_copyright(void); void popup_about_config(void); void popup_about_status(void); suite3270-3.6/x3270/apl.inc0000664000076500007650000002630313221577164013233 0ustar pdmpdmXX_SH(APL Support) XX_FB(x3270) supports the full XX_SM(APL2) character set and the entry of XX_SM(APL) characters from the keyboard. XX_PP XX_SM(APL) characters are supported only in the special XX_FB(3270) font. XX_PP Keyboard entry of XX_SM(APL) characters is supported through the XX_FB(apl) keymap modifier. This modifier defines the "Alt" key as an XX_SM(APL) shift key, with a typical XX_SM(APL) keyboard layout, e.g., "Alt" pressed with the XX_FB(A) key results in the XX_SM(APL) "alpha" symbol. Overstruck characters such as "quad-quote" are not defined as single keystrokes; instead they are entered as composites (see XX_LINK(#Composite-Characters,XX_SM(COMPOSITE CHARACTERS)) above). A special composite map, XX_FB(apl), is provided for this purpose. XX_PP XX_FB(Note:) Some keyboards do not define the "Alt" key as a modifier, so keymaps that use the "Alt" key will not function. On a Sun for example, this can be remedied with the command: XX_IP XX_RS(xmodmap XX_DASH()e "add mod2 = Alt_L") XX_PP For convenience, an XX_FB(XX_DASHED(apl)) option is defined, which is an abbreviation for the following resource definitions: XX_RS(x3270.keymap: `XX_FI(your_keymap_name),apl' XX_BR x3270.charset: apl XX_BR x3270.composeMap: apl XX_BR) XX_PP There are a number of XX_SM(APL) characters that are similar in appearance to non-XX_SM(APL) characters. In particular, the XX_SM(APL) "stile", "slope," "tilde" and "quotedot" characters are similar to the XX_SM(EBCDIC) "bar", "backslash," "tilde" and "exclaim" characters. The XX_SM(APL) characters are entered with the "Alt" key, and have slightly different appearances. XX_PP The complete list of special XX_SM(APL) keysyms is as follows. Entries marked with an asterisk (*) represent simple aliases for standard XX_SM(EBCDIC) characters. Entries marked with an (S) represent Sharp APL charatcers. XX_PP XX_TS(5,l c l l l.) XX_TR(XX_TD(APL Symbol) XX_TD(Hex) XX_TD(x3270 XX_FI(apl_) Keysym ) XX_TD(x3270 Key) XX_TD(x3270 Composed Keys)) XX_T_() XX_TR(XX_TD(A underbar) XX_TD(41) XX_TD(Aunderbar) XX_TD(Alt-A) XX_TD(A + underbar)) XX_TR(XX_TD(alpha) XX_TD(B0) XX_TD(alpha) XX_TD(Alt-a) XX_TD(XX_NBSP)) XX_TR(XX_TD(B underbar) XX_TD(42) XX_TD(Bunderbar) XX_TD(Alt-B) XX_TD(B + underbar)) XX_TR(XX_TD(bar) XX_TD(60*) XX_TD(bar) XX_TD(-) XX_TD(XX_NBSP)) XX_TR(XX_TD(brace left) XX_TD(C0) XX_TD(braceleft) XX_TD(Alt-{) XX_TD(XX_NBSP)) XX_TR(XX_TD(brace right) XX_TD(D0) XX_TD(braceright) XX_TD(Alt-}) XX_TD(XX_NBSP)) XX_TR(XX_TD(C underbar) XX_TD(43) XX_TD(Cunderbar) XX_TD(Alt-C) XX_TD(C + underbar)) XX_TR(XX_TD(circle) XX_TD(9D) XX_TD(circle) XX_TD(Alt-o) XX_TD(XX_NBSP)) XX_TR(XX_TD(circle bar) XX_TD(ED) XX_TD(circlebar) XX_TD(XX_NBSP) XX_TD(circle + bar)) XX_TR(XX_TD(circle slope) XX_TD(CF) XX_TD(circleslope) XX_TD(XX_NBSP) XX_TD(circle + slope)) XX_TR(XX_TD(circle star) XX_TD(FD) XX_TD(circlestar) XX_TD(XX_NBSP) XX_TD(circle + star)) XX_TR(XX_TD(circle stile) XX_TD(CD) XX_TD(circlestile) XX_TD(XX_NBSP) XX_TD(circle + stile)) XX_TR(XX_TD(colon) XX_TD(7A*) XX_TD(colon) XX_TD(:) XX_TD(XX_NBSP)) XX_TR(XX_TD(comma) XX_TD(6B*) XX_TD(comma) `XX_TD(`,')' XX_TD(XX_NBSP)) XX_TR(XX_TD(comma bar (S)) XX_TD(E5) XX_TD(commabar) XX_TD(XX_NBSP) XX_TD(comma + bar)) XX_TR(XX_TD(D underbar) XX_TD(44) XX_TD(Dunderbar) XX_TD(Alt-D) XX_TD(D + underbar)) XX_TR(XX_TD(del) XX_TD(BA) XX_TD(del) XX_TD(Alt-g) XX_TD(XX_NBSP)) XX_TR(XX_TD(del stile) XX_TD(DC) XX_TD(delstile) XX_TD(XX_NBSP) XX_TD(del + stile)) XX_TR(XX_TD(del tilde) XX_TD(FB) XX_TD(deltilde) XX_TD(XX_NBSP) XX_TD(del + tilde)) XX_TR(XX_TD(delta) XX_TD(BB) XX_TD(delta) XX_TD(Alt-h) XX_TD(XX_NBSP)) XX_TR(XX_TD(delta stile) XX_TD(DD) XX_TD(deltastile) XX_TD(XX_NBSP) XX_TD(delta + stile)) XX_TR(XX_TD(delta underbar) XX_TD(FC) XX_TD(deltaunderbar) XX_TD(XX_NBSP) XX_TD(delta + underbar)) XX_TR(XX_TD(diamond) XX_TD(70) XX_TD(diamond) XX_TD(XX_NBSP) XX_TD(up caret + down caret)) XX_TR(XX_TD(dieresis) XX_TD(72) XX_TD(dieresis) XX_TD(Alt-1) XX_TD(XX_NBSP)) XX_TR(XX_TD(dieresis circle (S)) XX_TD(E5) XX_TD(XX_HY(dieresis,circle)) XX_TD(XX_NBSP) XX_TD(dieresis + circle)) XX_TR(XX_TD(dieresis dot) XX_TD(EC) XX_TD(dieresisdot) XX_TD(XX_NBSP) XX_TD(dieresis + dot)) XX_TR(XX_TD(dieresis jot (S)) XX_TD(E4) XX_TD(dieresisjot) XX_TD(XX_NBSP) XX_TD(dieresis + jot)) XX_TR(XX_TD(divide) XX_TD(B8) XX_TD(divide) XX_TD(Alt-+) XX_TD(XX_NBSP)) XX_TR(XX_TD(dot) XX_TD(4B*) XX_TD(dot) XX_TD(.) XX_TD(XX_NBSP)) XX_TR(XX_TD(down arrow) XX_TD(8B) XX_TD(downarrow) XX_TD(Alt-u) XX_TD(XX_NBSP)) XX_TR(XX_TD(down caret) XX_TD(78) XX_TD(downcaret) XX_TD(Alt-9) XX_TD(XX_NBSP)) XX_TR(XX_TD(down caret tilde) XX_TD(CB) XX_TD(XX_HY(downcaret,tilde)) XX_TD(XX_NBSP) XX_TD(down caret + tilde)) XX_TR(XX_TD(down shoe) XX_TD(AB) XX_TD(downshoe) XX_TD(Alt-v) XX_TD(XX_NBSP)) XX_TR(XX_TD(down stile) XX_TD(8E) XX_TD(downstile) XX_TD(Alt-d) XX_TD(XX_NBSP)) XX_TR(XX_TD(down tack) XX_TD(AC) XX_TD(downtack) XX_TD(Alt-b) XX_TD(XX_NBSP)) XX_TR(XX_TD(down tack jot) XX_TD(FE) XX_TD(downtackjot) XX_TD(XX_NBSP) XX_TD(down tack + jot)) XX_TR(XX_TD(down tack up tack) XX_TD(DA) XX_TD(XX_HY(downtack,uptack)) XX_TD(XX_NBSP) XX_TD(down tack + up tack)) XX_TR(XX_TD(E underbar) XX_TD(45) XX_TD(Eunderbar) XX_TD(Alt-E) XX_TD(E + underbar)) XX_TR(XX_TD(epsilon) XX_TD(B1) XX_TD(epsilon) XX_TD(Alt-e) XX_TD(XX_NBSP)) XX_TR(XX_TD(epsilon underbar) XX_TD(75) XX_TD(XX_HY(epsilon,underbar)) XX_TD(XX_NBSP) XX_TD(epsilon + underbar)) XX_TR(XX_TD(equal) XX_TD(7E*) XX_TD(equal) XX_TD("=") XX_TD(XX_NBSP)) XX_TR(XX_TD(equal underbar) XX_TD(E1) XX_TD(equalunderbar) XX_TD(XX_NBSP) XX_TD(equal + underbar)) XX_TR(XX_TD(euro (S)) XX_TD(E7) XX_TD(euro) XX_TD(XX_NBSP) XX_TD(C + =)) XX_TR(XX_TD(F underbar) XX_TD(46) XX_TD(Funderbar) XX_TD(Alt-F) XX_TD(F + underbar)) XX_TR(XX_TD(G underbar) XX_TD(47) XX_TD(Gunderbar) XX_TD(Alt-G) XX_TD(G + underbar)) XX_TR(XX_TD(greater) XX_TD(6E*) XX_TD(greater) XX_TD(>) XX_TD(XX_NBSP)) XX_TR(XX_TD(H underbar) XX_TD(48) XX_TD(Hunderbar) XX_TD(Alt-H) XX_TD(H + underbar)) XX_TR(XX_TD(I underbar) XX_TD(49) XX_TD(Iunderbar) XX_TD(Alt-I) XX_TD(I + underbar)) XX_TR(XX_TD(iota) XX_TD(B2) XX_TD(iota) XX_TD(Alt-i) XX_TD(XX_NBSP)) XX_TR(XX_TD(iota underbar) XX_TD(74) XX_TD(iotaunderbar) XX_TD(XX_NBSP) XX_TD(iota + underbar)) XX_TR(XX_TD(J underbar) XX_TD(51) XX_TD(Junderbar) XX_TD(Alt-J) XX_TD(J + underbar)) XX_TR(XX_TD(jot) XX_TD(AF) XX_TD(jot) XX_TD(alt-j) XX_TD(XX_NBSP)) XX_TR(XX_TD(K underbar) XX_TD(52) XX_TD(Kunderbar) XX_TD(Alt-K) XX_TD(K + underbar)) XX_TR(XX_TD(L underbar) XX_TD(53) XX_TD(Lunderbar) XX_TD(Alt-L) XX_TD(L + underbar)) XX_TR(XX_TD(left arrow) XX_TD(9F) XX_TD(leftarrow) XX_TD(Alt-[) XX_TD(XX_NBSP)) XX_TR(XX_TD(left bracket) XX_TD(AD) XX_TD(leftbracket) XX_TD([) XX_TD(XX_NBSP)) XX_TR(XX_TD(left paren) XX_TD(4D*) XX_TD(leftparen) `XX_TD(`(')' XX_TD(XX_NBSP)) XX_TR(XX_TD(left shoe) XX_TD(9B) XX_TD(leftshoe) XX_TD(Alt-z) XX_TD(XX_NBSP)) XX_TR(XX_TD(less) XX_TD(4C*) XX_TD(less) XX_TD(XX_LT) XX_TD(XX_NBSP)) XX_TR(XX_TD(M underbar) XX_TD(54) XX_TD(Munderbar) XX_TD(Alt-M) XX_TD(M + underbar)) XX_TR(XX_TD(N underbar) XX_TD(55) XX_TD(Nunderbar) XX_TD(Alt-N) XX_TD(N + underbar)) XX_TR(XX_TD(not equal) XX_TD(BE) XX_TD(notequal) XX_TD(Alt-8) XX_TD(equal + slash)) XX_TR(XX_TD(not greater) XX_TD(8C) XX_TD(notgreater) XX_TD(Alt-4) XX_TD(less + equal)) XX_TR(XX_TD(not less) XX_TD(AE) XX_TD(notless) XX_TD(Alt-6) XX_TD(greater + equal)) XX_TR(XX_TD(O underbar) XX_TD(56) XX_TD(Ounderbar) XX_TD(Alt-O) XX_TD(O + underbar)) XX_TR(XX_TD(omega) XX_TD(B4) XX_TD(omega) XX_TD(Alt-w) XX_TD(XX_NBSP)) XX_TR(XX_TD(overbar) XX_TD(A0) XX_TD(overbar) XX_TD(Alt-2) XX_TD(XX_NBSP)) XX_TR(XX_TD(P underbar) XX_TD(57) XX_TD(Punderbar) XX_TD(Alt-P) XX_TD(P + underbar)) XX_TR(XX_TD(plus) XX_TD(4E*) XX_TD(plus) XX_TD(+) XX_TD(XX_NBSP)) XX_TR(XX_TD(Q underbar) XX_TD(58) XX_TD(Qunderbar) XX_TD(Alt-Q) XX_TD(Q + underbar)) XX_TR(XX_TD(quad) XX_TD(90) XX_TD(quad) XX_TD(Alt-l) XX_TD(XX_NBSP)) XX_TR(XX_TD(quad divide) XX_TD(EE) XX_TD(quaddivide) XX_TD(XX_NBSP) XX_TD(quad + divide)) XX_TR(XX_TD(quad jot) XX_TD(73) XX_TD(quadjot) XX_TD(XX_NBSP) XX_TD(quad + jot)) XX_TR(XX_TD(quad quote) XX_TD(DE) XX_TD(quadquote) XX_TD(XX_NBSP) XX_TD(quad + quote)) XX_TR(XX_TD(quad slope) XX_TD(CE) XX_TD(quadslope) XX_TD(XX_NBSP) XX_TD(quad + slope)) XX_TR(XX_TD(query) XX_TD(6F*) XX_TD(query) XX_TD(?) XX_TD(XX_NBSP)) XX_TR(XX_TD(quote) XX_TD(7D*) XX_TD(quote) XX_TD(') XX_TD(XX_NBSP)) XX_TR(XX_TD(quote dot) XX_TD(DB) XX_TD(quotedot) XX_TD(XX_NBSP) XX_TD(quote + dot)) XX_TR(XX_TD(R underbar) XX_TD(59) XX_TD(Runderbar) XX_TD(Alt-R) XX_TD(R + underbar)) XX_TR(XX_TD(rho) XX_TD(B3) XX_TD(rho) XX_TD(Alt-r) XX_TD(XX_NBSP)) XX_TR(XX_TD(right arrow) XX_TD(8F) XX_TD(rightarrow) XX_TD(Alt-]) XX_TD(XX_NBSP)) XX_TR(XX_TD(right bracket) XX_TD(BD) XX_TD(rightbracket) XX_TD(]) XX_TD(XX_NBSP)) XX_TR(XX_TD(right paren) XX_TD(5D*) XX_TD(rightparen) `XX_TD(`)')' XX_TD(XX_NBSP)) XX_TR(XX_TD(right shoe) XX_TD(9A) XX_TD(rightshoe) XX_TD(Alt-x) XX_TD(XX_NBSP)) XX_TR(XX_TD(S underbar) XX_TD(62) XX_TD(Sunderbar) XX_TD(Alt-S) XX_TD(S + underbar)) XX_TR(XX_TD(semicolon) XX_TD(5E*) XX_TD(semicolon) XX_TD(;) XX_TD(XX_NBSP)) XX_TR(XX_TD(slash) XX_TD(61*) XX_TD(slash) XX_TD(/) XX_TD(XX_NBSP)) XX_TR(XX_TD(slash bar) XX_TD(EA) XX_TD(slashbar) XX_TD(XX_NBSP) XX_TD(slash + bar)) XX_TR(XX_TD(slope) XX_TD(B7) XX_TD(slope) XX_TD(Alt-XX_BS) XX_TD(XX_NBSP)) XX_TR(XX_TD(slope bar) XX_TD(EB) XX_TD(slopebar) XX_TD(XX_NBSP) XX_TD(slope + bar)) XX_TR(XX_TD(squad) XX_TD(CC) XX_TD(squad) XX_TD(XX_NBSP) XX_TD(quad + quad)) XX_TR(XX_TD(star) XX_TD(5C*) XX_TD(star) XX_TD(*) XX_TD(XX_NBSP)) XX_TR(XX_TD(stile) XX_TD(BF) XX_TD(stile) XX_TD(Alt-|) XX_TD(XX_NBSP)) XX_TR(XX_TD(T underbar) XX_TD(63) XX_TD(Tunderbar) XX_TD(Alt-T) XX_TD(T + underbar)) XX_TR(XX_TD(tilde) XX_TD(80) XX_TD(tilde) XX_TD(Alt-~) XX_TD(XX_NBSP)) XX_TR(XX_TD(times) XX_TD(B6) XX_TD(times) XX_TD(Alt-=) XX_TD(XX_NBSP)) XX_TR(XX_TD(U underbar) XX_TD(64) XX_TD(Uunderbar) XX_TD(Alt-U) XX_TD(U + underbar)) XX_TR(XX_TD(underbar) XX_TD(6D*) XX_TD(underbar) XX_TD("_") XX_TD(XX_NBSP)) XX_TR(XX_TD(up arrow) XX_TD(8A) XX_TD(uparrow) XX_TD(Alt-y) XX_TD(XX_NBSP)) XX_TR(XX_TD(up caret) XX_TD(71) XX_TD(upcaret) XX_TD(Alt-0) XX_TD(XX_NBSP)) XX_TR(XX_TD(up caret tilde) XX_TD(CA) XX_TD(upcarettilde) XX_TD(XX_NBSP) XX_TD(up caret + tilde)) XX_TR(XX_TD(up shoe) XX_TD(AA) XX_TD(upshoe) XX_TD(Alt-c) XX_TD(XX_NBSP)) XX_TR(XX_TD(up shoe jot) XX_TD(DF) XX_TD(upshoejot) XX_TD(XX_NBSP) XX_TD(up shoe + jot)) XX_TR(XX_TD(up stile) XX_TD(8D) XX_TD(upstile) XX_TD(Alt-s) XX_TD(XX_NBSP)) XX_TR(XX_TD(up tack) XX_TD(BC) XX_TD(uptack) XX_TD(Alt-n) XX_TD(XX_NBSP)) XX_TR(XX_TD(up tack jot) XX_TD(EF) XX_TD(uptackjot) XX_TD(XX_NBSP) XX_TD(up tack + jot)) XX_TR(XX_TD(V underbar) XX_TD(65) XX_TD(Vunderbar) XX_TD(Alt-V) XX_TD(V + underbar)) XX_TR(XX_TD(W underbar) XX_TD(66) XX_TD(Wunderbar) XX_TD(Alt-W) XX_TD(W + underbar)) XX_TR(XX_TD(X underbar) XX_TD(67) XX_TD(Xunderbar) XX_TD(Alt-X) XX_TD(X + underbar)) XX_TR(XX_TD(Y underbar) XX_TD(68) XX_TD(Yunderbar) XX_TD(Alt-Y) XX_TD(Y + underbar)) XX_TR(XX_TD(Z underbar) XX_TD(69) XX_TD(Zunderbar) XX_TD(Alt-Z) XX_TD(Z + underbar)) XX_TE() XX_SH(XIM Support) When compiled with DBCS support, XX_FB(x3270) supports multi-byte input methods via the XIM protocol. XX_LP The input method is selected by the XMODIFIERS environment variable or the XX_FB(XX_DASHED(im)) command-line option. XX_LP The preedit type is specified by the XX_FB(XX_DASHED(pt)) command-line option, with a default of XX_FB(OverTheSpot+1). suite3270-3.6/x3270/arrow.bm0000664000076500007650000000032413221577164013431 0ustar pdmpdm#define arrow_width 10 #define arrow_height 10 static unsigned char arrow_bits[] = { 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x3e, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0xfd, 0x00, 0x3e, 0x00, 0x0d, 0x00, 0x02, 0x00}; suite3270-3.6/x3270/cg.h0000664000076500007650000001735113221577164012531 0ustar pdmpdm/* * Copyright (c) 1993-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * cg.h * * Character encoding for the 3270 character generator font, * using the same suffixes as Latin-1 XK_xxx keysyms. * * Charaters that represent unique EBCDIC or status line codes * are noted with comments. */ #define CG_null 0x00 /* EBCDIC 00 */ #define CG_nobreakspace 0x01 #define CG_ff 0x02 /* EBCDIC 0C */ #define CG_cr 0x03 /* EBCDIC 0D */ #define CG_nl 0x04 /* EBCDIC 15 */ #define CG_em 0x05 /* EBCDIC 19 */ #define CG_eightones 0x06 /* EBCDIC FF */ #define CG_hyphen 0x07 #define CG_greater 0x08 #define CG_less 0x09 #define CG_bracketleft 0x0a #define CG_bracketright 0x0b #define CG_parenleft 0x0c #define CG_parenright 0x0d #define CG_braceleft 0x0e #define CG_braceright 0x0f #define CG_space 0x10 #define CG_equal 0x11 #define CG_apostrophe 0x12 #define CG_quotedbl 0x13 #define CG_slash 0x14 #define CG_backslash 0x15 #define CG_bar 0x16 #define CG_brokenbar 0x17 #define CG_question 0x18 #define CG_exclam 0x19 #define CG_dollar 0x1a #define CG_cent 0x1b #define CG_sterling 0x1c #define CG_yen 0x1d #define CG_paragraph 0x1e #define CG_currency 0x1f #define CG_0 0x20 #define CG_1 0x21 #define CG_2 0x22 #define CG_3 0x23 #define CG_4 0x24 #define CG_5 0x25 #define CG_6 0x26 #define CG_7 0x27 #define CG_8 0x28 #define CG_9 0x29 #define CG_ssharp 0x2a #define CG_section 0x2b #define CG_numbersign 0x2c #define CG_at 0x2d #define CG_percent 0x2e #define CG_underscore 0x2f #define CG_ampersand 0x30 #define CG_minus 0x31 #define CG_period 0x32 #define CG_comma 0x33 #define CG_colon 0x34 #define CG_plus 0x35 #define CG_notsign 0x36 #define CG_macron 0x37 #define CG_degree 0x38 #define CG_periodcentered 0x39 #define CG_asciicircum 0x3a #define CG_asciitilde 0x3b #define CG_diaeresis 0x3c #define CG_grave 0x3d #define CG_acute 0x3e #define CG_cedilla 0x3f #define CG_agrave 0x40 #define CG_egrave 0x41 #define CG_igrave 0x42 #define CG_ograve 0x43 #define CG_ugrave 0x44 #define CG_atilde 0x45 #define CG_otilde 0x46 #define CG_ydiaeresis 0x47 #define CG_Yacute 0x48 #define CG_yacute 0x49 #define CG_eacute 0x4a #define CG_onequarter 0x4b #define CG_onehalf 0x4c #define CG_threequarters 0x4d #define CG_udiaeresis 0x4e #define CG_udiaeresis 0x4e #define CG_ccedilla 0x4f #define CG_adiaeresis 0x50 #define CG_ediaeresis 0x51 #define CG_idiaeresis 0x52 #define CG_odiaeresis 0x53 #define CG_mu 0x54 #define CG_acircumflex 0x55 #define CG_ecircumflex 0x56 #define CG_icircumflex 0x57 #define CG_ocircumflex 0x58 #define CG_ucircumflex 0x59 #define CG_aacute 0x5a #define CG_multiply 0x5b #define CG_iacute 0x5c #define CG_oacute 0x5d #define CG_uacute 0x5e #define CG_ntilde 0x5f #define CG_Agrave 0x60 #define CG_Egrave 0x61 #define CG_Igrave 0x62 #define CG_Ograve 0x63 #define CG_Ugrave 0x64 #define CG_Atilde 0x65 #define CG_Otilde 0x66 #define CG_onesuperior 0x67 #define CG_twosuperior 0x68 #define CG_threesuperior 0x69 #define CG_ordfeminine 0x6a #define CG_masculine 0x6b #define CG_guillemotleft 0x6c #define CG_guillemotright 0x6d #define CG_exclamdown 0x6e #define CG_questiondown 0x6f #define CG_Adiaeresis 0x70 #define CG_Ediaeresis 0x71 #define CG_Idiaeresis 0x72 #define CG_Odiaeresis 0x73 #define CG_Udiaeresis 0x74 #define CG_Acircumflex 0x75 #define CG_Ecircumflex 0x76 #define CG_Icircumflex 0x77 #define CG_Ocircumflex 0x78 #define CG_Ucircumflex 0x79 #define CG_Aacute 0x7a #define CG_Eacute 0x7b #define CG_Iacute 0x7c #define CG_Oacute 0x7d #define CG_Uacute 0x7e #define CG_Ntilde 0x7f #define CG_a 0x80 #define CG_b 0x81 #define CG_c 0x82 #define CG_d 0x83 #define CG_e 0x84 #define CG_f 0x85 #define CG_g 0x86 #define CG_h 0x87 #define CG_i 0x88 #define CG_j 0x89 #define CG_k 0x8a #define CG_l 0x8b #define CG_m 0x8c #define CG_n 0x8d #define CG_o 0x8e #define CG_p 0x8f #define CG_q 0x90 #define CG_r 0x91 #define CG_s 0x92 #define CG_t 0x93 #define CG_u 0x94 #define CG_v 0x95 #define CG_w 0x96 #define CG_x 0x97 #define CG_y 0x98 #define CG_z 0x99 #define CG_ae 0x9a #define CG_oslash 0x9b #define CG_aring 0x9c #define CG_division 0x9d #define CG_fm 0x9e /* EBCDIC 1E */ #define CG_dup 0x9f /* EBCDIC 1C */ #define CG_A 0xa0 #define CG_B 0xa1 #define CG_C 0xa2 #define CG_D 0xa3 #define CG_E 0xa4 #define CG_F 0xa5 #define CG_G 0xa6 #define CG_H 0xa7 #define CG_I 0xa8 #define CG_J 0xa9 #define CG_K 0xaa #define CG_L 0xab #define CG_M 0xac #define CG_N 0xad #define CG_O 0xae #define CG_P 0xaf #define CG_Q 0xb0 #define CG_R 0xb1 #define CG_S 0xb2 #define CG_T 0xb3 #define CG_U 0xb4 #define CG_V 0xb5 #define CG_W 0xb6 #define CG_X 0xb7 #define CG_Y 0xb8 #define CG_Z 0xb9 #define CG_AE 0xba #define CG_Ooblique 0xbb #define CG_Aring 0xbc #define CG_Ccedilla 0xbd #define CG_semicolon 0xbe #define CG_asterisk 0xbf /* codes 0xc0 through 0xcf are for field attributes */ #define CG_copyright 0xd0 #define CG_registered 0xd1 #define CG_boxA 0xd2 /* status boxed A */ #define CG_insert 0xd3 /* status insert mode indicator */ #define CG_boxB 0xd4 /* status boxed B */ #define CG_box6 0xd5 /* status boxed 6 */ #define CG_plusminus 0xd6 #define CG_ETH 0xd7 #define CG_rightarrow 0xd8 #define CG_THORN 0xd9 #define CG_upshift 0xda /* status upshift indicator */ #define CG_human 0xdb /* status illegal position indicator */ #define CG_underB 0xdc /* status underlined B */ #define CG_downshift 0xdd /* status downshift indicator */ #define CG_boxquestion 0xde /* status boxed question mark */ #define CG_boxsolid 0xdf /* status solid block */ /* codes 0xe0 through 0xef are for field attributes */ #define CG_badcommhi 0xf0 /* status bad communication indicator */ #define CG_commhi 0xf1 /* status communication indicator */ #define CG_commjag 0xf2 /* status communication indicator */ #define CG_commlo 0xf3 /* status communication indicator */ #define CG_clockleft 0xf4 /* status wait symbol */ #define CG_clockright 0xf5 /* status wait symbol */ #define CG_lock 0xf6 /* status keyboard lock X symbol */ #define CG_eth 0xf7 #define CG_leftarrow 0xf8 #define CG_thorn 0xf9 #define CG_keyleft 0xfa /* status key lock indicator */ #define CG_keyright 0xfb /* status key lock indicator */ #define CG_box4 0xfc /* status boxed 4 */ #define CG_underA 0xfd /* status underlined A */ #define CG_magcard 0xfe /* status magnetic card indicator */ #define CG_boxhuman 0xff /* status boxed position indicator */ suite3270-3.6/x3270/CmeBSB.c0000664000076500007650000006246213221577164013171 0ustar pdmpdm/* (from) $XConsortium: SmeBSB.c,v 1.16 91/03/15 15:59:41 gildea Exp $ */ /* * Copyright (c) 1995-2009, 2013-2014, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * CmeBSB.c - Source code file for BSB Menu Entry object. * (from) SmeBSB.c - Source code file for BSB Menu Entry object. * * Date: September 26, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #include "globals.h" #include #include #include #include #include #include "CmplxMenu.h" #include "CmeBSBP.h" #include #include #include #define ONE_HUNDRED 100 #define offset(field) XtOffsetOf(CmeBSBRec, cme_bsb.field) static XtResource resources[] = { {XtNlabel, XtCLabel, XtRString, sizeof(String), offset(label), XtRString, NULL}, {XtNvertSpace, XtCVertSpace, XtRInt, sizeof(int), offset(vert_space), XtRImmediate, (XtPointer) 25}, {XtNleftBitmap, XtCLeftBitmap, XtRBitmap, sizeof(Pixmap), offset(left_bitmap), XtRImmediate, (XtPointer)None}, {XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify), offset(justify), XtRImmediate, (XtPointer) XtJustifyLeft}, {XtNmenuName, XtCMenuName, XtRString, sizeof(String), offset(menu_name), XtRString, NULL}, {XtNrightBitmap, XtCRightBitmap, XtRBitmap, sizeof(Pixmap), offset(right_bitmap), XtRImmediate, (XtPointer)None}, {XtNleftMargin, XtCHorizontalMargins, XtRDimension, sizeof(Dimension), offset(left_margin), XtRImmediate, (XtPointer) 4}, {XtNrightMargin, XtCHorizontalMargins, XtRDimension, sizeof(Dimension), offset(right_margin), XtRImmediate, (XtPointer) 4}, {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(foreground), XtRString, XtDefaultForeground}, {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), offset(font), XtRString, XtDefaultFont}, }; #undef offset /* * Semi Public function definitions. */ static void FlipColors(Widget); static void Initialize(Widget, Widget); static void Destroy(Widget); static void Redisplay(Widget, XEvent *, Region); static void FlipOn(Widget); static void FlipOff(Widget); static void PopupMenu(Widget); static void ClassInitialize(void); static Boolean SetValues(Widget, Widget, Widget); static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *, XtWidgetGeometry *); /* * Private Function Definitions. */ static void GetDefaultSize(Widget, Dimension *, Dimension *); static void DrawBitmaps(Widget, GC); static void GetBitmapInfo(Widget, Boolean); static void CreateGCs(Widget); static void DestroyGCs(Widget); #define superclass (&cmeClassRec) CmeBSBClassRec cmeBSBClassRec = { { /* superclass */ (WidgetClass) superclass, /* class_name */ "CmeBSB", /* size */ sizeof(CmeBSBRec), /* class_initializer */ ClassInitialize, /* class_part_initialize*/ NULL, /* Class init'ed */ FALSE, /* initialize */ (XtInitProc)Initialize, /* initialize_hook */ NULL, /* realize */ NULL, /* actions */ NULL, /* num_actions */ ZERO, /* resources */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ FALSE, /* compress_exposure */ FALSE, /* compress_enterleave*/ FALSE, /* visible_interest */ FALSE, /* destroy */ Destroy, /* resize */ NULL, /* expose */ Redisplay, /* set_values */ (XtSetValuesFunc)SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* intrinsics version */ XtVersion, /* callback offsets */ NULL, /* tm_table */ NULL, /* query_geometry */ QueryGeometry, /* display_accelerator*/ NULL, /* extension */ NULL },{ /* Menu Entry Fields */ /* highlight */ FlipOn, /* unhighlight */ FlipOff, /* notify */ XtInheritNotify, /* extension */ NULL }, { /* BSB Menu entry Fields */ /* extension */ NULL } }; WidgetClass cmeBSBObjectClass = (WidgetClass) &cmeBSBClassRec; /************************************************************ * * Semi-Public Functions. * ************************************************************/ /* Function Name: ClassInitialize * Description: Initializes the CmeBSBObject. * Arguments: none. * Returns: none. */ static void ClassInitialize(void) { XawInitializeWidgetSet(); XtAddConverter( XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0 ); } /* Function Name: Initialize * Description: Initializes the complex menu widget * Arguments: request - the widget requested by the argument list. * new - the new widget with both resource and non * resource values. * Returns: none. */ static void Initialize(Widget request _is_unused, Widget new) { CmeBSBObject entry = (CmeBSBObject) new; if (entry->cme_bsb.label == NULL) entry->cme_bsb.label = XtName(new); else entry->cme_bsb.label = XtNewString( entry->cme_bsb.label ); GetDefaultSize(new, &(entry->rectangle.width), &(entry->rectangle.height)); CreateGCs(new); entry->cme_bsb.left_bitmap_width = entry->cme_bsb.left_bitmap_height = 0; entry->cme_bsb.right_bitmap_width = entry->cme_bsb.right_bitmap_height = 0; GetBitmapInfo(new, TRUE); /* Left Bitmap Info */ GetBitmapInfo(new, FALSE); /* Right Bitmap Info */ entry->cme_bsb.ticking = False; } /* Function Name: Destroy * Description: Called at destroy time, cleans up. * Arguments: w - the complex menu widget. * Returns: none. */ static void Destroy(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; DestroyGCs(w); if (entry->cme_bsb.label != XtName(w)) XtFree(entry->cme_bsb.label); if (entry->cme_bsb.ticking) XtRemoveTimeOut(entry->cme_bsb.id); } /* Function Name: Redisplay * Description: Redisplays the contents of the widget. * Arguments: w - the complex menu widget. * event - the X event that caused this redisplay. * region - the region the needs to be repainted. * Returns: none. */ static void Redisplay(Widget w, XEvent *event _is_unused, Region region _is_unused) { GC gc; CmeBSBObject entry = (CmeBSBObject) w; int font_ascent, font_descent, y_loc; entry->cme_bsb.set_values_area_cleared = FALSE; font_ascent = entry->cme_bsb.font->max_bounds.ascent; font_descent = entry->cme_bsb.font->max_bounds.descent; y_loc = entry->rectangle.y; if (XtIsSensitive(w) && XtIsSensitive( XtParent(w) ) ) { if ( w == XawComplexMenuGetActiveEntry(XtParent(w)) ) { XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w), entry->cme_bsb.norm_gc, 0, y_loc, (unsigned int) entry->rectangle.width, (unsigned int) entry->rectangle.height); gc = entry->cme_bsb.rev_gc; } else gc = entry->cme_bsb.norm_gc; } else gc = entry->cme_bsb.norm_gray_gc; if (entry->cme_bsb.label != NULL) { int x_loc = entry->cme_bsb.left_margin; int len = strlen(entry->cme_bsb.label); char * label = entry->cme_bsb.label; switch(entry->cme_bsb.justify) { int width, t_width; case XtJustifyCenter: t_width = XTextWidth(entry->cme_bsb.font, label, len); width = entry->rectangle.width - (entry->cme_bsb.left_margin + entry->cme_bsb.right_margin); x_loc += (width - t_width)/2; break; case XtJustifyRight: t_width = XTextWidth(entry->cme_bsb.font, label, len); x_loc = entry->rectangle.width - (entry->cme_bsb.right_margin + t_width); break; case XtJustifyLeft: default: break; } y_loc += ((int)entry->rectangle.height - (font_ascent + font_descent)) / 2 + font_ascent; XDrawString(XtDisplayOfObject(w), XtWindowOfObject(w), gc, x_loc, y_loc, label, len); } DrawBitmaps(w, gc); } /* Function Name: SetValues * Description: Relayout the menu when one of the resources is changed. * Arguments: current - current state of the widget. * request - what was requested. * new - what the widget will become. * Returns: none */ static Boolean SetValues(Widget current, Widget request _is_unused, Widget new) { CmeBSBObject entry = (CmeBSBObject) new; CmeBSBObject old_entry = (CmeBSBObject) current; Boolean ret_val = FALSE; if (old_entry->cme_bsb.label != entry->cme_bsb.label) { if (old_entry->cme_bsb.label != XtName( new ) ) XtFree( (char *) old_entry->cme_bsb.label ); if (entry->cme_bsb.label != XtName(new) ) entry->cme_bsb.label = XtNewString( entry->cme_bsb.label ); ret_val = True; } if (entry->rectangle.sensitive != old_entry->rectangle.sensitive ) ret_val = TRUE; if (entry->cme_bsb.left_bitmap != old_entry->cme_bsb.left_bitmap) { GetBitmapInfo(new, TRUE); ret_val = TRUE; } if (entry->cme_bsb.right_bitmap != old_entry->cme_bsb.right_bitmap) { GetBitmapInfo(new, FALSE); ret_val = TRUE; } if ( (old_entry->cme_bsb.font != entry->cme_bsb.font) || (old_entry->cme_bsb.foreground != entry->cme_bsb.foreground) ) { DestroyGCs(current); CreateGCs(new); ret_val = TRUE; } if (ret_val) { GetDefaultSize(new, &(entry->rectangle.width), &(entry->rectangle.height)); entry->cme_bsb.set_values_area_cleared = TRUE; } return(ret_val); } /* Function Name: QueryGeometry. * Description: Returns the preferred geometry for this widget. * Arguments: w - the menu entry object. * itended, return_val - the intended and return geometry info. * Returns: A Geometry Result. * * See the Intrinsics manual for details on what this function is for. * * I just return the height and width of the label plus the margins. */ static XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *intended, XtWidgetGeometry *return_val) { CmeBSBObject entry = (CmeBSBObject) w; Dimension width, height; XtGeometryResult ret_val = XtGeometryYes; XtGeometryMask mode = intended->request_mode; GetDefaultSize(w, &width, &height ); if ( ((mode & CWWidth) && (intended->width != width)) || !(mode & CWWidth) ) { return_val->request_mode |= CWWidth; return_val->width = width; ret_val = XtGeometryAlmost; } if ( ((mode & CWHeight) && (intended->height != height)) || !(mode & CWHeight) ) { return_val->request_mode |= CWHeight; return_val->height = height; ret_val = XtGeometryAlmost; } if (ret_val == XtGeometryAlmost) { mode = return_val->request_mode; if ( ((mode & CWWidth) && (width == entry->rectangle.width)) && ((mode & CWHeight) && (height == entry->rectangle.height)) ) return(XtGeometryNo); } return(ret_val); } /* Function Name: OnCallback * Description: Timeout callback for submenu pop-up. * Arguments: closure - the bsb menu entry widget. * Returns: none. */ static void OnCallback(XtPointer closure, XtIntervalId *id _is_unused) { Widget w = (Widget) closure; CmeBSBObject entry = (CmeBSBObject) w; if (entry->cme_bsb.ticking && XawComplexMenuGetActiveEntry(XtParent(w)) == w) PopupMenu(w); entry->cme_bsb.ticking = False; } /* Function Name: FlipOn * Description: Invert the colors of the current entry. * Arguments: w - the bsb menu entry widget. * Returns: none. */ static void FlipOn(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; FlipColors(w); if (entry->cme_bsb.menu_name == NULL) return; if (entry->cme_bsb.ticking) XtRemoveTimeOut(entry->cme_bsb.id); entry->cme_bsb.ticking = True; entry->cme_bsb.id = XtAppAddTimeOut(XtWidgetToApplicationContext(w), 200L, OnCallback, (XtPointer)w); } /* Function Name: FlipOff * Description: Invert the colors of the current entry. * Arguments: w - the bsb menu entry widget. * Returns: none. */ static void FlipOff(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; Widget menu = NULL, temp; #define NUM_MENUS 16 Widget menus[NUM_MENUS]; int num_menus = 0; FlipColors(w); if (entry->cme_bsb.menu_name == NULL) return; if (entry->cme_bsb.ticking) { XtRemoveTimeOut(entry->cme_bsb.id); entry->cme_bsb.ticking = False; return; } temp = w; while(temp != NULL) { menu = XtNameToWidget(temp, entry->cme_bsb.menu_name); if (menu == NULL) temp = XtParent(temp); else { #if defined(CmeDebug) printf("FlipOff(BSB %lx) parent '%s': menu is %lx '%s'\n", (unsigned long)w, XtParent(w)->core.name, (unsigned long)menu, entry->cme_bsb.menu_name); #endif break; } } if (menu == NULL) { char error_buf[BUFSIZ]; (void) snprintf(error_buf, sizeof(error_buf), "CmeBSB: %s %s.", "Could not find menu widget named", entry->cme_bsb.menu_name); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } /* Pop down the last menu in the chain, not the first. */ menus[num_menus++] = menu; while ((w = XawComplexMenuGetActiveEntry(menu)) != NULL) { #if defined(CmeDebug) printf("FlipOff: menu has an active entry\n"); #endif entry = (CmeBSBObject) w; temp = w; while (temp != NULL) { menu = XtNameToWidget(temp, entry->cme_bsb.menu_name); if (menu == NULL) temp = XtParent(temp); else break; } if (menu == NULL) break; menus[num_menus++] = menu; } while (num_menus) XtPopdown(menus[--num_menus]); } /* Function Name: FlipColors * Description: Invert the colors of the current entry. * Arguments: w - the bsb menu entry widget. * Returns: none. */ static void FlipColors(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; if (entry->cme_bsb.set_values_area_cleared) return; XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w), entry->cme_bsb.invert_gc, 0, (int) entry->rectangle.y, (unsigned int) entry->rectangle.width, (unsigned int) entry->rectangle.height); } /************************************************************ * * Private Functions. * ************************************************************/ /* Function Name: GetDefaultSize * Description: Calculates the Default (preferred) size of * this menu entry. * Arguments: w - the menu entry widget. * width, height - default sizes (RETURNED). * Returns: none. */ static void GetDefaultSize(Widget w, Dimension *width, Dimension *height) { CmeBSBObject entry = (CmeBSBObject) w; if (entry->cme_bsb.label == NULL) *width = 0; else *width = XTextWidth(entry->cme_bsb.font, entry->cme_bsb.label, strlen(entry->cme_bsb.label)); *width += entry->cme_bsb.left_margin + entry->cme_bsb.right_margin; *height = (entry->cme_bsb.font->max_bounds.ascent + entry->cme_bsb.font->max_bounds.descent); *height = ((int)*height * ( ONE_HUNDRED + entry->cme_bsb.vert_space )) / ONE_HUNDRED; } /* Function Name: DrawBitmaps * Description: Draws left and right bitmaps. * Arguments: w - the complex menu widget. * gc - graphics context to use for drawing. * Returns: none */ static void DrawBitmaps(Widget w, GC gc) { int x_loc, y_loc; CmeBSBObject entry = (CmeBSBObject) w; if ( (entry->cme_bsb.left_bitmap == None) && (entry->cme_bsb.right_bitmap == None) ) return; /* * Draw Left Bitmap. */ if (entry->cme_bsb.left_bitmap != None) { x_loc = (int)(entry->cme_bsb.left_margin - entry->cme_bsb.left_bitmap_width) / 2; y_loc = entry->rectangle.y + (int)(entry->rectangle.height - entry->cme_bsb.left_bitmap_height) / 2; XCopyPlane(XtDisplayOfObject(w), entry->cme_bsb.left_bitmap, XtWindowOfObject(w), gc, 0, 0, entry->cme_bsb.left_bitmap_width, entry->cme_bsb.left_bitmap_height, x_loc, y_loc, 1); } /* * Draw Right Bitmap. */ if (entry->cme_bsb.right_bitmap != None) { x_loc = entry->rectangle.width - (int)(entry->cme_bsb.right_margin + entry->cme_bsb.right_bitmap_width) / 2; y_loc = entry->rectangle.y + (int)(entry->rectangle.height - entry->cme_bsb.right_bitmap_height) / 2; XCopyPlane(XtDisplayOfObject(w), entry->cme_bsb.right_bitmap, XtWindowOfObject(w), gc, 0, 0, entry->cme_bsb.right_bitmap_width, entry->cme_bsb.right_bitmap_height, x_loc, y_loc, 1); } } /* Function Name: GetBitmapInfo * Description: Gets the bitmap information from either of the bitmaps. * Arguments: w - the bsb menu entry widget. * is_left - TRUE if we are testing left bitmap, * FALSE if we are testing the right bitmap. * Returns: none */ static void GetBitmapInfo(Widget w, Boolean is_left) { CmeBSBObject entry = (CmeBSBObject) w; unsigned int depth, bw; Window root; int x, y; unsigned int width, height; char buf[BUFSIZ]; if (is_left) { if (entry->cme_bsb.left_bitmap != None) { if (!XGetGeometry(XtDisplayOfObject(w), entry->cme_bsb.left_bitmap, &root, &x, &y, &width, &height, &bw, &depth)) { (void) snprintf(buf, sizeof(buf), "CmeBSB Object: %s %s \"%s\".", "Could not", "get Left Bitmap geometry information for menu entry ", XtName(w)); XtAppError(XtWidgetToApplicationContext(w), buf); } if (depth != 1) { (void) snprintf(buf, sizeof(buf), "CmeBSB Object: %s \"%s\"%s.", "Left Bitmap of entry ", XtName(w), " is not one bit deep."); XtAppError(XtWidgetToApplicationContext(w), buf); } entry->cme_bsb.left_bitmap_width = (Dimension) width; entry->cme_bsb.left_bitmap_height = (Dimension) height; } } else if (entry->cme_bsb.right_bitmap != None) { if (!XGetGeometry(XtDisplayOfObject(w), entry->cme_bsb.right_bitmap, &root, &x, &y, &width, &height, &bw, &depth)) { (void) snprintf(buf, sizeof(buf), "CmeBSB Object: %s %s \"%s\".", "Could not", "get Right Bitmap geometry information for menu entry ", XtName(w)); XtAppError(XtWidgetToApplicationContext(w), buf); } if (depth != 1) { (void) snprintf(buf, sizeof(buf), "CmeBSB Object: %s \"%s\"%s.", "Right Bitmap of entry ", XtName(w), " is not one bit deep."); XtAppError(XtWidgetToApplicationContext(w), buf); } entry->cme_bsb.right_bitmap_width = (Dimension) width; entry->cme_bsb.right_bitmap_height = (Dimension) height; } } /* Function Name: CreateGCs * Description: Creates all gc's for the complex menu widget. * Arguments: w - the complex menu widget. * Returns: none. */ static void CreateGCs(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; XGCValues values; XtGCMask mask; values.foreground = XtParent(w)->core.background_pixel; values.background = entry->cme_bsb.foreground; values.font = entry->cme_bsb.font->fid; values.graphics_exposures = FALSE; mask = GCForeground | GCBackground | GCFont | GCGraphicsExposures; entry->cme_bsb.rev_gc = XtGetGC(w, mask, &values); values.foreground = entry->cme_bsb.foreground; values.background = XtParent(w)->core.background_pixel; entry->cme_bsb.norm_gc = XtGetGC(w, mask, &values); values.fill_style = FillTiled; values.tile = XmuCreateStippledPixmap(XtScreenOfObject(w), entry->cme_bsb.foreground, XtParent(w)->core.background_pixel, XtParent(w)->core.depth); values.graphics_exposures = FALSE; mask |= GCTile | GCFillStyle; entry->cme_bsb.norm_gray_gc = XtGetGC(w, mask, &values); values.foreground ^= values.background; values.background = 0; values.function = GXxor; mask = GCForeground | GCBackground | GCGraphicsExposures | GCFunction; entry->cme_bsb.invert_gc = XtGetGC(w, mask, &values); } /* Function Name: DestroyGCs * Description: Removes all gc's for the complex menu widget. * Arguments: w - the complex menu widget. * Returns: none. */ static void DestroyGCs(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; XtReleaseGC(w, entry->cme_bsb.norm_gc); XtReleaseGC(w, entry->cme_bsb.norm_gray_gc); XtReleaseGC(w, entry->cme_bsb.rev_gc); XtReleaseGC(w, entry->cme_bsb.invert_gc); } /* Function Name: PopupMenu * Description: Pops up the pullright menu associated with this widget. * Arguments: w - the complex menu widget. * Returns: none. */ static void PopupMenu(Widget w) { CmeBSBObject entry = (CmeBSBObject) w; Widget menu = NULL, temp; Arg arglist[3]; Cardinal num_args; int menu_x, menu_y, menu_width, menu_height, button_width; Position button_x, button_y; temp = w; while(temp != NULL) { menu = XtNameToWidget(temp, entry->cme_bsb.menu_name); if (menu == NULL) temp = XtParent(temp); else break; } if (menu == NULL) { char error_buf[BUFSIZ]; (void) snprintf(error_buf, sizeof(error_buf), "CmeBSB: %s %s.", "Could not find menu widget named", entry->cme_bsb.menu_name); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } #ifdef CmeDebug printf("PopupMenu(%lx) '%s'\n", (unsigned long)menu, entry->cme_bsb.menu_name); #endif if (!XtIsRealized(menu)) XtRealizeWidget(menu); menu_width = menu->core.width + 2 * menu->core.border_width; button_width = w->core.width + 2 * w->core.border_width; menu_height = menu->core.height + 2 * menu->core.border_width; XtTranslateCoords(w, 0, 0, &button_x, &button_y); menu_x = button_x + button_width + menu->core.border_width - 10; /* XXX */ menu_y = button_y + 1; if (menu_x >= 0) { int scr_width = WidthOfScreen(XtScreen(menu)); if (menu_x + menu_width > scr_width) menu_x = scr_width - menu_width; } if (menu_x < 0) menu_x = 0; if (menu_y >= 0) { int scr_height = HeightOfScreen(XtScreen(menu)); if (menu_y + menu_height > scr_height) menu_y = scr_height - menu_height; } if (menu_y < 0) menu_y = 0; num_args = 0; XtSetArg(arglist[num_args], XtNx, menu_x); num_args++; XtSetArg(arglist[num_args], XtNy, menu_y); num_args++; XtSetArg(arglist[num_args], XtNcMparent, XtParent(w)); num_args++; XtSetValues(menu, arglist, num_args); XtPopup(menu, XtGrabNonexclusive); } #ifdef apollo /* * The apollo compiler that we have optimizes out my code for * FlipColors() since it is static. and no one executes it in this * file. I am setting the function pointer into the class structure so * that it can be called by my parent who will tell me to when to * highlight and unhighlight. */ void _XawCmeBSBApolloHack(void) { FlipColors(); } #endif /* apollo */ suite3270-3.6/x3270/CmeBSB.h0000664000076500007650000001135313221577164013167 0ustar pdmpdm/* * (from) $XConsortium: SmeBSB.h,v 1.5 89/12/11 15:20:14 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * CmeBSB.h - Public Header file for CmeBSB object. * (from) SmeBSB.h - Public Header file for SmeBSB object. * * This is the public header file for the Athena BSB Cme object. * It is intended to be used with the complex menu widget. This object * provides bitmap - string - bitmap style entries. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #ifndef _CmeBSB_h #define _CmeBSB_h #include #include "Cme.h" /**************************************************************** * * CmeBSB object * ****************************************************************/ /* BSB Menu Entry Resources: Name Class RepType Default Value ---- ----- ------- ------------- callback Callback Callback NULL destroyCallback Callback Pointer NULL font Font XFontStruct * XtDefaultFont foreground Foreground Pixel XtDefaultForeground height Height Dimension 0 label Label String Name of entry leftBitmap LeftBitmap Pixmap None leftMargin HorizontalMargins Dimension 4 rightBitmap RightBitmap Pixmap None rightMargin HorizontalMargins Dimension 4 sensitive Sensitive Boolean True vertSpace VertSpace int 25 width Width Dimension 0 x Position Position 0n y Position Position 0 */ typedef struct _CmeBSBClassRec *CmeBSBObjectClass; typedef struct _CmeBSBRec *CmeBSBObject; extern WidgetClass cmeBSBObjectClass; #define XtNleftBitmap "leftBitmap" #define XtNleftMargin "leftMargin" #define XtNrightBitmap "rightBitmap" #define XtNrightMargin "rightMargin" #define XtNvertSpace "vertSpace" #define XtCLeftBitmap "LeftBitmap" #define XtCHorizontalMargins "HorizontalMargins" #define XtCRightBitmap "RightBitmap" #define XtCVertSpace "VertSpace" #endif /* _CmeBSB_h */ suite3270-3.6/x3270/CmeBSBP.h0000664000076500007650000001233013221577164013303 0ustar pdmpdm/* * (from) $XConsortium: SmeBSBP.h,v 1.6 89/12/11 15:20:15 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Chris D. Peterson, MIT X Consortium */ /* * CmeP.h - Private definitions for Cme object * (from) SmeP.h - Private definitions for Sme object * */ #ifndef _XawCmeBSBP_h #define _XawCmeBSBP_h /*********************************************************************** * * Cme Object Private Data * ***********************************************************************/ #include "CmeP.h" #include "CmeBSB.h" /************************************************************ * * New fields for the Cme Object class record. * ************************************************************/ typedef struct _CmeBSBClassPart { XtPointer extension; } CmeBSBClassPart; /* Full class record declaration */ typedef struct _CmeBSBClassRec { RectObjClassPart rect_class; CmeClassPart cme_class; CmeBSBClassPart cme_bsb_class; } CmeBSBClassRec; extern CmeBSBClassRec cmeBSBClassRec; /* New fields for the Cme Object record */ typedef struct { /* resources */ String label; /* The entry label. */ int vert_space; /* extra vert space to leave, as a percentage of the font height of the label. */ Pixmap left_bitmap, right_bitmap; /* bitmaps to show. */ Dimension left_margin, right_margin; /* left and right margins. */ Pixel foreground; /* foreground color. */ XFontStruct * font; /* The font to show label in. */ XtJustify justify; /* Justification for the label. */ String menu_name; /* The submenu to pop up. */ /* private resources. */ Boolean set_values_area_cleared; /* Remember if we need to unhighlight. */ GC norm_gc; /* noral color gc. */ GC rev_gc; /* reverse color gc. */ GC norm_gray_gc; /* Normal color (grayed out) gc. */ GC invert_gc; /* gc for flipping colors. */ Boolean ticking; /* is the pop-up timer ticking? */ XtIntervalId id; /* pop-up timer id */ Dimension left_bitmap_width; /* size of each bitmap. */ Dimension left_bitmap_height; Dimension right_bitmap_width; Dimension right_bitmap_height; } CmeBSBPart; /**************************************************************** * * Full instance record declaration * ****************************************************************/ typedef struct _CmeBSBRec { ObjectPart object; RectObjPart rectangle; CmePart cme; CmeBSBPart cme_bsb; } CmeBSBRec; /************************************************************ * * Private declarations. * ************************************************************/ #endif /* _XawCmeBSBP_h */ suite3270-3.6/x3270/Cme.c0000664000076500007650000002066213221577164012636 0ustar pdmpdm/* (from) $XConsortium: Sme.c,v 1.9 91/02/17 16:44:14 rws Exp $ */ /* * Copyright (c) 1995-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Cme.c - Source code for the generic menu entry * (from) Sme.c - Source code for the generic menu entry * * Date: September 26, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #include "globals.h" #include #include #include #include #include "CmeP.h" #include #define offset(field) XtOffsetOf(CmeRec, cme.field) static XtResource resources[] = { {XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer), offset(callbacks), XtRCallback, NULL}, }; #undef offset /* * Semi Public function definitions. */ static void Highlight(Widget); static void Unhighlight(Widget); static void Notify(Widget); static void ClassPartInitialize(WidgetClass); static void Initialize(Widget, Widget, ArgList, Cardinal *); static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *, XtWidgetGeometry *); #define SUPERCLASS (&rectObjClassRec) CmeClassRec cmeClassRec = { { /* superclass */ (WidgetClass) SUPERCLASS, /* class_name */ "Cme", /* size */ sizeof(CmeRec), /* class_initialize */ XawInitializeWidgetSet, /* class_part_initialize*/ ClassPartInitialize, /* Class init'ed */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ NULL, /* actions */ NULL, /* num_actions */ ZERO, /* resources */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ FALSE, /* compress_exposure */ FALSE, /* compress_enterleave*/ FALSE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ NULL, /* expose */ NULL, /* set_values */ NULL, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* intrinsics version */ XtVersion, /* callback offsets */ NULL, /* tm_table */ NULL, /* query_geometry */ QueryGeometry, /* display_accelerator*/ NULL, /* extension */ NULL },{ /* Complex Menu Entry Fields */ /* highlight */ Highlight, /* unhighlight */ Unhighlight, /* notify */ Notify, /* extension */ NULL } }; WidgetClass cmeObjectClass = (WidgetClass) &cmeClassRec; /************************************************************ * * Semi-Public Functions. * ************************************************************/ /* Function Name: ClassPartInitialize * Description: handles inheritance of class functions. * Arguments: class - the widget classs of this widget. * Returns: none. */ static void ClassPartInitialize(WidgetClass class) { CmeObjectClass m_ent, superC; m_ent = (CmeObjectClass) class; superC = (CmeObjectClass) m_ent->rect_class.superclass; /* * We don't need to check for null super since we'll get to TextSink * eventually. */ if (m_ent->cme_class.highlight == XtInheritHighlight) m_ent->cme_class.highlight = superC->cme_class.highlight; if (m_ent->cme_class.unhighlight == XtInheritUnhighlight) m_ent->cme_class.unhighlight = superC->cme_class.unhighlight; if (m_ent->cme_class.notify == XtInheritNotify) m_ent->cme_class.notify = superC->cme_class.notify; } /* Function Name: Initialize * Description: Initializes the complex menu widget * Arguments: request - the widget requested by the argument list. * new - the new widget with both resource and non * resource values. * Returns: none. * * MENU ENTRIES CANNOT HAVE BORDERS. */ static void Initialize(Widget request _is_unused, Widget new, ArgList args _is_unused, Cardinal *num_args _is_unused) { CmeObject entry = (CmeObject) new; entry->rectangle.border_width = 0; } /* Function Name: Highlight * Description: The default highlight proceedure for menu entries. * Arguments: w - the menu entry. * Returns: none. */ static void Highlight(Widget w _is_unused) { /* This space intentionally left blank. */ } /* Function Name: Unhighlight * Description: The default unhighlight proceedure for menu entries. * Arguments: w - the menu entry. * Returns: none. */ static void Unhighlight(Widget w _is_unused) { /* This space intentionally left blank. */ } /* Function Name: Notify * Description: calls the callback proceedures for this entry. * Arguments: w - the menu entry. * Returns: none. */ static void Notify(Widget w) { XtCallCallbacks(w, XtNcallback, NULL); } /* Function Name: QueryGeometry. * Description: Returns the preferred geometry for this widget. * Arguments: w - the menu entry object. * itended, return - the intended and return geometry info. * Returns: A Geometry Result. * * See the Intrinsics manual for details on what this function is for. * * I just return the height and a width of 1. */ static XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *intended, XtWidgetGeometry *return_val) { CmeObject entry = (CmeObject) w; Dimension width; XtGeometryResult ret_val = XtGeometryYes; XtGeometryMask mode = intended->request_mode; width = 1; /* we can be really small. */ if ( ((mode & CWWidth) && (intended->width != width)) || !(mode & CWWidth) ) { return_val->request_mode |= CWWidth; return_val->width = width; mode = return_val->request_mode; if ( (mode & CWWidth) && (width == entry->rectangle.width) ) return(XtGeometryNo); return(XtGeometryAlmost); } return(ret_val); } suite3270-3.6/x3270/Cme.h0000664000076500007650000000740413221577164012642 0ustar pdmpdm/* * (from) $XConsortium: Sme.h,v 1.4 89/12/11 15:20:09 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Cme.h - Public Header file for Cme object. * (from) Sme.h - Public Header file for Sme object. * * This is the public header file for the Athena Cme object. * It is intended to be used with the complex menu widget. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #ifndef _Cme_h #define _Cme_h #include /**************************************************************** * * Cme Object * ****************************************************************/ /* Complex Menu Entry Resources: Name Class RepType Default Value ---- ----- ------- ------------- callback Callback Pointer NULL destroyCallback Callback Pointer NULL height Height Dimension 0 sensitive Sensitive Boolean True width Width Dimension 0 x Position Position 0n y Position Position 0 */ typedef struct _CmeClassRec* CmeObjectClass; typedef struct _CmeRec* CmeObject; extern WidgetClass cmeObjectClass; #endif /* _Cme_h */ suite3270-3.6/x3270/CmeLine.c0000664000076500007650000002432213221577164013443 0ustar pdmpdm/* (from) $XConsortium: SmeLine.c,v 1.13 91/07/23 12:23:21 rws Exp $ */ /* * Copyright (c) 1995-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Chris D. Peterson, MIT X Consortium */ /* * Cme.c - Source code for the generic menu entry * (from) Sme.c - Source code for the generic menu entry * * Date: September 26, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #include "globals.h" #include #include #include #include #include "CmeLineP.h" #include #define offset(field) XtOffsetOf(CmeLineRec, cme_line.field) static XtResource resources[] = { {XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension), offset(line_width), XtRImmediate, (XtPointer) 1}, {XtNstipple, XtCStipple, XtRBitmap, sizeof(Pixmap), offset(stipple), XtRImmediate, (XtPointer) XtUnspecifiedPixmap}, {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(foreground), XtRString, XtDefaultForeground}, }; #undef offset /* * Function definitions. */ static void Redisplay(Widget, XEvent *, Region); static void Initialize(Widget, Widget, ArgList, Cardinal *); static void DestroyGC(Widget); static void CreateGC(Widget); static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *, XtWidgetGeometry *); #define SUPERCLASS (&cmeClassRec) CmeLineClassRec cmeLineClassRec = { { /* superclass */ (WidgetClass) SUPERCLASS, /* class_name */ "CmeLine", /* size */ sizeof(CmeLineRec), /* class_initialize */ XawInitializeWidgetSet, /* class_part_initialize*/ NULL, /* Class init'ed */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ NULL, /* actions */ NULL, /* num_actions */ ZERO, /* resources */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ FALSE, /* compress_exposure */ FALSE, /* compress_enterleave*/ FALSE, /* visible_interest */ FALSE, /* destroy */ DestroyGC, /* resize */ NULL, /* expose */ Redisplay, /* set_values */ SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* intrinsics version */ XtVersion, /* callback offsets */ NULL, /* tm_table */ NULL, /* query_geometry */ QueryGeometry, /* display_accelerator*/ NULL, /* extension */ NULL },{ /* Menu Entry Fields */ /* highlight */ XtInheritHighlight, /* unhighlight */ XtInheritUnhighlight, /* notify */ XtInheritNotify, /* extension */ NULL },{ /* Line Menu Entry Fields */ /* extension */ NULL } }; WidgetClass cmeLineObjectClass = (WidgetClass) &cmeLineClassRec; /************************************************************ * * Semi-Public Functions. * ************************************************************/ /* Function Name: Initialize * Description: Initializes the complex menu widget * Arguments: request - the widget requested by the argument list. * new - the new widget with both resource and non * resource values. * Returns: none. */ static void Initialize(Widget request _is_unused, Widget new, ArgList args _is_unused, Cardinal *num_args _is_unused) { CmeLineObject entry = (CmeLineObject) new; if (entry->rectangle.height == 0) entry->rectangle.height = entry->cme_line.line_width; CreateGC(new); } /* Function Name: CreateGC * Description: Creates the GC for the line entry widget. * Arguments: w - the Line entry widget. * Returns: none * * We can only share the GC if there is no stipple, because * we need to change the stipple origin when drawing. */ static void CreateGC(Widget w) { CmeLineObject entry = (CmeLineObject) w; XGCValues values; XtGCMask mask = GCForeground | GCGraphicsExposures | GCLineWidth ; values.foreground = entry->cme_line.foreground; values.graphics_exposures = FALSE; values.line_width = entry->cme_line.line_width; if (entry->cme_line.stipple != XtUnspecifiedPixmap) { values.stipple = entry->cme_line.stipple; values.fill_style = FillStippled; mask |= GCStipple | GCFillStyle; entry->cme_line.gc = XCreateGC(XtDisplayOfObject(w), RootWindowOfScreen(XtScreenOfObject(w)), mask, &values); } else entry->cme_line.gc = XtGetGC(w, mask, &values); } /* Function Name: DestroyGC * Description: Destroys the GC when we are done with it. * Arguments: w - the Line entry widget. * Returns: none */ static void DestroyGC(Widget w) { CmeLineObject entry = (CmeLineObject) w; if (entry->cme_line.stipple != XtUnspecifiedPixmap) XFreeGC(XtDisplayOfObject(w), entry->cme_line.gc); else XtReleaseGC(w, entry->cme_line.gc); } /* Function Name: Redisplay * Description: Paints the Line * Arguments: w - the menu entry. * event, region - NOT USED. * Returns: none */ static void Redisplay(Widget w, XEvent *event _is_unused, Region region _is_unused) { CmeLineObject entry = (CmeLineObject) w; int y = entry->rectangle.y + (int)(entry->rectangle.height - entry->cme_line.line_width) / 2; if (entry->cme_line.stipple != XtUnspecifiedPixmap) XSetTSOrigin(XtDisplayOfObject(w), entry->cme_line.gc, 0, y); XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w), entry->cme_line.gc, 0, y, (unsigned int) entry->rectangle.width, (unsigned int) entry->cme_line.line_width ); } /* Function Name: SetValues * Description: Relayout the menu when one of the resources is changed. * Arguments: current - current state of the widget. * request - what was requested. * new - what the widget will become. * Returns: none */ static Boolean SetValues(Widget current, Widget request _is_unused, Widget new, ArgList args _is_unused, Cardinal *num_args _is_unused) { CmeLineObject entry = (CmeLineObject) new; CmeLineObject old_entry = (CmeLineObject) current; if ( (entry->cme_line.line_width != old_entry->cme_line.line_width) && (entry->cme_line.stipple != old_entry->cme_line.stipple) ) { DestroyGC(current); CreateGC(new); return(TRUE); } return(FALSE); } /* Function Name: QueryGeometry. * Description: Returns the preferred geometry for this widget. * Arguments: w - the menu entry object. * itended, return - the intended and return geometry info. * Returns: A Geometry Result. * * See the Intrinsics manual for details on what this function is for. * * I just return the height and a width of 1. */ static XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *intended, XtWidgetGeometry *return_val) { CmeObject entry = (CmeObject) w; Dimension width; XtGeometryResult ret_val = XtGeometryYes; XtGeometryMask mode = intended->request_mode; width = 1; /* we can be really small. */ if ( ((mode & CWWidth) && (intended->width != width)) || !(mode & CWWidth) ) { return_val->request_mode |= CWWidth; return_val->width = width; mode = return_val->request_mode; if ( (mode & CWWidth) && (width == entry->rectangle.width) ) return(XtGeometryNo); return(XtGeometryAlmost); } return(ret_val); } suite3270-3.6/x3270/CmeLine.h0000664000076500007650000000771613221577164013460 0ustar pdmpdm/* * (from) $XConsortium: SmeLine.h,v 1.3 89/12/11 15:20:19 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * CmeLine.h - Public Header file for CmeLine object. * (from) SmeLine.h - Public Header file for SmeLine object. * * This is the public header file for the Athena CmeLine object. * It is intended to be used with the complex menu widget. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #ifndef _CmeLine_h #define _CmeLine_h #include "Cme.h" #include /**************************************************************** * * CmeLine Object * ****************************************************************/ /* Menu Entry Resources: Name Class RepType Default Value ---- ----- ------- ------------- callback Callback Pointer NULL destroyCallback Callback Pointer NULL height Height Dimension 0 sensitive Sensitive Boolean True width Width Dimension 0 x Position Position 0n y Position Position 0 */ #define XtCLineWidth "LineWidth" #define XtCStipple "Stipple" #define XtNlineWidth "lineWidth" #define XtNstipple "stipple" typedef struct _CmeLineClassRec* CmeLineObjectClass; typedef struct _CmeLineRec* CmeLineObject; extern WidgetClass cmeLineObjectClass; #endif /* _CmeLine_h */ suite3270-3.6/x3270/CmeLineP.h0000664000076500007650000001065113221577164013570 0ustar pdmpdm/* * (from) $XConsortium: SmeLineP.h,v 1.3 89/12/11 15:20:20 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Chris D. Peterson, MIT X Consortium */ /* * CmeLineP.h - Private definitions for CmeLine widget * (from) SmeLineP.h - Private definitions for SmeLine widget * */ #ifndef _XawCmeLineP_h #define _XawCmeLineP_h /*********************************************************************** * * CmeLine Widget Private Data * ***********************************************************************/ #include "CmeP.h" #include "CmeLine.h" /************************************************************ * * New fields for the CmeLine widget class record. * ************************************************************/ typedef struct _CmeLineClassPart { XtPointer extension; } CmeLineClassPart; /* Full class record declaration */ typedef struct _CmeLineClassRec { RectObjClassPart rect_class; CmeClassPart cme_class; CmeLineClassPart cme_line_class; } CmeLineClassRec; extern CmeLineClassRec cmeLineClassRec; /* New fields for the CmeLine widget record */ typedef struct { /* resources */ Pixel foreground; /* Foreground color. */ Pixmap stipple; /* Line Stipple. */ Dimension line_width; /* Width of the line. */ /* private data. */ GC gc; /* Graphics context for drawing line. */ } CmeLinePart; /**************************************************************** * * Full instance record declaration * ****************************************************************/ typedef struct _CmeLineRec { ObjectPart object; RectObjPart rectangle; CmePart cme; CmeLinePart cme_line; } CmeLineRec; /************************************************************ * * Private declarations. * ************************************************************/ #endif /* _XawCmeLineP_h */ suite3270-3.6/x3270/CmeP.h0000664000076500007650000001112213221577164012752 0ustar pdmpdm/* * (from) $XConsortium: SmeP.h,v 1.4 89/12/11 15:20:22 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * CmeP.h - Private Header file for Cme object. * (from) SmeP.h - Private Header file for Sme object. * * This is the private header file for the Athena Cme object. * This object is intended to be used with the complex menu widget. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #ifndef _XawCmeP_h #define _XawCmeP_h /*********************************************************************** * * Cme Widget Private Data * ***********************************************************************/ #include #include "Cme.h" /************************************************************ * * New fields for the Cme widget class record. * ************************************************************/ typedef struct _CmeClassPart { void (*highlight)(); void (*unhighlight)(); void (*notify)(); XtPointer extension; } CmeClassPart; /* Full class record declaration */ typedef struct _CmeClassRec { RectObjClassPart rect_class; CmeClassPart cme_class; } CmeClassRec; extern CmeClassRec cmeClassRec; /* New fields for the Cme widget record */ typedef struct { /* resources */ XtCallbackList callbacks; /* The callback list */ } CmePart; /**************************************************************** * * Full instance record declaration * ****************************************************************/ typedef struct _CmeRec { ObjectPart object; RectObjPart rectangle; CmePart cme; } CmeRec; /************************************************************ * * Private declarations. * ************************************************************/ typedef void (*_XawEntryVoidFunc)(); #define XtInheritHighlight ((_XawEntryVoidFunc) _XtInherit) #define XtInheritUnhighlight XtInheritHighlight #define XtInheritNotify XtInheritHighlight #endif /* _XawCmeP_h */ suite3270-3.6/x3270/CmplxMenu.c0000664000076500007650000012576213221577164014051 0ustar pdmpdm/* (from) $XConsortium: SimpleMenu.c,v 1.41 92/09/10 16:25:07 converse Exp $ */ /* * Copyright (c) 1995-2009, 2013-2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * ComplexMenu.c - Source code file for ComplexMenu widget. * (from) SimpleMenu.c - Source code file for SimpleMenu widget. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #include "globals.h" #include #include #include #include #include "CmplxMenuP.h" #include "CmeBSB.h" #include #include #include #include #define streq(a, b) ( strcmp((a), (b)) == 0 ) #define offset(field) XtOffsetOf(ComplexMenuRec, complex_menu.field) static XtResource resources[] = { /* * Label Resources. */ {XtNlabel, XtCLabel, XtRString, sizeof(String), offset(label_string), XtRString, NULL}, {XtNlabelClass, XtCLabelClass, XtRPointer, sizeof(WidgetClass), offset(label_class), XtRImmediate, (XtPointer) NULL}, /* * Layout Resources. */ {XtNrowHeight, XtCRowHeight, XtRDimension, sizeof(Dimension), offset(row_height), XtRImmediate, (XtPointer) 0}, {XtNtopMargin, XtCVerticalMargins, XtRDimension, sizeof(Dimension), offset(top_margin), XtRImmediate, (XtPointer) 0}, {XtNbottomMargin, XtCVerticalMargins, XtRDimension, sizeof(Dimension), offset(bottom_margin), XtRImmediate, (XtPointer) 0}, /* * Misc. Resources */ { XtNallowShellResize, XtCAllowShellResize, XtRBoolean, sizeof(Boolean), XtOffsetOf(ComplexMenuRec, shell.allow_shell_resize), XtRImmediate, (XtPointer) TRUE }, {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), offset(cursor), XtRImmediate, (XtPointer) None}, {XtNmenuOnScreen, XtCMenuOnScreen, XtRBoolean, sizeof(Boolean), offset(menu_on_screen), XtRImmediate, (XtPointer) TRUE}, {XtNpopupOnEntry, XtCPopupOnEntry, XtRWidget, sizeof(Widget), offset(popup_entry), XtRWidget, NULL}, {XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof (int), offset(backing_store), XtRImmediate, (XtPointer) (Always + WhenMapped + NotUseful)}, {XtNcMparent, XtCCMparent, XtRWidget, sizeof(Widget), offset(parent), XtRWidget, NULL}, {XtNcMdefer, XtCCMdefer, XtRWidget, sizeof(Widget), offset(deferred_notify), XtRWidget, NULL}, }; #undef offset static char defaultTranslations[] = ": highlight() \n\ : leftWindow() \n\ : highlight() \n\ : saveUnhighlight() myMenuPopdown()"; /* * Semi Public function definitions. */ static void Redisplay(Widget, XEvent *, Region); static void Realize(Widget, XtValueMask *, XSetWindowAttributes *); static void ChangeManaged(Widget); static void Resize(Widget); static void Initialize(Widget, Widget, ArgList, Cardinal *); static void ClassInitialize(void); static void ClassPartInitialize(WidgetClass); static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); static Boolean SetValuesHook(Widget, ArgList, Cardinal *); static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *, XtWidgetGeometry *); /* * Action Routine Definitions */ static void PositionMenuAction(Widget, XEvent *, String *, Cardinal *); static void SaveUnhighlight(Widget, XEvent *, String *, Cardinal *); static void LeftWindow(Widget, XEvent *, String *, Cardinal *); static void MyMenuPopdown(Widget, XEvent *, String *, Cardinal *); static void Highlight(Widget, XEvent *, String *, Cardinal *); /* * Private Function Definitions. */ static void Unhighlight(), Notify(); static void MakeSetValuesRequest(Widget, Dimension, Dimension); static void Layout(Widget, Dimension *, Dimension *); static void CreateLabel(Widget); static void AddPositionAction(XtAppContext, caddr_t); static void ChangeCursorOnGrab(Widget, XtPointer junk, XtPointer); static void PositionMenu(Widget, XPoint *); static void ClearParent(Widget, XtPointer, XtPointer); static Dimension GetMenuWidth(Widget, Widget); static Dimension GetMenuHeight(Widget); static Widget FindMenu(Widget, String); static CmeObject GetEventEntry(Widget, XEvent *); static CmeObject GetRightEntry(Widget, XEvent *); static void MoveMenu(Widget, Position, Position); static XtActionsRec actionsList[] = { {"highlight", Highlight}, {"saveUnhighlight", SaveUnhighlight}, {"leftWindow", LeftWindow}, {"myMenuPopdown", MyMenuPopdown}, }; static CompositeClassExtensionRec extension_rec = { /* next_extension */ NULL, /* record_type */ NULLQUARK, /* version */ XtCompositeExtensionVersion, /* record_size */ sizeof(CompositeClassExtensionRec), /* accepts_objects */ TRUE, }; #define superclass (&overrideShellClassRec) ComplexMenuClassRec complexMenuClassRec = { { /* superclass */ (WidgetClass) superclass, /* class_name */ "ComplexMenu", /* size */ sizeof(ComplexMenuRec), /* class_initialize */ ClassInitialize, /* class_part_initialize*/ ClassPartInitialize, /* Class init'ed */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ actionsList, /* num_actions */ XtNumber(actionsList), /* resources */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave*/ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ Resize, /* expose */ Redisplay, /* set_values */ SetValues, /* set_values_hook */ SetValuesHook, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* intrinsics version */ XtVersion, /* callback offsets */ NULL, /* tm_table */ defaultTranslations, /* query_geometry */ NULL, /* display_accelerator*/ NULL, /* extension */ NULL },{ /* geometry_manager */ GeometryManager, /* change_managed */ ChangeManaged, /* insert_child */ XtInheritInsertChild, /* delete_child */ XtInheritDeleteChild, /* extension */ NULL },{ /* Shell extension */ NULL },{ /* Override extension */ NULL },{ /* Complex Menu extension*/ NULL } }; WidgetClass complexMenuWidgetClass = (WidgetClass)&complexMenuClassRec; /************************************************************ * * Semi-Public Functions. * ************************************************************/ /* Function Name: ClassInitialize * Description: Class Initialize routine, called only once. * Arguments: none. * Returns: none. */ static void ClassInitialize(void) { XawInitializeWidgetSet(); XtAddConverter( XtRString, XtRBackingStore, XmuCvtStringToBackingStore, NULL, 0 ); XmuAddInitializer( AddPositionAction, NULL); } /* Function Name: ClassInitialize * Description: Class Part Initialize routine, called for every * subclass. Makes sure that the subclasses pick up * the extension record. * Arguments: wc - the widget class of the subclass. * Returns: none. */ static void ClassPartInitialize(WidgetClass wc) { ComplexMenuWidgetClass cmwc = (ComplexMenuWidgetClass) wc; /* * Make sure that our subclass gets the extension rec too. */ extension_rec.next_extension = cmwc->composite_class.extension; cmwc->composite_class.extension = (XtPointer) &extension_rec; } /* Function Name: Initialize * Description: Initializes the complex menu widget * Arguments: request - the widget requested by the argument list. * new - the new widget with both resource and non * resource values. * Returns: none. */ static void Initialize(Widget request _is_unused, Widget new, ArgList args _is_unused, Cardinal *num_args _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) new; XmuCallInitializers(XtWidgetToApplicationContext(new)); if (cmw->complex_menu.label_class == NULL) cmw->complex_menu.label_class = cmeBSBObjectClass; cmw->complex_menu.label = NULL; cmw->complex_menu.entry_set = NULL; cmw->complex_menu.prev_entry = NULL; cmw->complex_menu.recursive_set_values = FALSE; if (cmw->complex_menu.label_string != NULL) CreateLabel(new); cmw->complex_menu.menu_width = TRUE; if (cmw->core.width == 0) { cmw->complex_menu.menu_width = FALSE; cmw->core.width = GetMenuWidth(new, NULL); } cmw->complex_menu.menu_height = TRUE; if (cmw->core.height == 0) { cmw->complex_menu.menu_height = FALSE; cmw->core.height = GetMenuHeight(new); } /* * Add a popup_callback routine for changing the cursor. */ XtAddCallback(new, XtNpopupCallback, ChangeCursorOnGrab, NULL); /* * Add a popdown_callback routine for clearing the parent field. */ XtAddCallback(new, XtNpopdownCallback, ClearParent, NULL); } /* Function Name: Redisplay * Description: Redisplays the contents of the widget. * Arguments: w - the complex menu widget. * event - the X event that caused this redisplay. * region - the region the needs to be repainted. * Returns: none. */ static void Redisplay(Widget w, XEvent *event _is_unused, Region region) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject * entry; CmeObjectClass class; if (region == NULL) XClearWindow(XtDisplay(w), XtWindow(w)); /* * Check and Paint each of the entries - including the label. */ ForAllChildren(cmw, entry) { if (!XtIsManaged ( (Widget) *entry)) continue; if (region != NULL) switch(XRectInRegion(region, (int) (*entry)->rectangle.x, (int) (*entry)->rectangle.y, (unsigned int) (*entry)->rectangle.width, (unsigned int) (*entry)->rectangle.height)) { case RectangleIn: case RectanglePart: break; default: continue; } class = (CmeObjectClass) (*entry)->object.widget_class; if (class->rect_class.expose != NULL) (class->rect_class.expose)( (Widget) *entry, NULL, NULL); } } /* Function Name: Realize * Description: Realizes the widget. * Arguments: w - the complex menu widget. * mask - value mask for the window to create. * attrs - attributes for the window to create. * Returns: none */ static void Realize(Widget w, XtValueMask *mask, XSetWindowAttributes *attrs) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; attrs->cursor = cmw->complex_menu.cursor; *mask |= CWCursor; if ((cmw->complex_menu.backing_store == Always) || (cmw->complex_menu.backing_store == NotUseful) || (cmw->complex_menu.backing_store == WhenMapped) ) { *mask |= CWBackingStore; attrs->backing_store = cmw->complex_menu.backing_store; } else *mask &= ~CWBackingStore; (*superclass->core_class.realize) (w, mask, attrs); } /* Function Name: Resize * Description: Handle the menu being resized bigger. * Arguments: w - the complex menu widget. * Returns: none. */ static void Resize(Widget w) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject * entry; if ( !XtIsRealized(w) ) return; ForAllChildren(cmw, entry) /* reset width of all entries. */ if (XtIsManaged( (Widget) *entry)) (*entry)->rectangle.width = cmw->core.width; Redisplay(w, (XEvent *) NULL, (Region) NULL); } /* Function Name: SetValues * Description: Relayout the menu when one of the resources is changed. * Arguments: current - current state of the widget. * request - what was requested. * new - what the widget will become. * Returns: none */ static Boolean SetValues(Widget current, Widget request _is_unused, Widget new, ArgList args _is_unused, Cardinal *num_args _is_unused) { ComplexMenuWidget cmw_old = (ComplexMenuWidget) current; ComplexMenuWidget cmw_new = (ComplexMenuWidget) new; Boolean ret_val = FALSE, layout = FALSE; if (!XtIsRealized(current)) return(FALSE); if (!cmw_new->complex_menu.recursive_set_values) { if (cmw_new->core.width != cmw_old->core.width) { cmw_new->complex_menu.menu_width = (cmw_new->core.width != 0); layout = TRUE; } if (cmw_new->core.height != cmw_old->core.height) { cmw_new->complex_menu.menu_height = (cmw_new->core.height != 0); layout = TRUE; } } if (cmw_old->complex_menu.cursor != cmw_new->complex_menu.cursor) XDefineCursor(XtDisplay(new), XtWindow(new), cmw_new->complex_menu.cursor); if (cmw_old->complex_menu.label_string !=cmw_new->complex_menu.label_string) { if (cmw_new->complex_menu.label_string == NULL) /* Destroy. */ XtDestroyWidget((Widget) cmw_old->complex_menu.label); else if (cmw_old->complex_menu.label_string == NULL) /* Create. */ CreateLabel(new); else { /* Change. */ Arg arglist[1]; XtSetArg(arglist[0], XtNlabel, cmw_new->complex_menu.label_string); XtSetValues((Widget) cmw_new->complex_menu.label, arglist, ONE); } } if (cmw_old->complex_menu.label_class != cmw_new->complex_menu.label_class) XtAppWarning(XtWidgetToApplicationContext(new), "No Dynamic class change of the ComplexMenu Label."); if ((cmw_old->complex_menu.top_margin != cmw_new->complex_menu.top_margin) || (cmw_old->complex_menu.bottom_margin != cmw_new->complex_menu.bottom_margin) /* filler................. */ ) { layout = TRUE; ret_val = TRUE; } if (layout) Layout(new, NULL, NULL); return(ret_val); } /* Function Name: SetValuesHook * Description: To handle a special case, this is passed the * actual arguments. * Arguments: w - the menu widget. * arglist - the argument list passed to XtSetValues. * num_args - the number of args. * Returns: none */ /* * If the user actually passed a width and height to the widget * then this MUST be used, rather than our newly calculated width and * height. */ static Boolean SetValuesHook(Widget w, ArgList arglist, Cardinal *num_args) { register Cardinal i; Dimension width, height; width = w->core.width; height = w->core.height; for ( i = 0 ; i < *num_args ; i++) { if ( streq(arglist[i].name, XtNwidth) ) width = (Dimension) arglist[i].value; if ( streq(arglist[i].name, XtNheight) ) height = (Dimension) arglist[i].value; } if ((width != w->core.width) || (height != w->core.height)) MakeSetValuesRequest(w, width, height); return(FALSE); } /************************************************************ * * Geometry Management routines. * ************************************************************/ /* Function Name: GeometryManager * Description: This is the ComplexMenu Widget's Geometry Manager. * Arguments: w - the Menu Entry making the request. * request - requested new geometry. * reply - the allowed geometry. * Returns: XtGeometry{Yes, No, Almost}. */ static XtGeometryResult GeometryManager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply) { ComplexMenuWidget cmw = (ComplexMenuWidget) XtParent(w); CmeObject entry = (CmeObject) w; XtGeometryMask mode = request->request_mode; XtGeometryResult answer; Dimension old_height, old_width; if ( !(mode & CWWidth) && !(mode & CWHeight) ) return(XtGeometryNo); reply->width = request->width; reply->height = request->height; old_width = entry->rectangle.width; old_height = entry->rectangle.height; Layout(w, &(reply->width), &(reply->height) ); /* * Since we are an override shell and have no parent there is no one to * ask to see if this geom change is okay, so I am just going to assume * we can do whatever we want. If you subclass be very careful with this * assumption, it could bite you. * * Chris D. Peterson - Sept. 1989. */ if ( (reply->width == request->width) && (reply->height == request->height) ) { if ( mode & XtCWQueryOnly ) { /* Actually perform the layout. */ entry->rectangle.width = old_width; entry->rectangle.height = old_height; } else { Layout(( Widget) cmw, NULL, NULL); } answer = XtGeometryDone; } else { entry->rectangle.width = old_width; entry->rectangle.height = old_height; if ( ((reply->width == request->width) && !(mode & CWHeight)) || ((reply->height == request->height) && !(mode & CWWidth)) || ((reply->width == request->width) && (reply->height == request->height)) ) answer = XtGeometryNo; else { answer = XtGeometryAlmost; reply->request_mode = 0; if (reply->width != request->width) reply->request_mode |= CWWidth; if (reply->height != request->height) reply->request_mode |= CWHeight; } } return(answer); } /* Function Name: ChangeManaged * Description: called whenever a new child is managed. * Arguments: w - the complex menu widget. * Returns: none. */ static void ChangeManaged(Widget w) { Layout(w, NULL, NULL); } /************************************************************ * * Global Action Routines. * * These actions routines will be added to the application's * global action list. * ************************************************************/ /* Function Name: PositionMenuAction * Description: Positions the complex menu widget. * Arguments: w - a widget (no the complex menu widget.) * event - the event that caused this action. * params, num_params - parameters passed to the routine. * we expect the name of the menu here. * Returns: none */ static void PositionMenuAction(Widget w, XEvent *event, String *params, Cardinal *num_params) { Widget menu; XPoint loc; if (*num_params != 1) { char error_buf[BUFSIZ]; (void) snprintf(error_buf, sizeof(error_buf), "%s %s", "Xaw - ComplexMenuWidget: position menu action expects only one", "parameter which is the name of the menu."); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } if ( (menu = FindMenu(w, params[0])) == NULL) { char error_buf[BUFSIZ]; (void) snprintf(error_buf, sizeof(error_buf), "%s '%s'", "Xaw - ComplexMenuWidget: could not find menu named: ", params[0]); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } switch (event->type) { case ButtonPress: case ButtonRelease: loc.x = event->xbutton.x_root; loc.y = event->xbutton.y_root; PositionMenu(menu, &loc); break; case EnterNotify: case LeaveNotify: loc.x = event->xcrossing.x_root; loc.y = event->xcrossing.y_root; PositionMenu(menu, &loc); break; case MotionNotify: loc.x = event->xmotion.x_root; loc.y = event->xmotion.y_root; PositionMenu(menu, &loc); break; default: PositionMenu(menu, NULL); break; } } /************************************************************ * * Widget Action Routines. * ************************************************************/ /* Function Name: Unhighlight * Description: Unhighlights current entry. * Arguments: w - the complex menu widget. * event - the event that caused this action. * params, num_params - ** NOT USED ** * Returns: none */ static void Unhighlight(Widget w, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject entry = cmw->complex_menu.entry_set; CmeObjectClass class; if ( entry == NULL) return; #if defined(CmeDebug) printf("Unhighlight(%lx) '%s': zapping %lx\n", (unsigned long)w, w->core.name, (unsigned long)entry); #endif cmw->complex_menu.entry_set = NULL; class = (CmeObjectClass) entry->object.widget_class; (class->cme_class.unhighlight) ( (Widget) entry); } static void SaveUnhighlight(Widget w, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject entry = cmw->complex_menu.entry_set; CmeObjectClass class; #if defined(CmeDebug) printf("SaveUnhighlight(%lx) '%s', BtnUp\n", (unsigned long)w, cmw->core.name); #endif if ( entry == NULL) return; class = (CmeObjectClass) entry->object.widget_class; (class->cme_class.unhighlight) ( (Widget) entry); } /* Function Name: LeftWindow * Description: Mouse has left window, usually this means unhighlight * Arguments: w - the complex menu widget. * event - the event that caused this action. * params, num_params - ** NOT USED ** * Returns: none */ static void LeftWindow(Widget w, XEvent *event, String *params _is_unused, Cardinal *num_params _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject entry = cmw->complex_menu.entry_set; CmeObjectClass class; String mn; if ( entry == NULL) return; mn = NULL; XtVaGetValues((Widget) entry, XtNmenuName, &mn, NULL); if (mn != NULL && GetRightEntry(w, event) == entry) return; cmw->complex_menu.prev_entry = NULL; cmw->complex_menu.entry_set = NULL; class = (CmeObjectClass) entry->object.widget_class; (class->cme_class.unhighlight) ( (Widget) entry); } /* Function Name: MyMenuPopdown * Description: BtnUp, time to pop this menu down (is that all?) * Arguments: w - the complex menu widget. * event - the event that caused this action. * params, num_params - ** NOT USED ** * Returns: none */ static void MyMenuPopdown(Widget w, XEvent *event, String *params _is_unused, Cardinal *num_params _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; #if defined(CmeDebug1) printf("MyMenuPopdown(%lx) '%s'\n", (unsigned long)w, w->core.name); #endif if (((ShellWidget)w)->shell.popped_up) { #if defined(CmeDebug1) printf("MyMenuPopdown: popping down myself\n"); #endif XtPopdown(w); } /* Cascade up. */ while (cmw->complex_menu.parent != NULL) { #if defined(CmeDebug1) printf("MyMenuPopdown [cascade up]: parent %lx '%s'\n", (unsigned long)cmw->complex_menu.parent, cmw->complex_menu.parent->core.name); #endif XtPopdown(cmw->complex_menu.parent); cmw = (ComplexMenuWidget) cmw->complex_menu.parent; } } /* Function Name: Highlight * Description: Highlights current entry. * Arguments: w - the complex menu widget. * event - the event that caused this action. * params, num_params - ** NOT USED ** * Returns: none */ static void Highlight(Widget w, XEvent *event, String *params, Cardinal *num_params) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject entry; CmeObjectClass class; ShellWidget shell_widget = (ShellWidget)w; #if defined(CmeDebug) printf("Highlight(%lx) '%s' ", (unsigned long)w, cmw->core.name); #endif if (shell_widget->shell.popped_up != TRUE) { #if defined(CmeDebug) printf("not popped up -- bogus\n"); #endif return; } if ( !XtIsSensitive(w) ) { #if defined(CmeDebug) printf("not sensitive, nop\n"); #endif return; } entry = GetEventEntry(w, event); if (entry == cmw->complex_menu.entry_set) { #if defined(CmeDebug) printf("already set, nop\n"); #endif return; } #if defined(CmeDebug) printf("unhighlighting, "); #endif Unhighlight(w, event, params, num_params); if (entry == NULL) { #if defined(CmeDebug) printf("no new entry, done\n"); #endif return; } if ( !XtIsSensitive( (Widget) entry)) { #if defined(CmeDebug) printf("new entry isn't sensitive, done\n"); #endif cmw->complex_menu.entry_set = NULL; return; } cmw->complex_menu.entry_set = entry; class = (CmeObjectClass) entry->object.widget_class; #if defined(CmeDebug) printf("highlighting %lx '%s'\n", (unsigned long)entry, XtParent(((Widget)entry))->core.name); #endif (class->cme_class.highlight) ( (Widget) entry); } static void NotifyCallback(XtPointer closure, XtIntervalId *id _is_unused) { CmeObject entry = closure; CmeObjectClass class; #if defined(CmeDebug) printf("NotifyCallback %lx\n", (unsigned long)entry); #endif class = (CmeObjectClass) entry->object.widget_class; (class->cme_class.notify)( (Widget) entry ); } /* Function Name: Notify * Description: Notify user of current entry. * Arguments: w - the complex menu widget. * event - the event that caused this action. * params, num_params - ** NOT USED ** * Returns: none */ static void Notify(Widget w, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject entry = cmw->complex_menu.entry_set; #if defined(CmeDebug) printf("Notify(%lx) '%s': ", (unsigned long)w, cmw->core.name); #endif if (entry != NULL && XtIsSensitive((Widget) entry)) { #if defined(CmeDebug) /*[*/ printf("just notifying 0x%lx\n", (unsigned long)entry); #endif /*]*/ XtAppAddTimeOut(XtWidgetToApplicationContext(w), 1L, NotifyCallback, (XtPointer)entry); } #if defined(CmeDebug) /*[*/ else printf("no entry\n"); #endif /*]*/ cmw->complex_menu.entry_set = NULL; return; } /************************************************************ * * Public Functions. * ************************************************************/ /* Function Name: XawComplexMenuAddGlobalActions * Description: adds the global actions to the complex menu widget. * Arguments: app_con - the appcontext. * Returns: none. */ void XawComplexMenuAddGlobalActions(XtAppContext app_con) { XtInitializeWidgetClass(complexMenuWidgetClass); XmuCallInitializers( app_con ); } /* Function Name: XawComplexMenuGetActiveEntry * Description: Gets the currently active (set) entry. * Arguments: w - the cmw widget. * Returns: the currently set entry or NULL if none is set. */ Widget XawComplexMenuGetActiveEntry(Widget w) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; return( (Widget) cmw->complex_menu.entry_set); } /* Function Name: XawComplexMenuClearActiveEntry * Description: Unsets the currently active (set) entry. * Arguments: w - the cmw widget. * Returns: none. */ void XawComplexMenuClearActiveEntry(Widget w) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; cmw->complex_menu.entry_set = NULL; cmw->complex_menu.prev_entry = NULL; } /************************************************************ * * Private Functions. * ************************************************************/ /* Function Name: CreateLabel * Description: Creates a the menu label. * Arguments: w - the cmw widget. * Returns: none. * * Creates the label object and makes sure it is the first child in * in the list. */ static void CreateLabel(Widget w) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; register Widget * child, * next_child; register int i; Arg args[2]; if ( (cmw->complex_menu.label_string == NULL) || (cmw->complex_menu.label != NULL) ) { char error_buf[BUFSIZ]; (void) snprintf(error_buf, sizeof(error_buf), "Xaw Complex Menu Widget: %s or %s, %s", "label string is NULL", "label already exists", "no label is being created."); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } XtSetArg(args[0], XtNlabel, cmw->complex_menu.label_string); XtSetArg(args[1], XtNjustify, XtJustifyCenter); cmw->complex_menu.label = (CmeObject) XtCreateManagedWidget("menuLabel", cmw->complex_menu.label_class, w, args, TWO); next_child = NULL; for (child = cmw->composite.children + cmw->composite.num_children, i = cmw->composite.num_children ; i > 0 ; i--, child--) { if (next_child != NULL) *next_child = *child; next_child = child; } *child = (Widget) cmw->complex_menu.label; } /* Function Name: Layout * Description: lays the menu entries out all nice and neat. * Arguments: w - See below (+++) * width_ret, height_ret - The returned width and * height values. * Returns: none. * * if width == NULL || height == NULL then it assumes the you do not care * about the return values, and just want a relayout. * * if this is not the case then it will set width_ret and height_ret * to be width and height that the child would get if it were layed out * at this time. * * +++ "w" can be the complex menu widget or any of its object children. */ static void Layout(Widget w, Dimension *width_ret, Dimension *height_ret) { CmeObject current_entry, *entry; ComplexMenuWidget cmw; Dimension width, height; Boolean do_layout = ((height_ret == NULL) || (width_ret == NULL)); Boolean allow_change_size; height = 0; if ( XtIsSubclass(w, complexMenuWidgetClass) ) { cmw = (ComplexMenuWidget) w; current_entry = NULL; } else { cmw = (ComplexMenuWidget) XtParent(w); current_entry = (CmeObject) w; } allow_change_size = (!XtIsRealized((Widget)cmw) || (cmw->shell.allow_shell_resize)); if ( cmw->complex_menu.menu_height ) height = cmw->core.height; else if (do_layout) { height = cmw->complex_menu.top_margin; ForAllChildren(cmw, entry) { if (!XtIsManaged( (Widget) *entry)) continue; if ( (cmw->complex_menu.row_height != 0) && (*entry != cmw->complex_menu.label) ) (*entry)->rectangle.height = cmw->complex_menu.row_height; (*entry)->rectangle.y = height; (*entry)->rectangle.x = 0; height += (*entry)->rectangle.height; } height += cmw->complex_menu.bottom_margin; } else { if ((cmw->complex_menu.row_height != 0) && (current_entry != cmw->complex_menu.label) ) height = cmw->complex_menu.row_height; } if (cmw->complex_menu.menu_width) width = cmw->core.width; else if ( allow_change_size ) width = GetMenuWidth((Widget) cmw, (Widget) current_entry); else width = cmw->core.width; if (do_layout) { ForAllChildren(cmw, entry) if (XtIsManaged( (Widget) *entry)) (*entry)->rectangle.width = width; if (allow_change_size) MakeSetValuesRequest((Widget) cmw, width, height); } else { *width_ret = width; if (height != 0) *height_ret = height; } } /* Function Name: AddPositionAction * Description: Adds the XawPositionComplexMenu action to the global * action list for this appcon. * Arguments: app_con - the application context for this app. * data - NOT USED. * Returns: none. */ static void AddPositionAction(XtAppContext app_con, caddr_t data _is_unused) { static XtActionsRec pos_action[] = { { "XawPositionComplexMenu", PositionMenuAction }, }; XtAppAddActions(app_con, pos_action, XtNumber(pos_action)); } /* Function Name: FindMenu * Description: Find the menu give a name and reference widget. * Arguments: widget - reference widget. * name - the menu widget's name. * Returns: the menu widget or NULL. */ static Widget FindMenu(Widget widget, String name) { register Widget w, menu; for ( w = widget ; w != NULL ; w = XtParent(w) ) if ( (menu = XtNameToWidget(w, name)) != NULL ) return(menu); return(NULL); } /* Function Name: PositionMenu * Description: Places the menu * Arguments: w - the complex menu widget. * location - a pointer the the position or NULL. * Returns: none. */ static void PositionMenu(Widget w, XPoint *location) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject entry; XPoint t_point; if (location == NULL) { Window junk1, junk2; int root_x, root_y, junkX, junkY; unsigned int junkM; location = &t_point; if (XQueryPointer(XtDisplay(w), XtWindow(w), &junk1, &junk2, &root_x, &root_y, &junkX, &junkY, &junkM) == FALSE) { char error_buf[BUFSIZ]; (void) snprintf(error_buf, sizeof(error_buf), "%s %s", "Xaw - ComplexMenuWidget:", "Could not find location of mouse pointer"); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } location->x = (short) root_x; location->y = (short) root_y; } /* * The width will not be correct unless it is realized. */ XtRealizeWidget(w); location->x -= (Position) w->core.width/2; if (cmw->complex_menu.popup_entry == NULL) entry = cmw->complex_menu.label; else entry = cmw->complex_menu.popup_entry; if (entry != NULL) location->y -= entry->rectangle.y + entry->rectangle.height/2; MoveMenu(w, (Position) location->x, (Position) location->y); } /* Function Name: MoveMenu * Description: Actually moves the menu, may force it to * to be fully visable if menu_on_screen is TRUE. * Arguments: w - the complex menu widget. * x, y - the current location of the widget. * Returns: none */ static void MoveMenu(Widget w, Position x, Position y) { Arg arglist[2]; Cardinal num_args = 0; ComplexMenuWidget cmw = (ComplexMenuWidget) w; if (cmw->complex_menu.menu_on_screen) { int width = w->core.width + 2 * w->core.border_width; int height = w->core.height + 2 * w->core.border_width; if (x >= 0) { int scr_width = WidthOfScreen(XtScreen(w)); if (x + width > scr_width) x = scr_width - width; } if (x < 0) x = 0; if (y >= 0) { int scr_height = HeightOfScreen(XtScreen(w)); if (y + height > scr_height) y = scr_height - height; } if (y < 0) y = 0; } XtSetArg(arglist[num_args], XtNx, x); num_args++; XtSetArg(arglist[num_args], XtNy, y); num_args++; XtSetValues(w, arglist, num_args); } /* Function Name: ChangeCursorOnGrab * Description: Changes the cursor on the active grab to the one * specified in out resource list. * Arguments: w - the widget. * junk, garbage - ** NOT USED **. * Returns: None. */ static void ChangeCursorOnGrab(Widget w, XtPointer junk _is_unused, XtPointer garbage _is_unused) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; #if defined(CmeDebug) printf("ChangeCursorOnGrab(%lx) '%s': parent=%lx '%s'\n", (unsigned long)w, cmw->core.name, (unsigned long)cmw->complex_menu.parent, cmw->complex_menu.parent? cmw->complex_menu.parent->core.name: "(null)"); #endif cmw->complex_menu.deferred_notify = NULL; cmw->complex_menu.prev_entry = NULL; /* * The event mask here is what is currently in the MIT implementation. * There really needs to be a way to get the value of the mask out * of the toolkit (CDP 5/26/89). */ XChangeActivePointerGrab(XtDisplay(w), ButtonPressMask|ButtonReleaseMask, cmw->complex_menu.cursor, XtLastTimestampProcessed(XtDisplay(w))); } static void ClearParent(Widget w, XtPointer junk _is_unused, XtPointer garbage _is_unused) { #if defined(CmeDebug) ComplexMenuWidget cmw = (ComplexMenuWidget) w; #endif #if defined(CmeDebug) printf("ClearParent(%lx) '%s': parent=%lx '%s', popped down, notifying\n", (unsigned long)w, cmw->core.name, (unsigned long)cmw->complex_menu.parent, cmw->complex_menu.parent? cmw->complex_menu.parent->core.name: "(null)"); #endif Notify(w, NULL, NULL, NULL); } /* Function Name: MakeSetValuesRequest * Description: Makes a (possibly recursive) call to SetValues, * I take great pains to not go into an infinite loop. * Arguments: w - the complex menu widget. * width, height - the size of the ask for. * Returns: none */ static void MakeSetValuesRequest(Widget w, Dimension width, Dimension height) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; Arg arglist[2]; Cardinal num_args = (Cardinal) 0; if ( !cmw->complex_menu.recursive_set_values ) { if ( (cmw->core.width != width) || (cmw->core.height != height) ) { cmw->complex_menu.recursive_set_values = TRUE; XtSetArg(arglist[num_args], XtNwidth, width); num_args++; XtSetArg(arglist[num_args], XtNheight, height); num_args++; XtSetValues(w, arglist, num_args); } else if (XtIsRealized( (Widget) cmw)) Redisplay((Widget) cmw, (XEvent *) NULL, (Region) NULL); } cmw->complex_menu.recursive_set_values = FALSE; } /* Function Name: GetMenuWidth * Description: Sets the length of the widest entry in pixels. * Arguments: w - the complex menu widget. * Returns: width of menu. */ static Dimension GetMenuWidth(Widget w, Widget w_ent) { CmeObject cur_entry = (CmeObject) w_ent; ComplexMenuWidget cmw = (ComplexMenuWidget) w; Dimension width, widest = (Dimension) 0; CmeObject * entry; if ( cmw->complex_menu.menu_width ) return(cmw->core.width); ForAllChildren(cmw, entry) { XtWidgetGeometry preferred; if (!XtIsManaged( (Widget) *entry)) continue; if (*entry != cur_entry) { XtQueryGeometry((Widget) *entry, NULL, &preferred); if (preferred.request_mode & CWWidth) width = preferred.width; else width = (*entry)->rectangle.width; } else width = (*entry)->rectangle.width; if ( width > widest ) widest = width; } return(widest); } /* Function Name: GetMenuHeight * Description: Sets the length of the widest entry in pixels. * Arguments: w - the complex menu widget. * Returns: width of menu. */ static Dimension GetMenuHeight(Widget w) { ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject * entry; Dimension height; if (cmw->complex_menu.menu_height) return(cmw->core.height); height = cmw->complex_menu.top_margin + cmw->complex_menu.bottom_margin; if (cmw->complex_menu.row_height == 0) { ForAllChildren(cmw, entry) if (XtIsManaged ((Widget) *entry)) height += (*entry)->rectangle.height; } else height += cmw->complex_menu.row_height * cmw->composite.num_children; return(height); } /* Function Name: GetEventEntry * Description: Gets an entry given an event that has X and Y coords. * Arguments: w - the complex menu widget. * event - the event. * Returns: the entry that this point is in. */ static CmeObject GetEventEntry(Widget w, XEvent *event) { Position x_loc = 0, y_loc = 0; ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject * entry; switch (event->type) { case MotionNotify: x_loc = event->xmotion.x; y_loc = event->xmotion.y; break; case EnterNotify: case LeaveNotify: x_loc = event->xcrossing.x; y_loc = event->xcrossing.y; break; case ButtonPress: case ButtonRelease: x_loc = event->xbutton.x; y_loc = event->xbutton.y; break; default: XtAppError(XtWidgetToApplicationContext(w), "Unknown event type in GetEventEntry()."); break; } if ( (x_loc < 0) || (x_loc >= (int)cmw->core.width) || (y_loc < 0) || (y_loc >= (int)cmw->core.height) ) return(NULL); ForAllChildren(cmw, entry) { if (!XtIsManaged ((Widget) *entry)) continue; if ( ((*entry)->rectangle.y < y_loc) && ((*entry)->rectangle.y + (int) (*entry)->rectangle.height > y_loc) ) { if ( *entry == cmw->complex_menu.label ) return(NULL); /* cannot select the label. */ else return(*entry); } } return(NULL); } /* Function Name: GetRightEntry * Description: Gets an entry given a crossing event that has X and Y * coords, unless it exited to the right. * Arguments: w - the complex menu widget. * event - the event. * Returns: the entry that this point is in. */ static CmeObject GetRightEntry(Widget w, XEvent *event) { Position x_loc, y_loc; ComplexMenuWidget cmw = (ComplexMenuWidget) w; CmeObject * entry; x_loc = event->xcrossing.x; y_loc = event->xcrossing.y; if ( (x_loc < 0) || /*(x_loc < (int)cmw->core.width) ||*/ (y_loc < 0) || (y_loc >= (int)cmw->core.height) ) return(NULL); ForAllChildren(cmw, entry) { if (!XtIsManaged ((Widget) *entry)) continue; if ( ((*entry)->rectangle.y < y_loc) && ((*entry)->rectangle.y + (int) (*entry)->rectangle.height > y_loc) ) { if ( *entry == cmw->complex_menu.label ) return(NULL); /* cannot select the label. */ else return(*entry); } } return(NULL); } suite3270-3.6/x3270/CmplxMenu.h0000664000076500007650000001514413221577164014046 0ustar pdmpdm/* * (from) $XConsortium: SimpleMenu.h,v 1.20 91/02/17 13:18:55 rws Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Chris D. Peterson, MIT X Consortium */ /* * ComplexMenu.h - Public Header file for ComplexMenu widget. * (from) SimpleMenu.h - Public Header file for SimpleMenu widget. * * This is the public header file for the Athena ComplexMenu widget. * It is intended to provide one pane pulldown and popup menus within * the framework of the X Toolkit. As the name implies it is a first and * by no means complete implementation of menu code. It does not attempt to * fill the needs of all applications, but does allow a resource oriented * interface to menus. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #ifndef _ComplexMenu_h #define _ComplexMenu_h #include #include #include /**************************************************************** * * ComplexMenu widget * ****************************************************************/ /* ComplexMenu Resources: Name Class RepType Default Value ---- ----- ------- ------------- background Background Pixel XtDefaultBackground backgroundPixmap BackgroundPixmap Pixmap None borderColor BorderColor Pixel XtDefaultForeground borderPixmap BorderPixmap Pixmap None borderWidth BorderWidth Dimension 1 bottomMargin VerticalMargins Dimension VerticalSpace columnWidth ColumnWidth Dimension Width of widest text cursor Cursor Cursor None destroyCallback Callback Pointer NULL height Height Dimension 0 label Label String NULL (No label) labelClass LabelClass Pointer cmeBSBObjectClass mappedWhenManaged MappedWhenManaged Boolean True rowHeight RowHeight Dimension Height of Font sensitive Sensitive Boolean True topMargin VerticalMargins Dimension VerticalSpace width Width Dimension 0 x Position Position 0n y Position Position 0 */ typedef struct _ComplexMenuClassRec* ComplexMenuWidgetClass; typedef struct _ComplexMenuRec* ComplexMenuWidget; extern WidgetClass complexMenuWidgetClass; #define XtNcursor "cursor" #define XtNbottomMargin "bottomMargin" #define XtNcolumnWidth "columnWidth" #define XtNlabelClass "labelClass" #define XtNmenuOnScreen "menuOnScreen" #define XtNpopupOnEntry "popupOnEntry" #define XtNrowHeight "rowHeight" #define XtNtopMargin "topMargin" #define XtNcMparent "cMparent" #define XtNcMdefer "cMdefer" #define XtCColumnWidth "ColumnWidth" #define XtCLabelClass "LabelClass" #define XtCMenuOnScreen "MenuOnScreen" #define XtCPopupOnEntry "PopupOnEntry" #define XtCRowHeight "RowHeight" #define XtCVerticalMargins "VerticalMargins" #define XtCCMparent "CMparent" #define XtCCMdefer "CMdefer" /************************************************************ * * Public Functions. * ************************************************************/ _XFUNCPROTOBEGIN /* Function Name: XawComplexMenuAddGlobalActions * Description: adds the global actions to the complex menu widget. * Arguments: app_con - the appcontext. * Returns: none. */ extern void XawComplexMenuAddGlobalActions( #if NeedFunctionPrototypes XtAppContext /* app_con */ #endif ); /* Function Name: XawComplexMenuGetActiveEntry * Description: Gets the currently active (set) entry. * Arguments: w - the smw widget. * Returns: the currently set entry or NULL if none is set. */ extern Widget XawComplexMenuGetActiveEntry( #if NeedFunctionPrototypes Widget /* w */ #endif ); /* Function Name: XawComplexMenuClearActiveEntry * Description: Unsets the currently active (set) entry. * Arguments: w - the smw widget. * Returns: none. */ extern void XawComplexMenuClearActiveEntry( #if NeedFunctionPrototypes Widget /* w */ #endif ); _XFUNCPROTOEND #endif /* _ComplexMenu_h */ suite3270-3.6/x3270/CmplxMenuP.h0000664000076500007650000001244713221577164014171 0ustar pdmpdm/* * (from) $XConsortium: SimpleMenP.h,v 1.12 89/12/11 15:01:39 kit Exp $ * * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * ComplexMenuP.h - Private Header file for ComplexMenu widget. * (from) SimpleMenuP.h - Private Header file for SimpleMenu widget. * * Date: April 3, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #ifndef _ComplexMenuP_h #define _ComplexMenuP_h #include "CmplxMenu.h" #include "CmeP.h" #include #define ForAllChildren(smw, childP) \ for ( (childP) = (CmeObject *) (smw)->composite.children ; \ (childP) < (CmeObject *) ( (smw)->composite.children + \ (smw)->composite.num_children ) ; \ (childP)++ ) typedef struct { XtPointer extension; /* For future needs. */ } ComplexMenuClassPart; typedef struct _ComplexMenuClassRec { CoreClassPart core_class; CompositeClassPart composite_class; ShellClassPart shell_class; OverrideShellClassPart override_shell_class; ComplexMenuClassPart complexMenu_class; } ComplexMenuClassRec; extern ComplexMenuClassRec complexMenuClassRec; typedef struct _ComplexMenuPart { /* resources */ String label_string; /* The string for the label or NULL. */ CmeObject label; /* If label_string is non-NULL then this is the label widget. */ WidgetClass label_class; /* Widget Class of the menu label object. */ Dimension top_margin; /* Top and bottom margins. */ Dimension bottom_margin; Dimension row_height; /* height of each row (menu entry) */ Cursor cursor; /* The menu's cursor. */ CmeObject popup_entry; /* The entry to position the cursor on for when using XawPositionComplexMenu. */ Boolean menu_on_screen; /* Force the menus to be fully on the screen.*/ int backing_store; /* What type of backing store to use. */ /* private state */ Boolean recursive_set_values; /* contain a possible infinite loop. */ Boolean menu_width; /* If true then force width to remain core.width */ Boolean menu_height; /* Just like menu_width, but for height. */ CmeObject entry_set; /* The entry that is currently set or highlighted. */ CmeObject prev_entry; /* The entry that was previously set or highlighted. */ Widget parent; /* If non-NULL, the widget that popped this menu up as a pullright. */ Widget deferred_notify; /* If non-NULL, the widget (from a subordinate pullright menu) to notify on exit. */ } ComplexMenuPart; typedef struct _ComplexMenuRec { CorePart core; CompositePart composite; ShellPart shell; OverrideShellPart override; ComplexMenuPart complex_menu; } ComplexMenuRec; #endif /* _ComplexMenuP_h */ suite3270-3.6/x3270/conf.h.in0000664000076500007650000000415513221577164013470 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2014-2015, 2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * conf.h * System-specific #defines for libraries and library functions. */ /* Libraries. */ /* Header files. */ #undef HAVE_SYS_SELECT_H #undef HAVE_READLINE_HISTORY_H #undef HAVE_PTY_H #undef HAVE_LIBUTIL_H #undef HAVE_UTIL_H #undef HAVE_GETOPT_H /* Uncommon functions. */ #undef HAVE_VASPRINTF #undef HAVE_FSEEKO #undef HAVE_FORKPTY /* Configuration options. */ /* Standard types. */ #undef HAVE_DECL___UINT32_T #undef HAVE_DECL_UINT32_T #undef HAVE_DECL___UINT16T #undef HAVE_DECL_UINT16_T /* Optional parts. */ #undef X3270_DBCS #undef X3270_LOCAL_PROCESS #undef X3270_IPV6 suite3270-3.6/x3270/configure0000775000076500007650000061143213221577164013676 0ustar pdmpdm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for x3270 3.x. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='x3270' PACKAGE_TARNAME='x3270' PACKAGE_VERSION='3.x' PACKAGE_STRING='x3270 3.x' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS XLIB XINC mkfontdir_found bdftopcf_found LIBX3270DIR CIFONTDIR IFONTDIR FALLBACKS_O DEFINE_UAD UAD_FLAGS XMKMF EGREP GREP CPP CCOPTIONS host_os host_vendor host_cpu host build_os build_vendor build_cpu build OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_x enable_app_defaults with_fontdir enable_dbcs enable_local_process enable_ipv6 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures x3270 3.x to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/x3270] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of x3270 3.x:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-app-defaults use a separate app-defaults file --disable-dbcs leave out DBCS support --disable-local-process leave out local process support --disable-ipv6 leave out IPv6 support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System --with-fontdir=DIR install fonts in directory DIR DIR=misc Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF x3270 configure 3.x generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by x3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers conf.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case "$host_os" in solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations -Wno-extended-offsetof" ;; linux*) CPPFLAGS="-D_POSIX_SOURCE -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare -std=c99 -pedantic -Wno-variadic-macros -MMD -MP" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SELECT_H 1 _ACEOF fi done for ac_header in pty.h do : ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTY_H 1 _ACEOF fi done for ac_header in libutil.h do : ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBUTIL_H 1 _ACEOF fi done for ac_header in util.h do : ac_fn_c_check_header_mongrel "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTIL_H 1 _ACEOF fi done for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = "yes"; then as_fn_error $? "'Cannot find X utilities or libraries'" "$LINENO" 5; fi if test -n "$x_includes" then CPPFLAGS="$CPPFLAGS -I$x_includes" fi if test -n "$x_libraries" then LDFLAGS="$LDFLAGS -L$x_libraries" fi # Check whether --enable-app-defaults was given. if test "${enable_app_defaults+set}" = set; then : enableval=$enable_app_defaults; DEFINE_UAD="#define USE_APP_DEFAULTS 1"; if test "$enable_app_defaults" = "yes"; then UAD_FLAGS="-DCOLOR"; else UAD_FLAGS="$enable_app_defaults"; fi else DEFINE_UAD=""; UAD_FLAGS="-DCOLOR"; FALLBACKS_O=fallbacks.o fi # Check whether --with-fontdir was given. if test "${with_fontdir+set}" = set; then : withval=$with_fontdir; fi case "$with_fontdir" in ""|yes|no) IFONTDIR='$'"(FONTDIR)/misc" CIFONTDIR='$'"(exec_prefix)/fonts/misc" ;; /*) IFONTDIR="$with_fontdir" CIFONTDIR="$with_fontdir" ;; *) IFONTDIR='$'"(FONTDIR)/$with_fontdir" CIFONTDIR='$'"(exec_prefix)/fonts/$with_fontdir" ;; esac # Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing forkpty" >&5 $as_echo_n "checking for library containing forkpty... " >&6; } if ${ac_cv_search_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char forkpty (); int main () { return forkpty (); ; return 0; } _ACEOF for ac_lib in '' util; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_forkpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_forkpty+:} false; then : break fi done if ${ac_cv_search_forkpty+:} false; then : else ac_cv_search_forkpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_forkpty" >&5 $as_echo "$ac_cv_search_forkpty" >&6; } ac_res=$ac_cv_search_forkpty if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" if test "x$ac_cv_func_forkpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl_s nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_header in X11/Shell.h do : ac_fn_c_check_header_mongrel "$LINENO" "X11/Shell.h" "ac_cv_header_X11_Shell_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Shell_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_SHELL_H 1 _ACEOF else as_fn_error $? "\"Cannot find X11 header files\"" "$LINENO" 5 fi done for ac_header in X11/Xmu/Atoms.h do : ac_fn_c_check_header_mongrel "$LINENO" "X11/Xmu/Atoms.h" "ac_cv_header_X11_Xmu_Atoms_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Xmu_Atoms_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_XMU_ATOMS_H 1 _ACEOF else as_fn_error $? "\"Cannot find Xmu header files\"" "$LINENO" 5 fi done for ac_header in X11/Xaw/Form.h do : ac_fn_c_check_header_mongrel "$LINENO" "X11/Xaw/Form.h" "ac_cv_header_X11_Xaw_Form_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Xaw_Form_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_XAW_FORM_H 1 _ACEOF else as_fn_error $? "\"Cannot find Xaw header files\"" "$LINENO" 5 fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing XFillRectangle" >&5 $as_echo_n "checking for library containing XFillRectangle... " >&6; } if ${ac_cv_search_XFillRectangle+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XFillRectangle (); int main () { return XFillRectangle (); ; return 0; } _ACEOF for ac_lib in '' X11; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_XFillRectangle=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_XFillRectangle+:} false; then : break fi done if ${ac_cv_search_XFillRectangle+:} false; then : else ac_cv_search_XFillRectangle=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_XFillRectangle" >&5 $as_echo "$ac_cv_search_XFillRectangle" >&6; } ac_res=$ac_cv_search_XFillRectangle if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "\"Cannot find libX11\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing XtVaSetValues" >&5 $as_echo_n "checking for library containing XtVaSetValues... " >&6; } if ${ac_cv_search_XtVaSetValues+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XtVaSetValues (); int main () { return XtVaSetValues (); ; return 0; } _ACEOF for ac_lib in '' Xt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_XtVaSetValues=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_XtVaSetValues+:} false; then : break fi done if ${ac_cv_search_XtVaSetValues+:} false; then : else ac_cv_search_XtVaSetValues=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_XtVaSetValues" >&5 $as_echo "$ac_cv_search_XtVaSetValues" >&6; } ac_res=$ac_cv_search_XtVaSetValues if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "\"Cannot find libXt\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing XmuAddInitializer" >&5 $as_echo_n "checking for library containing XmuAddInitializer... " >&6; } if ${ac_cv_search_XmuAddInitializer+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XmuAddInitializer (); int main () { return XmuAddInitializer (); ; return 0; } _ACEOF for ac_lib in '' Xmu; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_XmuAddInitializer=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_XmuAddInitializer+:} false; then : break fi done if ${ac_cv_search_XmuAddInitializer+:} false; then : else ac_cv_search_XmuAddInitializer=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_XmuAddInitializer" >&5 $as_echo "$ac_cv_search_XmuAddInitializer" >&6; } ac_res=$ac_cv_search_XmuAddInitializer if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "\"Cannot find libXmu\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing XawInitializeWidgetSet" >&5 $as_echo_n "checking for library containing XawInitializeWidgetSet... " >&6; } if ${ac_cv_search_XawInitializeWidgetSet+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XawInitializeWidgetSet (); int main () { return XawInitializeWidgetSet (); ; return 0; } _ACEOF for ac_lib in '' Xaw; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_XawInitializeWidgetSet=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_XawInitializeWidgetSet+:} false; then : break fi done if ${ac_cv_search_XawInitializeWidgetSet+:} false; then : else ac_cv_search_XawInitializeWidgetSet=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_XawInitializeWidgetSet" >&5 $as_echo "$ac_cv_search_XawInitializeWidgetSet" >&6; } ac_res=$ac_cv_search_XawInitializeWidgetSet if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "\"Cannot find libXaw\"" "$LINENO" 5 fi for ac_func in vasprintf do : ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VASPRINTF 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi # Extract the first word of "bdftopcf", so it can be a program name with args. set dummy bdftopcf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_bdftopcf_found+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$bdftopcf_found"; then ac_cv_prog_bdftopcf_found="$bdftopcf_found" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_bdftopcf_found="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_bdftopcf_found" && ac_cv_prog_bdftopcf_found="notfound" fi fi bdftopcf_found=$ac_cv_prog_bdftopcf_found if test -n "$bdftopcf_found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bdftopcf_found" >&5 $as_echo "$bdftopcf_found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$bdftopcf_found" = "notfound" then as_fn_error $? "'Cannot find bdftopcf'" "$LINENO" 5 fi # Extract the first word of "mkfontdir", so it can be a program name with args. set dummy mkfontdir; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_mkfontdir_found+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$mkfontdir_found"; then ac_cv_prog_mkfontdir_found="$mkfontdir_found" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_mkfontdir_found="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_mkfontdir_found" && ac_cv_prog_mkfontdir_found="notfound" fi fi mkfontdir_found=$ac_cv_prog_mkfontdir_found if test -n "$mkfontdir_found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mkfontdir_found" >&5 $as_echo "$mkfontdir_found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$mkfontdir_found" = "notfound" then as_fn_error $? "'Cannot find mkfontdir'" "$LINENO" 5 fi # Check whether --enable-dbcs was given. if test "${enable_dbcs+set}" = set; then : enableval=$enable_dbcs; fi case "$enable_dbcs" in no) ;; *) $as_echo "#define X3270_DBCS 1" >>confdefs.h ;; esac # Check whether --enable-local_process was given. if test "${enable_local_process+set}" = set; then : enableval=$enable_local_process; fi case "$enable_local_process" in ""|yes) $as_echo "#define X3270_LOCAL_PROCESS 1" >>confdefs.h ;; esac # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; fi case "$enable_ipv6" in ""|yes) $as_echo "#define X3270_IPV6 1" >>confdefs.h ;; esac if test "$x_includes" then XINC=-I$x_includes fi if test "$x_libraries" then XLIB=-L$x_libraries fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by x3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ x3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ac_config_files="$ac_config_files Makefile.obj" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by x3270 $as_me 3.x, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ x3270 config.status 3.x configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "conf.h") CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile.obj") CONFIG_FILES="$CONFIG_FILES Makefile.obj" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi suite3270-3.6/x3270/configure.in0000664000076500007650000001274513221577164014302 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2016-2017 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Paul Mattes nor his contributors may be used dnl to endorse or promote products derived from this software without dnl specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS dnl OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE dnl DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, dnl INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES dnl (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR dnl SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING dnl IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. dnl Process this file with autoconf to produce a configure script. AC_INIT(x3270,3.x) AC_PREREQ(2.50) AC_CONFIG_HEADER(conf.h) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_CC dnl Compute host-specific flags. AC_CANONICAL_HOST case "$host_os" in solaris2*) CPPFLAGS=-D__EXTENSIONS__ ;; darwin*) CCOPTIONS="-no-cpp-precomp -Wno-deprecated-declarations -Wno-extended-offsetof" ;; linux*) CPPFLAGS="-D_POSIX_SOURCE -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE" ;; esac if test "$GCC" = yes then # Add common gcc options, plus flags for dependency generation. CCOPTIONS="$CCOPTIONS -Wall -Wsign-compare -std=c99 -pedantic -Wno-variadic-macros -MMD -MP" fi AC_SUBST(host) AC_SUBST(CCOPTIONS) dnl Checks for header files. AC_CHECK_HEADERS(sys/select.h) AC_CHECK_HEADERS(pty.h) AC_CHECK_HEADERS(libutil.h) AC_CHECK_HEADERS(util.h) AC_CHECK_HEADERS(getopt.h) dnl Check for X AC_PATH_X if test "$no_x" = "yes"; then AC_MSG_ERROR('Cannot find X utilities or libraries'); fi if test -n "$x_includes" then CPPFLAGS="$CPPFLAGS -I$x_includes" fi if test -n "$x_libraries" then LDFLAGS="$LDFLAGS -L$x_libraries" fi dnl Check for --enable-app-defaults AC_ARG_ENABLE(app-defaults, [ --enable-app-defaults use a separate app-defaults file], [DEFINE_UAD="#define USE_APP_DEFAULTS 1"; if test "$enable_app_defaults" = "yes"; then UAD_FLAGS="-DCOLOR"; else UAD_FLAGS="$enable_app_defaults"; fi], [DEFINE_UAD=""; UAD_FLAGS="-DCOLOR"; FALLBACKS_O=fallbacks.o]) AC_SUBST(UAD_FLAGS) AC_SUBST(DEFINE_UAD) AC_SUBST(FALLBACKS_O) dnl Check for --with-fontdir=DIR AC_ARG_WITH(fontdir,[ --with-fontdir=DIR install fonts in directory DIR [DIR=misc]]) case "$with_fontdir" in ""|yes|no) IFONTDIR='$'"(FONTDIR)/misc" CIFONTDIR='$'"(exec_prefix)/fonts/misc" ;; /*) IFONTDIR="$with_fontdir" CIFONTDIR="$with_fontdir" ;; *) IFONTDIR='$'"(FONTDIR)/$with_fontdir" CIFONTDIR='$'"(exec_prefix)/fonts/$with_fontdir" ;; esac AC_SUBST(IFONTDIR) AC_SUBST(CIFONTDIR) # Set up the configuration directory. LIBX3270DIR='${sysconfdir}/x3270' AC_SUBST(LIBX3270DIR) dnl Check for other libraries. dnl Note that the order here is important. The last libraries should appear dnl first, so that objects in them can be used by subsequent libraries. AC_SEARCH_LIBS(forkpty, util) AC_CHECK_FUNCS(forkpty) AC_SEARCH_LIBS(gethostbyname, nsl_s nsl) AC_SEARCH_LIBS(socket, socket) AC_CHECK_HEADERS(X11/Shell.h, , AC_MSG_ERROR("Cannot find X11 header files")) AC_CHECK_HEADERS(X11/Xmu/Atoms.h, , AC_MSG_ERROR("Cannot find Xmu header files")) AC_CHECK_HEADERS(X11/Xaw/Form.h, , AC_MSG_ERROR("Cannot find Xaw header files")) AC_SEARCH_LIBS(XFillRectangle, X11, , AC_MSG_ERROR("Cannot find libX11")) AC_SEARCH_LIBS(XtVaSetValues, Xt, , AC_MSG_ERROR("Cannot find libXt")) AC_SEARCH_LIBS(XmuAddInitializer, Xmu, , AC_MSG_ERROR("Cannot find libXmu")) AC_SEARCH_LIBS(XawInitializeWidgetSet, Xaw, , AC_MSG_ERROR("Cannot find libXaw")) dnl Checks for library functions. AC_CHECK_FUNCS(vasprintf) AC_FUNC_FSEEKO dnl Check for xmkmkf or bdftopcf and mkfontdir AC_CHECK_PROG(bdftopcf_found,bdftopcf,found,notfound) if test "$bdftopcf_found" = "notfound" then AC_MSG_ERROR('Cannot find bdftopcf') fi AC_CHECK_PROG(mkfontdir_found,mkfontdir,found,notfound) if test "$mkfontdir_found" = "notfound" then AC_MSG_ERROR('Cannot find mkfontdir') fi dnl Check for unwanted parts. AC_ARG_ENABLE(dbcs,[ --disable-dbcs leave out DBCS support]) case "$enable_dbcs" in no) ;; *) AC_DEFINE(X3270_DBCS,1) ;; esac AC_ARG_ENABLE(local_process,[ --disable-local-process leave out local process support]) case "$enable_local_process" in ""|yes) AC_DEFINE(X3270_LOCAL_PROCESS,1) ;; esac AC_ARG_ENABLE(ipv6,[ --disable-ipv6 leave out IPv6 support]) case "$enable_ipv6" in ""|yes) AC_DEFINE(X3270_IPV6,1) ;; esac if test "$x_includes" then XINC=-I$x_includes fi if test "$x_libraries" then XLIB=-L$x_libraries fi AC_SUBST(XINC) AC_SUBST(XLIB) AC_OUTPUT(Makefile) AC_OUTPUT(Makefile.obj) suite3270-3.6/x3270/dialog.c0000664000076500007650000002105113221577164013362 0ustar pdmpdm/* * Copyright (c) 1996-2012, 2014-2016 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * dialog.c * Common code for nontrival dialog boxes. */ #include "globals.h" #include #include #include #include #include #include #include #include #include #include #include #include "appres.h" #include "dialog.h" #include "ft_cut.h" #include "ft_dft.h" #include "ft.h" #include "host.h" #include "kybd.h" #include "macros.h" #include "objects.h" #include "popups.h" #include "telnet.h" #include "utils.h" #include "xmenubar.h" /* Globals. */ text_t t_numeric = T_NUMERIC; text_t t_hostfile = T_HOSTFILE; text_t t_unixfile = T_UNIXFILE; text_t t_command = T_COMMAND; bool s_true = true; bool s_false = false; /* Statics. */ static sr_t **srp = NULL; static sr_t *sr_last = NULL; static Widget focus_widget = NULL; static void focus_next(sr_t *s); /* Support functions for dialogs. */ /* Set one dialog (hack). */ void dialog_set(sr_t **srs, Widget f) { sr_t *s; srp = srs; for (s = *srp; s != NULL; s = s->next) { sr_last = s; } focus_widget = f; } /* Match one dimension of two widgets. */ void dialog_match_dimension(Widget w1, Widget w2, const char *n) { Dimension h1, h2; Dimension b1, b2; XtVaGetValues(w1, n, &h1, XtNborderWidth, &b1, NULL); XtVaGetValues(w2, n, &h2, XtNborderWidth, &b2, NULL); h1 += 2 * b1; h2 += 2 * b2; if (h1 > h2) XtVaSetValues(w2, n, h1 - (2 * b2), NULL); else if (h2 > h1) XtVaSetValues(w1, n, h2 - (2 * b1), NULL); } /* Apply a bitmap to a widget. */ void dialog_apply_bitmap(Widget w, Pixmap p) { Dimension d1; XtVaGetValues(w, XtNheight, &d1, NULL); if (d1 < 10) XtVaSetValues(w, XtNheight, 10, NULL); XtVaSetValues(w, XtNleftBitmap, p, NULL); } /* Flip a multi-valued toggle. */ void dialog_flip_toggles(struct toggle_list *toggle_list, Widget w) { int i; /* Flip the widget w to on, and the rest to off. */ for (i = 0; toggle_list->widgets[i] != NULL; i++) { /* Process each widget in the list */ dialog_mark_toggle(*(toggle_list->widgets+i), (*(toggle_list->widgets+i) == w) ? diamond : no_diamond); } } /* * Callback for text source changes. Edits the text to ensure it meets the * specified criteria. */ void dialog_text_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { XawTextBlock b; /* firstPos, length, ptr, format */ static XawTextBlock nullb = { 0, 0, NULL }; XawTextPosition pos = 0; int i; text_t t = *(text_t *)client_data; static bool called_back = false; if (called_back) return; else called_back = true; while (1) { bool replaced = false; XawTextSourceRead(w, pos, &b, 1024); if (b.length <= 0) break; nullb.format = b.format; for (i = 0; i < b.length; i++) { bool bad = false; char c = *(b.ptr + i); switch (t) { case T_NUMERIC: /* Only numbers. */ bad = !isdigit((unsigned char)c); break; case T_HOSTFILE: /* * Only printing characters and spaces; no * leading or trailing blanks. */ bad = !isprint((unsigned char)c) || (!pos && !i && c == ' '); break; case T_UNIXFILE: /* Only printing characters. */ bad = !isprint((unsigned char)c); break; case T_COMMAND: /* Only printing characters. */ bad = !isprint((unsigned char)c); break; default: /* Only printing characters, no spaces. */ bad = !isgraph((unsigned char)c); break; } if (bad) { XawTextSourceReplace(w, pos + i, pos + i + 1, &nullb); pos = 0; replaced = true; break; } } if (replaced) continue; /* rescan the same block */ pos += b.length; if (b.length < 1024) break; } called_back = false; } /* Register widget sensitivity, based on zero to three bools. */ void dialog_register_sensitivity(Widget w, bool *bvar1, bool bval1, bool *bvar2, bool bval2, bool *bvar3, bool bval3) { sr_t *s; bool f; /* Allocate a structure. */ s = (sr_t *)XtMalloc(sizeof(sr_t)); s->w = w; s->bvar1 = bvar1; s->bval1 = bval1; s->bvar2 = bvar2; s->bval2 = bval2; s->bvar3 = bvar3; s->bval3 = bval3; s->is_value = !strcmp(XtName(w), "value"); s->has_focus = false; /* Link it onto the chain. */ s->next = NULL; if (sr_last != NULL) sr_last->next = s; else *srp = s; sr_last = s; /* Set up the initial widget sensitivity. */ if (bvar1 == NULL) f = true; else { f = (*bvar1 == bval1); if (bvar2 != NULL) f &= (*bvar2 == bval2); if (bvar3 != NULL) f &= (*bvar3 == bval3); } XtVaSetValues(w, XtNsensitive, f, NULL); } /* Scan the list of registered widgets for a sensitivity change. */ void dialog_check_sensitivity(bool *bvar) { sr_t *s; for (s = *srp; s != NULL; s = s->next) { if (s->bvar1 == bvar || s->bvar2 == bvar || s->bvar3 == bvar) { bool f; f = (s->bvar1 != NULL && (*s->bvar1 == s->bval1)); if (s->bvar2 != NULL) f &= (*s->bvar2 == s->bval2); if (s->bvar3 != NULL) f &= (*s->bvar3 == s->bval3); XtVaSetValues(s->w, XtNsensitive, f, NULL); /* If it is now insensitive, move the focus. */ if (!f && s->is_value && s->has_focus) focus_next(s); } } } /* Move the input focus to the next sensitive value field. */ static void focus_next(sr_t *s) { sr_t *t; bool sen; /* Defocus this widget. */ s->has_focus = false; XawTextDisplayCaret(s->w, False); /* Search after. */ for (t = s->next; t != NULL; t = t->next) { if (t->is_value) { XtVaGetValues(t->w, XtNsensitive, &sen, NULL); if (sen) break; } } /* Wrap and search before. */ if (t == NULL) for (t = *srp; t != s && t != NULL; t = t->next) { if (t->is_value) { XtVaGetValues(t->w, XtNsensitive, &sen, NULL); if (sen) break; } } /* Move the focus. */ if (t != NULL && t != s) { t->has_focus = true; XawTextDisplayCaret(t->w, true); if (focus_widget) XtSetKeyboardFocus(focus_widget, t->w); } } /* Mark a toggle. */ void dialog_mark_toggle(Widget w, Pixmap p) { XtVaSetValues(w, XtNleftBitmap, p, NULL); } /* Dialog action procedures. */ /* Proceed to the next input field. */ void PA_dialog_next_xaction(Widget w, XEvent *event _is_unused, String *parms _is_unused, Cardinal *num_parms _is_unused) { sr_t *s; for (s = *srp; s != NULL; s = s->next) { if (s->w == w) { focus_next(s); return; } } } /* Set keyboard focus to an input field. */ void PA_dialog_focus_xaction(Widget w, XEvent *event _is_unused, String *parms _is_unused, Cardinal *num_parms _is_unused) { sr_t *s; /* Remove the focus from the widget that has it now. */ for (s = *srp; s != NULL; s = s->next) { if (s->has_focus) { if (s->w == w) return; s->has_focus = false; XawTextDisplayCaret(s->w, False); break; } } /* Find this object. */ for (s = *srp; s != NULL; s = s->next) { if (s->w == w) break; } if (s == NULL) return; /* Give it the focus. */ s->has_focus = true; XawTextDisplayCaret(w, True); if (focus_widget) XtSetKeyboardFocus(focus_widget, w); } suite3270-3.6/x3270/dialog.h0000664000076500007650000000552413221577164013376 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2014-2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * dialogc.h * Global declarations for dialog.c. */ typedef struct sr { struct sr *next; Widget w; bool *bvar1; bool bval1; bool *bvar2; bool bval2; bool *bvar3; bool bval3; bool is_value; bool has_focus; } sr_t; struct toggle_list { /* List of toggle widgets */ Widget *widgets; }; typedef enum { T_NUMERIC, T_HOSTFILE, T_UNIXFILE, T_COMMAND } text_t; extern text_t t_numeric; extern text_t t_hostfile; extern text_t t_unixfile; extern text_t t_command; extern bool s_true, s_false; void dialog_set(sr_t **, Widget); void dialog_apply_bitmap(Widget w, Pixmap p); void dialog_check_sensitivity(bool *bvar); void dialog_register_sensitivity(Widget w, bool *bvar1, bool bval1, bool *bvar2, bool bval2, bool *bvar3, bool bval3); void dialog_flip_toggles(struct toggle_list *toggle_list, Widget w); void dialog_text_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused); void dialog_match_dimension(Widget w1, Widget w2, const char *n); void dialog_mark_toggle(Widget w, Pixmap p); void PA_dialog_focus_xaction(Widget w, XEvent *event, String *parms, Cardinal *num_parms); void PA_dialog_next_xaction(Widget w, XEvent *event, String *parms, Cardinal *num_parms); suite3270-3.6/x3270/diamond.bm0000664000076500007650000000033213221577164013711 0ustar pdmpdm#define diamond_width 10 #define diamond_height 10 static unsigned char diamond_bits[] = { 0x00, 0x00, 0x10, 0x00, 0x68, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0xfd, 0x03, 0xfa, 0x01, 0xf4, 0x00, 0x68, 0x00, 0x10, 0x00}; suite3270-3.6/x3270/display8.c0000664000076500007650000333440413221577164013674 0ustar pdmpdm/* * Copyright (c) 2008-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * display8.c * Tables and lookup functions to map Unicode characters to * common X11 and x3270-specific 8-bit display character sets. */ #include "globals.h" #include "3270ds.h" #include "display8.h" #define ISO10646_IX 100 typedef struct { char *cset; /* Character set name */ ucs4_t u[256]; /* UCS-4 values for each display position */ } d8_t; static d8_t d8[] = { { "3270cg-1a", { /* CG 000 */ 0x00000000, 0x000000a0, 0x000020ac, 0x00000000, /* CG 004 */ 0x00000000, 0x00000000, 0x0000f8fd, 0x000000ad, /* CG 008 */ 0x0000003e, 0x0000003c, 0x0000005b, 0x0000005d, /* CG 00c */ 0x00000029, 0x00000028, 0x0000007d, 0x0000007b, /* CG 010 */ 0x00000020, 0x0000003d, 0x00000027, 0x00000022, /* CG 014 */ 0x0000002f, 0x0000005c, 0x0000007c, 0x000000a6, /* CG 018 */ 0x0000003f, 0x00000021, 0x00000024, 0x000000a2, /* CG 01c */ 0x000000a3, 0x000000a5, 0x000000b6, 0x000000a4, /* CG 020 */ 0x00000030, 0x00000031, 0x00000032, 0x00000033, /* CG 024 */ 0x00000034, 0x00000035, 0x00000036, 0x00000037, /* CG 028 */ 0x00000038, 0x00000039, 0x000000df, 0x000000a7, /* CG 02c */ 0x00000023, 0x00000040, 0x00000025, 0x0000005f, /* CG 030 */ 0x00000026, 0x0000002d, 0x0000002e, 0x0000002c, /* CG 034 */ 0x0000003a, 0x0000002b, 0x000000ac, 0x000000af, /* CG 038 */ 0x000000b0, 0x000000b7, 0x0000005e, 0x0000007e, /* CG 03c */ 0x000000a8, 0x00000060, 0x000000b4, 0x000000b8, /* CG 040 */ 0x000000e0, 0x000000e8, 0x000000ec, 0x000000f2, /* CG 044 */ 0x000000f9, 0x000000e3, 0x000000f5, 0x000000ff, /* CG 048 */ 0x000000dd, 0x000000fd, 0x000000e9, 0x000000bc, /* CG 04c */ 0x000000bd, 0x000000be, 0x000000fc, 0x000000e7, /* CG 050 */ 0x000000e4, 0x000000eb, 0x000000ef, 0x000000f6, /* CG 054 */ 0x000000b5, 0x000000e2, 0x000000ea, 0x000000ee, /* CG 058 */ 0x000000f4, 0x000000fb, 0x000000e1, 0x000000d7, /* CG 05c */ 0x000000ed, 0x000000f3, 0x000000fa, 0x000000f1, /* CG 060 */ 0x000000c0, 0x000000c8, 0x000000cc, 0x000000d2, /* CG 064 */ 0x000000d9, 0x000000c3, 0x000000d5, 0x000000b9, /* CG 068 */ 0x000000b2, 0x000000b3, 0x000000aa, 0x000000ba, /* CG 06c */ 0x000000ab, 0x000000bb, 0x000000a1, 0x000000bf, /* CG 070 */ 0x000000c4, 0x000000cb, 0x000000cf, 0x000000d6, /* CG 074 */ 0x000000dc, 0x000000c2, 0x000000ca, 0x000000ce, /* CG 078 */ 0x000000d4, 0x000000db, 0x000000c1, 0x000000c9, /* CG 07c */ 0x000000cd, 0x000000d3, 0x000000da, 0x000000d1, /* CG 080 */ 0x00000061, 0x00000062, 0x00000063, 0x00000064, /* CG 084 */ 0x00000065, 0x00000066, 0x00000067, 0x00000068, /* CG 088 */ 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, /* CG 08c */ 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, /* CG 090 */ 0x00000071, 0x00000072, 0x00000073, 0x00000074, /* CG 094 */ 0x00000075, 0x00000076, 0x00000077, 0x00000078, /* CG 098 */ 0x00000079, 0x0000007a, 0x000000e6, 0x000000f8, /* CG 09c */ 0x000000e5, 0x000000f7, 0x0000f8fe, 0x0000f8ff, /* CG 0a0 */ 0x00000041, 0x00000042, 0x00000043, 0x00000044, /* CG 0a4 */ 0x00000045, 0x00000046, 0x00000047, 0x00000048, /* CG 0a8 */ 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, /* CG 0ac */ 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, /* CG 0b0 */ 0x00000051, 0x00000052, 0x00000053, 0x00000054, /* CG 0b4 */ 0x00000055, 0x00000056, 0x00000057, 0x00000058, /* CG 0b8 */ 0x00000059, 0x0000005a, 0x000000c6, 0x000000d8, /* CG 0bc */ 0x000000c5, 0x000000c7, 0x0000003b, 0x0000002a, /* CG 0c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0cc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0d0 */ 0x000000a9, 0x000000ae, 0x00000000, 0x00000000, /* CG 0d4 */ 0x00000000, 0x00000000, 0x000000b1, 0x000000d0, /* CG 0d8 */ 0x00000000, 0x000000de, 0x00000000, 0x00000000, /* CG 0dc */ 0x00000000, 0x00000000, 0x00000000, 0x0000f8fc, /* CG 0e0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0ec */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f4 */ 0x00000000, 0x00000000, 0x00000000, 0x000000f0, /* CG 0f8 */ 0x00000000, 0x000000fe, 0x00000000, 0x00000000, /* CG 0fc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "3270cg-1", { /* CG 000 */ 0x00000000, 0x000000a0, 0x000020ac, 0x00000000, /* CG 004 */ 0x00000000, 0x00000000, 0x0000f8fd, 0x000000ad, /* CG 008 */ 0x0000003e, 0x0000003c, 0x0000005b, 0x0000005d, /* CG 00c */ 0x00000029, 0x00000028, 0x0000007d, 0x0000007b, /* CG 010 */ 0x00000020, 0x0000003d, 0x00000027, 0x00000022, /* CG 014 */ 0x0000002f, 0x0000005c, 0x0000007c, 0x000000a6, /* CG 018 */ 0x0000003f, 0x00000021, 0x00000024, 0x000000a2, /* CG 01c */ 0x000000a3, 0x000000a5, 0x000000b6, 0x000000a4, /* CG 020 */ 0x00000030, 0x00000031, 0x00000032, 0x00000033, /* CG 024 */ 0x00000034, 0x00000035, 0x00000036, 0x00000037, /* CG 028 */ 0x00000038, 0x00000039, 0x000000df, 0x000000a7, /* CG 02c */ 0x00000023, 0x00000040, 0x00000025, 0x0000005f, /* CG 030 */ 0x00000026, 0x0000002d, 0x0000002e, 0x0000002c, /* CG 034 */ 0x0000003a, 0x0000002b, 0x000000ac, 0x000000af, /* CG 038 */ 0x000000b0, 0x000000b7, 0x0000005e, 0x0000007e, /* CG 03c */ 0x000000a8, 0x00000060, 0x000000b4, 0x000000b8, /* CG 040 */ 0x000000e0, 0x000000e8, 0x000000ec, 0x000000f2, /* CG 044 */ 0x000000f9, 0x000000e3, 0x000000f5, 0x000000ff, /* CG 048 */ 0x000000dd, 0x000000fd, 0x000000e9, 0x000000bc, /* CG 04c */ 0x000000bd, 0x000000be, 0x000000fc, 0x000000e7, /* CG 050 */ 0x000000e4, 0x000000eb, 0x000000ef, 0x000000f6, /* CG 054 */ 0x000000b5, 0x000000e2, 0x000000ea, 0x000000ee, /* CG 058 */ 0x000000f4, 0x000000fb, 0x000000e1, 0x000000d7, /* CG 05c */ 0x000000ed, 0x000000f3, 0x000000fa, 0x000000f1, /* CG 060 */ 0x000000c0, 0x000000c8, 0x000000cc, 0x000000d2, /* CG 064 */ 0x000000d9, 0x000000c3, 0x000000d5, 0x000000b9, /* CG 068 */ 0x000000b2, 0x000000b3, 0x000000aa, 0x000000ba, /* CG 06c */ 0x000000ab, 0x000000bb, 0x000000a1, 0x000000bf, /* CG 070 */ 0x000000c4, 0x000000cb, 0x000000cf, 0x000000d6, /* CG 074 */ 0x000000dc, 0x000000c2, 0x000000ca, 0x000000ce, /* CG 078 */ 0x000000d4, 0x000000db, 0x000000c1, 0x000000c9, /* CG 07c */ 0x000000cd, 0x000000d3, 0x000000da, 0x000000d1, /* CG 080 */ 0x00000061, 0x00000062, 0x00000063, 0x00000064, /* CG 084 */ 0x00000065, 0x00000066, 0x00000067, 0x00000068, /* CG 088 */ 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, /* CG 08c */ 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, /* CG 090 */ 0x00000071, 0x00000072, 0x00000073, 0x00000074, /* CG 094 */ 0x00000075, 0x00000076, 0x00000077, 0x00000078, /* CG 098 */ 0x00000079, 0x0000007a, 0x000000e6, 0x000000f8, /* CG 09c */ 0x000000e5, 0x000000f7, 0x0000f8fe, 0x0000f8ff, /* CG 0a0 */ 0x00000041, 0x00000042, 0x00000043, 0x00000044, /* CG 0a4 */ 0x00000045, 0x00000046, 0x00000047, 0x00000048, /* CG 0a8 */ 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, /* CG 0ac */ 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, /* CG 0b0 */ 0x00000051, 0x00000052, 0x00000053, 0x00000054, /* CG 0b4 */ 0x00000055, 0x00000056, 0x00000057, 0x00000058, /* CG 0b8 */ 0x00000059, 0x0000005a, 0x000000c6, 0x000000d8, /* CG 0bc */ 0x000000c5, 0x000000c7, 0x0000003b, 0x0000002a, /* CG 0c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0cc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0d0 */ 0x000000a9, 0x000000ae, 0x00000000, 0x00000000, /* CG 0d4 */ 0x00000000, 0x00000000, 0x000000b1, 0x000000d0, /* CG 0d8 */ 0x00000000, 0x000000de, 0x00000000, 0x00000000, /* CG 0dc */ 0x00000000, 0x00000000, 0x00000000, 0x0000f8fc, /* CG 0e0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0ec */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f4 */ 0x00000000, 0x00000000, 0x00000000, 0x000000f0, /* CG 0f8 */ 0x00000000, 0x000000fe, 0x00000000, 0x00000000, /* CG 0fc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "3270cg-7", { /* CG 000 */ 0x00000000, 0x000000a0, 0x00000000, 0x00000000, /* CG 004 */ 0x00000000, 0x00000000, 0x0000f8fd, 0x000000ad, /* CG 008 */ 0x0000003e, 0x0000003c, 0x0000005b, 0x0000005d, /* CG 00c */ 0x00000029, 0x00000028, 0x0000007d, 0x0000007b, /* CG 010 */ 0x00000020, 0x0000003d, 0x00000027, 0x00000022, /* CG 014 */ 0x0000002f, 0x0000005c, 0x0000007c, 0x000000a6, /* CG 018 */ 0x0000003f, 0x00000021, 0x00000024, 0x000000a2, /* CG 01c */ 0x000000a3, 0x000000a5, 0x00000386, 0x000000a4, /* CG 020 */ 0x00000030, 0x00000031, 0x00000032, 0x00000033, /* CG 024 */ 0x00000034, 0x00000035, 0x00000036, 0x00000037, /* CG 028 */ 0x00000038, 0x00000039, 0x000003af, 0x000000a7, /* CG 02c */ 0x00000023, 0x00000040, 0x00000025, 0x0000005f, /* CG 030 */ 0x00000026, 0x0000002d, 0x0000002e, 0x0000002c, /* CG 034 */ 0x0000003a, 0x0000002b, 0x000000ac, 0x000000af, /* CG 038 */ 0x000000b0, 0x000000b7, 0x0000005e, 0x0000007e, /* CG 03c */ 0x000000a8, 0x00000060, 0x000000b4, 0x00000388, /* CG 040 */ 0x000003cb, 0x000003b8, 0x000003bc, 0x000003c2, /* CG 044 */ 0x000003c9, 0x000003b3, 0x000003c5, 0x000000ff, /* CG 048 */ 0x000003ad, 0x000003cd, 0x000003b9, 0x0000038c, /* CG 04c */ 0x000000bd, 0x0000038e, 0x000003cc, 0x000003b7, /* CG 050 */ 0x000003b4, 0x000003bb, 0x000003bf, 0x000003c6, /* CG 054 */ 0x00000385, 0x000003b2, 0x000003ba, 0x000003be, /* CG 058 */ 0x000003c4, 0x000003b0, 0x000003b1, 0x000003a7, /* CG 05c */ 0x000003bd, 0x000003c3, 0x00000390, 0x000003c1, /* CG 060 */ 0x000003ca, 0x00000398, 0x0000039c, 0x000000d2, /* CG 064 */ 0x000003a9, 0x00000393, 0x000003a5, 0x00000389, /* CG 068 */ 0x000000b2, 0x000000b3, 0x000000aa, 0x0000038a, /* CG 06c */ 0x000000ab, 0x000000bb, 0x000000a1, 0x0000038f, /* CG 070 */ 0x00000394, 0x0000039b, 0x0000039f, 0x000003a6, /* CG 074 */ 0x000003ac, 0x00000392, 0x0000039a, 0x0000039e, /* CG 078 */ 0x000003a4, 0x000003ab, 0x00000391, 0x00000399, /* CG 07c */ 0x0000039d, 0x000003a3, 0x000003aa, 0x000003a1, /* CG 080 */ 0x00000061, 0x00000062, 0x00000063, 0x00000064, /* CG 084 */ 0x00000065, 0x00000066, 0x00000067, 0x00000068, /* CG 088 */ 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, /* CG 08c */ 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, /* CG 090 */ 0x00000071, 0x00000072, 0x00000073, 0x00000074, /* CG 094 */ 0x00000075, 0x00000076, 0x00000077, 0x00000078, /* CG 098 */ 0x00000079, 0x0000007a, 0x000003b6, 0x000003c8, /* CG 09c */ 0x000003b5, 0x000003c7, 0x0000f8fe, 0x0000f8ff, /* CG 0a0 */ 0x00000041, 0x00000042, 0x00000043, 0x00000044, /* CG 0a4 */ 0x00000045, 0x00000046, 0x00000047, 0x00000048, /* CG 0a8 */ 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, /* CG 0ac */ 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, /* CG 0b0 */ 0x00000051, 0x00000052, 0x00000053, 0x00000054, /* CG 0b4 */ 0x00000055, 0x00000056, 0x00000057, 0x00000058, /* CG 0b8 */ 0x00000059, 0x0000005a, 0x00000396, 0x000003a8, /* CG 0bc */ 0x00000395, 0x00000397, 0x0000003b, 0x0000002a, /* CG 0c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0cc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0d0 */ 0x000000a9, 0x000000ae, 0x00000000, 0x00000000, /* CG 0d4 */ 0x00000000, 0x00000000, 0x000000b1, 0x000003a0, /* CG 0d8 */ 0x00000000, 0x000003ae, 0x00000000, 0x00000000, /* CG 0dc */ 0x00000000, 0x00000000, 0x00000000, 0x0000f8fc, /* CG 0e0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0ec */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f4 */ 0x00000000, 0x00000000, 0x00000000, 0x000000f0, /* CG 0f8 */ 0x00000000, 0x000003ce, 0x00000000, 0x00000000, /* CG 0fc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "3270cg-8", { /* CG 000 */ 0x00000000, 0x000000a0, 0x00000000, 0x00000000, /* CG 004 */ 0x00000000, 0x00000000, 0x0000f8fd, 0x000000ad, /* CG 008 */ 0x0000003e, 0x0000003c, 0x0000005b, 0x0000005d, /* CG 00c */ 0x00000029, 0x00000028, 0x0000007d, 0x0000007b, /* CG 010 */ 0x00000020, 0x0000003d, 0x00000027, 0x00000022, /* CG 014 */ 0x0000002f, 0x0000005c, 0x0000007c, 0x000000a6, /* CG 018 */ 0x0000003f, 0x00000021, 0x00000024, 0x000000a2, /* CG 01c */ 0x000000a3, 0x000000a5, 0x000000b6, 0x000000a4, /* CG 020 */ 0x00000030, 0x00000031, 0x00000032, 0x00000033, /* CG 024 */ 0x00000034, 0x00000035, 0x00000036, 0x00000037, /* CG 028 */ 0x00000038, 0x00000039, 0x000000df, 0x000000a7, /* CG 02c */ 0x00000023, 0x00000040, 0x00000025, 0x0000005f, /* CG 030 */ 0x00000026, 0x0000002d, 0x0000002e, 0x0000002c, /* CG 034 */ 0x0000003a, 0x0000002b, 0x000000ac, 0x000000af, /* CG 038 */ 0x000000b0, 0x000000b7, 0x0000005e, 0x0000007e, /* CG 03c */ 0x000000a8, 0x00000060, 0x000000b4, 0x000000b8, /* CG 040 */ 0x000005d0, 0x000005d8, 0x000005dc, 0x000005e2, /* CG 044 */ 0x000005e9, 0x000005d3, 0x000005e5, 0x000000ff, /* CG 048 */ 0x000000dd, 0x000000fd, 0x000005d9, 0x000000bc, /* CG 04c */ 0x000000bd, 0x000000be, 0x000000fc, 0x000005d7, /* CG 050 */ 0x000005d4, 0x000005db, 0x000005df, 0x000005e6, /* CG 054 */ 0x000000b5, 0x000005d2, 0x000005da, 0x000005de, /* CG 058 */ 0x000005e4, 0x000000fb, 0x000005d1, 0x000000d7, /* CG 05c */ 0x000005dd, 0x000005e3, 0x000005ea, 0x000005e1, /* CG 060 */ 0x000000c0, 0x000000c8, 0x000000cc, 0x000000d2, /* CG 064 */ 0x000000d9, 0x000000c3, 0x000000d5, 0x000000b9, /* CG 068 */ 0x000000b2, 0x000000b3, 0x000000aa, 0x000000ba, /* CG 06c */ 0x000000ab, 0x000000bb, 0x000000a1, 0x000000bf, /* CG 070 */ 0x000000c4, 0x000000cb, 0x000000cf, 0x000000d6, /* CG 074 */ 0x000000dc, 0x000000c2, 0x000000ca, 0x000000ce, /* CG 078 */ 0x000000d4, 0x000000db, 0x000000c1, 0x000000c9, /* CG 07c */ 0x000000cd, 0x000000d3, 0x000000da, 0x000000d1, /* CG 080 */ 0x00000061, 0x00000062, 0x00000063, 0x00000064, /* CG 084 */ 0x00000065, 0x00000066, 0x00000067, 0x00000068, /* CG 088 */ 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, /* CG 08c */ 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, /* CG 090 */ 0x00000071, 0x00000072, 0x00000073, 0x00000074, /* CG 094 */ 0x00000075, 0x00000076, 0x00000077, 0x00000078, /* CG 098 */ 0x00000079, 0x0000007a, 0x000005d6, 0x000005e8, /* CG 09c */ 0x000005d5, 0x000005e7, 0x0000f8fe, 0x0000f8ff, /* CG 0a0 */ 0x00000041, 0x00000042, 0x00000043, 0x00000044, /* CG 0a4 */ 0x00000045, 0x00000046, 0x00000047, 0x00000048, /* CG 0a8 */ 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, /* CG 0ac */ 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, /* CG 0b0 */ 0x00000051, 0x00000052, 0x00000053, 0x00000054, /* CG 0b4 */ 0x00000055, 0x00000056, 0x00000057, 0x00000058, /* CG 0b8 */ 0x00000059, 0x0000005a, 0x000000c6, 0x000000d8, /* CG 0bc */ 0x000000c5, 0x000000c7, 0x0000003b, 0x0000002a, /* CG 0c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0c8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0cc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0d0 */ 0x000000a9, 0x000000ae, 0x00000000, 0x00000000, /* CG 0d4 */ 0x00000000, 0x00000000, 0x000000b1, 0x000000d0, /* CG 0d8 */ 0x00000000, 0x000000de, 0x00000000, 0x00000000, /* CG 0dc */ 0x00000000, 0x00000000, 0x00000000, 0x0000f8fc, /* CG 0e0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0e8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0ec */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* CG 0f4 */ 0x00000000, 0x00000000, 0x00000000, 0x000005e0, /* CG 0f8 */ 0x00000000, 0x000000fe, 0x00000000, 0x00000000, /* CG 0fc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "iso8859-1", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x000000a1, 0x000000a2, 0x000000a3, 0x000000a4, 0x000000a5, 0x000000a6, 0x000000a7, 0x000000a8, 0x000000a9, 0x000000aa, 0x000000ab, 0x000000ac, 0x000000ad, 0x000000ae, 0x000000af, 0x000000b0, 0x000000b1, 0x000000b2, 0x000000b3, 0x000000b4, 0x000000b5, 0x000000b6, 0x000000b7, 0x000000b8, 0x000000b9, 0x000000ba, 0x000000bb, 0x000000bc, 0x000000bd, 0x000000be, 0x000000bf, 0x000000c0, 0x000000c1, 0x000000c2, 0x000000c3, 0x000000c4, 0x000000c5, 0x000000c6, 0x000000c7, 0x000000c8, 0x000000c9, 0x000000ca, 0x000000cb, 0x000000cc, 0x000000cd, 0x000000ce, 0x000000cf, 0x000000d0, 0x000000d1, 0x000000d2, 0x000000d3, 0x000000d4, 0x000000d5, 0x000000d6, 0x000000d7, 0x000000d8, 0x000000d9, 0x000000da, 0x000000db, 0x000000dc, 0x000000dd, 0x000000de, 0x000000df, 0x000000e0, 0x000000e1, 0x000000e2, 0x000000e3, 0x000000e4, 0x000000e5, 0x000000e6, 0x000000e7, 0x000000e8, 0x000000e9, 0x000000ea, 0x000000eb, 0x000000ec, 0x000000ed, 0x000000ee, 0x000000ef, 0x000000f0, 0x000000f1, 0x000000f2, 0x000000f3, 0x000000f4, 0x000000f5, 0x000000f6, 0x000000f7, 0x000000f8, 0x000000f9, 0x000000fa, 0x000000fb, 0x000000fc, 0x000000fd, 0x000000fe, 0x000000ff } }, { "iso8859-2", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x00000104, 0x000002d8, 0x00000141, 0x000000a4, 0x0000013d, 0x0000015a, 0x000000a7, 0x000000a8, 0x00000160, 0x0000015e, 0x00000164, 0x00000179, 0x000000ad, 0x0000017d, 0x0000017b, 0x000000b0, 0x00000105, 0x000002db, 0x00000142, 0x000000b4, 0x0000013e, 0x0000015b, 0x000002c7, 0x000000b8, 0x00000161, 0x0000015f, 0x00000165, 0x0000017a, 0x000002dd, 0x0000017e, 0x0000017c, 0x00000154, 0x000000c1, 0x000000c2, 0x00000102, 0x000000c4, 0x00000139, 0x00000106, 0x000000c7, 0x0000010c, 0x000000c9, 0x00000118, 0x000000cb, 0x0000011a, 0x000000cd, 0x000000ce, 0x0000010e, 0x00000110, 0x00000143, 0x00000147, 0x000000d3, 0x000000d4, 0x00000150, 0x000000d6, 0x000000d7, 0x00000158, 0x0000016e, 0x000000da, 0x00000170, 0x000000dc, 0x000000dd, 0x00000162, 0x000000df, 0x00000155, 0x000000e1, 0x000000e2, 0x00000103, 0x000000e4, 0x0000013a, 0x00000107, 0x000000e7, 0x0000010d, 0x000000e9, 0x00000119, 0x000000eb, 0x0000011b, 0x000000ed, 0x000000ee, 0x0000010f, 0x00000111, 0x00000144, 0x00000148, 0x000000f3, 0x000000f4, 0x00000151, 0x000000f6, 0x000000f7, 0x00000159, 0x0000016f, 0x000000fa, 0x00000171, 0x000000fc, 0x000000fd, 0x00000163, 0x000002d9 } }, { "iso8859-7", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x00002018, 0x00002019, 0x000000a3, 0x000020ac, 0x000020af, 0x000000a6, 0x000000a7, 0x000000a8, 0x000000a9, 0x0000037a, 0x000000ab, 0x000000ac, 0x000000ad, 0x000000ad, 0x00002015, 0x000000b0, 0x000000b1, 0x000000b2, 0x000000b3, 0x00000384, 0x00000385, 0x00000386, 0x000000b7, 0x00000388, 0x00000389, 0x0000038a, 0x000000bb, 0x0000038c, 0x000000bd, 0x0000038e, 0x0000038f, 0x00000390, 0x00000391, 0x00000392, 0x00000393, 0x00000394, 0x00000395, 0x00000396, 0x00000397, 0x00000398, 0x00000399, 0x0000039a, 0x0000039b, 0x0000039c, 0x0000039d, 0x0000039e, 0x0000039f, 0x000003a0, 0x000003a1, 0x000003a1, 0x000003a3, 0x000003a4, 0x000003a5, 0x000003a6, 0x000003a7, 0x000003a8, 0x000003a9, 0x000003aa, 0x000003ab, 0x000003ac, 0x000003ad, 0x000003ae, 0x000003af, 0x000003b0, 0x000003b1, 0x000003b2, 0x000003b3, 0x000003b4, 0x000003b5, 0x000003b6, 0x000003b7, 0x000003b8, 0x000003b9, 0x000003ba, 0x000003bb, 0x000003bc, 0x000003bd, 0x000003be, 0x000003bf, 0x000003c0, 0x000003c1, 0x000003c2, 0x000003c3, 0x000003c4, 0x000003c5, 0x000003c6, 0x000003c7, 0x000003c8, 0x000003c9, 0x000003ca, 0x000003cb, 0x000003cc, 0x000003cd, 0x000003ce, 0x000003ce } }, { "iso8859-8", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x000000a0, 0x000000a2, 0x000000a3, 0x000000a4, 0x000000a5, 0x000000a6, 0x000000a7, 0x000000a8, 0x000000a9, 0x000000d7, 0x000000ab, 0x000000ac, 0x000000ad, 0x000000ae, 0x000000af, 0x000000b0, 0x000000b1, 0x000000b2, 0x000000b3, 0x000000b4, 0x000000b5, 0x000000b6, 0x000000b7, 0x000000b8, 0x000000b9, 0x000000f7, 0x000000bb, 0x000000bc, 0x000000bd, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x000000be, 0x00002017, 0x000005d0, 0x000005d1, 0x000005d2, 0x000005d3, 0x000005d4, 0x000005d5, 0x000005d6, 0x000005d7, 0x000005d8, 0x000005d9, 0x000005da, 0x000005db, 0x000005dc, 0x000005dd, 0x000005de, 0x000005df, 0x000005e0, 0x000005e1, 0x000005e2, 0x000005e3, 0x000005e4, 0x000005e5, 0x000005e6, 0x000005e7, 0x000005e8, 0x000005e9, 0x000005ea, 0x000005ea, 0x000005ea, 0x0000200e, 0x0000200f, 0x0000200f } }, { "iso8859-9", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x000000a1, 0x000000a2, 0x000000a3, 0x000000a4, 0x000000a5, 0x000000a6, 0x000000a7, 0x000000a8, 0x000000a9, 0x000000aa, 0x000000ab, 0x000000ac, 0x000000ad, 0x000000ae, 0x000000af, 0x000000b0, 0x000000b1, 0x000000b2, 0x000000b3, 0x000000b4, 0x000000b5, 0x000000b6, 0x000000b7, 0x000000b8, 0x000000b9, 0x000000ba, 0x000000bb, 0x000000bc, 0x000000bd, 0x000000be, 0x000000bf, 0x000000c0, 0x000000c1, 0x000000c2, 0x000000c3, 0x000000c4, 0x000000c5, 0x000000c6, 0x000000c7, 0x000000c8, 0x000000c9, 0x000000ca, 0x000000cb, 0x000000cc, 0x000000cd, 0x000000ce, 0x000000cf, 0x0000011e, 0x000000d1, 0x000000d2, 0x000000d3, 0x000000d4, 0x000000d5, 0x000000d6, 0x000000d7, 0x000000d8, 0x000000d9, 0x000000da, 0x000000db, 0x000000dc, 0x00000130, 0x0000015e, 0x000000df, 0x000000e0, 0x000000e1, 0x000000e2, 0x000000e3, 0x000000e4, 0x000000e5, 0x000000e6, 0x000000e7, 0x000000e8, 0x000000e9, 0x000000ea, 0x000000eb, 0x000000ec, 0x000000ed, 0x000000ee, 0x000000ef, 0x0000011f, 0x000000f1, 0x000000f2, 0x000000f3, 0x000000f4, 0x000000f5, 0x000000f6, 0x000000f7, 0x000000f8, 0x000000f9, 0x000000fa, 0x000000fb, 0x000000fc, 0x00000131, 0x0000015f, 0x000000ff } }, { "iso8859-11", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x00000e01, 0x00000e02, 0x00000e03, 0x00000e04, 0x00000e05, 0x00000e06, 0x00000e07, 0x00000e08, 0x00000e09, 0x00000e0a, 0x00000e0b, 0x00000e0c, 0x00000e0d, 0x00000e0e, 0x00000e0f, 0x00000e10, 0x00000e11, 0x00000e12, 0x00000e13, 0x00000e14, 0x00000e15, 0x00000e16, 0x00000e17, 0x00000e18, 0x00000e19, 0x00000e1a, 0x00000e1b, 0x00000e1c, 0x00000e1d, 0x00000e1e, 0x00000e1f, 0x00000e20, 0x00000e21, 0x00000e22, 0x00000e23, 0x00000e24, 0x00000e25, 0x00000e26, 0x00000e27, 0x00000e28, 0x00000e29, 0x00000e2a, 0x00000e2b, 0x00000e2c, 0x00000e2d, 0x00000e2e, 0x00000e2f, 0x00000e30, 0x00000e31, 0x00000e32, 0x00000e33, 0x00000e34, 0x00000e35, 0x00000e36, 0x00000e37, 0x00000e38, 0x00000e39, 0x00000e3a, 0x00000e3a, 0x00000e3a, 0x00000e3a, 0x00000e3a, 0x00000e3f, 0x00000e40, 0x00000e41, 0x00000e42, 0x00000e43, 0x00000e44, 0x00000e45, 0x00000e46, 0x00000e47, 0x00000e48, 0x00000e49, 0x00000e4a, 0x00000e4b, 0x00000e4c, 0x00000e4d, 0x00000e4e, 0x00000e4f, 0x00000e50, 0x00000e51, 0x00000e52, 0x00000e53, 0x00000e54, 0x00000e55, 0x00000e56, 0x00000e57, 0x00000e58, 0x00000e59, 0x00000e5a, 0x00000e5b, 0x00000e5b, 0x00000e5b, 0x00000e5b, 0x00000e5b } }, { "iso8859-15", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008a, 0x0000008b, 0x0000008c, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 0x00000098, 0x00000099, 0x0000009a, 0x0000009b, 0x0000009c, 0x0000009d, 0x0000009e, 0x0000009f, 0x000000a0, 0x000000a1, 0x000000a2, 0x000000a3, 0x000020ac, 0x000000a5, 0x00000160, 0x000000a7, 0x00000161, 0x000000a9, 0x000000aa, 0x000000ab, 0x000000ac, 0x000000ad, 0x000000ae, 0x000000af, 0x000000b0, 0x000000b1, 0x000000b2, 0x000000b3, 0x0000017d, 0x000000b5, 0x000000b6, 0x000000b7, 0x0000017e, 0x000000b9, 0x000000ba, 0x000000bb, 0x00000152, 0x00000153, 0x00000178, 0x000000bf, 0x000000c0, 0x000000c1, 0x000000c2, 0x000000c3, 0x000000c4, 0x000000c5, 0x000000c6, 0x000000c7, 0x000000c8, 0x000000c9, 0x000000ca, 0x000000cb, 0x000000cc, 0x000000cd, 0x000000ce, 0x000000cf, 0x000000d0, 0x000000d1, 0x000000d2, 0x000000d3, 0x000000d4, 0x000000d5, 0x000000d6, 0x000000d7, 0x000000d8, 0x000000d9, 0x000000da, 0x000000db, 0x000000dc, 0x000000dd, 0x000000de, 0x000000df, 0x000000e0, 0x000000e1, 0x000000e2, 0x000000e3, 0x000000e4, 0x000000e5, 0x000000e6, 0x000000e7, 0x000000e8, 0x000000e9, 0x000000ea, 0x000000eb, 0x000000ec, 0x000000ed, 0x000000ee, 0x000000ef, 0x000000f0, 0x000000f1, 0x000000f2, 0x000000f3, 0x000000f4, 0x000000f5, 0x000000f6, 0x000000f7, 0x000000f8, 0x000000f9, 0x000000fa, 0x000000fb, 0x000000fc, 0x000000fd, 0x000000fe, 0x000000ff } }, { "koi8-r", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x00002500, 0x00002502, 0x0000250c, 0x00002510, 0x00002514, 0x00002518, 0x0000251c, 0x00002524, 0x0000252c, 0x00002534, 0x0000253c, 0x00002580, 0x00002584, 0x00002588, 0x0000258c, 0x00002590, 0x00002591, 0x00002592, 0x00002593, 0x00002320, 0x000025a0, 0x00002219, 0x0000221a, 0x00002248, 0x00002264, 0x00002265, 0x000000a0, 0x00002321, 0x000000b0, 0x000000b2, 0x000000b7, 0x000000f7, 0x00002550, 0x00002551, 0x00002552, 0x00000451, 0x00002553, 0x00002554, 0x00002555, 0x00002556, 0x00002557, 0x00002558, 0x00002559, 0x0000255a, 0x0000255b, 0x0000255c, 0x0000255d, 0x0000255e, 0x0000255f, 0x00002560, 0x00002561, 0x00000401, 0x00002562, 0x00002563, 0x00002564, 0x00002565, 0x00002566, 0x00002567, 0x00002568, 0x00002569, 0x0000256a, 0x0000256b, 0x0000256c, 0x000000a9, 0x0000044e, 0x00000430, 0x00000431, 0x00000446, 0x00000434, 0x00000435, 0x00000444, 0x00000433, 0x00000445, 0x00000438, 0x00000439, 0x0000043a, 0x0000043b, 0x0000043c, 0x0000043d, 0x0000043e, 0x0000043f, 0x0000044f, 0x00000440, 0x00000441, 0x00000442, 0x00000443, 0x00000436, 0x00000432, 0x0000044c, 0x0000044b, 0x00000437, 0x00000448, 0x0000044d, 0x00000449, 0x00000447, 0x0000044a, 0x0000042e, 0x00000410, 0x00000411, 0x00000426, 0x00000414, 0x00000415, 0x00000424, 0x00000413, 0x00000425, 0x00000418, 0x00000419, 0x0000041a, 0x0000041b, 0x0000041c, 0x0000041d, 0x0000041e, 0x0000041f, 0x0000042f, 0x00000420, 0x00000421, 0x00000422, 0x00000423, 0x00000416, 0x00000412, 0x0000042c, 0x0000042b, 0x00000417, 0x00000428, 0x0000042d, 0x00000429, 0x00000427, 0x0000042a } }, { "jisx0201.1976-0", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x000000a5, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000203e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ff61, 0x0000ff62, 0x0000ff63, 0x0000ff64, 0x0000ff65, 0x0000ff66, 0x0000ff67, 0x0000ff68, 0x0000ff69, 0x0000ff6a, 0x0000ff6b, 0x0000ff6c, 0x0000ff6d, 0x0000ff6e, 0x0000ff6f, 0x0000ff70, 0x0000ff71, 0x0000ff72, 0x0000ff73, 0x0000ff74, 0x0000ff75, 0x0000ff76, 0x0000ff77, 0x0000ff78, 0x0000ff79, 0x0000ff7a, 0x0000ff7b, 0x0000ff7c, 0x0000ff7d, 0x0000ff7e, 0x0000ff7f, 0x0000ff80, 0x0000ff81, 0x0000ff82, 0x0000ff83, 0x0000ff84, 0x0000ff85, 0x0000ff86, 0x0000ff87, 0x0000ff88, 0x0000ff89, 0x0000ff8a, 0x0000ff8b, 0x0000ff8c, 0x0000ff8d, 0x0000ff8e, 0x0000ff8f, 0x0000ff90, 0x0000ff91, 0x0000ff92, 0x0000ff93, 0x0000ff94, 0x0000ff95, 0x0000ff96, 0x0000ff97, 0x0000ff98, 0x0000ff99, 0x0000ff9a, 0x0000ff9b, 0x0000ff9c, 0x0000ff9d, 0x0000ff9e, 0x0000ff9f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "tis620.2529-0", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0x00000e01, 0x00000e02, 0x00000e03, 0x00000e04, 0x00000e05, 0x00000e06, 0x00000e07, 0x00000e08, 0x00000e09, 0x00000e0a, 0x00000e0b, 0x00000e0c, 0x00000e0d, 0x00000e0e, 0x00000e0f, 0x00000e10, 0x00000e11, 0x00000e12, 0x00000e13, 0x00000e14, 0x00000e15, 0x00000e16, 0x00000e17, 0x00000e18, 0x00000e19, 0x00000e1a, 0x00000e1b, 0x00000e1c, 0x00000e1d, 0x00000e1e, 0x00000e1f, 0x00000e20, 0x00000e21, 0x00000e22, 0x00000e23, 0x00000e24, 0x00000e25, 0x00000e26, 0x00000e27, 0x00000e28, 0x00000e29, 0x00000e2a, 0x00000e2b, 0x00000e2c, 0x00000e2d, 0x00000e2e, 0x00000e2f, 0x00000e30, 0x00000e31, 0x00000e32, 0x00000e33, 0x00000e34, 0x00000e35, 0x00000e36, 0x00000e37, 0x00000e38, 0x00000e39, 0x00000e3a, 0x00000e3a, 0x00000e3a, 0x00000e3a, 0x00000e3a, 0x00000e3f, 0x00000e40, 0x00000e41, 0x00000e42, 0x00000e43, 0x00000e44, 0x00000e45, 0x00000e46, 0x00000e47, 0x00000e48, 0x00000e49, 0x00000e4a, 0x00000e4b, 0x00000e4c, 0x00000e4d, 0x00000e4e, 0x00000e4f, 0x00000e50, 0x00000e51, 0x00000e52, 0x00000e53, 0x00000e54, 0x00000e55, 0x00000e56, 0x00000e57, 0x00000e58, 0x00000e59, 0x00000e5a, 0x00000e5b, 0x00000e5b, 0x00000e5b, 0x00000e5b, 0x00000e5b } }, { "ascii-7", { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039, 0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x0000003e, 0x0000003f, 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 0x00000048, 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, 0x0000004d, 0x0000004e, 0x0000004f, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 0x00000058, 0x00000059, 0x0000005a, 0x0000005b, 0x0000005c, 0x0000005d, 0x0000005e, 0x0000005f, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007a, 0x0000007b, 0x0000007c, 0x0000007d, 0x0000007e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { NULL } }; #define ND8 (sizeof(d8)/sizeof(d8_t)) /* * Initialize or re-initialize the 8-bit display character set. * Returns an index into the d8 table, or -1 for failure. */ int display8_init(char *cset) { int i; for (i = 0; d8[i].cset; i++) { if (!strcasecmp(cset, d8[i].cset)) { return i; } } if (!strcasecmp(cset, "iso10646-1")) return ISO10646_IX; return -1; } /* * Map a Unicode character onto the 8-bit display character set. * Returns -1 if there is no mapping. */ int display8_lookup(int d8_ix, ucs4_t ucs4) { int i; /* Handle errors. */ if (d8_ix < 0) return -1; /* Handle ISO 10646-1 (almost-direct mapping). */ if (d8_ix == ISO10646_IX) { if (ucs4 == UPRIV_fm) return ';'; else if (ucs4 == UPRIV_dup) return '*'; else if (ucs4 == UPRIV_eo) return 0x25cf; else if (ucs4 == UPRIV_sub) return 0x25a0; else return (int)ucs4; } /* Handle more errors. */ if ((unsigned)d8_ix >= (ND8 - 1)) return -1; /* Check for a match in the proper table. */ for (i = 0; i < 256; i++) { if (d8[d8_ix].u[i] == ucs4) return i; } /* Handle the private-use values for FM and DUP. */ if (ucs4 == UPRIV_fm) return ';'; if (ucs4 == UPRIV_dup) return '*'; /* Give up. */ return -1; } /* * DBCS display character set support. * * By turning off X3270_DBCS, you can avoid compiling these rather large * tables. */ typedef struct { char *cset; /* Character set name */ char *u[512]; /* Vectors, 128 Unicode positions -> BE display code */ /* * N.B.: 128 positions is the maximum size for each * vector, because 256 positions results in C literal * strings that exceed the C89 requirements. */ } d16_t; d16_t d16[] = { #if defined(X3270_DBCS) /*[*/ /* * GB2312 X11 font, uses code points rather than the usual EUC-CN encoding. */ { "gb2312.1980-0", { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x68\x00\x00\x00\x00\x21\x6c\x21\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x63\x21\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x24\x28\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x28\x28\x26\x28\x3a\x00\x00\x28\x2c\x28\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x28\x30\x28\x2e\x00\x00\x00\x00\x00\x00\x21\x42\x00\x00\x28\x34\x28\x32\x00\x00\x28\x39\x00\x00\x00\x00\x00\x00", /* 0100 */ "\x00\x00\x28\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x23\x00\x00\x28\x2b\x00\x00\x28\x2f\x00\x00\x28\x33\x00\x00\x28\x35\x00\x00\x28\x36\x00\x00\x28\x37\x00\x00\x28\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0200 */ NULL, /* 0280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x26\x00\x00\x21\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x21\x26\x22\x26\x23\x26\x24\x26\x25\x26\x26\x26\x27\x26\x28\x26\x29\x26\x2a\x26\x2b\x26\x2c\x26\x2d\x26\x2e\x26\x2f\x26\x30\x26\x31\x00\x00\x26\x32\x26\x33\x26\x34\x26\x35\x26\x36\x26\x37\x26\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x41\x26\x42\x26\x43\x26\x44\x26\x45\x26\x46\x26\x47\x26\x48\x26\x49\x26\x4a\x26\x4b\x26\x4c\x26\x4d\x26\x4e\x26\x4f\x26\x50\x26\x51\x00\x00\x26\x52\x26\x53\x26\x54\x26\x55\x26\x56\x26\x57\x26\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\x27\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x21\x27\x22\x27\x23\x27\x24\x27\x25\x27\x26\x27\x28\x27\x29\x27\x2a\x27\x2b\x27\x2c\x27\x2d\x27\x2e\x27\x2f\x27\x30\x27\x31\x27\x32\x27\x33\x27\x34\x27\x35\x27\x36\x27\x37\x27\x38\x27\x39\x27\x3a\x27\x3b\x27\x3c\x27\x3d\x27\x3e\x27\x3f\x27\x40\x27\x41\x27\x51\x27\x52\x27\x53\x27\x54\x27\x55\x27\x56\x27\x58\x27\x59\x27\x5a\x27\x5b\x27\x5c\x27\x5d\x27\x5e\x27\x5f\x27\x60\x27\x61\x27\x62\x27\x63\x27\x64\x27\x65\x27\x66\x27\x67\x27\x68\x27\x69\x27\x6a\x27\x6b\x27\x6c\x27\x6d\x27\x6e\x27\x6f\x27\x70\x27\x71\x00\x00\x27\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x2a\x21\x2c\x00\x00\x21\x2e\x21\x2f\x00\x00\x00\x00\x21\x30\x21\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x6b\x00\x00\x21\x64\x21\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ NULL, /* 2100 */ "\x00\x00\x00\x00\x00\x00\x21\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x71\x22\x72\x22\x73\x22\x74\x22\x75\x22\x76\x22\x77\x22\x78\x22\x79\x22\x7a\x22\x7b\x22\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x7b\x21\x7c\x21\x7a\x21\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x47\x00\x00\x21\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x4c\x00\x00\x00\x00\x21\x58\x21\x5e\x00\x00\x21\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x21\x4e\x00\x00\x21\x44\x21\x45\x21\x49\x21\x48\x21\x52\x00\x00\x00\x00\x21\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x60\x21\x5f\x21\x43\x21\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x56\x00\x00\x00\x00\x00\x00\x21\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x59\x21\x54\x00\x00\x00\x00\x21\x5c\x21\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x5a\x21\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x59\x22\x5a\x22\x5b\x22\x5c\x22\x5d\x22\x5e\x22\x5f\x22\x60\x22\x61\x22\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x45\x22\x46\x22\x47\x22\x48\x22\x49\x22\x4a\x22\x4b\x22\x4c\x22\x4d\x22\x4e\x22\x4f\x22\x50", /* 2480 */ "\x22\x51\x22\x52\x22\x53\x22\x54\x22\x55\x22\x56\x22\x57\x22\x58\x22\x31\x22\x32\x22\x33\x22\x34\x22\x35\x22\x36\x22\x37\x22\x38\x22\x39\x22\x3a\x22\x3b\x22\x3c\x22\x3d\x22\x3e\x22\x3f\x22\x40\x22\x41\x22\x42\x22\x43\x22\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2500 */ "\x29\x24\x29\x25\x29\x26\x29\x27\x29\x28\x29\x29\x29\x2a\x29\x2b\x29\x2c\x29\x2d\x29\x2e\x29\x2f\x29\x30\x29\x31\x29\x32\x29\x33\x29\x34\x29\x35\x29\x36\x29\x37\x29\x38\x29\x39\x29\x3a\x29\x3b\x29\x3c\x29\x3d\x29\x3e\x29\x3f\x29\x40\x29\x41\x29\x42\x29\x43\x29\x44\x29\x45\x29\x46\x29\x47\x29\x48\x29\x49\x29\x4a\x29\x4b\x29\x4c\x29\x4d\x29\x4e\x29\x4f\x29\x50\x29\x51\x29\x52\x29\x53\x29\x54\x29\x55\x29\x56\x29\x57\x29\x58\x29\x59\x29\x5a\x29\x5b\x29\x5c\x29\x5d\x29\x5e\x29\x5f\x29\x60\x29\x61\x29\x62\x29\x63\x29\x64\x29\x65\x29\x66\x29\x67\x29\x68\x29\x69\x29\x6a\x29\x6b\x29\x6c\x29\x6d\x29\x6e\x29\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x76\x21\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x78\x21\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x74\x21\x73\x00\x00\x00\x00\x00\x00\x21\x70\x00\x00\x00\x00\x21\x72\x21\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x6f\x21\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x62\x00\x00\x21\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ "\x21\x21\x21\x22\x21\x23\x21\x28\x00\x00\x21\x29\x00\x00\x00\x00\x21\x34\x21\x35\x21\x36\x21\x37\x21\x38\x21\x39\x21\x3a\x21\x3b\x21\x3e\x21\x3f\x00\x00\x21\x7e\x21\x32\x21\x33\x21\x3c\x21\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x21\x24\x22\x24\x23\x24\x24\x24\x25\x24\x26\x24\x27\x24\x28\x24\x29\x24\x2a\x24\x2b\x24\x2c\x24\x2d\x24\x2e\x24\x2f\x24\x30\x24\x31\x24\x32\x24\x33\x24\x34\x24\x35\x24\x36\x24\x37\x24\x38\x24\x39\x24\x3a\x24\x3b\x24\x3c\x24\x3d\x24\x3e\x24\x3f\x24\x40\x24\x41\x24\x42\x24\x43\x24\x44\x24\x45\x24\x46\x24\x47\x24\x48\x24\x49\x24\x4a\x24\x4b\x24\x4c\x24\x4d\x24\x4e\x24\x4f\x24\x50\x24\x51\x24\x52\x24\x53\x24\x54\x24\x55\x24\x56\x24\x57\x24\x58\x24\x59\x24\x5a\x24\x5b\x24\x5c\x24\x5d\x24\x5e\x24\x5f", /* 3080 */ "\x24\x60\x24\x61\x24\x62\x24\x63\x24\x64\x24\x65\x24\x66\x24\x67\x24\x68\x24\x69\x24\x6a\x24\x6b\x24\x6c\x24\x6d\x24\x6e\x24\x6f\x24\x70\x24\x71\x24\x72\x24\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x21\x25\x22\x25\x23\x25\x24\x25\x25\x25\x26\x25\x27\x25\x28\x25\x29\x25\x2a\x25\x2b\x25\x2c\x25\x2d\x25\x2e\x25\x2f\x25\x30\x25\x31\x25\x32\x25\x33\x25\x34\x25\x35\x25\x36\x25\x37\x25\x38\x25\x39\x25\x3a\x25\x3b\x25\x3c\x25\x3d\x25\x3e\x25\x3f\x25\x40\x25\x41\x25\x42\x25\x43\x25\x44\x25\x45\x25\x46\x25\x47\x25\x48\x25\x49\x25\x4a\x25\x4b\x25\x4c\x25\x4d\x25\x4e\x25\x4f\x25\x50\x25\x51\x25\x52\x25\x53\x25\x54\x25\x55\x25\x56\x25\x57\x25\x58\x25\x59\x25\x5a\x25\x5b\x25\x5c\x25\x5d\x25\x5e\x25\x5f\x25\x60\x25\x61\x25\x62\x25\x63\x25\x64\x25\x65\x25\x66\x25\x67\x25\x68\x25\x69\x25\x6a\x25\x6b\x25\x6c\x25\x6d\x25\x6e\x25\x6f\x25\x70\x25\x71\x25\x72\x25\x73\x25\x74\x25\x75\x25\x76\x00\x00\x00\x00\x00\x00\x00\x00\x21\x24\x00\x00\x00\x00\x00\x00\x00\x00", /* 3100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x45\x28\x46\x28\x47\x28\x48\x28\x49\x28\x4a\x28\x4b\x28\x4c\x28\x4d\x28\x4e\x28\x4f\x28\x50\x28\x51\x28\x52\x28\x53\x28\x54\x28\x55\x28\x56\x28\x57\x28\x58\x28\x59\x28\x5a\x28\x5b\x28\x5c\x28\x5d\x28\x5e\x28\x5f\x28\x60\x28\x61\x28\x62\x28\x63\x28\x64\x28\x65\x28\x66\x28\x67\x28\x68\x28\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3180 */ NULL, /* 3200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x65\x22\x66\x22\x67\x22\x68\x22\x69\x22\x6a\x22\x6b\x22\x6c\x22\x6d\x22\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ NULL, /* 4080 */ NULL, /* 4100 */ NULL, /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ NULL, /* 4380 */ NULL, /* 4400 */ NULL, /* 4480 */ NULL, /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ NULL, /* 4680 */ NULL, /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ NULL, /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ NULL, /* 4c80 */ NULL, /* 4d00 */ NULL, /* 4d80 */ NULL, /* 4e00 */ "\x52\x3b\x36\x21\x00\x00\x46\x5f\x00\x00\x00\x00\x00\x00\x4d\x72\x55\x49\x48\x7d\x49\x4f\x4f\x42\x58\x22\x32\x3b\x53\x6b\x00\x00\x58\x24\x33\x73\x00\x00\x57\x28\x47\x52\x58\x27\x4a\x40\x00\x00\x47\x70\x31\x7b\x52\x35\x34\x54\x36\x2b\x4b\x3f\x58\x29\x00\x00\x00\x00\x00\x00\x36\x2a\x00\x00\x41\x3d\x51\x4f\x00\x00\x49\x25\x58\x2d\x00\x00\x38\x76\x51\x3e\x63\x5c\x56\x50\x00\x00\x00\x00\x37\x61\x00\x00\x34\x2e\x00\x00\x41\x59\x00\x00\x58\x3c\x00\x00\x4d\x68\x35\x24\x4e\x2a\x56\x77\x00\x00\x40\x76\x3e\x59\x58\x2f\x00\x00\x00\x00\x00\x00\x44\x4b\x00\x00\x3e\x43\x00\x00\x58\x31\x43\x34\x52\x65\x00\x00\x56\x2e\x4e\x5a\x55\x27\x3a\x75\x37\x26\x40\x56\x00\x00\x46\x39\x45\x52\x47\x47\x00\x00\x39\x54\x00\x00\x33\x4b\x52\x52\x00\x00\x00\x00\x58\x3f\x3e\x45\x46\x72\x52\x32\x4f\x30\x4f\x67\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x69\x00\x00\x00\x00\x58\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x72\x42\x52\x00\x00\x48\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x2c\x00\x00", /* 4e80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x4b\x00\x00\x53\x68\x55\x79\x00\x00\x4a\x42\x36\x7e\x58\x21\x53\x5a\x3f\x77\x00\x00\x54\x46\x3b\x25\x58\x41\x4e\x65\x3e\x2e\x00\x00\x00\x00\x58\x28\x00\x00\x51\x47\x50\x29\x00\x00\x00\x00\x00\x00\x58\x3d\x59\x6f\x4d\x76\x3f\x3a\x00\x00\x3d\x3b\x3a\x25\x52\x60\x32\x7a\x3a\x60\x44\x36\x00\x00\x4f\x6d\x3e\x29\x4d\x24\x41\x41\x00\x00\x00\x00\x00\x00\x47\x57\x59\x71\x00\x00\x59\x74\x00\x00\x00\x00\x00\x00\x00\x00\x48\x4b\x58\x69\x00\x00\x00\x00\x00\x00\x52\x5a\x4a\x32\x48\x4a\x58\x6c\x58\x6a\x58\x46\x3d\x76\x46\x4d\x33\x70\x00\x00\x58\x6b\x3d\x71\x3d\x69\x00\x00\x48\x54\x34\x53\x00\x00\x00\x00\x42\x58\x00\x00\x32\x56\x57\x50\x4a\x4b\x4b\x7b\x55\x4c\x38\x36\x4f\x49\x00\x00\x00\x00\x00\x00\x59\x5a\x58\x70\x47\x2a\x00\x00\x58\x6e\x00\x00\x34\x7a\x41\x6e\x52\x54\x00\x00\x00\x00\x58\x6d\x00\x00\x52\x47\x58\x6f\x43\x47\x00\x00\x00\x00\x00\x00\x51\x76\x00\x00\x56\x59\x58\x72\x00\x00\x58\x75\x3c\x7e\x3c\x5b\x00\x00\x00\x00\x00\x00\x48\x4e\x00\x00\x37\x5d\x00\x00\x37\x42", /* 4f00 */ "\x00\x00\x46\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x78\x52\x41\x00\x00\x00\x00\x4e\x69\x3c\x3f\x37\x7c\x37\x25\x50\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x5a\x53\x45\x3b\x6f\x3b\x61\x58\x71\x00\x00\x00\x00\x49\x21\x4e\x30\x34\x2b\x00\x00\x58\x73\x00\x00\x49\x4b\x58\x76\x42\x57\x58\x77\x00\x00\x00\x00\x4e\x31\x58\x79\x00\x00\x00\x00\x00\x00\x32\x2e\x39\x40\x00\x00\x59\x23\x00\x00\x30\x69\x00\x00\x41\x66\x00\x00\x49\x6c\x00\x00\x4b\x45\x00\x00\x4b\x46\x59\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x68\x00\x00\x00\x00\x35\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x3b\x35\x4d\x57\x21\x57\x74\x53\x53\x00\x00\x4c\x65\x00\x00\x3a\x4e\x00\x00\x59\x22\x59\x5c\x53\x60\x58\x7d\x37\x70\x57\x77\x58\x7e\x58\x7a\x59\x21\x44\x63\x00\x00\x00\x00\x53\x36\x58\x74\x59\x5d\x00\x00\x58\x7b\x00\x00\x45\x65\x00\x00\x00\x00\x40\x50\x00\x00\x00\x00\x51\x70\x30\x5b\x00\x00\x00\x00\x3c\x51\x59\x26\x00\x00\x59\x25\x00\x00\x00\x00\x00\x00\x00\x00\x59\x2c\x59\x2e\x00\x00\x59\x2b\x4a\x39", /* 4f80 */ "\x00\x00\x00\x00\x00\x00\x59\x29\x56\x36\x00\x00\x00\x00\x00\x00\x33\x5e\x59\x28\x00\x00\x40\x7d\x00\x00\x4a\x4c\x00\x00\x59\x2a\x00\x00\x59\x27\x00\x00\x00\x00\x59\x30\x00\x00\x00\x00\x36\x31\x00\x00\x00\x00\x00\x00\x39\x29\x00\x00\x52\x40\x00\x00\x00\x00\x4f\x40\x00\x00\x00\x00\x42\x42\x00\x00\x3d\x44\x55\x6c\x32\x60\x47\x48\x3f\x6b\x59\x2d\x00\x00\x59\x2f\x00\x00\x4e\x6a\x3a\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x63\x00\x00\x00\x00\x00\x00\x34\x59\x36\x6d\x59\x34\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x21\x00\x00\x00\x00\x00\x00\x59\x5e\x47\x4e\x40\x7e\x59\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x57\x37\x7d\x00\x00\x59\x35\x00\x00\x59\x37\x31\x23\x53\x61\x59\x39\x00\x00\x50\x45\x00\x00\x59\x36\x00\x00\x00\x00\x59\x31\x00\x00\x59\x32\x41\x29\x59\x33\x00\x00\x00\x00\x3c\x73\x50\x5e\x38\x29\x00\x00\x3e\x63\x00\x00\x59\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x59\x3a\x00\x00\x30\x33\x00\x00\x00\x00\x00\x00\x59\x42\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x44\x31\x36\x00\x00\x59\x3f\x00\x00\x00\x00\x35\x39\x00\x00\x3e\x73\x00\x00\x00\x00\x00\x00\x4c\x48\x3a\x72\x52\x50\x00\x00\x59\x43\x00\x00\x00\x00\x3d\x68\x00\x00\x33\x2b\x00\x00\x00\x00\x00\x00\x59\x45\x3e\x6b\x00\x00\x59\x46\x59\x3b\x44\x5f\x00\x00\x59\x3e\x59\x41\x59\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x2e\x00\x00\x56\x35\x00\x00\x47\x63\x00\x00\x00\x00\x00\x00\x00\x00\x59\x48\x00\x00\x00\x00\x00\x00\x3c\x59\x59\x4a\x00\x00\x00\x00\x00\x00\x59\x3c\x00\x00\x59\x4b\x46\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x49\x00\x00\x00\x00\x00\x00\x00\x00\x57\x76\x00\x00\x4d\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x3c\x4d\x35\x00\x00\x00\x00\x00\x00\x59\x4d\x00\x00\x00\x00\x59\x47\x33\x25", /* 5080 */ "\x3f\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x38\x35\x00\x00\x00\x00\x40\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x76\x00\x00\x59\x4e\x00\x00\x59\x4f\x34\x22\x59\x50\x00\x00\x00\x00\x34\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x51\x49\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x52\x00\x00\x00\x00\x00\x00\x41\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x56\x49\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x59\x55\x59\x54\x59\x57\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x5b\x00\x00\x3d\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x27\x00\x00\x00\x00\x00\x00\x00\x00", /* 5100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x53\x59\x58\x00\x00\x00\x00\x00\x00\x59\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x79\x58\x23\x54\x4a\x00\x00\x54\x2a\x50\x56\x33\x64\x55\x57\x00\x00\x4f\x48\x39\x62\x00\x00\x3f\x4b\x00\x00\x43\x62\x00\x00\x00\x00\x00\x00\x36\x52\x00\x00\x00\x00\x4d\x43\x59\x6e\x59\x70\x00\x00\x00\x00\x00\x00\x35\x33\x00\x00\x36\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x24\x00\x00\x00\x00\x48\x6b\x00\x00\x00\x00\x48\x2b\x00\x00\x00\x00\x30\x4b\x39\x2b\x41\x79\x59\x62\x00\x00\x40\x3c\x39\x32\x00\x00\x39\x58\x50\x4b\x31\x78\x46\x64\x3e\x5f\x35\x64\x57\x48\x00\x00\x51\x78\x3c\x66\x4a\x5e\x00\x00\x00\x00", /* 5180 */ "\x3c\x3d\x59\x66\x58\x67\x00\x00\x00\x00\x44\x5a\x00\x00\x00\x00\x38\x54\x48\x3d\x00\x00\x00\x00\x32\x61\x54\x59\x00\x00\x00\x00\x00\x00\x00\x00\x43\x30\x00\x00\x00\x00\x43\x61\x5a\x22\x48\x5f\x00\x00\x50\x34\x00\x00\x3e\x7c\x45\x29\x00\x00\x00\x00\x00\x00\x39\x5a\x00\x00\x5a\x23\x00\x00\x54\x29\x5a\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x7b\x36\x2c\x00\x00\x00\x00\x37\x6b\x31\x79\x59\x7c\x33\x65\x3e\x76\x00\x00\x3f\x76\x52\x31\x40\x64\x00\x00\x00\x00\x00\x00\x36\x33\x59\x7e\x59\x7d\x00\x00\x00\x00\x3e\x3b\x00\x00\x00\x00\x00\x00\x46\x60\x00\x00\x57\x3c\x5a\x21\x00\x00\x41\x39\x00\x00\x35\x72\x41\x68\x00\x00\x00\x00\x3c\x75\x00\x00\x34\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x5d\x00\x00\x44\x7d\x00\x00\x00\x00\x3c\x38\x37\x32\x00\x00\x00\x00\x37\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x6c\x00\x00\x46\x3e\x00\x00\x3f\x2d\x3b\x4b\x00\x00\x00\x00\x35\x4a\x00\x00\x5b\x49\x50\x57\x00\x00\x4d\x39\x30\x3c\x33\x76\x3b\x77\x5b\x4a\x3a\x2f\x00\x00\x54\x64", /* 5200 */ "\x35\x36\x35\x73\x58\x56\x48\x50\x00\x00\x00\x00\x37\x56\x47\x50\x58\x57\x00\x00\x3f\x2f\x00\x00\x00\x00\x5b\x3b\x58\x58\x00\x00\x00\x00\x50\x4c\x3b\x2e\x00\x00\x00\x00\x00\x00\x6b\x3e\x41\x50\x41\x75\x54\x72\x38\x55\x34\x34\x00\x00\x33\x75\x00\x00\x00\x00\x49\x3e\x00\x00\x00\x00\x00\x00\x45\x50\x00\x00\x00\x00\x00\x00\x45\x59\x40\x7b\x00\x00\x31\x70\x00\x00\x58\x59\x39\x4e\x00\x00\x35\x3d\x00\x00\x00\x00\x58\x5a\x00\x00\x00\x00\x56\x46\x4b\x22\x48\x2f\x49\x32\x34\x4c\x3f\x4c\x00\x00\x39\x74\x00\x00\x58\x5b\x58\x5c\x36\x67\x3c\x41\x4c\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x77\x00\x00\x58\x5d\x47\x30\x00\x00\x00\x00\x39\x50\x3d\x23\x00\x00\x00\x00\x4c\x5e\x00\x00\x46\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x60\x00\x00\x58\x5e\x00\x00\x00\x00\x58\x5f\x00\x00\x00\x00\x00\x00\x30\x7e\x00\x00\x3e\x67\x00\x00\x4a\x23\x3c\x74\x00\x00\x00\x00\x00\x00\x00\x00\x38\x31\x00\x00\x00\x00\x38\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x62\x00\x00\x3d\x4b", /* 5280 */ "\x00\x00\x58\x64\x58\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x65\x00\x00\x00\x00\x58\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x26\x00\x00\x48\x30\x30\x6c\x39\x26\x3c\x53\x4e\x71\x5b\x3d\x41\x53\x00\x00\x00\x00\x00\x00\x00\x00\x36\x2f\x56\x7a\x45\x2c\x3d\x59\x5b\x3e\x5b\x3f\x00\x00\x00\x00\x00\x00\x40\x78\x3e\x22\x40\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x40\x4a\x46\x00\x00\x00\x00\x00\x00\x32\x2a\x00\x00\x00\x00\x00\x00\x53\x42\x00\x00\x43\x63\x00\x00\x51\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x42\x00\x00\x40\x55\x00\x00\x00\x00\x00\x00\x5b\x43\x00\x00\x3f\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x47\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x68\x49\x57\x00\x00\x00\x00\x00\x00\x39\x34\x4e\x70", /* 5300 */ "\x54\x48\x00\x00\x00\x00\x00\x00\x00\x00\x30\x7c\x34\x52\x00\x00\x50\x59\x00\x00\x00\x00\x00\x00\x00\x00\x59\x69\x00\x00\x5e\x4b\x59\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x58\x30\x3b\x2f\x31\x31\x00\x00\x33\x57\x58\x4e\x00\x00\x00\x00\x54\x51\x00\x00\x00\x00\x3d\x33\x3f\x6f\x00\x00\x4f\x3b\x00\x00\x00\x00\x58\x50\x00\x00\x00\x00\x00\x00\x37\x4b\x00\x00\x00\x00\x00\x00\x58\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x25\x47\x78\x52\x3d\x00\x00\x00\x00\x58\x52\x44\x64\x00\x00\x4a\x2e\x00\x00\x47\x27\x00\x00\x58\x26\x00\x00\x49\x7d\x4e\x67\x3b\x5c\x30\x6b\x00\x00\x00\x00\x00\x00\x3b\x2a\x50\x2d\x00\x00\x31\x30\x57\x64\x57\x3f\x00\x00\x35\x25\x42\x74\x44\x4f\x00\x00\x00\x00\x32\x29\x00\x00\x32\x37\x00\x00\x31\x65\x5f\x32\x55\x3c\x3f\x28\x42\x2c\x58\x55\x42\x31\x00\x00\x58\x54\x4e\x54\x00\x00\x5a\x60\x00\x00\x4e\x40\x00\x00\x00\x00\x58\x34\x43\x2e\x53\x21\x4e\x23\x00\x00\x3c\x34\x48\x34\x42\x51\x00\x00\x3e\x6d\x50\x36\x00\x00\x5a\x61\x00\x00\x00\x00\x00\x00\x00\x00\x47\x64", /* 5380 */ "\x00\x00\x00\x00\x33\x27\x00\x00\x36\x72\x4c\x7c\x40\x7a\x00\x00\x00\x00\x40\x77\x00\x00\x51\x39\x51\x61\x58\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x5e\x00\x00\x00\x00\x40\x65\x00\x00\x3a\x71\x00\x00\x00\x00\x58\x48\x00\x00\x54\x2d\x00\x00\x00\x00\x4f\x61\x58\x49\x00\x00\x58\x4a\x4f\x43\x00\x00\x33\x78\x3e\x47\x00\x00\x00\x00\x00\x00\x00\x00\x58\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x48\x25\x00\x00\x00\x00\x00\x00\x4f\x58\x00\x00\x48\x7e\x32\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x56\x32\x66\x3c\x30\x53\x51\x4b\x2b\x37\x34\x00\x00\x00\x00\x00\x00\x37\x22\x00\x00\x00\x00\x4a\x65\x00\x00\x48\x21\x4a\x5c\x31\x64\x50\x70\x00\x00\x45\x51\x00\x00\x00\x00\x00\x00\x5b\x45\x35\x7e\x00\x00\x00\x00\x3f\x5a\x39\x45\x3e\x64\x41\x6d\x00\x00\x5f\x36\x5f\x35\x56\x3b\x3d\x50\x55\x59\x30\x48\x36\x23\x3f\x49\x4c\x28\x5f\x33\x4a\x37\x53\x52\x00\x00\x58\x4f\x52\x36\x3a\x45\x4b\x3e\x4c\x3e\x00\x00\x5f\x37\x35\x70\x5f\x34\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x53\x75\x00\x00\x33\x54\x38\x77\x00\x00\x5f\x3a\x00\x00\x3a\x4f\x3c\x2a\x35\x75\x00\x00\x4d\x2c\x43\x7b\x3a\x73\x40\x74\x4d\x42\x4f\x72\x5f\x38\x4f\x45\x00\x00\x42\x40\x5f\x39\x42\x70\x00\x00\x00\x00\x00\x00\x3e\x7d\x00\x00\x41\x5f\x4d\x4c\x52\x77\x37\x4d\x5f\x41\x00\x00\x5f\x44\x00\x00\x00\x00\x37\x71\x30\x49\x36\x56\x37\x54\x00\x00\x3a\x2c\x4c\x7d\x3f\x54\x4b\x31\x46\x74\x00\x00\x56\x28\x5f\x45\x00\x00\x4e\x62\x33\x33\x00\x00\x00\x00\x4e\x7c\x34\x35\x00\x00\x4e\x47\x3a\x70\x00\x00\x4e\x61\x00\x00\x51\x3d\x00\x00\x00\x00\x5f\x40\x00\x00\x00\x00\x34\x74\x00\x00\x33\x4a\x00\x00\x38\x66\x5f\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x44\x45\x00\x00\x5f\x3c\x5f\x3d\x5f\x3e\x45\x3b\x5f\x3f\x5f\x42\x54\x31\x5f\x43\x00\x00\x47\x3a\x4e\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x58\x00\x00\x5f\x4a\x00\x00\x5f\x4f\x00\x00\x56\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x49\x5f\x5a\x4e\x36\x00\x00\x3a\x47\x5f\x4e\x5f\x48\x45\x5e\x00\x00\x00\x00\x49\x6b\x3a\x74\x43\x7c\x00\x00\x00\x00", /* 5480 */ "\x3e\x57\x00\x00\x5f\x46\x00\x00\x5f\x4d\x00\x00\x45\x58\x00\x00\x00\x00\x00\x00\x00\x00\x55\x26\x3a\x4d\x00\x00\x3e\x4c\x53\x3d\x38\x40\x00\x00\x56\x64\x00\x00\x5f\x47\x39\x3e\x3f\x27\x00\x00\x00\x00\x41\x7c\x5f\x4b\x5f\x4c\x00\x00\x5f\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x5b\x5f\x65\x00\x00\x5f\x57\x5f\x56\x57\x49\x5f\x63\x5f\x64\x65\x6b\x52\x27\x5f\x52\x00\x00\x3f\x29\x00\x00\x54\x5b\x00\x00\x3f\x48\x5f\x54\x00\x00\x00\x00\x00\x00\x4f\x4c\x00\x00\x00\x00\x5f\x5d\x00\x00\x51\x4a\x00\x00\x5f\x5e\x30\x27\x46\x37\x5f\x53\x00\x00\x3a\x65\x00\x00\x36\x5f\x4d\x5b\x39\x7e\x54\x55\x00\x00\x00\x00\x5f\x5f\x4f\x6c\x30\x25\x5f\x67\x5f\x51\x51\x46\x5f\x55\x5f\x58\x5f\x59\x5f\x5c\x00\x00\x3b\x29\x00\x00\x5f\x60\x5f\x61\x00\x00\x5f\x62\x5f\x66\x5f\x68\x53\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x67\x45\x36\x5f\x6a\x49\x5a\x41\x28\x44\x44\x00\x00\x00\x00\x3f\x5e\x4f\x78\x00\x00\x00\x00\x00\x00\x55\x5c\x5f\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x38\x00\x00\x3a\x5f\x5f\x6c\x00\x00\x5b\x41", /* 5500 */ "\x00\x00\x51\x64\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x74\x34\x3d\x00\x00\x30\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x71\x4c\x46\x5f\x72\x00\x00\x00\x00\x5f\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x69\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x6b\x00\x00\x5f\x6f\x5f\x70\x3b\x3d\x00\x00\x00\x00\x5f\x73\x00\x00\x00\x00\x5f\x74\x00\x00\x3b\x23\x00\x00\x4a\x5b\x4e\x28\x60\x27\x33\x2a\x00\x00\x60\x26\x00\x00\x00\x00\x00\x00\x60\x21\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7e\x00\x00\x4d\x59\x5f\x7c\x00\x00\x5f\x7a\x00\x00\x3f\x50\x57\x44\x00\x00\x49\x4c\x00\x00\x00\x00\x5f\x78\x30\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7b\x60\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x28\x00\x00\x00\x00\x00\x00\x00\x00\x37\x48\x00\x00\x00\x00\x46\x21\x49\x36\x40\x32\x5f\x75\x00\x00\x00\x00\x45\x3e\x00\x00\x58\x44\x5f\x79\x44\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x23\x60\x24\x60\x25\x50\x25\x00\x00\x00\x00\x60\x34\x4c\x64\x00\x00\x60\x31\x00\x00", /* 5580 */ "\x3f\x26\x60\x2f\x4e\x39\x60\x2b\x49\x46\x00\x00\x00\x00\x40\x2e\x60\x2e\x3a\x6d\x3a\x30\x60\x29\x00\x00\x00\x00\x00\x00\x5f\x76\x00\x00\x60\x33\x00\x00\x00\x00\x60\x38\x00\x00\x00\x00\x00\x00\x34\x2d\x60\x39\x00\x00\x00\x00\x4f\x32\x3a\x48\x00\x00\x60\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x2c\x00\x00\x54\x7b\x00\x00\x5f\x77\x00\x00\x45\x67\x00\x00\x60\x2d\x00\x00\x53\x77\x00\x00\x60\x36\x60\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x44\x50\x61\x00\x00\x00\x00\x00\x00\x60\x3c\x00\x00\x00\x00\x60\x49\x60\x4a\x00\x00\x00\x00\x00\x00\x60\x3e\x60\x2a\x49\x24\x60\x41\x00\x00\x60\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x48\x60\x43\x00\x00\x60\x35\x00\x00\x4e\x4b\x00\x00\x4b\x43\x60\x4d\x60\x46\x60\x42\x00\x00\x60\x4b\x00\x00\x60\x3a\x60\x3f\x60\x40\x00\x00\x00\x00\x60\x45\x00\x00\x00\x00\x60\x47\x60\x48\x00\x00\x60\x4c\x00\x00\x60\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x54\x60\x55\x00\x00", /* 5600 */ "\x60\x56\x60\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x50\x3c\x4e\x00\x00\x00\x00\x60\x51\x00\x00\x38\x42\x58\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x6a\x00\x00\x00\x00\x42\x6f\x00\x00\x00\x00\x60\x4f\x60\x3d\x00\x00\x00\x00\x00\x00\x60\x54\x60\x53\x00\x00\x00\x00\x60\x57\x00\x00\x00\x00\x00\x00\x00\x00\x60\x5c\x60\x58\x00\x00\x00\x00\x00\x00\x56\x76\x33\x30\x00\x00\x57\x6c\x00\x00\x4b\x3b\x00\x00\x00\x00\x60\x5a\x00\x00\x4e\x7b\x00\x00\x00\x00\x00\x00\x3a\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x61\x60\x5d\x52\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x62\x00\x00\x00\x00\x60\x5b\x60\x59\x60\x5f\x00\x00\x00\x00\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x5e\x00\x00\x60\x64\x00\x00\x00\x00\x00\x00\x46\x77\x58\x2c\x54\x6b\x60\x66\x4a\x49\x00\x00\x00\x00\x00\x00\x00\x00\x60\x65\x00\x00\x00\x00\x00\x00\x00\x00\x38\x41\x00\x00\x00\x00\x00\x00\x00\x00\x60\x67\x60\x68\x00\x00\x00\x00\x00\x00", /* 5680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x69\x60\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x3f\x4c\x67\x00\x00\x00\x00\x00\x00\x60\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x42\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6c\x00\x00\x00\x00\x60\x6d\x00\x00\x00\x00\x47\x74\x4b\x44\x00\x00\x60\x6e\x3b\x58\x58\x36\x52\x72\x60\x6f\x4d\x45\x00\x00\x36\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x71\x00\x00\x54\x30\x00\x00\x00\x00\x40\x27\x34\x51\x00\x00\x00\x00\x4e\x27\x60\x70\x00\x00\x00\x00\x00\x00\x60\x72\x39\x4c\x00\x00\x00\x00\x39\x7a\x4d\x3c\x60\x73", /* 5700 */ "\x00\x00\x00\x00\x00\x00\x46\x54\x60\x74\x00\x00\x54\x32\x00\x00\x48\x26\x60\x76\x60\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x77\x00\x00\x00\x00\x4d\x41\x00\x00\x00\x00\x00\x00\x4a\x25\x00\x00\x00\x00\x00\x00\x00\x00\x54\x5a\x5b\x57\x5b\x59\x00\x00\x5b\x58\x39\x67\x5b\x5c\x5b\x5d\x35\x58\x00\x00\x00\x00\x5b\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x5b\x33\x21\x5b\x5f\x00\x00\x00\x00\x3b\x78\x00\x00\x56\x37\x00\x00\x5b\x60\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x79\x00\x00\x00\x00\x37\x3b\x00\x00\x5b\x50\x4c\x2e\x3f\x32\x3b\x35\x57\x78\x3f\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x69\x00\x00\x00\x00\x3c\x61\x4c\x33\x5b\x5e\x30\x53\x4e\x6b\x37\x58\x57\x39\x46\x42\x00\x00\x00\x00\x40\x24\x00\x00\x4c\x39\x00\x00\x5b\x67\x5b\x61\x46\x3a\x5b\x63\x00\x00\x5b\x68\x00\x00\x45\x77\x00\x00\x00\x00\x00\x00\x5b\x6a\x00\x00\x00\x00\x5b\x69\x3f\x40\x00\x00\x00\x00\x00\x00\x5b\x66\x5b\x65\x00\x00\x00\x00\x00\x00", /* 5780 */ "\x00\x00\x00\x00\x34\x39\x40\x2c\x42\x22\x5b\x62\x5b\x64\x00\x00\x00\x00\x00\x00\x00\x00\x50\x4d\x5b\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x5d\x5b\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x62\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x73\x5b\x52\x39\x38\x54\x2b\x5b\x6c\x00\x00\x3f\x51\x5b\x70\x00\x00\x5b\x51\x00\x00\x35\x66\x00\x00\x5b\x6b\x3f\x65\x00\x00\x00\x00\x00\x00\x5b\x6e\x00\x00\x5b\x71\x00\x00\x00\x00\x00\x00\x5b\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x21\x30\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x71\x00\x00\x00\x00\x33\x47\x5b\x6f\x00\x00\x00\x00\x5b\x78\x00\x00\x46\x52\x5b\x74\x00\x00\x00\x00\x5b\x75\x5b\x77\x5b\x76\x00\x00\x00\x00\x5b\x7e\x00\x00\x53\x72\x32\x3a\x00\x00\x00\x00\x00\x00\x5b\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x24\x00\x00\x5b\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x7a\x00\x00\x00\x00\x00\x00\x5b\x7c\x45\x60\x3b\x79\x00\x00\x00\x00\x5c\x23\x00\x00\x00\x00", /* 5800 */ "\x5c\x25\x00\x00\x4c\x43\x00\x00\x00\x00\x00\x00\x36\x51\x5d\x40\x00\x00\x00\x00\x00\x00\x5c\x21\x00\x00\x5c\x22\x00\x00\x00\x00\x00\x00\x47\x35\x00\x00\x00\x00\x00\x00\x36\x69\x00\x00\x00\x00\x00\x00\x5c\x27\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x26\x00\x00\x5c\x29\x31\x24\x00\x00\x00\x00\x35\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x36\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x7a\x6b\x73\x00\x00\x00\x00\x00\x00\x4b\x5c\x00\x00\x00\x00\x4b\x7e\x00\x00\x00\x00\x00\x00\x4c\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x6e\x5c\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x53\x00\x00", /* 5880 */ "\x5c\x2f\x5c\x2c\x00\x00\x3e\x33\x00\x00\x4a\x7b\x00\x00\x00\x00\x00\x00\x5c\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x4a\x44\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x3d\x5c\x2e\x00\x00\x00\x00\x00\x00\x54\x76\x50\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x2b\x36\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x54\x00\x00\x00\x00\x00\x00\x00\x00\x31\x5a\x00\x00\x00\x00\x00\x00\x5b\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x56\x00\x00\x00\x00\x00\x00\x3a\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x3f\x48\x49\x00\x00\x57\x33\x00\x00\x49\x79\x00\x00\x00\x00\x3f\x47\x00\x00\x00\x00\x3a\x78\x00\x00\x00\x00\x52\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x62\x3a\x00\x00\x34\x26\x00\x00\x00\x00\x31\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x34\x00\x00\x4f\x44\x00\x00\x00\x00\x00\x00\x00\x00\x59\x67\x4f\x26\x4d\x62\x00\x00\x00\x00\x59\x6d\x36\x60\x00\x00\x52\x39\x00\x00\x00\x00\x39\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x62\x39\x62\x37\x00\x00\x34\x73\x00\x00\x4c\x6c\x4c\x2b\x37\x72\x00\x00\x58\x32\x51\x6b\x3a\x3b\x00\x00\x4a\x27\x00\x00\x00\x00\x4d\x37\x00\x00\x00\x00\x52\x44\x3f\x64\x3c\x50\x36\x61\x00\x00\x5e\x45\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x46\x5b\x3c\x00\x00\x51\x59\x00\x00\x00\x00\x46\x66\x44\x4e\x37\x6e\x00\x00\x37\x5c\x00\x00\x00\x00\x3f\x7c\x57\x60\x00\x00\x46\x75\x00\x00\x00\x00\x31\x3c\x5e\x48\x3d\x31\x4c\x57\x5e\x4a\x00\x00\x5e\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x6c\x00\x00\x49\x5d\x00\x00\x00\x00\x30\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x2e\x45\x2b\x00\x00\x44\x4c\x00\x00\x3c\x69\x4b\x7d\x00\x00\x00\x00\x00\x00\x3a\x43\x00\x00\x00\x00", /* 5980 */ "\x00\x00\x65\x79\x48\x67\x65\x7a\x4d\x7d\x00\x00\x57\x31\x38\x3e\x42\x68\x00\x00\x48\x51\x00\x00\x00\x00\x65\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x36\x4a\x3c\x4b\x00\x00\x00\x00\x51\x7d\x66\x21\x00\x00\x43\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x65\x7e\x66\x25\x4d\x57\x00\x00\x00\x00\x37\x41\x65\x7c\x65\x7d\x66\x23\x00\x00\x00\x00\x44\x5d\x66\x28\x00\x00\x00\x00\x66\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x43\x00\x00\x46\x5e\x00\x00\x00\x00\x66\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x37\x00\x00\x00\x00\x00\x00\x66\x22\x4a\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x63\x39\x43\x66\x26\x50\x55\x4e\x2f\x00\x00\x00\x00\x66\x29\x66\x30\x00\x00\x52\x26\x00\x00\x3d\x2a\x66\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x2f\x00\x00\x40\x51\x00\x00\x00\x00\x52\x4c\x00\x00\x00\x00\x00\x00\x3c\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x31\x00\x00\x52\x76\x00\x00\x00\x00\x00\x00\x57\x4b", /* 5a00 */ "\x00\x00\x4d\x7e\x00\x00\x4d\x5e\x42\x26\x66\x2b\x66\x2c\x3d\x3f\x66\x2e\x66\x33\x00\x00\x00\x00\x66\x32\x00\x00\x00\x00\x00\x00\x00\x00\x66\x36\x00\x00\x66\x38\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6f\x00\x00\x00\x00\x00\x00\x44\x48\x00\x00\x00\x00\x3e\x6a\x49\x6f\x00\x00\x00\x00\x66\x37\x00\x00\x36\x70\x00\x00\x00\x00\x00\x00\x43\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x69\x66\x34\x00\x00\x66\x35\x00\x00\x48\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x3d\x00\x00\x00\x00\x00\x00\x66\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x45\x00\x00\x00\x00\x4d\x71\x66\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x66\x3a\x00\x00\x00\x00\x40\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x24\x66\x3f\x49\x74\x66\x43\x00\x00\x00\x00\x66\x44\x00\x00\x00\x00\x00\x00\x00\x00\x50\x76", /* 5a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x44\x66\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x47\x4f\x31\x00\x00\x6b\x74\x00\x00\x00\x00\x66\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x45\x00\x00\x00\x00\x3c\x5e\x49\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x35\x00\x00\x00\x00\x4f\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x48\x00\x00\x66\x49\x00\x00\x66\x4e\x00\x00\x66\x50\x00\x00\x00\x00\x00\x00\x66\x51\x00\x00\x00\x00\x00\x00\x66\x4b\x35\x55\x00\x00\x66\x4c\x00\x00\x00\x00\x66\x4f\x00\x00\x00\x00\x44\x5b\x00\x00\x66\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x54\x66\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x55\x00\x00\x59\x78\x00\x00\x00\x00\x66\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x53\x66\x5d\x00\x00\x66\x5e\x3f\x57\x54\x50\x00\x00\x57\x56\x34\x66\x4b\x6f\x66\x5a\x58\x43\x57\x4e\x50\x22\x00\x00\x43\x4f\x00\x00\x00\x00\x66\x5f\x3c\x3e\x39\x42\x66\x5b\x51\x27\x00\x00\x00\x00\x3a\x22\x42\x4f\x00\x00\x58\x2b\x00\x00\x00\x00\x00\x00\x4a\x6b\x65\x6e\x00\x00\x66\x5c\x00\x00\x37\x75\x00\x00\x00\x00\x00\x00\x00\x00\x48\x66\x00\x00\x00\x00\x44\x75\x00\x00\x00\x00", /* 5b80 */ "\x65\x32\x44\x7e\x00\x00\x4b\x7c\x65\x33\x55\x2c\x00\x00\x53\x6e\x4a\x58\x30\x32\x00\x00\x4b\x4e\x4d\x6a\x00\x00\x00\x00\x3a\x6a\x00\x00\x00\x00\x00\x00\x65\x35\x00\x00\x65\x34\x00\x00\x57\x5a\x39\x59\x56\x66\x36\x28\x4d\x70\x52\x4b\x31\x26\x4a\x35\x00\x00\x33\x68\x49\x73\x3f\x4d\x50\x7b\x4a\x52\x65\x36\x3b\x42\x00\x00\x00\x00\x00\x00\x4f\x5c\x39\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x54\x57\x00\x00\x00\x00\x3a\x26\x51\x67\x4f\x7c\x3c\x52\x00\x00\x65\x37\x48\x5d\x00\x00\x00\x00\x00\x00\x3f\x6d\x31\x76\x4b\x5e\x00\x00\x00\x00\x3c\x45\x00\x00\x3c\x44\x52\x7a\x43\x5c\x3f\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x38\x3b\x00\x00\x00\x00\x00\x00\x43\x42\x00\x00\x3a\x2e\x54\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x5e\x44\x2f\x32\x6c\x00\x00\x39\x51\x00\x00\x00\x00\x65\x3b\x41\x48\x00\x00\x00\x00\x55\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x3c\x00\x00\x65\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x67\x36\x54\x4b\x42\x51\x30\x35\x3c\x00\x00\x00\x00\x4a\x59", /* 5c00 */ "\x00\x00\x37\x62\x00\x00\x00\x00\x49\x64\x00\x00\x3d\x2b\x00\x00\x00\x00\x4e\x3e\x57\x70\x00\x00\x00\x00\x00\x00\x00\x00\x50\x21\x00\x00\x49\x59\x00\x00\x00\x00\x36\x7b\x66\x58\x3c\x62\x00\x00\x33\x3e\x00\x00\x49\x50\x00\x00\x66\x59\x33\x22\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x4c\x00\x00\x53\x48\x5e\x4d\x00\x00\x52\x22\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x4d\x00\x00\x00\x00\x5e\x4f\x00\x00\x00\x00\x00\x00\x4a\x2c\x52\x7c\x33\x5f\x65\x6a\x44\x61\x3e\x21\x4e\x32\x44\x72\x3e\x56\x46\x28\x32\x63\x00\x00\x00\x00\x3e\x53\x00\x00\x00\x00\x47\x7c\x4c\x6b\x3d\x6c\x4e\x5d\x00\x00\x00\x00\x4a\x3a\x46\x41\x65\x6c\x50\x3c\x00\x00\x00\x00\x00\x00\x55\x39\x00\x00\x00\x00\x00\x00\x65\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x74\x00\x00\x4d\x40\x42\x45\x00\x00\x65\x6f\x00\x00\x42\x44\x65\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x78\x4d\x4d\x00\x00\x49\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x59\x61\x28\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6c", /* 5c80 */ "\x00\x00\x4b\x6a\x46\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x2c\x00\x00\x00\x00\x00\x00\x61\x27\x61\x29\x00\x00\x00\x00\x61\x2a\x61\x2f\x00\x00\x00\x00\x32\x6d\x00\x00\x61\x2b\x38\x5a\x61\x2d\x61\x2e\x61\x30\x35\x3a\x61\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x33\x61\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x52\x00\x00\x61\x36\x61\x35\x41\x6b\x00\x00\x00\x00\x00\x00\x61\x37\x00\x00\x54\x40\x00\x00\x61\x32\x00\x00\x61\x3a\x30\x36\x00\x00\x00\x00\x00\x00\x00\x00\x61\x34\x00\x00\x3f\x79\x00\x00\x61\x39\x00\x00\x00\x00\x61\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x3f\x00\x00\x00\x00\x61\x3d\x61\x3f\x42\x4d\x00\x00\x36\x6b\x00\x00\x53\x78\x00\x00\x00\x00\x47\x4d\x00\x00\x00\x00\x37\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x7e\x00\x00\x00\x00\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x61\x40\x61\x41\x00\x00\x00\x00\x61\x47\x33\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x5e\x00\x00\x51\x42\x00\x00\x00\x00\x00\x00\x00\x00\x61\x48\x00\x00\x00\x00\x61\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x45\x00\x00\x61\x43\x61\x42\x00\x00\x31\x40\x00\x00\x00\x00\x00\x00\x55\x38\x61\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x4c\x61\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x7a\x00\x00\x00\x00\x61\x53\x61\x52\x47\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x49\x00\x00\x00\x00\x61\x4e\x00\x00\x61\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x54\x00\x00\x61\x51\x61\x4d\x00\x00\x00\x00\x61\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x61\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5d80 */ "\x00\x00\x00\x00\x61\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x57\x00\x00\x00\x00\x00\x00\x61\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x5d\x00\x00\x34\x28\x56\x5d\x00\x00\x00\x00\x51\x32\x33\x32\x00\x00\x00\x00\x39\x24\x57\x73\x47\x49\x3e\x5e\x39\x2e\x00\x00\x4e\x57\x00\x00\x00\x00\x32\x6e\x5b\x4f\x00\x00\x3c\x3a\x52\x51\x4b\x48\x30\x4d\x00\x00\x00\x00\x4f\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x63\x3d\x6d\x00\x00", /* 5e00 */ "\x00\x00\x31\x52\x4a\x50\x32\x3c\x00\x00\x4b\x27\x37\x2b\x00\x00\x4a\x26\x00\x00\x00\x00\x00\x00\x4f\x23\x00\x00\x00\x00\x60\x78\x55\x4a\x60\x7b\x00\x00\x00\x00\x60\x7a\x45\x41\x4c\x7b\x00\x00\x41\x31\x60\x79\x56\x63\x32\x2f\x56\x44\x35\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x78\x56\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x2f\x30\x6f\x00\x00\x00\x00\x60\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x21\x33\x23\x00\x00\x00\x00\x60\x7d\x60\x7e\x43\x31\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5d\x00\x00\x61\x22\x37\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x23\x44\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x24\x00\x00\x00\x00\x61\x25\x00\x00\x00\x00\x61\x26\x34\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x49\x46\x3d\x44\x6a\x00\x00\x32\x22\x00\x00\x50\x52\x00\x00\x67\x5b\x3b\x43\x53\x57\x53\x44\x00\x00\x39\x63", /* 5e80 */ "\x62\x4f\x00\x00\x00\x00\x00\x00\x57\x2f\x00\x00\x47\x6c\x31\x53\x00\x00\x00\x00\x34\x32\x62\x51\x00\x00\x00\x00\x00\x00\x50\x72\x42\x2e\x62\x50\x00\x00\x3f\x62\x53\x26\x35\x57\x62\x52\x35\x6a\x00\x00\x43\x6d\x38\x7d\x00\x00\x38\x2e\x00\x00\x45\x53\x37\x4f\x62\x54\x00\x00\x00\x00\x00\x00\x00\x00\x62\x53\x36\x48\x57\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x58\x00\x00\x62\x56\x4a\x7c\x3f\x35\x53\x39\x62\x55\x00\x00\x00\x00\x00\x00\x00\x00\x62\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x2e\x40\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5b\x62\x5a\x40\x2a\x00\x00\x00\x00\x41\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5d\x00\x00\x62\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x48\x00\x00\x51\x53\x4d\x22\x00\x00\x00\x00\x3d\x28\x00\x00\x00\x00\x00\x00\x5e\x43\x58\x25", /* 5f00 */ "\x3f\x2a\x5b\x4d\x52\x6c\x46\x7a\x45\x2a\x00\x00\x00\x00\x00\x00\x5e\x44\x00\x00\x31\x57\x5f\x2e\x00\x00\x00\x00\x00\x00\x4a\x3d\x00\x00\x5f\x31\x00\x00\x39\x2d\x00\x00\x52\x7d\x00\x00\x38\x25\x3a\x6b\x00\x00\x00\x00\x33\x5a\x00\x00\x00\x00\x00\x00\x35\x5c\x55\x45\x00\x00\x00\x00\x00\x00\x00\x00\x43\x56\x4f\x52\x3b\x21\x00\x00\x65\x73\x65\x72\x00\x00\x00\x00\x65\x74\x00\x00\x4d\x64\x00\x00\x48\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x2f\x47\x3f\x00\x00\x65\x76\x00\x00\x00\x00\x00\x00\x6c\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x66\x00\x00\x39\x69\x35\x31\x00\x00\x42\x3c\x65\x68\x65\x67\x65\x69\x00\x00\x00\x00\x00\x00\x00\x00\x52\x4d\x00\x00\x00\x00\x00\x00\x61\x6a\x50\x4e\x00\x00\x4d\x2e\x00\x00\x51\x65\x00\x00\x00\x00\x32\x4a\x31\x6b\x00\x00\x31\x72\x45\x6d\x00\x00\x00\x00\x55\x43\x53\x30\x00\x00\x61\x5c\x00\x00\x00\x00\x00\x00\x61\x5d\x00\x00\x52\x5b\x00\x00\x33\x39\x31\x4b\x00\x00\x00\x00\x00\x00", /* 5f80 */ "\x4d\x79\x55\x77\x61\x5e\x00\x00\x3e\x36\x34\x7d\x00\x00\x61\x5f\x3a\x5c\x61\x60\x3b\x32\x42\x49\x61\x61\x00\x00\x00\x00\x00\x00\x50\x6c\x00\x00\x4d\x3d\x00\x00\x00\x00\x61\x62\x00\x00\x35\x43\x45\x47\x61\x63\x00\x00\x00\x00\x61\x64\x00\x00\x00\x00\x00\x00\x00\x00\x53\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x65\x00\x00\x51\x2d\x00\x00\x00\x00\x61\x66\x4e\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x67\x00\x00\x35\x42\x00\x00\x00\x00\x00\x00\x00\x00\x61\x68\x3b\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x44\x62\x60\x31\x58\x52\x64\x00\x00\x00\x00\x62\x61\x00\x00\x00\x00\x3c\x49\x48\x4c\x00\x00\x62\x63\x6c\x7e\x6c\x7d\x5f\x2f\x00\x00\x00\x00\x00\x00\x62\x62\x56\x3e\x4d\x7c\x43\x26\x00\x00\x00\x00\x00\x00\x63\x43\x00\x00\x00\x00\x56\x52\x62\x67\x00\x00\x00\x00\x62\x68\x00\x00\x00\x00\x53\x47\x00\x00\x00\x00\x62\x6c\x3f\x6c\x00\x00\x62\x6d\x62\x65\x00\x00\x00\x00\x33\x40\x00\x00\x00\x00\x00\x00\x44\x6e\x00\x00\x00\x00\x62\x6e\x00\x00\x00\x00\x50\x43\x00\x00\x3a\x76\x62\x69\x37\x5e", /* 6000 */ "\x3b\x33\x4c\x2c\x4b\x4b\x62\x64\x62\x66\x62\x6a\x62\x6b\x00\x00\x00\x00\x00\x00\x62\x77\x00\x00\x00\x00\x62\x74\x54\x75\x62\x73\x00\x00\x00\x00\x45\x2d\x00\x00\x55\x7a\x45\x42\x32\x40\x00\x00\x00\x00\x62\x6f\x00\x00\x62\x72\x41\x2f\x4b\x3c\x00\x00\x00\x00\x35\x21\x62\x79\x00\x00\x00\x00\x00\x00\x3c\x31\x62\x71\x50\x54\x54\x39\x62\x75\x39\x56\x62\x76\x00\x00\x00\x00\x00\x00\x47\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x5c\x6d\x21\x00\x00\x00\x00\x62\x78\x00\x00\x6d\x25\x62\x7e\x4a\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x35\x00\x00\x3b\x50\x00\x00\x00\x00\x3f\x56\x00\x00\x3a\x63\x00\x00\x00\x00\x4b\x21\x00\x00\x00\x00\x00\x00\x6d\x26\x6d\x23\x00\x00\x00\x00\x6d\x22\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x56\x6d\x27\x50\x74\x00\x00\x00\x00\x6d\x24\x3a\x5e\x36\x77\x63\x21\x36\x32\x4c\x71\x39\x27\x00\x00\x4f\x22\x47\x21\x00\x00\x00\x00\x3f\x52\x00\x00\x00\x00\x36\x71\x00\x00\x62\x7a\x62\x7b\x62\x7d\x62\x7c\x44\x55\x63\x22\x00\x00\x53\x41", /* 6080 */ "\x00\x00\x00\x00\x00\x00\x63\x27\x47\x44\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x24\x00\x00\x00\x00\x63\x29\x3a\x37\x00\x00\x00\x00\x00\x00\x00\x00\x63\x28\x00\x00\x3b\x5a\x00\x00\x63\x23\x00\x00\x00\x00\x00\x00\x63\x24\x63\x2a\x00\x00\x63\x26\x00\x00\x4e\x72\x53\x46\x00\x00\x00\x00\x3b\x3c\x00\x00\x00\x00\x54\x43\x00\x00\x44\x7a\x00\x00\x00\x00\x6d\x28\x50\x7c\x63\x25\x00\x00\x43\x75\x00\x00\x63\x2d\x31\x2f\x00\x00\x63\x32\x00\x00\x00\x00\x00\x00\x3c\x42\x00\x00\x00\x00\x63\x2c\x35\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x69\x63\x30\x00\x00\x00\x00\x00\x00\x3e\x2a\x4d\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x73\x00\x00\x00\x00\x00\x00\x4c\x68\x00\x00\x00\x00\x63\x2f\x00\x00\x63\x31\x00\x00\x4f\x27\x63\x2e\x00\x00\x4e\x29\x3b\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x6b\x3e\x65\x32\x52\x33\x4d\x00\x00\x31\x39\x63\x2b\x32\x51\x35\x2c\x39\x5f\x36\x68\x00\x00\x00\x00\x4f\x6b\x63\x37\x00\x00\x3b\x4c\x00\x00\x00\x00\x48\x47\x50\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6100 */ "\x63\x38\x33\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x29\x00\x00\x53\x7a\x53\x64\x00\x00\x00\x00\x00\x00\x6d\x2a\x63\x39\x52\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x35\x00\x00\x00\x00\x00\x00\x00\x00\x53\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x38\x50\x63\x33\x00\x00\x00\x00\x63\x36\x37\x5f\x00\x00\x63\x34\x40\x22\x00\x00\x00\x00\x00\x00\x63\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x48\x00\x00\x63\x3b\x00\x00\x3b\x45\x00\x00\x49\x77\x00\x00\x00\x00\x49\x65\x00\x00\x00\x00\x00\x00\x44\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x42\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x5b\x3f\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x63\x3c\x00\x00\x3f\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x6f\x00\x00\x00\x00\x54\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x3f\x3a\x29\x6d\x2c\x00\x00\x00\x00\x63\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x36\x00\x00\x00\x00\x00\x00\x36\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x38\x00\x00\x30\x43\x6d\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x2f\x40\x41\x00\x00\x63\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x32", /* 6200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x30\x00\x00\x38\x6a\x00\x00\x4e\x6c\x6a\x27\x50\x67\x4a\x79\x48\x56\x4f\x37\x33\x49\x4e\x52\x3d\x64\x00\x00\x00\x00\x63\x5e\x3b\x72\x6a\x28\x55\x3d\x00\x00\x46\x5d\x6a\x29\x00\x00\x00\x00\x00\x00\x6a\x2a\x00\x00\x6a\x2c\x6a\x2b\x00\x00\x6a\x2e\x6a\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x58\x00\x00\x6a\x2f\x00\x00\x42\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x34\x41\x34\x77\x00\x00\x00\x00\x3b\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x66\x6c\x65\x37\x3f\x4b\x79\x31\x62\x00\x00\x6c\x67\x00\x00\x00\x00\x00\x00\x49\x48\x6c\x68\x6c\x69\x00\x00\x4a\x56\x5e\x50\x32\x45\x54\x7a\x00\x00\x00\x00\x46\x4b\x30\x47\x34\x72\x48\x53\x00\x00\x00\x00\x00\x00\x4d\x50\x00\x00\x00\x00\x3f\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x5b\x00\x00\x00\x00\x47\x24\x56\x34\x00\x00\x40\x29\x5e\x51\x49\x28\x51\x6f\x45\x24\x30\x67\x33\x36\x48\x45\x00\x00\x00\x00\x30\x62\x00\x00\x00\x00\x37\x76\x00\x00\x00\x00\x45\x7a\x00\x00\x00\x00\x36\x73\x00\x00\x55\x52\x33\x50", /* 6280 */ "\x3c\x3c\x00\x00\x00\x00\x00\x00\x33\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x71\x30\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x56\x4a\x63\x57\x25\x00\x00\x4d\x36\x36\x36\x3f\x39\x55\x5b\x00\x00\x38\x27\x45\x57\x00\x00\x00\x00\x00\x00\x5e\x52\x3f\x59\x42\x55\x47\x40\x00\x00\x3b\x24\x31\x28\x00\x00\x00\x00\x45\x6a\x00\x00\x00\x00\x45\x7b\x4c\x27\x00\x00\x00\x00\x00\x00\x00\x00\x31\x27\x00\x00\x00\x00\x00\x00\x35\x56\x00\x00\x00\x00\x00\x00\x44\x28\x00\x00\x5e\x53\x51\x3a\x33\x69\x00\x00\x43\x72\x00\x00\x00\x00\x37\x77\x00\x00\x56\x74\x35\x23\x32\x70\x44\x34\x44\x69\x40\x2d\x5e\x54\x00\x00\x30\x68\x45\x44\x41\x60\x00\x00\x39\x55\x00\x00\x3e\x5c\x4d\x58\x30\x4e\x00\x00\x4d\x4f\x5e\x56\x3e\x50\x57\x3e\x5e\x55\x55\x50\x30\x5d\x00\x00\x00\x00\x44\x62\x00\x00\x00\x00\x42\x23\x3c\x70\x00\x00\x53\x35\x40\x39\x45\x21\x32\x26\x54\x71\x00\x00\x00\x00\x40\x28\x4a\x43\x5e\x57\x55\x7c\x00\x00\x39\x30\x00\x00\x48\x2d\x4b\x29\x00\x00\x5e\x59\x3f\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x46\x34\x57\x27\x4a\x30\x44\x43", /* 6300 */ "\x00\x00\x33\x56\x39\x52\x00\x00\x00\x00\x00\x00\x00\x00\x56\x38\x6a\x7c\x30\x34\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x66\x00\x00\x00\x00\x4c\x74\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5a\x00\x00\x00\x00\x00\x00\x56\x3f\x42\x4e\x00\x00\x4e\x4e\x4c\x22\x50\x2e\x44\x53\x35\x32\x5e\x58\x55\x75\x3c\x37\x3b\x53\x00\x00\x00\x00\x30\x24\x00\x00\x45\x32\x34\x6c\x00\x00\x00\x00\x00\x00\x55\x71\x00\x00\x00\x00\x6a\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x5a\x4d\x26\x00\x00\x00\x00\x4d\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x66\x5e\x5c\x00\x00\x4d\x31\x40\x26\x00\x00\x00\x00\x57\x3d\x00\x00\x5e\x5b\x30\x46\x3a\x34\x49\x53\x44\x73\x3e\x68\x00\x00\x00\x00\x00\x00\x00\x00\x32\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x4c\x4b\x70\x00\x00\x3c\x71\x3b\x3b\x35\x37\x00\x00\x00\x00\x00\x00\x45\x75\x00\x00\x5e\x66\x00\x00\x00\x00\x00\x00\x5e\x63\x3e\x5d\x00\x00\x00\x00\x5e\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x34\x37\x3d\x5d\x00\x00\x00\x00\x5e\x60\x44\x6d\x00\x00\x00\x00\x00\x00\x00\x00", /* 6380 */ "\x4f\x46\x00\x00\x35\x60\x00\x00\x00\x00\x00\x00\x00\x00\x36\x5e\x4a\x5a\x35\x74\x5e\x65\x00\x00\x55\x46\x00\x00\x5e\x61\x4c\x4d\x46\x7e\x00\x00\x45\x45\x00\x00\x00\x00\x00\x00\x52\x34\x00\x00\x3e\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x53\x00\x00\x4c\x3d\x33\x38\x00\x00\x3d\x53\x00\x00\x3f\x58\x4d\x46\x51\x5a\x34\x6b\x00\x00\x5e\x64\x5e\x5d\x5e\x67\x00\x00\x6a\x7e\x00\x00\x00\x00\x42\x30\x5e\x62\x00\x00\x00\x00\x56\x40\x35\x27\x00\x00\x32\x74\x00\x00\x5e\x68\x00\x00\x5e\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6d\x00\x00\x5e\x71\x00\x00\x00\x00\x48\x60\x00\x00\x00\x00\x00\x00\x57\x61\x5e\x6f\x43\x68\x4c\x61\x00\x00\x32\x65\x00\x00\x00\x00\x00\x00\x52\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6e\x00\x00\x5e\x6b\x4e\x55\x00\x00\x34\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x2b\x3e\x3e\x00\x00\x00\x00\x3d\x52\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x69\x00\x00\x54\x2e\x00\x00\x5e\x5e\x00\x00\x5e\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x40\x3f\x00\x00\x5e\x6c", /* 6400 */ "\x32\x73\x38\x69\x42\x27\x00\x00\x00\x00\x3d\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x75\x5e\x78\x00\x00\x00\x00\x32\x2b\x34\x24\x00\x00\x00\x00\x34\x6a\x49\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x76\x4b\x51\x00\x00\x38\x63\x00\x00\x5e\x77\x5e\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x79\x00\x00\x00\x00\x00\x00\x4c\x42\x00\x00\x30\x61\x34\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x2f\x00\x00\x00\x00\x32\x6b\x00\x00\x6b\x21\x00\x00\x5e\x74\x00\x00\x00\x00\x49\x63\x5e\x73\x30\x5a\x52\x21\x31\x77\x00\x00\x4c\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x70\x00\x00\x4b\x24\x00\x00\x00\x00\x00\x00\x55\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x5d\x00\x00\x44\x26\x00\x00\x00\x00\x00\x00\x5e\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x7e\x44\x21\x5f\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6480 */ "\x00\x00\x00\x00\x41\x4c\x00\x00\x5e\x7c\x3e\x6f\x00\x00\x46\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x45\x48\x76\x00\x00\x00\x00\x4b\x3a\x5e\x7e\x00\x00\x00\x00\x5f\x24\x00\x00\x00\x00\x00\x00\x00\x00\x57\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x37\x00\x00\x00\x00\x00\x00\x00\x00\x41\x43\x00\x00\x00\x00\x47\x4b\x32\x25\x34\x69\x00\x00\x57\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6c\x00\x00\x5f\x22\x5f\x23\x00\x00\x5f\x25\x00\x00\x3a\x33\x00\x00\x00\x00\x00\x00\x5f\x26\x00\x00\x40\x5e\x00\x00\x00\x00\x49\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x59\x47\x66\x00\x00\x5f\x27\x00\x00\x47\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x28\x6b\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x53\x00\x00\x00\x00\x00\x00\x5f\x2a\x00\x00\x5f\x29\x00\x00\x32\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6500 */ "\x45\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x70\x00\x00\x00\x00\x5f\x2d\x56\x27\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x37\x6b\x36\x4a\x55\x00\x00\x58\x7c\x38\x44\x00\x00\x39\x25\x00\x00\x00\x00\x37\x45\x55\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x4a\x00\x00\x00\x00\x50\x27\x74\x4d\x00\x00\x00\x00\x35\x50\x00\x00\x00\x00\x43\x74\x00\x00\x3e\x48\x00\x00\x00\x00\x00\x00\x6b\x37\x30\x3d\x00\x00\x00\x00\x3d\x4c\x00\x00\x41\x32\x00\x00\x31\x56\x33\x28\x00\x00\x00\x00\x00\x00\x38\x52\x49\x22\x00\x00\x00\x00\x36\x58\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x38\x3e\x34\x00\x00\x00\x00\x00\x00\x4a\x7d\x00\x00\x47\x43\x00\x00\x55\x7b\x00\x00\x00\x00\x37\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x44\x00\x00\x00\x00\x00\x00\x55\x2b\x31\x73\x00\x00\x00\x00\x00\x00\x6c\x33\x30\x5f\x00\x00\x6c\x35\x00\x00\x00\x00\x00\x00\x36\x37\x00\x00\x41\x4f\x00\x00\x75\x7a\x50\x31\x00\x00\x00\x00\x55\x65\x00\x00\x4e\x53\x00\x00\x00\x00\x3d\x6f\x33\x62\x00\x00\x38\x2b\x00\x00\x55\x36\x00\x00\x6d\x3d\x00\x00\x36\x4f\x00\x00\x4b\x39\x50\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x3d\x00\x00\x00\x00\x6c\x36\x4a\x29\x00\x00\x00\x00\x00\x00\x45\x54\x00\x00\x6c\x39\x6c\x38\x42\x43\x6c\x37\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7d\x6c\x3a\x00\x00\x6c\x3b\x57\x65\x00\x00\x00\x00\x6c\x3c\x00\x00\x00\x00\x00\x00\x6c\x3d\x46\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x5e\x00\x00\x3c\x48\x00\x00\x00\x00\x48\x55\x35\x29\x3e\x49\x56\x3c\x54\x67\x00\x00\x00\x00\x51\x2e\x50\x71\x6a\x38\x6a\x39\x6a\x3a\x3a\x35\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x31\x3f\x75\x00\x00\x00\x00\x4d\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6600 */ "\x6a\x40\x00\x00\x30\x3a\x6a\x3e\x00\x00\x00\x00\x40\x25\x00\x00\x00\x00\x00\x00\x6a\x3b\x00\x00\x32\x7d\x00\x00\x43\x77\x3b\x68\x00\x00\x00\x00\x00\x00\x52\x57\x4e\x74\x6a\x3f\x00\x00\x00\x00\x00\x00\x6a\x3c\x00\x00\x00\x00\x00\x00\x6a\x43\x00\x00\x50\x47\x53\x33\x00\x00\x00\x00\x00\x00\x00\x00\x34\x3a\x00\x00\x43\x41\x57\x72\x00\x00\x00\x00\x00\x00\x00\x00\x55\x51\x00\x00\x4a\x47\x00\x00\x6a\x45\x00\x00\x00\x00\x6a\x44\x6a\x47\x6a\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x67\x00\x00\x4f\x54\x00\x00\x00\x00\x6a\x4b\x00\x00\x3b\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x7a\x49\x4e\x00\x00\x00\x00\x6a\x4c\x00\x00\x00\x00\x49\x39\x4f\x7e\x6a\x4a\x54\x4e\x6a\x4d\x6a\x4f\x00\x00\x00\x00\x4d\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x49\x00\x00\x6a\x4e\x00\x00\x00\x00\x4e\x6e\x00\x00\x3b\x5e\x00\x00\x33\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x55\x3e\x30\x4e\x7a\x00\x00\x00\x00\x00\x00\x47\x67\x00\x00\x3e\x27\x6a\x50\x00\x00\x00\x00\x56\x47\x00\x00\x00\x00\x00\x00\x41\x40\x00\x00", /* 6680 */ "\x00\x00\x00\x00\x54\x5d\x00\x00\x6a\x51\x00\x00\x00\x00\x4f\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x52\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x45\x2f\x30\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x53\x74\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x29\x00\x00\x00\x00\x00\x00\x00\x00\x65\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6f\x00\x00\x6a\x56\x6a\x57\x46\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x58\x00\x00\x00\x00\x6a\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x3b\x00\x00\x47\x7a\x52\x37\x38\x7c\x00\x00\x00\x00\x6a\x42\x00\x00\x32\x5c\x00\x00\x00\x00\x42\x7c\x00\x00\x54\x78\x4c\x66", /* 6700 */ "\x57\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x42\x53\x50\x6b\x43\x45\x73\x00\x00\x37\x7e\x00\x00\x00\x00\x6b\x54\x00\x00\x00\x00\x00\x00\x4b\x37\x6b\x5e\x00\x00\x40\x4a\x00\x00\x00\x00\x00\x00\x4d\x7b\x00\x00\x33\x2f\x00\x00\x46\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x7c\x00\x00\x44\x3e\x00\x00\x4e\x34\x44\x29\x31\x3e\x54\x7d\x00\x00\x4a\x75\x00\x00\x56\x6c\x00\x00\x00\x00\x46\x53\x36\x64\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x7a\x00\x00\x00\x00\x50\x60\x00\x00\x00\x00\x49\x31\x00\x00\x54\x53\x48\x28\x00\x00\x00\x00\x38\x4b\x00\x00\x68\x3e\x49\x3c\x00\x00\x00\x00\x68\x3b\x00\x00\x40\x6e\x50\x53\x32\x44\x34\x65\x00\x00\x68\x3c\x00\x00\x00\x00\x55\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x45\x00\x00\x68\x3d\x4a\x78\x38\x5c\x4c\x75\x00\x00\x00\x00\x00\x00\x40\x34\x00\x00\x00\x00\x51\x6e\x68\x3f\x68\x42\x00\x00\x00\x00\x3a\x3c\x00\x00\x31\x2d\x3d\x5c\x00\x00\x6a\x3d\x68\x43\x00\x00\x68\x46\x00\x00\x68\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x68\x4c\x00\x00\x4b\x49\x30\x65", /* 6780 */ "\x00\x00\x3c\x2b\x00\x00\x00\x00\x39\x39\x00\x00\x00\x00\x68\x41\x00\x00\x4d\x77\x00\x00\x68\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x76\x00\x00\x00\x00\x00\x00\x00\x00\x55\x6d\x00\x00\x41\x56\x68\x44\x00\x00\x43\x36\x00\x00\x39\x7b\x56\x26\x68\x48\x00\x00\x00\x00\x00\x00\x4a\x60\x54\x66\x00\x00\x68\x40\x00\x00\x68\x45\x68\x47\x00\x00\x47\x39\x37\x63\x00\x00\x68\x49\x00\x00\x3f\x5d\x68\x52\x00\x00\x00\x00\x68\x57\x00\x00\x68\x55\x3c\x5c\x3c\x4f\x68\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5e\x00\x00\x68\x5a\x31\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x58\x44\x33\x38\x4c\x46\x62\x48\x3e\x48\x61\x00\x00\x00\x00\x00\x00\x68\x4f\x68\x54\x68\x56\x00\x00\x39\x71\x68\x58\x57\x75\x00\x00\x44\x7b\x00\x00\x68\x5c\x00\x00\x00\x00\x32\x69\x00\x00\x00\x00\x00\x00\x68\x51\x00\x00\x00\x00\x3c\x6d\x00\x00\x00\x00\x3f\x42\x68\x4d\x56\x79\x00\x00\x41\x78\x32\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5f\x00\x00\x4a\x41", /* 6800 */ "\x68\x59\x00\x00\x00\x00\x00\x00\x00\x00\x55\x24\x00\x00\x31\x6a\x55\x3b\x68\x4e\x68\x50\x36\x30\x68\x53\x00\x00\x68\x5d\x40\x38\x00\x00\x4a\x77\x00\x00\x4b\x28\x00\x00\x00\x00\x46\x5c\x40\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x69\x00\x00\x00\x00\x00\x00\x50\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x72\x56\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x60\x68\x61\x00\x00\x00\x00\x00\x00\x51\x79\x3a\x4b\x38\x79\x00\x00\x00\x00\x38\x71\x54\x54\x68\x6f\x00\x00\x68\x6e\x68\x6c\x39\x70\x4c\x52\x68\x66\x4e\x26\x3f\x72\x00\x00\x30\x38\x68\x71\x68\x70\x00\x00\x57\x40\x00\x00\x68\x64\x00\x00\x4d\x29\x49\x23\x00\x00\x3b\x38\x3d\x5b\x68\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x62\x68\x63\x68\x65\x35\x35\x68\x67\x47\x45\x68\x6b\x68\x6d\x3d\x30\x57\x2e\x00\x00\x68\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x75\x00\x00\x4d\x30\x68\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6880 */ "\x00\x00\x41\x3a\x00\x00\x68\x68\x00\x00\x43\x37\x30\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x74\x00\x00\x00\x00\x00\x00\x68\x77\x00\x00\x00\x00\x00\x00\x39\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x52\x00\x00\x00\x00\x00\x00\x43\x4e\x4e\x60\x40\x66\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x73\x00\x00\x4c\x5d\x50\x35\x00\x00\x00\x00\x4a\x61\x00\x00\x68\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x6c\x00\x00\x68\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5e\x00\x00\x46\x65\x00\x00\x39\x77\x00\x00\x00\x00\x00\x00\x00\x00\x30\x74\x00\x00\x00\x00\x57\x58\x00\x00\x00\x00\x3c\x2c\x00\x00\x45\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x44\x00\x00\x00\x00\x69\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x2d\x00\x00\x69\x22\x40\x62\x00\x00\x00\x00\x00\x00\x3f\x43\x00\x00\x00\x00\x00\x00\x68\x7e\x39\x57\x00\x00\x68\x7b\x00\x00\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x69\x24\x00\x00\x00\x00\x00\x00\x52\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x23\x00\x00\x56\x32\x57\x35\x00\x00\x69\x27\x00\x00\x3d\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7c\x68\x7d\x00\x00\x00\x00\x00\x00\x69\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x56\x00\x00\x00\x00\x52\x2c\x00\x00\x00\x00\x00\x00\x69\x32\x00\x00\x00\x00\x00\x00\x00\x00\x69\x29\x00\x00\x00\x00\x00\x00\x34\x2a\x00\x00\x34\x3b\x00\x00\x00\x00\x69\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x28\x00\x00\x00\x00\x69\x25\x00\x00\x00\x00\x33\x7e\x00\x00\x00\x00\x69\x2c\x40\x63\x00\x00\x69\x2a\x00\x00\x00\x00\x69\x39\x00\x00\x00\x00\x69\x38\x00\x00\x00\x00\x00\x00\x00\x00\x69\x2e\x00\x00\x00\x00\x68\x7a\x00\x00\x00\x00\x69\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x2c\x69\x31\x69\x3a\x00\x00\x00\x00\x42\x25\x00\x00\x00\x00\x00\x00", /* 6980 */ "\x69\x2f\x00\x00\x38\x45\x00\x00\x69\x2d\x00\x00\x53\x5c\x69\x34\x69\x35\x69\x37\x00\x00\x00\x00\x00\x00\x69\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x46\x69\x45\x00\x00\x00\x00\x69\x30\x00\x00\x00\x00\x69\x3b\x30\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x3c\x55\x25\x00\x00\x00\x00\x69\x3e\x00\x00\x69\x3f\x00\x00\x00\x00\x00\x00\x69\x41\x00\x00\x00\x00\x41\x71\x00\x00\x00\x00\x48\x36\x00\x00\x00\x00\x00\x00\x69\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x43\x00\x00\x69\x33\x00\x00\x69\x36\x00\x00\x3b\x31\x00\x00\x00\x00\x00\x00\x69\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x77\x00\x00\x00\x00\x00\x00\x69\x44\x69\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x5b\x00\x00\x69\x48", /* 6a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4b\x69\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x41\x00\x00\x44\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x58\x00\x00\x3a\x61\x00\x00\x00\x00\x00\x00\x00\x00\x69\x49\x00\x00\x53\x23\x00\x00\x00\x00\x00\x00\x69\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x57\x69\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4f\x00\x00\x00\x00\x47\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x59\x33\x48\x00\x00\x69\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x70\x00\x00\x00\x00\x00\x00\x69\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x56\x00\x00\x00\x00\x69\x5a\x00\x00\x00\x00\x00\x00", /* 6a80 */ "\x4c\x34\x00\x00\x00\x00\x00\x00\x4f\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x55\x00\x00\x69\x5c\x69\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x5d\x00\x00\x69\x5f\x43\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x37\x34\x4e\x3b\x36\x50\x40\x6c\x23\x00\x00\x00\x00\x45\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x24\x00\x00\x6c\x25\x46\x5b\x00\x00\x00\x00\x00\x00\x3f\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x26\x00\x00\x00\x00\x6c\x27\x50\x2a\x00\x00\x47\x38\x00\x00\x00\x00\x38\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x39\x55\x7d\x34\x4b\x32\x3d\x4e\x64\x46\x67\x00\x00\x00\x00\x4d\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x75\x00\x00\x4b\x40\x3c\x5f\x00\x00\x00\x00\x00\x00", /* 6b80 */ "\x00\x00\x69\x62\x69\x63\x51\x6a\x69\x65\x00\x00\x34\x79\x69\x64\x00\x00\x51\x33\x4a\x62\x32\x50\x00\x00\x69\x68\x00\x00\x00\x00\x00\x00\x00\x00\x69\x66\x69\x67\x00\x00\x00\x00\x56\x33\x00\x00\x00\x00\x00\x00\x69\x69\x69\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x2f\x45\x39\x36\x4e\x00\x00\x52\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x6e\x00\x00\x3b\x59\x6c\x31\x00\x00\x00\x00\x52\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x63\x00\x00\x44\x38\x00\x00\x43\x3f\x00\x00\x00\x00\x36\x3e\x58\x39\x31\x48\x31\x4f\x31\x51\x45\x7e\x00\x00\x31\x50\x00\x00\x43\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x24\x3a\x41\x00\x00\x00\x00\x00\x00\x4c\x3a\x00\x00\x00\x00\x00\x00\x6b\x25\x00\x00\x6b\x27\x00\x00\x00\x00\x00\x00\x6b\x28\x00\x00\x00\x00\x00\x00\x6b\x26\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x29\x6b\x2b\x6b\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x2c\x00\x00\x4a\x4f\x58\x35\x43\x71\x00\x00\x43\x25\x46\x78\x6b\x2d\x44\x4a\x00\x00\x6b\x2e\x6b\x2f\x6b\x30\x37\x55\x00\x00\x00\x00\x00\x00\x37\x7a\x00\x00\x6b\x31\x47\x62\x00\x00\x6b\x33\x00\x00\x3a\x24\x51\x75\x30\x31\x6b\x32\x6b\x34\x00\x00\x00\x00\x00\x00\x35\x2a\x42\x48\x47\x68\x00\x00\x6b\x35\x00\x00\x4b\x2e\x63\x5f\x00\x00\x00\x00\x53\x40\x00\x00\x00\x00\x00\x00\x00\x00\x59\x5b\x00\x00\x00\x00\x4d\x21\x56\x2d\x47\x73\x00\x00\x00\x00\x00\x00\x59\x60\x3b\x63\x00\x00\x3a\x3a\x63\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x2b\x00\x00\x00\x00\x00\x00\x63\x60\x49\x47\x00\x00\x3a\x39\x00\x00\x00\x00\x00\x00\x51\x34\x63\x61\x48\x6a\x39\x2f\x3d\x2d\x33\x58\x4e\x5b\x00\x00\x00\x00\x4c\x40\x00\x00\x00\x00\x00\x00\x63\x68\x63\x69\x4d\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x2d\x00\x00\x3c\x33\x00\x00\x63\x6a\x00\x00\x63\x6b\x00\x00\x00\x00\x50\x5a\x00\x00\x00\x00\x00\x00\x46\x7b\x37\x5a\x00\x00", /* 6c80 */ "\x00\x00\x47\x5f\x52\x4a\x4e\x56\x00\x00\x63\x64\x63\x6c\x00\x00\x49\x72\x33\x41\x00\x00\x00\x00\x63\x67\x00\x00\x00\x00\x46\x63\x63\x65\x00\x00\x00\x00\x6d\x33\x63\x66\x00\x00\x00\x00\x00\x00\x00\x00\x49\x33\x00\x00\x45\x66\x00\x00\x00\x00\x00\x00\x39\x35\x00\x00\x43\x3b\x00\x00\x63\x63\x45\x3d\x41\x24\x42\x59\x32\x57\x00\x00\x63\x6d\x3b\x26\x44\x2d\x00\x00\x63\x70\x3e\x5a\x00\x00\x00\x00\x63\x7b\x63\x75\x3a\x53\x00\x00\x00\x00\x00\x00\x00\x00\x37\x50\x53\x4d\x00\x00\x56\x4e\x55\x53\x39\x41\x55\x34\x51\x58\x00\x00\x00\x00\x00\x00\x00\x00\x50\x39\x47\x76\x00\x00\x00\x00\x00\x00\x48\x2a\x32\x34\x00\x00\x43\x5a\x00\x00\x00\x00\x00\x00\x63\x6e\x00\x00\x00\x00\x63\x7c\x63\x6f\x37\x28\x63\x77\x63\x74\x00\x00\x00\x00\x00\x00\x37\x3a\x00\x00\x00\x00\x45\x22\x00\x00\x63\x76\x45\x5d\x32\x28\x46\x7c\x00\x00\x44\x60\x00\x00\x00\x00\x57\x22\x00\x00\x40\x61\x63\x79\x00\x00\x00\x00\x63\x7a\x63\x7d\x4c\x29\x63\x73\x00\x00\x53\x3e\x00\x00\x31\x43\x6d\x34\x63\x71\x63\x72\x00\x00\x63\x78\x50\x3a\x46\x43\x54\x73\x63\x7e\x00\x00", /* 6d00 */ "\x00\x00\x3d\x60\x00\x00\x00\x00\x64\x27\x00\x00\x00\x00\x64\x26\x00\x00\x00\x00\x00\x00\x51\x73\x64\x23\x00\x00\x64\x29\x00\x00\x00\x00\x00\x00\x48\x77\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x34\x00\x00\x64\x28\x64\x2e\x42\x65\x00\x00\x00\x00\x36\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x72\x00\x00\x64\x22\x00\x00\x00\x00\x3a\x69\x64\x2a\x00\x00\x00\x00\x64\x2c\x00\x00\x00\x00\x36\x7d\x56\x5e\x64\x32\x00\x00\x64\x2d\x00\x00\x00\x00\x00\x00\x64\x21\x00\x00\x3b\x6e\x4d\x5d\x47\x22\x45\x49\x00\x00\x00\x00\x41\x77\x00\x00\x64\x24\x00\x00\x47\x33\x3d\x2c\x3d\x3d\x64\x25\x00\x00\x57\x47\x32\x62\x00\x00\x64\x2b\x3c\x43\x64\x2f\x00\x00\x3b\x6b\x64\x30\x45\x28\x64\x31\x00\x00\x00\x00\x00\x00\x00\x00\x55\x63\x3f\x23\x00\x00\x64\x3a\x00\x00\x64\x37\x00\x00\x64\x3b\x00\x00\x00\x00\x64\x3d\x00\x00\x00\x00\x46\x56\x00\x00\x00\x00\x3a\x46\x40\x4b\x00\x00\x00\x00\x00\x00\x38\x21\x64\x34\x00\x00\x00\x00\x00\x00\x00\x00\x54\x21\x00\x00\x00\x00\x3a\x23\x3d\x7e\x00\x00\x00\x00\x00\x00\x64\x3c\x00\x00\x00\x00\x00\x00", /* 6d80 */ "\x00\x00\x00\x00\x4d\x3f\x00\x00\x00\x00\x44\x79\x00\x00\x00\x00\x4f\x7b\x49\x66\x00\x00\x00\x00\x53\x3f\x00\x00\x4f\x51\x00\x00\x00\x00\x64\x33\x00\x00\x64\x38\x64\x39\x4c\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x4e\x00\x00\x40\x54\x64\x35\x41\x30\x64\x36\x4e\x50\x00\x00\x3b\x41\x35\x53\x00\x00\x48\x73\x3d\x27\x55\x47\x49\x2c\x38\x22\x64\x4a\x00\x00\x00\x00\x64\x4c\x51\x44\x00\x00\x00\x00\x52\x3a\x00\x00\x00\x00\x3a\x2d\x00\x00\x00\x00\x3a\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x43\x35\x6d\x00\x00\x00\x00\x00\x00\x57\x4d\x64\x40\x4f\x7d\x64\x3f\x00\x00\x00\x00\x00\x00\x41\x5c\x4c\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x67\x00\x00\x00\x00\x00\x00\x00\x00\x44\x57\x00\x00\x4c\x54\x64\x48\x00\x00\x00\x00\x00\x00\x64\x47\x64\x41\x00\x00\x64\x44\x35\x2d\x00\x00\x00\x00\x53\x59\x00\x00\x64\x46\x00\x00\x00\x00\x00\x00\x00\x00\x52\x79\x34\x63\x00\x00\x3b\x34\x00\x00\x00\x00\x49\x6e\x00\x00\x34\x3e\x00\x00\x00\x00\x00\x00\x3b\x6c\x00\x00\x51\x4d\x00\x00\x4c\x6d\x6d\x35\x00\x00\x00\x00\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x65\x00\x00\x00\x00\x00\x00\x00\x00\x54\x28\x00\x00\x64\x4b\x57\x55\x64\x42\x00\x00\x3d\x25\x64\x45\x00\x00\x00\x00\x53\x66\x00\x00\x64\x49\x49\x78\x00\x00\x00\x00\x64\x3e\x00\x00\x00\x00\x53\x65\x00\x00\x00\x00\x47\x7e\x36\x49\x00\x00\x54\x7c\x32\x33\x64\x57\x00\x00\x00\x00\x00\x00\x4e\x42\x00\x00\x64\x4d\x00\x00\x4e\x3c\x00\x00\x38\x5b\x00\x00\x00\x00\x64\x56\x00\x00\x3f\x4a\x00\x00\x00\x00\x00\x00\x53\x4e\x00\x00\x43\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x48\x64\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x44\x64\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x64\x54\x64\x55\x00\x00\x3a\x7e\x00\x00\x4f\x66\x00\x00\x00\x00\x55\x3f\x00\x00\x00\x00\x00\x00\x64\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x50\x00\x00\x00\x00\x64\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x65\x4a\x2a", /* 6e80 */ "\x00\x00\x00\x00\x00\x00\x40\x23\x00\x00\x3d\x26\x64\x53\x00\x00\x00\x00\x38\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x67\x54\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x5b\x00\x00\x00\x00\x00\x00\x41\x6f\x00\x00\x00\x00\x64\x69\x00\x00\x00\x00\x52\x67\x00\x00\x00\x00\x64\x5f\x00\x00\x64\x60\x00\x00\x00\x00\x4f\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x5d\x00\x00\x64\x5a\x64\x51\x00\x00\x64\x65\x00\x00\x48\x5c\x64\x63\x00\x00\x00\x00\x44\x67\x64\x62\x00\x00\x64\x61\x00\x00\x00\x00\x00\x00\x33\x7c\x64\x68\x00\x00\x00\x00\x00\x00\x00\x00\x35\x61\x00\x00\x00\x00\x00\x00\x57\x4c\x00\x00\x00\x00\x00\x00\x64\x66\x00\x00\x3b\x2c\x00\x00\x57\x52\x4c\x4f\x6b\x78\x00\x00\x64\x64\x00\x00\x00\x00\x39\x76\x00\x00\x00\x00\x00\x00\x56\x4d\x64\x59\x64\x5c\x42\x7a\x64\x5e\x00\x00\x42\x4b\x40\x44\x42\x50\x00\x00\x31\x75\x4c\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x64\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6f00 */ "\x00\x00\x00\x00\x46\x2f\x00\x00\x00\x00\x00\x00\x46\x61\x00\x00\x00\x00\x64\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x29\x00\x00\x00\x00\x00\x00\x40\x6c\x51\x5d\x64\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x2e\x00\x00\x00\x00\x00\x00\x64\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x64\x76\x64\x74\x42\x7e\x00\x00\x64\x5d\x00\x00\x64\x70\x00\x00\x4a\x7e\x00\x00\x55\x44\x00\x00\x00\x00\x64\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x6b\x64\x6c\x00\x00\x00\x00\x00\x00\x64\x72\x00\x00\x4e\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x4b\x00\x00\x00\x00\x00\x00\x47\x31\x00\x00\x42\x3a\x00\x00\x00\x00\x00\x00\x64\x6a\x00\x00\x00\x00\x00\x00\x41\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x36\x33\x31\x00\x00\x00\x00\x00\x00\x64\x7b\x00\x00\x64\x73\x00\x00\x00\x00\x00\x00\x64\x7a\x00\x00\x64\x7d\x00\x00\x64\x7c\x00\x00\x00\x00\x00\x00", /* 6f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x33\x4e\x00\x00\x00\x00\x00\x00\x33\x3a\x64\x77\x00\x00\x00\x00\x64\x79\x64\x78\x45\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x54\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x44\x00\x00\x00\x00\x65\x24\x00\x00\x00\x00\x65\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x24\x00\x00\x65\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x7e\x31\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x28\x00\x00\x65\x29\x65\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x27\x65\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x2b\x65\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x2f\x00\x00\x00\x00\x00\x00\x65\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x60\x00\x00\x00\x00\x65\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x70\x6c\x61\x43\x70\x00\x00\x35\x46\x3b\x52\x00\x00\x00\x00\x00\x00\x00\x00\x41\x69\x54\x6e\x00\x00\x3e\x44\x00\x00\x00\x00\x00\x00\x57\x46\x00\x00\x54\x56\x32\x53", /* 7080 */ "\x6c\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x41\x00\x00\x00\x00\x00\x00\x42\x2f\x34\x36\x00\x00\x00\x00\x00\x00\x51\x57\x00\x00\x00\x00\x00\x00\x33\x34\x00\x00\x48\x32\x3f\x3b\x6c\x40\x00\x00\x00\x00\x56\x4b\x00\x00\x00\x00\x6c\x3f\x6c\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x45\x3e\x66\x4c\x3f\x45\x5a\x3e\x3c\x00\x00\x6c\x46\x00\x00\x31\x7e\x00\x00\x00\x00\x00\x00\x6c\x44\x55\x28\x35\x63\x00\x00\x6c\x42\x41\x36\x33\x63\x00\x00\x00\x00\x6c\x43\x4b\x38\x40\x43\x4c\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x41\x52\x00\x00\x6c\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x66\x40\x53\x00\x00\x56\x72\x00\x00\x00\x00\x00\x00\x51\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x3e\x00\x00\x37\x33\x49\x55\x6c\x47\x3b\x62\x00\x00\x4c\x4c\x3d\x7d\x48\x48\x00\x00\x4f\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x69\x00\x00\x45\x6b\x00\x00\x00\x00\x00\x00\x37\x69\x00\x00\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x49\x3a\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x49\x00\x00\x00\x00\x6c\x4a\x00\x00\x3b\x40\x6c\x4b\x00\x00\x6c\x62\x31\x3a\x37\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x4c\x51\x66\x6c\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x48\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x51\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x53\x00\x00\x3b\x4d\x00\x00\x3c\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x4f\x00\x00\x49\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x3a\x00\x00\x6c\x63\x55\x55\x6c\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x73\x00\x00\x00\x00\x00\x00\x6c\x52\x6c\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x54\x00\x00\x6c\x55\x00\x00\x00\x00\x49\x3f\x00\x00\x00\x00", /* 7180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x51\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x48\x5b\x00\x00\x00\x00\x00\x00\x6c\x56\x4e\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6c\x6c\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x59\x00\x00\x00\x00\x00\x00\x30\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x57\x00\x00\x6c\x58\x00\x00\x00\x00\x00\x00\x6c\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x5c\x51\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x54\x6f\x00\x00\x6c\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x60\x00\x00\x57\x26\x00\x00\x45\x40\x00\x00\x00\x00\x00\x00\x6b\x3c\x30\x2e\x00\x00\x00\x00\x00\x00\x3e\x74\x38\x38\x52\x2f\x30\x56\x35\x79\x00\x00\x58\x33\x00\x00\x4b\x2c\x00\x00\x63\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x2c\x30\x66\x00\x00\x00\x00\x00\x00\x45\x46\x6b\x39\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x3a\x00\x00\x00\x00\x00\x00\x6b\x3b\x00\x00\x00\x00\x51\x40\x00\x00\x45\x23\x00\x00\x6a\x72\x00\x00\x44\x32\x00\x00\x44\x35\x40\x4e\x00\x00\x00\x00\x00\x00\x6a\x73\x44\x41\x00\x00\x4e\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x70\x6a\x74\x00\x00\x00\x00\x49\x7c\x00\x00\x00\x00\x47\x23\x00\x00\x00\x00\x00\x00\x4c\x58\x4e\x7e\x00\x00\x00\x00\x00\x00\x6a\x75\x6a\x76", /* 7280 */ "\x4f\x2c\x40\x67\x00\x00\x00\x00\x6a\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x3f\x6a\x78\x00\x00\x6a\x79\x00\x00\x6a\x7a\x00\x00\x00\x00\x6a\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x2e\x61\x6b\x00\x00\x37\x38\x61\x6c\x00\x00\x00\x00\x00\x00\x61\x6d\x00\x00\x57\x34\x61\x6e\x61\x6f\x53\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x71\x3f\x71\x61\x70\x35\x52\x00\x00\x00\x00\x00\x00\x31\x37\x00\x00\x00\x00\x00\x00\x00\x00\x61\x73\x61\x72\x00\x00\x3a\x7c\x00\x00\x61\x74\x00\x00\x00\x00\x00\x00\x00\x00\x39\x37\x00\x00\x3e\x51\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7c\x00\x00\x3a\x5d\x3d\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x75\x61\x77\x00\x00\x00\x00\x36\x40\x4f\x41\x4a\x28\x61\x76\x55\x78\x53\x7c\x61\x78\x61\x7c\x61\x79\x00\x00\x00\x00\x61\x7a\x40\x6a\x00\x00\x61\x7e\x62\x21\x40\x47\x00\x00\x00\x00\x00\x00", /* 7300 */ "\x00\x00\x61\x7b\x00\x00\x61\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x25\x00\x00\x00\x00\x00\x00\x41\x54\x00\x00\x00\x00\x00\x00\x00\x00\x62\x23\x00\x00\x62\x28\x32\x7e\x62\x22\x00\x00\x00\x00\x00\x00\x43\x4d\x32\x42\x62\x27\x62\x26\x00\x00\x00\x00\x62\x24\x62\x29\x00\x00\x00\x00\x62\x2b\x00\x00\x00\x00\x00\x00\x50\x49\x56\x6d\x43\x28\x62\x2c\x00\x00\x4f\x57\x00\x00\x00\x00\x62\x2e\x00\x00\x00\x00\x3a\x6f\x00\x00\x00\x00\x69\x60\x62\x2d\x62\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x2b\x54\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x30\x00\x00\x00\x00\x62\x2f\x00\x00\x69\x61\x00\x00\x00\x00\x00\x00\x00\x00\x62\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x33\x4c\x21\x00\x00\x62\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x35\x00\x00", /* 7380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7e\x00\x00\x00\x00\x42\x4a\x00\x00\x53\x71\x00\x00\x4d\x75\x00\x00\x00\x00\x67\x60\x00\x00\x00\x00\x67\x61\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x41\x00\x00\x00\x00\x00\x00\x00\x00\x42\x6a\x00\x00\x00\x00\x00\x00\x67\x64\x00\x00\x00\x00\x67\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x66\x00\x00\x43\x35\x00\x00\x00\x00\x67\x62\x3b\x37\x4f\x56\x00\x00\x41\x61\x67\x69\x00\x00\x00\x00\x00\x00\x67\x68\x00\x00\x00\x00\x67\x74\x32\x23\x00\x00\x00\x00\x00\x00\x00\x00\x67\x6a\x00\x00\x67\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x6c\x67\x6b\x49\x3a\x00\x00\x00\x00\x55\x64\x00\x00\x67\x65\x37\x29\x67\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x67\x73\x00\x00\x56\x69\x00\x00\x00\x00\x00\x00\x00\x00\x67\x6d\x00\x00\x67\x72\x00\x00\x67\x71\x00\x00\x00\x00\x00\x00\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x67\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x47\x72\x00\x00\x40\x45\x40\x6d\x00\x00\x00\x00\x41\x70\x67\x70\x00\x00\x00\x00\x00\x00\x00\x00\x67\x76\x4b\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x22\x68\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x41\x00\x00\x00\x00\x67\x7a\x67\x79\x00\x00\x67\x7b\x00\x00\x67\x77\x00\x00\x67\x7e\x00\x00\x67\x7d\x00\x00\x67\x7c\x00\x00\x00\x00\x41\x55\x47\x59\x45\x7d\x45\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x68\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x26\x00\x00\x68\x25\x00\x00\x68\x27\x3a\x77\x67\x78\x68\x24\x00\x00\x48\x70\x49\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x29\x00\x00\x00\x00\x39\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x7e\x68\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x2a\x00\x00", /* 7480 */ "\x68\x2d\x68\x2e\x00\x00\x41\x27\x00\x00\x00\x00\x00\x00\x68\x2f\x00\x00\x00\x00\x00\x00\x68\x30\x00\x00\x00\x00\x68\x2c\x00\x00\x68\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x2b\x00\x00\x68\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x35\x68\x32\x68\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x4f\x00\x00\x70\x2c\x00\x00\x70\x2d\x00\x00\x46\x30\x30\x6a\x48\x3f\x00\x00\x4d\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x4d\x6a\x31\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x32\x00\x00\x46\x3f\x34\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x33", /* 7500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x55\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x79\x00\x00\x6a\x34\x00\x00\x6a\x35\x00\x00\x6a\x36\x00\x00\x00\x00\x00\x00\x00\x00\x38\x4a\x5f\x30\x49\x75\x00\x00\x4c\x70\x00\x00\x00\x00\x49\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x7b\x00\x00\x00\x00\x53\x43\x4b\x26\x00\x00\x38\x26\x70\x2e\x31\x42\x00\x00\x65\x38\x4c\x6f\x53\x49\x3c\x57\x49\x6a\x00\x00\x35\x67\x00\x00\x44\x50\x35\x69\x00\x00\x6e\x2e\x3b\x2d\x00\x00\x00\x00\x67\x5e\x00\x00\x6e\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x33\x29\x00\x00\x00\x00\x6e\x32\x00\x00\x00\x00\x6e\x31\x3d\x67\x00\x00\x6e\x30\x4e\x37\x00\x00\x00\x00\x00\x00\x00\x00\x45\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x41\x74\x5b\x4e\x6e\x33\x50\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x54\x46\x68\x00\x00\x00\x00\x00\x00\x37\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x34\x00\x00\x33\x6b\x00\x00\x00\x00\x00\x00\x3b\x7b\x6e\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x5c", /* 7580 */ "\x00\x00\x00\x00\x00\x00\x6e\x36\x00\x00\x00\x00\x3d\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x71\x62\x00\x00\x00\x00\x00\x00\x4a\x68\x00\x00\x52\x49\x70\x5a\x00\x00\x70\x5b\x00\x00\x70\x5c\x41\x46\x00\x00\x38\x6d\x3e\x4e\x00\x00\x00\x00\x70\x5e\x00\x00\x45\x31\x70\x5d\x51\x71\x00\x00\x70\x60\x30\x4c\x3d\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x5f\x70\x5f\x00\x00\x34\x2f\x37\x68\x70\x66\x70\x65\x46\x23\x70\x61\x70\x62\x34\x43\x00\x00\x00\x00\x70\x63\x55\x6e\x00\x00\x00\x00\x4c\x5b\x3e\x52\x3c\x32\x00\x00\x00\x00\x00\x00\x70\x68\x70\x67\x70\x64\x32\x21\x00\x00\x56\x22\x53\x38\x3e\x37\x48\x2c\x00\x00\x00\x00\x70\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x51\x77\x00\x00\x56\x4c\x3a\x5b\x70\x69\x00\x00\x36\x3b\x00\x00\x00\x00\x4d\x34\x00\x00\x00\x00\x46\x26\x00\x00\x00\x00\x00\x00\x41\x21\x70\x6b\x70\x6e\x00\x00\x70\x6d\x70\x70\x70\x6c\x00\x00\x3b\x3e\x70\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x35\x70\x72\x00\x00\x00\x00\x33\x55\x00\x00\x00\x00\x00\x00\x00\x00\x31\x54\x00\x00\x00\x00\x70\x73\x00\x00\x00\x00\x70\x74", /* 7600 */ "\x70\x76\x34\x61\x00\x00\x70\x71\x00\x00\x70\x77\x00\x00\x00\x00\x00\x00\x00\x00\x70\x7a\x00\x00\x70\x78\x00\x00\x00\x00\x00\x00\x70\x75\x00\x00\x00\x00\x00\x00\x00\x00\x70\x7d\x00\x00\x70\x79\x70\x7c\x70\x7e\x00\x00\x71\x21\x00\x00\x00\x00\x00\x00\x4e\x41\x71\x24\x00\x00\x71\x23\x00\x00\x41\x76\x70\x7b\x4a\x5d\x00\x00\x00\x00\x34\x71\x31\x71\x4c\x31\x00\x00\x71\x26\x00\x00\x00\x00\x71\x27\x00\x00\x00\x00\x71\x2c\x55\x4e\x71\x29\x00\x00\x00\x00\x48\x33\x00\x00\x00\x00\x00\x00\x71\x22\x00\x00\x71\x2b\x71\x28\x71\x25\x00\x00\x00\x00\x71\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x29\x71\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x2f\x00\x00\x71\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x30\x00\x00\x71\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x51\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x32\x00\x00\x00\x00\x00\x00\x71\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x6f\x00\x00\x00\x00\x35\x47\x00\x00\x30\x57\x30\x59\x00\x00", /* 7680 */ "\x00\x00\x00\x00\x54\x6d\x00\x00\x35\x44\x00\x00\x3d\x54\x3b\x4a\x70\x27\x00\x00\x00\x00\x38\x5e\x00\x00\x00\x00\x70\x28\x00\x00\x00\x00\x30\x28\x00\x00\x70\x29\x00\x00\x00\x00\x4d\x6e\x00\x00\x00\x00\x70\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x24\x00\x00\x00\x00\x56\x65\x71\x64\x00\x00\x71\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x73\x00\x00\x00\x00\x53\x5b\x00\x00\x00\x00\x56\x51\x45\x68\x00\x00\x53\x2f\x00\x00\x52\x66\x00\x00\x00\x00\x6e\x41\x30\x3b\x55\x35\x51\x4e\x3c\x60\x3a\x50\x00\x00\x3f\x78\x00\x00\x38\x47\x35\x41\x45\x4c\x00\x00\x00\x00\x4a\x22\x00\x00\x00\x00\x00\x00\x43\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x3f\x36\x22\x00\x00\x6d\x6c\x43\x24\x00\x00\x56\x31\x00\x00\x00\x00\x00\x00\x4f\x60\x6d\x6f\x00\x00\x00\x00\x45\x4e\x00\x00\x36\x5c\x00\x00", /* 7700 */ "\x00\x00\x4a\x21\x00\x00\x00\x00\x6d\x6d\x00\x00\x00\x00\x6d\x70\x6d\x71\x43\x3c\x00\x00\x3f\x34\x00\x00\x6d\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x74\x6d\x72\x00\x00\x00\x00\x00\x00\x00\x00\x55\x66\x43\x5f\x00\x00\x6d\x73\x00\x00\x00\x00\x00\x00\x6d\x76\x00\x00\x55\x23\x51\x23\x00\x00\x00\x00\x00\x00\x6d\x75\x00\x00\x43\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x77\x3f\x74\x3e\x6c\x6d\x78\x00\x00\x4c\x77\x00\x00\x51\x5b\x00\x00\x00\x00\x00\x00\x57\x45\x55\x76\x00\x00\x6d\x7c\x00\x00\x00\x00\x00\x00\x6d\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x79\x6d\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x7d\x3e\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x2f\x6e\x21\x36\x3d\x00\x00\x6e\x22\x44\x40\x00\x00\x6d\x7e\x00\x00\x00\x00\x3d\x5e\x32\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x43\x00\x00\x00\x00\x00\x00\x6e\x25\x58\x3a\x6e\x23", /* 7780 */ "\x6e\x26\x00\x00\x00\x00\x00\x00\x43\x69\x33\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x27\x6e\x24\x4f\x39\x00\x00\x00\x00\x6e\x28\x42\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x29\x6e\x2a\x00\x00\x5e\x2b\x00\x00\x00\x00\x46\x33\x00\x00\x47\x46\x00\x00\x56\x75\x35\x49\x00\x00\x4b\x32\x00\x00\x00\x00\x00\x00\x6e\x2b\x00\x00\x00\x00\x4d\x2b\x00\x00\x6e\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x30\x00\x00\x6e\x2d\x00\x00\x76\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x23\x00\x00\x00\x00\x00\x00\x43\x2c\x71\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x38\x52\x53\x00\x00\x56\x2a\x00\x00\x6f\x72\x00\x00\x3e\x58\x00\x00\x3d\x43\x6f\x73\x36\x4c\x30\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x2f\x00\x00\x00\x00\x6d\x36\x00\x00\x6d\x37\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x79\x37\x2f\x3f\x73", /* 7800 */ "\x6d\x38\x42\x6b\x49\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x39\x00\x00\x00\x00\x46\x76\x3f\x33\x00\x00\x00\x00\x00\x00\x6d\x3c\x45\x78\x00\x00\x51\x50\x00\x00\x57\x29\x6d\x3a\x6d\x3b\x00\x00\x51\x62\x00\x00\x6d\x3f\x6d\x40\x00\x00\x6d\x44\x00\x00\x00\x00\x00\x00\x6d\x48\x00\x00\x6d\x46\x6d\x4e\x55\x68\x00\x00\x6d\x49\x00\x00\x00\x00\x6d\x47\x6d\x3e\x00\x00\x00\x00\x45\x69\x00\x00\x00\x00\x00\x00\x46\x46\x00\x00\x00\x00\x49\x69\x54\x52\x6d\x41\x6d\x42\x6d\x43\x6d\x45\x00\x00\x40\x79\x00\x00\x34\x21\x00\x00\x00\x00\x00\x00\x00\x00\x39\x68\x00\x00\x6d\x50\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x51\x00\x00\x6d\x4a\x00\x00\x6d\x4f\x00\x00\x4e\x78\x00\x00\x00\x00\x4b\x36\x6d\x4c\x6d\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x52\x41\x72\x53\x32\x6d\x4b\x48\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x45\x70\x00\x00\x00\x00\x00\x00", /* 7880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x56\x00\x00\x35\x6f\x00\x00\x00\x00\x42\x35\x30\x2d\x4b\x69\x00\x00\x00\x00\x31\x2e\x00\x00\x6d\x54\x00\x00\x00\x00\x00\x00\x4d\x6b\x35\x62\x00\x00\x6d\x55\x6d\x53\x6d\x57\x00\x00\x00\x00\x35\x7a\x00\x00\x6d\x58\x00\x00\x6d\x59\x00\x00\x6d\x5c\x00\x00\x31\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x76\x3c\x6e\x6d\x5a\x4c\x3c\x32\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6b\x00\x00\x00\x00\x34\x45\x00\x00\x00\x00\x00\x00\x30\x75\x00\x00\x00\x00\x00\x00\x6d\x5f\x40\x5a\x34\x68\x00\x00\x00\x00\x00\x00\x00\x00\x45\x4d\x00\x00\x00\x00\x00\x00\x6d\x5d\x3f\x44\x00\x00\x00\x00\x00\x00\x6d\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x25\x00\x00\x00\x00\x00\x00\x6d\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x61\x00\x00\x6d\x63\x00\x00\x00\x00\x41\x57\x00\x00\x00\x00\x3b\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x3d\x38\x00\x00\x00\x00\x00\x00\x6d\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x3e\x6c\x6a\x40\x71\x00\x00\x49\x67\x00\x00\x6c\x6b\x46\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x6c\x00\x00\x46\x6d\x6c\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x70\x00\x00\x00\x00\x57\x66\x6c\x73\x00\x00\x00\x00\x6c\x71\x6c\x6e\x6c\x6f\x57\x23\x49\x71\x4b\x6e\x6c\x74\x00\x00\x6c\x72\x00\x00\x00\x00\x4f\x69\x00\x00\x6c\x76\x46\x31\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x40\x00\x00\x6c\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x3b\x3b\x76\x00\x00\x6c\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7980 */ "\x59\x77\x3d\x7b\x00\x00\x00\x00\x42\x3b\x6c\x78\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x38\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6d\x58\x2e\x40\x6b\x00\x00\x47\x5d\x3a\x4c\x00\x00\x50\x63\x4b\x3d\x00\x00\x4d\x3a\x00\x00\x00\x00\x38\x51\x00\x00\x00\x00\x31\x7c\x00\x00\x47\x6f\x00\x00\x56\x56\x00\x00\x00\x00\x00\x00\x3f\x46\x43\x6b\x00\x00\x00\x00\x6f\x75\x00\x00\x00\x00\x43\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x62\x00\x00\x00\x00\x00\x00\x6f\x77\x33\x53\x00\x00\x47\x58\x51\x6d\x00\x00\x56\x48\x00\x00\x6f\x78\x00\x00\x6f\x76\x00\x00\x3b\x7d\x33\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x55\x00\x00\x00\x00\x52\x46\x00\x00\x3b\x60\x00\x00\x00\x00", /* 7a00 */ "\x4f\x21\x00\x00\x6f\x7c\x6f\x7b\x00\x00\x00\x00\x6f\x79\x00\x00\x00\x00\x00\x00\x00\x00\x33\x4c\x00\x00\x49\x54\x4b\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x7e\x00\x00\x00\x00\x30\x5e\x00\x00\x00\x00\x56\x49\x00\x00\x00\x00\x00\x00\x6f\x7d\x00\x00\x33\x6d\x00\x00\x00\x00\x76\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x48\x00\x00\x00\x00\x00\x00\x70\x22\x00\x00\x70\x21\x00\x00\x35\x3e\x3c\x5a\x3b\x7c\x00\x00\x38\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x26\x00\x00\x00\x00\x00\x00\x51\x28\x00\x00\x3e\x3f\x47\x6e\x71\x36\x71\x37\x3f\x55\x00\x00\x00\x00\x00\x00\x00\x00\x34\x29", /* 7a80 */ "\x71\x38\x4d\x3b\x00\x00\x47\x54\x55\x2d\x00\x00\x71\x39\x00\x00\x71\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x47\x4f\x00\x00\x00\x00\x00\x00\x52\x24\x56\x4f\x00\x00\x00\x00\x71\x3b\x3d\x51\x34\x30\x3e\x3d\x00\x00\x00\x00\x00\x00\x34\x5c\x4e\x51\x00\x00\x3f\x5f\x71\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x7a\x71\x3c\x00\x00\x71\x3f\x00\x00\x00\x00\x00\x00\x71\x3e\x71\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x7a\x00\x00\x00\x00\x55\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x3a\x3e\x39\x55\x42\x00\x00\x00\x00\x3f\x22\x00\x00\x4d\x2f\x71\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x5f\x00\x00\x36\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x71\x73\x43\x00\x00\x00\x00\x73\x44\x00\x00\x38\x4d", /* 7b00 */ "\x00\x00\x00\x00\x00\x00\x73\x46\x73\x47\x00\x00\x30\x4a\x00\x00\x73\x45\x00\x00\x73\x49\x4b\x71\x00\x00\x00\x00\x00\x00\x73\x4b\x00\x00\x50\x26\x00\x00\x00\x00\x31\x4a\x73\x48\x00\x00\x00\x00\x00\x00\x73\x4f\x00\x00\x35\x51\x00\x00\x00\x00\x73\x57\x00\x00\x73\x52\x00\x00\x00\x00\x00\x00\x73\x54\x73\x53\x37\x7b\x00\x00\x31\x3f\x00\x00\x73\x4e\x73\x4a\x35\x5a\x00\x00\x73\x50\x00\x00\x00\x00\x73\x51\x00\x00\x73\x55\x00\x00\x00\x00\x00\x00\x00\x00\x73\x4d\x00\x00\x3c\x63\x00\x00\x41\x7d\x00\x00\x73\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x5a\x00\x00\x73\x4c\x00\x00\x35\x48\x00\x00\x3d\x6e\x73\x5c\x00\x00\x00\x00\x37\x24\x3f\x70\x56\x7e\x4d\x32\x00\x00\x34\x70\x00\x00\x32\x5f\x00\x00\x73\x58\x00\x00\x73\x59\x49\x38\x00\x00\x73\x5d\x00\x00\x00\x00\x73\x5e\x00\x00\x73\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x5f\x00\x00\x00\x00\x73\x63\x73\x62\x00\x00\x00\x00\x73\x5b\x00\x00\x3f\x6a\x00\x00\x33\x6f\x00\x00\x73\x60\x00\x00\x00\x00\x47\x29\x00\x00", /* 7b80 */ "\x3c\x72\x00\x00\x00\x00\x00\x00\x00\x00\x73\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x3f\x00\x00\x00\x00\x73\x64\x00\x00\x00\x00\x00\x00\x32\x2d\x3b\x7e\x00\x00\x4b\x63\x00\x00\x00\x00\x00\x00\x00\x00\x73\x6d\x73\x69\x00\x00\x00\x00\x00\x00\x39\x5c\x73\x6e\x00\x00\x00\x00\x00\x00\x73\x65\x73\x66\x73\x6a\x42\x61\x73\x6c\x73\x6f\x73\x68\x3c\x7d\x00\x00\x00\x00\x00\x00\x4f\x64\x00\x00\x00\x00\x73\x70\x00\x00\x00\x00\x00\x00\x73\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x72\x00\x00\x00\x00\x00\x00\x00\x00\x57\x2d\x46\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x73\x73\x00\x00\x00\x00\x00\x00\x00\x00\x73\x71\x00\x00\x42\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x5d\x73\x75\x00\x00\x00\x00\x73\x74\x00\x00\x00\x00\x00\x00\x34\x5b\x00\x00\x00\x00\x00\x00\x73\x76\x73\x77\x00\x00\x00\x00\x00\x00\x73\x78\x00\x00\x00\x00\x00\x00\x40\x3a\x00\x00\x00\x00\x40\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x71\x00\x00\x00\x00\x00\x00\x00\x00\x73\x7b\x00\x00\x73\x7a\x00\x00", /* 7c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x58\x00\x00\x00\x00\x00\x00\x73\x7e\x73\x79\x00\x00\x00\x00\x73\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x23\x3b\x49\x00\x00\x00\x00\x74\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x3e\x74\x26\x74\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x57\x59\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x60\x74\x4c\x57\x51\x00\x00\x00\x00", /* 7c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x4e\x41\x23\x00\x00\x00\x00\x46\x49\x00\x00\x34\x56\x55\x33\x00\x00\x00\x00\x00\x00\x74\x50\x74\x4f\x74\x51\x4b\x5a\x00\x00\x00\x00\x74\x52\x00\x00\x54\x41\x56\x60\x00\x00\x00\x00\x00\x00\x00\x00\x37\x60\x00\x00\x00\x00\x00\x00\x41\x38\x00\x00\x00\x00\x41\x3b\x74\x53\x3e\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x62\x00\x00\x00\x00\x74\x54\x74\x55\x3e\x2b\x00\x00\x00\x00\x74\x56\x00\x00\x00\x00\x00\x00\x74\x5b\x00\x00\x74\x57\x74\x5a\x00\x00\x3a\x7d\x00\x00\x74\x58\x74\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x62\x4c\x47\x74\x5c\x00\x00\x32\x5a\x00\x00\x00\x00\x43\x53\x00\x00\x00\x00\x54\x63\x3f\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x69\x00\x00\x00\x00\x4f\x35\x00\x00\x00\x00\x00\x00\x00\x00", /* 7d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x58\x00\x00\x4b\x77\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x74\x00\x00\x00\x00\x00\x00\x57\x4f\x00\x00\x00\x00\x00\x00\x40\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e80 */ "\x00\x00\x00\x00\x57\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x6e\x00\x00\x00\x00\x00\x00\x66\x79\x3e\x40\x66\x7a\x3a\x6c\x66\x7b\x4f\x4b\x66\x7c\x54\x3c\x3c\x36\x66\x7d\x66\x7e\x3c\x4d\x48\x52\x4e\x33\x67\x21\x00\x00\x34\x3f\x67\x22\x49\x34\x38\x59\x44\x49\x00\x00\x57\x5d\x42\x5a\x37\x57\x56\x3d\x4e\x46\x37\x44\x00\x00\x00\x00\x45\x26\x67\x23\x4f\x5f\x67\x24\x67\x25\x67\x26\x41\x37\x57\x69\x49\x70\x4f\x38\x56\x2f\x56\x55\x67\x27\x30\x6d\x67\x28\x67\x29\x49\x5c\x52\x6f\x3e\x2d\x67\x2a\x30\x73\x48\x5e\x3d\x61\x67\x2b\x48\x46\x00\x00\x67\x2c\x3b\x66\x38\x78\x51\x24\x67\x2d\x42\x67\x3e\x78\x3d\x4a\x4d\x33\x67\x2e\x67\x2f\x3e\x6e\x50\x65\x00\x00\x4b\x67\x4c\x50\x3c\x4c\x67\x30\x3c\x28\x50\x77\x67\x31\x00\x00\x50\x78\x67\x32\x67\x33\x34\x42\x67\x34\x67\x35\x49\x7e\x4e\x2c\x43\x60\x67\x37\x31\x41\x33\x71\x00\x00\x67\x38\x67\x39\x57\x5b\x55\x40\x67\x3a\x42\x4c", /* 7f00 */ "\x57\x3a\x67\x3b\x67\x3c\x67\x3d\x3c\x6a\x43\x65\x40\x42\x67\x3e\x67\x3f\x3c\x29\x00\x00\x67\x40\x67\x41\x67\x36\x36\x50\x67\x42\x00\x00\x67\x43\x67\x44\x3b\x3a\x35\x5e\x42\x46\x31\x60\x67\x45\x54\x35\x67\x46\x38\x3f\x67\x48\x67\x47\x37\x6c\x00\x00\x67\x49\x32\x78\x67\x4a\x67\x4b\x67\x4c\x67\x4d\x67\x4e\x67\x4f\x67\x50\x53\x27\x4b\x75\x67\x51\x67\x52\x67\x53\x67\x54\x49\x49\x67\x55\x67\x56\x67\x57\x67\x58\x67\x59\x3d\x49\x67\x5a\x73\x3e\x00\x00\x38\x57\x00\x00\x48\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3f\x00\x00\x73\x40\x73\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x5e\x4d\x78\x00\x00\x00\x00\x58\x68\x3a\x31\x00\x00\x42\x5e\x6e\x37\x00\x00\x37\x23\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x39\x00\x00\x6e\x38\x30\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x3b\x55\x56\x57\x6f\x00\x00\x00\x00\x00\x00\x56\x43\x00\x00\x00\x00\x6e\x3d\x4a\x70\x00\x00\x6e\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x40\x00\x00", /* 7f80 */ "\x00\x00\x6e\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x72\x00\x00\x47\x3c\x00\x00\x43\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x67\x00\x00\x00\x00\x74\x46\x50\x5f\x74\x47\x00\x00\x4f\x5b\x00\x00\x00\x00\x48\x3a\x00\x00\x00\x00\x74\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x49\x74\x4a\x00\x00\x74\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x7a\x38\x7e\x00\x00\x00\x00\x65\x71\x53\x70\x00\x00\x74\x60\x00\x00\x4e\x4c\x00\x00\x00\x00\x00\x00\x33\x61\x00\x00\x00\x00\x00\x00\x00\x00\x71\x34\x00\x00\x52\x6e\x00\x00\x74\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x68\x74\x62\x00\x00\x00\x00\x47\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x54\x34\x64\x74\x64\x00\x00\x00\x00\x00\x00\x74\x63\x74\x65\x00\x00\x00\x00\x74\x66\x00\x00\x00\x00\x00\x00\x00\x00\x74\x67\x00\x00\x3a\x32\x30\x3f\x00\x00\x74\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x2d\x52\x6d\x00\x00\x00\x00\x00\x00", /* 8000 */ "\x52\x2b\x40\x4f\x00\x00\x3f\x3c\x6b\x23\x55\x5f\x6a\x48\x00\x00\x00\x00\x00\x00\x00\x00\x71\x73\x36\x78\x4b\x23\x00\x00\x00\x00\x44\x4d\x00\x00\x71\x67\x00\x00\x71\x68\x38\x7b\x71\x69\x3a\x44\x54\x45\x30\x52\x00\x00\x00\x00\x71\x6a\x00\x00\x00\x00\x00\x00\x71\x6b\x00\x00\x71\x6c\x00\x00\x00\x00\x71\x6d\x71\x6e\x71\x6f\x71\x71\x71\x70\x45\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x72\x00\x00\x36\x7a\x00\x00\x71\x74\x52\x2e\x5e\x47\x4b\x4a\x00\x00\x00\x00\x33\x5c\x00\x00\x35\x22\x00\x00\x39\x22\x00\x00\x00\x00\x44\x74\x71\x75\x00\x00\x00\x00\x71\x76\x00\x00\x00\x00\x00\x00\x41\x44\x41\x7b\x56\x30\x71\x77\x00\x00\x00\x00\x00\x00\x00\x00\x71\x78\x00\x00\x41\x2a\x00\x00\x00\x00\x00\x00\x46\x38\x00\x00\x3e\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x79\x34\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x32", /* 8080 */ "\x6d\x31\x00\x00\x00\x00\x4b\x60\x52\x5e\x00\x00\x4b\x41\x55\x58\x00\x00\x48\x62\x00\x00\x40\x5f\x3c\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x41\x00\x00\x00\x00\x50\x24\x00\x00\x56\x62\x00\x00\x36\x47\x38\x58\x6b\x40\x38\x4e\x00\x00\x6b\x3f\x33\x26\x39\x49\x56\x2b\x00\x00\x37\x74\x37\x4a\x00\x00\x00\x00\x00\x00\x3c\x67\x37\x3e\x6b\x46\x00\x00\x6b\x47\x30\x39\x3f\x4f\x00\x00\x6b\x45\x53\x7d\x00\x00\x6b\x48\x00\x00\x00\x00\x6b\x49\x00\x00\x00\x00\x37\x4e\x00\x00\x6b\x42\x6b\x44\x49\x76\x56\x57\x55\x4d\x50\x32\x6b\x4f\x4e\x38\x6b\x50\x00\x00\x35\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x33\x6b\x52\x4c\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x56\x6b\x53\x00\x00\x6b\x51\x45\x5f\x6b\x4e\x4a\x24\x6b\x55\x30\x7b\x00\x00\x00\x00\x3a\x7a\x00\x00\x00\x00\x58\x37\x71\x63\x00\x00\x6b\x4a\x6b\x4b\x6b\x4c\x6b\x4d\x6b\x56\x66\x40\x6b\x59\x00\x00\x3f\x68\x52\x48\x6b\x57\x6b\x5c\x38\x6c\x6b\x58\x00\x00\x3d\x3a\x00\x00\x50\x58\x00\x00\x30\x37\x00\x00\x6b\x5d\x44\x5c\x00\x00\x00\x00", /* 8100 */ "\x00\x00\x00\x00\x56\x2c\x00\x00\x00\x00\x00\x00\x34\x60\x00\x00\x00\x00\x42\x76\x3c\x39\x00\x00\x00\x00\x6b\x5a\x6b\x5b\x54\x60\x46\x6a\x44\x54\x6b\x5f\x45\x27\x59\x75\x00\x00\x32\x31\x00\x00\x6b\x64\x00\x00\x3d\x45\x00\x00\x00\x00\x00\x00\x6b\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x63\x00\x00\x00\x00\x38\x2c\x00\x00\x4d\x51\x6b\x65\x00\x00\x00\x00\x00\x00\x6b\x61\x00\x00\x41\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x73\x00\x00\x6b\x66\x00\x00\x40\x30\x52\x38\x6b\x67\x00\x00\x00\x00\x00\x00\x38\x2f\x38\x2d\x00\x00\x6b\x68\x47\x3b\x4d\x73\x00\x00\x00\x00\x00\x00\x6b\x6a\x6b\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x50\x48\x00\x00\x6b\x72\x00\x00\x6b\x6e\x00\x00\x00\x00\x00\x00\x6b\x71\x48\x79\x00\x00\x51\x7c\x6b\x6c\x00\x00\x00\x00\x6b\x69\x00\x00\x00\x00\x00\x00\x00\x00\x38\x39\x4f\x59\x44\x65\x6b\x6f\x6b\x70\x4c\x5a\x4d\x48", /* 8180 */ "\x30\x72\x00\x00\x6b\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x75\x00\x00\x32\x32\x00\x00\x00\x00\x00\x00\x00\x00\x38\x60\x00\x00\x6b\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x6c\x00\x00\x00\x00\x4c\x45\x44\x24\x4f\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x79\x00\x00\x00\x00\x6c\x22\x00\x00\x45\x72\x00\x00\x6b\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5f\x6b\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4e\x6c\x21\x31\x5b\x53\x37\x00\x00\x00\x00\x52\x5c\x00\x00\x00\x00\x00\x00\x6b\x7d\x00\x00\x6b\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x3c\x00\x00\x00\x00\x00\x00\x6a\x30\x00\x00\x00\x00\x57\x54\x00\x00\x74\x2b\x33\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x41\x56\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\x3e\x4a\x00\x00\x74\x27\x00\x00", /* 8200 */ "\x52\x28\x74\x28\x74\x29\x00\x00\x74\x2a\x3e\x4b\x53\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x60\x49\x61\x00\x00\x00\x00\x73\x42\x00\x00\x4a\x66\x00\x00\x4c\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x36\x4b\x34\x00\x00\x4e\x68\x56\x5b\x00\x00\x74\x2d\x74\x2e\x74\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x74\x32\x00\x00\x3a\x3d\x74\x33\x30\x63\x74\x30\x00\x00\x74\x31\x3d\x22\x32\x55\x00\x00\x74\x36\x74\x37\x36\x66\x32\x30\x4f\x4f\x74\x34\x34\x2c\x00\x00\x74\x35\x00\x00\x00\x00\x74\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x39\x00\x00\x00\x00\x4d\x27\x00\x00\x74\x3a\x00\x00\x74\x3b\x00\x00\x00\x00\x00\x00\x74\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x52\x00\x00\x74\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x74\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x5e\x41\x3c\x3c\x68\x00\x00\x49\x2b\x51\x5e\x65\x75\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x33\x52\x55\x00\x00\x00\x00\x5c\x34\x30\x2c\x5c\x35", /* 8280 */ "\x00\x00\x00\x00\x3d\x5a\x00\x00\x5c\x39\x00\x00\x00\x00\x00\x00\x58\x42\x00\x00\x5c\x37\x53\x73\x00\x00\x49\x56\x5c\x3a\x5c\x36\x00\x00\x5c\x3b\x43\x22\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x3c\x5c\x45\x5c\x3d\x00\x00\x00\x00\x4e\x5f\x56\x25\x00\x00\x5c\x4f\x00\x00\x5c\x4d\x00\x00\x00\x00\x5c\x52\x3d\x66\x42\x2b\x00\x00\x5c\x38\x5c\x4b\x5c\x4e\x5c\x3e\x37\x52\x30\x45\x5c\x47\x50\x3e\x5c\x41\x3b\x28\x00\x00\x37\x3c\x5c\x4c\x00\x00\x00\x00\x5c\x46\x5c\x3f\x47\x5b\x00\x00\x00\x00\x00\x00\x51\x3f\x5c\x40\x00\x00\x00\x00\x5c\x4a\x00\x00\x00\x00\x5c\x50\x00\x00\x00\x00\x4e\x2d\x5c\x42\x00\x00\x5c\x43\x5c\x48\x5c\x49\x32\x54\x5c\x51\x4b\x55\x00\x00\x54\x37\x5c\x5b\x5c\x5f\x4c\x26\x5c\x66\x00\x00\x43\x67\x5c\x5c\x00\x00\x00\x00\x3f\x41\x5c\x59\x00\x00\x30\x7a\x39\x36\x5c\x65\x5c\x53\x00\x00\x5c\x44\x5c\x56\x48\x74\x3f\x60\x00\x00\x00\x00\x00\x00\x00\x00\x49\x3b\x00\x00\x00\x00\x00\x00\x31\x3d\x00\x00\x53\x22\x00\x00\x00\x00\x5c\x5a\x00\x00\x00\x00\x5c\x55\x00\x00\x46\x3b\x00\x00\x5c\x5e\x00\x00\x00\x00\x00\x00\x00\x00", /* 8300 */ "\x00\x00\x57\x42\x43\x2f\x37\x36\x47\x51\x43\x29\x5c\x62\x5c\x58\x5c\x6b\x5c\x54\x00\x00\x00\x00\x5c\x5d\x00\x00\x3e\x25\x5c\x57\x00\x00\x5c\x60\x00\x00\x00\x00\x5c\x63\x5c\x64\x00\x00\x5c\x78\x00\x00\x00\x00\x5c\x61\x5d\x22\x5c\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x6b\x34\x44\x00\x00\x00\x00\x43\x23\x32\x67\x5c\x7a\x00\x00\x5c\x72\x00\x00\x5c\x6f\x00\x00\x5c\x7c\x5c\x6e\x52\x70\x32\x68\x00\x00\x48\x57\x48\x63\x5c\x7b\x00\x00\x5c\x6d\x00\x00\x00\x00\x00\x00\x5c\x77\x00\x00\x00\x00\x5c\x75\x00\x00\x00\x00\x3e\x23\x5c\x74\x00\x00\x32\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x73\x3c\x76\x5c\x68\x3b\x44\x00\x00\x40\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x54\x5c\x69\x5c\x6a\x00\x00\x5c\x71\x5c\x76\x5c\x79\x35\x34\x00\x00\x48\x59\x3b\x67\x5c\x7e\x5c\x7d\x53\x2b\x5d\x21\x5d\x23\x5d\x25\x52\x71\x5d\x24\x5d\x26\x5d\x27\x52\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x49\x5d\x29\x00\x00\x00\x00\x5d\x36\x5d\x31\x5d\x34\x00\x00\x00\x00", /* 8380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x30\x46\x4e\x00\x00\x00\x00\x40\x72\x00\x00\x00\x00\x00\x00\x00\x00\x49\x2f\x00\x00\x00\x00\x00\x00\x5c\x6c\x5d\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x37\x00\x00\x00\x00\x5c\x70\x5d\x2f\x00\x00\x5d\x38\x00\x00\x5d\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x39\x5d\x33\x5d\x2d\x44\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x28\x40\x33\x41\x2b\x5d\x2a\x5d\x2b\x00\x00\x5d\x32\x3b\x71\x5d\x35\x53\x28\x5d\x3a\x00\x00\x5d\x3b\x43\x27\x00\x00\x00\x00\x5d\x52\x5d\x3c\x00\x00\x00\x00\x00\x00\x5d\x51\x00\x00\x39\x3d\x00\x00\x00\x00\x3e\x55\x00\x00\x3e\x7a\x00\x00\x00\x00\x3a\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x4a\x00\x00\x5d\x45\x00\x00\x5d\x3f\x00\x00\x00\x00\x00\x00\x32\x4b\x5d\x43\x00\x00\x5d\x4b\x32\x24\x5d\x55\x00\x00\x00\x00\x00\x00\x5d\x3e\x00\x00\x00\x00\x00\x00\x46\x50\x5d\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x54\x41\x62\x37\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x4e\x5d\x4f\x00\x00\x00\x00\x00\x00\x5d\x44\x00\x00\x00\x00", /* 8400 */ "\x00\x00\x5d\x3d\x00\x00\x5d\x4d\x4c\x51\x00\x00\x5d\x49\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x42\x43\x48\x46\x3c\x4e\x2e\x5d\x4c\x00\x00\x5d\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x41\x00\x00\x00\x00\x00\x00\x5d\x46\x42\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x29\x53\x2a\x5d\x53\x4f\x74\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x47\x00\x00\x00\x00\x00\x00\x5d\x60\x42\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x78\x00\x00\x5d\x59\x5d\x58\x38\x70\x5d\x56\x00\x00\x00\x00\x00\x00\x00\x00\x46\x4f\x00\x00\x36\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x62\x00\x00\x3a\x79\x54\x61\x5d\x67\x00\x00\x00\x00\x00\x00\x34\x50\x00\x00\x5d\x5a\x00\x00\x3f\x7b\x5d\x63\x00\x00\x5d\x5f\x00\x00\x5d\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8480 */ "\x00\x00\x00\x00\x35\x59\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x5b\x5d\x5c\x5d\x5e\x00\x00\x3d\x2f\x5d\x64\x00\x00\x5d\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x75\x00\x00\x43\x49\x00\x00\x00\x00\x4b\x62\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x61\x00\x00\x00\x00\x46\x51\x00\x00\x5d\x74\x00\x00\x00\x00\x00\x00\x55\x74\x5d\x73\x5d\x70\x00\x00\x00\x00\x5d\x6c\x00\x00\x5d\x6f\x00\x00\x5d\x68\x00\x00\x00\x00\x50\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x48\x58\x5d\x6e\x00\x00\x00\x00\x5d\x69\x00\x00\x00\x00\x5d\x6a\x4b\x72\x00\x00\x5d\x6d\x00\x00\x00\x00\x31\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x36\x00\x00\x3c\x3b\x5d\x71\x00\x00\x00\x00\x5d\x77\x00\x00\x5d\x76\x5d\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6e\x00\x00\x00\x00\x00\x00\x5d\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x24\x00\x00\x00\x00\x5e\x23", /* 8500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x78\x00\x00\x00\x00\x00\x00\x00\x00\x43\x6f\x00\x00\x42\x7b\x00\x00\x00\x00\x00\x00\x55\x61\x00\x00\x00\x00\x4e\x35\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x7d\x00\x00\x32\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x68\x4a\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x3e\x5d\x7a\x5d\x7c\x5d\x7e\x5e\x22\x30\x2a\x31\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x26\x3d\x36\x48\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x21\x00\x00\x00\x00\x5e\x25\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x28\x00\x00\x00\x00\x00\x00\x5e\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x2d\x00\x00\x54\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x33\x5e\x2a\x5e\x2e\x00\x00\x00\x00\x40\x59\x00\x00", /* 8580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x31\x21\x5e\x36\x00\x00\x5e\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x26\x5e\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x2f\x00\x00\x00\x00\x00\x00\x5e\x30\x00\x00\x50\x3d\x00\x00\x00\x00\x00\x00\x5e\x34\x4a\x6d\x5e\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x38\x00\x00\x5e\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x58\x43\x6a\x00\x00\x00\x00\x5e\x3a\x00\x00\x45\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x59\x00\x00\x00\x00\x00\x00\x00\x00\x37\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x65\x00\x00\x00\x00\x00\x00\x5e\x3d", /* 8600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x22\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x3e\x00\x00\x5e\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x3a\x00\x00\x00\x00\x00\x00\x5e\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x2e\x3b\x22\x42\x32\x45\x30\x42\x47\x00\x00\x00\x00\x72\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x69\x00\x00\x00\x00\x00\x00\x53\x5d\x00\x00\x00\x00\x00\x00\x6b\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x66\x72\x30\x00\x00\x72\x31\x00\x00\x00\x00\x4a\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x67\x72\x33\x72\x35\x72\x34\x4b\x64\x4f\x3a\x72\x32", /* 8680 */ "\x4a\x34\x52\x4f\x42\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x43\x72\x38\x30\x76\x72\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x3e\x00\x00\x32\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x41\x72\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x3c\x54\x69\x00\x00\x00\x00\x72\x3b\x72\x36\x72\x3f\x72\x3d\x00\x00\x72\x39\x00\x00\x00\x00\x72\x47\x72\x44\x72\x46\x00\x00\x00\x00\x72\x4a\x72\x42\x72\x40\x00\x00\x00\x00\x00\x00\x72\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7b\x00\x00\x00\x00\x00\x00\x72\x41\x00\x00\x47\x79\x49\x5f\x00\x00\x72\x48\x39\x46\x35\x30\x00\x00\x00\x00\x72\x43\x72\x49\x72\x50\x72\x56\x00\x00\x00\x00\x3b\x57\x00\x00\x00\x00\x00\x00\x72\x55\x4d\x5c\x00\x00\x56\x6b\x00\x00\x00\x00\x72\x52\x72\x54\x00\x00\x00\x00\x00\x00\x00\x00\x38\x72\x00\x00\x00\x00\x00\x00\x00\x00\x72\x4b\x00\x00\x00\x00\x00\x00\x72\x4e\x42\x79\x00\x00\x55\x5d\x72\x4c\x72\x4d\x72\x4f\x72\x53\x00\x00\x00\x00\x00\x00\x72\x59\x53\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x36\x6a\x00\x00", /* 8700 */ "\x4a\x71\x00\x00\x37\x64\x72\x57\x00\x00\x00\x00\x00\x00\x72\x58\x72\x5a\x72\x5d\x72\x5b\x00\x00\x00\x00\x72\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x51\x51\x72\x51\x00\x00\x4d\x49\x00\x00\x4e\x4f\x56\x29\x00\x00\x72\x63\x00\x00\x43\x5b\x00\x00\x72\x60\x00\x00\x00\x00\x40\x2f\x72\x6c\x72\x5e\x00\x00\x72\x61\x00\x00\x00\x00\x00\x00\x72\x68\x00\x00\x00\x00\x00\x00\x00\x00\x72\x62\x00\x00\x00\x00\x72\x67\x00\x00\x00\x00\x72\x66\x00\x00\x00\x00\x72\x69\x00\x00\x00\x00\x00\x00\x72\x5f\x00\x00\x00\x00\x72\x64\x72\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x2c\x72\x65\x32\x75\x00\x00\x00\x00\x72\x72\x00\x00\x50\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x72\x75\x00\x00\x00\x00\x00\x00\x3b\x48\x00\x00\x72\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x70\x00\x00\x00\x00\x72\x76\x72\x78\x72\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x73\x00\x00\x72\x71\x00\x00\x00\x00\x00\x00\x3a\x7b\x00\x00\x35\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x72\x6f\x72\x77\x72\x6d\x72\x6e\x00\x00", /* 8780 */ "\x00\x00\x00\x00\x72\x6b\x73\x26\x00\x00\x73\x23\x00\x00\x00\x00\x73\x22\x00\x00\x00\x00\x72\x74\x00\x00\x48\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x7b\x00\x00\x00\x00\x00\x00\x73\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x7d\x00\x00\x00\x00\x73\x27\x73\x29\x73\x24\x00\x00\x72\x7c\x00\x00\x00\x00\x00\x00\x73\x2b\x00\x00\x73\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x42\x5d\x00\x00\x00\x00\x73\x2e\x00\x00\x00\x00\x73\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x21\x00\x00\x00\x00\x00\x00\x73\x31\x73\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x2f\x72\x7e\x73\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x32\x00\x00\x00\x00\x00\x00\x00\x00\x73\x34\x00\x00\x00\x00\x00\x00\x00\x00\x73\x28\x00\x00\x00\x00\x00\x00\x00\x00\x73\x33\x00\x00\x00\x00\x00\x00\x73\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x37\x00\x00\x00\x00\x00\x00\x00\x00\x73\x38\x00\x00", /* 8800 */ "\x00\x00\x00\x00\x00\x00\x59\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x37\x00\x00\x48\x64\x73\x36\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3b\x34\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3c\x00\x00\x00\x00\x73\x3d\x00\x00\x00\x00\x00\x00\x51\x2a\x00\x00\x00\x00\x00\x00\x74\x2c\x50\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x50\x51\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x4e\x00\x00\x00\x00\x3d\x56\x00\x00\x51\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x62\x61\x69\x52\x42\x71\x42\x32\x39\x00\x00\x00\x00\x31\x6d\x71\x43\x00\x00\x49\x40\x33\x44\x00\x00\x59\x72\x00\x00\x4b\x25\x00\x00\x71\x44\x00\x00\x00\x00\x00\x00\x00\x00\x56\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x45\x74\x40\x71\x46", /* 8880 */ "\x00\x00\x54\x2c\x71\x47\x00\x00\x30\x40\x74\x41\x00\x00\x00\x00\x74\x42\x00\x00\x00\x00\x34\x7c\x00\x00\x45\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x3b\x00\x00\x00\x00\x00\x00\x50\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x48\x00\x00\x59\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x3b\x00\x00\x4f\x2e\x00\x00\x00\x00\x00\x00\x38\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x71\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x32\x43\x41\x51\x00\x00\x00\x00\x57\x30\x71\x49\x00\x00\x00\x00\x71\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x71\x4e\x00\x00\x00\x00\x00\x00\x59\x76\x00\x00\x52\x61\x54\x23\x00\x00\x00\x00\x74\x43\x48\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x44\x00\x00\x00\x00\x71\x4d\x71\x4f\x3f\x63\x71\x50\x00\x00\x00\x00\x71\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x56\x71\x51\x00\x00\x49\x51\x45\x61\x00\x00\x00\x00\x00\x00\x42\x63\x39\x7c\x00\x00\x00\x00\x71\x53\x00\x00\x71\x55\x00\x00", /* 8900 */ "\x00\x00\x00\x00\x39\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x56\x00\x00\x30\x7d\x71\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x58\x71\x52\x71\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x57\x00\x00\x00\x00\x00\x00\x48\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4a\x71\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x65\x3d\x00\x00\x00\x00\x00\x00\x71\x5c\x00\x00\x71\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x5f\x00\x00\x00\x00\x4f\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x45\x3d\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x61\x00\x00\x00\x00\x00\x00\x4e\x77", /* 8980 */ "\x00\x00\x52\x2a\x00\x00\x71\x7b\x00\x00\x00\x00\x38\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x7b\x39\x5b\x00\x00\x39\x66\x43\x59\x4a\x53\x6a\x68\x40\x40\x3e\x75\x6a\x69\x6a\x6a\x6a\x6b\x00\x00\x6a\x6c\x6a\x6d\x6a\x6e\x6a\x6f\x3d\x47\x00\x00\x00\x00\x00\x00\x75\x7b\x00\x00\x00\x00\x00\x00\x75\x7d\x00\x00\x75\x7e\x00\x00\x75\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x62\x00\x00\x76\x21\x34\x25\x00\x00\x00\x00\x00\x00\x00\x00\x76\x22\x00\x00\x00\x00\x00\x00\x76\x23\x00\x00\x00\x00\x00\x00\x6c\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8a00 */ "\x51\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x7e\x4c\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8b80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x25\x3c\x46\x36\x29\x38\x3c\x48\x4f\x3c\x25\x5a\x26\x5a\x27\x4c\x56\x48\x43\x5a\x28\x46\x7d\x00\x00\x51\x35\x52\x69\x51\x36\x3c\x47\x00\x00\x3d\x32\x3b\x64\x5a\x29\x5a\x2a\x51\x48\x5a\x2b\x50\x6d\x36\x6f\x42\x5b\x00\x00\x4b\x4f\x37\x6d\x49\x68\x37\x43\x3e\x77\x56\x24\x5a\x2c\x5a\x2d\x46\x40\x57\x67\x4a\x36\x00\x00\x55\x29\x4b\x5f\x55\x6f\x5a\x2e\x56\x5f\x34\x4a\x5a\x30\x5a\x2f\x00\x00\x52\x6b\x5a\x31\x5a\x32\x5a\x33\x4a\x54\x5a\x34\x4a\x2b\x5a\x35\x5a\x36\x33\x4f\x56\x6f\x5a\x37\x3b\x30\x35\x2e\x5a\x38\x5a\x39\x39\x6e\x51\x2f\x52\x68\x5a\x3a\x38\x43\x4f\x6a\x32\x6f\x5a\x3b\x5a\x3c\x00\x00\x3d\x6b\x4e\x5c\x53\x6f\x5a\x3d\x4e\x73\x5a\x3e\x53\x55\x3b\x65\x5a\x3f\x4b\x35\x4b\x50\x5a\x40\x47\x6b\x56\x6e\x5a\x41\x45\x35\x36\x41\x5a\x42\x37\x4c\x3f\x4e\x5a\x43", /* 8c00 */ "\x5a\x44\x4b\x2d\x5a\x45\x35\x77\x5a\x46\x41\x42\x57\x3b\x5a\x47\x4c\x38\x00\x00\x52\x6a\x44\x31\x5a\x48\x35\x7d\x3b\x51\x5a\x49\x50\x33\x5a\x4a\x5a\x4b\x4e\x3d\x5a\x4c\x5a\x4d\x5a\x4e\x32\x77\x5a\x51\x5a\x4f\x51\x68\x5a\x50\x43\x55\x5a\x52\x00\x00\x5a\x53\x5a\x54\x5a\x55\x50\x3b\x52\x25\x30\x79\x5a\x56\x47\x2b\x5a\x57\x3d\x77\x43\x21\x5a\x58\x5a\x59\x43\x7d\x4c\x37\x5a\x5a\x5a\x5b\x40\x3e\x46\x57\x5a\x5c\x5a\x5d\x47\x34\x5a\x5e\x5a\x5f\x39\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x36\x39\x74\x78\x00\x00\x74\x79\x00\x00\x00\x00\x4d\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x39\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x73\x3b\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x40\x54\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x59\x00\x00\x00\x00\x00\x00\x00\x00\x75\x74\x31\x2a\x32\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8c80 */ "\x00\x00\x00\x00\x75\x75\x00\x00\x00\x00\x75\x77\x00\x00\x00\x00\x00\x00\x3a\x51\x75\x76\x00\x00\x43\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x79\x00\x00\x00\x00\x00\x00\x75\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x34\x55\x6a\x38\x3a\x00\x00\x39\x31\x32\x46\x54\x70\x4f\x4d\x30\x5c\x55\x4b\x3b\x75\x56\x4a\x37\x37\x4c\x30\x46\x36\x31\x61\x39\x3a\x56\x7c\x39\x61\x37\x21\x3c\x7a\x6a\x5a\x6a\x5b\x4c\x79\x39\x73\x6a\x5c\x34\x7b\x43\x33\x37\x51\x3a\x58\x6a\x5d\x54\x74\x6a\x5e\x3c\x56\x3b\x5f\x6a\x5f\x41\x5e\x42\x38\x54\x5f\x57\x4a\x6a\x60\x6a\x61\x6a\x64\x6a\x62\x6a\x63\x49\x5e\x38\x33\x36\x44\x6a\x65\x4a\x6a\x49\x4d\x34\x4d\x00\x00\x00\x00\x62\x59\x45\x62\x6a\x66\x40\x35\x00\x00\x57\x38\x6a\x67\x57\x2c\x48\x7c\x58\x53\x58\x4d\x54\x5e\x00\x00\x54\x79\x49\x44\x53\x2e\x38\x53\x33\x60\x00\x00\x49\x62\x74\x76\x00\x00\x00\x00\x00\x00\x3a\x55\x00\x00\x74\x77\x00\x00\x00\x00\x57\x5f\x00\x00\x00\x00\x74\x71\x38\x30\x55\x54\x38\x4f\x46\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8d80 */ "\x00\x00\x33\x43\x00\x00\x00\x00\x74\x72\x33\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x54\x3d\x47\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x74\x00\x00\x00\x00\x74\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x4b\x00\x00\x00\x00\x00\x00\x48\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x75\x00\x00\x57\x63\x45\x3f\x75\x40\x00\x00\x00\x00\x75\x3b\x00\x00\x75\x43\x00\x00\x75\x42\x00\x00\x56\x3a\x75\x41\x00\x00\x00\x00\x00\x00\x54\x3e\x75\x44\x00\x00\x75\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x30\x4f\x35\x78\x00\x00\x75\x49\x75\x4a\x00\x00\x45\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x75\x45\x75\x46\x00\x00\x00\x00\x75\x47\x75\x4b\x00\x00\x3e\x60\x75\x48\x38\x7a\x00\x00\x00\x00\x00\x00\x75\x50\x75\x53\x00\x00\x00\x00\x00\x00\x3f\x67\x00\x00\x39\x72\x75\x3c\x75\x4d\x00\x00\x00\x00\x42\x37\x00\x00\x00\x00\x00\x00\x4c\x78\x00\x00\x3c\x79\x00\x00\x75\x4e\x75\x4f\x75\x51\x36\x65\x75\x52\x00\x00\x75\x55\x00\x00\x00\x00", /* 8e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x3d\x00\x00\x00\x00\x00\x00\x75\x54\x53\x3b\x00\x00\x33\x6c\x00\x00\x00\x00\x4c\x24\x00\x00\x00\x00\x00\x00\x00\x00\x75\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x57\x3e\x61\x75\x58\x00\x00\x00\x00\x4c\x5f\x75\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x48\x57\x59\x00\x00\x75\x59\x00\x00\x75\x5a\x75\x5c\x00\x00\x75\x62\x00\x00\x00\x00\x00\x00\x75\x60\x00\x00\x00\x00\x00\x00\x75\x5f\x75\x5d\x00\x00\x00\x00\x75\x61\x00\x00\x00\x00\x75\x5e\x75\x64\x75\x65\x00\x00\x4c\x63\x00\x00\x00\x00\x65\x3f\x35\x38\x75\x63\x75\x68\x4c\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x66\x75\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x44\x00\x00\x00\x00\x75\x3f\x00\x00\x00\x00\x35\x45\x32\x64\x00\x00\x75\x6c\x75\x69\x00\x00\x36\x57\x00\x00\x75\x6d\x00\x00\x75\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x6b\x00\x00\x00\x00\x34\x5a", /* 8e80 */ "\x00\x00\x54\x6a\x00\x00\x00\x00\x00\x00\x75\x6e\x00\x00\x33\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x6f\x75\x71\x00\x00\x00\x00\x00\x00\x75\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x72\x00\x00\x75\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x6d\x39\x2a\x00\x00\x00\x00\x47\x7b\x00\x00\x00\x00\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x35\x54\x7e\x39\x6c\x50\x79\x00\x00\x69\x6d\x57\x2a\x69\x6e\x42\x56\x48\x6d\x3a\x64\x69\x6f\x69\x70\x69\x71\x56\x61\x69\x72\x69\x73\x69\x75\x69\x74\x69\x76\x69\x77\x47\x61\x69\x78\x54\x58\x69\x79\x3d\x4e", /* 8f80 */ "\x00\x00\x69\x7a\x69\x7b\x3d\x4f\x69\x7c\x38\x28\x41\x3e\x69\x7d\x31\x32\x3b\x54\x39\x75\x69\x7e\x00\x00\x6a\x21\x6a\x22\x6a\x23\x37\x78\x3c\x2d\x00\x00\x4a\x64\x60\x4e\x54\x2f\x4f\x3d\x55\x37\x6a\x24\x55\x5e\x6a\x25\x50\x41\x39\x3c\x00\x00\x34\x47\x31\x59\x00\x00\x00\x00\x00\x00\x40\x31\x00\x00\x00\x00\x00\x00\x00\x00\x31\x66\x31\x67\x00\x00\x31\x68\x00\x00\x00\x00\x00\x00\x00\x00\x33\x3d\x48\x68\x00\x00\x00\x00\x00\x00\x00\x00\x65\x41\x00\x00\x00\x00\x31\x5f\x00\x00\x00\x00\x00\x00\x41\x49\x34\x6f\x00\x00\x00\x00\x47\x28\x53\x58\x00\x00\x46\x79\x51\x38\x00\x00\x39\x7d\x42\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x2d\x00\x00\x54\x4b\x3d\x7c\x00\x00\x65\x42\x37\x35\x65\x43\x00\x00\x00\x00\x3b\x39\x55\x62\x00\x00\x3d\x78\x54\x36\x4e\x25\x41\x2c\x33\x59\x00\x00\x00\x00\x4c\x76\x00\x00\x65\x46\x65\x44\x65\x48\x00\x00\x65\x4a\x65\x47\x35\x4f\x46\x48\x00\x00\x35\x7c\x65\x45\x00\x00\x4a\x76\x00\x00\x00\x00\x65\x49\x00\x00\x00\x00\x00\x00\x43\x54\x31\x45\x3c\x23\x00\x00\x00\x00\x00\x00\x57\x37\x00\x00\x00\x00", /* 9000 */ "\x4d\x4b\x4b\x4d\x4a\x4a\x4c\x53\x65\x4c\x65\x4b\x44\x66\x00\x00\x00\x00\x51\x21\x51\x37\x65\x4d\x00\x00\x65\x50\x00\x00\x4d\x38\x56\x70\x65\x4f\x35\x5d\x00\x00\x4d\x3e\x00\x00\x65\x51\x36\x3a\x00\x00\x00\x00\x4d\x28\x39\x64\x00\x00\x4a\x45\x33\x51\x4b\x59\x54\x6c\x65\x52\x37\x6a\x00\x00\x00\x00\x00\x00\x65\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x55\x34\x7e\x65\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x53\x65\x54\x00\x00\x52\x5d\x00\x00\x00\x00\x42\x5f\x31\x46\x00\x00\x53\x62\x00\x00\x00\x00\x36\x5d\x4b\x6c\x00\x00\x65\x57\x00\x00\x00\x00\x53\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x69\x00\x00\x36\x74\x65\x5a\x65\x58\x65\x59\x35\x40\x00\x00\x00\x00\x00\x00\x52\x45\x65\x5c\x00\x00\x00\x00\x65\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x5d\x47\x32\x00\x00\x52\x23\x00\x00\x00\x00\x65\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x54\x62\x55\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x60\x57\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x61\x00\x00\x31\x5c", /* 9080 */ "\x51\x7b\x00\x00\x65\x62\x65\x64\x00\x00\x00\x00\x00\x00\x00\x00\x65\x63\x00\x00\x00\x00\x65\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x58\x00\x00\x35\x4b\x00\x00\x67\x5f\x00\x00\x5a\x75\x00\x00\x5a\x78\x00\x00\x5a\x76\x00\x00\x5a\x77\x00\x00\x00\x00\x00\x00\x5a\x7a\x50\x4f\x44\x47\x00\x00\x00\x00\x30\x6e\x00\x00\x00\x00\x00\x00\x50\x30\x00\x00\x5a\x79\x00\x00\x53\x4a\x3a\x2a\x5b\x22\x47\x71\x00\x00\x5a\x7c\x5a\x7b\x49\x5b\x5a\x7d\x00\x00\x5b\x21\x57\x5e\x5a\x7e\x41\x5a\x00\x00\x00\x00\x5b\x25\x00\x00\x00\x00\x53\x74\x00\x00\x00\x00\x5b\x27\x5b\x24\x00\x00\x5b\x28\x00\x00\x00\x00\x3d\x3c\x00\x00\x00\x00\x00\x00\x40\x49\x5b\x23\x5b\x26\x56\x23\x00\x00\x5b\x29\x00\x00\x00\x00\x00\x00\x5b\x2d\x00\x00\x00\x00\x00\x00\x5b\x2e\x5b\x2c\x3a\x42\x00\x00\x00\x00\x00\x00\x3f\x24\x5b\x2b\x00\x00\x00\x00\x00\x00\x5b\x2a\x54\x47\x32\x3f\x00\x00\x00\x00\x5b\x2f\x00\x00\x39\x79\x00\x00\x5b\x30\x00\x00\x00\x00\x00\x00\x00\x00\x33\x3b\x00\x00\x00\x00\x00\x00\x35\x26\x00\x00\x00\x00\x00\x00\x00\x00\x36\x3c\x5b\x31\x00\x00", /* 9100 */ "\x00\x00\x00\x00\x36\x75\x00\x00\x5b\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x49\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x34\x00\x00\x00\x00\x00\x00\x5b\x33\x5b\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x37\x00\x00\x5b\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x39\x00\x00\x00\x00\x5b\x3a\x00\x00\x00\x00\x53\x4f\x74\x7a\x47\x75\x57\x43\x45\x64\x74\x7c\x74\x7d\x74\x7b\x00\x00\x3e\x46\x00\x00\x00\x00\x00\x00\x00\x00\x50\x6f\x00\x00\x00\x00\x37\x53\x00\x00\x00\x00\x54\x4d\x4c\x2a\x00\x00\x00\x00\x75\x22\x75\x21\x3a\x28\x74\x7e\x4b\x56\x00\x00\x00\x00\x00\x00\x75\x24\x40\x52\x00\x00\x33\x6a\x00\x00\x4d\x2a\x75\x25\x75\x23\x3d\x34\x75\x28\x00\x00\x75\x29\x3d\x4d\x43\x38\x3f\x61\x4b\x61\x75\x2a\x00\x00\x00\x00\x00\x00\x75\x26\x75\x27\x44\x70", /* 9180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x2c\x00\x00\x34\x3c\x00\x00\x57\x6d\x00\x00\x34\x57\x75\x2b\x75\x2e\x00\x00\x00\x00\x75\x2d\x75\x2f\x50\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x51\x48\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x30\x75\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x32\x00\x00\x00\x00\x75\x33\x75\x34\x75\x35\x00\x00\x00\x00\x00\x00\x00\x00\x75\x37\x75\x36\x00\x00\x00\x00\x00\x00\x00\x00\x75\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x49\x00\x00\x53\x54\x4a\x4d\x00\x00\x40\x6f\x56\x58\x52\x30\x41\x3f\x00\x00\x3d\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9480 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x44\x6e\x45\x6e\x46\x55\x6b\x36\x24\x6e\x48\x6e\x47\x6e\x49\x6e\x4a\x47\x25\x6e\x4b\x6e\x4c\x00\x00\x37\x30\x35\x76\x6e\x4d\x6e\x4f\x00\x00\x6e\x4e\x00\x00\x38\x46\x6e\x50\x6e\x51\x6e\x52\x36\x5b\x33\x2e\x56\x53\x44\x46\x31\x35\x38\x56\x6e\x53\x6e\x54\x54\x3f\x47\x55\x3e\x7b\x4e\x59\x39\x33\x6e\x56\x6e\x55\x6e\x58\x6e\x57\x45\x25\x6e\x59\x6e\x5a\x47\x2e\x6e\x5b\x47\x2f\x6e\x5c\x32\x27\x6e\x5d\x6e\x5e\x6e\x5f\x6e\x60\x6e\x61\x57\x6a\x6e\x62\x6e\x63\x3c\x58\x6e\x64\x53\x4b\x4c\x7a\x32\x2c\x41\x65\x6e\x65\x47\x26\x43\x2d\x00\x00\x6e\x66\x6e\x67\x6e\x68\x6e\x69\x6e\x6a\x6e\x6b\x6e\x6c\x00\x00\x6e\x6d\x6e\x6e\x6e\x6f\x00\x00\x00\x00\x6e\x70\x6e\x71\x6e\x72\x6e\x74\x6e\x73\x00\x00\x6e\x75\x4d\x2d\x42\x41\x6e\x76\x6e\x77\x6e\x78\x55\x21\x6e\x79\x4f\x33\x6e\x7a\x6e\x7b\x00\x00\x6e\x7c\x6e\x7d\x6f\x21\x6e\x7e\x6f\x22\x38\x75\x43\x7a\x6f\x23\x6f\x24\x3d\x42\x52\x3f\x32\x79\x6f\x25\x6f\x26\x6f\x27\x52\x78\x6f\x28\x56\x7d\x6f\x29\x46\x4c\x00\x00\x6f\x2a\x6f\x2b\x41\x34\x6f\x2c", /* 9500 */ "\x4f\x7a\x4b\x78\x6f\x2e\x6f\x2d\x33\x7a\x39\x78\x6f\x2f\x6f\x30\x50\x62\x6f\x31\x6f\x32\x37\x66\x50\x3f\x6f\x33\x6f\x34\x6f\x35\x48\x71\x4c\x60\x6f\x36\x6f\x37\x6f\x38\x6f\x39\x6f\x3a\x55\x60\x6f\x3b\x34\x6d\x43\x2a\x6f\x3c\x00\x00\x6f\x3d\x6f\x3e\x6f\x3f\x00\x00\x4e\x7d\x6f\x40\x42\x60\x34\x38\x57\x36\x3d\x75\x00\x00\x4f\x47\x6f\x43\x6f\x41\x6f\x42\x6f\x44\x36\x27\x3c\x7c\x3e\x62\x43\x4c\x6f\x45\x6f\x46\x00\x00\x6f\x47\x6f\x4f\x6f\x48\x6f\x49\x6f\x4a\x47\x42\x6f\x71\x36\x4d\x6f\x4b\x00\x00\x6f\x4c\x6f\x4d\x36\x46\x43\x3e\x6f\x4e\x00\x00\x6f\x50\x6f\x51\x6f\x52\x55\x72\x00\x00\x6f\x53\x44\x77\x00\x00\x6f\x54\x44\x78\x6f\x55\x6f\x56\x38\x64\x30\x77\x6f\x57\x6f\x58\x6f\x59\x00\x00\x6f\x5a\x6f\x5b\x6f\x5c\x6f\x5d\x00\x00\x6f\x5e\x3e\x35\x6f\x61\x6f\x5f\x6f\x60\x00\x00\x6f\x62\x6f\x63\x41\x4d\x6f\x64\x6f\x65\x6f\x66\x6f\x67\x6f\x68\x6f\x69\x6f\x6a\x6f\x6b\x6f\x6c\x40\x58\x00\x00\x6f\x6d\x41\x2d\x6f\x6e\x6f\x6f\x6f\x70\x00\x00\x00\x00\x4f\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x24", /* 9580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x45\x63\x45\x49\x41\x63\x46\x00\x00\x31\x55\x4e\x4a\x34\x33\x48\x72\x63\x47\x4f\x50\x63\x48\x3c\x64\x63\x49\x63\x4a\x43\x46\x55\x22\x44\x56\x39\x6b\x4e\x45\x63\x4b\x43\x76\x63\x4c\x00\x00", /* 9600 */ "\x37\x27\x38\x73\x3a\x52\x63\x4d\x63\x4e\x54\x44\x63\x4f\x00\x00\x63\x50\x51\x4b\x63\x51\x63\x52\x63\x53\x63\x54\x51\x56\x63\x55\x32\x7b\x40\x3b\x63\x56\x00\x00\x40\x2b\x63\x57\x63\x58\x63\x59\x00\x00\x63\x5a\x63\x5b\x00\x00\x38\x37\x5a\x62\x00\x00\x36\x53\x00\x00\x5a\x64\x5a\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x66\x00\x00\x00\x00\x00\x00\x48\x6e\x00\x00\x00\x00\x5a\x65\x37\x40\x51\x74\x52\x75\x55\x73\x3d\x57\x00\x00\x00\x00\x00\x00\x00\x00\x57\x68\x5a\x68\x5a\x67\x00\x00\x30\x22\x4d\x53\x00\x00\x5a\x69\x00\x00\x38\x3d\x3c\x4a\x42\x3d\x42\x24\x33\x42\x5a\x6a\x00\x00\x42\x2a\x44\x30\x3d\x35\x00\x00\x00\x00\x4f\x5e\x00\x00\x00\x00\x00\x00\x5a\x6b\x49\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x5d\x00\x00\x00\x00\x00\x00\x5a\x6c\x00\x00\x36\x38\x54\x3a\x00\x00\x33\x7d\x00\x00\x00\x00\x5a\x6d\x54\x49\x4f\x55\x45\x63\x00\x00\x5a\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x6f\x00\x00\x5a\x70\x41\x6a\x4c\x55\x4f\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x67\x42\x21\x00\x00\x5a\x71\x00\x00\x00\x00\x4b\x65\x00\x00\x5a\x72\x00\x00\x4b\x66\x52\x7e\x00\x00\x00\x00\x00\x00\x38\x74\x00\x00\x00\x00\x5a\x73\x30\x2f\x4f\x36\x00\x00\x00\x00\x55\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x74\x00\x00\x00\x00\x63\x44\x00\x00\x00\x00\x41\x25\x00\x00\x00\x00\x76\x3f\x00\x00\x00\x00\x76\x40\x76\x41\x44\x51\x00\x00\x48\x38\x51\x63\x00\x00\x00\x00\x50\x5b\x51\x45\x3c\x2f\x39\x4d\x00\x00\x6f\x74\x00\x00\x00\x00\x34\x46\x53\x3a\x76\x42\x33\x7b\x00\x00\x00\x00\x76\x43\x00\x00\x00\x00\x35\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6a\x76\x27\x51\x29\x00\x00\x00\x00\x00\x00\x00\x00\x76\x29\x00\x00\x00\x00\x00\x00\x76\x28\x00\x00\x00\x00\x41\x63\x40\x57\x00\x00\x31\x22\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x6d\x00\x00", /* 9700 */ "\x50\x68\x76\x2b\x00\x00\x00\x00\x4f\x76\x00\x00\x76\x2a\x55\x70\x76\x2c\x43\x39\x00\x00\x00\x00\x00\x00\x3b\x74\x76\x2e\x76\x2d\x00\x00\x00\x00\x00\x00\x44\x5e\x00\x00\x00\x00\x41\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x2a\x00\x00\x4f\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x2f\x00\x00\x00\x00\x76\x30\x00\x00\x00\x00\x76\x31\x00\x00\x42\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x54\x45\x79\x00\x00\x00\x00\x00\x00\x00\x00\x76\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x60\x76\x26\x00\x00\x00\x00\x3e\x38\x00\x00\x00\x00\x3e\x32\x00\x00\x35\x65\x00\x00\x00\x00\x37\x47\x00\x00\x3f\x3f\x43\x52\x43\x66\x00\x00\x00\x00\x58\x4c\x00\x00\x00\x00\x00\x00\x38\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x79\x51\x25\x00\x00\x30\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x30\x00\x00\x00\x00\x00\x00", /* 9780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x2c\x00\x00\x30\x30\x00\x00\x00\x00\x00\x00\x77\x32\x77\x33\x00\x00\x77\x34\x00\x00\x00\x00\x00\x00\x47\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x4f\x00\x00\x00\x00\x77\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x36\x00\x00\x31\x5e\x00\x00\x77\x35\x00\x00\x00\x00\x77\x38\x00\x00\x77\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x24\x48\x4d\x00\x00\x3a\x2b\x68\x38\x68\x39\x68\x3a\x3e\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x74\x00\x00\x54\x4f\x49\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x33\x36\x25\x47\x6a\x71\x7c\x4f\x6e\x4b\x33\x50\x6b\x67\x6f\x4d\x67\x39\x4b\x36\x59", /* 9880 */ "\x71\x7d\x30\x64\x4b\x4c\x71\x7e\x54\x24\x42\x2d\x41\x6c\x46\x44\x3e\x31\x72\x21\x3c\x55\x00\x00\x72\x22\x72\x23\x00\x00\x72\x24\x52\x43\x46\x35\x00\x00\x4d\x47\x72\x25\x00\x00\x53\x31\x3f\x45\x4c\x62\x00\x00\x72\x26\x72\x27\x51\x55\x36\x6e\x72\x28\x72\x29\x35\x5f\x72\x2a\x72\x2b\x00\x00\x32\x7c\x72\x2c\x72\x2d\x48\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x67\x00\x00\x00\x00\x6c\x29\x6c\x2a\x6c\x2b\x00\x00\x6c\x2c\x00\x00\x00\x00\x46\x2e\x6c\x2d\x6c\x2e\x00\x00\x00\x00\x00\x00\x37\x49\x4a\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x38\x77\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x50\x00\x00\x00\x00\x32\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x53\x77\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x3b\x00\x00\x3c\x22\x00\x00\x62\x3c\x62\x3d\x62\x3e\x62\x3f\x62\x40\x62\x41\x37\x39\x52\x7b\x3d\x24\x4a\x4e\x31\x25\x4b\x47\x00\x00\x62\x42\x36\x7c\x48\x44\x62\x43\x00\x00\x00\x00\x3d\x48\x00\x00\x31\x7d\x62\x44\x00\x00\x36\x76", /* 9980 */ "\x62\x45\x44\x59\x00\x00\x00\x00\x62\x46\x4f\x5a\x39\x5d\x62\x47\x40\x21\x00\x00\x62\x48\x32\x76\x00\x00\x62\x49\x00\x00\x41\x73\x62\x4a\x62\x4b\x42\x78\x62\x4c\x62\x4d\x62\x4e\x4a\x57\x58\x38\x59\x65\x4f\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x25\x00\x00\x00\x00\x5c\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x6d\x54\x26\x4d\x54\x51\x31\x33\x5b\x47\x7d\x00\x00\x32\x35\x42\x3f\x66\x60\x4a\x3b\x66\x61\x66\x62\x3e\x54\x66\x63\x57\x24\x4d\x55\x66\x65\x3c\x5d\x66\x64", /* 9a80 */ "\x66\x66\x66\x67\x42\x6e\x00\x00\x3d\x3e\x66\x68\x42\x66\x3a\x27\x66\x69\x00\x00\x66\x6a\x33\x52\x51\x69\x00\x00\x00\x00\x3f\x25\x66\x6b\x46\x6f\x66\x6c\x66\x6d\x00\x00\x00\x00\x66\x6e\x46\x2d\x66\x6f\x00\x00\x49\x27\x66\x70\x66\x71\x66\x72\x65\x39\x66\x73\x66\x74\x42\x62\x66\x75\x66\x76\x56\x68\x66\x77\x00\x00\x66\x78\x39\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x3b\x77\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x77\x3e\x77\x3c\x3a\x21\x00\x00\x77\x3f\x00\x00\x77\x40\x00\x00\x00\x00\x00\x00\x77\x42\x77\x41\x77\x44\x00\x00\x00\x00\x77\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x45\x77\x46\x00\x00\x00\x00\x00\x00\x00\x00\x77\x47\x00\x00\x4b\x68\x00\x00\x00\x00\x00\x00\x00\x00\x38\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x54\x00\x00\x77\x55\x00\x00\x00\x00\x00\x00\x00\x00\x77\x56\x00\x00\x00\x00\x00\x00\x00\x00\x77\x58\x00\x00\x77\x5a\x00\x00\x77\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x5b\x00\x00\x77\x59\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b00 */ "\x00\x00\x00\x00\x00\x00\x57\x57\x00\x00\x00\x00\x00\x00\x00\x00\x77\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x5d\x00\x00\x00\x00\x00\x00\x77\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x5f\x00\x00\x00\x00\x00\x00\x77\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x4b\x00\x00\x00\x00\x58\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x77\x39\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x7d\x3b\x6a\x77\x49\x46\x47\x77\x48\x00\x00\x77\x4a\x77\x4c\x77\x4b\x00\x00\x00\x00\x00\x00\x77\x4d\x00\x00\x4e\x3a\x00\x00\x77\x4e\x00\x00\x00\x00\x44\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b80 */ NULL, /* 9c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x63\x00\x00\x00\x00\x76\x4f", /* 9c80 */ "\x00\x00\x42\x33\x76\x50\x00\x00\x00\x00\x76\x51\x76\x52\x76\x53\x76\x54\x00\x00\x00\x00\x76\x56\x00\x00\x31\x2b\x76\x57\x00\x00\x76\x58\x76\x59\x76\x5a\x00\x00\x76\x5b\x76\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x76\x5d\x76\x5e\x4f\x4a\x00\x00\x76\x5f\x76\x60\x76\x61\x76\x62\x76\x63\x76\x64\x40\x70\x76\x65\x76\x66\x76\x67\x76\x68\x76\x69\x00\x00\x76\x6a\x00\x00\x76\x6b\x76\x6c\x00\x00\x76\x6d\x76\x6e\x76\x6f\x76\x70\x76\x71\x76\x72\x76\x73\x76\x74\x3e\x28\x00\x00\x76\x75\x76\x76\x76\x77\x76\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x7a\x76\x79\x76\x7a\x76\x7b\x76\x7c\x00\x00\x00\x00\x76\x7d\x76\x7e\x77\x21\x77\x22\x77\x23\x77\x24\x77\x25\x00\x00\x00\x00\x77\x26\x77\x27\x77\x28\x31\x6e\x77\x29\x77\x2a\x77\x2b\x00\x00\x00\x00\x77\x2c\x77\x2d\x41\x5b\x77\x2e\x00\x00\x00\x00\x77\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9d00 */ NULL, /* 9d80 */ NULL, /* 9e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x71\x70\x2f\x3c\x26\x70\x30\x43\x79\x00\x00\x45\x38\x51\x3b\x00\x00\x70\x31\x70\x32\x70\x33\x70\x34\x70\x35\x51\x3c\x00\x00\x51\x6c\x00\x00\x70\x37\x70\x36\x54\x27\x00\x00\x4d\x52\x70\x38\x70\x3a\x70\x39\x70\x3b\x70\x3c\x00\x00\x00\x00\x38\x6b\x70\x3d\x3a\x68\x00\x00\x70\x3e\x70\x3f\x3e\x69\x70\x40\x36\x6c\x70\x41\x70\x42\x70\x43\x70\x44\x48\x35\x70\x45\x70\x46\x00\x00\x70\x47\x45\x74\x00\x00\x70\x48\x00\x00\x00\x00\x00\x00\x70\x49\x00\x00\x70\x4a\x77\x3d\x00\x00\x70\x4b\x70\x4c\x70\x4d\x00\x00\x70\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x70\x4f\x3a\x57\x00\x00\x70\x50\x70\x51\x70\x52\x70\x53\x70\x54\x70\x55\x70\x56\x70\x58\x00\x00\x00\x00\x53\x25\x70\x57\x00\x00\x70\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x3a\x42\x39", /* 9e80 */ "\x00\x00\x00\x00\x77\x64\x00\x00\x00\x00\x00\x00\x00\x00\x77\x65\x77\x66\x00\x00\x00\x00\x77\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x68\x42\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x6a\x00\x00\x77\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x70\x00\x00\x00\x00\x00\x00\x74\x6f\x00\x00\x00\x00\x42\x69\x00\x00\x77\x61\x77\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x46\x00\x00\x00\x00\x00\x00\x00\x00\x59\x64\x00\x00\x00\x00\x00\x00\x4a\x72\x40\x68\x70\x24\x00\x00\x3a\x5a\x00\x00\x00\x00\x47\x2d\x00\x00\x00\x00\x00\x00\x44\x2c\x00\x00\x00\x00\x77\x6c\x77\x6d\x77\x6e\x00\x00\x77\x70\x77\x6f\x00\x00\x77\x71\x00\x00\x00\x00\x77\x74\x00\x00\x77\x73\x00\x00\x77\x72\x77\x75\x00\x00\x00\x00\x00\x00\x00\x00\x77\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x69\x00\x00\x6d\x6a\x6d\x6b\x00\x00\x76\x3c\x00\x00", /* 9f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x3d\x00\x00\x76\x3e\x36\x26\x00\x00\x58\x3e\x00\x00\x00\x00\x39\x44\x00\x00\x00\x00\x00\x00\x58\x3b\x00\x00\x5c\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x73\x00\x00\x77\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x78\x00\x00\x00\x00\x77\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x7b\x00\x00\x77\x7a\x00\x00\x31\x47\x00\x00\x77\x7c\x77\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x6b\x6c\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x5d", /* 9f80 */ "\x76\x33\x00\x00\x00\x00\x76\x34\x41\x64\x76\x35\x76\x36\x76\x37\x76\x38\x76\x39\x76\x3a\x48\x23\x76\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x7a\x39\x28\x6d\x68\x00\x00\x00\x00\x00\x00\x39\x6a\x59\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ NULL, /* e080 */ NULL, /* e100 */ NULL, /* e180 */ NULL, /* e200 */ NULL, /* e280 */ NULL, /* e300 */ NULL, /* e380 */ NULL, /* e400 */ NULL, /* e480 */ NULL, /* e500 */ NULL, /* e580 */ NULL, /* e600 */ NULL, /* e680 */ NULL, /* e700 */ NULL, /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ NULL, /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ "\x00\x00\x23\x21\x23\x22\x23\x23\x21\x67\x23\x25\x23\x26\x23\x27\x23\x28\x23\x29\x23\x2a\x23\x2b\x23\x2c\x23\x2d\x23\x2e\x23\x2f\x23\x30\x23\x31\x23\x32\x23\x33\x23\x34\x23\x35\x23\x36\x23\x37\x23\x38\x23\x39\x23\x3a\x23\x3b\x23\x3c\x23\x3d\x23\x3e\x23\x3f\x23\x40\x23\x41\x23\x42\x23\x43\x23\x44\x23\x45\x23\x46\x23\x47\x23\x48\x23\x49\x23\x4a\x23\x4b\x23\x4c\x23\x4d\x23\x4e\x23\x4f\x23\x50\x23\x51\x23\x52\x23\x53\x23\x54\x23\x55\x23\x56\x23\x57\x23\x58\x23\x59\x23\x5a\x23\x5b\x23\x5c\x23\x5d\x23\x5e\x23\x5f\x23\x60\x23\x61\x23\x62\x23\x63\x23\x64\x23\x65\x23\x66\x23\x67\x23\x68\x23\x69\x23\x6a\x23\x6b\x23\x6c\x23\x6d\x23\x6e\x23\x6f\x23\x70\x23\x71\x23\x72\x23\x73\x23\x74\x23\x75\x23\x76\x23\x77\x23\x78\x23\x79\x23\x7a\x23\x7b\x23\x7c\x23\x7d\x21\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x69\x21\x6a\x00\x00\x23\x7e\x00\x00\x23\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" } }, /* * GB18030 X11 font, uses GB18030 encoding, but only represents 2-byte * sequences 81 40 through fe fe (no ASCII). */ { "gb18030.2000-0", { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe8\x00\x00\x00\x00\xa1\xec\xa1\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe3\xa1\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa4\xa8\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa8\xa8\xa6\xa8\xba\x00\x00\xa8\xac\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xb0\xa8\xae\x00\x00\x00\x00\x00\x00\xa1\xc2\x00\x00\xa8\xb4\xa8\xb2\x00\x00\xa8\xb9\x00\x00\x00\x00\x00\x00", /* 0100 */ "\x00\x00\xa8\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xbd\x00\x00\x00\x00\x00\x00\xa8\xbe\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa3\x00\x00\xa8\xab\x00\x00\xa8\xaf\x00\x00\xa8\xb3\x00\x00\xa8\xb5\x00\x00\xa8\xb6\x00\x00\xa8\xb7\x00\x00\xa8\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xa6\x00\x00\xa1\xa5\xa8\x40\xa8\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xa1\xa6\xa2\xa6\xa3\xa6\xa4\xa6\xa5\xa6\xa6\xa6\xa7\xa6\xa8\xa6\xa9\xa6\xaa\xa6\xab\xa6\xac\xa6\xad\xa6\xae\xa6\xaf\xa6\xb0\xa6\xb1\x00\x00\xa6\xb2\xa6\xb3\xa6\xb4\xa6\xb5\xa6\xb6\xa6\xb7\xa6\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xc1\xa6\xc2\xa6\xc3\xa6\xc4\xa6\xc5\xa6\xc6\xa6\xc7\xa6\xc8\xa6\xc9\xa6\xca\xa6\xcb\xa6\xcc\xa6\xcd\xa6\xce\xa6\xcf\xa6\xd0\xa6\xd1\x00\x00\xa6\xd2\xa6\xd3\xa6\xd4\xa6\xd5\xa6\xd6\xa6\xd7\xa6\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\xa7\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\xa1\xa7\xa2\xa7\xa3\xa7\xa4\xa7\xa5\xa7\xa6\xa7\xa8\xa7\xa9\xa7\xaa\xa7\xab\xa7\xac\xa7\xad\xa7\xae\xa7\xaf\xa7\xb0\xa7\xb1\xa7\xb2\xa7\xb3\xa7\xb4\xa7\xb5\xa7\xb6\xa7\xb7\xa7\xb8\xa7\xb9\xa7\xba\xa7\xbb\xa7\xbc\xa7\xbd\xa7\xbe\xa7\xbf\xa7\xc0\xa7\xc1\xa7\xd1\xa7\xd2\xa7\xd3\xa7\xd4\xa7\xd5\xa7\xd6\xa7\xd8\xa7\xd9\xa7\xda\xa7\xdb\xa7\xdc\xa7\xdd\xa7\xde\xa7\xdf\xa7\xe0\xa7\xe1\xa7\xe2\xa7\xe3\xa7\xe4\xa7\xe5\xa7\xe6\xa7\xe7\xa7\xe8\xa7\xe9\xa7\xea\xa7\xeb\xa7\xec\xa7\xed\xa7\xee\xa7\xef\xa7\xf0\xa7\xf1\x00\x00\xa7\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x5c\x00\x00\x00\x00\xa8\x43\xa1\xaa\xa8\x44\xa1\xac\x00\x00\xa1\xae\xa1\xaf\x00\x00\x00\x00\xa1\xb0\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x45\xa1\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xeb\x00\x00\xa1\xe4\xa1\xe5\x00\x00\xa8\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2100 */ "\x00\x00\x00\x00\x00\x00\xa1\xe6\x00\x00\xa8\x47\x00\x00\x00\x00\x00\x00\xa8\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xf1\xa2\xf2\xa2\xf3\xa2\xf4\xa2\xf5\xa2\xf6\xa2\xf7\xa2\xf8\xa2\xf9\xa2\xfa\xa2\xfb\xa2\xfc\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xa1\xa2\xa2\xa2\xa3\xa2\xa4\xa2\xa5\xa2\xa6\xa2\xa7\xa2\xa8\xa2\xa9\xa2\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xfb\xa1\xfc\xa1\xfa\xa1\xfd\x00\x00\x00\x00\xa8\x49\xa8\x4a\xa8\x4b\xa8\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xc7\x00\x00\xa1\xc6\x00\x00\x00\x00\x00\x00\xa8\x4d\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xcc\x00\x00\x00\x00\xa1\xd8\xa1\xde\xa8\x4e\xa1\xcf\x00\x00\x00\x00\xa8\x4f\x00\x00\xa1\xce\x00\x00\xa1\xc4\xa1\xc5\xa1\xc9\xa1\xc8\xa1\xd2\x00\x00\x00\x00\xa1\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe0\xa1\xdf\xa1\xc3\xa1\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd6\x00\x00\x00\x00\x00\x00\xa1\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd9\xa1\xd4\x00\x00\x00\x00\xa1\xdc\xa1\xdd\xa8\x51\xa8\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xda\xa1\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x92\x00\x00\x00\x00\x00\x00\xa1\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xd9\xa2\xda\xa2\xdb\xa2\xdc\xa2\xdd\xa2\xde\xa2\xdf\xa2\xe0\xa2\xe1\xa2\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xc5\xa2\xc6\xa2\xc7\xa2\xc8\xa2\xc9\xa2\xca\xa2\xcb\xa2\xcc\xa2\xcd\xa2\xce\xa2\xcf\xa2\xd0", /* 2480 */ "\xa2\xd1\xa2\xd2\xa2\xd3\xa2\xd4\xa2\xd5\xa2\xd6\xa2\xd7\xa2\xd8\xa2\xb1\xa2\xb2\xa2\xb3\xa2\xb4\xa2\xb5\xa2\xb6\xa2\xb7\xa2\xb8\xa2\xb9\xa2\xba\xa2\xbb\xa2\xbc\xa2\xbd\xa2\xbe\xa2\xbf\xa2\xc0\xa2\xc1\xa2\xc2\xa2\xc3\xa2\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2500 */ "\xa9\xa4\xa9\xa5\xa9\xa6\xa9\xa7\xa9\xa8\xa9\xa9\xa9\xaa\xa9\xab\xa9\xac\xa9\xad\xa9\xae\xa9\xaf\xa9\xb0\xa9\xb1\xa9\xb2\xa9\xb3\xa9\xb4\xa9\xb5\xa9\xb6\xa9\xb7\xa9\xb8\xa9\xb9\xa9\xba\xa9\xbb\xa9\xbc\xa9\xbd\xa9\xbe\xa9\xbf\xa9\xc0\xa9\xc1\xa9\xc2\xa9\xc3\xa9\xc4\xa9\xc5\xa9\xc6\xa9\xc7\xa9\xc8\xa9\xc9\xa9\xca\xa9\xcb\xa9\xcc\xa9\xcd\xa9\xce\xa9\xcf\xa9\xd0\xa9\xd1\xa9\xd2\xa9\xd3\xa9\xd4\xa9\xd5\xa9\xd6\xa9\xd7\xa9\xd8\xa9\xd9\xa9\xda\xa9\xdb\xa9\xdc\xa9\xdd\xa9\xde\xa9\xdf\xa9\xe0\xa9\xe1\xa9\xe2\xa9\xe3\xa9\xe4\xa9\xe5\xa9\xe6\xa9\xe7\xa9\xe8\xa9\xe9\xa9\xea\xa9\xeb\xa9\xec\xa9\xed\xa9\xee\xa9\xef\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x54\xa8\x55\xa8\x56\xa8\x57\xa8\x58\xa8\x59\xa8\x5a\xa8\x5b\xa8\x5c\xa8\x5d\xa8\x5e\xa8\x5f\xa8\x60\xa8\x61\xa8\x62\xa8\x63\xa8\x64\xa8\x65\xa8\x66\xa8\x67\xa8\x68\xa8\x69\xa8\x6a\xa8\x6b\xa8\x6c\xa8\x6d\xa8\x6e\xa8\x6f\xa8\x70\xa8\x71\xa8\x72\xa8\x73\xa8\x74\xa8\x75\xa8\x76\xa8\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\xa8\x78\xa8\x79\xa8\x7a\xa8\x7b\xa8\x7c\xa8\x7d\xa8\x7e\xa8\x80\xa8\x81\xa8\x82\xa8\x83\xa8\x84\xa8\x85\xa8\x86\xa8\x87\x00\x00\x00\x00\x00\x00\xa8\x88\xa8\x89\xa8\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf6\xa1\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf8\xa1\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x8b\xa8\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf4\xa1\xf3\x00\x00\x00\x00\x00\x00\xa1\xf0\x00\x00\x00\x00\xa1\xf2\xa1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x8d\xa8\x8e\xa8\x8f\xa8\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xef\xa1\xee\x00\x00\x00\x00\xa8\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe2\x00\x00\xa1\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ "\x00\x00\xfe\x50\x00\x00\x00\x00\xfe\x54\x00\x00\x00\x00\x00\x00\xfe\x57\x00\x00\x00\x00\xfe\x58\xfe\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x6b\x00\x00\x00\x00\xfe\x6e\x00\x00\x00\x00\x00\x00\xfe\x71\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x73\x00\x00\x00\x00\xfe\x74\xfe\x75\x00\x00\x00\x00\x00\x00\xfe\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2f00 */ NULL, /* 2f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x8a\xa9\x8b\xa9\x8c\xa9\x8d\xa9\x8e\xa9\x8f\xa9\x90\xa9\x91\xa9\x92\xa9\x93\xa9\x94\xa9\x95\x00\x00\x00\x00\x00\x00\x00\x00", /* 3000 */ "\xa1\xa1\xa1\xa2\xa1\xa3\xa1\xa8\x00\x00\xa1\xa9\xa9\x65\xa9\x96\xa1\xb4\xa1\xb5\xa1\xb6\xa1\xb7\xa1\xb8\xa1\xb9\xa1\xba\xa1\xbb\xa1\xbe\xa1\xbf\xa8\x93\xa1\xfe\xa1\xb2\xa1\xb3\xa1\xbc\xa1\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x94\xa8\x95\x00\x00\x00\x00\xa9\x40\xa9\x41\xa9\x42\xa9\x43\xa9\x44\xa9\x45\xa9\x46\xa9\x47\xa9\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x89\x00\x00\x00\x00\xa4\xa1\xa4\xa2\xa4\xa3\xa4\xa4\xa4\xa5\xa4\xa6\xa4\xa7\xa4\xa8\xa4\xa9\xa4\xaa\xa4\xab\xa4\xac\xa4\xad\xa4\xae\xa4\xaf\xa4\xb0\xa4\xb1\xa4\xb2\xa4\xb3\xa4\xb4\xa4\xb5\xa4\xb6\xa4\xb7\xa4\xb8\xa4\xb9\xa4\xba\xa4\xbb\xa4\xbc\xa4\xbd\xa4\xbe\xa4\xbf\xa4\xc0\xa4\xc1\xa4\xc2\xa4\xc3\xa4\xc4\xa4\xc5\xa4\xc6\xa4\xc7\xa4\xc8\xa4\xc9\xa4\xca\xa4\xcb\xa4\xcc\xa4\xcd\xa4\xce\xa4\xcf\xa4\xd0\xa4\xd1\xa4\xd2\xa4\xd3\xa4\xd4\xa4\xd5\xa4\xd6\xa4\xd7\xa4\xd8\xa4\xd9\xa4\xda\xa4\xdb\xa4\xdc\xa4\xdd\xa4\xde\xa4\xdf", /* 3080 */ "\xa4\xe0\xa4\xe1\xa4\xe2\xa4\xe3\xa4\xe4\xa4\xe5\xa4\xe6\xa4\xe7\xa4\xe8\xa4\xe9\xa4\xea\xa4\xeb\xa4\xec\xa4\xed\xa4\xee\xa4\xef\xa4\xf0\xa4\xf1\xa4\xf2\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x61\xa9\x62\xa9\x66\xa9\x67\x00\x00\x00\x00\xa5\xa1\xa5\xa2\xa5\xa3\xa5\xa4\xa5\xa5\xa5\xa6\xa5\xa7\xa5\xa8\xa5\xa9\xa5\xaa\xa5\xab\xa5\xac\xa5\xad\xa5\xae\xa5\xaf\xa5\xb0\xa5\xb1\xa5\xb2\xa5\xb3\xa5\xb4\xa5\xb5\xa5\xb6\xa5\xb7\xa5\xb8\xa5\xb9\xa5\xba\xa5\xbb\xa5\xbc\xa5\xbd\xa5\xbe\xa5\xbf\xa5\xc0\xa5\xc1\xa5\xc2\xa5\xc3\xa5\xc4\xa5\xc5\xa5\xc6\xa5\xc7\xa5\xc8\xa5\xc9\xa5\xca\xa5\xcb\xa5\xcc\xa5\xcd\xa5\xce\xa5\xcf\xa5\xd0\xa5\xd1\xa5\xd2\xa5\xd3\xa5\xd4\xa5\xd5\xa5\xd6\xa5\xd7\xa5\xd8\xa5\xd9\xa5\xda\xa5\xdb\xa5\xdc\xa5\xdd\xa5\xde\xa5\xdf\xa5\xe0\xa5\xe1\xa5\xe2\xa5\xe3\xa5\xe4\xa5\xe5\xa5\xe6\xa5\xe7\xa5\xe8\xa5\xe9\xa5\xea\xa5\xeb\xa5\xec\xa5\xed\xa5\xee\xa5\xef\xa5\xf0\xa5\xf1\xa5\xf2\xa5\xf3\xa5\xf4\xa5\xf5\xa5\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x60\xa9\x63\xa9\x64\x00\x00", /* 3100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xc5\xa8\xc6\xa8\xc7\xa8\xc8\xa8\xc9\xa8\xca\xa8\xcb\xa8\xcc\xa8\xcd\xa8\xce\xa8\xcf\xa8\xd0\xa8\xd1\xa8\xd2\xa8\xd3\xa8\xd4\xa8\xd5\xa8\xd6\xa8\xd7\xa8\xd8\xa8\xd9\xa8\xda\xa8\xdb\xa8\xdc\xa8\xdd\xa8\xde\xa8\xdf\xa8\xe0\xa8\xe1\xa8\xe2\xa8\xe3\xa8\xe4\xa8\xe5\xa8\xe6\xa8\xe7\xa8\xe8\xa8\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3180 */ NULL, /* 3200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xe5\xa2\xe6\xa2\xe7\xa2\xe8\xa2\xe9\xa2\xea\xa2\xeb\xa2\xec\xa2\xed\xa2\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3300 */ NULL, /* 3380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x4a\xa9\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x4c\xa9\x4d\xa9\x4e\x00\x00\x00\x00\xa9\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x51\x00\x00\x00\x00\xa9\x52\xa9\x53\x00\x00\x00\x00\xa9\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x62\xfe\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3a00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3a80 */ NULL, /* 3b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3b80 */ NULL, /* 3c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4080 */ NULL, /* 4100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x78\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4400 */ NULL, /* 4480 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4680 */ NULL, /* 4700 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x82\x00\x00\x00\x00\x00\x00", /* 4780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x86\x00\x00\x00\x00\xfe\x87\x00\x00\x00\x00", /* 4980 */ "\x00\x00\x00\x00\xfe\x88\xfe\x89\x00\x00\xfe\x8a\xfe\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x8d\x00\x00\x00\x00\x00\x00\xfe\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x8f\xfe\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x93\xfe\x94\xfe\x95\xfe\x97\xfe\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x98\xfe\x99\xfe\x9a\xfe\x9b\xfe\x9c\xfe\x9d\xfe\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 4e00 */ "\xd2\xbb\xb6\xa1\x81\x40\xc6\xdf\x81\x41\x81\x42\x81\x43\xcd\xf2\xd5\xc9\xc8\xfd\xc9\xcf\xcf\xc2\xd8\xa2\xb2\xbb\xd3\xeb\x81\x44\xd8\xa4\xb3\xf3\x81\x45\xd7\xa8\xc7\xd2\xd8\xa7\xca\xc0\x81\x46\xc7\xf0\xb1\xfb\xd2\xb5\xb4\xd4\xb6\xab\xcb\xbf\xd8\xa9\x81\x47\x81\x48\x81\x49\xb6\xaa\x81\x4a\xc1\xbd\xd1\xcf\x81\x4b\xc9\xa5\xd8\xad\x81\x4c\xb8\xf6\xd1\xbe\xe3\xdc\xd6\xd0\x81\x4d\x81\x4e\xb7\xe1\x81\x4f\xb4\xae\x81\x50\xc1\xd9\x81\x51\xd8\xbc\x81\x52\xcd\xe8\xb5\xa4\xce\xaa\xd6\xf7\x81\x53\xc0\xf6\xbe\xd9\xd8\xaf\x81\x54\x81\x55\x81\x56\xc4\xcb\x81\x57\xbe\xc3\x81\x58\xd8\xb1\xc3\xb4\xd2\xe5\x81\x59\xd6\xae\xce\xda\xd5\xa7\xba\xf5\xb7\xa6\xc0\xd6\x81\x5a\xc6\xb9\xc5\xd2\xc7\xc7\x81\x5b\xb9\xd4\x81\x5c\xb3\xcb\xd2\xd2\x81\x5d\x81\x5e\xd8\xbf\xbe\xc5\xc6\xf2\xd2\xb2\xcf\xb0\xcf\xe7\x81\x5f\x81\x60\x81\x61\x81\x62\xca\xe9\x81\x63\x81\x64\xd8\xc0\x81\x65\x81\x66\x81\x67\x81\x68\x81\x69\x81\x6a\xc2\xf2\xc2\xd2\x81\x6b\xc8\xe9\x81\x6c\x81\x6d\x81\x6e\x81\x6f\x81\x70\x81\x71\x81\x72\x81\x73\x81\x74\x81\x75\xc7\xac\x81\x76", /* 4e80 */ "\x81\x77\x81\x78\x81\x79\x81\x7a\x81\x7b\x81\x7c\xc1\xcb\x81\x7d\xd3\xe8\xd5\xf9\x81\x7e\xca\xc2\xb6\xfe\xd8\xa1\xd3\xda\xbf\xf7\x81\x80\xd4\xc6\xbb\xa5\xd8\xc1\xce\xe5\xbe\xae\x81\x81\x81\x82\xd8\xa8\x81\x83\xd1\xc7\xd0\xa9\x81\x84\x81\x85\x81\x86\xd8\xbd\xd9\xef\xcd\xf6\xbf\xba\x81\x87\xbd\xbb\xba\xa5\xd2\xe0\xb2\xfa\xba\xe0\xc4\xb6\x81\x88\xcf\xed\xbe\xa9\xcd\xa4\xc1\xc1\x81\x89\x81\x8a\x81\x8b\xc7\xd7\xd9\xf1\x81\x8c\xd9\xf4\x81\x8d\x81\x8e\x81\x8f\x81\x90\xc8\xcb\xd8\xe9\x81\x91\x81\x92\x81\x93\xd2\xda\xca\xb2\xc8\xca\xd8\xec\xd8\xea\xd8\xc6\xbd\xf6\xc6\xcd\xb3\xf0\x81\x94\xd8\xeb\xbd\xf1\xbd\xe9\x81\x95\xc8\xd4\xb4\xd3\x81\x96\x81\x97\xc2\xd8\x81\x98\xb2\xd6\xd7\xd0\xca\xcb\xcb\xfb\xd5\xcc\xb8\xb6\xcf\xc9\x81\x99\x81\x9a\x81\x9b\xd9\xda\xd8\xf0\xc7\xaa\x81\x9c\xd8\xee\x81\x9d\xb4\xfa\xc1\xee\xd2\xd4\x81\x9e\x81\x9f\xd8\xed\x81\xa0\xd2\xc7\xd8\xef\xc3\xc7\x81\xa1\x81\xa2\x81\xa3\xd1\xf6\x81\xa4\xd6\xd9\xd8\xf2\x81\xa5\xd8\xf5\xbc\xfe\xbc\xdb\x81\xa6\x81\xa7\x81\xa8\xc8\xce\x81\xa9\xb7\xdd\x81\xaa\xb7\xc2", /* 4f00 */ "\x81\xab\xc6\xf3\x81\xac\x81\xad\x81\xae\x81\xaf\x81\xb0\x81\xb1\x81\xb2\xd8\xf8\xd2\xc1\x81\xb3\x81\xb4\xce\xe9\xbc\xbf\xb7\xfc\xb7\xa5\xd0\xdd\x81\xb5\x81\xb6\x81\xb7\x81\xb8\x81\xb9\xd6\xda\xd3\xc5\xbb\xef\xbb\xe1\xd8\xf1\x81\xba\x81\xbb\xc9\xa1\xce\xb0\xb4\xab\x81\xbc\xd8\xf3\x81\xbd\xc9\xcb\xd8\xf6\xc2\xd7\xd8\xf7\x81\xbe\x81\xbf\xce\xb1\xd8\xf9\x81\xc0\x81\xc1\x81\xc2\xb2\xae\xb9\xc0\x81\xc3\xd9\xa3\x81\xc4\xb0\xe9\x81\xc5\xc1\xe6\x81\xc6\xc9\xec\x81\xc7\xcb\xc5\x81\xc8\xcb\xc6\xd9\xa4\x81\xc9\x81\xca\x81\xcb\x81\xcc\x81\xcd\xb5\xe8\x81\xce\x81\xcf\xb5\xab\x81\xd0\x81\xd1\x81\xd2\x81\xd3\x81\xd4\x81\xd5\xce\xbb\xb5\xcd\xd7\xa1\xd7\xf4\xd3\xd3\x81\xd6\xcc\xe5\x81\xd7\xba\xce\x81\xd8\xd9\xa2\xd9\xdc\xd3\xe0\xd8\xfd\xb7\xf0\xd7\xf7\xd8\xfe\xd8\xfa\xd9\xa1\xc4\xe3\x81\xd9\x81\xda\xd3\xb6\xd8\xf4\xd9\xdd\x81\xdb\xd8\xfb\x81\xdc\xc5\xe5\x81\xdd\x81\xde\xc0\xd0\x81\xdf\x81\xe0\xd1\xf0\xb0\xdb\x81\xe1\x81\xe2\xbc\xd1\xd9\xa6\x81\xe3\xd9\xa5\x81\xe4\x81\xe5\x81\xe6\x81\xe7\xd9\xac\xd9\xae\x81\xe8\xd9\xab\xca\xb9", /* 4f80 */ "\x81\xe9\x81\xea\x81\xeb\xd9\xa9\xd6\xb6\x81\xec\x81\xed\x81\xee\xb3\xde\xd9\xa8\x81\xef\xc0\xfd\x81\xf0\xca\xcc\x81\xf1\xd9\xaa\x81\xf2\xd9\xa7\x81\xf3\x81\xf4\xd9\xb0\x81\xf5\x81\xf6\xb6\xb1\x81\xf7\x81\xf8\x81\xf9\xb9\xa9\x81\xfa\xd2\xc0\x81\xfb\x81\xfc\xcf\xc0\x81\xfd\x81\xfe\xc2\xc2\x82\x40\xbd\xc4\xd5\xec\xb2\xe0\xc7\xc8\xbf\xeb\xd9\xad\x82\x41\xd9\xaf\x82\x42\xce\xea\xba\xee\x82\x43\x82\x44\x82\x45\x82\x46\x82\x47\xc7\xd6\x82\x48\x82\x49\x82\x4a\x82\x4b\x82\x4c\x82\x4d\x82\x4e\x82\x4f\x82\x50\xb1\xe3\x82\x51\x82\x52\x82\x53\xb4\xd9\xb6\xed\xd9\xb4\x82\x54\x82\x55\x82\x56\x82\x57\xbf\xa1\x82\x58\x82\x59\x82\x5a\xd9\xde\xc7\xce\xc0\xfe\xd9\xb8\x82\x5b\x82\x5c\x82\x5d\x82\x5e\x82\x5f\xcb\xd7\xb7\xfd\x82\x60\xd9\xb5\x82\x61\xd9\xb7\xb1\xa3\xd3\xe1\xd9\xb9\x82\x62\xd0\xc5\x82\x63\xd9\xb6\x82\x64\x82\x65\xd9\xb1\x82\x66\xd9\xb2\xc1\xa9\xd9\xb3\x82\x67\x82\x68\xbc\xf3\xd0\xde\xb8\xa9\x82\x69\xbe\xe3\x82\x6a\xd9\xbd\x82\x6b\x82\x6c\x82\x6d\x82\x6e\xd9\xba\x82\x6f\xb0\xb3\x82\x70\x82\x71\x82\x72\xd9\xc2\x82\x73", /* 5000 */ "\x82\x74\x82\x75\x82\x76\x82\x77\x82\x78\x82\x79\x82\x7a\x82\x7b\x82\x7c\x82\x7d\x82\x7e\x82\x80\xd9\xc4\xb1\xb6\x82\x81\xd9\xbf\x82\x82\x82\x83\xb5\xb9\x82\x84\xbe\xf3\x82\x85\x82\x86\x82\x87\xcc\xc8\xba\xf2\xd2\xd0\x82\x88\xd9\xc3\x82\x89\x82\x8a\xbd\xe8\x82\x8b\xb3\xab\x82\x8c\x82\x8d\x82\x8e\xd9\xc5\xbe\xeb\x82\x8f\xd9\xc6\xd9\xbb\xc4\xdf\x82\x90\xd9\xbe\xd9\xc1\xd9\xc0\x82\x91\x82\x92\x82\x93\x82\x94\x82\x95\x82\x96\x82\x97\x82\x98\x82\x99\x82\x9a\x82\x9b\xd5\xae\x82\x9c\xd6\xb5\x82\x9d\xc7\xe3\x82\x9e\x82\x9f\x82\xa0\x82\xa1\xd9\xc8\x82\xa2\x82\xa3\x82\xa4\xbc\xd9\xd9\xca\x82\xa5\x82\xa6\x82\xa7\xd9\xbc\x82\xa8\xd9\xcb\xc6\xab\x82\xa9\x82\xaa\x82\xab\x82\xac\x82\xad\xd9\xc9\x82\xae\x82\xaf\x82\xb0\x82\xb1\xd7\xf6\x82\xb2\xcd\xa3\x82\xb3\x82\xb4\x82\xb5\x82\xb6\x82\xb7\x82\xb8\x82\xb9\x82\xba\xbd\xa1\x82\xbb\x82\xbc\x82\xbd\x82\xbe\x82\xbf\x82\xc0\xd9\xcc\x82\xc1\x82\xc2\x82\xc3\x82\xc4\x82\xc5\x82\xc6\x82\xc7\x82\xc8\x82\xc9\xc5\xbc\xcd\xb5\x82\xca\x82\xcb\x82\xcc\xd9\xcd\x82\xcd\x82\xce\xd9\xc7\xb3\xa5", /* 5080 */ "\xbf\xfe\x82\xcf\x82\xd0\x82\xd1\x82\xd2\xb8\xb5\x82\xd3\x82\xd4\xc0\xfc\x82\xd5\x82\xd6\x82\xd7\x82\xd8\xb0\xf8\x82\xd9\x82\xda\x82\xdb\x82\xdc\x82\xdd\x82\xde\x82\xdf\x82\xe0\x82\xe1\x82\xe2\x82\xe3\x82\xe4\x82\xe5\x82\xe6\x82\xe7\x82\xe8\x82\xe9\x82\xea\x82\xeb\x82\xec\x82\xed\xb4\xf6\x82\xee\xd9\xce\x82\xef\xd9\xcf\xb4\xa2\xd9\xd0\x82\xf0\x82\xf1\xb4\xdf\x82\xf2\x82\xf3\x82\xf4\x82\xf5\x82\xf6\xb0\xc1\x82\xf7\x82\xf8\x82\xf9\x82\xfa\x82\xfb\x82\xfc\x82\xfd\xd9\xd1\xc9\xb5\x82\xfe\x83\x40\x83\x41\x83\x42\x83\x43\x83\x44\x83\x45\x83\x46\x83\x47\x83\x48\x83\x49\x83\x4a\x83\x4b\x83\x4c\x83\x4d\x83\x4e\x83\x4f\x83\x50\x83\x51\xcf\xf1\x83\x52\x83\x53\x83\x54\x83\x55\x83\x56\x83\x57\xd9\xd2\x83\x58\x83\x59\x83\x5a\xc1\xc5\x83\x5b\x83\x5c\x83\x5d\x83\x5e\x83\x5f\x83\x60\x83\x61\x83\x62\x83\x63\x83\x64\x83\x65\xd9\xd6\xc9\xae\x83\x66\x83\x67\x83\x68\x83\x69\xd9\xd5\xd9\xd4\xd9\xd7\x83\x6a\x83\x6b\x83\x6c\x83\x6d\xcb\xdb\x83\x6e\xbd\xa9\x83\x6f\x83\x70\x83\x71\x83\x72\x83\x73\xc6\xa7\x83\x74\x83\x75\x83\x76\x83\x77", /* 5100 */ "\x83\x78\x83\x79\x83\x7a\x83\x7b\x83\x7c\x83\x7d\xd9\xd3\xd9\xd8\x83\x7e\x83\x80\x83\x81\xd9\xd9\x83\x82\x83\x83\x83\x84\x83\x85\x83\x86\x83\x87\xc8\xe5\x83\x88\x83\x89\x83\x8a\x83\x8b\x83\x8c\x83\x8d\x83\x8e\x83\x8f\x83\x90\x83\x91\x83\x92\x83\x93\x83\x94\x83\x95\xc0\xdc\x83\x96\x83\x97\x83\x98\x83\x99\x83\x9a\x83\x9b\x83\x9c\x83\x9d\x83\x9e\x83\x9f\x83\xa0\x83\xa1\x83\xa2\x83\xa3\x83\xa4\x83\xa5\x83\xa6\x83\xa7\x83\xa8\x83\xa9\x83\xaa\x83\xab\x83\xac\x83\xad\x83\xae\x83\xaf\x83\xb0\x83\xb1\x83\xb2\xb6\xf9\xd8\xa3\xd4\xca\x83\xb3\xd4\xaa\xd0\xd6\xb3\xe4\xd5\xd7\x83\xb4\xcf\xc8\xb9\xe2\x83\xb5\xbf\xcb\x83\xb6\xc3\xe2\x83\xb7\x83\xb8\x83\xb9\xb6\xd2\x83\xba\x83\xbb\xcd\xc3\xd9\xee\xd9\xf0\x83\xbc\x83\xbd\x83\xbe\xb5\xb3\x83\xbf\xb6\xb5\x83\xc0\x83\xc1\x83\xc2\x83\xc3\x83\xc4\xbe\xa4\x83\xc5\x83\xc6\xc8\xeb\x83\xc7\x83\xc8\xc8\xab\x83\xc9\x83\xca\xb0\xcb\xb9\xab\xc1\xf9\xd9\xe2\x83\xcb\xc0\xbc\xb9\xb2\x83\xcc\xb9\xd8\xd0\xcb\xb1\xf8\xc6\xe4\xbe\xdf\xb5\xe4\xd7\xc8\x83\xcd\xd1\xf8\xbc\xe6\xca\xde\x83\xce\x83\xcf", /* 5180 */ "\xbc\xbd\xd9\xe6\xd8\xe7\x83\xd0\x83\xd1\xc4\xda\x83\xd2\x83\xd3\xb8\xd4\xc8\xbd\x83\xd4\x83\xd5\xb2\xe1\xd4\xd9\x83\xd6\x83\xd7\x83\xd8\x83\xd9\xc3\xb0\x83\xda\x83\xdb\xc3\xe1\xda\xa2\xc8\xdf\x83\xdc\xd0\xb4\x83\xdd\xbe\xfc\xc5\xa9\x83\xde\x83\xdf\x83\xe0\xb9\xda\x83\xe1\xda\xa3\x83\xe2\xd4\xa9\xda\xa4\x83\xe3\x83\xe4\x83\xe5\x83\xe6\x83\xe7\xd9\xfb\xb6\xac\x83\xe8\x83\xe9\xb7\xeb\xb1\xf9\xd9\xfc\xb3\xe5\xbe\xf6\x83\xea\xbf\xf6\xd2\xb1\xc0\xe4\x83\xeb\x83\xec\x83\xed\xb6\xb3\xd9\xfe\xd9\xfd\x83\xee\x83\xef\xbe\xbb\x83\xf0\x83\xf1\x83\xf2\xc6\xe0\x83\xf3\xd7\xbc\xda\xa1\x83\xf4\xc1\xb9\x83\xf5\xb5\xf2\xc1\xe8\x83\xf6\x83\xf7\xbc\xf5\x83\xf8\xb4\xd5\x83\xf9\x83\xfa\x83\xfb\x83\xfc\x83\xfd\x83\xfe\x84\x40\x84\x41\x84\x42\xc1\xdd\x84\x43\xc4\xfd\x84\x44\x84\x45\xbc\xb8\xb7\xb2\x84\x46\x84\x47\xb7\xef\x84\x48\x84\x49\x84\x4a\x84\x4b\x84\x4c\x84\x4d\xd9\xec\x84\x4e\xc6\xbe\x84\x4f\xbf\xad\xbb\xcb\x84\x50\x84\x51\xb5\xca\x84\x52\xdb\xc9\xd0\xd7\x84\x53\xcd\xb9\xb0\xbc\xb3\xf6\xbb\xf7\xdb\xca\xba\xaf\x84\x54\xd4\xe4", /* 5200 */ "\xb5\xb6\xb5\xf3\xd8\xd6\xc8\xd0\x84\x55\x84\x56\xb7\xd6\xc7\xd0\xd8\xd7\x84\x57\xbf\xaf\x84\x58\x84\x59\xdb\xbb\xd8\xd8\x84\x5a\x84\x5b\xd0\xcc\xbb\xae\x84\x5c\x84\x5d\x84\x5e\xeb\xbe\xc1\xd0\xc1\xf5\xd4\xf2\xb8\xd5\xb4\xb4\x84\x5f\xb3\xf5\x84\x60\x84\x61\xc9\xbe\x84\x62\x84\x63\x84\x64\xc5\xd0\x84\x65\x84\x66\x84\x67\xc5\xd9\xc0\xfb\x84\x68\xb1\xf0\x84\x69\xd8\xd9\xb9\xce\x84\x6a\xb5\xbd\x84\x6b\x84\x6c\xd8\xda\x84\x6d\x84\x6e\xd6\xc6\xcb\xa2\xc8\xaf\xc9\xb2\xb4\xcc\xbf\xcc\x84\x6f\xb9\xf4\x84\x70\xd8\xdb\xd8\xdc\xb6\xe7\xbc\xc1\xcc\xea\x84\x71\x84\x72\x84\x73\x84\x74\x84\x75\x84\x76\xcf\xf7\x84\x77\xd8\xdd\xc7\xb0\x84\x78\x84\x79\xb9\xd0\xbd\xa3\x84\x7a\x84\x7b\xcc\xde\x84\x7c\xc6\xca\x84\x7d\x84\x7e\x84\x80\x84\x81\x84\x82\xd8\xe0\x84\x83\xd8\xde\x84\x84\x84\x85\xd8\xdf\x84\x86\x84\x87\x84\x88\xb0\xfe\x84\x89\xbe\xe7\x84\x8a\xca\xa3\xbc\xf4\x84\x8b\x84\x8c\x84\x8d\x84\x8e\xb8\xb1\x84\x8f\x84\x90\xb8\xee\x84\x91\x84\x92\x84\x93\x84\x94\x84\x95\x84\x96\x84\x97\x84\x98\x84\x99\x84\x9a\xd8\xe2\x84\x9b\xbd\xcb", /* 5280 */ "\x84\x9c\xd8\xe4\xd8\xe3\x84\x9d\x84\x9e\x84\x9f\x84\xa0\x84\xa1\xc5\xfc\x84\xa2\x84\xa3\x84\xa4\x84\xa5\x84\xa6\x84\xa7\x84\xa8\xd8\xe5\x84\xa9\x84\xaa\xd8\xe6\x84\xab\x84\xac\x84\xad\x84\xae\x84\xaf\x84\xb0\x84\xb1\xc1\xa6\x84\xb2\xc8\xb0\xb0\xec\xb9\xa6\xbc\xd3\xce\xf1\xdb\xbd\xc1\xd3\x84\xb3\x84\xb4\x84\xb5\x84\xb6\xb6\xaf\xd6\xfa\xc5\xac\xbd\xd9\xdb\xbe\xdb\xbf\x84\xb7\x84\xb8\x84\xb9\xc0\xf8\xbe\xa2\xc0\xcd\x84\xba\x84\xbb\x84\xbc\x84\xbd\x84\xbe\x84\xbf\x84\xc0\x84\xc1\x84\xc2\x84\xc3\xdb\xc0\xca\xc6\x84\xc4\x84\xc5\x84\xc6\xb2\xaa\x84\xc7\x84\xc8\x84\xc9\xd3\xc2\x84\xca\xc3\xe3\x84\xcb\xd1\xab\x84\xcc\x84\xcd\x84\xce\x84\xcf\xdb\xc2\x84\xd0\xc0\xd5\x84\xd1\x84\xd2\x84\xd3\xdb\xc3\x84\xd4\xbf\xb1\x84\xd5\x84\xd6\x84\xd7\x84\xd8\x84\xd9\x84\xda\xc4\xbc\x84\xdb\x84\xdc\x84\xdd\x84\xde\xc7\xda\x84\xdf\x84\xe0\x84\xe1\x84\xe2\x84\xe3\x84\xe4\x84\xe5\x84\xe6\x84\xe7\x84\xe8\x84\xe9\xdb\xc4\x84\xea\x84\xeb\x84\xec\x84\xed\x84\xee\x84\xef\x84\xf0\x84\xf1\xd9\xe8\xc9\xd7\x84\xf2\x84\xf3\x84\xf4\xb9\xb4\xce\xf0", /* 5300 */ "\xd4\xc8\x84\xf5\x84\xf6\x84\xf7\x84\xf8\xb0\xfc\xb4\xd2\x84\xf9\xd0\xd9\x84\xfa\x84\xfb\x84\xfc\x84\xfd\xd9\xe9\x84\xfe\xde\xcb\xd9\xeb\x85\x40\x85\x41\x85\x42\x85\x43\xd8\xb0\xbb\xaf\xb1\xb1\x85\x44\xb3\xd7\xd8\xce\x85\x45\x85\x46\xd4\xd1\x85\x47\x85\x48\xbd\xb3\xbf\xef\x85\x49\xcf\xbb\x85\x4a\x85\x4b\xd8\xd0\x85\x4c\x85\x4d\x85\x4e\xb7\xcb\x85\x4f\x85\x50\x85\x51\xd8\xd1\x85\x52\x85\x53\x85\x54\x85\x55\x85\x56\x85\x57\x85\x58\x85\x59\x85\x5a\x85\x5b\xc6\xa5\xc7\xf8\xd2\xbd\x85\x5c\x85\x5d\xd8\xd2\xc4\xe4\x85\x5e\xca\xae\x85\x5f\xc7\xa7\x85\x60\xd8\xa6\x85\x61\xc9\xfd\xce\xe7\xbb\xdc\xb0\xeb\x85\x62\x85\x63\x85\x64\xbb\xaa\xd0\xad\x85\x65\xb1\xb0\xd7\xe4\xd7\xbf\x85\x66\xb5\xa5\xc2\xf4\xc4\xcf\x85\x67\x85\x68\xb2\xa9\x85\x69\xb2\xb7\x85\x6a\xb1\xe5\xdf\xb2\xd5\xbc\xbf\xa8\xc2\xac\xd8\xd5\xc2\xb1\x85\x6b\xd8\xd4\xce\xd4\x85\x6c\xda\xe0\x85\x6d\xce\xc0\x85\x6e\x85\x6f\xd8\xb4\xc3\xae\xd3\xa1\xce\xa3\x85\x70\xbc\xb4\xc8\xb4\xc2\xd1\x85\x71\xbe\xed\xd0\xb6\x85\x72\xda\xe1\x85\x73\x85\x74\x85\x75\x85\x76\xc7\xe4", /* 5380 */ "\x85\x77\x85\x78\xb3\xa7\x85\x79\xb6\xf2\xcc\xfc\xc0\xfa\x85\x7a\x85\x7b\xc0\xf7\x85\x7c\xd1\xb9\xd1\xe1\xd8\xc7\x85\x7d\x85\x7e\x85\x80\x85\x81\x85\x82\x85\x83\x85\x84\xb2\xde\x85\x85\x85\x86\xc0\xe5\x85\x87\xba\xf1\x85\x88\x85\x89\xd8\xc8\x85\x8a\xd4\xad\x85\x8b\x85\x8c\xcf\xe1\xd8\xc9\x85\x8d\xd8\xca\xcf\xc3\x85\x8e\xb3\xf8\xbe\xc7\x85\x8f\x85\x90\x85\x91\x85\x92\xd8\xcb\x85\x93\x85\x94\x85\x95\x85\x96\x85\x97\x85\x98\x85\x99\xdb\xcc\x85\x9a\x85\x9b\x85\x9c\x85\x9d\xc8\xa5\x85\x9e\x85\x9f\x85\xa0\xcf\xd8\x85\xa1\xc8\xfe\xb2\xce\x85\xa2\x85\xa3\x85\xa4\x85\xa5\x85\xa6\xd3\xd6\xb2\xe6\xbc\xb0\xd3\xd1\xcb\xab\xb7\xb4\x85\xa7\x85\xa8\x85\xa9\xb7\xa2\x85\xaa\x85\xab\xca\xe5\x85\xac\xc8\xa1\xca\xdc\xb1\xe4\xd0\xf0\x85\xad\xc5\xd1\x85\xae\x85\xaf\x85\xb0\xdb\xc5\xb5\xfe\x85\xb1\x85\xb2\xbf\xda\xb9\xc5\xbe\xe4\xc1\xed\x85\xb3\xdf\xb6\xdf\xb5\xd6\xbb\xbd\xd0\xd5\xd9\xb0\xc8\xb6\xa3\xbf\xc9\xcc\xa8\xdf\xb3\xca\xb7\xd3\xd2\x85\xb4\xd8\xcf\xd2\xb6\xba\xc5\xcb\xbe\xcc\xbe\x85\xb5\xdf\xb7\xb5\xf0\xdf\xb4\x85\xb6\x85\xb7", /* 5400 */ "\x85\xb8\xd3\xf5\x85\xb9\xb3\xd4\xb8\xf7\x85\xba\xdf\xba\x85\xbb\xba\xcf\xbc\xaa\xb5\xf5\x85\xbc\xcd\xac\xc3\xfb\xba\xf3\xc0\xf4\xcd\xc2\xcf\xf2\xdf\xb8\xcf\xc5\x85\xbd\xc2\xc0\xdf\xb9\xc2\xf0\x85\xbe\x85\xbf\x85\xc0\xbe\xfd\x85\xc1\xc1\xdf\xcd\xcc\xd2\xf7\xb7\xcd\xdf\xc1\x85\xc2\xdf\xc4\x85\xc3\x85\xc4\xb7\xf1\xb0\xc9\xb6\xd6\xb7\xd4\x85\xc5\xba\xac\xcc\xfd\xbf\xd4\xcb\xb1\xc6\xf4\x85\xc6\xd6\xa8\xdf\xc5\x85\xc7\xce\xe2\xb3\xb3\x85\xc8\x85\xc9\xce\xfc\xb4\xb5\x85\xca\xce\xc7\xba\xf0\x85\xcb\xce\xe1\x85\xcc\xd1\xbd\x85\xcd\x85\xce\xdf\xc0\x85\xcf\x85\xd0\xb4\xf4\x85\xd1\xb3\xca\x85\xd2\xb8\xe6\xdf\xbb\x85\xd3\x85\xd4\x85\xd5\x85\xd6\xc4\xc5\x85\xd7\xdf\xbc\xdf\xbd\xdf\xbe\xc5\xbb\xdf\xbf\xdf\xc2\xd4\xb1\xdf\xc3\x85\xd8\xc7\xba\xce\xd8\x85\xd9\x85\xda\x85\xdb\x85\xdc\x85\xdd\xc4\xd8\x85\xde\xdf\xca\x85\xdf\xdf\xcf\x85\xe0\xd6\xdc\x85\xe1\x85\xe2\x85\xe3\x85\xe4\x85\xe5\x85\xe6\x85\xe7\x85\xe8\xdf\xc9\xdf\xda\xce\xb6\x85\xe9\xba\xc7\xdf\xce\xdf\xc8\xc5\xde\x85\xea\x85\xeb\xc9\xeb\xba\xf4\xc3\xfc\x85\xec\x85\xed", /* 5480 */ "\xbe\xd7\x85\xee\xdf\xc6\x85\xef\xdf\xcd\x85\xf0\xc5\xd8\x85\xf1\x85\xf2\x85\xf3\x85\xf4\xd5\xa6\xba\xcd\x85\xf5\xbe\xcc\xd3\xbd\xb8\xc0\x85\xf6\xd6\xe4\x85\xf7\xdf\xc7\xb9\xbe\xbf\xa7\x85\xf8\x85\xf9\xc1\xfc\xdf\xcb\xdf\xcc\x85\xfa\xdf\xd0\x85\xfb\x85\xfc\x85\xfd\x85\xfe\x86\x40\xdf\xdb\xdf\xe5\x86\x41\xdf\xd7\xdf\xd6\xd7\xc9\xdf\xe3\xdf\xe4\xe5\xeb\xd2\xa7\xdf\xd2\x86\x42\xbf\xa9\x86\x43\xd4\xdb\x86\x44\xbf\xc8\xdf\xd4\x86\x45\x86\x46\x86\x47\xcf\xcc\x86\x48\x86\x49\xdf\xdd\x86\x4a\xd1\xca\x86\x4b\xdf\xde\xb0\xa7\xc6\xb7\xdf\xd3\x86\x4c\xba\xe5\x86\x4d\xb6\xdf\xcd\xdb\xb9\xfe\xd4\xd5\x86\x4e\x86\x4f\xdf\xdf\xcf\xec\xb0\xa5\xdf\xe7\xdf\xd1\xd1\xc6\xdf\xd5\xdf\xd8\xdf\xd9\xdf\xdc\x86\x50\xbb\xa9\x86\x51\xdf\xe0\xdf\xe1\x86\x52\xdf\xe2\xdf\xe6\xdf\xe8\xd3\xb4\x86\x53\x86\x54\x86\x55\x86\x56\x86\x57\xb8\xe7\xc5\xb6\xdf\xea\xc9\xda\xc1\xa8\xc4\xc4\x86\x58\x86\x59\xbf\xde\xcf\xf8\x86\x5a\x86\x5b\x86\x5c\xd5\xdc\xdf\xee\x86\x5d\x86\x5e\x86\x5f\x86\x60\x86\x61\x86\x62\xb2\xb8\x86\x63\xba\xdf\xdf\xec\x86\x64\xdb\xc1", /* 5500 */ "\x86\x65\xd1\xe4\x86\x66\x86\x67\x86\x68\x86\x69\xcb\xf4\xb4\xbd\x86\x6a\xb0\xa6\x86\x6b\x86\x6c\x86\x6d\x86\x6e\x86\x6f\xdf\xf1\xcc\xc6\xdf\xf2\x86\x70\x86\x71\xdf\xed\x86\x72\x86\x73\x86\x74\x86\x75\x86\x76\x86\x77\xdf\xe9\x86\x78\x86\x79\x86\x7a\x86\x7b\xdf\xeb\x86\x7c\xdf\xef\xdf\xf0\xbb\xbd\x86\x7d\x86\x7e\xdf\xf3\x86\x80\x86\x81\xdf\xf4\x86\x82\xbb\xa3\x86\x83\xca\xdb\xce\xa8\xe0\xa7\xb3\xaa\x86\x84\xe0\xa6\x86\x85\x86\x86\x86\x87\xe0\xa1\x86\x88\x86\x89\x86\x8a\x86\x8b\xdf\xfe\x86\x8c\xcd\xd9\xdf\xfc\x86\x8d\xdf\xfa\x86\x8e\xbf\xd0\xd7\xc4\x86\x8f\xc9\xcc\x86\x90\x86\x91\xdf\xf8\xb0\xa1\x86\x92\x86\x93\x86\x94\x86\x95\x86\x96\xdf\xfd\x86\x97\x86\x98\x86\x99\x86\x9a\xdf\xfb\xe0\xa2\x86\x9b\x86\x9c\x86\x9d\x86\x9e\x86\x9f\xe0\xa8\x86\xa0\x86\xa1\x86\xa2\x86\xa3\xb7\xc8\x86\xa4\x86\xa5\xc6\xa1\xc9\xb6\xc0\xb2\xdf\xf5\x86\xa6\x86\xa7\xc5\xbe\x86\xa8\xd8\xc4\xdf\xf9\xc4\xf6\x86\xa9\x86\xaa\x86\xab\x86\xac\x86\xad\x86\xae\xe0\xa3\xe0\xa4\xe0\xa5\xd0\xa5\x86\xaf\x86\xb0\xe0\xb4\xcc\xe4\x86\xb1\xe0\xb1\x86\xb2", /* 5580 */ "\xbf\xa6\xe0\xaf\xce\xb9\xe0\xab\xc9\xc6\x86\xb3\x86\xb4\xc0\xae\xe0\xae\xba\xed\xba\xb0\xe0\xa9\x86\xb5\x86\xb6\x86\xb7\xdf\xf6\x86\xb8\xe0\xb3\x86\xb9\x86\xba\xe0\xb8\x86\xbb\x86\xbc\x86\xbd\xb4\xad\xe0\xb9\x86\xbe\x86\xbf\xcf\xb2\xba\xc8\x86\xc0\xe0\xb0\x86\xc1\x86\xc2\x86\xc3\x86\xc4\x86\xc5\x86\xc6\x86\xc7\xd0\xfa\x86\xc8\x86\xc9\x86\xca\x86\xcb\x86\xcc\x86\xcd\x86\xce\x86\xcf\x86\xd0\xe0\xac\x86\xd1\xd4\xfb\x86\xd2\xdf\xf7\x86\xd3\xc5\xe7\x86\xd4\xe0\xad\x86\xd5\xd3\xf7\x86\xd6\xe0\xb6\xe0\xb7\x86\xd7\x86\xd8\x86\xd9\x86\xda\x86\xdb\xe0\xc4\xd0\xe1\x86\xdc\x86\xdd\x86\xde\xe0\xbc\x86\xdf\x86\xe0\xe0\xc9\xe0\xca\x86\xe1\x86\xe2\x86\xe3\xe0\xbe\xe0\xaa\xc9\xa4\xe0\xc1\x86\xe4\xe0\xb2\x86\xe5\x86\xe6\x86\xe7\x86\xe8\x86\xe9\xca\xc8\xe0\xc3\x86\xea\xe0\xb5\x86\xeb\xce\xcb\x86\xec\xcb\xc3\xe0\xcd\xe0\xc6\xe0\xc2\x86\xed\xe0\xcb\x86\xee\xe0\xba\xe0\xbf\xe0\xc0\x86\xef\x86\xf0\xe0\xc5\x86\xf1\x86\xf2\xe0\xc7\xe0\xc8\x86\xf3\xe0\xcc\x86\xf4\xe0\xbb\x86\xf5\x86\xf6\x86\xf7\x86\xf8\x86\xf9\xcb\xd4\xe0\xd5\x86\xfa", /* 5600 */ "\xe0\xd6\xe0\xd2\x86\xfb\x86\xfc\x86\xfd\x86\xfe\x87\x40\x87\x41\xe0\xd0\xbc\xce\x87\x42\x87\x43\xe0\xd1\x87\x44\xb8\xc2\xd8\xc5\x87\x45\x87\x46\x87\x47\x87\x48\x87\x49\x87\x4a\x87\x4b\x87\x4c\xd0\xea\x87\x4d\x87\x4e\xc2\xef\x87\x4f\x87\x50\xe0\xcf\xe0\xbd\x87\x51\x87\x52\x87\x53\xe0\xd4\xe0\xd3\x87\x54\x87\x55\xe0\xd7\x87\x56\x87\x57\x87\x58\x87\x59\xe0\xdc\xe0\xd8\x87\x5a\x87\x5b\x87\x5c\xd6\xf6\xb3\xb0\x87\x5d\xd7\xec\x87\x5e\xcb\xbb\x87\x5f\x87\x60\xe0\xda\x87\x61\xce\xfb\x87\x62\x87\x63\x87\x64\xba\xd9\x87\x65\x87\x66\x87\x67\x87\x68\x87\x69\x87\x6a\x87\x6b\x87\x6c\x87\x6d\x87\x6e\x87\x6f\x87\x70\xe0\xe1\xe0\xdd\xd2\xad\x87\x71\x87\x72\x87\x73\x87\x74\x87\x75\xe0\xe2\x87\x76\x87\x77\xe0\xdb\xe0\xd9\xe0\xdf\x87\x78\x87\x79\xe0\xe0\x87\x7a\x87\x7b\x87\x7c\x87\x7d\x87\x7e\xe0\xde\x87\x80\xe0\xe4\x87\x81\x87\x82\x87\x83\xc6\xf7\xd8\xac\xd4\xeb\xe0\xe6\xca\xc9\x87\x84\x87\x85\x87\x86\x87\x87\xe0\xe5\x87\x88\x87\x89\x87\x8a\x87\x8b\xb8\xc1\x87\x8c\x87\x8d\x87\x8e\x87\x8f\xe0\xe7\xe0\xe8\x87\x90\x87\x91\x87\x92", /* 5680 */ "\x87\x93\x87\x94\x87\x95\x87\x96\x87\x97\xe0\xe9\xe0\xe3\x87\x98\x87\x99\x87\x9a\x87\x9b\x87\x9c\x87\x9d\x87\x9e\xba\xbf\xcc\xe7\x87\x9f\x87\xa0\x87\xa1\xe0\xea\x87\xa2\x87\xa3\x87\xa4\x87\xa5\x87\xa6\x87\xa7\x87\xa8\x87\xa9\x87\xaa\x87\xab\x87\xac\x87\xad\x87\xae\x87\xaf\x87\xb0\xcf\xf9\x87\xb1\x87\xb2\x87\xb3\x87\xb4\x87\xb5\x87\xb6\x87\xb7\x87\xb8\x87\xb9\x87\xba\x87\xbb\xe0\xeb\x87\xbc\x87\xbd\x87\xbe\x87\xbf\x87\xc0\x87\xc1\x87\xc2\xc8\xc2\x87\xc3\x87\xc4\x87\xc5\x87\xc6\xbd\xc0\x87\xc7\x87\xc8\x87\xc9\x87\xca\x87\xcb\x87\xcc\x87\xcd\x87\xce\x87\xcf\x87\xd0\x87\xd1\x87\xd2\x87\xd3\xc4\xd2\x87\xd4\x87\xd5\x87\xd6\x87\xd7\x87\xd8\x87\xd9\x87\xda\x87\xdb\x87\xdc\xe0\xec\x87\xdd\x87\xde\xe0\xed\x87\xdf\x87\xe0\xc7\xf4\xcb\xc4\x87\xe1\xe0\xee\xbb\xd8\xd8\xb6\xd2\xf2\xe0\xef\xcd\xc5\x87\xe2\xb6\xda\x87\xe3\x87\xe4\x87\xe5\x87\xe6\x87\xe7\x87\xe8\xe0\xf1\x87\xe9\xd4\xb0\x87\xea\x87\xeb\xc0\xa7\xb4\xd1\x87\xec\x87\xed\xce\xa7\xe0\xf0\x87\xee\x87\xef\x87\xf0\xe0\xf2\xb9\xcc\x87\xf1\x87\xf2\xb9\xfa\xcd\xbc\xe0\xf3", /* 5700 */ "\x87\xf3\x87\xf4\x87\xf5\xc6\xd4\xe0\xf4\x87\xf6\xd4\xb2\x87\xf7\xc8\xa6\xe0\xf6\xe0\xf5\x87\xf8\x87\xf9\x87\xfa\x87\xfb\x87\xfc\x87\xfd\x87\xfe\x88\x40\x88\x41\x88\x42\x88\x43\x88\x44\x88\x45\x88\x46\x88\x47\x88\x48\x88\x49\xe0\xf7\x88\x4a\x88\x4b\xcd\xc1\x88\x4c\x88\x4d\x88\x4e\xca\xa5\x88\x4f\x88\x50\x88\x51\x88\x52\xd4\xda\xdb\xd7\xdb\xd9\x88\x53\xdb\xd8\xb9\xe7\xdb\xdc\xdb\xdd\xb5\xd8\x88\x54\x88\x55\xdb\xda\x88\x56\x88\x57\x88\x58\x88\x59\x88\x5a\xdb\xdb\xb3\xa1\xdb\xdf\x88\x5b\x88\x5c\xbb\xf8\x88\x5d\xd6\xb7\x88\x5e\xdb\xe0\x88\x5f\x88\x60\x88\x61\x88\x62\xbe\xf9\x88\x63\x88\x64\xb7\xbb\x88\x65\xdb\xd0\xcc\xae\xbf\xb2\xbb\xb5\xd7\xf8\xbf\xd3\x88\x66\x88\x67\x88\x68\x88\x69\x88\x6a\xbf\xe9\x88\x6b\x88\x6c\xbc\xe1\xcc\xb3\xdb\xde\xb0\xd3\xce\xeb\xb7\xd8\xd7\xb9\xc6\xc2\x88\x6d\x88\x6e\xc0\xa4\x88\x6f\xcc\xb9\x88\x70\xdb\xe7\xdb\xe1\xc6\xba\xdb\xe3\x88\x71\xdb\xe8\x88\x72\xc5\xf7\x88\x73\x88\x74\x88\x75\xdb\xea\x88\x76\x88\x77\xdb\xe9\xbf\xc0\x88\x78\x88\x79\x88\x7a\xdb\xe6\xdb\xe5\x88\x7b\x88\x7c\x88\x7d", /* 5780 */ "\x88\x7e\x88\x80\xb4\xb9\xc0\xac\xc2\xa2\xdb\xe2\xdb\xe4\x88\x81\x88\x82\x88\x83\x88\x84\xd0\xcd\xdb\xed\x88\x85\x88\x86\x88\x87\x88\x88\x88\x89\xc0\xdd\xdb\xf2\x88\x8a\x88\x8b\x88\x8c\x88\x8d\x88\x8e\x88\x8f\x88\x90\xb6\xe2\x88\x91\x88\x92\x88\x93\x88\x94\xdb\xf3\xdb\xd2\xb9\xb8\xd4\xab\xdb\xec\x88\x95\xbf\xd1\xdb\xf0\x88\x96\xdb\xd1\x88\x97\xb5\xe6\x88\x98\xdb\xeb\xbf\xe5\x88\x99\x88\x9a\x88\x9b\xdb\xee\x88\x9c\xdb\xf1\x88\x9d\x88\x9e\x88\x9f\xdb\xf9\x88\xa0\x88\xa1\x88\xa2\x88\xa3\x88\xa4\x88\xa5\x88\xa6\x88\xa7\x88\xa8\xb9\xa1\xb0\xa3\x88\xa9\x88\xaa\x88\xab\x88\xac\x88\xad\x88\xae\x88\xaf\xc2\xf1\x88\xb0\x88\xb1\xb3\xc7\xdb\xef\x88\xb2\x88\xb3\xdb\xf8\x88\xb4\xc6\xd2\xdb\xf4\x88\xb5\x88\xb6\xdb\xf5\xdb\xf7\xdb\xf6\x88\xb7\x88\xb8\xdb\xfe\x88\xb9\xd3\xf2\xb2\xba\x88\xba\x88\xbb\x88\xbc\xdb\xfd\x88\xbd\x88\xbe\x88\xbf\x88\xc0\x88\xc1\x88\xc2\x88\xc3\x88\xc4\xdc\xa4\x88\xc5\xdb\xfb\x88\xc6\x88\xc7\x88\xc8\x88\xc9\xdb\xfa\x88\xca\x88\xcb\x88\xcc\xdb\xfc\xc5\xe0\xbb\xf9\x88\xcd\x88\xce\xdc\xa3\x88\xcf\x88\xd0", /* 5800 */ "\xdc\xa5\x88\xd1\xcc\xc3\x88\xd2\x88\xd3\x88\xd4\xb6\xd1\xdd\xc0\x88\xd5\x88\xd6\x88\xd7\xdc\xa1\x88\xd8\xdc\xa2\x88\xd9\x88\xda\x88\xdb\xc7\xb5\x88\xdc\x88\xdd\x88\xde\xb6\xe9\x88\xdf\x88\xe0\x88\xe1\xdc\xa7\x88\xe2\x88\xe3\x88\xe4\x88\xe5\xdc\xa6\x88\xe6\xdc\xa9\xb1\xa4\x88\xe7\x88\xe8\xb5\xcc\x88\xe9\x88\xea\x88\xeb\x88\xec\x88\xed\xbf\xb0\x88\xee\x88\xef\x88\xf0\x88\xf1\x88\xf2\xd1\xdf\x88\xf3\x88\xf4\x88\xf5\x88\xf6\xb6\xc2\x88\xf7\x88\xf8\x88\xf9\x88\xfa\x88\xfb\x88\xfc\x88\xfd\x88\xfe\x89\x40\x89\x41\x89\x42\x89\x43\x89\x44\x89\x45\xdc\xa8\x89\x46\x89\x47\x89\x48\x89\x49\x89\x4a\x89\x4b\x89\x4c\xcb\xfa\xeb\xf3\x89\x4d\x89\x4e\x89\x4f\xcb\xdc\x89\x50\x89\x51\xcb\xfe\x89\x52\x89\x53\x89\x54\xcc\xc1\x89\x55\x89\x56\x89\x57\x89\x58\x89\x59\xc8\xfb\x89\x5a\x89\x5b\x89\x5c\x89\x5d\x89\x5e\x89\x5f\xdc\xaa\x89\x60\x89\x61\x89\x62\x89\x63\x89\x64\xcc\xee\xdc\xab\x89\x65\x89\x66\x89\x67\x89\x68\x89\x69\x89\x6a\x89\x6b\x89\x6c\x89\x6d\x89\x6e\x89\x6f\x89\x70\x89\x71\x89\x72\x89\x73\x89\x74\x89\x75\xdb\xd3\x89\x76", /* 5880 */ "\xdc\xaf\xdc\xac\x89\x77\xbe\xb3\x89\x78\xca\xfb\x89\x79\x89\x7a\x89\x7b\xdc\xad\x89\x7c\x89\x7d\x89\x7e\x89\x80\x89\x81\x89\x82\x89\x83\x89\x84\xc9\xca\xc4\xb9\x89\x85\x89\x86\x89\x87\x89\x88\x89\x89\xc7\xbd\xdc\xae\x89\x8a\x89\x8b\x89\x8c\xd4\xf6\xd0\xe6\x89\x8d\x89\x8e\x89\x8f\x89\x90\x89\x91\x89\x92\x89\x93\x89\x94\xc4\xab\xb6\xd5\x89\x95\x89\x96\x89\x97\x89\x98\x89\x99\x89\x9a\x89\x9b\x89\x9c\x89\x9d\x89\x9e\x89\x9f\x89\xa0\x89\xa1\x89\xa2\x89\xa3\x89\xa4\x89\xa5\x89\xa6\xdb\xd4\x89\xa7\x89\xa8\x89\xa9\x89\xaa\xb1\xda\x89\xab\x89\xac\x89\xad\xdb\xd5\x89\xae\x89\xaf\x89\xb0\x89\xb1\x89\xb2\x89\xb3\x89\xb4\x89\xb5\x89\xb6\x89\xb7\x89\xb8\xdb\xd6\x89\xb9\x89\xba\x89\xbb\xba\xbe\x89\xbc\x89\xbd\x89\xbe\x89\xbf\x89\xc0\x89\xc1\x89\xc2\x89\xc3\x89\xc4\x89\xc5\x89\xc6\x89\xc7\x89\xc8\x89\xc9\xc8\xc0\x89\xca\x89\xcb\x89\xcc\x89\xcd\x89\xce\x89\xcf\xca\xbf\xc8\xc9\x89\xd0\xd7\xb3\x89\xd1\xc9\xf9\x89\xd2\x89\xd3\xbf\xc7\x89\xd4\x89\xd5\xba\xf8\x89\xd6\x89\xd7\xd2\xbc\x89\xd8\x89\xd9\x89\xda\x89\xdb\x89\xdc\x89\xdd", /* 5900 */ "\x89\xde\x89\xdf\xe2\xba\x89\xe0\xb4\xa6\x89\xe1\x89\xe2\xb1\xb8\x89\xe3\x89\xe4\x89\xe5\x89\xe6\x89\xe7\xb8\xb4\x89\xe8\xcf\xc4\x89\xe9\x89\xea\x89\xeb\x89\xec\xd9\xe7\xcf\xa6\xcd\xe2\x89\xed\x89\xee\xd9\xed\xb6\xe0\x89\xef\xd2\xb9\x89\xf0\x89\xf1\xb9\xbb\x89\xf2\x89\xf3\x89\xf4\x89\xf5\xe2\xb9\xe2\xb7\x89\xf6\xb4\xf3\x89\xf7\xcc\xec\xcc\xab\xb7\xf2\x89\xf8\xd8\xb2\xd1\xeb\xba\xbb\x89\xf9\xca\xa7\x89\xfa\x89\xfb\xcd\xb7\x89\xfc\x89\xfd\xd2\xc4\xbf\xe4\xbc\xd0\xb6\xe1\x89\xfe\xde\xc5\x8a\x40\x8a\x41\x8a\x42\x8a\x43\xde\xc6\xdb\xbc\x8a\x44\xd1\xd9\x8a\x45\x8a\x46\xc6\xe6\xc4\xce\xb7\xee\x8a\x47\xb7\xdc\x8a\x48\x8a\x49\xbf\xfc\xd7\xe0\x8a\x4a\xc6\xf5\x8a\x4b\x8a\x4c\xb1\xbc\xde\xc8\xbd\xb1\xcc\xd7\xde\xca\x8a\x4d\xde\xc9\x8a\x4e\x8a\x4f\x8a\x50\x8a\x51\x8a\x52\xb5\xec\x8a\x53\xc9\xdd\x8a\x54\x8a\x55\xb0\xc2\x8a\x56\x8a\x57\x8a\x58\x8a\x59\x8a\x5a\x8a\x5b\x8a\x5c\x8a\x5d\x8a\x5e\x8a\x5f\x8a\x60\x8a\x61\x8a\x62\xc5\xae\xc5\xab\x8a\x63\xc4\xcc\x8a\x64\xbc\xe9\xcb\xfd\x8a\x65\x8a\x66\x8a\x67\xba\xc3\x8a\x68\x8a\x69", /* 5980 */ "\x8a\x6a\xe5\xf9\xc8\xe7\xe5\xfa\xcd\xfd\x8a\x6b\xd7\xb1\xb8\xbe\xc2\xe8\x8a\x6c\xc8\xd1\x8a\x6d\x8a\x6e\xe5\xfb\x8a\x6f\x8a\x70\x8a\x71\x8a\x72\xb6\xca\xbc\xcb\x8a\x73\x8a\x74\xd1\xfd\xe6\xa1\x8a\x75\xc3\xee\x8a\x76\x8a\x77\x8a\x78\x8a\x79\xe6\xa4\x8a\x7a\x8a\x7b\x8a\x7c\x8a\x7d\xe5\xfe\xe6\xa5\xcd\xd7\x8a\x7e\x8a\x80\xb7\xc1\xe5\xfc\xe5\xfd\xe6\xa3\x8a\x81\x8a\x82\xc4\xdd\xe6\xa8\x8a\x83\x8a\x84\xe6\xa7\x8a\x85\x8a\x86\x8a\x87\x8a\x88\x8a\x89\x8a\x8a\xc3\xc3\x8a\x8b\xc6\xde\x8a\x8c\x8a\x8d\xe6\xaa\x8a\x8e\x8a\x8f\x8a\x90\x8a\x91\x8a\x92\x8a\x93\x8a\x94\xc4\xb7\x8a\x95\x8a\x96\x8a\x97\xe6\xa2\xca\xbc\x8a\x98\x8a\x99\x8a\x9a\x8a\x9b\xbd\xe3\xb9\xc3\xe6\xa6\xd0\xd5\xce\xaf\x8a\x9c\x8a\x9d\xe6\xa9\xe6\xb0\x8a\x9e\xd2\xa6\x8a\x9f\xbd\xaa\xe6\xad\x8a\xa0\x8a\xa1\x8a\xa2\x8a\xa3\x8a\xa4\xe6\xaf\x8a\xa5\xc0\xd1\x8a\xa6\x8a\xa7\xd2\xcc\x8a\xa8\x8a\xa9\x8a\xaa\xbc\xa7\x8a\xab\x8a\xac\x8a\xad\x8a\xae\x8a\xaf\x8a\xb0\x8a\xb1\x8a\xb2\x8a\xb3\x8a\xb4\x8a\xb5\x8a\xb6\xe6\xb1\x8a\xb7\xd2\xf6\x8a\xb8\x8a\xb9\x8a\xba\xd7\xcb", /* 5a00 */ "\x8a\xbb\xcd\xfe\x8a\xbc\xcd\xde\xc2\xa6\xe6\xab\xe6\xac\xbd\xbf\xe6\xae\xe6\xb3\x8a\xbd\x8a\xbe\xe6\xb2\x8a\xbf\x8a\xc0\x8a\xc1\x8a\xc2\xe6\xb6\x8a\xc3\xe6\xb8\x8a\xc4\x8a\xc5\x8a\xc6\x8a\xc7\xc4\xef\x8a\xc8\x8a\xc9\x8a\xca\xc4\xc8\x8a\xcb\x8a\xcc\xbe\xea\xc9\xef\x8a\xcd\x8a\xce\xe6\xb7\x8a\xcf\xb6\xf0\x8a\xd0\x8a\xd1\x8a\xd2\xc3\xe4\x8a\xd3\x8a\xd4\x8a\xd5\x8a\xd6\x8a\xd7\x8a\xd8\x8a\xd9\xd3\xe9\xe6\xb4\x8a\xda\xe6\xb5\x8a\xdb\xc8\xa2\x8a\xdc\x8a\xdd\x8a\xde\x8a\xdf\x8a\xe0\xe6\xbd\x8a\xe1\x8a\xe2\x8a\xe3\xe6\xb9\x8a\xe4\x8a\xe5\x8a\xe6\x8a\xe7\x8a\xe8\xc6\xc5\x8a\xe9\x8a\xea\xcd\xf1\xe6\xbb\x8a\xeb\x8a\xec\x8a\xed\x8a\xee\x8a\xef\x8a\xf0\x8a\xf1\x8a\xf2\x8a\xf3\x8a\xf4\xe6\xbc\x8a\xf5\x8a\xf6\x8a\xf7\x8a\xf8\xbb\xe9\x8a\xf9\x8a\xfa\x8a\xfb\x8a\xfc\x8a\xfd\x8a\xfe\x8b\x40\xe6\xbe\x8b\x41\x8b\x42\x8b\x43\x8b\x44\xe6\xba\x8b\x45\x8b\x46\xc0\xb7\x8b\x47\x8b\x48\x8b\x49\x8b\x4a\x8b\x4b\x8b\x4c\x8b\x4d\x8b\x4e\x8b\x4f\xd3\xa4\xe6\xbf\xc9\xf4\xe6\xc3\x8b\x50\x8b\x51\xe6\xc4\x8b\x52\x8b\x53\x8b\x54\x8b\x55\xd0\xf6", /* 5a80 */ "\x8b\x56\x8b\x57\x8b\x58\x8b\x59\x8b\x5a\x8b\x5b\x8b\x5c\x8b\x5d\x8b\x5e\x8b\x5f\x8b\x60\x8b\x61\x8b\x62\x8b\x63\x8b\x64\x8b\x65\x8b\x66\x8b\x67\xc3\xbd\x8b\x68\x8b\x69\x8b\x6a\x8b\x6b\x8b\x6c\x8b\x6d\x8b\x6e\xc3\xc4\xe6\xc2\x8b\x6f\x8b\x70\x8b\x71\x8b\x72\x8b\x73\x8b\x74\x8b\x75\x8b\x76\x8b\x77\x8b\x78\x8b\x79\x8b\x7a\x8b\x7b\x8b\x7c\xe6\xc1\x8b\x7d\x8b\x7e\x8b\x80\x8b\x81\x8b\x82\x8b\x83\x8b\x84\xe6\xc7\xcf\xb1\x8b\x85\xeb\xf4\x8b\x86\x8b\x87\xe6\xca\x8b\x88\x8b\x89\x8b\x8a\x8b\x8b\x8b\x8c\xe6\xc5\x8b\x8d\x8b\x8e\xbc\xde\xc9\xa9\x8b\x8f\x8b\x90\x8b\x91\x8b\x92\x8b\x93\x8b\x94\xbc\xb5\x8b\x95\x8b\x96\xcf\xd3\x8b\x97\x8b\x98\x8b\x99\x8b\x9a\x8b\x9b\xe6\xc8\x8b\x9c\xe6\xc9\x8b\x9d\xe6\xce\x8b\x9e\xe6\xd0\x8b\x9f\x8b\xa0\x8b\xa1\xe6\xd1\x8b\xa2\x8b\xa3\x8b\xa4\xe6\xcb\xb5\xd5\x8b\xa5\xe6\xcc\x8b\xa6\x8b\xa7\xe6\xcf\x8b\xa8\x8b\xa9\xc4\xdb\x8b\xaa\xe6\xc6\x8b\xab\x8b\xac\x8b\xad\x8b\xae\x8b\xaf\xe6\xcd\x8b\xb0\x8b\xb1\x8b\xb2\x8b\xb3\x8b\xb4\x8b\xb5\x8b\xb6\x8b\xb7\x8b\xb8\x8b\xb9\x8b\xba\x8b\xbb\x8b\xbc\x8b\xbd", /* 5b00 */ "\x8b\xbe\x8b\xbf\x8b\xc0\x8b\xc1\x8b\xc2\x8b\xc3\x8b\xc4\x8b\xc5\x8b\xc6\xe6\xd2\x8b\xc7\x8b\xc8\x8b\xc9\x8b\xca\x8b\xcb\x8b\xcc\x8b\xcd\x8b\xce\x8b\xcf\x8b\xd0\x8b\xd1\x8b\xd2\xe6\xd4\xe6\xd3\x8b\xd3\x8b\xd4\x8b\xd5\x8b\xd6\x8b\xd7\x8b\xd8\x8b\xd9\x8b\xda\x8b\xdb\x8b\xdc\x8b\xdd\x8b\xde\x8b\xdf\x8b\xe0\x8b\xe1\x8b\xe2\x8b\xe3\x8b\xe4\x8b\xe5\x8b\xe6\x8b\xe7\x8b\xe8\x8b\xe9\x8b\xea\x8b\xeb\x8b\xec\xe6\xd5\x8b\xed\xd9\xf8\x8b\xee\x8b\xef\xe6\xd6\x8b\xf0\x8b\xf1\x8b\xf2\x8b\xf3\x8b\xf4\x8b\xf5\x8b\xf6\x8b\xf7\xe6\xd7\x8b\xf8\x8b\xf9\x8b\xfa\x8b\xfb\x8b\xfc\x8b\xfd\x8b\xfe\x8c\x40\x8c\x41\x8c\x42\x8c\x43\x8c\x44\x8c\x45\x8c\x46\x8c\x47\xd7\xd3\xe6\xdd\x8c\x48\xe6\xde\xbf\xd7\xd4\xd0\x8c\x49\xd7\xd6\xb4\xe6\xcb\xef\xe6\xda\xd8\xc3\xd7\xce\xd0\xa2\x8c\x4a\xc3\xcf\x8c\x4b\x8c\x4c\xe6\xdf\xbc\xbe\xb9\xc2\xe6\xdb\xd1\xa7\x8c\x4d\x8c\x4e\xba\xa2\xc2\xcf\x8c\x4f\xd8\xab\x8c\x50\x8c\x51\x8c\x52\xca\xeb\xe5\xee\x8c\x53\xe6\xdc\x8c\x54\xb7\xf5\x8c\x55\x8c\x56\x8c\x57\x8c\x58\xc8\xe6\x8c\x59\x8c\x5a\xc4\xf5\x8c\x5b\x8c\x5c", /* 5b80 */ "\xe5\xb2\xc4\xfe\x8c\x5d\xcb\xfc\xe5\xb3\xd5\xac\x8c\x5e\xd3\xee\xca\xd8\xb0\xb2\x8c\x5f\xcb\xce\xcd\xea\x8c\x60\x8c\x61\xba\xea\x8c\x62\x8c\x63\x8c\x64\xe5\xb5\x8c\x65\xe5\xb4\x8c\x66\xd7\xda\xb9\xd9\xd6\xe6\xb6\xa8\xcd\xf0\xd2\xcb\xb1\xa6\xca\xb5\x8c\x67\xb3\xe8\xc9\xf3\xbf\xcd\xd0\xfb\xca\xd2\xe5\xb6\xbb\xc2\x8c\x68\x8c\x69\x8c\x6a\xcf\xdc\xb9\xac\x8c\x6b\x8c\x6c\x8c\x6d\x8c\x6e\xd4\xd7\x8c\x6f\x8c\x70\xba\xa6\xd1\xe7\xcf\xfc\xbc\xd2\x8c\x71\xe5\xb7\xc8\xdd\x8c\x72\x8c\x73\x8c\x74\xbf\xed\xb1\xf6\xcb\xde\x8c\x75\x8c\x76\xbc\xc5\x8c\x77\xbc\xc4\xd2\xfa\xc3\xdc\xbf\xdc\x8c\x78\x8c\x79\x8c\x7a\x8c\x7b\xb8\xbb\x8c\x7c\x8c\x7d\x8c\x7e\xc3\xc2\x8c\x80\xba\xae\xd4\xa2\x8c\x81\x8c\x82\x8c\x83\x8c\x84\x8c\x85\x8c\x86\x8c\x87\x8c\x88\x8c\x89\xc7\xde\xc4\xaf\xb2\xec\x8c\x8a\xb9\xd1\x8c\x8b\x8c\x8c\xe5\xbb\xc1\xc8\x8c\x8d\x8c\x8e\xd5\xaf\x8c\x8f\x8c\x90\x8c\x91\x8c\x92\x8c\x93\xe5\xbc\x8c\x94\xe5\xbe\x8c\x95\x8c\x96\x8c\x97\x8c\x98\x8c\x99\x8c\x9a\x8c\x9b\xb4\xe7\xb6\xd4\xcb\xc2\xd1\xb0\xb5\xbc\x8c\x9c\x8c\x9d\xca\xd9", /* 5c00 */ "\x8c\x9e\xb7\xe2\x8c\x9f\x8c\xa0\xc9\xe4\x8c\xa1\xbd\xab\x8c\xa2\x8c\xa3\xce\xbe\xd7\xf0\x8c\xa4\x8c\xa5\x8c\xa6\x8c\xa7\xd0\xa1\x8c\xa8\xc9\xd9\x8c\xa9\x8c\xaa\xb6\xfb\xe6\xd8\xbc\xe2\x8c\xab\xb3\xbe\x8c\xac\xc9\xd0\x8c\xad\xe6\xd9\xb3\xa2\x8c\xae\x8c\xaf\x8c\xb0\x8c\xb1\xde\xcc\x8c\xb2\xd3\xc8\xde\xcd\x8c\xb3\xd2\xa2\x8c\xb4\x8c\xb5\x8c\xb6\x8c\xb7\xde\xce\x8c\xb8\x8c\xb9\x8c\xba\x8c\xbb\xbe\xcd\x8c\xbc\x8c\xbd\xde\xcf\x8c\xbe\x8c\xbf\x8c\xc0\xca\xac\xd2\xfc\xb3\xdf\xe5\xea\xc4\xe1\xbe\xa1\xce\xb2\xc4\xf2\xbe\xd6\xc6\xa8\xb2\xe3\x8c\xc1\x8c\xc2\xbe\xd3\x8c\xc3\x8c\xc4\xc7\xfc\xcc\xeb\xbd\xec\xce\xdd\x8c\xc5\x8c\xc6\xca\xba\xc6\xc1\xe5\xec\xd0\xbc\x8c\xc7\x8c\xc8\x8c\xc9\xd5\xb9\x8c\xca\x8c\xcb\x8c\xcc\xe5\xed\x8c\xcd\x8c\xce\x8c\xcf\x8c\xd0\xca\xf4\x8c\xd1\xcd\xc0\xc2\xc5\x8c\xd2\xe5\xef\x8c\xd3\xc2\xc4\xe5\xf0\x8c\xd4\x8c\xd5\x8c\xd6\x8c\xd7\x8c\xd8\x8c\xd9\x8c\xda\xe5\xf8\xcd\xcd\x8c\xdb\xc9\xbd\x8c\xdc\x8c\xdd\x8c\xde\x8c\xdf\x8c\xe0\x8c\xe1\x8c\xe2\xd2\xd9\xe1\xa8\x8c\xe3\x8c\xe4\x8c\xe5\x8c\xe6\xd3\xec", /* 5c80 */ "\x8c\xe7\xcb\xea\xc6\xf1\x8c\xe8\x8c\xe9\x8c\xea\x8c\xeb\x8c\xec\xe1\xac\x8c\xed\x8c\xee\x8c\xef\xe1\xa7\xe1\xa9\x8c\xf0\x8c\xf1\xe1\xaa\xe1\xaf\x8c\xf2\x8c\xf3\xb2\xed\x8c\xf4\xe1\xab\xb8\xda\xe1\xad\xe1\xae\xe1\xb0\xb5\xba\xe1\xb1\x8c\xf5\x8c\xf6\x8c\xf7\x8c\xf8\x8c\xf9\xe1\xb3\xe1\xb8\x8c\xfa\x8c\xfb\x8c\xfc\x8c\xfd\x8c\xfe\xd1\xd2\x8d\x40\xe1\xb6\xe1\xb5\xc1\xeb\x8d\x41\x8d\x42\x8d\x43\xe1\xb7\x8d\x44\xd4\xc0\x8d\x45\xe1\xb2\x8d\x46\xe1\xba\xb0\xb6\x8d\x47\x8d\x48\x8d\x49\x8d\x4a\xe1\xb4\x8d\x4b\xbf\xf9\x8d\x4c\xe1\xb9\x8d\x4d\x8d\x4e\xe1\xbb\x8d\x4f\x8d\x50\x8d\x51\x8d\x52\x8d\x53\x8d\x54\xe1\xbe\x8d\x55\x8d\x56\x8d\x57\x8d\x58\x8d\x59\x8d\x5a\xe1\xbc\x8d\x5b\x8d\x5c\x8d\x5d\x8d\x5e\x8d\x5f\x8d\x60\xd6\xc5\x8d\x61\x8d\x62\x8d\x63\x8d\x64\x8d\x65\x8d\x66\x8d\x67\xcf\xbf\x8d\x68\x8d\x69\xe1\xbd\xe1\xbf\xc2\xcd\x8d\x6a\xb6\xeb\x8d\x6b\xd3\xf8\x8d\x6c\x8d\x6d\xc7\xcd\x8d\x6e\x8d\x6f\xb7\xe5\x8d\x70\x8d\x71\x8d\x72\x8d\x73\x8d\x74\x8d\x75\x8d\x76\x8d\x77\x8d\x78\x8d\x79\xbe\xfe\x8d\x7a\x8d\x7b\x8d\x7c\x8d\x7d", /* 5d00 */ "\x8d\x7e\x8d\x80\xe1\xc0\xe1\xc1\x8d\x81\x8d\x82\xe1\xc7\xb3\xe7\x8d\x83\x8d\x84\x8d\x85\x8d\x86\x8d\x87\x8d\x88\xc6\xe9\x8d\x89\x8d\x8a\x8d\x8b\x8d\x8c\x8d\x8d\xb4\xde\x8d\x8e\xd1\xc2\x8d\x8f\x8d\x90\x8d\x91\x8d\x92\xe1\xc8\x8d\x93\x8d\x94\xe1\xc6\x8d\x95\x8d\x96\x8d\x97\x8d\x98\x8d\x99\xe1\xc5\x8d\x9a\xe1\xc3\xe1\xc2\x8d\x9b\xb1\xc0\x8d\x9c\x8d\x9d\x8d\x9e\xd5\xb8\xe1\xc4\x8d\x9f\x8d\xa0\x8d\xa1\x8d\xa2\x8d\xa3\xe1\xcb\x8d\xa4\x8d\xa5\x8d\xa6\x8d\xa7\x8d\xa8\x8d\xa9\x8d\xaa\x8d\xab\xe1\xcc\xe1\xca\x8d\xac\x8d\xad\x8d\xae\x8d\xaf\x8d\xb0\x8d\xb1\x8d\xb2\x8d\xb3\xef\xfa\x8d\xb4\x8d\xb5\xe1\xd3\xe1\xd2\xc7\xb6\x8d\xb6\x8d\xb7\x8d\xb8\x8d\xb9\x8d\xba\x8d\xbb\x8d\xbc\x8d\xbd\x8d\xbe\x8d\xbf\x8d\xc0\xe1\xc9\x8d\xc1\x8d\xc2\xe1\xce\x8d\xc3\xe1\xd0\x8d\xc4\x8d\xc5\x8d\xc6\x8d\xc7\x8d\xc8\x8d\xc9\x8d\xca\x8d\xcb\x8d\xcc\x8d\xcd\x8d\xce\xe1\xd4\x8d\xcf\xe1\xd1\xe1\xcd\x8d\xd0\x8d\xd1\xe1\xcf\x8d\xd2\x8d\xd3\x8d\xd4\x8d\xd5\xe1\xd5\x8d\xd6\x8d\xd7\x8d\xd8\x8d\xd9\x8d\xda\x8d\xdb\x8d\xdc\x8d\xdd\x8d\xde\x8d\xdf\x8d\xe0", /* 5d80 */ "\x8d\xe1\x8d\xe2\xe1\xd6\x8d\xe3\x8d\xe4\x8d\xe5\x8d\xe6\x8d\xe7\x8d\xe8\x8d\xe9\x8d\xea\x8d\xeb\x8d\xec\x8d\xed\x8d\xee\x8d\xef\x8d\xf0\x8d\xf1\x8d\xf2\x8d\xf3\x8d\xf4\x8d\xf5\x8d\xf6\x8d\xf7\x8d\xf8\xe1\xd7\x8d\xf9\x8d\xfa\x8d\xfb\xe1\xd8\x8d\xfc\x8d\xfd\x8d\xfe\x8e\x40\x8e\x41\x8e\x42\x8e\x43\x8e\x44\x8e\x45\x8e\x46\x8e\x47\x8e\x48\x8e\x49\x8e\x4a\x8e\x4b\x8e\x4c\x8e\x4d\x8e\x4e\x8e\x4f\x8e\x50\x8e\x51\x8e\x52\x8e\x53\x8e\x54\x8e\x55\xe1\xda\x8e\x56\x8e\x57\x8e\x58\x8e\x59\x8e\x5a\x8e\x5b\x8e\x5c\x8e\x5d\x8e\x5e\x8e\x5f\x8e\x60\x8e\x61\x8e\x62\xe1\xdb\x8e\x63\x8e\x64\x8e\x65\x8e\x66\x8e\x67\x8e\x68\x8e\x69\xce\xa1\x8e\x6a\x8e\x6b\x8e\x6c\x8e\x6d\x8e\x6e\x8e\x6f\x8e\x70\x8e\x71\x8e\x72\x8e\x73\x8e\x74\x8e\x75\x8e\x76\xe7\xdd\x8e\x77\xb4\xa8\xd6\xdd\x8e\x78\x8e\x79\xd1\xb2\xb3\xb2\x8e\x7a\x8e\x7b\xb9\xa4\xd7\xf3\xc7\xc9\xbe\xde\xb9\xae\x8e\x7c\xce\xd7\x8e\x7d\x8e\x7e\xb2\xee\xdb\xcf\x8e\x80\xbc\xba\xd2\xd1\xcb\xc8\xb0\xcd\x8e\x81\x8e\x82\xcf\xef\x8e\x83\x8e\x84\x8e\x85\x8e\x86\x8e\x87\xd9\xe3\xbd\xed\x8e\x88", /* 5e00 */ "\x8e\x89\xb1\xd2\xca\xd0\xb2\xbc\x8e\x8a\xcb\xa7\xb7\xab\x8e\x8b\xca\xa6\x8e\x8c\x8e\x8d\x8e\x8e\xcf\xa3\x8e\x8f\x8e\x90\xe0\xf8\xd5\xca\xe0\xfb\x8e\x91\x8e\x92\xe0\xfa\xc5\xc1\xcc\xfb\x8e\x93\xc1\xb1\xe0\xf9\xd6\xe3\xb2\xaf\xd6\xc4\xb5\xdb\x8e\x94\x8e\x95\x8e\x96\x8e\x97\x8e\x98\x8e\x99\x8e\x9a\x8e\x9b\xb4\xf8\xd6\xa1\x8e\x9c\x8e\x9d\x8e\x9e\x8e\x9f\x8e\xa0\xcf\xaf\xb0\xef\x8e\xa1\x8e\xa2\xe0\xfc\x8e\xa3\x8e\xa4\x8e\xa5\x8e\xa6\x8e\xa7\xe1\xa1\xb3\xa3\x8e\xa8\x8e\xa9\xe0\xfd\xe0\xfe\xc3\xb1\x8e\xaa\x8e\xab\x8e\xac\x8e\xad\xc3\xdd\x8e\xae\xe1\xa2\xb7\xf9\x8e\xaf\x8e\xb0\x8e\xb1\x8e\xb2\x8e\xb3\x8e\xb4\xbb\xcf\x8e\xb5\x8e\xb6\x8e\xb7\x8e\xb8\x8e\xb9\x8e\xba\x8e\xbb\xe1\xa3\xc4\xbb\x8e\xbc\x8e\xbd\x8e\xbe\x8e\xbf\x8e\xc0\xe1\xa4\x8e\xc1\x8e\xc2\xe1\xa5\x8e\xc3\x8e\xc4\xe1\xa6\xb4\xb1\x8e\xc5\x8e\xc6\x8e\xc7\x8e\xc8\x8e\xc9\x8e\xca\x8e\xcb\x8e\xcc\x8e\xcd\x8e\xce\x8e\xcf\x8e\xd0\x8e\xd1\x8e\xd2\x8e\xd3\xb8\xc9\xc6\xbd\xc4\xea\x8e\xd4\xb2\xa2\x8e\xd5\xd0\xd2\x8e\xd6\xe7\xdb\xbb\xc3\xd3\xd7\xd3\xc4\x8e\xd7\xb9\xe3", /* 5e80 */ "\xe2\xcf\x8e\xd8\x8e\xd9\x8e\xda\xd7\xaf\x8e\xdb\xc7\xec\xb1\xd3\x8e\xdc\x8e\xdd\xb4\xb2\xe2\xd1\x8e\xde\x8e\xdf\x8e\xe0\xd0\xf2\xc2\xae\xe2\xd0\x8e\xe1\xbf\xe2\xd3\xa6\xb5\xd7\xe2\xd2\xb5\xea\x8e\xe2\xc3\xed\xb8\xfd\x8e\xe3\xb8\xae\x8e\xe4\xc5\xd3\xb7\xcf\xe2\xd4\x8e\xe5\x8e\xe6\x8e\xe7\x8e\xe8\xe2\xd3\xb6\xc8\xd7\xf9\x8e\xe9\x8e\xea\x8e\xeb\x8e\xec\x8e\xed\xcd\xa5\x8e\xee\x8e\xef\x8e\xf0\x8e\xf1\x8e\xf2\xe2\xd8\x8e\xf3\xe2\xd6\xca\xfc\xbf\xb5\xd3\xb9\xe2\xd5\x8e\xf4\x8e\xf5\x8e\xf6\x8e\xf7\xe2\xd7\x8e\xf8\x8e\xf9\x8e\xfa\x8e\xfb\x8e\xfc\x8e\xfd\x8e\xfe\x8f\x40\x8f\x41\x8f\x42\xc1\xae\xc0\xc8\x8f\x43\x8f\x44\x8f\x45\x8f\x46\x8f\x47\x8f\x48\xe2\xdb\xe2\xda\xc0\xaa\x8f\x49\x8f\x4a\xc1\xce\x8f\x4b\x8f\x4c\x8f\x4d\x8f\x4e\xe2\xdc\x8f\x4f\x8f\x50\x8f\x51\x8f\x52\x8f\x53\x8f\x54\x8f\x55\x8f\x56\x8f\x57\x8f\x58\x8f\x59\x8f\x5a\xe2\xdd\x8f\x5b\xe2\xde\x8f\x5c\x8f\x5d\x8f\x5e\x8f\x5f\x8f\x60\x8f\x61\x8f\x62\x8f\x63\x8f\x64\xdb\xc8\x8f\x65\xd1\xd3\xcd\xa2\x8f\x66\x8f\x67\xbd\xa8\x8f\x68\x8f\x69\x8f\x6a\xde\xc3\xd8\xa5", /* 5f00 */ "\xbf\xaa\xdb\xcd\xd2\xec\xc6\xfa\xc5\xaa\x8f\x6b\x8f\x6c\x8f\x6d\xde\xc4\x8f\x6e\xb1\xd7\xdf\xae\x8f\x6f\x8f\x70\x8f\x71\xca\xbd\x8f\x72\xdf\xb1\x8f\x73\xb9\xad\x8f\x74\xd2\xfd\x8f\x75\xb8\xa5\xba\xeb\x8f\x76\x8f\x77\xb3\xda\x8f\x78\x8f\x79\x8f\x7a\xb5\xdc\xd5\xc5\x8f\x7b\x8f\x7c\x8f\x7d\x8f\x7e\xc3\xd6\xcf\xd2\xbb\xa1\x8f\x80\xe5\xf3\xe5\xf2\x8f\x81\x8f\x82\xe5\xf4\x8f\x83\xcd\xe4\x8f\x84\xc8\xf5\x8f\x85\x8f\x86\x8f\x87\x8f\x88\x8f\x89\x8f\x8a\x8f\x8b\xb5\xaf\xc7\xbf\x8f\x8c\xe5\xf6\x8f\x8d\x8f\x8e\x8f\x8f\xec\xb0\x8f\x90\x8f\x91\x8f\x92\x8f\x93\x8f\x94\x8f\x95\x8f\x96\x8f\x97\x8f\x98\x8f\x99\x8f\x9a\x8f\x9b\x8f\x9c\x8f\x9d\x8f\x9e\xe5\xe6\x8f\x9f\xb9\xe9\xb5\xb1\x8f\xa0\xc2\xbc\xe5\xe8\xe5\xe7\xe5\xe9\x8f\xa1\x8f\xa2\x8f\xa3\x8f\xa4\xd2\xcd\x8f\xa5\x8f\xa6\x8f\xa7\xe1\xea\xd0\xce\x8f\xa8\xcd\xae\x8f\xa9\xd1\xe5\x8f\xaa\x8f\xab\xb2\xca\xb1\xeb\x8f\xac\xb1\xf2\xc5\xed\x8f\xad\x8f\xae\xd5\xc3\xd3\xb0\x8f\xaf\xe1\xdc\x8f\xb0\x8f\xb1\x8f\xb2\xe1\xdd\x8f\xb3\xd2\xdb\x8f\xb4\xb3\xb9\xb1\xcb\x8f\xb5\x8f\xb6\x8f\xb7", /* 5f80 */ "\xcd\xf9\xd5\xf7\xe1\xde\x8f\xb8\xbe\xb6\xb4\xfd\x8f\xb9\xe1\xdf\xba\xdc\xe1\xe0\xbb\xb2\xc2\xc9\xe1\xe1\x8f\xba\x8f\xbb\x8f\xbc\xd0\xec\x8f\xbd\xcd\xbd\x8f\xbe\x8f\xbf\xe1\xe2\x8f\xc0\xb5\xc3\xc5\xc7\xe1\xe3\x8f\xc1\x8f\xc2\xe1\xe4\x8f\xc3\x8f\xc4\x8f\xc5\x8f\xc6\xd3\xf9\x8f\xc7\x8f\xc8\x8f\xc9\x8f\xca\x8f\xcb\x8f\xcc\xe1\xe5\x8f\xcd\xd1\xad\x8f\xce\x8f\xcf\xe1\xe6\xce\xa2\x8f\xd0\x8f\xd1\x8f\xd2\x8f\xd3\x8f\xd4\x8f\xd5\xe1\xe7\x8f\xd6\xb5\xc2\x8f\xd7\x8f\xd8\x8f\xd9\x8f\xda\xe1\xe8\xbb\xd5\x8f\xdb\x8f\xdc\x8f\xdd\x8f\xde\x8f\xdf\xd0\xc4\xe2\xe0\xb1\xd8\xd2\xe4\x8f\xe0\x8f\xe1\xe2\xe1\x8f\xe2\x8f\xe3\xbc\xc9\xc8\xcc\x8f\xe4\xe2\xe3\xec\xfe\xec\xfd\xdf\xaf\x8f\xe5\x8f\xe6\x8f\xe7\xe2\xe2\xd6\xbe\xcd\xfc\xc3\xa6\x8f\xe8\x8f\xe9\x8f\xea\xe3\xc3\x8f\xeb\x8f\xec\xd6\xd2\xe2\xe7\x8f\xed\x8f\xee\xe2\xe8\x8f\xef\x8f\xf0\xd3\xc7\x8f\xf1\x8f\xf2\xe2\xec\xbf\xec\x8f\xf3\xe2\xed\xe2\xe5\x8f\xf4\x8f\xf5\xb3\xc0\x8f\xf6\x8f\xf7\x8f\xf8\xc4\xee\x8f\xf9\x8f\xfa\xe2\xee\x8f\xfb\x8f\xfc\xd0\xc3\x8f\xfd\xba\xf6\xe2\xe9\xb7\xde", /* 6000 */ "\xbb\xb3\xcc\xac\xcb\xcb\xe2\xe4\xe2\xe6\xe2\xea\xe2\xeb\x8f\xfe\x90\x40\x90\x41\xe2\xf7\x90\x42\x90\x43\xe2\xf4\xd4\xf5\xe2\xf3\x90\x44\x90\x45\xc5\xad\x90\x46\xd5\xfa\xc5\xc2\xb2\xc0\x90\x47\x90\x48\xe2\xef\x90\x49\xe2\xf2\xc1\xaf\xcb\xbc\x90\x4a\x90\x4b\xb5\xa1\xe2\xf9\x90\x4c\x90\x4d\x90\x4e\xbc\xb1\xe2\xf1\xd0\xd4\xd4\xb9\xe2\xf5\xb9\xd6\xe2\xf6\x90\x4f\x90\x50\x90\x51\xc7\xd3\x90\x52\x90\x53\x90\x54\x90\x55\x90\x56\xe2\xf0\x90\x57\x90\x58\x90\x59\x90\x5a\x90\x5b\xd7\xdc\xed\xa1\x90\x5c\x90\x5d\xe2\xf8\x90\x5e\xed\xa5\xe2\xfe\xca\xd1\x90\x5f\x90\x60\x90\x61\x90\x62\x90\x63\x90\x64\x90\x65\xc1\xb5\x90\x66\xbb\xd0\x90\x67\x90\x68\xbf\xd6\x90\x69\xba\xe3\x90\x6a\x90\x6b\xcb\xa1\x90\x6c\x90\x6d\x90\x6e\xed\xa6\xed\xa3\x90\x6f\x90\x70\xed\xa2\x90\x71\x90\x72\x90\x73\x90\x74\xbb\xd6\xed\xa7\xd0\xf4\x90\x75\x90\x76\xed\xa4\xba\xde\xb6\xf7\xe3\xa1\xb6\xb2\xcc\xf1\xb9\xa7\x90\x77\xcf\xa2\xc7\xa1\x90\x78\x90\x79\xbf\xd2\x90\x7a\x90\x7b\xb6\xf1\x90\x7c\xe2\xfa\xe2\xfb\xe2\xfd\xe2\xfc\xc4\xd5\xe3\xa2\x90\x7d\xd3\xc1", /* 6080 */ "\x90\x7e\x90\x80\x90\x81\xe3\xa7\xc7\xc4\x90\x82\x90\x83\x90\x84\x90\x85\xcf\xa4\x90\x86\x90\x87\xe3\xa9\xba\xb7\x90\x88\x90\x89\x90\x8a\x90\x8b\xe3\xa8\x90\x8c\xbb\xda\x90\x8d\xe3\xa3\x90\x8e\x90\x8f\x90\x90\xe3\xa4\xe3\xaa\x90\x91\xe3\xa6\x90\x92\xce\xf2\xd3\xc6\x90\x93\x90\x94\xbb\xbc\x90\x95\x90\x96\xd4\xc3\x90\x97\xc4\xfa\x90\x98\x90\x99\xed\xa8\xd0\xfc\xe3\xa5\x90\x9a\xc3\xf5\x90\x9b\xe3\xad\xb1\xaf\x90\x9c\xe3\xb2\x90\x9d\x90\x9e\x90\x9f\xbc\xc2\x90\xa0\x90\xa1\xe3\xac\xb5\xbf\x90\xa2\x90\xa3\x90\xa4\x90\xa5\x90\xa6\x90\xa7\x90\xa8\x90\xa9\xc7\xe9\xe3\xb0\x90\xaa\x90\xab\x90\xac\xbe\xaa\xcd\xef\x90\xad\x90\xae\x90\xaf\x90\xb0\x90\xb1\xbb\xf3\x90\xb2\x90\xb3\x90\xb4\xcc\xe8\x90\xb5\x90\xb6\xe3\xaf\x90\xb7\xe3\xb1\x90\xb8\xcf\xa7\xe3\xae\x90\xb9\xce\xa9\xbb\xdd\x90\xba\x90\xbb\x90\xbc\x90\xbd\x90\xbe\xb5\xeb\xbe\xe5\xb2\xd2\xb3\xcd\x90\xbf\xb1\xb9\xe3\xab\xb2\xd1\xb5\xac\xb9\xdf\xb6\xe8\x90\xc0\x90\xc1\xcf\xeb\xe3\xb7\x90\xc2\xbb\xcc\x90\xc3\x90\xc4\xc8\xc7\xd0\xca\x90\xc5\x90\xc6\x90\xc7\x90\xc8\x90\xc9", /* 6100 */ "\xe3\xb8\xb3\xee\x90\xca\x90\xcb\x90\xcc\x90\xcd\xed\xa9\x90\xce\xd3\xfa\xd3\xe4\x90\xcf\x90\xd0\x90\xd1\xed\xaa\xe3\xb9\xd2\xe2\x90\xd2\x90\xd3\x90\xd4\x90\xd5\x90\xd6\xe3\xb5\x90\xd7\x90\xd8\x90\xd9\x90\xda\xd3\xde\x90\xdb\x90\xdc\x90\xdd\x90\xde\xb8\xd0\xe3\xb3\x90\xdf\x90\xe0\xe3\xb6\xb7\xdf\x90\xe1\xe3\xb4\xc0\xa2\x90\xe2\x90\xe3\x90\xe4\xe3\xba\x90\xe5\x90\xe6\x90\xe7\x90\xe8\x90\xe9\x90\xea\x90\xeb\x90\xec\x90\xed\x90\xee\x90\xef\x90\xf0\x90\xf1\x90\xf2\x90\xf3\x90\xf4\x90\xf5\x90\xf6\x90\xf7\xd4\xb8\x90\xf8\x90\xf9\x90\xfa\x90\xfb\x90\xfc\x90\xfd\x90\xfe\x91\x40\xb4\xc8\x91\x41\xe3\xbb\x91\x42\xbb\xc5\x91\x43\xc9\xf7\x91\x44\x91\x45\xc9\xe5\x91\x46\x91\x47\x91\x48\xc4\xbd\x91\x49\x91\x4a\x91\x4b\x91\x4c\x91\x4d\x91\x4e\x91\x4f\xed\xab\x91\x50\x91\x51\x91\x52\x91\x53\xc2\xfd\x91\x54\x91\x55\x91\x56\x91\x57\xbb\xdb\xbf\xae\x91\x58\x91\x59\x91\x5a\x91\x5b\x91\x5c\x91\x5d\x91\x5e\xce\xbf\x91\x5f\x91\x60\x91\x61\x91\x62\xe3\xbc\x91\x63\xbf\xb6\x91\x64\x91\x65\x91\x66\x91\x67\x91\x68\x91\x69\x91\x6a\x91\x6b", /* 6180 */ "\x91\x6c\x91\x6d\x91\x6e\x91\x6f\x91\x70\x91\x71\x91\x72\x91\x73\x91\x74\x91\x75\x91\x76\xb1\xef\x91\x77\x91\x78\xd4\xf7\x91\x79\x91\x7a\x91\x7b\x91\x7c\x91\x7d\xe3\xbe\x91\x7e\x91\x80\x91\x81\x91\x82\x91\x83\x91\x84\x91\x85\x91\x86\xed\xad\x91\x87\x91\x88\x91\x89\x91\x8a\x91\x8b\x91\x8c\x91\x8d\x91\x8e\x91\x8f\xe3\xbf\xba\xa9\xed\xac\x91\x90\x91\x91\xe3\xbd\x91\x92\x91\x93\x91\x94\x91\x95\x91\x96\x91\x97\x91\x98\x91\x99\x91\x9a\x91\x9b\xe3\xc0\x91\x9c\x91\x9d\x91\x9e\x91\x9f\x91\xa0\x91\xa1\xba\xb6\x91\xa2\x91\xa3\x91\xa4\xb6\xae\x91\xa5\x91\xa6\x91\xa7\x91\xa8\x91\xa9\xd0\xb8\x91\xaa\xb0\xc3\xed\xae\x91\xab\x91\xac\x91\xad\x91\xae\x91\xaf\xed\xaf\xc0\xc1\x91\xb0\xe3\xc1\x91\xb1\x91\xb2\x91\xb3\x91\xb4\x91\xb5\x91\xb6\x91\xb7\x91\xb8\x91\xb9\x91\xba\x91\xbb\x91\xbc\x91\xbd\x91\xbe\x91\xbf\x91\xc0\x91\xc1\xc5\xb3\x91\xc2\x91\xc3\x91\xc4\x91\xc5\x91\xc6\x91\xc7\x91\xc8\x91\xc9\x91\xca\x91\xcb\x91\xcc\x91\xcd\x91\xce\x91\xcf\xe3\xc2\x91\xd0\x91\xd1\x91\xd2\x91\xd3\x91\xd4\x91\xd5\x91\xd6\x91\xd7\x91\xd8\xdc\xb2", /* 6200 */ "\x91\xd9\x91\xda\x91\xdb\x91\xdc\x91\xdd\x91\xde\xed\xb0\x91\xdf\xb8\xea\x91\xe0\xce\xec\xea\xa7\xd0\xe7\xca\xf9\xc8\xd6\xcf\xb7\xb3\xc9\xce\xd2\xbd\xe4\x91\xe1\x91\xe2\xe3\xde\xbb\xf2\xea\xa8\xd5\xbd\x91\xe3\xc6\xdd\xea\xa9\x91\xe4\x91\xe5\x91\xe6\xea\xaa\x91\xe7\xea\xac\xea\xab\x91\xe8\xea\xae\xea\xad\x91\xe9\x91\xea\x91\xeb\x91\xec\xbd\xd8\x91\xed\xea\xaf\x91\xee\xc2\xbe\x91\xef\x91\xf0\x91\xf1\x91\xf2\xb4\xc1\xb4\xf7\x91\xf3\x91\xf4\xbb\xa7\x91\xf5\x91\xf6\x91\xf7\x91\xf8\x91\xf9\xec\xe6\xec\xe5\xb7\xbf\xcb\xf9\xb1\xe2\x91\xfa\xec\xe7\x91\xfb\x91\xfc\x91\xfd\xc9\xc8\xec\xe8\xec\xe9\x91\xfe\xca\xd6\xde\xd0\xb2\xc5\xd4\xfa\x92\x40\x92\x41\xc6\xcb\xb0\xc7\xb4\xf2\xc8\xd3\x92\x42\x92\x43\x92\x44\xcd\xd0\x92\x45\x92\x46\xbf\xb8\x92\x47\x92\x48\x92\x49\x92\x4a\x92\x4b\x92\x4c\x92\x4d\xbf\xdb\x92\x4e\x92\x4f\xc7\xa4\xd6\xb4\x92\x50\xc0\xa9\xde\xd1\xc9\xa8\xd1\xef\xc5\xa4\xb0\xe7\xb3\xb6\xc8\xc5\x92\x51\x92\x52\xb0\xe2\x92\x53\x92\x54\xb7\xf6\x92\x55\x92\x56\xc5\xfa\x92\x57\x92\x58\xb6\xf3\x92\x59\xd5\xd2\xb3\xd0", /* 6280 */ "\xbc\xbc\x92\x5a\x92\x5b\x92\x5c\xb3\xad\x92\x5d\x92\x5e\x92\x5f\x92\x60\xbe\xf1\xb0\xd1\x92\x61\x92\x62\x92\x63\x92\x64\x92\x65\x92\x66\xd2\xd6\xca\xe3\xd7\xa5\x92\x67\xcd\xb6\xb6\xb6\xbf\xb9\xd5\xdb\x92\x68\xb8\xa7\xc5\xd7\x92\x69\x92\x6a\x92\x6b\xde\xd2\xbf\xd9\xc2\xd5\xc7\xc0\x92\x6c\xbb\xa4\xb1\xa8\x92\x6d\x92\x6e\xc5\xea\x92\x6f\x92\x70\xc5\xfb\xcc\xa7\x92\x71\x92\x72\x92\x73\x92\x74\xb1\xa7\x92\x75\x92\x76\x92\x77\xb5\xd6\x92\x78\x92\x79\x92\x7a\xc4\xa8\x92\x7b\xde\xd3\xd1\xba\xb3\xe9\x92\x7c\xc3\xf2\x92\x7d\x92\x7e\xb7\xf7\x92\x80\xd6\xf4\xb5\xa3\xb2\xf0\xc4\xb4\xc4\xe9\xc0\xad\xde\xd4\x92\x81\xb0\xe8\xc5\xc4\xc1\xe0\x92\x82\xb9\xd5\x92\x83\xbe\xdc\xcd\xd8\xb0\xce\x92\x84\xcd\xcf\xde\xd6\xbe\xd0\xd7\xbe\xde\xd5\xd5\xd0\xb0\xdd\x92\x85\x92\x86\xc4\xe2\x92\x87\x92\x88\xc2\xa3\xbc\xf0\x92\x89\xd3\xb5\xc0\xb9\xc5\xa1\xb2\xa6\xd4\xf1\x92\x8a\x92\x8b\xc0\xa8\xca\xc3\xde\xd7\xd5\xfc\x92\x8c\xb9\xb0\x92\x8d\xc8\xad\xcb\xa9\x92\x8e\xde\xd9\xbf\xbd\x92\x8f\x92\x90\x92\x91\x92\x92\xc6\xb4\xd7\xa7\xca\xb0\xc4\xc3", /* 6300 */ "\x92\x93\xb3\xd6\xb9\xd2\x92\x94\x92\x95\x92\x96\x92\x97\xd6\xb8\xea\xfc\xb0\xb4\x92\x98\x92\x99\x92\x9a\x92\x9b\xbf\xe6\x92\x9c\x92\x9d\xcc\xf4\x92\x9e\x92\x9f\x92\xa0\x92\xa1\xcd\xda\x92\xa2\x92\xa3\x92\xa4\xd6\xbf\xc2\xce\x92\xa5\xce\xce\xcc\xa2\xd0\xae\xc4\xd3\xb5\xb2\xde\xd8\xd5\xf5\xbc\xb7\xbb\xd3\x92\xa6\x92\xa7\xb0\xa4\x92\xa8\xc5\xb2\xb4\xec\x92\xa9\x92\xaa\x92\xab\xd5\xf1\x92\xac\x92\xad\xea\xfd\x92\xae\x92\xaf\x92\xb0\x92\xb1\x92\xb2\x92\xb3\xde\xda\xcd\xa6\x92\xb4\x92\xb5\xcd\xec\x92\xb6\x92\xb7\x92\xb8\x92\xb9\xce\xe6\xde\xdc\x92\xba\xcd\xb1\xc0\xa6\x92\xbb\x92\xbc\xd7\xbd\x92\xbd\xde\xdb\xb0\xc6\xba\xb4\xc9\xd3\xc4\xf3\xbe\xe8\x92\xbe\x92\xbf\x92\xc0\x92\xc1\xb2\xb6\x92\xc2\x92\xc3\x92\xc4\x92\xc5\x92\xc6\x92\xc7\x92\xc8\x92\xc9\xc0\xcc\xcb\xf0\x92\xca\xbc\xf1\xbb\xbb\xb5\xb7\x92\xcb\x92\xcc\x92\xcd\xc5\xf5\x92\xce\xde\xe6\x92\xcf\x92\xd0\x92\xd1\xde\xe3\xbe\xdd\x92\xd2\x92\xd3\xde\xdf\x92\xd4\x92\xd5\x92\xd6\x92\xd7\xb4\xb7\xbd\xdd\x92\xd8\x92\xd9\xde\xe0\xc4\xed\x92\xda\x92\xdb\x92\xdc\x92\xdd", /* 6380 */ "\xcf\xc6\x92\xde\xb5\xe0\x92\xdf\x92\xe0\x92\xe1\x92\xe2\xb6\xde\xca\xda\xb5\xf4\xde\xe5\x92\xe3\xd5\xc6\x92\xe4\xde\xe1\xcc\xcd\xc6\xfe\x92\xe5\xc5\xc5\x92\xe6\x92\xe7\x92\xe8\xd2\xb4\x92\xe9\xbe\xf2\x92\xea\x92\xeb\x92\xec\x92\xed\x92\xee\x92\xef\x92\xf0\xc2\xd3\x92\xf1\xcc\xbd\xb3\xb8\x92\xf2\xbd\xd3\x92\xf3\xbf\xd8\xcd\xc6\xd1\xda\xb4\xeb\x92\xf4\xde\xe4\xde\xdd\xde\xe7\x92\xf5\xea\xfe\x92\xf6\x92\xf7\xc2\xb0\xde\xe2\x92\xf8\x92\xf9\xd6\xc0\xb5\xa7\x92\xfa\xb2\xf4\x92\xfb\xde\xe8\x92\xfc\xde\xf2\x92\xfd\x92\xfe\x93\x40\x93\x41\x93\x42\xde\xed\x93\x43\xde\xf1\x93\x44\x93\x45\xc8\xe0\x93\x46\x93\x47\x93\x48\xd7\xe1\xde\xef\xc3\xe8\xcc\xe1\x93\x49\xb2\xe5\x93\x4a\x93\x4b\x93\x4c\xd2\xbe\x93\x4d\x93\x4e\x93\x4f\x93\x50\x93\x51\x93\x52\x93\x53\xde\xee\x93\x54\xde\xeb\xce\xd5\x93\x55\xb4\xa7\x93\x56\x93\x57\x93\x58\x93\x59\x93\x5a\xbf\xab\xbe\xbe\x93\x5b\x93\x5c\xbd\xd2\x93\x5d\x93\x5e\x93\x5f\x93\x60\xde\xe9\x93\x61\xd4\xae\x93\x62\xde\xde\x93\x63\xde\xea\x93\x64\x93\x65\x93\x66\x93\x67\xc0\xbf\x93\x68\xde\xec", /* 6400 */ "\xb2\xf3\xb8\xe9\xc2\xa7\x93\x69\x93\x6a\xbd\xc1\x93\x6b\x93\x6c\x93\x6d\x93\x6e\x93\x6f\xde\xf5\xde\xf8\x93\x70\x93\x71\xb2\xab\xb4\xa4\x93\x72\x93\x73\xb4\xea\xc9\xa6\x93\x74\x93\x75\x93\x76\x93\x77\x93\x78\x93\x79\xde\xf6\xcb\xd1\x93\x7a\xb8\xe3\x93\x7b\xde\xf7\xde\xfa\x93\x7c\x93\x7d\x93\x7e\x93\x80\xde\xf9\x93\x81\x93\x82\x93\x83\xcc\xc2\x93\x84\xb0\xe1\xb4\xee\x93\x85\x93\x86\x93\x87\x93\x88\x93\x89\x93\x8a\xe5\xba\x93\x8b\x93\x8c\x93\x8d\x93\x8e\x93\x8f\xd0\xaf\x93\x90\x93\x91\xb2\xeb\x93\x92\xeb\xa1\x93\x93\xde\xf4\x93\x94\x93\x95\xc9\xe3\xde\xf3\xb0\xda\xd2\xa1\xb1\xf7\x93\x96\xcc\xaf\x93\x97\x93\x98\x93\x99\x93\x9a\x93\x9b\x93\x9c\x93\x9d\xde\xf0\x93\x9e\xcb\xa4\x93\x9f\x93\xa0\x93\xa1\xd5\xaa\x93\xa2\x93\xa3\x93\xa4\x93\xa5\x93\xa6\xde\xfb\x93\xa7\x93\xa8\x93\xa9\x93\xaa\x93\xab\x93\xac\x93\xad\x93\xae\xb4\xdd\x93\xaf\xc4\xa6\x93\xb0\x93\xb1\x93\xb2\xde\xfd\x93\xb3\x93\xb4\x93\xb5\x93\xb6\x93\xb7\x93\xb8\x93\xb9\x93\xba\x93\xbb\x93\xbc\xc3\xfe\xc4\xa1\xdf\xa1\x93\xbd\x93\xbe\x93\xbf\x93\xc0\x93\xc1", /* 6480 */ "\x93\xc2\x93\xc3\xc1\xcc\x93\xc4\xde\xfc\xbe\xef\x93\xc5\xc6\xb2\x93\xc6\x93\xc7\x93\xc8\x93\xc9\x93\xca\x93\xcb\x93\xcc\x93\xcd\x93\xce\xb3\xc5\xc8\xf6\x93\xcf\x93\xd0\xcb\xba\xde\xfe\x93\xd1\x93\xd2\xdf\xa4\x93\xd3\x93\xd4\x93\xd5\x93\xd6\xd7\xb2\x93\xd7\x93\xd8\x93\xd9\x93\xda\x93\xdb\xb3\xb7\x93\xdc\x93\xdd\x93\xde\x93\xdf\xc1\xc3\x93\xe0\x93\xe1\xc7\xcb\xb2\xa5\xb4\xe9\x93\xe2\xd7\xab\x93\xe3\x93\xe4\x93\xe5\x93\xe6\xc4\xec\x93\xe7\xdf\xa2\xdf\xa3\x93\xe8\xdf\xa5\x93\xe9\xba\xb3\x93\xea\x93\xeb\x93\xec\xdf\xa6\x93\xed\xc0\xde\x93\xee\x93\xef\xc9\xc3\x93\xf0\x93\xf1\x93\xf2\x93\xf3\x93\xf4\x93\xf5\x93\xf6\xb2\xd9\xc7\xe6\x93\xf7\xdf\xa7\x93\xf8\xc7\xdc\x93\xf9\x93\xfa\x93\xfb\x93\xfc\xdf\xa8\xeb\xa2\x93\xfd\x93\xfe\x94\x40\x94\x41\x94\x42\xcb\xd3\x94\x43\x94\x44\x94\x45\xdf\xaa\x94\x46\xdf\xa9\x94\x47\xb2\xc1\x94\x48\x94\x49\x94\x4a\x94\x4b\x94\x4c\x94\x4d\x94\x4e\x94\x4f\x94\x50\x94\x51\x94\x52\x94\x53\x94\x54\x94\x55\x94\x56\x94\x57\x94\x58\x94\x59\x94\x5a\x94\x5b\x94\x5c\x94\x5d\x94\x5e\x94\x5f\x94\x60", /* 6500 */ "\xc5\xca\x94\x61\x94\x62\x94\x63\x94\x64\x94\x65\x94\x66\x94\x67\x94\x68\xdf\xab\x94\x69\x94\x6a\x94\x6b\x94\x6c\x94\x6d\x94\x6e\x94\x6f\x94\x70\xd4\xdc\x94\x71\x94\x72\x94\x73\x94\x74\x94\x75\xc8\xc1\x94\x76\x94\x77\x94\x78\x94\x79\x94\x7a\x94\x7b\x94\x7c\x94\x7d\x94\x7e\x94\x80\x94\x81\x94\x82\xdf\xac\x94\x83\x94\x84\x94\x85\x94\x86\x94\x87\xbe\xf0\x94\x88\x94\x89\xdf\xad\xd6\xa7\x94\x8a\x94\x8b\x94\x8c\x94\x8d\xea\xb7\xeb\xb6\xca\xd5\x94\x8e\xd8\xfc\xb8\xc4\x94\x8f\xb9\xa5\x94\x90\x94\x91\xb7\xc5\xd5\xfe\x94\x92\x94\x93\x94\x94\x94\x95\x94\x96\xb9\xca\x94\x97\x94\x98\xd0\xa7\xf4\xcd\x94\x99\x94\x9a\xb5\xd0\x94\x9b\x94\x9c\xc3\xf4\x94\x9d\xbe\xc8\x94\x9e\x94\x9f\x94\xa0\xeb\xb7\xb0\xbd\x94\xa1\x94\xa2\xbd\xcc\x94\xa3\xc1\xb2\x94\xa4\xb1\xd6\xb3\xa8\x94\xa5\x94\xa6\x94\xa7\xb8\xd2\xc9\xa2\x94\xa8\x94\xa9\xb6\xd8\x94\xaa\x94\xab\x94\xac\x94\xad\xeb\xb8\xbe\xb4\x94\xae\x94\xaf\x94\xb0\xca\xfd\x94\xb1\xc7\xc3\x94\xb2\xd5\xfb\x94\xb3\x94\xb4\xb7\xf3\x94\xb5\x94\xb6\x94\xb7\x94\xb8\x94\xb9\x94\xba\x94\xbb\x94\xbc", /* 6580 */ "\x94\xbd\x94\xbe\x94\xbf\x94\xc0\x94\xc1\x94\xc2\x94\xc3\xce\xc4\x94\xc4\x94\xc5\x94\xc6\xd5\xab\xb1\xf3\x94\xc7\x94\xc8\x94\xc9\xec\xb3\xb0\xdf\x94\xca\xec\xb5\x94\xcb\x94\xcc\x94\xcd\xb6\xb7\x94\xce\xc1\xcf\x94\xcf\xf5\xfa\xd0\xb1\x94\xd0\x94\xd1\xd5\xe5\x94\xd2\xce\xd3\x94\xd3\x94\xd4\xbd\xef\xb3\xe2\x94\xd5\xb8\xab\x94\xd6\xd5\xb6\x94\xd7\xed\xbd\x94\xd8\xb6\xcf\x94\xd9\xcb\xb9\xd0\xc2\x94\xda\x94\xdb\x94\xdc\x94\xdd\x94\xde\x94\xdf\x94\xe0\x94\xe1\xb7\xbd\x94\xe2\x94\xe3\xec\xb6\xca\xa9\x94\xe4\x94\xe5\x94\xe6\xc5\xd4\x94\xe7\xec\xb9\xec\xb8\xc2\xc3\xec\xb7\x94\xe8\x94\xe9\x94\xea\x94\xeb\xd0\xfd\xec\xba\x94\xec\xec\xbb\xd7\xe5\x94\xed\x94\xee\xec\xbc\x94\xef\x94\xf0\x94\xf1\xec\xbd\xc6\xec\x94\xf2\x94\xf3\x94\xf4\x94\xf5\x94\xf6\x94\xf7\x94\xf8\x94\xf9\xce\xde\x94\xfa\xbc\xc8\x94\xfb\x94\xfc\xc8\xd5\xb5\xa9\xbe\xc9\xd6\xbc\xd4\xe7\x94\xfd\x94\xfe\xd1\xae\xd0\xf1\xea\xb8\xea\xb9\xea\xba\xba\xb5\x95\x40\x95\x41\x95\x42\x95\x43\xca\xb1\xbf\xf5\x95\x44\x95\x45\xcd\xfa\x95\x46\x95\x47\x95\x48\x95\x49\x95\x4a", /* 6600 */ "\xea\xc0\x95\x4b\xb0\xba\xea\xbe\x95\x4c\x95\x4d\xc0\xa5\x95\x4e\x95\x4f\x95\x50\xea\xbb\x95\x51\xb2\xfd\x95\x52\xc3\xf7\xbb\xe8\x95\x53\x95\x54\x95\x55\xd2\xd7\xce\xf4\xea\xbf\x95\x56\x95\x57\x95\x58\xea\xbc\x95\x59\x95\x5a\x95\x5b\xea\xc3\x95\x5c\xd0\xc7\xd3\xb3\x95\x5d\x95\x5e\x95\x5f\x95\x60\xb4\xba\x95\x61\xc3\xc1\xd7\xf2\x95\x62\x95\x63\x95\x64\x95\x65\xd5\xd1\x95\x66\xca\xc7\x95\x67\xea\xc5\x95\x68\x95\x69\xea\xc4\xea\xc7\xea\xc6\x95\x6a\x95\x6b\x95\x6c\x95\x6d\x95\x6e\xd6\xe7\x95\x6f\xcf\xd4\x95\x70\x95\x71\xea\xcb\x95\x72\xbb\xce\x95\x73\x95\x74\x95\x75\x95\x76\x95\x77\x95\x78\x95\x79\xbd\xfa\xc9\xce\x95\x7a\x95\x7b\xea\xcc\x95\x7c\x95\x7d\xc9\xb9\xcf\xfe\xea\xca\xd4\xce\xea\xcd\xea\xcf\x95\x7e\x95\x80\xcd\xed\x95\x81\x95\x82\x95\x83\x95\x84\xea\xc9\x95\x85\xea\xce\x95\x86\x95\x87\xce\xee\x95\x88\xbb\xde\x95\x89\xb3\xbf\x95\x8a\x95\x8b\x95\x8c\x95\x8d\x95\x8e\xc6\xd5\xbe\xb0\xce\xfa\x95\x8f\x95\x90\x95\x91\xc7\xe7\x95\x92\xbe\xa7\xea\xd0\x95\x93\x95\x94\xd6\xc7\x95\x95\x95\x96\x95\x97\xc1\xc0\x95\x98", /* 6680 */ "\x95\x99\x95\x9a\xd4\xdd\x95\x9b\xea\xd1\x95\x9c\x95\x9d\xcf\xbe\x95\x9e\x95\x9f\x95\xa0\x95\xa1\xea\xd2\x95\xa2\x95\xa3\x95\xa4\x95\xa5\xca\xee\x95\xa6\x95\xa7\x95\xa8\x95\xa9\xc5\xaf\xb0\xb5\x95\xaa\x95\xab\x95\xac\x95\xad\x95\xae\xea\xd4\x95\xaf\x95\xb0\x95\xb1\x95\xb2\x95\xb3\x95\xb4\x95\xb5\x95\xb6\x95\xb7\xea\xd3\xf4\xdf\x95\xb8\x95\xb9\x95\xba\x95\xbb\x95\xbc\xc4\xba\x95\xbd\x95\xbe\x95\xbf\x95\xc0\x95\xc1\xb1\xa9\x95\xc2\x95\xc3\x95\xc4\x95\xc5\xe5\xdf\x95\xc6\x95\xc7\x95\xc8\x95\xc9\xea\xd5\x95\xca\x95\xcb\x95\xcc\x95\xcd\x95\xce\x95\xcf\x95\xd0\x95\xd1\x95\xd2\x95\xd3\x95\xd4\x95\xd5\x95\xd6\x95\xd7\x95\xd8\x95\xd9\x95\xda\x95\xdb\x95\xdc\x95\xdd\x95\xde\x95\xdf\x95\xe0\x95\xe1\x95\xe2\x95\xe3\xca\xef\x95\xe4\xea\xd6\xea\xd7\xc6\xd8\x95\xe5\x95\xe6\x95\xe7\x95\xe8\x95\xe9\x95\xea\x95\xeb\x95\xec\xea\xd8\x95\xed\x95\xee\xea\xd9\x95\xef\x95\xf0\x95\xf1\x95\xf2\x95\xf3\x95\xf4\xd4\xbb\x95\xf5\xc7\xfa\xd2\xb7\xb8\xfc\x95\xf6\x95\xf7\xea\xc2\x95\xf8\xb2\xdc\x95\xf9\x95\xfa\xc2\xfc\x95\xfb\xd4\xf8\xcc\xe6", /* 6700 */ "\xd7\xee\x95\xfc\x95\xfd\x95\xfe\x96\x40\x96\x41\x96\x42\x96\x43\xd4\xc2\xd3\xd0\xeb\xc3\xc5\xf3\x96\x44\xb7\xfe\x96\x45\x96\x46\xeb\xd4\x96\x47\x96\x48\x96\x49\xcb\xb7\xeb\xde\x96\x4a\xc0\xca\x96\x4b\x96\x4c\x96\x4d\xcd\xfb\x96\x4e\xb3\xaf\x96\x4f\xc6\xda\x96\x50\x96\x51\x96\x52\x96\x53\x96\x54\x96\x55\xeb\xfc\x96\x56\xc4\xbe\x96\x57\xce\xb4\xc4\xa9\xb1\xbe\xd4\xfd\x96\x58\xca\xf5\x96\x59\xd6\xec\x96\x5a\x96\x5b\xc6\xd3\xb6\xe4\x96\x5c\x96\x5d\x96\x5e\x96\x5f\xbb\xfa\x96\x60\x96\x61\xd0\xe0\x96\x62\x96\x63\xc9\xb1\x96\x64\xd4\xd3\xc8\xa8\x96\x65\x96\x66\xb8\xcb\x96\x67\xe8\xbe\xc9\xbc\x96\x68\x96\x69\xe8\xbb\x96\x6a\xc0\xee\xd0\xd3\xb2\xc4\xb4\xe5\x96\x6b\xe8\xbc\x96\x6c\x96\x6d\xd5\xc8\x96\x6e\x96\x6f\x96\x70\x96\x71\x96\x72\xb6\xc5\x96\x73\xe8\xbd\xca\xf8\xb8\xdc\xcc\xf5\x96\x74\x96\x75\x96\x76\xc0\xb4\x96\x77\x96\x78\xd1\xee\xe8\xbf\xe8\xc2\x96\x79\x96\x7a\xba\xbc\x96\x7b\xb1\xad\xbd\xdc\x96\x7c\xea\xbd\xe8\xc3\x96\x7d\xe8\xc6\x96\x7e\xe8\xcb\x96\x80\x96\x81\x96\x82\x96\x83\xe8\xcc\x96\x84\xcb\xc9\xb0\xe5", /* 6780 */ "\x96\x85\xbc\xab\x96\x86\x96\x87\xb9\xb9\x96\x88\x96\x89\xe8\xc1\x96\x8a\xcd\xf7\x96\x8b\xe8\xca\x96\x8c\x96\x8d\x96\x8e\x96\x8f\xce\xf6\x96\x90\x96\x91\x96\x92\x96\x93\xd5\xed\x96\x94\xc1\xd6\xe8\xc4\x96\x95\xc3\xb6\x96\x96\xb9\xfb\xd6\xa6\xe8\xc8\x96\x97\x96\x98\x96\x99\xca\xe0\xd4\xe6\x96\x9a\xe8\xc0\x96\x9b\xe8\xc5\xe8\xc7\x96\x9c\xc7\xb9\xb7\xe3\x96\x9d\xe8\xc9\x96\x9e\xbf\xdd\xe8\xd2\x96\x9f\x96\xa0\xe8\xd7\x96\xa1\xe8\xd5\xbc\xdc\xbc\xcf\xe8\xdb\x96\xa2\x96\xa3\x96\xa4\x96\xa5\x96\xa6\x96\xa7\x96\xa8\x96\xa9\xe8\xde\x96\xaa\xe8\xda\xb1\xfa\x96\xab\x96\xac\x96\xad\x96\xae\x96\xaf\x96\xb0\x96\xb1\x96\xb2\x96\xb3\x96\xb4\xb0\xd8\xc4\xb3\xb8\xcc\xc6\xe2\xc8\xbe\xc8\xe1\x96\xb5\x96\xb6\x96\xb7\xe8\xcf\xe8\xd4\xe8\xd6\x96\xb8\xb9\xf1\xe8\xd8\xd7\xf5\x96\xb9\xc4\xfb\x96\xba\xe8\xdc\x96\xbb\x96\xbc\xb2\xe9\x96\xbd\x96\xbe\x96\xbf\xe8\xd1\x96\xc0\x96\xc1\xbc\xed\x96\xc2\x96\xc3\xbf\xc2\xe8\xcd\xd6\xf9\x96\xc4\xc1\xf8\xb2\xf1\x96\xc5\x96\xc6\x96\xc7\x96\xc8\x96\xc9\x96\xca\x96\xcb\x96\xcc\xe8\xdf\x96\xcd\xca\xc1", /* 6800 */ "\xe8\xd9\x96\xce\x96\xcf\x96\xd0\x96\xd1\xd5\xa4\x96\xd2\xb1\xea\xd5\xbb\xe8\xce\xe8\xd0\xb6\xb0\xe8\xd3\x96\xd3\xe8\xdd\xc0\xb8\x96\xd4\xca\xf7\x96\xd5\xcb\xa8\x96\xd6\x96\xd7\xc6\xdc\xc0\xf5\x96\xd8\x96\xd9\x96\xda\x96\xdb\x96\xdc\xe8\xe9\x96\xdd\x96\xde\x96\xdf\xd0\xa3\x96\xe0\x96\xe1\x96\xe2\x96\xe3\x96\xe4\x96\xe5\x96\xe6\xe8\xf2\xd6\xea\x96\xe7\x96\xe8\x96\xe9\x96\xea\x96\xeb\x96\xec\x96\xed\xe8\xe0\xe8\xe1\x96\xee\x96\xef\x96\xf0\xd1\xf9\xba\xcb\xb8\xf9\x96\xf1\x96\xf2\xb8\xf1\xd4\xd4\xe8\xef\x96\xf3\xe8\xee\xe8\xec\xb9\xf0\xcc\xd2\xe8\xe6\xce\xa6\xbf\xf2\x96\xf4\xb0\xb8\xe8\xf1\xe8\xf0\x96\xf5\xd7\xc0\x96\xf6\xe8\xe4\x96\xf7\xcd\xa9\xc9\xa3\x96\xf8\xbb\xb8\xbd\xdb\xe8\xea\x96\xf9\x96\xfa\x96\xfb\x96\xfc\x96\xfd\x96\xfe\x97\x40\x97\x41\x97\x42\x97\x43\xe8\xe2\xe8\xe3\xe8\xe5\xb5\xb5\xe8\xe7\xc7\xc5\xe8\xeb\xe8\xed\xbd\xb0\xd7\xae\x97\x44\xe8\xf8\x97\x45\x97\x46\x97\x47\x97\x48\x97\x49\x97\x4a\x97\x4b\x97\x4c\xe8\xf5\x97\x4d\xcd\xb0\xe8\xf6\x97\x4e\x97\x4f\x97\x50\x97\x51\x97\x52\x97\x53\x97\x54\x97\x55", /* 6880 */ "\x97\x56\xc1\xba\x97\x57\xe8\xe8\x97\x58\xc3\xb7\xb0\xf0\x97\x59\x97\x5a\x97\x5b\x97\x5c\x97\x5d\x97\x5e\x97\x5f\x97\x60\xe8\xf4\x97\x61\x97\x62\x97\x63\xe8\xf7\x97\x64\x97\x65\x97\x66\xb9\xa3\x97\x67\x97\x68\x97\x69\x97\x6a\x97\x6b\x97\x6c\x97\x6d\x97\x6e\x97\x6f\x97\x70\xc9\xd2\x97\x71\x97\x72\x97\x73\xc3\xce\xce\xe0\xc0\xe6\x97\x74\x97\x75\x97\x76\x97\x77\xcb\xf3\x97\x78\xcc\xdd\xd0\xb5\x97\x79\x97\x7a\xca\xe1\x97\x7b\xe8\xf3\x97\x7c\x97\x7d\x97\x7e\x97\x80\x97\x81\x97\x82\x97\x83\x97\x84\x97\x85\x97\x86\xbc\xec\x97\x87\xe8\xf9\x97\x88\x97\x89\x97\x8a\x97\x8b\x97\x8c\x97\x8d\xc3\xde\x97\x8e\xc6\xe5\x97\x8f\xb9\xf7\x97\x90\x97\x91\x97\x92\x97\x93\xb0\xf4\x97\x94\x97\x95\xd7\xd8\x97\x96\x97\x97\xbc\xac\x97\x98\xc5\xef\x97\x99\x97\x9a\x97\x9b\x97\x9c\x97\x9d\xcc\xc4\x97\x9e\x97\x9f\xe9\xa6\x97\xa0\x97\xa1\x97\xa2\x97\xa3\x97\xa4\x97\xa5\x97\xa6\x97\xa7\x97\xa8\x97\xa9\xc9\xad\x97\xaa\xe9\xa2\xc0\xe2\x97\xab\x97\xac\x97\xad\xbf\xc3\x97\xae\x97\xaf\x97\xb0\xe8\xfe\xb9\xd7\x97\xb1\xe8\xfb\x97\xb2\x97\xb3\x97\xb4", /* 6900 */ "\x97\xb5\xe9\xa4\x97\xb6\x97\xb7\x97\xb8\xd2\xce\x97\xb9\x97\xba\x97\xbb\x97\xbc\x97\xbd\xe9\xa3\x97\xbe\xd6\xb2\xd7\xb5\x97\xbf\xe9\xa7\x97\xc0\xbd\xb7\x97\xc1\x97\xc2\x97\xc3\x97\xc4\x97\xc5\x97\xc6\x97\xc7\x97\xc8\x97\xc9\x97\xca\x97\xcb\x97\xcc\xe8\xfc\xe8\xfd\x97\xcd\x97\xce\x97\xcf\xe9\xa1\x97\xd0\x97\xd1\x97\xd2\x97\xd3\x97\xd4\x97\xd5\x97\xd6\x97\xd7\xcd\xd6\x97\xd8\x97\xd9\xd2\xac\x97\xda\x97\xdb\x97\xdc\xe9\xb2\x97\xdd\x97\xde\x97\xdf\x97\xe0\xe9\xa9\x97\xe1\x97\xe2\x97\xe3\xb4\xaa\x97\xe4\xb4\xbb\x97\xe5\x97\xe6\xe9\xab\x97\xe7\x97\xe8\x97\xe9\x97\xea\x97\xeb\x97\xec\x97\xed\x97\xee\x97\xef\x97\xf0\x97\xf1\x97\xf2\x97\xf3\x97\xf4\x97\xf5\x97\xf6\x97\xf7\xd0\xa8\x97\xf8\x97\xf9\xe9\xa5\x97\xfa\x97\xfb\xb3\xfe\x97\xfc\x97\xfd\xe9\xac\xc0\xe3\x97\xfe\xe9\xaa\x98\x40\x98\x41\xe9\xb9\x98\x42\x98\x43\xe9\xb8\x98\x44\x98\x45\x98\x46\x98\x47\xe9\xae\x98\x48\x98\x49\xe8\xfa\x98\x4a\x98\x4b\xe9\xa8\x98\x4c\x98\x4d\x98\x4e\x98\x4f\x98\x50\xbf\xac\xe9\xb1\xe9\xba\x98\x51\x98\x52\xc2\xa5\x98\x53\x98\x54\x98\x55", /* 6980 */ "\xe9\xaf\x98\x56\xb8\xc5\x98\x57\xe9\xad\x98\x58\xd3\xdc\xe9\xb4\xe9\xb5\xe9\xb7\x98\x59\x98\x5a\x98\x5b\xe9\xc7\x98\x5c\x98\x5d\x98\x5e\x98\x5f\x98\x60\x98\x61\xc0\xc6\xe9\xc5\x98\x62\x98\x63\xe9\xb0\x98\x64\x98\x65\xe9\xbb\xb0\xf1\x98\x66\x98\x67\x98\x68\x98\x69\x98\x6a\x98\x6b\x98\x6c\x98\x6d\x98\x6e\x98\x6f\xe9\xbc\xd5\xa5\x98\x70\x98\x71\xe9\xbe\x98\x72\xe9\xbf\x98\x73\x98\x74\x98\x75\xe9\xc1\x98\x76\x98\x77\xc1\xf1\x98\x78\x98\x79\xc8\xb6\x98\x7a\x98\x7b\x98\x7c\xe9\xbd\x98\x7d\x98\x7e\x98\x80\x98\x81\x98\x82\xe9\xc2\x98\x83\x98\x84\x98\x85\x98\x86\x98\x87\x98\x88\x98\x89\x98\x8a\xe9\xc3\x98\x8b\xe9\xb3\x98\x8c\xe9\xb6\x98\x8d\xbb\xb1\x98\x8e\x98\x8f\x98\x90\xe9\xc0\x98\x91\x98\x92\x98\x93\x98\x94\x98\x95\x98\x96\xbc\xf7\x98\x97\x98\x98\x98\x99\xe9\xc4\xe9\xc6\x98\x9a\x98\x9b\x98\x9c\x98\x9d\x98\x9e\x98\x9f\x98\xa0\x98\xa1\x98\xa2\x98\xa3\x98\xa4\x98\xa5\xe9\xca\x98\xa6\x98\xa7\x98\xa8\x98\xa9\xe9\xce\x98\xaa\x98\xab\x98\xac\x98\xad\x98\xae\x98\xaf\x98\xb0\x98\xb1\x98\xb2\x98\xb3\xb2\xdb\x98\xb4\xe9\xc8", /* 6a00 */ "\x98\xb5\x98\xb6\x98\xb7\x98\xb8\x98\xb9\x98\xba\x98\xbb\x98\xbc\x98\xbd\x98\xbe\xb7\xae\x98\xbf\x98\xc0\x98\xc1\x98\xc2\x98\xc3\x98\xc4\x98\xc5\x98\xc6\x98\xc7\x98\xc8\x98\xc9\x98\xca\xe9\xcb\xe9\xcc\x98\xcb\x98\xcc\x98\xcd\x98\xce\x98\xcf\x98\xd0\xd5\xc1\x98\xd1\xc4\xa3\x98\xd2\x98\xd3\x98\xd4\x98\xd5\x98\xd6\x98\xd7\xe9\xd8\x98\xd8\xba\xe1\x98\xd9\x98\xda\x98\xdb\x98\xdc\xe9\xc9\x98\xdd\xd3\xa3\x98\xde\x98\xdf\x98\xe0\xe9\xd4\x98\xe1\x98\xe2\x98\xe3\x98\xe4\x98\xe5\x98\xe6\x98\xe7\xe9\xd7\xe9\xd0\x98\xe8\x98\xe9\x98\xea\x98\xeb\x98\xec\xe9\xcf\x98\xed\x98\xee\xc7\xc1\x98\xef\x98\xf0\x98\xf1\x98\xf2\x98\xf3\x98\xf4\x98\xf5\x98\xf6\xe9\xd2\x98\xf7\x98\xf8\x98\xf9\x98\xfa\x98\xfb\x98\xfc\x98\xfd\xe9\xd9\xb3\xc8\x98\xfe\xe9\xd3\x99\x40\x99\x41\x99\x42\x99\x43\x99\x44\xcf\xf0\x99\x45\x99\x46\x99\x47\xe9\xcd\x99\x48\x99\x49\x99\x4a\x99\x4b\x99\x4c\x99\x4d\x99\x4e\x99\x4f\x99\x50\x99\x51\x99\x52\xb3\xf7\x99\x53\x99\x54\x99\x55\x99\x56\x99\x57\x99\x58\x99\x59\xe9\xd6\x99\x5a\x99\x5b\xe9\xda\x99\x5c\x99\x5d\x99\x5e", /* 6a80 */ "\xcc\xb4\x99\x5f\x99\x60\x99\x61\xcf\xad\x99\x62\x99\x63\x99\x64\x99\x65\x99\x66\x99\x67\x99\x68\x99\x69\x99\x6a\xe9\xd5\x99\x6b\xe9\xdc\xe9\xdb\x99\x6c\x99\x6d\x99\x6e\x99\x6f\x99\x70\xe9\xde\x99\x71\x99\x72\x99\x73\x99\x74\x99\x75\x99\x76\x99\x77\x99\x78\xe9\xd1\x99\x79\x99\x7a\x99\x7b\x99\x7c\x99\x7d\x99\x7e\x99\x80\x99\x81\xe9\xdd\x99\x82\xe9\xdf\xc3\xca\x99\x83\x99\x84\x99\x85\x99\x86\x99\x87\x99\x88\x99\x89\x99\x8a\x99\x8b\x99\x8c\x99\x8d\x99\x8e\x99\x8f\x99\x90\x99\x91\x99\x92\x99\x93\x99\x94\x99\x95\x99\x96\x99\x97\x99\x98\x99\x99\x99\x9a\x99\x9b\x99\x9c\x99\x9d\x99\x9e\x99\x9f\x99\xa0\x99\xa1\x99\xa2\x99\xa3\x99\xa4\x99\xa5\x99\xa6\x99\xa7\x99\xa8\x99\xa9\x99\xaa\x99\xab\x99\xac\x99\xad\x99\xae\x99\xaf\x99\xb0\x99\xb1\x99\xb2\x99\xb3\x99\xb4\x99\xb5\x99\xb6\x99\xb7\x99\xb8\x99\xb9\x99\xba\x99\xbb\x99\xbc\x99\xbd\x99\xbe\x99\xbf\x99\xc0\x99\xc1\x99\xc2\x99\xc3\x99\xc4\x99\xc5\x99\xc6\x99\xc7\x99\xc8\x99\xc9\x99\xca\x99\xcb\x99\xcc\x99\xcd\x99\xce\x99\xcf\x99\xd0\x99\xd1\x99\xd2\x99\xd3\x99\xd4\x99\xd5", /* 6b00 */ "\x99\xd6\x99\xd7\x99\xd8\x99\xd9\x99\xda\x99\xdb\x99\xdc\x99\xdd\x99\xde\x99\xdf\x99\xe0\x99\xe1\x99\xe2\x99\xe3\x99\xe4\x99\xe5\x99\xe6\x99\xe7\x99\xe8\x99\xe9\x99\xea\x99\xeb\x99\xec\x99\xed\x99\xee\x99\xef\x99\xf0\x99\xf1\x99\xf2\x99\xf3\x99\xf4\x99\xf5\xc7\xb7\xb4\xce\xbb\xb6\xd0\xc0\xec\xa3\x99\xf6\x99\xf7\xc5\xb7\x99\xf8\x99\xf9\x99\xfa\x99\xfb\x99\xfc\x99\xfd\x99\xfe\x9a\x40\x9a\x41\x9a\x42\xd3\xfb\x9a\x43\x9a\x44\x9a\x45\x9a\x46\xec\xa4\x9a\x47\xec\xa5\xc6\xdb\x9a\x48\x9a\x49\x9a\x4a\xbf\xee\x9a\x4b\x9a\x4c\x9a\x4d\x9a\x4e\xec\xa6\x9a\x4f\x9a\x50\xec\xa7\xd0\xaa\x9a\x51\xc7\xb8\x9a\x52\x9a\x53\xb8\xe8\x9a\x54\x9a\x55\x9a\x56\x9a\x57\x9a\x58\x9a\x59\x9a\x5a\x9a\x5b\x9a\x5c\x9a\x5d\x9a\x5e\x9a\x5f\xec\xa8\x9a\x60\x9a\x61\x9a\x62\x9a\x63\x9a\x64\x9a\x65\x9a\x66\x9a\x67\xd6\xb9\xd5\xfd\xb4\xcb\xb2\xbd\xce\xe4\xc6\xe7\x9a\x68\x9a\x69\xcd\xe1\x9a\x6a\x9a\x6b\x9a\x6c\x9a\x6d\x9a\x6e\x9a\x6f\x9a\x70\x9a\x71\x9a\x72\x9a\x73\x9a\x74\x9a\x75\x9a\x76\x9a\x77\xb4\xf5\x9a\x78\xcb\xc0\xbc\xdf\x9a\x79\x9a\x7a\x9a\x7b", /* 6b80 */ "\x9a\x7c\xe9\xe2\xe9\xe3\xd1\xea\xe9\xe5\x9a\x7d\xb4\xf9\xe9\xe4\x9a\x7e\xd1\xb3\xca\xe2\xb2\xd0\x9a\x80\xe9\xe8\x9a\x81\x9a\x82\x9a\x83\x9a\x84\xe9\xe6\xe9\xe7\x9a\x85\x9a\x86\xd6\xb3\x9a\x87\x9a\x88\x9a\x89\xe9\xe9\xe9\xea\x9a\x8a\x9a\x8b\x9a\x8c\x9a\x8d\x9a\x8e\xe9\xeb\x9a\x8f\x9a\x90\x9a\x91\x9a\x92\x9a\x93\x9a\x94\x9a\x95\x9a\x96\xe9\xec\x9a\x97\x9a\x98\x9a\x99\x9a\x9a\x9a\x9b\x9a\x9c\x9a\x9d\x9a\x9e\xec\xaf\xc5\xb9\xb6\xce\x9a\x9f\xd2\xf3\x9a\xa0\x9a\xa1\x9a\xa2\x9a\xa3\x9a\xa4\x9a\xa5\x9a\xa6\xb5\xee\x9a\xa7\xbb\xd9\xec\xb1\x9a\xa8\x9a\xa9\xd2\xe3\x9a\xaa\x9a\xab\x9a\xac\x9a\xad\x9a\xae\xce\xe3\x9a\xaf\xc4\xb8\x9a\xb0\xc3\xbf\x9a\xb1\x9a\xb2\xb6\xbe\xd8\xb9\xb1\xc8\xb1\xcf\xb1\xd1\xc5\xfe\x9a\xb3\xb1\xd0\x9a\xb4\xc3\xab\x9a\xb5\x9a\xb6\x9a\xb7\x9a\xb8\x9a\xb9\xd5\xb1\x9a\xba\x9a\xbb\x9a\xbc\x9a\xbd\x9a\xbe\x9a\xbf\x9a\xc0\x9a\xc1\xeb\xa4\xba\xc1\x9a\xc2\x9a\xc3\x9a\xc4\xcc\xba\x9a\xc5\x9a\xc6\x9a\xc7\xeb\xa5\x9a\xc8\xeb\xa7\x9a\xc9\x9a\xca\x9a\xcb\xeb\xa8\x9a\xcc\x9a\xcd\x9a\xce\xeb\xa6\x9a\xcf\x9a\xd0", /* 6c00 */ "\x9a\xd1\x9a\xd2\x9a\xd3\x9a\xd4\x9a\xd5\xeb\xa9\xeb\xab\xeb\xaa\x9a\xd6\x9a\xd7\x9a\xd8\x9a\xd9\x9a\xda\xeb\xac\x9a\xdb\xca\xcf\xd8\xb5\xc3\xf1\x9a\xdc\xc3\xa5\xc6\xf8\xeb\xad\xc4\xca\x9a\xdd\xeb\xae\xeb\xaf\xeb\xb0\xb7\xd5\x9a\xde\x9a\xdf\x9a\xe0\xb7\xfa\x9a\xe1\xeb\xb1\xc7\xe2\x9a\xe2\xeb\xb3\x9a\xe3\xba\xa4\xd1\xf5\xb0\xb1\xeb\xb2\xeb\xb4\x9a\xe4\x9a\xe5\x9a\xe6\xb5\xaa\xc2\xc8\xc7\xe8\x9a\xe7\xeb\xb5\x9a\xe8\xcb\xae\xe3\xdf\x9a\xe9\x9a\xea\xd3\xc0\x9a\xeb\x9a\xec\x9a\xed\x9a\xee\xd9\xdb\x9a\xef\x9a\xf0\xcd\xa1\xd6\xad\xc7\xf3\x9a\xf1\x9a\xf2\x9a\xf3\xd9\xe0\xbb\xe3\x9a\xf4\xba\xba\xe3\xe2\x9a\xf5\x9a\xf6\x9a\xf7\x9a\xf8\x9a\xf9\xcf\xab\x9a\xfa\x9a\xfb\x9a\xfc\xe3\xe0\xc9\xc7\x9a\xfd\xba\xb9\x9a\xfe\x9b\x40\x9b\x41\xd1\xb4\xe3\xe1\xc8\xea\xb9\xaf\xbd\xad\xb3\xd8\xce\xdb\x9b\x42\x9b\x43\xcc\xc0\x9b\x44\x9b\x45\x9b\x46\xe3\xe8\xe3\xe9\xcd\xf4\x9b\x47\x9b\x48\x9b\x49\x9b\x4a\x9b\x4b\xcc\xad\x9b\x4c\xbc\xb3\x9b\x4d\xe3\xea\x9b\x4e\xe3\xeb\x9b\x4f\x9b\x50\xd0\xda\x9b\x51\x9b\x52\x9b\x53\xc6\xfb\xb7\xda\x9b\x54", /* 6c80 */ "\x9b\x55\xc7\xdf\xd2\xca\xce\xd6\x9b\x56\xe3\xe4\xe3\xec\x9b\x57\xc9\xf2\xb3\xc1\x9b\x58\x9b\x59\xe3\xe7\x9b\x5a\x9b\x5b\xc6\xe3\xe3\xe5\x9b\x5c\x9b\x5d\xed\xb3\xe3\xe6\x9b\x5e\x9b\x5f\x9b\x60\x9b\x61\xc9\xb3\x9b\x62\xc5\xe6\x9b\x63\x9b\x64\x9b\x65\xb9\xb5\x9b\x66\xc3\xbb\x9b\x67\xe3\xe3\xc5\xbd\xc1\xa4\xc2\xd9\xb2\xd7\x9b\x68\xe3\xed\xbb\xa6\xc4\xad\x9b\x69\xe3\xf0\xbe\xda\x9b\x6a\x9b\x6b\xe3\xfb\xe3\xf5\xba\xd3\x9b\x6c\x9b\x6d\x9b\x6e\x9b\x6f\xb7\xd0\xd3\xcd\x9b\x70\xd6\xce\xd5\xd3\xb9\xc1\xd5\xb4\xd1\xd8\x9b\x71\x9b\x72\x9b\x73\x9b\x74\xd0\xb9\xc7\xf6\x9b\x75\x9b\x76\x9b\x77\xc8\xaa\xb2\xb4\x9b\x78\xc3\xda\x9b\x79\x9b\x7a\x9b\x7b\xe3\xee\x9b\x7c\x9b\x7d\xe3\xfc\xe3\xef\xb7\xa8\xe3\xf7\xe3\xf4\x9b\x7e\x9b\x80\x9b\x81\xb7\xba\x9b\x82\x9b\x83\xc5\xa2\x9b\x84\xe3\xf6\xc5\xdd\xb2\xa8\xc6\xfc\x9b\x85\xc4\xe0\x9b\x86\x9b\x87\xd7\xa2\x9b\x88\xc0\xe1\xe3\xf9\x9b\x89\x9b\x8a\xe3\xfa\xe3\xfd\xcc\xa9\xe3\xf3\x9b\x8b\xd3\xbe\x9b\x8c\xb1\xc3\xed\xb4\xe3\xf1\xe3\xf2\x9b\x8d\xe3\xf8\xd0\xba\xc6\xc3\xd4\xf3\xe3\xfe\x9b\x8e", /* 6d00 */ "\x9b\x8f\xbd\xe0\x9b\x90\x9b\x91\xe4\xa7\x9b\x92\x9b\x93\xe4\xa6\x9b\x94\x9b\x95\x9b\x96\xd1\xf3\xe4\xa3\x9b\x97\xe4\xa9\x9b\x98\x9b\x99\x9b\x9a\xc8\xf7\x9b\x9b\x9b\x9c\x9b\x9d\x9b\x9e\xcf\xb4\x9b\x9f\xe4\xa8\xe4\xae\xc2\xe5\x9b\xa0\x9b\xa1\xb6\xb4\x9b\xa2\x9b\xa3\x9b\xa4\x9b\xa5\x9b\xa6\x9b\xa7\xbd\xf2\x9b\xa8\xe4\xa2\x9b\xa9\x9b\xaa\xba\xe9\xe4\xaa\x9b\xab\x9b\xac\xe4\xac\x9b\xad\x9b\xae\xb6\xfd\xd6\xde\xe4\xb2\x9b\xaf\xe4\xad\x9b\xb0\x9b\xb1\x9b\xb2\xe4\xa1\x9b\xb3\xbb\xee\xcd\xdd\xc7\xa2\xc5\xc9\x9b\xb4\x9b\xb5\xc1\xf7\x9b\xb6\xe4\xa4\x9b\xb7\xc7\xb3\xbd\xac\xbd\xbd\xe4\xa5\x9b\xb8\xd7\xc7\xb2\xe2\x9b\xb9\xe4\xab\xbc\xc3\xe4\xaf\x9b\xba\xbb\xeb\xe4\xb0\xc5\xa8\xe4\xb1\x9b\xbb\x9b\xbc\x9b\xbd\x9b\xbe\xd5\xe3\xbf\xa3\x9b\xbf\xe4\xba\x9b\xc0\xe4\xb7\x9b\xc1\xe4\xbb\x9b\xc2\x9b\xc3\xe4\xbd\x9b\xc4\x9b\xc5\xc6\xd6\x9b\xc6\x9b\xc7\xba\xc6\xc0\xcb\x9b\xc8\x9b\xc9\x9b\xca\xb8\xa1\xe4\xb4\x9b\xcb\x9b\xcc\x9b\xcd\x9b\xce\xd4\xa1\x9b\xcf\x9b\xd0\xba\xa3\xbd\xfe\x9b\xd1\x9b\xd2\x9b\xd3\xe4\xbc\x9b\xd4\x9b\xd5\x9b\xd6", /* 6d80 */ "\x9b\xd7\x9b\xd8\xcd\xbf\x9b\xd9\x9b\xda\xc4\xf9\x9b\xdb\x9b\xdc\xcf\xfb\xc9\xe6\x9b\xdd\x9b\xde\xd3\xbf\x9b\xdf\xcf\xd1\x9b\xe0\x9b\xe1\xe4\xb3\x9b\xe2\xe4\xb8\xe4\xb9\xcc\xe9\x9b\xe3\x9b\xe4\x9b\xe5\x9b\xe6\x9b\xe7\xcc\xce\x9b\xe8\xc0\xd4\xe4\xb5\xc1\xb0\xe4\xb6\xce\xd0\x9b\xe9\xbb\xc1\xb5\xd3\x9b\xea\xc8\xf3\xbd\xa7\xd5\xc7\xc9\xac\xb8\xa2\xe4\xca\x9b\xeb\x9b\xec\xe4\xcc\xd1\xc4\x9b\xed\x9b\xee\xd2\xba\x9b\xef\x9b\xf0\xba\xad\x9b\xf1\x9b\xf2\xba\xd4\x9b\xf3\x9b\xf4\x9b\xf5\x9b\xf6\x9b\xf7\x9b\xf8\xe4\xc3\xb5\xed\x9b\xf9\x9b\xfa\x9b\xfb\xd7\xcd\xe4\xc0\xcf\xfd\xe4\xbf\x9b\xfc\x9b\xfd\x9b\xfe\xc1\xdc\xcc\xca\x9c\x40\x9c\x41\x9c\x42\x9c\x43\xca\xe7\x9c\x44\x9c\x45\x9c\x46\x9c\x47\xc4\xd7\x9c\x48\xcc\xd4\xe4\xc8\x9c\x49\x9c\x4a\x9c\x4b\xe4\xc7\xe4\xc1\x9c\x4c\xe4\xc4\xb5\xad\x9c\x4d\x9c\x4e\xd3\xd9\x9c\x4f\xe4\xc6\x9c\x50\x9c\x51\x9c\x52\x9c\x53\xd2\xf9\xb4\xe3\x9c\x54\xbb\xb4\x9c\x55\x9c\x56\xc9\xee\x9c\x57\xb4\xbe\x9c\x58\x9c\x59\x9c\x5a\xbb\xec\x9c\x5b\xd1\xcd\x9c\x5c\xcc\xed\xed\xb5\x9c\x5d\x9c\x5e\x9c\x5f", /* 6e00 */ "\x9c\x60\x9c\x61\x9c\x62\x9c\x63\x9c\x64\xc7\xe5\x9c\x65\x9c\x66\x9c\x67\x9c\x68\xd4\xa8\x9c\x69\xe4\xcb\xd7\xd5\xe4\xc2\x9c\x6a\xbd\xa5\xe4\xc5\x9c\x6b\x9c\x6c\xd3\xe6\x9c\x6d\xe4\xc9\xc9\xf8\x9c\x6e\x9c\x6f\xe4\xbe\x9c\x70\x9c\x71\xd3\xe5\x9c\x72\x9c\x73\xc7\xfe\xb6\xc9\x9c\x74\xd4\xfc\xb2\xb3\xe4\xd7\x9c\x75\x9c\x76\x9c\x77\xce\xc2\x9c\x78\xe4\xcd\x9c\x79\xce\xbc\x9c\x7a\xb8\xdb\x9c\x7b\x9c\x7c\xe4\xd6\x9c\x7d\xbf\xca\x9c\x7e\x9c\x80\x9c\x81\xd3\xce\x9c\x82\xc3\xec\x9c\x83\x9c\x84\x9c\x85\x9c\x86\x9c\x87\x9c\x88\x9c\x89\x9c\x8a\xc5\xc8\xe4\xd8\x9c\x8b\x9c\x8c\x9c\x8d\x9c\x8e\x9c\x8f\x9c\x90\x9c\x91\x9c\x92\xcd\xc4\xe4\xcf\x9c\x93\x9c\x94\x9c\x95\x9c\x96\xe4\xd4\xe4\xd5\x9c\x97\xba\xfe\x9c\x98\xcf\xe6\x9c\x99\x9c\x9a\xd5\xbf\x9c\x9b\x9c\x9c\x9c\x9d\xe4\xd2\x9c\x9e\x9c\x9f\x9c\xa0\x9c\xa1\x9c\xa2\x9c\xa3\x9c\xa4\x9c\xa5\x9c\xa6\x9c\xa7\x9c\xa8\xe4\xd0\x9c\xa9\x9c\xaa\xe4\xce\x9c\xab\x9c\xac\x9c\xad\x9c\xae\x9c\xaf\x9c\xb0\x9c\xb1\x9c\xb2\x9c\xb3\x9c\xb4\x9c\xb5\x9c\xb6\x9c\xb7\x9c\xb8\x9c\xb9\xcd\xe5\xca\xaa", /* 6e80 */ "\x9c\xba\x9c\xbb\x9c\xbc\xc0\xa3\x9c\xbd\xbd\xa6\xe4\xd3\x9c\xbe\x9c\xbf\xb8\xc8\x9c\xc0\x9c\xc1\x9c\xc2\x9c\xc3\x9c\xc4\xe4\xe7\xd4\xb4\x9c\xc5\x9c\xc6\x9c\xc7\x9c\xc8\x9c\xc9\x9c\xca\x9c\xcb\xe4\xdb\x9c\xcc\x9c\xcd\x9c\xce\xc1\xef\x9c\xcf\x9c\xd0\xe4\xe9\x9c\xd1\x9c\xd2\xd2\xe7\x9c\xd3\x9c\xd4\xe4\xdf\x9c\xd5\xe4\xe0\x9c\xd6\x9c\xd7\xcf\xaa\x9c\xd8\x9c\xd9\x9c\xda\x9c\xdb\xcb\xdd\x9c\xdc\xe4\xda\xe4\xd1\x9c\xdd\xe4\xe5\x9c\xde\xc8\xdc\xe4\xe3\x9c\xdf\x9c\xe0\xc4\xe7\xe4\xe2\x9c\xe1\xe4\xe1\x9c\xe2\x9c\xe3\x9c\xe4\xb3\xfc\xe4\xe8\x9c\xe5\x9c\xe6\x9c\xe7\x9c\xe8\xb5\xe1\x9c\xe9\x9c\xea\x9c\xeb\xd7\xcc\x9c\xec\x9c\xed\x9c\xee\xe4\xe6\x9c\xef\xbb\xac\x9c\xf0\xd7\xd2\xcc\xcf\xeb\xf8\x9c\xf1\xe4\xe4\x9c\xf2\x9c\xf3\xb9\xf6\x9c\xf4\x9c\xf5\x9c\xf6\xd6\xcd\xe4\xd9\xe4\xdc\xc2\xfa\xe4\xde\x9c\xf7\xc2\xcb\xc0\xc4\xc2\xd0\x9c\xf8\xb1\xf5\xcc\xb2\x9c\xf9\x9c\xfa\x9c\xfb\x9c\xfc\x9c\xfd\x9c\xfe\x9d\x40\x9d\x41\x9d\x42\x9d\x43\xb5\xce\x9d\x44\x9d\x45\x9d\x46\x9d\x47\xe4\xef\x9d\x48\x9d\x49\x9d\x4a\x9d\x4b\x9d\x4c\x9d\x4d", /* 6f00 */ "\x9d\x4e\x9d\x4f\xc6\xaf\x9d\x50\x9d\x51\x9d\x52\xc6\xe1\x9d\x53\x9d\x54\xe4\xf5\x9d\x55\x9d\x56\x9d\x57\x9d\x58\x9d\x59\xc2\xa9\x9d\x5a\x9d\x5b\x9d\x5c\xc0\xec\xd1\xdd\xe4\xee\x9d\x5d\x9d\x5e\x9d\x5f\x9d\x60\x9d\x61\x9d\x62\x9d\x63\x9d\x64\x9d\x65\x9d\x66\xc4\xae\x9d\x67\x9d\x68\x9d\x69\xe4\xed\x9d\x6a\x9d\x6b\x9d\x6c\x9d\x6d\xe4\xf6\xe4\xf4\xc2\xfe\x9d\x6e\xe4\xdd\x9d\x6f\xe4\xf0\x9d\x70\xca\xfe\x9d\x71\xd5\xc4\x9d\x72\x9d\x73\xe4\xf1\x9d\x74\x9d\x75\x9d\x76\x9d\x77\x9d\x78\x9d\x79\x9d\x7a\xd1\xfa\x9d\x7b\x9d\x7c\x9d\x7d\x9d\x7e\x9d\x80\x9d\x81\x9d\x82\xe4\xeb\xe4\xec\x9d\x83\x9d\x84\x9d\x85\xe4\xf2\x9d\x86\xce\xab\x9d\x87\x9d\x88\x9d\x89\x9d\x8a\x9d\x8b\x9d\x8c\x9d\x8d\x9d\x8e\x9d\x8f\x9d\x90\xc5\xcb\x9d\x91\x9d\x92\x9d\x93\xc7\xb1\x9d\x94\xc2\xba\x9d\x95\x9d\x96\x9d\x97\xe4\xea\x9d\x98\x9d\x99\x9d\x9a\xc1\xca\x9d\x9b\x9d\x9c\x9d\x9d\x9d\x9e\x9d\x9f\x9d\xa0\xcc\xb6\xb3\xb1\x9d\xa1\x9d\xa2\x9d\xa3\xe4\xfb\x9d\xa4\xe4\xf3\x9d\xa5\x9d\xa6\x9d\xa7\xe4\xfa\x9d\xa8\xe4\xfd\x9d\xa9\xe4\xfc\x9d\xaa\x9d\xab\x9d\xac", /* 6f80 */ "\x9d\xad\x9d\xae\x9d\xaf\x9d\xb0\xb3\xce\x9d\xb1\x9d\xb2\x9d\xb3\xb3\xba\xe4\xf7\x9d\xb4\x9d\xb5\xe4\xf9\xe4\xf8\xc5\xec\x9d\xb6\x9d\xb7\x9d\xb8\x9d\xb9\x9d\xba\x9d\xbb\x9d\xbc\x9d\xbd\x9d\xbe\x9d\xbf\x9d\xc0\x9d\xc1\x9d\xc2\xc0\xbd\x9d\xc3\x9d\xc4\x9d\xc5\x9d\xc6\xd4\xe8\x9d\xc7\x9d\xc8\x9d\xc9\x9d\xca\x9d\xcb\xe5\xa2\x9d\xcc\x9d\xcd\x9d\xce\x9d\xcf\x9d\xd0\x9d\xd1\x9d\xd2\x9d\xd3\x9d\xd4\x9d\xd5\x9d\xd6\xb0\xc4\x9d\xd7\x9d\xd8\xe5\xa4\x9d\xd9\x9d\xda\xe5\xa3\x9d\xdb\x9d\xdc\x9d\xdd\x9d\xde\x9d\xdf\x9d\xe0\xbc\xa4\x9d\xe1\xe5\xa5\x9d\xe2\x9d\xe3\x9d\xe4\x9d\xe5\x9d\xe6\x9d\xe7\xe5\xa1\x9d\xe8\x9d\xe9\x9d\xea\x9d\xeb\x9d\xec\x9d\xed\x9d\xee\xe4\xfe\xb1\xf4\x9d\xef\x9d\xf0\x9d\xf1\x9d\xf2\x9d\xf3\x9d\xf4\x9d\xf5\x9d\xf6\x9d\xf7\x9d\xf8\x9d\xf9\xe5\xa8\x9d\xfa\xe5\xa9\xe5\xa6\x9d\xfb\x9d\xfc\x9d\xfd\x9d\xfe\x9e\x40\x9e\x41\x9e\x42\x9e\x43\x9e\x44\x9e\x45\x9e\x46\x9e\x47\xe5\xa7\xe5\xaa\x9e\x48\x9e\x49\x9e\x4a\x9e\x4b\x9e\x4c\x9e\x4d\x9e\x4e\x9e\x4f\x9e\x50\x9e\x51\x9e\x52\x9e\x53\x9e\x54\x9e\x55\x9e\x56\x9e\x57", /* 7000 */ "\x9e\x58\x9e\x59\x9e\x5a\x9e\x5b\x9e\x5c\x9e\x5d\x9e\x5e\x9e\x5f\x9e\x60\x9e\x61\x9e\x62\x9e\x63\x9e\x64\x9e\x65\x9e\x66\x9e\x67\x9e\x68\xc6\xd9\x9e\x69\x9e\x6a\x9e\x6b\x9e\x6c\x9e\x6d\x9e\x6e\x9e\x6f\x9e\x70\xe5\xab\xe5\xad\x9e\x71\x9e\x72\x9e\x73\x9e\x74\x9e\x75\x9e\x76\x9e\x77\xe5\xac\x9e\x78\x9e\x79\x9e\x7a\x9e\x7b\x9e\x7c\x9e\x7d\x9e\x7e\x9e\x80\x9e\x81\x9e\x82\x9e\x83\x9e\x84\x9e\x85\x9e\x86\x9e\x87\x9e\x88\x9e\x89\xe5\xaf\x9e\x8a\x9e\x8b\x9e\x8c\xe5\xae\x9e\x8d\x9e\x8e\x9e\x8f\x9e\x90\x9e\x91\x9e\x92\x9e\x93\x9e\x94\x9e\x95\x9e\x96\x9e\x97\x9e\x98\x9e\x99\x9e\x9a\x9e\x9b\x9e\x9c\x9e\x9d\x9e\x9e\xb9\xe0\x9e\x9f\x9e\xa0\xe5\xb0\x9e\xa1\x9e\xa2\x9e\xa3\x9e\xa4\x9e\xa5\x9e\xa6\x9e\xa7\x9e\xa8\x9e\xa9\x9e\xaa\x9e\xab\x9e\xac\x9e\xad\x9e\xae\xe5\xb1\x9e\xaf\x9e\xb0\x9e\xb1\x9e\xb2\x9e\xb3\x9e\xb4\x9e\xb5\x9e\xb6\x9e\xb7\x9e\xb8\x9e\xb9\x9e\xba\xbb\xf0\xec\xe1\xc3\xf0\x9e\xbb\xb5\xc6\xbb\xd2\x9e\xbc\x9e\xbd\x9e\xbe\x9e\xbf\xc1\xe9\xd4\xee\x9e\xc0\xbe\xc4\x9e\xc1\x9e\xc2\x9e\xc3\xd7\xc6\x9e\xc4\xd4\xd6\xb2\xd3", /* 7080 */ "\xec\xbe\x9e\xc5\x9e\xc6\x9e\xc7\x9e\xc8\xea\xc1\x9e\xc9\x9e\xca\x9e\xcb\xc2\xaf\xb4\xb6\x9e\xcc\x9e\xcd\x9e\xce\xd1\xd7\x9e\xcf\x9e\xd0\x9e\xd1\xb3\xb4\x9e\xd2\xc8\xb2\xbf\xbb\xec\xc0\x9e\xd3\x9e\xd4\xd6\xcb\x9e\xd5\x9e\xd6\xec\xbf\xec\xc1\x9e\xd7\x9e\xd8\x9e\xd9\x9e\xda\x9e\xdb\x9e\xdc\x9e\xdd\x9e\xde\x9e\xdf\x9e\xe0\x9e\xe1\x9e\xe2\x9e\xe3\xec\xc5\xbe\xe6\xcc\xbf\xc5\xda\xbe\xbc\x9e\xe4\xec\xc6\x9e\xe5\xb1\xfe\x9e\xe6\x9e\xe7\x9e\xe8\xec\xc4\xd5\xa8\xb5\xe3\x9e\xe9\xec\xc2\xc1\xb6\xb3\xe3\x9e\xea\x9e\xeb\xec\xc3\xcb\xb8\xc0\xc3\xcc\xfe\x9e\xec\x9e\xed\x9e\xee\x9e\xef\xc1\xd2\x9e\xf0\xec\xc8\x9e\xf1\x9e\xf2\x9e\xf3\x9e\xf4\x9e\xf5\x9e\xf6\x9e\xf7\x9e\xf8\x9e\xf9\x9e\xfa\x9e\xfb\x9e\xfc\x9e\xfd\xba\xe6\xc0\xd3\x9e\xfe\xd6\xf2\x9f\x40\x9f\x41\x9f\x42\xd1\xcc\x9f\x43\x9f\x44\x9f\x45\x9f\x46\xbf\xbe\x9f\x47\xb7\xb3\xc9\xd5\xec\xc7\xbb\xe2\x9f\x48\xcc\xcc\xbd\xfd\xc8\xc8\x9f\x49\xcf\xa9\x9f\x4a\x9f\x4b\x9f\x4c\x9f\x4d\x9f\x4e\x9f\x4f\x9f\x50\xcd\xe9\x9f\x51\xc5\xeb\x9f\x52\x9f\x53\x9f\x54\xb7\xe9\x9f\x55\x9f\x56", /* 7100 */ "\x9f\x57\x9f\x58\x9f\x59\x9f\x5a\x9f\x5b\x9f\x5c\x9f\x5d\x9f\x5e\x9f\x5f\xd1\xc9\xba\xb8\x9f\x60\x9f\x61\x9f\x62\x9f\x63\x9f\x64\xec\xc9\x9f\x65\x9f\x66\xec\xca\x9f\x67\xbb\xc0\xec\xcb\x9f\x68\xec\xe2\xb1\xba\xb7\xd9\x9f\x69\x9f\x6a\x9f\x6b\x9f\x6c\x9f\x6d\x9f\x6e\x9f\x6f\x9f\x70\x9f\x71\x9f\x72\x9f\x73\xbd\xb9\x9f\x74\x9f\x75\x9f\x76\x9f\x77\x9f\x78\x9f\x79\x9f\x7a\x9f\x7b\xec\xcc\xd1\xe6\xec\xcd\x9f\x7c\x9f\x7d\x9f\x7e\x9f\x80\xc8\xbb\x9f\x81\x9f\x82\x9f\x83\x9f\x84\x9f\x85\x9f\x86\x9f\x87\x9f\x88\x9f\x89\x9f\x8a\x9f\x8b\x9f\x8c\x9f\x8d\x9f\x8e\xec\xd1\x9f\x8f\x9f\x90\x9f\x91\x9f\x92\xec\xd3\x9f\x93\xbb\xcd\x9f\x94\xbc\xe5\x9f\x95\x9f\x96\x9f\x97\x9f\x98\x9f\x99\x9f\x9a\x9f\x9b\x9f\x9c\x9f\x9d\x9f\x9e\x9f\x9f\x9f\xa0\x9f\xa1\xec\xcf\x9f\xa2\xc9\xb7\x9f\xa3\x9f\xa4\x9f\xa5\x9f\xa6\x9f\xa7\xc3\xba\x9f\xa8\xec\xe3\xd5\xd5\xec\xd0\x9f\xa9\x9f\xaa\x9f\xab\x9f\xac\x9f\xad\xd6\xf3\x9f\xae\x9f\xaf\x9f\xb0\xec\xd2\xec\xce\x9f\xb1\x9f\xb2\x9f\xb3\x9f\xb4\xec\xd4\x9f\xb5\xec\xd5\x9f\xb6\x9f\xb7\xc9\xbf\x9f\xb8\x9f\xb9", /* 7180 */ "\x9f\xba\x9f\xbb\x9f\xbc\x9f\xbd\xcf\xa8\x9f\xbe\x9f\xbf\x9f\xc0\x9f\xc1\x9f\xc2\xd0\xdc\x9f\xc3\x9f\xc4\x9f\xc5\x9f\xc6\xd1\xac\x9f\xc7\x9f\xc8\x9f\xc9\x9f\xca\xc8\xdb\x9f\xcb\x9f\xcc\x9f\xcd\xec\xd6\xce\xf5\x9f\xce\x9f\xcf\x9f\xd0\x9f\xd1\x9f\xd2\xca\xec\xec\xda\x9f\xd3\x9f\xd4\x9f\xd5\x9f\xd6\x9f\xd7\x9f\xd8\x9f\xd9\xec\xd9\x9f\xda\x9f\xdb\x9f\xdc\xb0\xbe\x9f\xdd\x9f\xde\x9f\xdf\x9f\xe0\x9f\xe1\x9f\xe2\xec\xd7\x9f\xe3\xec\xd8\x9f\xe4\x9f\xe5\x9f\xe6\xec\xe4\x9f\xe7\x9f\xe8\x9f\xe9\x9f\xea\x9f\xeb\x9f\xec\x9f\xed\x9f\xee\x9f\xef\xc8\xbc\x9f\xf0\x9f\xf1\x9f\xf2\x9f\xf3\x9f\xf4\x9f\xf5\x9f\xf6\x9f\xf7\x9f\xf8\x9f\xf9\xc1\xc7\x9f\xfa\x9f\xfb\x9f\xfc\x9f\xfd\x9f\xfe\xec\xdc\xd1\xe0\xa0\x40\xa0\x41\xa0\x42\xa0\x43\xa0\x44\xa0\x45\xa0\x46\xa0\x47\xa0\x48\xa0\x49\xec\xdb\xa0\x4a\xa0\x4b\xa0\x4c\xa0\x4d\xd4\xef\xa0\x4e\xec\xdd\xa0\x4f\xa0\x50\xa0\x51\xa0\x52\xa0\x53\xa0\x54\xdb\xc6\xa0\x55\xa0\x56\xa0\x57\xa0\x58\xa0\x59\xa0\x5a\xa0\x5b\xa0\x5c\xa0\x5d\xa0\x5e\xec\xde\xa0\x5f\xa0\x60\xa0\x61\xa0\x62\xa0\x63\xa0\x64", /* 7200 */ "\xa0\x65\xa0\x66\xa0\x67\xa0\x68\xa0\x69\xa0\x6a\xb1\xac\xa0\x6b\xa0\x6c\xa0\x6d\xa0\x6e\xa0\x6f\xa0\x70\xa0\x71\xa0\x72\xa0\x73\xa0\x74\xa0\x75\xa0\x76\xa0\x77\xa0\x78\xa0\x79\xa0\x7a\xa0\x7b\xa0\x7c\xa0\x7d\xa0\x7e\xa0\x80\xa0\x81\xec\xdf\xa0\x82\xa0\x83\xa0\x84\xa0\x85\xa0\x86\xa0\x87\xa0\x88\xa0\x89\xa0\x8a\xa0\x8b\xec\xe0\xa0\x8c\xd7\xa6\xa0\x8d\xc5\xc0\xa0\x8e\xa0\x8f\xa0\x90\xeb\xbc\xb0\xae\xa0\x91\xa0\x92\xa0\x93\xbe\xf4\xb8\xb8\xd2\xaf\xb0\xd6\xb5\xf9\xa0\x94\xd8\xb3\xa0\x95\xcb\xac\xa0\x96\xe3\xdd\xa0\x97\xa0\x98\xa0\x99\xa0\x9a\xa0\x9b\xa0\x9c\xa0\x9d\xc6\xac\xb0\xe6\xa0\x9e\xa0\x9f\xa0\xa0\xc5\xc6\xeb\xb9\xa0\xa1\xa0\xa2\xa0\xa3\xa0\xa4\xeb\xba\xa0\xa5\xa0\xa6\xa0\xa7\xeb\xbb\xa0\xa8\xa0\xa9\xd1\xc0\xa0\xaa\xc5\xa3\xa0\xab\xea\xf2\xa0\xac\xc4\xb2\xa0\xad\xc4\xb5\xc0\xce\xa0\xae\xa0\xaf\xa0\xb0\xea\xf3\xc4\xc1\xa0\xb1\xce\xef\xa0\xb2\xa0\xb3\xa0\xb4\xa0\xb5\xea\xf0\xea\xf4\xa0\xb6\xa0\xb7\xc9\xfc\xa0\xb8\xa0\xb9\xc7\xa3\xa0\xba\xa0\xbb\xa0\xbc\xcc\xd8\xce\xfe\xa0\xbd\xa0\xbe\xa0\xbf\xea\xf5\xea\xf6", /* 7280 */ "\xcf\xac\xc0\xe7\xa0\xc0\xa0\xc1\xea\xf7\xa0\xc2\xa0\xc3\xa0\xc4\xa0\xc5\xa0\xc6\xb6\xbf\xea\xf8\xa0\xc7\xea\xf9\xa0\xc8\xea\xfa\xa0\xc9\xa0\xca\xea\xfb\xa0\xcb\xa0\xcc\xa0\xcd\xa0\xce\xa0\xcf\xa0\xd0\xa0\xd1\xa0\xd2\xa0\xd3\xa0\xd4\xa0\xd5\xa0\xd6\xea\xf1\xa0\xd7\xa0\xd8\xa0\xd9\xa0\xda\xa0\xdb\xa0\xdc\xa0\xdd\xa0\xde\xa0\xdf\xa0\xe0\xa0\xe1\xa0\xe2\xc8\xae\xe1\xeb\xa0\xe3\xb7\xb8\xe1\xec\xa0\xe4\xa0\xe5\xa0\xe6\xe1\xed\xa0\xe7\xd7\xb4\xe1\xee\xe1\xef\xd3\xcc\xa0\xe8\xa0\xe9\xa0\xea\xa0\xeb\xa0\xec\xa0\xed\xa0\xee\xe1\xf1\xbf\xf1\xe1\xf0\xb5\xd2\xa0\xef\xa0\xf0\xa0\xf1\xb1\xb7\xa0\xf2\xa0\xf3\xa0\xf4\xa0\xf5\xe1\xf3\xe1\xf2\xa0\xf6\xba\xfc\xa0\xf7\xe1\xf4\xa0\xf8\xa0\xf9\xa0\xfa\xa0\xfb\xb9\xb7\xa0\xfc\xbe\xd1\xa0\xfd\xa0\xfe\xaa\x40\xaa\x41\xc4\xfc\xaa\x42\xba\xdd\xbd\xc6\xaa\x43\xaa\x44\xaa\x45\xaa\x46\xaa\x47\xaa\x48\xe1\xf5\xe1\xf7\xaa\x49\xaa\x4a\xb6\xc0\xcf\xc1\xca\xa8\xe1\xf6\xd5\xf8\xd3\xfc\xe1\xf8\xe1\xfc\xe1\xf9\xaa\x4b\xaa\x4c\xe1\xfa\xc0\xea\xaa\x4d\xe1\xfe\xe2\xa1\xc0\xc7\xaa\x4e\xaa\x4f\xaa\x50", /* 7300 */ "\xaa\x51\xe1\xfb\xaa\x52\xe1\xfd\xaa\x53\xaa\x54\xaa\x55\xaa\x56\xaa\x57\xaa\x58\xe2\xa5\xaa\x59\xaa\x5a\xaa\x5b\xc1\xd4\xaa\x5c\xaa\x5d\xaa\x5e\xaa\x5f\xe2\xa3\xaa\x60\xe2\xa8\xb2\xfe\xe2\xa2\xaa\x61\xaa\x62\xaa\x63\xc3\xcd\xb2\xc2\xe2\xa7\xe2\xa6\xaa\x64\xaa\x65\xe2\xa4\xe2\xa9\xaa\x66\xaa\x67\xe2\xab\xaa\x68\xaa\x69\xaa\x6a\xd0\xc9\xd6\xed\xc3\xa8\xe2\xac\xaa\x6b\xcf\xd7\xaa\x6c\xaa\x6d\xe2\xae\xaa\x6e\xaa\x6f\xba\xef\xaa\x70\xaa\x71\xe9\xe0\xe2\xad\xe2\xaa\xaa\x72\xaa\x73\xaa\x74\xaa\x75\xbb\xab\xd4\xb3\xaa\x76\xaa\x77\xaa\x78\xaa\x79\xaa\x7a\xaa\x7b\xaa\x7c\xaa\x7d\xaa\x7e\xaa\x80\xaa\x81\xaa\x82\xaa\x83\xe2\xb0\xaa\x84\xaa\x85\xe2\xaf\xaa\x86\xe9\xe1\xaa\x87\xaa\x88\xaa\x89\xaa\x8a\xe2\xb1\xaa\x8b\xaa\x8c\xaa\x8d\xaa\x8e\xaa\x8f\xaa\x90\xaa\x91\xaa\x92\xe2\xb2\xaa\x93\xaa\x94\xaa\x95\xaa\x96\xaa\x97\xaa\x98\xaa\x99\xaa\x9a\xaa\x9b\xaa\x9c\xaa\x9d\xe2\xb3\xcc\xa1\xaa\x9e\xe2\xb4\xaa\x9f\xaa\xa0\xab\x40\xab\x41\xab\x42\xab\x43\xab\x44\xab\x45\xab\x46\xab\x47\xab\x48\xab\x49\xab\x4a\xab\x4b\xe2\xb5\xab\x4c", /* 7380 */ "\xab\x4d\xab\x4e\xab\x4f\xab\x50\xd0\xfe\xab\x51\xab\x52\xc2\xca\xab\x53\xd3\xf1\xab\x54\xcd\xf5\xab\x55\xab\x56\xe7\xe0\xab\x57\xab\x58\xe7\xe1\xab\x59\xab\x5a\xab\x5b\xab\x5c\xbe\xc1\xab\x5d\xab\x5e\xab\x5f\xab\x60\xc2\xea\xab\x61\xab\x62\xab\x63\xe7\xe4\xab\x64\xab\x65\xe7\xe3\xab\x66\xab\x67\xab\x68\xab\x69\xab\x6a\xab\x6b\xcd\xe6\xab\x6c\xc3\xb5\xab\x6d\xab\x6e\xe7\xe2\xbb\xb7\xcf\xd6\xab\x6f\xc1\xe1\xe7\xe9\xab\x70\xab\x71\xab\x72\xe7\xe8\xab\x73\xab\x74\xe7\xf4\xb2\xa3\xab\x75\xab\x76\xab\x77\xab\x78\xe7\xea\xab\x79\xe7\xe6\xab\x7a\xab\x7b\xab\x7c\xab\x7d\xab\x7e\xe7\xec\xe7\xeb\xc9\xba\xab\x80\xab\x81\xd5\xe4\xab\x82\xe7\xe5\xb7\xa9\xe7\xe7\xab\x83\xab\x84\xab\x85\xab\x86\xab\x87\xab\x88\xab\x89\xe7\xee\xab\x8a\xab\x8b\xab\x8c\xab\x8d\xe7\xf3\xab\x8e\xd6\xe9\xab\x8f\xab\x90\xab\x91\xab\x92\xe7\xed\xab\x93\xe7\xf2\xab\x94\xe7\xf1\xab\x95\xab\x96\xab\x97\xb0\xe0\xab\x98\xab\x99\xab\x9a\xab\x9b\xe7\xf5\xab\x9c\xab\x9d\xab\x9e\xab\x9f\xab\xa0\xac\x40\xac\x41\xac\x42\xac\x43\xac\x44\xac\x45\xac\x46\xac\x47", /* 7400 */ "\xac\x48\xac\x49\xac\x4a\xc7\xf2\xac\x4b\xc0\xc5\xc0\xed\xac\x4c\xac\x4d\xc1\xf0\xe7\xf0\xac\x4e\xac\x4f\xac\x50\xac\x51\xe7\xf6\xcb\xf6\xac\x52\xac\x53\xac\x54\xac\x55\xac\x56\xac\x57\xac\x58\xac\x59\xac\x5a\xe8\xa2\xe8\xa1\xac\x5b\xac\x5c\xac\x5d\xac\x5e\xac\x5f\xac\x60\xd7\xc1\xac\x61\xac\x62\xe7\xfa\xe7\xf9\xac\x63\xe7\xfb\xac\x64\xe7\xf7\xac\x65\xe7\xfe\xac\x66\xe7\xfd\xac\x67\xe7\xfc\xac\x68\xac\x69\xc1\xd5\xc7\xd9\xc5\xfd\xc5\xc3\xac\x6a\xac\x6b\xac\x6c\xac\x6d\xac\x6e\xc7\xed\xac\x6f\xac\x70\xac\x71\xac\x72\xe8\xa3\xac\x73\xac\x74\xac\x75\xac\x76\xac\x77\xac\x78\xac\x79\xac\x7a\xac\x7b\xac\x7c\xac\x7d\xac\x7e\xac\x80\xac\x81\xac\x82\xac\x83\xac\x84\xac\x85\xac\x86\xe8\xa6\xac\x87\xe8\xa5\xac\x88\xe8\xa7\xba\xf7\xe7\xf8\xe8\xa4\xac\x89\xc8\xf0\xc9\xaa\xac\x8a\xac\x8b\xac\x8c\xac\x8d\xac\x8e\xac\x8f\xac\x90\xac\x91\xac\x92\xac\x93\xac\x94\xac\x95\xac\x96\xe8\xa9\xac\x97\xac\x98\xb9\xe5\xac\x99\xac\x9a\xac\x9b\xac\x9c\xac\x9d\xd1\xfe\xe8\xa8\xac\x9e\xac\x9f\xac\xa0\xad\x40\xad\x41\xad\x42\xe8\xaa\xad\x43", /* 7480 */ "\xe8\xad\xe8\xae\xad\x44\xc1\xa7\xad\x45\xad\x46\xad\x47\xe8\xaf\xad\x48\xad\x49\xad\x4a\xe8\xb0\xad\x4b\xad\x4c\xe8\xac\xad\x4d\xe8\xb4\xad\x4e\xad\x4f\xad\x50\xad\x51\xad\x52\xad\x53\xad\x54\xad\x55\xad\x56\xad\x57\xad\x58\xe8\xab\xad\x59\xe8\xb1\xad\x5a\xad\x5b\xad\x5c\xad\x5d\xad\x5e\xad\x5f\xad\x60\xad\x61\xe8\xb5\xe8\xb2\xe8\xb3\xad\x62\xad\x63\xad\x64\xad\x65\xad\x66\xad\x67\xad\x68\xad\x69\xad\x6a\xad\x6b\xad\x6c\xad\x6d\xad\x6e\xad\x6f\xad\x70\xad\x71\xe8\xb7\xad\x72\xad\x73\xad\x74\xad\x75\xad\x76\xad\x77\xad\x78\xad\x79\xad\x7a\xad\x7b\xad\x7c\xad\x7d\xad\x7e\xad\x80\xad\x81\xad\x82\xad\x83\xad\x84\xad\x85\xad\x86\xad\x87\xad\x88\xad\x89\xe8\xb6\xad\x8a\xad\x8b\xad\x8c\xad\x8d\xad\x8e\xad\x8f\xad\x90\xad\x91\xad\x92\xb9\xcf\xad\x93\xf0\xac\xad\x94\xf0\xad\xad\x95\xc6\xb0\xb0\xea\xc8\xbf\xad\x96\xcd\xdf\xad\x97\xad\x98\xad\x99\xad\x9a\xad\x9b\xad\x9c\xad\x9d\xce\xcd\xea\xb1\xad\x9e\xad\x9f\xad\xa0\xae\x40\xea\xb2\xae\x41\xc6\xbf\xb4\xc9\xae\x42\xae\x43\xae\x44\xae\x45\xae\x46\xae\x47\xae\x48\xea\xb3", /* 7500 */ "\xae\x49\xae\x4a\xae\x4b\xae\x4c\xd5\xe7\xae\x4d\xae\x4e\xae\x4f\xae\x50\xae\x51\xae\x52\xae\x53\xae\x54\xdd\xf9\xae\x55\xea\xb4\xae\x56\xea\xb5\xae\x57\xea\xb6\xae\x58\xae\x59\xae\x5a\xae\x5b\xb8\xca\xdf\xb0\xc9\xf5\xae\x5c\xcc\xf0\xae\x5d\xae\x5e\xc9\xfa\xae\x5f\xae\x60\xae\x61\xae\x62\xae\x63\xc9\xfb\xae\x64\xae\x65\xd3\xc3\xcb\xa6\xae\x66\xb8\xa6\xf0\xae\xb1\xc2\xae\x67\xe5\xb8\xcc\xef\xd3\xc9\xbc\xd7\xc9\xea\xae\x68\xb5\xe7\xae\x69\xc4\xd0\xb5\xe9\xae\x6a\xee\xae\xbb\xad\xae\x6b\xae\x6c\xe7\xde\xae\x6d\xee\xaf\xae\x6e\xae\x6f\xae\x70\xae\x71\xb3\xa9\xae\x72\xae\x73\xee\xb2\xae\x74\xae\x75\xee\xb1\xbd\xe7\xae\x76\xee\xb0\xce\xb7\xae\x77\xae\x78\xae\x79\xae\x7a\xc5\xcf\xae\x7b\xae\x7c\xae\x7d\xae\x7e\xc1\xf4\xdb\xce\xee\xb3\xd0\xf3\xae\x80\xae\x81\xae\x82\xae\x83\xae\x84\xae\x85\xae\x86\xae\x87\xc2\xd4\xc6\xe8\xae\x88\xae\x89\xae\x8a\xb7\xac\xae\x8b\xae\x8c\xae\x8d\xae\x8e\xae\x8f\xae\x90\xae\x91\xee\xb4\xae\x92\xb3\xeb\xae\x93\xae\x94\xae\x95\xbb\xfb\xee\xb5\xae\x96\xae\x97\xae\x98\xae\x99\xae\x9a\xe7\xdc", /* 7580 */ "\xae\x9b\xae\x9c\xae\x9d\xee\xb6\xae\x9e\xae\x9f\xbd\xae\xae\xa0\xaf\x40\xaf\x41\xaf\x42\xf1\xe2\xaf\x43\xaf\x44\xaf\x45\xca\xe8\xaf\x46\xd2\xc9\xf0\xda\xaf\x47\xf0\xdb\xaf\x48\xf0\xdc\xc1\xc6\xaf\x49\xb8\xed\xbe\xce\xaf\x4a\xaf\x4b\xf0\xde\xaf\x4c\xc5\xb1\xf0\xdd\xd1\xf1\xaf\x4d\xf0\xe0\xb0\xcc\xbd\xea\xaf\x4e\xaf\x4f\xaf\x50\xaf\x51\xaf\x52\xd2\xdf\xf0\xdf\xaf\x53\xb4\xaf\xb7\xe8\xf0\xe6\xf0\xe5\xc6\xa3\xf0\xe1\xf0\xe2\xb4\xc3\xaf\x54\xaf\x55\xf0\xe3\xd5\xee\xaf\x56\xaf\x57\xcc\xdb\xbe\xd2\xbc\xb2\xaf\x58\xaf\x59\xaf\x5a\xf0\xe8\xf0\xe7\xf0\xe4\xb2\xa1\xaf\x5b\xd6\xa2\xd3\xb8\xbe\xb7\xc8\xac\xaf\x5c\xaf\x5d\xf0\xea\xaf\x5e\xaf\x5f\xaf\x60\xaf\x61\xd1\xf7\xaf\x62\xd6\xcc\xba\xdb\xf0\xe9\xaf\x63\xb6\xbb\xaf\x64\xaf\x65\xcd\xb4\xaf\x66\xaf\x67\xc6\xa6\xaf\x68\xaf\x69\xaf\x6a\xc1\xa1\xf0\xeb\xf0\xee\xaf\x6b\xf0\xed\xf0\xf0\xf0\xec\xaf\x6c\xbb\xbe\xf0\xef\xaf\x6d\xaf\x6e\xaf\x6f\xaf\x70\xcc\xb5\xf0\xf2\xaf\x71\xaf\x72\xb3\xd5\xaf\x73\xaf\x74\xaf\x75\xaf\x76\xb1\xd4\xaf\x77\xaf\x78\xf0\xf3\xaf\x79\xaf\x7a\xf0\xf4", /* 7600 */ "\xf0\xf6\xb4\xe1\xaf\x7b\xf0\xf1\xaf\x7c\xf0\xf7\xaf\x7d\xaf\x7e\xaf\x80\xaf\x81\xf0\xfa\xaf\x82\xf0\xf8\xaf\x83\xaf\x84\xaf\x85\xf0\xf5\xaf\x86\xaf\x87\xaf\x88\xaf\x89\xf0\xfd\xaf\x8a\xf0\xf9\xf0\xfc\xf0\xfe\xaf\x8b\xf1\xa1\xaf\x8c\xaf\x8d\xaf\x8e\xce\xc1\xf1\xa4\xaf\x8f\xf1\xa3\xaf\x90\xc1\xf6\xf0\xfb\xca\xdd\xaf\x91\xaf\x92\xb4\xf1\xb1\xf1\xcc\xb1\xaf\x93\xf1\xa6\xaf\x94\xaf\x95\xf1\xa7\xaf\x96\xaf\x97\xf1\xac\xd5\xce\xf1\xa9\xaf\x98\xaf\x99\xc8\xb3\xaf\x9a\xaf\x9b\xaf\x9c\xf1\xa2\xaf\x9d\xf1\xab\xf1\xa8\xf1\xa5\xaf\x9e\xaf\x9f\xf1\xaa\xaf\xa0\xb0\x40\xb0\x41\xb0\x42\xb0\x43\xb0\x44\xb0\x45\xb0\x46\xb0\xa9\xf1\xad\xb0\x47\xb0\x48\xb0\x49\xb0\x4a\xb0\x4b\xb0\x4c\xf1\xaf\xb0\x4d\xf1\xb1\xb0\x4e\xb0\x4f\xb0\x50\xb0\x51\xb0\x52\xf1\xb0\xb0\x53\xf1\xae\xb0\x54\xb0\x55\xb0\x56\xb0\x57\xd1\xa2\xb0\x58\xb0\x59\xb0\x5a\xb0\x5b\xb0\x5c\xb0\x5d\xb0\x5e\xf1\xb2\xb0\x5f\xb0\x60\xb0\x61\xf1\xb3\xb0\x62\xb0\x63\xb0\x64\xb0\x65\xb0\x66\xb0\x67\xb0\x68\xb0\x69\xb9\xef\xb0\x6a\xb0\x6b\xb5\xc7\xb0\x6c\xb0\xd7\xb0\xd9\xb0\x6d", /* 7680 */ "\xb0\x6e\xb0\x6f\xd4\xed\xb0\x70\xb5\xc4\xb0\x71\xbd\xd4\xbb\xca\xf0\xa7\xb0\x72\xb0\x73\xb8\xde\xb0\x74\xb0\x75\xf0\xa8\xb0\x76\xb0\x77\xb0\xa8\xb0\x78\xf0\xa9\xb0\x79\xb0\x7a\xcd\xee\xb0\x7b\xb0\x7c\xf0\xaa\xb0\x7d\xb0\x7e\xb0\x80\xb0\x81\xb0\x82\xb0\x83\xb0\x84\xb0\x85\xb0\x86\xb0\x87\xf0\xab\xb0\x88\xb0\x89\xb0\x8a\xb0\x8b\xb0\x8c\xb0\x8d\xb0\x8e\xb0\x8f\xb0\x90\xc6\xa4\xb0\x91\xb0\x92\xd6\xe5\xf1\xe4\xb0\x93\xf1\xe5\xb0\x94\xb0\x95\xb0\x96\xb0\x97\xb0\x98\xb0\x99\xb0\x9a\xb0\x9b\xb0\x9c\xb0\x9d\xc3\xf3\xb0\x9e\xb0\x9f\xd3\xdb\xb0\xa0\xb1\x40\xd6\xd1\xc5\xe8\xb1\x41\xd3\xaf\xb1\x42\xd2\xe6\xb1\x43\xb1\x44\xee\xc1\xb0\xbb\xd5\xb5\xd1\xce\xbc\xe0\xba\xd0\xb1\x45\xbf\xf8\xb1\x46\xb8\xc7\xb5\xc1\xc5\xcc\xb1\x47\xb1\x48\xca\xa2\xb1\x49\xb1\x4a\xb1\x4b\xc3\xcb\xb1\x4c\xb1\x4d\xb1\x4e\xb1\x4f\xb1\x50\xee\xc2\xb1\x51\xb1\x52\xb1\x53\xb1\x54\xb1\x55\xb1\x56\xb1\x57\xb1\x58\xc4\xbf\xb6\xa2\xb1\x59\xed\xec\xc3\xa4\xb1\x5a\xd6\xb1\xb1\x5b\xb1\x5c\xb1\x5d\xcf\xe0\xed\xef\xb1\x5e\xb1\x5f\xc5\xce\xb1\x60\xb6\xdc\xb1\x61", /* 7700 */ "\xb1\x62\xca\xa1\xb1\x63\xb1\x64\xed\xed\xb1\x65\xb1\x66\xed\xf0\xed\xf1\xc3\xbc\xb1\x67\xbf\xb4\xb1\x68\xed\xee\xb1\x69\xb1\x6a\xb1\x6b\xb1\x6c\xb1\x6d\xb1\x6e\xb1\x6f\xb1\x70\xb1\x71\xb1\x72\xb1\x73\xed\xf4\xed\xf2\xb1\x74\xb1\x75\xb1\x76\xb1\x77\xd5\xe6\xc3\xdf\xb1\x78\xed\xf3\xb1\x79\xb1\x7a\xb1\x7b\xed\xf6\xb1\x7c\xd5\xa3\xd1\xa3\xb1\x7d\xb1\x7e\xb1\x80\xed\xf5\xb1\x81\xc3\xd0\xb1\x82\xb1\x83\xb1\x84\xb1\x85\xb1\x86\xed\xf7\xbf\xf4\xbe\xec\xed\xf8\xb1\x87\xcc\xf7\xb1\x88\xd1\xdb\xb1\x89\xb1\x8a\xb1\x8b\xd7\xc5\xd5\xf6\xb1\x8c\xed\xfc\xb1\x8d\xb1\x8e\xb1\x8f\xed\xfb\xb1\x90\xb1\x91\xb1\x92\xb1\x93\xb1\x94\xb1\x95\xb1\x96\xb1\x97\xed\xf9\xed\xfa\xb1\x98\xb1\x99\xb1\x9a\xb1\x9b\xb1\x9c\xb1\x9d\xb1\x9e\xb1\x9f\xed\xfd\xbe\xa6\xb1\xa0\xb2\x40\xb2\x41\xb2\x42\xb2\x43\xcb\xaf\xee\xa1\xb6\xbd\xb2\x44\xee\xa2\xc4\xc0\xb2\x45\xed\xfe\xb2\x46\xb2\x47\xbd\xde\xb2\xc7\xb2\x48\xb2\x49\xb2\x4a\xb2\x4b\xb2\x4c\xb2\x4d\xb2\x4e\xb2\x4f\xb2\x50\xb2\x51\xb2\x52\xb2\x53\xb6\xc3\xb2\x54\xb2\x55\xb2\x56\xee\xa5\xd8\xba\xee\xa3", /* 7780 */ "\xee\xa6\xb2\x57\xb2\x58\xb2\x59\xc3\xe9\xb3\xf2\xb2\x5a\xb2\x5b\xb2\x5c\xb2\x5d\xb2\x5e\xb2\x5f\xee\xa7\xee\xa4\xcf\xb9\xb2\x60\xb2\x61\xee\xa8\xc2\xf7\xb2\x62\xb2\x63\xb2\x64\xb2\x65\xb2\x66\xb2\x67\xb2\x68\xb2\x69\xb2\x6a\xb2\x6b\xb2\x6c\xb2\x6d\xee\xa9\xee\xaa\xb2\x6e\xde\xab\xb2\x6f\xb2\x70\xc6\xb3\xb2\x71\xc7\xc6\xb2\x72\xd6\xf5\xb5\xc9\xb2\x73\xcb\xb2\xb2\x74\xb2\x75\xb2\x76\xee\xab\xb2\x77\xb2\x78\xcd\xab\xb2\x79\xee\xac\xb2\x7a\xb2\x7b\xb2\x7c\xb2\x7d\xb2\x7e\xd5\xb0\xb2\x80\xee\xad\xb2\x81\xf6\xc4\xb2\x82\xb2\x83\xb2\x84\xb2\x85\xb2\x86\xb2\x87\xb2\x88\xb2\x89\xb2\x8a\xb2\x8b\xb2\x8c\xb2\x8d\xb2\x8e\xdb\xc7\xb2\x8f\xb2\x90\xb2\x91\xb2\x92\xb2\x93\xb2\x94\xb2\x95\xb2\x96\xb2\x97\xb4\xa3\xb2\x98\xb2\x99\xb2\x9a\xc3\xac\xf1\xe6\xb2\x9b\xb2\x9c\xb2\x9d\xb2\x9e\xb2\x9f\xca\xb8\xd2\xd3\xb2\xa0\xd6\xaa\xb3\x40\xef\xf2\xb3\x41\xbe\xd8\xb3\x42\xbd\xc3\xef\xf3\xb6\xcc\xb0\xab\xb3\x43\xb3\x44\xb3\x45\xb3\x46\xca\xaf\xb3\x47\xb3\x48\xed\xb6\xb3\x49\xed\xb7\xb3\x4a\xb3\x4b\xb3\x4c\xb3\x4d\xce\xf9\xb7\xaf\xbf\xf3", /* 7800 */ "\xed\xb8\xc2\xeb\xc9\xb0\xb3\x4e\xb3\x4f\xb3\x50\xb3\x51\xb3\x52\xb3\x53\xed\xb9\xb3\x54\xb3\x55\xc6\xf6\xbf\xb3\xb3\x56\xb3\x57\xb3\x58\xed\xbc\xc5\xf8\xb3\x59\xd1\xd0\xb3\x5a\xd7\xa9\xed\xba\xed\xbb\xb3\x5b\xd1\xe2\xb3\x5c\xed\xbf\xed\xc0\xb3\x5d\xed\xc4\xb3\x5e\xb3\x5f\xb3\x60\xed\xc8\xb3\x61\xed\xc6\xed\xce\xd5\xe8\xb3\x62\xed\xc9\xb3\x63\xb3\x64\xed\xc7\xed\xbe\xb3\x65\xb3\x66\xc5\xe9\xb3\x67\xb3\x68\xb3\x69\xc6\xc6\xb3\x6a\xb3\x6b\xc9\xe9\xd4\xd2\xed\xc1\xed\xc2\xed\xc3\xed\xc5\xb3\x6c\xc0\xf9\xb3\x6d\xb4\xa1\xb3\x6e\xb3\x6f\xb3\x70\xb3\x71\xb9\xe8\xb3\x72\xed\xd0\xb3\x73\xb3\x74\xb3\x75\xb3\x76\xed\xd1\xb3\x77\xed\xca\xb3\x78\xed\xcf\xb3\x79\xce\xf8\xb3\x7a\xb3\x7b\xcb\xb6\xed\xcc\xed\xcd\xb3\x7c\xb3\x7d\xb3\x7e\xb3\x80\xb3\x81\xcf\xf5\xb3\x82\xb3\x83\xb3\x84\xb3\x85\xb3\x86\xb3\x87\xb3\x88\xb3\x89\xb3\x8a\xb3\x8b\xb3\x8c\xb3\x8d\xed\xd2\xc1\xf2\xd3\xb2\xed\xcb\xc8\xb7\xb3\x8e\xb3\x8f\xb3\x90\xb3\x91\xb3\x92\xb3\x93\xb3\x94\xb3\x95\xbc\xef\xb3\x96\xb3\x97\xb3\x98\xb3\x99\xc5\xf0\xb3\x9a\xb3\x9b\xb3\x9c", /* 7880 */ "\xb3\x9d\xb3\x9e\xb3\x9f\xb3\xa0\xb4\x40\xb4\x41\xb4\x42\xed\xd6\xb4\x43\xb5\xef\xb4\x44\xb4\x45\xc2\xb5\xb0\xad\xcb\xe9\xb4\x46\xb4\x47\xb1\xae\xb4\x48\xed\xd4\xb4\x49\xb4\x4a\xb4\x4b\xcd\xeb\xb5\xe2\xb4\x4c\xed\xd5\xed\xd3\xed\xd7\xb4\x4d\xb4\x4e\xb5\xfa\xb4\x4f\xed\xd8\xb4\x50\xed\xd9\xb4\x51\xed\xdc\xb4\x52\xb1\xcc\xb4\x53\xb4\x54\xb4\x55\xb4\x56\xb4\x57\xb4\x58\xb4\x59\xb4\x5a\xc5\xf6\xbc\xee\xed\xda\xcc\xbc\xb2\xea\xb4\x5b\xb4\x5c\xb4\x5d\xb4\x5e\xed\xdb\xb4\x5f\xb4\x60\xb4\x61\xb4\x62\xc4\xeb\xb4\x63\xb4\x64\xb4\xc5\xb4\x65\xb4\x66\xb4\x67\xb0\xf5\xb4\x68\xb4\x69\xb4\x6a\xed\xdf\xc0\xda\xb4\xe8\xb4\x6b\xb4\x6c\xb4\x6d\xb4\x6e\xc5\xcd\xb4\x6f\xb4\x70\xb4\x71\xed\xdd\xbf\xc4\xb4\x72\xb4\x73\xb4\x74\xed\xde\xb4\x75\xb4\x76\xb4\x77\xb4\x78\xb4\x79\xb4\x7a\xb4\x7b\xb4\x7c\xb4\x7d\xb4\x7e\xb4\x80\xb4\x81\xb4\x82\xb4\x83\xc4\xa5\xb4\x84\xb4\x85\xb4\x86\xed\xe0\xb4\x87\xb4\x88\xb4\x89\xb4\x8a\xb4\x8b\xed\xe1\xb4\x8c\xed\xe3\xb4\x8d\xb4\x8e\xc1\xd7\xb4\x8f\xb4\x90\xbb\xc7\xb4\x91\xb4\x92\xb4\x93\xb4\x94\xb4\x95", /* 7900 */ "\xb4\x96\xbd\xb8\xb4\x97\xb4\x98\xb4\x99\xed\xe2\xb4\x9a\xb4\x9b\xb4\x9c\xb4\x9d\xb4\x9e\xb4\x9f\xb4\xa0\xb5\x40\xb5\x41\xb5\x42\xb5\x43\xb5\x44\xb5\x45\xed\xe4\xb5\x46\xb5\x47\xb5\x48\xb5\x49\xb5\x4a\xb5\x4b\xb5\x4c\xb5\x4d\xb5\x4e\xb5\x4f\xed\xe6\xb5\x50\xb5\x51\xb5\x52\xb5\x53\xb5\x54\xed\xe5\xb5\x55\xb5\x56\xb5\x57\xb5\x58\xb5\x59\xb5\x5a\xb5\x5b\xb5\x5c\xb5\x5d\xb5\x5e\xb5\x5f\xb5\x60\xb5\x61\xb5\x62\xb5\x63\xed\xe7\xb5\x64\xb5\x65\xb5\x66\xb5\x67\xb5\x68\xca\xbe\xec\xea\xc0\xf1\xb5\x69\xc9\xe7\xb5\x6a\xec\xeb\xc6\xee\xb5\x6b\xb5\x6c\xb5\x6d\xb5\x6e\xec\xec\xb5\x6f\xc6\xed\xec\xed\xb5\x70\xb5\x71\xb5\x72\xb5\x73\xb5\x74\xb5\x75\xb5\x76\xb5\x77\xb5\x78\xec\xf0\xb5\x79\xb5\x7a\xd7\xe6\xec\xf3\xb5\x7b\xb5\x7c\xec\xf1\xec\xee\xec\xef\xd7\xa3\xc9\xf1\xcb\xee\xec\xf4\xb5\x7d\xec\xf2\xb5\x7e\xb5\x80\xcf\xe9\xb5\x81\xec\xf6\xc6\xb1\xb5\x82\xb5\x83\xb5\x84\xb5\x85\xbc\xc0\xb5\x86\xec\xf5\xb5\x87\xb5\x88\xb5\x89\xb5\x8a\xb5\x8b\xb5\x8c\xb5\x8d\xb5\xbb\xbb\xf6\xb5\x8e\xec\xf7\xb5\x8f\xb5\x90\xb5\x91\xb5\x92\xb5\x93", /* 7980 */ "\xd9\xf7\xbd\xfb\xb5\x94\xb5\x95\xc2\xbb\xec\xf8\xb5\x96\xb5\x97\xb5\x98\xb5\x99\xec\xf9\xb5\x9a\xb5\x9b\xb5\x9c\xb5\x9d\xb8\xa3\xb5\x9e\xb5\x9f\xb5\xa0\xb6\x40\xb6\x41\xb6\x42\xb6\x43\xb6\x44\xb6\x45\xb6\x46\xec\xfa\xb6\x47\xb6\x48\xb6\x49\xb6\x4a\xb6\x4b\xb6\x4c\xb6\x4d\xb6\x4e\xb6\x4f\xb6\x50\xb6\x51\xb6\x52\xec\xfb\xb6\x53\xb6\x54\xb6\x55\xb6\x56\xb6\x57\xb6\x58\xb6\x59\xb6\x5a\xb6\x5b\xb6\x5c\xb6\x5d\xec\xfc\xb6\x5e\xb6\x5f\xb6\x60\xb6\x61\xb6\x62\xd3\xed\xd8\xae\xc0\xeb\xb6\x63\xc7\xdd\xba\xcc\xb6\x64\xd0\xe3\xcb\xbd\xb6\x65\xcd\xba\xb6\x66\xb6\x67\xb8\xd1\xb6\x68\xb6\x69\xb1\xfc\xb6\x6a\xc7\xef\xb6\x6b\xd6\xd6\xb6\x6c\xb6\x6d\xb6\x6e\xbf\xc6\xc3\xeb\xb6\x6f\xb6\x70\xef\xf5\xb6\x71\xb6\x72\xc3\xd8\xb6\x73\xb6\x74\xb6\x75\xb6\x76\xb6\x77\xb6\x78\xd7\xe2\xb6\x79\xb6\x7a\xb6\x7b\xef\xf7\xb3\xd3\xb6\x7c\xc7\xd8\xd1\xed\xb6\x7d\xd6\xc8\xb6\x7e\xef\xf8\xb6\x80\xef\xf6\xb6\x81\xbb\xfd\xb3\xc6\xb6\x82\xb6\x83\xb6\x84\xb6\x85\xb6\x86\xb6\x87\xb6\x88\xbd\xd5\xb6\x89\xb6\x8a\xd2\xc6\xb6\x8b\xbb\xe0\xb6\x8c\xb6\x8d", /* 7a00 */ "\xcf\xa1\xb6\x8e\xef\xfc\xef\xfb\xb6\x8f\xb6\x90\xef\xf9\xb6\x91\xb6\x92\xb6\x93\xb6\x94\xb3\xcc\xb6\x95\xc9\xd4\xcb\xb0\xb6\x96\xb6\x97\xb6\x98\xb6\x99\xb6\x9a\xef\xfe\xb6\x9b\xb6\x9c\xb0\xde\xb6\x9d\xb6\x9e\xd6\xc9\xb6\x9f\xb6\xa0\xb7\x40\xef\xfd\xb7\x41\xb3\xed\xb7\x42\xb7\x43\xf6\xd5\xb7\x44\xb7\x45\xb7\x46\xb7\x47\xb7\x48\xb7\x49\xb7\x4a\xb7\x4b\xb7\x4c\xb7\x4d\xb7\x4e\xb7\x4f\xb7\x50\xb7\x51\xb7\x52\xce\xc8\xb7\x53\xb7\x54\xb7\x55\xf0\xa2\xb7\x56\xf0\xa1\xb7\x57\xb5\xbe\xbc\xda\xbb\xfc\xb7\x58\xb8\xe5\xb7\x59\xb7\x5a\xb7\x5b\xb7\x5c\xb7\x5d\xb7\x5e\xc4\xc2\xb7\x5f\xb7\x60\xb7\x61\xb7\x62\xb7\x63\xb7\x64\xb7\x65\xb7\x66\xb7\x67\xb7\x68\xf0\xa3\xb7\x69\xb7\x6a\xb7\x6b\xb7\x6c\xb7\x6d\xcb\xeb\xb7\x6e\xb7\x6f\xb7\x70\xb7\x71\xb7\x72\xb7\x73\xb7\x74\xb7\x75\xb7\x76\xb7\x77\xb7\x78\xb7\x79\xb7\x7a\xb7\x7b\xb7\x7c\xb7\x7d\xb7\x7e\xb7\x80\xb7\x81\xb7\x82\xb7\x83\xb7\x84\xb7\x85\xb7\x86\xf0\xa6\xb7\x87\xb7\x88\xb7\x89\xd1\xa8\xb7\x8a\xbe\xbf\xc7\xee\xf1\xb6\xf1\xb7\xbf\xd5\xb7\x8b\xb7\x8c\xb7\x8d\xb7\x8e\xb4\xa9", /* 7a80 */ "\xf1\xb8\xcd\xbb\xb7\x8f\xc7\xd4\xd5\xad\xb7\x90\xf1\xb9\xb7\x91\xf1\xba\xb7\x92\xb7\x93\xb7\x94\xb7\x95\xc7\xcf\xb7\x96\xb7\x97\xb7\x98\xd2\xa4\xd6\xcf\xb7\x99\xb7\x9a\xf1\xbb\xbd\xd1\xb4\xb0\xbe\xbd\xb7\x9b\xb7\x9c\xb7\x9d\xb4\xdc\xce\xd1\xb7\x9e\xbf\xdf\xf1\xbd\xb7\x9f\xb7\xa0\xb8\x40\xb8\x41\xbf\xfa\xf1\xbc\xb8\x42\xf1\xbf\xb8\x43\xb8\x44\xb8\x45\xf1\xbe\xf1\xc0\xb8\x46\xb8\x47\xb8\x48\xb8\x49\xb8\x4a\xf1\xc1\xb8\x4b\xb8\x4c\xb8\x4d\xb8\x4e\xb8\x4f\xb8\x50\xb8\x51\xb8\x52\xb8\x53\xb8\x54\xb8\x55\xc1\xfe\xb8\x56\xb8\x57\xb8\x58\xb8\x59\xb8\x5a\xb8\x5b\xb8\x5c\xb8\x5d\xb8\x5e\xb8\x5f\xb8\x60\xc1\xa2\xb8\x61\xb8\x62\xb8\x63\xb8\x64\xb8\x65\xb8\x66\xb8\x67\xb8\x68\xb8\x69\xb8\x6a\xca\xfa\xb8\x6b\xb8\x6c\xd5\xbe\xb8\x6d\xb8\x6e\xb8\x6f\xb8\x70\xbe\xba\xbe\xb9\xd5\xc2\xb8\x71\xb8\x72\xbf\xa2\xb8\x73\xcd\xaf\xf1\xb5\xb8\x74\xb8\x75\xb8\x76\xb8\x77\xb8\x78\xb8\x79\xbd\xdf\xb8\x7a\xb6\xcb\xb8\x7b\xb8\x7c\xb8\x7d\xb8\x7e\xb8\x80\xb8\x81\xb8\x82\xb8\x83\xb8\x84\xd6\xf1\xf3\xc3\xb8\x85\xb8\x86\xf3\xc4\xb8\x87\xb8\xcd", /* 7b00 */ "\xb8\x88\xb8\x89\xb8\x8a\xf3\xc6\xf3\xc7\xb8\x8b\xb0\xca\xb8\x8c\xf3\xc5\xb8\x8d\xf3\xc9\xcb\xf1\xb8\x8e\xb8\x8f\xb8\x90\xf3\xcb\xb8\x91\xd0\xa6\xb8\x92\xb8\x93\xb1\xca\xf3\xc8\xb8\x94\xb8\x95\xb8\x96\xf3\xcf\xb8\x97\xb5\xd1\xb8\x98\xb8\x99\xf3\xd7\xb8\x9a\xf3\xd2\xb8\x9b\xb8\x9c\xb8\x9d\xf3\xd4\xf3\xd3\xb7\xfb\xb8\x9e\xb1\xbf\xb8\x9f\xf3\xce\xf3\xca\xb5\xda\xb8\xa0\xf3\xd0\xb9\x40\xb9\x41\xf3\xd1\xb9\x42\xf3\xd5\xb9\x43\xb9\x44\xb9\x45\xb9\x46\xf3\xcd\xb9\x47\xbc\xe3\xb9\x48\xc1\xfd\xb9\x49\xf3\xd6\xb9\x4a\xb9\x4b\xb9\x4c\xb9\x4d\xb9\x4e\xb9\x4f\xf3\xda\xb9\x50\xf3\xcc\xb9\x51\xb5\xc8\xb9\x52\xbd\xee\xf3\xdc\xb9\x53\xb9\x54\xb7\xa4\xbf\xf0\xd6\xfe\xcd\xb2\xb9\x55\xb4\xf0\xb9\x56\xb2\xdf\xb9\x57\xf3\xd8\xb9\x58\xf3\xd9\xc9\xb8\xb9\x59\xf3\xdd\xb9\x5a\xb9\x5b\xf3\xde\xb9\x5c\xf3\xe1\xb9\x5d\xb9\x5e\xb9\x5f\xb9\x60\xb9\x61\xb9\x62\xb9\x63\xb9\x64\xb9\x65\xb9\x66\xb9\x67\xf3\xdf\xb9\x68\xb9\x69\xf3\xe3\xf3\xe2\xb9\x6a\xb9\x6b\xf3\xdb\xb9\x6c\xbf\xea\xb9\x6d\xb3\xef\xb9\x6e\xf3\xe0\xb9\x6f\xb9\x70\xc7\xa9\xb9\x71", /* 7b80 */ "\xbc\xf2\xb9\x72\xb9\x73\xb9\x74\xb9\x75\xf3\xeb\xb9\x76\xb9\x77\xb9\x78\xb9\x79\xb9\x7a\xb9\x7b\xb9\x7c\xb9\xbf\xb9\x7d\xb9\x7e\xf3\xe4\xb9\x80\xb9\x81\xb9\x82\xb2\xad\xbb\xfe\xb9\x83\xcb\xe3\xb9\x84\xb9\x85\xb9\x86\xb9\x87\xf3\xed\xf3\xe9\xb9\x88\xb9\x89\xb9\x8a\xb9\xdc\xf3\xee\xb9\x8b\xb9\x8c\xb9\x8d\xf3\xe5\xf3\xe6\xf3\xea\xc2\xe1\xf3\xec\xf3\xef\xf3\xe8\xbc\xfd\xb9\x8e\xb9\x8f\xb9\x90\xcf\xe4\xb9\x91\xb9\x92\xf3\xf0\xb9\x93\xb9\x94\xb9\x95\xf3\xe7\xb9\x96\xb9\x97\xb9\x98\xb9\x99\xb9\x9a\xb9\x9b\xb9\x9c\xb9\x9d\xf3\xf2\xb9\x9e\xb9\x9f\xb9\xa0\xba\x40\xd7\xad\xc6\xaa\xba\x41\xba\x42\xba\x43\xba\x44\xf3\xf3\xba\x45\xba\x46\xba\x47\xba\x48\xf3\xf1\xba\x49\xc2\xa8\xba\x4a\xba\x4b\xba\x4c\xba\x4d\xba\x4e\xb8\xdd\xf3\xf5\xba\x4f\xba\x50\xf3\xf4\xba\x51\xba\x52\xba\x53\xb4\xdb\xba\x54\xba\x55\xba\x56\xf3\xf6\xf3\xf7\xba\x57\xba\x58\xba\x59\xf3\xf8\xba\x5a\xba\x5b\xba\x5c\xc0\xba\xba\x5d\xba\x5e\xc0\xe9\xba\x5f\xba\x60\xba\x61\xba\x62\xba\x63\xc5\xf1\xba\x64\xba\x65\xba\x66\xba\x67\xf3\xfb\xba\x68\xf3\xfa\xba\x69", /* 7c00 */ "\xba\x6a\xba\x6b\xba\x6c\xba\x6d\xba\x6e\xba\x6f\xba\x70\xb4\xd8\xba\x71\xba\x72\xba\x73\xf3\xfe\xf3\xf9\xba\x74\xba\x75\xf3\xfc\xba\x76\xba\x77\xba\x78\xba\x79\xba\x7a\xba\x7b\xf3\xfd\xba\x7c\xba\x7d\xba\x7e\xba\x80\xba\x81\xba\x82\xba\x83\xba\x84\xf4\xa1\xba\x85\xba\x86\xba\x87\xba\x88\xba\x89\xba\x8a\xf4\xa3\xbb\xc9\xba\x8b\xba\x8c\xf4\xa2\xba\x8d\xba\x8e\xba\x8f\xba\x90\xba\x91\xba\x92\xba\x93\xba\x94\xba\x95\xba\x96\xba\x97\xba\x98\xba\x99\xf4\xa4\xba\x9a\xba\x9b\xba\x9c\xba\x9d\xba\x9e\xba\x9f\xb2\xbe\xf4\xa6\xf4\xa5\xba\xa0\xbb\x40\xbb\x41\xbb\x42\xbb\x43\xbb\x44\xbb\x45\xbb\x46\xbb\x47\xbb\x48\xbb\x49\xbc\xae\xbb\x4a\xbb\x4b\xbb\x4c\xbb\x4d\xbb\x4e\xbb\x4f\xbb\x50\xbb\x51\xbb\x52\xbb\x53\xbb\x54\xbb\x55\xbb\x56\xbb\x57\xbb\x58\xbb\x59\xbb\x5a\xbb\x5b\xbb\x5c\xbb\x5d\xbb\x5e\xbb\x5f\xbb\x60\xbb\x61\xbb\x62\xbb\x63\xbb\x64\xbb\x65\xbb\x66\xbb\x67\xbb\x68\xbb\x69\xbb\x6a\xbb\x6b\xbb\x6c\xbb\x6d\xbb\x6e\xc3\xd7\xd9\xe1\xbb\x6f\xbb\x70\xbb\x71\xbb\x72\xbb\x73\xbb\x74\xc0\xe0\xf4\xcc\xd7\xd1\xbb\x75\xbb\x76", /* 7c80 */ "\xbb\x77\xbb\x78\xbb\x79\xbb\x7a\xbb\x7b\xbb\x7c\xbb\x7d\xbb\x7e\xbb\x80\xb7\xdb\xbb\x81\xbb\x82\xbb\x83\xbb\x84\xbb\x85\xbb\x86\xbb\x87\xf4\xce\xc1\xa3\xbb\x88\xbb\x89\xc6\xc9\xbb\x8a\xb4\xd6\xd5\xb3\xbb\x8b\xbb\x8c\xbb\x8d\xf4\xd0\xf4\xcf\xf4\xd1\xcb\xda\xbb\x8e\xbb\x8f\xf4\xd2\xbb\x90\xd4\xc1\xd6\xe0\xbb\x91\xbb\x92\xbb\x93\xbb\x94\xb7\xe0\xbb\x95\xbb\x96\xbb\x97\xc1\xb8\xbb\x98\xbb\x99\xc1\xbb\xf4\xd3\xbe\xac\xbb\x9a\xbb\x9b\xbb\x9c\xbb\x9d\xbb\x9e\xb4\xe2\xbb\x9f\xbb\xa0\xf4\xd4\xf4\xd5\xbe\xab\xbc\x40\xbc\x41\xf4\xd6\xbc\x42\xbc\x43\xbc\x44\xf4\xdb\xbc\x45\xf4\xd7\xf4\xda\xbc\x46\xba\xfd\xbc\x47\xf4\xd8\xf4\xd9\xbc\x48\xbc\x49\xbc\x4a\xbc\x4b\xbc\x4c\xbc\x4d\xbc\x4e\xb8\xe2\xcc\xc7\xf4\xdc\xbc\x4f\xb2\xda\xbc\x50\xbc\x51\xc3\xd3\xbc\x52\xbc\x53\xd4\xe3\xbf\xb7\xbc\x54\xbc\x55\xbc\x56\xbc\x57\xbc\x58\xbc\x59\xbc\x5a\xf4\xdd\xbc\x5b\xbc\x5c\xbc\x5d\xbc\x5e\xbc\x5f\xbc\x60\xc5\xb4\xbc\x61\xbc\x62\xbc\x63\xbc\x64\xbc\x65\xbc\x66\xbc\x67\xbc\x68\xf4\xe9\xbc\x69\xbc\x6a\xcf\xb5\xbc\x6b\xbc\x6c\xbc\x6d\xbc\x6e", /* 7d00 */ "\xbc\x6f\xbc\x70\xbc\x71\xbc\x72\xbc\x73\xbc\x74\xbc\x75\xbc\x76\xbc\x77\xbc\x78\xce\xc9\xbc\x79\xbc\x7a\xbc\x7b\xbc\x7c\xbc\x7d\xbc\x7e\xbc\x80\xbc\x81\xbc\x82\xbc\x83\xbc\x84\xbc\x85\xbc\x86\xbc\x87\xbc\x88\xbc\x89\xbc\x8a\xbc\x8b\xbc\x8c\xbc\x8d\xbc\x8e\xcb\xd8\xbc\x8f\xcb\xf7\xbc\x90\xbc\x91\xbc\x92\xbc\x93\xbd\xf4\xbc\x94\xbc\x95\xbc\x96\xd7\xcf\xbc\x97\xbc\x98\xbc\x99\xc0\xdb\xbc\x9a\xbc\x9b\xbc\x9c\xbc\x9d\xbc\x9e\xbc\x9f\xbc\xa0\xbd\x40\xbd\x41\xbd\x42\xbd\x43\xbd\x44\xbd\x45\xbd\x46\xbd\x47\xbd\x48\xbd\x49\xbd\x4a\xbd\x4b\xbd\x4c\xbd\x4d\xbd\x4e\xbd\x4f\xbd\x50\xbd\x51\xbd\x52\xbd\x53\xbd\x54\xbd\x55\xbd\x56\xbd\x57\xbd\x58\xbd\x59\xbd\x5a\xbd\x5b\xbd\x5c\xbd\x5d\xbd\x5e\xbd\x5f\xbd\x60\xbd\x61\xbd\x62\xbd\x63\xbd\x64\xbd\x65\xbd\x66\xbd\x67\xbd\x68\xbd\x69\xbd\x6a\xbd\x6b\xbd\x6c\xbd\x6d\xbd\x6e\xbd\x6f\xbd\x70\xbd\x71\xbd\x72\xbd\x73\xbd\x74\xbd\x75\xbd\x76\xd0\xf5\xbd\x77\xbd\x78\xbd\x79\xbd\x7a\xbd\x7b\xbd\x7c\xbd\x7d\xbd\x7e\xf4\xea\xbd\x80\xbd\x81\xbd\x82\xbd\x83\xbd\x84\xbd\x85\xbd\x86\xbd\x87", /* 7d80 */ "\xbd\x88\xbd\x89\xbd\x8a\xbd\x8b\xbd\x8c\xbd\x8d\xbd\x8e\xbd\x8f\xbd\x90\xbd\x91\xbd\x92\xbd\x93\xbd\x94\xbd\x95\xbd\x96\xbd\x97\xbd\x98\xbd\x99\xbd\x9a\xbd\x9b\xbd\x9c\xbd\x9d\xbd\x9e\xbd\x9f\xbd\xa0\xbe\x40\xbe\x41\xbe\x42\xbe\x43\xbe\x44\xbe\x45\xbe\x46\xbe\x47\xbe\x48\xbe\x49\xbe\x4a\xbe\x4b\xbe\x4c\xf4\xeb\xbe\x4d\xbe\x4e\xbe\x4f\xbe\x50\xbe\x51\xbe\x52\xbe\x53\xf4\xec\xbe\x54\xbe\x55\xbe\x56\xbe\x57\xbe\x58\xbe\x59\xbe\x5a\xbe\x5b\xbe\x5c\xbe\x5d\xbe\x5e\xbe\x5f\xbe\x60\xbe\x61\xbe\x62\xbe\x63\xbe\x64\xbe\x65\xbe\x66\xbe\x67\xbe\x68\xbe\x69\xbe\x6a\xbe\x6b\xbe\x6c\xbe\x6d\xbe\x6e\xbe\x6f\xbe\x70\xbe\x71\xbe\x72\xbe\x73\xbe\x74\xbe\x75\xbe\x76\xbe\x77\xbe\x78\xbe\x79\xbe\x7a\xbe\x7b\xbe\x7c\xbe\x7d\xbe\x7e\xbe\x80\xbe\x81\xbe\x82\xbe\x83\xbe\x84\xbe\x85\xbe\x86\xbe\x87\xbe\x88\xbe\x89\xbe\x8a\xbe\x8b\xbe\x8c\xbe\x8d\xbe\x8e\xbe\x8f\xbe\x90\xbe\x91\xbe\x92\xbe\x93\xbe\x94\xbe\x95\xbe\x96\xbe\x97\xbe\x98\xbe\x99\xbe\x9a\xbe\x9b\xbe\x9c\xbe\x9d\xbe\x9e\xbe\x9f\xbe\xa0\xbf\x40\xbf\x41\xbf\x42\xbf\x43\xbf\x44", /* 7e00 */ "\xbf\x45\xbf\x46\xbf\x47\xbf\x48\xbf\x49\xbf\x4a\xbf\x4b\xbf\x4c\xbf\x4d\xbf\x4e\xbf\x4f\xbf\x50\xbf\x51\xbf\x52\xbf\x53\xbf\x54\xbf\x55\xbf\x56\xbf\x57\xbf\x58\xbf\x59\xbf\x5a\xbf\x5b\xbf\x5c\xbf\x5d\xbf\x5e\xbf\x5f\xbf\x60\xbf\x61\xbf\x62\xbf\x63\xbf\x64\xbf\x65\xbf\x66\xbf\x67\xbf\x68\xbf\x69\xbf\x6a\xbf\x6b\xbf\x6c\xbf\x6d\xbf\x6e\xbf\x6f\xbf\x70\xbf\x71\xbf\x72\xbf\x73\xbf\x74\xbf\x75\xbf\x76\xbf\x77\xbf\x78\xbf\x79\xbf\x7a\xbf\x7b\xbf\x7c\xbf\x7d\xbf\x7e\xbf\x80\xf7\xe3\xbf\x81\xbf\x82\xbf\x83\xbf\x84\xbf\x85\xb7\xb1\xbf\x86\xbf\x87\xbf\x88\xbf\x89\xbf\x8a\xf4\xed\xbf\x8b\xbf\x8c\xbf\x8d\xbf\x8e\xbf\x8f\xbf\x90\xbf\x91\xbf\x92\xbf\x93\xbf\x94\xbf\x95\xbf\x96\xbf\x97\xbf\x98\xbf\x99\xbf\x9a\xbf\x9b\xbf\x9c\xbf\x9d\xbf\x9e\xbf\x9f\xbf\xa0\xc0\x40\xc0\x41\xc0\x42\xc0\x43\xc0\x44\xc0\x45\xc0\x46\xc0\x47\xc0\x48\xc0\x49\xc0\x4a\xc0\x4b\xc0\x4c\xc0\x4d\xc0\x4e\xc0\x4f\xc0\x50\xc0\x51\xc0\x52\xc0\x53\xc0\x54\xc0\x55\xc0\x56\xc0\x57\xc0\x58\xc0\x59\xc0\x5a\xc0\x5b\xc0\x5c\xc0\x5d\xc0\x5e\xc0\x5f\xc0\x60\xc0\x61", /* 7e80 */ "\xc0\x62\xc0\x63\xd7\xeb\xc0\x64\xc0\x65\xc0\x66\xc0\x67\xc0\x68\xc0\x69\xc0\x6a\xc0\x6b\xc0\x6c\xc0\x6d\xc0\x6e\xc0\x6f\xc0\x70\xc0\x71\xc0\x72\xc0\x73\xc0\x74\xc0\x75\xc0\x76\xc0\x77\xc0\x78\xc0\x79\xc0\x7a\xc0\x7b\xf4\xee\xc0\x7c\xc0\x7d\xc0\x7e\xe6\xf9\xbe\xc0\xe6\xfa\xba\xec\xe6\xfb\xcf\xcb\xe6\xfc\xd4\xbc\xbc\xb6\xe6\xfd\xe6\xfe\xbc\xcd\xc8\xd2\xce\xb3\xe7\xa1\xc0\x80\xb4\xbf\xe7\xa2\xc9\xb4\xb8\xd9\xc4\xc9\xc0\x81\xd7\xdd\xc2\xda\xb7\xd7\xd6\xbd\xce\xc6\xb7\xc4\xc0\x82\xc0\x83\xc5\xa6\xe7\xa3\xcf\xdf\xe7\xa4\xe7\xa5\xe7\xa6\xc1\xb7\xd7\xe9\xc9\xf0\xcf\xb8\xd6\xaf\xd6\xd5\xe7\xa7\xb0\xed\xe7\xa8\xe7\xa9\xc9\xdc\xd2\xef\xbe\xad\xe7\xaa\xb0\xf3\xc8\xde\xbd\xe1\xe7\xab\xc8\xc6\xc0\x84\xe7\xac\xbb\xe6\xb8\xf8\xd1\xa4\xe7\xad\xc2\xe7\xbe\xf8\xbd\xca\xcd\xb3\xe7\xae\xe7\xaf\xbe\xee\xd0\xe5\xc0\x85\xcb\xe7\xcc\xd0\xbc\xcc\xe7\xb0\xbc\xa8\xd0\xf7\xe7\xb1\xc0\x86\xd0\xf8\xe7\xb2\xe7\xb3\xb4\xc2\xe7\xb4\xe7\xb5\xc9\xfe\xce\xac\xc3\xe0\xe7\xb7\xb1\xc1\xb3\xf1\xc0\x87\xe7\xb8\xe7\xb9\xd7\xdb\xd5\xc0\xe7\xba\xc2\xcc", /* 7f00 */ "\xd7\xba\xe7\xbb\xe7\xbc\xe7\xbd\xbc\xea\xc3\xe5\xc0\xc2\xe7\xbe\xe7\xbf\xbc\xa9\xc0\x88\xe7\xc0\xe7\xc1\xe7\xb6\xb6\xd0\xe7\xc2\xc0\x89\xe7\xc3\xe7\xc4\xbb\xba\xb5\xde\xc2\xc6\xb1\xe0\xe7\xc5\xd4\xb5\xe7\xc6\xb8\xbf\xe7\xc8\xe7\xc7\xb7\xec\xc0\x8a\xe7\xc9\xb2\xf8\xe7\xca\xe7\xcb\xe7\xcc\xe7\xcd\xe7\xce\xe7\xcf\xe7\xd0\xd3\xa7\xcb\xf5\xe7\xd1\xe7\xd2\xe7\xd3\xe7\xd4\xc9\xc9\xe7\xd5\xe7\xd6\xe7\xd7\xe7\xd8\xe7\xd9\xbd\xc9\xe7\xda\xf3\xbe\xc0\x8b\xb8\xd7\xc0\x8c\xc8\xb1\xc0\x8d\xc0\x8e\xc0\x8f\xc0\x90\xc0\x91\xc0\x92\xc0\x93\xf3\xbf\xc0\x94\xf3\xc0\xf3\xc1\xc0\x95\xc0\x96\xc0\x97\xc0\x98\xc0\x99\xc0\x9a\xc0\x9b\xc0\x9c\xc0\x9d\xc0\x9e\xb9\xde\xcd\xf8\xc0\x9f\xc0\xa0\xd8\xe8\xba\xb1\xc1\x40\xc2\xde\xee\xb7\xc1\x41\xb7\xa3\xc1\x42\xc1\x43\xc1\x44\xc1\x45\xee\xb9\xc1\x46\xee\xb8\xb0\xd5\xc1\x47\xc1\x48\xc1\x49\xc1\x4a\xc1\x4b\xee\xbb\xd5\xd6\xd7\xef\xc1\x4c\xc1\x4d\xc1\x4e\xd6\xc3\xc1\x4f\xc1\x50\xee\xbd\xca\xf0\xc1\x51\xee\xbc\xc1\x52\xc1\x53\xc1\x54\xc1\x55\xee\xbe\xc1\x56\xc1\x57\xc1\x58\xc1\x59\xee\xc0\xc1\x5a", /* 7f80 */ "\xc1\x5b\xee\xbf\xc1\x5c\xc1\x5d\xc1\x5e\xc1\x5f\xc1\x60\xc1\x61\xc1\x62\xc1\x63\xd1\xf2\xc1\x64\xc7\xbc\xc1\x65\xc3\xc0\xc1\x66\xc1\x67\xc1\x68\xc1\x69\xc1\x6a\xb8\xe1\xc1\x6b\xc1\x6c\xc1\x6d\xc1\x6e\xc1\x6f\xc1\xe7\xc1\x70\xc1\x71\xf4\xc6\xd0\xdf\xf4\xc7\xc1\x72\xcf\xdb\xc1\x73\xc1\x74\xc8\xba\xc1\x75\xc1\x76\xf4\xc8\xc1\x77\xc1\x78\xc1\x79\xc1\x7a\xc1\x7b\xc1\x7c\xc1\x7d\xf4\xc9\xf4\xca\xc1\x7e\xf4\xcb\xc1\x80\xc1\x81\xc1\x82\xc1\x83\xc1\x84\xd9\xfa\xb8\xfe\xc1\x85\xc1\x86\xe5\xf1\xd3\xf0\xc1\x87\xf4\xe0\xc1\x88\xce\xcc\xc1\x89\xc1\x8a\xc1\x8b\xb3\xe1\xc1\x8c\xc1\x8d\xc1\x8e\xc1\x8f\xf1\xb4\xc1\x90\xd2\xee\xc1\x91\xf4\xe1\xc1\x92\xc1\x93\xc1\x94\xc1\x95\xc1\x96\xcf\xe8\xf4\xe2\xc1\x97\xc1\x98\xc7\xcc\xc1\x99\xc1\x9a\xc1\x9b\xc1\x9c\xc1\x9d\xc1\x9e\xb5\xd4\xb4\xe4\xf4\xe4\xc1\x9f\xc1\xa0\xc2\x40\xf4\xe3\xf4\xe5\xc2\x41\xc2\x42\xf4\xe6\xc2\x43\xc2\x44\xc2\x45\xc2\x46\xf4\xe7\xc2\x47\xba\xb2\xb0\xbf\xc2\x48\xf4\xe8\xc2\x49\xc2\x4a\xc2\x4b\xc2\x4c\xc2\x4d\xc2\x4e\xc2\x4f\xb7\xad\xd2\xed\xc2\x50\xc2\x51\xc2\x52", /* 8000 */ "\xd2\xab\xc0\xcf\xc2\x53\xbf\xbc\xeb\xa3\xd5\xdf\xea\xc8\xc2\x54\xc2\x55\xc2\x56\xc2\x57\xf1\xf3\xb6\xf8\xcb\xa3\xc2\x58\xc2\x59\xc4\xcd\xc2\x5a\xf1\xe7\xc2\x5b\xf1\xe8\xb8\xfb\xf1\xe9\xba\xc4\xd4\xc5\xb0\xd2\xc2\x5c\xc2\x5d\xf1\xea\xc2\x5e\xc2\x5f\xc2\x60\xf1\xeb\xc2\x61\xf1\xec\xc2\x62\xc2\x63\xf1\xed\xf1\xee\xf1\xef\xf1\xf1\xf1\xf0\xc5\xd5\xc2\x64\xc2\x65\xc2\x66\xc2\x67\xc2\x68\xc2\x69\xf1\xf2\xc2\x6a\xb6\xfa\xc2\x6b\xf1\xf4\xd2\xae\xde\xc7\xcb\xca\xc2\x6c\xc2\x6d\xb3\xdc\xc2\x6e\xb5\xa2\xc2\x6f\xb9\xa2\xc2\x70\xc2\x71\xc4\xf4\xf1\xf5\xc2\x72\xc2\x73\xf1\xf6\xc2\x74\xc2\x75\xc2\x76\xc1\xc4\xc1\xfb\xd6\xb0\xf1\xf7\xc2\x77\xc2\x78\xc2\x79\xc2\x7a\xf1\xf8\xc2\x7b\xc1\xaa\xc2\x7c\xc2\x7d\xc2\x7e\xc6\xb8\xc2\x80\xbe\xdb\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xf1\xf9\xb4\xcf\xc2\x8f\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xf1\xfa\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f\xc2\xa0\xc3\x40\xed\xb2", /* 8080 */ "\xed\xb1\xc3\x41\xc3\x42\xcb\xe0\xd2\xde\xc3\x43\xcb\xc1\xd5\xd8\xc3\x44\xc8\xe2\xc3\x45\xc0\xdf\xbc\xa1\xc3\x46\xc3\x47\xc3\x48\xc3\x49\xc3\x4a\xc3\x4b\xeb\xc1\xc3\x4c\xc3\x4d\xd0\xa4\xc3\x4e\xd6\xe2\xc3\x4f\xb6\xc7\xb8\xd8\xeb\xc0\xb8\xce\xc3\x50\xeb\xbf\xb3\xa6\xb9\xc9\xd6\xab\xc3\x51\xb7\xf4\xb7\xca\xc3\x52\xc3\x53\xc3\x54\xbc\xe7\xb7\xbe\xeb\xc6\xc3\x55\xeb\xc7\xb0\xb9\xbf\xcf\xc3\x56\xeb\xc5\xd3\xfd\xc3\x57\xeb\xc8\xc3\x58\xc3\x59\xeb\xc9\xc3\x5a\xc3\x5b\xb7\xce\xc3\x5c\xeb\xc2\xeb\xc4\xc9\xf6\xd6\xd7\xd5\xcd\xd0\xb2\xeb\xcf\xce\xb8\xeb\xd0\xc3\x5d\xb5\xa8\xc3\x5e\xc3\x5f\xc3\x60\xc3\x61\xc3\x62\xb1\xb3\xeb\xd2\xcc\xa5\xc3\x63\xc3\x64\xc3\x65\xc3\x66\xc3\x67\xc3\x68\xc3\x69\xc5\xd6\xeb\xd3\xc3\x6a\xeb\xd1\xc5\xdf\xeb\xce\xca\xa4\xeb\xd5\xb0\xfb\xc3\x6b\xc3\x6c\xba\xfa\xc3\x6d\xc3\x6e\xd8\xb7\xf1\xe3\xc3\x6f\xeb\xca\xeb\xcb\xeb\xcc\xeb\xcd\xeb\xd6\xe6\xc0\xeb\xd9\xc3\x70\xbf\xe8\xd2\xc8\xeb\xd7\xeb\xdc\xb8\xec\xeb\xd8\xc3\x71\xbd\xba\xc3\x72\xd0\xd8\xc3\x73\xb0\xb7\xc3\x74\xeb\xdd\xc4\xdc\xc3\x75\xc3\x76", /* 8100 */ "\xc3\x77\xc3\x78\xd6\xac\xc3\x79\xc3\x7a\xc3\x7b\xb4\xe0\xc3\x7c\xc3\x7d\xc2\xf6\xbc\xb9\xc3\x7e\xc3\x80\xeb\xda\xeb\xdb\xd4\xe0\xc6\xea\xc4\xd4\xeb\xdf\xc5\xa7\xd9\xf5\xc3\x81\xb2\xb1\xc3\x82\xeb\xe4\xc3\x83\xbd\xc5\xc3\x84\xc3\x85\xc3\x86\xeb\xe2\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xeb\xe3\xc3\x94\xc3\x95\xb8\xac\xc3\x96\xcd\xd1\xeb\xe5\xc3\x97\xc3\x98\xc3\x99\xeb\xe1\xc3\x9a\xc1\xb3\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f\xc6\xa2\xc3\xa0\xc4\x40\xc4\x41\xc4\x42\xc4\x43\xc4\x44\xc4\x45\xcc\xf3\xc4\x46\xeb\xe6\xc4\x47\xc0\xb0\xd2\xb8\xeb\xe7\xc4\x48\xc4\x49\xc4\x4a\xb8\xaf\xb8\xad\xc4\x4b\xeb\xe8\xc7\xbb\xcd\xf3\xc4\x4c\xc4\x4d\xc4\x4e\xeb\xea\xeb\xeb\xc4\x4f\xc4\x50\xc4\x51\xc4\x52\xc4\x53\xeb\xed\xc4\x54\xc4\x55\xc4\x56\xc4\x57\xd0\xc8\xc4\x58\xeb\xf2\xc4\x59\xeb\xee\xc4\x5a\xc4\x5b\xc4\x5c\xeb\xf1\xc8\xf9\xc4\x5d\xd1\xfc\xeb\xec\xc4\x5e\xc4\x5f\xeb\xe9\xc4\x60\xc4\x61\xc4\x62\xc4\x63\xb8\xb9\xcf\xd9\xc4\xe5\xeb\xef\xeb\xf0\xcc\xda\xcd\xc8", /* 8180 */ "\xb0\xf2\xc4\x64\xeb\xf6\xc4\x65\xc4\x66\xc4\x67\xc4\x68\xc4\x69\xeb\xf5\xc4\x6a\xb2\xb2\xc4\x6b\xc4\x6c\xc4\x6d\xc4\x6e\xb8\xe0\xc4\x6f\xeb\xf7\xc4\x70\xc4\x71\xc4\x72\xc4\x73\xc4\x74\xc4\x75\xb1\xec\xc4\x76\xc4\x77\xcc\xc5\xc4\xa4\xcf\xa5\xc4\x78\xc4\x79\xc4\x7a\xc4\x7b\xc4\x7c\xeb\xf9\xc4\x7d\xc4\x7e\xec\xa2\xc4\x80\xc5\xf2\xc4\x81\xeb\xfa\xc4\x82\xc4\x83\xc4\x84\xc4\x85\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc9\xc5\xc4\x8a\xc4\x8b\xc4\x8c\xc4\x8d\xc4\x8e\xc4\x8f\xe2\xdf\xeb\xfe\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xcd\xce\xec\xa1\xb1\xdb\xd3\xb7\xc4\x94\xc4\x95\xd2\xdc\xc4\x96\xc4\x97\xc4\x98\xeb\xfd\xc4\x99\xeb\xfb\xc4\x9a\xc4\x9b\xc4\x9c\xc4\x9d\xc4\x9e\xc4\x9f\xc4\xa0\xc5\x40\xc5\x41\xc5\x42\xc5\x43\xc5\x44\xc5\x45\xc5\x46\xc5\x47\xc5\x48\xc5\x49\xc5\x4a\xc5\x4b\xc5\x4c\xc5\x4d\xc5\x4e\xb3\xbc\xc5\x4f\xc5\x50\xc5\x51\xea\xb0\xc5\x52\xc5\x53\xd7\xd4\xc5\x54\xf4\xab\xb3\xf4\xc5\x55\xc5\x56\xc5\x57\xc5\x58\xc5\x59\xd6\xc1\xd6\xc2\xc5\x5a\xc5\x5b\xc5\x5c\xc5\x5d\xc5\x5e\xc5\x5f\xd5\xe9\xbe\xca\xc5\x60\xf4\xa7\xc5\x61", /* 8200 */ "\xd2\xa8\xf4\xa8\xf4\xa9\xc5\x62\xf4\xaa\xbe\xcb\xd3\xdf\xc5\x63\xc5\x64\xc5\x65\xc5\x66\xc5\x67\xc9\xe0\xc9\xe1\xc5\x68\xc5\x69\xf3\xc2\xc5\x6a\xca\xe6\xc5\x6b\xcc\xf2\xc5\x6c\xc5\x6d\xc5\x6e\xc5\x6f\xc5\x70\xc5\x71\xe2\xb6\xcb\xb4\xc5\x72\xce\xe8\xd6\xdb\xc5\x73\xf4\xad\xf4\xae\xf4\xaf\xc5\x74\xc5\x75\xc5\x76\xc5\x77\xf4\xb2\xc5\x78\xba\xbd\xf4\xb3\xb0\xe3\xf4\xb0\xc5\x79\xf4\xb1\xbd\xa2\xb2\xd5\xc5\x7a\xf4\xb6\xf4\xb7\xb6\xe6\xb2\xb0\xcf\xcf\xf4\xb4\xb4\xac\xc5\x7b\xf4\xb5\xc5\x7c\xc5\x7d\xf4\xb8\xc5\x7e\xc5\x80\xc5\x81\xc5\x82\xc5\x83\xf4\xb9\xc5\x84\xc5\x85\xcd\xa7\xc5\x86\xf4\xba\xc5\x87\xf4\xbb\xc5\x88\xc5\x89\xc5\x8a\xf4\xbc\xc5\x8b\xc5\x8c\xc5\x8d\xc5\x8e\xc5\x8f\xc5\x90\xc5\x91\xc5\x92\xcb\xd2\xc5\x93\xf4\xbd\xc5\x94\xc5\x95\xc5\x96\xc5\x97\xf4\xbe\xc5\x98\xc5\x99\xc5\x9a\xc5\x9b\xc5\x9c\xc5\x9d\xc5\x9e\xc5\x9f\xf4\xbf\xc5\xa0\xc6\x40\xc6\x41\xc6\x42\xc6\x43\xf4\xde\xc1\xbc\xbc\xe8\xc6\x44\xc9\xab\xd1\xde\xe5\xf5\xc6\x45\xc6\x46\xc6\x47\xc6\x48\xdc\xb3\xd2\xd5\xc6\x49\xc6\x4a\xdc\xb4\xb0\xac\xdc\xb5", /* 8280 */ "\xc6\x4b\xc6\x4c\xbd\xda\xc6\x4d\xdc\xb9\xc6\x4e\xc6\x4f\xc6\x50\xd8\xc2\xc6\x51\xdc\xb7\xd3\xf3\xc6\x52\xc9\xd6\xdc\xba\xdc\xb6\xc6\x53\xdc\xbb\xc3\xa2\xc6\x54\xc6\x55\xc6\x56\xc6\x57\xdc\xbc\xdc\xc5\xdc\xbd\xc6\x58\xc6\x59\xce\xdf\xd6\xa5\xc6\x5a\xdc\xcf\xc6\x5b\xdc\xcd\xc6\x5c\xc6\x5d\xdc\xd2\xbd\xe6\xc2\xab\xc6\x5e\xdc\xb8\xdc\xcb\xdc\xce\xdc\xbe\xb7\xd2\xb0\xc5\xdc\xc7\xd0\xbe\xdc\xc1\xbb\xa8\xc6\x5f\xb7\xbc\xdc\xcc\xc6\x60\xc6\x61\xdc\xc6\xdc\xbf\xc7\xdb\xc6\x62\xc6\x63\xc6\x64\xd1\xbf\xdc\xc0\xc6\x65\xc6\x66\xdc\xca\xc6\x67\xc6\x68\xdc\xd0\xc6\x69\xc6\x6a\xce\xad\xdc\xc2\xc6\x6b\xdc\xc3\xdc\xc8\xdc\xc9\xb2\xd4\xdc\xd1\xcb\xd5\xc6\x6c\xd4\xb7\xdc\xdb\xdc\xdf\xcc\xa6\xdc\xe6\xc6\x6d\xc3\xe7\xdc\xdc\xc6\x6e\xc6\x6f\xbf\xc1\xdc\xd9\xc6\x70\xb0\xfa\xb9\xb6\xdc\xe5\xdc\xd3\xc6\x71\xdc\xc4\xdc\xd6\xc8\xf4\xbf\xe0\xc6\x72\xc6\x73\xc6\x74\xc6\x75\xc9\xbb\xc6\x76\xc6\x77\xc6\x78\xb1\xbd\xc6\x79\xd3\xa2\xc6\x7a\xc6\x7b\xdc\xda\xc6\x7c\xc6\x7d\xdc\xd5\xc6\x7e\xc6\xbb\xc6\x80\xdc\xde\xc6\x81\xc6\x82\xc6\x83\xc6\x84", /* 8300 */ "\xc6\x85\xd7\xc2\xc3\xaf\xb7\xb6\xc7\xd1\xc3\xa9\xdc\xe2\xdc\xd8\xdc\xeb\xdc\xd4\xc6\x86\xc6\x87\xdc\xdd\xc6\x88\xbe\xa5\xdc\xd7\xc6\x89\xdc\xe0\xc6\x8a\xc6\x8b\xdc\xe3\xdc\xe4\xc6\x8c\xdc\xf8\xc6\x8d\xc6\x8e\xdc\xe1\xdd\xa2\xdc\xe7\xc6\x8f\xc6\x90\xc6\x91\xc6\x92\xc6\x93\xc6\x94\xc6\x95\xc6\x96\xc6\x97\xc6\x98\xbc\xeb\xb4\xc4\xc6\x99\xc6\x9a\xc3\xa3\xb2\xe7\xdc\xfa\xc6\x9b\xdc\xf2\xc6\x9c\xdc\xef\xc6\x9d\xdc\xfc\xdc\xee\xd2\xf0\xb2\xe8\xc6\x9e\xc8\xd7\xc8\xe3\xdc\xfb\xc6\x9f\xdc\xed\xc6\xa0\xc7\x40\xc7\x41\xdc\xf7\xc7\x42\xc7\x43\xdc\xf5\xc7\x44\xc7\x45\xbe\xa3\xdc\xf4\xc7\x46\xb2\xdd\xc7\x47\xc7\x48\xc7\x49\xc7\x4a\xc7\x4b\xdc\xf3\xbc\xf6\xdc\xe8\xbb\xc4\xc7\x4c\xc0\xf3\xc7\x4d\xc7\x4e\xc7\x4f\xc7\x50\xc7\x51\xbc\xd4\xdc\xe9\xdc\xea\xc7\x52\xdc\xf1\xdc\xf6\xdc\xf9\xb5\xb4\xc7\x53\xc8\xd9\xbb\xe7\xdc\xfe\xdc\xfd\xd3\xab\xdd\xa1\xdd\xa3\xdd\xa5\xd2\xf1\xdd\xa4\xdd\xa6\xdd\xa7\xd2\xa9\xc7\x54\xc7\x55\xc7\x56\xc7\x57\xc7\x58\xc7\x59\xc7\x5a\xba\xc9\xdd\xa9\xc7\x5b\xc7\x5c\xdd\xb6\xdd\xb1\xdd\xb4\xc7\x5d\xc7\x5e", /* 8380 */ "\xc7\x5f\xc7\x60\xc7\x61\xc7\x62\xc7\x63\xdd\xb0\xc6\xce\xc7\x64\xc7\x65\xc0\xf2\xc7\x66\xc7\x67\xc7\x68\xc7\x69\xc9\xaf\xc7\x6a\xc7\x6b\xc7\x6c\xdc\xec\xdd\xae\xc7\x6d\xc7\x6e\xc7\x6f\xc7\x70\xdd\xb7\xc7\x71\xc7\x72\xdc\xf0\xdd\xaf\xc7\x73\xdd\xb8\xc7\x74\xdd\xac\xc7\x75\xc7\x76\xc7\x77\xc7\x78\xc7\x79\xc7\x7a\xc7\x7b\xdd\xb9\xdd\xb3\xdd\xad\xc4\xaa\xc7\x7c\xc7\x7d\xc7\x7e\xc7\x80\xdd\xa8\xc0\xb3\xc1\xab\xdd\xaa\xdd\xab\xc7\x81\xdd\xb2\xbb\xf1\xdd\xb5\xd3\xa8\xdd\xba\xc7\x82\xdd\xbb\xc3\xa7\xc7\x83\xc7\x84\xdd\xd2\xdd\xbc\xc7\x85\xc7\x86\xc7\x87\xdd\xd1\xc7\x88\xb9\xbd\xc7\x89\xc7\x8a\xbe\xd5\xc7\x8b\xbe\xfa\xc7\x8c\xc7\x8d\xba\xca\xc7\x8e\xc7\x8f\xc7\x90\xc7\x91\xdd\xca\xc7\x92\xdd\xc5\xc7\x93\xdd\xbf\xc7\x94\xc7\x95\xc7\x96\xb2\xcb\xdd\xc3\xc7\x97\xdd\xcb\xb2\xa4\xdd\xd5\xc7\x98\xc7\x99\xc7\x9a\xdd\xbe\xc7\x9b\xc7\x9c\xc7\x9d\xc6\xd0\xdd\xd0\xc7\x9e\xc7\x9f\xc7\xa0\xc8\x40\xc8\x41\xdd\xd4\xc1\xe2\xb7\xc6\xc8\x42\xc8\x43\xc8\x44\xc8\x45\xc8\x46\xdd\xce\xdd\xcf\xc8\x47\xc8\x48\xc8\x49\xdd\xc4\xc8\x4a\xc8\x4b", /* 8400 */ "\xc8\x4c\xdd\xbd\xc8\x4d\xdd\xcd\xcc\xd1\xc8\x4e\xdd\xc9\xc8\x4f\xc8\x50\xc8\x51\xc8\x52\xdd\xc2\xc3\xc8\xc6\xbc\xce\xae\xdd\xcc\xc8\x53\xdd\xc8\xc8\x54\xc8\x55\xc8\x56\xc8\x57\xc8\x58\xc8\x59\xdd\xc1\xc8\x5a\xc8\x5b\xc8\x5c\xdd\xc6\xc2\xdc\xc8\x5d\xc8\x5e\xc8\x5f\xc8\x60\xc8\x61\xc8\x62\xd3\xa9\xd3\xaa\xdd\xd3\xcf\xf4\xc8\xf8\xc8\x63\xc8\x64\xc8\x65\xc8\x66\xc8\x67\xc8\x68\xc8\x69\xc8\x6a\xdd\xe6\xc8\x6b\xc8\x6c\xc8\x6d\xc8\x6e\xc8\x6f\xc8\x70\xdd\xc7\xc8\x71\xc8\x72\xc8\x73\xdd\xe0\xc2\xe4\xc8\x74\xc8\x75\xc8\x76\xc8\x77\xc8\x78\xc8\x79\xc8\x7a\xc8\x7b\xdd\xe1\xc8\x7c\xc8\x7d\xc8\x7e\xc8\x80\xc8\x81\xc8\x82\xc8\x83\xc8\x84\xc8\x85\xc8\x86\xdd\xd7\xc8\x87\xc8\x88\xc8\x89\xc8\x8a\xc8\x8b\xd6\xf8\xc8\x8c\xdd\xd9\xdd\xd8\xb8\xf0\xdd\xd6\xc8\x8d\xc8\x8e\xc8\x8f\xc8\x90\xc6\xcf\xc8\x91\xb6\xad\xc8\x92\xc8\x93\xc8\x94\xc8\x95\xc8\x96\xdd\xe2\xc8\x97\xba\xf9\xd4\xe1\xdd\xe7\xc8\x98\xc8\x99\xc8\x9a\xb4\xd0\xc8\x9b\xdd\xda\xc8\x9c\xbf\xfb\xdd\xe3\xc8\x9d\xdd\xdf\xc8\x9e\xdd\xdd\xc8\x9f\xc8\xa0\xc9\x40\xc9\x41\xc9\x42", /* 8480 */ "\xc9\x43\xc9\x44\xb5\xd9\xc9\x45\xc9\x46\xc9\x47\xc9\x48\xdd\xdb\xdd\xdc\xdd\xde\xc9\x49\xbd\xaf\xdd\xe4\xc9\x4a\xdd\xe5\xc9\x4b\xc9\x4c\xc9\x4d\xc9\x4e\xc9\x4f\xc9\x50\xc9\x51\xc9\x52\xdd\xf5\xc9\x53\xc3\xc9\xc9\x54\xc9\x55\xcb\xe2\xc9\x56\xc9\x57\xc9\x58\xc9\x59\xdd\xf2\xc9\x5a\xc9\x5b\xc9\x5c\xc9\x5d\xc9\x5e\xc9\x5f\xc9\x60\xc9\x61\xc9\x62\xc9\x63\xc9\x64\xc9\x65\xc9\x66\xd8\xe1\xc9\x67\xc9\x68\xc6\xd1\xc9\x69\xdd\xf4\xc9\x6a\xc9\x6b\xc9\x6c\xd5\xf4\xdd\xf3\xdd\xf0\xc9\x6d\xc9\x6e\xdd\xec\xc9\x6f\xdd\xef\xc9\x70\xdd\xe8\xc9\x71\xc9\x72\xd0\xee\xc9\x73\xc9\x74\xc9\x75\xc9\x76\xc8\xd8\xdd\xee\xc9\x77\xc9\x78\xdd\xe9\xc9\x79\xc9\x7a\xdd\xea\xcb\xf2\xc9\x7b\xdd\xed\xc9\x7c\xc9\x7d\xb1\xcd\xc9\x7e\xc9\x80\xc9\x81\xc9\x82\xc9\x83\xc9\x84\xc0\xb6\xc9\x85\xbc\xbb\xdd\xf1\xc9\x86\xc9\x87\xdd\xf7\xc9\x88\xdd\xf6\xdd\xeb\xc9\x89\xc9\x8a\xc9\x8b\xc9\x8c\xc9\x8d\xc5\xee\xc9\x8e\xc9\x8f\xc9\x90\xdd\xfb\xc9\x91\xc9\x92\xc9\x93\xc9\x94\xc9\x95\xc9\x96\xc9\x97\xc9\x98\xc9\x99\xc9\x9a\xc9\x9b\xde\xa4\xc9\x9c\xc9\x9d\xde\xa3", /* 8500 */ "\xc9\x9e\xc9\x9f\xc9\xa0\xca\x40\xca\x41\xca\x42\xca\x43\xca\x44\xca\x45\xca\x46\xca\x47\xca\x48\xdd\xf8\xca\x49\xca\x4a\xca\x4b\xca\x4c\xc3\xef\xca\x4d\xc2\xfb\xca\x4e\xca\x4f\xca\x50\xd5\xe1\xca\x51\xca\x52\xce\xb5\xca\x53\xca\x54\xca\x55\xca\x56\xdd\xfd\xca\x57\xb2\xcc\xca\x58\xca\x59\xca\x5a\xca\x5b\xca\x5c\xca\x5d\xca\x5e\xca\x5f\xca\x60\xc4\xe8\xca\xdf\xca\x61\xca\x62\xca\x63\xca\x64\xca\x65\xca\x66\xca\x67\xca\x68\xca\x69\xca\x6a\xc7\xbe\xdd\xfa\xdd\xfc\xdd\xfe\xde\xa2\xb0\xaa\xb1\xce\xca\x6b\xca\x6c\xca\x6d\xca\x6e\xca\x6f\xde\xac\xca\x70\xca\x71\xca\x72\xca\x73\xde\xa6\xbd\xb6\xc8\xef\xca\x74\xca\x75\xca\x76\xca\x77\xca\x78\xca\x79\xca\x7a\xca\x7b\xca\x7c\xca\x7d\xca\x7e\xde\xa1\xca\x80\xca\x81\xde\xa5\xca\x82\xca\x83\xca\x84\xca\x85\xde\xa9\xca\x86\xca\x87\xca\x88\xca\x89\xca\x8a\xde\xa8\xca\x8b\xca\x8c\xca\x8d\xde\xa7\xca\x8e\xca\x8f\xca\x90\xca\x91\xca\x92\xca\x93\xca\x94\xca\x95\xca\x96\xde\xad\xca\x97\xd4\xcc\xca\x98\xca\x99\xca\x9a\xca\x9b\xde\xb3\xde\xaa\xde\xae\xca\x9c\xca\x9d\xc0\xd9\xca\x9e", /* 8580 */ "\xca\x9f\xca\xa0\xcb\x40\xcb\x41\xb1\xa1\xde\xb6\xcb\x42\xde\xb1\xcb\x43\xcb\x44\xcb\x45\xcb\x46\xcb\x47\xcb\x48\xcb\x49\xde\xb2\xcb\x4a\xcb\x4b\xcb\x4c\xcb\x4d\xcb\x4e\xcb\x4f\xcb\x50\xcb\x51\xcb\x52\xcb\x53\xcb\x54\xd1\xa6\xde\xb5\xcb\x55\xcb\x56\xcb\x57\xcb\x58\xcb\x59\xcb\x5a\xcb\x5b\xde\xaf\xcb\x5c\xcb\x5d\xcb\x5e\xde\xb0\xcb\x5f\xd0\xbd\xcb\x60\xcb\x61\xcb\x62\xde\xb4\xca\xed\xde\xb9\xcb\x63\xcb\x64\xcb\x65\xcb\x66\xcb\x67\xcb\x68\xde\xb8\xcb\x69\xde\xb7\xcb\x6a\xcb\x6b\xcb\x6c\xcb\x6d\xcb\x6e\xcb\x6f\xcb\x70\xde\xbb\xcb\x71\xcb\x72\xcb\x73\xcb\x74\xcb\x75\xcb\x76\xcb\x77\xbd\xe5\xcb\x78\xcb\x79\xcb\x7a\xcb\x7b\xcb\x7c\xb2\xd8\xc3\xea\xcb\x7d\xcb\x7e\xde\xba\xcb\x80\xc5\xba\xcb\x81\xcb\x82\xcb\x83\xcb\x84\xcb\x85\xcb\x86\xde\xbc\xcb\x87\xcb\x88\xcb\x89\xcb\x8a\xcb\x8b\xcb\x8c\xcb\x8d\xcc\xd9\xcb\x8e\xcb\x8f\xcb\x90\xcb\x91\xb7\xaa\xcb\x92\xcb\x93\xcb\x94\xcb\x95\xcb\x96\xcb\x97\xcb\x98\xcb\x99\xcb\x9a\xcb\x9b\xcb\x9c\xcb\x9d\xcb\x9e\xcb\x9f\xcb\xa0\xcc\x40\xcc\x41\xd4\xe5\xcc\x42\xcc\x43\xcc\x44\xde\xbd", /* 8600 */ "\xcc\x45\xcc\x46\xcc\x47\xcc\x48\xcc\x49\xde\xbf\xcc\x4a\xcc\x4b\xcc\x4c\xcc\x4d\xcc\x4e\xcc\x4f\xcc\x50\xcc\x51\xcc\x52\xcc\x53\xcc\x54\xc4\xa2\xcc\x55\xcc\x56\xcc\x57\xcc\x58\xde\xc1\xcc\x59\xcc\x5a\xcc\x5b\xcc\x5c\xcc\x5d\xcc\x5e\xcc\x5f\xcc\x60\xcc\x61\xcc\x62\xcc\x63\xcc\x64\xcc\x65\xcc\x66\xcc\x67\xcc\x68\xde\xbe\xcc\x69\xde\xc0\xcc\x6a\xcc\x6b\xcc\x6c\xcc\x6d\xcc\x6e\xcc\x6f\xcc\x70\xcc\x71\xcc\x72\xcc\x73\xcc\x74\xcc\x75\xcc\x76\xcc\x77\xd5\xba\xcc\x78\xcc\x79\xcc\x7a\xde\xc2\xcc\x7b\xcc\x7c\xcc\x7d\xcc\x7e\xcc\x80\xcc\x81\xcc\x82\xcc\x83\xcc\x84\xcc\x85\xcc\x86\xcc\x87\xcc\x88\xcc\x89\xcc\x8a\xcc\x8b\xf2\xae\xbb\xa2\xc2\xb2\xc5\xb0\xc2\xc7\xcc\x8c\xcc\x8d\xf2\xaf\xcc\x8e\xcc\x8f\xcc\x90\xcc\x91\xcc\x92\xd0\xe9\xcc\x93\xcc\x94\xcc\x95\xd3\xdd\xcc\x96\xcc\x97\xcc\x98\xeb\xbd\xcc\x99\xcc\x9a\xcc\x9b\xcc\x9c\xcc\x9d\xcc\x9e\xcc\x9f\xcc\xa0\xb3\xe6\xf2\xb0\xcd\x40\xf2\xb1\xcd\x41\xcd\x42\xca\xad\xcd\x43\xcd\x44\xcd\x45\xcd\x46\xcd\x47\xcd\x48\xcd\x49\xba\xe7\xf2\xb3\xf2\xb5\xf2\xb4\xcb\xe4\xcf\xba\xf2\xb2", /* 8680 */ "\xca\xb4\xd2\xcf\xc2\xec\xcd\x4a\xcd\x4b\xcd\x4c\xcd\x4d\xcd\x4e\xcd\x4f\xcd\x50\xce\xc3\xf2\xb8\xb0\xf6\xf2\xb7\xcd\x51\xcd\x52\xcd\x53\xcd\x54\xcd\x55\xf2\xbe\xcd\x56\xb2\xcf\xcd\x57\xcd\x58\xcd\x59\xcd\x5a\xcd\x5b\xcd\x5c\xd1\xc1\xf2\xba\xcd\x5d\xcd\x5e\xcd\x5f\xcd\x60\xcd\x61\xf2\xbc\xd4\xe9\xcd\x62\xcd\x63\xf2\xbb\xf2\xb6\xf2\xbf\xf2\xbd\xcd\x64\xf2\xb9\xcd\x65\xcd\x66\xf2\xc7\xf2\xc4\xf2\xc6\xcd\x67\xcd\x68\xf2\xca\xf2\xc2\xf2\xc0\xcd\x69\xcd\x6a\xcd\x6b\xf2\xc5\xcd\x6c\xcd\x6d\xcd\x6e\xcd\x6f\xcd\x70\xd6\xfb\xcd\x71\xcd\x72\xcd\x73\xf2\xc1\xcd\x74\xc7\xf9\xc9\xdf\xcd\x75\xf2\xc8\xb9\xc6\xb5\xb0\xcd\x76\xcd\x77\xf2\xc3\xf2\xc9\xf2\xd0\xf2\xd6\xcd\x78\xcd\x79\xbb\xd7\xcd\x7a\xcd\x7b\xcd\x7c\xf2\xd5\xcd\xdc\xcd\x7d\xd6\xeb\xcd\x7e\xcd\x80\xf2\xd2\xf2\xd4\xcd\x81\xcd\x82\xcd\x83\xcd\x84\xb8\xf2\xcd\x85\xcd\x86\xcd\x87\xcd\x88\xf2\xcb\xcd\x89\xcd\x8a\xcd\x8b\xf2\xce\xc2\xf9\xcd\x8c\xd5\xdd\xf2\xcc\xf2\xcd\xf2\xcf\xf2\xd3\xcd\x8d\xcd\x8e\xcd\x8f\xf2\xd9\xd3\xbc\xcd\x90\xcd\x91\xcd\x92\xcd\x93\xb6\xea\xcd\x94", /* 8700 */ "\xca\xf1\xcd\x95\xb7\xe4\xf2\xd7\xcd\x96\xcd\x97\xcd\x98\xf2\xd8\xf2\xda\xf2\xdd\xf2\xdb\xcd\x99\xcd\x9a\xf2\xdc\xcd\x9b\xcd\x9c\xcd\x9d\xcd\x9e\xd1\xd1\xf2\xd1\xcd\x9f\xcd\xc9\xcd\xa0\xce\xcf\xd6\xa9\xce\x40\xf2\xe3\xce\x41\xc3\xdb\xce\x42\xf2\xe0\xce\x43\xce\x44\xc0\xaf\xf2\xec\xf2\xde\xce\x45\xf2\xe1\xce\x46\xce\x47\xce\x48\xf2\xe8\xce\x49\xce\x4a\xce\x4b\xce\x4c\xf2\xe2\xce\x4d\xce\x4e\xf2\xe7\xce\x4f\xce\x50\xf2\xe6\xce\x51\xce\x52\xf2\xe9\xce\x53\xce\x54\xce\x55\xf2\xdf\xce\x56\xce\x57\xf2\xe4\xf2\xea\xce\x58\xce\x59\xce\x5a\xce\x5b\xce\x5c\xce\x5d\xce\x5e\xd3\xac\xf2\xe5\xb2\xf5\xce\x5f\xce\x60\xf2\xf2\xce\x61\xd0\xab\xce\x62\xce\x63\xce\x64\xce\x65\xf2\xf5\xce\x66\xce\x67\xce\x68\xbb\xc8\xce\x69\xf2\xf9\xce\x6a\xce\x6b\xce\x6c\xce\x6d\xce\x6e\xce\x6f\xf2\xf0\xce\x70\xce\x71\xf2\xf6\xf2\xf8\xf2\xfa\xce\x72\xce\x73\xce\x74\xce\x75\xce\x76\xce\x77\xce\x78\xce\x79\xf2\xf3\xce\x7a\xf2\xf1\xce\x7b\xce\x7c\xce\x7d\xba\xfb\xce\x7e\xb5\xfb\xce\x80\xce\x81\xce\x82\xce\x83\xf2\xef\xf2\xf7\xf2\xed\xf2\xee\xce\x84", /* 8780 */ "\xce\x85\xce\x86\xf2\xeb\xf3\xa6\xce\x87\xf3\xa3\xce\x88\xce\x89\xf3\xa2\xce\x8a\xce\x8b\xf2\xf4\xce\x8c\xc8\xda\xce\x8d\xce\x8e\xce\x8f\xce\x90\xce\x91\xf2\xfb\xce\x92\xce\x93\xce\x94\xf3\xa5\xce\x95\xce\x96\xce\x97\xce\x98\xce\x99\xce\x9a\xce\x9b\xc3\xf8\xce\x9c\xce\x9d\xce\x9e\xce\x9f\xce\xa0\xcf\x40\xcf\x41\xcf\x42\xf2\xfd\xcf\x43\xcf\x44\xf3\xa7\xf3\xa9\xf3\xa4\xcf\x45\xf2\xfc\xcf\x46\xcf\x47\xcf\x48\xf3\xab\xcf\x49\xf3\xaa\xcf\x4a\xcf\x4b\xcf\x4c\xcf\x4d\xc2\xdd\xcf\x4e\xcf\x4f\xf3\xae\xcf\x50\xcf\x51\xf3\xb0\xcf\x52\xcf\x53\xcf\x54\xcf\x55\xcf\x56\xf3\xa1\xcf\x57\xcf\x58\xcf\x59\xf3\xb1\xf3\xac\xcf\x5a\xcf\x5b\xcf\x5c\xcf\x5d\xcf\x5e\xf3\xaf\xf2\xfe\xf3\xad\xcf\x5f\xcf\x60\xcf\x61\xcf\x62\xcf\x63\xcf\x64\xcf\x65\xf3\xb2\xcf\x66\xcf\x67\xcf\x68\xcf\x69\xf3\xb4\xcf\x6a\xcf\x6b\xcf\x6c\xcf\x6d\xf3\xa8\xcf\x6e\xcf\x6f\xcf\x70\xcf\x71\xf3\xb3\xcf\x72\xcf\x73\xcf\x74\xf3\xb5\xcf\x75\xcf\x76\xcf\x77\xcf\x78\xcf\x79\xcf\x7a\xcf\x7b\xcf\x7c\xcf\x7d\xcf\x7e\xd0\xb7\xcf\x80\xcf\x81\xcf\x82\xcf\x83\xf3\xb8\xcf\x84", /* 8800 */ "\xcf\x85\xcf\x86\xcf\x87\xd9\xf9\xcf\x88\xcf\x89\xcf\x8a\xcf\x8b\xcf\x8c\xcf\x8d\xf3\xb9\xcf\x8e\xcf\x8f\xcf\x90\xcf\x91\xcf\x92\xcf\x93\xcf\x94\xcf\x95\xf3\xb7\xcf\x96\xc8\xe4\xf3\xb6\xcf\x97\xcf\x98\xcf\x99\xcf\x9a\xf3\xba\xcf\x9b\xcf\x9c\xcf\x9d\xcf\x9e\xcf\x9f\xf3\xbb\xb4\xc0\xcf\xa0\xd0\x40\xd0\x41\xd0\x42\xd0\x43\xd0\x44\xd0\x45\xd0\x46\xd0\x47\xd0\x48\xd0\x49\xd0\x4a\xd0\x4b\xd0\x4c\xd0\x4d\xee\xc3\xd0\x4e\xd0\x4f\xd0\x50\xd0\x51\xd0\x52\xd0\x53\xf3\xbc\xd0\x54\xd0\x55\xf3\xbd\xd0\x56\xd0\x57\xd0\x58\xd1\xaa\xd0\x59\xd0\x5a\xd0\x5b\xf4\xac\xd0\xc6\xd0\x5c\xd0\x5d\xd0\x5e\xd0\x5f\xd0\x60\xd0\x61\xd0\xd0\xd1\xdc\xd0\x62\xd0\x63\xd0\x64\xd0\x65\xd0\x66\xd0\x67\xcf\xce\xd0\x68\xd0\x69\xbd\xd6\xd0\x6a\xd1\xc3\xd0\x6b\xd0\x6c\xd0\x6d\xd0\x6e\xd0\x6f\xd0\x70\xd0\x71\xba\xe2\xe1\xe9\xd2\xc2\xf1\xc2\xb2\xb9\xd0\x72\xd0\x73\xb1\xed\xf1\xc3\xd0\x74\xc9\xc0\xb3\xc4\xd0\x75\xd9\xf2\xd0\x76\xcb\xa5\xd0\x77\xf1\xc4\xd0\x78\xd0\x79\xd0\x7a\xd0\x7b\xd6\xd4\xd0\x7c\xd0\x7d\xd0\x7e\xd0\x80\xd0\x81\xf1\xc5\xf4\xc0\xf1\xc6", /* 8880 */ "\xd0\x82\xd4\xac\xf1\xc7\xd0\x83\xb0\xc0\xf4\xc1\xd0\x84\xd0\x85\xf4\xc2\xd0\x86\xd0\x87\xb4\xfc\xd0\x88\xc5\xdb\xd0\x89\xd0\x8a\xd0\x8b\xd0\x8c\xcc\xbb\xd0\x8d\xd0\x8e\xd0\x8f\xd0\xe4\xd0\x90\xd0\x91\xd0\x92\xd0\x93\xd0\x94\xcd\xe0\xd0\x95\xd0\x96\xd0\x97\xd0\x98\xd0\x99\xf1\xc8\xd0\x9a\xd9\xf3\xd0\x9b\xd0\x9c\xd0\x9d\xd0\x9e\xd0\x9f\xd0\xa0\xb1\xbb\xd1\x40\xcf\xae\xd1\x41\xd1\x42\xd1\x43\xb8\xa4\xd1\x44\xd1\x45\xd1\x46\xd1\x47\xd1\x48\xf1\xca\xd1\x49\xd1\x4a\xd1\x4b\xd1\x4c\xf1\xcb\xd1\x4d\xd1\x4e\xd1\x4f\xd1\x50\xb2\xc3\xc1\xd1\xd1\x51\xd1\x52\xd7\xb0\xf1\xc9\xd1\x53\xd1\x54\xf1\xcc\xd1\x55\xd1\x56\xd1\x57\xd1\x58\xf1\xce\xd1\x59\xd1\x5a\xd1\x5b\xd9\xf6\xd1\x5c\xd2\xe1\xd4\xa3\xd1\x5d\xd1\x5e\xf4\xc3\xc8\xb9\xd1\x5f\xd1\x60\xd1\x61\xd1\x62\xd1\x63\xf4\xc4\xd1\x64\xd1\x65\xf1\xcd\xf1\xcf\xbf\xe3\xf1\xd0\xd1\x66\xd1\x67\xf1\xd4\xd1\x68\xd1\x69\xd1\x6a\xd1\x6b\xd1\x6c\xd1\x6d\xd1\x6e\xf1\xd6\xf1\xd1\xd1\x6f\xc9\xd1\xc5\xe1\xd1\x70\xd1\x71\xd1\x72\xc2\xe3\xb9\xfc\xd1\x73\xd1\x74\xf1\xd3\xd1\x75\xf1\xd5\xd1\x76", /* 8900 */ "\xd1\x77\xd1\x78\xb9\xd3\xd1\x79\xd1\x7a\xd1\x7b\xd1\x7c\xd1\x7d\xd1\x7e\xd1\x80\xf1\xdb\xd1\x81\xd1\x82\xd1\x83\xd1\x84\xd1\x85\xba\xd6\xd1\x86\xb0\xfd\xf1\xd9\xd1\x87\xd1\x88\xd1\x89\xd1\x8a\xd1\x8b\xf1\xd8\xf1\xd2\xf1\xda\xd1\x8c\xd1\x8d\xd1\x8e\xd1\x8f\xd1\x90\xf1\xd7\xd1\x91\xd1\x92\xd1\x93\xc8\xec\xd1\x94\xd1\x95\xd1\x96\xd1\x97\xcd\xca\xf1\xdd\xd1\x98\xd1\x99\xd1\x9a\xd1\x9b\xe5\xbd\xd1\x9c\xd1\x9d\xd1\x9e\xf1\xdc\xd1\x9f\xf1\xde\xd1\xa0\xd2\x40\xd2\x41\xd2\x42\xd2\x43\xd2\x44\xd2\x45\xd2\x46\xd2\x47\xd2\x48\xf1\xdf\xd2\x49\xd2\x4a\xcf\xe5\xd2\x4b\xd2\x4c\xd2\x4d\xd2\x4e\xd2\x4f\xd2\x50\xd2\x51\xd2\x52\xd2\x53\xd2\x54\xd2\x55\xd2\x56\xd2\x57\xd2\x58\xd2\x59\xd2\x5a\xd2\x5b\xd2\x5c\xd2\x5d\xd2\x5e\xd2\x5f\xd2\x60\xd2\x61\xd2\x62\xd2\x63\xf4\xc5\xbd\xf3\xd2\x64\xd2\x65\xd2\x66\xd2\x67\xd2\x68\xd2\x69\xf1\xe0\xd2\x6a\xd2\x6b\xd2\x6c\xd2\x6d\xd2\x6e\xd2\x6f\xd2\x70\xd2\x71\xd2\x72\xd2\x73\xd2\x74\xd2\x75\xd2\x76\xd2\x77\xd2\x78\xd2\x79\xd2\x7a\xd2\x7b\xd2\x7c\xd2\x7d\xf1\xe1\xd2\x7e\xd2\x80\xd2\x81\xce\xf7", /* 8980 */ "\xd2\x82\xd2\xaa\xd2\x83\xf1\xfb\xd2\x84\xd2\x85\xb8\xb2\xd2\x86\xd2\x87\xd2\x88\xd2\x89\xd2\x8a\xd2\x8b\xd2\x8c\xd2\x8d\xd2\x8e\xd2\x8f\xd2\x90\xd2\x91\xd2\x92\xd2\x93\xd2\x94\xd2\x95\xd2\x96\xd2\x97\xd2\x98\xd2\x99\xd2\x9a\xd2\x9b\xd2\x9c\xd2\x9d\xd2\x9e\xd2\x9f\xd2\xa0\xd3\x40\xd3\x41\xd3\x42\xd3\x43\xd3\x44\xd3\x45\xd3\x46\xd3\x47\xd3\x48\xd3\x49\xd3\x4a\xd3\x4b\xd3\x4c\xd3\x4d\xd3\x4e\xd3\x4f\xd3\x50\xd3\x51\xd3\x52\xd3\x53\xd3\x54\xd3\x55\xd3\x56\xd3\x57\xd3\x58\xd3\x59\xd3\x5a\xd3\x5b\xd3\x5c\xd3\x5d\xd3\x5e\xbc\xfb\xb9\xdb\xd3\x5f\xb9\xe6\xc3\xd9\xca\xd3\xea\xe8\xc0\xc0\xbe\xf5\xea\xe9\xea\xea\xea\xeb\xd3\x60\xea\xec\xea\xed\xea\xee\xea\xef\xbd\xc7\xd3\x61\xd3\x62\xd3\x63\xf5\xfb\xd3\x64\xd3\x65\xd3\x66\xf5\xfd\xd3\x67\xf5\xfe\xd3\x68\xf5\xfc\xd3\x69\xd3\x6a\xd3\x6b\xd3\x6c\xbd\xe2\xd3\x6d\xf6\xa1\xb4\xa5\xd3\x6e\xd3\x6f\xd3\x70\xd3\x71\xf6\xa2\xd3\x72\xd3\x73\xd3\x74\xf6\xa3\xd3\x75\xd3\x76\xd3\x77\xec\xb2\xd3\x78\xd3\x79\xd3\x7a\xd3\x7b\xd3\x7c\xd3\x7d\xd3\x7e\xd3\x80\xd3\x81\xd3\x82\xd3\x83\xd3\x84", /* 8a00 */ "\xd1\xd4\xd3\x85\xd3\x86\xd3\x87\xd3\x88\xd3\x89\xd3\x8a\xd9\xea\xd3\x8b\xd3\x8c\xd3\x8d\xd3\x8e\xd3\x8f\xd3\x90\xd3\x91\xd3\x92\xd3\x93\xd3\x94\xd3\x95\xd3\x96\xd3\x97\xd3\x98\xd3\x99\xd3\x9a\xd3\x9b\xd3\x9c\xd3\x9d\xd3\x9e\xd3\x9f\xd3\xa0\xd4\x40\xd4\x41\xd4\x42\xd4\x43\xd4\x44\xd4\x45\xd4\x46\xd4\x47\xd4\x48\xd4\x49\xd4\x4a\xd4\x4b\xd4\x4c\xd4\x4d\xd4\x4e\xd4\x4f\xd4\x50\xd4\x51\xd4\x52\xd4\x53\xd4\x54\xd4\x55\xd4\x56\xd4\x57\xd4\x58\xd4\x59\xd4\x5a\xd4\x5b\xd4\x5c\xd4\x5d\xd4\x5e\xd4\x5f\xf6\xa4\xd4\x60\xd4\x61\xd4\x62\xd4\x63\xd4\x64\xd4\x65\xd4\x66\xd4\x67\xd4\x68\xee\xba\xd4\x69\xd4\x6a\xd4\x6b\xd4\x6c\xd4\x6d\xd4\x6e\xd4\x6f\xd4\x70\xd4\x71\xd4\x72\xd4\x73\xd4\x74\xd4\x75\xd4\x76\xd4\x77\xd4\x78\xd4\x79\xd4\x7a\xd4\x7b\xd4\x7c\xd4\x7d\xd4\x7e\xd4\x80\xd4\x81\xd4\x82\xd4\x83\xd4\x84\xd4\x85\xd4\x86\xd4\x87\xd4\x88\xd4\x89\xd4\x8a\xd4\x8b\xd4\x8c\xd4\x8d\xd4\x8e\xd4\x8f\xd4\x90\xd4\x91\xd4\x92\xd4\x93\xd4\x94\xd4\x95\xd4\x96\xd4\x97\xd4\x98\xd4\x99\xd5\xb2\xd4\x9a\xd4\x9b\xd4\x9c\xd4\x9d\xd4\x9e\xd4\x9f", /* 8a80 */ "\xd4\xa0\xd5\x40\xd5\x41\xd5\x42\xd5\x43\xd5\x44\xd5\x45\xd5\x46\xd5\x47\xd3\xfe\xcc\xdc\xd5\x48\xd5\x49\xd5\x4a\xd5\x4b\xd5\x4c\xd5\x4d\xd5\x4e\xd5\x4f\xca\xc4\xd5\x50\xd5\x51\xd5\x52\xd5\x53\xd5\x54\xd5\x55\xd5\x56\xd5\x57\xd5\x58\xd5\x59\xd5\x5a\xd5\x5b\xd5\x5c\xd5\x5d\xd5\x5e\xd5\x5f\xd5\x60\xd5\x61\xd5\x62\xd5\x63\xd5\x64\xd5\x65\xd5\x66\xd5\x67\xd5\x68\xd5\x69\xd5\x6a\xd5\x6b\xd5\x6c\xd5\x6d\xd5\x6e\xd5\x6f\xd5\x70\xd5\x71\xd5\x72\xd5\x73\xd5\x74\xd5\x75\xd5\x76\xd5\x77\xd5\x78\xd5\x79\xd5\x7a\xd5\x7b\xd5\x7c\xd5\x7d\xd5\x7e\xd5\x80\xd5\x81\xd5\x82\xd5\x83\xd5\x84\xd5\x85\xd5\x86\xd5\x87\xd5\x88\xd5\x89\xd5\x8a\xd5\x8b\xd5\x8c\xd5\x8d\xd5\x8e\xd5\x8f\xd5\x90\xd5\x91\xd5\x92\xd5\x93\xd5\x94\xd5\x95\xd5\x96\xd5\x97\xd5\x98\xd5\x99\xd5\x9a\xd5\x9b\xd5\x9c\xd5\x9d\xd5\x9e\xd5\x9f\xd5\xa0\xd6\x40\xd6\x41\xd6\x42\xd6\x43\xd6\x44\xd6\x45\xd6\x46\xd6\x47\xd6\x48\xd6\x49\xd6\x4a\xd6\x4b\xd6\x4c\xd6\x4d\xd6\x4e\xd6\x4f\xd6\x50\xd6\x51\xd6\x52\xd6\x53\xd6\x54\xd6\x55\xd6\x56\xd6\x57\xd6\x58\xd6\x59\xd6\x5a\xd6\x5b", /* 8b00 */ "\xd6\x5c\xd6\x5d\xd6\x5e\xd6\x5f\xd6\x60\xd6\x61\xd6\x62\xe5\xc0\xd6\x63\xd6\x64\xd6\x65\xd6\x66\xd6\x67\xd6\x68\xd6\x69\xd6\x6a\xd6\x6b\xd6\x6c\xd6\x6d\xd6\x6e\xd6\x6f\xd6\x70\xd6\x71\xd6\x72\xd6\x73\xd6\x74\xd6\x75\xd6\x76\xd6\x77\xd6\x78\xd6\x79\xd6\x7a\xd6\x7b\xd6\x7c\xd6\x7d\xd6\x7e\xd6\x80\xd6\x81\xf6\xa5\xd6\x82\xd6\x83\xd6\x84\xd6\x85\xd6\x86\xd6\x87\xd6\x88\xd6\x89\xd6\x8a\xd6\x8b\xd6\x8c\xd6\x8d\xd6\x8e\xd6\x8f\xd6\x90\xd6\x91\xd6\x92\xd6\x93\xd6\x94\xd6\x95\xd6\x96\xd6\x97\xd6\x98\xd6\x99\xd6\x9a\xd6\x9b\xd6\x9c\xd6\x9d\xd6\x9e\xd6\x9f\xd6\xa0\xd7\x40\xd7\x41\xd7\x42\xd7\x43\xd7\x44\xd7\x45\xd7\x46\xd7\x47\xd7\x48\xd7\x49\xd7\x4a\xd7\x4b\xd7\x4c\xd7\x4d\xd7\x4e\xd7\x4f\xd7\x50\xd7\x51\xd7\x52\xd7\x53\xd7\x54\xd7\x55\xd7\x56\xd7\x57\xd7\x58\xd7\x59\xd7\x5a\xd7\x5b\xd7\x5c\xd7\x5d\xd7\x5e\xd7\x5f\xbe\xaf\xd7\x60\xd7\x61\xd7\x62\xd7\x63\xd7\x64\xc6\xa9\xd7\x65\xd7\x66\xd7\x67\xd7\x68\xd7\x69\xd7\x6a\xd7\x6b\xd7\x6c\xd7\x6d\xd7\x6e\xd7\x6f\xd7\x70\xd7\x71\xd7\x72\xd7\x73\xd7\x74\xd7\x75\xd7\x76\xd7\x77", /* 8b80 */ "\xd7\x78\xd7\x79\xd7\x7a\xd7\x7b\xd7\x7c\xd7\x7d\xd7\x7e\xd7\x80\xd7\x81\xd7\x82\xd7\x83\xd7\x84\xd7\x85\xd7\x86\xd7\x87\xd7\x88\xd7\x89\xd7\x8a\xd7\x8b\xd7\x8c\xd7\x8d\xd7\x8e\xd7\x8f\xd7\x90\xd7\x91\xd7\x92\xd7\x93\xd7\x94\xd7\x95\xd7\x96\xd7\x97\xd7\x98\xda\xa5\xbc\xc6\xb6\xa9\xb8\xbc\xc8\xcf\xbc\xa5\xda\xa6\xda\xa7\xcc\xd6\xc8\xc3\xda\xa8\xc6\xfd\xd7\x99\xd1\xb5\xd2\xe9\xd1\xb6\xbc\xc7\xd7\x9a\xbd\xb2\xbb\xe4\xda\xa9\xda\xaa\xd1\xc8\xda\xab\xd0\xed\xb6\xef\xc2\xdb\xd7\x9b\xcb\xcf\xb7\xed\xc9\xe8\xb7\xc3\xbe\xf7\xd6\xa4\xda\xac\xda\xad\xc6\xc0\xd7\xe7\xca\xb6\xd7\x9c\xd5\xa9\xcb\xdf\xd5\xef\xda\xae\xd6\xdf\xb4\xca\xda\xb0\xda\xaf\xd7\x9d\xd2\xeb\xda\xb1\xda\xb2\xda\xb3\xca\xd4\xda\xb4\xca\xab\xda\xb5\xda\xb6\xb3\xcf\xd6\xef\xda\xb7\xbb\xb0\xb5\xae\xda\xb8\xda\xb9\xb9\xee\xd1\xaf\xd2\xe8\xda\xba\xb8\xc3\xcf\xea\xb2\xef\xda\xbb\xda\xbc\xd7\x9e\xbd\xeb\xce\xdc\xd3\xef\xda\xbd\xce\xf3\xda\xbe\xd3\xd5\xbb\xe5\xda\xbf\xcb\xb5\xcb\xd0\xda\xc0\xc7\xeb\xd6\xee\xda\xc1\xc5\xb5\xb6\xc1\xda\xc2\xb7\xcc\xbf\xce\xda\xc3", /* 8c00 */ "\xda\xc4\xcb\xad\xda\xc5\xb5\xf7\xda\xc6\xc1\xc2\xd7\xbb\xda\xc7\xcc\xb8\xd7\x9f\xd2\xea\xc4\xb1\xda\xc8\xb5\xfd\xbb\xd1\xda\xc9\xd0\xb3\xda\xca\xda\xcb\xce\xbd\xda\xcc\xda\xcd\xda\xce\xb2\xf7\xda\xd1\xda\xcf\xd1\xe8\xda\xd0\xc3\xd5\xda\xd2\xd7\xa0\xda\xd3\xda\xd4\xda\xd5\xd0\xbb\xd2\xa5\xb0\xf9\xda\xd6\xc7\xab\xda\xd7\xbd\xf7\xc3\xa1\xda\xd8\xda\xd9\xc3\xfd\xcc\xb7\xda\xda\xda\xdb\xc0\xbe\xc6\xd7\xda\xdc\xda\xdd\xc7\xb4\xda\xde\xda\xdf\xb9\xc8\xd8\x40\xd8\x41\xd8\x42\xd8\x43\xd8\x44\xd8\x45\xd8\x46\xd8\x47\xd8\x48\xbb\xed\xd8\x49\xd8\x4a\xd8\x4b\xd8\x4c\xb6\xb9\xf4\xf8\xd8\x4d\xf4\xf9\xd8\x4e\xd8\x4f\xcd\xe3\xd8\x50\xd8\x51\xd8\x52\xd8\x53\xd8\x54\xd8\x55\xd8\x56\xd8\x57\xf5\xb9\xd8\x58\xd8\x59\xd8\x5a\xd8\x5b\xeb\xe0\xd8\x5c\xd8\x5d\xd8\x5e\xd8\x5f\xd8\x60\xd8\x61\xcf\xf3\xbb\xbf\xd8\x62\xd8\x63\xd8\x64\xd8\x65\xd8\x66\xd8\x67\xd8\x68\xba\xc0\xd4\xa5\xd8\x69\xd8\x6a\xd8\x6b\xd8\x6c\xd8\x6d\xd8\x6e\xd8\x6f\xe1\xd9\xd8\x70\xd8\x71\xd8\x72\xd8\x73\xf5\xf4\xb1\xaa\xb2\xf2\xd8\x74\xd8\x75\xd8\x76\xd8\x77\xd8\x78", /* 8c80 */ "\xd8\x79\xd8\x7a\xf5\xf5\xd8\x7b\xd8\x7c\xf5\xf7\xd8\x7d\xd8\x7e\xd8\x80\xba\xd1\xf5\xf6\xd8\x81\xc3\xb2\xd8\x82\xd8\x83\xd8\x84\xd8\x85\xd8\x86\xd8\x87\xd8\x88\xf5\xf9\xd8\x89\xd8\x8a\xd8\x8b\xf5\xf8\xd8\x8c\xd8\x8d\xd8\x8e\xd8\x8f\xd8\x90\xd8\x91\xd8\x92\xd8\x93\xd8\x94\xd8\x95\xd8\x96\xd8\x97\xd8\x98\xd8\x99\xd8\x9a\xd8\x9b\xd8\x9c\xd8\x9d\xd8\x9e\xd8\x9f\xd8\xa0\xd9\x40\xd9\x41\xd9\x42\xd9\x43\xd9\x44\xd9\x45\xd9\x46\xd9\x47\xd9\x48\xd9\x49\xd9\x4a\xd9\x4b\xd9\x4c\xd9\x4d\xd9\x4e\xd9\x4f\xd9\x50\xd9\x51\xd9\x52\xd9\x53\xd9\x54\xd9\x55\xd9\x56\xd9\x57\xd9\x58\xd9\x59\xd9\x5a\xd9\x5b\xd9\x5c\xd9\x5d\xd9\x5e\xd9\x5f\xd9\x60\xd9\x61\xd9\x62\xd9\x63\xd9\x64\xd9\x65\xd9\x66\xd9\x67\xd9\x68\xd9\x69\xd9\x6a\xd9\x6b\xd9\x6c\xd9\x6d\xd9\x6e\xd9\x6f\xd9\x70\xd9\x71\xd9\x72\xd9\x73\xd9\x74\xd9\x75\xd9\x76\xd9\x77\xd9\x78\xd9\x79\xd9\x7a\xd9\x7b\xd9\x7c\xd9\x7d\xd9\x7e\xd9\x80\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x88\xd9\x89\xd9\x8a\xd9\x8b\xd9\x8c\xd9\x8d\xd9\x8e\xd9\x8f\xd9\x90\xd9\x91\xd9\x92", /* 8d00 */ "\xd9\x93\xd9\x94\xd9\x95\xd9\x96\xd9\x97\xd9\x98\xd9\x99\xd9\x9a\xd9\x9b\xd9\x9c\xd9\x9d\xd9\x9e\xd9\x9f\xd9\xa0\xda\x40\xda\x41\xda\x42\xda\x43\xda\x44\xda\x45\xda\x46\xda\x47\xda\x48\xda\x49\xda\x4a\xda\x4b\xda\x4c\xda\x4d\xda\x4e\xb1\xb4\xd5\xea\xb8\xba\xda\x4f\xb9\xb1\xb2\xc6\xd4\xf0\xcf\xcd\xb0\xdc\xd5\xcb\xbb\xf5\xd6\xca\xb7\xb7\xcc\xb0\xc6\xb6\xb1\xe1\xb9\xba\xd6\xfc\xb9\xe1\xb7\xa1\xbc\xfa\xea\xda\xea\xdb\xcc\xf9\xb9\xf3\xea\xdc\xb4\xfb\xc3\xb3\xb7\xd1\xba\xd8\xea\xdd\xd4\xf4\xea\xde\xbc\xd6\xbb\xdf\xea\xdf\xc1\xde\xc2\xb8\xd4\xdf\xd7\xca\xea\xe0\xea\xe1\xea\xe4\xea\xe2\xea\xe3\xc9\xde\xb8\xb3\xb6\xc4\xea\xe5\xca\xea\xc9\xcd\xb4\xcd\xda\x50\xda\x51\xe2\xd9\xc5\xe2\xea\xe6\xc0\xb5\xda\x52\xd7\xb8\xea\xe7\xd7\xac\xc8\xfc\xd8\xd3\xd8\xcd\xd4\xde\xda\x53\xd4\xf9\xc9\xc4\xd3\xae\xb8\xd3\xb3\xe0\xda\x54\xc9\xe2\xf4\xf6\xda\x55\xda\x56\xda\x57\xba\xd5\xda\x58\xf4\xf7\xda\x59\xda\x5a\xd7\xdf\xda\x5b\xda\x5c\xf4\xf1\xb8\xb0\xd5\xd4\xb8\xcf\xc6\xf0\xda\x5d\xda\x5e\xda\x5f\xda\x60\xda\x61\xda\x62\xda\x63\xda\x64", /* 8d80 */ "\xda\x65\xb3\xc3\xda\x66\xda\x67\xf4\xf2\xb3\xac\xda\x68\xda\x69\xda\x6a\xda\x6b\xd4\xbd\xc7\xf7\xda\x6c\xda\x6d\xda\x6e\xda\x6f\xda\x70\xf4\xf4\xda\x71\xda\x72\xf4\xf3\xda\x73\xda\x74\xda\x75\xda\x76\xda\x77\xda\x78\xda\x79\xda\x7a\xda\x7b\xda\x7c\xcc\xcb\xda\x7d\xda\x7e\xda\x80\xc8\xa4\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87\xda\x88\xda\x89\xda\x8a\xda\x8b\xda\x8c\xda\x8d\xf4\xf5\xda\x8e\xd7\xe3\xc5\xbf\xf5\xc0\xda\x8f\xda\x90\xf5\xbb\xda\x91\xf5\xc3\xda\x92\xf5\xc2\xda\x93\xd6\xba\xf5\xc1\xda\x94\xda\x95\xda\x96\xd4\xbe\xf5\xc4\xda\x97\xf5\xcc\xda\x98\xda\x99\xda\x9a\xda\x9b\xb0\xcf\xb5\xf8\xda\x9c\xf5\xc9\xf5\xca\xda\x9d\xc5\xdc\xda\x9e\xda\x9f\xda\xa0\xdb\x40\xf5\xc5\xf5\xc6\xdb\x41\xdb\x42\xf5\xc7\xf5\xcb\xdb\x43\xbe\xe0\xf5\xc8\xb8\xfa\xdb\x44\xdb\x45\xdb\x46\xf5\xd0\xf5\xd3\xdb\x47\xdb\x48\xdb\x49\xbf\xe7\xdb\x4a\xb9\xf2\xf5\xbc\xf5\xcd\xdb\x4b\xdb\x4c\xc2\xb7\xdb\x4d\xdb\x4e\xdb\x4f\xcc\xf8\xdb\x50\xbc\xf9\xdb\x51\xf5\xce\xf5\xcf\xf5\xd1\xb6\xe5\xf5\xd2\xdb\x52\xf5\xd5\xdb\x53\xdb\x54", /* 8e00 */ "\xdb\x55\xdb\x56\xdb\x57\xdb\x58\xdb\x59\xf5\xbd\xdb\x5a\xdb\x5b\xdb\x5c\xf5\xd4\xd3\xbb\xdb\x5d\xb3\xec\xdb\x5e\xdb\x5f\xcc\xa4\xdb\x60\xdb\x61\xdb\x62\xdb\x63\xf5\xd6\xdb\x64\xdb\x65\xdb\x66\xdb\x67\xdb\x68\xdb\x69\xdb\x6a\xdb\x6b\xf5\xd7\xbe\xe1\xf5\xd8\xdb\x6c\xdb\x6d\xcc\xdf\xf5\xdb\xdb\x6e\xdb\x6f\xdb\x70\xdb\x71\xdb\x72\xb2\xc8\xd7\xd9\xdb\x73\xf5\xd9\xdb\x74\xf5\xda\xf5\xdc\xdb\x75\xf5\xe2\xdb\x76\xdb\x77\xdb\x78\xf5\xe0\xdb\x79\xdb\x7a\xdb\x7b\xf5\xdf\xf5\xdd\xdb\x7c\xdb\x7d\xf5\xe1\xdb\x7e\xdb\x80\xf5\xde\xf5\xe4\xf5\xe5\xdb\x81\xcc\xe3\xdb\x82\xdb\x83\xe5\xbf\xb5\xb8\xf5\xe3\xf5\xe8\xcc\xa3\xdb\x84\xdb\x85\xdb\x86\xdb\x87\xdb\x88\xf5\xe6\xf5\xe7\xdb\x89\xdb\x8a\xdb\x8b\xdb\x8c\xdb\x8d\xdb\x8e\xf5\xbe\xdb\x8f\xdb\x90\xdb\x91\xdb\x92\xdb\x93\xdb\x94\xdb\x95\xdb\x96\xdb\x97\xdb\x98\xdb\x99\xdb\x9a\xb1\xc4\xdb\x9b\xdb\x9c\xf5\xbf\xdb\x9d\xdb\x9e\xb5\xc5\xb2\xe4\xdb\x9f\xf5\xec\xf5\xe9\xdb\xa0\xb6\xd7\xdc\x40\xf5\xed\xdc\x41\xf5\xea\xdc\x42\xdc\x43\xdc\x44\xdc\x45\xdc\x46\xf5\xeb\xdc\x47\xdc\x48\xb4\xda", /* 8e80 */ "\xdc\x49\xd4\xea\xdc\x4a\xdc\x4b\xdc\x4c\xf5\xee\xdc\x4d\xb3\xf9\xdc\x4e\xdc\x4f\xdc\x50\xdc\x51\xdc\x52\xdc\x53\xdc\x54\xf5\xef\xf5\xf1\xdc\x55\xdc\x56\xdc\x57\xf5\xf0\xdc\x58\xdc\x59\xdc\x5a\xdc\x5b\xdc\x5c\xdc\x5d\xdc\x5e\xf5\xf2\xdc\x5f\xf5\xf3\xdc\x60\xdc\x61\xdc\x62\xdc\x63\xdc\x64\xdc\x65\xdc\x66\xdc\x67\xdc\x68\xdc\x69\xdc\x6a\xdc\x6b\xc9\xed\xb9\xaa\xdc\x6c\xdc\x6d\xc7\xfb\xdc\x6e\xdc\x6f\xb6\xe3\xdc\x70\xdc\x71\xdc\x72\xdc\x73\xdc\x74\xdc\x75\xdc\x76\xcc\xc9\xdc\x77\xdc\x78\xdc\x79\xdc\x7a\xdc\x7b\xdc\x7c\xdc\x7d\xdc\x7e\xdc\x80\xdc\x81\xdc\x82\xdc\x83\xdc\x84\xdc\x85\xdc\x86\xdc\x87\xdc\x88\xdc\x89\xdc\x8a\xea\xa6\xdc\x8b\xdc\x8c\xdc\x8d\xdc\x8e\xdc\x8f\xdc\x90\xdc\x91\xdc\x92\xdc\x93\xdc\x94\xdc\x95\xdc\x96\xdc\x97\xdc\x98\xdc\x99\xdc\x9a\xdc\x9b\xdc\x9c\xdc\x9d\xdc\x9e\xdc\x9f\xdc\xa0\xdd\x40\xdd\x41\xdd\x42\xdd\x43\xdd\x44\xdd\x45\xdd\x46\xdd\x47\xdd\x48\xdd\x49\xdd\x4a\xdd\x4b\xdd\x4c\xdd\x4d\xdd\x4e\xdd\x4f\xdd\x50\xdd\x51\xdd\x52\xdd\x53\xdd\x54\xdd\x55\xdd\x56\xdd\x57\xdd\x58\xdd\x59\xdd\x5a", /* 8f00 */ "\xdd\x5b\xdd\x5c\xdd\x5d\xdd\x5e\xdd\x5f\xdd\x60\xdd\x61\xdd\x62\xdd\x63\xdd\x64\xdd\x65\xdd\x66\xdd\x67\xdd\x68\xdd\x69\xdd\x6a\xdd\x6b\xdd\x6c\xdd\x6d\xdd\x6e\xdd\x6f\xdd\x70\xdd\x71\xdd\x72\xdd\x73\xdd\x74\xdd\x75\xdd\x76\xdd\x77\xdd\x78\xdd\x79\xdd\x7a\xdd\x7b\xdd\x7c\xdd\x7d\xdd\x7e\xdd\x80\xdd\x81\xdd\x82\xdd\x83\xdd\x84\xdd\x85\xdd\x86\xdd\x87\xdd\x88\xdd\x89\xdd\x8a\xdd\x8b\xdd\x8c\xdd\x8d\xdd\x8e\xdd\x8f\xdd\x90\xdd\x91\xdd\x92\xdd\x93\xdd\x94\xdd\x95\xdd\x96\xdd\x97\xdd\x98\xdd\x99\xdd\x9a\xdd\x9b\xdd\x9c\xdd\x9d\xdd\x9e\xdd\x9f\xdd\xa0\xde\x40\xde\x41\xde\x42\xde\x43\xde\x44\xde\x45\xde\x46\xde\x47\xde\x48\xde\x49\xde\x4a\xde\x4b\xde\x4c\xde\x4d\xde\x4e\xde\x4f\xde\x50\xde\x51\xde\x52\xde\x53\xde\x54\xde\x55\xde\x56\xde\x57\xde\x58\xde\x59\xde\x5a\xde\x5b\xde\x5c\xde\x5d\xde\x5e\xde\x5f\xde\x60\xb3\xb5\xd4\xfe\xb9\xec\xd0\xf9\xde\x61\xe9\xed\xd7\xaa\xe9\xee\xc2\xd6\xc8\xed\xba\xe4\xe9\xef\xe9\xf0\xe9\xf1\xd6\xe1\xe9\xf2\xe9\xf3\xe9\xf5\xe9\xf4\xe9\xf6\xe9\xf7\xc7\xe1\xe9\xf8\xd4\xd8\xe9\xf9\xbd\xce", /* 8f80 */ "\xde\x62\xe9\xfa\xe9\xfb\xbd\xcf\xe9\xfc\xb8\xa8\xc1\xbe\xe9\xfd\xb1\xb2\xbb\xd4\xb9\xf5\xe9\xfe\xde\x63\xea\xa1\xea\xa2\xea\xa3\xb7\xf8\xbc\xad\xde\x64\xca\xe4\xe0\xce\xd4\xaf\xcf\xbd\xd5\xb7\xea\xa4\xd5\xde\xea\xa5\xd0\xc1\xb9\xbc\xde\x65\xb4\xc7\xb1\xd9\xde\x66\xde\x67\xde\x68\xc0\xb1\xde\x69\xde\x6a\xde\x6b\xde\x6c\xb1\xe6\xb1\xe7\xde\x6d\xb1\xe8\xde\x6e\xde\x6f\xde\x70\xde\x71\xb3\xbd\xc8\xe8\xde\x72\xde\x73\xde\x74\xde\x75\xe5\xc1\xde\x76\xde\x77\xb1\xdf\xde\x78\xde\x79\xde\x7a\xc1\xc9\xb4\xef\xde\x7b\xde\x7c\xc7\xa8\xd3\xd8\xde\x7d\xc6\xf9\xd1\xb8\xde\x7e\xb9\xfd\xc2\xf5\xde\x80\xde\x81\xde\x82\xde\x83\xde\x84\xd3\xad\xde\x85\xd4\xcb\xbd\xfc\xde\x86\xe5\xc2\xb7\xb5\xe5\xc3\xde\x87\xde\x88\xbb\xb9\xd5\xe2\xde\x89\xbd\xf8\xd4\xb6\xce\xa5\xc1\xac\xb3\xd9\xde\x8a\xde\x8b\xcc\xf6\xde\x8c\xe5\xc6\xe5\xc4\xe5\xc8\xde\x8d\xe5\xca\xe5\xc7\xb5\xcf\xc6\xc8\xde\x8e\xb5\xfc\xe5\xc5\xde\x8f\xca\xf6\xde\x90\xde\x91\xe5\xc9\xde\x92\xde\x93\xde\x94\xc3\xd4\xb1\xc5\xbc\xa3\xde\x95\xde\x96\xde\x97\xd7\xb7\xde\x98\xde\x99", /* 9000 */ "\xcd\xcb\xcb\xcd\xca\xca\xcc\xd3\xe5\xcc\xe5\xcb\xc4\xe6\xde\x9a\xde\x9b\xd1\xa1\xd1\xb7\xe5\xcd\xde\x9c\xe5\xd0\xde\x9d\xcd\xb8\xd6\xf0\xe5\xcf\xb5\xdd\xde\x9e\xcd\xbe\xde\x9f\xe5\xd1\xb6\xba\xde\xa0\xdf\x40\xcd\xa8\xb9\xe4\xdf\x41\xca\xc5\xb3\xd1\xcb\xd9\xd4\xec\xe5\xd2\xb7\xea\xdf\x42\xdf\x43\xdf\x44\xe5\xce\xdf\x45\xdf\x46\xdf\x47\xdf\x48\xdf\x49\xdf\x4a\xe5\xd5\xb4\xfe\xe5\xd6\xdf\x4b\xdf\x4c\xdf\x4d\xdf\x4e\xdf\x4f\xe5\xd3\xe5\xd4\xdf\x50\xd2\xdd\xdf\x51\xdf\x52\xc2\xdf\xb1\xc6\xdf\x53\xd3\xe2\xdf\x54\xdf\x55\xb6\xdd\xcb\xec\xdf\x56\xe5\xd7\xdf\x57\xdf\x58\xd3\xf6\xdf\x59\xdf\x5a\xdf\x5b\xdf\x5c\xdf\x5d\xb1\xe9\xdf\x5e\xb6\xf4\xe5\xda\xe5\xd8\xe5\xd9\xb5\xc0\xdf\x5f\xdf\x60\xdf\x61\xd2\xc5\xe5\xdc\xdf\x62\xdf\x63\xe5\xde\xdf\x64\xdf\x65\xdf\x66\xdf\x67\xdf\x68\xdf\x69\xe5\xdd\xc7\xb2\xdf\x6a\xd2\xa3\xdf\x6b\xdf\x6c\xe5\xdb\xdf\x6d\xdf\x6e\xdf\x6f\xdf\x70\xd4\xe2\xd5\xda\xdf\x71\xdf\x72\xdf\x73\xdf\x74\xdf\x75\xe5\xe0\xd7\xf1\xdf\x76\xdf\x77\xdf\x78\xdf\x79\xdf\x7a\xdf\x7b\xdf\x7c\xe5\xe1\xdf\x7d\xb1\xdc", /* 9080 */ "\xd1\xfb\xdf\x7e\xe5\xe2\xe5\xe4\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xe5\xe3\xdf\x84\xdf\x85\xe5\xe5\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xd2\xd8\xdf\x8b\xb5\xcb\xdf\x8c\xe7\xdf\xdf\x8d\xda\xf5\xdf\x8e\xda\xf8\xdf\x8f\xda\xf6\xdf\x90\xda\xf7\xdf\x91\xdf\x92\xdf\x93\xda\xfa\xd0\xcf\xc4\xc7\xdf\x94\xdf\x95\xb0\xee\xdf\x96\xdf\x97\xdf\x98\xd0\xb0\xdf\x99\xda\xf9\xdf\x9a\xd3\xca\xba\xaa\xdb\xa2\xc7\xf1\xdf\x9b\xda\xfc\xda\xfb\xc9\xdb\xda\xfd\xdf\x9c\xdb\xa1\xd7\xde\xda\xfe\xc1\xda\xdf\x9d\xdf\x9e\xdb\xa5\xdf\x9f\xdf\xa0\xd3\xf4\xe0\x40\xe0\x41\xdb\xa7\xdb\xa4\xe0\x42\xdb\xa8\xe0\x43\xe0\x44\xbd\xbc\xe0\x45\xe0\x46\xe0\x47\xc0\xc9\xdb\xa3\xdb\xa6\xd6\xa3\xe0\x48\xdb\xa9\xe0\x49\xe0\x4a\xe0\x4b\xdb\xad\xe0\x4c\xe0\x4d\xe0\x4e\xdb\xae\xdb\xac\xba\xc2\xe0\x4f\xe0\x50\xe0\x51\xbf\xa4\xdb\xab\xe0\x52\xe0\x53\xe0\x54\xdb\xaa\xd4\xc7\xb2\xbf\xe0\x55\xe0\x56\xdb\xaf\xe0\x57\xb9\xf9\xe0\x58\xdb\xb0\xe0\x59\xe0\x5a\xe0\x5b\xe0\x5c\xb3\xbb\xe0\x5d\xe0\x5e\xe0\x5f\xb5\xa6\xe0\x60\xe0\x61\xe0\x62\xe0\x63\xb6\xbc\xdb\xb1\xe0\x64", /* 9100 */ "\xe0\x65\xe0\x66\xb6\xf5\xe0\x67\xdb\xb2\xe0\x68\xe0\x69\xe0\x6a\xe0\x6b\xe0\x6c\xe0\x6d\xe0\x6e\xe0\x6f\xe0\x70\xe0\x71\xe0\x72\xe0\x73\xe0\x74\xe0\x75\xe0\x76\xe0\x77\xe0\x78\xe0\x79\xe0\x7a\xe0\x7b\xb1\xc9\xe0\x7c\xe0\x7d\xe0\x7e\xe0\x80\xdb\xb4\xe0\x81\xe0\x82\xe0\x83\xdb\xb3\xdb\xb5\xe0\x84\xe0\x85\xe0\x86\xe0\x87\xe0\x88\xe0\x89\xe0\x8a\xe0\x8b\xe0\x8c\xe0\x8d\xe0\x8e\xdb\xb7\xe0\x8f\xdb\xb6\xe0\x90\xe0\x91\xe0\x92\xe0\x93\xe0\x94\xe0\x95\xe0\x96\xdb\xb8\xe0\x97\xe0\x98\xe0\x99\xe0\x9a\xe0\x9b\xe0\x9c\xe0\x9d\xe0\x9e\xe0\x9f\xdb\xb9\xe0\xa0\xe1\x40\xdb\xba\xe1\x41\xe1\x42\xd3\xcf\xf4\xfa\xc7\xf5\xd7\xc3\xc5\xe4\xf4\xfc\xf4\xfd\xf4\xfb\xe1\x43\xbe\xc6\xe1\x44\xe1\x45\xe1\x46\xe1\x47\xd0\xef\xe1\x48\xe1\x49\xb7\xd3\xe1\x4a\xe1\x4b\xd4\xcd\xcc\xaa\xe1\x4c\xe1\x4d\xf5\xa2\xf5\xa1\xba\xa8\xf4\xfe\xcb\xd6\xe1\x4e\xe1\x4f\xe1\x50\xf5\xa4\xc0\xd2\xe1\x51\xb3\xea\xe1\x52\xcd\xaa\xf5\xa5\xf5\xa3\xbd\xb4\xf5\xa8\xe1\x53\xf5\xa9\xbd\xcd\xc3\xb8\xbf\xe1\xcb\xe1\xf5\xaa\xe1\x54\xe1\x55\xe1\x56\xf5\xa6\xf5\xa7\xc4\xf0", /* 9180 */ "\xe1\x57\xe1\x58\xe1\x59\xe1\x5a\xe1\x5b\xf5\xac\xe1\x5c\xb4\xbc\xe1\x5d\xd7\xed\xe1\x5e\xb4\xd7\xf5\xab\xf5\xae\xe1\x5f\xe1\x60\xf5\xad\xf5\xaf\xd0\xd1\xe1\x61\xe1\x62\xe1\x63\xe1\x64\xe1\x65\xe1\x66\xe1\x67\xc3\xd1\xc8\xa9\xe1\x68\xe1\x69\xe1\x6a\xe1\x6b\xe1\x6c\xe1\x6d\xf5\xb0\xf5\xb1\xe1\x6e\xe1\x6f\xe1\x70\xe1\x71\xe1\x72\xe1\x73\xf5\xb2\xe1\x74\xe1\x75\xf5\xb3\xf5\xb4\xf5\xb5\xe1\x76\xe1\x77\xe1\x78\xe1\x79\xf5\xb7\xf5\xb6\xe1\x7a\xe1\x7b\xe1\x7c\xe1\x7d\xf5\xb8\xe1\x7e\xe1\x80\xe1\x81\xe1\x82\xe1\x83\xe1\x84\xe1\x85\xe1\x86\xe1\x87\xe1\x88\xe1\x89\xe1\x8a\xb2\xc9\xe1\x8b\xd3\xd4\xca\xcd\xe1\x8c\xc0\xef\xd6\xd8\xd2\xb0\xc1\xbf\xe1\x8d\xbd\xf0\xe1\x8e\xe1\x8f\xe1\x90\xe1\x91\xe1\x92\xe1\x93\xe1\x94\xe1\x95\xe1\x96\xe1\x97\xb8\xaa\xe1\x98\xe1\x99\xe1\x9a\xe1\x9b\xe1\x9c\xe1\x9d\xe1\x9e\xe1\x9f\xe1\xa0\xe2\x40\xe2\x41\xe2\x42\xe2\x43\xe2\x44\xe2\x45\xe2\x46\xe2\x47\xe2\x48\xe2\x49\xe2\x4a\xe2\x4b\xe2\x4c\xe2\x4d\xe2\x4e\xe2\x4f\xe2\x50\xe2\x51\xe2\x52\xe2\x53\xe2\x54\xe2\x55\xe2\x56\xe2\x57\xe2\x58\xe2\x59", /* 9200 */ "\xe2\x5a\xe2\x5b\xe2\x5c\xe2\x5d\xe2\x5e\xe2\x5f\xe2\x60\xe2\x61\xe2\x62\xe2\x63\xe2\x64\xe2\x65\xe2\x66\xe2\x67\xe2\x68\xe2\x69\xe2\x6a\xe2\x6b\xe2\x6c\xe2\x6d\xe2\x6e\xe2\x6f\xe2\x70\xe2\x71\xe2\x72\xe2\x73\xe2\x74\xe2\x75\xe2\x76\xe2\x77\xe2\x78\xe2\x79\xe2\x7a\xe2\x7b\xe2\x7c\xe2\x7d\xe2\x7e\xe2\x80\xe2\x81\xe2\x82\xe2\x83\xe2\x84\xe2\x85\xe2\x86\xe2\x87\xe2\x88\xe2\x89\xe2\x8a\xe2\x8b\xe2\x8c\xe2\x8d\xe2\x8e\xe2\x8f\xe2\x90\xe2\x91\xe2\x92\xe2\x93\xe2\x94\xe2\x95\xe2\x96\xe2\x97\xe2\x98\xe2\x99\xe2\x9a\xe2\x9b\xe2\x9c\xe2\x9d\xe2\x9e\xe2\x9f\xe2\xa0\xe3\x40\xe3\x41\xe3\x42\xe3\x43\xe3\x44\xe3\x45\xe3\x46\xe3\x47\xe3\x48\xe3\x49\xe3\x4a\xe3\x4b\xe3\x4c\xe3\x4d\xe3\x4e\xe3\x4f\xe3\x50\xe3\x51\xe3\x52\xe3\x53\xe3\x54\xe3\x55\xe3\x56\xe3\x57\xe3\x58\xe3\x59\xe3\x5a\xe3\x5b\xe3\x5c\xe3\x5d\xe3\x5e\xe3\x5f\xe3\x60\xe3\x61\xe3\x62\xe3\x63\xe3\x64\xe3\x65\xe3\x66\xe3\x67\xe3\x68\xe3\x69\xe3\x6a\xe3\x6b\xe3\x6c\xe3\x6d\xbc\xf8\xe3\x6e\xe3\x6f\xe3\x70\xe3\x71\xe3\x72\xe3\x73\xe3\x74\xe3\x75\xe3\x76\xe3\x77\xe3\x78", /* 9280 */ "\xe3\x79\xe3\x7a\xe3\x7b\xe3\x7c\xe3\x7d\xe3\x7e\xe3\x80\xe3\x81\xe3\x82\xe3\x83\xe3\x84\xe3\x85\xe3\x86\xe3\x87\xf6\xc6\xe3\x88\xe3\x89\xe3\x8a\xe3\x8b\xe3\x8c\xe3\x8d\xe3\x8e\xe3\x8f\xe3\x90\xe3\x91\xe3\x92\xe3\x93\xe3\x94\xe3\x95\xe3\x96\xe3\x97\xe3\x98\xe3\x99\xe3\x9a\xe3\x9b\xe3\x9c\xe3\x9d\xe3\x9e\xe3\x9f\xe3\xa0\xe4\x40\xe4\x41\xe4\x42\xe4\x43\xe4\x44\xe4\x45\xf6\xc7\xe4\x46\xe4\x47\xe4\x48\xe4\x49\xe4\x4a\xe4\x4b\xe4\x4c\xe4\x4d\xe4\x4e\xe4\x4f\xe4\x50\xe4\x51\xe4\x52\xe4\x53\xe4\x54\xe4\x55\xe4\x56\xe4\x57\xe4\x58\xe4\x59\xe4\x5a\xe4\x5b\xe4\x5c\xe4\x5d\xe4\x5e\xf6\xc8\xe4\x5f\xe4\x60\xe4\x61\xe4\x62\xe4\x63\xe4\x64\xe4\x65\xe4\x66\xe4\x67\xe4\x68\xe4\x69\xe4\x6a\xe4\x6b\xe4\x6c\xe4\x6d\xe4\x6e\xe4\x6f\xe4\x70\xe4\x71\xe4\x72\xe4\x73\xe4\x74\xe4\x75\xe4\x76\xe4\x77\xe4\x78\xe4\x79\xe4\x7a\xe4\x7b\xe4\x7c\xe4\x7d\xe4\x7e\xe4\x80\xe4\x81\xe4\x82\xe4\x83\xe4\x84\xe4\x85\xe4\x86\xe4\x87\xe4\x88\xe4\x89\xe4\x8a\xe4\x8b\xe4\x8c\xe4\x8d\xe4\x8e\xe4\x8f\xe4\x90\xe4\x91\xe4\x92\xe4\x93\xe4\x94\xe4\x95\xe4\x96", /* 9300 */ "\xe4\x97\xe4\x98\xe4\x99\xe4\x9a\xe4\x9b\xe4\x9c\xe4\x9d\xe4\x9e\xe4\x9f\xe4\xa0\xe5\x40\xe5\x41\xe5\x42\xe5\x43\xe5\x44\xe5\x45\xe5\x46\xe5\x47\xe5\x48\xe5\x49\xe5\x4a\xe5\x4b\xe5\x4c\xe5\x4d\xe5\x4e\xe5\x4f\xe5\x50\xe5\x51\xe5\x52\xe5\x53\xe5\x54\xe5\x55\xe5\x56\xe5\x57\xe5\x58\xe5\x59\xe5\x5a\xe5\x5b\xe5\x5c\xe5\x5d\xe5\x5e\xe5\x5f\xe5\x60\xe5\x61\xe5\x62\xe5\x63\xe5\x64\xe5\x65\xe5\x66\xe5\x67\xe5\x68\xe5\x69\xe5\x6a\xe5\x6b\xe5\x6c\xe5\x6d\xe5\x6e\xe5\x6f\xe5\x70\xe5\x71\xe5\x72\xe5\x73\xf6\xc9\xe5\x74\xe5\x75\xe5\x76\xe5\x77\xe5\x78\xe5\x79\xe5\x7a\xe5\x7b\xe5\x7c\xe5\x7d\xe5\x7e\xe5\x80\xe5\x81\xe5\x82\xe5\x83\xe5\x84\xe5\x85\xe5\x86\xe5\x87\xe5\x88\xe5\x89\xe5\x8a\xe5\x8b\xe5\x8c\xe5\x8d\xe5\x8e\xe5\x8f\xe5\x90\xe5\x91\xe5\x92\xe5\x93\xe5\x94\xe5\x95\xe5\x96\xe5\x97\xe5\x98\xe5\x99\xe5\x9a\xe5\x9b\xe5\x9c\xe5\x9d\xe5\x9e\xe5\x9f\xf6\xca\xe5\xa0\xe6\x40\xe6\x41\xe6\x42\xe6\x43\xe6\x44\xe6\x45\xe6\x46\xe6\x47\xe6\x48\xe6\x49\xe6\x4a\xe6\x4b\xe6\x4c\xe6\x4d\xe6\x4e\xe6\x4f\xe6\x50\xe6\x51\xe6\x52\xe6\x53", /* 9380 */ "\xe6\x54\xe6\x55\xe6\x56\xe6\x57\xe6\x58\xe6\x59\xe6\x5a\xe6\x5b\xe6\x5c\xe6\x5d\xe6\x5e\xe6\x5f\xe6\x60\xe6\x61\xe6\x62\xf6\xcc\xe6\x63\xe6\x64\xe6\x65\xe6\x66\xe6\x67\xe6\x68\xe6\x69\xe6\x6a\xe6\x6b\xe6\x6c\xe6\x6d\xe6\x6e\xe6\x6f\xe6\x70\xe6\x71\xe6\x72\xe6\x73\xe6\x74\xe6\x75\xe6\x76\xe6\x77\xe6\x78\xe6\x79\xe6\x7a\xe6\x7b\xe6\x7c\xe6\x7d\xe6\x7e\xe6\x80\xe6\x81\xe6\x82\xe6\x83\xe6\x84\xe6\x85\xe6\x86\xe6\x87\xe6\x88\xe6\x89\xe6\x8a\xe6\x8b\xe6\x8c\xe6\x8d\xe6\x8e\xe6\x8f\xe6\x90\xe6\x91\xe6\x92\xe6\x93\xe6\x94\xe6\x95\xe6\x96\xe6\x97\xe6\x98\xe6\x99\xe6\x9a\xe6\x9b\xe6\x9c\xe6\x9d\xf6\xcb\xe6\x9e\xe6\x9f\xe6\xa0\xe7\x40\xe7\x41\xe7\x42\xe7\x43\xe7\x44\xe7\x45\xe7\x46\xe7\x47\xf7\xe9\xe7\x48\xe7\x49\xe7\x4a\xe7\x4b\xe7\x4c\xe7\x4d\xe7\x4e\xe7\x4f\xe7\x50\xe7\x51\xe7\x52\xe7\x53\xe7\x54\xe7\x55\xe7\x56\xe7\x57\xe7\x58\xe7\x59\xe7\x5a\xe7\x5b\xe7\x5c\xe7\x5d\xe7\x5e\xe7\x5f\xe7\x60\xe7\x61\xe7\x62\xe7\x63\xe7\x64\xe7\x65\xe7\x66\xe7\x67\xe7\x68\xe7\x69\xe7\x6a\xe7\x6b\xe7\x6c\xe7\x6d\xe7\x6e\xe7\x6f\xe7\x70", /* 9400 */ "\xe7\x71\xe7\x72\xe7\x73\xe7\x74\xe7\x75\xe7\x76\xe7\x77\xe7\x78\xe7\x79\xe7\x7a\xe7\x7b\xe7\x7c\xe7\x7d\xe7\x7e\xe7\x80\xe7\x81\xe7\x82\xe7\x83\xe7\x84\xe7\x85\xe7\x86\xe7\x87\xe7\x88\xe7\x89\xe7\x8a\xe7\x8b\xe7\x8c\xe7\x8d\xe7\x8e\xe7\x8f\xe7\x90\xe7\x91\xe7\x92\xe7\x93\xe7\x94\xe7\x95\xe7\x96\xe7\x97\xe7\x98\xe7\x99\xe7\x9a\xe7\x9b\xe7\x9c\xe7\x9d\xe7\x9e\xe7\x9f\xe7\xa0\xe8\x40\xe8\x41\xe8\x42\xe8\x43\xe8\x44\xe8\x45\xe8\x46\xe8\x47\xe8\x48\xe8\x49\xe8\x4a\xe8\x4b\xe8\x4c\xe8\x4d\xe8\x4e\xf6\xcd\xe8\x4f\xe8\x50\xe8\x51\xe8\x52\xe8\x53\xe8\x54\xe8\x55\xe8\x56\xe8\x57\xe8\x58\xe8\x59\xe8\x5a\xe8\x5b\xe8\x5c\xe8\x5d\xe8\x5e\xe8\x5f\xe8\x60\xe8\x61\xe8\x62\xe8\x63\xe8\x64\xe8\x65\xe8\x66\xe8\x67\xe8\x68\xe8\x69\xe8\x6a\xe8\x6b\xe8\x6c\xe8\x6d\xe8\x6e\xe8\x6f\xe8\x70\xe8\x71\xe8\x72\xe8\x73\xe8\x74\xe8\x75\xe8\x76\xe8\x77\xe8\x78\xe8\x79\xe8\x7a\xf6\xce\xe8\x7b\xe8\x7c\xe8\x7d\xe8\x7e\xe8\x80\xe8\x81\xe8\x82\xe8\x83\xe8\x84\xe8\x85\xe8\x86\xe8\x87\xe8\x88\xe8\x89\xe8\x8a\xe8\x8b\xe8\x8c\xe8\x8d\xe8\x8e\xe8\x8f", /* 9480 */ "\xe8\x90\xe8\x91\xe8\x92\xe8\x93\xe8\x94\xee\xc4\xee\xc5\xee\xc6\xd5\xeb\xb6\xa4\xee\xc8\xee\xc7\xee\xc9\xee\xca\xc7\xa5\xee\xcb\xee\xcc\xe8\x95\xb7\xb0\xb5\xf6\xee\xcd\xee\xcf\xe8\x96\xee\xce\xe8\x97\xb8\xc6\xee\xd0\xee\xd1\xee\xd2\xb6\xdb\xb3\xae\xd6\xd3\xc4\xc6\xb1\xb5\xb8\xd6\xee\xd3\xee\xd4\xd4\xbf\xc7\xd5\xbe\xfb\xce\xd9\xb9\xb3\xee\xd6\xee\xd5\xee\xd8\xee\xd7\xc5\xa5\xee\xd9\xee\xda\xc7\xae\xee\xdb\xc7\xaf\xee\xdc\xb2\xa7\xee\xdd\xee\xde\xee\xdf\xee\xe0\xee\xe1\xd7\xea\xee\xe2\xee\xe3\xbc\xd8\xee\xe4\xd3\xcb\xcc\xfa\xb2\xac\xc1\xe5\xee\xe5\xc7\xa6\xc3\xad\xe8\x98\xee\xe6\xee\xe7\xee\xe8\xee\xe9\xee\xea\xee\xeb\xee\xec\xe8\x99\xee\xed\xee\xee\xee\xef\xe8\x9a\xe8\x9b\xee\xf0\xee\xf1\xee\xf2\xee\xf4\xee\xf3\xe8\x9c\xee\xf5\xcd\xad\xc2\xc1\xee\xf6\xee\xf7\xee\xf8\xd5\xa1\xee\xf9\xcf\xb3\xee\xfa\xee\xfb\xe8\x9d\xee\xfc\xee\xfd\xef\xa1\xee\xfe\xef\xa2\xb8\xf5\xc3\xfa\xef\xa3\xef\xa4\xbd\xc2\xd2\xbf\xb2\xf9\xef\xa5\xef\xa6\xef\xa7\xd2\xf8\xef\xa8\xd6\xfd\xef\xa9\xc6\xcc\xe8\x9e\xef\xaa\xef\xab\xc1\xb4\xef\xac", /* 9500 */ "\xcf\xfa\xcb\xf8\xef\xae\xef\xad\xb3\xfa\xb9\xf8\xef\xaf\xef\xb0\xd0\xe2\xef\xb1\xef\xb2\xb7\xe6\xd0\xbf\xef\xb3\xef\xb4\xef\xb5\xc8\xf1\xcc\xe0\xef\xb6\xef\xb7\xef\xb8\xef\xb9\xef\xba\xd5\xe0\xef\xbb\xb4\xed\xc3\xaa\xef\xbc\xe8\x9f\xef\xbd\xef\xbe\xef\xbf\xe8\xa0\xce\xfd\xef\xc0\xc2\xe0\xb4\xb8\xd7\xb6\xbd\xf5\xe9\x40\xcf\xc7\xef\xc3\xef\xc1\xef\xc2\xef\xc4\xb6\xa7\xbc\xfc\xbe\xe2\xc3\xcc\xef\xc5\xef\xc6\xe9\x41\xef\xc7\xef\xcf\xef\xc8\xef\xc9\xef\xca\xc7\xc2\xef\xf1\xb6\xcd\xef\xcb\xe9\x42\xef\xcc\xef\xcd\xb6\xc6\xc3\xbe\xef\xce\xe9\x43\xef\xd0\xef\xd1\xef\xd2\xd5\xf2\xe9\x44\xef\xd3\xc4\xf7\xe9\x45\xef\xd4\xc4\xf8\xef\xd5\xef\xd6\xb8\xe4\xb0\xf7\xef\xd7\xef\xd8\xef\xd9\xe9\x46\xef\xda\xef\xdb\xef\xdc\xef\xdd\xe9\x47\xef\xde\xbe\xb5\xef\xe1\xef\xdf\xef\xe0\xe9\x48\xef\xe2\xef\xe3\xc1\xcd\xef\xe4\xef\xe5\xef\xe6\xef\xe7\xef\xe8\xef\xe9\xef\xea\xef\xeb\xef\xec\xc0\xd8\xe9\x49\xef\xed\xc1\xad\xef\xee\xef\xef\xef\xf0\xe9\x4a\xe9\x4b\xcf\xe2\xe9\x4c\xe9\x4d\xe9\x4e\xe9\x4f\xe9\x50\xe9\x51\xe9\x52\xe9\x53\xb3\xa4", /* 9580 */ "\xe9\x54\xe9\x55\xe9\x56\xe9\x57\xe9\x58\xe9\x59\xe9\x5a\xe9\x5b\xe9\x5c\xe9\x5d\xe9\x5e\xe9\x5f\xe9\x60\xe9\x61\xe9\x62\xe9\x63\xe9\x64\xe9\x65\xe9\x66\xe9\x67\xe9\x68\xe9\x69\xe9\x6a\xe9\x6b\xe9\x6c\xe9\x6d\xe9\x6e\xe9\x6f\xe9\x70\xe9\x71\xe9\x72\xe9\x73\xe9\x74\xe9\x75\xe9\x76\xe9\x77\xe9\x78\xe9\x79\xe9\x7a\xe9\x7b\xe9\x7c\xe9\x7d\xe9\x7e\xe9\x80\xe9\x81\xe9\x82\xe9\x83\xe9\x84\xe9\x85\xe9\x86\xe9\x87\xe9\x88\xe9\x89\xe9\x8a\xe9\x8b\xe9\x8c\xe9\x8d\xe9\x8e\xe9\x8f\xe9\x90\xe9\x91\xe9\x92\xe9\x93\xe9\x94\xe9\x95\xe9\x96\xe9\x97\xe9\x98\xe9\x99\xe9\x9a\xe9\x9b\xe9\x9c\xe9\x9d\xe9\x9e\xe9\x9f\xe9\xa0\xea\x40\xea\x41\xea\x42\xea\x43\xea\x44\xea\x45\xea\x46\xea\x47\xea\x48\xea\x49\xea\x4a\xea\x4b\xea\x4c\xea\x4d\xea\x4e\xea\x4f\xea\x50\xea\x51\xea\x52\xea\x53\xea\x54\xea\x55\xea\x56\xea\x57\xea\x58\xea\x59\xea\x5a\xea\x5b\xc3\xc5\xe3\xc5\xc9\xc1\xe3\xc6\xea\x5c\xb1\xd5\xce\xca\xb4\xb3\xc8\xf2\xe3\xc7\xcf\xd0\xe3\xc8\xbc\xe4\xe3\xc9\xe3\xca\xc3\xc6\xd5\xa2\xc4\xd6\xb9\xeb\xce\xc5\xe3\xcb\xc3\xf6\xe3\xcc\xea\x5d", /* 9600 */ "\xb7\xa7\xb8\xf3\xba\xd2\xe3\xcd\xe3\xce\xd4\xc4\xe3\xcf\xea\x5e\xe3\xd0\xd1\xcb\xe3\xd1\xe3\xd2\xe3\xd3\xe3\xd4\xd1\xd6\xe3\xd5\xb2\xfb\xc0\xbb\xe3\xd6\xea\x5f\xc0\xab\xe3\xd7\xe3\xd8\xe3\xd9\xea\x60\xe3\xda\xe3\xdb\xea\x61\xb8\xb7\xda\xe2\xea\x62\xb6\xd3\xea\x63\xda\xe4\xda\xe3\xea\x64\xea\x65\xea\x66\xea\x67\xea\x68\xea\x69\xea\x6a\xda\xe6\xea\x6b\xea\x6c\xea\x6d\xc8\xee\xea\x6e\xea\x6f\xda\xe5\xb7\xc0\xd1\xf4\xd2\xf5\xd5\xf3\xbd\xd7\xea\x70\xea\x71\xea\x72\xea\x73\xd7\xe8\xda\xe8\xda\xe7\xea\x74\xb0\xa2\xcd\xd3\xea\x75\xda\xe9\xea\x76\xb8\xbd\xbc\xca\xc2\xbd\xc2\xa4\xb3\xc2\xda\xea\xea\x77\xc2\xaa\xc4\xb0\xbd\xb5\xea\x78\xea\x79\xcf\xde\xea\x7a\xea\x7b\xea\x7c\xda\xeb\xc9\xc2\xea\x7d\xea\x7e\xea\x80\xea\x81\xea\x82\xb1\xdd\xea\x83\xea\x84\xea\x85\xda\xec\xea\x86\xb6\xb8\xd4\xba\xea\x87\xb3\xfd\xea\x88\xea\x89\xda\xed\xd4\xc9\xcf\xd5\xc5\xe3\xea\x8a\xda\xee\xea\x8b\xea\x8c\xea\x8d\xea\x8e\xea\x8f\xda\xef\xea\x90\xda\xf0\xc1\xea\xcc\xd5\xcf\xdd\xea\x91\xea\x92\xea\x93\xea\x94\xea\x95\xea\x96\xea\x97\xea\x98", /* 9680 */ "\xea\x99\xea\x9a\xea\x9b\xea\x9c\xea\x9d\xd3\xe7\xc2\xa1\xea\x9e\xda\xf1\xea\x9f\xea\xa0\xcb\xe5\xeb\x40\xda\xf2\xeb\x41\xcb\xe6\xd2\xfe\xeb\x42\xeb\x43\xeb\x44\xb8\xf4\xeb\x45\xeb\x46\xda\xf3\xb0\xaf\xcf\xb6\xeb\x47\xeb\x48\xd5\xcf\xeb\x49\xeb\x4a\xeb\x4b\xeb\x4c\xeb\x4d\xeb\x4e\xeb\x4f\xeb\x50\xeb\x51\xeb\x52\xcb\xed\xeb\x53\xeb\x54\xeb\x55\xeb\x56\xeb\x57\xeb\x58\xeb\x59\xeb\x5a\xda\xf4\xeb\x5b\xeb\x5c\xe3\xc4\xeb\x5d\xeb\x5e\xc1\xa5\xeb\x5f\xeb\x60\xf6\xbf\xeb\x61\xeb\x62\xf6\xc0\xf6\xc1\xc4\xd1\xeb\x63\xc8\xb8\xd1\xe3\xeb\x64\xeb\x65\xd0\xdb\xd1\xc5\xbc\xaf\xb9\xcd\xeb\x66\xef\xf4\xeb\x67\xeb\x68\xb4\xc6\xd3\xba\xf6\xc2\xb3\xfb\xeb\x69\xeb\x6a\xf6\xc3\xeb\x6b\xeb\x6c\xb5\xf1\xeb\x6d\xeb\x6e\xeb\x6f\xeb\x70\xeb\x71\xeb\x72\xeb\x73\xeb\x74\xeb\x75\xeb\x76\xf6\xc5\xeb\x77\xeb\x78\xeb\x79\xeb\x7a\xeb\x7b\xeb\x7c\xeb\x7d\xd3\xea\xf6\xa7\xd1\xa9\xeb\x7e\xeb\x80\xeb\x81\xeb\x82\xf6\xa9\xeb\x83\xeb\x84\xeb\x85\xf6\xa8\xeb\x86\xeb\x87\xc1\xe3\xc0\xd7\xeb\x88\xb1\xa2\xeb\x89\xeb\x8a\xeb\x8b\xeb\x8c\xce\xed\xeb\x8d", /* 9700 */ "\xd0\xe8\xf6\xab\xeb\x8e\xeb\x8f\xcf\xf6\xeb\x90\xf6\xaa\xd5\xf0\xf6\xac\xc3\xb9\xeb\x91\xeb\x92\xeb\x93\xbb\xf4\xf6\xae\xf6\xad\xeb\x94\xeb\x95\xeb\x96\xc4\xde\xeb\x97\xeb\x98\xc1\xd8\xeb\x99\xeb\x9a\xeb\x9b\xeb\x9c\xeb\x9d\xcb\xaa\xeb\x9e\xcf\xbc\xeb\x9f\xeb\xa0\xec\x40\xec\x41\xec\x42\xec\x43\xec\x44\xec\x45\xec\x46\xec\x47\xec\x48\xf6\xaf\xec\x49\xec\x4a\xf6\xb0\xec\x4b\xec\x4c\xf6\xb1\xec\x4d\xc2\xb6\xec\x4e\xec\x4f\xec\x50\xec\x51\xec\x52\xb0\xd4\xc5\xf9\xec\x53\xec\x54\xec\x55\xec\x56\xf6\xb2\xec\x57\xec\x58\xec\x59\xec\x5a\xec\x5b\xec\x5c\xec\x5d\xec\x5e\xec\x5f\xec\x60\xec\x61\xec\x62\xec\x63\xec\x64\xec\x65\xec\x66\xec\x67\xec\x68\xec\x69\xc7\xe0\xf6\xa6\xec\x6a\xec\x6b\xbe\xb8\xec\x6c\xec\x6d\xbe\xb2\xec\x6e\xb5\xe5\xec\x6f\xec\x70\xb7\xc7\xec\x71\xbf\xbf\xc3\xd2\xc3\xe6\xec\x72\xec\x73\xd8\xcc\xec\x74\xec\x75\xec\x76\xb8\xef\xec\x77\xec\x78\xec\x79\xec\x7a\xec\x7b\xec\x7c\xec\x7d\xec\x7e\xec\x80\xbd\xf9\xd1\xa5\xec\x81\xb0\xd0\xec\x82\xec\x83\xec\x84\xec\x85\xec\x86\xf7\xb0\xec\x87\xec\x88\xec\x89", /* 9780 */ "\xec\x8a\xec\x8b\xec\x8c\xec\x8d\xec\x8e\xf7\xb1\xec\x8f\xec\x90\xec\x91\xec\x92\xec\x93\xd0\xac\xec\x94\xb0\xb0\xec\x95\xec\x96\xec\x97\xf7\xb2\xf7\xb3\xec\x98\xf7\xb4\xec\x99\xec\x9a\xec\x9b\xc7\xca\xec\x9c\xec\x9d\xec\x9e\xec\x9f\xec\xa0\xed\x40\xed\x41\xbe\xcf\xed\x42\xed\x43\xf7\xb7\xed\x44\xed\x45\xed\x46\xed\x47\xed\x48\xed\x49\xed\x4a\xf7\xb6\xed\x4b\xb1\xde\xed\x4c\xf7\xb5\xed\x4d\xed\x4e\xf7\xb8\xed\x4f\xf7\xb9\xed\x50\xed\x51\xed\x52\xed\x53\xed\x54\xed\x55\xed\x56\xed\x57\xed\x58\xed\x59\xed\x5a\xed\x5b\xed\x5c\xed\x5d\xed\x5e\xed\x5f\xed\x60\xed\x61\xed\x62\xed\x63\xed\x64\xed\x65\xed\x66\xed\x67\xed\x68\xed\x69\xed\x6a\xed\x6b\xed\x6c\xed\x6d\xed\x6e\xed\x6f\xed\x70\xed\x71\xed\x72\xed\x73\xed\x74\xed\x75\xed\x76\xed\x77\xed\x78\xed\x79\xed\x7a\xed\x7b\xed\x7c\xed\x7d\xed\x7e\xed\x80\xed\x81\xce\xa4\xc8\xcd\xed\x82\xba\xab\xe8\xb8\xe8\xb9\xe8\xba\xbe\xc2\xed\x83\xed\x84\xed\x85\xed\x86\xed\x87\xd2\xf4\xed\x88\xd4\xcf\xc9\xd8\xed\x89\xed\x8a\xed\x8b\xed\x8c\xed\x8d\xed\x8e\xed\x8f\xed\x90\xed\x91", /* 9800 */ "\xed\x92\xed\x93\xed\x94\xed\x95\xed\x96\xed\x97\xed\x98\xed\x99\xed\x9a\xed\x9b\xed\x9c\xed\x9d\xed\x9e\xed\x9f\xed\xa0\xee\x40\xee\x41\xee\x42\xee\x43\xee\x44\xee\x45\xee\x46\xee\x47\xee\x48\xee\x49\xee\x4a\xee\x4b\xee\x4c\xee\x4d\xee\x4e\xee\x4f\xee\x50\xee\x51\xee\x52\xee\x53\xee\x54\xee\x55\xee\x56\xee\x57\xee\x58\xee\x59\xee\x5a\xee\x5b\xee\x5c\xee\x5d\xee\x5e\xee\x5f\xee\x60\xee\x61\xee\x62\xee\x63\xee\x64\xee\x65\xee\x66\xee\x67\xee\x68\xee\x69\xee\x6a\xee\x6b\xee\x6c\xee\x6d\xee\x6e\xee\x6f\xee\x70\xee\x71\xee\x72\xee\x73\xee\x74\xee\x75\xee\x76\xee\x77\xee\x78\xee\x79\xee\x7a\xee\x7b\xee\x7c\xee\x7d\xee\x7e\xee\x80\xee\x81\xee\x82\xee\x83\xee\x84\xee\x85\xee\x86\xee\x87\xee\x88\xee\x89\xee\x8a\xee\x8b\xee\x8c\xee\x8d\xee\x8e\xee\x8f\xee\x90\xee\x91\xee\x92\xee\x93\xee\x94\xee\x95\xee\x96\xee\x97\xee\x98\xee\x99\xee\x9a\xee\x9b\xee\x9c\xee\x9d\xee\x9e\xee\x9f\xee\xa0\xef\x40\xef\x41\xef\x42\xef\x43\xef\x44\xef\x45\xd2\xb3\xb6\xa5\xc7\xea\xf1\xfc\xcf\xee\xcb\xb3\xd0\xeb\xe7\xef\xcd\xe7\xb9\xcb\xb6\xd9", /* 9880 */ "\xf1\xfd\xb0\xe4\xcb\xcc\xf1\xfe\xd4\xa4\xc2\xad\xc1\xec\xc6\xc4\xbe\xb1\xf2\xa1\xbc\xd5\xef\x46\xf2\xa2\xf2\xa3\xef\x47\xf2\xa4\xd2\xc3\xc6\xb5\xef\x48\xcd\xc7\xf2\xa5\xef\x49\xd3\xb1\xbf\xc5\xcc\xe2\xef\x4a\xf2\xa6\xf2\xa7\xd1\xd5\xb6\xee\xf2\xa8\xf2\xa9\xb5\xdf\xf2\xaa\xf2\xab\xef\x4b\xb2\xfc\xf2\xac\xf2\xad\xc8\xa7\xef\x4c\xef\x4d\xef\x4e\xef\x4f\xef\x50\xef\x51\xef\x52\xef\x53\xef\x54\xef\x55\xef\x56\xef\x57\xef\x58\xef\x59\xef\x5a\xef\x5b\xef\x5c\xef\x5d\xef\x5e\xef\x5f\xef\x60\xef\x61\xef\x62\xef\x63\xef\x64\xef\x65\xef\x66\xef\x67\xef\x68\xef\x69\xef\x6a\xef\x6b\xef\x6c\xef\x6d\xef\x6e\xef\x6f\xef\x70\xef\x71\xb7\xe7\xef\x72\xef\x73\xec\xa9\xec\xaa\xec\xab\xef\x74\xec\xac\xef\x75\xef\x76\xc6\xae\xec\xad\xec\xae\xef\x77\xef\x78\xef\x79\xb7\xc9\xca\xb3\xef\x7a\xef\x7b\xef\x7c\xef\x7d\xef\x7e\xef\x80\xef\x81\xe2\xb8\xf7\xcf\xef\x82\xef\x83\xef\x84\xef\x85\xef\x86\xef\x87\xef\x88\xef\x89\xef\x8a\xef\x8b\xef\x8c\xef\x8d\xef\x8e\xef\x8f\xef\x90\xef\x91\xef\x92\xef\x93\xef\x94\xef\x95\xef\x96\xef\x97\xef\x98", /* 9900 */ "\xef\x99\xef\x9a\xef\x9b\xef\x9c\xef\x9d\xef\x9e\xef\x9f\xef\xa0\xf0\x40\xf0\x41\xf0\x42\xf0\x43\xf0\x44\xf7\xd0\xf0\x45\xf0\x46\xb2\xcd\xf0\x47\xf0\x48\xf0\x49\xf0\x4a\xf0\x4b\xf0\x4c\xf0\x4d\xf0\x4e\xf0\x4f\xf0\x50\xf0\x51\xf0\x52\xf0\x53\xf0\x54\xf0\x55\xf0\x56\xf0\x57\xf0\x58\xf0\x59\xf0\x5a\xf0\x5b\xf0\x5c\xf0\x5d\xf0\x5e\xf0\x5f\xf0\x60\xf0\x61\xf0\x62\xf0\x63\xf7\xd1\xf0\x64\xf0\x65\xf0\x66\xf0\x67\xf0\x68\xf0\x69\xf0\x6a\xf0\x6b\xf0\x6c\xf0\x6d\xf0\x6e\xf0\x6f\xf0\x70\xf0\x71\xf0\x72\xf0\x73\xf0\x74\xf0\x75\xf0\x76\xf0\x77\xf0\x78\xf0\x79\xf0\x7a\xf0\x7b\xf0\x7c\xf0\x7d\xf0\x7e\xf0\x80\xf0\x81\xf0\x82\xf0\x83\xf0\x84\xf0\x85\xf0\x86\xf0\x87\xf0\x88\xf0\x89\xf7\xd3\xf7\xd2\xf0\x8a\xf0\x8b\xf0\x8c\xf0\x8d\xf0\x8e\xf0\x8f\xf0\x90\xf0\x91\xf0\x92\xf0\x93\xf0\x94\xf0\x95\xf0\x96\xe2\xbb\xf0\x97\xbc\xa2\xf0\x98\xe2\xbc\xe2\xbd\xe2\xbe\xe2\xbf\xe2\xc0\xe2\xc1\xb7\xb9\xd2\xfb\xbd\xa4\xca\xce\xb1\xa5\xcb\xc7\xf0\x99\xe2\xc2\xb6\xfc\xc8\xc4\xe2\xc3\xf0\x9a\xf0\x9b\xbd\xc8\xf0\x9c\xb1\xfd\xe2\xc4\xf0\x9d\xb6\xf6", /* 9980 */ "\xe2\xc5\xc4\xd9\xf0\x9e\xf0\x9f\xe2\xc6\xcf\xda\xb9\xdd\xe2\xc7\xc0\xa1\xf0\xa0\xe2\xc8\xb2\xf6\xf1\x40\xe2\xc9\xf1\x41\xc1\xf3\xe2\xca\xe2\xcb\xc2\xf8\xe2\xcc\xe2\xcd\xe2\xce\xca\xd7\xd8\xb8\xd9\xe5\xcf\xe3\xf1\x42\xf1\x43\xf1\x44\xf1\x45\xf1\x46\xf1\x47\xf1\x48\xf1\x49\xf1\x4a\xf1\x4b\xf1\x4c\xf0\xa5\xf1\x4d\xf1\x4e\xdc\xb0\xf1\x4f\xf1\x50\xf1\x51\xf1\x52\xf1\x53\xf1\x54\xf1\x55\xf1\x56\xf1\x57\xf1\x58\xf1\x59\xf1\x5a\xf1\x5b\xf1\x5c\xf1\x5d\xf1\x5e\xf1\x5f\xf1\x60\xf1\x61\xf1\x62\xf1\x63\xf1\x64\xf1\x65\xf1\x66\xf1\x67\xf1\x68\xf1\x69\xf1\x6a\xf1\x6b\xf1\x6c\xf1\x6d\xf1\x6e\xf1\x6f\xf1\x70\xf1\x71\xf1\x72\xf1\x73\xf1\x74\xf1\x75\xf1\x76\xf1\x77\xf1\x78\xf1\x79\xf1\x7a\xf1\x7b\xf1\x7c\xf1\x7d\xf1\x7e\xf1\x80\xf1\x81\xf1\x82\xf1\x83\xf1\x84\xf1\x85\xf1\x86\xf1\x87\xf1\x88\xf1\x89\xf1\x8a\xf1\x8b\xf1\x8c\xf1\x8d\xf1\x8e\xf1\x8f\xf1\x90\xf1\x91\xf1\x92\xf1\x93\xf1\x94\xf1\x95\xf1\x96\xf1\x97\xf1\x98\xf1\x99\xf1\x9a\xf1\x9b\xf1\x9c\xf1\x9d\xf1\x9e\xf1\x9f\xf1\xa0\xf2\x40\xf2\x41\xf2\x42\xf2\x43\xf2\x44\xf2\x45", /* 9a00 */ "\xf2\x46\xf2\x47\xf2\x48\xf2\x49\xf2\x4a\xf2\x4b\xf2\x4c\xf2\x4d\xf2\x4e\xf2\x4f\xf2\x50\xf2\x51\xf2\x52\xf2\x53\xf2\x54\xf2\x55\xf2\x56\xf2\x57\xf2\x58\xf2\x59\xf2\x5a\xf2\x5b\xf2\x5c\xf2\x5d\xf2\x5e\xf2\x5f\xf2\x60\xf2\x61\xf2\x62\xf2\x63\xf2\x64\xf2\x65\xf2\x66\xf2\x67\xf2\x68\xf2\x69\xf2\x6a\xf2\x6b\xf2\x6c\xf2\x6d\xf2\x6e\xf2\x6f\xf2\x70\xf2\x71\xf2\x72\xf2\x73\xf2\x74\xf2\x75\xf2\x76\xf2\x77\xf2\x78\xf2\x79\xf2\x7a\xf2\x7b\xf2\x7c\xf2\x7d\xf2\x7e\xf2\x80\xf2\x81\xf2\x82\xf2\x83\xf2\x84\xf2\x85\xf2\x86\xf2\x87\xf2\x88\xf2\x89\xf2\x8a\xf2\x8b\xf2\x8c\xf2\x8d\xf2\x8e\xf2\x8f\xf2\x90\xf2\x91\xf2\x92\xf2\x93\xf2\x94\xf2\x95\xf2\x96\xf2\x97\xf2\x98\xf2\x99\xf2\x9a\xf2\x9b\xf2\x9c\xf2\x9d\xf2\x9e\xf2\x9f\xf2\xa0\xf3\x40\xf3\x41\xf3\x42\xf3\x43\xf3\x44\xf3\x45\xf3\x46\xf3\x47\xf3\x48\xf3\x49\xf3\x4a\xf3\x4b\xf3\x4c\xf3\x4d\xf3\x4e\xf3\x4f\xf3\x50\xf3\x51\xc2\xed\xd4\xa6\xcd\xd4\xd1\xb1\xb3\xdb\xc7\xfd\xf3\x52\xb2\xb5\xc2\xbf\xe6\xe0\xca\xbb\xe6\xe1\xe6\xe2\xbe\xd4\xe6\xe3\xd7\xa4\xcd\xd5\xe6\xe5\xbc\xdd\xe6\xe4", /* 9a80 */ "\xe6\xe6\xe6\xe7\xc2\xee\xf3\x53\xbd\xbe\xe6\xe8\xc2\xe6\xba\xa7\xe6\xe9\xf3\x54\xe6\xea\xb3\xd2\xd1\xe9\xf3\x55\xf3\x56\xbf\xa5\xe6\xeb\xc6\xef\xe6\xec\xe6\xed\xf3\x57\xf3\x58\xe6\xee\xc6\xad\xe6\xef\xf3\x59\xc9\xa7\xe6\xf0\xe6\xf1\xe6\xf2\xe5\xb9\xe6\xf3\xe6\xf4\xc2\xe2\xe6\xf5\xe6\xf6\xd6\xe8\xe6\xf7\xf3\x5a\xe6\xf8\xb9\xc7\xf3\x5b\xf3\x5c\xf3\x5d\xf3\x5e\xf3\x5f\xf3\x60\xf3\x61\xf7\xbb\xf7\xba\xf3\x62\xf3\x63\xf3\x64\xf3\x65\xf7\xbe\xf7\xbc\xba\xa1\xf3\x66\xf7\xbf\xf3\x67\xf7\xc0\xf3\x68\xf3\x69\xf3\x6a\xf7\xc2\xf7\xc1\xf7\xc4\xf3\x6b\xf3\x6c\xf7\xc3\xf3\x6d\xf3\x6e\xf3\x6f\xf3\x70\xf3\x71\xf7\xc5\xf7\xc6\xf3\x72\xf3\x73\xf3\x74\xf3\x75\xf7\xc7\xf3\x76\xcb\xe8\xf3\x77\xf3\x78\xf3\x79\xf3\x7a\xb8\xdf\xf3\x7b\xf3\x7c\xf3\x7d\xf3\x7e\xf3\x80\xf3\x81\xf7\xd4\xf3\x82\xf7\xd5\xf3\x83\xf3\x84\xf3\x85\xf3\x86\xf7\xd6\xf3\x87\xf3\x88\xf3\x89\xf3\x8a\xf7\xd8\xf3\x8b\xf7\xda\xf3\x8c\xf7\xd7\xf3\x8d\xf3\x8e\xf3\x8f\xf3\x90\xf3\x91\xf3\x92\xf3\x93\xf3\x94\xf3\x95\xf7\xdb\xf3\x96\xf7\xd9\xf3\x97\xf3\x98\xf3\x99\xf3\x9a", /* 9b00 */ "\xf3\x9b\xf3\x9c\xf3\x9d\xd7\xd7\xf3\x9e\xf3\x9f\xf3\xa0\xf4\x40\xf7\xdc\xf4\x41\xf4\x42\xf4\x43\xf4\x44\xf4\x45\xf4\x46\xf7\xdd\xf4\x47\xf4\x48\xf4\x49\xf7\xde\xf4\x4a\xf4\x4b\xf4\x4c\xf4\x4d\xf4\x4e\xf4\x4f\xf4\x50\xf4\x51\xf4\x52\xf4\x53\xf4\x54\xf7\xdf\xf4\x55\xf4\x56\xf4\x57\xf7\xe0\xf4\x58\xf4\x59\xf4\x5a\xf4\x5b\xf4\x5c\xf4\x5d\xf4\x5e\xf4\x5f\xf4\x60\xf4\x61\xf4\x62\xdb\xcb\xf4\x63\xf4\x64\xd8\xaa\xf4\x65\xf4\x66\xf4\x67\xf4\x68\xf4\x69\xf4\x6a\xf4\x6b\xf4\x6c\xe5\xf7\xb9\xed\xf4\x6d\xf4\x6e\xf4\x6f\xf4\x70\xbf\xfd\xbb\xea\xf7\xc9\xc6\xc7\xf7\xc8\xf4\x71\xf7\xca\xf7\xcc\xf7\xcb\xf4\x72\xf4\x73\xf4\x74\xf7\xcd\xf4\x75\xce\xba\xf4\x76\xf7\xce\xf4\x77\xf4\x78\xc4\xa7\xf4\x79\xf4\x7a\xf4\x7b\xf4\x7c\xf4\x7d\xf4\x7e\xf4\x80\xf4\x81\xf4\x82\xf4\x83\xf4\x84\xf4\x85\xf4\x86\xf4\x87\xf4\x88\xf4\x89\xf4\x8a\xf4\x8b\xf4\x8c\xf4\x8d\xf4\x8e\xf4\x8f\xf4\x90\xf4\x91\xf4\x92\xf4\x93\xf4\x94\xf4\x95\xf4\x96\xf4\x97\xf4\x98\xf4\x99\xf4\x9a\xf4\x9b\xf4\x9c\xf4\x9d\xf4\x9e\xf4\x9f\xf4\xa0\xf5\x40\xf5\x41\xf5\x42\xf5\x43", /* 9b80 */ "\xf5\x44\xf5\x45\xf5\x46\xf5\x47\xf5\x48\xf5\x49\xf5\x4a\xf5\x4b\xf5\x4c\xf5\x4d\xf5\x4e\xf5\x4f\xf5\x50\xf5\x51\xf5\x52\xf5\x53\xf5\x54\xf5\x55\xf5\x56\xf5\x57\xf5\x58\xf5\x59\xf5\x5a\xf5\x5b\xf5\x5c\xf5\x5d\xf5\x5e\xf5\x5f\xf5\x60\xf5\x61\xf5\x62\xf5\x63\xf5\x64\xf5\x65\xf5\x66\xf5\x67\xf5\x68\xf5\x69\xf5\x6a\xf5\x6b\xf5\x6c\xf5\x6d\xf5\x6e\xf5\x6f\xf5\x70\xf5\x71\xf5\x72\xf5\x73\xf5\x74\xf5\x75\xf5\x76\xf5\x77\xf5\x78\xf5\x79\xf5\x7a\xf5\x7b\xf5\x7c\xf5\x7d\xf5\x7e\xf5\x80\xf5\x81\xf5\x82\xf5\x83\xf5\x84\xf5\x85\xf5\x86\xf5\x87\xf5\x88\xf5\x89\xf5\x8a\xf5\x8b\xf5\x8c\xf5\x8d\xf5\x8e\xf5\x8f\xf5\x90\xf5\x91\xf5\x92\xf5\x93\xf5\x94\xf5\x95\xf5\x96\xf5\x97\xf5\x98\xf5\x99\xf5\x9a\xf5\x9b\xf5\x9c\xf5\x9d\xf5\x9e\xf5\x9f\xf5\xa0\xf6\x40\xf6\x41\xf6\x42\xf6\x43\xf6\x44\xf6\x45\xf6\x46\xf6\x47\xf6\x48\xf6\x49\xf6\x4a\xf6\x4b\xf6\x4c\xf6\x4d\xf6\x4e\xf6\x4f\xf6\x50\xf6\x51\xf6\x52\xf6\x53\xf6\x54\xf6\x55\xf6\x56\xf6\x57\xf6\x58\xf6\x59\xf6\x5a\xf6\x5b\xf6\x5c\xf6\x5d\xf6\x5e\xf6\x5f\xf6\x60\xf6\x61\xf6\x62\xf6\x63", /* 9c00 */ "\xf6\x64\xf6\x65\xf6\x66\xf6\x67\xf6\x68\xf6\x69\xf6\x6a\xf6\x6b\xf6\x6c\xf6\x6d\xf6\x6e\xf6\x6f\xf6\x70\xf6\x71\xf6\x72\xf6\x73\xf6\x74\xf6\x75\xf6\x76\xf6\x77\xf6\x78\xf6\x79\xf6\x7a\xf6\x7b\xf6\x7c\xf6\x7d\xf6\x7e\xf6\x80\xf6\x81\xf6\x82\xf6\x83\xf6\x84\xf6\x85\xf6\x86\xf6\x87\xf6\x88\xf6\x89\xf6\x8a\xf6\x8b\xf6\x8c\xf6\x8d\xf6\x8e\xf6\x8f\xf6\x90\xf6\x91\xf6\x92\xf6\x93\xf6\x94\xf6\x95\xf6\x96\xf6\x97\xf6\x98\xf6\x99\xf6\x9a\xf6\x9b\xf6\x9c\xf6\x9d\xf6\x9e\xf6\x9f\xf6\xa0\xf7\x40\xf7\x41\xf7\x42\xf7\x43\xf7\x44\xf7\x45\xf7\x46\xf7\x47\xf7\x48\xf7\x49\xf7\x4a\xf7\x4b\xf7\x4c\xf7\x4d\xf7\x4e\xf7\x4f\xf7\x50\xf7\x51\xf7\x52\xf7\x53\xf7\x54\xf7\x55\xf7\x56\xf7\x57\xf7\x58\xf7\x59\xf7\x5a\xf7\x5b\xf7\x5c\xf7\x5d\xf7\x5e\xf7\x5f\xf7\x60\xf7\x61\xf7\x62\xf7\x63\xf7\x64\xf7\x65\xf7\x66\xf7\x67\xf7\x68\xf7\x69\xf7\x6a\xf7\x6b\xf7\x6c\xf7\x6d\xf7\x6e\xf7\x6f\xf7\x70\xf7\x71\xf7\x72\xf7\x73\xf7\x74\xf7\x75\xf7\x76\xf7\x77\xf7\x78\xf7\x79\xf7\x7a\xf7\x7b\xf7\x7c\xf7\x7d\xf7\x7e\xf7\x80\xd3\xe3\xf7\x81\xf7\x82\xf6\xcf", /* 9c80 */ "\xf7\x83\xc2\xb3\xf6\xd0\xf7\x84\xf7\x85\xf6\xd1\xf6\xd2\xf6\xd3\xf6\xd4\xf7\x86\xf7\x87\xf6\xd6\xf7\x88\xb1\xab\xf6\xd7\xf7\x89\xf6\xd8\xf6\xd9\xf6\xda\xf7\x8a\xf6\xdb\xf6\xdc\xf7\x8b\xf7\x8c\xf7\x8d\xf7\x8e\xf6\xdd\xf6\xde\xcf\xca\xf7\x8f\xf6\xdf\xf6\xe0\xf6\xe1\xf6\xe2\xf6\xe3\xf6\xe4\xc0\xf0\xf6\xe5\xf6\xe6\xf6\xe7\xf6\xe8\xf6\xe9\xf7\x90\xf6\xea\xf7\x91\xf6\xeb\xf6\xec\xf7\x92\xf6\xed\xf6\xee\xf6\xef\xf6\xf0\xf6\xf1\xf6\xf2\xf6\xf3\xf6\xf4\xbe\xa8\xf7\x93\xf6\xf5\xf6\xf6\xf6\xf7\xf6\xf8\xf7\x94\xf7\x95\xf7\x96\xf7\x97\xf7\x98\xc8\xfa\xf6\xf9\xf6\xfa\xf6\xfb\xf6\xfc\xf7\x99\xf7\x9a\xf6\xfd\xf6\xfe\xf7\xa1\xf7\xa2\xf7\xa3\xf7\xa4\xf7\xa5\xf7\x9b\xf7\x9c\xf7\xa6\xf7\xa7\xf7\xa8\xb1\xee\xf7\xa9\xf7\xaa\xf7\xab\xf7\x9d\xf7\x9e\xf7\xac\xf7\xad\xc1\xdb\xf7\xae\xf7\x9f\xf7\xa0\xf7\xaf\xf8\x40\xf8\x41\xf8\x42\xf8\x43\xf8\x44\xf8\x45\xf8\x46\xf8\x47\xf8\x48\xf8\x49\xf8\x4a\xf8\x4b\xf8\x4c\xf8\x4d\xf8\x4e\xf8\x4f\xf8\x50\xf8\x51\xf8\x52\xf8\x53\xf8\x54\xf8\x55\xf8\x56\xf8\x57\xf8\x58\xf8\x59\xf8\x5a\xf8\x5b\xf8\x5c", /* 9d00 */ "\xf8\x5d\xf8\x5e\xf8\x5f\xf8\x60\xf8\x61\xf8\x62\xf8\x63\xf8\x64\xf8\x65\xf8\x66\xf8\x67\xf8\x68\xf8\x69\xf8\x6a\xf8\x6b\xf8\x6c\xf8\x6d\xf8\x6e\xf8\x6f\xf8\x70\xf8\x71\xf8\x72\xf8\x73\xf8\x74\xf8\x75\xf8\x76\xf8\x77\xf8\x78\xf8\x79\xf8\x7a\xf8\x7b\xf8\x7c\xf8\x7d\xf8\x7e\xf8\x80\xf8\x81\xf8\x82\xf8\x83\xf8\x84\xf8\x85\xf8\x86\xf8\x87\xf8\x88\xf8\x89\xf8\x8a\xf8\x8b\xf8\x8c\xf8\x8d\xf8\x8e\xf8\x8f\xf8\x90\xf8\x91\xf8\x92\xf8\x93\xf8\x94\xf8\x95\xf8\x96\xf8\x97\xf8\x98\xf8\x99\xf8\x9a\xf8\x9b\xf8\x9c\xf8\x9d\xf8\x9e\xf8\x9f\xf8\xa0\xf9\x40\xf9\x41\xf9\x42\xf9\x43\xf9\x44\xf9\x45\xf9\x46\xf9\x47\xf9\x48\xf9\x49\xf9\x4a\xf9\x4b\xf9\x4c\xf9\x4d\xf9\x4e\xf9\x4f\xf9\x50\xf9\x51\xf9\x52\xf9\x53\xf9\x54\xf9\x55\xf9\x56\xf9\x57\xf9\x58\xf9\x59\xf9\x5a\xf9\x5b\xf9\x5c\xf9\x5d\xf9\x5e\xf9\x5f\xf9\x60\xf9\x61\xf9\x62\xf9\x63\xf9\x64\xf9\x65\xf9\x66\xf9\x67\xf9\x68\xf9\x69\xf9\x6a\xf9\x6b\xf9\x6c\xf9\x6d\xf9\x6e\xf9\x6f\xf9\x70\xf9\x71\xf9\x72\xf9\x73\xf9\x74\xf9\x75\xf9\x76\xf9\x77\xf9\x78\xf9\x79\xf9\x7a\xf9\x7b\xf9\x7c", /* 9d80 */ "\xf9\x7d\xf9\x7e\xf9\x80\xf9\x81\xf9\x82\xf9\x83\xf9\x84\xf9\x85\xf9\x86\xf9\x87\xf9\x88\xf9\x89\xf9\x8a\xf9\x8b\xf9\x8c\xf9\x8d\xf9\x8e\xf9\x8f\xf9\x90\xf9\x91\xf9\x92\xf9\x93\xf9\x94\xf9\x95\xf9\x96\xf9\x97\xf9\x98\xf9\x99\xf9\x9a\xf9\x9b\xf9\x9c\xf9\x9d\xf9\x9e\xf9\x9f\xf9\xa0\xfa\x40\xfa\x41\xfa\x42\xfa\x43\xfa\x44\xfa\x45\xfa\x46\xfa\x47\xfa\x48\xfa\x49\xfa\x4a\xfa\x4b\xfa\x4c\xfa\x4d\xfa\x4e\xfa\x4f\xfa\x50\xfa\x51\xfa\x52\xfa\x53\xfa\x54\xfa\x55\xfa\x56\xfa\x57\xfa\x58\xfa\x59\xfa\x5a\xfa\x5b\xfa\x5c\xfa\x5d\xfa\x5e\xfa\x5f\xfa\x60\xfa\x61\xfa\x62\xfa\x63\xfa\x64\xfa\x65\xfa\x66\xfa\x67\xfa\x68\xfa\x69\xfa\x6a\xfa\x6b\xfa\x6c\xfa\x6d\xfa\x6e\xfa\x6f\xfa\x70\xfa\x71\xfa\x72\xfa\x73\xfa\x74\xfa\x75\xfa\x76\xfa\x77\xfa\x78\xfa\x79\xfa\x7a\xfa\x7b\xfa\x7c\xfa\x7d\xfa\x7e\xfa\x80\xfa\x81\xfa\x82\xfa\x83\xfa\x84\xfa\x85\xfa\x86\xfa\x87\xfa\x88\xfa\x89\xfa\x8a\xfa\x8b\xfa\x8c\xfa\x8d\xfa\x8e\xfa\x8f\xfa\x90\xfa\x91\xfa\x92\xfa\x93\xfa\x94\xfa\x95\xfa\x96\xfa\x97\xfa\x98\xfa\x99\xfa\x9a\xfa\x9b\xfa\x9c\xfa\x9d", /* 9e00 */ "\xfa\x9e\xfa\x9f\xfa\xa0\xfb\x40\xfb\x41\xfb\x42\xfb\x43\xfb\x44\xfb\x45\xfb\x46\xfb\x47\xfb\x48\xfb\x49\xfb\x4a\xfb\x4b\xfb\x4c\xfb\x4d\xfb\x4e\xfb\x4f\xfb\x50\xfb\x51\xfb\x52\xfb\x53\xfb\x54\xfb\x55\xfb\x56\xfb\x57\xfb\x58\xfb\x59\xfb\x5a\xfb\x5b\xc4\xf1\xf0\xaf\xbc\xa6\xf0\xb0\xc3\xf9\xfb\x5c\xc5\xb8\xd1\xbb\xfb\x5d\xf0\xb1\xf0\xb2\xf0\xb3\xf0\xb4\xf0\xb5\xd1\xbc\xfb\x5e\xd1\xec\xfb\x5f\xf0\xb7\xf0\xb6\xd4\xa7\xfb\x60\xcd\xd2\xf0\xb8\xf0\xba\xf0\xb9\xf0\xbb\xf0\xbc\xfb\x61\xfb\x62\xb8\xeb\xf0\xbd\xba\xe8\xfb\x63\xf0\xbe\xf0\xbf\xbe\xe9\xf0\xc0\xb6\xec\xf0\xc1\xf0\xc2\xf0\xc3\xf0\xc4\xc8\xb5\xf0\xc5\xf0\xc6\xfb\x64\xf0\xc7\xc5\xf4\xfb\x65\xf0\xc8\xfb\x66\xfb\x67\xfb\x68\xf0\xc9\xfb\x69\xf0\xca\xf7\xbd\xfb\x6a\xf0\xcb\xf0\xcc\xf0\xcd\xfb\x6b\xf0\xce\xfb\x6c\xfb\x6d\xfb\x6e\xfb\x6f\xf0\xcf\xba\xd7\xfb\x70\xf0\xd0\xf0\xd1\xf0\xd2\xf0\xd3\xf0\xd4\xf0\xd5\xf0\xd6\xf0\xd8\xfb\x71\xfb\x72\xd3\xa5\xf0\xd7\xfb\x73\xf0\xd9\xfb\x74\xfb\x75\xfb\x76\xfb\x77\xfb\x78\xfb\x79\xfb\x7a\xfb\x7b\xfb\x7c\xfb\x7d\xf5\xba\xc2\xb9", /* 9e80 */ "\xfb\x7e\xfb\x80\xf7\xe4\xfb\x81\xfb\x82\xfb\x83\xfb\x84\xf7\xe5\xf7\xe6\xfb\x85\xfb\x86\xf7\xe7\xfb\x87\xfb\x88\xfb\x89\xfb\x8a\xfb\x8b\xfb\x8c\xf7\xe8\xc2\xb4\xfb\x8d\xfb\x8e\xfb\x8f\xfb\x90\xfb\x91\xfb\x92\xfb\x93\xfb\x94\xfb\x95\xf7\xea\xfb\x96\xf7\xeb\xfb\x97\xfb\x98\xfb\x99\xfb\x9a\xfb\x9b\xfb\x9c\xc2\xf3\xfb\x9d\xfb\x9e\xfb\x9f\xfb\xa0\xfc\x40\xfc\x41\xfc\x42\xfc\x43\xfc\x44\xfc\x45\xfc\x46\xfc\x47\xfc\x48\xf4\xf0\xfc\x49\xfc\x4a\xfc\x4b\xf4\xef\xfc\x4c\xfc\x4d\xc2\xe9\xfc\x4e\xf7\xe1\xf7\xe2\xfc\x4f\xfc\x50\xfc\x51\xfc\x52\xfc\x53\xbb\xc6\xfc\x54\xfc\x55\xfc\x56\xfc\x57\xd9\xe4\xfc\x58\xfc\x59\xfc\x5a\xca\xf2\xc0\xe8\xf0\xa4\xfc\x5b\xba\xda\xfc\x5c\xfc\x5d\xc7\xad\xfc\x5e\xfc\x5f\xfc\x60\xc4\xac\xfc\x61\xfc\x62\xf7\xec\xf7\xed\xf7\xee\xfc\x63\xf7\xf0\xf7\xef\xfc\x64\xf7\xf1\xfc\x65\xfc\x66\xf7\xf4\xfc\x67\xf7\xf3\xfc\x68\xf7\xf2\xf7\xf5\xfc\x69\xfc\x6a\xfc\x6b\xfc\x6c\xf7\xf6\xfc\x6d\xfc\x6e\xfc\x6f\xfc\x70\xfc\x71\xfc\x72\xfc\x73\xfc\x74\xfc\x75\xed\xe9\xfc\x76\xed\xea\xed\xeb\xfc\x77\xf6\xbc\xfc\x78", /* 9f00 */ "\xfc\x79\xfc\x7a\xfc\x7b\xfc\x7c\xfc\x7d\xfc\x7e\xfc\x80\xfc\x81\xfc\x82\xfc\x83\xfc\x84\xf6\xbd\xfc\x85\xf6\xbe\xb6\xa6\xfc\x86\xd8\xbe\xfc\x87\xfc\x88\xb9\xc4\xfc\x89\xfc\x8a\xfc\x8b\xd8\xbb\xfc\x8c\xdc\xb1\xfc\x8d\xfc\x8e\xfc\x8f\xfc\x90\xfc\x91\xfc\x92\xca\xf3\xfc\x93\xf7\xf7\xfc\x94\xfc\x95\xfc\x96\xfc\x97\xfc\x98\xfc\x99\xfc\x9a\xfc\x9b\xfc\x9c\xf7\xf8\xfc\x9d\xfc\x9e\xf7\xf9\xfc\x9f\xfc\xa0\xfd\x40\xfd\x41\xfd\x42\xfd\x43\xfd\x44\xf7\xfb\xfd\x45\xf7\xfa\xfd\x46\xb1\xc7\xfd\x47\xf7\xfc\xf7\xfd\xfd\x48\xfd\x49\xfd\x4a\xfd\x4b\xfd\x4c\xf7\xfe\xfd\x4d\xfd\x4e\xfd\x4f\xfd\x50\xfd\x51\xfd\x52\xfd\x53\xfd\x54\xfd\x55\xfd\x56\xfd\x57\xc6\xeb\xec\xb4\xfd\x58\xfd\x59\xfd\x5a\xfd\x5b\xfd\x5c\xfd\x5d\xfd\x5e\xfd\x5f\xfd\x60\xfd\x61\xfd\x62\xfd\x63\xfd\x64\xfd\x65\xfd\x66\xfd\x67\xfd\x68\xfd\x69\xfd\x6a\xfd\x6b\xfd\x6c\xfd\x6d\xfd\x6e\xfd\x6f\xfd\x70\xfd\x71\xfd\x72\xfd\x73\xfd\x74\xfd\x75\xfd\x76\xfd\x77\xfd\x78\xfd\x79\xfd\x7a\xfd\x7b\xfd\x7c\xfd\x7d\xfd\x7e\xfd\x80\xfd\x81\xfd\x82\xfd\x83\xfd\x84\xfd\x85\xb3\xdd", /* 9f80 */ "\xf6\xb3\xfd\x86\xfd\x87\xf6\xb4\xc1\xe4\xf6\xb5\xf6\xb6\xf6\xb7\xf6\xb8\xf6\xb9\xf6\xba\xc8\xa3\xf6\xbb\xfd\x88\xfd\x89\xfd\x8a\xfd\x8b\xfd\x8c\xfd\x8d\xfd\x8e\xfd\x8f\xfd\x90\xfd\x91\xfd\x92\xfd\x93\xc1\xfa\xb9\xa8\xed\xe8\xfd\x94\xfd\x95\xfd\x96\xb9\xea\xd9\xdf\xfd\x97\xfd\x98\xfd\x99\xfd\x9a\xfd\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ "\xaa\xa1\xaa\xa2\xaa\xa3\xaa\xa4\xaa\xa5\xaa\xa6\xaa\xa7\xaa\xa8\xaa\xa9\xaa\xaa\xaa\xab\xaa\xac\xaa\xad\xaa\xae\xaa\xaf\xaa\xb0\xaa\xb1\xaa\xb2\xaa\xb3\xaa\xb4\xaa\xb5\xaa\xb6\xaa\xb7\xaa\xb8\xaa\xb9\xaa\xba\xaa\xbb\xaa\xbc\xaa\xbd\xaa\xbe\xaa\xbf\xaa\xc0\xaa\xc1\xaa\xc2\xaa\xc3\xaa\xc4\xaa\xc5\xaa\xc6\xaa\xc7\xaa\xc8\xaa\xc9\xaa\xca\xaa\xcb\xaa\xcc\xaa\xcd\xaa\xce\xaa\xcf\xaa\xd0\xaa\xd1\xaa\xd2\xaa\xd3\xaa\xd4\xaa\xd5\xaa\xd6\xaa\xd7\xaa\xd8\xaa\xd9\xaa\xda\xaa\xdb\xaa\xdc\xaa\xdd\xaa\xde\xaa\xdf\xaa\xe0\xaa\xe1\xaa\xe2\xaa\xe3\xaa\xe4\xaa\xe5\xaa\xe6\xaa\xe7\xaa\xe8\xaa\xe9\xaa\xea\xaa\xeb\xaa\xec\xaa\xed\xaa\xee\xaa\xef\xaa\xf0\xaa\xf1\xaa\xf2\xaa\xf3\xaa\xf4\xaa\xf5\xaa\xf6\xaa\xf7\xaa\xf8\xaa\xf9\xaa\xfa\xaa\xfb\xaa\xfc\xaa\xfd\xaa\xfe\xab\xa1\xab\xa2\xab\xa3\xab\xa4\xab\xa5\xab\xa6\xab\xa7\xab\xa8\xab\xa9\xab\xaa\xab\xab\xab\xac\xab\xad\xab\xae\xab\xaf\xab\xb0\xab\xb1\xab\xb2\xab\xb3\xab\xb4\xab\xb5\xab\xb6\xab\xb7\xab\xb8\xab\xb9\xab\xba\xab\xbb\xab\xbc\xab\xbd\xab\xbe\xab\xbf\xab\xc0\xab\xc1\xab\xc2", /* e080 */ "\xab\xc3\xab\xc4\xab\xc5\xab\xc6\xab\xc7\xab\xc8\xab\xc9\xab\xca\xab\xcb\xab\xcc\xab\xcd\xab\xce\xab\xcf\xab\xd0\xab\xd1\xab\xd2\xab\xd3\xab\xd4\xab\xd5\xab\xd6\xab\xd7\xab\xd8\xab\xd9\xab\xda\xab\xdb\xab\xdc\xab\xdd\xab\xde\xab\xdf\xab\xe0\xab\xe1\xab\xe2\xab\xe3\xab\xe4\xab\xe5\xab\xe6\xab\xe7\xab\xe8\xab\xe9\xab\xea\xab\xeb\xab\xec\xab\xed\xab\xee\xab\xef\xab\xf0\xab\xf1\xab\xf2\xab\xf3\xab\xf4\xab\xf5\xab\xf6\xab\xf7\xab\xf8\xab\xf9\xab\xfa\xab\xfb\xab\xfc\xab\xfd\xab\xfe\xac\xa1\xac\xa2\xac\xa3\xac\xa4\xac\xa5\xac\xa6\xac\xa7\xac\xa8\xac\xa9\xac\xaa\xac\xab\xac\xac\xac\xad\xac\xae\xac\xaf\xac\xb0\xac\xb1\xac\xb2\xac\xb3\xac\xb4\xac\xb5\xac\xb6\xac\xb7\xac\xb8\xac\xb9\xac\xba\xac\xbb\xac\xbc\xac\xbd\xac\xbe\xac\xbf\xac\xc0\xac\xc1\xac\xc2\xac\xc3\xac\xc4\xac\xc5\xac\xc6\xac\xc7\xac\xc8\xac\xc9\xac\xca\xac\xcb\xac\xcc\xac\xcd\xac\xce\xac\xcf\xac\xd0\xac\xd1\xac\xd2\xac\xd3\xac\xd4\xac\xd5\xac\xd6\xac\xd7\xac\xd8\xac\xd9\xac\xda\xac\xdb\xac\xdc\xac\xdd\xac\xde\xac\xdf\xac\xe0\xac\xe1\xac\xe2\xac\xe3\xac\xe4", /* e100 */ "\xac\xe5\xac\xe6\xac\xe7\xac\xe8\xac\xe9\xac\xea\xac\xeb\xac\xec\xac\xed\xac\xee\xac\xef\xac\xf0\xac\xf1\xac\xf2\xac\xf3\xac\xf4\xac\xf5\xac\xf6\xac\xf7\xac\xf8\xac\xf9\xac\xfa\xac\xfb\xac\xfc\xac\xfd\xac\xfe\xad\xa1\xad\xa2\xad\xa3\xad\xa4\xad\xa5\xad\xa6\xad\xa7\xad\xa8\xad\xa9\xad\xaa\xad\xab\xad\xac\xad\xad\xad\xae\xad\xaf\xad\xb0\xad\xb1\xad\xb2\xad\xb3\xad\xb4\xad\xb5\xad\xb6\xad\xb7\xad\xb8\xad\xb9\xad\xba\xad\xbb\xad\xbc\xad\xbd\xad\xbe\xad\xbf\xad\xc0\xad\xc1\xad\xc2\xad\xc3\xad\xc4\xad\xc5\xad\xc6\xad\xc7\xad\xc8\xad\xc9\xad\xca\xad\xcb\xad\xcc\xad\xcd\xad\xce\xad\xcf\xad\xd0\xad\xd1\xad\xd2\xad\xd3\xad\xd4\xad\xd5\xad\xd6\xad\xd7\xad\xd8\xad\xd9\xad\xda\xad\xdb\xad\xdc\xad\xdd\xad\xde\xad\xdf\xad\xe0\xad\xe1\xad\xe2\xad\xe3\xad\xe4\xad\xe5\xad\xe6\xad\xe7\xad\xe8\xad\xe9\xad\xea\xad\xeb\xad\xec\xad\xed\xad\xee\xad\xef\xad\xf0\xad\xf1\xad\xf2\xad\xf3\xad\xf4\xad\xf5\xad\xf6\xad\xf7\xad\xf8\xad\xf9\xad\xfa\xad\xfb\xad\xfc\xad\xfd\xad\xfe\xae\xa1\xae\xa2\xae\xa3\xae\xa4\xae\xa5\xae\xa6\xae\xa7\xae\xa8", /* e180 */ "\xae\xa9\xae\xaa\xae\xab\xae\xac\xae\xad\xae\xae\xae\xaf\xae\xb0\xae\xb1\xae\xb2\xae\xb3\xae\xb4\xae\xb5\xae\xb6\xae\xb7\xae\xb8\xae\xb9\xae\xba\xae\xbb\xae\xbc\xae\xbd\xae\xbe\xae\xbf\xae\xc0\xae\xc1\xae\xc2\xae\xc3\xae\xc4\xae\xc5\xae\xc6\xae\xc7\xae\xc8\xae\xc9\xae\xca\xae\xcb\xae\xcc\xae\xcd\xae\xce\xae\xcf\xae\xd0\xae\xd1\xae\xd2\xae\xd3\xae\xd4\xae\xd5\xae\xd6\xae\xd7\xae\xd8\xae\xd9\xae\xda\xae\xdb\xae\xdc\xae\xdd\xae\xde\xae\xdf\xae\xe0\xae\xe1\xae\xe2\xae\xe3\xae\xe4\xae\xe5\xae\xe6\xae\xe7\xae\xe8\xae\xe9\xae\xea\xae\xeb\xae\xec\xae\xed\xae\xee\xae\xef\xae\xf0\xae\xf1\xae\xf2\xae\xf3\xae\xf4\xae\xf5\xae\xf6\xae\xf7\xae\xf8\xae\xf9\xae\xfa\xae\xfb\xae\xfc\xae\xfd\xae\xfe\xaf\xa1\xaf\xa2\xaf\xa3\xaf\xa4\xaf\xa5\xaf\xa6\xaf\xa7\xaf\xa8\xaf\xa9\xaf\xaa\xaf\xab\xaf\xac\xaf\xad\xaf\xae\xaf\xaf\xaf\xb0\xaf\xb1\xaf\xb2\xaf\xb3\xaf\xb4\xaf\xb5\xaf\xb6\xaf\xb7\xaf\xb8\xaf\xb9\xaf\xba\xaf\xbb\xaf\xbc\xaf\xbd\xaf\xbe\xaf\xbf\xaf\xc0\xaf\xc1\xaf\xc2\xaf\xc3\xaf\xc4\xaf\xc5\xaf\xc6\xaf\xc7\xaf\xc8\xaf\xc9\xaf\xca", /* e200 */ "\xaf\xcb\xaf\xcc\xaf\xcd\xaf\xce\xaf\xcf\xaf\xd0\xaf\xd1\xaf\xd2\xaf\xd3\xaf\xd4\xaf\xd5\xaf\xd6\xaf\xd7\xaf\xd8\xaf\xd9\xaf\xda\xaf\xdb\xaf\xdc\xaf\xdd\xaf\xde\xaf\xdf\xaf\xe0\xaf\xe1\xaf\xe2\xaf\xe3\xaf\xe4\xaf\xe5\xaf\xe6\xaf\xe7\xaf\xe8\xaf\xe9\xaf\xea\xaf\xeb\xaf\xec\xaf\xed\xaf\xee\xaf\xef\xaf\xf0\xaf\xf1\xaf\xf2\xaf\xf3\xaf\xf4\xaf\xf5\xaf\xf6\xaf\xf7\xaf\xf8\xaf\xf9\xaf\xfa\xaf\xfb\xaf\xfc\xaf\xfd\xaf\xfe\xf8\xa1\xf8\xa2\xf8\xa3\xf8\xa4\xf8\xa5\xf8\xa6\xf8\xa7\xf8\xa8\xf8\xa9\xf8\xaa\xf8\xab\xf8\xac\xf8\xad\xf8\xae\xf8\xaf\xf8\xb0\xf8\xb1\xf8\xb2\xf8\xb3\xf8\xb4\xf8\xb5\xf8\xb6\xf8\xb7\xf8\xb8\xf8\xb9\xf8\xba\xf8\xbb\xf8\xbc\xf8\xbd\xf8\xbe\xf8\xbf\xf8\xc0\xf8\xc1\xf8\xc2\xf8\xc3\xf8\xc4\xf8\xc5\xf8\xc6\xf8\xc7\xf8\xc8\xf8\xc9\xf8\xca\xf8\xcb\xf8\xcc\xf8\xcd\xf8\xce\xf8\xcf\xf8\xd0\xf8\xd1\xf8\xd2\xf8\xd3\xf8\xd4\xf8\xd5\xf8\xd6\xf8\xd7\xf8\xd8\xf8\xd9\xf8\xda\xf8\xdb\xf8\xdc\xf8\xdd\xf8\xde\xf8\xdf\xf8\xe0\xf8\xe1\xf8\xe2\xf8\xe3\xf8\xe4\xf8\xe5\xf8\xe6\xf8\xe7\xf8\xe8\xf8\xe9\xf8\xea\xf8\xeb\xf8\xec", /* e280 */ "\xf8\xed\xf8\xee\xf8\xef\xf8\xf0\xf8\xf1\xf8\xf2\xf8\xf3\xf8\xf4\xf8\xf5\xf8\xf6\xf8\xf7\xf8\xf8\xf8\xf9\xf8\xfa\xf8\xfb\xf8\xfc\xf8\xfd\xf8\xfe\xf9\xa1\xf9\xa2\xf9\xa3\xf9\xa4\xf9\xa5\xf9\xa6\xf9\xa7\xf9\xa8\xf9\xa9\xf9\xaa\xf9\xab\xf9\xac\xf9\xad\xf9\xae\xf9\xaf\xf9\xb0\xf9\xb1\xf9\xb2\xf9\xb3\xf9\xb4\xf9\xb5\xf9\xb6\xf9\xb7\xf9\xb8\xf9\xb9\xf9\xba\xf9\xbb\xf9\xbc\xf9\xbd\xf9\xbe\xf9\xbf\xf9\xc0\xf9\xc1\xf9\xc2\xf9\xc3\xf9\xc4\xf9\xc5\xf9\xc6\xf9\xc7\xf9\xc8\xf9\xc9\xf9\xca\xf9\xcb\xf9\xcc\xf9\xcd\xf9\xce\xf9\xcf\xf9\xd0\xf9\xd1\xf9\xd2\xf9\xd3\xf9\xd4\xf9\xd5\xf9\xd6\xf9\xd7\xf9\xd8\xf9\xd9\xf9\xda\xf9\xdb\xf9\xdc\xf9\xdd\xf9\xde\xf9\xdf\xf9\xe0\xf9\xe1\xf9\xe2\xf9\xe3\xf9\xe4\xf9\xe5\xf9\xe6\xf9\xe7\xf9\xe8\xf9\xe9\xf9\xea\xf9\xeb\xf9\xec\xf9\xed\xf9\xee\xf9\xef\xf9\xf0\xf9\xf1\xf9\xf2\xf9\xf3\xf9\xf4\xf9\xf5\xf9\xf6\xf9\xf7\xf9\xf8\xf9\xf9\xf9\xfa\xf9\xfb\xf9\xfc\xf9\xfd\xf9\xfe\xfa\xa1\xfa\xa2\xfa\xa3\xfa\xa4\xfa\xa5\xfa\xa6\xfa\xa7\xfa\xa8\xfa\xa9\xfa\xaa\xfa\xab\xfa\xac\xfa\xad\xfa\xae\xfa\xaf\xfa\xb0", /* e300 */ "\xfa\xb1\xfa\xb2\xfa\xb3\xfa\xb4\xfa\xb5\xfa\xb6\xfa\xb7\xfa\xb8\xfa\xb9\xfa\xba\xfa\xbb\xfa\xbc\xfa\xbd\xfa\xbe\xfa\xbf\xfa\xc0\xfa\xc1\xfa\xc2\xfa\xc3\xfa\xc4\xfa\xc5\xfa\xc6\xfa\xc7\xfa\xc8\xfa\xc9\xfa\xca\xfa\xcb\xfa\xcc\xfa\xcd\xfa\xce\xfa\xcf\xfa\xd0\xfa\xd1\xfa\xd2\xfa\xd3\xfa\xd4\xfa\xd5\xfa\xd6\xfa\xd7\xfa\xd8\xfa\xd9\xfa\xda\xfa\xdb\xfa\xdc\xfa\xdd\xfa\xde\xfa\xdf\xfa\xe0\xfa\xe1\xfa\xe2\xfa\xe3\xfa\xe4\xfa\xe5\xfa\xe6\xfa\xe7\xfa\xe8\xfa\xe9\xfa\xea\xfa\xeb\xfa\xec\xfa\xed\xfa\xee\xfa\xef\xfa\xf0\xfa\xf1\xfa\xf2\xfa\xf3\xfa\xf4\xfa\xf5\xfa\xf6\xfa\xf7\xfa\xf8\xfa\xf9\xfa\xfa\xfa\xfb\xfa\xfc\xfa\xfd\xfa\xfe\xfb\xa1\xfb\xa2\xfb\xa3\xfb\xa4\xfb\xa5\xfb\xa6\xfb\xa7\xfb\xa8\xfb\xa9\xfb\xaa\xfb\xab\xfb\xac\xfb\xad\xfb\xae\xfb\xaf\xfb\xb0\xfb\xb1\xfb\xb2\xfb\xb3\xfb\xb4\xfb\xb5\xfb\xb6\xfb\xb7\xfb\xb8\xfb\xb9\xfb\xba\xfb\xbb\xfb\xbc\xfb\xbd\xfb\xbe\xfb\xbf\xfb\xc0\xfb\xc1\xfb\xc2\xfb\xc3\xfb\xc4\xfb\xc5\xfb\xc6\xfb\xc7\xfb\xc8\xfb\xc9\xfb\xca\xfb\xcb\xfb\xcc\xfb\xcd\xfb\xce\xfb\xcf\xfb\xd0\xfb\xd1\xfb\xd2", /* e380 */ "\xfb\xd3\xfb\xd4\xfb\xd5\xfb\xd6\xfb\xd7\xfb\xd8\xfb\xd9\xfb\xda\xfb\xdb\xfb\xdc\xfb\xdd\xfb\xde\xfb\xdf\xfb\xe0\xfb\xe1\xfb\xe2\xfb\xe3\xfb\xe4\xfb\xe5\xfb\xe6\xfb\xe7\xfb\xe8\xfb\xe9\xfb\xea\xfb\xeb\xfb\xec\xfb\xed\xfb\xee\xfb\xef\xfb\xf0\xfb\xf1\xfb\xf2\xfb\xf3\xfb\xf4\xfb\xf5\xfb\xf6\xfb\xf7\xfb\xf8\xfb\xf9\xfb\xfa\xfb\xfb\xfb\xfc\xfb\xfd\xfb\xfe\xfc\xa1\xfc\xa2\xfc\xa3\xfc\xa4\xfc\xa5\xfc\xa6\xfc\xa7\xfc\xa8\xfc\xa9\xfc\xaa\xfc\xab\xfc\xac\xfc\xad\xfc\xae\xfc\xaf\xfc\xb0\xfc\xb1\xfc\xb2\xfc\xb3\xfc\xb4\xfc\xb5\xfc\xb6\xfc\xb7\xfc\xb8\xfc\xb9\xfc\xba\xfc\xbb\xfc\xbc\xfc\xbd\xfc\xbe\xfc\xbf\xfc\xc0\xfc\xc1\xfc\xc2\xfc\xc3\xfc\xc4\xfc\xc5\xfc\xc6\xfc\xc7\xfc\xc8\xfc\xc9\xfc\xca\xfc\xcb\xfc\xcc\xfc\xcd\xfc\xce\xfc\xcf\xfc\xd0\xfc\xd1\xfc\xd2\xfc\xd3\xfc\xd4\xfc\xd5\xfc\xd6\xfc\xd7\xfc\xd8\xfc\xd9\xfc\xda\xfc\xdb\xfc\xdc\xfc\xdd\xfc\xde\xfc\xdf\xfc\xe0\xfc\xe1\xfc\xe2\xfc\xe3\xfc\xe4\xfc\xe5\xfc\xe6\xfc\xe7\xfc\xe8\xfc\xe9\xfc\xea\xfc\xeb\xfc\xec\xfc\xed\xfc\xee\xfc\xef\xfc\xf0\xfc\xf1\xfc\xf2\xfc\xf3\xfc\xf4", /* e400 */ "\xfc\xf5\xfc\xf6\xfc\xf7\xfc\xf8\xfc\xf9\xfc\xfa\xfc\xfb\xfc\xfc\xfc\xfd\xfc\xfe\xfd\xa1\xfd\xa2\xfd\xa3\xfd\xa4\xfd\xa5\xfd\xa6\xfd\xa7\xfd\xa8\xfd\xa9\xfd\xaa\xfd\xab\xfd\xac\xfd\xad\xfd\xae\xfd\xaf\xfd\xb0\xfd\xb1\xfd\xb2\xfd\xb3\xfd\xb4\xfd\xb5\xfd\xb6\xfd\xb7\xfd\xb8\xfd\xb9\xfd\xba\xfd\xbb\xfd\xbc\xfd\xbd\xfd\xbe\xfd\xbf\xfd\xc0\xfd\xc1\xfd\xc2\xfd\xc3\xfd\xc4\xfd\xc5\xfd\xc6\xfd\xc7\xfd\xc8\xfd\xc9\xfd\xca\xfd\xcb\xfd\xcc\xfd\xcd\xfd\xce\xfd\xcf\xfd\xd0\xfd\xd1\xfd\xd2\xfd\xd3\xfd\xd4\xfd\xd5\xfd\xd6\xfd\xd7\xfd\xd8\xfd\xd9\xfd\xda\xfd\xdb\xfd\xdc\xfd\xdd\xfd\xde\xfd\xdf\xfd\xe0\xfd\xe1\xfd\xe2\xfd\xe3\xfd\xe4\xfd\xe5\xfd\xe6\xfd\xe7\xfd\xe8\xfd\xe9\xfd\xea\xfd\xeb\xfd\xec\xfd\xed\xfd\xee\xfd\xef\xfd\xf0\xfd\xf1\xfd\xf2\xfd\xf3\xfd\xf4\xfd\xf5\xfd\xf6\xfd\xf7\xfd\xf8\xfd\xf9\xfd\xfa\xfd\xfb\xfd\xfc\xfd\xfd\xfd\xfe\xfe\xa1\xfe\xa2\xfe\xa3\xfe\xa4\xfe\xa5\xfe\xa6\xfe\xa7\xfe\xa8\xfe\xa9\xfe\xaa\xfe\xab\xfe\xac\xfe\xad\xfe\xae\xfe\xaf\xfe\xb0\xfe\xb1\xfe\xb2\xfe\xb3\xfe\xb4\xfe\xb5\xfe\xb6\xfe\xb7\xfe\xb8", /* e480 */ "\xfe\xb9\xfe\xba\xfe\xbb\xfe\xbc\xfe\xbd\xfe\xbe\xfe\xbf\xfe\xc0\xfe\xc1\xfe\xc2\xfe\xc3\xfe\xc4\xfe\xc5\xfe\xc6\xfe\xc7\xfe\xc8\xfe\xc9\xfe\xca\xfe\xcb\xfe\xcc\xfe\xcd\xfe\xce\xfe\xcf\xfe\xd0\xfe\xd1\xfe\xd2\xfe\xd3\xfe\xd4\xfe\xd5\xfe\xd6\xfe\xd7\xfe\xd8\xfe\xd9\xfe\xda\xfe\xdb\xfe\xdc\xfe\xdd\xfe\xde\xfe\xdf\xfe\xe0\xfe\xe1\xfe\xe2\xfe\xe3\xfe\xe4\xfe\xe5\xfe\xe6\xfe\xe7\xfe\xe8\xfe\xe9\xfe\xea\xfe\xeb\xfe\xec\xfe\xed\xfe\xee\xfe\xef\xfe\xf0\xfe\xf1\xfe\xf2\xfe\xf3\xfe\xf4\xfe\xf5\xfe\xf6\xfe\xf7\xfe\xf8\xfe\xf9\xfe\xfa\xfe\xfb\xfe\xfc\xfe\xfd\xfe\xfe\xa1\x40\xa1\x41\xa1\x42\xa1\x43\xa1\x44\xa1\x45\xa1\x46\xa1\x47\xa1\x48\xa1\x49\xa1\x4a\xa1\x4b\xa1\x4c\xa1\x4d\xa1\x4e\xa1\x4f\xa1\x50\xa1\x51\xa1\x52\xa1\x53\xa1\x54\xa1\x55\xa1\x56\xa1\x57\xa1\x58\xa1\x59\xa1\x5a\xa1\x5b\xa1\x5c\xa1\x5d\xa1\x5e\xa1\x5f\xa1\x60\xa1\x61\xa1\x62\xa1\x63\xa1\x64\xa1\x65\xa1\x66\xa1\x67\xa1\x68\xa1\x69\xa1\x6a\xa1\x6b\xa1\x6c\xa1\x6d\xa1\x6e\xa1\x6f\xa1\x70\xa1\x71\xa1\x72\xa1\x73\xa1\x74\xa1\x75\xa1\x76\xa1\x77\xa1\x78\xa1\x79", /* e500 */ "\xa1\x7a\xa1\x7b\xa1\x7c\xa1\x7d\xa1\x7e\xa1\x80\xa1\x81\xa1\x82\xa1\x83\xa1\x84\xa1\x85\xa1\x86\xa1\x87\xa1\x88\xa1\x89\xa1\x8a\xa1\x8b\xa1\x8c\xa1\x8d\xa1\x8e\xa1\x8f\xa1\x90\xa1\x91\xa1\x92\xa1\x93\xa1\x94\xa1\x95\xa1\x96\xa1\x97\xa1\x98\xa1\x99\xa1\x9a\xa1\x9b\xa1\x9c\xa1\x9d\xa1\x9e\xa1\x9f\xa1\xa0\xa2\x40\xa2\x41\xa2\x42\xa2\x43\xa2\x44\xa2\x45\xa2\x46\xa2\x47\xa2\x48\xa2\x49\xa2\x4a\xa2\x4b\xa2\x4c\xa2\x4d\xa2\x4e\xa2\x4f\xa2\x50\xa2\x51\xa2\x52\xa2\x53\xa2\x54\xa2\x55\xa2\x56\xa2\x57\xa2\x58\xa2\x59\xa2\x5a\xa2\x5b\xa2\x5c\xa2\x5d\xa2\x5e\xa2\x5f\xa2\x60\xa2\x61\xa2\x62\xa2\x63\xa2\x64\xa2\x65\xa2\x66\xa2\x67\xa2\x68\xa2\x69\xa2\x6a\xa2\x6b\xa2\x6c\xa2\x6d\xa2\x6e\xa2\x6f\xa2\x70\xa2\x71\xa2\x72\xa2\x73\xa2\x74\xa2\x75\xa2\x76\xa2\x77\xa2\x78\xa2\x79\xa2\x7a\xa2\x7b\xa2\x7c\xa2\x7d\xa2\x7e\xa2\x80\xa2\x81\xa2\x82\xa2\x83\xa2\x84\xa2\x85\xa2\x86\xa2\x87\xa2\x88\xa2\x89\xa2\x8a\xa2\x8b\xa2\x8c\xa2\x8d\xa2\x8e\xa2\x8f\xa2\x90\xa2\x91\xa2\x92\xa2\x93\xa2\x94\xa2\x95\xa2\x96\xa2\x97\xa2\x98\xa2\x99\xa2\x9a", /* e580 */ "\xa2\x9b\xa2\x9c\xa2\x9d\xa2\x9e\xa2\x9f\xa2\xa0\xa3\x40\xa3\x41\xa3\x42\xa3\x43\xa3\x44\xa3\x45\xa3\x46\xa3\x47\xa3\x48\xa3\x49\xa3\x4a\xa3\x4b\xa3\x4c\xa3\x4d\xa3\x4e\xa3\x4f\xa3\x50\xa3\x51\xa3\x52\xa3\x53\xa3\x54\xa3\x55\xa3\x56\xa3\x57\xa3\x58\xa3\x59\xa3\x5a\xa3\x5b\xa3\x5c\xa3\x5d\xa3\x5e\xa3\x5f\xa3\x60\xa3\x61\xa3\x62\xa3\x63\xa3\x64\xa3\x65\xa3\x66\xa3\x67\xa3\x68\xa3\x69\xa3\x6a\xa3\x6b\xa3\x6c\xa3\x6d\xa3\x6e\xa3\x6f\xa3\x70\xa3\x71\xa3\x72\xa3\x73\xa3\x74\xa3\x75\xa3\x76\xa3\x77\xa3\x78\xa3\x79\xa3\x7a\xa3\x7b\xa3\x7c\xa3\x7d\xa3\x7e\xa3\x80\xa3\x81\xa3\x82\xa3\x83\xa3\x84\xa3\x85\xa3\x86\xa3\x87\xa3\x88\xa3\x89\xa3\x8a\xa3\x8b\xa3\x8c\xa3\x8d\xa3\x8e\xa3\x8f\xa3\x90\xa3\x91\xa3\x92\xa3\x93\xa3\x94\xa3\x95\xa3\x96\xa3\x97\xa3\x98\xa3\x99\xa3\x9a\xa3\x9b\xa3\x9c\xa3\x9d\xa3\x9e\xa3\x9f\xa3\xa0\xa4\x40\xa4\x41\xa4\x42\xa4\x43\xa4\x44\xa4\x45\xa4\x46\xa4\x47\xa4\x48\xa4\x49\xa4\x4a\xa4\x4b\xa4\x4c\xa4\x4d\xa4\x4e\xa4\x4f\xa4\x50\xa4\x51\xa4\x52\xa4\x53\xa4\x54\xa4\x55\xa4\x56\xa4\x57\xa4\x58\xa4\x59", /* e600 */ "\xa4\x5a\xa4\x5b\xa4\x5c\xa4\x5d\xa4\x5e\xa4\x5f\xa4\x60\xa4\x61\xa4\x62\xa4\x63\xa4\x64\xa4\x65\xa4\x66\xa4\x67\xa4\x68\xa4\x69\xa4\x6a\xa4\x6b\xa4\x6c\xa4\x6d\xa4\x6e\xa4\x6f\xa4\x70\xa4\x71\xa4\x72\xa4\x73\xa4\x74\xa4\x75\xa4\x76\xa4\x77\xa4\x78\xa4\x79\xa4\x7a\xa4\x7b\xa4\x7c\xa4\x7d\xa4\x7e\xa4\x80\xa4\x81\xa4\x82\xa4\x83\xa4\x84\xa4\x85\xa4\x86\xa4\x87\xa4\x88\xa4\x89\xa4\x8a\xa4\x8b\xa4\x8c\xa4\x8d\xa4\x8e\xa4\x8f\xa4\x90\xa4\x91\xa4\x92\xa4\x93\xa4\x94\xa4\x95\xa4\x96\xa4\x97\xa4\x98\xa4\x99\xa4\x9a\xa4\x9b\xa4\x9c\xa4\x9d\xa4\x9e\xa4\x9f\xa4\xa0\xa5\x40\xa5\x41\xa5\x42\xa5\x43\xa5\x44\xa5\x45\xa5\x46\xa5\x47\xa5\x48\xa5\x49\xa5\x4a\xa5\x4b\xa5\x4c\xa5\x4d\xa5\x4e\xa5\x4f\xa5\x50\xa5\x51\xa5\x52\xa5\x53\xa5\x54\xa5\x55\xa5\x56\xa5\x57\xa5\x58\xa5\x59\xa5\x5a\xa5\x5b\xa5\x5c\xa5\x5d\xa5\x5e\xa5\x5f\xa5\x60\xa5\x61\xa5\x62\xa5\x63\xa5\x64\xa5\x65\xa5\x66\xa5\x67\xa5\x68\xa5\x69\xa5\x6a\xa5\x6b\xa5\x6c\xa5\x6d\xa5\x6e\xa5\x6f\xa5\x70\xa5\x71\xa5\x72\xa5\x73\xa5\x74\xa5\x75\xa5\x76\xa5\x77\xa5\x78\xa5\x79", /* e680 */ "\xa5\x7a\xa5\x7b\xa5\x7c\xa5\x7d\xa5\x7e\xa5\x80\xa5\x81\xa5\x82\xa5\x83\xa5\x84\xa5\x85\xa5\x86\xa5\x87\xa5\x88\xa5\x89\xa5\x8a\xa5\x8b\xa5\x8c\xa5\x8d\xa5\x8e\xa5\x8f\xa5\x90\xa5\x91\xa5\x92\xa5\x93\xa5\x94\xa5\x95\xa5\x96\xa5\x97\xa5\x98\xa5\x99\xa5\x9a\xa5\x9b\xa5\x9c\xa5\x9d\xa5\x9e\xa5\x9f\xa5\xa0\xa6\x40\xa6\x41\xa6\x42\xa6\x43\xa6\x44\xa6\x45\xa6\x46\xa6\x47\xa6\x48\xa6\x49\xa6\x4a\xa6\x4b\xa6\x4c\xa6\x4d\xa6\x4e\xa6\x4f\xa6\x50\xa6\x51\xa6\x52\xa6\x53\xa6\x54\xa6\x55\xa6\x56\xa6\x57\xa6\x58\xa6\x59\xa6\x5a\xa6\x5b\xa6\x5c\xa6\x5d\xa6\x5e\xa6\x5f\xa6\x60\xa6\x61\xa6\x62\xa6\x63\xa6\x64\xa6\x65\xa6\x66\xa6\x67\xa6\x68\xa6\x69\xa6\x6a\xa6\x6b\xa6\x6c\xa6\x6d\xa6\x6e\xa6\x6f\xa6\x70\xa6\x71\xa6\x72\xa6\x73\xa6\x74\xa6\x75\xa6\x76\xa6\x77\xa6\x78\xa6\x79\xa6\x7a\xa6\x7b\xa6\x7c\xa6\x7d\xa6\x7e\xa6\x80\xa6\x81\xa6\x82\xa6\x83\xa6\x84\xa6\x85\xa6\x86\xa6\x87\xa6\x88\xa6\x89\xa6\x8a\xa6\x8b\xa6\x8c\xa6\x8d\xa6\x8e\xa6\x8f\xa6\x90\xa6\x91\xa6\x92\xa6\x93\xa6\x94\xa6\x95\xa6\x96\xa6\x97\xa6\x98\xa6\x99\xa6\x9a", /* e700 */ "\xa6\x9b\xa6\x9c\xa6\x9d\xa6\x9e\xa6\x9f\xa6\xa0\xa7\x40\xa7\x41\xa7\x42\xa7\x43\xa7\x44\xa7\x45\xa7\x46\xa7\x47\xa7\x48\xa7\x49\xa7\x4a\xa7\x4b\xa7\x4c\xa7\x4d\xa7\x4e\xa7\x4f\xa7\x50\xa7\x51\xa7\x52\xa7\x53\xa7\x54\xa7\x55\xa7\x56\xa7\x57\xa7\x58\xa7\x59\xa7\x5a\xa7\x5b\xa7\x5c\xa7\x5d\xa7\x5e\xa7\x5f\xa7\x60\xa7\x61\xa7\x62\xa7\x63\xa7\x64\xa7\x65\xa7\x66\xa7\x67\xa7\x68\xa7\x69\xa7\x6a\xa7\x6b\xa7\x6c\xa7\x6d\xa7\x6e\xa7\x6f\xa7\x70\xa7\x71\xa7\x72\xa7\x73\xa7\x74\xa7\x75\xa7\x76\xa7\x77\xa7\x78\xa7\x79\xa7\x7a\xa7\x7b\xa7\x7c\xa7\x7d\xa7\x7e\xa7\x80\xa7\x81\xa7\x82\xa7\x83\xa7\x84\xa7\x85\xa7\x86\xa7\x87\xa7\x88\xa7\x89\xa7\x8a\xa7\x8b\xa7\x8c\xa7\x8d\xa7\x8e\xa7\x8f\xa7\x90\xa7\x91\xa7\x92\xa7\x93\xa7\x94\xa7\x95\xa7\x96\xa7\x97\xa7\x98\xa7\x99\xa7\x9a\xa7\x9b\xa7\x9c\xa7\x9d\xa7\x9e\xa7\x9f\xa7\xa0\xa2\xab\xa2\xac\xa2\xad\xa2\xae\xa2\xaf\xa2\xb0\x00\x00\xa2\xe4\xa2\xef\xa2\xf0\xa2\xfd\xa2\xfe\xa4\xf4\xa4\xf5\xa4\xf6\xa4\xf7\xa4\xf8\xa4\xf9\xa4\xfa\xa4\xfb\xa4\xfc\xa4\xfd\xa4\xfe\xa5\xf7\xa5\xf8\xa5\xf9", /* e780 */ "\xa5\xfa\xa5\xfb\xa5\xfc\xa5\xfd\xa5\xfe\xa6\xb9\xa6\xba\xa6\xbb\xa6\xbc\xa6\xbd\xa6\xbe\xa6\xbf\xa6\xc0\xa6\xd9\xa6\xda\xa6\xdb\xa6\xdc\xa6\xdd\xa6\xde\xa6\xdf\xa6\xec\xa6\xed\xa6\xf3\xa6\xf6\xa6\xf7\xa6\xf8\xa6\xf9\xa6\xfa\xa6\xfb\xa6\xfc\xa6\xfd\xa6\xfe\xa7\xc2\xa7\xc3\xa7\xc4\xa7\xc5\xa7\xc6\xa7\xc7\xa7\xc8\xa7\xc9\xa7\xca\xa7\xcb\xa7\xcc\xa7\xcd\xa7\xce\xa7\xcf\xa7\xd0\xa7\xf2\xa7\xf3\xa7\xf4\xa7\xf5\xa7\xf6\xa7\xf7\xa7\xf8\xa7\xf9\xa7\xfa\xa7\xfb\xa7\xfc\xa7\xfd\xa7\xfe\xa8\x96\xa8\x97\xa8\x98\xa8\x99\xa8\x9a\xa8\x9b\xa8\x9c\xa8\x9d\xa8\x9e\xa8\x9f\xa8\xa0\xa8\xbc\x00\x00\xa8\xc1\xa8\xc2\xa8\xc3\xa8\xc4\xa8\xea\xa8\xeb\xa8\xec\xa8\xed\xa8\xee\xa8\xef\xa8\xf0\xa8\xf1\xa8\xf2\xa8\xf3\xa8\xf4\xa8\xf5\xa8\xf6\xa8\xf7\xa8\xf8\xa8\xf9\xa8\xfa\xa8\xfb\xa8\xfc\xa8\xfd\xa8\xfe\xa9\x58\xa9\x5b\xa9\x5d\xa9\x5e\xa9\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x97\xa9\x98\xa9\x99\xa9\x9a\xa9\x9b\xa9\x9c\xa9\x9d\xa9\x9e\xa9\x9f\xa9\xa0\xa9\xa1\xa9\xa2", /* e800 */ "\xa9\xa3\xa9\xf0\xa9\xf1\xa9\xf2\xa9\xf3\xa9\xf4\xa9\xf5\xa9\xf6\xa9\xf7\xa9\xf8\xa9\xf9\xa9\xfa\xa9\xfb\xa9\xfc\xa9\xfd\xa9\xfe\xd7\xfa\xd7\xfb\xd7\xfc\xd7\xfd\xd7\xfe\x00\x00\xfe\x51\xfe\x52\xfe\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x61\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x66\xfe\x67\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x6c\xfe\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x90\xfe\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ NULL, /* f880 */ NULL, /* f900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x40\xfe\x41\xfe\x42\xfe\x43\x00\x00\xfe\x44\x00\x00\xfe\x45\xfe\x46\x00\x00\x00\x00\x00\x00\xfe\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x48\xfe\x49\xfe\x4a\x00\x00\xfe\x4b\xfe\x4c\x00\x00\x00\x00\xfe\x4d\xfe\x4e\xfe\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x55\xa6\xf2\x00\x00\xa6\xf4\xa6\xf5\xa6\xe0\xa6\xe1\xa6\xf0\xa6\xf1\xa6\xe2\xa6\xe3\xa6\xee\xa6\xef\xa6\xe6\xa6\xe7\xa6\xe4\xa6\xe5\xa6\xe8\xa6\xe9\xa6\xea\xa6\xeb\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x68\xa9\x69\xa9\x6a\xa9\x6b\xa9\x6c\xa9\x6d\xa9\x6e\xa9\x6f\xa9\x70\xa9\x71\x00\x00\xa9\x72\xa9\x73\xa9\x74\xa9\x75\x00\x00\xa9\x76\xa9\x77\xa9\x78\xa9\x79\xa9\x7a\xa9\x7b\xa9\x7c\xa9\x7d\xa9\x7e\xa9\x80\xa9\x81\xa9\x82\xa9\x83\xa9\x84\x00\x00\xa9\x85\xa9\x86\xa9\x87\xa9\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fe80 */ NULL, /* ff00 */ "\x00\x00\xa3\xa1\xa3\xa2\xa3\xa3\xa1\xe7\xa3\xa5\xa3\xa6\xa3\xa7\xa3\xa8\xa3\xa9\xa3\xaa\xa3\xab\xa3\xac\xa3\xad\xa3\xae\xa3\xaf\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4\xa3\xb5\xa3\xb6\xa3\xb7\xa3\xb8\xa3\xb9\xa3\xba\xa3\xbb\xa3\xbc\xa3\xbd\xa3\xbe\xa3\xbf\xa3\xc0\xa3\xc1\xa3\xc2\xa3\xc3\xa3\xc4\xa3\xc5\xa3\xc6\xa3\xc7\xa3\xc8\xa3\xc9\xa3\xca\xa3\xcb\xa3\xcc\xa3\xcd\xa3\xce\xa3\xcf\xa3\xd0\xa3\xd1\xa3\xd2\xa3\xd3\xa3\xd4\xa3\xd5\xa3\xd6\xa3\xd7\xa3\xd8\xa3\xd9\xa3\xda\xa3\xdb\xa3\xdc\xa3\xdd\xa3\xde\xa3\xdf\xa3\xe0\xa3\xe1\xa3\xe2\xa3\xe3\xa3\xe4\xa3\xe5\xa3\xe6\xa3\xe7\xa3\xe8\xa3\xe9\xa3\xea\xa3\xeb\xa3\xec\xa3\xed\xa3\xee\xa3\xef\xa3\xf0\xa3\xf1\xa3\xf2\xa3\xf3\xa3\xf4\xa3\xf5\xa3\xf6\xa3\xf7\xa3\xf8\xa3\xf9\xa3\xfa\xa3\xfb\xa3\xfc\xa3\xfd\xa1\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe9\xa1\xea\xa9\x56\xa3\xfe\xa9\x57\xa3\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" } }, { "big5-0", { /* 0000 */ NULL, /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xc2\xa2\x58\xa1\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xbe\x00\x00\xa3\xbc\xa3\xbd\xa3\xbf\x00\x00\xa1\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x44\xa3\x45\xa3\x46\xa3\x47\xa3\x48\xa3\x49\xa3\x4a\xa3\x4b\xa3\x4c\xa3\x4d\xa3\x4e\xa3\x4f\xa3\x50\xa3\x51\xa3\x52\xa3\x53\xa3\x54\x00\x00\xa3\x55\xa3\x56\xa3\x57\xa3\x58\xa3\x59\xa3\x5a\xa3\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x5c\xa3\x5d\xa3\x5e\xa3\x5f\xa3\x60\xa3\x61\xa3\x62\xa3\x63\xa3\x64\xa3\x65\xa3\x66\xa3\x67\xa3\x68\xa3\x69\xa3\x6a\xa3\x6b\xa3\x6c\x00\x00\xa3\x6d\xa3\x6e\xa3\x6f\xa3\x70\xa3\x71\xa3\x72\xa3\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ NULL, /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x56\xa1\x58\x00\x00\x00\x00\x00\x00\xa1\xa5\xa1\xa6\x00\x00\x00\x00\xa1\xa7\xa1\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x4c\xa1\x4b\xa1\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xac\x00\x00\x00\x00\xa1\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2100 */ "\x00\x00\x00\x00\x00\x00\xa2\x4a\x00\x00\xa1\xc1\x00\x00\x00\x00\x00\x00\xa2\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xb9\xa2\xba\xa2\xbb\xa2\xbc\xa2\xbd\xa2\xbe\xa2\xbf\xa2\xc0\xa2\xc1\xa2\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf6\xa1\xf4\xa1\xf7\xa1\xf5\x00\x00\x00\x00\xa1\xf8\xa1\xf9\xa1\xfb\xa1\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x41\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd4\x00\x00\x00\x00\x00\x00\xa1\xdb\xa1\xe8\xa1\xe7\x00\x00\x00\x00\xa1\xfd\x00\x00\xa1\xfc\x00\x00\x00\x00\x00\x00\xa1\xe4\xa1\xe5\xa1\xec\x00\x00\x00\x00\xa1\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xef\xa1\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xda\xa1\xdd\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xd8\xa1\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf2\x00\x00\x00\x00\x00\x00\xa1\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ NULL, /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ "\xa2\x77\x00\x00\xa2\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x7a\x00\x00\x00\x00\x00\x00\xa2\x7b\x00\x00\x00\x00\x00\x00\xa2\x7c\x00\x00\x00\x00\x00\x00\xa2\x7d\x00\x00\x00\x00\x00\x00\xa2\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xa4\xf9\xf8\xf9\xe6\xf9\xef\xf9\xdd\xf9\xe8\xf9\xf1\xf9\xdf\xf9\xec\xf9\xf5\xf9\xe3\xf9\xee\xf9\xf7\xf9\xe5\xa2\xa5\xf9\xf2\xf9\xe0\xa2\xa7\xf9\xf4\xf9\xe2\xf9\xe7\xf9\xf0\xf9\xde\xf9\xed\xf9\xf6\xf9\xe4\xa2\xa6\xf9\xf3\xf9\xe1\xa2\x7e\xa2\xa1\xa2\xa3\xa2\xa2\xa2\xac\xa2\xad\xa2\xae\xa1\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\xa2\x62\xa2\x63\xa2\x64\xa2\x65\xa2\x66\xa2\x67\xa2\x68\xa2\x69\xa2\x70\xa2\x6f\xa2\x6e\xa2\x6d\xa2\x6c\xa2\x6b\xa2\x6a\x00\x00\x00\x00\x00\x00\xf9\xfe\xa2\x76\xa2\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xbd\xa1\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xb6\xa1\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xbf\xa1\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xbb\xa1\xba\x00\x00\x00\x00\x00\x00\xa1\xb3\x00\x00\x00\x00\xa1\xb7\xa1\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xa8\xa2\xa9\xa2\xab\xa2\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xb9\xa1\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xf0\x00\x00\xa1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ "\xa1\x40\xa1\x42\xa1\x43\xa1\xb2\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x71\xa1\x72\xa1\x6d\xa1\x6e\xa1\x75\xa1\x76\xa1\x79\xa1\x7a\xa1\x69\xa1\x6a\xa2\x45\x00\x00\xa1\x65\xa1\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xa9\xa1\xaa\x00\x00\x00\x00\xa2\xc3\xa2\xc4\xa2\xc5\xa2\xc6\xa2\xc7\xa2\xc8\xa2\xc9\xa2\xca\xa2\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3080 */ NULL, /* 3100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x74\xa3\x75\xa3\x76\xa3\x77\xa3\x78\xa3\x79\xa3\x7a\xa3\x7b\xa3\x7c\xa3\x7d\xa3\x7e\xa3\xa1\xa3\xa2\xa3\xa3\xa3\xa4\xa3\xa5\xa3\xa6\xa3\xa7\xa3\xa8\xa3\xa9\xa3\xaa\xa3\xab\xa3\xac\xa3\xad\xa3\xae\xa3\xaf\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4\xa3\xb5\xa3\xb6\xa3\xb7\xa3\xb8\xa3\xb9\xa3\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3180 */ NULL, /* 3200 */ NULL, /* 3280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3300 */ NULL, /* 3380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x55\xa2\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x50\xa2\x51\xa2\x52\x00\x00\x00\x00\xa2\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x53\x00\x00\x00\x00\xa1\xeb\xa1\xea\x00\x00\x00\x00\xa2\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ NULL, /* 4080 */ NULL, /* 4100 */ NULL, /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ NULL, /* 4380 */ NULL, /* 4400 */ NULL, /* 4480 */ NULL, /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ NULL, /* 4680 */ NULL, /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ NULL, /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ NULL, /* 4c80 */ NULL, /* 4d00 */ NULL, /* 4d80 */ NULL, /* 4e00 */ "\xa4\x40\xa4\x42\x00\x00\xa4\x43\x00\x00\x00\x00\x00\x00\xc9\x45\xa4\x56\xa4\x54\xa4\x57\xa4\x55\xc9\x46\xa4\xa3\xc9\x4f\xc9\x4d\xa4\xa2\xa4\xa1\x00\x00\x00\x00\xa5\x42\xa5\x41\xa5\x40\x00\x00\xa5\x43\xa4\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xe0\xa5\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xc3\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x58\x00\x00\xa4\xa4\xc9\x50\x00\x00\xa4\xa5\xc9\x63\xa6\xea\xcb\xb1\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x59\xa4\xa6\x00\x00\xa5\x44\xc9\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x40\xa4\x44\x00\x00\xa4\x5b\x00\x00\xc9\x47\xa4\x5c\x00\x00\x00\x00\xa4\xa7\x00\x00\xa5\x45\xa5\x47\xa5\x46\x00\x00\x00\x00\xa5\xe2\xa5\xe3\x00\x00\x00\x00\xa8\xc4\x00\x00\xad\xbc\xa4\x41\x00\x00\x00\x00\xc9\x41\xa4\x45\xa4\x5e\xa4\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xae\xd4\x4b", /* 4e80 */ "\x00\x00\x00\x00\xb6\xc3\xdc\xb1\xdc\xb2\x00\x00\xa4\x46\x00\x00\xa4\xa9\x00\x00\x00\x00\xa8\xc6\xa4\x47\xc9\x48\xa4\x5f\x00\x00\x00\x00\xa4\xaa\xa4\xac\xc9\x51\xa4\xad\xa4\xab\x00\x00\x00\x00\x00\x00\xa5\xe5\x00\x00\xa8\xc7\x00\x00\x00\x00\xa8\xc8\xab\x45\x00\x00\xa4\x60\xa4\xae\x00\x00\xa5\xe6\xa5\xe8\xa5\xe7\x00\x00\xa6\xeb\x00\x00\x00\x00\xa8\xc9\xa8\xca\xab\x46\xab\x47\x00\x00\x00\x00\x00\x00\x00\x00\xad\xbd\x00\x00\x00\x00\xdc\xb3\x00\x00\x00\x00\xf6\xd6\xa4\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xb0\xa4\xaf\xc9\x52\xa4\xb1\xa4\xb7\x00\x00\xa4\xb2\xa4\xb3\xc9\x54\xc9\x53\xa4\xb5\xa4\xb6\x00\x00\xa4\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x4a\xa5\x4b\xa5\x4c\xa5\x4d\xa5\x49\xa5\x50\xc9\x6a\x00\x00\xc9\x66\xc9\x69\xa5\x51\xa5\x61\x00\x00\xc9\x68\x00\x00\xa5\x4e\xa5\x4f\xa5\x48\x00\x00\x00\x00\xc9\x65\xc9\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xf5\xc9\xb0\xa5\xf2\xa5\xf6\xc9\xba\xc9\xae\xa5\xf3\xc9\xb2\x00\x00\x00\x00\x00\x00\xa5\xf4\x00\x00\xa5\xf7\x00\x00\xa5\xe9", /* 4f00 */ "\xc9\xb1\xa5\xf8\xc9\xb5\x00\x00\xc9\xb9\xc9\xb6\x00\x00\x00\x00\xc9\xb3\xa5\xea\xa5\xec\xa5\xf9\x00\x00\xa5\xee\xc9\xab\xa5\xf1\xa5\xef\xa5\xf0\xc9\xbb\xc9\xb8\xc9\xaf\xa5\xed\x00\x00\x00\x00\xc9\xac\xa5\xeb\x00\x00\x00\x00\x00\x00\xc9\xb4\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xad\xca\x66\x00\x00\xa7\x42\xa6\xf4\x00\x00\x00\x00\xca\x67\xa6\xf1\x00\x00\xa7\x44\x00\x00\xa6\xf9\x00\x00\xa6\xf8\xca\x5b\xa6\xfc\xa6\xf7\xca\x60\xca\x68\x00\x00\xca\x64\x00\x00\xa6\xfa\x00\x00\x00\x00\xa6\xfd\xa6\xee\xa7\x47\xca\x5d\x00\x00\x00\x00\xcb\xbd\xa6\xec\xa7\x43\xa6\xed\xa6\xf5\xa6\xf6\xca\x62\xca\x5e\xa6\xfb\xa6\xf3\xca\x5a\xa6\xef\xca\x65\xa7\x45\xa7\x48\xa6\xf2\xa7\x40\xa7\x46\xa6\xf0\xca\x63\xa7\x41\xca\x69\xca\x5c\xa6\xfe\xca\x5f\x00\x00\x00\x00\xca\x61\x00\x00\xa8\xd8\xcb\xbf\xcb\xcb\xa8\xd0\x00\x00\xcb\xcc\xa8\xcb\xa8\xd5\x00\x00\x00\x00\xa8\xce\xcb\xb9\xa8\xd6\xcb\xb8\xcb\xbc\xcb\xc3\xcb\xc1\xa8\xde\xa8\xd9\xcb\xb3\xcb\xb5\xa8\xdb\xa8\xcf", /* 4f80 */ "\xcb\xb6\xcb\xc2\xcb\xc9\xa8\xd4\xcb\xbb\xcb\xb4\xa8\xd3\xcb\xb7\xa8\xd7\xcb\xba\x00\x00\xa8\xd2\x00\x00\xa8\xcd\x00\x00\xa8\xdc\xcb\xc4\xa8\xdd\xcb\xc8\x00\x00\xcb\xc6\xcb\xca\xa8\xda\xcb\xbe\xcb\xb2\x00\x00\xcb\xc0\xa8\xd1\xcb\xc5\xa8\xcc\xcb\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x56\xab\x4a\x00\x00\x00\x00\xcd\xe0\xcd\xe8\x00\x00\xab\x49\xab\x51\xab\x5d\x00\x00\xcd\xee\xcd\xec\xcd\xe7\x00\x00\x00\x00\x00\x00\xab\x4b\xcd\xed\xcd\xe3\xab\x59\xab\x50\xab\x58\xcd\xde\x00\x00\xcd\xea\x00\x00\xcd\xe1\xab\x54\xcd\xe2\x00\x00\xcd\xdd\xab\x5b\xab\x4e\xab\x57\xab\x4d\x00\x00\xcd\xdf\xcd\xe4\x00\x00\xcd\xeb\xab\x55\xab\x52\xcd\xe6\xab\x5a\xcd\xe9\xcd\xe5\xab\x4f\xab\x5c\xab\x53\xab\x4c\xab\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xef\x00\x00\xad\xd7\xad\xc1\x00\x00\xad\xd1\x00\x00\xad\xd6\xd0\xd0\xd0\xcf\xd0\xd4\xd0\xd5\xad\xc4\x00\x00\xad\xcd\x00\x00\x00\x00\x00\x00\xad\xda\x00\x00", /* 5000 */ "\xad\xce\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xc9\xad\xc7\xd0\xca\x00\x00\xad\xdc\x00\x00\xad\xd3\xad\xbe\xad\xbf\xd0\xdd\xb0\xbf\x00\x00\xad\xcc\xad\xcb\xd0\xcb\xad\xcf\xd4\x5b\xad\xc6\xd0\xd6\xad\xd5\xad\xd4\xad\xca\xd0\xce\xd0\xd7\x00\x00\xd0\xc8\xad\xc9\xd0\xd8\xad\xd2\xd0\xcc\xad\xc0\x00\x00\xad\xc3\xad\xc2\xd0\xd9\xad\xd0\xad\xc5\xad\xd9\xad\xdb\xd0\xd3\xad\xd8\x00\x00\xd0\xdb\xd0\xcd\xd0\xdc\x00\x00\xd0\xd1\x00\x00\xd0\xda\x00\x00\xd0\xd2\x00\x00\x00\x00\x00\x00\x00\x00\xad\xc8\x00\x00\x00\x00\x00\x00\xd4\x63\xd4\x57\x00\x00\xb0\xb3\x00\x00\xd4\x5c\xd4\x62\xb0\xb2\xd4\x55\xb0\xb6\xd4\x59\xd4\x52\xb0\xb4\xd4\x56\xb0\xb9\xb0\xbe\x00\x00\xd4\x67\x00\x00\xd4\x51\x00\x00\xb0\xba\x00\x00\xd4\x66\x00\x00\x00\x00\xb0\xb5\xd4\x58\xb0\xb1\xd4\x53\xd4\x4f\xd4\x5d\xd4\x50\xd4\x4e\xd4\x5a\xd4\x60\xd4\x61\xb0\xb7\x00\x00\x00\x00\xd8\x5b\xd4\x5e\xd4\x4d\xd4\x5f\x00\x00\xb0\xc1\xd4\x64\xb0\xc0\xd4\x4c\x00\x00\xd4\x54\xd4\x65\xb0\xbc\xb0\xbb\xb0\xb8\xb0\xbd\x00\x00\x00\x00\xb0\xaf\x00\x00\x00\x00\xb0\xb0\x00\x00\x00\x00", /* 5080 */ "\xb3\xc8\x00\x00\xd8\x5e\xd8\x57\x00\x00\xb3\xc5\x00\x00\xd8\x5f\x00\x00\x00\x00\x00\x00\xd8\x55\xd8\x58\xb3\xc4\xd8\x59\x00\x00\x00\x00\xb3\xc7\xd8\x5d\x00\x00\xd8\x53\xd8\x52\xb3\xc9\x00\x00\xb3\xca\xb3\xc6\xb3\xcb\xd8\x51\xd8\x5c\xd8\x5a\xd8\x54\x00\x00\x00\x00\x00\x00\xb3\xc3\xd8\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xca\xb6\xc4\xdc\xb7\xb6\xcd\xdc\xbd\xdc\xc0\xb6\xc6\xb6\xc7\xdc\xba\xb6\xc5\xdc\xc3\xb6\xcb\xdc\xc4\x00\x00\xdc\xbf\xb6\xcc\x00\x00\xdc\xb4\xb6\xc9\xdc\xb5\x00\x00\xdc\xbe\xdc\xbc\x00\x00\xdc\xb8\xb6\xc8\xdc\xb6\xb6\xce\xdc\xbb\xdc\xc2\xdc\xb9\xdc\xc1\x00\x00\x00\x00\xb9\xb6\xb9\xb3\x00\x00\xb9\xb4\x00\x00\xe0\xf9\xe0\xf1\xb9\xb2\xb9\xaf\xe0\xf2\x00\x00\x00\x00\xb9\xb1\xe0\xf5\x00\x00\xe0\xf7\x00\x00\x00\x00\xe0\xfe\x00\x00\x00\x00\xe0\xfd\xe0\xf8\xb9\xae\xe0\xf0\xb9\xac\xe0\xf3\xb9\xb7\xe0\xf6\x00\x00\xe0\xfa\xb9\xb0\xb9\xad\xe0\xfc\xe0\xfb\xb9\xb5\x00\x00\xe0\xf4\x00\x00\xbb\xf8\xe4\xec\x00\x00\xe4\xe9\xbb\xf9\x00\x00\xbb\xf7\x00\x00\xe4\xf0\xe4\xed\xe4\xe6", /* 5100 */ "\xbb\xf6\x00\x00\xbb\xfa\xe4\xe7\xbb\xf5\xbb\xfd\xe4\xea\xe4\xeb\xbb\xfb\xbb\xfc\xe4\xf1\xe4\xee\xe4\xef\x00\x00\x00\x00\x00\x00\xbe\xaa\xe8\xf8\xbe\xa7\xe8\xf5\xbe\xa9\xbe\xab\x00\x00\xe8\xf6\xbe\xa8\x00\x00\xe8\xf7\x00\x00\xe8\xf4\x00\x00\x00\x00\xc0\x76\xec\xbd\xc0\x77\xec\xbb\x00\x00\xec\xbc\xec\xba\xec\xb9\x00\x00\x00\x00\xec\xbe\xc0\x75\x00\x00\x00\x00\xef\xb8\xef\xb9\x00\x00\xe4\xe8\xef\xb7\xc0\x78\xc3\x5f\xf1\xeb\xf1\xec\x00\x00\xc4\xd7\xc4\xd8\xf5\xc1\xf5\xc0\xc5\x6c\xc5\x6b\xf7\xd0\x00\x00\xa4\x49\xa4\x61\xa4\xb9\x00\x00\xa4\xb8\xa5\x53\xa5\x52\xa5\xfc\xa5\xfb\xa5\xfd\xa5\xfa\x00\x00\xa7\x4a\xa7\x49\xa7\x4b\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xe0\x00\x00\xa8\xdf\xa8\xe1\x00\x00\xab\x5e\x00\x00\xa2\x59\xd0\xde\xa2\x5a\xb0\xc2\xa2\x5c\xa2\x5b\xd8\x60\x00\x00\xa2\x5d\xb9\xb8\xa2\x5e\x00\x00\xa4\x4a\x00\x00\xa4\xba\xa5\xfe\xa8\xe2\x00\x00\xa4\x4b\xa4\xbd\xa4\xbb\xa4\xbc\x00\x00\x00\x00\xa6\x40\x00\x00\x00\x00\x00\x00\xa7\x4c\xa8\xe4\xa8\xe3\xa8\xe5\x00\x00\x00\x00\x00\x00\xad\xdd\x00\x00\x00\x00\x00\x00", /* 5180 */ "\xbe\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x4e\x00\x00\xa5\x54\xa5\x55\x00\x00\x00\x00\xa6\x41\x00\x00\xca\x6a\x00\x00\xab\x60\xab\x5f\xd0\xe0\xd0\xdf\xb0\xc3\x00\x00\xa4\xbe\xc9\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xcd\x00\x00\xab\x61\x00\x00\xad\xe0\x00\x00\xad\xde\xad\xdf\x00\x00\x00\x00\x00\x00\x00\x00\xbe\xad\x00\x00\xa5\x56\x00\x00\x00\x00\x00\x00\xa6\x42\xc9\xbc\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x4d\xa7\x4e\x00\x00\xca\x6b\x00\x00\x00\x00\xcb\xce\xa8\xe6\xcb\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xe2\xd0\xe3\xad\xe3\x00\x00\xd0\xe4\x00\x00\xd0\xe1\xad\xe4\xad\xe2\xad\xe1\xd0\xe5\x00\x00\xd4\x68\x00\x00\x00\x00\x00\x00\xd8\x61\x00\x00\x00\x00\xdc\xc5\xe1\x40\x00\x00\x00\x00\x00\x00\xbb\xfe\xbe\xae\xe8\xf9\x00\x00\xa4\x4c\xa4\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xc4\xb3\xcd\x00\x00\xb9\xb9\x00\x00\xc9\x42\xa4\xbf\x00\x00\xa5\x59\xa5\x57\xa5\x58\x00\x00\x00\x00\xa8\xe7\x00\x00\x00\x00", /* 5200 */ "\xa4\x4d\xa4\x4e\x00\x00\xa4\x62\x00\x00\x00\x00\xa4\xc0\xa4\xc1\xa4\xc2\xc9\xbe\xa5\x5a\x00\x00\xc9\x6b\x00\x00\xa6\x46\x00\x00\xc9\xbf\xa6\x44\xa6\x45\xc9\xbd\x00\x00\x00\x00\xa6\x47\xa6\x43\x00\x00\x00\x00\x00\x00\x00\x00\xca\x6c\xaa\xec\xca\x6d\x00\x00\x00\x00\xca\x6e\x00\x00\x00\x00\xa7\x50\xa7\x4f\x00\x00\x00\x00\xa7\x53\xa7\x51\xa7\x52\x00\x00\x00\x00\x00\x00\xa8\xed\x00\x00\xa8\xec\xcb\xd4\xcb\xd1\xcb\xd2\x00\x00\xcb\xd0\xa8\xee\xa8\xea\xa8\xe9\x00\x00\xa8\xeb\xa8\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xef\x00\x00\xab\x63\xcd\xf0\x00\x00\xcb\xd3\xab\x68\x00\x00\xcd\xf1\xab\x64\xab\x67\xab\x66\xab\x65\xab\x62\x00\x00\x00\x00\x00\x00\xd0\xe8\x00\x00\xad\xe7\xd0\xeb\xad\xe5\x00\x00\x00\x00\x00\x00\xd0\xe7\xad\xe8\xad\xe6\xad\xe9\xd0\xe9\xd0\xea\x00\x00\xd0\xe6\xd0\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xd1\xb0\xc5\xd4\x69\xd4\x6b\xd4\x6a\xd4\x6c\xb0\xc6\x00\x00\x00\x00\xb3\xce\x00\x00\xb3\xcf\xb3\xd0\x00\x00\xb6\xd0\xdc\xc7\x00\x00\xdc\xc6\xdc\xc8\xdc\xc9\xb6\xd1\x00\x00\xb6\xcf", /* 5280 */ "\xe1\x41\xe1\x42\xb9\xbb\xb9\xba\xe3\x5a\x00\x00\x00\x00\xbc\x40\xbc\x41\xbc\x42\xbc\x44\xe4\xf2\xe4\xf3\xbc\x43\x00\x00\x00\x00\x00\x00\xbe\xaf\x00\x00\xbe\xb0\x00\x00\x00\x00\xf1\xed\xf5\xc3\xf5\xc2\xf7\xd1\x00\x00\xa4\x4f\x00\x00\x00\x00\x00\x00\xa5\x5c\xa5\x5b\x00\x00\x00\x00\xa6\x48\x00\x00\x00\x00\xc9\xc0\x00\x00\x00\x00\xa7\x55\xa7\x56\xa7\x54\xa7\x57\xca\x6f\xca\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xf1\xcb\xd5\x00\x00\xa8\xf0\x00\x00\xcd\xf2\xab\x6c\xcd\xf3\xab\x6b\x00\x00\x00\x00\x00\x00\xab\x69\x00\x00\xab\x6a\x00\x00\x00\x00\x00\x00\xd0\xed\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xc7\xd4\x6e\x00\x00\xb0\xca\xd4\x6d\xb1\xe5\xb0\xc9\xb0\xc8\x00\x00\xb3\xd4\x00\x00\xb3\xd3\xb3\xd2\xb6\xd2\x00\x00\x00\x00\xb6\xd5\xb6\xd6\xb6\xd4\x00\x00\xb6\xd3\x00\x00\x00\x00\xe1\x43\x00\x00\xe1\x44\x00\x00\x00\x00\x00\x00\xe4\xf5\xbc\x45\xe4\xf4\x00\x00\xbe\xb1\xec\xbf\xc0\x79\x00\x00\xf1\xee\xc4\x55\x00\x00\xa4\x63\xa4\xc3\xc9\x56\x00\x00\xa4\xc4\xa4\xc5", /* 5300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x5d\xa5\x5e\x00\x00\xa6\x49\xca\x71\xcb\xd6\xcb\xd7\x00\x00\xab\x6d\xd0\xee\xb0\xcc\xb0\xcb\xd8\x63\xd8\x62\x00\x00\x00\x00\xa4\x50\xa4\xc6\xa5\x5f\x00\x00\xb0\xcd\xc9\x43\x00\x00\xc9\x6c\xa5\x60\x00\x00\xc9\xc2\xa6\x4b\xa6\x4a\xc9\xc1\xa7\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xea\x00\x00\x00\x00\xd4\x6f\x00\x00\xb6\xd7\xe1\x45\xb9\xbc\x00\x00\x00\x00\xe8\xfa\x00\x00\x00\x00\xf3\xfd\x00\x00\xa4\xc7\x00\x00\x00\x00\xcb\xd8\xcd\xf4\xb0\xd0\xb0\xce\xb0\xcf\xa4\x51\x00\x00\xa4\x64\xa2\xcd\xa4\xca\x00\x00\xa4\xc9\xa4\xc8\xa5\x63\xa5\x62\x00\x00\xc9\x6d\xc9\xc3\x00\x00\x00\x00\x00\x00\xa8\xf5\xa8\xf2\xa8\xf4\xa8\xf3\x00\x00\x00\x00\xab\x6e\x00\x00\x00\x00\xb3\xd5\x00\x00\xa4\x52\x00\x00\xa4\xcb\x00\x00\xa5\x65\xa5\x64\x00\x00\xca\x72\x00\x00\x00\x00\xa8\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x57\x00\x00\xa5\x67\xa5\x66\xa6\x4c\xa6\x4d\xca\x73\xa7\x59\x00\x00\xa7\x5a\x00\x00\xa8\xf7\xa8\xf8\xa8\xf9\x00\x00\xab\x6f\xcd\xf5\x00\x00\x00\x00\xad\xeb", /* 5380 */ "\x00\x00\x00\x00\xc9\x44\x00\x00\xa4\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xc4\x00\x00\x00\x00\x00\x00\xca\x74\xca\x75\x00\x00\x00\x00\xcb\xd9\x00\x00\xcb\xda\x00\x00\xcd\xf7\xcd\xf6\xcd\xf9\xcd\xf8\xab\x70\x00\x00\xd4\x70\xad\xed\xd0\xef\xad\xec\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x64\xb3\xd6\x00\x00\xd8\x65\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x46\xb9\xbd\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x46\x00\x00\xf1\xef\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x58\x00\x00\xa5\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xd1\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x53\xa4\x65\xa4\xce\xa4\xcd\x00\x00\xa4\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xfb\x00\x00\xa8\xfa\xa8\xfc\x00\x00\x00\x00\x00\x00\xab\x71\x00\x00\x00\x00\x00\x00\xad\xee\x00\x00\xe8\xfb\xc2\x4f\xa4\x66\xa5\x6a\xa5\x79\xa5\x74\x00\x00\xa5\x6f\xa5\x6e\xa5\x75\xa5\x73\xa5\x6c\xa5\x7a\xa5\x6d\xa5\x69\xa5\x78\xa5\x77\xa5\x76\xa5\x6b\x00\x00\xa5\x72\x00\x00\x00\x00\xa5\x71\x00\x00\x00\x00\xa5\x7b\xa5\x70\x00\x00\x00\x00\x00\x00", /* 5400 */ "\x00\x00\xa6\x53\x00\x00\xa6\x59\xa6\x55\x00\x00\xa6\x5b\xc9\xc5\xa6\x58\xa6\x4e\xa6\x51\xa6\x54\xa6\x50\xa6\x57\xa6\x5a\xa6\x4f\xa6\x52\xa6\x56\xa6\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x7e\xca\x7b\x00\x00\xa7\x67\xca\x7c\xa7\x5b\xa7\x5d\xa7\x75\xa7\x70\x00\x00\x00\x00\x00\x00\xca\xa5\xca\x7d\xa7\x5f\xa7\x61\xca\xa4\xa7\x68\xca\x78\xa7\x74\xa7\x76\xa7\x5c\xa7\x6d\x00\x00\xca\x76\xa7\x73\x00\x00\xa7\x64\x00\x00\xa7\x6e\xa7\x6f\xca\x77\xa7\x6c\xa7\x6a\x00\x00\xa7\x6b\xa7\x71\xca\xa1\xa7\x5e\x00\x00\xa7\x72\xca\xa3\xa7\x66\xa7\x63\x00\x00\xca\x7a\xa7\x62\xca\xa6\xa7\x65\x00\x00\xa7\x69\x00\x00\x00\x00\x00\x00\xa7\x60\xca\xa2\x00\x00\x00\x00\x00\x00\x00\x00\xca\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xeb\xcb\xea\xa9\x4f\xcb\xed\xcb\xef\xcb\xe4\xcb\xe7\xcb\xee\xa9\x50\x00\x00\x00\x00\xcb\xe1\xcb\xe5\x00\x00\x00\x00\xcb\xe9\xce\x49\xa9\x4b\xce\x4d\xa8\xfd\xcb\xe6\xa8\xfe\xa9\x4c\xa9\x45\xa9\x41\x00\x00\xcb\xe2\xa9\x44\xa9\x49\xa9\x52\xcb\xe3\xcb\xdc", /* 5480 */ "\xa9\x43\xcb\xdd\xcb\xdf\x00\x00\xa9\x46\x00\x00\xa9\x48\xcb\xdb\xcb\xe0\x00\x00\x00\x00\xa9\x51\xa9\x4d\xcb\xe8\xa9\x53\x00\x00\xa9\x4a\xcb\xde\xa9\x47\x00\x00\x00\x00\xa9\x42\xa9\x40\x00\x00\xcb\xec\x00\x00\xa9\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x48\xcd\xfb\xce\x4b\x00\x00\x00\x00\xcd\xfd\xab\x78\xab\xa8\xab\x74\xab\xa7\xab\x7d\xab\xa4\xab\x72\xcd\xfc\xce\x43\xab\xa3\xce\x4f\xab\xa5\x00\x00\xab\x79\x00\x00\x00\x00\xce\x45\xce\x42\xab\x77\x00\x00\xcd\xfa\xab\xa6\xce\x4a\xab\x7c\xce\x4c\xab\xa9\xab\x73\xab\x7e\xab\x7b\xce\x40\xab\xa1\xce\x46\xce\x47\xab\x7a\xab\xa2\xab\x76\x00\x00\x00\x00\x00\x00\x00\x00\xab\x75\xcd\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x4e\x00\x00\xd1\x44\xad\xfb\xd0\xf1\x00\x00\xd0\xf6\xad\xf4\xae\x40\xd0\xf4\xad\xef\xad\xf9\xad\xfe\xd0\xfb\x00\x00\xad\xfa\xad\xfd\x00\x00\x00\x00\xd0\xfe\xad\xf5\xd0\xf5\x00\x00\x00\x00\x00\x00\xd1\x42\xd1\x43\x00\x00\xad\xf7\xd1\x41\xad\xf3\xae\x43\x00\x00\xd0\xf8", /* 5500 */ "\x00\x00\xad\xf1\x00\x00\xd1\x46\xd0\xf9\xd0\xfd\xad\xf6\xae\x42\xd0\xfa\xad\xfc\xd1\x40\xd1\x47\xd4\xa1\x00\x00\xd1\x45\xae\x44\xad\xf0\xd0\xfc\xd0\xf3\x00\x00\xad\xf8\x00\x00\x00\x00\xd0\xf2\x00\x00\x00\x00\xd0\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0\xae\x41\x00\x00\x00\x00\xd4\x77\x00\x00\xb0\xe4\xd4\xa7\xb0\xe2\xb0\xdf\xd4\x7c\xb0\xdb\xd4\xa2\xb0\xe6\xd4\x76\xd4\x7b\xd4\x7a\xad\xf2\xb0\xe1\xd4\xa5\x00\x00\xd4\xa8\xd4\x73\x00\x00\xb3\xe8\x00\x00\xd4\xa9\xb0\xe7\x00\x00\xb0\xd9\xb0\xd6\xd4\x7e\xb0\xd3\x00\x00\xd4\xa6\x00\x00\xb0\xda\xd4\xaa\x00\x00\xd4\x74\xd4\xa4\xb0\xdd\xd4\x75\xd4\x78\xd4\x7d\x00\x00\x00\x00\xb0\xde\xb0\xdc\xb0\xe8\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xe3\x00\x00\xb0\xd7\xb1\xd2\x00\x00\xb0\xd8\xd4\x79\xb0\xe5\xb0\xe0\xd4\xa3\xb0\xd5\x00\x00\x00\x00\x00\x00\xb0\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x71\xd4\x72\xd8\x6a\x00\x00\x00\x00\x00\x00\xb3\xd7\xb3\xda\xd8\x75\xb3\xee\xd8\x78", /* 5580 */ "\xb3\xd8\xd8\x71\xb3\xde\xb3\xe4\xb5\xbd\x00\x00\x00\x00\xb3\xe2\xd8\x6e\xb3\xef\xb3\xdb\xb3\xe3\xd8\x76\xdc\xd7\xd8\x7b\xd8\x6f\x00\x00\xd8\x66\xd8\x73\xd8\x6d\xb3\xe1\xd8\x79\x00\x00\x00\x00\xb3\xdd\xb3\xf1\xb3\xea\x00\x00\xb3\xdf\xb3\xdc\x00\x00\xb3\xe7\x00\x00\xd8\x7a\xd8\x6c\xd8\x72\xd8\x74\xd8\x68\xd8\x77\xb3\xd9\xd8\x67\x00\x00\xb3\xe0\xb3\xf0\xb3\xec\xd8\x69\xb3\xe6\x00\x00\x00\x00\xb3\xed\xb3\xe9\xb3\xe5\x00\x00\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xeb\x00\x00\x00\x00\x00\x00\xdc\xd5\xdc\xd1\x00\x00\xdc\xe0\xdc\xca\xdc\xd3\xb6\xe5\xb6\xe6\xb6\xde\xdc\xdc\xb6\xe8\xdc\xcf\xdc\xce\xdc\xcc\xdc\xde\xb6\xdc\xdc\xd8\xdc\xcd\xb6\xdf\xdc\xd6\xb6\xda\xdc\xd2\xdc\xd9\xdc\xdb\x00\x00\x00\x00\xdc\xdf\xb6\xe3\xdc\xcb\xb6\xdd\xdc\xd0\x00\x00\xb6\xd8\x00\x00\xb6\xe4\xdc\xda\xb6\xe0\xb6\xe1\xb6\xe7\xb6\xdb\xa2\x5f\xb6\xd9\xdc\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xe2\x00\x00\x00\x00\xdc\xdd\x00\x00\x00\x00\x00\x00\xb9\xcd\xb9\xc8\x00\x00\xe1\x55\xe1\x51\x00\x00\xe1\x4b\xb9\xc2\xb9\xbe\xe1\x54", /* 5600 */ "\xb9\xbf\xe1\x4e\xe1\x50\x00\x00\xe1\x53\x00\x00\xb9\xc4\x00\x00\xb9\xcb\xb9\xc5\x00\x00\x00\x00\xe1\x49\xb9\xc6\xb9\xc7\xe1\x4c\xb9\xcc\x00\x00\xe1\x4a\xe1\x4f\xb9\xc3\xe1\x48\xb9\xc9\xb9\xc1\x00\x00\x00\x00\x00\x00\xb9\xc0\xe1\x4d\xe1\x52\x00\x00\xb9\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x47\x00\x00\xbc\x4d\xe5\x47\x00\x00\xe5\x44\x00\x00\xbc\x47\xbc\x53\xbc\x54\x00\x00\xbc\x4a\xe5\x42\xbc\x4c\xe4\xf9\xbc\x52\x00\x00\xe5\x46\xbc\x49\xe5\x48\xbc\x48\x00\x00\xe5\x43\xe5\x45\xbc\x4b\xe5\x41\xe4\xfa\xe4\xf7\x00\x00\x00\x00\xd8\x6b\xe4\xfd\x00\x00\xe4\xf6\xe4\xfc\xe4\xfb\x00\x00\xe4\xf8\x00\x00\xbc\x4f\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x4e\x00\x00\x00\x00\x00\x00\xbc\x50\xe4\xfe\xbe\xb2\xe5\x40\x00\x00\x00\x00\x00\x00\xe9\x45\x00\x00\xe8\xfd\x00\x00\xbe\xbe\xe9\x42\xbe\xb6\xbe\xba\xe9\x41\x00\x00\xbe\xb9\xbe\xb5\xbe\xb8\xbe\xb3\xbe\xbd\xe9\x43\xe8\xfe\xbe\xbc\xe8\xfc\xbe\xbb\xe9\x44\xe9\x40\xbc\x51\x00\x00\xbe\xbf\xe9\x46\xbe\xb7\xbe\xb4\x00\x00\x00\x00\x00\x00\x00\x00\xec\xc6\xec\xc8", /* 5680 */ "\xc0\x7b\xec\xc9\xec\xc7\xec\xc5\xec\xc4\xc0\x7d\xec\xc3\xc0\x7e\x00\x00\x00\x00\x00\x00\x00\x00\xec\xc1\xec\xc2\xc0\x7a\xc0\xa1\xc0\x7c\x00\x00\x00\x00\xec\xc0\x00\x00\xc2\x50\x00\x00\xef\xbc\xef\xba\xef\xbf\xef\xbd\x00\x00\xef\xbb\xef\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x60\xf1\xf2\xf1\xf3\xc4\x56\x00\x00\xf1\xf4\xf1\xf0\xf1\xf5\xf1\xf1\xc2\x51\x00\x00\x00\x00\x00\x00\xf3\xfe\xf4\x41\xc4\x59\xf4\x40\xc4\x58\xc4\x57\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x5a\xf5\xc5\xf5\xc6\x00\x00\xc4\xda\xc4\xd9\xc4\xdb\xf5\xc4\x00\x00\xf6\xd8\xf6\xd7\x00\x00\xc5\x6d\xc5\x6f\xc5\x6e\xf6\xd9\xc5\xc8\xf8\xa6\x00\x00\x00\x00\x00\x00\xc5\xf1\x00\x00\xf8\xa5\xf8\xee\x00\x00\x00\x00\xc9\x49\x00\x00\x00\x00\xa5\x7d\xa5\x7c\x00\x00\xa6\x5f\xa6\x5e\xc9\xc7\xa6\x5d\xc9\xc6\x00\x00\x00\x00\xa7\x79\xca\xa9\x00\x00\xca\xa8\x00\x00\x00\x00\xa7\x77\xa7\x7a\x00\x00\x00\x00\xca\xa7\x00\x00\xa7\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xf0\x00\x00\xcb\xf1\xa9\x54\x00\x00\x00\x00\x00\x00\x00\x00\xab\xaa", /* 5700 */ "\x00\x00\xd1\x48\xd1\x49\xae\x45\xae\x46\x00\x00\x00\x00\xd4\xac\xb0\xe9\xb0\xeb\xd4\xab\xb0\xea\xd8\x7c\xb3\xf2\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xe9\xb6\xea\xdc\xe1\x00\x00\xb9\xcf\x00\x00\xb9\xce\x00\x00\xe5\x49\xe9\x48\xe9\x47\x00\x00\xf9\x6b\xa4\x67\xc9\x59\x00\x00\xc9\x6e\xc9\x6f\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x62\xa6\x66\xc9\xc9\x00\x00\xa6\x64\xa6\x63\xc9\xc8\xa6\x65\xa6\x61\x00\x00\x00\x00\xa6\x60\xc9\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\xa6\x00\x00\x00\x00\xa7\xa3\x00\x00\xa7\x7d\xca\xaa\x00\x00\x00\x00\x00\x00\xca\xab\x00\x00\xa7\xa1\x00\x00\xca\xad\xa7\x7b\xca\xae\xca\xac\xa7\x7e\xa7\xa2\xa7\xa5\xa7\xa4\xa7\x7c\xca\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x59\xcb\xfe\x00\x00\xa9\x5b\x00\x00\xa9\x5a\x00\x00\xcc\x40\xa9\x58\xa9\x57\xcb\xf5\x00\x00\xcb\xf4\x00\x00\xcb\xf2\xcb\xf7\xcb\xf6\xcb\xf3\xcb\xfc\xcb\xfd\xcb\xfa\xcb\xf8\xa9\x56\x00\x00\x00\x00\x00\x00\xcb\xfb\xa9\x5c\xcc\x41\x00\x00\x00\x00", /* 5780 */ "\xcb\xf9\x00\x00\xab\xab\xa9\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xac\xce\x54\x00\x00\x00\x00\xce\x5a\x00\x00\x00\x00\x00\x00\xab\xb2\xce\x58\xce\x5e\x00\x00\xce\x55\xce\x59\xce\x5b\xce\x5d\xce\x57\x00\x00\xce\x56\xce\x51\xce\x52\xab\xad\x00\x00\xab\xaf\xab\xae\xce\x53\xce\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x50\xd1\x53\x00\x00\xd1\x52\xd1\x57\xd1\x4e\x00\x00\xd1\x51\xd1\x50\x00\x00\xd1\x54\x00\x00\xd1\x58\xae\x47\xae\x4a\x00\x00\x00\x00\xd1\x4f\xd1\x55\x00\x00\x00\x00\x00\x00\xae\x49\xd1\x4a\x00\x00\xab\xb0\xd4\xba\xd1\x56\x00\x00\xd1\x4d\x00\x00\xae\x48\xd1\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\xb1\x00\x00\x00\x00\xb0\xec\xb0\xf0\xd4\xc1\xd4\xaf\xd4\xbd\xb0\xf1\xd4\xbf\x00\x00\xd4\xc5\x00\x00\xd4\xc9\x00\x00\x00\x00\xd4\xc0\xd4\xb4\xd4\xbc\x00\x00\xd4\xca\xd4\xc8\xd4\xbe\xd4\xb9\xd4\xb2\xd8\xa6\xd4\xb0\xb0\xf5\xd4\xb7\xb0\xf6\xb0\xf2\xd4\xad\xd4\xc3\xd4\xb5\x00\x00\x00\x00", /* 5800 */ "\xd4\xb3\xd4\xc6\xb0\xf3\x00\x00\xd4\xcc\xb0\xed\xb0\xef\xd4\xbb\xd4\xb6\xae\x4b\xb0\xee\xd4\xb8\xd4\xc7\xd4\xcb\xd4\xc2\x00\x00\xd4\xc4\x00\x00\x00\x00\x00\x00\xd4\xae\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xa1\x00\x00\xd8\xaa\xd8\xa9\xb3\xfa\xd8\xa2\x00\x00\xb3\xfb\xb3\xf9\x00\x00\xd8\xa4\xb3\xf6\xd8\xa8\x00\x00\xd8\xa3\xd8\xa5\xd8\x7d\xb3\xf4\x00\x00\xd8\xb2\xd8\xb1\xd8\xae\xb3\xf3\xb3\xf7\xb3\xf8\xd1\x4b\xd8\xab\xb3\xf5\xb0\xf4\xd8\xad\xd8\x7e\xd8\xb0\xd8\xaf\x00\x00\xd8\xb3\x00\x00\xdc\xef\x00\x00\xd8\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xa7\xdc\xe7\xb6\xf4\xb6\xf7\xb6\xf2\xdc\xe6\xdc\xea\xdc\xe5\x00\x00\xb6\xec\xb6\xf6\xdc\xe2\xb6\xf0\xdc\xe9\x00\x00\xb6\xee\xb6\xed\xdc\xec\xb6\xef\xdc\xee\x00\x00\xdc\xeb\xb6\xeb\x00\x00\x00\x00\x00\x00\xb6\xf5\xdc\xf0\xdc\xe4\xdc\xed\x00\x00\x00\x00\xdc\xe3\x00\x00\x00\x00\xb6\xf1\x00\x00\xb6\xf3\x00\x00\xdc\xe8\x00\x00\xdc\xf1\x00\x00\x00\x00\xe1\x5d\xb9\xd0\xe1\x63\x00\x00\x00\x00\xb9\xd5\xe1\x5f\xe1\x66\xe1\x57\xb9\xd7\xb9\xd1\xe1\x5c", /* 5880 */ "\xbc\x55\xe1\x5b\xe1\x64\xb9\xd2\x00\x00\xb9\xd6\xe1\x5a\xe1\x60\xe1\x65\xe1\x56\xb9\xd4\xe1\x5e\x00\x00\x00\x00\xe1\x62\xe1\x68\xe1\x58\xe1\x61\x00\x00\xb9\xd3\xe1\x67\x00\x00\x00\x00\x00\x00\xe1\x59\x00\x00\x00\x00\x00\x00\xbc\x59\xe5\x4b\xbc\x57\xbc\x56\xe5\x4d\xe5\x52\x00\x00\xe5\x4e\x00\x00\xe5\x51\xbc\x5c\x00\x00\xbe\xa5\xbc\x5b\x00\x00\xe5\x4a\xe5\x50\x00\x00\xbc\x5a\xe5\x4f\x00\x00\xe5\x4c\x00\x00\xbc\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x4d\xf9\xd9\xe9\x4f\xe9\x4a\xbe\xc1\xe9\x4c\x00\x00\xbe\xc0\xe9\x4e\x00\x00\x00\x00\xbe\xc3\xe9\x50\xbe\xc2\xe9\x49\xe9\x4b\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa5\xec\xcc\x00\x00\xc0\xa4\xec\xcd\xc0\xa3\xec\xcb\xc0\xa2\xec\xca\x00\x00\xc2\x53\xc2\x52\xf1\xf6\xf1\xf8\x00\x00\xf1\xf7\xc3\x61\xc3\x62\x00\x00\x00\x00\xc3\x63\xf4\x42\xc4\x5b\x00\x00\x00\x00\xf7\xd3\xf7\xd2\xc5\xf2\x00\x00\xa4\x68\xa4\xd0\x00\x00\x00\x00\xa7\xa7\x00\x00\x00\x00\x00\x00\x00\x00\xce\x5f\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xfc\xb3\xfd\x00\x00\xdc\xf2\xb9\xd8\xe1\x69\xe5\x53", /* 5900 */ "\x00\x00\x00\x00\x00\x00\xc9\x5a\x00\x00\x00\x00\xca\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x42\xce\x60\xd1\x59\xae\x4c\x00\x00\x00\x00\xf1\xf9\x00\x00\xc4\xdc\xa4\x69\xa5\x7e\xc9\x70\x00\x00\xa6\x67\xa6\x68\x00\x00\xa9\x5d\x00\x00\x00\x00\x00\x00\xb0\xf7\x00\x00\xb9\xda\x00\x00\xb9\xdb\xb9\xd9\x00\x00\xa4\x6a\x00\x00\xa4\xd1\xa4\xd3\xa4\xd2\xc9\x5b\xa4\xd4\xa5\xa1\xc9\x71\x00\x00\xa5\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x69\xa6\x6a\x00\x00\x00\x00\x00\x00\xc9\xcb\x00\x00\xa7\xa8\x00\x00\xca\xb1\x00\x00\x00\x00\x00\x00\xa9\x61\xcc\x43\x00\x00\xa9\x5f\xa9\x60\xa9\x5e\xd1\x5a\x00\x00\x00\x00\x00\x00\xab\xb6\xab\xb5\xab\xb7\xab\xb4\x00\x00\xce\x61\xa9\x62\xab\xb3\x00\x00\xae\x4d\xae\x4e\x00\x00\xae\x4f\x00\x00\xd4\xcd\x00\x00\x00\x00\x00\x00\xb3\xfe\xd8\xb4\xb0\xf8\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xf8\x00\x00\xb9\xdd\xb9\xdc\xe1\x6a\x00\x00\xbc\x5d\xbe\xc4\x00\x00\xef\xc0\xf6\xda\xf7\xd4\xa4\x6b\xa5\xa3\x00\x00\xa5\xa4\xc9\xd1\xa6\x6c\xa6\x6f\x00\x00\xc9\xcf\xc9\xcd\xa6\x6e\xc9\xd0\xc9\xd2", /* 5980 */ "\xc9\xcc\xa6\x71\xa6\x70\xa6\x6d\xa6\x6b\xc9\xce\x00\x00\x00\x00\x00\x00\x00\x00\xa7\xb3\x00\x00\x00\x00\xa7\xb0\xca\xb6\xca\xb9\xca\xb8\x00\x00\xa7\xaa\xa7\xb2\x00\x00\x00\x00\xa7\xaf\xca\xb5\xca\xb3\xa7\xae\x00\x00\x00\x00\x00\x00\xa7\xa9\xa7\xac\x00\x00\xca\xb4\xca\xbb\xca\xb7\xa7\xad\xa7\xb1\xa7\xb4\xca\xb2\xca\xba\xa7\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x67\xa9\x6f\x00\x00\xcc\x4f\xcc\x48\xa9\x70\xcc\x53\xcc\x44\xcc\x4b\x00\x00\x00\x00\xa9\x66\xcc\x45\xa9\x64\xcc\x4c\xcc\x50\xa9\x63\x00\x00\xcc\x51\xcc\x4a\x00\x00\xcc\x4d\x00\x00\xa9\x72\xa9\x69\xcc\x54\xcc\x52\x00\x00\xa9\x6e\xa9\x6c\xcc\x49\xa9\x6b\xcc\x47\xcc\x46\xa9\x6a\xa9\x68\xa9\x71\xa9\x6d\xa9\x65\x00\x00\xcc\x4e\x00\x00\xab\xb9\x00\x00\xab\xc0\xce\x6f\xab\xb8\xce\x67\xce\x63\x00\x00\xce\x73\xce\x62\x00\x00\xab\xbb\xce\x6c\xab\xbe\xab\xc1\x00\x00\xab\xbc\xce\x70\xab\xbf\x00\x00\xae\x56\xce\x76\xce\x64\x00\x00\x00\x00\xce\x66\xce\x6d\xce\x71\xce\x75\xce\x72\xce\x6b\xce\x6e\x00\x00\x00\x00\xce\x68\xab\xc3\xce\x6a\xce\x69\xce\x74\xab\xba", /* 5a00 */ "\xce\x65\xab\xc2\x00\x00\xab\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x5c\xd1\x62\x00\x00\xae\x5b\x00\x00\x00\x00\xd1\x60\x00\x00\xae\x50\x00\x00\xae\x55\x00\x00\xd1\x5f\xd1\x5c\xd1\x61\xae\x51\xd1\x5b\x00\x00\xae\x54\xae\x52\x00\x00\xd1\x63\xae\x53\xae\x57\x00\x00\x00\x00\xae\x58\x00\x00\xae\x5a\x00\x00\x00\x00\x00\x00\xae\x59\x00\x00\x00\x00\x00\x00\xd1\x5d\xd1\x5e\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x64\x00\x00\xd4\xd4\xb0\xf9\xd8\xc2\xd4\xd3\xd4\xe6\x00\x00\x00\x00\xb1\x40\x00\x00\xd4\xe4\x00\x00\xb0\xfe\xb0\xfa\xd4\xed\xd4\xdd\xd4\xe0\x00\x00\xb1\x43\xd4\xea\xd4\xe2\xb0\xfb\xb1\x44\x00\x00\xd4\xe7\xd4\xe5\x00\x00\x00\x00\xd4\xd6\xd4\xeb\xd4\xdf\xd4\xda\x00\x00\xd4\xd0\xd4\xec\xd4\xdc\xd4\xcf\x00\x00\xb1\x42\xd4\xe1\xd4\xee\xd4\xde\xd4\xd2\xd4\xd7\xd4\xce\x00\x00\xb1\x41\x00\x00\xd4\xdb\xd4\xd8\xb0\xfc\xd4\xd1\x00\x00\xd4\xe9\xb0\xfd\x00\x00\xd4\xd9\xd4\xd5\x00\x00\x00\x00\xd4\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x40\xd8\xbb\x00\x00\xd8\xb8\xd8\xc9\xd8\xbd\xd8\xca\x00\x00\xb4\x42", /* 5a80 */ "\x00\x00\x00\x00\x00\x00\xd8\xc6\xd8\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xc4\xd8\xc7\xd8\xcb\x00\x00\xd4\xe3\xd8\xcd\xdd\x47\x00\x00\xb4\x43\xd8\xce\xd8\xb6\xd8\xc0\x00\x00\xd8\xc5\x00\x00\x00\x00\xb4\x41\xb4\x44\xd8\xcc\xd8\xcf\xd8\xba\xd8\xb7\x00\x00\x00\x00\xd8\xb9\x00\x00\x00\x00\xd8\xbe\xd8\xbc\xb4\x45\x00\x00\xd8\xc8\x00\x00\x00\x00\xd8\xbf\x00\x00\xd8\xc1\xd8\xb5\xdc\xfa\xdc\xf8\xb7\x42\xb7\x40\xdd\x43\xdc\xf9\xdd\x44\xdd\x40\xdc\xf7\xdd\x46\xdc\xf6\xdc\xfd\xb6\xfe\xb6\xfd\xb6\xfc\xdc\xfb\xdd\x41\xb6\xf9\xb7\x41\x00\x00\xdc\xf4\x00\x00\xdc\xfe\xdc\xf3\xdc\xfc\xb6\xfa\xdd\x42\xdc\xf5\xb6\xfb\xdd\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x6e\xb9\xe2\xb9\xe1\xb9\xe3\xe1\x7a\xe1\x70\xe1\x76\xe1\x6b\xe1\x79\xe1\x78\xe1\x7c\xe1\x75\xb9\xde\xe1\x74\xb9\xe4\x00\x00\xe1\x6d\xb9\xdf\x00\x00\xe1\x7b\xb9\xe0\xe1\x6f\xe1\x72\xe1\x77\xe1\x71\xe1\x6c\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x73\xe5\x55\xbc\x61\xe5\x58\xe5\x57\xe5\x5a\xe5\x5c\xf9\xdc\xbc\x5f\x00\x00\xe5\x56\x00\x00\xe5\x54", /* 5b00 */ "\x00\x00\xe5\x5d\xe5\x5b\xe5\x59\x00\x00\xe5\x5f\x00\x00\xe5\x5e\xbc\x63\xbc\x5e\x00\x00\xbc\x60\xbc\x62\x00\x00\x00\x00\xe5\x60\xe9\x57\x00\x00\x00\x00\xe9\x56\xe9\x55\x00\x00\xe9\x58\xe9\x51\x00\x00\xe9\x52\xe9\x5a\xe9\x53\x00\x00\xbe\xc5\xe9\x5c\x00\x00\xe9\x5b\xe9\x54\x00\x00\xec\xd1\xc0\xa8\xec\xcf\xec\xd4\xec\xd3\xe9\x59\x00\x00\xc0\xa7\x00\x00\xec\xd2\xec\xce\xec\xd6\xec\xd5\xc0\xa6\x00\x00\xec\xd0\x00\x00\xbe\xc6\x00\x00\x00\x00\x00\x00\xc2\x54\x00\x00\x00\x00\x00\x00\xef\xc1\xf1\xfa\xf1\xfb\xf1\xfc\xc4\x5c\x00\x00\x00\x00\xc4\x5d\x00\x00\xf4\x43\x00\x00\xf5\xc8\xf5\xc7\x00\x00\x00\x00\xf6\xdb\xf6\xdc\xf7\xd5\xf8\xa7\x00\x00\xa4\x6c\xa4\x6d\x00\x00\xa4\x6e\xa4\xd5\xa5\xa5\xc9\xd3\xa6\x72\xa6\x73\x00\x00\xa7\xb7\xa7\xb8\xa7\xb6\xa7\xb5\x00\x00\xa9\x73\x00\x00\x00\x00\xcc\x55\xa9\x75\xa9\x74\xcc\x56\x00\x00\x00\x00\x00\x00\xab\xc4\x00\x00\xae\x5d\xd1\x65\x00\x00\xd4\xf0\x00\x00\xb1\x45\xb4\x47\xd4\xef\xb4\x46\x00\x00\xb9\xe5\x00\x00\xe1\x7d\xbe\xc7\x00\x00\xc0\xa9\xec\xd7\x00\x00\xc4\x5e\x00\x00\xc5\x70", /* 5b80 */ "\x00\x00\xc9\x72\x00\x00\xa5\xa6\xc9\x73\xa6\x76\x00\x00\xa6\x74\xa6\x75\xa6\x77\x00\x00\xa7\xba\xa7\xb9\x00\x00\xca\xbc\xa7\xbb\x00\x00\x00\x00\xca\xbd\xcc\x57\x00\x00\xcc\x58\x00\x00\xa9\x76\xa9\x78\xa9\x7a\xa9\x77\xa9\x7b\xa9\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xc8\xab\xc5\xab\xc7\xab\xc9\xab\xc6\xd1\x66\xce\x77\x00\x00\x00\x00\x00\x00\xd1\x68\xd1\x67\xae\x63\x00\x00\xae\x5f\x00\x00\x00\x00\xae\x60\xae\x62\xae\x64\xae\x61\x00\x00\xae\x66\xae\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x4a\xd4\xf2\xd4\xf1\xb1\x49\x00\x00\xb1\x48\xb1\x47\xb1\x4b\xb1\x46\x00\x00\x00\x00\xd8\xd5\xd8\xd2\xb4\x49\xd8\xd1\xd8\xd6\x00\x00\xb4\x4b\xd8\xd4\xb4\x48\xb4\x4a\xd8\xd3\x00\x00\xdd\x48\x00\x00\xdd\x49\xdd\x4a\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xe6\xb9\xee\xe1\x7e\xb9\xe8\xb9\xec\xe1\xa1\xb9\xed\xb9\xe9\xb9\xea\xb9\xe7\xb9\xeb\xbc\x66\xd8\xd0\xbc\x67\xbc\x65\x00\x00\xbc\x64\xe9\x5d\xbe\xc8\xec\xd8\xec\xd9\x00\x00\x00\x00\xc3\x64\xc4\x5f\x00\x00\xa4\x6f\x00\x00\xa6\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5c00 */ "\x00\x00\xab\xca\x00\x00\xd1\x69\xae\x67\x00\x00\x00\x00\xb1\x4e\xb1\x4d\xb1\x4c\xb4\x4c\xb4\x4d\xd8\xd7\xb9\xef\xbe\xc9\xa4\x70\xc9\x5c\xa4\xd6\xc9\x74\x00\x00\x00\x00\xc9\xd4\xa6\x79\x00\x00\x00\x00\x00\x00\xa9\x7c\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x4b\x00\x00\x00\x00\xa4\x71\x00\x00\xa4\xd7\xc9\xd5\x00\x00\x00\x00\xca\xbe\x00\x00\xca\xbf\x00\x00\xa7\xbc\x00\x00\x00\x00\x00\x00\xd8\xd8\xb4\x4e\x00\x00\xdd\x4c\x00\x00\x00\x00\x00\x00\xc0\xaa\xa4\x72\xa4\xa8\xa4\xd8\xc9\x75\xa5\xa7\x00\x00\xa7\xc0\xa7\xbf\xa7\xbd\xa7\xbe\x00\x00\x00\x00\xcc\x59\xa9\x7e\xa9\xa1\xcc\x5a\xa9\x7d\x00\x00\x00\x00\xab\xce\xce\x78\xab\xcd\xab\xcb\xab\xcc\xae\x6a\xae\x68\x00\x00\x00\x00\xd1\x6b\xae\x69\xd1\x6a\x00\x00\xae\x5e\xd4\xf3\x00\x00\x00\x00\xb1\x50\xb1\x51\x00\x00\x00\x00\xb1\x4f\x00\x00\xb9\xf0\xe1\xa2\xbc\x68\xbc\x69\x00\x00\xe5\x61\xc0\xab\xef\xc2\xef\xc3\x00\x00\xc4\xdd\xf8\xa8\xc9\x4b\xa4\xd9\x00\x00\xa4\x73\x00\x00\xc9\x77\xc9\x76\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x7a\xc9\xd7\xc9\xd8\xc9\xd6\x00\x00\xc9\xd9\x00\x00", /* 5c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xc7\x00\x00\xca\xc2\xca\xc4\xca\xc6\xca\xc3\xa7\xc4\xca\xc0\x00\x00\xca\xc1\xa7\xc1\xa7\xc2\xca\xc5\xca\xc8\xa7\xc3\xca\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x68\x00\x00\xcc\x62\xcc\x5d\xa9\xa3\xcc\x65\xcc\x63\xcc\x5c\xcc\x69\xcc\x6c\xcc\x67\xcc\x60\xa9\xa5\xcc\x66\xa9\xa6\xcc\x61\xcc\x64\xcc\x5b\xcc\x5f\xcc\x6b\xa9\xa7\x00\x00\xa9\xa8\x00\x00\xcc\x5e\xcc\x6a\xa9\xa2\xa9\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xab\xce\xa4\xce\xaa\xce\xa3\xce\xa5\xce\x7d\xce\x7b\x00\x00\xce\xac\xce\xa9\xce\x79\x00\x00\xab\xd0\xce\xa7\xce\xa8\x00\x00\xce\xa6\xce\x7c\xce\x7a\xab\xcf\xce\xa2\xce\x7e\x00\x00\x00\x00\xce\xa1\xce\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x6f\x00\x00\xae\x6e\x00\x00\xd1\x6c\xae\x6b\xd1\x6e\x00\x00\xae\x70\xd1\x6f\x00\x00\x00\x00\xae\x73\x00\x00\xae\x71\xd1\x70\xce\xae\xd1\x72\x00\x00\xae\x6d\x00\x00\xae\x6c\x00\x00\xd1\x6d", /* 5d00 */ "\xd1\x71\xae\x72\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x53\xb1\x52\x00\x00\x00\x00\x00\x00\xd4\xf5\xd4\xf9\xd4\xfb\xb1\x54\xd4\xfe\x00\x00\xb1\x58\xd5\x41\x00\x00\xb1\x5a\x00\x00\xb1\x56\xb1\x5e\x00\x00\xb1\x5b\xd4\xf7\xb1\x55\x00\x00\xd4\xf6\xd4\xf4\xd5\x43\xd4\xf8\x00\x00\xb1\x57\xd5\x42\xb1\x5c\xd4\xfd\xd4\xfc\xb1\x5d\xd4\xfa\xb1\x59\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x44\x00\x00\xd5\x40\xd8\xe7\xd8\xee\xd8\xe3\xb4\x51\xd8\xdf\xd8\xef\xd8\xd9\xd8\xec\xd8\xea\xd8\xe4\x00\x00\xd8\xed\xd8\xe6\x00\x00\xd8\xde\xd8\xf0\xd8\xdc\xd8\xe9\xd8\xda\x00\x00\xd8\xf1\x00\x00\xb4\x52\x00\x00\xd8\xeb\xdd\x4f\xd8\xdd\xb4\x4f\x00\x00\xd8\xe1\x00\x00\xb4\x50\xd8\xe0\xd8\xe5\x00\x00\x00\x00\xd8\xe2\x00\x00\x00\x00\x00\x00\xd8\xe8\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x53\x00\x00\x00\x00\x00\x00\xdd\x56\xdd\x4e\x00\x00\xdd\x50\x00\x00\xdd\x55\xdd\x54\xb7\x43\x00\x00\xd8\xdb\xdd\x52\x00\x00\x00\x00\xb7\x44\x00\x00\xdd\x4d\xdd\x51\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xa9\x00\x00\xe1\xb0\xe1\xa7\x00\x00\xe1\xae\xe1\xa5\xe1\xad\xe1\xb1", /* 5d80 */ "\xe1\xa4\xe1\xa8\xe1\xa3\x00\x00\xb9\xf1\x00\x00\xe1\xa6\xb9\xf2\xe1\xac\xe1\xab\xe1\xaa\x00\x00\x00\x00\xe1\xaf\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x65\xe5\x67\xbc\x6b\xe5\x68\x00\x00\xe5\x63\x00\x00\xe5\x62\xe5\x6c\x00\x00\xe5\x6a\xbc\x6a\xe5\x6d\xe5\x64\xe5\x69\xe5\x6b\xe5\x66\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x61\xe9\x66\xe9\x60\xe9\x65\x00\x00\xe9\x5e\xe9\x68\xe9\x64\xe9\x69\xe9\x63\xe9\x5f\xe9\x67\x00\x00\xe9\x6a\xe9\x62\x00\x00\xec\xda\xc0\xaf\x00\x00\xc0\xad\x00\x00\xc0\xac\xc0\xae\x00\x00\x00\x00\xef\xc4\x00\x00\xf1\x72\xf1\xfd\x00\x00\x00\x00\xf4\x44\xf4\x45\x00\x00\xc4\x60\x00\x00\xf5\xc9\x00\x00\xc4\xde\x00\x00\xf5\xca\x00\x00\xf6\xde\xc5\x72\x00\x00\xc5\x71\xf6\xdd\xc5\xc9\x00\x00\xf7\xd6\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x74\xa6\x7b\xc9\xda\xca\xca\xa8\xb5\xb1\x5f\x00\x00\x00\x00\xa4\x75\xa5\xaa\xa5\xa9\xa5\xa8\x00\x00\x00\x00\xa7\xc5\x00\x00\x00\x00\xae\x74\x00\x00\xdd\x57\xa4\x76\xa4\x77\xa4\x78\xa4\xda\x00\x00\x00\x00\xab\xd1\x00\x00\xce\xaf\x00\x00\x00\x00\x00\x00\xb4\x53\xa4\x79\xc9\x5d", /* 5e00 */ "\x00\x00\x00\x00\xa5\xab\xa5\xac\xc9\x78\x00\x00\xa6\x7c\x00\x00\x00\x00\x00\x00\xca\xcb\x00\x00\xa7\xc6\x00\x00\xca\xcc\x00\x00\x00\x00\xa9\xae\x00\x00\x00\x00\xcc\x6e\xa9\xac\xa9\xab\xcc\x6d\xa9\xa9\xcc\x6f\xa9\xaa\xa9\xad\x00\x00\xab\xd2\x00\x00\xab\xd4\xce\xb3\xce\xb0\xce\xb1\xce\xb2\xce\xb4\xab\xd3\x00\x00\x00\x00\xd1\x74\xd1\x73\x00\x00\xae\x76\x00\x00\xae\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x62\xd5\x46\x00\x00\xb1\x61\xb1\x63\xb1\x60\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x55\xd5\x45\x00\x00\xb4\x56\xd8\xf3\x00\x00\xb4\x57\xd8\xf2\xb4\x54\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x5a\xdd\x5c\xb7\x45\xdd\x5b\xdd\x59\xdd\x58\x00\x00\x00\x00\x00\x00\xe1\xb4\xb9\xf7\xb9\xf5\x00\x00\xb9\xf6\xe1\xb2\xe1\xb3\x00\x00\xb9\xf3\xe5\x71\xe5\x6f\x00\x00\xbc\x6d\xe5\x70\xbc\x6e\xbc\x6c\xb9\xf4\x00\x00\x00\x00\xe9\x6d\xe9\x6b\xe9\x6c\xe5\x6e\xec\xdc\xc0\xb0\xec\xdb\xef\xc5\xef\xc6\xe9\x6e\xf1\xfe\x00\x00\xa4\x7a\xa5\xad\xa6\x7e\xc9\xdb\xa6\x7d\x00\x00\xa9\xaf\xb7\x46\x00\x00\xa4\xdb\xa5\xae\xab\xd5\xb4\x58\x00\x00", /* 5e80 */ "\xc9\x79\x00\x00\xc9\x7a\x00\x00\xc9\xdc\x00\x00\x00\x00\xa7\xc8\xca\xd0\xca\xce\xa7\xc9\xca\xcd\xca\xcf\xca\xd1\x00\x00\xa7\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\xb3\xa9\xb4\xa9\xb1\x00\x00\x00\x00\xa9\xb0\xce\xb8\xa9\xb2\x00\x00\x00\x00\x00\x00\xab\xd6\x00\x00\xce\xb7\xce\xb9\xce\xb6\xce\xba\xab\xd7\xae\x79\xd1\x75\x00\x00\xd1\x77\xae\x77\xd1\x78\xae\x78\xd1\x76\x00\x00\xce\xb5\xd5\x47\xd5\x4a\xd5\x4b\xd5\x48\xb1\x67\xb1\x66\xb1\x64\xb1\x65\xd5\x49\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x68\x00\x00\x00\x00\xb4\x5a\xb4\x5b\x00\x00\xb4\x5c\xdd\x5d\xdd\x5f\xdd\x61\xb7\x48\xb7\x47\xb4\x59\xdd\x60\xdd\x5e\x00\x00\xe1\xb8\x00\x00\x00\x00\xe1\xb6\xe1\xbc\xb9\xf8\xe1\xbd\xe1\xba\xb9\xf9\xe1\xb7\xe1\xb5\xe1\xbb\xbc\x70\xe5\x73\xe1\xb9\xbc\x72\xe5\x74\xbc\x71\xbc\x74\xe5\x75\xbc\x6f\xbc\x73\x00\x00\xe9\x73\xe9\x71\xe9\x70\xe9\x72\xe9\x6f\x00\x00\x00\x00\xc3\x66\x00\x00\xf4\x46\xf4\x47\x00\x00\xf5\xcb\xf6\xdf\xc6\x55\x00\x00\x00\x00\xa9\xb5\xa7\xca\x00\x00\x00\x00\xab\xd8\x00\x00\x00\x00\x00\x00\xa4\x7b\xa4\xdc", /* 5f00 */ "\x00\x00\xa5\xaf\xc9\xdd\x00\x00\xa7\xcb\xca\xd2\x00\x00\xce\xbb\xab\xd9\x00\x00\xb9\xfa\xa4\x7c\x00\x00\x00\x00\x00\x00\xa6\xa1\x00\x00\x00\x00\xb7\x49\xa4\x7d\xa4\xdd\xa4\xde\x00\x00\xa5\xb1\xa5\xb0\x00\x00\xc9\xde\xa6\xa2\x00\x00\xca\xd3\x00\x00\xa7\xcc\x00\x00\x00\x00\xcc\x71\xcc\x72\xcc\x73\x00\x00\xa9\xb6\xa9\xb7\xcc\x70\xa9\xb8\x00\x00\x00\x00\x00\x00\xab\xda\xce\xbc\x00\x00\xd1\x7a\xae\x7a\x00\x00\xd1\x79\x00\x00\xb1\x69\xd5\x4c\xb1\x6a\xd5\x4d\x00\x00\x00\x00\x00\x00\xb4\x5d\x00\x00\x00\x00\x00\x00\xdd\x62\x00\x00\x00\x00\xe1\xbf\xe1\xbe\x00\x00\xb9\xfb\x00\x00\xbc\x75\xe5\x76\xbe\xca\xe9\x74\xc0\xb1\x00\x00\xc5\x73\xf7\xd8\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x74\x00\x00\xce\xbd\xb1\x6b\xd8\xf4\xb7\x4a\x00\x00\x00\x00\x00\x00\xc2\x55\x00\x00\x00\x00\x00\x00\x00\x00\xa7\xce\x00\x00\xa7\xcd\xab\xdb\x00\x00\xd1\x7b\x00\x00\xb1\x6d\xb3\x43\xb1\x6e\xb1\x6c\xb4\x5e\x00\x00\xe1\xc0\xb9\xfc\xbc\x76\x00\x00\xc9\x4c\xc9\xdf\x00\x00\xca\xd5\xa7\xcf\xca\xd4\xa7\xd0\x00\x00\x00\x00\xa9\xbc\xcc\x77\xcc\x76\xa9\xbb", /* 5f80 */ "\xa9\xb9\xa9\xba\xcc\x75\x00\x00\x00\x00\xab\xdd\xce\xbe\xab\xe0\xab\xdc\xab\xe2\xab\xde\xab\xdf\xab\xe1\x00\x00\x00\x00\x00\x00\xae\x7d\xae\x7c\xae\x7b\x00\x00\x00\x00\x00\x00\xd5\x4f\xb1\x6f\xb1\x72\xb1\x70\x00\x00\xd5\x4e\xb1\x75\x00\x00\xb1\x71\xd5\x50\xb1\x74\xb1\x73\x00\x00\x00\x00\x00\x00\xd8\xf6\xd8\xf5\x00\x00\xb4\x61\xb4\x5f\xb4\x60\xd8\xf7\xb7\x4b\xdd\x64\xb7\x4c\xdd\x63\x00\x00\x00\x00\xe5\x77\x00\x00\x00\x00\xbc\x78\xe1\xc1\xbc\x77\x00\x00\xb9\xfd\x00\x00\xec\xde\xe9\x75\xc0\xb2\xec\xdd\xf2\x40\xf4\x48\xf4\x49\x00\x00\xa4\xdf\x00\x00\xa5\xb2\x00\x00\x00\x00\x00\x00\xc9\x7b\x00\x00\x00\x00\xa7\xd2\xa7\xd4\x00\x00\xc9\xe2\xca\xd8\xca\xd7\xca\xd6\x00\x00\xc9\xe1\xc9\xe0\xa6\xa4\xa7\xd3\xa7\xd1\xa6\xa3\x00\x00\x00\x00\x00\x00\xa9\xbd\xcc\x78\x00\x00\xa9\xbe\xca\xdd\x00\x00\xca\xdf\xca\xde\xcc\x79\x00\x00\x00\x00\xca\xda\x00\x00\xa7\xd8\xa7\xd6\x00\x00\xca\xd9\xca\xdb\xca\xe1\x00\x00\xa7\xd5\x00\x00\xca\xdc\xca\xe5\xa9\xc0\x00\x00\xca\xe2\xa7\xd7\x00\x00\xca\xe0\xca\xe3\x00\x00\xa9\xbf\x00\x00\xa9\xc1", /* 6000 */ "\xca\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xaf\xcc\xa2\xcc\x7e\xcc\xae\xcc\xa9\xab\xe7\xa9\xc2\xcc\xaa\xcc\xad\xab\xe3\xcc\xac\xa9\xc3\xa9\xc8\xa9\xc6\xcc\xa3\x00\x00\xcc\x7c\xcc\xa5\xa9\xcd\xcc\xb0\xab\xe4\xcc\xa6\x00\x00\xab\xe5\xa9\xc9\xcc\xa8\x00\x00\xce\xcd\xab\xe6\xcc\x7b\xa9\xca\xab\xe8\xa9\xcb\xa9\xc7\xa9\xcc\xcc\xa7\xcc\x7a\xcc\xab\xa9\xc4\x00\x00\x00\x00\xcc\x7d\xcc\xa4\xcc\xa1\xa9\xc5\x00\x00\xce\xbf\x00\x00\xce\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xca\xd1\xa1\xce\xcb\xab\xee\xce\xce\xce\xc4\xab\xed\xce\xc6\x00\x00\xce\xc7\x00\x00\x00\x00\xce\xc9\xab\xe9\x00\x00\x00\x00\xae\xa3\x00\x00\xf9\xda\xce\xc5\xce\xc1\xae\xa4\x00\x00\x00\x00\xce\xcf\xae\x7e\xd1\x7d\xce\xc8\x00\x00\xd1\x7c\xce\xc3\xce\xcc\x00\x00\x00\x00\xab\xec\xae\xa1\xab\xf2\xae\xa2\xce\xd0\xd1\x7e\xab\xeb\xae\xa6\xab\xf1\xab\xf0\xab\xef\xae\xa5\xce\xd1\xae\xa7\xab\xea\x00\x00\xce\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x76", /* 6080 */ "\xd1\xa4\xd1\xa6\x00\x00\xd1\xa8\xae\xa8\xae\xae\xd5\x53\xd1\xac\xd1\xa3\xb1\x78\xd5\x51\x00\x00\xae\xad\xae\xab\xd1\xae\x00\x00\xd5\x52\x00\x00\xd1\xa5\x00\x00\xae\xac\xd1\xa9\xae\xaf\xd1\xab\x00\x00\x00\x00\xae\xaa\xd1\xaa\xd1\xad\xd1\xa7\x00\x00\xae\xa9\xb1\x79\x00\x00\xd1\xa2\xb1\x77\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x55\xd5\x5e\xb4\x64\x00\x00\xb1\x7c\xb1\xa3\xb4\x65\xd5\x60\xb1\xaa\xd8\xf9\xd5\x56\xb1\xa2\xb1\xa5\xb1\x7e\xd5\x54\xd5\x62\xd5\x65\xd9\x49\x00\x00\xd5\x63\xd8\xfd\xb1\xa1\xb1\xa8\xb1\xac\xd5\x5d\xd8\xf8\xd5\x61\xb1\x7b\xd8\xfa\xd5\x64\xd8\xfc\xd5\x59\x00\x00\xb4\x62\x00\x00\xd5\x57\xd5\x58\xb1\xa7\x00\x00\x00\x00\xb1\xa6\xd5\x5b\xb1\xab\xd5\x5f\xb1\xa4\xd5\x5c\x00\x00\xb1\xa9\xb4\x66\xb4\x63\xd8\xfb\x00\x00\xd5\x5a\x00\x00\xb1\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x6b\xb4\x6f\xd9\x40\xb7\x51\xb4\x6d\xd9\x44\xb4\x71\xdd\x65\xd9\x46\xb7\x53\xb4\x69\xb4\x6c\xd9\x47\x00\x00\xd9\x48\xd9\x4e", /* 6100 */ "\xb4\x73\xb7\x54\x00\x00\xd9\x4a\xd9\x4f\xd9\x43\xb7\x5e\x00\x00\xb7\x55\xb4\x72\xd9\x41\xd9\x50\x00\x00\xb7\x5d\xb4\x70\xb7\x4e\xd9\x4d\x00\x00\xb4\x74\xd9\x45\xd8\xfe\xb4\x6a\xd9\x42\x00\x00\xd9\x4b\x00\x00\xb7\x4d\xb7\x52\xb4\x67\xd9\x4c\x00\x00\xb7\x50\x00\x00\x00\x00\x00\x00\xb4\x68\x00\x00\x00\x00\x00\x00\xb7\x5c\xe1\xc3\xdd\x70\x00\x00\xdd\x68\xe1\xc2\x00\x00\xdd\x6c\xdd\x6e\x00\x00\x00\x00\xdd\x6b\x00\x00\xb7\x5b\x00\x00\xdd\x6a\xb7\x5f\x00\x00\x00\x00\x00\x00\xe1\xd2\x00\x00\x00\x00\xb7\x5a\xba\x40\xdd\x71\xe1\xc4\x00\x00\x00\x00\xb7\x58\xdd\x69\xdd\x6d\xb9\xfe\xb7\x4f\xdd\x66\xdd\x67\xba\x41\xb7\x57\xb7\x59\xb7\x56\xdd\x6f\x00\x00\x00\x00\xe1\xc8\xe1\xc9\xe1\xce\xbc\x7d\xe1\xd5\x00\x00\xba\x47\x00\x00\xba\x46\xe1\xd0\x00\x00\xbc\x7c\xe1\xc5\xba\x45\x00\x00\xe1\xd4\xba\x43\xba\x44\x00\x00\xe1\xd1\xe5\xaa\xbc\x7a\xb4\x6e\x00\x00\xe1\xd3\xbc\xa3\xe1\xcb\x00\x00\xbc\x7b\x00\x00\xbc\xa2\xe1\xc6\xe1\xca\xe1\xc7\xe1\xcd\xba\x48\xbc\x79\xba\x42\x00\x00\xe5\x7a\xe1\xcf\x00\x00\xbc\xa1\x00\x00\xbc\xa4\x00\x00", /* 6180 */ "\xe1\xcc\x00\x00\xbc\x7e\xe5\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x7e\xbe\xce\xe5\x78\xe9\xa3\xe5\xa9\xbc\xa8\x00\x00\xbc\xa6\xbe\xcc\xe5\xa6\xe5\xa2\xbc\xac\x00\x00\xe9\x78\x00\x00\x00\x00\x00\x00\xbc\xaa\xe5\xa1\x00\x00\xe9\x76\x00\x00\xe5\xa5\x00\x00\xe5\xa8\xe5\x7d\x00\x00\xbc\xab\x00\x00\x00\x00\xbc\xa5\xe9\x77\xbe\xcd\xe5\xa7\xbc\xa7\xbc\xa9\xe5\xa4\xbc\xad\xe5\xa3\xe5\x7c\xe5\x7b\xbe\xcb\xe5\xab\xe9\x7a\xec\xe0\xbe\xd0\x00\x00\xe9\xa2\x00\x00\xe9\x7e\x00\x00\xec\xe1\x00\x00\xbe\xd1\xe9\xa1\x00\x00\xe9\x7c\xc0\xb4\xec\xdf\x00\x00\xe9\x79\xe9\x7b\xc0\xb5\xbe\xd3\xc0\xb3\xbe\xd2\xc0\xb7\xe9\x7d\xbe\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xcf\x00\x00\xef\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\xe7\xef\xc8\xec\xe3\x00\x00\x00\x00\xc2\x56\xec\xe5\xec\xe4\xc0\xb6\xec\xe2\xec\xe6\xef\xd0\xef\xcc\xef\xce\x00\x00\xef\xc9\xef\xca\x00\x00\xef\xcd\xef\xcb\xc3\x67\x00\x00\x00\x00\xc3\x6a\xc3\x69\xc3\x68\xc4\x61\xf4\x4a\xc4\x62\xf2\x41\xc4\xdf\xf5\xcc\xc4\xe0\xc5\x74", /* 6200 */ "\xc5\xca\xf7\xd9\x00\x00\xf7\xda\xf7\xdb\x00\x00\x00\x00\xf9\xba\xa4\xe0\xc9\x7c\xa5\xb3\x00\x00\xa6\xa6\xa6\xa7\xa6\xa5\x00\x00\xa6\xa8\xa7\xda\xa7\xd9\x00\x00\xcc\xb1\xa9\xcf\xa9\xce\x00\x00\x00\x00\xd1\xaf\xb1\xad\xb1\xae\x00\x00\x00\x00\x00\x00\xb4\x75\xdd\x72\xb7\x60\xb7\x61\xdd\x74\xdd\x76\xdd\x75\x00\x00\xe1\xd7\x00\x00\xe1\xd6\xba\x49\xe1\xd8\x00\x00\xe5\xac\xbc\xae\x00\x00\xbe\xd4\x00\x00\xc0\xb8\xc2\x57\xc0\xb9\x00\x00\xa4\xe1\x00\x00\x00\x00\x00\x00\xca\xe6\x00\x00\x00\x00\xcc\xb2\xa9\xd1\xa9\xd0\xa9\xd2\xab\xf3\xce\xd2\xce\xd3\x00\x00\x00\x00\xd1\xb0\xae\xb0\xb1\xaf\xb4\x76\xd9\x51\xa4\xe2\x00\x00\xa4\x7e\xa4\xe3\x00\x00\xc9\x7d\xa5\xb7\xa5\xb6\xa5\xb4\xa5\xb5\x00\x00\x00\x00\x00\x00\xa6\xab\xc9\xe9\xc9\xeb\xa6\xaa\xc9\xe3\x00\x00\xc9\xe4\x00\x00\xc9\xea\xc9\xe6\xc9\xe8\xa6\xa9\xc9\xe5\xc9\xec\xc9\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\xe1\xa7\xea\xa7\xe8\xca\xf0\xca\xed\xca\xf5\xa7\xe6\xca\xf6\x00\x00\xa7\xdf\xca\xf3\x00\x00\xa7\xe5\xca\xef\xca\xee\xa7\xe3\xca\xf4\xa7\xe4\xa9\xd3", /* 6280 */ "\xa7\xde\xca\xf1\x00\x00\xca\xe7\xa7\xdb\x00\x00\xa7\xee\xca\xec\xca\xf2\xa7\xe0\xa7\xe2\x00\x00\xca\xe8\x00\x00\xca\xe9\xca\xea\x00\x00\xa7\xed\xa7\xe7\xa7\xec\xca\xeb\xa7\xeb\xa7\xdd\xa7\xdc\xa7\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\xe1\xcc\xbe\xcc\xb7\xa9\xdc\xa9\xef\xcc\xb3\xcc\xba\xcc\xbc\xcc\xbf\xa9\xea\x00\x00\xcc\xbb\xcc\xb4\xa9\xe8\xcc\xb8\x00\x00\xcc\xc0\xa9\xd9\x00\x00\xcc\xbd\xa9\xe3\xa9\xe2\xcc\xb6\xa9\xd7\x00\x00\x00\x00\xa9\xd8\x00\x00\xa9\xd6\x00\x00\xa9\xee\xa9\xe6\xa9\xe0\xa9\xd4\xcc\xb9\xa9\xdf\xa9\xd5\xa9\xe7\xa9\xf0\xce\xd4\xa9\xe4\xcc\xb5\xa9\xda\xa9\xdd\xa9\xde\x00\x00\xa9\xec\xa9\xed\xa9\xeb\xa9\xe5\xa9\xe9\xa9\xdb\xab\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xda\xac\x41\xab\xf8\xab\xfa\xac\x40\xce\xe6\xab\xfd\xd1\xb1\xae\xb1\xac\x43\xce\xd7\xce\xdf\xab\xfe\xce\xde\xce\xdb\xce\xe3\xce\xe5\xab\xf7\xab\xfb\xac\x42\xae\xb3", /* 6300 */ "\xce\xe0\xab\xf9\xac\x45\xce\xd9\x00\x00\x00\x00\x00\x00\xab\xfc\xae\xb2\xab\xf6\x00\x00\xce\xd6\xce\xdd\xce\xd5\xce\xd8\xce\xdc\xd1\xb2\xac\x44\x00\x00\xce\xe1\xce\xe2\xce\xe4\xab\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xc1\xd1\xbe\xae\xbf\xae\xc0\xd1\xb4\xd1\xc4\x00\x00\xae\xb6\x00\x00\x00\x00\xd5\x66\xd1\xc6\xd1\xc0\x00\x00\xd1\xb7\x00\x00\xd1\xc9\xd1\xba\xae\xbc\xd5\x7d\xd1\xbd\xae\xbe\xae\xb5\x00\x00\xd1\xcb\xd1\xbf\xae\xb8\xd1\xb8\xd1\xb5\xd1\xb6\xae\xb9\xd1\xc5\xd1\xcc\xae\xbb\xd1\xbc\xd1\xbb\xae\xc3\xae\xc2\xae\xb4\xae\xba\xae\xbd\xd1\xc8\x00\x00\x00\x00\xd1\xc2\xae\xb7\xd1\xb3\xd1\xca\xd1\xc1\xd1\xc3\xd1\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x67\x00\x00\xb1\xb7\xb1\xcb\xb1\xca\x00\x00\xb1\xbf\x00\x00\xd5\x79\xd5\x75\xd5\x72\xd5\xa6\xb1\xba\xb1\xb2\x00\x00\x00\x00\xd5\x77\xb4\xa8\xb1\xb6\xd5\xa1\x00\x00\xb1\xcc\xb1\xc9\xd5\x7b\xd5\x6a\x00\x00\x00\x00", /* 6380 */ "\xb1\xc8\xd5\xa3\xd5\x69\xb1\xbd\xb1\xc1\xd5\xa2\x00\x00\xd5\x73\xb1\xc2\xb1\xbc\xd5\x68\x00\x00\xb4\x78\xd5\xa5\xd5\x71\xb1\xc7\xd5\x74\xd5\xa4\xb1\xc6\x00\x00\xd9\x52\x00\x00\xb1\xb3\xd5\x6f\xb1\xb8\xb1\xc3\x00\x00\xb1\xbe\xd5\x78\xd5\x6e\xd5\x6c\xd5\x7e\xb1\xb0\xb1\xc4\xb1\xb4\xb4\x77\xd5\x7c\xb1\xb5\x00\x00\xb1\xb1\xb1\xc0\xb1\xbb\xb1\xb9\xd5\x70\xb1\xc5\xd5\x6d\xd5\x7a\xd5\x76\xd9\x54\xd9\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x6b\xd9\x64\x00\x00\xb4\x7a\x00\x00\xd9\x6a\xd9\x59\xd9\x67\xdd\x77\xb4\x7d\xd9\x6b\xd9\x6e\xb4\x7c\xd9\x5c\xd9\x6d\xd9\x6c\xb4\x7e\xd9\x55\xb4\x79\xb4\xa3\x00\x00\xb4\xa1\xd9\x69\x00\x00\xd9\x5f\xb4\xa5\xd9\x70\xd9\x68\xd9\x71\xb4\xad\xb4\xab\xd9\x66\xd9\x65\x00\x00\xd9\x63\xd9\x5d\xb4\xa4\x00\x00\xb4\xa2\xd1\xb9\xd9\x56\x00\x00\xdd\xb7\xd9\x57\xb4\x7b\xb4\xaa\xdd\x79\x00\x00\xb4\xa6\xb4\xa7\xd9\x58\xd9\x6f\xdd\x78\xd9\x60\xd9\x5b\xb4\xa9\xd9\x61\xd9\x5e\x00\x00\x00\x00\xb4\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x70\x00\x00\x00\x00\xdd\x7c\xdd\xb1\xdd\xb6\xdd\xaa\xb7\x6c\xdd\xbb\xb7\x69\xdd\x7a\x00\x00\xdd\x7b\xb7\x62\xb7\x6b\xdd\xa4\xb7\x6e\xb7\x6f\xdd\xa5\x00\x00\xdd\xb2\xdd\xb8\xb7\x6a\x00\x00\xb7\x64\xdd\xa3\xdd\x7d\xdd\xba\xdd\xa8\xdd\xa9\xdd\x7e\xdd\xb4\xdd\xab\xdd\xb5\xdd\xad\x00\x00\xb7\x65\xe1\xd9\xb7\x68\xb7\x66\xdd\xb9\xdd\xb0\xdd\xac\x00\x00\x00\x00\xdd\xa1\xba\x53\xdd\xaf\xb7\x6d\xdd\xa7\x00\x00\xdd\xa6\x00\x00\x00\x00\x00\x00\xb7\x67\xb7\x63\xe1\xee\xdd\xb3\xdd\xae\x00\x00\xdd\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xe9\x00\x00\xe1\xda\xe1\xe5\x00\x00\xe1\xec\xba\x51\xb4\xac\xe1\xea\xba\x4c\x00\x00\x00\x00\x00\x00\xba\x4b\xe1\xf1\x00\x00\xe1\xdb\xe1\xe8\xe1\xdc\xe1\xe7\xba\x4f\xe1\xeb\xd9\x62\x00\x00\x00\x00\x00\x00\xe1\xf2\xe1\xe3\xba\x52\xe5\xba\xbc\xaf\x00\x00\xe1\xf0\xe1\xef\xba\x54\xe5\xad\xbc\xb0\xe5\xae\x00\x00\xe1\xdf\xe1\xe0\xe1\xdd\xe1\xe2\xe1\xde\xe1\xf3\xba\x4e\xbc\xb1\xba\x50\xba\x55\x00\x00\xe1\xe1\x00\x00\xe1\xed", /* 6480 */ "\x00\x00\x00\x00\xe1\xe6\x00\x00\x00\x00\xe5\xb1\x00\x00\xba\x4a\xbc\xb4\xe9\xaa\xe5\xb6\xe5\xb5\xe5\xb7\x00\x00\x00\x00\xe5\xb4\xbc\xb5\x00\x00\xbc\xbb\xbc\xb8\x00\x00\xbc\xb9\xe5\xaf\xe5\xb2\xe5\xbc\xbc\xc1\xbc\xbf\x00\x00\xe5\xb3\xd9\x5a\xbc\xb2\xe5\xb9\xe5\xb0\x00\x00\xbc\xc2\xe5\xb8\xba\x4d\xbc\xb7\xe1\xe4\x00\x00\x00\x00\xbc\xba\x00\x00\xbc\xbe\xbc\xc0\xbc\xbd\xbc\xbc\x00\x00\xbc\xb6\xe5\xbb\xbc\xb3\xbc\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\xd8\xbe\xd9\xe9\xa9\xbe\xe2\xbe\xdf\x00\x00\xbe\xd6\xbe\xdd\xe9\xab\xbe\xdb\xbe\xd5\x00\x00\xbe\xdc\x00\x00\xe9\xa8\xc0\xbb\xbe\xd7\x00\x00\xbe\xde\xc0\xba\xe9\xa7\xe9\xa6\x00\x00\xbe\xe0\x00\x00\xbe\xe1\x00\x00\xe9\xa5\xe9\xa4\xc0\xbc\xe9\xae\xbe\xda\xe9\xac\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xbd\x00\x00\xc0\xc2\xec\xea\xec\xec\x00\x00\xc0\xbf\x00\x00\xec\xed\xec\xe9\x00\x00\xec\xeb\xc0\xc0\xc0\xc3\x00\x00\xec\xe8\xc0\xbe\xc0\xc1\xc2\x59\xe9\xad\xc2\x58\x00\x00\x00\x00\xc2\x5e\xef\xd4\x00\x00\xc2\x5c\xc2\x5d\xef\xd7\xef\xd3\xc2\x5a\xef\xd1", /* 6500 */ "\xc3\x6b\xef\xd5\x00\x00\xef\xd6\xef\xd2\x00\x00\xc2\x5b\xf2\x42\x00\x00\xf2\x45\x00\x00\x00\x00\xf2\x46\xf2\x44\xf2\x47\xc3\x6c\xf2\x43\x00\x00\x00\x00\xf4\x4e\xc4\x64\xf4\x4d\xf4\x4c\xf4\x4b\xc4\x63\xc4\x65\x00\x00\xf5\xcd\xc4\xe2\xc4\xe1\x00\x00\x00\x00\xf6\xe1\xf6\xe0\xf6\xe3\xc5\xcb\xc5\x75\xf7\xdd\xf6\xe2\x00\x00\x00\x00\xf7\xdc\xc5\xcd\xc5\xcc\xc5\xf3\xf8\xa9\xf8\xef\xa4\xe4\x00\x00\x00\x00\xd9\x72\xe9\xaf\x00\x00\x00\x00\xa6\xac\xca\xf7\xa7\xf1\xa7\xef\x00\x00\xa7\xf0\x00\x00\xcc\xc1\xa9\xf1\xac\x46\x00\x00\xce\xe7\x00\x00\xce\xe8\x00\x00\xac\x47\xd1\xce\x00\x00\xae\xc4\xae\xc5\xd1\xcd\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xd3\x00\x00\xb1\xcf\x00\x00\xd5\xa7\xb1\xd6\xb1\xd5\xb1\xce\xb1\xd1\xb1\xd4\xb1\xd0\x00\x00\x00\x00\xd9\x76\xb1\xcd\xb4\xaf\x00\x00\x00\x00\x00\x00\xb4\xb1\xb4\xb2\xd9\x75\xd9\x78\xb4\xb0\xd9\x73\xd9\x77\x00\x00\xd9\x74\x00\x00\xb7\x71\x00\x00\x00\x00\xdd\xbc\x00\x00\x00\x00\xba\x56\xe1\xf4\xbe\xe3\xbc\xc4\xe5\xbd\xbc\xc5\xbc\xc6\xe5\xbf\xe5\xbe\xe5\xc0\xe9\xb1\x00\x00\x00\x00\xe9\xb0", /* 6580 */ "\xec\xef\xec\xee\xc0\xc4\xc0\xc5\xf2\x48\x00\x00\x00\x00\xa4\xe5\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x79\x00\x00\x00\x00\x00\x00\xb4\xb4\xb4\xb3\xdd\xbd\x00\x00\xef\xd8\xc4\xe3\xf7\xde\xa4\xe6\x00\x00\xae\xc6\x00\x00\xb1\xd8\xb1\xd7\xd9\x7a\xd9\x7b\xb7\x72\xe1\xf5\xba\x57\xe9\xb2\x00\x00\xa4\xe7\xa5\xb8\x00\x00\xa9\xf2\xcc\xc2\x00\x00\xce\xe9\xac\x48\xb1\xd9\x00\x00\xd9\x7c\xb4\xb5\xb7\x73\x00\x00\xe5\xc1\xe5\xc2\x00\x00\x00\x00\xec\xf0\xc2\x5f\xf8\xf0\xa4\xe8\x00\x00\xcc\xc3\xa9\xf3\xac\x49\x00\x00\xce\xea\x00\x00\xae\xc7\xd1\xd2\xd1\xd0\xd1\xd1\xae\xc8\xd1\xcf\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xdb\xb1\xdc\xd5\xa8\xb1\xdd\xb1\xda\xd9\x7d\x00\x00\xd9\x7e\xdd\xbe\x00\x00\x00\x00\xba\x59\xba\x58\x00\x00\x00\x00\xec\xf1\xef\xd9\x00\x00\xf2\x4a\xf2\x49\xf4\x4f\x00\x00\xc9\x5e\xac\x4a\x00\x00\x00\x00\xa4\xe9\xa5\xb9\x00\x00\xa6\xae\xa6\xad\x00\x00\x00\x00\xa6\xaf\xa6\xb0\xc9\xee\xc9\xed\xca\xf8\xa7\xf2\xca\xfb\xca\xfa\xca\xf9\xca\xfc\x00\x00\x00\x00\x00\x00\x00\x00\xa9\xf4\xcc\xc9\xcc\xc5\xcc\xce\x00\x00\x00\x00", /* 6600 */ "\xa9\xfb\x00\x00\xa9\xf9\xcc\xca\xcc\xc6\xcc\xcd\xa9\xf8\xaa\x40\xcc\xc8\xcc\xc4\xa9\xfe\xcc\xcb\xa9\xf7\xcc\xcc\xa9\xfa\xa9\xfc\xcc\xd0\xcc\xcf\xcc\xc7\xa9\xf6\xa9\xf5\xa9\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xef\xce\xf5\x00\x00\xac\x50\xac\x4d\xce\xec\xce\xf1\x00\x00\xac\x53\xac\x4b\xce\xf0\xac\x4e\xac\x51\x00\x00\x00\x00\xce\xf3\x00\x00\xac\x4c\xce\xf8\xac\x4f\x00\x00\xac\x52\xce\xed\xce\xf2\xce\xf6\xce\xee\xce\xeb\x00\x00\x00\x00\xce\xf7\xce\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xd0\xae\xc9\xae\xcc\x00\x00\xae\xcf\x00\x00\xd1\xd5\x00\x00\xae\xca\xd1\xd3\x00\x00\xae\xce\x00\x00\x00\x00\xae\xcb\x00\x00\xd1\xd6\xae\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\xac\xb1\xdf\xd5\xab\xd5\xad\xb1\xde\xb1\xe3\xd1\xd4\x00\x00\xd5\xaa\xd5\xae\x00\x00\xb1\xe0\xd5\xa9\xb1\xe2\x00\x00\xb1\xe1\x00\x00\xd9\xa7\x00\x00\xd9\xa2\x00\x00\xb4\xb6\xb4\xba\xb4\xb7\xd9\xa5\xd9\xa8\x00\x00\xb4\xb8\x00\x00\xb4\xb9\xb4\xbe\xdd\xc7\xd9\xa6\xb4\xbc\xd9\xa3\xd9\xa1\x00\x00\xb4\xbd\x00\x00", /* 6680 */ "\xd9\xa4\x00\x00\x00\x00\x00\x00\xb7\x79\x00\x00\xdd\xbf\xb7\x76\xb7\x77\xb7\x75\xdd\xc4\xdd\xc3\xdd\xc0\xb7\x7b\x00\x00\x00\x00\xdd\xc2\xb4\xbb\x00\x00\x00\x00\xdd\xc6\xdd\xc1\xb7\x78\xb7\x74\xb7\x7a\xdd\xc5\x00\x00\x00\x00\x00\x00\xba\x5c\x00\x00\xe1\xf8\xe1\xf7\xe1\xf6\xba\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x5b\xe5\xc5\xe5\xc8\xbc\xc8\x00\x00\x00\x00\xbc\xc7\xe5\xc9\xe5\xc4\xbc\xca\xe5\xc6\x00\x00\xbc\xc9\xe5\xc3\x00\x00\xe5\xc7\xbe\xe9\xbe\xe6\xe9\xbb\xe9\xba\x00\x00\xe9\xb9\xe9\xb4\x00\x00\xe9\xb5\x00\x00\x00\x00\x00\x00\xbe\xe7\x00\x00\xbe\xe4\xbe\xe8\xe9\xb3\xbe\xe5\xe9\xb6\xe9\xb7\xe9\xbc\x00\x00\x00\x00\xe9\xb8\x00\x00\x00\x00\xec\xf2\x00\x00\x00\x00\x00\x00\xc0\xc7\x00\x00\xef\xdc\xc0\xc6\xef\xda\xef\xdb\xc2\x60\xc3\x6e\xf2\x4b\x00\x00\xc3\x6d\x00\x00\x00\x00\xf4\x51\xf4\x52\x00\x00\xc4\x66\x00\x00\xf4\x50\xc4\xe4\x00\x00\xf7\xdf\xc5\xce\xf8\xaa\xf8\xab\x00\x00\xa4\xea\x00\x00\xa6\xb1\xa6\xb2\xa7\xf3\x00\x00\xcc\xd1\xac\x54\xae\xd1\xb1\xe4\x00\x00\x00\x00\xb0\xd2\x00\x00\xb4\xbf\xb4\xc0", /* 6700 */ "\xb3\xcc\xd9\xa9\x00\x00\xb7\x7c\xe1\xfa\xe1\xf9\x00\x00\x00\x00\xa4\xeb\xa6\xb3\xcc\xd2\xaa\x42\x00\x00\xaa\x41\x00\x00\xce\xf9\xce\xfa\x00\x00\xd1\xd7\xd1\xd8\xae\xd2\xae\xd3\x00\x00\xae\xd4\xd5\xaf\x00\x00\x00\x00\xb1\xe6\x00\x00\xb4\xc2\x00\x00\xb4\xc1\xdd\xc8\xdf\x7a\xe1\xfb\xe9\xbd\x00\x00\x00\x00\xc2\x61\xc4\x67\xa4\xec\x00\x00\xa5\xbc\xa5\xbd\xa5\xbb\xa5\xbe\xa5\xba\x00\x00\x00\x00\xa6\xb6\x00\x00\xc9\xf6\xa6\xb5\xa6\xb7\x00\x00\x00\x00\xc9\xf1\xc9\xf0\xc9\xf3\xc9\xf2\xc9\xf5\xa6\xb4\xc9\xef\xc9\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfd\xa7\xfd\xca\xfe\xcb\x43\xa7\xfc\x00\x00\xcb\x47\xcb\x42\xcb\x45\xa7\xf5\xa7\xf6\xa7\xf7\xa7\xf8\x00\x00\xa8\x40\x00\x00\xcb\x41\xa7\xfa\xa8\x41\x00\x00\xcb\x40\xcb\x46\x00\x00\xa7\xf9\xcb\x44\xa7\xfb\xa7\xf4\xa7\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x57\x00\x00\xcc\xd4\xaa\x43\x00\x00\xaa\x4d\xaa\x4e\xaa\x46\xaa\x58\xaa\x48\xcc\xdc\xaa\x53\xcc\xd7\xaa\x49\xcc\xe6\xcc\xe7\xcc\xdf\xcc\xd8\xaa\x56\xcc\xe4\xaa\x51\xaa\x4f", /* 6780 */ "\x00\x00\xcc\xe5\x00\x00\xcc\xe3\xcc\xdb\xcc\xd3\xcc\xda\xaa\x4a\x00\x00\xaa\x50\x00\x00\xaa\x44\xcc\xde\xcc\xdd\xcc\xd5\x00\x00\xaa\x52\xcc\xe1\xcc\xd6\xaa\x55\xcc\xe8\xaa\x45\x00\x00\xaa\x4c\xcc\xd9\xcc\xe2\xaa\x54\x00\x00\xaa\x47\xaa\x4b\x00\x00\xcc\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x5b\xac\x5c\xac\x69\x00\x00\xcf\x56\xcf\x4c\xac\x62\xcf\x4a\xac\x5b\xcf\x45\xac\x65\xcf\x52\xce\xfe\xcf\x41\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x44\xce\xfb\xcf\x51\xcf\x61\xac\x60\xcf\x46\xcf\x58\x00\x00\xce\xfd\xcf\x5f\xcf\x60\xcf\x63\xcf\x5a\xcf\x4b\xcf\x53\xac\x66\xac\x59\xac\x61\xac\x6d\xac\x56\xac\x58\x00\x00\x00\x00\x00\x00\xcf\x43\xac\x6a\xac\x63\xcf\x5d\xcf\x40\xac\x6c\xac\x67\xcf\x49\x00\x00\x00\x00\xac\x6b\xcf\x50\xcf\x48\xac\x64\xcf\x5c\xcf\x54\x00\x00\xac\x5e\xcf\x62\xcf\x47\xac\x5a\xcf\x59\xcf\x4f\xac\x5f\xcf\x55\xac\x57\xce\xfc\xac\x68\xae\xe3\xac\x5d\xcf\x4e\xcf\x4d\xcf\x42\x00\x00\xcf\x5e\x00\x00\xcf\x57\x00\x00\x00\x00\xac\x55", /* 6800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\xec\xae\xea\xd1\xed\x00\x00\xd1\xe1\xae\xdf\xae\xeb\x00\x00\xd1\xda\x00\x00\xd1\xe3\xd1\xeb\x00\x00\xd1\xd9\xd1\xf4\xae\xd5\x00\x00\x00\x00\x00\x00\xd1\xf3\xd1\xee\x00\x00\xd1\xef\xae\xdd\xae\xe8\xd1\xe5\x00\x00\xd1\xe6\xd1\xf0\xd1\xe7\x00\x00\xd1\xe2\xd1\xdc\xd1\xdd\xd1\xea\xd1\xe4\x00\x00\x00\x00\xae\xd6\xae\xda\xd1\xf2\xd1\xde\xae\xe6\xae\xe2\x00\x00\x00\x00\xae\xe5\xae\xec\xae\xdb\xae\xe7\xd1\xe9\xae\xe9\xae\xd8\x00\x00\xae\xd7\xd1\xdb\x00\x00\xd1\xdf\xae\xe0\xd1\xf1\xd1\xe8\xd1\xe0\xae\xe4\xae\xe1\x00\x00\xae\xd9\xae\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\xc4\x00\x00\xd5\xb4\xd5\xb5\xd5\xb9\x00\x00\xd5\xc8\xd5\xc5\x00\x00\xd5\xbe\xd5\xbd\xb1\xed\xd5\xc1\xd5\xd0\xd5\xb0\x00\x00\xd5\xd1\xd5\xc3\xd5\xd5\xd5\xc9\xb1\xec", /* 6880 */ "\xd5\xc7\xb1\xe7\xb1\xfc\xb1\xf2\x00\x00\xb1\xf6\xb1\xf5\xd5\xb1\x00\x00\xd5\xce\xd5\xd4\xd5\xcc\xd5\xd3\x00\x00\x00\x00\xd5\xc0\xd5\xb2\xd5\xd2\xd5\xc2\xb1\xea\xb1\xf7\x00\x00\xd5\xcb\xb1\xf0\x00\x00\x00\x00\x00\x00\xd5\xca\xd5\xb3\xb1\xf8\x00\x00\xb1\xfa\xd5\xcd\xb1\xfb\xb1\xe9\xd5\xba\xd5\xcf\x00\x00\x00\x00\xb1\xef\xb1\xf9\xd5\xbc\xd5\xc6\xd5\xb7\xd5\xbb\xb1\xf4\xd5\xb6\xb1\xe8\xb1\xf1\xb1\xee\xd5\xbf\xae\xde\xd9\xc0\xb1\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xf3\x00\x00\xd9\xc3\xd9\xd9\xd9\xce\xb4\xd6\x00\x00\xb4\xd1\xd9\xbd\xb4\xd2\xd9\xcd\x00\x00\xd9\xc6\xd9\xd3\xb4\xce\xd9\xab\xd9\xd5\xb4\xc4\xd9\xb3\xb4\xc7\xb4\xc6\x00\x00\xb4\xd7\x00\x00\xd9\xad\xd9\xcf\xd9\xd0\xb4\xc9\xb4\xc5\xd9\xbb\x00\x00\xb4\xd0\xd9\xb6\x00\x00\xd9\xd1\xb4\xcc\xd9\xc9\xd9\xd6\xd9\xb0\xd9\xb5\xd9\xaf\x00\x00\xb4\xcb\xd9\xc2\xdd\xde\xd9\xb1\xb4\xcf\xd9\xba\xd9\xd2\xb4\xca\xd9\xb7\xd9\xb4\xd9\xc5\xb4\xcd\xb4\xc3\xb4\xd9\xd9\xc8\xd9\xc7\x00\x00\x00\x00", /* 6900 */ "\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xac\xb4\xc8\xd9\xd4\xd9\xbc\xd9\xbe\x00\x00\xd9\xcb\xd9\xca\xd9\xaa\xb4\xd3\xb4\xd5\xd9\xb2\xd9\xb9\xd9\xc1\xb4\xd4\xd9\xb8\xd9\xc4\xd9\xd7\x00\x00\xd9\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xd8\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xae\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xf2\xb7\xa6\x00\x00\xdd\xf0\xdd\xdb\xdd\xe0\xdd\xd9\x00\x00\xdd\xec\xdd\xcb\xdd\xd2\x00\x00\xdd\xea\xdd\xf4\xdd\xdc\x00\x00\xdd\xcf\xdd\xe2\xdd\xe7\xdd\xd3\x00\x00\xdd\xe4\xdd\xd0\x00\x00\x00\x00\xdd\xd7\xdd\xd8\xb7\xa8\xdd\xeb\xdd\xe9\x00\x00\xdd\xcc\xdd\xee\x00\x00\xdd\xef\xdd\xf1\xb7\xac\xb7\xa4\x00\x00\xd5\xb8\xdd\xd4\xdd\xe6\xdd\xd5\xb7\xa1\xb7\xb1\xdd\xed\xb7\xaf\xb7\xab\xdd\xca\xb7\xa3\x00\x00\xdd\xcd\xb7\xb0\x00\x00\xdd\xdd\xdd\xc9\x00\x00\xb7\xa9\xdd\xe1\xdd\xd1\xb7\xaa\xdd\xda\xb7\x7e\xb4\xd8\xdd\xe3\xd9\xbf\xdd\xce\x00\x00\x00\x00\xdd\xe8\xb7\xa5\xdd\xe5\xb7\xa2\xdd\xdf\xb7\xad\xdd\xd6\xdd\xf3\x00\x00\x00\x00\x00\x00\x00\x00", /* 6980 */ "\x00\x00\x00\x00\xb7\xa7\xde\xc6\x00\x00\x00\x00\xb7\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x4a\xe2\x48\x00\x00\xe2\x5e\xe2\x46\x00\x00\xe2\x58\xb7\x7d\xba\x5f\xe2\x42\xe2\x5d\x00\x00\xe2\x47\xe2\x55\xba\x64\xba\x5d\x00\x00\xe2\x5b\x00\x00\xe2\x40\xe2\x5a\x00\x00\xba\x6f\xe2\x51\xe2\x61\xba\x6d\xe2\x49\xba\x5e\xe2\x4b\xe2\x59\xba\x67\xe2\x44\xba\x6b\xba\x61\xe2\x4d\xe2\x43\xe1\xfc\x00\x00\xe2\x57\xba\x68\xe2\x60\xe1\xfd\xba\x65\x00\x00\xe2\x53\x00\x00\xba\x66\xe2\x45\xe2\x50\xe2\x4c\xe2\x4e\x00\x00\xba\x60\xe2\x5f\xba\x6e\xe2\x4f\x00\x00\xe2\x62\x00\x00\x00\x00\xe1\xfe\xe2\x54\xba\x63\xba\x6c\xba\x6a\xe2\x41\xe2\x56\xba\x69\x00\x00\x00\x00\xba\x62\xe2\x52\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xd5\x00\x00\xe5\xd1\xe5\xcd\xe5\xe1\xe5\xde\xbc\xcd\x00\x00\x00\x00\xe5\xe5\xe5\xd4\xbc\xd8\xe5\xdb\x00\x00\x00\x00\xe5\xd0\xe5\xda\xbc\xd5\xe5\xee\x00\x00\xe5\xeb\xe5\xdd\xe5\xce\x00\x00\x00\x00\xe5\xe2\xe5\xe4\xbc\xd1\xe5\xd8\xe5\xd3", /* 6a00 */ "\xe5\xca\xbc\xce\xbc\xd6\x00\x00\xe5\xe7\xbc\xd7\xe5\xcb\xe5\xed\xe5\xe0\xe5\xe6\xbc\xd4\x00\x00\x00\x00\xe5\xe3\x00\x00\xe5\xea\x00\x00\xbc\xd9\x00\x00\xbc\xd3\xe5\xdc\xe5\xcf\xe5\xef\xe5\xcc\xe5\xe8\xbc\xd0\x00\x00\xe5\xd6\x00\x00\xe5\xd7\xbc\xcf\xbc\xcc\xe5\xd2\xbc\xd2\x00\x00\xbc\xcb\x00\x00\xe5\xe9\xe5\xec\xe5\xd9\xe9\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xc2\x00\x00\xe9\xbe\xbe\xf6\x00\x00\x00\x00\xbe\xeb\xbe\xf0\xbe\xec\xe9\xcc\xe9\xd7\xbe\xea\xe9\xc4\xe9\xcd\xe5\xdf\xe9\xce\x00\x00\x00\x00\xbe\xf1\x00\x00\xe9\xdd\xbe\xf5\xbe\xf8\xe9\xc0\x00\x00\xbe\xf4\x00\x00\xe9\xdb\xe9\xdc\xe9\xd2\xe9\xd1\xe9\xc9\x00\x00\x00\x00\xe9\xd3\xe9\xda\xe9\xd9\x00\x00\xbe\xef\xbe\xed\xe9\xcb\xe9\xc8\x00\x00\xe9\xc5\xe9\xd8\xbe\xf7\xe9\xd6\xbe\xf3\xbe\xf2\x00\x00\xe9\xd0\x00\x00\xe9\xbf\xe9\xc1\xe9\xc3\xe9\xd5\xe9\xcf\xbe\xee\x00\x00\xe9\xc6\x00\x00\xe9\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xcf\xed\x45", /* 6a80 */ "\xc0\xc8\xec\xf5\x00\x00\xed\x41\xc0\xca\xed\x48\x00\x00\xec\xfc\x00\x00\xec\xf7\x00\x00\x00\x00\xed\x49\xec\xf3\xec\xfe\x00\x00\xc0\xd1\xed\x44\xed\x4a\xec\xfd\xc0\xc9\xed\x40\xec\xf4\xc0\xd0\x00\x00\x00\x00\xed\x47\xec\xf9\xc0\xcc\x00\x00\xec\xfb\xec\xf8\xc0\xd2\xec\xfa\xc0\xcb\xc0\xce\xed\x43\xec\xf6\xed\x46\x00\x00\xed\x42\x00\x00\x00\x00\x00\x00\xc2\x63\xef\xe7\xc2\x68\xc2\x69\x00\x00\x00\x00\x00\x00\xc2\x62\xef\xe6\x00\x00\xef\xe3\xef\xe4\xc2\x66\xef\xde\xef\xe2\xc2\x65\x00\x00\xef\xdf\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x67\xc2\x64\x00\x00\xef\xdd\xef\xe1\xef\xe5\x00\x00\x00\x00\x00\x00\xf2\x51\xf2\x4e\xf2\x57\x00\x00\xf2\x56\xf2\x54\xf2\x4f\x00\x00\xc3\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x50\xc3\x71\xc0\xcd\xf2\x53\xc3\x70\xf2\x58\xf2\x52\xf2\x4d\xef\xe0\x00\x00\x00\x00\x00\x00\xc3\x6f\x00\x00\xf2\x4c\xf4\x56\x00\x00\xf4\x55\xf2\x55\xc4\x68\x00\x00\xf4\x59\xf4\x5a\xf4\x54\xf4\x58\x00\x00\xf4\x53\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xd1\xf4\x57\xc4\xe7\xc4\xe5\xf5\xcf\x00\x00\x00\x00\x00\x00", /* 6b00 */ "\xf5\xd2\x00\x00\xf5\xce\xf5\xd0\xc4\xe6\x00\x00\x00\x00\x00\x00\xf6\xe5\xf6\xe6\xc5\x76\xf6\xe4\x00\x00\x00\x00\x00\x00\xf7\xe2\xc5\xcf\xf7\xe0\xf7\xe1\xf8\xac\x00\x00\x00\x00\xc6\x56\xf8\xf3\xf8\xf1\xf8\xf2\xf8\xf4\x00\x00\x00\x00\x00\x00\xf9\xbb\x00\x00\xa4\xed\xa6\xb8\x00\x00\xaa\x59\x00\x00\xcc\xe9\x00\x00\x00\x00\xcf\x64\x00\x00\x00\x00\x00\x00\xd1\xf5\xd1\xf7\x00\x00\xd1\xf6\x00\x00\xd1\xf8\xb1\xfd\xd5\xd7\xd1\xf9\x00\x00\xd5\xd6\xd5\xd8\xd5\xd9\xd9\xda\xb4\xdb\xd9\xdb\xd9\xdd\xb4\xdc\xb4\xda\xd9\xdc\x00\x00\xdd\xfa\xdd\xf8\xdd\xf7\x00\x00\xdd\xf6\xdd\xf5\xb7\xb2\xdd\xf9\xba\x70\xe2\x63\xe2\x65\xba\x71\xe2\x64\xbc\xdb\x00\x00\xbc\xda\xe5\xf0\x00\x00\x00\x00\xe9\xdf\xe9\xde\xe9\xe0\x00\x00\x00\x00\xbe\xf9\x00\x00\xed\x4b\xc0\xd3\x00\x00\xef\xe8\xc2\x6a\xf2\x59\xc5\x77\xa4\xee\xa5\xbf\xa6\xb9\xa8\x42\xaa\x5a\xaa\x5b\x00\x00\x00\x00\xac\x6e\x00\x00\x00\x00\xd1\xfa\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xb3\x00\x00\x00\x00\x00\x00\xe6\xd1\xbe\xfa\xc2\x6b\xa4\xef\x00\x00\xa6\xba\x00\x00\x00\x00\xcc\xeb\xaa\x5c", /* 6b80 */ "\xcc\xea\x00\x00\xcf\x65\xac\x6f\xcf\x66\x00\x00\xac\x70\x00\x00\xd1\xfc\xae\xee\xae\xed\x00\x00\xd5\xde\xd5\xdc\xd5\xdd\xd5\xdb\x00\x00\xd5\xda\x00\x00\x00\x00\xd9\xde\xd9\xe1\xb4\xde\xd9\xdf\xb4\xdd\xd9\xe0\x00\x00\xdd\xfb\x00\x00\x00\x00\xe2\x66\xe2\x67\xe2\x68\x00\x00\xe5\xf3\xe5\xf2\xbc\xdc\xe5\xf1\xe5\xf4\xe9\xe1\x00\x00\x00\x00\xe9\xe2\xe9\xe3\x00\x00\xed\x4c\xc0\xd4\xc2\x6c\xf2\x5a\x00\x00\xc4\xe8\xc9\x5f\x00\x00\xac\x71\xcf\x67\xae\xef\x00\x00\x00\x00\xb1\xfe\x00\x00\xb4\xdf\xd9\xe2\x00\x00\xb7\xb5\xb7\xb4\x00\x00\x00\x00\xe2\x69\xe2\x6a\xbc\xdd\xbc\xde\xe9\xe5\xe9\xe4\xef\xe9\xf7\xe3\xa4\xf0\xc9\x60\xa5\xc0\x00\x00\xa8\x43\xcb\x48\x00\x00\xac\x72\xb7\xb6\xa4\xf1\x00\x00\xcf\x68\xac\x73\xcf\x69\x00\x00\xc0\xd5\xa4\xf2\x00\x00\x00\x00\xcc\xec\x00\x00\xcf\x6a\x00\x00\xd2\x42\xd2\x41\xd1\xfe\x00\x00\xd1\xfd\xd2\x43\xd2\x40\x00\x00\x00\x00\xb2\x40\xb2\x41\x00\x00\x00\x00\xb4\xe0\xd9\xe3\x00\x00\xd9\xe4\xd9\xe5\x00\x00\x00\x00\x00\x00\xde\x41\xde\x42\xde\x40\x00\x00\xdd\xfd\xdd\xfe\xb7\xb7\xe2\x6b\xe5\xf7", /* 6c00 */ "\xe5\xf6\xe5\xf5\xe5\xf8\xe9\xe7\xe9\xe6\xbe\xfb\xe9\xe8\x00\x00\xc0\xd6\xed\x4d\x00\x00\xef\xea\xf2\x5b\xf6\xe7\x00\x00\xa4\xf3\xa5\xc2\xa5\xc1\x00\x00\xaa\x5d\xc9\x61\xc9\x7e\xa6\xbb\x00\x00\xc9\xf7\xcb\x49\xcb\x4a\xaa\x5e\x00\x00\xcc\xed\x00\x00\xac\x74\xcf\x6b\xcf\x6c\x00\x00\xae\xf0\xae\xf4\xd2\x44\xae\xf3\xae\xf1\xae\xf2\x00\x00\xd5\xdf\xb2\x42\xb4\xe3\x00\x00\xb4\xe1\xb4\xe2\xd9\xe6\x00\x00\x00\x00\xba\x72\xa4\xf4\x00\x00\xc9\xa1\x00\x00\xa5\xc3\x00\x00\x00\x00\xc9\xa4\x00\x00\x00\x00\xa5\xc6\xc9\xa3\xa5\xc5\xa5\xc4\xa8\x44\xc9\xa2\x00\x00\x00\x00\xc9\xf8\x00\x00\x00\x00\x00\x00\xc9\xfc\xc9\xfe\xca\x40\xa6\xc5\xa6\xc6\xc9\xfb\xa6\xc1\x00\x00\xc9\xf9\x00\x00\xc9\xfd\xa6\xc2\x00\x00\xa6\xbd\x00\x00\xa6\xbe\x00\x00\xa6\xc4\xc9\xfa\xa6\xbc\xa8\x45\xa6\xbf\xa6\xc0\xa6\xc3\x00\x00\x00\x00\x00\x00\xcb\x5b\xcb\x59\xcb\x4c\xa8\x51\xcb\x53\xa8\x4c\xcb\x4d\x00\x00\xcb\x55\x00\x00\xcb\x52\xa8\x4f\xcb\x51\xa8\x56\xcb\x5a\xa8\x58\x00\x00\xa8\x5a\x00\x00\xcb\x4b\x00\x00\xa8\x4d\xcb\x5c\x00\x00\xa8\x54\xa8\x57\x00\x00", /* 6c80 */ "\xcd\x45\xa8\x47\xa8\x5e\xa8\x55\xcb\x4e\xa8\x4a\xa8\x59\xcb\x56\xa8\x48\xa8\x49\xcd\x43\xcb\x4f\xa8\x50\xa8\x5b\xcb\x5d\xcb\x50\xa8\x4e\x00\x00\xa8\x53\xcc\xee\xa8\x5c\xcb\x57\xa8\x52\x00\x00\xa8\x5d\xa8\x46\xcb\x54\xa8\x4b\xcb\x58\xcd\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x6a\xaa\x7a\xcc\xf5\xaa\x71\x00\x00\xcd\x4b\xaa\x62\x00\x00\xaa\x65\xcd\x42\x00\x00\xcc\xf3\xcc\xf7\xaa\x6d\xaa\x6f\xcc\xfa\xaa\x76\xaa\x68\xaa\x66\xaa\x67\xaa\x75\xcd\x47\xaa\x70\xcc\xf9\xcc\xfb\xaa\x6e\xaa\x73\xcc\xfc\xcd\x4a\x00\x00\xac\x75\xaa\x79\x00\x00\xaa\x63\xcd\x49\x00\x00\xcd\x4d\xcc\xf8\xcd\x4f\xcd\x40\xaa\x6c\xcc\xf4\xaa\x6b\xaa\x7d\xaa\x72\x00\x00\xcc\xf2\xcf\x75\xaa\x78\xaa\x7c\xcd\x41\xcd\x46\x00\x00\xaa\x7e\xaa\x77\xaa\x69\xaa\x5f\x00\x00\xaa\x64\x00\x00\xcc\xf6\xaa\x60\xcd\x4e\x00\x00\xcc\xf0\xcc\xef\xcc\xfd\xcc\xf1\xaa\x7b\xae\xf5\xaa\x74\xcc\xfe\xaa\x61\x00\x00\xac\xa6\x00\x00\x00\x00\x00\x00\xcd\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d00 */ "\xcf\x7c\xcf\xa1\x00\x00\xcf\xa4\xcf\x77\x00\x00\x00\x00\xcf\xa7\xcf\xaa\xcf\xac\xcf\x74\xac\x76\xac\x7b\xd2\x49\xac\xad\xcf\xa5\xcf\xad\xcf\x7b\xcf\x73\x00\x00\x00\x00\x00\x00\xd2\x64\xac\x7e\xcf\xa2\xcf\x78\xcf\x7a\xac\xa5\x00\x00\xcf\x7d\xac\x7d\xcf\x70\xcf\xa8\x00\x00\xcf\xab\x00\x00\x00\x00\xac\x7a\x00\x00\xac\xa8\xcf\x6d\xac\xaa\xac\x78\xac\xae\xcf\xa9\xcf\x6f\xac\xab\xd2\x5e\xcd\x48\xac\x7c\xac\x77\xcf\x76\xcf\x6e\xac\xac\xac\xa4\xcf\xa3\xac\xa9\xac\xa7\xcf\x79\xac\xa1\xcf\x71\xac\xa2\xac\xa3\xcf\x72\xcf\xa6\xac\x79\xcf\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x4c\xae\xfd\xaf\x43\x00\x00\x00\x00\x00\x00\xd2\x55\xd2\x5b\xd2\x57\xd2\x4a\xd2\x4d\xd2\x46\xd2\x47\xaf\x4a\xae\xfa\xd2\x56\xd2\x5f\xaf\x45\xae\xf6\x00\x00\xaf\x40\xd2\x4e\xaf\x42\xd2\x4f\xd2\x59\x00\x00\x00\x00\x00\x00\xaf\x44\xd2\x68\xd2\x48\xae\xfc\xae\xfb\xaf\x48\xd2\x45\xd2\x66\xd2\x5a\xd2\x67\xd2\x61\xd2\x53", /* 6d80 */ "\xd2\x62\x00\x00\xd2\x5c\xd2\x65\xd2\x63\xaf\x49\xd2\x54\xae\xf9\xae\xf8\xaf\x41\xaf\x47\xd2\x60\xaf\x46\xd2\x51\xb2\x43\x00\x00\xd2\x69\xd2\x50\xd2\x4b\xae\xfe\xaf\x4b\xae\xf7\x00\x00\xd2\x58\xd2\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x65\xd5\xe1\xd5\xe5\x00\x00\xb2\x52\xb2\x50\x00\x00\x00\x00\xb2\x47\xd5\xe3\xd5\xe2\xb2\x5b\x00\x00\xd5\xe8\xb2\x55\x00\x00\xd5\xfa\xd6\x47\xb2\x44\xd5\xf7\xd5\xf0\xb2\x67\xd5\xe0\x00\x00\xd5\xfc\x00\x00\xb2\x64\xb2\x58\xb2\x63\xb2\x4e\xd5\xec\xd5\xfe\xd5\xf6\xb2\x4f\xb2\x49\xd6\x45\x00\x00\xd5\xfd\xd6\x40\xb2\x51\xb2\x59\xd6\x42\xd5\xea\xd5\xfb\xd5\xef\xd6\x44\xb2\x5e\xb2\x46\xb2\x5c\xd5\xf4\xd5\xf2\xd5\xf3\xb2\x53\xd5\xee\xd5\xed\xb2\x48\xd5\xe7\xd6\x46\xb2\x4a\xd5\xf1\xb2\x68\x00\x00\xb2\x62\xd5\xe6\xb2\x5f\xb2\x5d\xb2\x66\xd5\xf8\xb2\x61\xd2\x52\xd5\xf9\xb2\x60\xd6\x41\xb2\x45\xd5\xf5\xb2\x57\xd5\xe9\xb2\x56\x00\x00\xb2\x54\xb2\x4c\xb2\x4b\xd9\xe7\xd6\x43\x00\x00\x00\x00", /* 6e00 */ "\xd5\xeb\x00\x00\x00\x00\xd9\xfc\x00\x00\xb2\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x41\xb2\x5a\xb4\xee\xd9\xf6\xb4\xfc\x00\x00\xd9\xea\xb4\xeb\xb4\xe7\xda\x49\xb4\xed\xb4\xf1\xb4\xec\xb4\xf5\xda\x4d\xda\x44\x00\x00\x00\x00\xd9\xf1\xb4\xfa\xb4\xf4\xd9\xfd\xb4\xe4\xda\x4a\xda\x43\xb4\xe8\xd9\xf7\xb4\xf7\xda\x55\xda\x56\x00\x00\xb4\xe5\xda\x48\xb4\xf9\xd9\xfb\xd9\xed\xd9\xee\xb4\xfd\xd9\xf2\xd9\xf9\xd9\xf3\x00\x00\xb4\xfb\xb5\x44\xd9\xef\xd9\xe8\xd9\xe9\x00\x00\xd9\xeb\xb4\xea\xd9\xf8\x00\x00\xb4\xf8\xb5\x42\x00\x00\x00\x00\xd9\xfa\xda\x53\xda\x4b\xb4\xe6\xda\x51\xb4\xf2\x00\x00\xb4\xf0\x00\x00\xda\x57\xb4\xef\xda\x41\xd9\xf4\xd9\xfe\xb5\x47\xda\x45\xda\x42\xd9\xf0\xb5\x43\xda\x4f\xda\x4c\xda\x54\xb4\xe9\xda\x40\xb5\x46\x00\x00\xda\x47\x00\x00\x00\x00\xb4\xf3\xb4\xf6\x00\x00\xda\x46\xb5\x45\xd9\xf5\xd5\xe4\x00\x00\x00\x00\xda\x50\xda\x4e\xda\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6e80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xec\xb5\x40\x00\x00\x00\x00\x00\x00\xde\x61\xde\x60\xde\x46\xb7\xbd\x00\x00\xde\x5f\xde\x49\xde\x4a\x00\x00\xb7\xc7\xde\x68\xb7\xc2\xde\x5e\x00\x00\xde\x43\xb7\xc8\xb7\xbe\xde\x52\xde\x48\xde\x4b\xde\x63\xb7\xb8\xde\x6a\xde\x62\xb7\xc1\xde\x57\xb7\xcc\x00\x00\x00\x00\xb7\xcb\xb7\xc5\x00\x00\x00\x00\xde\x69\xb7\xb9\xde\x55\xde\x4c\xde\x59\xde\x65\xb7\xcd\x00\x00\xb7\xbb\xde\x54\x00\x00\xde\x4d\xb7\xc4\x00\x00\xb7\xc3\xde\x50\xde\x5a\xde\x64\xde\x47\xde\x51\xb7\xbc\xde\x5b\xb7\xc9\xb7\xc0\xde\x4e\xb7\xbf\xde\x45\xde\x53\xde\x67\xb4\xfe\xba\xb0\xde\x56\xe2\x6c\xde\x58\xde\x66\xb7\xc6\xde\x4f\xb7\xba\xb7\xca\xbc\xf0\xde\x44\x00\x00\xde\x5d\x00\x00\x00\x00\x00\x00\xde\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xaa\xba\xad\xe2\x7d\xe2\xa4\xba\xa2\x00\x00\xe2\x6e\xba\xaf\x00\x00\xba\x77\xe2\x6d\xe2\xb0\xba\xb1\xe2\x71\xe2\xa3\x00\x00\xe2\x73\xe2\xb3\xe2\xaf\xba\x75\xba\xa1", /* 6f00 */ "\xe6\x53\xba\xae\xba\x7d\xe2\x6f\x00\x00\xe2\xae\xba\xa3\xe2\xab\xe2\xb8\xe2\x75\xe2\x7e\x00\x00\x00\x00\xe2\xb6\xe2\xac\xba\x7c\x00\x00\x00\x00\xe2\x7c\xba\x76\xba\x74\xba\xa8\x00\x00\x00\x00\xe2\x7a\xe2\x77\xe2\x78\x00\x00\xe2\xb2\x00\x00\xe2\xb7\xe2\xb5\xba\x7a\xe2\xb9\xba\x7e\xba\xa7\x00\x00\xe2\x70\xe5\xfa\xe2\x79\x00\x00\xba\x78\xba\xac\xba\xa9\xba\x7b\xe2\xa5\xe2\x74\xba\xaa\xe2\xa7\xba\xa4\xba\xa6\xba\x73\x00\x00\xe2\xa9\xe2\xa1\xe2\x72\xba\xa5\xe2\xb1\xe2\xb4\xe2\x7b\xe2\xa8\x00\x00\xba\x79\xbc\xdf\xe2\xa6\xe5\xf9\x00\x00\xe2\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x76\xe6\x44\xe6\x4e\xbc\xe2\xe6\x4d\xe6\x59\xbc\xe4\xe6\x4b\x00\x00\xe6\x4f\xbc\xef\x00\x00\xe6\x46\xbc\xe7\x00\x00\xe6\x52\xe9\xf0\xbc\xf3\xbc\xf2\xe6\x54\xe6\x43\xe6\x5e\xbc\xed\x00\x00\xbc\xe3\xe6\x57\x00\x00\xe6\x5b\xe6\x60\xe6\x55\xe6\x49\xbc\xe6\xbc\xe9\xbc\xf1\xbc\xec\x00\x00\xe6\x4c\xe2\xa2\x00\x00\x00\x00\xe6\x48\xe6\x5f\xbc\xe8\x00\x00\xbc\xeb\xe6\x61\xbc\xe0\xe6\x56\xe5\xfb\xe6\x5c", /* 6f80 */ "\xc0\xdf\x00\x00\xe6\x4a\x00\x00\xbc\xe1\xe6\x45\xbc\xe5\xe5\xfc\xba\xab\xe6\x41\x00\x00\xe6\x5a\xe6\x42\xe6\x40\xbc\xea\x00\x00\xe6\x58\x00\x00\xe5\xfe\xe6\x51\xe6\x50\xe6\x5d\xe6\x47\xbc\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xf3\x00\x00\xbf\x49\xbe\xfe\xea\x40\xe9\xeb\xbf\x41\xe9\xf7\xbf\x48\xbf\x43\xe9\xf5\xed\x4f\xe9\xfb\xea\x42\xe9\xfa\xe9\xe9\xe9\xf8\xea\x44\xea\x46\xbe\xfd\xea\x45\xbf\x44\xbf\x4a\x00\x00\xbf\x47\x00\x00\xe9\xfe\xbf\x46\xe9\xf9\x00\x00\xe9\xed\xe9\xf2\x00\x00\xe9\xfd\xbf\x45\xbf\x42\xbe\xfc\xbf\x40\xe9\xf1\x00\x00\xe5\xfd\xe9\xec\xe9\xef\xea\x41\xe9\xf4\xe9\xea\xed\x4e\xea\x43\xe9\xee\xe9\xfc\x00\x00\x00\x00\x00\x00\x00\x00\xed\x51\xc0\xe3\x00\x00\x00\x00\xc0\xd7\x00\x00\x00\x00\xc0\xdb\xed\x53\xed\x59\xed\x57\xc0\xd9\xc0\xda\xc0\xe1\xed\x5a\xed\x52\xc0\xdc\x00\x00\xed\x56\xed\x55\xed\x5b\xc0\xe2\x00\x00\xc0\xdd\xc0\xe0\xed\x54\xc0\xe4\xc0\xde\xc0\xe5\xc0\xd8\xed\x58\x00\x00\xed\x50\x00\x00\x00\x00\xef\xf7\x00\x00\x00\x00\xc2\x71\xef\xf4\xef\xf6\x00\x00\xc2\x6f\xef\xf2", /* 7000 */ "\xef\xf3\xef\xee\x00\x00\x00\x00\xe9\xf6\xef\xef\xc2\x70\xef\xeb\x00\x00\xc2\x6d\xef\xf8\xc2\x6e\xef\xec\xef\xed\xef\xf1\xc2\x73\x00\x00\xc2\x72\x00\x00\x00\x00\xef\xf0\xc3\x78\xf2\x5f\xf2\x65\xc3\x79\xf2\x5c\xc3\x76\xc3\x73\xf2\x67\xc3\x77\x00\x00\xc3\x74\xf2\x5e\xf2\x61\xf2\x62\xf2\x63\xf2\x66\x00\x00\xef\xf5\xf2\x5d\xc3\x75\xf2\x64\xf2\x68\xf2\x60\x00\x00\x00\x00\x00\x00\xf4\x5d\xc4\x6a\xf4\x60\xc4\x6b\xf4\x68\xf4\x5f\xf4\x5c\x00\x00\xf4\x5e\xf4\x62\xf4\x65\xf4\x64\xf4\x67\xf4\x5b\x00\x00\xc4\x69\xf4\x63\xf4\x66\xf4\x69\xf4\x61\xf5\xd3\xf5\xd4\xf5\xd8\xf5\xd9\x00\x00\xf5\xd6\xf5\xd7\xf5\xd5\x00\x00\xc4\xe9\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x78\xf6\xeb\x00\x00\x00\x00\xf6\xe8\xf6\xe9\xf6\xea\xc5\x79\x00\x00\xf7\xe5\xf7\xe4\x00\x00\xf8\xaf\xc5\xf4\xf8\xad\xf8\xb0\xf8\xae\xf8\xf5\xc6\x57\xc6\x65\xf9\xa3\xf9\x6c\x00\x00\xf9\xa2\xf9\xd0\xf9\xd1\xa4\xf5\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xc7\xca\x41\x00\x00\x00\x00\xcb\x5e\x00\x00\xa8\x5f\x00\x00\xa8\x62\x00\x00\xcb\x5f\x00\x00\xa8\x60\xa8\x61\x00\x00\x00\x00", /* 7080 */ "\x00\x00\x00\x00\xcd\x58\xcd\x5a\xcd\x55\xcd\x52\xcd\x54\x00\x00\x00\x00\x00\x00\xaa\xa4\x00\x00\x00\x00\x00\x00\xaa\xa2\x00\x00\x00\x00\xcd\x56\xaa\xa3\xcd\x53\xcd\x50\xaa\xa1\xcd\x57\x00\x00\xcd\x51\xaa\xa5\xcd\x59\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xaf\x00\x00\xcf\xb3\x00\x00\x00\x00\xac\xb7\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xb6\x00\x00\xac\xaf\xac\xb2\xac\xb4\xac\xb6\xac\xb3\xcf\xb2\xcf\xb1\x00\x00\xac\xb1\xcf\xb4\xcf\xb5\x00\x00\xcf\xae\xac\xb5\x00\x00\xac\xb0\x00\x00\x00\x00\x00\x00\xcf\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x77\xd2\x78\xd2\x79\xaf\x50\x00\x00\xaf\x4c\xd2\x6e\x00\x00\xd2\x76\xd2\x7b\xaf\x51\x00\x00\xd2\x6c\xd2\x72\xd2\x6b\xd2\x75\x00\x00\x00\x00\xd2\x71\xaf\x4d\xaf\x4f\xd2\x7a\x00\x00\xd2\x6a\xd2\x6d\xd2\x73\x00\x00\xd2\x74\xd2\x7c\xd2\x70\x00\x00\xaf\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x6d\xd6\x4e\x00\x00\x00\x00\xd6\x50\xd6\x4c\x00\x00\xd6\x58\xd6\x4a\xd6\x57\xb2\x69\xd6\x48\xda\x5b\xd6\x52\xb2\x6c\x00\x00\xd6\x53", /* 7100 */ "\xd6\x56\x00\x00\xd6\x5a\x00\x00\xd6\x4f\x00\x00\xd6\x54\x00\x00\x00\x00\xb2\x6a\xb2\x6b\xd6\x59\xd6\x4d\xd6\x49\xd6\x5b\x00\x00\xd6\x51\x00\x00\x00\x00\xd6\x55\x00\x00\x00\x00\x00\x00\xd6\x4b\x00\x00\xb5\x48\xb5\x49\xda\x65\xb5\x4f\x00\x00\xda\x59\xda\x62\xda\x58\xb5\x4c\xda\x60\xda\x5e\x00\x00\xda\x5f\xb5\x4a\x00\x00\xda\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x5c\xda\x5a\xb5\x4b\xda\x5d\xda\x61\x00\x00\x00\x00\x00\x00\xb5\x4d\x00\x00\x00\x00\x00\x00\xda\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x70\xde\x77\xde\x79\xde\xa1\x00\x00\xb7\xda\xde\x6b\x00\x00\xb7\xd2\x00\x00\xde\x7a\xb7\xd7\xde\xa2\xb7\xce\x00\x00\xde\x7d\x00\x00\xde\x6d\xde\x7e\xde\x6c\x00\x00\xb7\xdc\x00\x00\xde\x78\xb7\xcf\xde\xa3\x00\x00\xb7\xd4\xde\x71\xb7\xd9\xde\x7c\xde\x6f\xde\x76\xde\x72\xde\x6e\xb7\xd1\xb7\xd8\xb7\xd6\xb7\xd3\xb7\xdb\xb7\xd0\xde\x75\x00\x00\xb7\xd5\x00\x00\xb5\x4e\x00\x00\xde\x7b\x00\x00\xde\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x74\x00\x00\x00\x00\xe2\xc1\x00\x00\xba\xb4\x00\x00\x00\x00", /* 7180 */ "\xe2\xbd\xe2\xc3\xe2\xbf\x00\x00\xba\xb6\xe2\xbe\xe2\xc2\xe2\xba\x00\x00\xe2\xbc\xba\xb5\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xc0\xe2\xbb\x00\x00\xba\xb7\x00\x00\xba\xb2\x00\x00\x00\x00\xe2\xc4\x00\x00\xba\xb3\xe6\x67\xe6\x64\xe6\x70\xe6\x6a\xe6\x6c\xbc\xf4\xe6\x66\xe6\x6e\x00\x00\x00\x00\xe6\x6d\xe6\x6b\x00\x00\xe6\x71\xbc\xf7\xe6\x68\xe6\x6f\x00\x00\xbc\xf5\x00\x00\x00\x00\xe6\x63\xe6\x65\xbc\xf6\xe6\x62\xe6\x72\x00\x00\xe6\x69\x00\x00\x00\x00\xea\x4a\xbf\x51\x00\x00\x00\x00\xea\x55\xea\x53\xbf\x4b\xea\x49\xea\x4c\xea\x4d\xea\x48\xbf\x55\xbf\x56\xea\x47\xea\x56\xea\x51\xbf\x4f\xbf\x4c\xea\x50\xea\x4e\x00\x00\x00\x00\xbf\x52\xea\x52\xbf\x4d\x00\x00\xbf\x4e\x00\x00\xea\x4f\xbf\x50\xea\x4b\x00\x00\xea\x54\xbf\x53\xea\x57\xea\x58\xbf\x54\x00\x00\x00\x00\xc0\xe7\xc0\xee\xed\x5c\xed\x62\x00\x00\xed\x60\xc0\xea\xc0\xe9\xc0\xe6\xed\x5e\x00\x00\x00\x00\x00\x00\xc0\xec\xc0\xeb\xc0\xe8\x00\x00\xed\x61\xed\x5d\xed\x5f\x00\x00\xc0\xed\x00\x00\x00\x00\x00\x00\xc2\x77\xef\xfb\x00\x00\xc2\x74\xc2\x75\xef\xfd\xc2\x76\xef\xfa", /* 7200 */ "\x00\x00\xef\xf9\xf2\x6c\xef\xfc\x00\x00\xf2\x6d\xc3\x7a\xf2\x6b\x00\x00\x00\x00\xf2\x6a\x00\x00\xf2\x69\xc3\x7b\x00\x00\x00\x00\xc4\x6c\x00\x00\x00\x00\xf4\x6a\xf4\x6b\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xdc\xf5\xdb\xc4\xea\x00\x00\xf5\xda\xf6\xec\xf6\xed\x00\x00\x00\x00\xf7\xe6\xf8\xb1\x00\x00\x00\x00\xf8\xf6\xf9\xbc\xc6\x79\xf9\xc6\xa4\xf6\x00\x00\xaa\xa6\xaa\xa7\x00\x00\x00\x00\xac\xb8\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xef\xa4\xf7\x00\x00\xaa\xa8\xaf\x52\xb7\xdd\xa4\xf8\x00\x00\xb2\x6e\xba\xb8\xc9\x62\x00\x00\xcf\xb7\xd2\x7d\x00\x00\xe2\xc5\x00\x00\xc0\xf0\xa4\xf9\xaa\xa9\xcf\xb8\xcf\xb9\xda\x66\xb5\x50\x00\x00\x00\x00\xde\xa4\x00\x00\x00\x00\xb7\xde\xe2\xc6\x00\x00\x00\x00\xbc\xf8\x00\x00\xc3\x7c\xa4\xfa\xda\x67\xa4\xfb\x00\x00\xa6\xc9\xca\x42\xa6\xc8\xa8\x65\xa8\x64\xa8\x63\xcb\x60\x00\x00\x00\x00\x00\x00\xaa\xaa\x00\x00\xaa\xab\xcd\x5b\x00\x00\xcf\xba\x00\x00\xcf\xbd\xac\xba\xcf\xbb\x00\x00\xac\xb9\xcf\xbc\xac\xbb\x00\x00\xd2\xa2\xd2\xa1\xd2\x7e\xaf\x53\x00\x00\xd6\x5d\xd6\x5e\xb2\x6f\xd6\x5c\xd6\x5f", /* 7280 */ "\xb5\x52\xb2\x70\x00\x00\x00\x00\xb5\x51\xda\x6b\xda\x6a\x00\x00\xda\x68\xda\x69\x00\x00\xda\x6c\xde\xa6\xde\xa5\xde\xa9\x00\x00\xde\xa8\xde\xa7\xba\xb9\xe2\xc9\x00\x00\xe2\xc8\xba\xba\xe2\xc7\xe6\x73\x00\x00\xe6\x74\xbc\xf9\x00\x00\xea\x59\xea\x5a\x00\x00\x00\x00\xf2\x72\xc3\x7d\xf2\x71\xf2\x70\xf2\x6e\xf2\x6f\xc4\xeb\xf4\x6c\xf6\xee\xf8\xf7\x00\x00\xa4\xfc\x00\x00\xc9\xa5\xa5\xc7\xc9\xa6\x00\x00\x00\x00\x00\x00\xca\x43\xca\x44\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x66\x00\x00\x00\x00\xcb\x62\x00\x00\xcb\x61\xaa\xac\xcb\x65\xa8\x67\xcb\x63\xa8\x66\xcb\x67\xcb\x64\x00\x00\x00\x00\xcd\x5f\xcf\xbe\xcd\x5d\xcd\x64\x00\x00\xaa\xad\x00\x00\xaa\xb0\xcd\x65\xcd\x61\x00\x00\xcd\x62\x00\x00\xcd\x5c\xaa\xaf\xcd\x5e\xaa\xae\xcd\x63\x00\x00\xcd\x60\x00\x00\x00\x00\xcf\xc2\xac\xbd\xac\xbe\x00\x00\xcf\xc5\xcf\xbf\x00\x00\xcf\xc4\x00\x00\xcf\xc0\xac\xbc\xcf\xc3\xcf\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xa8\xd2\xa5\x00\x00\xd2\xa7\xaf\x58\xaf\x57\xaf\x55\xd2\xa4\xd2\xa9\xaf\x54\xaf\x56\xd2\xa6\xd6\x67", /* 7300 */ "\xd2\xa3\xd2\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x62\xd6\x66\x00\x00\xd6\x65\xda\x6e\xda\x79\x00\x00\x00\x00\xd6\x68\x00\x00\xd6\x63\xda\x6d\xb2\x74\x00\x00\x00\x00\xb2\x73\xd6\x61\xd6\x64\xb2\x75\x00\x00\xb2\x72\xb2\x71\xd6\x60\xd6\x69\x00\x00\x00\x00\x00\x00\xda\x70\xda\x77\x00\x00\xb5\x54\xda\x76\xda\x73\x00\x00\xb5\x56\x00\x00\x00\x00\x00\x00\xda\x75\x00\x00\x00\x00\xda\x6f\xda\x71\xda\x74\xda\x72\xb5\x55\xda\x78\xb5\x53\xb7\xdf\x00\x00\x00\x00\xde\xad\xde\xac\xde\xaa\x00\x00\xb7\xe2\xb7\xe1\xde\xae\x00\x00\xde\xab\xe2\xca\xba\xbb\xb7\xe0\x00\x00\x00\x00\x00\x00\xde\xb0\xde\xaf\x00\x00\xe2\xcd\xe2\xcb\xbc\xfa\x00\x00\xba\xbc\xe2\xcc\xe6\x76\x00\x00\x00\x00\x00\x00\x00\x00\xbc\xfb\xe6\x75\xe6\x7e\xe6\x7d\xe6\x7b\x00\x00\xe6\x7a\xe6\x77\xe6\x78\xe6\x79\xe6\x7c\xe6\xa1\x00\x00\x00\x00\xea\x5f\xea\x5c\xea\x5d\xbf\x57\xea\x5b\xea\x61\xea\x60\xea\x5e\x00\x00\xed\x64\xed\x65\xc0\xf1\x00\x00\xc0\xf2\xed\x63\x00\x00\xc2\x79\xef\xfe\xc2\x78\xc3\x7e\x00\x00\xc3\xa1\xc4\x6d\xf4\x6e\xf4\x6d\xf5\xdd\xf6\xef", /* 7380 */ "\xc5\x7a\xf7\xe8\xf7\xe7\xf7\xe9\xa5\xc8\xcf\xc6\xaf\x59\xb2\x76\xd6\x6a\xa5\xc9\xc9\xa7\xa4\xfd\x00\x00\x00\x00\xca\x45\x00\x00\x00\x00\x00\x00\xcb\x6c\xcb\x6a\xcb\x6b\xcb\x68\xa8\x68\xcb\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x6d\x00\x00\xaa\xb3\xcd\x6b\xcd\x67\xcd\x6a\x00\x00\xcd\x66\xaa\xb5\xcd\x69\x00\x00\xaa\xb2\xaa\xb1\x00\x00\xaa\xb4\xcd\x6c\xcd\x68\x00\x00\x00\x00\x00\x00\x00\x00\xac\xc2\xac\xc5\xcf\xce\xcf\xcd\xcf\xcc\xac\xbf\xcf\xd5\xcf\xcb\x00\x00\xac\xc1\xd2\xaf\x00\x00\xcf\xd2\xcf\xd0\xac\xc4\x00\x00\xcf\xc8\xcf\xd3\x00\x00\xcf\xca\xcf\xd4\xcf\xd1\xcf\xc9\x00\x00\xac\xc0\xcf\xd6\xcf\xc7\xac\xc3\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xb4\xd2\xab\xd2\xb6\x00\x00\xd2\xae\xd2\xb9\xd2\xba\xd2\xac\xd2\xb8\xd2\xb5\xd2\xb3\xd2\xb7\xaf\x5f\x00\x00\xaf\x5d\x00\x00\x00\x00\xd2\xb1\x00\x00\xd2\xad\x00\x00\xd2\xb0\xd2\xbb\xd2\xb2\xaf\x5e\xcf\xcf\x00\x00\xaf\x5a\xaf\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x78\xd6\x6d\xd6\x6b\x00\x00\xd6\x6c\x00\x00\xd6\x73\x00\x00\xd6\x74\xd6\x70\xb2\x7b\xd6\x75", /* 7400 */ "\xd6\x72\xd6\x6f\x00\x00\xb2\x79\xd6\x6e\xb2\x77\xb2\x7a\xd6\x71\xd6\x79\xaf\x5b\xb2\x78\xd6\x77\xd6\x76\xb2\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x7e\x00\x00\x00\x00\x00\x00\xda\xa1\xb5\x60\x00\x00\xda\xa7\x00\x00\x00\x00\xda\xa9\xda\xa2\xb5\x5a\xda\xa6\xda\xa5\xb5\x5b\xb5\x61\x00\x00\xb5\x62\xda\xa8\xb5\x58\xda\x7d\xda\x7b\xda\xa3\xda\x7a\xb5\x5f\xda\x7c\xda\xa4\xda\xaa\xb5\x59\xb5\x5e\xb5\x5c\xb5\x5d\x00\x00\x00\x00\x00\x00\xb5\x57\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xe9\xde\xb7\xb7\xe8\xde\xbb\x00\x00\xde\xb1\x00\x00\xde\xbc\x00\x00\x00\x00\x00\x00\xde\xb2\xde\xb3\x00\x00\xde\xbd\xde\xba\xde\xb8\xde\xb9\xde\xb5\xde\xb4\x00\x00\xde\xbe\xb7\xe5\x00\x00\xde\xb6\x00\x00\xb7\xea\xb7\xe4\xb7\xeb\xb7\xec\x00\x00\xb7\xe7\xb7\xe6\x00\x00\x00\x00\xe2\xce\xba\xbe\xba\xbd\x00\x00\x00\x00\xe2\xd3\x00\x00\xbc\xfc\xba\xbf\x00\x00\x00\x00\xba\xc1\xe2\xd4\xb7\xe3\xba\xc0\xe2\xd0\xe2\xd2\xe2\xcf\x00\x00\xe2\xd1\x00\x00\x00\x00\x00\x00\xe6\xab\x00\x00\x00\x00\xe6\xaa\xe6\xa7\xbd\x40\xea\x62", /* 7480 */ "\xbd\x41\xe6\xa6\x00\x00\xbc\xfe\x00\x00\xe6\xa8\xe6\xa5\xe6\xa2\xe6\xa9\xe6\xa3\xe6\xa4\xbc\xfd\x00\x00\x00\x00\x00\x00\x00\x00\xed\x69\x00\x00\xea\x66\x00\x00\xea\x65\xea\x67\x00\x00\xed\x66\xbf\x5a\x00\x00\xea\x63\x00\x00\xbf\x58\x00\x00\xbf\x5c\xbf\x5b\xea\x64\xea\x68\x00\x00\xbf\x59\x00\x00\xed\x6d\xc0\xf5\xc2\x7a\xc0\xf6\xc0\xf3\xed\x6a\xed\x68\x00\x00\xed\x6b\x00\x00\xed\x6e\xc0\xf4\xed\x6c\xed\x67\x00\x00\x00\x00\xf0\x42\xf0\x45\xf2\x75\xf0\x40\x00\x00\xf4\x6f\xf0\x46\x00\x00\xc3\xa2\xf0\x44\xc2\x7b\xf0\x41\xf0\x43\xf0\x47\xf2\x76\x00\x00\xf2\x74\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xa3\xf2\x73\x00\x00\x00\x00\x00\x00\xc4\x6e\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xed\xf6\xf1\xc4\xec\xf6\xf3\xf6\xf0\xf6\xf2\xc5\xd0\xf8\xb2\xa5\xca\xcd\x6e\xd2\xbc\xd2\xbd\xb2\x7d\xde\xbf\xbf\x5d\xc3\xa4\xc5\x7b\xf8\xb3\xa5\xcb\x00\x00\xcd\x6f\xa2\x60\x00\x00\x00\x00\xcf\xd7\x00\x00\xcf\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xbe\xd2\xbf\xb2\x7e\xb2\xa1\x00\x00\x00\x00\x00\x00\xda\xab\x00\x00\xde\xc2\xde\xc1\xde\xc0", /* 7500 */ "\xe2\xd5\x00\x00\xe2\xd6\xe2\xd7\xba\xc2\x00\x00\x00\x00\xe6\xad\xe6\xac\x00\x00\x00\x00\xea\x69\xbf\x5e\xbf\x5f\x00\x00\xed\x72\xed\x6f\xed\x70\xed\x71\xf0\x49\xf0\x48\xc2\x7c\xf2\x77\xf5\xde\xa5\xcc\x00\x00\xac\xc6\x00\x00\xb2\xa2\xde\xc3\x00\x00\xa5\xcd\x00\x00\xd2\xc0\xb2\xa3\x00\x00\x00\x00\xb5\x63\xb5\x64\x00\x00\xa5\xce\xa5\xcf\xca\x46\xa8\x6a\xa8\x69\xac\xc7\xcf\xd9\xda\xac\xa5\xd0\xa5\xd1\xa5\xd2\xa5\xd3\x00\x00\x00\x00\x00\x00\xa8\x6b\xa8\x6c\xcb\x6e\xcb\x6d\x00\x00\x00\x00\xaa\xb6\xcd\x72\xcd\x70\xcd\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xda\xcf\xdb\x00\x00\x00\x00\xac\xcb\xac\xc9\x00\x00\xac\xca\xac\xc8\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x60\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x64\xaf\x63\xd2\xc1\xaf\x62\xaf\x61\x00\x00\xd2\xc2\x00\x00\x00\x00\xb2\xa6\xd6\x7b\xd6\x7a\xb2\xa4\xb2\xa5\x00\x00\x00\x00\x00\x00\xb5\x66\xb5\x65\xda\xae\x00\x00\x00\x00\xda\xad\xb2\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xed\xde\xc5\xb7\xee\xde\xc4\x00\x00\x00\x00\x00\x00\xe2\xd8\xe6\xae\xbd\x42", /* 7580 */ "\xea\x6a\x00\x00\x00\x00\x00\x00\xed\x73\x00\x00\xc3\xa6\xc3\xa5\x00\x00\x00\x00\xc5\x7c\xa5\xd4\xcd\x73\x00\x00\x00\x00\xb2\xa8\xe2\xd9\xba\xc3\x00\x00\x00\x00\xcb\x6f\xcb\x70\x00\x00\x00\x00\xcd\x74\xaa\xb8\xaa\xb9\x00\x00\x00\x00\xaa\xb7\x00\x00\x00\x00\x00\x00\x00\x00\xac\xcf\xac\xd0\xac\xcd\xac\xce\x00\x00\xcf\xdc\x00\x00\x00\x00\xcf\xdd\xac\xcc\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xc3\x00\x00\xaf\x68\xaf\x69\x00\x00\xb2\xab\xd2\xc9\x00\x00\xaf\x6e\xaf\x6c\xd2\xca\xd2\xc5\xaf\x6b\xaf\x6a\xaf\x65\xd2\xc8\xd2\xc7\xd2\xc4\xaf\x6d\x00\x00\xd2\xc6\xaf\x66\x00\x00\xaf\x67\x00\x00\x00\x00\xb2\xac\xd6\xa1\xd6\xa2\xb2\xad\xd6\x7c\xd6\x7e\xd6\xa4\xd6\xa3\xd6\x7d\x00\x00\xb2\xa9\xb2\xaa\x00\x00\xda\xb6\xb5\x6b\xb5\x6a\xda\xb0\xb5\x68\x00\x00\xda\xb3\xb5\x6c\xda\xb4\xb5\x6d\xda\xb1\xb5\x67\xb5\x69\xda\xb5\x00\x00\xda\xb2\xda\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xd2\x00\x00\xde\xc7\xb7\xf0\xb7\xf3\xb7\xf2\xb7\xf7\xb7\xf6\xde\xd3\xde\xd1\xde\xca\xde\xce\xde\xcd\xb7\xf4\xde\xd0\xde\xcc\xde\xd4\xde\xcb\xb7\xf5", /* 7600 */ "\xb7\xef\xb7\xf1\x00\x00\xde\xc9\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xdb\xba\xc7\xe2\xdf\xba\xc6\xe2\xdc\xba\xc5\x00\x00\xde\xc8\xde\xcf\xe2\xde\x00\x00\xba\xc8\xe2\xe0\xe2\xdd\xe2\xda\x00\x00\x00\x00\xe6\xb1\xe6\xb5\xe6\xb7\xe6\xb3\xe6\xb2\xe6\xb0\xbd\x45\xbd\x43\xbd\x48\xbd\x49\xe6\xb4\xbd\x46\xe6\xaf\xbd\x47\xba\xc4\xe6\xb6\xbd\x44\x00\x00\x00\x00\x00\x00\xea\x6c\x00\x00\xea\x6b\xea\x73\xea\x6d\xea\x72\xea\x6f\xbf\x60\xea\x71\x00\x00\x00\x00\xbf\x61\x00\x00\xbf\x62\x00\x00\xea\x70\xea\x6e\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xf8\xed\x74\x00\x00\x00\x00\xc0\xf7\xed\x77\xed\x75\xed\x76\x00\x00\x00\x00\xc0\xf9\x00\x00\x00\x00\x00\x00\xf0\x4d\x00\x00\xc2\xa1\xf0\x4e\x00\x00\x00\x00\xc2\x7d\xf0\x4f\xc2\x7e\xf0\x4c\xf0\x50\x00\x00\xf0\x4a\x00\x00\x00\x00\xc3\xa7\xf2\x78\xc3\xa8\xc4\x6f\x00\x00\xf0\x4b\xc4\x70\x00\x00\x00\x00\x00\x00\xc4\xee\xf5\xdf\x00\x00\xc5\x7e\xf6\xf4\xc5\x7d\x00\x00\xf7\xea\xc5\xf5\xc5\xf6\x00\x00\x00\x00\xf9\xcc\x00\x00\x00\x00\xac\xd1\xcf\xde\x00\x00\xb5\x6e\xb5\x6f\xa5\xd5\xa6\xca\xca\x47", /* 7680 */ "\x00\x00\xcb\x71\xa8\x6d\x00\x00\xaa\xba\x00\x00\xac\xd2\xac\xd3\xac\xd4\xd6\xa6\xd2\xcb\xaf\x6f\x00\x00\x00\x00\xb2\xae\xd6\xa5\x00\x00\x00\x00\xda\xb8\xb5\x71\x00\x00\xda\xb7\xb5\x70\x00\x00\x00\x00\xde\xd5\xbd\x4a\xe6\xbb\xe6\xb8\xe6\xb9\xe6\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x78\x00\x00\xf0\x51\x00\x00\x00\x00\x00\x00\xf4\x71\xf4\x70\x00\x00\xf6\xf5\xa5\xd6\xcd\x75\xaf\x70\x00\x00\x00\x00\x00\x00\xb5\x72\xde\xd6\x00\x00\x00\x00\xe2\xe1\x00\x00\xbd\x4b\xea\x74\x00\x00\xf0\x52\xf4\x72\xa5\xd7\x00\x00\x00\x00\xaa\xbb\xac\xd7\xcf\xdf\xac\xd8\xac\xd6\x00\x00\xac\xd5\xd2\xcc\xaf\x71\x00\x00\x00\x00\xaf\x72\xaf\x73\x00\x00\x00\x00\x00\x00\xb2\xb0\xd6\xa7\xb2\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xb9\xb2\xb1\xb5\x73\xde\xd7\xb7\xf8\xb7\xf9\x00\x00\xba\xc9\x00\x00\xba\xca\xbd\x4c\xbf\x64\xea\x75\xbf\x63\x00\x00\xed\x79\xc0\xfa\x00\x00\xf0\x53\xf4\x73\xa5\xd8\xa8\x6e\xcd\x78\xcd\x77\xaa\xbc\xcd\x76\xaa\xbd\xcd\x79\x00\x00\xcf\xe5\xac\xdb\xac\xda\xcf\xe7\xcf\xe6\xac\xdf\x00\x00\xac\xde\x00\x00", /* 7700 */ "\x00\x00\xac\xd9\x00\x00\xcf\xe1\xcf\xe2\xcf\xe3\x00\x00\xac\xe0\xcf\xe0\xac\xdc\xcf\xe4\xac\xdd\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xcf\xd2\xd3\xd2\xd1\xd2\xd0\x00\x00\xd2\xd4\x00\x00\x00\x00\x00\x00\xd2\xd5\xd2\xd6\xd2\xce\x00\x00\xd2\xcd\x00\x00\xaf\x75\xaf\x76\x00\x00\xd2\xd7\xd2\xd2\x00\x00\xd6\xb0\x00\x00\xd2\xd8\xaf\x77\xaf\x74\x00\x00\x00\x00\x00\x00\xd6\xaa\x00\x00\xd6\xa9\x00\x00\xd6\xab\xd6\xac\xd6\xae\xd6\xad\xd6\xb2\xb2\xb5\xb2\xb2\xb2\xb6\xd6\xa8\xb2\xb7\xd6\xb1\xb2\xb4\xd6\xaf\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xbc\xda\xbe\xda\xba\xda\xbb\x00\x00\x00\x00\xda\xbf\xda\xc1\xda\xc2\xda\xbd\xda\xc0\xb5\x74\x00\x00\x00\x00\xde\xdb\x00\x00\xde\xe0\xde\xd8\xde\xdc\x00\x00\x00\x00\xde\xe1\xde\xdd\xb7\xfa\xb8\x43\x00\x00\xb7\xfd\xde\xd9\xde\xda\xba\xce\xb8\x46\xb7\xfe\x00\x00\xb8\x44\xb7\xfc\xde\xdf\xb8\x45\xde\xde\xb8\x41\xb7\xfb\xb8\x42\xde\xe2\xe2\xe6\xe2\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x40\x00\x00\x00\x00\xe2\xe3\xba\xcc\xe2\xe9\xba\xcd", /* 7780 */ "\xe2\xe7\xe2\xe2\xe2\xe5\xe2\xea\xba\xcb\xe2\xe4\x00\x00\xbd\x4e\xe6\xbf\xe6\xbe\x00\x00\xbd\x51\xbd\x4f\xe6\xbc\xbd\x4d\xe6\xbd\x00\x00\xbd\x50\x00\x00\x00\x00\x00\x00\xea\x7d\x00\x00\xea\xa1\x00\x00\xea\x7e\xea\x76\xea\x7a\xea\x79\xea\x77\xbf\x66\xbf\x67\xbf\x65\xea\x78\xea\x7b\xea\x7c\x00\x00\xbf\x68\x00\x00\xc1\x40\xed\xa3\x00\x00\xc0\xfc\xed\x7b\xc0\xfe\xc1\x41\x00\x00\x00\x00\xc0\xfd\xed\xa2\xed\x7c\xc0\xfb\xed\xa1\xed\x7a\xed\x7e\xed\x7d\x00\x00\x00\x00\xf0\x55\xc2\xa4\xc2\xa5\xc2\xa2\x00\x00\xc2\xa3\x00\x00\x00\x00\xf0\x54\x00\x00\xf2\x7b\x00\x00\x00\x00\xc3\xa9\x00\x00\xf2\x79\xf2\x7a\x00\x00\xf4\x74\xf4\x77\xf4\x75\xf4\x76\xf5\xe0\x00\x00\x00\x00\xc4\xef\xf7\xeb\xf8\xb4\x00\x00\xc5\xf7\xf8\xf8\xf8\xf9\xc6\x66\xa5\xd9\xac\xe1\x00\x00\xda\xc3\x00\x00\xde\xe3\x00\x00\xa5\xda\xa8\x6f\x00\x00\xaa\xbe\x00\x00\xcf\xe8\xcf\xe9\xaf\x78\x00\x00\x00\x00\xda\xc4\xb5\x75\xb8\x47\xc1\x42\xed\xa4\xf2\x7c\xf4\x78\xa5\xdb\x00\x00\x00\x00\x00\x00\xcd\xa1\xcd\x7a\xcd\x7c\xcd\x7e\xcd\x7d\xcd\x7b\xaa\xbf\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\xac\xe2\xcf\xf2\x00\x00\xcf\xed\xcf\xea\x00\x00\x00\x00\xcf\xf1\x00\x00\x00\x00\xac\xe4\xac\xe5\xcf\xf0\xcf\xef\xcf\xee\xcf\xeb\xcf\xec\xcf\xf3\xac\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x7c\x00\x00\xaf\xa4\xaf\xa3\xd2\xe1\xd2\xdb\xd2\xd9\x00\x00\xaf\xa1\xd6\xb9\xaf\x7a\xd2\xde\xd2\xe2\xd2\xe4\xd2\xe0\xd2\xda\xaf\xa2\xd2\xdf\xd2\xdd\xaf\x79\xd2\xe5\xaf\xa5\xd2\xe3\xaf\x7d\xd2\xdc\x00\x00\xaf\x7e\xaf\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xb9\x00\x00\xd6\xba\x00\x00\x00\x00\xd6\xb3\xd6\xb5\xd6\xb7\x00\x00\xd6\xb8\xd6\xb6\xb2\xba\x00\x00\xd6\xbb\x00\x00\xd6\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xc8\xb5\x76\xda\xd0\x00\x00\xda\xc5\x00\x00\xda\xd1\x00\x00\xda\xc6\xda\xc7\x00\x00\x00\x00\xda\xcf\xda\xce\xda\xcb\xb2\xb8\xb5\x77\xda\xc9\xda\xcc\xb5\x78\xda\xcd\xda\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xee\x00\x00\xde\xf2\xb8\x4e\x00\x00\xe2\xf0\xb8\x51", /* 7880 */ "\xde\xf0\xf9\xd6\x00\x00\xde\xed\xde\xe8\xde\xea\xde\xeb\xde\xe4\x00\x00\xb8\x4d\x00\x00\x00\x00\xb8\x4c\x00\x00\xb8\x48\xde\xe7\x00\x00\xb8\x4f\x00\x00\xb8\x50\xde\xe6\xde\xe9\xde\xf1\xb8\x4a\xb8\x4b\xde\xef\xde\xe5\x00\x00\x00\x00\x00\x00\xe2\xf2\xba\xd0\xe2\xf4\xde\xec\xe2\xf6\xba\xd4\xe2\xf7\xe2\xf3\x00\x00\xba\xd1\xe2\xef\xba\xd3\xe2\xec\xe2\xf1\xe2\xf5\xe2\xee\x00\x00\x00\x00\xb8\x49\x00\x00\xe2\xeb\xba\xd2\xe2\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x54\xe6\xc1\xbd\x58\x00\x00\xbd\x56\x00\x00\x00\x00\xba\xcf\x00\x00\xe6\xc8\xe6\xc9\xbd\x53\x00\x00\x00\x00\xe6\xc7\xe6\xca\xbd\x55\xbd\x52\xe6\xc3\xe6\xc0\xe6\xc5\xe6\xc2\xbd\x59\xe6\xc4\x00\x00\x00\x00\xe6\xc6\xbd\x57\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x6a\xea\xa8\x00\x00\xea\xa2\xea\xa6\xea\xac\xea\xad\xea\xa9\xea\xaa\xea\xa7\x00\x00\xea\xa4\x00\x00\xbf\x6c\xbf\x69\xea\xa3\xea\xa5\x00\x00\xbf\x6b\xea\xab\x00\x00\xc1\x46\x00\x00\x00\x00\xed\xaa\xed\xa5\xc1\x45\x00\x00\x00\x00\xc1\x43\x00\x00\xed\xac\xc1\x44\xed\xa8\xed\xa9\xed\xa6\xed\xad\xf0\x56", /* 7900 */ "\x00\x00\xc1\x47\xed\xa7\x00\x00\xed\xae\xed\xab\x00\x00\x00\x00\x00\x00\xf0\x5a\x00\x00\x00\x00\xf0\x57\x00\x00\xc2\xa6\x00\x00\xf0\x5b\xf0\x5d\xf0\x5c\xf0\x58\xf0\x59\x00\x00\x00\x00\xf2\xa3\x00\x00\xc3\xaa\x00\x00\xf2\x7e\xf2\xa2\xf2\x7d\xf2\xa4\x00\x00\x00\x00\xf2\xa1\x00\x00\xf4\x7a\xf4\x7d\xf4\x79\xc4\x71\xf4\x7b\xf4\x7c\xf4\x7e\xc4\x72\xc4\x74\xc4\x73\xf5\xe1\x00\x00\xf5\xe3\x00\x00\xf5\xe2\x00\x00\x00\x00\x00\x00\xf6\xf6\x00\x00\x00\x00\xf8\xb5\xf8\xfa\xa5\xdc\x00\x00\x00\x00\xcb\x72\xaa\xc0\xcd\xa3\xaa\xc1\xaa\xc2\xcd\xa2\x00\x00\xcf\xf8\xcf\xf7\xac\xe6\xac\xe9\xac\xe8\xac\xe7\xcf\xf4\xcf\xf6\xcf\xf5\x00\x00\x00\x00\xd2\xe8\xaf\xa7\xd2\xec\xd2\xeb\xd2\xea\xd2\xe6\xaf\xa6\xaf\xaa\xaf\xad\x00\x00\x00\x00\xaf\xae\xd2\xe7\xd2\xe9\xaf\xac\xaf\xab\xaf\xa9\xaf\xa8\xd6\xc2\x00\x00\xd6\xc0\xd6\xbc\xb2\xbb\x00\x00\xd6\xbd\xb2\xbc\xd6\xbe\xd6\xbf\xd6\xc1\x00\x00\xb2\xbd\x00\x00\x00\x00\xda\xd5\x00\x00\xda\xd4\xda\xd3\xda\xd2\x00\x00\x00\x00\x00\x00\x00\x00\xde\xf6\xb8\x52\x00\x00\xde\xf3\xde\xf5\x00\x00\xb8\x53", /* 7980 */ "\x00\x00\xb8\x54\xde\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x41\x00\x00\xe2\xf9\xe2\xfa\x00\x00\xba\xd7\xba\xd5\xba\xd6\xe3\x43\x00\x00\xe3\x42\xe2\xfe\xe2\xfd\xe2\xfc\xe2\xfb\xe3\x40\xe2\xf8\x00\x00\xe6\xcb\xe6\xd0\xe6\xce\x00\x00\x00\x00\x00\x00\xe6\xcd\xe6\xcc\xe6\xcf\x00\x00\xea\xae\x00\x00\xbf\x6d\xc1\x48\xed\xb0\x00\x00\xc1\x49\xed\xaf\xf0\x5f\xf0\x5e\xc2\xa7\x00\x00\xf2\xa5\xc3\xab\xf4\xa1\xc5\xa1\xf6\xf7\x00\x00\xf8\xb7\xf8\xb6\xc9\xa8\xac\xea\xac\xeb\xd6\xc3\x00\x00\xb8\x56\xa5\xdd\xa8\x72\xa8\x71\xa8\x70\x00\x00\x00\x00\x00\x00\xcd\xa4\x00\x00\x00\x00\xaa\xc4\xaa\xc3\x00\x00\xac\xee\x00\x00\xcf\xfa\xcf\xfd\xcf\xfb\x00\x00\xac\xec\xac\xed\x00\x00\x00\x00\xcf\xf9\xcf\xfc\x00\x00\xaf\xb5\x00\x00\x00\x00\x00\x00\xd2\xf3\xd2\xf5\xd2\xf4\xaf\xb2\xd2\xef\x00\x00\x00\x00\xaf\xb0\xaf\xaf\x00\x00\xaf\xb3\xaf\xb1\x00\x00\xaf\xb4\xd2\xf2\xd2\xed\xd2\xee\xd2\xf1\xd2\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xc6\xd6\xc7\xd6\xc5\x00\x00\xd6\xc4\xb2\xbe\x00\x00\x00\x00\x00\x00\x00\x00", /* 7a00 */ "\xb5\x7d\x00\x00\xda\xd6\xda\xd8\xda\xda\xb5\x7c\x00\x00\x00\x00\xb5\x7a\x00\x00\xda\xd7\xb5\x7b\xda\xd9\xb5\x79\x00\x00\x00\x00\xdf\x41\xde\xf7\xde\xfa\xde\xfe\xb8\x5a\xde\xfc\x00\x00\xde\xfb\xde\xf8\xde\xf9\xb8\x58\xdf\x40\xb8\x57\x00\x00\xb8\x5c\xb8\x5b\xb8\x59\x00\x00\xde\xfd\x00\x00\x00\x00\x00\x00\xe3\x49\x00\x00\xe3\x48\x00\x00\x00\x00\xe3\x44\x00\x00\x00\x00\xba\xd8\xe3\x47\xe3\x46\xba\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x5e\x00\x00\xe6\xd2\x00\x00\xbd\x5f\xbd\x5b\xbd\x5d\x00\x00\xbd\x5a\xbd\x5c\x00\x00\x00\x00\x00\x00\xea\xaf\x00\x00\xbf\x70\xea\xb1\xea\xb0\x00\x00\xe3\x45\xbf\x72\xbf\x71\xbf\x6e\xbf\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\xb5\x00\x00\xed\xb3\xc1\x4a\xed\xb4\x00\x00\xed\xb6\xed\xb2\xed\xb1\x00\x00\x00\x00\xf0\x60\xc2\xaa\xc2\xa8\xc2\xa9\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xa6\xf2\xa7\xc3\xad\x00\x00\xc3\xac\xf4\xa3\xf4\xa4\xf4\xa2\x00\x00\xf6\xf8\xf6\xf9\x00\x00\x00\x00\xa5\xde\xca\x48\xa8\x73\x00\x00\xcd\xa5\xaa\xc6\xaa\xc5\xcd\xa6\x00\x00\x00\x00\xd0\x40\xac\xef", /* 7a80 */ "\xcf\xfe\xac\xf0\x00\x00\x00\x00\xaf\xb6\xd2\xf8\xd2\xf6\xd2\xfc\xaf\xb7\xd2\xf7\xd2\xfb\xd2\xf9\xd2\xfa\x00\x00\x00\x00\xd6\xc8\xd6\xca\x00\x00\xb2\xbf\x00\x00\xd6\xc9\xb2\xc0\xb5\xa2\xb5\xa1\xb5\x7e\xda\xdb\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x44\xb8\x5d\xb8\x5e\x00\x00\xdf\x43\xdf\x42\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x4a\xba\xdb\xba\xda\xe3\x4b\xe3\x4c\x00\x00\xbd\x61\xbd\x60\x00\x00\xea\xb5\xe6\xd3\xe6\xd5\xe6\xd4\xea\xb4\xea\xb2\xea\xb6\xea\xb3\x00\x00\xbf\x73\x00\x00\x00\x00\x00\x00\xed\xb7\xc1\x4b\xed\xb8\xed\xb9\x00\x00\x00\x00\xc2\xab\xc2\xac\x00\x00\xc4\x75\x00\x00\x00\x00\xc5\xd1\xa5\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xfd\xaf\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xba\xb3\xb9\x00\x00\x00\x00\xb5\xa4\xda\xdd\xb5\xa3\xda\xdc\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x45\x00\x00\xba\xdc\xe3\x4d\xba\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x76\xf4\xa5\x00\x00\xa6\xcb\xaa\xc7\xcd\xa7\x00\x00\xac\xf2\x00\x00\xac\xf1", /* 7b00 */ "\xd0\x42\xd0\x43\x00\x00\x00\x00\xd3\x40\xd3\x42\xaf\xb9\x00\x00\xd3\x44\xd3\x47\xd3\x45\x00\x00\x00\x00\x00\x00\xd3\x46\xd3\x43\xd2\xfe\xaf\xba\xd3\x48\xd3\x41\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xd3\xb2\xc6\xd6\xdc\xb2\xc3\x00\x00\xd6\xd5\xb2\xc7\x00\x00\xb2\xc1\x00\x00\xd6\xd0\xd6\xdd\xd6\xd1\xd6\xce\xb2\xc5\x00\x00\xb2\xc2\x00\x00\xd6\xd4\xd6\xd7\xb2\xc4\xd6\xd8\xb2\xc8\xd6\xd9\xd6\xcf\xd6\xd6\xd6\xda\xd6\xd2\xd6\xcd\xd6\xcb\x00\x00\x00\x00\xd6\xdb\x00\x00\x00\x00\xda\xdf\x00\x00\x00\x00\x00\x00\x00\x00\xda\xe4\x00\x00\x00\x00\x00\x00\xda\xe0\xda\xe6\xb5\xa7\xd6\xcc\xda\xe1\xb5\xa5\xda\xde\xb5\xac\xda\xe2\xb5\xab\xda\xe3\xb5\xad\xb5\xa8\xb5\xae\xb5\xa9\x00\x00\xb5\xaa\x00\x00\xb5\xa6\x00\x00\xda\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x61\xdf\x50\x00\x00\xdf\x53\xdf\x47\xdf\x4c\xdf\x46\xb8\x63\x00\x00\xdf\x4a\x00\x00\x00\x00\x00\x00\xdf\x48\xb8\x62\x00\x00\xdf\x4f\xdf\x4e\xdf\x4b\xdf\x4d\xdf\x49\xba\xe1\xdf\x52\xb8\x5f\xdf\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7b80 */ "\x00\x00\x00\x00\xe3\x5d\x00\x00\xba\xe8\xe3\x58\x00\x00\xba\xe7\xe3\x4e\x00\x00\xe3\x50\xba\xe0\xe3\x55\xe3\x54\xe3\x57\xba\xe5\xe3\x52\xe3\x51\x00\x00\x00\x00\xba\xe4\xba\xdf\xe3\x53\xba\xe2\xe3\x59\xe3\x5b\x00\x00\xe3\x56\xe3\x4f\xba\xe3\x00\x00\x00\x00\xbd\x69\xba\xde\x00\x00\x00\x00\xe3\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xd9\xbd\x62\x00\x00\xe6\xdb\x00\x00\xbd\x63\x00\x00\x00\x00\xbd\x65\xe6\xde\x00\x00\xe6\xd6\xba\xe6\xe6\xdc\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xd8\x00\x00\xb8\x60\xbd\x68\x00\x00\x00\x00\xbd\x64\x00\x00\xbd\x66\xbd\x67\x00\x00\xbf\x76\xe6\xdd\xe6\xd7\xbd\x6a\x00\x00\xe6\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xc0\xea\xbb\x00\x00\x00\x00\xea\xc5\xbf\x74\xea\xbd\xbf\x78\xea\xc3\xea\xba\xea\xb7\xea\xc6\xc1\x51\xbf\x79\xea\xc2\xea\xb8\xbf\x77\xea\xbc\xbf\x7b\xea\xb9\xea\xbe\xbf\x7a\xea\xc1\xea\xc4\x00\x00\x00\x00\x00\x00\x00\x00\xed\xcb\xed\xcc\xed\xbc\xed\xc3\xed\xc1\x00\x00\x00\x00\xc1\x4f\xed\xc8\xea\xbf\x00\x00\xed\xbf\x00\x00\xed\xc9\xc1\x4e\xed\xbe", /* 7c00 */ "\xed\xbd\xed\xc7\xed\xc4\xed\xc6\x00\x00\xed\xba\xed\xca\xc1\x4c\x00\x00\xed\xc5\xed\xce\xed\xc2\xc1\x50\xc1\x4d\xed\xc0\xed\xbb\xed\xcd\xbf\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x63\x00\x00\x00\x00\xf0\x61\xf0\x67\xc2\xb0\xf0\x65\xf0\x64\xc2\xb2\xf0\x6a\xc2\xb1\x00\x00\xf0\x6b\xf0\x68\xc2\xae\xf0\x69\xf0\x62\xc2\xaf\xc2\xad\xf2\xab\xf0\x66\x00\x00\x00\x00\xf0\x6c\x00\x00\x00\x00\xf2\xa8\x00\x00\x00\x00\x00\x00\xc3\xb2\xc3\xb0\xf2\xaa\x00\x00\xf2\xac\xf2\xa9\xc3\xb1\xc3\xae\xc3\xaf\xc3\xb3\x00\x00\x00\x00\xc4\x78\x00\x00\xf4\xaa\x00\x00\xf4\xa9\xf4\xa7\xf4\xa6\xf4\xa8\x00\x00\xc4\x77\xc4\x79\x00\x00\x00\x00\xc4\xf0\x00\x00\x00\x00\xf5\xe5\xf5\xe4\x00\x00\x00\x00\xf6\xfa\x00\x00\xf6\xfc\xf6\xfe\xf6\xfd\xf6\xfb\x00\x00\x00\x00\xc5\xa3\xc5\xa2\x00\x00\x00\x00\xc5\xd3\xc5\xd2\xc5\xd4\xf7\xed\xf7\xec\x00\x00\xf8\xfb\xf8\xb8\xf8\xfc\xc6\x58\x00\x00\xc6\x59\xf9\x6d\x00\x00\x00\x00\xc6\x7e\xa6\xcc\x00\x00\xcd\xa8\x00\x00\x00\x00\xd0\x45\xd0\x46\xd0\x44\x00\x00\x00\x00\xac\xf3\x00\x00\xd0\x47", /* 7c80 */ "\xd0\x48\xd0\x49\x00\x00\x00\x00\xd3\x49\xd3\x4f\x00\x00\x00\x00\xd3\x4d\xaf\xbb\xd3\x4b\x00\x00\xd3\x4c\xd3\x4e\x00\x00\x00\x00\x00\x00\xd3\x4a\xb2\xc9\x00\x00\xd6\xde\xb2\xcb\xd6\xe0\xb2\xca\xd6\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xe8\xb5\xaf\x00\x00\xda\xea\xda\xe7\xd6\xe1\x00\x00\xb5\xb0\x00\x00\xf9\xdb\xda\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x56\x00\x00\xb8\x64\xdf\x54\xb8\x65\xdf\x55\xb8\x66\x00\x00\x00\x00\x00\x00\xba\xe9\xe3\x61\xe3\x5e\xe3\x60\xba\xea\xba\xeb\xe3\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xdf\x00\x00\x00\x00\xe6\xe0\x00\x00\xbd\x6b\xe6\xe2\xe6\xe1\x00\x00\xa2\x61\x00\x00\xea\xca\xea\xcb\xea\xc7\x00\x00\xea\xc8\xbf\x7c\xbf\x7d\xea\xc9\x00\x00\xc1\x57\x00\x00\x00\x00\xc1\x53\xc1\x58\xc1\x54\xc1\x56\xc1\x52\x00\x00\xc1\x55\x00\x00\x00\x00\x00\x00\x00\x00\xc2\xb3\xed\xcf\x00\x00\xf2\xae\x00\x00\xf2\xad\x00\x00\xf4\xab\xc4\x7a\xc4\x7b\xf7\x41\xf5\xe6\x00\x00\xf7\x40\x00\x00\xf8\xfd\xf9\xa4\xa6\xcd\x00\x00\x00\x00\xa8\x74\x00\x00\xcd\xa9\xaa\xc8\x00\x00", /* 7d00 */ "\xac\xf6\xd0\x4c\xac\xf4\xd0\x4a\xac\xf9\xac\xf5\xac\xfa\xac\xf8\xd0\x4b\xac\xf7\xaf\xbf\xaf\xbe\xd3\x5a\xaf\xc7\xd3\x53\xd3\x59\xaf\xc3\xd3\x52\xd3\x58\xd3\x56\xaf\xc2\xaf\xc4\xd3\x55\xaf\xbd\xd3\x54\xaf\xc8\xaf\xc5\xaf\xc9\xaf\xc6\xd3\x51\xd3\x50\xd3\x57\xaf\xc0\xaf\xbc\xaf\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xf0\xd6\xe9\x00\x00\xb5\xb5\xd6\xe8\x00\x00\xb2\xcf\xb2\xd6\xb2\xd3\xb2\xd9\xb2\xd8\xb2\xd4\x00\x00\xd6\xe2\xd6\xe5\x00\x00\xd6\xe4\xb2\xd0\xd6\xe6\xd6\xef\xb2\xd1\xd6\xe3\xd6\xec\xd6\xed\xb2\xd2\xd6\xea\xb2\xd7\xb2\xcd\xb2\xd5\xd6\xe7\xb2\xcc\xd6\xeb\x00\x00\x00\x00\xd6\xee\x00\x00\x00\x00\x00\x00\xda\xfb\xda\xf2\xb5\xb2\xda\xf9\xda\xf6\xda\xee\xda\xf7\xb5\xb4\xda\xef\x00\x00\xda\xeb\x00\x00\x00\x00\xb8\x6c\xda\xf4\x00\x00\xb5\xb1\xda\xfa\x00\x00\xb5\xb8\xb5\xba\xda\xed\x00\x00\x00\x00\xb5\xb9\xda\xf0\xb5\xb3\xda\xf8\xda\xf1\xda\xf5\x00\x00\xda\xf3\xb5\xb6\xda\xec\xb5\xbb\xb2\xce\xb5\xb7\xb5\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x68\xdf\x5d\xdf\x5f\xdf\x61\xdf\x65\x00\x00\xdf\x5b", /* 7d80 */ "\xdf\x59\xb8\x6a\x00\x00\xdf\x60\xdf\x64\xdf\x5c\xdf\x58\x00\x00\xdf\x57\x00\x00\x00\x00\x00\x00\xdf\x62\xdf\x5a\xdf\x5e\xb8\x6b\x00\x00\xb8\x69\xdf\x66\xb8\x67\xdf\x63\x00\x00\xe3\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\xee\xe3\x6a\xbd\x78\xe3\x74\xba\xf1\xe3\x78\xba\xf7\xe3\x65\x00\x00\x00\x00\xe3\x75\xe3\x62\x00\x00\xe3\x77\xe3\x66\x00\x00\xba\xfe\xba\xfb\xe3\x76\xe3\x70\xba\xed\xba\xf5\xba\xf4\x00\x00\xba\xf3\xba\xf9\x00\x00\xe3\x63\xba\xfa\xe3\x71\xba\xf6\xba\xec\xe3\x73\xba\xef\xba\xf0\xba\xf8\xe3\x68\xe3\x67\xe3\x64\x00\x00\xe3\x6c\xe3\x69\xe3\x6d\xba\xfd\x00\x00\xe3\x79\xba\xf2\xe3\x6e\xe3\x6f\x00\x00\xe3\x6b\x00\x00\x00\x00\x00\x00\xba\xfc\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xe7\xbd\x70\xbd\x79\xbd\x75\xe6\xe4\x00\x00\xbd\x72\xbd\x76\xe6\xf0\xbd\x6c\xe6\xe8\x00\x00\xbd\x74\x00\x00\x00\x00\xe6\xeb\xe6\xe6\xbd\x73\xbd\x77\xe6\xe5\x00\x00\xbd\x71\x00\x00\xe6\xef\xbd\x6e\xe6\xee\xe6\xed\xbd\x7a\xe5\x72\xbd\x6d\x00\x00\xe6\xec\xe6\xe3\x00\x00\xbd\x7b\xe6\xea\xbd\x6f\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x00\x00\x00\x00\xe6\xe9\x00\x00\x00\x00\x00\x00\x00\x00\xbf\xa2\xbf\xa7\xbf\x7e\xea\xd8\xea\xcf\xea\xdb\xea\xd3\xea\xd9\xbf\xa8\xbf\xa1\xea\xcc\xea\xd2\xea\xdc\xea\xd5\xea\xda\xea\xce\x00\x00\x00\x00\xea\xd6\xbf\xa3\xea\xd4\xbf\xa6\xbf\xa5\xea\xd0\xea\xd1\xea\xcd\xea\xd7\xbf\xa4\xea\xde\xea\xdd\x00\x00\x00\x00\x00\x00\xed\xda\xed\xd6\xc1\x5f\x00\x00\xed\xd0\xc1\x59\xc1\x69\xed\xdc\xc1\x61\xc1\x5d\xed\xd3\xc1\x64\xc1\x67\xed\xde\xc1\x5c\xed\xd5\xc1\x65\xed\xe0\xed\xdd\xed\xd1\xc1\x60\xc1\x5a\xc1\x68\xed\xd8\xc1\x63\xed\xd2\xc1\x5e\xed\xdf\xc1\x62\xc1\x5b\xed\xd9\xc1\x66\xed\xd7\x00\x00\x00\x00\xed\xdb\x00\x00\x00\x00\x00\x00\xf0\x6e\xf0\x74\xc2\xb9\xf0\x77\xc2\xb4\xc2\xb5\xf0\x6f\xf0\x76\xf0\x71\xc2\xba\xc2\xb7\x00\x00\xf0\x6d\x00\x00\xc2\xb6\xf0\x73\xf0\x75\xc2\xb8\xf0\x72\xf0\x70\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xb8\xc3\xb7\xc3\xb8\xc3\xb4\x00\x00\xc3\xb5\x00\x00\xf2\xb4\xf2\xb2\x00\x00\xf2\xb6\xc3\xba\xf2\xb7\xf2\xb0\xf2\xaf\xf2\xb3\xf2\xb1\xc3\xb6\xf2\xb5\xf4\xac\xc4\x7e\xc4\x7d\xf4\xad\x00\x00", /* 7e80 */ "\xf4\xaf\xf4\xae\xc4\xa1\x00\x00\x00\x00\x00\x00\xf5\xeb\xf5\xe8\xf5\xe9\x00\x00\xf5\xe7\xf5\xea\xc4\xf2\xf5\xec\x00\x00\xc4\xf1\x00\x00\xf7\x42\x00\x00\xc5\xd5\xc5\xd7\xf7\xee\xc5\xd6\xf8\xb9\xf9\x40\xf9\x42\xf8\xfe\xf9\x41\xc6\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xce\x00\x00\xac\xfb\xd2\x6f\xaf\xca\x00\x00\x00\x00\xb2\xda\xda\xfc\xda\xfd\x00\x00\x00\x00\x00\x00\xea\xdf\xc1\x6a\xed\xe1\x00\x00\x00\x00\xc2\xbb\x00\x00\xf2\xba\xf2\xb9\xc4\xa2\xf5\xed\x00\x00\xf7\x43\xc5\xf8\xca\x49\x00\x00\x00\x00\xaa\xc9\xa8\x75\x00\x00\x00\x00\xd0\x4d\x00\x00\x00\x00\xd3\x60\xd3\x5b\xd3\x5f\xd3\x5d\xaf\xcb\xd3\x5e\xd3\x5c\x00\x00\xd6\xf1\x00\x00\xda\xfe\xdb\x40\xdf\x69\xdf\x6a\xb8\x6e\xb8\x6f\xdf\x68\xdf\x6b\xdf\x67\xb8\x6d\x00\x00\xbb\x40\x00\x00\xb8\x70\xe3\x7a\x00\x00\xbd\x7c\xe6\xf1\xbd\x7d\x00\x00\xbf\xa9\xea\xe2\xea\xe0\xea\xe1\xed\xe4\xed\xe3\xed\xe2", /* 7f80 */ "\x00\x00\x00\x00\x00\x00\xf2\xbb\x00\x00\xc3\xb9\xf2\xbc\xf7\x44\xc5\xf9\xf8\xba\xa6\xcf\xaa\xcb\xaa\xca\xd0\x4f\xac\xfc\x00\x00\x00\x00\xd0\x4e\xd3\x62\x00\x00\xaf\xcc\xd6\xf2\xd3\x61\x00\x00\x00\x00\x00\x00\xb2\xdc\xd6\xf5\xd6\xf3\xd6\xf4\xb2\xdb\x00\x00\xdb\x42\xdb\x43\xdb\x41\x00\x00\xb8\x73\xdf\x6d\xdf\x6c\xdf\x6e\xb8\x72\xb8\x71\x00\x00\x00\x00\xe6\xf2\xe6\xf4\x00\x00\xbd\x7e\xe6\xf3\xea\xe3\xbf\xaa\xf0\x79\x00\x00\xf0\x78\xc3\xbb\xf2\xbd\xc3\xbd\xc3\xbc\xf4\xb0\xf5\xee\xc4\xf3\xa6\xd0\xd0\x50\xac\xfd\xd3\x65\xaf\xce\xd3\x64\xd3\x63\x00\x00\xaf\xcd\x00\x00\xd6\xfb\x00\x00\xd6\xfd\xd6\xf6\xd6\xf7\xb2\xdd\xd6\xf8\xb2\xde\xd6\xfc\xd6\xf9\xd6\xfa\xb2\xdf\x00\x00\xb5\xbe\xb5\xbf\x00\x00\xdb\x44\x00\x00\x00\x00\x00\x00\xdf\x6f\xdf\x70\x00\x00\xe3\x7e\xbb\x43\xbb\x41\xbb\x42\xe3\x7b\xe3\x7c\x00\x00\xe3\x7d\xe6\xf9\x00\x00\xe6\xfa\xbd\xa1\xe6\xf7\xe6\xf6\xe6\xf8\xe6\xf5\xbf\xad\xea\xe4\xbf\xab\xbf\xac\xed\xe6\xc1\x6b\xed\xe5\xef\xa8\x00\x00\xf0\x7a\xf0\x7b\xc2\xbc\x00\x00\xc2\xbd\xc1\x6c\xf2\xbe\xf2\xbf\xf4\xb1", /* 8000 */ "\xc4\xa3\xa6\xd1\x00\x00\xa6\xd2\xac\xfe\xaa\xcc\xaf\xcf\xd0\x51\x00\x00\x00\x00\x00\x00\xb5\xc0\xa6\xd3\xad\x41\xd0\x52\xd0\x53\xad\x40\xad\x42\xa6\xd4\x00\x00\xd0\x54\xaf\xd1\xd3\x66\xaf\xd3\xaf\xd0\xaf\xd2\x00\x00\xd7\x41\xb2\xe0\x00\x00\xd7\x40\xd6\xfe\x00\x00\xdf\x71\x00\x00\x00\x00\xe3\xa1\x00\x00\xbd\xa2\x00\x00\xbf\xae\xea\xe6\xea\xe5\x00\x00\xed\xe7\x00\x00\x00\x00\x00\x00\xf5\xef\x00\x00\x00\x00\xa6\xd5\xcb\x73\xcd\xaa\xad\x43\xd0\x55\x00\x00\xd3\x68\x00\x00\x00\x00\x00\x00\xaf\xd4\xd3\x67\xaf\xd5\x00\x00\x00\x00\x00\x00\xd7\x43\x00\x00\x00\x00\xb2\xe2\xd7\x42\xd7\x44\x00\x00\xb2\xe1\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x46\xdb\x47\xdb\x45\xb5\xc1\x00\x00\x00\x00\x00\x00\xb8\x74\x00\x00\xb8\x75\x00\x00\xbb\x45\x00\x00\xe3\xa3\xe3\xa2\xbb\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xfb\x00\x00\x00\x00\xe6\xfc\x00\x00\x00\x00\x00\x00\x00\x00\xea\xe7\x00\x00\x00\x00\xc1\x70\xc1\x6f\xc1\x6d\xc1\x6e\xc1\x71\x00\x00\xf0\x7c\xc2\xbf\xc2\xbe\xf2\xc0\xf4\xb2\x00\x00\x00\x00\x00\x00\xc5\xa5\xc5\xa4\xa6\xd6", /* 8080 */ "\x00\x00\x00\x00\xd1\xfb\x00\x00\xb8\x77\xb5\xc2\xb8\x76\xbb\x46\x00\x00\xa6\xd7\xc9\xa9\xa6\xd8\xa6\xd9\x00\x00\x00\x00\xcd\xab\xcb\x76\x00\x00\xcb\x77\xa8\x77\x00\x00\xcb\x74\xa8\x76\x00\x00\xa8\x79\xcb\x75\xa8\x7b\xa8\x7a\xcb\x78\xa8\x78\x00\x00\x00\x00\x00\x00\xaa\xd1\xaa\xcf\xcd\xad\x00\x00\xaa\xce\x00\x00\x00\x00\x00\x00\xaa\xd3\xaa\xd5\xaa\xd2\x00\x00\xcd\xb0\xcd\xac\xaa\xd6\x00\x00\xaa\xd0\xa8\x7c\x00\x00\xaa\xd4\xcd\xaf\x00\x00\x00\x00\xcd\xae\x00\x00\xaa\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x5b\xad\x47\xad\x48\xd0\x5d\x00\x00\xd0\x57\xd0\x5a\xd0\x63\xd0\x61\x00\x00\xad\x49\xd0\x67\xad\x4c\xd0\x64\xd0\x5c\xd0\x59\x00\x00\x00\x00\xdb\x49\xd0\x62\xad\x44\xd0\x65\xd0\x56\xd0\x5f\xad\x46\xad\x4b\xd0\x60\xad\x4f\xad\x4d\x00\x00\xd0\x58\xad\x4a\x00\x00\xd0\x5e\xad\x4e\xad\x45\xd0\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xda\x00\x00\xaf\xe3\xaf\xd8\xaf\xd6\xd3\x6a\xaf\xde\xaf\xdb\xd3\x6c\x00\x00\x00\x00\xaf\xdd\xd3\x6b\xd3\x69\xd3\x6e\xaf\xe2\xaf\xe0\xdb\x48\x00\x00", /* 8100 */ "\xd3\x6f\xd3\x6d\xaf\xd7\x00\x00\x00\x00\xaf\xd9\xaf\xdc\x00\x00\xaf\xdf\x00\x00\xaf\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x4e\xb2\xe4\x00\x00\xd7\x45\xd7\x47\x00\x00\xd7\x48\x00\x00\xd7\x50\xd7\x4c\xd7\x4a\x00\x00\xd7\x4d\xd7\x51\xb2\xe5\xb2\xe9\xd7\x46\x00\x00\xd7\x4f\x00\x00\xb2\xe7\x00\x00\xb2\xe6\xd7\x4b\xd7\x49\x00\x00\xb2\xe3\xb2\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xc8\xdb\x51\x00\x00\x00\x00\xdb\x4f\xb5\xca\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x4a\xdf\xa1\x00\x00\xb5\xc9\xdb\x4e\x00\x00\x00\x00\xdb\x4b\xb5\xc5\xb5\xcb\xdb\x50\xb5\xc7\xdb\x4d\xbb\x47\xb5\xc6\xdb\x4c\xb5\xcc\xb5\xc4\xb5\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x77\xdf\x75\x00\x00\xdf\x7b\x00\x00\xdf\x73\xdf\xa2\xdf\x78\x00\x00\xdf\x72\xb8\x7b\xb8\xa3\xdf\x7d\x00\x00\xdf\x76\x00\x00\xb8\x7e\x00\x00\x00\x00\xb8\x7c\xdf\x7e\xb8\x79\xb8\x78\xdf\x79\xb8\x7d\xb5\xcd\x00\x00\xdf\x7c\xdf\x74\xb8\x7a\xb8\xa1\xb8\xa2\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x4c", /* 8180 */ "\xbb\x48\x00\x00\xbb\x4d\xe3\xa6\x00\x00\x00\x00\xe3\xa5\xe3\xa7\xbb\x4a\xe3\xa4\xbb\x4b\xe3\xaa\xe3\xa9\xe3\xa8\x00\x00\xbb\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x41\x00\x00\xe7\x44\xbd\xa8\xe7\x43\xbd\xa7\xbd\xa3\xbd\xa4\xbd\xa5\xe7\x40\xe6\xfe\xbd\xa6\x00\x00\xe7\x42\xe6\xfd\x00\x00\x00\x00\xea\xe9\xea\xf3\xbf\xb1\xbf\xb0\x00\x00\xea\xed\xea\xef\x00\x00\xea\xea\x00\x00\xea\xee\xea\xe8\xea\xf1\xbf\xaf\xea\xf0\xea\xec\x00\x00\xea\xf2\x00\x00\xea\xeb\xc1\x74\xed\xe8\xed\xee\xc1\x78\xc1\x7a\xc1\x77\xc1\x76\x00\x00\xc1\x75\xc1\x73\xed\xe9\xed\xec\xc1\x72\xed\xed\x00\x00\xc1\x79\xed\xeb\x00\x00\xed\xea\xc2\xc0\x00\x00\xc2\xc1\xf0\xa1\xf0\x7d\xf0\x7e\x00\x00\x00\x00\xf2\xc2\x00\x00\xf2\xc1\xc3\xbe\xf4\xb4\xc4\xa4\xf4\xb3\x00\x00\xf5\xf0\xf7\x45\xc5\xa6\xf9\x43\xf9\x44\xc5\xd8\xa6\xda\x00\x00\xaa\xd7\xdb\x52\xbb\x4e\xc1\x7b\xed\xef\xa6\xdb\x00\x00\xaf\xe5\xaf\xe4\xdb\x53\x00\x00\x00\x00\x00\x00\xea\xf4\xa6\xdc\xad\x50\x00\x00\x00\x00\xdb\x54\xdb\x55\xdb\x56\xbb\x4f\xbf\xb2\xa6\xdd\x00\x00\xaa\xd8\xd0\x68", /* 8200 */ "\xaf\xe6\xd3\x70\xb2\xea\x00\x00\xdb\x57\xb8\xa4\x00\x00\xbb\x50\xbf\xb3\xc1\x7c\xc2\xc2\xf4\xb5\xa6\xde\xaa\xd9\x00\x00\x00\x00\xaf\xe7\xd7\x52\xb5\xce\x00\x00\xbb\x51\xe3\xab\xe7\x45\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xdf\xb5\xcf\xdf\xa3\xbb\x52\xa6\xe0\xcd\xb1\xd0\x69\xad\x51\x00\x00\x00\x00\xd3\x72\x00\x00\x00\x00\xaf\xea\x00\x00\xaf\xe8\xaf\xe9\xaf\xeb\x00\x00\x00\x00\xd3\x71\x00\x00\x00\x00\xd7\x57\xd7\x54\xd7\x56\xb2\xeb\xb2\xed\xb2\xec\xd7\x53\xb2\xee\xd7\x55\x00\x00\xdb\x58\xdb\x59\x00\x00\xdb\x5a\xdf\xa6\x00\x00\xdf\xa7\x00\x00\xdf\xa5\xdf\xa8\x00\x00\xb8\xa5\x00\x00\xdf\xa4\x00\x00\xbb\x53\x00\x00\x00\x00\xe7\x4a\xe7\x46\xe7\x49\xe7\x4b\xe7\x48\xe7\x47\x00\x00\xea\xf5\xea\xf6\xea\xf7\xbf\xb4\xbf\xb5\xed\xf1\xed\xf0\xed\xf2\x00\x00\xf0\xa3\xf0\xa2\x00\x00\xf2\xc4\x00\x00\xf2\xc5\xf2\xc3\x00\x00\xc4\xa5\x00\x00\xf4\xb6\xf4\xb7\x00\x00\xf7\x46\xf7\xef\xf8\xbb\xa6\xe1\xa8\x7d\x00\x00\xc1\x7d\xa6\xe2\x00\x00\xd7\x58\xdb\x5b\x00\x00\xc6\x41\xca\x4a\x00\x00\x00\x00\x00\x00\xca\x4b\xca\x4d\xa6\xe3\xca\x4e", /* 8280 */ "\xca\x4c\x00\x00\x00\x00\xcb\xa2\xcb\xa3\xcb\x7b\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xa1\xa8\xa1\x00\x00\xa8\xa2\xcb\x7c\xcb\x7a\xcb\x79\xcb\x7d\xa8\x7e\xcb\x7e\xd0\x6a\x00\x00\x00\x00\x00\x00\xcd\xb6\xaa\xdc\xcd\xb5\xcd\xb7\x00\x00\xaa\xdb\xcd\xbc\xaa\xdf\xcd\xb2\xcd\xc0\xcd\xc6\xaa\xe6\xcd\xc3\xaa\xe3\x00\x00\xcd\xb9\xcd\xbf\xcd\xc1\x00\x00\xcd\xb4\xaa\xe2\xaa\xdd\xcd\xba\xaa\xe4\xaa\xe7\xaa\xe1\x00\x00\xaa\xda\xcd\xbe\xcd\xb8\xcd\xc5\xaa\xe9\xaa\xe5\xaa\xe0\xcd\xbd\xaf\xec\xcd\xbb\xaa\xde\xaa\xe8\x00\x00\xcd\xb3\x00\x00\xcd\xc2\xcd\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x62\xad\x5c\xad\x64\xad\x61\xd0\x71\xd0\x74\xad\x5d\x00\x00\xd0\x6b\x00\x00\xad\x56\xad\x60\x00\x00\xad\x63\xad\x65\xd0\xa2\xd0\x77\x00\x00\xad\x55\xd0\xa1\xad\x59\xad\x57\xad\x52\xd0\x6f\x00\x00\xd0\x7e\xd0\x73\xd0\x76\xd0\xa5\x00\x00\xad\x66\xd0\x7d\xad\x5e\xd0\x78\xd0\xa4\xd0\x75\xd0\x79\xd0\x7c\x00\x00\x00\x00\xd0\x6d\xd0\xa3\xd0\x7b\x00\x00\x00\x00\xd0\x6c\x00\x00", /* 8300 */ "\xd0\x70\xad\x5f\xad\x5a\xad\x53\xad\x58\xad\x54\xad\x67\xd0\x6e\xd3\xa5\xad\x5b\x00\x00\x00\x00\xd0\x7a\xce\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\xa8\xaf\xfa\x00\x00\xd3\x76\x00\x00\xd3\xa3\xd3\x7d\x00\x00\xd3\xb2\x00\x00\xd3\xaa\x00\x00\xd3\x7e\x00\x00\xd3\xa9\xd3\x78\xd3\x7c\xd3\xb5\xaf\xfd\xd3\xad\xd3\xa4\xaf\xed\xd3\xb3\xd3\x74\x00\x00\xd3\xac\x00\x00\xaf\xfc\xaf\xf7\xd3\x73\xaf\xf5\xaf\xf4\xaf\xf9\xd3\xab\xaf\xf1\xaf\xf8\xd0\x72\xdb\x5c\xd3\xa6\x00\x00\x00\x00\xd3\x7a\xaf\xfb\xd3\x7b\xd3\xa1\xaf\xfe\xd3\x75\xd3\xaf\x00\x00\xd3\xae\xd3\xb6\xaf\xf3\xaf\xf0\xd3\xb4\xd3\xb0\xd3\xa7\xd3\xa2\xaf\xf6\xaf\xf2\xd3\x77\xaf\xee\xd3\xb1\xaf\xef\x00\x00\xd3\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x5e\xd7\x60\xd7\x65\xd7\x79\xb2\xfc\xb2\xf2\x00\x00\xd7\x5d\xb2\xfd\xb2\xfe\xd7\x68\xd7\x6f\xd7\x75", /* 8380 */ "\x00\x00\xd7\x62\x00\x00\xd7\x69\x00\x00\x00\x00\xb3\x40\xd7\x77\xd7\x72\xb2\xfa\xb2\xf8\xd7\x6e\xd7\x6a\xd7\x5c\xb2\xef\xd7\x61\xd7\x59\x00\x00\xb2\xf7\xb2\xf9\xd7\x66\xd7\x63\xb2\xf4\xd7\x73\xb2\xf1\xd7\x64\xd7\x7a\xd7\x6c\x00\x00\xd7\x6b\xb2\xf0\x00\x00\xb2\xfb\x00\x00\xb2\xf3\xd7\x5a\xd7\x5f\xd7\x70\xd7\x76\xb3\x41\xd7\x5b\xd7\x67\xd7\x6d\xb2\xf6\x00\x00\x00\x00\xd7\x78\xd7\x71\xd7\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xf5\x00\x00\xdb\x6c\xdb\x60\xb5\xd7\xdb\x7d\xdb\xa7\xdb\xaa\xb5\xd5\xdb\x68\xdb\xa3\xdb\x69\xdb\x77\xb5\xe2\xdb\x73\xb5\xdf\x00\x00\xdb\x74\xdb\x5d\x00\x00\xdb\xa4\x00\x00\x00\x00\xb5\xe8\xdb\xa1\xdb\x75\xdb\xac\xdb\x70\xdf\xc8\x00\x00\xdb\xaf\xb5\xe6\xdb\x6e\xdb\x7a\xb5\xe9\xb5\xd4\xdb\x72\xdb\xad\xdb\x6b\xdb\x64\xdb\x6f\x00\x00\xdb\x63\xdb\x61\xb5\xd0\xdb\xa5\xdb\x6a\xdb\xa8\x00\x00\xdb\xa9\xb5\xd8\xb5\xdd\xb5\xd9\xb5\xe1\xdb\x7e\xb5\xda\xdb\x76\xdb\x66\x00\x00\xb5\xd2\xdb\x5e\xdb\xa2\xdb\xab\xdb\x65\xb5\xe0\xdb\xb0\xdb\x71", /* 8400 */ "\x00\x00\xdb\x6d\x00\x00\xb5\xd1\xb5\xe5\x00\x00\xdb\x7c\xb5\xe7\x00\x00\xdb\x78\xb5\xdc\xb5\xd6\xb5\xde\xb5\xd3\xb5\xe4\xdb\x79\xdb\x67\xdb\x7b\xdb\x62\xdb\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xc7\x00\x00\xdf\xdd\xb8\x55\xdf\xcc\x00\x00\xdf\xca\xdf\xb5\xb8\xa9\xdf\xc5\xdf\xd9\xdf\xc1\xb8\xb1\xdf\xd8\xdf\xbf\xb5\xe3\xdf\xcf\xdf\xc0\xdf\xd6\xb8\xb0\xb8\xa8\x00\x00\xdf\xaa\xdf\xb2\x00\x00\xdf\xcb\xdf\xc3\xdf\xdc\xdf\xc6\xb8\xb6\xdf\xd7\x00\x00\xb8\xad\x00\x00\xdf\xc9\xdf\xd1\xdf\xb6\xdf\xd0\x00\x00\xdf\xe1\xdf\xb1\xdf\xd2\x00\x00\xdf\xdf\x00\x00\xdf\xab\xb5\xdb\x00\x00\xdf\xb9\xdf\xb8\xb8\xaf\x00\x00\xdf\xbc\xdf\xbe\xdf\xcd\xdf\xde\xb8\xb2\x00\x00\xb8\xb3\x00\x00\xdf\xb0\xb8\xab\xdf\xb4\xdf\xda\xb8\xb4\x00\x00\xb8\xac\xb8\xae\xb8\xb5\xdf\xe0\xdf\xd3\xdf\xce\x00\x00\x00\x00\xdf\xbb\xdf\xba\xb8\xaa\xdf\xac\xb8\xa7\xdf\xc4\xdf\xad\xdf\xc2\x00\x00\x00\x00\xdf\xb7\xdf\xdb\x00\x00", /* 8480 */ "\x00\x00\x00\x00\xb8\xa6\x00\x00\x00\x00\x00\x00\xdf\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xaf\xdf\xd5\xdf\xae\xbb\x60\xe3\xd3\x00\x00\x00\x00\xe3\xc2\x00\x00\x00\x00\xe3\xac\xe3\xca\xbb\x58\xe3\xbb\xe3\xc5\xbb\x5b\xe3\xbe\xbb\x59\xe3\xaf\xe3\xcd\xe3\xae\xe3\xc1\x00\x00\xe3\xad\x00\x00\x00\x00\xe3\xbf\xe3\xc8\xe3\xc6\xe3\xba\xe3\xb5\xe3\xb3\x00\x00\xe3\xb4\xe3\xc7\xe3\xd2\xe3\xbc\xbb\x5a\x00\x00\xe3\xb7\x00\x00\xe3\xcb\x00\x00\xbb\x5d\xe3\xb6\xe3\xb0\xe3\xc0\xbb\x61\x00\x00\x00\x00\xbb\x55\xbb\x5e\xe3\xb8\xe3\xb2\x00\x00\xbb\x57\xdf\xd4\xbb\x56\xe3\xc3\x00\x00\xbb\x54\xbb\x63\xbb\x5c\xe3\xc4\xe3\xb9\xe3\xb1\xe3\xcc\xe3\xbd\xbb\x62\xe3\xd0\xbb\x5f\xe3\xcf\x00\x00\xe3\xc9\xe3\xce\x00\x00\x00\x00\x00\x00\xe3\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x73\xe7\x74\xe7\x67\xe7\x66\xe7\x62\xbd\xb4\x00\x00\xbd\xac\xe7\x76\xe7\x75\xdf\xa9\xe7\x5f\xe7\x63\xe7\x5d\x00\x00\xe7\x70\xe7\x61\x00\x00\xe7\x77\xe7\x5a\xe7\x58\xe7\x64\xe7\x6e\xe7\x69\xbd\xb6", /* 8500 */ "\xe7\x4f\x00\x00\xe7\x6d\x00\x00\x00\x00\x00\x00\xbd\xb7\xdf\xbd\xe7\x5b\xe7\x52\xe7\x55\xe7\x7b\xe7\x5c\xe7\x53\xe7\x51\xe7\x4e\x00\x00\xbd\xb0\xe7\x65\xbd\xaf\xbd\xb3\xe7\x60\xe7\x68\xbd\xa9\xe7\x78\xe7\x7c\xbd\xab\x00\x00\xe7\x57\xe7\x6b\xe7\x6f\xe7\x54\xe7\x79\xbd\xb2\x00\x00\xbd\xb1\xe7\x4c\xbd\xb5\xe7\x72\xe7\x56\xe7\x6a\xe7\x50\xe7\x5e\xe7\x59\xbd\xad\xbd\xae\xe7\x6c\xe7\x7d\xe7\x7a\xe7\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x4d\x00\x00\xbd\xaa\xeb\x49\x00\x00\xeb\x40\xeb\x43\x00\x00\xbf\xbb\xeb\x45\xea\xf9\xeb\x41\xeb\x47\xbf\xb8\xbf\xbc\xbf\xb6\x00\x00\x00\x00\xea\xfb\xeb\x4c\x00\x00\x00\x00\xeb\x46\x00\x00\xea\xfc\xeb\x55\xeb\x4f\xea\xf8\xee\x46\xea\xfe\xbf\xb7\x00\x00\xeb\x4a\x00\x00\xeb\x54\xbf\xbf\x00\x00\xeb\x51\xea\xfd\xeb\x44\xeb\x48\xeb\x42\xeb\x56\xeb\x53\xeb\x50\xbf\xb9\xbf\xba\xbf\xbe\xea\xfa\xeb\x57\xbf\xbd\xeb\x4d\x00\x00\x00\x00\xeb\x4b\x00\x00\x00\x00\x00\x00\xeb\x4e\xee\x53\xee\x40\xee\x45\xee\x52\xee\x44\xed\xfb\xee\x41\x00\x00\xc1\xa2\x00\x00", /* 8580 */ "\xed\xf4\xee\x4d\xee\x4f\xed\xf3\xc1\xa1\xee\x51\xee\x49\xc1\xa8\xee\x50\xee\x42\xc1\xaa\xed\xf9\xeb\x52\xee\x4a\xee\x47\xed\xf5\xee\x55\xc1\xa4\x00\x00\x00\x00\xc1\xa5\xed\xf7\xee\x48\x00\x00\xee\x54\xee\x4b\xed\xfd\xc1\xa7\xc1\xa3\xee\x4c\xed\xfe\xee\x56\xed\xf8\xee\x43\xee\x4e\xed\xfa\xed\xfc\x00\x00\xc2\xcb\xed\xf6\xc1\xa9\xc2\xc4\xc1\x7e\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xa6\xc2\xc8\xf0\xb3\x00\x00\xf0\xa9\xf0\xa4\xf0\xaa\xf0\xb4\xf0\xb8\xf0\xb7\xc2\xca\xc2\xc9\x00\x00\x00\x00\xf0\xab\xf0\xb9\xf0\xae\xf0\xa6\x00\x00\xf0\xa8\xf0\xa7\xf0\xad\xf0\xb2\xf0\xa5\xf0\xac\xf0\xb1\xc2\xc7\x00\x00\xf0\xaf\x00\x00\xc2\xc5\xf0\xb0\xc2\xc3\xc2\xc6\xf2\xd5\xf0\xb5\x00\x00\x00\x00\xc3\xc2\x00\x00\xf2\xcd\xf2\xd1\xf2\xc9\xf2\xcc\x00\x00\xf2\xd4\xc3\xc0\xf2\xd9\xf2\xd2\x00\x00\xf2\xca\xf2\xda\xf2\xd3\xc3\xc3\xc3\xc4\xf2\xd7\x00\x00\xf2\xcb\xc3\xbf\xc3\xc1\xf2\xc6\xf2\xce\xf2\xc8\x00\x00\xf2\xd8\xf2\xd6\xf2\xc7\xf2\xcf\x00\x00\x00\x00\x00\x00\xf4\xbe\xc3\xc5\xf2\xd0\xc4\xa7\xc4\xa9\xc4\xa6\x00\x00\xf4\xc3\xf4\xbb\xf4\xb9", /* 8600 */ "\xf4\xbd\xf4\xba\x00\x00\x00\x00\xf4\xbf\xf4\xc1\xc4\xaa\xc4\xac\x00\x00\xf4\xc0\xc4\xad\xc4\xab\xf4\xc2\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xf4\xf5\xf1\xf5\xf7\xc4\xf6\xf4\xbc\xf5\xf6\x00\x00\xf5\xfd\xf5\xf4\xf5\xfb\xf5\xfa\xf4\xb8\xf5\xf5\xf0\xb6\xf5\xfe\xf5\xf3\xf5\xf8\x00\x00\xf5\xfc\xf5\xf2\x00\x00\xf7\x4a\xc4\xf5\xf5\xf9\x00\x00\x00\x00\xf7\xf4\xf7\x4b\xf7\x49\xf7\x47\xf7\x48\xf7\x4c\x00\x00\xc5\xd9\xf7\xf2\xf7\xf0\xf7\xf5\xf7\xf3\x00\x00\xf7\xf6\xc5\xda\xf7\xf1\x00\x00\x00\x00\xf8\xbc\x00\x00\x00\x00\xf9\x45\xf9\x46\xf9\x47\x00\x00\x00\x00\xf9\xc7\xf9\xbd\xca\x4f\xaa\xea\x00\x00\xad\x68\x00\x00\xd3\xb8\xd3\xb7\xb0\x40\xb3\x42\xd7\x7c\x00\x00\x00\x00\xd7\x7b\x00\x00\xb5\xea\xb8\xb8\x00\x00\xb8\xb7\xb8\xb9\x00\x00\xe3\xd4\xe7\x7e\xeb\x58\xeb\x5a\xeb\x59\x00\x00\xc1\xab\xee\x57\xf0\xba\xf9\xa5\xa6\xe4\x00\x00\xcd\xc9\xcd\xca\xcd\xc8\xcd\xc7\xaa\xeb\x00\x00\xd0\xa9\xd0\xa7\x00\x00\x00\x00\xd0\xa6\x00\x00\xad\x69\xad\x6b\xad\x6a\xd0\xa8\x00\x00\x00\x00\x00\x00", /* 8680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\xc4\xd3\xc1\xd3\xbf\x00\x00\x00\x00\xb0\x41\xd3\xc2\xb0\x46\xd3\xbc\xd3\xcb\x00\x00\xd3\xcd\xd3\xbd\x00\x00\xb0\x43\xd3\xce\xd3\xc9\xd3\xbb\xd3\xc0\xd3\xca\xd3\xc6\xd3\xc3\x00\x00\xb0\x48\xd3\xcc\xd3\xbe\x00\x00\x00\x00\xd3\xc7\xd3\xb9\xb0\x47\xb0\x44\xd3\xc5\x00\x00\xd3\xc8\xd3\xba\xb0\x45\xb0\x42\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x4c\xd7\xa5\xb3\x4b\x00\x00\xd7\xa8\xd7\xab\xb3\x48\xb3\x46\xd7\x7e\xd7\xa9\xd7\xa7\xd7\xa4\xd7\xac\xd7\xad\xd7\xaf\xd7\xb0\xd7\x7d\xb3\x45\xd7\xa2\xd7\xa1\xd7\xae\xb3\x47\xd7\xa3\xb3\x49\xb3\x44\xd7\xa6\xb3\x4d\x00\x00\xb3\x4a\xd7\xaa\x00\x00\x00\x00\x00\x00\xb5\xf1\xdb\xbf\x00\x00\xdb\xb4\xb5\xee\x00\x00\xdf\xe7\xdb\xbd\xdb\xb1\xb5\xec\xdb\xb6\xb5\xef\xdb\xba\xdb\xb8\xb5\xf2\xb5\xeb\x00\x00\x00\x00\xdb\xb2\xdb\xb5\xb5\xf0\x00\x00\xdb\xb3\x00\x00\xdb\xbe\xdb\xbc\xdb\xb7\xdb\xb9\xdb\xbb\xb5\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xe8\xdf\xee\xdf\xe4\xdf\xea\xb8\xba\xdf\xe6\xb8\xc0\x00\x00\x00\x00\xb8\xbf\x00\x00", /* 8700 */ "\xb8\xbe\xdf\xed\xb8\xc1\xb8\xc2\xdf\xe3\xdf\xf0\xb8\xc3\xb8\xbd\xb8\xbc\xdf\xec\xb8\xc4\xdf\xe2\xdf\xe5\xdf\xef\xdf\xeb\x00\x00\x00\x00\xe3\xf4\xe3\xe9\xb8\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x6a\xe3\xdd\xe3\xf2\xe3\xde\xbb\x65\x00\x00\xe3\xdb\x00\x00\xe3\xe4\xe3\xdc\xbb\x67\xe3\xd6\xe3\xf1\xbb\x68\xe3\xee\xe3\xef\xe3\xd7\xbb\x6d\xe3\xe6\x00\x00\xe3\xe0\xe3\xe7\xe3\xda\x00\x00\xe3\xf3\xe3\xeb\xe3\xe5\xe3\xd5\xbb\x69\xe3\xec\x00\x00\xbb\x6c\xe3\xf0\x00\x00\xe3\xea\xbb\x66\xe3\xe8\x00\x00\xe3\xe2\xbb\x64\xe3\xd9\xe3\xe1\xe3\xed\xe3\xdf\x00\x00\x00\x00\xe3\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xc1\xdf\xe9\xe7\xb2\xe7\xbb\xe7\xb1\xe7\xad\xe7\xaa\xbd\xc2\xe7\xa8\xbb\x6b\xe7\xa1\xbd\xc0\xe7\xa7\xbd\xbf\xe7\xac\xe7\xa9\xe7\xb9\xe7\xb4\xe7\xae\xe7\xb3\xbd\xbb\xe7\xab\xe7\xbe\xe7\xa2\xe7\xa3\xe7\xba\xbd\xbc\xe7\xbf\xbd\xbe\xe7\xc0\xe7\xb0\xe3\xd8\xe7\xb6\xe7\xaf\xe7\xb8\xe7\xb5\x00\x00\x00\x00\x00\x00\xe7\xa6\xbd\xb9\xe7\xbd\xbd\xba\xe7\xa4\xbd\xbd\xeb\x64\xe7\xb7\xe7\xbc\x00\x00\x00\x00\x00\x00\x00\x00", /* 8780 */ "\x00\x00\xeb\x61\xbd\xb8\xbf\xc0\xeb\x6b\xeb\x67\x00\x00\xeb\x65\xeb\x60\xeb\x6f\x00\x00\x00\x00\x00\x00\xbf\xc4\x00\x00\xeb\x5c\xeb\x68\xeb\x69\xeb\x5f\xeb\x5e\xeb\x6c\x00\x00\xeb\x62\xeb\x5d\xeb\x63\x00\x00\xeb\x6e\xeb\x5b\xeb\x6d\xeb\x6a\xbf\xc2\xbf\xc1\x00\x00\x00\x00\xbf\xc3\xeb\x66\xf0\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\x59\xc1\xb1\xee\x5d\xee\x5a\xee\x61\xee\x67\xee\x5c\x00\x00\xee\x70\xc1\xae\xee\x6a\xee\x5f\xee\x6b\xee\x66\xee\x6d\xee\x5e\xc1\xb3\xc1\xb2\xee\x60\xee\x6e\xee\x58\xee\x6c\xc1\xac\x00\x00\xee\x64\xee\x63\xee\x68\xee\x5b\xc1\xb0\x00\x00\xc1\xb4\xee\x62\xee\x69\xc1\xb5\xee\x65\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xad\xc1\xaf\xf0\xc7\xf0\xc5\x00\x00\x00\x00\xf0\xcc\xf0\xc9\xf0\xcd\x00\x00\xf0\xbe\xf0\xc6\xf0\xd1\xee\x6f\xf0\xc2\xc2\xcf\xe7\xa5\xf0\xbd\xf0\xca\xf0\xc4\xf0\xc1\xf0\xbc\xf0\xbb\xf0\xd0\x00\x00\xf0\xc0\xf0\xbf\xc2\xcd\xf0\xc8\x00\x00\xc2\xcc\x00\x00\x00\x00\xc2\xce\xf0\xc3\xf0\xcf\x00\x00\xf2\xde\xf2\xdf\x00\x00\xc3\xc9\xf2\xdc\xc3\xc6\xf2\xe4\x00\x00\xc3\xca\xf2\xe6", /* 8800 */ "\xf2\xdb\xf0\xce\xf2\xe8\xf2\xdd\x00\x00\xc3\xc7\xf2\xe3\x00\x00\xf2\xe5\xf2\xe0\xf2\xe7\xf2\xe2\xf2\xe1\xc3\xc8\x00\x00\x00\x00\xf4\xc5\xf4\xc6\x00\x00\xf4\xc8\xc4\xae\xc4\xaf\xf4\xc9\xf4\xc7\x00\x00\xf4\xc4\x00\x00\xf6\x42\xf6\x45\xf6\x41\x00\x00\xc4\xfa\xf6\x43\xc4\xf9\xc4\xf8\xc4\xf7\xf6\x44\xf7\x51\xf7\x4f\x00\x00\xf7\x4e\xf6\x40\xf7\x50\xf6\x46\xf7\x4d\x00\x00\xf7\xf9\xf7\xd7\xf7\xf7\xc5\xdb\xf7\xf8\xf7\xfa\x00\x00\xf8\xbf\xc5\xfa\xf8\xbe\xf8\xbd\xc5\xfb\x00\x00\xc6\x5a\xf9\x6e\xf9\xa7\xf9\xa6\xf9\xa8\xa6\xe5\xd0\xaa\x00\x00\xd3\xcf\xd3\xd0\x00\x00\x00\x00\x00\x00\xdb\xc0\x00\x00\xf6\x47\xf8\xc0\xa6\xe6\xad\x6c\xd0\xab\x00\x00\x00\x00\x00\x00\xd7\xb1\xb3\x4e\x00\x00\xdb\xc2\xdb\xc1\xb5\xf3\x00\x00\xb8\xc5\xe7\xc1\xbd\xc3\x00\x00\xbd\xc4\x00\x00\x00\x00\x00\x00\xbf\xc5\xc5\xfc\xa6\xe7\x00\x00\x00\x00\x00\x00\xd0\xac\xaa\xed\xd0\xae\xd0\xad\xad\x6d\x00\x00\xd3\xd1\x00\x00\xd3\xd8\xb0\x49\xd3\xd6\xd3\xd4\x00\x00\xd3\xdb\xd3\xd2\xd3\xd3\xb0\x4a\x00\x00\xb0\x4e\x00\x00\x00\x00\xd3\xdc\xb0\x4d\xd3\xda\xd3\xd7", /* 8880 */ "\xd3\xd5\xb0\x4b\xb0\x4c\xd3\xd9\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x50\xd7\xb2\x00\x00\xb3\x55\xd7\xc2\xb3\x54\xd7\xc4\x00\x00\x00\x00\xd7\xb8\xb3\x52\xd7\xc3\x00\x00\xd7\xb3\xb3\x53\xd7\xbf\xd7\xbb\xd7\xbd\xd7\xb7\xd7\xbe\x00\x00\x00\x00\xb3\x4f\xd7\xba\x00\x00\xd7\xb9\xd7\xb5\x00\x00\xd7\xc0\x00\x00\x00\x00\xd7\xbc\xd7\xb4\x00\x00\xd7\xb6\xb3\x51\xd7\xc1\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xf6\xdb\xcd\x00\x00\x00\x00\x00\x00\xdb\xc9\xdb\xcb\xdb\xc6\xdb\xc5\xdb\xc3\x00\x00\xdb\xca\xdb\xcc\xdb\xc8\x00\x00\xdb\xc7\xb5\xf4\xb5\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xcf\xb8\xcd\xdf\xf2\xdf\xf8\xdf\xf3\xdf\xf4\xf9\xd8\xdf\xf9\x00\x00\xb8\xcf\x00\x00\xb8\xc7\xb8\xce\xdf\xf1\xdb\xc4\xb8\xca\xb8\xc8\xdf\xf7\xdf\xf6\xb8\xc9\xb8\xcb\xdf\xf5\xb8\xc6\x00\x00\xb8\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xf6\xbb\x74\x00\x00\x00\x00\xe4\x42\xe4\x41\x00\x00\xe3\xfb\xbb\x76\xe4\x40\xe3\xf7\xe3\xf8\xbb\x6e\xbb\x70\x00\x00\xe3\xfd\xe3\xf5\xbb\x72\xbb\x71\xe3\xf9\xe3\xfe\xe3\xfc\xbb\x73\xe3\xfa\x00\x00", /* 8900 */ "\x00\x00\xdb\xce\xbb\x6f\x00\x00\x00\x00\xe7\xc2\xe7\xc9\xbd\xc6\x00\x00\xe7\xcd\xbd\xca\xe7\xc5\xe7\xc3\x00\x00\xe7\xcc\x00\x00\xbd\xc5\xe7\xcb\xbd\xc7\xbd\xc8\xe7\xc4\xbd\xc9\xe7\xca\xe7\xc6\xe7\xc7\xe7\xc8\xbb\x75\x00\x00\x00\x00\x00\x00\xeb\x70\xeb\x7c\x00\x00\xbf\xca\xeb\x77\xeb\x79\x00\x00\xbf\xc8\xeb\x71\xeb\x75\x00\x00\xeb\x78\xbf\xc6\xbf\xc9\xeb\x7b\xeb\x73\xeb\x74\xeb\x7a\xeb\x72\xeb\x76\xbf\xc7\xee\x72\x00\x00\xee\x71\xc1\xb7\xee\x77\xc1\xb9\x00\x00\x00\x00\xc1\xb6\xee\x73\xc1\xba\xee\x74\x00\x00\x00\x00\xee\x75\xee\x78\x00\x00\xc1\xb8\x00\x00\xf0\xd6\x00\x00\x00\x00\xf0\xd9\x00\x00\xf0\xd3\xf0\xd5\x00\x00\x00\x00\xf0\xd4\xf0\xd7\xf0\xd8\xee\x76\xf0\xd2\x00\x00\x00\x00\xc3\xcd\xf2\xec\xf2\xef\xf2\xf1\xf2\xea\xf2\xeb\xf2\xee\xf2\xf0\xc3\xce\xc3\xcc\xc3\xcb\xf2\xed\xf2\xe9\xf4\xca\xc4\xb0\x00\x00\xf4\xcb\x00\x00\x00\x00\xf6\x49\xc4\xfb\xf6\x4b\xc4\xfc\xf6\x48\xf6\x4a\xc5\xa8\x00\x00\xf7\x52\xc5\xa7\xf7\xfd\xf7\xfc\x00\x00\xf7\xfb\x00\x00\x00\x00\xf9\x48\xf9\x49\xf9\x4b\xf9\x4a\x00\x00\xca\x50\xa6\xe8", /* 8980 */ "\x00\x00\xad\x6e\xd7\xc5\xb5\xf7\x00\x00\xdf\xfa\xc2\xd0\x00\x00\xf2\xf2\x00\x00\x00\x00\xa8\xa3\x00\x00\x00\x00\x00\x00\xb3\x57\x00\x00\x00\x00\x00\x00\xb3\x56\x00\x00\xdb\xd0\xb5\xf8\xdb\xd2\xdb\xd1\x00\x00\x00\x00\xdf\xfb\xb8\xd0\xe4\x43\xe4\x46\xe4\x45\x00\x00\xe4\x44\xe7\xce\xe7\xd0\xe7\xcf\x00\x00\xbf\xcc\x00\x00\x00\x00\x00\x00\xbf\xcb\x00\x00\xc1\xbb\xee\x79\xee\x7b\xee\x7a\x00\x00\x00\x00\xc2\xd1\x00\x00\x00\x00\x00\x00\xf2\xf4\xf2\xf3\x00\x00\xf4\xcc\xc4\xb1\x00\x00\x00\x00\xc4\xfd\xf7\x54\xf7\x53\xc6\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa4\xd0\xaf\xad\x6f\xd7\xc8\xd7\xc6\x00\x00\x00\x00\xd7\xc7\xdb\xd4\xdb\xd5\xe0\x43\xdb\xd3\x00\x00\xdf\xfc\xe0\x41\xe0\x40\xe0\x42\xb8\xd1\xdf\xfe\xdf\xfd\xe0\x44\x00\x00\xe4\x49\xe4\x47\x00\x00\xe4\x48\xe7\xd3\xe7\xd1\x00\x00\x00\x00\xe7\xd2\xeb\x7d\xee\x7c\xee\x7d\xc2\xd2\x00\x00\xf2\xf5\xf4\xcd\xc4\xb2\x00\x00\xf6\x4c\xf7\x55\xc5\xa9\x00\x00\xf7\xfe\xf9\x4c", /* 8a00 */ "\xa8\xa5\x00\x00\xad\x71\xad\x72\xd0\xb0\x00\x00\x00\x00\xd0\xb1\xad\x70\x00\x00\xb0\x54\x00\x00\xb0\x52\x00\x00\xb0\x51\xb0\x58\xb0\x50\xb0\x59\xd3\xdd\xb0\x56\x00\x00\xb0\x53\xb0\x57\xb0\x55\xb0\x4f\x00\x00\x00\x00\xb3\x5f\x00\x00\xb3\x59\xd7\xcc\xb3\x5e\x00\x00\x00\x00\xb3\x60\xb3\x5a\x00\x00\xb3\x5b\x00\x00\xd7\xca\x00\x00\x00\x00\xb3\x58\x00\x00\xd7\xcb\xb3\x5d\x00\x00\x00\x00\xd7\xc9\xb3\x5c\x00\x00\x00\x00\xb6\x44\x00\x00\xb6\x46\x00\x00\x00\x00\xdb\xd8\xb6\x45\xb5\xf9\xb5\xfd\x00\x00\xb8\xe4\xe0\x49\xdb\xda\xb5\xfe\x00\x00\x00\x00\xdb\xdd\xdb\xde\xb6\x43\x00\x00\xdb\xe0\x00\x00\xdb\xe2\x00\x00\xdb\xe3\xdb\xd7\xdb\xd6\xdb\xe4\xb6\x42\xdb\xe1\xdb\xdf\x00\x00\xb6\x40\xb5\xfb\xb6\x47\xdb\xdb\xdb\xdc\xdb\xd9\x00\x00\xb6\x41\x00\x00\x00\x00\xb5\xfc\x00\x00\xb5\xfa\xe0\x48\xb8\xdf\xb8\xda\x00\x00\x00\x00\xb8\xd5\x00\x00\xb8\xe5\xb8\xd6\x00\x00\xb8\xd2\xb8\xe1\xb8\xde\xb8\xe0\x00\x00\xb8\xd7\xb8\xdc\xb8\xd3\xb8\xd4\xe0\x50\xe0\x4d\xe0\x45\xe0\x4a\x00\x00\xb8\xe2\xe0\x51\xb8\xe3\xb8\xd9\x00\x00\x00\x00\xe0\x47", /* 8a80 */ "\x00\x00\xe0\x4f\xe0\x4b\xe0\x4e\xe0\x4c\xb8\xdd\xe0\x46\xb8\xd8\x00\x00\x00\x00\x00\x00\xe4\x4c\xbb\x78\xbb\x7b\x00\x00\xe4\x4e\x00\x00\xbb\xa5\xe4\x4d\xbb\x7d\x00\x00\xbd\xcf\xe4\x4f\x00\x00\xbb\xa4\xe4\x4b\xbb\xa6\x00\x00\x00\x00\x00\x00\xbb\x79\x00\x00\xb8\xdb\xbb\x7c\x00\x00\xbb\x7a\xbb\x7e\xbb\xa2\xbb\x77\xbb\xa7\xbb\xa3\x00\x00\xbb\xa1\xe4\x4a\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xd6\x00\x00\xbd\xd2\x00\x00\x00\x00\x00\x00\xbd\xd9\x00\x00\xe7\xd6\xbd\xda\xe7\xe2\xe7\xdb\xbd\xcb\xe7\xe3\xe7\xdd\xbd\xd5\xe7\xde\x00\x00\xbd\xd4\xe7\xe1\xbd\xce\xe7\xdf\xe7\xd5\xbd\xcd\xeb\xaa\xbd\xd3\x00\x00\xbd\xd0\x00\x00\xbd\xd8\x00\x00\xe7\xd4\x00\x00\xe7\xd8\xbd\xcc\xe7\xd7\xe7\xd9\xe7\xda\xbd\xd7\xe7\xdc\xe7\xe0\xe7\xe4\x00\x00\xbd\xdb\xbf\xd2\xeb\xa5\xeb\xab\xeb\xa8\xeb\x7e\xeb\xac\xeb\xa1\x00\x00\xeb\xa7\x00\x00\xbf\xcd\xbf\xd3\xeb\xad\x00\x00\x00\x00\xbf\xcf\x00\x00\xbf\xd9\xbf\xd4\xeb\xaf\xeb\xa9\xbf\xd0\xeb\xa2\xbf\xda\xeb\xa3\xeb\xa4\xbf\xdb\xbf\xd8\xbd\xd1\x00\x00\xbf\xce\xeb\xb0\xbf\xdc\x00\x00\xbf\xd5\xeb\xae", /* 8b00 */ "\xbf\xd1\xbf\xd6\xbf\xd7\x00\x00\xc1\xc3\xee\xa4\xee\xad\xee\xaa\xee\xac\x00\x00\xc1\xc0\xee\xa5\x00\x00\xee\xab\xc1\xbc\xee\xa7\xc1\xc4\xee\xa3\xee\xa8\xee\xaf\xeb\xa6\xee\xa9\xee\xa2\xc1\xbd\xee\xa1\xc1\xbe\xee\xb0\xc1\xbf\xee\xae\xc1\xc2\xee\x7e\x00\x00\xc1\xc1\x00\x00\xee\xa6\xf0\xdc\xf0\xea\xf0\xe5\xf0\xe7\xf0\xdb\xc2\xd3\x00\x00\xf0\xda\xc2\xd6\xc2\xd5\x00\x00\xf0\xe9\xf0\xe1\xf0\xde\xf0\xe4\x00\x00\xf0\xdd\x00\x00\xf0\xdf\xf0\xe8\xf0\xe6\x00\x00\xc2\xd4\xf0\xed\xf0\xeb\xf0\xe2\xf0\xec\xf0\xe3\x00\x00\xf2\xf9\xc3\xcf\xf3\x41\x00\x00\x00\x00\xf6\x4f\xc3\xd6\xf0\xe0\xf2\xf7\xc3\xd2\xf2\xf8\xf2\xfd\x00\x00\x00\x00\xc3\xd4\xc3\xd5\xf2\xf6\xf3\x40\xf3\x42\xf2\xfa\xf2\xfc\xf2\xfe\xf2\xfb\xf3\x43\xc3\xd1\xc3\xd7\xc3\xd3\x00\x00\xc3\xd0\xf4\xd0\x00\x00\xc4\xb7\xf4\xce\x00\x00\x00\x00\xf4\xd2\x00\x00\xf4\xd3\xc4\xb5\xf4\xd4\xf4\xd1\x00\x00\xf4\xcf\xc4\xb8\xc4\xb4\xf4\xd5\x00\x00\xc4\xb6\xc4\xb3\x00\x00\x00\x00\x00\x00\xc4\xfe\x00\x00\x00\x00\xc5\x40\xf6\x4e\xf6\x4d\xf6\x50\xf6\x51\x00\x00\xc5\x41\xf7\x56\xf7\x5b", /* 8b80 */ "\xc5\xaa\x00\x00\xf7\x58\x00\x00\xf7\x57\xf7\x5a\xf7\x59\x00\x00\xf8\x43\x00\x00\xc5\xdc\xf8\x42\xf8\x40\x00\x00\xf8\x41\x00\x00\x00\x00\x00\x00\xc5\xfe\xc5\xfd\xf8\xc1\xf8\xc2\xc6\x40\x00\x00\xf9\x4d\xf9\x4e\xc6\x67\x00\x00\xc6\x6d\x00\x00\xf9\xa9\xf9\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xa6\x00\x00\xd7\xcd\x00\x00\xd7\xce\xe0\x52\xe4\x50\xe7\xe5\xc1\xc6\x00\x00\xc1\xc5\xf0\xee\xf3\x44\x00\x00\xf8\x44\xa8\xa7\xd3\xde\xb0\x5a\xb3\x61\xe0\x54\xe0\x53\xbd\xdc\xe7\xe6\xbd\xdd\xee\xb1\xc2\xd7\x00\x00\x00\x00\x00\x00\xc6\x76\xa8\xa8\xcd\xcb\xd3\xdf\x00\x00\x00\x00\xb3\x62\x00\x00\xd7\xcf\xd7\xd0\x00\x00\xdb\xe5\x00\x00\xb6\x48\xb8\xe6\x00\x00\xe0\x56\xe0\x55\xe0\x57\x00\x00\xe4\x51\xe4\x52\xbb\xa8\xbf\xdd\xbd\xde\xbf\xde\x00\x00\xee\xb5\xee\xb2\xee\xb4\xee\xb3\xc1\xc7\x00\x00\xf0\xef\xf3\x46\xf3\x45\xcb\xa4\xb0\x5c\xb0\x5b\xd3\xe0\x00\x00\xd7\xd1\x00\x00\x00\x00", /* 8c80 */ "\xdb\xe7\xdb\xe6\xb6\x49\x00\x00\xe0\x59\xe0\x5a\xe0\x58\x00\x00\x00\x00\xb8\xe8\xb8\xe7\x00\x00\xbb\xaa\xbb\xa9\x00\x00\xe7\xe7\xeb\xb3\xeb\xb1\xeb\xb2\xbf\xdf\xee\xb7\xee\xb6\x00\x00\xf0\xf2\xf0\xf1\xf0\xf0\xf3\x47\x00\x00\xf9\xaa\xa8\xa9\xad\x73\x00\x00\xad\x74\xb0\x5d\xb0\x5e\xd3\xe2\xd3\xe1\xd7\xd2\x00\x00\xb3\x68\xb3\x66\xb3\x63\xb3\x67\xb3\x65\xb3\x64\x00\x00\x00\x00\xb6\x4a\xdb\xea\x00\x00\xb8\xed\xb6\x4c\xb6\x51\xdb\xec\xb6\x53\xb6\x52\xb6\x55\xdb\xeb\xdb\xe8\xb6\x4f\xb6\x4b\xb6\x4d\xdb\xe9\xb6\x54\xb6\x50\xb6\x4e\xb8\xef\xb8\xee\xb8\xec\xb8\xf0\x00\x00\xb8\xea\xb8\xeb\x00\x00\xb8\xe9\x00\x00\xe0\x5b\x00\x00\x00\x00\xe4\x54\x00\x00\xbb\xac\xbb\xad\xbb\xab\x00\x00\xe4\x53\x00\x00\xe4\x55\x00\x00\xe7\xea\xe7\xec\x00\x00\xbd\xe7\xe7\xed\xbd\xe0\xe7\xe9\xbd\xdf\xbd\xe9\xbd\xe5\xbd\xe6\xbd\xe2\xe7\xe8\xbd\xe1\xe7\xee\xe7\xeb\x00\x00\xbd\xe8\x00\x00\xbd\xe3\xbd\xe4\xeb\xb5\x00\x00\xeb\xb7\xeb\xb6\x00\x00\xeb\xb8\xbf\xe0\xeb\xb4\x00\x00\x00\x00\xc1\xcb\xee\xb8\xc1\xc8\xc1\xcc\xc1\xca\xc1\xc9\xf0\xf3\x00\x00", /* 8d00 */ "\xf0\xf6\x00\x00\xf0\xf5\x00\x00\xf0\xf4\xc2\xd8\xf3\x48\xf3\x49\xc3\xd8\xf3\x4a\xc3\xd9\x00\x00\x00\x00\xc4\xba\x00\x00\xc4\xb9\xf6\x52\x00\x00\x00\x00\xc5\x42\xf6\x53\xf7\x5c\xc5\xab\xc5\xac\x00\x00\xf8\x45\x00\x00\xc6\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xaa\x00\x00\xb3\x6a\xb3\x69\xe0\x5c\xe0\x5d\x00\x00\xbb\xae\xeb\xb9\xbd\xea\xeb\xba\xee\xb9\xa8\xab\x00\x00\xd0\xb2\xad\x76\xad\x75\x00\x00\xd3\xe3\xb0\x5f\xd3\xe4\xd7\xd5\x00\x00\xd7\xd4\x00\x00\xd7\xd3\x00\x00\x00\x00", /* 8d80 */ "\xdb\xee\xb6\x58\x00\x00\x00\x00\xdb\xed\xb6\x57\x00\x00\x00\x00\x00\x00\xdb\xef\xb6\x56\x00\x00\xe0\x5f\xe0\x62\xe0\x60\xe0\x61\xe0\x65\xe0\x5e\xe0\x66\xe0\x63\xe0\x64\xbb\xb0\xe4\x56\x00\x00\x00\x00\xbb\xaf\x00\x00\xe7\xf2\xe7\xf0\x00\x00\x00\x00\xbd\xeb\xe7\xef\xe7\xf1\x00\x00\xbd\xec\x00\x00\xeb\xbb\x00\x00\xeb\xbc\xc1\xcd\x00\x00\xf3\x4c\xf3\x4e\xf3\x4b\xf3\x4d\xf4\xd6\xf6\x54\x00\x00\x00\x00\xf9\x6f\xa8\xac\xad\x77\xd3\xe5\xd3\xe7\xd3\xe6\x00\x00\xd7\xd8\xb3\x6c\x00\x00\xd7\xd6\x00\x00\xb3\x6b\xd7\xd9\x00\x00\xd7\xda\xd7\xd7\x00\x00\x00\x00\xdb\xfb\xb6\x60\xdb\xf3\xdb\xf9\x00\x00\x00\x00\xb6\x5b\xb6\x5e\xdb\xf2\xb6\x59\xdb\xf6\xe0\x6c\xb6\x5d\x00\x00\xdb\xf1\x00\x00\xdb\xf7\xdb\xf4\xdb\xfa\xdb\xf0\xdb\xf8\xb6\x5c\xb6\x5f\xdb\xf5\xb6\x5a\x00\x00\xb8\xf2\xe0\x68\xb8\xf1\xe0\x6f\xe0\x6e\xb8\xf8\x00\x00\xb8\xf9\xe0\x70\xb8\xf3\xe0\x6d\xb8\xf7\xe0\x72\xe0\x69\x00\x00\xe0\x6b\xb8\xf4\xe0\x67\xe0\x6a\xe0\x71\xb8\xf5\xe0\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\xf6\x00\x00\xbb\xb1\xe4\x5b\xe4\x61\xe4\x59", /* 8e00 */ "\xe4\x62\x00\x00\xe4\x58\xe4\x5d\xe4\x63\xe4\x60\xe4\x5f\xe4\x5e\x00\x00\xe4\x57\xe4\x5c\x00\x00\x00\x00\xe4\x5a\x00\x00\xbd\xf1\xbd\xee\xe7\xfb\xe8\x41\xe8\x43\xe8\x40\xe7\xf8\xe7\xfa\xe8\x45\xe8\x42\xe7\xfc\xe8\x46\xe7\xf9\xe8\x44\xbd\xef\xbd\xf5\xbd\xf3\xe7\xf3\xbd\xf4\xbd\xf0\xe7\xf4\xe7\xf6\xe7\xf5\xe7\xfd\xe7\xfe\x00\x00\xbd\xf2\x00\x00\xbd\xed\x00\x00\x00\x00\xe7\xf7\x00\x00\xeb\xc6\xbf\xe2\x00\x00\xeb\xbd\xbf\xe3\xbf\xe6\xeb\xc2\x00\x00\xeb\xbf\xbf\xe5\x00\x00\x00\x00\xeb\xc3\xeb\xc4\xeb\xbe\xeb\xc7\xeb\xc0\xeb\xc5\xbf\xe4\x00\x00\xbf\xe1\xeb\xc1\x00\x00\xee\xbf\xc1\xd0\xc1\xce\xc1\xd1\xc1\xcf\xee\xbe\xee\xbb\xee\xba\x00\x00\xee\xbd\x00\x00\x00\x00\xee\xbc\xf1\x45\xc2\xde\xf0\xfb\xf0\xfa\x00\x00\xc2\xd9\xf1\x41\xf1\x40\xf0\xf7\xf1\x43\xf0\xfc\xc2\xdd\xf0\xf9\xf1\x42\xf0\xf8\xc2\xda\xc2\xdc\xf0\xfd\xc2\xdb\xf0\xfe\x00\x00\xf1\x44\xf3\x52\x00\x00\xc3\xde\xf3\x4f\x00\x00\xf3\x53\x00\x00\x00\x00\xc3\xdb\xf3\x51\xc3\xe0\x00\x00\xc3\xdd\x00\x00\xf3\x50\x00\x00\xc3\xdf\xf3\x54\xc3\xda\x00\x00\x00\x00\x00\x00", /* 8e80 */ "\x00\x00\xc4\xbc\xc4\xbe\x00\x00\xf4\xd9\xc4\xbd\xf4\xd7\xc3\xdc\xf4\xd8\xc4\xbb\xc5\x43\xc5\x45\xf6\x56\xc5\x44\xf6\x55\x00\x00\xf7\x61\xc5\xad\xf7\x60\xc5\xae\xf7\x5e\xf7\x5d\xf7\x62\xf7\x63\xf8\x46\x00\x00\xf7\x5f\x00\x00\x00\x00\xf8\xc6\xf8\xc3\xf8\xc4\xf8\xc5\xc6\x5c\x00\x00\xf9\x51\xf9\x50\xf9\x4f\xf9\x70\x00\x00\xf9\xbe\xf9\xab\xc6\x6e\xa8\xad\xb0\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xf6\x00\x00\x00\x00\xeb\xc8\x00\x00\x00\x00\xc2\xdf\x00\x00\xf3\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xac\xa8\xae\xaa\xee\xad\x79\xad\x78\x00\x00\xb0\x63\x00\x00\xd3\xe8\xb0\x61\xd3\xe9\xb0\x62\x00\x00\x00\x00\xd7\xdf\xd7\xdb\x00\x00\x00\x00\xb3\x6d\xd7\xde\xd7\xdd\xd7\xdc\xb3\x6e\xd7\xe0\xd7\xe1\x00\x00\x00\x00\x00\x00\xdc\x43\xdc\x41\xdc\x45\xdc\x46\xdc\x4c\x00\x00\xdc\x48\xdc\x4a\x00\x00\xdc\x42\xdb\xfc\x00\x00\xdc\x49\x00\x00\x00\x00\xdc\x4b\xdc\x44\xdc\x47\xdb\xfd\xb6\x62\xdc\x40\xdb\xfe\xb6\x61\xb6\x63\x00\x00\xb8\xfd\xe0\x75", /* 8f00 */ "\xe0\x77\xe0\x76\xe0\x7b\xb8\xfb\x00\x00\xe0\x78\xe0\x74\xe0\x79\xe0\x7a\xb8\xfc\xb8\xfe\xe0\x7c\x00\x00\xe4\x67\xe4\x66\x00\x00\xe4\x64\xe4\x65\xbb\xb3\xbb\xb5\xbb\xb2\xbb\xb4\xe8\x4d\xe8\x4e\xe8\x49\x00\x00\xe8\x4a\xbd\xf8\xbd\xfd\xbd\xf7\xbd\xfe\xbd\xf9\xe8\x4b\x00\x00\x00\x00\xe8\x4c\xe8\x48\xbe\x40\xbd\xfb\x00\x00\x00\x00\xbd\xfa\xbd\xfc\x00\x00\xe8\x47\x00\x00\xeb\xca\xbf\xe8\x00\x00\x00\x00\xeb\xcc\xbf\xea\xeb\xcf\xeb\xcb\xeb\xc9\xeb\xce\xbf\xe9\xeb\xcd\x00\x00\xbf\xe7\x00\x00\x00\x00\xc1\xd3\xc1\xd6\xee\xc1\x00\x00\xc1\xd4\xee\xc0\xc1\xd2\xc1\xd5\xf1\x46\xf1\x47\xf1\x48\xc2\xe0\x00\x00\xf1\x49\x00\x00\xc2\xe1\xc3\xe2\xf3\x58\xf3\x59\xf3\x57\xf3\x56\xf3\x5a\xc3\xe1\xf4\xdd\xf4\xdb\xf4\xdc\xf4\xde\xf4\xda\xf4\xdf\xf6\x58\x00\x00\xf6\x59\xf6\x57\xc5\x46\xf7\x64\xc5\xaf\xf7\x65\xf8\x48\xf8\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\xaf\xb6\x64\x00\x00\x00\x00\xb9\x40\x00\x00\x00\x00\x00\x00\xbb\xb6\x00\x00\x00\x00\xbf\xec\x00\x00\xbf\xeb\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xe3\xc4\x7c\xc5\x47\xa8\xb0\xb0\x64\xb9\x41\x00\x00\xf3\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xa6\x00\x00\x00\x00\xa8\xb1\x00\x00\xa8\xb4\xa8\xb3\xa8\xb2\x00\x00\x00\x00\xcb\xa5\x00\x00\xcd\xcd\x00\x00\xcd\xcf\xaa\xef\x00\x00\x00\x00\xaa\xf1\xcd\xcc\xcd\xce\xaa\xf0\xcd\xd1\xcd\xd0\xcd\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xb6\xd0\xb4\xad\x7c\xd0\xb3\xad\xa3\xad\x7e\xad\x7b\x00\x00\xad\xa4\x00\x00\xad\x7d\xad\xa2\x00\x00\xad\xa1\xd0\xb5\x00\x00\xad\x7a\x00\x00\x00\x00\x00\x00\xb0\x6a\xd3\xeb\xd3\xf1\xb0\x67\xb0\x6e\x00\x00\xb0\x69\xd3\xee\xd3\xf0\xb0\x6c\xd3\xea\xd3\xed", /* 9000 */ "\xb0\x68\xb0\x65\xd3\xec\xb0\x6b\xd3\xef\xb0\x6d\xb0\x66\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xe3\xd7\xe6\xb3\x70\x00\x00\xb3\x7a\xb3\x76\xd7\xe4\x00\x00\x00\x00\xb3\x7e\xb3\x77\xb3\x7c\xb3\x72\x00\x00\xb3\x6f\xb3\x71\xb3\x7d\xd7\xe5\xb3\x75\xb3\x78\xb3\x74\xb3\x79\xd7\xe7\xb3\x7b\xb3\x73\xd7\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x4d\xb6\x65\xdc\x4f\x00\x00\xb6\x67\xb6\x69\x00\x00\xdc\x4e\xb6\x66\xb6\x6a\x00\x00\xb6\x68\x00\x00\x00\x00\x00\x00\xb9\x47\xe0\xa3\xb9\x4f\xe0\x7e\x00\x00\xb9\x50\xb9\x45\x00\x00\xe0\xa1\x00\x00\x00\x00\xb9\x4a\x00\x00\xe0\xa2\xb9\x43\xb9\x42\x00\x00\xb9\x4d\xb9\x4c\xb9\x4b\xb9\x49\xb9\x4e\xe0\x7d\xb9\x44\xb9\x46\xb9\x48\x00\x00\x00\x00\xbb\xb8\xbb\xbb\x00\x00\xbb\xbf\xbb\xb9\xbb\xbe\xbb\xbc\x00\x00\xbb\xb7\x00\x00\xbb\xbd\xbb\xba\x00\x00\x00\x00\x00\x00\xe8\x52\xbe\x43\xbe\x41\x00\x00\xe8\x53\x00\x00\xbe\x44\xbe\x42\xe8\x51\xe8\x50\x00\x00\xbf\xf0\xe8\x4f\xbf\xee\xbf\xed\xeb\xd0\xbe\x45\xbf\xef\xeb\xd1\xbf\xf2\xeb\xd2\xbf\xf1\xc1\xd8\xee\xc3\xc1\xd7", /* 9080 */ "\xc1\xdc\xc1\xda\xc1\xdb\xc2\xe3\xc1\xd9\xee\xc2\xeb\xd3\xc2\xe2\xc2\xe4\x00\x00\xc3\xe4\xc3\xe5\x00\x00\xf4\xe0\x00\x00\xc5\xde\xc5\xdd\xa8\xb6\x00\x00\x00\x00\xca\x55\xb0\x6f\x00\x00\xca\x52\xca\x53\xca\x51\x00\x00\xca\x54\x00\x00\x00\x00\xcb\xaa\xcb\xa7\xcb\xac\xcb\xa8\xa8\xb7\xa8\xba\x00\x00\xcb\xa9\xa8\xb9\xcb\xab\x00\x00\x00\x00\xa8\xb8\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xd5\xcd\xd7\xaa\xf4\xcd\xd3\xcd\xd6\xcd\xd4\xaa\xf2\xaa\xf5\x00\x00\xaa\xf3\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xb8\xd0\xbc\xd0\xb9\x00\x00\xad\xa7\x00\x00\xad\xa8\x00\x00\xd0\xbb\x00\x00\xd0\xbd\xd0\xbf\x00\x00\xad\xa5\xd0\xbe\x00\x00\x00\x00\xad\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xee\xd0\xba\xd3\xf2\xd3\xfb\xd3\xf9\xd3\xf4\xd3\xf5\xd3\xfa\xd3\xfc\xb0\x71\x00\x00\xd3\xf7\xd3\xf3\xb0\x70\xb0\x72\xd3\xf6\xd3\xfd\xd3\xf8\x00\x00\x00\x00\xb3\xa1\xd7\xf1\xd7\xe9\xd7\xef\xd7\xf0\xb3\xa2\x00\x00\xd7\xe8\xd7\xea\xd0\xb7\xd7\xec\xd7\xed\xd7\xeb\xb6\x6c\x00\x00\x00\x00\x00\x00\xdc\x56\xeb\xd4\xdc\x57\xdc\x54\xb3\xa3\xb6\x6e\xdc\x53", /* 9100 */ "\xdc\x59\xdc\x58\xb6\x6b\xdc\x5c\xdc\x52\xdc\x5b\xdc\x50\xdc\x5a\xdc\x55\xb6\x6d\x00\x00\xe0\xaa\x00\x00\xe0\xa5\xe0\xab\xe0\xa6\xe0\xa4\xe0\xa7\xb9\x51\x00\x00\xe0\xa9\x00\x00\xe0\xa8\xb9\x52\xbb\xc1\xbb\xc0\xe4\x6e\xe4\x71\xe4\x69\xe4\x6d\xbb\xc2\xe4\x6c\xe4\x6a\xe4\x70\xe4\x6b\xe4\x68\xe4\x6f\x00\x00\xe8\x59\xbe\x48\xf1\x4a\xe8\x56\xe8\x57\xe8\x55\xdc\x51\xbe\x47\xe8\x5a\xe8\x54\xbe\x46\xbe\x49\xe8\x58\xeb\xd5\xbf\xf3\xeb\xd6\xeb\xd7\x00\x00\xee\xc4\xc1\xdd\xf1\x4b\xf1\x4c\x00\x00\x00\x00\xf1\x4d\xf3\x5d\xf3\x5c\xf4\xe2\x00\x00\xf4\xe1\xf6\x5b\xf6\x5c\xf6\x5a\xf7\x66\xc5\xb0\xa8\xbb\xad\xaa\xad\xa9\xb0\x75\xb0\x74\xd4\x40\xd4\x41\xd3\xfe\x00\x00\xb0\x73\xd7\xf5\x00\x00\xd7\xf6\xd7\xf2\xb3\xa4\xd7\xf3\x00\x00\xd7\xf4\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x5f\xdc\x61\xdc\x5d\xdc\x60\xb6\x6f\xdc\x5e\xb6\x70\x00\x00\x00\x00\xdd\x73\xb9\x55\xb9\x54\x00\x00\xb9\x53\x00\x00\xe0\xac\xe0\xad\x00\x00\x00\x00\xe4\x73\xe4\x75\xbb\xc6\xbb\xc3\x00\x00\xbb\xc5\xbb\xc4\xe4\x74\xe4\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9180 */ "\xe8\x61\xe8\x5e\xe8\x5f\xbe\x4d\xe8\x60\xe8\x5b\xe8\x5c\xbe\x4a\x00\x00\xbe\x4b\xe8\x5d\xbe\x4c\x00\x00\xeb\xdb\x00\x00\xeb\xdc\xeb\xd9\xeb\xda\xbf\xf4\xeb\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\xc8\xee\xc5\xee\xc7\xc1\xe0\xee\xcb\xc1\xdf\xee\xc9\xee\xcc\xee\xca\xee\xc6\xc1\xde\x00\x00\xf1\x4f\x00\x00\xf1\x50\xf1\x4e\x00\x00\xf1\x52\xc2\xe5\xc2\xe6\xf3\x5f\xc3\xe7\xf1\x51\xf3\x5e\xc3\xe6\xf4\xe5\xf4\xe6\xc4\xbf\xf4\xe4\x00\x00\xf4\xe3\x00\x00\xf6\x5d\xc5\x48\x00\x00\xf8\x49\xf8\xc8\xf8\xc7\x00\x00\xc6\x43\xc6\x5d\xf8\xc9\xf9\x71\x00\x00\xc6\x6f\xa8\xbc\xaa\xf6\x00\x00\xb9\x56\x00\x00\xc4\xc0\xa8\xbd\xad\xab\xb3\xa5\xb6\x71\xc2\xe7\xaa\xf7\x00\x00\xd0\xc1\xd0\xc0\xd4\x42\x00\x00\xb0\x78\xb0\x76\xb0\x7a\xd4\x44\x00\x00\xb0\x79\xb0\x77\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x43\xb3\xa8\xd7\xfc\x00\x00\xb3\xa7\xb3\xa9\xd8\x42\xb3\xab\xd7\xfe\xd8\x40\xd7\xf7\xb3\xaa\xd8\x43\x00\x00\x00\x00\xd7\xf9\x00\x00\xd7\xfa\xd7\xf8\xb3\xa6\x00\x00\xd8\x41\xd7\xfb\xd7\xfd\x00\x00\x00\x00\x00\x00\xdc\x6d\x00\x00\xdc\x6c", /* 9200 */ "\xdc\x6a\xdc\x62\xdc\x71\xdc\x65\xdc\x6f\xdc\x76\xdc\x6e\xb6\x79\x00\x00\xb6\x75\xdc\x63\x00\x00\xdc\x69\xb6\x77\x00\x00\xdc\x68\xb6\x78\xb6\x7a\xdc\x6b\x00\x00\xb6\x72\xb6\x73\xdc\x77\xdc\x75\x00\x00\xdc\x74\xdc\x66\x00\x00\xdc\x72\x00\x00\xb6\x76\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x74\xdc\x73\xdc\x64\xdc\x67\xdc\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xba\xe0\xb7\x00\x00\xe0\xb0\xe0\xc3\xe0\xcc\xe0\xb3\xb9\x61\x00\x00\xe0\xc0\xb9\x57\xb9\x59\xb9\x65\xe0\xb1\x00\x00\x00\x00\xb9\x5a\xb9\x5c\xb9\x66\xb9\x5b\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x64\xe0\xb9\x00\x00\xe0\xae\xb9\x62\xe0\xb8\xb9\x5e\xe0\xca\xb9\x63\xe0\xc8\xe0\xbc\xe0\xc6\xb9\x60\xe0\xaf\xe0\xc9\xe0\xc4\x00\x00\xe0\xcb\xb9\x58\x00\x00\x00\x00\xb9\x67\xb9\x5d\x00\x00\x00\x00\xe0\xb5\x00\x00\xe0\xbd\xe0\xc1\x00\x00\xe0\xc5\xb9\x5f\xe0\xb4\xe0\xb2\xe0\xbe\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xbb\xe0\xba\x00\x00\xe0\xbf\xe0\xc2\x00\x00\xe0\xc7\x00\x00\x00\x00\x00\x00\xe4\x78\x00\x00\xbb\xc7\xe4\xa4\xe4\x7a\xbb\xcc\xbb\xd0\xe4\xad\xe4\xb5\xe4\xa6", /* 9280 */ "\xbb\xc8\x00\x00\xe4\xaa\xe0\xb6\x00\x00\xbb\xc9\xe4\xb1\xe4\xb6\xe4\xae\x00\x00\xe4\xb0\xe4\xb9\xe4\xb2\xe4\x7e\xe4\xa9\x00\x00\x00\x00\xbb\xd1\x00\x00\xbb\xcd\xe4\x7c\xe4\xab\xbb\xcb\xe4\xa5\xbb\xca\xe4\xb3\xe4\xa2\xe4\x79\xbb\xce\xe4\xb8\x00\x00\x00\x00\xe4\x7b\xe4\xaf\xe4\xac\xe4\xa7\xe4\x77\xe4\x76\xe4\xa1\xe4\xb4\xbb\xcf\xe4\xb7\xe4\x7d\xe4\xa3\xbe\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x5a\xbe\x55\xe8\xa4\xe8\xa1\xe8\x67\xbe\x50\x00\x00\xf9\xd7\x00\x00\xbe\x4f\xbe\x56\x00\x00\x00\x00\x00\x00\xe8\x65\xbe\x54\xe8\x71\xe8\x63\xe8\x64\xbe\x4e\xe8\xa3\xbe\x58\xe8\x74\xe8\x79\xe8\x73\xeb\xee\xe8\x6f\xe8\x77\xe8\x75\xe8\x68\xe8\x62\xe8\x7d\xbe\x57\xe8\x7e\x00\x00\xe8\x78\x00\x00\xe8\x6d\xe8\x6b\xe8\x66\x00\x00\x00\x00\x00\x00\xe8\x6e\xe8\x7b\xe8\x6a\xe8\x7a\xe8\xa2\x00\x00\x00\x00\xbe\x53\x00\x00\xe8\x76\xe8\x7c\xe8\x72\xe8\x6c\xbe\x51\x00\x00\x00\x00\x00\x00\xe4\xa8\xe8\x70\xbe\x59\xe8\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xf4\xbf\xf7\xeb\xf3\xeb\xf0\xec\x44\xbf\xfb\x00\x00\xec\x41\xeb\xf8", /* 9300 */ "\xec\x43\xeb\xe9\xeb\xf6\x00\x00\xbf\xfd\x00\x00\xeb\xe1\x00\x00\xeb\xdf\xec\x42\x00\x00\xec\x40\xeb\xfe\xeb\xed\xeb\xec\xeb\xe2\xc0\x40\x00\x00\xeb\xe8\xeb\xf2\xeb\xfd\xc0\x43\xec\x45\x00\x00\xc1\xe8\xc0\x45\xbf\xfe\xeb\xe6\x00\x00\xeb\xef\xeb\xde\xeb\xe0\xbf\xf5\xc0\x42\xbf\xfa\xeb\xe7\xeb\xf7\xeb\xf1\xc0\x41\xeb\xdd\xc1\xe3\xeb\xf9\xeb\xfc\xbf\xfc\x00\x00\xeb\xeb\xc0\x44\xbf\xf9\x00\x00\x00\x00\x00\x00\xbf\xf8\xeb\xf5\xeb\xfb\xbf\xf6\x00\x00\xeb\xe4\xeb\xfa\x00\x00\x00\x00\xeb\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xea\xee\xd2\x00\x00\xee\xd7\xc1\xe5\xc1\xe7\xee\xdd\xc1\xe1\xee\xec\xee\xe3\xee\xd8\xee\xd9\xee\xe2\x00\x00\xc1\xee\xee\xe1\xee\xd1\xee\xe0\xee\xd4\xee\xed\xc1\xed\xc1\xeb\xee\xd5\x00\x00\xee\xe8\x00\x00\xee\xda\xee\xe7\x00\x00\xee\xe9\xee\xd0\xc1\xe6\x00\x00\xee\xea\x00\x00\x00\x00\xee\xde\x00\x00\xc1\xea\xee\xdb\x00\x00\x00\x00\xc1\xec\xee\xe4\x00\x00\x00\x00\x00\x00\xc1\xe4\xee\xd6\xee\xe5\x00\x00\xee\xdf\xeb\xe3\xee\xe6\xee\xd3\x00\x00\xc1\xe9\x00\x00", /* 9380 */ "\xee\xeb\x00\x00\xc1\xe2\xee\xce\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x60\xf1\x59\xc2\xe9\x00\x00\xf1\x54\xf1\x63\xf1\x5b\xee\xdc\x00\x00\xf1\x65\xf1\x55\x00\x00\xc2\xe8\xf1\x5f\xc2\xea\xc2\xf2\xc2\xf0\xf1\x61\xc2\xf1\xf1\x57\x00\x00\xf1\x58\xf1\x5d\xf1\x62\x00\x00\xee\xcd\xc2\xeb\xf1\x6a\xf1\x67\xf1\x6b\xf1\x5e\xf1\x5a\xf1\x68\xf3\x6a\xf1\x5c\x00\x00\xc2\xee\x00\x00\xc2\xed\xee\xcf\xc2\xef\xf1\x64\xf1\x66\xc2\xec\xf1\x69\xf1\x53\x00\x00\xf1\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x73\x00\x00\xf3\x63\xc3\xeb\xf3\x71\x00\x00\x00\x00\xf3\x61\xc3\xec\x00\x00\xf3\x6c\x00\x00\xf3\x68\xc3\xf1\xf3\x72\xf3\x62\xf3\x65\xc3\xe9\xf3\x74\x00\x00\xf3\x6d\xf3\x70\xc3\xef\xc3\xf4\xc3\xf2\xf3\x69\xf3\x64\x00\x00\xc3\xed\xc3\xee\xf3\x60\xc3\xea\x00\x00\xc3\xe8\xc3\xf0\xf3\x6f\xc3\xf3\x00\x00\xf3\x6b\xf3\x75\xc3\xf5\x00\x00\x00\x00\x00\x00\xf3\x67\x00\x00\xf3\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xf3\xf5\x42\xf4\xf5\xf4\xfc\xf3\x66\xf4\xfa\xf4\xe9\xf5\x40\xc4\xc3\xf4\xed\xf4\xfe", /* 9400 */ "\xf4\xf4\x00\x00\x00\x00\xc4\xc2\x00\x00\x00\x00\xf5\x44\xf4\xf6\x00\x00\xf4\xfb\xf4\xfd\xf4\xe7\xf5\x41\xf4\xf2\xf4\xf7\xf4\xeb\xf4\xef\xf5\x43\xf4\xf9\xf4\xe8\xf4\xec\xf4\xee\xf4\xf8\x00\x00\xc4\xc1\xf4\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xf0\xf6\x61\xf6\x66\xc5\x4f\xf6\x68\x00\x00\xc5\x49\x00\x00\xf6\x64\xf6\x6a\xc5\x4e\xc5\x4a\x00\x00\xc5\x4b\xf6\x60\xf6\x67\xc5\x4d\xf6\x65\xc5\x4c\xf6\x5f\xf6\x63\xf6\x62\x00\x00\xf6\x5e\xf6\x69\x00\x00\x00\x00\x00\x00\xc5\xb1\xf7\x6d\xf7\x70\xf7\x6c\xf7\x6e\xf7\x6f\xf7\x69\xf7\x6a\xf7\x67\x00\x00\x00\x00\xf7\x6b\xf7\x68\xc5\xb2\xc5\xb3\x00\x00\x00\x00\xf8\x4b\x00\x00\xf8\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x4c\xf8\x4e\x00\x00\xc5\xe0\x00\x00\xf8\x4a\xc5\xdf\xc5\xe1\x00\x00\x00\x00\x00\x00\xf8\xcb\xf8\xcc\xc6\x44\xf8\xca\x00\x00\xf9\x53\xf9\x52\xf9\x54\xc6\x5f\xf9\x55\xc6\x5e\xf9\x56\xf9\x72\xf9\x75\xf9\x74\xc6\x68\xf9\x73\x00\x00\x00\x00\x00\x00\xc6\x72\xc6\x70\xc6\x71\xc6\x77", /* 9480 */ "\xf9\xc0\xf9\xc1\xf9\xbf\xf9\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xf8\x00\x00\x00\x00\xd8\x44\xdc\x78\xe8\xa5\xf3\x76\x00\x00\x00\x00", /* 9580 */ "\xaa\xf9\x00\x00\xad\xac\xb0\x7b\x00\x00\x00\x00\xd8\x45\x00\x00\xd8\x46\xb3\xac\x00\x00\xb6\x7d\xdc\x7a\xdc\x79\xb6\xa3\xb6\x7c\xdc\x7b\xb6\x7e\xb6\xa2\xb6\xa1\xb6\x7b\x00\x00\x00\x00\x00\x00\xb9\x68\x00\x00\x00\x00\xe0\xd0\xe0\xce\x00\x00\xe0\xcf\xe0\xcd\x00\x00\xbb\xd2\x00\x00\xbb\xd5\xbb\xd7\xbb\xd6\x00\x00\x00\x00\xbb\xd3\xbb\xd4\x00\x00\xe8\xa7\xe8\xa6\xbe\x5b\xe8\xa8\x00\x00\xe8\xa9\xbe\x5c\x00\x00\x00\x00\x00\x00\xec\x4d\xec\x4b\xee\xf3\x00\x00\xec\x49\xec\x4a\xc0\x46\xec\x46\xec\x4e\xec\x48\xec\x4c\xee\xef\x00\x00\x00\x00\xee\xf1\x00\x00\xee\xf2\xc1\xf3\xee\xee\xc1\xf2\xee\xf0\xc1\xef\xc1\xf0\xc1\xf1\xec\x47\x00\x00\x00\x00\xc2\xf5\xf1\x6e\xf1\x6c\xf1\x6d\xc2\xf3\xc2\xf6\xc2\xf4\x00\x00\x00\x00\x00\x00\xf3\x77\xf3\x78\xc3\xf6\x00\x00\xf5\x45\xf5\x47\xf5\x46\xc4\xc4\xc5\x50\xf6\x6d\xf6\x6c\xf6\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xfa\x00\x00\xc9\xaa\x00\x00\xca\x58\xa6\xe9\xca\x56\xca\x59\xca\x57\x00\x00\x00\x00\x00\x00\xcb\xae\x00\x00\xa8\xc1\x00\x00\xa8\xc2\xcb\xb0\xa8\xbf\xcb\xaf\xcb\xad\xa8\xc0\xa8\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\xd8\xcd\xdb\xaa\xfd\xcd\xda\xcd\xd9\x00\x00\xaa\xfc\xaa\xfb\x00\x00\xab\x40\xcd\xdc\xaa\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xc6\xad\xae\xad\xaf\xad\xb0\xd0\xc7\xd0\xc3\xad\xad\xd0\xc4\x00\x00\xd0\xc5\xd0\xc2\x00\x00\x00\x00\x00\x00\xb0\xa4\x00\x00\x00\x00\xb0\xa1\xd4\x45\xb0\xa2\xb0\xa5\xd4\x46\x00\x00\xb0\x7e\xb0\x7c\xb0\x7d\xb0\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xad\xd8\x49\xb3\xb5\xd8\x48\x00\x00\xd8\x4b\xb3\xb1\xd8\x4a\xb6\xab\xb3\xaf\xb3\xb2\xb3\xae\xb3\xb3\xb3\xb4\xb3\xb0\x00\x00\x00\x00\x00\x00\xd8\x47\xb6\xa7\xdc\x7d\x00\x00", /* 9680 */ "\xdc\xa3\x00\x00\x00\x00\xdc\xa2\xb6\xac\xb6\xa8\xb6\xa9\xdc\x7c\xdc\x7e\xdc\xa1\xb6\xa4\xb6\xa6\x00\x00\xb6\xaa\xb6\xa5\x00\x00\x00\x00\xe0\xd3\xe0\xd1\xe0\xd2\xb9\x6a\xb9\x6b\x00\x00\xe0\xd4\xb9\x69\xbb\xd8\x00\x00\xbb\xda\xbb\xd9\x00\x00\xe4\xbb\x00\x00\x00\x00\xe4\xbc\xe8\xab\x00\x00\xe8\xaa\x00\x00\x00\x00\xc0\x47\xc0\x48\xec\x4f\xc0\x49\x00\x00\xee\xf6\x00\x00\xee\xf4\x00\x00\xee\xf5\xc1\xf4\x00\x00\xf1\x6f\xc3\xf7\x00\x00\x00\x00\x00\x00\xc1\xf5\xab\x41\x00\x00\xb0\xa6\xd4\x47\x00\x00\x00\x00\xd8\x4c\xb3\xb6\xb6\xad\xdc\xa4\xdc\xa6\xb6\xaf\xb6\xae\xb6\xb0\xb6\xb1\xdc\xa5\xb9\x6e\xb9\x6f\xb9\x6d\xbb\xdb\xb9\x6c\xe0\xd5\x00\x00\x00\x00\x00\x00\xbb\xdc\xe8\xac\xec\x50\xc0\x4a\xc1\xf6\xf1\x70\xf1\x74\xc2\xf9\xf1\x71\xc2\xfa\xc2\xf8\xf1\x75\xc2\xfb\xf1\x73\x00\x00\xf3\x79\xc2\xf7\xc3\xf8\x00\x00\xf8\xcd\x00\x00\x00\x00\xab\x42\xb3\xb8\xb3\xb7\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xb2\xdc\xa8\xdc\xa7\xb6\xb3\x00\x00\x00\x00\xe0\xd9\xb9\x73\xb9\x70\xe0\xd8\xb9\x72\xe0\xd6\xb9\x71\x00\x00\xe0\xd7\x00\x00\xe4\xbd", /* 9700 */ "\xbb\xdd\x00\x00\xe8\xaf\x00\x00\xbe\x5d\xe8\xad\xbe\x5e\xbe\x5f\xe8\xae\xbe\x60\x00\x00\xec\x51\x00\x00\xc0\x4e\xc0\x4b\xc0\x50\xec\x53\xc0\x4c\xec\x52\xc0\x4f\x00\x00\x00\x00\xc0\x4d\x00\x00\xee\xf9\xee\xfb\x00\x00\x00\x00\xc1\xf7\xee\xfa\xc1\xf8\xee\xf8\xee\xf7\x00\x00\xf1\x77\xf1\x76\xc2\xfc\xf1\x78\xf3\x7e\xc3\xfa\xf3\x7d\xf3\x7a\xc3\xf9\xf3\x7b\xf3\x7c\x00\x00\xf5\x48\xf5\x49\xc4\xc5\x00\x00\xc5\x53\x00\x00\x00\x00\xf6\x6e\x00\x00\x00\x00\xc5\x51\xc5\x52\xf6\x6f\x00\x00\x00\x00\xc5\xb4\xc5\xb5\xf7\x71\x00\x00\x00\x00\xc6\x45\xf8\xcf\xc6\x47\x00\x00\xf8\xce\xf8\xd0\xc6\x46\xf9\x57\x00\x00\xf9\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x43\x00\x00\x00\x00\x00\x00\xb9\x74\x00\x00\xe4\xbe\x00\x00\xe8\xb0\xc0\x51\xc0\x52\x00\x00\xab\x44\x00\x00\xbe\x61\xc3\xfb\xad\xb1\x00\x00\x00\x00\x00\x00\xc0\x53\x00\x00\xc5\xe2\xad\xb2\xd8\x4d\x00\x00\xdc\xa9\x00\x00\xdc\xab\x00\x00\xdc\xaa\x00\x00\xe0\xdd\xe0\xda\xb9\x75\x00\x00\xb9\x76\xe0\xdb\xe0\xdc\x00\x00\xe4\xc0\xe4\xc5\xbb\xde\xe4\xbf\xe4\xc1\xe4\xc8", /* 9780 */ "\xe4\xc3\xe4\xc7\xe4\xc4\xe4\xc2\xe4\xc6\xbb\xdf\x00\x00\x00\x00\xe8\xb3\x00\x00\xe8\xb1\xbe\x63\x00\x00\xbe\x62\xe8\xb2\xbe\x64\x00\x00\x00\x00\x00\x00\x00\x00\xec\x56\x00\x00\x00\x00\xec\x55\xc0\x54\xec\x54\xee\xfc\x00\x00\xee\xfe\xef\x41\xef\x40\x00\x00\xc1\xf9\xee\xfd\xf1\xa1\xc2\xfd\xf1\x7d\xf1\xa2\xc2\xfe\x00\x00\xf1\x7b\x00\x00\xf1\x7e\xf1\x7c\xf1\x79\xc3\x40\xf1\x7a\x00\x00\x00\x00\x00\x00\x00\x00\xf3\xa1\x00\x00\x00\x00\xf3\xa3\xf3\xa2\x00\x00\xf5\x4a\x00\x00\xf5\x4b\x00\x00\x00\x00\x00\x00\xf6\x70\x00\x00\xc5\xb7\x00\x00\xc5\xb6\xf8\x4f\xf8\x50\xc6\x48\xf8\xd1\x00\x00\xc6\x69\x00\x00\xad\xb3\xb6\xb4\xe4\xca\xe4\xc9\xe8\xb5\xe8\xb4\x00\x00\x00\x00\xc1\xfa\xef\x43\xef\x42\xf1\xa5\xf1\xa3\xf1\xa6\xf1\xa4\x00\x00\x00\x00\xc3\xfc\xf3\xa4\xf3\xa5\xf3\xa6\x00\x00\xf6\x71\x00\x00\xf7\x72\x00\x00\xf8\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xb4\x00\x00\x00\x00\xec\x57\xef\x44\x00\x00\xad\xb5\x00\x00\x00\x00\xbb\xe0\x00\x00\xec\x58\xc3\x41\xf1\xa7\xc3\xfd\x00\x00\xf5\x4c\xf5\x4d\xc5\x54", /* 9800 */ "\xf8\x51\xad\xb6\xb3\xbb\xb3\xbc\xd8\x4e\xb6\xb5\xb6\xb6\xdc\xac\xb6\xb7\x00\x00\xb9\x7a\x00\x00\xb9\x7c\xe0\xdf\xe0\xe0\xe0\xde\xb9\x77\xb9\x78\xb9\x7b\xb9\x79\x00\x00\x00\x00\xe4\xcb\xbb\xe1\xbb\xe2\x00\x00\x00\x00\xe8\xbc\xbe\x67\xe8\xb7\xe8\xb6\x00\x00\xe8\xbb\xbe\x65\x00\x00\x00\x00\xc0\x5b\x00\x00\xe8\xb8\xe8\xbd\xe8\xba\xe8\xb9\x00\x00\xbe\x66\x00\x00\xc0\x59\x00\x00\xec\x5a\xc0\x55\x00\x00\xec\x5b\x00\x00\x00\x00\xec\x59\x00\x00\xc0\x58\xc0\x56\xc0\x5a\x00\x00\xc0\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x45\x00\x00\xef\x4a\xef\x46\xef\x49\xc1\xfb\x00\x00\xed\xd4\xef\x48\xef\x47\x00\x00\xc3\x44\xc3\x42\xc3\x45\xc3\x43\xf1\xa8\xf1\xa9\xf1\xaa\xc3\x46\x00\x00\x00\x00\x00\x00\xf3\xaa\xc4\x40\xf3\xa8\x00\x00\xc4\x41\xf3\xa7\xf3\xa9\xc3\xfe\xf5\x51\xf5\x4e\x00\x00\xf5\x4f\xf5\x50\xf6\x72\xc5\x56\x00\x00\xc5\x55\x00\x00\xf7\x74\xf7\x73\xc5\xb8\x00\x00\x00\x00\x00\x00\xc5\xe3\xc6\x49\xc6\x60\xf9\x58\xf9\xae\xf9\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xb7\xdc\xad\x00\x00\x00\x00\xe0\xe1\xe4\xcc\xe4\xcd\xbb\xe3\x00\x00\xbb\xe4\xe8\xbe\xbe\x68\x00\x00\x00\x00\xc1\xfc\x00\x00\xf1\xab\x00\x00\xc3\x47\xf3\xad\xc4\x42\xf3\xac\xf3\xae\xf3\xab\xf6\x75\xf5\x52\xf5\x53\x00\x00\xc4\xc6\x00\x00\xf6\x74\x00\x00\x00\x00\xf6\x73\x00\x00\xf7\x75\xf9\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xb8\x00\x00\x00\x00\x00\x00\xad\xb9\x00\x00\x00\x00\xb0\xa7\xd4\x48\x00\x00\xd8\x4f\x00\x00\xb6\xb8\x00\x00\xb6\xbb\xb6\xb9\xdc\xae\x00\x00\xb6\xbd\x00\x00\xb6\xba\x00\x00\x00\x00\xb6\xbc\x00\x00\xb9\x7e\x00\x00\xe0\xe2\x00\x00\x00\x00\xe0\xe3\xe8\xc0\x00\x00\xb9\x7d\xb9\xa1\xb9\xa2\x00\x00", /* 9900 */ "\xe4\xcf\x00\x00\xe4\xce\xbb\xe5\x00\x00\xbb\xe6\x00\x00\xe4\xd0\xe8\xbf\xbb\xe8\xbe\x69\x00\x00\xbb\xe7\x00\x00\x00\x00\x00\x00\xc0\x5c\xe8\xc1\xbe\x6b\xbe\x6a\xe8\xc2\xe8\xc5\xe8\xc3\xe8\xc4\xbe\x6c\x00\x00\xc0\x61\xc0\x5f\x00\x00\x00\x00\xc0\x5e\xec\x5d\x00\x00\xc0\x60\x00\x00\x00\x00\xec\x5c\xef\x4b\x00\x00\xec\x5e\xc0\x5d\xec\x5f\xef\x4e\xef\x4c\xef\x4d\xef\x52\xc3\x4b\xef\x51\xef\x54\xef\x53\xef\x50\xef\x4f\x00\x00\xc1\xfd\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xae\x00\x00\xf1\xad\xc3\x4a\xc3\x48\xc3\x49\x00\x00\xf1\xac\x00\x00\xf3\xb1\x00\x00\xc4\x43\x00\x00\xf3\xb0\xf3\xaf\xc4\x44\x00\x00\xf5\x58\xf5\x57\x00\x00\xf5\x55\x00\x00\xf5\x54\xc4\xc8\xc4\xc7\xf5\x59\xf7\x76\xc5\xb9\xf6\x77\xc5\x57\xf6\x76\xf5\x56\x00\x00\xf7\x77\xc5\xe4\x00\x00\xc6\x61\xf9\x59\x00\x00\xf9\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xba\xd8\x50\xef\x55\xad\xbb\x00\x00\x00\x00\xe4\xd2\xe4\xd1\xec\x60\x00\x00\x00\x00\xef\x57\x00\x00\xef\x56\x00\x00\xc3\x4c\xf3\xb2\xf3\xb3\xc4\xc9\x00\x00\x00\x00\xf9\xb2\xb0\xa8\xb6\xbf\xb6\xbe\xe0\xe4\xe0\xe6\xb9\xa4\xe0\xe5\xb9\xa3\xb9\xa5\xe0\xe7\x00\x00\x00\x00\x00\x00\xe4\xd4\xe4\xd6\xe4\xd5\x00\x00\xe4\xd8\x00\x00\x00\x00\x00\x00\xbb\xe9\xe4\xd7\xe4\xd3\x00\x00\x00\x00\x00\x00\xe4\xd9\x00\x00\xe8\xcc\x00\x00\xe8\xcf\xe8\xd1\xe8\xc7\xe8\xcb\xe8\xc8\xbe\x6e\xbe\x71\xbe\x73\xe8\xc9\xe8\xca\xbe\x72\xe8\xcd\xe8\xd0\xe8\xce\xbe\x74\x00\x00\xbe\x70\xe8\xc6\xbe\x6d\x00\x00\xbe\x6f\x00\x00\x00\x00\xc0\x63\xec\x66\xec\x64\xec\x63\x00\x00\xec\x69\x00\x00\xec\x68\xec\x67\x00\x00\xec\x62\xc0\x62\xec\x61\x00\x00\xec\x65\xc0\x64\x00\x00\x00\x00\xef\x5a\x00\x00\xef\x5e\xef\x5b\xef\x5d\xef\x5c\xef\x59\xef\x5f\xef\x62\xef\x60\xef\x61\xc2\x40", /* 9a00 */ "\x00\x00\xc1\xfe\xef\x58\xef\x63\xf1\xb3\xf1\xb6\xf1\xb8\xf1\xb7\x00\x00\xf1\xb1\xf1\xb5\xf1\xb0\x00\x00\xf1\xb2\xc3\x4d\xf1\xaf\x00\x00\xf1\xb4\x00\x00\x00\x00\xf3\xc0\xf3\xb5\xc4\x45\x00\x00\x00\x00\xc4\x46\xf3\xb4\xf3\xb9\xf3\xbf\xf3\xb7\xf3\xbe\x00\x00\xf3\xbb\x00\x00\xf3\xba\xf3\xbd\xf3\xb8\xf3\xb6\x00\x00\xf3\xbc\x00\x00\xf5\x60\xf5\x5e\xc4\xca\xf5\x5d\xf5\x63\xf5\x61\x00\x00\xc4\xcb\xf5\x5c\xf5\x5a\x00\x00\xf5\x5b\xc4\xcd\xf5\x5f\xc4\xcc\xf5\x62\xf6\x78\xf6\x7e\x00\x00\x00\x00\xf6\x79\xc5\x5b\xf6\xa1\xc5\x5a\xf6\x7d\xf6\x7c\xc5\x59\xf6\x7b\xc5\x58\xf6\x7a\x00\x00\xf7\x7d\xf7\xa1\xf7\x7e\x00\x00\xf7\x7b\xc5\xbb\xf7\x78\xf7\x7c\xf7\xa3\x00\x00\xf7\xa2\xf7\x79\xf7\x7a\xc5\xba\xf8\x52\xc5\xe7\x00\x00\xf8\x53\xc5\xe5\xc5\xe6\x00\x00\x00\x00\xf8\xd3\xc6\x4a\xf9\x76\x00\x00\xc6\x6a\x00\x00\xf9\xb3\xc6\x6b\xf9\xb4\xf9\xb5\xf9\xc3\xf9\xc2\xc6\x7a\xf9\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xa9\x00\x00\x00\x00\xe0\xe9\x00\x00\xe0\xe8\x00\x00\xbb\xea\xbb\xeb\xe4\xda\x00\x00\xe8\xd2\xec\x6c\x00\x00\x00\x00\xbe\x75\xc0\x65\xec\x6a\x00\x00\xec\x6d\xc0\x66\x00\x00\xef\x64\xec\x6b\xf1\xb9\xc3\x4e\xf3\xc1\x00\x00\x00\x00\x00\x00\xf5\x66\xf5\x64\x00\x00\x00\x00\xf5\x65\x00\x00\x00\x00\xf6\xa2\x00\x00\xc5\x5c\xf7\xa4\xc5\xea\xc5\xbc\xc5\xe8\xc5\xe9\xf8\xd4\xc6\x62\x00\x00\xb0\xaa\x00\x00\x00\x00\x00\x00\xf1\xba\x00\x00\x00\x00\xd4\x49\x00\x00\xb9\xa6\x00\x00\xe4\xdb\x00\x00\x00\x00\xbb\xec\xe4\xdc\x00\x00\x00\x00\x00\x00\xe8\xd4\xe8\xd3\xc0\x68\xbe\x76\xbe\x77\x00\x00\xe8\xd7\xe8\xd6\xe8\xd5\x00\x00\x00\x00\xec\x6e\xec\x71\x00\x00\xec\x70\xec\x6f\xc0\x67\xef\x68\xef\x66\xef\x65\x00\x00", /* 9b00 */ "\x00\x00\xef\x67\x00\x00\xc3\x4f\xf1\xbc\xf1\xbd\xc3\x50\x00\x00\xf1\xbb\x00\x00\xf3\xc3\xf3\xc2\xf3\xc5\xc4\x47\xf3\xc4\x00\x00\xf5\x67\xf5\x69\xf5\x68\x00\x00\x00\x00\xf6\xa3\xf6\xa6\xf6\xa4\xf6\xa5\xf7\xa5\xc5\xbd\x00\x00\x00\x00\x00\x00\xf8\x54\xf8\x55\xf8\x56\x00\x00\xc6\x4b\xc6\x63\xf9\xb6\xb0\xab\x00\x00\xbe\x78\xc0\x69\xf1\xbe\x00\x00\xf7\xa6\x00\x00\x00\x00\xf9\xc4\xd4\x4a\x00\x00\xc6\x7b\xb0\xac\xec\x72\x00\x00\xf1\xbf\x00\x00\xf3\xc6\x00\x00\x00\x00\xf6\xa7\xf7\xa7\xb0\xad\x00\x00\xe4\xdd\xe4\xde\x00\x00\xbb\xed\xbb\xee\xe8\xd9\xbe\x7a\xbe\x79\xe8\xd8\x00\x00\xef\x69\x00\x00\xf1\xc0\xf1\xc2\xf1\xc1\xc3\x53\xc3\x52\xc3\x51\x00\x00\xc5\x5e\xf6\xa8\x00\x00\xc5\x5d\xf7\xa9\xf7\xa8\x00\x00\xc6\x4c\xf8\xd5\xb3\xbd\xe0\xea\x00\x00\x00\x00\x00\x00\xe4\xe1\xe4\xdf\xe4\xe0\x00\x00\x00\x00\xe8\xe2\x00\x00\xe8\xdd\xe8\xda\xe8\xe1\x00\x00\x00\x00\x00\x00\xe8\xe3\x00\x00\x00\x00\xbe\x7c\xe8\xe0\xe8\xdc\x00\x00\x00\x00\xe8\xdb\xe8\xdf\xe8\xde\xbe\x7b\x00\x00\x00\x00\xec\x7d\xec\x78\xec\x76\xec\xa1\xec\x77\x00\x00", /* 9b80 */ "\xec\x73\x00\x00\xec\x79\x00\x00\x00\x00\xec\x74\xef\x72\xec\x75\xec\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x7c\xc0\x6a\xec\x7b\xec\x7a\x00\x00\xec\x7e\x00\x00\x00\x00\x00\x00\x00\x00\xef\x6a\xef\x6d\x00\x00\x00\x00\xef\x6c\x00\x00\xef\x74\xef\x6f\xef\x73\x00\x00\xef\x71\xef\x70\xef\x6e\x00\x00\xef\x6b\x00\x00\xc2\x43\xc2\x42\x00\x00\xc2\x44\xc2\x41\xef\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xc8\xf1\xcb\x00\x00\xf1\xc9\xf1\xcd\x00\x00\x00\x00\x00\x00\xf1\xce\x00\x00\xf1\xc6\xc3\x58\xf1\xc7\x00\x00\xf1\xc5\xf1\xcc\x00\x00\xf1\xc4\xf1\xc3\xc3\x57\xc3\x55\xc3\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xca\xf3\xcf\xf3\xd5\xc4\x4a\xf3\xd0\x00\x00\xf3\xd3\xf3\xd7\xc4\x4b\xf3\xd2\x00\x00\xf3\xca\x00\x00\xf3\xc9\xf3\xd6\xf3\xcd\x00\x00\xf3\xcb\xf3\xd4\xf3\xcc\xc4\x49\xc4\x48\x00\x00\xf3\xc7\xf3\xc8\xf3\xd1\x00\x00\x00\x00\x00\x00\xf3\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x6c\xf5\x6f\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x56\x00\x00\x00\x00", /* 9c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x6d\xf5\x73\xf5\x71\xf5\x6b\xf5\x76\x00\x00\xf5\x6a\x00\x00\xc4\xcf\xf5\x72\x00\x00\x00\x00\x00\x00\xf5\x6e\xc4\xce\xf5\x75\x00\x00\x00\x00\xf5\x74\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xab\xf6\xaa\x00\x00\x00\x00\x00\x00\xf6\xb1\x00\x00\xf6\xad\xf6\xb0\xc5\x60\x00\x00\x00\x00\xf6\xae\xf6\xaf\x00\x00\xf6\xa9\xf6\xac\xc5\x5f\x00\x00\x00\x00\x00\x00\xc5\xbf\xf7\xb4\xf7\xaf\xf7\xb3\x00\x00\xf7\xb6\xf7\xb2\x00\x00\xf7\xae\x00\x00\xc5\xc1\xf7\xb1\xf7\xb5\xc5\xc0\xf7\xac\xf5\x70\xf7\xb0\x00\x00\x00\x00\xf7\xad\x00\x00\xf7\xaa\x00\x00\xf7\xab\xc5\xbe\xf8\x5a\xf8\x5c\xf8\x5f\xf8\x5b\xf8\x60\x00\x00\xf8\x59\x00\x00\xf8\x57\x00\x00\xc5\xeb\xf8\x5d\xc5\xed\xc5\xec\xf8\x58\xf8\x5e\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xda\xc6\x4d\xf8\xdb\x00\x00\xf8\xd9\xf8\xd6\x00\x00\x00\x00\xf8\xd8\xf8\xd7\xf9\x5a\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x5c\xf9\x5b\x00\x00\x00\x00\xf9\x79\x00\x00\xf9\x78\xf9\x77\xf9\x7a\x00\x00\xc6\x73\xc6\x74\xf9\xca\xf9\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xbe\xdc\xaf\xe0\xed\x00\x00\xb9\xa7\xe0\xeb\x00\x00\x00\x00\xe0\xec\x00\x00\x00\x00\x00\x00\xe4\xe2\xe4\xe3\xbb\xf1\xbb\xef\xe4\xe4\xbb\xf0\xe8\xe8\x00\x00\xe8\xeb\xe8\xe5\xe8\xec\xe8\xe4\xe8\xe6\x00\x00\xe8\xe7", /* 9d00 */ "\xe8\xea\x00\x00\x00\x00\xbe\xa1\xe8\xef\xe8\xee\xbe\x7d\xe8\xe9\xe8\xed\xbe\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\xac\x00\x00\xc0\x6f\x00\x00\xec\xa7\xc0\x6b\x00\x00\xec\xa4\xec\xaa\xec\xad\x00\x00\xc0\x70\x00\x00\xec\xa9\xec\xa6\xec\xae\xec\xa5\x00\x00\xec\xab\xc0\x6c\x00\x00\xec\xa3\xc0\x6d\x00\x00\xc0\x6e\xec\xa8\x00\x00\x00\x00\x00\x00\xef\xa9\xef\x7a\xef\x7b\xef\x7e\xef\x7c\x00\x00\xef\x76\x00\x00\x00\x00\xef\x79\xef\xa5\xef\x7d\x00\x00\x00\x00\xc2\x45\x00\x00\xef\xa7\xef\xa4\xc2\x46\xef\xa6\xef\x77\xef\xa2\xef\xa3\x00\x00\xef\xa1\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xd2\xf1\xd4\xf1\xd7\x00\x00\x00\x00\xf1\xd1\x00\x00\xc3\x59\xf1\xd9\xf1\xd0\xf1\xda\x00\x00\xf1\xd6\xf1\xd8\xf1\xdc\xf1\xd5\xf1\xdd\xf1\xd3\xf1\xcf\xc3\x5a\x00\x00\xf1\xdb\xc3\x5b\xc4\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x78\xf3\xf1\xf3\xe8\xc4\x4f\xf3\xe4\xc4\x50\x00\x00\x00\x00\xf3\xed\xf3\xe7\xf3\xdd\xc4\x4e\xf3\xea\xf3\xe5\xf3\xe6\x00\x00\xf3\xd8\xf3\xdf\xf3\xee\x00\x00\xf3\xeb\x00\x00\xf3\xe3\x00\x00\xf3\xef", /* 9d80 */ "\xf3\xde\xf3\xd9\xf3\xec\x00\x00\xf3\xdb\xf3\xe9\xf3\xe0\xf3\xf0\xf3\xdc\xc4\x4c\xf3\xda\xf3\xe1\xf3\xe2\x00\x00\x00\x00\x00\x00\xf5\x7d\x00\x00\xf5\x7b\x00\x00\xf5\xa2\x00\x00\xf5\xae\xf5\xa5\xf5\x7c\xf5\x78\xf5\xa7\xf5\x7e\xf5\xa3\xf5\x7a\xf5\xaa\xf5\x77\xf5\xa1\xf5\xa6\xf5\xa8\xf5\xab\xf5\x79\x00\x00\xf5\xaf\xf5\xb0\xf5\xa9\xf5\xad\xf5\xa4\x00\x00\xf6\xc1\xf6\xc4\x00\x00\xc5\x61\x00\x00\xf6\xc3\xf6\xc8\xf6\xc6\xc5\x62\xf6\xbd\xf6\xb3\xf6\xb2\xc5\x64\xf6\xbf\xf6\xc0\xf6\xbc\xf6\xb4\x00\x00\xf6\xb9\xf5\xac\x00\x00\xf6\xb5\xc5\x63\xf6\xbb\x00\x00\xf6\xba\x00\x00\xf6\xb6\xf6\xc2\x00\x00\xf6\xb7\xf7\xbb\xf6\xc5\xf6\xc7\xf6\xbe\xf6\xb8\xf7\xbc\xf7\xbe\xf7\xb8\xc5\xc2\x00\x00\xf7\xc5\xf7\xc3\xc5\xc3\xf7\xc2\xf7\xc1\xf7\xba\xf7\xb7\xf7\xbd\xf7\xc6\xf7\xb9\xf7\xbf\x00\x00\xf8\x69\xf8\x6e\xf8\x64\xf8\x67\xc5\xee\xf8\x6b\x00\x00\xf8\x72\xf7\xc0\x00\x00\xf8\x65\xf8\x6f\xf8\x73\xf8\x6a\xf8\x63\xf8\x6d\x00\x00\xf8\x6c\xf8\x71\xf8\x70\xf7\xc4\xf8\x68\xf8\x62\xf8\x66\xc6\x4e\xc6\x4f\xf8\x61\x00\x00\xf8\xe6\xf8\xdd\xf8\xe5", /* 9e00 */ "\xf8\xe2\xf8\xe3\xf8\xdc\xf8\xdf\xf8\xe7\xf8\xe1\xf8\xe0\xf8\xde\x00\x00\xf8\xe4\x00\x00\xf9\x5d\x00\x00\xf9\x5e\x00\x00\xf9\x60\xf9\x5f\xf9\x62\xf9\x61\xf9\x7c\xf9\x7b\xf9\xb7\x00\x00\xf9\xb8\x00\x00\xf9\xc5\xc6\x78\xc6\x7c\x00\x00\xf9\xcf\xc6\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xbf\x00\x00\x00\x00\x00\x00\xc4\xd0\xf6\xc9\x00\x00\xc6\x50\xc6\x51\x00\x00\xb3\xc0", /* 9e80 */ "\xe0\xee\x00\x00\xb9\xa8\xe8\xf0\x00\x00\x00\x00\xec\xb0\xec\xb1\xec\xaf\xef\xab\xef\xaa\xc2\x47\xf1\xdf\xef\xac\xf1\xde\x00\x00\x00\x00\xf3\xf3\xc4\x51\xc4\x53\xf3\xf2\x00\x00\x00\x00\xc4\x52\x00\x00\xf5\xb1\xf5\xb3\xf5\xb2\xf6\xca\xc5\x65\x00\x00\xc5\xef\xf8\xe8\xf9\x63\x00\x00\x00\x00\xf9\xd2\xb3\xc1\x00\x00\xe4\xe5\x00\x00\xbe\xa2\x00\x00\x00\x00\x00\x00\xec\xb3\xec\xb2\x00\x00\xef\xad\x00\x00\x00\x00\x00\x00\xc4\x54\xc4\xd1\xf7\xc7\xf9\xcb\x00\x00\x00\x00\x00\x00\xb3\xc2\xbb\xf2\x00\x00\xbe\xa3\x00\x00\xf3\xf4\x00\x00\xf8\x74\xb6\xc0\x00\x00\x00\x00\x00\x00\x00\x00\xef\xae\x00\x00\x00\x00\x00\x00\xc6\x64\xb6\xc1\xbe\xa4\xc2\x48\xf8\x75\xb6\xc2\x00\x00\xe8\xf1\xc0\x72\xec\xb4\xec\xb5\x00\x00\xc0\x71\x00\x00\xef\xaf\xc2\x4c\xc2\x4a\xc2\x4b\xc2\x49\xf1\xe0\xc3\x5c\x00\x00\x00\x00\x00\x00\xf5\xb5\xf5\xb4\xf5\xb7\xf5\xb6\xc4\xd2\x00\x00\x00\x00\xf6\xcb\x00\x00\xf6\xcd\xf6\xcc\xc5\x66\xf7\xc8\x00\x00\xf8\x76\xf8\x77\xc5\xf0\xf9\x64\xf9\x7d\xc6\x75\x00\x00\xdc\xb0\xec\xb6\xef\xb0\xf3\xf5\xe0\xef\x00\x00\xef\xb1", /* 9f00 */ "\xf1\xe2\xf1\xe1\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x78\xc6\x52\x00\x00\xf9\x65\xf9\x7e\x00\x00\x00\x00\x00\x00\xb9\xa9\xe8\xf2\xe8\xf3\x00\x00\xec\xb7\xb9\xaa\x00\x00\xc3\x5d\xf1\xe3\x00\x00\xf6\xcf\xc5\x67\xf6\xd0\xf6\xce\xf8\x79\x00\x00\xf8\xe9\x00\x00\xb9\xab\x00\x00\xef\xb4\xef\xb3\xef\xb2\xf1\xe4\x00\x00\x00\x00\xf1\xe8\xf1\xe7\xf1\xe6\xf1\xe5\xc3\x5e\xf3\xf6\xf5\xb9\xc4\xd3\xf5\xb8\xf6\xd1\xf7\xcb\xf7\xca\xc5\xc4\xf7\xc9\xf8\x7c\xf8\x7b\xf8\x7a\x00\x00\x00\x00\xbb\xf3\x00\x00\xec\xb8\xc2\x4d\x00\x00\xf3\xf7\xf3\xf8\xf7\xcc\xf8\x7d\x00\x00\x00\x00\xf8\xea\xf9\x66\xf9\xb9\xf9\xd4\xbb\xf4\xc2\x4e\xf1\xe9\xf3\xf9\xf6\xd2\xf8\x7e\x00\x00\x00\x00\xbe\xa6\x00\x00\xef\xb5\xf1\xea\xf3\xfa\xf3\xfb\xf3\xfc\xf5\xbe\x00\x00\xf5\xba\xc5\x68\xf5\xbd\xf5\xbc\xc4\xd4\xf5\xbb\xc4\xd6\x00\x00\xc4\xd5\xf6\xd4\xf6\xd3\xc5\x69\xc5\x6a\x00\x00\x00\x00\xc5\xc6\xf7\xcd\xc5\xc5\x00\x00\xf8\xa3\xf8\xa4\xf8\xa2\xf8\xa1\xc6\x54\x00\x00\xf8\xeb\xf8\xec\xf8\xed\xc6\x53\xf9\x67\xf9\x6a\xf9\x69\xf9\x68\x00\x00\x00\x00\xf9\xd3\x00\x00", /* 9f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x73\x00\x00\x00\x00\xc3\x65\xf5\xbf\xf6\xd5\x00\x00\xc5\xc7\xf7\xce\x00\x00\x00\x00\xf9\xd5\x00\x00\x00\x00\x00\x00\xc0\x74\x00\x00\x00\x00\x00\x00\xef\xb6\x00\x00\xf7\xcf\x00\x00\xf9\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ NULL, /* e080 */ NULL, /* e100 */ NULL, /* e180 */ NULL, /* e200 */ NULL, /* e280 */ NULL, /* e300 */ NULL, /* e380 */ NULL, /* e400 */ NULL, /* e480 */ NULL, /* e500 */ NULL, /* e580 */ NULL, /* e600 */ NULL, /* e680 */ NULL, /* e700 */ NULL, /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xa1\xc6\xa2\xc6\xa3\xc6\xa4\xc6\xa5\xc6\xa6\xc6\xa7\xc6\xa8\xc6\xa9\xc6\xaa\xc6\xab\xc6\xac\xc6\xad\xc6\xae\xc6\xaf\xc6\xb0\xc6\xb1\xc6\xb2\xc6\xb3\xc6\xb4\xc6\xb5\xc6\xb6\xc6\xb7\xc6\xb8\xc6\xb9\xc6\xba\xc6\xbb\xc6\xbc\xc6\xbd\xc6\xbe\xc6\xbf\xc6\xc0\xc6\xc1\xc6\xc2\xc6\xc3\xc6\xc4\xc6\xc5\xc6\xc6\xc6\xc7\xc6\xc8\xc6\xc9\xc6\xca\xc6\xcb\xc6\xcc\xc6\xcd\xc6\xce\xc6\xcf\xc6\xd0\xc6\xd1\xc6\xd2\xc6\xd3\xc6\xd4\xc6\xd5\xc6\xd6\xc6\xd7\xc6\xd8\xc6\xd9\xc6\xda\xc6\xdb\xc6\xdc\xc6\xdd\xc6\xde\xc6\xdf\xc6\xe0\xc6\xe1\xc6\xe2\xc6\xe3\xc6\xe4\xc6\xe5\xc6\xe6\xc6\xe7\xc6\xe8\xc6\xe9\xc6\xea\xc6\xeb\xc6\xec\xc6\xed\xc6\xee\xc6\xef", /* f700 */ "\xc6\xf0\xc6\xf1\xc6\xf2\xc6\xf3\xc6\xf4\xc6\xf5\xc6\xf6\xc6\xf7\xc6\xf8\xc6\xf9\xc6\xfa\xc6\xfb\xc6\xfc\xc6\xfd\xc6\xfe\xc7\x40\xc7\x41\xc7\x42\xc7\x43\xc7\x44\xc7\x45\xc7\x46\xc7\x47\xc7\x48\xc7\x49\xc7\x4a\xc7\x4b\xc7\x4c\xc7\x4d\xc7\x4e\xc7\x4f\xc7\x50\xc7\x51\xc7\x52\xc7\x53\xc7\x54\xc7\x55\xc7\x56\xc7\x57\xc7\x58\xc7\x59\xc7\x5a\xc7\x5b\xc7\x5c\xc7\x5d\xc7\x5e\xc7\x5f\xc7\x60\xc7\x61\xc7\x62\xc7\x63\xc7\x64\xc7\x65\xc7\x66\xc7\x67\xc7\x68\xc7\x69\xc7\x6a\xc7\x6b\xc7\x6c\xc7\x6d\xc7\x6e\xc7\x6f\xc7\x70\xc7\x71\xc7\x72\xc7\x73\xc7\x74\xc7\x75\xc7\x76\xc7\x77\xc7\x78\xc7\x79\xc7\x7a\xc7\x7b\xc7\x7c\xc7\x7d\xc7\x7e\xc7\xa1\xc7\xa2\xc7\xa3\xc7\xa4\xc7\xa5\xc7\xa6\xc7\xa7\xc7\xa8\xc7\xa9\xc7\xaa\xc7\xab\xc7\xac\xc7\xad\xc7\xae\xc7\xaf\xc7\xb0\xc7\xb1\xc7\xb2\xc7\xb3\xc7\xb4\xc7\xb5\xc7\xb6\xc7\xb7\xc7\xb8\xc7\xb9\xc7\xba\xc7\xbb\xc7\xbc\xc7\xbd\xc7\xbe\xc7\xbf\xc7\xc0\xc7\xc1\xc7\xc2\xc7\xc3\xc7\xc4\xc7\xc5\xc7\xc6\xc7\xc7\xc7\xc8\xc7\xc9\xc7\xca\xc7\xcb\xc7\xcc\xc7\xcd\xc7\xce\xc7\xcf\xc7\xd0\xc7\xd1\xc7\xd2", /* f780 */ "\xc7\xd3\xc7\xd4\xc7\xd5\xc7\xd6\xc7\xd7\xc7\xd8\xc7\xd9\xc7\xda\xc7\xdb\xc7\xdc\xc7\xdd\xc7\xde\xc7\xdf\xc7\xe0\xc7\xe1\xc7\xe2\xc7\xe3\xc7\xe4\xc7\xe5\xc7\xe6\xc7\xe7\xc7\xe8\xc7\xe9\xc7\xea\xc7\xeb\xc7\xec\xc7\xed\xc7\xee\xc7\xef\xc7\xf0\xc7\xf1\xc7\xf2\xc7\xf3\xc7\xf4\xc7\xf5\xc7\xf6\xc7\xf7\xc7\xf8\xc7\xf9\xc7\xfa\xc7\xfb\xc7\xfc\xc7\xfd\xc7\xfe\xc8\x40\xc8\x41\xc8\x42\xc8\x43\xc8\x44\xc8\x45\xc8\x46\xc8\x47\xc8\x48\xc8\x49\xc8\x4a\xc8\x4b\xc8\x4c\xc8\x4d\xc8\x4e\xc8\x4f\xc8\x50\xc8\x51\xc8\x52\xc8\x53\xc8\x54\xc8\x55\xc8\x56\xc8\x57\xc8\x58\xc8\x59\xc8\x5a\xc8\x5b\xc8\x5c\xc8\x5d\xc8\x5e\xc8\x5f\xc8\x60\xc8\x61\xc8\x62\xc8\x63\xc8\x64\xc8\x65\xc8\x66\xc8\x67\xc8\x68\xc8\x69\xc8\x6a\xc8\x6b\xc8\x6c\xc8\x6d\xc8\x6e\xc8\x6f\xc8\x70\xc8\x71\xc8\x72\xc8\x73\xc8\x74\xc8\x75\xc8\x76\xc8\x77\xc8\x78\xc8\x79\xc8\x7a\xc8\x7b\xc8\x7c\xc8\x7d\xc8\x7e\xc8\xa1\xc8\xa2\xc8\xa3\xc8\xa4\xc8\xa5\xc8\xa6\xc8\xa7\xc8\xa8\xc8\xa9\xc8\xaa\xc8\xab\xc8\xac\xc8\xad\xc8\xae\xc8\xaf\xc8\xb0\xc8\xb1\xc8\xb2\xc8\xb3\xc8\xb4\xc8\xb5", /* f800 */ "\xc8\xb6\xc8\xb7\xc8\xb8\xc8\xb9\xc8\xba\xc8\xbb\xc8\xbc\xc8\xbd\xc8\xbe\xc8\xbf\xc8\xc0\xc8\xc1\xc8\xc2\xc8\xc3\xc8\xc4\xc8\xc5\xc8\xc6\xc8\xc7\xc8\xc8\xc8\xc9\xc8\xca\xc8\xcb\xc8\xcc\xc8\xcd\xc8\xce\xc8\xcf\xc8\xd0\xc8\xd1\xc8\xd2\xc8\xd3\xc8\xd4\xc8\xd5\xc8\xd6\xc8\xd7\xc8\xd8\xc8\xd9\xc8\xda\xc8\xdb\xc8\xdc\xc8\xdd\xc8\xde\xc8\xdf\xc8\xe0\xc8\xe1\xc8\xe2\xc8\xe3\xc8\xe4\xc8\xe5\xc8\xe6\xc8\xe7\xc8\xe8\xc8\xe9\xc8\xea\xc8\xeb\xc8\xec\xc8\xed\xc8\xee\xc8\xef\xc8\xf0\xc8\xf1\xc8\xf2\xc8\xf3\xc8\xf4\xc8\xf5\xc8\xf6\xc8\xf7\xc8\xf8\xc8\xf9\xc8\xfa\xc8\xfb\xc8\xfc\xc8\xfd\xc8\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x4a\xdd\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x4a\xa1\x57\x00\x00\xa1\x59\xa1\x5b\xa1\x5f\xa1\x60\xa1\x63\xa1\x64\xa1\x67\xa1\x68\xa1\x6b\xa1\x6c\xa1\x6f\xa1\x70\xa1\x73\xa1\x74\xa1\x77\xa1\x78\xa1\x7b\xa1\x7c\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xc6\xa1\xc7\xa1\xca\xa1\xcb\xa1\xc8\xa1\xc9\xa1\x5c\xa1\x4d\xa1\x4e\xa1\x4f\x00\x00\xa1\x51\xa1\x52\xa1\x53\xa1\x54\x00\x00\xa1\x7d\xa1\x7e\xa1\xa1\xa1\xa2\xa1\xa3\xa1\xa4\xa1\xcc\xa1\xcd\xa1\xce\xa1\xde\xa1\xdf\xa1\xe0\xa1\xe1\xa1\xe2\x00\x00\xa2\x42\xa2\x4c\xa2\x4d\xa2\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* fe80 */ NULL, /* ff00 */ "\x00\x00\xa1\x49\x00\x00\xa1\xad\xa2\x43\xa2\x48\xa1\xae\x00\x00\xa1\x5d\xa1\x5e\xa1\xaf\xa1\xcf\xa1\x41\xa1\xd0\xa1\x44\xa1\xfe\xa2\xaf\xa2\xb0\xa2\xb1\xa2\xb2\xa2\xb3\xa2\xb4\xa2\xb5\xa2\xb6\xa2\xb7\xa2\xb8\xa1\x47\xa1\x46\xa1\xd5\xa1\xd7\xa1\xd6\xa1\x48\xa2\x49\xa2\xcf\xa2\xd0\xa2\xd1\xa2\xd2\xa2\xd3\xa2\xd4\xa2\xd5\xa2\xd6\xa2\xd7\xa2\xd8\xa2\xd9\xa2\xda\xa2\xdb\xa2\xdc\xa2\xdd\xa2\xde\xa2\xdf\xa2\xe0\xa2\xe1\xa2\xe2\xa2\xe3\xa2\xe4\xa2\xe5\xa2\xe6\xa2\xe7\xa2\xe8\x00\x00\xa2\x40\x00\x00\x00\x00\xa1\xc4\x00\x00\xa2\xe9\xa2\xea\xa2\xeb\xa2\xec\xa2\xed\xa2\xee\xa2\xef\xa2\xf0\xa2\xf1\xa2\xf2\xa2\xf3\xa2\xf4\xa2\xf5\xa2\xf6\xa2\xf7\xa2\xf8\xa2\xf9\xa2\xfa\xa2\xfb\xa2\xfc\xa2\xfd\xa2\xfe\xa3\x40\xa3\x41\xa3\x42\xa3\x43\xa1\x61\xa1\x55\xa1\x62\xa1\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* ff80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x46\xa2\x47\x00\x00\xa1\xc3\x00\x00\xa2\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" } }, { "jisx0208.1983-0", { /* 0000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x71\x21\x72\x00\x00\x00\x00\x00\x00\x21\x78\x21\x2f\x00\x00\x00\x00\x00\x00\x22\x4c\x00\x00\x00\x00\x00\x00\x21\x6b\x21\x5e\x00\x00\x00\x00\x21\x2d\x00\x00\x22\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0100 */ NULL, /* 0180 */ NULL, /* 0200 */ NULL, /* 0280 */ NULL, /* 0300 */ NULL, /* 0380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x21\x26\x22\x26\x23\x26\x24\x26\x25\x26\x26\x26\x27\x26\x28\x26\x29\x26\x2a\x26\x2b\x26\x2c\x26\x2d\x26\x2e\x26\x2f\x26\x30\x26\x31\x00\x00\x26\x32\x26\x33\x26\x34\x26\x35\x26\x36\x26\x37\x26\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x41\x26\x42\x26\x43\x26\x44\x26\x45\x26\x46\x26\x47\x26\x48\x26\x49\x26\x4a\x26\x4b\x26\x4c\x26\x4d\x26\x4e\x26\x4f\x26\x50\x26\x51\x00\x00\x26\x52\x26\x53\x26\x54\x26\x55\x26\x56\x26\x57\x26\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0400 */ "\x00\x00\x27\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x21\x27\x22\x27\x23\x27\x24\x27\x25\x27\x26\x27\x28\x27\x29\x27\x2a\x27\x2b\x27\x2c\x27\x2d\x27\x2e\x27\x2f\x27\x30\x27\x31\x27\x32\x27\x33\x27\x34\x27\x35\x27\x36\x27\x37\x27\x38\x27\x39\x27\x3a\x27\x3b\x27\x3c\x27\x3d\x27\x3e\x27\x3f\x27\x40\x27\x41\x27\x51\x27\x52\x27\x53\x27\x54\x27\x55\x27\x56\x27\x58\x27\x59\x27\x5a\x27\x5b\x27\x5c\x27\x5d\x27\x5e\x27\x5f\x27\x60\x27\x61\x27\x62\x27\x63\x27\x64\x27\x65\x27\x66\x27\x67\x27\x68\x27\x69\x27\x6a\x27\x6b\x27\x6c\x27\x6d\x27\x6e\x27\x6f\x27\x70\x27\x71\x00\x00\x27\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 0480 */ NULL, /* 0500 */ NULL, /* 0580 */ NULL, /* 0600 */ NULL, /* 0680 */ NULL, /* 0700 */ NULL, /* 0780 */ NULL, /* 0800 */ NULL, /* 0880 */ NULL, /* 0900 */ NULL, /* 0980 */ NULL, /* 0a00 */ NULL, /* 0a80 */ NULL, /* 0b00 */ NULL, /* 0b80 */ NULL, /* 0c00 */ NULL, /* 0c80 */ NULL, /* 0d00 */ NULL, /* 0d80 */ NULL, /* 0e00 */ NULL, /* 0e80 */ NULL, /* 0f00 */ NULL, /* 0f80 */ NULL, /* 1000 */ NULL, /* 1080 */ NULL, /* 1100 */ NULL, /* 1180 */ NULL, /* 1200 */ NULL, /* 1280 */ NULL, /* 1300 */ NULL, /* 1380 */ NULL, /* 1400 */ NULL, /* 1480 */ NULL, /* 1500 */ NULL, /* 1580 */ NULL, /* 1600 */ NULL, /* 1680 */ NULL, /* 1700 */ NULL, /* 1780 */ NULL, /* 1800 */ NULL, /* 1880 */ NULL, /* 1900 */ NULL, /* 1980 */ NULL, /* 1a00 */ NULL, /* 1a80 */ NULL, /* 1b00 */ NULL, /* 1b80 */ NULL, /* 1c00 */ NULL, /* 1c80 */ NULL, /* 1d00 */ NULL, /* 1d80 */ NULL, /* 1e00 */ NULL, /* 1e80 */ NULL, /* 1f00 */ NULL, /* 1f80 */ NULL, /* 2000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x21\x3d\x21\x42\x00\x00\x21\x46\x21\x47\x00\x00\x00\x00\x21\x48\x21\x49\x00\x00\x00\x00\x22\x77\x22\x78\x00\x00\x00\x00\x00\x00\x21\x45\x21\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x73\x00\x00\x21\x6c\x21\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2080 */ NULL, /* 2100 */ "\x00\x00\x00\x00\x00\x00\x21\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x2b\x22\x2c\x22\x2a\x22\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x4d\x00\x00\x22\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2200 */ "\x22\x4f\x00\x00\x22\x5f\x22\x50\x00\x00\x00\x00\x00\x00\x22\x60\x22\x3a\x00\x00\x00\x00\x22\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x65\x00\x00\x00\x00\x22\x67\x21\x67\x00\x00\x22\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x4a\x22\x4b\x22\x41\x22\x40\x22\x69\x22\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x68\x22\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x62\x22\x61\x00\x00\x00\x00\x00\x00\x00\x00\x21\x65\x21\x66\x00\x00\x00\x00\x22\x63\x22\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2280 */ "\x00\x00\x00\x00\x22\x3e\x22\x3f\x00\x00\x00\x00\x22\x3c\x22\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2380 */ NULL, /* 2400 */ NULL, /* 2480 */ NULL, /* 2500 */ "\x28\x21\x28\x2c\x28\x22\x28\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x23\x00\x00\x00\x00\x28\x2e\x28\x24\x00\x00\x00\x00\x28\x2f\x28\x26\x00\x00\x00\x00\x28\x31\x28\x25\x00\x00\x00\x00\x28\x30\x28\x27\x28\x3c\x00\x00\x00\x00\x28\x37\x00\x00\x00\x00\x28\x32\x28\x29\x28\x3e\x00\x00\x00\x00\x28\x39\x00\x00\x00\x00\x28\x34\x28\x28\x00\x00\x00\x00\x28\x38\x28\x3d\x00\x00\x00\x00\x28\x33\x28\x2a\x00\x00\x00\x00\x28\x3a\x28\x3f\x00\x00\x00\x00\x28\x35\x28\x2b\x00\x00\x00\x00\x28\x3b\x00\x00\x00\x00\x28\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2580 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x23\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x25\x22\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x27\x22\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x21\x21\x7e\x00\x00\x00\x00\x00\x00\x21\x7b\x00\x00\x00\x00\x21\x7d\x21\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x7a\x21\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x6a\x00\x00\x21\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x76\x00\x00\x00\x00\x22\x75\x00\x00\x22\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 2680 */ NULL, /* 2700 */ NULL, /* 2780 */ NULL, /* 2800 */ NULL, /* 2880 */ NULL, /* 2900 */ NULL, /* 2980 */ NULL, /* 2a00 */ NULL, /* 2a80 */ NULL, /* 2b00 */ NULL, /* 2b80 */ NULL, /* 2c00 */ NULL, /* 2c80 */ NULL, /* 2d00 */ NULL, /* 2d80 */ NULL, /* 2e00 */ NULL, /* 2e80 */ NULL, /* 2f00 */ NULL, /* 2f80 */ NULL, /* 3000 */ "\x21\x21\x21\x22\x21\x23\x21\x37\x00\x00\x21\x39\x21\x3a\x21\x3b\x21\x52\x21\x53\x21\x54\x21\x55\x21\x56\x21\x57\x21\x58\x21\x59\x21\x5a\x21\x5b\x22\x29\x22\x2e\x21\x4c\x21\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x21\x24\x22\x24\x23\x24\x24\x24\x25\x24\x26\x24\x27\x24\x28\x24\x29\x24\x2a\x24\x2b\x24\x2c\x24\x2d\x24\x2e\x24\x2f\x24\x30\x24\x31\x24\x32\x24\x33\x24\x34\x24\x35\x24\x36\x24\x37\x24\x38\x24\x39\x24\x3a\x24\x3b\x24\x3c\x24\x3d\x24\x3e\x24\x3f\x24\x40\x24\x41\x24\x42\x24\x43\x24\x44\x24\x45\x24\x46\x24\x47\x24\x48\x24\x49\x24\x4a\x24\x4b\x24\x4c\x24\x4d\x24\x4e\x24\x4f\x24\x50\x24\x51\x24\x52\x24\x53\x24\x54\x24\x55\x24\x56\x24\x57\x24\x58\x24\x59\x24\x5a\x24\x5b\x24\x5c\x24\x5d\x24\x5e\x24\x5f", /* 3080 */ "\x24\x60\x24\x61\x24\x62\x24\x63\x24\x64\x24\x65\x24\x66\x24\x67\x24\x68\x24\x69\x24\x6a\x24\x6b\x24\x6c\x24\x6d\x24\x6e\x24\x6f\x24\x70\x24\x71\x24\x72\x24\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x2b\x21\x2c\x21\x35\x21\x36\x00\x00\x00\x00\x25\x21\x25\x22\x25\x23\x25\x24\x25\x25\x25\x26\x25\x27\x25\x28\x25\x29\x25\x2a\x25\x2b\x25\x2c\x25\x2d\x25\x2e\x25\x2f\x25\x30\x25\x31\x25\x32\x25\x33\x25\x34\x25\x35\x25\x36\x25\x37\x25\x38\x25\x39\x25\x3a\x25\x3b\x25\x3c\x25\x3d\x25\x3e\x25\x3f\x25\x40\x25\x41\x25\x42\x25\x43\x25\x44\x25\x45\x25\x46\x25\x47\x25\x48\x25\x49\x25\x4a\x25\x4b\x25\x4c\x25\x4d\x25\x4e\x25\x4f\x25\x50\x25\x51\x25\x52\x25\x53\x25\x54\x25\x55\x25\x56\x25\x57\x25\x58\x25\x59\x25\x5a\x25\x5b\x25\x5c\x25\x5d\x25\x5e\x25\x5f\x25\x60\x25\x61\x25\x62\x25\x63\x25\x64\x25\x65\x25\x66\x25\x67\x25\x68\x25\x69\x25\x6a\x25\x6b\x25\x6c\x25\x6d\x25\x6e\x25\x6f\x25\x70\x25\x71\x25\x72\x25\x73\x25\x74\x25\x75\x25\x76\x00\x00\x00\x00\x00\x00\x00\x00\x21\x26\x21\x3c\x21\x33\x21\x34\x00\x00", /* 3100 */ NULL, /* 3180 */ NULL, /* 3200 */ NULL, /* 3280 */ NULL, /* 3300 */ NULL, /* 3380 */ NULL, /* 3400 */ NULL, /* 3480 */ NULL, /* 3500 */ NULL, /* 3580 */ NULL, /* 3600 */ NULL, /* 3680 */ NULL, /* 3700 */ NULL, /* 3780 */ NULL, /* 3800 */ NULL, /* 3880 */ NULL, /* 3900 */ NULL, /* 3980 */ NULL, /* 3a00 */ NULL, /* 3a80 */ NULL, /* 3b00 */ NULL, /* 3b80 */ NULL, /* 3c00 */ NULL, /* 3c80 */ NULL, /* 3d00 */ NULL, /* 3d80 */ NULL, /* 3e00 */ NULL, /* 3e80 */ NULL, /* 3f00 */ NULL, /* 3f80 */ NULL, /* 4000 */ NULL, /* 4080 */ NULL, /* 4100 */ NULL, /* 4180 */ NULL, /* 4200 */ NULL, /* 4280 */ NULL, /* 4300 */ NULL, /* 4380 */ NULL, /* 4400 */ NULL, /* 4480 */ NULL, /* 4500 */ NULL, /* 4580 */ NULL, /* 4600 */ NULL, /* 4680 */ NULL, /* 4700 */ NULL, /* 4780 */ NULL, /* 4800 */ NULL, /* 4880 */ NULL, /* 4900 */ NULL, /* 4980 */ NULL, /* 4a00 */ NULL, /* 4a80 */ NULL, /* 4b00 */ NULL, /* 4b80 */ NULL, /* 4c00 */ NULL, /* 4c80 */ NULL, /* 4d00 */ NULL, /* 4d80 */ NULL, /* 4e00 */ "\x30\x6c\x43\x7a\x00\x00\x3c\x37\x00\x00\x00\x00\x00\x00\x4b\x7c\x3e\x66\x3b\x30\x3e\x65\x32\x3c\x00\x00\x49\x54\x4d\x3f\x00\x00\x50\x22\x31\x2f\x00\x00\x00\x00\x33\x6e\x50\x23\x40\x24\x52\x42\x35\x56\x4a\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x67\x00\x00\x00\x00\x4e\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x42\x00\x00\x00\x00\x00\x00\x50\x24\x00\x00\x00\x00\x43\x66\x00\x00\x00\x00\x00\x00\x50\x25\x36\x7a\x00\x00\x00\x00\x00\x00\x50\x26\x00\x00\x34\x5d\x43\x30\x00\x00\x3c\x67\x50\x27\x00\x00\x00\x00\x50\x28\x00\x00\x00\x00\x50\x29\x47\x35\x00\x00\x35\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x37\x00\x00\x46\x63\x38\x43\x4b\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x49\x50\x2a\x3e\x68\x50\x2b\x32\x35\x00\x00\x00\x00\x00\x00\x36\x65\x38\x70\x4c\x69\x00\x00\x00\x00\x56\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x70\x00\x00\x46\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x25\x00\x00", /* 4e80 */ "\x35\x35\x00\x00\x50\x2c\x00\x00\x00\x00\x50\x2d\x4e\x3b\x00\x00\x4d\x3d\x41\x68\x50\x2f\x3b\x76\x46\x73\x00\x00\x50\x32\x00\x00\x00\x00\x31\x3e\x38\x5f\x00\x00\x38\x5e\x30\x66\x00\x00\x00\x00\x4f\x4b\x4f\x4a\x00\x00\x3a\x33\x30\x21\x00\x00\x50\x33\x50\x34\x50\x35\x4b\x34\x50\x36\x00\x00\x38\x72\x30\x67\x4b\x72\x00\x00\x35\x7c\x00\x00\x00\x00\x35\x7d\x35\x7e\x44\x62\x4e\x3c\x00\x00\x50\x37\x00\x00\x00\x00\x50\x38\x00\x00\x00\x00\x50\x39\x00\x00\x00\x00\x00\x00\x3f\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x3a\x3f\x4e\x50\x3e\x00\x00\x50\x3c\x00\x00\x50\x3d\x35\x58\x00\x00\x00\x00\x3a\x23\x32\x70\x00\x00\x50\x3b\x50\x3a\x4a\x29\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x46\x3b\x45\x42\x3e\x50\x3f\x49\x55\x40\x67\x00\x00\x00\x00\x00\x00\x21\x38\x50\x40\x50\x42\x00\x00\x00\x00\x00\x00\x42\x65\x4e\x61\x30\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x41\x32\x3e\x00\x00\x36\x44\x00\x00\x43\x67\x00\x00\x00\x00\x00\x00\x37\x6f\x50\x43\x00\x00\x00\x00\x00\x00\x47\x24\x00\x00\x00\x00\x00\x00\x00\x00", /* 4f00 */ "\x00\x00\x34\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x44\x30\x4b\x00\x00\x00\x00\x38\x60\x34\x6c\x49\x7a\x48\x32\x35\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x71\x00\x00\x50\x67\x45\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x6c\x50\x46\x00\x00\x00\x00\x00\x00\x48\x3c\x00\x00\x4e\x62\x00\x00\x3f\x2d\x00\x00\x3b\x47\x00\x00\x3b\x77\x32\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x51\x00\x00\x00\x00\x43\x22\x50\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x4c\x44\x63\x3d\x3b\x3a\x34\x4d\x24\x00\x00\x42\x4e\x00\x00\x32\x3f\x00\x00\x50\x49\x00\x00\x4d\x3e\x50\x45\x50\x47\x3a\x6e\x50\x48\x55\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x53\x50\x51\x00\x00\x00\x00\x32\x42\x00\x00\x4a\x3b\x50\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x50\x4f\x38\x73\x00\x00\x00\x00\x3b\x48", /* 4f80 */ "\x00\x00\x00\x00\x00\x00\x34\x26\x00\x00\x00\x00\x50\x54\x00\x00\x50\x4c\x00\x00\x00\x00\x4e\x63\x00\x00\x3b\x78\x00\x00\x50\x4d\x00\x00\x50\x52\x00\x00\x00\x00\x00\x00\x00\x00\x50\x55\x00\x00\x50\x4e\x00\x00\x00\x00\x36\x21\x00\x00\x30\x4d\x00\x00\x00\x00\x36\x22\x32\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x25\x00\x00\x4b\x79\x49\x6e\x38\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x2f\x4e\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x58\x00\x00\x00\x00\x37\x38\x42\x25\x32\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x53\x00\x00\x00\x00\x00\x00\x50\x59\x00\x00\x50\x5e\x50\x5c\x00\x00\x00\x00\x50\x57\x00\x00\x00\x00\x42\x2f\x50\x5a\x00\x00\x50\x5d\x50\x5b\x00\x00\x4a\x5d\x00\x00\x50\x58\x00\x00\x3f\x2e\x00\x00\x4b\x73\x50\x5f\x50\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x24\x50\x6d\x00\x00\x00\x00\x00\x00\x47\x50\x00\x00\x49\x36\x50\x68\x00\x00\x4a\x70\x00\x00\x32\x36\x00\x00\x00\x00\x00\x00\x50\x6c\x00\x00", /* 5000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x66\x50\x6f\x00\x00\x00\x00\x41\x52\x00\x00\x38\x44\x00\x00\x47\x5c\x00\x00\x60\x47\x00\x00\x50\x6e\x45\x5d\x00\x00\x50\x63\x00\x00\x38\x76\x00\x00\x00\x00\x38\x75\x50\x61\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x5a\x00\x00\x50\x69\x00\x00\x4a\x6f\x43\x4d\x50\x65\x37\x71\x00\x00\x50\x62\x50\x6a\x50\x64\x4e\x51\x50\x6b\x4f\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x66\x00\x00\x00\x00\x37\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x70\x00\x00\x00\x00\x00\x00\x50\x71\x50\x75\x30\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x50\x50\x74\x00\x00\x00\x00\x00\x00\x00\x00\x50\x73\x50\x77\x00\x00\x00\x00\x00\x00\x50\x76\x00\x00\x44\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x45\x00\x00\x42\x26\x44\x65\x36\x76\x00\x00\x50\x79\x00\x00\x00\x00\x00\x00\x00\x00\x35\x36\x00\x00\x00\x00", /* 5080 */ "\x50\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x35\x00\x00\x00\x00\x00\x00\x37\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x31\x48\x77\x50\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x45\x4d\x43\x00\x00\x00\x00\x00\x00\x00\x00\x50\x7e\x51\x23\x50\x7d\x3a\x44\x00\x00\x3d\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x39\x00\x00\x00\x00\x00\x00\x51\x24\x00\x00\x00\x00\x36\x4f\x00\x00\x00\x00\x00\x00\x51\x21\x51\x22\x00\x00\x00\x00\x46\x2f\x00\x00\x41\x7c\x00\x00\x36\x23\x00\x00\x00\x00\x00\x00\x4b\x4d\x51\x25\x00\x00\x00\x00\x00\x00\x4e\x3d\x00\x00\x00\x00\x00\x00\x51\x26\x00\x00\x00\x00\x00\x00\x00\x00\x51\x29\x00\x00\x51\x27\x00\x00\x41\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x28\x51\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x2c\x00\x00\x00\x00\x00\x00\x51\x2b\x00\x00\x4a\x48\x00\x00\x00\x00\x00\x00\x00\x00", /* 5100 */ "\x35\x37\x51\x2e\x51\x2f\x00\x00\x32\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x51\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x74\x00\x00\x51\x32\x51\x31\x51\x30\x00\x00\x50\x56\x00\x00\x51\x33\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x7e\x00\x00\x51\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x59\x00\x00\x00\x00\x00\x00\x00\x00\x51\x36\x00\x00\x00\x00\x51\x35\x51\x38\x51\x37\x00\x00\x00\x00\x51\x39\x51\x3a\x30\x74\x00\x00\x38\x35\x37\x3b\x3d\x3c\x43\x7b\x36\x24\x40\x68\x38\x77\x00\x00\x39\x6e\x51\x3c\x4c\x48\x45\x46\x00\x00\x3b\x79\x00\x00\x51\x3b\x00\x00\x51\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x5e\x00\x00\x33\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x3e\x00\x00\x00\x00\x46\x7e\x00\x00\x00\x00\x41\x34\x51\x40\x51\x41\x48\x2c\x38\x78\x4f\x3b\x51\x42\x00\x00\x00\x00\x36\x26\x00\x00\x00\x00\x00\x00\x4a\x3c\x42\x36\x36\x71\x45\x35\x00\x00\x00\x00\x00\x00\x37\x73\x00\x00\x00\x00\x00\x00", /* 5180 */ "\x51\x43\x00\x00\x51\x44\x00\x00\x00\x00\x46\x62\x31\x5f\x00\x00\x00\x00\x51\x47\x3a\x7d\x00\x00\x51\x46\x3a\x46\x00\x00\x51\x48\x66\x6e\x51\x49\x4b\x41\x51\x4a\x00\x00\x51\x4b\x51\x4c\x3e\x69\x00\x00\x3c\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x27\x00\x00\x51\x4f\x00\x00\x51\x4d\x4c\x3d\x51\x4e\x00\x00\x49\x5a\x51\x50\x51\x51\x51\x52\x45\x5f\x00\x00\x00\x00\x00\x00\x51\x56\x51\x54\x51\x55\x51\x53\x3a\x63\x51\x57\x4c\x6a\x4e\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x28\x51\x59\x3d\x5a\x00\x00\x00\x00\x51\x5a\x00\x00\x43\x7c\x4e\x3f\x45\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x45\x00\x00\x00\x00\x00\x00\x00\x00\x51\x5b\x74\x25\x36\x45\x00\x00\x00\x00\x51\x5c\x4b\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x68\x42\x7c\x00\x00\x51\x5e\x46\x64\x00\x00\x00\x00\x51\x5f\x00\x00\x00\x00\x51\x60\x33\x2e\x00\x00\x00\x00\x00\x00\x51\x61\x36\x27\x00\x00\x46\x4c\x31\x7a\x3d\x50\x00\x00\x00\x00\x48\x21\x51\x62\x00\x00", /* 5200 */ "\x45\x61\x00\x00\x00\x00\x3f\x4f\x51\x63\x00\x00\x4a\x2c\x40\x5a\x34\x22\x00\x00\x34\x29\x51\x64\x00\x00\x00\x00\x51\x66\x00\x00\x00\x00\x37\x3a\x00\x00\x00\x00\x51\x65\x00\x00\x00\x00\x4e\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x3d\x4a\x4c\x00\x00\x51\x67\x00\x00\x4d\x78\x51\x68\x00\x00\x00\x00\x00\x00\x51\x69\x00\x00\x45\x7e\x00\x00\x00\x00\x51\x6a\x00\x00\x00\x00\x40\x29\x3a\x7e\x37\x74\x51\x6b\x3b\x49\x39\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x66\x51\x6d\x00\x00\x00\x00\x42\x27\x00\x00\x00\x00\x3a\x6f\x51\x6e\x51\x6f\x41\x30\x00\x00\x51\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x51\x71\x00\x00\x4b\x36\x00\x00\x00\x00\x00\x00\x00\x00\x39\x64\x00\x00\x00\x00\x51\x70\x00\x00\x00\x00\x00\x00\x00\x00\x37\x75\x3a\x5e\x47\x6d\x00\x00\x00\x00\x00\x00\x51\x74\x51\x72\x00\x00\x00\x00\x00\x00\x00\x00\x49\x7b\x3e\x6a\x51\x7b\x33\x64\x51\x75\x51\x73\x41\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x77\x00\x00\x51\x76", /* 5280 */ "\x00\x00\x00\x00\x00\x00\x33\x44\x00\x00\x00\x00\x00\x00\x37\x60\x51\x7c\x4e\x2d\x00\x00\x00\x00\x00\x00\x51\x78\x00\x00\x00\x00\x00\x00\x51\x7d\x51\x7a\x00\x00\x51\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x4f\x00\x00\x00\x00\x00\x00\x38\x79\x32\x43\x00\x00\x00\x00\x4e\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x75\x45\x58\x39\x65\x52\x22\x52\x23\x00\x00\x00\x00\x00\x00\x4e\x65\x00\x00\x00\x00\x4f\x2b\x52\x25\x00\x00\x00\x00\x00\x00\x38\x7a\x00\x00\x00\x00\x52\x24\x00\x00\x33\x2f\x00\x00\x00\x00\x52\x26\x00\x00\x4b\x56\x00\x00\x44\x3c\x00\x00\x4d\x26\x00\x00\x4a\x59\x00\x00\x00\x00\x00\x00\x52\x27\x00\x00\x00\x00\x00\x00\x00\x00\x70\x55\x00\x00\x00\x00\x46\x30\x00\x00\x52\x28\x34\x2a\x4c\x33\x00\x00\x00\x00\x00\x00\x3e\x21\x52\x29\x4a\x67\x52\x2d\x00\x00\x40\x2a\x52\x2a\x36\x50\x00\x00\x52\x2b\x34\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x2e\x52\x2e\x00\x00\x52\x2f\x00\x00\x00\x00\x52\x30\x52\x31\x3c\x5b\x00\x00\x00\x00\x00\x00\x38\x7b\x4c\x5e", /* 5300 */ "\x00\x00\x4c\x68\x46\x77\x00\x00\x00\x00\x4a\x71\x52\x32\x00\x00\x52\x33\x00\x00\x00\x00\x00\x00\x00\x00\x52\x35\x00\x00\x52\x37\x52\x36\x00\x00\x00\x00\x00\x00\x00\x00\x52\x38\x32\x3d\x4b\x4c\x00\x00\x3a\x7c\x52\x39\x00\x00\x00\x00\x41\x59\x00\x00\x00\x00\x3e\x22\x36\x29\x00\x00\x52\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x52\x3b\x00\x00\x52\x3c\x00\x00\x52\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x52\x3e\x49\x24\x36\x68\x30\x65\x00\x00\x00\x00\x00\x00\x46\x3f\x52\x3f\x3d\x3d\x00\x00\x40\x69\x00\x00\x52\x41\x52\x40\x3e\x23\x38\x61\x52\x43\x48\x3e\x00\x00\x00\x00\x52\x44\x00\x00\x00\x00\x00\x00\x48\x5c\x42\x34\x42\x6e\x36\x28\x00\x00\x00\x00\x46\x6e\x43\x31\x00\x00\x47\x6e\x00\x00\x4b\x4e\x00\x00\x52\x46\x00\x00\x40\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x35\x00\x00\x00\x00\x52\x47\x00\x00\x00\x00\x00\x00\x00\x00\x52\x48\x31\x2c\x30\x75\x34\x6d\x00\x00\x42\x28\x35\x51\x4d\x71\x00\x00\x52\x4b\x32\x37\x00\x00\x00\x00\x52\x4a\x00\x00\x00\x00\x00\x00\x36\x2a", /* 5380 */ "\x00\x00\x00\x00\x52\x4c\x00\x00\x4c\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x4d\x00\x00\x4e\x52\x00\x00\x38\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x38\x36\x52\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x52\x50\x52\x4f\x00\x00\x3f\x5f\x31\x39\x00\x00\x00\x00\x00\x00\x31\x5e\x52\x51\x00\x00\x52\x52\x00\x00\x00\x00\x38\x37\x00\x00\x00\x00\x52\x53\x00\x00\x00\x00\x00\x00\x00\x00\x35\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x32\x52\x54\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x74\x3a\x35\x35\x5a\x4d\x27\x41\x50\x48\x3f\x3c\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x47\x00\x00\x3c\x68\x3c\x75\x00\x00\x3d\x76\x00\x00\x48\x40\x00\x00\x00\x00\x00\x00\x52\x57\x00\x00\x31\x43\x41\x51\x38\x7d\x38\x45\x36\x67\x00\x00\x00\x00\x52\x5b\x43\x21\x42\x7e\x36\x2b\x3e\x24\x52\x5c\x52\x5a\x32\x44\x42\x66\x3c\x38\x3b\x4b\x31\x26\x00\x00\x00\x00\x33\x70\x39\x66\x3b\x4a\x00\x00\x52\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5400 */ "\x00\x00\x52\x5e\x00\x00\x35\x49\x33\x46\x00\x00\x00\x00\x00\x00\x39\x67\x35\x48\x44\x5f\x31\x25\x46\x31\x4c\x3e\x39\x21\x4d\x79\x45\x47\x38\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x2f\x00\x00\x52\x67\x00\x00\x36\x63\x4b\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x5d\x00\x00\x00\x00\x52\x66\x00\x00\x34\x5e\x52\x61\x52\x62\x52\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x65\x00\x00\x35\x5b\x3f\x61\x00\x00\x4a\x2d\x52\x63\x52\x5f\x38\x63\x00\x00\x52\x60\x00\x00\x4f\x24\x00\x00\x00\x00\x00\x00\x4a\x72\x00\x00\x44\x68\x38\x62\x39\x70\x00\x00\x00\x00\x00\x00\x52\x68\x00\x00\x00\x00\x46\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x7e\x00\x00\x3c\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x6f\x52\x6d\x00\x00\x4c\x23\x00\x00\x52\x6a\x52\x73\x52\x6e\x00\x00\x00\x00\x00\x00\x52\x71\x38\x46\x4c\x3f\x00\x00\x00\x00", /* 5480 */ "\x52\x72\x00\x00\x00\x00\x00\x00\x52\x74\x00\x00\x52\x76\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x70\x4f\x42\x00\x00\x52\x6b\x52\x69\x52\x75\x00\x00\x52\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x78\x00\x00\x53\x23\x52\x7a\x00\x00\x00\x00\x52\x7e\x00\x00\x00\x00\x53\x21\x52\x7b\x00\x00\x00\x00\x53\x3e\x00\x00\x00\x00\x3a\x69\x33\x31\x00\x00\x00\x00\x00\x00\x00\x00\x52\x79\x00\x00\x00\x00\x00\x00\x53\x25\x30\x76\x53\x24\x00\x00\x30\x25\x49\x4a\x53\x22\x00\x00\x52\x7c\x00\x00\x00\x00\x52\x77\x52\x7d\x3a\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x77\x53\x2f\x00\x00\x00\x00\x53\x27\x53\x28\x00\x00\x3e\x25\x4b\x69\x00\x00\x00\x00\x00\x00\x53\x2d\x53\x2c\x00\x00\x00\x00\x00\x00\x45\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x2e\x00\x00\x00\x00\x53\x2b\x00\x00\x00\x00", /* 5500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x31\x34\x00\x00\x3a\x36\x3f\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x29\x45\x62\x00\x00\x00\x00\x00\x00\x53\x2a\x00\x00\x30\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x34\x4d\x23\x00\x00\x3e\x27\x00\x00\x53\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x53\x39\x53\x30\x00\x00\x00\x00\x00\x00\x00\x00\x42\x43\x00\x00\x53\x31\x00\x00\x00\x00\x00\x00\x42\x6f\x53\x36\x3e\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x33\x00\x00\x00\x00\x4c\x64\x00\x00\x00\x00\x00\x00\x37\x3c\x00\x00\x00\x00\x53\x37\x53\x38\x00\x00\x00\x00\x00\x00\x00\x00\x53\x35\x53\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x41\x53\x46\x00\x00\x53\x42\x00\x00", /* 5580 */ "\x53\x3d\x00\x00\x00\x00\x53\x47\x41\x31\x00\x00\x00\x00\x53\x49\x00\x00\x39\x22\x53\x3f\x43\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x43\x53\x3c\x34\x2d\x00\x00\x34\x6e\x33\x65\x53\x44\x53\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x76\x53\x4a\x53\x48\x41\x53\x35\x4a\x36\x2c\x00\x00\x53\x45\x00\x00\x36\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x4e\x53\x4c\x00\x00\x54\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x4b\x00\x00\x53\x4f\x00\x00\x00\x00\x53\x4d\x00\x00\x00\x00\x00\x00\x3b\x4c\x53\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x53\x00\x00\x53\x58\x00\x00\x00\x00\x00\x00\x53\x56\x53\x55\x00\x00", /* 5600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x32\x00\x00\x00\x00\x32\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x52\x00\x00\x53\x54\x3e\x28\x31\x33\x00\x00\x00\x00\x53\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x62\x00\x00\x3e\x7c\x53\x5e\x00\x00\x53\x5c\x00\x00\x53\x5d\x00\x00\x53\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x39\x00\x00\x53\x59\x00\x00\x53\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x61\x00\x00\x00\x00\x00\x00\x34\x6f\x00\x00\x53\x64\x53\x60\x53\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x2e\x00\x00\x00\x00\x00\x00\x46\x55\x00\x00\x48\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5680 */ "\x53\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x65\x33\x45\x00\x00\x00\x00\x53\x67\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x53\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x68\x00\x00\x47\x39\x00\x00\x00\x00\x53\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x6e\x00\x00\x53\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x70\x00\x00\x00\x00\x00\x00\x53\x73\x53\x71\x53\x6f\x53\x72\x00\x00\x00\x00\x00\x00\x00\x00\x53\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x75\x00\x00\x00\x00\x53\x76\x00\x00\x53\x77\x00\x00\x00\x00\x00\x00\x53\x78\x51\x45\x00\x00\x3c\x7c\x3b\x4d\x00\x00\x00\x00\x32\x73\x00\x00\x30\x78\x00\x00\x00\x00\x43\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x79\x00\x00\x3a\x24\x00\x00\x30\x4f\x3f\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x7a\x38\x47\x00\x00\x00\x00\x39\x71\x00\x00\x53\x7c", /* 5700 */ "\x53\x7b\x00\x00\x00\x00\x4a\x60\x53\x7d\x00\x00\x00\x00\x00\x00\x54\x21\x53\x7e\x00\x00\x54\x22\x00\x00\x54\x23\x00\x00\x37\x77\x00\x00\x00\x00\x31\x60\x54\x24\x00\x00\x00\x00\x54\x26\x00\x00\x54\x25\x00\x00\x00\x00\x00\x00\x54\x28\x00\x00\x00\x00\x45\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x29\x30\x35\x3a\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x37\x3d\x00\x00\x00\x00\x43\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x2a\x54\x2b\x00\x00\x00\x00\x54\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x54\x2e\x00\x00\x3a\x64\x00\x00\x00\x00\x00\x00\x00\x00\x36\x51\x00\x00\x00\x00\x4b\x37\x00\x00\x00\x00\x00\x00\x54\x2c\x54\x2f\x3a\x41\x39\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x33\x00\x00\x00\x00\x3a\x25\x00\x00\x43\x33\x00\x00\x00\x00\x54\x30\x44\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x34", /* 5780 */ "\x00\x00\x00\x00\x3f\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x32\x54\x35\x00\x00\x37\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x37\x00\x00\x39\x24\x33\x40\x54\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x3b\x00\x00\x00\x00\x54\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x31\x00\x00\x00\x00\x54\x3c\x00\x00\x00\x00\x54\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x64\x00\x00\x00\x00\x3e\x6b\x00\x00\x00\x00\x00\x00\x54\x3f\x54\x40\x54\x3e\x00\x00\x54\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x38\x00\x00\x00\x00\x30\x68\x49\x56\x00\x00\x00\x00\x54\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x7d\x00\x00\x00\x00\x3c\x39\x00\x00\x47\x5d\x34\x70\x00\x00\x3a\x6b\x00\x00\x00\x00\x00\x00", /* 5800 */ "\x4b\x59\x00\x00\x46\x32\x00\x00\x00\x00\x37\x78\x42\x4f\x00\x00\x00\x00\x00\x00\x54\x41\x54\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x44\x00\x00\x00\x00\x00\x00\x54\x45\x00\x00\x00\x00\x00\x00\x54\x46\x00\x00\x00\x00\x00\x00\x54\x48\x00\x00\x00\x00\x44\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x74\x21\x31\x61\x4a\x73\x00\x00\x00\x00\x3e\x6c\x45\x48\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x66\x00\x00\x00\x00\x54\x4e\x00\x00\x00\x00\x4a\x3d\x4e\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x74\x54\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x3a\x54\x4d\x00\x00\x45\x63\x00\x00\x00\x00\x45\x49\x45\x64\x48\x39\x44\x4d\x00\x00\x00\x00\x00\x00\x3a\x49\x00\x00\x00\x00\x00\x00\x54\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x76\x00\x00\x45\x36\x00\x00\x00\x00\x00\x00\x00\x00\x54\x4b\x00\x00\x54\x47\x00\x00\x00\x00\x3f\x50\x00\x00\x00\x00\x00\x00\x54\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x4e\x00\x00", /* 5880 */ "\x00\x00\x00\x00\x00\x00\x36\x2d\x00\x00\x54\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x68\x00\x00\x00\x00\x00\x00\x41\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x44\x46\x00\x00\x00\x00\x54\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x4f\x00\x00\x00\x00\x54\x53\x00\x00\x00\x00\x54\x58\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x54\x57\x54\x51\x54\x54\x54\x56\x00\x00\x00\x00\x3a\x26\x00\x00\x00\x00\x4a\x49\x00\x00\x00\x00\x00\x00\x54\x59\x00\x00\x43\x45\x00\x00\x00\x00\x32\x75\x00\x00\x3e\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x54\x5b\x00\x00\x54\x5a\x00\x00\x39\x68\x00\x00\x54\x5c\x54\x5e\x54\x5d\x00\x00\x00\x00\x54\x60\x00\x00\x54\x55\x54\x62\x00\x00\x00\x00\x00\x00\x00\x00\x54\x61\x54\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x4e\x3f\x51\x00\x00\x41\x54\x54\x63\x40\x3c\x30\x6d\x47\x64\x00\x00\x00\x00\x00\x00\x00\x00\x44\x5b\x00\x00\x54\x65\x54\x64\x54\x66\x54\x67\x54\x68\x00\x00\x00\x00", /* 5900 */ "\x00\x00\x00\x00\x54\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x51\x54\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x32\x46\x54\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x3c\x33\x30\x00\x00\x52\x49\x3d\x48\x42\x3f\x54\x6c\x4c\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x34\x00\x00\x00\x00\x54\x6e\x00\x00\x42\x67\x00\x00\x45\x37\x42\x40\x49\x57\x54\x6f\x54\x70\x31\x7b\x00\x00\x00\x00\x3c\x3a\x54\x71\x00\x00\x00\x00\x00\x00\x00\x00\x30\x50\x54\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x62\x00\x00\x00\x00\x34\x71\x46\x60\x4a\x74\x00\x00\x00\x00\x00\x00\x00\x00\x54\x77\x41\x55\x54\x76\x37\x40\x00\x00\x00\x00\x4b\x5b\x54\x75\x00\x00\x45\x65\x54\x79\x00\x00\x54\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x7b\x00\x00\x54\x7a\x00\x00\x00\x00\x31\x7c\x00\x00\x54\x7c\x3e\x29\x54\x7e\x43\x25\x00\x00\x54\x7d\x00\x00\x4a\x33\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x77\x45\x5b\x00\x00\x00\x00\x00\x00\x55\x21\x00\x00\x00\x00\x00\x00\x00\x00\x39\x25\x00\x00\x00\x00", /* 5980 */ "\x00\x00\x55\x22\x47\x21\x48\x5e\x4c\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x25\x00\x00\x00\x00\x55\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x38\x00\x00\x00\x00\x4d\x45\x00\x00\x00\x00\x4c\x2f\x00\x00\x56\x2c\x00\x00\x55\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x26\x00\x00\x42\x45\x00\x00\x00\x00\x4b\x38\x00\x00\x00\x00\x00\x00\x45\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x65\x00\x00\x3a\x4a\x00\x00\x00\x00\x3e\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x28\x00\x00\x00\x00\x3b\x50\x00\x00\x3b\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x30\x39\x38\x48\x00\x00\x40\x2b\x30\x51\x00\x00\x00\x00\x00\x00\x00\x00\x55\x2c\x55\x2d\x00\x00\x55\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x38\x34\x2f\x00\x00\x55\x29\x00\x00\x4c\x45\x49\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x28\x00\x00\x00\x00\x00\x00\x00\x00\x30\x79\x00\x00\x00\x00\x00\x00\x3b\x51", /* 5a00 */ "\x00\x00\x30\x52\x00\x00\x30\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x3c\x00\x00\x55\x33\x00\x00\x55\x31\x00\x00\x00\x00\x55\x2f\x3f\x31\x00\x00\x00\x00\x00\x00\x00\x00\x55\x2e\x00\x00\x00\x00\x00\x00\x4a\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x37\x55\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x2b\x00\x00\x00\x00\x00\x00\x55\x34\x4f\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x47\x4c\x00\x00\x00\x00\x55\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x39\x00\x00\x00\x00\x00\x00\x49\x58\x00\x00\x00\x00\x00\x00\x55\x3a\x00\x00\x55\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x3b", /* 5a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x3b\x49\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x3c\x55\x40\x55\x3d\x00\x00\x00\x00\x32\x47\x55\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3b\x00\x00\x55\x3e\x37\x79\x00\x00\x00\x00\x00\x00\x55\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x45\x55\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x64\x00\x00\x55\x41\x00\x00\x00\x00\x55\x43\x00\x00\x00\x00\x55\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x46\x55\x47\x00\x00\x00\x00\x00\x00\x00\x00", /* 5b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x72\x00\x00\x55\x49\x55\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4d\x00\x00\x44\x5c\x00\x00\x00\x00\x00\x00\x31\x45\x00\x00\x55\x4b\x00\x00\x00\x00\x00\x00\x55\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x4f\x00\x00\x55\x52\x00\x00\x00\x00\x55\x50\x00\x00\x55\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x52\x55\x53\x00\x00\x00\x00\x39\x26\x55\x54\x00\x00\x3b\x7a\x42\x38\x00\x00\x55\x55\x55\x56\x3b\x5a\x39\x27\x00\x00\x4c\x52\x00\x00\x00\x00\x00\x00\x35\x28\x38\x49\x55\x57\x33\x58\x00\x00\x00\x00\x55\x58\x00\x00\x42\x39\x00\x00\x00\x00\x00\x00\x00\x00\x55\x59\x56\x23\x00\x00\x55\x5a\x00\x00\x55\x5b\x00\x00\x00\x00\x55\x5c\x00\x00\x55\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5b80 */ "\x55\x5f\x00\x00\x00\x00\x55\x60\x00\x00\x42\x70\x00\x00\x31\x27\x3c\x69\x30\x42\x00\x00\x41\x57\x34\x30\x3c\x35\x00\x00\x39\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x66\x00\x00\x3d\x21\x34\x31\x43\x68\x44\x6a\x30\x38\x35\x39\x4a\x75\x00\x00\x3c\x42\x00\x00\x00\x00\x35\x52\x40\x6b\x3c\x3c\x4d\x28\x55\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x5c\x00\x00\x3a\x4b\x00\x00\x00\x00\x33\x32\x31\x63\x3e\x2c\x32\x48\x00\x00\x55\x62\x4d\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x49\x00\x00\x00\x00\x3c\x64\x55\x63\x34\x73\x46\x52\x4c\x29\x55\x64\x00\x00\x55\x65\x00\x00\x00\x00\x49\x59\x00\x00\x00\x00\x00\x00\x55\x67\x00\x00\x34\x28\x36\x77\x55\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x32\x00\x00\x3f\x32\x55\x6b\x3b\x21\x00\x00\x32\x49\x55\x6a\x00\x00\x55\x68\x55\x6c\x55\x69\x47\x2b\x5c\x4d\x3f\x33\x00\x00\x55\x6d\x00\x00\x00\x00\x4e\x40\x00\x00\x55\x6e\x00\x00\x00\x00\x55\x70\x00\x00\x43\x7e\x55\x6f\x00\x00\x40\x23\x00\x00\x3b\x7b\x00\x00\x00\x00\x00\x00\x42\x50\x3c\x77", /* 5c00 */ "\x00\x00\x49\x75\x40\x6c\x00\x00\x3c\x4d\x55\x71\x3e\x2d\x55\x72\x55\x73\x30\x53\x42\x3a\x3f\x52\x00\x00\x55\x74\x46\x33\x3e\x2e\x00\x00\x3e\x2f\x00\x00\x55\x75\x00\x00\x00\x00\x40\x6d\x00\x00\x00\x00\x00\x00\x3e\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x76\x00\x00\x55\x77\x00\x00\x4c\x60\x00\x00\x00\x00\x00\x00\x55\x78\x00\x00\x00\x00\x00\x00\x00\x00\x36\x46\x00\x00\x00\x00\x00\x00\x3d\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x79\x55\x7a\x3c\x5c\x3f\x2c\x46\x74\x3f\x54\x48\x78\x47\x22\x36\x49\x55\x7b\x00\x00\x00\x00\x00\x00\x35\x6f\x55\x7c\x00\x00\x36\x7e\x00\x00\x46\x4f\x32\x30\x00\x00\x3b\x53\x55\x7d\x56\x22\x56\x21\x36\x7d\x00\x00\x55\x7e\x00\x00\x45\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x30\x00\x00\x45\x4b\x3c\x48\x00\x00\x00\x00\x41\x58\x4d\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x24\x00\x00\x56\x25\x46\x56\x00\x00\x3b\x33\x00\x00\x00\x00\x00\x00\x00\x00\x56\x27\x00\x00\x00\x00\x56\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x29\x00\x00\x00\x00\x00\x00\x34\x74\x56\x2a\x00\x00\x00\x00\x56\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x3b\x34\x64\x00\x00\x56\x2d\x4c\x28\x00\x00\x00\x00\x00\x00\x00\x00\x42\x52\x00\x00\x33\x59\x00\x00\x00\x00\x56\x2f\x56\x31\x34\x5f\x00\x00\x00\x00\x56\x2e\x56\x30\x00\x00\x56\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x32\x00\x00\x56\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x3d\x36\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x65\x56\x36\x56\x3b\x00\x00\x00\x00\x56\x39\x00\x00\x4a\x77\x4a\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x67\x00\x00\x00\x00\x00\x00\x56\x38\x3d\x54\x00\x00\x56\x37\x00\x00\x00\x00", /* 5d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x72\x00\x00\x00\x00\x00\x00\x56\x3c\x00\x00\x00\x00\x3a\x6a\x00\x00\x00\x00\x56\x42\x00\x00\x00\x00\x56\x43\x56\x3d\x33\x33\x56\x3e\x56\x47\x56\x46\x56\x45\x56\x41\x00\x00\x00\x00\x00\x00\x56\x40\x00\x00\x00\x00\x56\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x4b\x56\x48\x00\x00\x56\x4a\x00\x00\x4d\x72\x00\x00\x56\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x73\x00\x00\x00\x00\x56\x4c\x00\x00\x00\x00\x3a\x37\x00\x00\x00\x00\x00\x00\x56\x4d\x00\x00\x00\x00\x56\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 5d80 */ "\x00\x00\x00\x00\x56\x51\x00\x00\x56\x50\x00\x00\x00\x00\x56\x4f\x00\x00\x00\x00\x00\x00\x45\x68\x56\x3a\x00\x00\x00\x00\x00\x00\x56\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x53\x00\x00\x00\x00\x00\x00\x00\x00\x56\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x54\x00\x00\x56\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x58\x00\x00\x00\x00\x4e\x66\x00\x00\x56\x59\x56\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x5a\x00\x00\x00\x00\x34\x60\x56\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x56\x5d\x56\x5c\x00\x00\x00\x00\x56\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x56\x5f\x00\x00\x40\x6e\x3d\x23\x00\x00\x00\x00\x3d\x64\x00\x00\x41\x63\x00\x00\x39\x29\x3a\x38\x39\x2a\x35\x70\x00\x00\x00\x00\x56\x60\x00\x00\x00\x00\x3a\x39\x00\x00\x00\x00\x38\x4a\x56\x61\x4c\x26\x47\x43\x56\x62\x00\x00\x39\x2b\x00\x00\x00\x00\x00\x00\x34\x2c\x00\x00\x43\x27\x36\x52\x00\x00", /* 5e00 */ "\x00\x00\x00\x00\x3b\x54\x49\x5b\x00\x00\x00\x00\x48\x41\x00\x00\x00\x00\x00\x00\x00\x00\x56\x63\x34\x75\x00\x00\x00\x00\x00\x00\x00\x00\x56\x66\x00\x00\x00\x00\x00\x00\x00\x00\x44\x21\x00\x00\x00\x00\x56\x65\x56\x64\x56\x67\x00\x00\x44\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x55\x00\x00\x40\x4a\x00\x00\x42\x53\x35\x22\x00\x00\x00\x00\x44\x22\x00\x00\x00\x00\x56\x68\x56\x69\x3e\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x39\x00\x00\x00\x00\x56\x6c\x00\x00\x00\x00\x56\x6b\x56\x6a\x49\x7d\x00\x00\x56\x73\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x5a\x00\x00\x56\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x6f\x4b\x6b\x00\x00\x56\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x70\x00\x00\x48\x28\x56\x71\x4a\x3e\x56\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x33\x4a\x3f\x47\x2f\x56\x74\x56\x75\x00\x00\x39\x2c\x34\x34\x56\x76\x38\x38\x4d\x44\x4d\x29\x34\x76\x56\x78", /* 5e80 */ "\x00\x00\x44\x23\x00\x00\x39\x2d\x3e\x31\x00\x00\x00\x00\x48\x5f\x00\x00\x00\x00\x3e\x32\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x6c\x4a\x79\x45\x39\x00\x00\x00\x00\x39\x2e\x00\x00\x49\x5c\x00\x00\x00\x00\x00\x00\x56\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x59\x3a\x42\x00\x00\x00\x00\x00\x00\x38\x4b\x00\x00\x44\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x43\x3d\x6e\x39\x2f\x4d\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7a\x56\x7b\x47\x51\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7c\x4e\x77\x4f\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x56\x7e\x56\x7d\x00\x00\x00\x00\x33\x47\x00\x00\x00\x00\x57\x21\x00\x00\x00\x00\x00\x00\x57\x24\x57\x25\x00\x00\x57\x23\x00\x00\x49\x40\x3e\x33\x57\x27\x57\x26\x57\x22\x00\x00\x00\x00\x00\x00\x00\x00\x57\x28\x57\x29\x00\x00\x00\x00\x57\x2a\x00\x00\x00\x00\x00\x00\x57\x2d\x57\x2b\x00\x00\x57\x2c\x57\x2e\x00\x00\x31\x64\x44\x6e\x57\x2f\x00\x00\x37\x7a\x32\x76\x47\x36\x00\x00\x57\x30\x46\x7b", /* 5f00 */ "\x00\x00\x4a\x5b\x00\x00\x57\x31\x4f\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x57\x32\x4a\x40\x57\x35\x50\x21\x50\x31\x00\x00\x3c\x30\x46\x75\x57\x36\x00\x00\x35\x5d\x44\x24\x30\x7a\x57\x37\x4a\x26\x39\x30\x00\x00\x00\x00\x43\x50\x00\x00\x00\x00\x00\x00\x44\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x6f\x38\x39\x38\x4c\x00\x00\x57\x38\x00\x00\x00\x00\x00\x00\x57\x39\x00\x00\x57\x3f\x00\x00\x3c\x65\x00\x00\x00\x00\x00\x00\x44\x25\x00\x00\x36\x2f\x57\x3a\x00\x00\x00\x00\x00\x00\x49\x2b\x00\x00\x43\x46\x00\x00\x00\x00\x57\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x3c\x00\x00\x36\x30\x00\x00\x57\x3d\x00\x00\x57\x3e\x00\x00\x00\x00\x57\x40\x00\x00\x45\x76\x00\x00\x00\x00\x57\x41\x57\x42\x00\x00\x57\x43\x00\x00\x00\x00\x57\x34\x57\x33\x00\x00\x00\x00\x00\x00\x57\x44\x37\x41\x00\x00\x00\x00\x00\x00\x49\x27\x00\x00\x00\x00\x3a\x4c\x49\x37\x44\x26\x49\x4b\x57\x45\x00\x00\x00\x00\x3e\x34\x31\x46\x00\x00\x57\x46\x00\x00\x00\x00\x00\x00\x57\x47\x00\x00\x4c\x72\x00\x00\x00\x00\x48\x60\x00\x00\x00\x00\x57\x4a", /* 5f80 */ "\x31\x7d\x40\x2c\x57\x49\x57\x48\x37\x42\x42\x54\x00\x00\x57\x4e\x57\x4c\x00\x00\x57\x4b\x4e\x27\x38\x65\x00\x00\x00\x00\x00\x00\x3d\x79\x57\x4d\x45\x4c\x3d\x3e\x00\x00\x00\x00\x00\x00\x46\x40\x57\x51\x57\x50\x00\x00\x00\x00\x00\x00\x00\x00\x57\x4f\x00\x00\x57\x52\x38\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x53\x49\x7c\x3d\x5b\x00\x00\x00\x00\x57\x54\x48\x79\x00\x00\x00\x00\x00\x00\x00\x00\x46\x41\x44\x27\x00\x00\x00\x00\x00\x00\x00\x00\x45\x30\x00\x00\x00\x00\x57\x55\x35\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x34\x00\x00\x49\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x77\x47\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x56\x3b\x56\x4b\x3a\x4b\x3b\x00\x00\x00\x00\x31\x7e\x57\x5b\x00\x00\x00\x00\x43\x69\x00\x00\x00\x00\x00\x00\x57\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x77\x00\x00\x00\x00\x00\x00\x00\x00\x58\x2d\x57\x5a\x00\x00\x00\x00\x00\x00\x47\x30\x00\x00\x00\x00\x57\x59\x00\x00\x00\x00\x57\x57\x00\x00\x39\x7a\x00\x00\x57\x5d", /* 6000 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x63\x57\x69\x57\x61\x00\x00\x45\x5c\x00\x00\x00\x00\x57\x66\x49\x5d\x00\x00\x00\x00\x57\x60\x00\x00\x57\x65\x4e\x67\x3b\x57\x00\x00\x00\x00\x42\x55\x57\x5e\x00\x00\x00\x00\x00\x00\x35\x5e\x57\x68\x40\x2d\x31\x65\x57\x62\x32\x78\x57\x67\x00\x00\x00\x00\x00\x00\x36\x31\x00\x00\x57\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x6c\x57\x76\x57\x74\x00\x00\x00\x00\x57\x71\x00\x00\x00\x00\x00\x00\x57\x70\x4e\x78\x00\x00\x57\x72\x00\x00\x00\x00\x36\x32\x00\x00\x39\x31\x00\x00\x00\x00\x3d\x7a\x00\x00\x00\x00\x00\x00\x57\x79\x57\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x57\x6f\x57\x5f\x00\x00\x32\x7a\x57\x73\x57\x75\x43\x51\x00\x00\x00\x00\x3a\x28\x32\x38\x57\x6d\x57\x78\x57\x77\x36\x33\x00\x00\x42\x29\x33\x66\x00\x00\x00\x00\x00\x00\x00\x00\x37\x43\x00\x00\x57\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6080 */ "\x00\x00\x57\x7a\x00\x00\x57\x7d\x58\x21\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3d\x00\x00\x58\x27\x44\x70\x57\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x58\x25\x00\x00\x32\x79\x00\x00\x58\x23\x58\x24\x00\x00\x00\x00\x57\x7e\x58\x22\x00\x00\x00\x00\x00\x00\x38\x67\x4d\x2a\x00\x00\x00\x00\x34\x35\x00\x00\x00\x00\x31\x59\x58\x26\x00\x00\x47\x3a\x30\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x61\x57\x5c\x58\x2c\x58\x30\x4c\x65\x00\x00\x58\x29\x00\x00\x00\x00\x00\x00\x45\x69\x58\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x70\x58\x2f\x46\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x47\x00\x00\x58\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x58\x31\x00\x00\x39\x7b\x00\x00\x40\x4b\x00\x00\x00\x00\x30\x54\x58\x2a\x58\x28\x00\x00\x41\x5a\x00\x00\x00\x00\x00\x00\x57\x7c\x3b\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x46\x58\x3d\x00\x00\x41\x5b\x58\x38\x00\x00\x58\x35\x58\x36\x00\x00\x3c\x66\x58\x39\x58\x3c\x00\x00\x00\x00\x00\x00\x00\x00", /* 6100 */ "\x58\x37\x3d\x25\x00\x00\x58\x3a\x00\x00\x00\x00\x58\x34\x00\x00\x4c\x7c\x4c\x7b\x00\x00\x00\x00\x00\x00\x58\x3e\x58\x3f\x30\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x33\x00\x00\x00\x00\x00\x00\x00\x00\x36\x72\x30\x26\x00\x00\x00\x00\x00\x00\x34\x36\x00\x00\x58\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x43\x58\x42\x00\x00\x00\x00\x00\x00\x58\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x46\x58\x49\x58\x41\x58\x45\x00\x00\x00\x00\x58\x4a\x00\x00\x58\x4b\x00\x00\x00\x00\x58\x40\x3b\x7c\x00\x00\x58\x44\x42\x56\x39\x32\x58\x32\x3f\x35\x00\x00\x00\x00\x00\x00\x00\x00\x58\x58\x00\x00\x4a\x69\x00\x00\x00\x00\x58\x4e\x58\x4f\x58\x50\x00\x00\x00\x00\x58\x57\x00\x00\x58\x56\x00\x00\x00\x00\x4b\x7d\x34\x37\x00\x00\x58\x54\x00\x00\x37\x45\x33\x34\x00\x00\x00\x00\x58\x51\x00\x00\x00\x00\x4e\x38\x58\x53\x30\x56\x58\x55\x00\x00\x58\x4c\x58\x52\x58\x59\x37\x44\x58\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5d\x00\x00", /* 6180 */ "\x00\x00\x00\x00\x4d\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x58\x5c\x00\x00\x00\x00\x58\x60\x00\x00\x00\x00\x00\x00\x41\x7e\x00\x00\x4e\x79\x58\x61\x00\x00\x00\x00\x58\x5e\x00\x00\x58\x5b\x00\x00\x00\x00\x58\x5a\x58\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x30\x00\x00\x00\x00\x46\x34\x00\x00\x37\x46\x00\x00\x58\x62\x58\x5d\x00\x00\x58\x63\x00\x00\x00\x00\x00\x00\x37\x7b\x00\x00\x00\x00\x00\x00\x32\x31\x00\x00\x00\x00\x00\x00\x58\x6b\x00\x00\x00\x00\x00\x00\x34\x38\x00\x00\x00\x00\x00\x00\x00\x00\x58\x69\x00\x00\x00\x00\x58\x6a\x3a\x29\x58\x68\x58\x66\x58\x65\x58\x6c\x58\x64\x58\x6e\x00\x00\x00\x00\x32\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x70\x00\x00\x00\x00\x58\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x28\x00\x00\x58\x73\x00\x00\x58\x71\x58\x67\x37\x7c\x00\x00\x58\x72\x00\x00\x58\x76\x58\x75\x58\x77\x58\x74", /* 6200 */ "\x58\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x79\x58\x7a\x4a\x6a\x00\x00\x58\x7c\x58\x7b\x3d\x3f\x00\x00\x40\x2e\x32\x66\x32\x7c\x00\x00\x58\x7d\x00\x00\x30\x3f\x00\x00\x00\x00\x00\x00\x40\x4c\x58\x7e\x00\x00\x6c\x43\x59\x21\x37\x61\x00\x00\x59\x22\x00\x00\x00\x00\x00\x00\x00\x00\x40\x6f\x00\x00\x00\x00\x00\x00\x59\x23\x00\x00\x00\x00\x00\x00\x59\x24\x35\x3a\x59\x25\x00\x00\x59\x26\x59\x27\x42\x57\x00\x00\x00\x00\x00\x00\x38\x4d\x00\x00\x00\x00\x4c\x61\x00\x00\x00\x00\x00\x00\x4b\x3c\x3d\x6a\x59\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x70\x6e\x3d\x48\x62\x00\x00\x3c\x6a\x00\x00\x3a\x4d\x59\x29\x00\x00\x00\x00\x00\x00\x00\x00\x42\x47\x00\x00\x4a\x27\x00\x00\x00\x00\x42\x71\x00\x00\x00\x00\x59\x2c\x00\x00\x00\x00\x59\x2a\x00\x00\x59\x2d\x00\x00\x00\x00\x59\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x59\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x31\x00\x00\x00\x00\x30\x37\x00\x00\x00\x00\x00\x00\x00\x00\x49\x5e\x00\x00\x00\x00\x48\x63\x00\x00\x00\x00\x59\x2f\x00\x00\x59\x32\x3e\x35", /* 6280 */ "\x35\x3b\x00\x00\x59\x30\x59\x37\x3e\x36\x00\x00\x00\x00\x00\x00\x00\x00\x59\x31\x47\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5e\x59\x33\x59\x34\x59\x38\x45\x6a\x59\x35\x39\x33\x40\x5e\x00\x00\x00\x00\x59\x46\x48\x34\x00\x00\x42\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x64\x5a\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x7a\x00\x00\x00\x00\x00\x00\x44\x71\x00\x00\x00\x00\x00\x00\x4b\x75\x00\x00\x59\x3b\x32\x21\x43\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x59\x44\x00\x00\x00\x00\x43\x34\x59\x3e\x59\x45\x59\x40\x59\x47\x59\x43\x00\x00\x59\x42\x47\x6f\x00\x00\x59\x3c\x32\x7d\x59\x3a\x35\x71\x42\x73\x59\x36\x00\x00\x00\x00\x59\x39\x39\x34\x40\x5b\x00\x00\x3e\x37\x59\x41\x47\x52\x00\x00\x00\x00\x35\x72\x33\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x67\x3f\x21\x59\x49\x59\x4e\x00\x00\x59\x4a\x00\x00\x37\x7d\x00\x00\x59\x4f\x3b\x22\x39\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x26\x59\x3d", /* 6300 */ "\x00\x00\x3b\x7d\x59\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x58\x59\x4d\x30\x44\x00\x00\x00\x00\x59\x48\x00\x00\x00\x00\x00\x00\x00\x00\x44\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x4b\x30\x27\x00\x00\x00\x00\x3a\x43\x00\x00\x00\x00\x00\x00\x3f\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x72\x00\x00\x00\x00\x48\x54\x59\x51\x41\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x2a\x00\x00\x00\x00\x3b\x2b\x59\x52\x00\x00\x59\x54\x59\x50\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x61\x00\x00\x44\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x41\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x7b\x3c\x4e\x59\x60\x00\x00\x59\x5f\x00\x00\x00\x00\x3f\x78\x00\x00\x00\x00\x00\x00\x37\x7e\x00\x00\x00\x00\x00\x00\x59\x59\x3e\x39\x00\x00\x00\x00\x46\x68\x47\x31\x00\x00\x00\x00\x00\x00\x00\x00", /* 6380 */ "\x59\x57\x00\x00\x00\x00\x41\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x78\x59\x5c\x00\x00\x00\x00\x3e\x38\x00\x00\x59\x56\x59\x5b\x00\x00\x00\x00\x47\x53\x00\x00\x00\x00\x00\x00\x59\x55\x00\x00\x37\x21\x00\x00\x00\x00\x33\x5d\x00\x00\x00\x00\x00\x00\x59\x5d\x4e\x2b\x3a\x4e\x43\x35\x59\x5a\x00\x00\x40\x5c\x00\x00\x39\x35\x3f\x64\x31\x66\x41\x3c\x59\x58\x35\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x47\x00\x00\x44\x4f\x59\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x5f\x00\x00\x00\x00\x59\x61\x00\x00\x59\x63\x00\x00\x00\x00\x42\x37\x59\x69\x00\x00\x59\x64\x00\x00\x00\x00\x59\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x41\x44\x73\x00\x00\x59\x67\x00\x00\x00\x00\x00\x00\x4d\x2c\x00\x00\x00\x00\x00\x00\x4d\x48\x34\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x2e\x00\x00\x59\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x62\x00\x00\x00\x00\x00\x00\x00\x00\x34\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x67\x00\x00\x59\x68\x00\x00\x00\x00\x00\x00\x4d\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6400 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x3b\x00\x00\x59\x73\x00\x00\x00\x00\x00\x00\x59\x6d\x00\x00\x00\x00\x59\x6a\x59\x71\x00\x00\x00\x00\x00\x00\x00\x00\x59\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x6e\x00\x00\x59\x72\x00\x00\x00\x00\x00\x00\x48\x42\x45\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x6b\x00\x00\x59\x6f\x00\x00\x00\x00\x00\x00\x37\x48\x00\x00\x00\x00\x00\x00\x3a\x71\x00\x00\x00\x00\x00\x00\x40\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x74\x00\x00\x4b\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x76\x00\x00\x4c\x4e\x00\x00\x40\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6480 */ "\x00\x00\x00\x00\x00\x00\x37\x62\x00\x00\x00\x00\x00\x00\x00\x00\x59\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x35\x59\x7a\x00\x00\x59\x79\x00\x00\x00\x00\x00\x00\x00\x00\x47\x32\x00\x00\x00\x00\x00\x00\x46\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x31\x59\x7b\x00\x00\x00\x00\x00\x00\x59\x7c\x00\x00\x49\x6f\x00\x00\x47\x45\x3b\x23\x00\x00\x40\x71\x00\x00\x4b\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x49\x00\x00\x5a\x25\x59\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4a\x5a\x27\x00\x00\x00\x00\x5a\x23\x00\x00\x5a\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x60\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x22\x00\x00\x59\x3f\x00\x00\x00\x00\x00\x00\x5a\x26\x00\x00\x5a\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x2b\x5a\x2c\x45\x27\x5a\x2e\x00\x00\x00\x00\x3b\x24\x5a\x29\x00\x00\x00\x00\x00\x00\x00\x00\x35\x3c\x00\x00\x00\x00\x5a\x2f\x00\x00\x5a\x28\x5a\x33\x00\x00\x5a\x32\x00\x00\x5a\x31\x00\x00\x00\x00\x00\x00\x5a\x34\x00\x00\x00\x00\x5a\x36\x3e\x71\x00\x00", /* 6500 */ "\x5a\x35\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x37\x00\x00\x00\x00\x00\x00\x5a\x38\x59\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x3b\x5a\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x78\x5a\x3c\x5a\x30\x00\x00\x00\x00\x3b\x59\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x3d\x5a\x3e\x5a\x40\x5a\x3f\x5a\x41\x32\x7e\x00\x00\x39\x36\x00\x00\x00\x00\x4a\x7c\x40\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x4e\x00\x00\x00\x00\x5a\x43\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x46\x00\x00\x49\x52\x00\x00\x35\x5f\x00\x00\x00\x00\x00\x00\x5a\x45\x5a\x44\x47\x54\x5a\x47\x36\x35\x00\x00\x00\x00\x00\x00\x5a\x49\x5a\x48\x00\x00\x00\x00\x00\x00\x34\x3a\x3b\x36\x00\x00\x00\x00\x46\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x49\x00\x00\x00\x00\x00\x00\x3f\x74\x00\x00\x5a\x4a\x00\x00\x40\x30\x45\x28\x00\x00\x49\x5f\x5a\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6580 */ "\x00\x00\x00\x00\x5a\x4c\x5a\x4d\x00\x00\x00\x00\x00\x00\x4a\x38\x55\x5d\x40\x46\x00\x00\x00\x00\x49\x4c\x00\x00\x3a\x58\x00\x00\x48\x65\x48\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x4d\x00\x00\x4e\x41\x00\x00\x5a\x4f\x3c\x50\x00\x00\x00\x00\x5a\x50\x00\x00\x30\x36\x00\x00\x00\x00\x36\x54\x40\x4d\x00\x00\x49\x60\x00\x00\x00\x00\x00\x00\x5a\x51\x3b\x42\x43\x47\x00\x00\x3b\x5b\x3f\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x52\x00\x00\x4a\x7d\x00\x00\x00\x00\x31\x77\x3b\x5c\x00\x00\x00\x00\x00\x00\x5a\x55\x00\x00\x5a\x53\x5a\x56\x4e\x39\x5a\x54\x00\x00\x00\x00\x00\x00\x00\x00\x40\x7b\x5a\x57\x00\x00\x00\x00\x42\x32\x00\x00\x00\x00\x5a\x58\x00\x00\x00\x00\x00\x00\x00\x00\x34\x7a\x00\x00\x5a\x5a\x00\x00\x5a\x59\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x5b\x5a\x5c\x34\x7b\x00\x00\x00\x00\x46\x7c\x43\x36\x35\x6c\x3b\x5d\x41\x61\x00\x00\x00\x00\x3d\x5c\x30\x30\x00\x00\x00\x00\x00\x00\x5a\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x22\x5a\x61\x00\x00\x00\x00\x00\x00\x00\x00", /* 6600 */ "\x00\x00\x00\x00\x39\x37\x5a\x60\x00\x00\x00\x00\x3a\x2b\x3e\x3a\x00\x00\x00\x00\x5a\x5f\x00\x00\x3e\x3b\x00\x00\x4c\x40\x3a\x2a\x00\x00\x00\x00\x00\x00\x30\x57\x40\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x66\x00\x00\x00\x00\x40\x31\x31\x47\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x55\x00\x00\x4b\x66\x3a\x72\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x3c\x00\x00\x40\x27\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x65\x5a\x63\x5a\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x6b\x00\x00\x00\x00\x5b\x26\x00\x00\x5a\x6a\x3b\x7e\x39\x38\x5a\x68\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x69\x00\x00\x3f\x38\x00\x00\x00\x00\x00\x00\x5a\x67\x00\x00\x00\x00\x3b\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x6c\x5a\x6b\x5a\x70\x00\x00\x00\x00\x5a\x71\x00\x00\x5a\x6d\x00\x00\x33\x22\x5a\x6e\x5a\x6f\x48\x55\x00\x00\x00\x00\x00\x00\x00\x00\x49\x61\x37\x4a\x5a\x72\x00\x00\x00\x00\x00\x00\x40\x32\x00\x00\x3e\x3d\x00\x00\x00\x00\x00\x00\x43\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6680 */ "\x00\x00\x36\x47\x00\x00\x5a\x73\x5a\x77\x00\x00\x00\x00\x32\x4b\x5a\x74\x5a\x76\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x75\x00\x00\x00\x00\x3d\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x43\x48\x30\x45\x5a\x78\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x79\x00\x00\x00\x00\x00\x00\x00\x00\x44\x2a\x00\x00\x00\x00\x00\x00\x4e\x71\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x43\x00\x00\x00\x00\x4a\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x3d\x00\x00\x00\x00\x00\x00\x5b\x22\x5a\x7b\x00\x00\x00\x00\x5a\x7e\x00\x00\x5a\x7d\x00\x00\x00\x00\x5a\x7a\x00\x00\x00\x00\x5b\x21\x00\x00\x00\x00\x46\x5e\x00\x00\x5a\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x23\x00\x00\x00\x00\x3d\x6c\x5b\x24\x00\x00\x4d\x4b\x47\x78\x00\x00\x00\x00\x5b\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x27\x00\x00\x00\x00\x5b\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x29\x00\x00\x36\x4a\x31\x48\x39\x39\x5b\x2a\x00\x00\x5b\x2b\x3d\x71\x41\x62\x00\x00\x00\x00\x52\x58\x41\x3e\x41\x3d\x42\x58", /* 6700 */ "\x3a\x47\x00\x00\x00\x00\x50\x72\x00\x00\x00\x00\x00\x00\x00\x00\x37\x6e\x4d\x2d\x00\x00\x4a\x7e\x00\x00\x49\x7e\x00\x00\x5b\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x73\x44\x3f\x5b\x2d\x4f\x2f\x00\x00\x00\x00\x00\x00\x4b\x3e\x00\x00\x44\x2b\x5b\x2e\x34\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x2f\x5b\x30\x4c\x5a\x00\x00\x4c\x24\x4b\x76\x4b\x5c\x3b\x25\x5b\x32\x00\x00\x00\x00\x3c\x6b\x00\x00\x00\x00\x4b\x51\x00\x00\x5b\x34\x5b\x37\x5b\x36\x00\x00\x34\x79\x00\x00\x00\x00\x35\x60\x00\x00\x5b\x33\x00\x00\x5b\x35\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x38\x00\x00\x00\x00\x3f\x79\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x7b\x30\x49\x3a\x60\x42\x3c\x00\x00\x3c\x5d\x00\x00\x00\x00\x3e\x73\x00\x00\x00\x00\x5b\x3b\x00\x00\x00\x00\x45\x4e\x00\x00\x5b\x39\x42\x2b\x5b\x3a\x3e\x72\x4c\x5d\x5b\x3c\x5b\x3d\x4d\x68\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x42\x00\x00\x00\x00\x39\x3a\x00\x00\x47\x55\x5b\x3f\x45\x6c\x5a\x5e\x5a\x62\x00\x00\x35\x4f\x00\x00\x47\x47\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x41\x00\x00\x3e\x3e\x48\x44", /* 6780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x47\x00\x00\x48\x7a\x00\x00\x5b\x3e\x00\x00\x5b\x44\x5b\x43\x00\x00\x00\x00\x00\x00\x40\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x6d\x00\x00\x4e\x53\x00\x00\x00\x00\x4b\x67\x00\x00\x32\x4c\x3b\x5e\x00\x00\x00\x00\x4f\x48\x5b\x46\x3f\x75\x00\x00\x00\x00\x00\x00\x5b\x45\x00\x00\x00\x00\x5b\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x4f\x00\x00\x00\x00\x00\x00\x5b\x4c\x5b\x4a\x00\x00\x32\x4d\x5b\x48\x5b\x4e\x5b\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x48\x00\x00\x00\x00\x4a\x41\x00\x00\x5b\x56\x00\x00\x00\x00\x00\x00\x49\x22\x00\x00\x00\x00\x00\x00\x5b\x55\x47\x70\x4b\x3f\x34\x3b\x00\x00\x40\x77\x3d\x40\x00\x00\x00\x00\x00\x00\x44\x53\x00\x00\x4d\x2e\x00\x00\x00\x00\x5b\x51\x5b\x50\x00\x00\x00\x00\x00\x00\x5b\x52\x00\x00\x5b\x4f\x00\x00\x00\x00\x5b\x57\x00\x00\x5b\x4d\x00\x00\x00\x00\x5b\x4b\x00\x00\x5b\x53\x5b\x49\x00\x00\x43\x6c\x00\x00\x4c\x78\x3c\x46\x3a\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x3a\x00\x00\x00\x00\x4b\x6f\x33\x41", /* 6800 */ "\x00\x00\x00\x00\x44\x4e\x46\x4a\x31\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x72\x00\x00\x00\x00\x40\x34\x37\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x59\x00\x00\x00\x00\x39\x3b\x33\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x5b\x33\x74\x5b\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x5e\x00\x00\x40\x73\x00\x00\x00\x00\x00\x00\x33\x4b\x3a\x2c\x00\x00\x00\x00\x33\x4a\x3a\x4f\x00\x00\x00\x00\x5b\x5c\x37\x65\x37\x4b\x45\x6d\x00\x00\x00\x00\x5b\x5a\x00\x00\x30\x46\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x5d\x5b\x5f\x00\x00\x36\x4d\x37\x2c\x00\x00\x34\x3c\x35\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x62\x00\x00\x00\x00\x3a\x79\x4b\x71\x00\x00\x3b\x37\x00\x00\x00\x00\x00\x00\x5b\x63\x00\x00\x00\x00\x00\x00\x49\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x6f\x00\x00\x32\x33\x5b\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x75\x5b\x65", /* 6880 */ "\x00\x00\x4e\x42\x00\x00\x5b\x6c\x00\x00\x47\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x74\x00\x00\x5b\x67\x00\x00\x00\x00\x00\x00\x30\x34\x5b\x69\x00\x00\x00\x00\x39\x3c\x00\x00\x00\x00\x00\x00\x5b\x6b\x00\x00\x5b\x6a\x00\x00\x5b\x66\x5b\x71\x00\x00\x3e\x3f\x00\x00\x00\x00\x00\x00\x54\x6d\x38\x68\x4d\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x68\x00\x00\x44\x74\x33\x23\x3a\x2d\x00\x00\x5b\x60\x00\x00\x5b\x70\x33\x61\x00\x00\x00\x00\x5b\x6e\x5b\x72\x00\x00\x45\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x7e\x00\x00\x5c\x32\x00\x00\x00\x00\x4c\x49\x5b\x77\x34\x7d\x00\x00\x5b\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x40\x00\x00\x5c\x21\x5c\x23\x00\x00\x5c\x27\x5b\x79\x00\x00\x43\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x45\x6f\x5c\x2b\x5b\x7c\x00\x00\x5c\x28\x00\x00\x00\x00\x00\x00\x5c\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x39\x5c\x2c\x00\x00\x00\x00\x40\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x2a\x34\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6900 */ "\x4f\x50\x5b\x76\x00\x00\x00\x00\x5c\x26\x30\x58\x00\x00\x00\x00\x5b\x78\x00\x00\x00\x00\x4c\x3a\x5b\x7d\x3f\x22\x44\x47\x5b\x73\x00\x00\x00\x00\x5c\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x7a\x5c\x2f\x33\x71\x38\x21\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x31\x5b\x7a\x5c\x30\x00\x00\x5c\x29\x5b\x7b\x00\x00\x5c\x2d\x00\x00\x5c\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x3f\x00\x00\x00\x00\x00\x00\x46\x4e\x00\x00\x5c\x24\x00\x00\x00\x00\x5c\x3b\x00\x00\x00\x00\x00\x00\x5c\x3d\x00\x00\x44\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x76\x5c\x38\x42\x4a\x00\x00\x00\x00\x00\x00\x5c\x3e\x41\x3f\x00\x00\x5c\x35\x5c\x42\x5c\x41\x00\x00\x46\x6f\x5c\x40\x46\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x44\x5c\x37\x00\x00\x36\x48\x5c\x3a\x3d\x5d\x00\x00\x00\x00\x00\x00\x47\x60\x5c\x3c\x36\x4b\x00\x00\x5c\x34\x5c\x36\x5c\x33\x00\x00\x00\x00\x4f\x30\x33\x5a\x5c\x39\x00\x00", /* 6980 */ "\x00\x00\x5c\x43\x33\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x67\x00\x00\x00\x00\x00\x00\x31\x5d\x00\x00\x00\x00\x5c\x54\x00\x00\x00\x00\x4f\x31\x5c\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x3a\x5c\x56\x00\x00\x00\x00\x00\x00\x5c\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x46\x00\x00\x00\x00\x5c\x63\x5c\x45\x00\x00\x5c\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x50\x00\x00\x00\x00\x5c\x4b\x5c\x48\x00\x00\x5c\x49\x00\x00\x5c\x51\x00\x00\x00\x00\x00\x00\x74\x22\x00\x00\x00\x00\x5c\x4e\x39\x3d\x44\x48\x41\x64\x5c\x4c\x00\x00\x5c\x47\x00\x00\x00\x00\x5c\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4d\x4b\x6a\x00\x00\x00\x00\x00\x00\x5c\x4f\x5c\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x61\x5c\x5a\x00\x00\x00\x00\x5c\x67\x00\x00\x5c\x65\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x5f\x00\x00\x44\x50\x00\x00\x41\x65\x00\x00\x5c\x5d", /* 6a00 */ "\x00\x00\x00\x00\x5c\x5b\x00\x00\x00\x00\x5c\x62\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x68\x48\x75\x5c\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x69\x5c\x6c\x5c\x66\x00\x00\x00\x00\x43\x74\x00\x00\x49\x38\x00\x00\x5c\x5c\x00\x00\x00\x00\x5c\x64\x3e\x40\x00\x00\x4c\x4f\x5c\x78\x5c\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x22\x32\x23\x33\x5f\x00\x00\x00\x00\x5c\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x41\x5c\x70\x00\x00\x5c\x77\x3c\x79\x33\x72\x00\x00\x00\x00\x43\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x6d\x00\x00\x00\x00\x5c\x72\x5c\x76\x00\x00\x00\x00\x36\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x4c\x5c\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x21\x00\x00\x46\x4b\x5c\x73\x00\x00\x00\x00\x00\x00\x5c\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x60", /* 6a80 */ "\x43\x49\x00\x00\x00\x00\x00\x00\x5c\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x7a\x38\x69\x00\x00\x5c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x21\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x58\x00\x00\x00\x00\x00\x00\x5c\x7b\x00\x00\x5c\x7d\x5c\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x2c\x00\x00\x5d\x28\x00\x00\x5b\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x27\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x26\x00\x00\x00\x00\x5d\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x6a\x5d\x25\x5d\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x2a\x00\x00\x4f\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x2d\x36\x7b\x00\x00\x00\x00\x5d\x29\x5d\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x27\x00\x00\x5d\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x32\x5d\x2f\x00\x00\x00\x00\x00\x00\x00\x00", /* 6b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x73\x5d\x30\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x33\x00\x00\x00\x00\x00\x00\x5d\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x35\x00\x00\x5d\x36\x37\x67\x3c\x21\x00\x00\x36\x55\x00\x00\x00\x00\x00\x00\x32\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x38\x5d\x37\x5d\x3a\x35\x3d\x00\x00\x00\x00\x36\x56\x34\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x3d\x00\x00\x00\x00\x00\x00\x5d\x3c\x00\x00\x5d\x3e\x00\x00\x00\x00\x32\x4e\x00\x00\x43\x37\x00\x00\x5d\x3f\x00\x00\x00\x00\x34\x3f\x5d\x41\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x40\x00\x00\x5d\x42\x00\x00\x00\x00\x00\x00\x5d\x43\x00\x00\x5d\x44\x3b\x5f\x40\x35\x3a\x21\x00\x00\x49\x70\x00\x00\x00\x00\x4a\x62\x4f\x44\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x75\x00\x00\x00\x00\x00\x00\x3a\x50\x4e\x72\x00\x00\x00\x00\x00\x00\x5d\x45\x5d\x46\x00\x00\x3b\x60\x00\x00\x00\x00\x00\x00\x5d\x47", /* 6b80 */ "\x5d\x48\x00\x00\x00\x00\x5d\x4a\x5d\x49\x00\x00\x4b\x58\x00\x00\x00\x00\x3d\x5e\x3c\x6c\x3b\x44\x00\x00\x5d\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x4d\x3f\x23\x00\x00\x5d\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x50\x5d\x51\x00\x00\x00\x00\x00\x00\x5d\x52\x00\x00\x5d\x54\x5d\x53\x5d\x55\x32\x25\x43\x4a\x00\x00\x5d\x56\x00\x00\x00\x00\x3b\x26\x33\x4c\x5d\x57\x00\x00\x00\x00\x45\x42\x54\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x35\x23\x5d\x58\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x59\x00\x00\x4a\x6c\x4b\x68\x00\x00\x00\x00\x00\x00\x46\x47\x5d\x5a\x48\x66\x00\x00\x00\x00\x00\x00\x48\x7b\x00\x00\x00\x00\x4c\x53\x00\x00\x00\x00\x00\x00\x5d\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x5d\x5d\x5c\x00\x00\x00\x00\x5d\x5f\x00\x00\x00\x00\x00\x00\x5d\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x61\x00\x00\x4c\x31\x00\x00\x5d\x62\x5d\x63\x00\x00\x00\x00\x35\x24\x00\x00\x00\x00\x00\x00\x5d\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x66\x5d\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x65\x00\x00\x00\x00\x49\x39\x31\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x45\x00\x00\x44\x75\x3d\x41\x35\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x46\x00\x00\x3c\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x68\x00\x00\x34\x40\x00\x00\x00\x00\x31\x78\x00\x00\x00\x00\x46\x72\x5d\x67\x39\x3e\x43\x53\x00\x00\x5d\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x71\x00\x00\x5d\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x41\x00\x00\x35\x62\x5d\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x68\x00\x00\x00\x00\x35\x25\x5d\x70\x00\x00", /* 6c80 */ "\x00\x00\x5d\x6e\x5d\x6b\x4d\x60\x00\x00\x00\x00\x00\x00\x00\x00\x44\x40\x00\x00\x00\x00\x00\x00\x46\x59\x5d\x6c\x00\x00\x00\x00\x5d\x74\x00\x00\x5d\x73\x37\x23\x00\x00\x00\x00\x32\x2d\x00\x00\x00\x00\x3a\x3b\x5d\x6d\x5d\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x57\x42\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x77\x00\x00\x00\x00\x5d\x7c\x00\x00\x00\x00\x5d\x7d\x00\x00\x32\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x28\x4c\x7d\x5e\x21\x3c\x23\x3e\x42\x5d\x78\x5d\x7e\x31\x68\x00\x00\x36\x37\x00\x00\x00\x00\x5d\x75\x5d\x7a\x00\x00\x00\x00\x00\x00\x40\x74\x47\x71\x00\x00\x48\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x77\x00\x00\x4b\x21\x00\x00\x5d\x79\x00\x00\x5e\x24\x00\x00\x5e\x22\x00\x00\x5d\x7b\x00\x00\x00\x00\x00\x00\x4b\x22\x47\x48\x35\x63\x00\x00\x45\x25\x00\x00\x00\x00\x43\x6d\x00\x00\x5e\x25\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x23\x42\x59\x5d\x76\x00\x00\x31\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x4e\x5e\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x40\x76\x00\x00\x5e\x2c\x00\x00\x4d\x6c\x00\x00\x00\x00\x46\x36\x5e\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x45\x00\x00\x00\x00\x00\x00\x31\x4c\x39\x3f\x5e\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x27\x5e\x2e\x00\x00\x5e\x2d\x5e\x28\x00\x00\x5e\x2b\x00\x00\x00\x00\x33\x68\x00\x00\x5e\x2a\x47\x49\x00\x00\x00\x00\x4e\x2e\x00\x00\x00\x00\x3e\x74\x40\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x36\x5e\x34\x00\x00\x49\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x31\x5e\x33\x00\x00\x31\x3a\x00\x00\x00\x00\x39\x40\x4f\x32\x00\x00\x33\x3d\x00\x00\x49\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x61\x00\x00\x00\x00\x33\x24\x3f\x3b\x5e\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 6d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x3a\x00\x00\x00\x00\x3e\x43\x00\x00\x00\x00\x00\x00\x4d\x30\x00\x00\x5e\x37\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x32\x00\x00\x5e\x38\x00\x00\x00\x00\x00\x00\x4e\x5e\x00\x00\x45\x73\x46\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x36\x00\x00\x00\x00\x31\x55\x00\x00\x00\x00\x5e\x3e\x00\x00\x00\x00\x5e\x41\x00\x00\x00\x00\x00\x00\x4e\x43\x00\x00\x00\x00\x00\x00\x4d\x64\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x48\x5e\x42\x5e\x3f\x00\x00\x00\x00\x00\x00\x4e\x54\x5e\x45\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x4a\x5e\x47\x00\x00\x00\x00\x5e\x4c\x00\x00\x00\x00\x45\x71\x5e\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x44\x00\x00\x00\x00\x43\x38\x00\x00\x00\x00\x5e\x4b\x00\x00\x5e\x40\x00\x00\x5e\x46\x00\x00\x5e\x4d\x30\x7c\x5e\x43\x00\x00\x5e\x4e\x00\x00\x00\x00\x3f\x3c\x00\x00\x3d\x5f\x00\x00\x4a\x25\x00\x00\x3a\x2e\x00\x00\x5e\x3b\x5e\x49\x45\x3a\x00\x00\x00\x00\x00\x00\x00\x00", /* 6e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x36\x00\x00\x33\x69\x3a\x51\x3e\x44\x5e\x3d\x3d\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x4c\x00\x00\x5e\x3c\x00\x00\x00\x00\x00\x00\x5e\x52\x3d\x6d\x38\x3a\x00\x00\x5e\x61\x00\x00\x5e\x5b\x35\x74\x45\x4f\x00\x00\x5e\x56\x5e\x5f\x30\x2f\x31\x32\x00\x00\x00\x00\x32\x39\x00\x00\x5e\x58\x42\x2c\x5e\x4f\x5e\x51\x39\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x62\x00\x00\x5e\x5d\x00\x00\x00\x00\x00\x00\x5e\x55\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x2b\x00\x00\x00\x00\x5e\x5a\x5e\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x50\x00\x00\x3e\x45\x00\x00\x00\x00\x43\x39\x00\x00\x00\x00\x00\x00\x5e\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x2f\x00\x00\x00\x00\x00\x00\x5e\x57\x00\x00\x00\x00\x5e\x50\x45\x72\x00\x00\x00\x00\x5e\x53\x00\x00\x00\x00\x00\x00\x5e\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x51\x3c\x3e", /* 6e80 */ "\x4b\x7e\x00\x00\x5e\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x2e\x00\x00\x00\x00\x5e\x6f\x38\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x60\x00\x00\x5e\x65\x00\x00\x00\x00\x00\x00\x4e\x2f\x39\x42\x00\x00\x5e\x72\x00\x00\x00\x00\x30\x6e\x00\x00\x00\x00\x5e\x70\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x64\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x6a\x00\x00\x00\x00\x5e\x6c\x00\x00\x00\x00\x00\x00\x4d\x4f\x5e\x67\x00\x00\x00\x00\x45\x2e\x00\x00\x00\x00\x5e\x69\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x71\x00\x00\x5e\x6b\x4c\x47\x00\x00\x00\x00\x00\x00\x5e\x66\x00\x00\x3c\x22\x5e\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x33\x6a\x00\x00\x5e\x68\x5e\x6d\x5e\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x6c\x42\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x76\x00\x00\x00\x00\x5e\x7c\x00\x00\x00\x00\x5e\x7a\x00\x00\x45\x29\x00\x00\x00\x00\x5f\x23\x5e\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x78\x5e\x60", /* 6f00 */ "\x00\x00\x35\x79\x49\x3a\x00\x00\x00\x00\x00\x00\x3c\x3f\x00\x00\x00\x00\x39\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x33\x00\x00\x5e\x74\x00\x00\x5f\x22\x31\x69\x41\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x79\x00\x00\x34\x41\x4e\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x21\x44\x52\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x7b\x5e\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x21\x5e\x79\x00\x00\x5e\x73\x00\x00\x00\x00\x00\x00\x34\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x69\x00\x00\x00\x00\x00\x00\x5f\x2f\x00\x00\x00\x00\x5f\x2a\x40\x78\x00\x00\x00\x00\x33\x63\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x61\x00\x00\x5f\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x2c\x44\x2c\x5f\x29\x44\x59\x00\x00\x00\x00\x00\x00\x5f\x4c\x00\x00\x00\x00\x00\x00\x5f\x26\x00\x00\x5f\x25\x00\x00\x5f\x2e\x00\x00\x00\x00\x00\x00", /* 6f80 */ "\x5f\x28\x5f\x27\x5f\x2d\x00\x00\x40\x21\x00\x00\x5f\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x30\x00\x00\x00\x00\x5f\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x36\x00\x00\x5f\x35\x5f\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x43\x00\x00\x5f\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x63\x42\x79\x5f\x32\x47\x3b\x00\x00\x00\x00\x5f\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x3e\x5f\x3c\x00\x00\x00\x00\x5f\x3f\x00\x00\x00\x00\x5f\x42\x00\x00\x00\x00\x00\x00\x5f\x3b\x39\x6a\x47\x28\x00\x00\x00\x00\x5e\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x74\x5f\x3d\x00\x00\x5f\x41\x42\x75\x00\x00\x5f\x40\x00\x00\x5f\x2b\x00\x00\x00\x00\x6f\x69\x00\x00\x00\x00\x00\x00\x5f\x45\x00\x00\x00\x00\x00\x00\x5f\x49\x00\x00", /* 7000 */ "\x00\x00\x5f\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x43\x00\x00\x5f\x44\x00\x00\x00\x00\x00\x00\x5f\x48\x00\x00\x5f\x46\x00\x00\x00\x00\x00\x00\x49\x4e\x00\x00\x00\x00\x5f\x4e\x00\x00\x5f\x4b\x5f\x4a\x00\x00\x5f\x4d\x46\x54\x5f\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x75\x42\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x40\x25\x00\x00\x00\x00\x00\x00\x5f\x50\x00\x00\x5f\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x75\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x50\x00\x00\x00\x00\x00\x00\x45\x74\x33\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x64\x00\x00\x00\x00\x00\x00\x3c\x5e\x3a\x52\x00\x00\x00\x00", /* 7080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x27\x3f\x66\x00\x00\x00\x00\x00\x00\x31\x6a\x00\x00\x00\x00\x00\x00\x5f\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x59\x43\x3a\x5f\x5c\x5f\x57\x00\x00\x00\x00\x00\x00\x5f\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x5a\x45\x40\x30\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x75\x00\x00\x00\x00\x5f\x5e\x00\x00\x00\x00\x00\x00\x31\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x60\x00\x00\x00\x00\x00\x00\x5f\x5f\x00\x00\x5f\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x23\x00\x00\x00\x00\x00\x00\x5f\x62\x00\x00\x00\x00", /* 7100 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x64\x4a\x32\x00\x00\x5f\x63\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x35\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x7b\x00\x00\x00\x00\x5f\x6a\x00\x00\x40\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x66\x5f\x6b\x00\x00\x00\x00\x31\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x69\x00\x00\x47\x61\x5f\x65\x5f\x68\x3e\x48\x00\x00\x48\x51\x00\x00\x00\x00\x5f\x6c\x00\x00\x3c\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x7a\x00\x00\x00\x00", /* 7180 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x6f\x00\x00\x00\x00\x00\x00\x5f\x67\x00\x00\x37\x27\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x50\x5f\x70\x00\x00\x00\x00\x00\x00\x74\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x71\x00\x00\x00\x00\x00\x00\x5f\x72\x00\x00\x00\x00\x00\x00\x00\x00\x47\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x74\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x75\x00\x00\x00\x00\x00\x00\x00\x00\x47\x33\x00\x00\x00\x00\x00\x00\x00\x00\x45\x75\x5f\x77\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x79\x00\x00\x4e\x55\x00\x00\x5f\x76\x00\x00\x5f\x78\x31\x6d\x00\x00\x5f\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x5b\x5f\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x41\x67\x3b\x38\x5f\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7b\x3f\x24\x52\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x7d\x00\x00\x00\x00\x00\x00\x60\x21\x00\x00\x5f\x6e\x5f\x7e\x00\x00\x00\x00\x60\x22", /* 7200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x23\x00\x00\x00\x00\x60\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x26\x00\x00\x44\x5e\x00\x00\x60\x28\x60\x27\x00\x00\x00\x00\x60\x29\x00\x00\x60\x2a\x00\x00\x00\x00\x3c\x5f\x49\x63\x00\x00\x00\x00\x00\x00\x4c\x6c\x60\x2b\x60\x2c\x41\x56\x3c\x24\x60\x2d\x60\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x2f\x4a\x52\x48\x47\x00\x00\x00\x00\x60\x30\x47\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x31\x32\x67\x00\x00\x35\x6d\x00\x00\x4c\x46\x00\x00\x4c\x36\x00\x00\x32\x34\x4f\x34\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x52\x00\x00\x4a\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x37\x00\x00\x60\x32\x00\x00\x00\x00\x00\x00\x00\x00\x46\x43\x00\x00\x00\x00\x00\x00\x38\x23\x60\x33\x00\x00", /* 7280 */ "\x3a\x54\x60\x35\x60\x34\x00\x00\x00\x00\x00\x00\x00\x00\x60\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x37\x00\x00\x00\x00\x00\x00\x60\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x3e\x00\x00\x60\x39\x00\x00\x00\x00\x00\x00\x00\x00\x60\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x38\x24\x00\x00\x00\x00\x48\x48\x00\x00\x00\x00\x60\x3c\x00\x00\x00\x00\x00\x00\x3e\x75\x00\x00\x00\x00\x60\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x38\x60\x3d\x60\x3f\x00\x00\x60\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x40\x00\x00\x38\x51\x00\x00\x60\x41\x00\x00\x00\x00\x00\x00\x00\x00\x36\x69\x00\x00\x41\x40\x00\x00\x39\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x60\x43\x60\x44\x60\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x6d\x00\x00\x00\x00\x46\x48\x36\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x46\x43\x2c\x60\x45\x00\x00\x00\x00\x4f\x35\x47\x62\x00\x00\x00\x00", /* 7300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x4b\x60\x48\x00\x00\x00\x00\x00\x00\x4c\x54\x60\x4a\x60\x4c\x00\x00\x4e\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x50\x00\x00\x00\x00\x00\x00\x60\x4f\x43\x76\x47\x2d\x00\x00\x00\x00\x38\x25\x60\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x60\x4d\x00\x00\x4d\x31\x4d\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x51\x31\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x39\x76\x3b\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x52\x60\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x43\x00\x00\x00\x00\x00\x00\x00\x00\x60\x57\x00\x00\x60\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x58\x00\x00\x33\x4d\x00\x00\x00\x00\x60\x5a\x00\x00\x00\x00\x60\x59\x00\x00\x60\x5c\x60\x5b\x00\x00\x00\x00\x00\x00\x00\x00", /* 7380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x38\x3c\x00\x00\x00\x00\x4e\x28\x00\x00\x36\x4c\x00\x00\x32\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x68\x60\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x60\x61\x00\x00\x32\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x5d\x00\x00\x3b\x39\x00\x00\x00\x00\x44\x41\x60\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x64\x00\x00\x3c\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x60\x62\x00\x00\x00\x00\x00\x00\x00\x00\x37\x3e\x00\x00\x00\x00\x48\x49\x60\x63\x00\x00\x00\x00\x60\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x3d\x00\x00", /* 7400 */ "\x00\x00\x00\x00\x00\x00\x35\x65\x00\x00\x60\x66\x4d\x7d\x00\x00\x00\x00\x4e\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x76\x00\x00\x00\x00\x60\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6a\x4e\x56\x36\x57\x48\x7c\x47\x4a\x00\x00\x00\x00\x00\x00\x60\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6d\x00\x00\x60\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x6c\x00\x00\x00\x00\x00\x00\x60\x6f\x38\x6a\x31\x4d\x60\x71\x00\x00\x3f\x70\x60\x6e\x4e\x5c\x00\x00\x00\x00\x60\x74\x74\x24\x00\x00\x00\x00\x00\x00\x00\x00\x60\x72\x60\x75\x00\x00\x00\x00\x00\x00\x00\x00\x60\x67\x60\x73\x00\x00\x00\x00\x3a\x3c\x00\x00\x00\x00\x60\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x77\x00\x00", /* 7480 */ "\x00\x00\x00\x00\x00\x00\x4d\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x79\x00\x00\x00\x00\x00\x00\x60\x65\x00\x00\x00\x00\x00\x00\x00\x00\x60\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x60\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x60\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x3b\x00\x00\x00\x00\x00\x00\x61\x21\x00\x00\x49\x3b\x61\x22\x00\x00\x00\x00\x34\x24\x61\x23\x00\x00\x61\x24\x00\x00\x00\x00\x00\x00\x00\x00\x61\x25\x00\x00\x61\x27\x61\x28\x61\x26\x00\x00\x00\x00\x00\x00\x49\x53\x61\x2a\x61\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7500 */ "\x00\x00\x00\x00\x00\x00\x61\x2c\x61\x2b\x61\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x2e\x61\x30\x61\x2f\x00\x00\x00\x00\x39\x79\x00\x00\x61\x32\x00\x00\x61\x31\x00\x00\x00\x00\x34\x45\x00\x00\x3f\x53\x00\x00\x45\x3c\x00\x00\x61\x33\x40\x38\x00\x00\x00\x00\x00\x00\x3b\x3a\x00\x00\x31\x79\x61\x34\x00\x00\x4d\x51\x00\x00\x00\x00\x4a\x63\x61\x35\x00\x00\x00\x00\x00\x00\x45\x44\x4d\x33\x39\x43\x3f\x3d\x00\x00\x00\x00\x00\x00\x43\x4b\x52\x34\x00\x00\x44\x2e\x32\x68\x61\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x37\x00\x00\x61\x3c\x00\x00\x00\x00\x61\x3a\x61\x39\x5a\x42\x33\x26\x61\x38\x00\x00\x30\x5a\x00\x00\x48\x2a\x00\x00\x00\x00\x48\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x31\x61\x3d\x61\x3b\x43\x5c\x40\x26\x00\x00\x00\x00\x48\x2b\x00\x00\x49\x2d\x00\x00\x61\x3f\x4e\x2c\x37\x4d\x61\x40\x00\x00\x61\x3e\x48\x56\x61\x41\x00\x00\x61\x42\x00\x00\x00\x00\x30\x5b\x00\x00\x00\x00\x3e\x76\x61\x47\x00\x00\x61\x44\x46\x6d\x61\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x26", /* 7580 */ "\x00\x00\x00\x00\x61\x4a\x00\x00\x00\x00\x00\x00\x61\x45\x61\x46\x00\x00\x61\x49\x61\x48\x49\x25\x00\x00\x00\x00\x41\x42\x41\x41\x00\x00\x35\x3f\x00\x00\x00\x00\x61\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x4c\x00\x00\x00\x00\x61\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x4f\x00\x00\x61\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x57\x48\x68\x61\x51\x00\x00\x61\x53\x00\x00\x00\x00\x61\x55\x3f\x3e\x00\x00\x00\x00\x61\x56\x61\x54\x3c\x40\x00\x00\x00\x00\x00\x00\x61\x50\x61\x52\x00\x00\x49\x42\x00\x00\x3e\x49\x00\x00\x00\x00\x61\x59\x00\x00\x00\x00\x61\x58\x00\x00\x00\x00\x00\x00\x00\x00\x61\x5a\x00\x00\x3c\x26\x3a\x2f\x00\x00\x00\x00\x45\x77\x61\x5b\x00\x00\x44\x4b\x00\x00\x00\x00\x61\x5d\x00\x00\x00\x00\x00\x00\x4e\x21\x61\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x62\x00\x00\x61\x64\x61\x65\x43\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x63\x00\x00\x61\x60\x00\x00\x61\x5e\x61\x5f", /* 7600 */ "\x00\x00\x61\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x68\x00\x00\x61\x66\x00\x00\x61\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x69\x61\x6b\x61\x6c\x61\x6d\x00\x00\x61\x6e\x00\x00\x00\x00\x61\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x70\x00\x00\x00\x00\x00\x00\x61\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x45\x00\x00\x00\x00\x00\x00\x61\x74\x61\x72\x61\x73\x00\x00\x00\x00\x00\x00\x34\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x7e\x00\x00\x00\x00\x00\x00\x4a\x4a\x00\x00\x61\x76\x00\x00\x00\x00\x00\x00\x61\x75\x00\x00\x00\x00\x00\x00\x00\x00\x61\x77\x61\x78\x00\x00\x00\x00\x00\x00\x00\x00\x61\x7c\x61\x79\x61\x7a\x61\x7b\x00\x00\x61\x7d\x00\x00\x00\x00\x00\x00\x61\x7e\x00\x00\x62\x21\x00\x00\x00\x00\x00\x00\x62\x22\x00\x00\x62\x23\x00\x00\x48\x2f\x45\x50\x62\x24\x47\x72\x49\x34\x00\x00", /* 7680 */ "\x62\x25\x00\x00\x00\x00\x62\x26\x45\x2a\x00\x00\x33\x27\x39\x44\x62\x27\x00\x00\x00\x00\x62\x28\x00\x00\x00\x00\x62\x29\x00\x00\x3b\x29\x00\x00\x00\x00\x62\x2b\x00\x00\x00\x00\x62\x2a\x00\x00\x00\x00\x62\x2c\x62\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x69\x00\x00\x62\x2e\x00\x00\x00\x00\x00\x00\x62\x2f\x00\x00\x00\x00\x73\x69\x62\x30\x62\x31\x62\x32\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x2e\x00\x00\x00\x00\x62\x33\x47\x56\x00\x00\x00\x00\x4b\x5f\x00\x00\x31\x4e\x00\x00\x31\x57\x00\x00\x00\x00\x62\x34\x00\x00\x00\x00\x00\x00\x00\x00\x62\x36\x00\x00\x00\x00\x00\x00\x62\x35\x45\x70\x00\x00\x00\x00\x00\x00\x40\x39\x5d\x39\x00\x00\x62\x37\x4c\x41\x00\x00\x62\x38\x00\x00\x34\x46\x48\x57\x62\x39\x00\x00\x62\x3a\x00\x00\x00\x00\x62\x3b\x00\x00\x00\x00\x00\x00\x4c\x5c\x00\x00\x00\x00\x00\x00\x4c\x55\x00\x00\x44\x3e\x00\x00\x00\x00\x00\x00\x41\x6a\x00\x00\x00\x00\x62\x3d\x00\x00\x00\x00\x3d\x62\x00\x00", /* 7700 */ "\x00\x00\x3e\x4a\x00\x00\x00\x00\x62\x40\x00\x00\x00\x00\x62\x3f\x62\x3e\x48\x7d\x00\x00\x34\x47\x38\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x46\x00\x00\x00\x00\x62\x43\x3f\x3f\x4c\x32\x00\x00\x00\x00\x00\x00\x62\x42\x62\x44\x62\x45\x00\x00\x00\x00\x62\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x47\x62\x48\x00\x00\x44\x2f\x00\x00\x34\x63\x00\x00\x00\x00\x00\x00\x43\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x4a\x62\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x67\x00\x00\x46\x44\x00\x00\x62\x4e\x4b\x53\x00\x00\x62\x4b\x00\x00\x00\x00\x62\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x51\x00\x00\x00\x00\x00\x00\x00\x00\x62\x50\x62\x4f", /* 7780 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x53\x00\x00\x00\x00\x62\x52\x00\x00\x00\x00\x62\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x56\x00\x00\x62\x55\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x56\x4e\x46\x00\x00\x00\x00\x62\x57\x00\x00\x00\x00\x46\x37\x00\x00\x00\x00\x62\x58\x00\x00\x00\x00\x62\x59\x00\x00\x62\x5d\x62\x5b\x62\x5c\x00\x00\x62\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x60\x00\x00\x00\x00\x62\x61\x4c\x37\x62\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x70\x62\x63\x00\x00\x43\x4e\x00\x00\x47\x6a\x00\x00\x36\x6b\x00\x00\x00\x00\x00\x00\x43\x3b\x62\x64\x36\x3a\x00\x00\x00\x00\x00\x00\x40\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x65\x00\x00\x00\x00\x00\x00", /* 7800 */ "\x00\x00\x00\x00\x3a\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x67\x00\x00\x38\x26\x3a\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x69\x00\x00\x00\x00\x00\x00\x00\x00\x45\x56\x3a\x56\x35\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x24\x00\x00\x47\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x57\x00\x00\x00\x00\x00\x00\x00\x00\x39\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x32\x39\x45\x00\x00\x00\x00\x38\x27\x00\x00\x00\x00\x48\x23\x00\x00\x62\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x6f\x00\x00\x00\x00\x00\x00", /* 7880 */ "\x00\x00\x38\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x62\x6e\x44\x76\x00\x00\x00\x00\x00\x00\x00\x00\x62\x71\x33\x37\x62\x6c\x00\x00\x00\x00\x48\x6a\x00\x00\x31\x30\x00\x00\x3a\x6c\x00\x00\x4f\x52\x00\x00\x00\x00\x62\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x72\x00\x00\x00\x00\x00\x00\x4a\x4b\x00\x00\x40\x59\x62\x74\x00\x00\x00\x00\x00\x00\x00\x00\x62\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x73\x00\x00\x00\x00\x00\x00\x00\x00\x33\x4e\x00\x00\x62\x7b\x00\x00\x62\x7a\x00\x00\x00\x00\x3c\x27\x00\x00\x00\x00\x00\x00\x62\x7c\x62\x77\x00\x00\x00\x00\x00\x00\x62\x7d\x62\x78\x00\x00\x00\x00\x00\x00\x00\x00\x48\x58\x62\x76\x00\x00\x00\x00\x62\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x21\x4b\x61\x00\x00\x00\x00\x00\x00\x62\x7e\x00\x00\x00\x00\x30\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x63\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x23\x00\x00\x00\x00", /* 7900 */ "\x00\x00\x3e\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x43\x00\x00\x00\x00\x63\x27\x63\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x68\x00\x00\x00\x00\x00\x00\x62\x6a\x63\x2a\x63\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x28\x00\x00\x4e\x69\x00\x00\x3c\x52\x00\x00\x63\x2b\x37\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x40\x35\x27\x3b\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x34\x00\x00\x00\x00\x63\x31\x00\x00\x63\x30\x41\x44\x63\x2d\x00\x00\x00\x00\x63\x2f\x00\x00\x00\x00\x3d\x4b\x3f\x40\x63\x2e\x63\x2c\x00\x00\x47\x2a\x00\x00\x00\x00\x3e\x4d\x00\x00\x00\x00\x49\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x78\x00\x00\x00\x00\x63\x32\x00\x00\x00\x00\x00\x00\x00\x00\x63\x33", /* 7980 */ "\x63\x49\x36\x58\x00\x00\x00\x00\x4f\x3d\x41\x35\x00\x00\x00\x00\x00\x00\x00\x00\x63\x34\x00\x00\x00\x00\x32\x52\x44\x77\x4a\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x7a\x63\x36\x00\x00\x00\x00\x63\x38\x00\x00\x00\x00\x00\x00\x63\x39\x00\x00\x47\x29\x00\x00\x00\x00\x63\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x3b\x63\x3c\x00\x00\x00\x00\x36\x59\x32\x53\x46\x45\x3d\x28\x3b\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x3d\x00\x00\x3d\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x4a\x49\x43\x00\x00\x00\x00\x63\x3e\x00\x00\x00\x00\x48\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x45\x00\x00\x63\x41\x00\x00\x63\x42\x47\x69\x00\x00\x3f\x41\x63\x3f\x00\x00\x43\x61\x00\x00\x00\x00\x63\x40\x00\x00\x00\x00\x00\x00\x3e\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x5c\x00\x00\x00\x00\x00\x00\x00\x00", /* 7a00 */ "\x35\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x43\x00\x00\x00\x00\x44\x78\x00\x00\x63\x44\x40\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x2d\x00\x00\x00\x00\x49\x23\x63\x45\x63\x46\x43\x55\x00\x00\x4e\x47\x00\x00\x00\x00\x63\x48\x63\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x6f\x00\x00\x00\x00\x63\x4a\x30\x70\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4d\x00\x00\x00\x00\x00\x00\x63\x4b\x32\x54\x37\x4e\x63\x4c\x39\x46\x39\x72\x00\x00\x4a\x66\x63\x4e\x00\x00\x00\x00\x4b\x54\x00\x00\x00\x00\x63\x50\x00\x00\x00\x00\x00\x00\x40\x51\x31\x4f\x32\x3a\x30\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x51\x63\x52\x3e\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x53\x00\x00\x33\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x63\x55\x00\x00\x00\x00\x00\x00\x37\x6a\x00\x00\x35\x66\x00\x00\x00\x00\x63\x56\x36\x75\x00\x00\x00\x00\x63\x57\x00\x00\x40\x7c", /* 7a80 */ "\x00\x00\x46\x4d\x00\x00\x40\x60\x3a\x75\x00\x00\x00\x00\x00\x00\x63\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x62\x41\x6b\x00\x00\x63\x5a\x63\x5c\x63\x59\x63\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x5d\x37\x26\x00\x00\x00\x00\x00\x00\x35\x67\x4d\x52\x63\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x60\x00\x00\x00\x00\x00\x00\x31\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x63\x63\x00\x00\x00\x00\x00\x00\x33\x76\x63\x62\x63\x61\x00\x00\x63\x65\x63\x5e\x00\x00\x63\x66\x4e\x29\x00\x00\x63\x67\x00\x00\x63\x68\x00\x00\x00\x00\x54\x74\x63\x6a\x00\x00\x63\x69\x00\x00\x00\x00\x00\x00\x63\x6b\x63\x6c\x00\x00\x4e\x35\x63\x6d\x00\x00\x70\x6f\x3e\x4f\x63\x6e\x63\x6f\x3d\x57\x00\x00\x46\x38\x63\x70\x00\x00\x00\x00\x00\x00\x43\x28\x00\x00\x00\x00\x63\x71\x00\x00\x43\x3c\x63\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x25\x00\x00\x51\x3f\x43\x5d\x3c\x33\x00\x00\x00\x00\x00\x00\x00\x00\x34\x48", /* 7b00 */ "\x00\x00\x00\x00\x63\x73\x00\x00\x64\x22\x00\x00\x63\x76\x00\x00\x35\x68\x00\x00\x63\x75\x64\x24\x00\x00\x00\x00\x00\x00\x63\x74\x00\x00\x3e\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x78\x63\x79\x00\x00\x45\x2b\x00\x00\x00\x00\x63\x7a\x00\x00\x33\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x5a\x49\x64\x00\x00\x63\x7c\x00\x00\x00\x00\x00\x00\x42\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x77\x00\x00\x63\x7b\x63\x7d\x00\x00\x00\x00\x3a\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x26\x49\x2e\x00\x00\x48\x26\x45\x79\x00\x00\x36\x5a\x64\x25\x64\x23\x00\x00\x48\x35\x63\x7e\x43\x5e\x45\x7b\x00\x00\x45\x7a\x00\x00\x3a\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x28\x00\x00\x64\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x64\x2d\x00\x00\x64\x2e\x00\x00\x64\x2b\x64\x2c\x00\x00\x00\x00\x64\x29\x64\x27\x00\x00\x00\x00\x00\x00\x00\x00\x64\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7b80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x4f\x32\x55\x00\x00\x00\x00\x00\x00\x64\x35\x00\x00\x64\x32\x00\x00\x64\x37\x00\x00\x00\x00\x64\x36\x00\x00\x47\x73\x4c\x27\x00\x00\x3b\x3b\x64\x30\x64\x39\x64\x34\x00\x00\x64\x33\x64\x2f\x00\x00\x64\x31\x00\x00\x34\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x3d\x00\x00\x00\x00\x40\x7d\x00\x00\x00\x00\x00\x00\x48\x22\x00\x00\x00\x00\x64\x3e\x00\x00\x00\x00\x00\x00\x48\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x61\x64\x3b\x00\x00\x00\x00\x48\x4f\x00\x00\x64\x3f\x4a\x53\x00\x00\x43\x5b\x00\x00\x64\x3a\x64\x3c\x00\x00\x00\x00\x64\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x40\x00\x00\x00\x00\x3c\x44\x00\x00\x00\x00\x00\x00\x46\x46\x64\x45\x64\x44\x00\x00\x00\x00\x64\x41\x00\x00\x00\x00\x00\x00\x4f\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x4a\x00\x00\x00\x00\x64\x4e\x64\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7c00 */ "\x64\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x4d\x00\x00\x00\x00\x00\x00\x64\x42\x52\x55\x64\x49\x64\x43\x00\x00\x00\x00\x64\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x52\x00\x00\x34\x4a\x00\x00\x64\x4f\x00\x00\x00\x00\x00\x00\x64\x50\x00\x00\x00\x00\x64\x51\x64\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x53\x48\x76\x00\x00\x00\x00\x00\x00\x00\x00\x64\x55\x4e\x7c\x4a\x6d\x64\x5a\x00\x00\x00\x00\x64\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x56\x40\x52\x00\x00\x64\x59\x64\x5b\x00\x00\x00\x00\x00\x00\x64\x58\x00\x00\x64\x5f\x00\x00\x64\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x5d\x64\x46\x00\x00\x00\x00\x00\x00\x64\x5e\x64\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x46\x00\x00\x64\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x62\x00\x00", /* 7c80 */ "\x00\x00\x36\x4e\x37\x29\x64\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x34\x00\x00\x3f\x68\x00\x00\x4c\x30\x00\x00\x00\x00\x64\x64\x00\x00\x4e\x33\x00\x00\x00\x00\x47\x74\x00\x00\x41\x46\x47\x34\x00\x00\x00\x00\x3d\x4d\x00\x00\x00\x00\x00\x00\x30\x40\x00\x00\x64\x69\x64\x67\x00\x00\x64\x65\x34\x21\x00\x00\x3e\x51\x64\x6a\x00\x00\x00\x00\x64\x68\x00\x00\x64\x66\x64\x6e\x00\x00\x00\x00\x64\x6d\x64\x6c\x64\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x6f\x00\x00\x00\x00\x00\x00\x64\x70\x40\x3a\x00\x00\x64\x71\x00\x00\x64\x73\x00\x00\x00\x00\x64\x72\x00\x00\x00\x00\x00\x00\x00\x00\x38\x52\x00\x00\x00\x00\x00\x00\x41\x38\x00\x00\x00\x00\x00\x00\x64\x75\x00\x00\x00\x00\x00\x00\x45\x7c\x00\x00\x64\x74\x00\x00\x00\x00\x00\x00\x64\x76\x00\x00\x4a\x35\x41\x6c\x39\x47\x00\x00\x64\x77\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x79\x00\x00\x00\x00\x64\x7a\x00\x00\x64\x7b\x00\x00\x64\x7c\x00\x00\x3b\x65\x00\x00\x64\x7d\x37\x4f\x00\x00\x00\x00\x35\x6a\x00\x00", /* 7d00 */ "\x35\x2a\x00\x00\x65\x21\x00\x00\x4c\x73\x39\x48\x64\x7e\x00\x00\x00\x00\x00\x00\x65\x24\x4c\x66\x00\x00\x47\x3c\x00\x00\x00\x00\x49\x33\x00\x00\x00\x00\x00\x00\x3d\x63\x65\x23\x00\x00\x3c\x53\x39\x49\x3b\x66\x35\x69\x4a\x36\x65\x22\x00\x00\x00\x00\x00\x00\x41\x47\x4b\x42\x3a\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x67\x44\x5d\x00\x00\x65\x27\x4e\x5f\x3a\x59\x00\x00\x65\x28\x3f\x42\x00\x00\x65\x2a\x00\x00\x00\x00\x00\x00\x3e\x52\x3a\x30\x00\x00\x00\x00\x00\x00\x00\x00\x65\x29\x00\x00\x00\x00\x3d\x2a\x38\x3e\x41\x48\x65\x25\x65\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x65\x26\x37\x50\x00\x00\x65\x2e\x65\x32\x37\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x65\x36\x00\x00\x00\x00\x39\x4a\x00\x00\x00\x00\x4d\x6d\x30\x3c\x65\x33\x00\x00\x00\x00\x35\x6b\x00\x00\x65\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x31\x00\x00\x00\x00\x45\x7d\x65\x2f\x65\x2c\x00\x00\x33\x28\x40\x64\x00\x00\x00\x00\x38\x28\x00\x00\x00\x00\x00\x00\x65\x38\x00\x00\x00\x00", /* 7d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x37\x00\x00\x00\x00\x00\x00\x65\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x51\x42\x33\x65\x39\x41\x6e\x00\x00\x00\x00\x65\x46\x00\x00\x00\x00\x65\x42\x65\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x40\x3c\x7a\x30\x5d\x65\x3b\x65\x43\x65\x47\x39\x4b\x4c\x56\x00\x00\x44\x56\x65\x3d\x00\x00\x00\x00\x65\x45\x00\x00\x65\x3a\x43\x3e\x00\x00\x65\x3f\x30\x3d\x4c\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x3e\x00\x00\x00\x00\x36\x5b\x48\x6c\x00\x00\x00\x00\x00\x00\x41\x6d\x00\x00\x4e\x50\x3d\x6f\x00\x00\x00\x00\x65\x6e\x00\x00\x00\x00\x65\x48\x00\x00\x40\x7e\x00\x00\x65\x44\x65\x49\x65\x4b\x00\x00\x44\x79\x65\x4e\x00\x00\x00\x00\x65\x4a\x00\x00\x00\x00\x00\x00\x4a\x54\x34\x4b\x00\x00\x00\x00\x4c\x4b\x00\x00\x00\x00\x30\x5e\x00\x00\x00\x00\x65\x4d\x00\x00\x4e\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x4c\x00\x00\x00\x00\x00\x00\x00\x00", /* 7e00 */ "\x00\x00\x31\x6f\x00\x00\x00\x00\x46\x6c\x65\x4f\x00\x00\x00\x00\x00\x00\x65\x56\x65\x50\x65\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x7b\x00\x00\x00\x00\x3c\x4a\x65\x55\x00\x00\x65\x52\x65\x58\x65\x51\x00\x00\x00\x00\x3d\x44\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x25\x00\x00\x00\x00\x3d\x4c\x00\x00\x00\x00\x65\x54\x65\x60\x00\x00\x00\x00\x65\x5c\x00\x00\x65\x5f\x00\x00\x65\x5d\x65\x61\x65\x5b\x00\x00\x65\x41\x40\x53\x00\x00\x00\x00\x48\x4b\x00\x00\x65\x5e\x00\x00\x00\x00\x65\x59\x00\x00\x00\x00\x00\x00\x41\x21\x37\x52\x00\x00\x3d\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x25\x41\x36\x65\x64\x00\x00\x00\x00\x65\x66\x65\x67\x00\x00\x00\x00\x65\x63\x65\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x5a\x65\x62\x00\x00\x65\x6a\x65\x69\x00\x00\x00\x00\x4b\x7a\x00\x00\x00\x00\x37\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x68\x00\x00\x65\x6c\x65\x6b\x65\x6f\x00\x00\x65\x71", /* 7e80 */ "\x00\x00\x00\x00\x3b\x3c\x65\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x65\x72\x65\x73\x00\x00\x00\x00\x65\x74\x00\x00\x65\x7a\x45\x3b\x65\x76\x00\x00\x65\x75\x65\x77\x65\x78\x00\x00\x65\x79\x00\x00\x00\x00\x00\x00\x00\x00\x65\x7b\x65\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x4c\x00\x00\x65\x7d\x00\x00\x65\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x22\x66\x23\x66\x24\x00\x00\x66\x25\x66\x26\x00\x00\x00\x00\x66\x28\x66\x27\x00\x00\x00\x00\x66\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x2a\x66\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x2e\x66\x2c\x66\x2d\x3a\x61\x37\x53\x00\x00\x00\x00\x43\x56\x00\x00\x48\x33\x00\x00\x3d\x70\x00\x00\x00\x00\x47\x4d\x00\x00\x48\x6d\x66\x2f\x58\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 7f80 */ "\x00\x00\x00\x00\x66\x30\x66\x32\x00\x00\x4d\x65\x66\x31\x66\x34\x66\x33\x00\x00\x4d\x53\x00\x00\x66\x35\x00\x00\x48\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x39\x00\x00\x00\x00\x66\x38\x66\x37\x00\x00\x00\x00\x00\x00\x00\x00\x66\x3a\x37\x32\x00\x00\x00\x00\x00\x00\x41\x22\x35\x41\x00\x00\x00\x00\x00\x00\x00\x00\x66\x3e\x66\x3b\x00\x00\x00\x00\x66\x3c\x00\x00\x00\x00\x00\x00\x66\x3f\x00\x00\x66\x40\x66\x3d\x00\x00\x00\x00\x00\x00\x31\x29\x00\x00\x00\x00\x00\x00\x32\x27\x00\x00\x00\x00\x00\x00\x66\x42\x66\x43\x00\x00\x00\x00\x00\x00\x66\x44\x00\x00\x4d\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x2c\x00\x00\x66\x46\x66\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x69\x66\x47\x00\x00\x00\x00\x00\x00\x00\x00\x66\x48\x00\x00\x00\x00\x66\x49\x00\x00\x34\x65\x00\x00\x00\x00\x00\x00\x00\x00\x34\x4d\x00\x00\x00\x00\x66\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x4b\x00\x00\x4b\x5d\x4d\x63\x00\x00\x00\x00\x00\x00", /* 8000 */ "\x4d\x54\x4f\x37\x00\x00\x39\x4d\x66\x4e\x3c\x54\x66\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x66\x4f\x3c\x29\x00\x00\x00\x00\x00\x00\x42\x51\x00\x00\x66\x50\x00\x00\x00\x00\x39\x4c\x00\x00\x4c\x57\x66\x51\x66\x52\x00\x00\x00\x00\x66\x53\x00\x00\x00\x00\x00\x00\x00\x00\x66\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x2a\x00\x00\x00\x00\x4c\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x66\x57\x00\x00\x43\x3f\x00\x00\x66\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x59\x00\x00\x00\x00\x00\x00\x66\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x5a\x00\x00\x00\x00\x00\x00\x40\x3b\x00\x00\x66\x5b\x00\x00\x66\x5c\x00\x00\x00\x00\x00\x00\x4a\x39\x66\x5d\x00\x00\x41\x6f\x66\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x7e\x66\x62\x00\x00\x66\x61\x66\x60\x44\x30\x00\x00\x66\x63\x3f\x26\x00\x00\x66\x64\x00\x00\x00\x00\x00\x00\x66\x65\x4f\x38\x66\x66", /* 8080 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x66\x67\x66\x69\x66\x68\x48\x25\x00\x00\x46\x79\x00\x00\x4f\x3e\x48\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x6b\x00\x00\x00\x00\x3e\x53\x00\x00\x49\x2a\x00\x00\x66\x6c\x66\x6a\x00\x00\x34\x4e\x00\x00\x00\x00\x00\x00\x38\x54\x3b\x68\x00\x00\x00\x00\x48\x6e\x00\x00\x00\x00\x00\x00\x38\x2a\x4b\x43\x00\x00\x66\x6f\x66\x6d\x00\x00\x39\x4e\x00\x00\x39\x4f\x30\x69\x00\x00\x3a\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x5f\x66\x74\x00\x00\x43\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x58\x00\x00\x42\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x76\x00\x00\x00\x00\x66\x72\x66\x75\x66\x70\x00\x00\x66\x73\x4b\x26\x00\x00\x00\x00\x38\x55\x00\x00\x00\x00\x30\x7d\x66\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x78\x00\x00\x66\x79\x00\x00\x00\x00\x46\x39\x00\x00\x00\x00\x00\x00\x36\x3b\x00\x00\x00\x00\x00\x00\x67\x26\x47\x3d\x00\x00\x00\x00", /* 8100 */ "\x00\x00\x00\x00\x3b\x69\x00\x00\x00\x00\x36\x3c\x40\x48\x4f\x46\x4c\x2e\x66\x77\x40\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x53\x66\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x7d\x00\x00\x43\x26\x00\x00\x47\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x31\x00\x00\x00\x00\x00\x00\x00\x00\x67\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x22\x00\x00\x00\x00\x00\x00\x00\x00\x66\x7e\x00\x00\x00\x00\x3f\x55\x00\x00\x49\x65\x67\x25\x00\x00\x67\x24\x39\x50\x4f\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x29\x67\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x70\x00\x00\x00\x00\x67\x28\x00\x00\x39\x78\x67\x27\x00\x00\x00\x00\x67\x2b\x00\x00\x00\x00\x00\x00\x44\x32\x4a\x22\x41\x23\x00\x00\x00\x00\x00\x00\x00\x00\x42\x5c", /* 8180 */ "\x67\x2f\x00\x00\x67\x30\x67\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x67\x2d\x00\x00\x67\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x39\x51\x00\x00\x00\x00\x00\x00\x67\x36\x00\x00\x67\x32\x00\x00\x00\x00\x00\x00\x00\x00\x49\x66\x00\x00\x4b\x6c\x49\x28\x00\x00\x00\x00\x67\x31\x00\x00\x00\x00\x67\x34\x67\x33\x00\x00\x00\x00\x00\x00\x4b\x44\x67\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x38\x00\x00\x00\x00\x41\x37\x00\x00\x67\x39\x00\x00\x00\x00\x67\x3b\x00\x00\x67\x3f\x00\x00\x00\x00\x67\x3c\x67\x3a\x47\x3f\x67\x3d\x00\x00\x67\x3e\x00\x00\x00\x00\x00\x00\x32\x32\x00\x00\x67\x45\x67\x40\x00\x00\x00\x00\x00\x00\x67\x41\x00\x00\x00\x00\x00\x00\x67\x42\x00\x00\x42\x21\x00\x00\x00\x00\x00\x00\x00\x00\x67\x44\x67\x43\x67\x46\x00\x00\x00\x00\x00\x00\x00\x00\x67\x47\x67\x48\x00\x00\x00\x00\x3f\x43\x00\x00\x32\x69\x00\x00\x67\x49\x4e\x57\x00\x00\x3c\x2b\x00\x00\x00\x00\x3d\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x6a\x43\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x4a\x67\x4b\x31\x31\x00\x00\x67\x4c\x00\x00", /* 8200 */ "\x00\x00\x67\x4d\x67\x4e\x00\x00\x00\x00\x67\x4f\x00\x00\x67\x50\x36\x3d\x5a\x2a\x67\x51\x00\x00\x40\x65\x67\x52\x3c\x4b\x00\x00\x67\x53\x00\x00\x50\x30\x00\x00\x00\x00\x00\x00\x67\x54\x4a\x5e\x34\x5c\x00\x00\x00\x00\x41\x24\x3d\x58\x00\x00\x49\x71\x3d\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x55\x39\x52\x67\x56\x48\x4c\x00\x00\x67\x64\x00\x00\x00\x00\x00\x00\x00\x00\x67\x58\x00\x00\x42\x49\x47\x75\x38\x3f\x67\x57\x41\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x5b\x67\x5a\x67\x5d\x00\x00\x00\x00\x67\x5c\x00\x00\x67\x5e\x00\x00\x00\x00\x67\x60\x00\x00\x67\x5f\x00\x00\x34\x4f\x00\x00\x67\x61\x00\x00\x67\x62\x67\x63\x00\x00\x00\x00\x3a\x31\x4e\x49\x00\x00\x67\x65\x3f\x27\x00\x00\x00\x00\x00\x00\x31\x70\x67\x66\x67\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x68\x00\x00", /* 8280 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x72\x00\x00\x67\x69\x00\x00\x00\x00\x00\x00\x00\x00\x67\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x67\x00\x00\x00\x00\x00\x00\x3c\x47\x00\x00\x67\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x29\x30\x32\x00\x00\x00\x00\x00\x00\x00\x00\x67\x6b\x67\x6e\x47\x4e\x00\x00\x3f\x44\x00\x00\x32\x56\x00\x00\x4b\x27\x00\x00\x00\x00\x00\x00\x00\x00\x37\x5d\x36\x5c\x00\x00\x67\x6d\x00\x00\x32\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x71\x67\x72\x4e\x6a\x42\x5d\x00\x00\x00\x00\x49\x44\x00\x00\x67\x7e\x00\x00\x32\x57\x67\x7c\x00\x00\x67\x7a\x67\x71\x00\x00\x67\x6f\x00\x00\x67\x70\x00\x00\x3c\x63\x36\x6c\x43\x77\x00\x00\x00\x00\x00\x00\x46\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x51\x00\x00\x67\x74\x67\x73\x00\x00\x00\x00\x00\x00\x00\x00\x67\x79\x67\x75\x67\x78\x00\x00\x00\x00\x00\x00\x00\x00", /* 8300 */ "\x00\x00\x00\x00\x4c\x50\x67\x77\x32\x58\x33\x7d\x67\x7b\x00\x00\x00\x00\x67\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x37\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x23\x68\x2c\x68\x2d\x00\x00\x00\x00\x00\x00\x30\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x34\x00\x00\x00\x00\x00\x00\x00\x00\x30\x71\x00\x00\x00\x00\x68\x2b\x00\x00\x00\x00\x00\x00\x68\x2a\x00\x00\x68\x25\x68\x24\x00\x00\x68\x22\x68\x21\x43\x63\x00\x00\x42\x7b\x68\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x26\x00\x00\x00\x00\x00\x00\x00\x00\x68\x29\x00\x00\x00\x00\x00\x00\x41\x70\x37\x55\x00\x00\x00\x00\x00\x00\x00\x00\x31\x41\x68\x28\x00\x00\x39\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x3a\x00\x00\x68\x3b\x00\x00\x32\x59\x00\x00\x00\x00\x00\x00\x32\x2e\x68\x38\x00\x00\x00\x00\x00\x00", /* 8380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x2e\x00\x00\x68\x36\x00\x00\x68\x3d\x68\x37\x00\x00\x00\x00\x00\x00\x68\x35\x00\x00\x00\x00\x00\x00\x00\x00\x67\x76\x00\x00\x00\x00\x68\x33\x00\x00\x00\x00\x00\x00\x68\x2f\x00\x00\x00\x00\x00\x00\x34\x50\x68\x31\x68\x3c\x00\x00\x68\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x3e\x00\x00\x68\x30\x47\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x69\x00\x00\x00\x00\x00\x00\x68\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x4f\x00\x00\x00\x00\x00\x00\x68\x47\x00\x00\x00\x00\x00\x00\x3f\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x35\x46\x00\x00\x36\x5d\x00\x00\x68\x42\x00\x00\x00\x00\x00\x00\x00\x00\x32\x5b\x00\x00\x00\x00\x3e\x54\x00\x00\x68\x45\x00\x00\x00\x00\x00\x00\x3a\x5a\x00\x00\x00\x00\x45\x51\x68\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x6e\x00\x00\x68\x41\x00\x00\x00\x00\x00\x00\x32\x5a\x38\x56\x49\x29\x68\x4b\x00\x00\x68\x3f\x00\x00\x00\x00\x68\x48\x00\x00\x00\x00\x00\x00\x68\x52\x00\x00\x68\x43\x00\x00\x00\x00", /* 8400 */ "\x00\x00\x00\x00\x00\x00\x68\x44\x46\x3a\x00\x00\x00\x00\x68\x49\x00\x00\x00\x00\x00\x00\x68\x46\x4b\x28\x68\x4c\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x68\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x4e\x00\x00\x68\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x6b\x68\x54\x00\x00\x68\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x33\x7e\x00\x00\x00\x00\x00\x00\x68\x62\x00\x00\x00\x00\x68\x50\x00\x00\x00\x00\x00\x00\x68\x55\x4d\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5e\x00\x00\x00\x00\x4d\x55\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x78\x00\x00\x00\x00\x00\x00\x33\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x72\x68\x64\x46\x21\x00\x00\x00\x00\x30\x31\x00\x00\x00\x00\x68\x5d\x00\x00\x68\x59\x41\x72\x68\x53\x68\x5b\x68\x60\x00\x00\x47\x2c\x00\x00\x00\x00\x00\x00\x30\x2a\x00\x00\x68\x58\x00\x00\x68\x61\x49\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8480 */ "\x00\x00\x00\x00\x68\x5c\x00\x00\x68\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x55\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x2f\x00\x00\x00\x00\x00\x00\x3c\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x58\x00\x00\x00\x00\x49\x47\x00\x00\x00\x00\x68\x67\x00\x00\x68\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x33\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x78\x68\x65\x00\x00\x68\x6a\x41\x73\x00\x00\x00\x00\x68\x66\x00\x00\x68\x6d\x00\x00\x00\x00\x43\x5f\x00\x00\x68\x6e\x00\x00\x00\x00\x4d\x56\x68\x63\x33\x38\x00\x00\x68\x69\x00\x00\x00\x00\x68\x6c\x4c\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x68\x6f\x00\x00\x00\x00\x68\x68\x68\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x29\x00\x00\x4f\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7a\x00\x00\x00\x00\x68\x72", /* 8500 */ "\x3c\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x4e\x00\x00\x4c\x22\x68\x79\x68\x78\x00\x00\x68\x74\x68\x75\x00\x00\x31\x36\x00\x00\x00\x00\x00\x00\x00\x00\x68\x77\x00\x00\x68\x71\x00\x00\x00\x00\x00\x00\x00\x00\x44\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x76\x30\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x43\x00\x00\x00\x00\x68\x7b\x69\x21\x00\x00\x48\x59\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7e\x3e\x56\x3c\x49\x69\x23\x00\x00\x00\x00\x36\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x24\x00\x00\x49\x79\x68\x7d\x00\x00\x68\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x4f\x46\x22\x49\x73\x00\x00\x00\x00\x69\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x32\x00\x00", /* 8580 */ "\x69\x25\x00\x00\x00\x00\x00\x00\x47\x76\x00\x00\x00\x00\x69\x2f\x69\x27\x00\x00\x69\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x33\x69\x28\x00\x00\x00\x00\x69\x2c\x00\x00\x00\x00\x31\x72\x00\x00\x46\x65\x00\x00\x69\x2d\x69\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x26\x00\x00\x41\x26\x00\x00\x69\x2a\x3b\x27\x3f\x45\x37\x30\x4c\x74\x00\x00\x4c\x79\x3d\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x37\x69\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x34\x00\x00\x00\x00\x00\x00\x4d\x75\x00\x00\x69\x36\x69\x38\x00\x00\x00\x00\x00\x00\x00\x00\x69\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x3c\x69\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x23\x69\x3b\x00\x00\x00\x00\x00\x00\x48\x4d\x69\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x73\x00\x00\x69\x3d\x69\x42\x41\x74\x00\x00\x00\x00\x69\x41\x00\x00", /* 8600 */ "\x00\x00\x00\x00\x69\x22\x00\x00\x00\x00\x00\x00\x69\x43\x41\x49\x00\x00\x00\x00\x69\x3e\x69\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x3f\x00\x00\x00\x00\x5d\x31\x5d\x22\x00\x00\x00\x00\x69\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x76\x00\x00\x62\x3c\x69\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x48\x38\x57\x00\x00\x35\x54\x00\x00\x00\x00\x00\x00\x69\x4a\x51\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x35\x75\x00\x00\x4e\x3a\x00\x00\x36\x73\x69\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4c\x00\x00\x00\x00\x00\x00\x43\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x7a\x00\x00\x30\x3a\x00\x00\x00\x00\x00\x00\x00\x00", /* 8680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x63\x69\x52\x69\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4e\x00\x00\x3b\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x4f\x47\x42\x00\x00\x00\x00\x00\x00\x00\x00\x69\x50\x69\x51\x69\x5b\x00\x00\x00\x00\x00\x00\x69\x55\x69\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x56\x00\x00\x69\x57\x3c\x58\x00\x00\x69\x59\x00\x00\x43\x41\x00\x00\x37\x56\x33\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x33\x3f\x00\x00\x69\x61\x00\x00\x00\x00\x69\x5d\x69\x60\x00\x00\x00\x00\x00\x00\x00\x00\x48\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x69\x5e\x00\x00\x00\x00\x69\x5f\x49\x48\x48\x5a\x69\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x7d\x69\x6c\x00\x00\x69\x68\x00\x00\x00\x00\x32\x6b\x00\x00", /* 8700 */ "\x69\x66\x00\x00\x4b\x2a\x69\x67\x00\x00\x00\x00\x69\x64\x00\x00\x69\x65\x69\x6a\x69\x6d\x00\x00\x00\x00\x69\x6b\x00\x00\x00\x00\x00\x00\x69\x69\x69\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x58\x00\x00\x69\x74\x00\x00\x4c\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x72\x00\x00\x00\x00\x00\x00\x69\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x6e\x00\x00\x00\x00\x69\x70\x00\x00\x00\x00\x00\x00\x69\x71\x00\x00\x00\x00\x00\x00\x69\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x66\x00\x00\x4f\x39\x69\x78\x00\x00\x69\x79\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x21\x00\x00\x3f\x2a\x00\x00\x69\x7b\x00\x00\x69\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x76\x69\x75\x00\x00\x00\x00\x6a\x22\x00\x00\x00\x00\x32\x5c\x00\x00\x69\x7c\x00\x00\x6a\x23\x00\x00\x00\x00\x00\x00\x69\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x7a\x00\x00\x44\x33\x00\x00\x69\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x68", /* 8780 */ "\x00\x00\x00\x00\x6a\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x26\x00\x00\x00\x00\x6a\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x2e\x00\x00\x00\x00\x00\x00\x6a\x28\x00\x00\x00\x00\x00\x00\x6a\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x66\x6a\x33\x00\x00\x6a\x2a\x00\x00\x00\x00\x6a\x2b\x00\x00\x00\x00\x00\x00\x6a\x2f\x00\x00\x6a\x32\x6a\x31\x00\x00\x00\x00\x00\x00\x6a\x29\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x2c\x00\x00\x6a\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x34\x00\x00\x00\x00\x6a\x35\x00\x00\x00\x00\x00\x00\x6a\x3a\x6a\x3b\x00\x00\x33\x2a\x00\x00\x35\x42\x00\x00\x00\x00\x6a\x39\x00\x00", /* 8800 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x38\x6a\x3c\x6a\x37\x00\x00\x6a\x3e\x00\x00\x00\x00\x00\x00\x6a\x40\x6a\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x42\x6a\x41\x69\x5a\x00\x00\x00\x00\x00\x00\x6a\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x43\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x44\x00\x00\x00\x00\x6a\x45\x00\x00\x6a\x47\x00\x00\x00\x00\x00\x00\x00\x00\x37\x6c\x00\x00\x6a\x49\x00\x00\x6a\x48\x00\x00\x3d\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x54\x5e\x27\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x4a\x3d\x51\x00\x00\x00\x00\x00\x00\x33\x39\x00\x00\x6a\x4b\x00\x00\x31\x52\x00\x00\x3e\x57\x6a\x4c\x00\x00\x00\x00\x39\x55\x6a\x4d\x30\x61\x00\x00\x00\x00\x00\x00\x00\x00\x49\x3d\x00\x00\x00\x00\x6a\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x6a\x00\x00\x6a\x55\x00\x00\x00\x00\x6a\x52\x00\x00\x43\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x53\x6a\x50\x36\x5e", /* 8880 */ "\x00\x00\x6a\x4f\x6a\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x36\x00\x00\x00\x00\x42\x5e\x00\x00\x6a\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x58\x00\x00\x00\x00\x00\x00\x42\x35\x6a\x57\x00\x00\x6a\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x51\x00\x00\x00\x00\x00\x00\x6a\x5b\x00\x00\x6a\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x6f\x00\x00\x00\x00\x6a\x59\x00\x00\x6a\x5e\x6a\x60\x00\x00\x00\x00\x38\x53\x6a\x54\x00\x00\x30\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x5f\x00\x00\x3a\x5b\x4e\x76\x6a\x61\x6a\x62\x41\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x22\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x63\x4d\x35\x00\x00\x00\x00\x6a\x64\x6a\x65\x00\x00\x00\x00\x4a\x64\x6a\x66\x00\x00\x3a\x40\x00\x00\x4e\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x6c\x3e\x58\x6a\x6a\x00\x00\x00\x00\x00\x00\x4d\x67\x6a\x67\x00\x00\x00\x00\x6a\x69\x40\x3d\x3f\x7e\x00\x00", /* 8900 */ "\x00\x00\x00\x00\x6a\x68\x00\x00\x6a\x6d\x00\x00\x00\x00\x4a\x23\x00\x00\x00\x00\x6a\x6f\x00\x00\x6a\x6e\x00\x00\x00\x00\x00\x00\x33\x6c\x00\x00\x4b\x2b\x6a\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x7c\x6a\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x73\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x74\x6a\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x79\x00\x00\x6a\x7a\x00\x00\x00\x00\x6a\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x76\x00\x00\x6a\x71\x6a\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x7b\x70\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x7e\x36\x5f\x6a\x7d\x00\x00\x00\x00\x00\x00\x6b\x22\x00\x00\x6b\x21\x00\x00\x00\x00\x00\x00\x6b\x24\x00\x00\x00\x00\x6b\x23\x00\x00\x6b\x25\x00\x00\x00\x00\x3d\x31\x00\x00\x6b\x26\x00\x00\x00\x00\x6b\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x28\x40\x3e", /* 8980 */ "\x00\x00\x4d\x57\x00\x00\x6b\x29\x00\x00\x00\x00\x4a\x24\x47\x46\x6b\x2a\x00\x00\x6b\x2b\x38\x2b\x00\x00\x00\x00\x00\x00\x35\x2c\x00\x00\x00\x00\x00\x00\x6b\x2c\x00\x00\x00\x00\x3b\x6b\x47\x41\x6b\x2d\x00\x00\x33\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x30\x4d\x77\x00\x00\x6b\x2f\x3f\x46\x00\x00\x6b\x31\x00\x00\x00\x00\x6b\x32\x00\x00\x00\x00\x6b\x33\x34\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x34\x00\x00\x00\x00\x6b\x35\x00\x00\x6b\x36\x6b\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x38\x00\x00\x6b\x39\x6b\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x72\x00\x00\x00\x00\x3f\x28\x6b\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x3c\x00\x00\x00\x00\x00\x00\x6b\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8a00 */ "\x38\x40\x00\x00\x44\x7b\x6b\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x37\x57\x00\x00\x3f\x56\x00\x00\x6b\x41\x00\x00\x46\x24\x00\x00\x6b\x40\x00\x00\x00\x00\x37\x31\x00\x00\x00\x00\x6b\x3f\x42\x77\x35\x2d\x00\x00\x00\x00\x6b\x42\x00\x00\x6b\x43\x00\x00\x3e\x59\x00\x00\x00\x00\x00\x00\x37\x6d\x00\x00\x6b\x44\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x2c\x00\x00\x00\x00\x40\x5f\x00\x00\x00\x00\x00\x00\x35\x76\x00\x00\x4c\x75\x41\x4a\x00\x00\x6b\x45\x00\x00\x00\x00\x00\x00\x3f\x47\x43\x70\x3e\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x46\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x49\x00\x00\x6b\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x3e\x42\x42\x6b\x48\x00\x00\x3e\x5b\x49\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x47\x00\x00\x00\x00\x3b\x6c\x00\x00\x31\x53\x00\x00\x6b\x4e\x37\x58\x00\x00\x00\x00\x3b\x6e\x00\x00\x00\x00\x3b\x6d\x00\x00\x4f\x4d\x6b\x4d\x6b\x4c\x41\x27\x00\x00\x35\x4d\x4f\x43\x33\x3a\x3e\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x4b\x00\x00\x00\x00\x00\x00", /* 8a80 */ "\x00\x00\x00\x00\x6b\x50\x00\x00\x6b\x51\x6b\x4f\x00\x00\x38\x58\x00\x00\x4d\x40\x00\x00\x00\x00\x3b\x6f\x47\x27\x00\x00\x00\x00\x00\x00\x6b\x54\x00\x00\x40\x40\x00\x00\x43\x42\x00\x00\x00\x00\x4d\x36\x00\x00\x6b\x57\x00\x00\x00\x00\x00\x00\x38\x6c\x00\x00\x40\x3f\x6b\x53\x00\x00\x6b\x58\x38\x6d\x6b\x55\x6b\x56\x00\x00\x6b\x52\x00\x00\x00\x00\x00\x00\x40\x62\x46\x49\x00\x00\x00\x00\x43\x2f\x00\x00\x32\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x70\x00\x00\x00\x00\x35\x43\x00\x00\x00\x00\x44\x34\x00\x00\x00\x00\x6b\x5b\x00\x00\x6b\x59\x00\x00\x00\x00\x43\x4c\x00\x00\x00\x00\x00\x00\x40\x41\x34\x52\x6b\x5a\x00\x00\x3f\x5b\x00\x00\x00\x00\x4e\x4a\x00\x00\x00\x00\x00\x00\x4f\x40\x00\x00\x00\x00\x00\x00\x6b\x5c\x6b\x67\x44\x35\x00\x00\x6b\x66\x00\x00\x6b\x63\x6b\x6b\x6b\x64\x00\x00\x6b\x60\x00\x00\x44\x7c\x6b\x5f\x00\x00\x00\x00\x00\x00\x6b\x5d\x00\x00\x4d\x21\x3b\x70\x00\x00\x00\x00\x6b\x61\x00\x00\x6b\x5e\x00\x00\x00\x00\x00\x00\x6b\x65\x3d\x74\x00\x00\x38\x41\x00\x00\x00\x00\x00\x00\x42\x7a\x00\x00", /* 8b00 */ "\x4b\x45\x31\x5a\x30\x62\x00\x00\x46\x25\x00\x00\x00\x00\x6b\x69\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x68\x00\x00\x46\x66\x00\x00\x6b\x6d\x00\x00\x00\x00\x00\x00\x6b\x62\x00\x00\x6b\x6c\x6b\x6e\x00\x00\x38\x2c\x6b\x6a\x39\x56\x00\x00\x3c\x55\x00\x00\x00\x00\x6b\x6f\x4d\x58\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x72\x00\x00\x6b\x75\x00\x00\x00\x00\x6b\x73\x49\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x60\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x74\x00\x00\x00\x00\x6b\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x7a\x00\x00\x00\x00\x6b\x77\x00\x00\x6b\x79\x6b\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x7b\x00\x00\x3c\x31\x00\x00\x6b\x7d\x6b\x7c\x49\x68\x00\x00\x00\x00\x6c\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x59\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x7e\x6c\x22\x00\x00\x00\x00\x6c\x23\x35\x44\x66\x41\x3e\x79\x00\x00\x6c\x24\x00\x00\x00\x00\x38\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x25\x00\x00\x00\x00", /* 8b80 */ "\x6c\x26\x00\x00\x00\x00\x3b\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x4e\x00\x00\x6c\x27\x00\x00\x6c\x28\x00\x00\x3d\x32\x00\x00\x6c\x29\x6c\x2a\x00\x00\x00\x00\x6c\x2b\x00\x00\x00\x00\x6c\x2c\x6c\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x2b\x00\x00\x00\x00\x6c\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x30\x00\x00\x6c\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x46\x26\x00\x00\x6c\x31\x00\x00\x4b\x2d\x00\x00\x6c\x32\x00\x00\x6c\x33\x00\x00\x6c\x34\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x35\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x5d\x6c\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x6b\x50\x2e\x6c\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x38\x49\x3f\x6c\x39\x00\x00\x6c\x41\x00\x00\x00\x00\x00\x00", /* 8c80 */ "\x00\x00\x00\x00\x6c\x3a\x00\x00\x00\x00\x6c\x3c\x00\x00\x00\x00\x00\x00\x6c\x3b\x6c\x3d\x00\x00\x4b\x46\x6c\x3e\x6c\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x40\x00\x00\x00\x00\x00\x00\x6c\x42\x00\x00\x00\x00\x00\x00\x00\x00\x33\x2d\x44\x67\x00\x00\x49\x69\x3a\x62\x39\x57\x00\x00\x00\x00\x00\x00\x00\x00\x49\x4f\x32\x5f\x48\x4e\x6c\x45\x34\x53\x40\x55\x6c\x44\x6c\x49\x43\x79\x4c\x63\x00\x00\x6c\x47\x6c\x48\x35\x2e\x00\x00\x6c\x4a\x47\x63\x42\x5f\x00\x00\x00\x00\x48\x71\x45\x3d\x6c\x46\x00\x00\x4b\x47\x32\x6c\x6c\x4c\x4f\x28\x44\x42\x4f\x45\x00\x00\x00\x00\x3b\x71\x6c\x4b\x00\x00\x42\x31\x00\x00\x00\x00\x6c\x5c\x41\x28\x00\x00\x00\x00\x46\x78\x00\x00\x49\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x4f\x3b\x3f\x3b\x72\x00\x00\x3e\x5e\x00\x00\x47\x65\x00\x00\x38\x2d\x6c\x4e\x6c\x4d\x00\x00\x49\x6a\x00\x00\x00\x00\x00\x00\x3c\x41\x00\x00\x00\x00\x45\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x51\x6c\x52\x39\x58\x6c\x50\x00\x00\x00\x00", /* 8d00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x53\x6c\x54\x00\x00\x6c\x56\x42\x23\x00\x00\x6c\x55\x34\x66\x00\x00\x6c\x58\x00\x00\x6c\x57\x6c\x59\x00\x00\x00\x00\x6c\x5b\x6c\x5d\x00\x00\x6c\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x56\x00\x00\x3c\x4f\x6c\x5f\x00\x00\x00\x00\x00\x00\x33\x52\x00\x00\x6c\x60\x00\x00\x00\x00\x41\x76\x6c\x61\x00\x00\x6c\x62\x49\x6b\x00\x00\x00\x00\x35\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8d80 */ "\x00\x00\x6c\x63\x00\x00\x00\x00\x00\x00\x44\x36\x00\x00\x00\x00\x00\x00\x00\x00\x31\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x71\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x67\x00\x00\x00\x00\x00\x00\x6c\x66\x00\x00\x00\x00\x00\x00\x6c\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x6d\x6c\x6b\x00\x00\x00\x00\x6c\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x6a\x00\x00\x00\x00\x00\x00\x6c\x69\x6c\x6c\x00\x00\x35\x77\x00\x00\x6c\x70\x00\x00\x40\x57\x00\x00\x6c\x71\x00\x00\x00\x00\x00\x00\x00\x00\x38\x59\x00\x00\x6c\x6e\x6c\x6f\x00\x00\x00\x00\x00\x00\x4f\x29\x00\x00\x00\x00\x00\x00\x44\x37\x00\x00\x41\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x72\x00\x00\x00\x00\x6c\x75", /* 8e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x73\x6c\x74\x4d\x59\x00\x00\x00\x00\x00\x00\x00\x00\x46\x27\x6c\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x76\x6c\x77\x6c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7c\x00\x00\x00\x00\x00\x00\x6c\x7d\x6c\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x7a\x00\x00\x44\x7d\x00\x00\x00\x00\x6d\x21\x6d\x25\x6d\x22\x6c\x7e\x00\x00\x6d\x23\x00\x00\x00\x00\x00\x00\x6d\x24\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x2b\x00\x00\x00\x00\x00\x00\x6d\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x58\x6d\x28\x00\x00\x00\x00\x6d\x2a\x6d\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x2d\x00\x00\x3d\x33\x00\x00\x6d\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x2e\x00\x00\x00\x00\x00\x00", /* 8e80 */ "\x00\x00\x6d\x2f\x00\x00\x00\x00\x6d\x32\x6d\x31\x00\x00\x6d\x30\x00\x00\x00\x00\x6d\x34\x6d\x33\x00\x00\x4c\x76\x00\x00\x00\x00\x00\x00\x6d\x36\x00\x00\x6d\x35\x6d\x37\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x39\x3f\x48\x6d\x3b\x00\x00\x00\x00\x36\x6d\x6d\x3c\x6d\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x40\x6d\x3d\x00\x00\x6d\x41\x00\x00\x3c\x56\x6d\x42\x35\x30\x37\x33\x00\x00\x00\x00\x00\x00\x00\x00\x38\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x43\x00\x00\x00\x00\x00\x00\x46\x70\x00\x00\x00\x00\x45\x3e\x6d\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x34\x00\x00\x00\x00\x6d\x46\x6d\x45\x37\x5a\x6d\x48\x00\x00", /* 8f00 */ "\x00\x00\x00\x00\x00\x00\x33\x53\x00\x00\x6d\x4a\x00\x00\x00\x00\x00\x00\x3a\x5c\x6d\x49\x00\x00\x6d\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x4c\x6d\x4e\x4a\x65\x6d\x4b\x00\x00\x00\x00\x00\x00\x6d\x4d\x00\x00\x6d\x51\x6d\x4f\x35\x31\x00\x00\x6d\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x53\x00\x00\x00\x00\x47\x5a\x4e\x58\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x34\x00\x00\x00\x00\x00\x00\x6d\x54\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x22\x6d\x56\x00\x00\x6d\x55\x00\x00\x00\x00\x6d\x59\x4d\x41\x00\x00\x00\x00\x6d\x58\x00\x00\x33\x6d\x6d\x57\x6d\x5c\x00\x00\x00\x00\x6d\x5b\x00\x00\x00\x00\x6d\x5a\x45\x32\x6d\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x5f\x00\x00\x00\x00\x39\x6c\x00\x00\x37\x25\x6d\x60\x6d\x61\x6d\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 8f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x49\x6d\x63\x00\x00\x3c\x2d\x6d\x64\x00\x00\x00\x00\x00\x00\x6d\x65\x00\x00\x00\x00\x00\x00\x52\x21\x51\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x66\x65\x70\x6d\x67\x43\x24\x3f\x2b\x47\x40\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x68\x00\x00\x00\x00\x4a\x55\x44\x54\x39\x7e\x00\x00\x00\x00\x43\x29\x00\x00\x00\x00\x31\x2a\x00\x00\x4b\x78\x3f\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x5e\x00\x00\x00\x00\x36\x61\x00\x00\x00\x00\x4a\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x6b\x00\x00\x00\x00\x6d\x6a\x32\x60\x00\x00\x00\x00\x46\x76\x6d\x6c\x47\x77\x00\x00\x45\x33\x00\x00\x6d\x6d\x3d\x52\x00\x00\x00\x00\x00\x00\x6d\x6f\x00\x00\x00\x00\x4c\x42\x6d\x7e\x6d\x71\x6d\x72\x00\x00\x00\x00\x44\x49\x00\x00\x00\x00", /* 9000 */ "\x42\x60\x41\x77\x00\x00\x46\x28\x00\x00\x6d\x70\x35\x55\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x79\x00\x00\x6d\x76\x6e\x25\x46\x29\x43\x60\x6d\x73\x00\x00\x44\x7e\x45\x53\x6d\x74\x6d\x78\x3f\x60\x00\x00\x47\x67\x44\x4c\x00\x00\x00\x00\x40\x42\x6d\x77\x42\x2e\x42\x24\x6d\x75\x30\x29\x4f\x22\x00\x00\x00\x00\x00\x00\x6d\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x61\x00\x00\x00\x00\x3d\x35\x3f\x4a\x00\x00\x00\x00\x6d\x7c\x6d\x7b\x00\x00\x30\x6f\x6d\x7d\x00\x00\x00\x00\x49\x2f\x00\x00\x6e\x27\x00\x00\x00\x00\x46\x5b\x3f\x6b\x00\x00\x00\x00\x43\x59\x00\x00\x36\x78\x00\x00\x6e\x26\x4d\x37\x31\x3f\x00\x00\x4a\x57\x32\x61\x6e\x21\x6e\x22\x6e\x23\x6e\x24\x46\x3b\x43\x23\x30\x63\x6e\x28\x00\x00\x6e\x29\x74\x23\x00\x00\x00\x00\x42\x3d\x00\x00\x6e\x2a\x00\x00\x31\x73\x41\x4c\x00\x00\x38\x2f\x00\x00\x4d\x5a\x00\x00\x00\x00\x6e\x2b\x45\x2c\x00\x00\x00\x00\x00\x00\x41\x78\x3c\x57\x6e\x2c\x00\x00\x00\x00\x6e\x2f\x00\x00\x00\x00\x3d\x65\x6e\x2d\x41\x2b\x41\x2a\x00\x00\x30\x64\x00\x00\x4e\x4b\x6e\x31\x00\x00\x48\x72", /* 9080 */ "\x6e\x33\x6e\x32\x6e\x30\x63\x64\x34\x54\x00\x00\x00\x00\x6d\x6e\x00\x00\x6e\x35\x6e\x34\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x36\x00\x00\x4d\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x61\x00\x00\x00\x00\x4b\x2e\x00\x00\x6e\x37\x00\x00\x3c\x59\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x38\x00\x00\x6e\x39\x00\x00\x00\x00\x00\x00\x6e\x3a\x00\x00\x00\x00\x45\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x59\x00\x00\x00\x00\x00\x00\x4f\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x34\x6e\x3b\x00\x00\x6e\x3c\x00\x00\x00\x00\x00\x00\x49\x74\x00\x00\x00\x00\x00\x00\x00\x00\x33\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x39\x00\x00\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x54\x00\x00\x00\x00", /* 9100 */ "\x00\x00\x00\x00\x6e\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x22\x00\x00\x00\x00\x6e\x43\x00\x00\x6e\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x53\x6e\x44\x3d\x36\x3c\x60\x47\x5b\x43\x71\x00\x00\x00\x00\x00\x00\x3c\x72\x00\x00\x3f\x6c\x00\x00\x6e\x45\x00\x00\x6e\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x5d\x6e\x47\x00\x00\x6e\x48\x00\x00\x00\x00\x00\x00\x6e\x49\x4d\x6f\x00\x00\x3d\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x4b\x6e\x4a\x00\x00\x39\x5a\x00\x00\x39\x73\x3b\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9180 */ "\x00\x00\x00\x00\x6e\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x66\x00\x00\x6e\x4d\x00\x00\x6e\x4c\x00\x00\x42\x69\x00\x00\x00\x00\x38\x6f\x00\x00\x40\x43\x00\x00\x00\x00\x00\x00\x00\x00\x48\x30\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x4f\x00\x00\x3e\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x52\x6e\x50\x00\x00\x00\x00\x00\x00\x6e\x51\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x54\x6e\x53\x00\x00\x00\x00\x3e\x7a\x00\x00\x6e\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x56\x6e\x57\x00\x00\x00\x00\x00\x00\x00\x00\x48\x50\x3a\x53\x3c\x61\x6e\x58\x00\x00\x6e\x59\x4e\x24\x3d\x45\x4c\x6e\x4e\x4c\x6e\x5a\x36\x62\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x5b\x00\x00\x45\x23\x00\x00\x00\x00\x6e\x5e\x33\x78\x3f\x4b\x00\x00\x6e\x5c\x00\x00\x6e\x5d\x00\x00\x44\x60\x00\x00\x00\x00\x4b\x55\x36\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x60\x6e\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x5f\x00\x00\x00\x00\x6e\x63", /* 9200 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x5f\x33\x43\x00\x00\x00\x00\x6e\x67\x00\x00\x00\x00\x6e\x64\x6e\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x4f\x00\x00\x00\x00\x6e\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x6b\x00\x00\x00\x00\x38\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x45\x34\x6e\x6a\x00\x00\x00\x00\x6e\x6d\x6e\x6b\x00\x00\x6e\x70\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x69\x00\x00\x00\x00\x6e\x76\x31\x74\x00\x00\x00\x00\x6e\x68\x00\x00\x00\x00\x00\x00\x48\x2d\x00\x00\x6e\x6c\x00\x00\x3e\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x48\x00\x00", /* 9280 */ "\x36\x64\x00\x00\x00\x00\x3d\x46\x00\x00\x46\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x2d\x00\x00\x6e\x74\x00\x00\x6e\x6e\x6e\x73\x00\x00\x4c\x43\x00\x00\x44\x38\x6e\x75\x6e\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x79\x00\x00\x6e\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x77\x00\x00\x00\x00\x4b\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x7a\x4a\x5f\x00\x00\x00\x00\x31\x54\x00\x00\x00\x00\x00\x00\x00\x00\x49\x46\x43\x72\x00\x00\x00\x00\x00\x00\x00\x00\x35\x78\x00\x00\x6e\x7c\x00\x00\x39\x5d\x00\x00\x00\x00\x00\x00", /* 9300 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x7b\x3f\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x6e\x6f\x21\x6f\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x7b\x00\x00\x6f\x22\x6f\x24\x00\x00\x00\x00\x36\x53\x00\x00\x49\x45\x00\x00\x00\x00\x3c\x62\x4f\x23\x00\x00\x6e\x7e\x3a\x78\x00\x00\x00\x00\x4f\x3f\x00\x00\x00\x00\x6f\x26\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x25\x6f\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x69\x00\x00\x45\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x57\x00\x00\x6f\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x43\x43\x6f\x28\x00\x00\x00\x00\x00\x00\x6f\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x2d\x00\x00\x6f\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x2a\x00\x00\x3e\x61\x00\x00", /* 9380 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x30\x00\x00\x3a\x3f\x41\x79\x00\x00\x00\x00\x44\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x2e\x6f\x2f\x44\x43\x00\x00\x6f\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x37\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x39\x45\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x32\x6f\x33\x6f\x36\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x38\x00\x00\x00\x00\x00\x00\x36\x40\x00\x00\x00\x00\x6f\x3b\x6f\x35\x00\x00\x00\x00\x6f\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9400 */ "\x00\x00\x00\x00\x00\x00\x6f\x3f\x00\x00\x00\x00\x00\x00\x6f\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x41\x00\x00\x00\x00\x6f\x3e\x6f\x3d\x00\x00\x00\x00\x00\x00\x3e\x62\x46\x2a\x6f\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x44\x6f\x42\x00\x00\x42\x78\x00\x00\x6f\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x47\x00\x00\x00\x00\x6f\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x55\x6f\x48\x4c\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x54\x6f\x4a\x00\x00\x00\x00\x6f\x4d\x00\x00\x6f\x4b\x00\x00\x6f\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x50\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x51\x00\x00\x6f\x52\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x55\x6f\x53\x6f\x56\x6f\x58", /* 9480 */ "\x00\x00\x6f\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9500 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9580 */ "\x4c\x67\x00\x00\x6f\x59\x41\x2e\x00\x00\x00\x00\x00\x00\x6f\x5a\x00\x00\x4a\x44\x6f\x5b\x33\x2b\x00\x00\x00\x00\x00\x00\x31\x3c\x00\x00\x34\x57\x00\x00\x34\x56\x6f\x5c\x00\x00\x6f\x5d\x00\x00\x6f\x5e\x6f\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x60\x00\x00\x34\x58\x33\x55\x39\x5e\x48\x36\x00\x00\x6f\x62\x6f\x61\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x63\x00\x00\x00\x00\x00\x00\x00\x00\x31\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x66\x00\x00\x6f\x65\x6f\x64\x00\x00\x6f\x67\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x6a\x00\x00\x00\x00\x00\x00\x30\x47\x00\x00\x00\x00\x6f\x68\x00\x00\x6f\x6c\x6f\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x6e\x6f\x6d\x6f\x6f\x00\x00\x46\x2e\x00\x00\x00\x00\x00\x00\x6f\x70\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x71\x6f\x73\x00\x00\x00\x00\x6f\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9600 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x75\x00\x00\x3a\x65\x00\x00\x00\x00\x00\x00\x6f\x76\x6f\x77\x00\x00\x00\x00\x4b\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x4b\x00\x00\x00\x00\x00\x00\x30\x24\x42\x4b\x00\x00\x6f\x78\x00\x00\x49\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x7b\x6f\x79\x39\x5f\x00\x00\x6f\x7a\x38\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x45\x6f\x7d\x70\x21\x6f\x7e\x70\x22\x00\x00\x00\x00\x31\x21\x3f\x58\x3d\x7c\x34\x59\x70\x23\x00\x00\x00\x00\x00\x00\x47\x66\x00\x00\x70\x25\x00\x00\x00\x00\x00\x00\x31\x22\x00\x00\x70\x24\x44\x44\x00\x00\x4e\x4d\x46\x2b\x6f\x7c\x4e\x26\x00\x00\x38\x31\x00\x00\x00\x00\x4d\x5b\x00\x00\x00\x00", /* 9680 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x79\x4e\x34\x00\x00\x37\x28\x00\x00\x42\x62\x67\x21\x00\x00\x70\x26\x33\x2c\x3f\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x33\x56\x70\x28\x00\x00\x70\x29\x70\x27\x37\x64\x00\x00\x3a\x5d\x3e\x63\x00\x00\x00\x00\x00\x00\x31\x23\x00\x00\x00\x00\x4e\x59\x00\x00\x00\x00\x00\x00\x70\x2b\x6e\x2e\x00\x00\x70\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x2e\x70\x2c\x70\x2d\x00\x00\x70\x2f\x00\x00\x70\x30\x4e\x6c\x70\x31\x70\x32\x00\x00\x40\x49\x48\x3b\x00\x00\x00\x00\x00\x00\x3f\x7d\x34\x67\x00\x00\x00\x00\x4d\x3a\x32\x6d\x3d\x38\x38\x5b\x00\x00\x70\x35\x00\x00\x70\x34\x3b\x73\x70\x36\x70\x33\x00\x00\x00\x00\x3b\x28\x00\x00\x00\x00\x00\x00\x70\x3a\x6a\x2d\x00\x00\x00\x00\x52\x56\x00\x00\x3f\x77\x70\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x25\x46\x71\x00\x00\x00\x00\x00\x00\x00\x00\x31\x2b\x00\x00\x40\x63\x3c\x36\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x37\x00\x00\x31\x40\x00\x00\x00\x00\x00\x00\x4e\x6d\x4d\x6b\x00\x00\x70\x3b\x00\x00\x45\x45\x00\x00\x00\x00\x00\x00\x00\x00", /* 9700 */ "\x3c\x7b\x00\x00\x00\x00\x00\x00\x70\x3c\x00\x00\x70\x3d\x3f\x4c\x70\x3e\x00\x00\x4e\x6e\x00\x00\x00\x00\x70\x39\x70\x40\x70\x42\x00\x00\x70\x41\x00\x00\x70\x3f\x00\x00\x00\x00\x70\x43\x00\x00\x00\x00\x70\x44\x00\x00\x00\x00\x41\x7a\x00\x00\x32\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x45\x00\x00\x00\x00\x4c\x38\x00\x00\x00\x00\x70\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x47\x00\x00\x4f\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x31\x70\x48\x00\x00\x00\x00\x00\x00\x70\x49\x70\x4a\x00\x00\x00\x00\x00\x00\x70\x4e\x00\x00\x70\x4b\x00\x00\x70\x4c\x00\x00\x70\x4d\x70\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x44\x00\x00\x00\x00\x00\x00\x4c\x77\x00\x00\x00\x00\x40\x45\x00\x00\x00\x00\x70\x50\x00\x00\x48\x73\x00\x00\x70\x51\x73\x53\x4c\x4c\x00\x00\x70\x52\x00\x00\x70\x53\x00\x00\x70\x54\x33\x57\x00\x00\x70\x56\x00\x00\x3f\x59\x00\x00\x00\x00\x00\x00\x70\x57\x00\x00\x00\x00\x37\x24\x00\x00\x00\x00\x00\x00\x00\x00\x70\x58\x70\x5c\x00\x00\x70\x5a\x00\x00\x00\x00\x00\x00", /* 9780 */ "\x00\x00\x70\x5b\x00\x00\x00\x00\x33\x73\x70\x59\x70\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x70\x5e\x00\x00\x30\x48\x00\x00\x70\x5f\x70\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x64\x00\x00\x00\x00\x00\x00\x70\x61\x00\x00\x00\x00\x00\x00\x35\x47\x00\x00\x00\x00\x70\x64\x00\x00\x00\x00\x70\x63\x00\x00\x70\x62\x00\x00\x00\x00\x6b\x71\x00\x00\x4a\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x65\x70\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x67\x00\x00\x00\x00\x70\x68\x00\x00\x70\x69\x00\x00\x00\x00\x70\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x6c\x47\x23\x00\x00\x00\x00\x00\x00\x70\x6e\x32\x3b\x00\x00\x70\x71\x70\x70\x00\x00\x00\x00\x00\x00\x00\x00\x31\x24\x00\x00\x00\x00\x00\x00\x36\x41", /* 9800 */ "\x00\x00\x4a\x47\x44\x3a\x3a\x22\x00\x00\x39\x60\x3d\x67\x00\x00\x3f\x5c\x00\x00\x00\x00\x00\x00\x70\x73\x00\x00\x00\x00\x70\x72\x4d\x42\x34\x68\x48\x52\x46\x5c\x00\x00\x00\x00\x00\x00\x3f\x7c\x4e\x4e\x00\x00\x37\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x00\x00\x00\x00\x70\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x4b\x46\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x50\x00\x00\x00\x00\x70\x77\x70\x74\x00\x00\x00\x00\x49\x51\x4d\x6a\x70\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x79\x00\x00\x00\x00\x00\x00\x00\x00\x70\x7b\x42\x6a\x33\x5b\x33\x5c\x70\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x34\x69\x38\x32\x00\x00\x00\x00\x34\x6a\x00\x00\x00\x00\x45\x3f\x00\x00\x00\x00\x4e\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x5c\x00\x00\x00\x00\x00\x00\x70\x7c\x00\x00\x00\x00\x00\x00\x70\x7d\x70\x7e\x71\x21\x00\x00\x71\x23\x71\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9880 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x77\x00\x00\x71\x24\x00\x00\x00\x00\x00\x00\x00\x00\x71\x25\x00\x00\x71\x26\x00\x00\x00\x00\x00\x00\x00\x00\x71\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x29\x71\x28\x00\x00\x71\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x74\x66\x4c\x00\x00\x00\x00\x3f\x29\x00\x00\x00\x00\x35\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x2b\x00\x00\x71\x2c\x00\x00\x52\x2c\x5d\x3b\x48\x53\x00\x00\x00\x00\x30\x7b\x00\x00\x30\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x74\x4b\x30\x3e\x7e\x00\x00", /* 9900 */ "\x00\x00\x00\x00\x00\x00\x71\x2d\x00\x00\x4c\x5f\x00\x00\x00\x00\x00\x00\x71\x2e\x4d\x5c\x00\x00\x31\x42\x00\x00\x00\x00\x00\x00\x3b\x41\x00\x00\x71\x2f\x32\x6e\x71\x30\x00\x00\x00\x00\x00\x00\x71\x31\x00\x00\x00\x00\x00\x00\x00\x00\x71\x33\x71\x34\x00\x00\x71\x36\x71\x32\x00\x00\x00\x00\x71\x35\x00\x00\x00\x00\x00\x00\x34\x5b\x00\x00\x00\x00\x00\x00\x71\x37\x00\x00\x71\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x39\x71\x3a\x00\x00\x00\x00\x00\x00\x71\x3b\x00\x00\x00\x00\x71\x3d\x00\x00\x00\x00\x00\x00\x71\x3c\x00\x00\x71\x3f\x71\x42\x00\x00\x00\x00\x00\x00\x71\x3e\x71\x40\x71\x41\x00\x00\x00\x00\x71\x43\x00\x00\x36\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9980 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x73\x71\x44\x71\x45\x39\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x46\x00\x00\x00\x00\x33\x3e\x00\x00\x00\x00\x00\x00\x47\x4f\x71\x47\x71\x48\x00\x00\x00\x00\x00\x00\x00\x00\x43\x5a\x46\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x49\x00\x00\x00\x00\x00\x00\x00\x00\x47\x7d\x00\x00\x00\x00\x42\x4c\x31\x58\x36\x6e\x00\x00\x36\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x73\x71\x4e\x36\x70\x00\x00\x00\x00\x32\x6f\x00\x00\x00\x00\x71\x4d\x00\x00\x00\x00\x71\x4b\x00\x00\x71\x4c\x00\x00\x71\x4a\x00\x00\x00\x00\x71\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x4f\x71\x50\x00\x00\x00\x00\x71\x51\x71\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x54\x00\x00\x00\x00\x71\x53\x00\x00\x00\x00\x00\x00\x3d\x59", /* 9a00 */ "\x00\x00\x71\x55\x00\x00\x00\x00\x00\x00\x71\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x33\x71\x56\x00\x00\x00\x00\x41\x7b\x38\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x4d\x00\x00\x00\x00\x71\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x46\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x60\x00\x00\x71\x5e\x00\x00\x71\x5d\x71\x5f\x00\x00\x71\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x61\x00\x00\x71\x64\x00\x00\x00\x00\x36\x43\x71\x63\x00\x00\x00\x00\x00\x00\x71\x65\x00\x00\x00\x00\x71\x66\x00\x00\x71\x68\x71\x67\x00\x00\x00\x00\x00\x00\x71\x69\x71\x6b\x71\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9a80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x71\x6c\x00\x00\x00\x00\x71\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x3c\x00\x00\x00\x00\x00\x00\x71\x6e\x00\x00\x00\x00\x00\x00\x71\x6f\x00\x00\x00\x00\x00\x00\x3f\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x70\x00\x00\x71\x71\x00\x00\x71\x72\x71\x73\x00\x00\x00\x00\x00\x00\x39\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x74\x71\x75\x00\x00\x00\x00\x71\x76\x71\x77\x00\x00\x00\x00\x71\x78\x00\x00\x00\x00\x00\x00\x48\x31\x71\x7a\x00\x00\x49\x26\x71\x7b\x71\x79\x00\x00\x71\x7d\x00\x00\x00\x00\x71\x7c\x00\x00\x00\x00\x71\x7e\x00\x00\x00\x00\x00\x00\x72\x21\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x23\x00\x00\x72\x24\x00\x00\x00\x00\x00\x00\x00\x00\x72\x25\x00\x00\x00\x00\x72\x26\x72\x27\x00\x00\x72\x28\x00\x00\x72\x29\x72\x2a\x72\x2b\x72\x2c\x00\x00\x00\x00\x00\x00\x72\x2d\x72\x2e\x00\x00\x5d\x35\x72\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x78\x35\x34\x00\x00\x00\x00\x00\x00\x00\x00\x33\x21\x3a\x32\x72\x31\x72\x30\x4c\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x33\x72\x34\x72\x32\x00\x00\x72\x35\x00\x00\x00\x00\x4b\x62\x00\x00\x00\x00\x00\x00\x72\x36\x00\x00\x35\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x25\x00\x00\x00\x00\x00\x00\x00\x00\x72\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9b80 */ "\x00\x00\x00\x00\x00\x00\x72\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x3e\x00\x00\x00\x00\x72\x3a\x4a\x2b\x72\x38\x00\x00\x00\x00\x72\x3b\x72\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x3d\x72\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x3f\x00\x00\x4b\x6e\x3b\x2d\x00\x00\x3a\x7a\x41\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x40\x00\x00\x00\x00\x00\x00\x00\x00\x72\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x44\x00\x00\x00\x00\x38\x71\x72\x42\x00\x00\x00\x00\x00\x00\x00\x00\x72\x45\x00\x00\x72\x46\x72\x47\x00\x00\x72\x4b\x00\x00\x3b\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x42\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x4c\x72\x49\x72\x48\x72\x4a\x00\x00\x00\x00\x00\x00\x37\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x50\x72\x4f\x72\x4e\x00\x00\x00\x00\x30\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9c00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x72\x5a\x00\x00\x72\x56\x00\x00\x72\x57\x72\x53\x72\x59\x00\x00\x72\x55\x33\x62\x00\x00\x00\x00\x4f\x4c\x00\x00\x72\x58\x72\x54\x72\x52\x72\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x5f\x00\x00\x00\x00\x72\x5e\x72\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x49\x72\x5b\x30\x73\x72\x60\x00\x00\x72\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x6f\x72\x4d\x31\x37\x00\x00\x00\x00\x72\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x63\x72\x61\x43\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x70\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x5a\x00\x00\x00\x00\x72\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x68\x00\x00\x72\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9c80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x3b\x00\x00\x72\x6a\x00\x00\x48\x37\x00\x00\x72\x6f\x72\x6b\x00\x00\x00\x00\x00\x00\x72\x6c\x00\x00\x00\x00\x4b\x31\x4c\x44\x00\x00\x46\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9d00 */ "\x00\x00\x00\x00\x00\x00\x72\x70\x00\x00\x00\x00\x72\x71\x46\x3e\x72\x6e\x72\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x32\x2a\x00\x00\x00\x00\x00\x00\x72\x79\x00\x00\x00\x00\x72\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x75\x00\x00\x00\x00\x00\x00\x72\x76\x00\x00\x00\x00\x00\x00\x72\x75\x00\x00\x00\x00\x72\x73\x00\x00\x33\x7b\x00\x00\x72\x72\x3c\x32\x32\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x63\x00\x00\x00\x00\x72\x7c\x72\x7b\x00\x00\x72\x7a\x00\x00\x00\x00\x72\x77\x00\x00\x72\x7d\x00\x00\x72\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x25\x73\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x26\x00\x00\x00\x00\x31\x2d\x73\x21\x73\x22\x00\x00\x39\x74\x4c\x39\x00\x00\x00\x00\x73\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x32\x00\x00\x00\x00\x73\x2b\x00\x00\x00\x00\x73\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9d80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x29\x00\x00\x73\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x73\x2f\x00\x00\x73\x2a\x00\x00\x00\x00\x00\x00\x72\x74\x00\x00\x00\x00\x73\x30\x00\x00\x44\x61\x00\x00\x00\x00\x00\x00\x73\x34\x00\x00\x73\x35\x73\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x32\x73\x38\x00\x00\x73\x31\x00\x00\x73\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x37\x00\x00\x00\x00\x00\x00\x73\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3d\x00\x00\x73\x3e\x00\x00\x00\x00\x4f\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x3b\x42\x6b\x3a\x6d\x00\x00\x00\x00\x73\x3f\x00\x00\x00\x00", /* 9e00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x40\x73\x41\x00\x00\x00\x00\x73\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x43\x00\x00\x00\x00\x38\x34\x73\x44\x00\x00\x00\x00\x00\x00\x73\x45\x00\x00\x3c\x2f", /* 9e80 */ "\x00\x00\x73\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x47\x00\x00\x00\x00\x73\x48\x73\x49\x00\x00\x00\x00\x00\x00\x00\x00\x73\x4c\x73\x4a\x4f\x3c\x00\x00\x73\x4b\x00\x00\x4e\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x4d\x00\x00\x4e\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x4e\x47\x7e\x00\x00\x00\x00\x73\x4f\x73\x51\x00\x00\x00\x00\x73\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x50\x39\x6d\x4c\x4d\x4b\x63\x56\x77\x00\x00\x5d\x60\x4b\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x32\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x54\x35\x50\x73\x55\x73\x56\x73\x57\x00\x00\x39\x75\x00\x00\x73\x58\x00\x00\x00\x00\x00\x00\x60\x54\x4c\x5b\x00\x00\x42\x63\x73\x59\x73\x5b\x73\x5a\x00\x00\x73\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x73\x5d\x00\x00\x00\x00\x73\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x73\x60\x00\x00\x73\x61\x73\x62\x00\x00\x73\x63\x00\x00\x73\x64\x73\x65\x73\x66\x00\x00\x00\x00", /* 9f00 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x67\x73\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x24\x00\x00\x00\x00\x00\x00\x00\x00\x38\x5d\x00\x00\x73\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x4d\x73\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x21\x00\x00\x00\x00\x73\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x6e\x63\x37\x00\x00\x00\x00\x6c\x5a\x70\x6d\x00\x00\x00\x00\x73\x6f\x00\x00\x73\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x72\x73\x73\x73\x74\x4e\x70\x73\x71\x00\x00\x00\x00\x73\x75\x73\x76\x00\x00\x00\x00\x73\x78\x00\x00\x73\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x7a\x00\x00\x00\x00\x00\x00\x73\x7b\x73\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* 9f80 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x7d\x63\x54\x00\x00\x00\x00\x73\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", /* a000 */ NULL, /* a080 */ NULL, /* a100 */ NULL, /* a180 */ NULL, /* a200 */ NULL, /* a280 */ NULL, /* a300 */ NULL, /* a380 */ NULL, /* a400 */ NULL, /* a480 */ NULL, /* a500 */ NULL, /* a580 */ NULL, /* a600 */ NULL, /* a680 */ NULL, /* a700 */ NULL, /* a780 */ NULL, /* a800 */ NULL, /* a880 */ NULL, /* a900 */ NULL, /* a980 */ NULL, /* aa00 */ NULL, /* aa80 */ NULL, /* ab00 */ NULL, /* ab80 */ NULL, /* ac00 */ NULL, /* ac80 */ NULL, /* ad00 */ NULL, /* ad80 */ NULL, /* ae00 */ NULL, /* ae80 */ NULL, /* af00 */ NULL, /* af80 */ NULL, /* b000 */ NULL, /* b080 */ NULL, /* b100 */ NULL, /* b180 */ NULL, /* b200 */ NULL, /* b280 */ NULL, /* b300 */ NULL, /* b380 */ NULL, /* b400 */ NULL, /* b480 */ NULL, /* b500 */ NULL, /* b580 */ NULL, /* b600 */ NULL, /* b680 */ NULL, /* b700 */ NULL, /* b780 */ NULL, /* b800 */ NULL, /* b880 */ NULL, /* b900 */ NULL, /* b980 */ NULL, /* ba00 */ NULL, /* ba80 */ NULL, /* bb00 */ NULL, /* bb80 */ NULL, /* bc00 */ NULL, /* bc80 */ NULL, /* bd00 */ NULL, /* bd80 */ NULL, /* be00 */ NULL, /* be80 */ NULL, /* bf00 */ NULL, /* bf80 */ NULL, /* c000 */ NULL, /* c080 */ NULL, /* c100 */ NULL, /* c180 */ NULL, /* c200 */ NULL, /* c280 */ NULL, /* c300 */ NULL, /* c380 */ NULL, /* c400 */ NULL, /* c480 */ NULL, /* c500 */ NULL, /* c580 */ NULL, /* c600 */ NULL, /* c680 */ NULL, /* c700 */ NULL, /* c780 */ NULL, /* c800 */ NULL, /* c880 */ NULL, /* c900 */ NULL, /* c980 */ NULL, /* ca00 */ NULL, /* ca80 */ NULL, /* cb00 */ NULL, /* cb80 */ NULL, /* cc00 */ NULL, /* cc80 */ NULL, /* cd00 */ NULL, /* cd80 */ NULL, /* ce00 */ NULL, /* ce80 */ NULL, /* cf00 */ NULL, /* cf80 */ NULL, /* d000 */ NULL, /* d080 */ NULL, /* d100 */ NULL, /* d180 */ NULL, /* d200 */ NULL, /* d280 */ NULL, /* d300 */ NULL, /* d380 */ NULL, /* d400 */ NULL, /* d480 */ NULL, /* d500 */ NULL, /* d580 */ NULL, /* d600 */ NULL, /* d680 */ NULL, /* d700 */ NULL, /* d780 */ NULL, /* d800 */ NULL, /* d880 */ NULL, /* d900 */ NULL, /* d980 */ NULL, /* da00 */ NULL, /* da80 */ NULL, /* db00 */ NULL, /* db80 */ NULL, /* dc00 */ NULL, /* dc80 */ NULL, /* dd00 */ NULL, /* dd80 */ NULL, /* de00 */ NULL, /* de80 */ NULL, /* df00 */ NULL, /* df80 */ NULL, /* e000 */ NULL, /* e080 */ NULL, /* e100 */ NULL, /* e180 */ NULL, /* e200 */ NULL, /* e280 */ NULL, /* e300 */ NULL, /* e380 */ NULL, /* e400 */ NULL, /* e480 */ NULL, /* e500 */ NULL, /* e580 */ NULL, /* e600 */ NULL, /* e680 */ NULL, /* e700 */ NULL, /* e780 */ NULL, /* e800 */ NULL, /* e880 */ NULL, /* e900 */ NULL, /* e980 */ NULL, /* ea00 */ NULL, /* ea80 */ NULL, /* eb00 */ NULL, /* eb80 */ NULL, /* ec00 */ NULL, /* ec80 */ NULL, /* ed00 */ NULL, /* ed80 */ NULL, /* ee00 */ NULL, /* ee80 */ NULL, /* ef00 */ NULL, /* ef80 */ NULL, /* f000 */ NULL, /* f080 */ NULL, /* f100 */ NULL, /* f180 */ NULL, /* f200 */ NULL, /* f280 */ NULL, /* f300 */ NULL, /* f380 */ NULL, /* f400 */ NULL, /* f480 */ NULL, /* f500 */ NULL, /* f580 */ NULL, /* f600 */ NULL, /* f680 */ NULL, /* f700 */ NULL, /* f780 */ NULL, /* f800 */ NULL, /* f880 */ NULL, /* f900 */ NULL, /* f980 */ NULL, /* fa00 */ NULL, /* fa80 */ NULL, /* fb00 */ NULL, /* fb80 */ NULL, /* fc00 */ NULL, /* fc80 */ NULL, /* fd00 */ NULL, /* fd80 */ NULL, /* fe00 */ NULL, /* fe80 */ NULL, /* ff00 */ "\x00\x00\x21\x2a\x00\x00\x21\x74\x21\x70\x21\x73\x21\x75\x00\x00\x21\x4a\x21\x4b\x21\x76\x21\x5c\x21\x24\x00\x00\x21\x25\x21\x3f\x23\x30\x23\x31\x23\x32\x23\x33\x23\x34\x23\x35\x23\x36\x23\x37\x23\x38\x23\x39\x21\x27\x21\x28\x21\x63\x21\x61\x21\x64\x21\x29\x21\x77\x23\x41\x23\x42\x23\x43\x23\x44\x23\x45\x23\x46\x23\x47\x23\x48\x23\x49\x23\x4a\x23\x4b\x23\x4c\x23\x4d\x23\x4e\x23\x4f\x23\x50\x23\x51\x23\x52\x23\x53\x23\x54\x23\x55\x23\x56\x23\x57\x23\x58\x23\x59\x23\x5a\x21\x4e\x00\x00\x21\x4f\x21\x30\x21\x32\x21\x2e\x23\x61\x23\x62\x23\x63\x23\x64\x23\x65\x23\x66\x23\x67\x23\x68\x23\x69\x23\x6a\x23\x6b\x23\x6c\x23\x6d\x23\x6e\x23\x6f\x23\x70\x23\x71\x23\x72\x23\x73\x23\x74\x23\x75\x23\x76\x23\x77\x23\x78\x23\x79\x23\x7a\x21\x50\x21\x43\x21\x51\x00\x00\x00\x00\x00\x00\x21\x23\x21\x56\x21\x57\x21\x22\x21\x26\x25\x72\x25\x21\x25\x23\x25\x25\x25\x27\x25\x29\x25\x63\x25\x65\x25\x67\x25\x43\x21\x3c\x25\x22\x25\x24\x25\x26\x25\x28\x25\x2a\x25\x2b\x25\x2d\x25\x2f\x25\x31\x25\x33\x25\x35\x25\x37\x25\x39\x25\x3b\x25\x3d", /* ff00 */ "\x25\x3f\x25\x41\x25\x44\x25\x46\x25\x48\x25\x4a\x25\x4b\x25\x4c\x25\x4d\x25\x4e\x25\x4f\x25\x52\x25\x55\x25\x58\x25\x5b\x25\x5e\x25\x5f\x25\x60\x25\x61\x25\x62\x25\x64\x25\x66\x25\x68\x25\x69\x25\x6a\x25\x6b\x25\x6c\x25\x6d\x25\x6f\x25\x73\x21\x2b\x21\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x31\x00\x00\x21\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" } }, #endif /*]*/ { NULL } }; #define ND16 (sizeof(d16)/sizeof(d16_t)) /* * Initialize or re-initialize the 16-bit display character set. * Returns an index into the d16 table, or -1 for failure. */ int display16_init(char *cset) { int i; for (i = 0; d16[i].cset; i++) { if (!strcasecmp(cset, d16[i].cset)) { return i; } } if (!strcasecmp(cset, "iso10646-1")) return ISO10646_IX; return -1; } /* * Map a Unicode character onto the 16-bit display character set. * Returns -1 if there is no mapping. */ int display16_lookup(int d16_ix, ucs4_t ucs4) { int row, col; int ix; /* Handle errors. */ if (d16_ix < 0) return -1; /* Handle ISO 10646-1. */ if (d16_ix == ISO10646_IX) return (int)ucs4; /* Handle more errors. */ if ((unsigned)d16_ix >= (ND16 - 1)) return -1; /* Check for a match in the proper table. */ if (ucs4 > 0xffff) return -1; row = (ucs4 >> 7) & 0x1ff; if (d16[d16_ix].u[row] == NULL) return -1; col = (ucs4 & 0x7f) * 2; ix = ((d16[d16_ix].u[row][col] & 0xff) << 8) | (d16[d16_ix].u[row][col + 1] & 0xff); if (ix != 0) return ix; /* Give up. */ return -1; } suite3270-3.6/x3270/display8.h0000664000076500007650000000324013221577164013665 0ustar pdmpdm/* * Copyright (c) 2008-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ int display8_init(char *cset); int display8_lookup(int d8_ix, ucs4_t ucs4); int display16_init(char *cset); int display16_lookup(int d16_ix, ucs4_t ucs4); suite3270-3.6/x3270/display_charsets.c0000664000076500007650000001063713221577164015474 0ustar pdmpdm/* * Copyright (c) 2008-2015, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * display_charsets.c * Display character set lookup. */ #include "globals.h" #include "display_charsets.h" typedef struct { const char *name; const char *display_charset; } dcs_t; static dcs_t dcs[] = { { "cp037", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp273", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp275", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp277", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp278", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp280", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp284", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp285", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp297", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp424", "3270cg-8,iso10646-1,iso8859-8" }, { "cp500", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp803", "3270cg-8,iso10646-1,iso-8859-8" }, { "cp870", "iso10646-1,iso8859-2" }, { "cp871", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp875", "3270cg-7,iso10646-1,iso8859-7" }, { "cp880", "iso10646-1,koi8-r" }, #if defined(X3270_DBCS) /*[*/ { "cp930", "iso10646-1,jisx0201.1976-0" }, { "cp935", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp937", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp939", "iso10646-1,jisx0201.1976-0" }, #endif /*]*/ { "cp1026", "iso10646-1,iso8859-9" }, { "cp1047", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { "cp1140", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1141", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1142", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1143", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1144", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1145", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1146", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1147", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1148", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1149", "3270cg-1a,3270cg-1,iso10646-1,iso8859-15" }, { "cp1160", "iso10646-1,iso8859-11" }, #if defined(X3270_DBCS) /*[*/ { "cp1388", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, #endif /*]*/ { "apl", "3270cg-1a,iso10646-1" }, { "bracket", "3270cg-1a,3270cg-1,iso10646-1,iso8859-1" }, { NULL, NULL } }; /** * Return the X11 SBCS display character sets for a given host character set * (code page). * * Does not support aliases. If the user-supplied name is an alias, then the * canonical name must be used instead. * * @param[in] charset_name Canonical chararcter set name * * @return Comma-separated list of display character sets, or NULL if no match * is found. */ const char * lookup_display_charset(const char *charset_name) { int i; for (i = 0; dcs[i].name != NULL; i++) { if (!strcasecmp(charset_name, dcs[i].name)) { return dcs[i].display_charset; } } return NULL; } suite3270-3.6/x3270/display_charsets_dbcs.c0000664000076500007650000000563313221577164016467 0ustar pdmpdm/* * Copyright (c) 2008-2012, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * display_charsets_dbcs.c * DBCS display chararacter set lookup. */ #include "globals.h" #include "display_charsets_dbcs.h" /* * Note: #undef'ing X3270_DBCS disables the ability to configure a DBCS host * codepage, but it does not disable the internal logic that supports DBCS. * Its purpose is to save space in the executable by removing the translation * tables, not by turning the code into #ifdef spaghetti. */ /* * DBCS EBCDIC-to-Unicode translation tables. */ typedef struct { const char *name; const char *display_charset; } dcd_t; static dcd_t dcd[] = { { "cp930", "jisx0208.1983-0,iso10646-1" }, { "cp935", "gb2312.1980-0,iso10646-1" }, { "cp937", "big5-0,iso10646-1" }, { "cp1388", "gb18030.2000-1,iso10646-1" }, { NULL, NULL } }; /** * Return the X11 DBCS display character sets for a given host character set * (code page). * * Does not support aliases. If the user-supplied name is an alias, then the * canonical name must be used instead. * * @param[in] charset_name Canonical chararcter set name * * @return Comma-separated list of display character sets, or NULL if no match * is found. */ const char * lookup_display_charset_dbcs(const char *charset_name) { int i; for (i = 0; dcd[i].name != NULL; i++) { if (!strcasecmp(charset_name, dcd[i].name)) { return dcd[i].display_charset; } } return NULL; } suite3270-3.6/x3270/display_charsets_dbcs.h0000664000076500007650000000325713221577164016474 0ustar pdmpdm/* * Copyright (c) 2008-2012, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * display_charsets_dbcs.h * Declarations for DBCS display chararacter set lookup. */ const char *lookup_display_charset_dbcs(const char *charset_name); suite3270-3.6/x3270/display_charsets.h0000664000076500007650000000322513221577164015474 0ustar pdmpdm/* * Copyright (c) 2008-2015, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * display_charsets.h * Declarations for display character set lookup. */ const char *lookup_display_charset(const char *charset_name); suite3270-3.6/x3270/documentation-ssl-body.html0000664000076500007650000002056613221577163017261 0ustar pdmpdm

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/x3270/dot.bm0000664000076500007650000000031613221577164013066 0ustar pdmpdm#define dot_width 10 #define dot_height 10 static unsigned char dot_bits[] = { 0x55, 0xfd, 0xaa, 0xfc, 0xfd, 0xfc, 0xfe, 0xfc, 0xfd, 0xfc, 0xfe, 0xfc, 0xfd, 0xfc, 0xfe, 0xfc, 0x01, 0xfc, 0x00, 0xfc}; suite3270-3.6/x3270/dryrun.in0000775000076500007650000000437213221577164013644 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2015 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Run x3270 from the current directory # Bomb on any error set -e # Figure out the pathname of the directory dryrun is in. d=`dirname $0` case "$d" in .) d=`pwd` ;; /*) ;; *) d=`pwd`/$d esac # Say what you're doing set -x # Set up the fonts mkfontdir $d xset +fp $d/ xset fp rehash # Set up the dynamic library path if [ -d /usr/openwin/lib ] then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/openwin/lib fi if [ -d /usr/ucblib ] then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ucblib fi export LD_LIBRARY_PATH # Set up the PATH to include pr3287 and s3270 (for x3270if). export PATH=$d/pr3287:$d/s3270:$PATH # Run x3270, pointing it to the build directory for its configuration files set +e $d/x3270 -xrm "x3270.confDir: $d" "$@" # Clean up xset -fp $d/ xset fp rehash suite3270-3.6/x3270/Examples/child_script.bash0000664000076500007650000000433013221577164017044 0ustar pdmpdm#! /bin/bash # TSO login script, to be run via the x3270 Script() action. # bash version set -x me=${0##*/} # Make sure we're in the right environment. if [ -z "$X3270INPUT" -o -z "$X3270OUTPUT" ] then echo >&2 "$me: must be run via the x3270 Script() action." exit 1 fi # Set up login parameters tcp_host=${1-ibmsys} dial_user=${2-VTAM} sna_host=${3-TSO} userid=${4-USERID} password=${5-PASSWORD} # Verbose flag for x3270if v="-v" # Define some handly local functions. # Common x3270 Ascii function function ascii { x3270if $v 'Ascii('$1')' } # Common x3270 String function function string { x3270if $v 'String("'"$@"'")' } # x3270 cursor column function cursor_col { x3270if $v -s 10 } # x3270 connection status function cstatus { x3270if $v -s 4 } # Failure. function die { x3270if $v "Info(\"$me error: $@\")" x3270if $v "CloseScript(1)" exit 1 } # Make sure we're connected. x3270if $v Wait [ "$(cstatus)" = N ] && die "Not connected." # Get to a VM command screen x3270if $v Enter # Wait for VM's prompt while [ "$(ascii 1,0,5)" != "Enter" ] do sleep 2 done # Dial out to VTAM string "DIAL $dial_user" x3270if $v Enter typeset -i sl=10+${#dial_user} typeset -i dl=5+${#dial_user} while [ "$(ascii 0,64,4)" != VTAM ] do s="$(ascii 8,0,$sl | sed 's/^ *//')" if [ "$s" != "DIALED TO $dial_user" -a "$s" != "" ] then if [ "$(ascii 7,0,$dl)" = "DIAL $dial_user" ] then die "Couldn't get to VTAM" fi fi sleep 2 done # Get to the SNA host string "$sna_host $userid" x3270if $v Enter # Pass VTAM digestion message and initial blank TSO screen while [ "$(ascii 0,21,20)" = "USS COMMAND HAS BEEN" ] do sleep 2 done while : do s="$(ascii 0,33,11 | sed 's/^ *//')" [ "$s" != "" ] && break sleep 2 done # Now verify the "TSO/E LOGON" screen [ "$s" = "TSO/E LOGON" ] || die "Couldn't get to TSO logon screen" # Pump in the password string "$password" x3270if $v Enter # Now look for "LOGON IN PROGRESS" typeset -i nl=18+${#userid} [ "$(ascii 0,11,$nl)" = "$userid LOGON IN PROGRESS" ] || die "Couldn't log on" # Make sure TSO is waiting for a '***' enter [ "$(cursor_col)" -eq 5 ] || die "Don't understand logon screen" # Off to ISPF x3270if $v Enter # No need to explicitly call CloseScript -- x3270 will interpret EOF as success. suite3270-3.6/x3270/Examples/child_script.ksh0000664000076500007650000000432713221577164016722 0ustar pdmpdm#! /bin/ksh # TSO login script, to be run via the x3270 Script() action. # ksh version set -x me=${0##*/} # Make sure we're in the right environment. if [ -z "$X3270INPUT" -o -z "$X3270OUTPUT" ] then print -u2 "$me: must be run via the x3270 Script() action." exit 1 fi # Set up login parameters tcp_host=${1-ibmsys} dial_user=${2-VTAM} sna_host=${3-TSO} userid=${4-USERID} password=${5-PASSWORD} # Verbose flag for x3270if v="-v" # Define some handly local functions. # Common x3270 Ascii function function ascii { x3270if $v 'Ascii('$1')' } # Common x3270 String function function string { x3270if $v 'String("'"$@"'")' } # x3270 cursor column function cursor_col { x3270if $v -s 10 } # x3270 connection status function cstatus { x3270if $v -s 4 } # Failure. function die { x3270if $v "Info(\"$me error: $@\")" x3270if $v "CloseScript(1)" exit 1 } # Make sure we're connected. x3270if $v Wait [ "$(cstatus)" = N ] && die "Not connected." # Get to a VM command screen x3270if $v Enter # Wait for VM's prompt while [ "$(ascii 1,0,5)" != "Enter" ] do sleep 2 done # Dial out to VTAM string "DIAL $dial_user" x3270if $v Enter typeset -i sl=10+${#dial_user} typeset -i dl=5+${#dial_user} while [ "$(ascii 0,64,4)" != VTAM ] do s="$(ascii 8,0,$sl | sed 's/^ *//')" if [ "$s" != "DIALED TO $dial_user" -a "$s" != "" ] then if [ "$(ascii 7,0,$dl)" = "DIAL $dial_user" ] then die "Couldn't get to VTAM" fi fi sleep 2 done # Get to the SNA host string "$sna_host $userid" x3270if $v Enter # Pass VTAM digestion message and initial blank TSO screen while [ "$(ascii 0,21,20)" = "USS COMMAND HAS BEEN" ] do sleep 2 done while : do s="$(ascii 0,33,11 | sed 's/^ *//')" [ "$s" != "" ] && break sleep 2 done # Now verify the "TSO/E LOGON" screen [ "$s" = "TSO/E LOGON" ] || die "Couldn't get to TSO logon screen" # Pump in the password string "$password" x3270if $v Enter # Now look for "LOGON IN PROGRESS" typeset -i nl=18+${#userid} [ "$(ascii 0,11,$nl)" = "$userid LOGON IN PROGRESS" ] || die "Couldn't log on" # Make sure TSO is waiting for a '***' enter [ "$(cursor_col)" -eq 5 ] || die "Don't understand logon screen" # Off to ISPF x3270if $v Enter # No need to explicitly call CloseScript -- x3270 will interpret EOF as success. suite3270-3.6/x3270/Examples/child_script.sh0000664000076500007650000000433013221577164016541 0ustar pdmpdm#! /bin/sh # TSO login script, to be run via the x3270 Script() action. # sh version set -x me=`echo $0 | sed 's/.*\///'` # Make sure we're in the right environment. if [ -z "$X3270INPUT" -o -z "$X3270OUTPUT" ] then echo >&2 "$me: must be run via the x3270 Script() action." exit 1 fi # Set up login parameters tcp_host=${1-ibmsys} dial_user=${2-VTAM} sna_host=${3-TSO} userid=${4-USERID} password=${5-PASSWORD} # Verbose flag for x3270if v="-v" # Define some handly local functions. # Common x3270 Ascii function ascii() { x3270if $v 'Ascii('$1')' } # Common x3270 String function string() { x3270if $v 'String("'"$@"'")' } # x3270 cursor column cursor_col() { x3270if $v -s 10 } # x3270 connection status cstatus() { x3270if $v -s 4 } # Failure. die() { x3270if $v "Info(\"$me error: $@\")" x3270if $v "CloseScript(1)" exit 1 } # Make sure we're connected. x3270if $v Wait [ "`cstatus`" = N ] && die "Not connected." # Get to a VM command screen x3270if $v Enter # Wait for VM's prompt while [ "`ascii 1,0,5`" != "Enter" ] do sleep 2 done # Dial out to VTAM string "DIAL $dial_user" x3270if $v Enter len0=`expr length $dial_user` sl=`expr 10 + $len0` dl=`expr 5 + $len0` while [ "`ascii 0,64,4`" != VTAM ] do s="`ascii 8,0,$sl | sed 's/^ *//'`" if [ "$s" != "DIALED TO $dial_user" -a "$s" != "" ] then if [ "`ascii 7,0,$dl`" = "DIAL $dial_user" ] then die "Couldn't get to VTAM" fi fi sleep 2 done # Get to the SNA host string "$sna_host $userid" x3270if $v Enter # Pass VTAM digestion message and initial blank TSO screen while [ "`ascii 0,21,20`" = "USS COMMAND HAS BEEN" ] do sleep 2 done while : do s="`ascii 0,33,11 | sed 's/^ *//'`" [ "$s" != "" ] && break sleep 2 done # Now verify the "TSO/E LOGON" screen [ "$s" = "TSO/E LOGON" ] || die "Couldn't get to TSO logon screen" # Pump in the password string "$password" x3270if $v Enter # Now look for "LOGON IN PROGRESS" len0=`expr length $userid` nl=`expr 18 + $len0` [ "`ascii 0,11,$nl`" = "$userid LOGON IN PROGRESS" ] || die "Couldn't log on" # Make sure TSO is waiting for a '***' enter [ "`cursor_col`" -eq 5 ] || die "Don't understand logon screen" # Off to ISPF x3270if $v Enter # No need to explicitly call CloseScript -- x3270 will interpret EOF as success. suite3270-3.6/x3270/Examples/cms_logon.bash0000664000076500007650000000674413221577164016370 0ustar pdmpdm#! /usr/local/bin/bash # Copyright (c) 1995-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VM login script, which runs as a peer of x3270. # bash version #set -x me=${0##*/} # Set up login parameters tcp_host=${1-ibmsys} userid=${2-USERID} password=${3-PASSWORD} # Verbose flag for x3270if #v="-v" # Define some handly local functions. # x3270 interface function function xi { x3270if $v "$@" } # 'xi' function, with space-to-comma translation function xic { typeset sep cmd="$1(" shift while [ $# -gt 0 ] do cmd="$cmd$sep\"$1\"" sep="," shift done cmd="$cmd)" xi "$cmd" } # Common x3270 Ascii function function ascii { xic Ascii $@ } # Common x3270 String function function string { xic String "$@" } # x3270 connection status function cstatus { xi -s 4 } # x3270 rows function rows { xi -s 7 } # x3270 columns function cols { xi -s 8 } # x3270 Snap function function snap { xic Snap $@ } # Failure. function die { xic Info "$me error: $@" xic CloseScript 1 exit 1 } # Wait for a READ prompt. function waitread { snap while [ "$(snap Ascii $(expr $(snap Rows) - 1) $(expr $(snap Cols) - 17) 4)" != "READ" ] do xic Wait Output snap done } # Set up pipes for x3270 I/O ip=/tmp/ip.$$ op=/tmp/op.$$ rm -f $ip $op mkfifo $ip $op # Start x3270 x3270 -script -model 2 <$ip >$op & # Set up file descriptors for pipe I/O. exec 5>$ip 6<$op # Unlink the pipes (they'll stay around until this script and x3270 exit). rm -f $ip $op # Tell x3270if where to find the pipes. export X3270INPUT=5 X3270OUTPUT=6 # Make sure x3270 is still running. xi -s 0 >/dev/null || exit 1 # Connect to host xic Connect $tcp_host || die "Connection failed." # Make sure we're connected. xic Wait InputField [ "$(cstatus)" = N ] && die "Not connected." # Log in. string "$userid" xic Tab string "$password" xic Enter waitread if [ "$(ascii 1 11 7)" = "Already" ] then die "Can't run -- already logged in." exit 1 fi # Boot CMS, if we have to. if [ "$(ascii $(expr $(rows) - 1) $(expr $(cols) - 20) 2)" = "CP" ] then xic Clear string "i cms" xic Enter waitread fi # Done. xic CloseScript exit 0 suite3270-3.6/x3270/Examples/cms_logon.sh0000664000076500007650000000650513221577164016060 0ustar pdmpdm#! /bin/sh # Copyright (c) 1995-2009, Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VM login script, which runs as a peer of x3270. # sh version #set -x me=`echo $0 | sed 's/.*\///'` # Set up login parameters tcp_host=${1-ibmsys} userid=${2-USERID} password=${3-PASSWORD} # Verbose flag for x3270if #v="-v" # Define some handly local functions. # x3270 interface function xi() { x3270if $v "$@" } # 'xi' function, with space-to-comma translation xic() { _sep="" _cmd="$1(" shift while [ $# -gt 0 ] do _cmd="$_cmd$_sep\"$1\"" _sep="," shift done _cmd="$_cmd)" xi "$_cmd" } # Common x3270 Ascii function ascii() { xic Ascii $@ } # Common x3270 String function string() { xic String "$@" } # x3270 connection status cstatus() { xi -s 4 } # x3270 rows rows() { xi -s 7 } # x3270 columns cols() { xi -s 8 } # Failure. die() { xic Info "$me error: $@" xic CloseScript 1 exit 1 } # x3270 Snap function snap() { xic Snap $@ } # Wait for a READ prompt. waitread() { snap while : do r=`snap Rows` r=`expr $r - 1` c=`snap Cols` c=`expr $c - 17` s=`snap Ascii $r $c 4` [ "$s" = "READ" ] && break xic Wait Output snap done } # Set up pipes for x3270 I/O ip=/tmp/ip.$$ op=/tmp/op.$$ rm -f $ip $op mkfifo $ip $op # Start x3270 x3270 -script -model 2 <$ip >$op & exec 5>$ip 6<$op rm -f $ip $op X3270INPUT=5 X3270OUTPUT=6 export X3270INPUT X3270OUTPUT xi -s 0 >/dev/null || exit 1 # Connect to host xic Connect $tcp_host || die "Connection failed." # Make sure we're connected. xic Wait InputField [ "`cstatus`" = N ] && die "Not connected." # Log in. string "$userid" xic Tab string "$password" xic Enter waitread if [ "`ascii 1 11 7`" = "Already" ] then die "Can't run -- already logged in." exit 1 fi # Boot CMS, if we have to. r=`rows` r=`expr $r - 1` c=`cols` c=`expr $c - 20` s=`ascii $r $c 2` if [ "$s" = "CP" ] then xic Clear string "i cms" xic Enter waitread fi # Done. xic CloseScript exit 0 suite3270-3.6/x3270/Examples/ibm_hosts0000664000076500007650000000231013221577164015444 0ustar pdmpdm# Sample x3270 hosts file # name type hostname login macro or string # Simple entry, no name translation. This is usually done just so that the # name appears on the "Connect" menu. vmsys primary vmsys # A simple entry that creates a shorthand name for a complex hostname. vm primary ibm_server.bigbucks.com # An entry that enters a username and password into a VM login screen. vm-macro primary vmsys String(myuser) Tab() String(mypasswd) Enter() # An old-style entry for the above, using backslash sequences embedded in a # string. Note that since the "login macro or string" doesn't look like an # x3270 action, x3270 takes it as a parameter to the String() action. vm-old primary vmsys myuser\tmypasswd\n # An entry that calls a script. tso-ksh primary vtamsys Script(child_script.ksh) # An entry that calls the same script with different parameters tso-ksh primary vtamsys Script(child_script.ksh,ibm-host2,VTAM,TSO,USER2,OTHERPASS) # An example of specifying an alternate port. playback primary localhost/4001 # An example of using the Expect() action to interact with an ASCII host. unixbox primary unixbox Expect(ogin:) String(myuser) Enter() Expect(ssword:) String(mypasswd) Enter() suite3270-3.6/x3270/Examples/peer_script.bash0000664000076500007650000000450413221577164016717 0ustar pdmpdm#! /bin/bash # TSO login script, which runs as a peer of x3270. # bash version set -x me=${0##*/} # Set up login parameters tcp_host=${1-ibmsys} dial_user=${2-VTAM} sna_host=${3-TSO} userid=${4-USERID} password=${5-PASSWORD} # Verbose flag for x3270if #v="-v" # Define some handly local functions. # x3270 interface function function xi { X3270OUTPUT=6 X3270INPUT=5 x3270if 5>$ip 6<$op $v "$@" } # Common x3270 Ascii function function ascii { xi 'Ascii('$1')' } # Common x3270 String function function string { xi 'String("'"$@"'")' } # x3270 cursor column function cursor_col { xi -s 10 } # x3270 connection status function cstatus { xi -s 4 } # Failure. function die { xi "Info(\"$me error: $@\")" xi "CloseScript(1)" exit 1 } # Set up pipes for x3270 I/O ip=/tmp/ip.$$ op=/tmp/op.$$ rm -f $ip $op trap "rm -f $ip $op" EXIT trap "exit" INT QUIT HUP TERM mknod $ip p mknod $op p # Start x3270 x3270 -script -model 2 <$ip >$op & xp=$! exec 5>$ip # hold the pipe open xi -s 0 >/dev/null || exit 1 # Connect to host xi "Connect($tcp_host)" || die "Connection failed." # Make sure we're connected. xi Wait [ "$(cstatus)" = N ] && die "Not connected." # Get to a VM command screen xi Enter # Wait for VM's prompt while [ "$(ascii 1,0,5)" != "Enter" ] do sleep 2 done # Dial out to VTAM string "DIAL $dial_user" xi Enter typeset -i sl=10+${#dial_user} typeset -i dl=5+${#dial_user} while [ "$(ascii 0,64,4)" != VTAM ] do s="$(ascii 8,0,$sl | sed 's/^ *//')" if [ "$s" != "DIALED TO $dial_user" -a "$s" != "" ] then if [ "$(ascii 7,0,$dl)" = "DIAL $dial_user" ] then die "Couldn't get to VTAM" fi fi sleep 2 done # Get to the SNA host string "$sna_host $userid" xi Enter # Pass VTAM digestion message and initial blank TSO screen while [ "$(ascii 0,21,20)" = "USS COMMAND HAS BEEN" ] do sleep 2 done while : do s="$(ascii 0,33,11 | sed 's/^ *//')" [ "$s" != "" ] && break sleep 2 done # Now verify the "TSO/E LOGON" screen [ "$s" = "TSO/E LOGON" ] || die "Couldn't get to TSO logon screen" # Pump in the password string "$password" xi Enter # Now look for "LOGON IN PROGRESS" typeset -i nl=18+${#userid} [ "$(ascii 0,11,$nl)" = "$userid LOGON IN PROGRESS" ] || die "Couldn't log on" # Make sure TSO is waiting for a '***' enter [ "$(cursor_col)" -eq 5 ] || die "Don't understand logon screen" # Off to ISPF xi Enter xi 'CloseScript(0)' suite3270-3.6/x3270/Examples/peer_script.expect0000664000076500007650000000541013221577164017267 0ustar pdmpdm#! /usr/local/bin/expect # TSO login script, which runs as a peer of x3270. # expect version # Set up login parameters set tcp_host ibmhost set dial_user VTAM set sna_host TSO set userid USERID set password PASSWORD # Send x3270 Enter. proc x3270_enter {} { send "Enter()\r" expect "*ok\r\n" } # Fetch text from the screen. proc x3270_ascii {coords} { send "Ascii($coords)\r" expect { -re "data: (.*)\r\n.*\r\nok\r\n$" { return $expect_out(1,string) } } send_user "Ascii failed.\n" } # Display an error message and exit. proc x3270_error {text} { global spid send "Info(\042$text\042)\r" expect "*ok\r\n" send "CloseScript\r" expect "*ok\r\n" close -i $spid exit } ############################################################################# # Start of main procedure. # Start x3270 set stty_init -echo spawn -noecho -ignore SIGHUP x3270 -script -model 2 -color set spid $spawn_id # Connect to host set connected 0 while {$connected == 0} { send "Connect($tcp_host)\r" ; send "Wait()\r" expect { "U F U C($tcp_host)*" { set connected 1 } default { send "Disconnect()\r" expect "*ok\r\n" exec sleep 3 } } } # Get to a VM command screen x3270_enter # Wait for VM's prompt set enter 0 while {$enter==0} { if {"[x3270_ascii 1,0,5]" == "Enter"} {set enter 1} {sleep 2} } # Dial out to VTAM send "String(\042DIAL $dial_user\042)\r" expect "*ok\r\n" x3270_enter # No proper way I can think of to do this: let the DIAL command digest exec sleep 2 # "DIALED TO xxx" may momentarily flash set dialed 0 while {$dialed==0} { if {"[x3270_ascii 8,0,80]" == "DIALED TO $dial_user"} {exec sleep 2} {set dialed 1} } # Make sure we are dialed to VTAM if {"[x3270_ascii 0,64,4]" != "VTAM"} { x3270_error "Couldn't get to VTAM" } # Get to the SNA host send "String(\042$sna_host $userid\042)\r" x3270_enter # Pass VTAM digestion message set digested 0 while {$digested==0} { if {"[x3270_ascii 0,21,20]" == "USS COMMAND HAS BEEN"} {exec sleep 2} {set digested 1} } # Now verify the "TSO/E LOGON" screen if {"[x3270_ascii 0,33,11]" != "TSO/E LOGON"} { x3270_error "Couldn't get to TSO logon screen" } # Pump in the password send "String($password)\r" x3270_enter # Now look for "LOGON IN PROGRESS" set timeout 600 set sl [expr "18 + [string length $userid]"] if {"[x3270_ascii 0,11,$sl]" != "$userid LOGON IN PROGRESS"} { x3270_error "Couldn't log on" } # Make sure TSO is waiting for a '***' enter set timeout 10 send "\r" expect { -re ".* (.*) 0x.*\r\nok\r\n" { if {$expect_out(1,string) != "5" } { x3270_error "Don't understand logon screen" } } } # Off to ISPF x3270_enter # We're in; exit the script and let the user interact. send "CloseScript\r" expect "*ok\r\n" close -i $spid exit suite3270-3.6/x3270/Examples/peer_script.ksh0000664000076500007650000000422513221577164016567 0ustar pdmpdm#! /bin/ksh # TSO login script, which runs as a peer of x3270. # ksh version #set -x me=${0##*/} # Set up login parameters tcp_host=${1-ibmsys} dial_user=${2-VTAM} sna_host=${3-TSO} userid=${4-USERID} password=${5-PASSWORD} # Verbose flag for x3270if #v="-v" # Define some handly local functions. # x3270 interface function function xi { X3270OUTPUT=6 X3270INPUT=5 x3270if 5>&p 6<&p $v "$@" } # Common x3270 Ascii function function ascii { xi 'Ascii('$1')' } # Common x3270 String function function string { xi 'String("'"$@"'")' } # x3270 cursor column function cursor_col { xi -s 10 } # x3270 connection status function cstatus { xi -s 4 } # Failure. function die { xi "Info(\"$me error: $@\")" xi "CloseScript(1)" exit 1 } # Start x3270 as a co-process x3270 -script -model 2 2>&1 |& xp=$! xi -s 0 >/dev/null || exit 1 # Connect to host xi "Connect($tcp_host)" || die "Connection failed." # Make sure we're connected. xi Wait [ "$(cstatus)" = N ] && die "Not connected." # Get to a VM command screen xi Enter # Wait for VM's prompt while [ "$(ascii 1,0,5)" != "Enter" ] do sleep 2 done # Dial out to VTAM string "DIAL $dial_user" xi Enter typeset -i sl=10+${#dial_user} typeset -i dl=5+${#dial_user} while [ "$(ascii 0,64,4)" != VTAM ] do s="$(ascii 8,0,$sl | sed 's/^ *//')" if [ "$s" != "DIALED TO $dial_user" -a "$s" != "" ] then if [ "$(ascii 7,0,$dl)" = "DIAL $dial_user" ] then die "Couldn't get to VTAM" fi fi sleep 2 done # Get to the SNA host string "$sna_host $userid" xi Enter # Pass VTAM digestion message and initial blank TSO screen while [ "$(ascii 0,21,20)" = "USS COMMAND HAS BEEN" ] do sleep 2 done while : do s="$(ascii 0,33,11 | sed 's/^ *//')" [ "$s" != "" ] && break sleep 2 done # Now verify the "TSO/E LOGON" screen [ "$s" = "TSO/E LOGON" ] || die "Couldn't get to TSO logon screen" # Pump in the password string "$password" xi Enter # Now look for "LOGON IN PROGRESS" typeset -i nl=18+${#userid} [ "$(ascii 0,11,$nl)" = "$userid LOGON IN PROGRESS" ] || die "Couldn't log on" # Make sure TSO is waiting for a '***' enter [ "$(cursor_col)" -eq 5 ] || die "Don't understand logon screen" # Off to ISPF xi Enter xi 'CloseScript(0)' suite3270-3.6/x3270/Examples/peer_script.sh0000664000076500007650000000446013221577164016415 0ustar pdmpdm#! /bin/sh # TSO login script, which runs as a peer of x3270. # sh version set -x me=`echo $0 | sed 's/.*\///'` # Set up login parameters tcp_host=${1-ibmsys} dial_user=${2-VTAM} sna_host=${3-TSO} userid=${4-USERID} password=${5-PASSWORD} # Verbose flag for x3270if #v="-v" # Define some handly local functions. # x3270 interface function xi() { X3270OUTPUT=6 X3270INPUT=5 x3270if 5>$ip 6<$op $v "$@" } # Common x3270 Ascii function ascii() { xi 'Ascii('$1')' } # Common x3270 String function string() { xi 'String("'"$@"'")' } # x3270 cursor column cursor_col() { xi -s 10 } # x3270 connection status cstatus() { xi -s 4 } # Failure. die() { xi "Info(\"$me error: $@\")" xi "CloseScript(1)" exit 1 } # Set up pipes for x3270 I/O ip=/tmp/ip.$$ op=/tmp/op.$$ rm -f $ip $op trap "rm -f $ip $op" 0 trap "exit" 2 3 1 15 mknod $ip p mknod $op p # Start x3270 x3270 -script -model 2 <$ip >$op & xp=$! exec 5>$ip # hold the pipe open xi -s 0 >/dev/null || exit 1 # Connect to host xi "Connect($tcp_host)" || die "Connection failed." # Make sure we're connected. xi Wait [ "`cstatus`" = N ] && die "Not connected." # Get to a VM command screen xi Enter # Wait for VM's prompt while [ "`ascii 1,0,5`" != "Enter" ] do sleep 2 done # Dial out to VTAM string "DIAL $dial_user" xi Enter len0=`expr length $dial_user` sl=`expr 10 + $len0` dl=`expr 5 + $len0` while [ "`ascii 0,64,4`" != VTAM ] do s="`ascii 8,0,$sl | sed 's/^ *//'`" if [ "$s" != "DIALED TO $dial_user" -a "$s" != "" ] then if [ "`ascii 7,0,$dl`" = "DIAL $dial_user" ] then die "Couldn't get to VTAM" fi fi sleep 2 done # Get to the SNA host string "$sna_host $userid" xi Enter # Pass VTAM digestion message and initial blank TSO screen while [ "`ascii 0,21,20`" = "USS COMMAND HAS BEEN" ] do sleep 2 done while : do s="`ascii 0,33,11 | sed 's/^ *//'`" [ "$s" != "" ] && break sleep 2 done # Now verify the "TSO/E LOGON" screen [ "$s" = "TSO/E LOGON" ] || die "Couldn't get to TSO logon screen" # Pump in the password string "$password" xi Enter # Now look for "LOGON IN PROGRESS" len0=`expr length $userid` nl=`expr 18 + $len0` [ "`ascii 0,11,$nl`" = "$userid LOGON IN PROGRESS" ] || die "Couldn't log on" # Make sure TSO is waiting for a '***' enter [ "`cursor_col`" -eq 5 ] || die "Don't understand logon screen" # Off to ISPF xi Enter xi 'CloseScript(0)' suite3270-3.6/x3270/fb-x32700000664000076500007650000015122513221577164013061 0ustar pdmpdm! ! Copyright (c) 1995-2015, Paul Mattes. ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions are met: ! * Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! * Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! * Neither the names of Paul Mattes nor the names of his contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED ! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO ! EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! x3270 app-defaults file. This file is generally compiled into x3270, rather ! than installed. ! ! This file is in three sections: ! ! (1) User-Modifiable Resources ! Resources that are likeliest to be modified by an end user. ! ! (2) Labels and Messages ! Resources that are likely to be modified for translation into another ! language. ! ! (3) Base-Level Resources ! Resources required for the basic operation of x3270, not for the ! faint-hearted to modify. ! !============================================================================= ! Section 1: User-Modifiable Resources ! ! Resources that are likeliest to be modified by an end user. !============================================================================= ! Color schemes x3270.colorScheme.default: \ black deepSkyBlue red pink \ green turquoise yellow white \ black blue3 orange purple \ paleGreen paleTurquoise2 grey white \ white black dimGrey \ 4 2 1 15 x3270.colorScheme.reverse: \ black blue firebrick pink \ green4 cadetBlue goldenrod black \ black blue3 orange purple \ paleGreen darkTurquoise grey black \ black white dimGrey \ 4 2 1 0 x3270.colorScheme.bright: \ black blue red magenta \ green turquoise yellow white \ black blue3 orange purple \ paleGreen cyan grey white \ white black dimGrey \ 4 2 1 15 x3270.colorScheme.cpe: \ black LightBlue1 PaleVioletRed1 \ pink green turquoise yellow white \ black LightBlue3 orange MediumPurple1 \ paleGreen paleTurquoise2 grey80 white \ white black dimGrey \ 4 2 1 15 x3270.colorScheme.greenScreen: \ green green green green \ green green green green \ green green green green \ green green green green \ white black dimGrey \ 4 15 4 15 ! Color schemes listed on the Options color menu x3270.schemeList: Default 3279: default\n\ Bright: bright\n\ Reverse: reverse\n\ Green Screen: greenScreen ! Character sets listed on the Options menu x3270.charsetList: U.S. English (CP 037): us-intl\n\ Bracket (CP 037, modified): bracket\n\ APL (CP 037): apl\n\ Euro>U.S. English (CP 1140): us-euro\n\ Euro>Belgian (CP 1148): belgian-euro\n\ Euro>Finnish (CP 1143): finnish-euro\n\ Euro>French (CP 1147): french-euro\n\ Euro>German (CP 1141): german-euro\n\ Euro>Icelandic (CP 1149): icelandic-euro\n\ Euro>Italian (CP 1144): italian-euro\n\ Euro>Norwegian (CP 1142): norwegian-euro\n\ Euro>Spanish (CP 1145): spanish-euro\n\ Euro>United Kingdom (CP 1146): uk-euro\n\ Belgian (CP 500): belgian\n\ Brazilian (CP 275): brazilian\n\ #ifdef X3270_DBCS Chinese Simplified (CP 935): simplified-chinese\n\ Chinese GB 18030 (CP 1388): chinese-gb18030\n\ Chinese Traditional (CP 937): traditional-chinese\n\ #endif Finnish (CP 278): finnish\n\ French (CP 297): french\n\ German (CP 273): german\n\ Greek (CP 875): greek\n\ Hebrew (CP 424): hebrew\n\ Icelandic (CP 871): icelandic\n\ Italian (CP 280): italian\n\ #ifdef X3270_DBCS Japanese w/Kana (CP 930): japanese-kana\n\ Japanese w/Latin (CP 939): japanese-latin\n\ #endif Norwegian (CP 277): norwegian\n\ Open Systems (CP 1047): cp1047\n\ Polish (CP 870): cp870\n\ Russian (CP 880): russian\n\ Slovenian (CP 870): cp870\n\ Spanish (CP 284): spanish\n\ Thai (CP 1160): thai\n\ Turkish (CP 1026): turkish\n\ United Kingdom (CP 285): uk\n ! Fonts listed on the Options menu and for screen resizing x3270.emulatorFontList.3270cg-1a,3270cg-1,iso10646-1,iso8859-1: \ 3270 Font (14 point): #resize 3270\n\ 8-point Font: #resize 3270gt8\n\ 12-point Font: #resize 3270-12\n\ 16-point Font: #resize 3270gt16\n\ 20-point Font: #resize 3270-20\n\ 24-point Font: #resize 3270gt24\n\ 32-point Font: #resize 3270gt32 x3270.emulatorFontList.3270cg-1a,3270cg-1,iso10646-1,iso8859-15: \ 3270 Font (14 point): #resize 3270\n\ 8-point Font: #resize 3270gt8\n\ 12-point Font: #resize 3270-12\n\ 16-point Font: #resize 3270gt16\n\ 20-point Font: #resize 3270-20\n\ 24-point Font: #resize 3270gt24\n\ 32-point Font: #resize 3270gt32 x3270.emulatorFontList.3270cg-1a,iso10646-1: 3270 x3270.emulatorFontList.3270cg-1a,3270cg-1,iso10646-1,iso8859-1+gb2312.1980-0,iso10646-1: \ 14-point 3270: 3270+-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0\n\ 20-point 3270: 3270-20+-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0\n\ 8x16: 8x16+-isas-song ti-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0\n\ 12x24: 12x24+-isas-song ti-medium-r-normal--24-240-72-72-c-240-gb2312.1980-0 x3270.emulatorFontList.iso10646-1,jisx0201.1976-0+jisx0208.1983-0,iso10646-1: \ 14-point: -misc-fixed-medium-r-normal--14-130-75-75-c-70-jisx0201.1976-0+-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0\n\ 16-point: -sony-fixed-medium-r-normal--16-150-75-75-c-80-jisx0201.1976-0+-jis-fixed-medium-r-normal--16-150-75-75-c-160-jisx0208.1983-0\n\ 18-point: -sony-fixed-medium-r-normal--16-150-75-75-c-80-jisx0201.1976-0+-misc-fixed-medium-r-normal-ja-18-120-100-100-c-180-iso10646-1\n\ 24-point: -sony-fixed-medium-r-normal--24-230-75-75-c-120-jisx0201.1976-0+-jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-0 x3270.emulatorFontList.3270cg-1a,3270cg-1,iso10646-1,iso8859-1+big5-0,iso10646-1: fixed+-wenquanyi-wenquanyi bitmap song-bold-r-normal--13-130-75-75-p-80-iso10646-1 x3270.printWindowCommand: xwd -id %d | xpr | lpr x3270.traceCommand: tail -f ! Translation table for the '@server' pseudo-keymap, which is the keymap ! you get by default (in addition to the 'base' keymap, below). Maps server ! vendor strings to keymap names. x3270.serverKeymapList: \ Sun Microsystems, Inc.: sun_k5\n\ Hewlett-Packard Company: hp-k1\n ! Keymaps (keyboard and mouse mappings) ! ! Base keymap: What you get by default, in both 3270 and NVT modes. Any other ! user-specified keymap is logically added to this keymap. ! *WARNING* Do not change this resource if all you want to do is to define a ! keymap! x3270.keymap.base: \ :Multi_key: Compose()\n\ Ctrl: HandleMenu(fileMenu)\n\ Ctrl: HandleMenu(optionsMenu)\n\ Ctrl: HandleMenu(hostMenu,macrosMenu)\n\ : SelectDown()\n\ ~Shift: SelectMotion()\n\ : ignore()\n\ : ignore()\n\ : insert-selection(PRIMARY)\n\ : start-extend()\n\ : select-extend()\n\ ~Shift: SelectUp(PRIMARY)\n\ ShiftInsert: insert-selection(PRIMARY)\n\ ShiftUp: KybdSelect(Up,PRIMARY)\n\ ShiftDown: KybdSelect(Down,PRIMARY)\n\ ShiftLeft: KybdSelect(Left,PRIMARY)\n\ ShiftRight: KybdSelect(Right,PRIMARY)\n\ ShiftF1: PF(13)\n\ ShiftF2: PF(14)\n\ ShiftF3: PF(15)\n\ ShiftF4: PF(16)\n\ ShiftF5: PF(17)\n\ ShiftF6: PF(18)\n\ ShiftF7: PF(19)\n\ ShiftF8: PF(20)\n\ ShiftF9: PF(21)\n\ ShiftF10: PF(22)\n\ ShiftF11: PF(23)\n\ ShiftF12: PF(24)\n\ MetaF1: PF(13)\n\ AltF1: PF(13)\n\ MetaF2: PF(14)\n\ AltF2: PF(14)\n\ MetaF3: PF(15)\n\ AltF3: PF(15)\n\ MetaF4: PF(16)\n\ AltF4: PF(16)\n\ MetaF5: PF(17)\n\ AltF5: PF(17)\n\ MetaF6: PF(18)\n\ AltF6: PF(18)\n\ MetaF7: PF(19)\n\ AltF7: PF(19)\n\ MetaF8: PF(20)\n\ AltF8: PF(20)\n\ MetaF9: PF(21)\n\ AltF9: PF(21)\n\ MetaF10: PF(22)\n\ AltF10: PF(22)\n\ MetaF11: PF(23)\n\ AltF11: PF(23)\n\ MetaF12: PF(24)\n\ AltF12: PF(24)\n\ :F1: PF(1)\n\ :F2: PF(2)\n\ :F3: PF(3)\n\ :F4: PF(4)\n\ :F5: PF(5)\n\ :F6: PF(6)\n\ :F7: PF(7)\n\ :F8: PF(8)\n\ :F9: PF(9)\n\ :F10: PF(10)\n\ :F11: PF(11)\n\ :F12: PF(12)\n\ :Print: PrintText()\n\ Altq: Quit()\n\ :dead_acute: Compose() Key(apostrophe)\n\ :dead_grave: Compose() Key(grave)\n\ :dead_circumflex: Compose() Key(asciicircum)\n\ :dead_tilde: Compose() Key(asciitilde)\n\ :dead_diaeresis: Compose() Key(quotedbl)\n\ :Prior: Scroll(Backward)\n\ :Next: Scroll(Forward)\n ! ! Base keymap for 3270 mode. These mappings are added to the base keymap, ! but only when in 3270 mode. ! These were originally part of the base keymap, but were moved here, because ! they were no-ops in NVT mode, or interfered with NVT-mode data entry. ! ! Note that as yet, there is no x3270.keymap.base.nvt, which would define the ! base keymap extensions for NVT mode. ! x3270.keymap.base.3270: #override \ :Ctrl Shift: MouseSelect()\n\ Shift: MoveCursor()\n\ ShiftReturn: Newline()\n\ :Return: Enter()\n\ :Linefeed: Newline()\n\ :BackSpace: Erase()\n\ ShiftTab: BackTab()\n\ :MetaLeft: PreviousWord()\n\ :AltLeft: PreviousWord()\n\ :MetaRight: NextWord()\n\ :AltRight: NextWord()\n\ :Meta1: PA(1)\n\ :Alt1: PA(1)\n\ :Meta2: PA(2)\n\ :Alt2: PA(2)\n\ :Meta3: PA(3)\n\ :Alt3: PA(3)\n\ Metaa: Attn()\n\ Alta: Attn()\n\ Metab: PrintWindow()\n\ Altb: PrintWindow()\n\ Metac: Clear()\n\ Altc: Clear()\n\ Metad: Delete()\n\ Altd: Delete()\n\ Metae: EraseEOF()\n\ Alte: EraseEOF()\n\ Metaf: Flip()\n\ Altf: Flip()\n\ Metah: Home()\n\ Alth: Home()\n\ Metai: Insert()\n\ Alti: Insert()\n\ Metal: Redraw()\n\ Altl: Redraw()\n\ Metap: PrintText()\n\ Altp: PrintText()\n\ Metar: Reset()\n\ Altr: Reset()\n\ Metau: Unselect()\n\ Altu: Unselect()\n\ Ctrla: SelectAll(PRIMARY)\n\ Ctrlc: set-select(CLIPBOARD)\n\ Ctrlu: DeleteField()\n\ Ctrlv: insert-selection(CLIPBOARD)\n\ Altv: ToggleReverse()\n\ Metav: ToggleReverse()\n\ Ctrlw: DeleteWord()\n\ Ctrlx: Cut(CLIPBOARD) ! Keymap that restores the old (pre 3.3) mouse-click behavior. x3270.keymap.oldclick: #override\n\ Ctrl: HandleMenu(fileMenu)\n\ Ctrl: HandleMenu(optionsMenu)\n\ Ctrl: HandleMenu(hostMenu,macrosMenu)\n\ : select-start()\n\ ~Shift: select-extend()\n\ : ignore()\n\ : ignore()\n\ : insert-selection(PRIMARY)\n\ : start-extend()\n\ : select-extend()\n\ ~Shift: select-end(PRIMARY) x3270.keymap.oldclick.3270: #override\n\ :Ctrl Shift: MouseSelect()\n\ Shift: MoveCursor() ! ! Start of keyboard-specific mappings. ! ! Sun Type 5 keyboard map. Not compatible with earlier Type 3 and Type 4 ! keymaps, but does a better job of mapping intuitive functions to the ! existing key labels, and has fewer surprises. x3270.keymap.sun_k5: \ Shift0x1005ff10: PF(23)\n\ Shift0x1005ff11: PF(24)\n\ :0x1005ff10: PF(11)\n\ :0x1005ff11: PF(12)\n\ ~@Num_LockF27: Home()\n\ ~@Num_LockF33: FieldEnd()\n\ :F18: insert-selection(PRIMARY)\n\ ShiftF22: SysReq()\n\ :F22: PrintText()\n\ KP_Enter: Newline()\n ! Sun Type 4 keyboard map, backwards-compatible with earlier versions of x3270. x3270.keymap.sun_k4: \ Shift0x1005ff10: PF(23)\n\ Shift0x1005ff11: PF(24)\n\ :0x1005ff10: PF(11)\n\ :0x1005ff11: PF(12)\n\ :KP_1: Key(1)\n\ :KP_2: Key(2)\n\ :KP_3: Key(3)\n\ :KP_4: Key(4)\n\ :KP_5: Key(5)\n\ :KP_6: Key(6)\n\ :KP_7: Key(7)\n\ :KP_8: Key(8)\n\ :KP_9: Key(9)\n\ :KP_0: Key(0)\n\ :KP_Decimal: Key(.)\n\ :F18: insert-selection(PRIMARY)\n\ :F19: SysReq()\n\ :F20: FieldMark()\n\ :F21: PA(1)\n\ :F22: PA(2)\n\ :F23: Dup()\n\ :F24: Reset()\n\ :F25: EraseEOF()\n\ :F26: EraseInput()\n\ :F27: Clear()\n\ :F29: Redraw()\n\ :F31: Home()\n\ :KP_Enter: Newline()\n\ :F35: Delete()\n ! Sun Type 3 keyboard. x3270.keymap.sun_k3: \ ShiftF21: PF(22)\n\ ShiftF22: PF(23)\n\ ShiftF23: PF(24)\n\ :MetaF21: PA(1)\n\ :MetaF22: PA(2)\n\ :MetaF23: Dup()\n\ :F19: SysReq()\n\ :0x0: FieldMark()\n\ :F21: PF(10)\n\ :F22: PF(11)\n\ :F23: PF(12)\n\ :F24: Reset()\n\ :F25: EraseEOF()\n\ :F26: EraseInput()\n\ :F27: Clear()\n\ :F31: Home()\n\ :F29: Redraw()\n\ :KP_Enter: Newline()\n\ :F35: Delete()\n x3270.keymap.ncd: \ :F13: Dup()\n\ :Linefeed: Dup()\n\ :F14: FieldMark()\n\ :Break: FieldMark()\n\ :Home: Home()\n\ :F17: Home()\n\ :End: EraseEOF()\n\ :F15: Reset()\n\ :Prior: Reset()\n\ :F16: Newline()\n\ :Next: Newline()\n\ :KP_Add: EraseInput()\n\ :Num_Lock: PF(13)\n\ :KP_Space: PF(13)\n\ :KP_Divide: PF(14)\n\ :KP_Multiply: PF(15)\n\ :KP_7: PF(16)\n\ :KP_8: PF(17)\n\ :KP_9: PF(18)\n\ :KP_4: PF(19)\n\ :KP_5: PF(20)\n\ :KP_6: PF(21)\n\ :KP_1: PF(22)\n\ :KP_2: PF(23)\n\ :KP_3: PF(24)\n\ :KP_Subtract: SysReq()\n\ :KP_0: PA(2)\n\ :KP_Decimal: PA(1)\n\ :KP_Enter: Clear()\n x3270.keymap.hp-k1: \ :KP_Tab: BackTab()\n\ :KP_Enter: Home()\n\ :KP_Separator: Delete()\n\ ShiftDelete: Delete()\n\ :Menu: EraseEOF()\n\ :KP_Multiply: PF(13)\n\ :KP_Divide: PF(14)\n\ :KP_Add: PF(15)\n\ :KP_7: PF(16)\n\ :KP_8: PF(17)\n\ :KP_9: PF(18)\n\ :KP_4: PF(19)\n\ :KP_5: PF(20)\n\ :KP_6: PF(21)\n\ :KP_1: PF(22)\n\ :KP_2: PF(23)\n\ :KP_3: PF(24)\n\ :KP_0: PA(2)\n\ :KP_Decimal: PA(1)\n ! Keymap for HP-PC101 workstation keyboard, Chris P-E x3270.keymap.hp-pc: \ :KP_Subtract: Compose()\n\ :KP_Enter: Enter()\n\ :Return: Newline()\n\ !F1: PF(1)\n\ !F2: PF(2)\n\ !F3: PF(3)\n\ !F4: PF(4)\n\ !F5: PF(5)\n\ !F6: PF(6)\n\ !F7: PF(7)\n\ !F8: PF(8)\n\ !F9: PF(9)\n\ !F10: PF(10)\n\ !F11: PF(11)\n\ !F12: PF(12)\n\ !ShifthpSystem: PF(13)\n\ !ShiftKP_Divide: PF(14)\n\ !ShiftKP_Multiply: PF(15)\n\ !ShiftKP_7: PF(16)\n\ !ShiftKP_8: PF(17)\n\ !ShiftKP_9: PF(18)\n\ !ShiftKP_4: PF(19)\n\ !ShiftKP_5: PF(20)\n\ !ShiftKP_6: PF(21)\n\ !ShiftKP_1: PF(22)\n\ !ShiftKP_2: PF(23)\n\ !ShiftKP_3: PF(24)\n\ !hpSystem: PF(1)\n\ !KP_Divide: PF(2)\n\ !KP_Multiply: PF(3)\n\ !KP_7: PF(4)\n\ !KP_8: PF(5)\n\ !KP_9: PF(6)\n\ !KP_4: PF(7)\n\ !KP_5: PF(8)\n\ !KP_6: PF(9)\n\ !KP_1: PF(10)\n\ !KP_2: PF(11)\n\ !KP_3: PF(12)\n\ !Break: Reset()\n\ !ShiftBreak: Attn()\n\ !MetaBreak: SysReq()\n\ !Prior: Dup()\n\ !Next: FieldMark()\n\ !Select: EraseEOF()\n\ !MetahpInsertChar: PA(1)\n\ !MetaHome: PA(2)\n\ !MetaPrior: PA(3)\n\ !hpInsertChar: Insert()\n\ !hpDeleteChar: Delete()\n\ !ShiftMenu: PrintWindow()\n\ !Menu: PrintText()\n ! Keymap for IBM X Terminal, Allan L. Bazinet x3270.keymap.ibm-xterm: \ :Execute: Enter()\n\ !Pause: Clear()\n\ !BackSpace: BackSpace()\Delete()\n\ !End: FieldEnd()\n\ !Altc: Clear()\n\ !AltPrint: SysReq()\n\ !CtrlHome: EraseInput()\n\ !CtrlEnd: EraseEOF()\n\ !ShiftTab: BackTab()\n\ :KP_Subtract: PA(1)\n\ :KP_Add: PA(2)\n\ :KP_Enter: Enter()\n\ :Prior: PA(1)\n\ :Next: PA(2)\n\ :Escape: Reset()\n\ :Control_L: Reset()\n\ :Insert: Insert()\n\ !ShiftRight: Right2()\n\ !ShiftLeft: Left2()\n ! Keymap for common 3270 functions on a PC keyboard, from Richard Lennox. x3270.keymap.rlx: #override \ Prior: PF(7)\n\ Next: PF(8)\n\ Control_R: Enter()\n\ Return: Newline()\n\ Pause: Clear()\n\ ShiftEscape: Attn()\n\ ShiftLeft: PreviousWord()\n\ ShiftRight: NextWord()\n\ CtrlLeft: PreviousWord()\n\ CtrlRight: NextWord()\n\ ShiftEnd: EraseEOF()\n\ End: FieldEnd() ! Keymap modifier for OpenWindows (makes button 2 the extend key; defines the ! Paste and Cut keys; uses CLIPBOARD). x3270.keymap.ow: #override \ ~Shift: select-start()\n\ ~Shift: select-extend()\n\ : start-extend()\n\ : select-extend()\n\ : ignore()\n\ : ignore()\n\ : insert-selection(CLIPBOARD,PRIMARY)\n\ : select-end(PRIMARY)\n\ :F16: set-select(CLIPBOARD)\n\ ShiftF18: insert-selection(PRIMARY)\n\ :F18: insert-selection(CLIPBOARD,PRIMARY)\n\ :F20: set-select(CLIPBOARD) Cut()\n ! APL keymap modifier. x3270.keymap.apl: #override \ !:Altbracketleft: Key(apl_leftarrow)\n\ !:Altbracketright: Key(apl_rightarrow)\n\ :bracketleft: Key(apl_bracketleft)\n\ :bracketright: Key(apl_bracketright)\n\ !:Alt1: Key(apl_diaeresis)\n\ !:Alt2: Key(apl_overbar)\n\ !:Alt3: Key(less)\n\ !:Alt4: Key(apl_notgreater)\n\ !:Alt5: Key(equal)\n\ !:Alt6: Key(apl_notless)\n\ !:Alt7: Key(greater)\n\ !:Alt8: Key(apl_notequal)\n\ !:Alt9: Key(apl_downcaret)\n\ !:Alt0: Key(apl_upcaret)\n\ !:Altminus: Key(apl_overbar)\n\ !:Altunderscore: Key(underscore)\n\ !:Alt=: Key(apl_multiply)\n\ !:Alt+: Key(apl_divide)\n\ !:Altasciitilde: Key(apl_tilde)\n\ !:Altbackslash: Key(apl_slope)\n\ !:Altbar: Key(apl_stile)\n\ :Alta: Key(apl_alpha)\n\ :Altb: Key(apl_downtack)\n\ :Altc: Key(apl_upshoe)\n\ :Altd: Key(apl_downstile)\n\ :Alte: Key(apl_epsilon)\n\ :Altf: Key(underscore)\n\ :Altg: Key(apl_del)\n\ :Alth: Key(apl_delta)\n\ :Alti: Key(apl_iota)\n\ :Altj: Key(apl_jot)\n\ :Altk: Key(apostrophe)\n\ :Altl: Key(apl_quad)\n\ :Altm: Key(apl_stile)\n\ :Altn: Key(apl_uptack)\n\ :Alto: Key(apl_circle)\n\ :Altp: Key(asterisk)\n\ :Altq: Key(question)\n\ :Altr: Key(apl_rho)\n\ :Alts: Key(apl_upstile)\n\ :Altt: Key(apl_tilde)\n\ :Altu: Key(apl_downarrow)\n\ :Altv: Key(apl_downshoe)\n\ :Altw: Key(apl_omega)\n\ :Altx: Key(apl_rightshoe)\n\ :Alty: Key(apl_uparrow)\n\ :Altz: Key(apl_leftshoe)\n\ :AltA: Key(apl_Aunderbar)\n\ :AltB: Key(apl_Bunderbar)\n\ :AltC: Key(apl_Cunderbar)\n\ :AltD: Key(apl_Dunderbar)\n\ :AltE: Key(apl_Eunderbar)\n\ :AltF: Key(apl_Funderbar)\n\ :AltG: Key(apl_Gunderbar)\n\ :AltH: Key(apl_Hunderbar)\n\ :AltI: Key(apl_Iunderbar)\n\ :AltJ: Key(apl_Junderbar)\n\ :AltK: Key(apl_Kunderbar)\n\ :AltL: Key(apl_Lunderbar)\n\ :AltM: Key(apl_Munderbar)\n\ :AltN: Key(apl_Nunderbar)\n\ :AltO: Key(apl_Ounderbar)\n\ :AltP: Key(apl_Punderbar)\n\ :AltQ: Key(apl_Qunderbar)\n\ :AltR: Key(apl_Runderbar)\n\ :AltS: Key(apl_Sunderbar)\n\ :AltT: Key(apl_Tunderbar)\n\ :AltU: Key(apl_Uunderbar)\n\ :AltV: Key(apl_Vunderbar)\n\ :AltW: Key(apl_Wunderbar)\n\ :AltX: Key(apl_Xunderbar)\n\ :AltY: Key(apl_Yunderbar)\n\ :AltZ: Key(apl_Zunderbar)\n ! ! Keymap for the "not" key, assumed to be above the "6" key on U.S. ! keyboards. This used to be part of the 3270 base keymap, but does not ! work properly on non-U.S. keyboards. x3270.keymap.not.3270: \ :asciicircum: Key(notsign) ! Helpful modifier to disply the translation table. x3270.keymap.t: \ Metat: XtDisplayTranslations()\n\ Altt: XtDisplayTranslations()\n ! International keymap modifiers. x3270.keymap.finnish7: \ :bracketleft: Key("adiaeresis")\n\ :bracketright: Key("aring")\n\ :backslash: Key("odiaeresis")\n\ :braceleft: Key("Adiaeresis")\n\ :braceright: Key("Aring")\n\ :bar: Key("Odiaeresis")\n x3270.keymap.norwegian7: \ :bracketleft: Key("ae")\n\ :backslash: Key("oslash")\n\ :bracketright: Key("aring")\n\ :braceleft: Key("AE")\n\ :bar: Key("Ooblique")\n\ :braceright: Key("Aring")\n\ :!Metau: Key("udiaeresis")\n\ :dollar: Key("currency")\n\ :at: Key("backslash")\n ! "Old" Norwegian keymap, compatible with older versions of x3270. x3270.keymap.oldnorwegian7: \ :bracketleft: Key("AE")\n\ :bracketright: Key("Aring")\n\ :backslash: Key("Ooblique")\n\ :braceleft: Key("ae")\n\ :braceright: Key("aring")\n\ :bar: Key("oslash")\n ! German keymap courtesy of Karlheinz Kandler x3270.keymap.german7: \ :bracketleft: Key("adiaeresis")\n\ :bracketright: Key("udiaeresis")\n\ :backslash: Key("odiaeresis")\n\ :braceleft: Key("Adiaeresis")\n\ :braceright: Key("Udiaeresis")\n\ :bar: Key("Odiaeresis")\n\ :asciicircum: Key("^")\n\ :asciitilde: Key("ssharp")\n\ :at: Key("section")\n ! Keymap modifier for RS/6000s with French AZERTY keyboards, which allows ! the diaeresis and circumflex keys to work intuitively (press diaereses, ! press "a", get "adiaeresis, etc.) x3270.keymap.fr6k: \ Shiftdead_diaeresis: Compose() Key(quotedbl)\n\ :dead_circumflex: Compose() Key(asciicircum)\n ! Icelandic keymap, courtesy of Rikhardur Egilsson x3270.keymap.icelandic: \ :dead_acute: Compose() Key(apostrophe)\n ! !============================================================================= ! Section 2: Labels and Messages ! ! These are resources that are likely to be modified for translation ! into another language. !============================================================================= ! x3270.errorPopup.title: x3270 Error x3270.errorPopup*cancelButton.label: Exit x3270.printerErrorPopup.title: x3270 Printer Error x3270.childErrorPopup.title: x3270 Child Process Error x3270.passwordPopup.title: x3270 Password x3270.infoPopup.title: x3270 Information x3270.printerInfoPopup.title: x3270 Printer Information x3270.childInfoPopup.title: x3270 Child Process Information x3270.connectPopup.title: x3270 Connect x3270.connectPopup.dialog.label: Enter Hostname: [L:][Y:][A:][lu@]host[:port][=accept] x3270.fontPopup.title: x3270 Font x3270.fontPopup.dialog.label: Enter Font Name x3270.keymapPopup.title: x3270 Keymap x3270.keymapPopup.dialog.label: Enter Keymap Name x3270.oversizePopup.title: x3270 Oversize x3270.oversizePopup.dialog.label: Enter Dimensions (cols x rows) x3270.oversizePopup*confirmButton.label: Resize x3270.keypadPopup.title: x3270 Keypad x3270.printWindowPopup.title: x3270 Window Print x3270.printWindowPopup.dialog.label: Enter Print Command x3270.printWindowPopup*confirmButton.label: Print x3270.passwordPopup.dialog.label: Enter Private Key Password #ifdef COLOR x3270.passwordPopup.dialog*value*foreground: lavender #else x3270.passwordPopup.dialog*value*foreground: white x3270.passwordPopup.dialog*value*background: white #endif ! (COLOR) x3270.tracePopup.title: x3270 Tracing x3270.tracePopup.dialog.label: Enter Trace File Name x3270.tracePopup*confirmButton.label: Trace x3270.tracePopup*confirm2Button.label: No File x3270.screenTracePopup.title: x3270 Screen Save x3270.screenTracePopup*continuously.label: Continuously x3270.screenTracePopup*once.label: Once x3270.screenTracePopup*file.label: To File x3270.screenTracePopup*printer.label: To Printer x3270.screenTracePopup*text.label: Text x3270.screenTracePopup*html.label: HTML x3270.screenTracePopup*rtf.label: RichText x3270.screenTracePopup*fileName.label: File Name x3270.screenTracePopup*printCommand.label: Printer Command x3270.executeActionPopup.title: x3270 Execute Action x3270.executeActionPopup.dialog.label: Enter Action and Parameters x3270.executeActionPopup*confirmButton.label: Execute x3270.saveOptionsPopup.title: x3270 Save Changed Options x3270.saveOptionsPopup.dialog.label: Enter Profile/Session File Name x3270.saveOptionsPopup*confirmButton.label: Save x3270.aboutCopyrightPopup.title: x3270 Copyright x3270.aboutConfigPopup.title: x3270 Configuration x3270.aboutStatusPopup.title: x3270 Connection Status x3270.connectPopup*confirmButton.label: Connect x3270.fontPopup*confirmButton.label: Select Font x3270.keymapPopup*confirmButton.label: Select Keymap x3270.ftPopup.title: x3270 File Transfer x3270.ftProgressPopup.title: x3270 File Transfer x3270.ftOverwritePopup.title: x3270 File Transfer x3270.idlePopup.title: x3270 Idle Command x3270.kmPopup.title: x3270 Keymap x3270*confirmButton.label: OK x3270.printerErrorPopup*cancelButton.label: Abort Printer x3270.printerInfoPopup*cancelButton.label: Abort Printer x3270.childErrorPopup*cancelButton.label: Discard Output x3270.childInfoPopup*cancelButton.label: Discard Output x3270*cancelButton.label: Cancel x3270*aboutOption.label: About x3270... x3270*aboutCopyright.label: Copyright x3270*aboutConfig.label: Configuration x3270*aboutStatus.label: Connection Status x3270*ftOption.label: File Transfer... x3270*printerOption.label: Printer Session x3270*assocButton.label: Start, associate with current LU x3270*luButton.label: Start, specific LU... x3270*printerOffButton.label: Stop Printer x3270*abortScriptOption.label: Abort Scripts/Macros/Strings x3270*disconnectOption.label: Disconnect x3270*exitOption.label: Exit x3270 x3270*exitReallyOption.label: Disconnect and Exit x3270*printWindowOption.label: Print Window Bitmap x3270*executeActionOption.label: Execute an Action x3270*fileMenuButton.label: File x3270*fileMenu.label: File x3270.ftPopup*justify: left x3270.ftPopup*send.label: Send to host x3270.ftPopup*receive.label: Receive from host x3270.ftPopup*ascii.label: Transfer ASCII file x3270.ftPopup*cr.label: Add/remove CR at end of line x3270.ftPopup*binary.label: Transfer binary file x3270.ftPopup*local.label: Local File Name x3270.ftPopup*host.label: Host File Name x3270.ftPopup*append.label: Append to file x3270.ftPopup*remap.label: Remap ASCII Characters x3270.ftPopup*vm.label: Host is VM/CMS x3270.ftPopup*tso.label: Host is TSO x3270.ftPopup*cics.label: Host is CICS x3270.ftPopup*confirmButton.label: Transfer File x3270.ftPopup*file.label: Record Format x3270.ftPopup*recfmDefault.label: Default x3270.ftPopup*fixed.label: Fixed x3270.ftPopup*variable.label: Variable x3270.ftPopup*undefined.label: Undefined x3270.ftPopup*units.label: Space Allocation Units x3270.ftPopup*spaceDefault.label: Default x3270.ftPopup*tracks.label: Tracks x3270.ftPopup*cylinders.label: Cylinders x3270.ftPopup*avblock.label: Avblock x3270.ftPopup*lrecl.label: Record Length x3270.ftPopup*blksize.label: Block Size x3270.ftPopup*primspace.label: Primary Space x3270.ftPopup*secspace.label: Secondary Space x3270.ftPopup*avblockSize.label: Avblock Size x3270.ftPopup*buffersize.label: DFT Buffer Size x3270.ftProgressPopup*fromLabel.label: Source: x3270.ftProgressPopup*fromLabel.justify: right x3270.ftProgressPopup*toLabel.label: Destination: x3270.ftProgressPopup*toLabel.justify: right x3270.ftProgressPopup*filename.justify: left x3270.ftOverwritePopup*overwriteName.label: Overwrite existing file %s? x3270.ftProgressPopup*waiting.label: Waiting for host acknowledgment... x3270.ftProgressPopup*status.label: %lu bytes transferred x3270.ftProgressPopup*aborting.label: Aborting transfer... x3270.idlePopup*justify: left x3270.idlePopup*command.label: Command(s) x3270.idlePopup*timeout.label: Timeout Value x3270.idlePopup*enable.label: Enable for this session x3270.idlePopup*enablePerm.label: Enable whenever connected x3270.idlePopup*disable.label: Disable x3270.idlePopup*hours.label: Hours x3270.idlePopup*minutes.label: Minutes x3270.idlePopup*seconds.label: Seconds x3270.idlePopup*fuzz.label: Vary time 0..10% x3270.printerLuPopup.title: x3270 Printer Session x3270.printerLuPopup.dialog.label: Enter LU Name x3270.printerLuPopup*confirmButton.label: Start Session x3270*optionsMenuButton.label: Options x3270*optionsMenu.label: Options x3270*connectMenuButton.label: Connect x3270*macrosMenuButton.label: Macros x3270*macrosMenu.label: Macros x3270*hostMenu.label: Connect x3270*recentOption.label: Recent x3270*helpButton.label: Help x3270*otherHostOption.label: Other... x3270*togglesOption.label: Toggles x3270*fontsOption.label: Font x3270*modelsOption.label: Screen Size x3270*snapOption.label: Snap Window Size x3270*colorsOption.label: Color Scheme x3270*charsetOption.label: Character Set x3270*keymapOption.label: Change Keymap... x3270*idleCommandOption.label: Configure Idle Command x3270*keypadOption.label: Keypad x3270*monocaseOption.label: Monocase x3270*cursorBlinkOption.label: Blinking Cursor x3270*showTimingOption.label: Show Timing x3270*cursorPosOption.label: Track Cursor x3270*traceOption.label: Trace Data and Events x3270*screenTraceOption.label: Save Screen Contents x3270*scrollBarOption.label: Scrollbar x3270*lineWrapOption.label: Wraparound x3270*marginedPasteOption.label: Paste with Left Margin x3270*overlayPasteOption.label: Overlay Paste x3270*rectangleSelectOption.label: Select by Rectangles x3270*blankFillOption.label: Blank Fill x3270*crosshairOption.label: Crosshair Cursor x3270*visibleControlOption.label: Visible Control Chars x3270*underlineCursorOption.label: Underline Cursor x3270*blockCursorOption.label: Block Cursor x3270*otherFontOption.label: Other... x3270*lineModeOption.label: Line Mode x3270*characterModeOption.label: Character Mode x3270*extendedDsOption.label: Extended 3270 Data Stream x3270*m3278Option.label: Monochrome (3278) Emulation x3270*m3279Option.label: Color (3279) Emulation x3270*model2Option.label: Model 2 (80x24) x3270*model3Option.label: Model 3 (80x32) x3270*model4Option.label: Model 4 (80x43) x3270*model5Option.label: Model 5 (132x27) x3270*oversizeOption.label: Oversize... x3270*saveOption.label: Save Changed Options ! ! Messages x3270.message.processId: Process ID: x3270.message.windowId: Main window ID: x3270.message.pseudoColor: pseudo-color x3270.message.emulatorFont: Emulator font: x3270.message.emulatorFontDbcs: DBCS emulator font: x3270.message.xFont: standard X11 font x3270.message.cgFont: special 3270 CG font x3270.message.charset: Host EBCDIC character set: x3270.message.displayCharacterSet: Display character set: x3270.message.displayCharacterSetDbcs: DBCS display character set: x3270.message.require: require x3270.message.have: have x3270.message.defaultKeyboardMap: Default keyboard map x3270.message.composeMap: Compose-key map: x3270.message.noComposeMap: No compose-key map x3270.message.activeIcon: Active icon x3270.message.iconFont: Icon font: x3270.message.iconLabelFont: Icon label font: x3270.message.staticIcon: Static bitmap icon x3270.message.statusDbcs: DBCS x3270.message.statusNotConnected: Not Connected x3270.message.statusTwait: Wait x3270.message.statusSyswait: System x3270.message.statusProtected: Protected x3270.message.statusNumeric: Numeric x3270.message.statusOverflow: Overflow x3270.message.statusInhibit: Inhibit x3270.message.statusScrolled: Scrolled x3270.message.statusMinus: No Function x3270.message.statusConnecting: Connecting x3270.message.inputMethod: X11 Input Method (XIM): x3270.message.ximState: state: x3270.message.ximDisabled: failed x3270.message.ximNotFound: not found x3270.message.ximActive: active x3270.message.ximLocale: locale: x3270.message.ximEncoding: encoding: x3270.message.kmEvent: Event x3270.message.kmKeymapLine: Keymap:Line x3270.message.kmActions: Actions x3270.message.kmOverridden: \ -- overridden -- x3270.message.kmKeymap: Keymap x3270.message.kmTemporaryKeymap: Temporary keymap x3270.message.kmFile: from file x3270.message.kmResource: from resource x3270.message.kmFromServer: \ (expanded from '@server') ! !============================================================================= ! Section 3: Base-Level Resources ! ! Resources required for the basic operation of x3270, not for the ! faint-hearted to modify. !============================================================================= ! ! App-defaults file version x3270.adVersion: 3.3.4 ! ! Fonts x3270.aplFont: 3270 x3270.debugFont: 3270d x3270.iconFont: nil2 x3270.iconLabelFont: 8x13 x3270*keyPad*large*font: fixed x3270*keyPad*small*font: -*-fixed-medium-r-semicondensed-*-12-*-* x3270*value*font: fixed x3270*dataLabel.font: -*-courier-medium-r-normal--14-*-100-100-m-*-iso8859-1 !x3270*smallLabel.font: 5x7 x3270*smallLabel.font: 6x13 x3270*filename*font: fixed x3270*kmPopup*text*font: fixed x3270*font: -*-helvetica-bold-r-normal--14-*-100-100-p-*-iso8859-1 ! ! Menu configuration x3270*menuBarContainer.borderWidth: 2 #ifdef COLOR x3270.keypadBackground: grey x3270*menuBarContainer.background: grey x3270*menuBarContainer.borderColor: grey40 x3270*fileMenuButton*background: grey x3270*optionsMenuButton*background: grey x3270*connectMenuButton*background: grey x3270*macrosMenuButton*background: grey x3270*helpButton*background: grey x3270*keypadButton*background: grey x3270*lockedIcon*background: grey x3270*lockedIcon*foreground: green4 x3270*lockedIcon*borderColor: grey x3270*unverifiedIcon*background: grey x3270*unverifiedIcon*foreground: yellow4 x3270*unverifiedIcon*borderColor: grey x3270*unlockedIcon*background: grey x3270*unlockedIcon*borderColor: grey x3270*fileMenuButton*borderColor: grey x3270*optionsMenuButton*borderColor: grey x3270*connectMenuButton*borderColor: grey x3270*macrosMenuButton*borderColor: grey x3270*helpButton*borderColor: grey #else x3270*fileMenuButton*borderColor: XtDefaultBackground x3270*optionsMenuButton*borderColor: XtDefaultBackground x3270*connectMenuButton*borderColor: XtDefaultBackground x3270*macrosMenuButton*borderColor: XtDefaultBackground x3270*helpButton*borderColor: XtDefaultBackground #endif ! (COLOR) x3270*fileMenuButton*highlightThickness: 1 x3270*optionsMenuButton*highlightThickness: 1 x3270*connectMenuButton*highlightThickness: 1 x3270*macrosMenuButton*highlightThickness: 1 x3270*helpButton*highlightThickness: 1 x3270*keypadButton*highlightThickness: 1 #ifdef COLOR x3270*fileMenu*background: grey x3270*exitMenu*background: grey x3270*optionsMenu*background: grey x3270*hostMenu*background: grey x3270*macrosMenu*background: grey x3270*togglesMenu*background: grey x3270*fontsMenu*background: grey x3270*modelsMenu*background: grey x3270*colorsMenu*background: grey x3270*charsetMenu*background: grey x3270*printerMenu*background: grey #endif ! (COLOR) x3270*fileMenu.borderWidth: 2 x3270*exitMenu.borderWidth: 2 x3270*optionsMenu.borderWidth: 2 x3270*hostMenu.borderWidth: 2 x3270*macrosMenu.borderWidth: 2 x3270*togglesMenu.borderWidth: 2 x3270*fontsMenu.borderWidth: 2 x3270*modelsMenu.borderWidth: 2 x3270*colorsMenu.borderWidth: 2 x3270*charsetMenu.borderWidth: 2 #ifdef COLOR x3270*fileMenu.borderColor: grey40 x3270*exitMenu.borderColor: grey40 x3270*optionsMenu.borderColor: grey40 x3270*hostMenu.borderColor: grey40 x3270*macrosMenu.borderColor: grey40 x3270*togglesMenu.borderColor: grey40 x3270*fontsMenu.borderColor: grey40 x3270*modelsMenu.borderColor: grey40 x3270*colorsMenu.borderColor: grey40 x3270*charsetMenu.borderColor: grey40 #endif ! (COLOR) x3270*fileMenu*leftMargin: 20 x3270*fileMenu*rightMargin: 20 x3270*optionsMenu*rightMargin: 20 x3270*togglesMenu*leftMargin: 20 x3270*fontsMenu*leftMargin: 20 x3270*fontsMenu*rightMargin: 20 x3270*modelsMenu*leftMargin: 20 x3270*colorsMenu*leftMargin: 20 x3270*colorsMenu*rightMargin: 20 x3270*charsetMenu*leftMargin: 20 x3270*charsetMenu*rightMargin: 20 x3270*hostMenu*rightMargin: 20 x3270*macrosMenu*rightMargin: 20 ! ! Confirm and cancel buttons ! borderWidth and borderColor are never specified anywhere else, so these ! always apply x3270*confirmButton.borderWidth: 2 x3270*confirm2Button*borderWidth: 2 x3270*cancelButton*borderWidth: 2 #ifdef COLOR x3270**confirmButton.borderColor: grey40 x3270**confirmButton.borderColor: grey40 x3270**confirm2Button.borderColor: grey40 x3270**cancelButton.borderColor: grey40 #endif ! (COLOR) ! foreground and background are often overridden by other resources, so they ! must be specified explicitly for each instance #ifdef COLOR x3270*dialog*confirmButton.foreground: black x3270*dialog*confirmButton.background: grey80 x3270*dialog*confirm2Button.background: grey80 x3270*dialog*cancelButton.foreground: firebrick x3270*dialog*cancelButton.background: grey80 #endif ! (COLOR) ! ! Values ! borderWidth and borderColor are never specified anywhere else, so these ! always apply #ifdef COLOR x3270*value.borderWidth: 2 x3270*value.borderColor: grey40 #endif ! (COLOR) ! background is overridden by dialog*background, so it must be specified ! explicitly #ifdef COLOR x3270*dialog*value*background: lavender #endif ! (COLOR) ! ! Overall defaults for dialog boxes #ifdef COLOR x3270*dialog*background: grey x3270*dialog*foreground: black #endif ! (COLOR) ! ! Fixed popup sizes x3270.errorPopup.width: 500 x3270.printerErrorPopup.width: 500 x3270.childErrorPopup.width: 500 x3270.infoPopup.width: 500 x3270.printerInfoPopup.width: 500 x3270.childInfoPopup.width: 500 x3270.printerLuPopup.width: 300 x3270.connectPopup.width: 500 x3270.fontPopup.width: 300 x3270.keymapPopup.width: 300 x3270.oversizePopup.width: 300 x3270.printWindowPopup.width: 300 x3270.tracePopup.width: 300 x3270.executeActionPopup.width: 300 x3270.saveOptionsPopup.width: 300 x3270.passwordPopup.width: 300 ! ! Nondefault definitions for complex pop-ups #ifdef COLOR x3270.aboutCopyrightPopup*icon.foreground: darkslateblue x3270.aboutConfigPopup*icon.foreground: darkslateblue x3270.aboutStatusPopup*icon.foreground: darkslateblue x3270.errorPopup*label.foreground: firebrick x3270.printerErrorPopup*label.foreground: firebrick x3270.childErrorPopup*label.foreground: firebrick x3270.ftProgressPopup*filename.borderWidth: 2 x3270.ftProgressPopup*filename.borderColor: grey40 x3270.ftProgressPopup*filename.background: lavender #endif ! (COLOR) ! ! Keypad key dimensions, in pixels x3270.keypad.keyHeight: 24 x3270.keypad.keyWidth: 48 x3270.keypad.pfWidth: 32 x3270.keypad.paWidth: 36 x3270.keypad.largeKeyWidth: 56 ! ! Keymap display pop-up ! x3270*keymapDisplayOption.label: Display Current Keymap x3270.kmPopup*label.label: Current Keyboard Map x3270.kmPopup*sortActionOption.label: Sort by Action x3270.kmPopup*sortKeymapOption.label: Sort by Keymap x3270.kmPopup*sortEventOption.label: Sort by Event x3270.kmPopup*text*background: lavender x3270.kmPopup*text*foreground: black x3270.kmPopup*text.height: 250 x3270.kmPopup*text.width: 500 ! ! Basic event translations -- these should NEVER be changed without significant ! code changes x3270.translations: #override \n\ WM_PROTOCOLS: PA-WMProtocols()\n\ : PA-KeymapNotify()\n\ WM_STATE: PA-StateChanged()\n\ : PA-Focus()\n\ : PA-Focus()\n\ : PA-ConfigureNotify() x3270.container.translations: #override \n\ Shift_L: PA-Shift()\n\ Shift_L: PA-Shift()\n\ Shift_R: PA-Shift()\n\ Shift_R: PA-Shift()\n\ Meta_L: PA-Shift()\n\ Meta_L: PA-Shift()\n\ Meta_R: PA-Shift()\n\ Meta_R: PA-Shift()\n\ Alt_L: PA-Shift()\n\ Alt_L: PA-Shift()\n\ Alt_R: PA-Shift()\n\ Alt_R: PA-Shift()\n\ :: Default()\n\ :: Default()\n\ :: Default() x3270*screen.translations: #override \n\ : PA-Expose()\n\ : PA-VisibilityNotify()\n\ : PA-GraphicsExpose()\n\ Shift_L: PA-Shift()\n\ Shift_L: PA-Shift()\n\ Shift_R: PA-Shift()\n\ Shift_R: PA-Shift()\n\ Meta_L: PA-Shift()\n\ Meta_L: PA-Shift()\n\ Meta_R: PA-Shift()\n\ Meta_R: PA-Shift()\n\ Alt_L: PA-Shift()\n\ Alt_L: PA-Shift()\n\ Alt_R: PA-Shift()\n\ Alt_R: PA-Shift()\n\ :: Default()\n\ :: Default()\n\ :: Default() x3270icon.translations: #override \n\ : PA-Expose() x3270.keypadPopup.translations: #override \n\ WM_PROTOCOLS: PA-WMProtocols()\n\ : PA-KeymapNotify()\n\ : PA-EnterLeave()\n\ : PA-EnterLeave() x3270.keypadPopup.container.translations: #override \n\ Shift_L: PA-Shift()\n\ Shift_L: PA-Shift()\n\ Shift_R: PA-Shift()\n\ Shift_R: PA-Shift()\n\ Meta_L: PA-Shift()\n\ Meta_L: PA-Shift()\n\ Meta_R: PA-Shift()\n\ Meta_R: PA-Shift()\n\ Alt_L: PA-Shift()\n\ Alt_L: PA-Shift()\n\ Alt_R: PA-Shift()\n\ Alt_R: PA-Shift()\n\ :: Default() x3270.errorPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.printerErrorPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.childErrorPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.errorPopup*translations: #override \n\ Return: PA-confirm() x3270.printerErrorPopup*translations: #override \n\ Return: PA-confirm() x3270.childErrorPopup*translations: #override \n\ Return: PA-confirm() x3270.infoPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.printerInfoPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.childInfoPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.infoPopup*translations: #override \n\ Return: PA-confirm() x3270.printerInfoPopup*translations: #override \n\ Return: PA-confirm() x3270.childInfoPopup*translations: #override \n\ Return: PA-confirm() x3270.passwordPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.connectPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.fontPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.keymapPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.printWindowPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.tracePopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.screenTracePopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.screenTracePopup*translations: #override \n\ Return: PA-confirm() x3270.executeActionPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.saveOptionsPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.aboutCopyrightPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.aboutCopyrightPopup*translations: #override \n\ Return: PA-confirm() x3270.aboutConfigPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.aboutConfigPopup*translations: #override \n\ Return: PA-confirm() x3270.aboutStatusPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.aboutStatusPopup*translations: #override \n\ Return: PA-confirm() x3270.kmPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.kmPopup*translations: #override \n\ Return: PA-confirm() x3270.luPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.ftPopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() ! Note: WM_PROTOCOLS is explicitly not defined for ftPopup, so that the user ! can clear error conditions while a transfer is in progress. x3270.ftOverwritePopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.ftPopup*value.translations: #override \n\ Return: PA-dialog-next()\n\ Tab: PA-dialog-next()\n\ : PA-dialog-focus() select-start()\n\ CtrlU: select-all(DUMMY) delete-selection() x3270.idlePopup.translations: \ WM_PROTOCOLS: PA-WMProtocols() x3270.idlePopup*value.translations: #override \n\ Return: PA-dialog-next()\n\ Tab: PA-dialog-next()\n\ : PA-dialog-focus() select-start()\n\ CtrlU: select-all(DUMMY) delete-selection() x3270.screenTracePopup*value.translations: #override \n\ Return: PA-confirm()\n\ CtrlU: select-all(DUMMY) delete-selection() x3270*value.translations: #override \n\ Return: PA-confirm()\n\ CtrlU: select-all(DUMMY) delete-selection() x3270*value.width: 200 ! Workaround for Xaw MenuButton bug that keeps menu items from highlighting ! when CapsLock or NumLock are down. Technically, this would require ! translations for all permutations of all 8 modifiers: shift, lock, control, ! mod1, mod2, mod3, mod4 and mod5. However, we will leave out shift and ! control, since they are "voluntary" key presses and would quadruple the ! size of this resource. x3270*MenuButton.translations: #override \n\ Lock: reset() PopupMenu()\n\ Mod1: reset() PopupMenu()\n\ Lock Mod1: reset() PopupMenu()\n\ Mod2: reset() PopupMenu()\n\ Lock Mod2: reset() PopupMenu()\n\ Mod1 Mod2: reset() PopupMenu()\n\ Lock Mod1 Mod2: reset() PopupMenu()\n\ Mod3: reset() PopupMenu()\n\ Lock Mod3: reset() PopupMenu()\n\ Mod1 Mod3: reset() PopupMenu()\n\ Lock Mod1 Mod3: reset() PopupMenu()\n\ Mod2 Mod3: reset() PopupMenu()\n\ Lock Mod2 Mod3: reset() PopupMenu()\n\ Mod1 Mod2 Mod3: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod3: reset() PopupMenu()\n\ Mod4: reset() PopupMenu()\n\ Lock Mod4: reset() PopupMenu()\n\ Mod1 Mod4: reset() PopupMenu()\n\ Lock Mod1 Mod4: reset() PopupMenu()\n\ Mod2 Mod4: reset() PopupMenu()\n\ Lock Mod2 Mod4: reset() PopupMenu()\n\ Mod1 Mod2 Mod4: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod4: reset() PopupMenu()\n\ Mod3 Mod4: reset() PopupMenu()\n\ Lock Mod3 Mod4: reset() PopupMenu()\n\ Mod1 Mod3 Mod4: reset() PopupMenu()\n\ Lock Mod1 Mod3 Mod4: reset() PopupMenu()\n\ Mod2 Mod3 Mod4: reset() PopupMenu()\n\ Lock Mod2 Mod3 Mod4: reset() PopupMenu()\n\ Mod1 Mod2 Mod3 Mod4: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod3 Mod4: reset() PopupMenu()\n\ Mod5: reset() PopupMenu()\n\ Lock Mod5: reset() PopupMenu()\n\ Mod1 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod5: reset() PopupMenu()\n\ Mod2 Mod5: reset() PopupMenu()\n\ Lock Mod2 Mod5: reset() PopupMenu()\n\ Mod1 Mod2 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod5: reset() PopupMenu()\n\ Mod3 Mod5: reset() PopupMenu()\n\ Lock Mod3 Mod5: reset() PopupMenu()\n\ Mod1 Mod3 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod3 Mod5: reset() PopupMenu()\n\ Mod2 Mod3 Mod5: reset() PopupMenu()\n\ Lock Mod2 Mod3 Mod5: reset() PopupMenu()\n\ Mod1 Mod2 Mod3 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod3 Mod5: reset() PopupMenu()\n\ Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod4 Mod5: reset() PopupMenu()\n\ Mod1 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod4 Mod5: reset() PopupMenu()\n\ Mod2 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod2 Mod4 Mod5: reset() PopupMenu()\n\ Mod1 Mod2 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod4 Mod5: reset() PopupMenu()\n\ Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Mod1 Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Mod2 Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod2 Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Mod1 Mod2 Mod3 Mod4 Mod5: reset() PopupMenu()\n\ Lock Mod1 Mod2 Mod3 Mod4 Mod5: reset() PopupMenu() ! ! Compose-key map for APL. x3270.composeMap.apl: \ A + underscore = apl_Aunderbar \n\ B + underscore = apl_Bunderbar \n\ C + underscore = apl_Cunderbar \n\ D + underscore = apl_Dunderbar \n\ E + underscore = apl_Eunderbar \n\ F + underscore = apl_Funderbar \n\ G + underscore = apl_Gunderbar \n\ H + underscore = apl_Hunderbar \n\ I + underscore = apl_Iunderbar \n\ J + underscore = apl_Junderbar \n\ K + underscore = apl_Kunderbar \n\ L + underscore = apl_Lunderbar \n\ M + underscore = apl_Munderbar \n\ N + underscore = apl_Nunderbar \n\ O + underscore = apl_Ounderbar \n\ P + underscore = apl_Punderbar \n\ Q + underscore = apl_Qunderbar \n\ R + underscore = apl_Runderbar \n\ S + underscore = apl_Sunderbar \n\ T + underscore = apl_Tunderbar \n\ U + underscore = apl_Uunderbar \n\ V + underscore = apl_Vunderbar \n\ W + underscore = apl_Wunderbar \n\ X + underscore = apl_Xunderbar \n\ Y + underscore = apl_Yunderbar \n\ Z + underscore = apl_Zunderbar \n\ apl_upcaret + apl_downcaret = apl_diamond \n\ apl_quad + apl_jot = apl_quadjot \n\ apl_iota + underscore = apl_iotaunderbar \n\ apl_epsilon + underscore = apl_epsilonunderbar \n\ less + equal = apl_notgreater \n\ plus + minus = apl_plusminus \n\ greater + equal = apl_notless \n\ equal + slash = apl_notequal \n\ apl_upcaret + apl_tilde = apl_upcarettilde \n\ apl_upcaret + asciitilde = apl_upcarettilde \n\ apl_downcaret + apl_tilde = apl_downcarettilde \n\ apl_downcaret + asciitilde = apl_downcarettilde \n\ apl_circle + apl_stile = apl_circlestile \n\ apl_circle + bar = apl_circlestile \n\ apl_quad + apl_slope = apl_slopequad \n\ apl_quad + backslash = apl_slopequad \n\ apl_circle + apl_slope = apl_circleslope \n\ apl_circle + backslash = apl_circleslope \n\ apl_downtack + apl_uptack = apl_downtackup \n\ apostrophe + period = apl_quotedot \n\ apl_del + apl_stile = apl_delstile \n\ apl_del + bar = apl_delstile \n\ apl_delta + apl_stile = apl_deltastile \n\ apl_delta + bar = apl_deltastile \n\ apl_quad + apostrophe = apl_quadquote \n\ apl_upshoe + apl_jot = apl_upshoejot \n\ slash + minus = apl_slashbar \n\ apl_slope + minus = apl_slopebar \n\ backslash + minus = apl_slopebar \n\ apl_diaeresis + period = apl_diaeresisdot \n\ apl_circle + minus = apl_circlebar \n\ apl_quad + apl_divide = apl_quaddivide \n\ apl_uptack + apl_jot = apl_uptackjot \n\ apl_del + apl_tilde = apl_deltilde \n\ apl_del + asciitilde = apl_deltilde \n\ apl_delta + underscore = apl_deltaunderbar \n\ apl_circle + asterisk = apl_circlestar \n\ apl_downtack + apl_jot = apl_downtackjot \n\ equal + underscore = apl_equalunderbar \n\ apl_quad + apl_quad = apl_squad \n\ apl_diaeresis + apl_jot = apl_diaeresisjot \n\ apl_diaeresis + apl_circle = apl_diaeresiscircle \n\ comma + minus = apl_commabar \n\ c + equal = apl_euro \n\ C + equal = apl_euro \n\ minus + parenleft = apl_lefttack \n\ minus + parenright = apl_righttack \n suite3270-3.6/x3270/ft_gui.c0000664000076500007650000013116113221577164013404 0ustar pdmpdm/* * Copyright (c) 1996-2015 Paul Mattes. * Copyright (c) 1995, Dick Altenbern. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Dick Altenbern nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DICK ALTENBERN "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DICK ALTENBERN BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * ft_gui.c * IND$FILE file transfer dialogs. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "appres.h" #include "dialog.h" #include "ft.h" #include "ft_dft.h" #include "ft_private.h" #include "kybd.h" #include "lazya.h" #include "objects.h" #include "popups.h" #include "utils.h" #include "varbuf.h" #include "xmenubar.h" #include "xpopups.h" #include "ft_gui.h" /* Macros. */ #define FILE_WIDTH 300 /* width of file name widgets */ #define MARGIN 3 /* distance from margins to widgets */ #define CLOSE_VGAP 0 /* distance between paired toggles */ #define FAR_VGAP 10 /* distance between single toggles and groups */ #define BUTTON_GAP 5 /* horizontal distance between buttons */ #define COLUMN_GAP 40 /* distance between columns */ /* Globals. */ /* Statics. */ static Widget ft_dialog, ft_shell, local_file, host_file; static Widget lrecl_widget, blksize_widget; static Widget primspace_widget, secspace_widget; static Widget avblock_size_widget; static Widget send_toggle, receive_toggle; static Widget vm_toggle, tso_toggle, cics_toggle; static Widget ascii_toggle, binary_toggle; static Widget cr_widget; static Widget remap_widget; static Widget buffersize_widget; static Widget inprogress_cancel_button; static bool host_is_tso = true; /* bools used by dialog */ static bool host_is_tso_or_vm = true;/* sensitivity logic */ static host_type_t s_tso = HT_TSO; /* Values used by toggle callbacks. */ static host_type_t s_vm = HT_VM; static host_type_t s_cics = HT_CICS; static Widget recfm_options[5]; static Widget units_options[5]; static struct toggle_list recfm_toggles = { recfm_options }; static struct toggle_list units_toggles = { units_options }; static bool recfm_default = true; static recfm_t r_default_recfm = DEFAULT_RECFM; static recfm_t r_fixed = RECFM_FIXED; static recfm_t r_variable = RECFM_VARIABLE; static recfm_t r_undefined = RECFM_UNDEFINED; static bool units_default = true; static bool units_avblock = false; static units_t u_default_units = DEFAULT_UNITS; static units_t u_tracks = TRACKS; static units_t u_cylinders = CYLINDERS; static units_t u_avblock = AVBLOCK; static sr_t *ft_sr = NULL; static Widget progress_shell, from_file, to_file; static Widget ft_status, waiting, aborting; static String status_string; static Widget overwrite_shell; static ft_conf_t xftc; static bool xftc_initted = false; static void ft_cancel(Widget w, XtPointer client_data, XtPointer call_data); static void ft_popup_callback(Widget w, XtPointer client_data, XtPointer call_data); static void ft_popup_init(void); static bool ft_start(void); static void ft_start_callback(Widget w, XtPointer call_parms, XtPointer call_data); static void overwrite_cancel_callback(Widget w, XtPointer client_data, XtPointer call_data); static void overwrite_okay_callback(Widget w, XtPointer client_data, XtPointer call_data); static void overwrite_popdown(Widget w, XtPointer client_data, XtPointer call_data); static void overwrite_popup_init(void); static void popup_overwrite(void); static void popup_progress(void); static void progress_cancel_callback(Widget w, XtPointer client_data, XtPointer call_data); static void progress_popup_callback(Widget w, XtPointer client_data, XtPointer call_data); static void progress_popup_init(void); static void recfm_callback(Widget w, XtPointer user_data, XtPointer call_data); static void toggle_append(Widget w, XtPointer client_data, XtPointer call_data); static void toggle_ascii(Widget w, XtPointer client_data, XtPointer call_data); static void toggle_cr(Widget w, XtPointer client_data, XtPointer call_data); static void toggle_remap(Widget w, XtPointer client_data, XtPointer call_data); static void toggle_receive(Widget w, XtPointer client_data, XtPointer call_data); static void toggle_host_type(Widget w, XtPointer client_data, XtPointer call_data); static void units_callback(Widget w, XtPointer user_data, XtPointer call_data); /* "File Transfer" dialog. */ /* * Pop up the "Transfer" menu. * Called back from the "File Transfer" option on the File menu. */ void ft_gui_popup_ft(void) { /* Initialize it. */ if (ft_shell == NULL) { ft_popup_init(); } /* Pop it up. */ dialog_set(&ft_sr, ft_dialog); popup_popup(ft_shell, XtGrabNone); } /* Initialize the transfer pop-up. */ static void ft_popup_init(void) { Widget w; Widget cancel_button; Widget local_label, host_label; Widget append_widget; Widget lrecl_label, blksize_label, primspace_label, secspace_label; Widget avblock_size_label; Widget h_ref = NULL; #if 0 Dimension d1; Dimension maxw = 0; #endif Widget recfm_label, units_label; Widget buffersize_label; Widget start_button; Widget spacer_toggle; char *s; /* Init the file transfer state structure from defaults. */ if (!xftc_initted) { ft_init_conf(&xftc); xftc.is_action = false; xftc_initted = true; } recfm_default = (xftc.recfm == DEFAULT_RECFM); units_default = (xftc.units == DEFAULT_UNITS); units_avblock = (xftc.units == AVBLOCK); /* Prep the dialog functions. */ dialog_set(&ft_sr, ft_dialog); /* Create the menu shell. */ ft_shell = XtVaCreatePopupShell( "ftPopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(ft_shell, XtNpopupCallback, place_popup, (XtPointer)CenterP); XtAddCallback(ft_shell, XtNpopupCallback, ft_popup_callback, NULL); /* Create the form within the shell. */ ft_dialog = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, ft_shell, NULL); /* Create the file name widgets. */ local_label = XtVaCreateManagedWidget( "local", labelWidgetClass, ft_dialog, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); local_file = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNeditType, XawtextEdit, XtNwidth, FILE_WIDTH, XtNvertDistance, FAR_VGAP, XtNfromHoriz, local_label, XtNhorizDistance, 0, NULL); if (xftc.local_filename) { XtVaSetValues(local_file, XtNstring, xftc.local_filename, NULL); XawTextSetInsertionPoint(local_file, strlen(xftc.local_filename)); } dialog_match_dimension(local_label, local_file, XtNheight); w = XawTextGetSource(local_file); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_unixfile); } dialog_register_sensitivity(local_file, NULL, false, NULL, false, NULL, false); host_label = XtVaCreateManagedWidget( "host", labelWidgetClass, ft_dialog, XtNfromVert, local_label, XtNvertDistance, 3, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); host_file = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNeditType, XawtextEdit, XtNwidth, FILE_WIDTH, XtNdisplayCaret, False, XtNfromVert, local_label, XtNvertDistance, 3, XtNfromHoriz, host_label, XtNhorizDistance, 0, NULL); if (xftc.host_filename) { XtVaSetValues(host_file, XtNstring, xftc.host_filename, NULL); XawTextSetInsertionPoint(host_file, strlen(xftc.host_filename)); } dialog_match_dimension(host_label, host_file, XtNheight); dialog_match_dimension(local_label, host_label, XtNwidth); w = XawTextGetSource(host_file); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_hostfile); } dialog_register_sensitivity(host_file, NULL, false, NULL, false, NULL, false); /* Create the left column. */ /* Create send/receive toggles. */ send_toggle = XtVaCreateManagedWidget( "send", commandWidgetClass, ft_dialog, XtNfromVert, host_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(send_toggle, xftc.receive_flag? no_diamond: diamond); XtAddCallback(send_toggle, XtNcallback, toggle_receive, (XtPointer)&s_false); receive_toggle = XtVaCreateManagedWidget( "receive", commandWidgetClass, ft_dialog, XtNfromVert, send_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(receive_toggle, xftc.receive_flag? diamond: no_diamond); XtAddCallback(receive_toggle, XtNcallback, toggle_receive, (XtPointer)&s_true); spacer_toggle = XtVaCreateManagedWidget( "empty", labelWidgetClass, ft_dialog, XtNfromVert, receive_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNlabel, "", NULL); /* Create ASCII/binary toggles. */ ascii_toggle = XtVaCreateManagedWidget( "ascii", commandWidgetClass, ft_dialog, XtNfromVert, spacer_toggle, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(ascii_toggle, xftc.ascii_flag? diamond: no_diamond); XtAddCallback(ascii_toggle, XtNcallback, toggle_ascii, (XtPointer)&s_true); binary_toggle = XtVaCreateManagedWidget( "binary", commandWidgetClass, ft_dialog, XtNfromVert, ascii_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(binary_toggle, xftc.ascii_flag? no_diamond: diamond); XtAddCallback(binary_toggle, XtNcallback, toggle_ascii, (XtPointer)&s_false); /* Create append toggle. */ append_widget = XtVaCreateManagedWidget( "append", commandWidgetClass, ft_dialog, XtNfromVert, binary_toggle, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(append_widget, xftc.append_flag? dot: no_dot); XtAddCallback(append_widget, XtNcallback, toggle_append, NULL); /* Set up the recfm group. */ recfm_label = XtVaCreateManagedWidget( "file", labelWidgetClass, ft_dialog, XtNfromVert, append_widget, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_register_sensitivity(recfm_label, &xftc.receive_flag, false, &host_is_tso_or_vm, true, NULL, false); recfm_options[0] = XtVaCreateManagedWidget( "recfmDefault", commandWidgetClass, ft_dialog, XtNfromVert, recfm_label, XtNvertDistance, 3, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(recfm_options[0], (xftc.recfm == DEFAULT_RECFM)? diamond: no_diamond); XtAddCallback(recfm_options[0], XtNcallback, recfm_callback, (XtPointer)&r_default_recfm); dialog_register_sensitivity(recfm_options[0], &xftc.receive_flag, false, &host_is_tso_or_vm, true, NULL, false); recfm_options[1] = XtVaCreateManagedWidget( "fixed", commandWidgetClass, ft_dialog, XtNfromVert, recfm_options[0], XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(recfm_options[1], (xftc.recfm == RECFM_FIXED)? diamond: no_diamond); XtAddCallback(recfm_options[1], XtNcallback, recfm_callback, (XtPointer)&r_fixed); dialog_register_sensitivity(recfm_options[1], &xftc.receive_flag, false, &host_is_tso_or_vm, true, NULL, false); recfm_options[2] = XtVaCreateManagedWidget( "variable", commandWidgetClass, ft_dialog, XtNfromVert, recfm_options[1], XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(recfm_options[2], (xftc.recfm == RECFM_VARIABLE)? diamond: no_diamond); XtAddCallback(recfm_options[2], XtNcallback, recfm_callback, (XtPointer)&r_variable); dialog_register_sensitivity(recfm_options[2], &xftc.receive_flag, false, &host_is_tso_or_vm, true, NULL, false); recfm_options[3] = XtVaCreateManagedWidget( "undefined", commandWidgetClass, ft_dialog, XtNfromVert, recfm_options[2], XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(recfm_options[3], (xftc.recfm == RECFM_UNDEFINED)? diamond: no_diamond); XtAddCallback(recfm_options[3], XtNcallback, recfm_callback, (XtPointer)&r_undefined); dialog_register_sensitivity(recfm_options[3], &xftc.receive_flag, false, &host_is_tso, true, NULL, false); lrecl_label = XtVaCreateManagedWidget( "lrecl", labelWidgetClass, ft_dialog, XtNfromVert, recfm_options[3], XtNvertDistance, 3, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_register_sensitivity(lrecl_label, &xftc.receive_flag, false, &recfm_default, false, &host_is_tso_or_vm, true); lrecl_widget = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNfromVert, recfm_options[3], XtNvertDistance, 3, XtNfromHoriz, lrecl_label, XtNhorizDistance, MARGIN, XtNwidth, 100, XtNeditType, XawtextEdit, XtNdisplayCaret, False, NULL); if (xftc.lrecl && xftc.host_type != HT_CICS) { char *lr = lazyaf("%d", xftc.lrecl); XtVaSetValues(lrecl_widget, XtNstring, lr, NULL); XawTextSetInsertionPoint(lrecl_widget, strlen(lr)); } dialog_match_dimension(lrecl_label, lrecl_widget, XtNheight); w = XawTextGetSource(lrecl_widget); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(lrecl_widget, &xftc.receive_flag, false, &recfm_default, false, &host_is_tso_or_vm, true); blksize_label = XtVaCreateManagedWidget( "blksize", labelWidgetClass, ft_dialog, XtNfromVert, lrecl_widget, XtNvertDistance, 3, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_match_dimension(blksize_label, lrecl_label, XtNwidth); dialog_register_sensitivity(blksize_label, &xftc.receive_flag, false, &recfm_default, false, &host_is_tso, true); blksize_widget = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNfromVert, lrecl_widget, XtNvertDistance, 3, XtNfromHoriz, blksize_label, XtNhorizDistance, MARGIN, XtNwidth, 100, XtNeditType, XawtextEdit, XtNdisplayCaret, False, NULL); if (xftc.blksize && xftc.host_type != HT_CICS) { char *bs = lazyaf("%d", xftc.blksize); XtVaSetValues(blksize_widget, XtNstring, bs, NULL); XawTextSetInsertionPoint(blksize_widget, strlen(bs)); } dialog_match_dimension(blksize_label, blksize_widget, XtNheight); w = XawTextGetSource(blksize_widget); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(blksize_widget, &xftc.receive_flag, false, &recfm_default, false, &host_is_tso, true); /* Find the widest widget in the left column. */ #if 0 XtVaGetValues(send_toggle, XtNwidth, &maxw, NULL); h_ref = send_toggle; #define REMAX(w) { \ XtVaGetValues((w), XtNwidth, &d1, NULL); \ if (d1 > maxw) { \ maxw = d1; \ h_ref = (w); \ } \ } REMAX(receive_toggle); REMAX(ascii_toggle); REMAX(binary_toggle); REMAX(append_widget); #undef REMAX #endif h_ref = blksize_widget; /* Create the right column buttons. */ /* Create VM/TSO/CICS toggles. */ vm_toggle = XtVaCreateManagedWidget( "vm", commandWidgetClass, ft_dialog, XtNfromVert, host_label, XtNvertDistance, FAR_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(vm_toggle, (xftc.host_type == HT_VM)? diamond: no_diamond); XtAddCallback(vm_toggle, XtNcallback, toggle_host_type, (XtPointer)&s_vm); tso_toggle = XtVaCreateManagedWidget( "tso", commandWidgetClass, ft_dialog, XtNfromVert, vm_toggle, XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(tso_toggle, (xftc.host_type == HT_TSO)? diamond : no_diamond); XtAddCallback(tso_toggle, XtNcallback, toggle_host_type, (XtPointer)&s_tso); cics_toggle = XtVaCreateManagedWidget( "cics", commandWidgetClass, ft_dialog, XtNfromVert, tso_toggle, XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(cics_toggle, (xftc.host_type == HT_CICS)? diamond : no_diamond); XtAddCallback(cics_toggle, XtNcallback, toggle_host_type, (XtPointer)&s_cics); /* Create CR toggle. */ cr_widget = XtVaCreateManagedWidget( "cr", commandWidgetClass, ft_dialog, XtNfromVert, cics_toggle, XtNvertDistance, FAR_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(cr_widget, xftc.ascii_flag && xftc.cr_flag? dot: no_dot); XtAddCallback(cr_widget, XtNcallback, toggle_cr, 0); dialog_register_sensitivity(cr_widget, &xftc.ascii_flag, true, NULL, false, NULL, false); /* Create remap toggle. */ remap_widget = XtVaCreateManagedWidget( "remap", commandWidgetClass, ft_dialog, XtNfromVert, cr_widget, XtNfromHoriz, h_ref, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(remap_widget, xftc.ascii_flag && xftc.remap_flag? dot: no_dot); XtAddCallback(remap_widget, XtNcallback, toggle_remap, NULL); dialog_register_sensitivity(remap_widget, &xftc.ascii_flag, true, NULL, false, NULL, false); /* Set up the Units group. */ units_label = XtVaCreateManagedWidget( "units", labelWidgetClass, ft_dialog, XtNfromVert, append_widget, XtNvertDistance, FAR_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_register_sensitivity(units_label, &xftc.receive_flag, false, &host_is_tso, true, NULL, false); units_options[0] = XtVaCreateManagedWidget( "spaceDefault", commandWidgetClass, ft_dialog, XtNfromVert, units_label, XtNvertDistance, 3, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(units_options[0], (xftc.units == DEFAULT_UNITS)? diamond: no_diamond); XtAddCallback(units_options[0], XtNcallback, units_callback, (XtPointer)&u_default_units); dialog_register_sensitivity(units_options[0], &xftc.receive_flag, false, &host_is_tso, true, NULL, false); units_options[1] = XtVaCreateManagedWidget( "tracks", commandWidgetClass, ft_dialog, XtNfromVert, units_options[0], XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(units_options[1], (xftc.units == TRACKS)? diamond: no_diamond); XtAddCallback(units_options[1], XtNcallback, units_callback, (XtPointer)&u_tracks); dialog_register_sensitivity(units_options[1], &xftc.receive_flag, false, &host_is_tso, true, NULL, false); units_options[2] = XtVaCreateManagedWidget( "cylinders", commandWidgetClass, ft_dialog, XtNfromVert, units_options[1], XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(units_options[2], (xftc.units == CYLINDERS)? diamond: no_diamond); XtAddCallback(units_options[2], XtNcallback, units_callback, (XtPointer)&u_cylinders); dialog_register_sensitivity(units_options[2], &xftc.receive_flag, false, &host_is_tso, true, NULL, false); units_options[3] = XtVaCreateManagedWidget( "avblock", commandWidgetClass, ft_dialog, XtNfromVert, units_options[2], XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_apply_bitmap(units_options[3], (xftc.units == AVBLOCK)? diamond: no_diamond); XtAddCallback(units_options[3], XtNcallback, units_callback, (XtPointer)&u_avblock); dialog_register_sensitivity(units_options[3], &xftc.receive_flag, false, &host_is_tso, true, NULL, false); primspace_label = XtVaCreateManagedWidget( "primspace", labelWidgetClass, ft_dialog, XtNfromVert, units_options[3], XtNvertDistance, 3, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_register_sensitivity(primspace_label, &xftc.receive_flag, false, &host_is_tso, true, &units_default, false); primspace_widget = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNfromVert, units_options[3], XtNvertDistance, 3, XtNfromHoriz, primspace_label, XtNhorizDistance, 0, XtNwidth, 100, XtNeditType, XawtextEdit, XtNdisplayCaret, False, NULL); if (xftc.primary_space) { s = xs_buffer("%d", xftc.primary_space); XtVaSetValues(primspace_widget, XtNstring, s, NULL); XawTextSetInsertionPoint(primspace_widget, strlen(s)); XtFree(s); } dialog_match_dimension(primspace_label, primspace_widget, XtNheight); w = XawTextGetSource(primspace_widget); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(primspace_widget, &xftc.receive_flag, false, &host_is_tso, true, &units_default, false); secspace_label = XtVaCreateManagedWidget( "secspace", labelWidgetClass, ft_dialog, XtNfromVert, primspace_widget, XtNvertDistance, 3, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_match_dimension(primspace_label, secspace_label, XtNwidth); dialog_register_sensitivity(secspace_label, &xftc.receive_flag, false, &host_is_tso, true, &units_default, false); secspace_widget = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNfromVert, primspace_widget, XtNvertDistance, 3, XtNfromHoriz, secspace_label, XtNhorizDistance, 0, XtNwidth, 100, XtNeditType, XawtextEdit, XtNdisplayCaret, False, NULL); if (xftc.secondary_space) { s = xs_buffer("%d", xftc.secondary_space); XtVaSetValues(secspace_widget, XtNstring, s, NULL); XawTextSetInsertionPoint(secspace_widget, strlen(s)); XtFree(s); } dialog_match_dimension(secspace_label, secspace_widget, XtNheight); w = XawTextGetSource(secspace_widget); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(secspace_widget, &xftc.receive_flag, false, &host_is_tso, true, &units_default, false); avblock_size_label = XtVaCreateManagedWidget( "avblockSize", labelWidgetClass, ft_dialog, XtNfromVert, secspace_widget, XtNvertDistance, 3, XtNfromHoriz, h_ref, XtNhorizDistance, COLUMN_GAP, XtNborderWidth, 0, NULL); dialog_match_dimension(secspace_label, avblock_size_label, XtNwidth); dialog_register_sensitivity(avblock_size_label, &xftc.receive_flag, false, &host_is_tso, true, &units_avblock, true); avblock_size_widget = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNfromVert, secspace_widget, XtNvertDistance, 3, XtNfromHoriz, avblock_size_label, XtNhorizDistance, 0, XtNwidth, 100, XtNeditType, XawtextEdit, XtNdisplayCaret, False, NULL); if (xftc.avblock) { s = xs_buffer("%d", xftc.avblock); XtVaSetValues(avblock_size_widget, XtNstring, s, NULL); XawTextSetInsertionPoint(avblock_size_widget, strlen(s)); XtFree(s); } dialog_match_dimension(avblock_size_label, avblock_size_widget, XtNheight); w = XawTextGetSource(avblock_size_widget); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(avblock_size_widget, &xftc.receive_flag, false, &host_is_tso, true, &units_avblock, true); /* Set up the DFT buffer size. */ buffersize_label = XtVaCreateManagedWidget( "buffersize", labelWidgetClass, ft_dialog, XtNfromVert, blksize_label, XtNvertDistance, 3, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); buffersize_widget = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, ft_dialog, XtNfromVert, blksize_label, XtNvertDistance, 3, XtNfromHoriz, buffersize_label, XtNhorizDistance, 0, XtNwidth, 100, XtNeditType, XawtextEdit, XtNdisplayCaret, False, NULL); dialog_match_dimension(buffersize_label, buffersize_widget, XtNheight); w = XawTextGetSource(buffersize_widget); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(buffersize_widget, NULL, false, NULL, false, NULL, false); s = xs_buffer("%d", xftc.dft_buffersize); XtVaSetValues(buffersize_widget, XtNstring, s, NULL); XawTextSetInsertionPoint(buffersize_widget, strlen(s)); XtFree(s); /* Set up the buttons at the bottom. */ start_button = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, ft_dialog, XtNfromVert, buffersize_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, NULL); XtAddCallback(start_button, XtNcallback, ft_start_callback, NULL); cancel_button = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, ft_dialog, XtNfromVert, buffersize_label, XtNvertDistance, FAR_VGAP, XtNfromHoriz, start_button, XtNhorizDistance, BUTTON_GAP, NULL); XtAddCallback(cancel_button, XtNcallback, ft_cancel, 0); } /* Callbacks for all the transfer widgets. */ /* Transfer pop-up popping up. */ static void ft_popup_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* Set the focus to the local file widget. */ PA_dialog_focus_xaction(local_file, NULL, NULL, NULL); /* Disallow overwrites. */ xftc.allow_overwrite = false; } /* Cancel button pushed. */ static void ft_cancel(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(ft_shell); } /* recfm options. */ static void recfm_callback(Widget w, XtPointer user_data, XtPointer call_data _is_unused) { xftc.recfm = *(recfm_t *)user_data; recfm_default = (xftc.recfm == DEFAULT_RECFM); dialog_check_sensitivity(&recfm_default); dialog_flip_toggles(&recfm_toggles, w); } /* Units options. */ static void units_callback(Widget w, XtPointer user_data, XtPointer call_data _is_unused) { xftc.units = *(units_t *)user_data; units_default = (xftc.units == DEFAULT_UNITS); units_avblock = (xftc.units == AVBLOCK); dialog_check_sensitivity(&units_default); dialog_check_sensitivity(&units_avblock); dialog_flip_toggles(&units_toggles, w); } /* OK button pushed. */ static void ft_start_callback(Widget w _is_unused, XtPointer call_parms _is_unused, XtPointer call_data _is_unused) { XtPopdown(ft_shell); if (ft_start()) { popup_progress(); } } /* Send/receive options. */ static void toggle_receive(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag */ xftc.receive_flag = *(bool *)client_data; /* Change the widget states. */ dialog_mark_toggle(receive_toggle, xftc.receive_flag? diamond: no_diamond); dialog_mark_toggle(send_toggle, xftc.receive_flag? no_diamond: diamond); dialog_check_sensitivity(&xftc.receive_flag); } /* Ascii/binary options. */ static void toggle_ascii(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag. */ xftc.ascii_flag = *(bool *)client_data; /* Change the widget states. */ dialog_mark_toggle(ascii_toggle, xftc.ascii_flag? diamond: no_diamond); dialog_mark_toggle(binary_toggle, xftc.ascii_flag? no_diamond: diamond); xftc.cr_flag = xftc.ascii_flag; xftc.remap_flag = xftc.ascii_flag; dialog_mark_toggle(cr_widget, xftc.cr_flag? dot: no_dot); dialog_mark_toggle(remap_widget, xftc.remap_flag? dot: no_dot); dialog_check_sensitivity(&xftc.ascii_flag); } /* CR option. */ static void toggle_cr(Widget w, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* Toggle the cr flag */ xftc.cr_flag = !xftc.cr_flag; dialog_mark_toggle(w, xftc.cr_flag? dot: no_dot); } /* Append option. */ static void toggle_append(Widget w, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* Toggle Append Flag */ xftc.append_flag = !xftc.append_flag; dialog_mark_toggle(w, xftc.append_flag? dot: no_dot); } /* Remap option. */ static void toggle_remap(Widget w, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* Toggle Remap Flag */ xftc.remap_flag = !xftc.remap_flag; dialog_mark_toggle(w, xftc.remap_flag? dot: no_dot); } /* * Set the individual bool variables used by the dialog sensitivity * functions, and call dialog_check_sensitivity(). */ static void set_host_type_booleans(void) { switch (xftc.host_type) { case HT_TSO: host_is_tso = true; host_is_tso_or_vm = true; break; case HT_VM: host_is_tso = false; host_is_tso_or_vm = true; break; case HT_CICS: host_is_tso = false; host_is_tso_or_vm = false; } dialog_check_sensitivity(&host_is_tso); dialog_check_sensitivity(&host_is_tso_or_vm); } /* TSO/VM/CICS option. */ static void toggle_host_type(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { host_type_t old_host_type; /* Toggle the flag. */ old_host_type = xftc.host_type; xftc.host_type = *(host_type_t *)client_data; if (xftc.host_type == old_host_type) { return; } /* Change the widget states. */ dialog_mark_toggle(vm_toggle, (xftc.host_type == HT_VM)? diamond: no_diamond); dialog_mark_toggle(tso_toggle, (xftc.host_type == HT_TSO)? diamond: no_diamond); dialog_mark_toggle(cics_toggle, (xftc.host_type == HT_CICS)? diamond: no_diamond); if (xftc.host_type != HT_TSO) { /* Reset record format. */ if ((xftc.host_type == HT_VM && xftc.recfm == RECFM_UNDEFINED) || (xftc.host_type == HT_CICS && xftc.recfm != DEFAULT_RECFM)) { xftc.recfm = DEFAULT_RECFM; recfm_default = true; dialog_flip_toggles(&recfm_toggles, recfm_toggles.widgets[0]); } /* Reset units. */ if (xftc.units != DEFAULT_UNITS) { xftc.units = DEFAULT_UNITS; units_default = true; units_avblock = false; dialog_flip_toggles(&units_toggles, units_toggles.widgets[0]); } if (xftc.host_type == HT_CICS) { /* Reset logical record size. */ XtVaSetValues(lrecl_widget, XtNstring, "", NULL); } /* Reset block size, primary space and secondary space. */ XtVaSetValues(blksize_widget, XtNstring, "", NULL); XtVaSetValues(primspace_widget, XtNstring, "", NULL); XtVaSetValues(secspace_widget, XtNstring, "", NULL); } set_host_type_booleans(); } /* * Get a numerical value from a string widget. * * @param[in] w Widget to interrogate * * @return Numerical value of widget contents. */ static int get_widget_n(Widget w) { String s; XtVaGetValues(w, XtNstring, &s, NULL); if (strlen(s) > 0) { return atoi(s); } else { return 0; } } /** * Begin the transfer. * * @return true if the transfer has started, false otherwise */ static bool ft_start(void) { int size; /* * Get the DFT buffer size, and update the widget with the default if they * entered nothing (or an explicit 0). */ size = set_dft_buffersize(get_widget_n(buffersize_widget)); XtVaSetValues(buffersize_widget, XtNstring, lazyaf("%d", size), NULL); /* Get the host file from its widget */ XtVaGetValues(host_file, XtNstring, &xftc.host_filename, NULL); if (!*xftc.host_filename) { return false; } /* Get the local file from its widget */ XtVaGetValues(local_file, XtNstring, &xftc.local_filename, NULL); if (!*xftc.local_filename) { return false; } /* Fetch the rest of the numeric parameters. */ xftc.lrecl = get_widget_n(lrecl_widget); xftc.blksize = get_widget_n(blksize_widget); xftc.primary_space = get_widget_n(primspace_widget); xftc.secondary_space = get_widget_n(secspace_widget); xftc.avblock = get_widget_n(avblock_size_widget); xftc.dft_buffersize = size; /* Check for primary space. */ if (xftc.host_type == HT_TSO && xftc.units != DEFAULT_UNITS && xftc.primary_space <= 0) { popup_an_error("Missing or invalid Primary Space"); return false; } /* Prompt for local file overwrite. */ if (xftc.receive_flag && !xftc.append_flag && !xftc.allow_overwrite) { fts.local_file = fopen(xftc.local_filename, xftc.ascii_flag? "r": "rb"); if (fts.local_file != NULL) { (void) fclose(fts.local_file); fts.local_file = NULL; popup_overwrite(); return false; } } /* Start the transfer. */ fts.local_file = ft_go(&xftc); if (fts.local_file == NULL) { return false; } /* We're running. */ return true; } /* "Transfer in Progress" pop-up. */ /* Pop up the "in progress" pop-up. */ static void popup_progress(void) { /* Initialize it. */ if (progress_shell == NULL) { progress_popup_init(); } /* Set the sensitivity of the cancel button. */ XtVaSetValues(inprogress_cancel_button, XtNsensitive, !ftc->is_action, NULL); /* Pop it up. */ popup_popup(progress_shell, XtGrabNone); } /* Initialize the "in progress" pop-up. */ static void progress_popup_init(void) { Widget progress_pop, from_label, to_label; /* Create the shell. */ progress_shell = XtVaCreatePopupShell( "ftProgressPopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(progress_shell, XtNpopupCallback, place_popup, (XtPointer)CenterP); XtAddCallback(progress_shell, XtNpopupCallback, progress_popup_callback, NULL); /* Create a form structure to contain the other stuff */ progress_pop = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, progress_shell, NULL); /* Create the widgets. */ from_label = XtVaCreateManagedWidget( "fromLabel", labelWidgetClass, progress_pop, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); from_file = XtVaCreateManagedWidget( "filename", labelWidgetClass, progress_pop, XtNwidth, FILE_WIDTH, XtNvertDistance, FAR_VGAP, XtNfromHoriz, from_label, XtNhorizDistance, 0, NULL); dialog_match_dimension(from_label, from_file, XtNheight); to_label = XtVaCreateManagedWidget( "toLabel", labelWidgetClass, progress_pop, XtNfromVert, from_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); to_file = XtVaCreateManagedWidget( "filename", labelWidgetClass, progress_pop, XtNwidth, FILE_WIDTH, XtNfromVert, from_label, XtNvertDistance, FAR_VGAP, XtNfromHoriz, to_label, XtNhorizDistance, 0, NULL); dialog_match_dimension(to_label, to_file, XtNheight); dialog_match_dimension(from_label, to_label, XtNwidth); waiting = XtVaCreateManagedWidget( "waiting", labelWidgetClass, progress_pop, XtNfromVert, to_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNmappedWhenManaged, False, NULL); ft_status = XtVaCreateManagedWidget( "status", labelWidgetClass, progress_pop, XtNfromVert, to_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNresizable, True, XtNmappedWhenManaged, False, NULL); XtVaGetValues(ft_status, XtNlabel, &status_string, NULL); status_string = XtNewString(status_string); aborting = XtVaCreateManagedWidget( "aborting", labelWidgetClass, progress_pop, XtNfromVert, to_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNmappedWhenManaged, False, NULL); inprogress_cancel_button = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, progress_pop, XtNfromVert, ft_status, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, NULL); XtAddCallback(inprogress_cancel_button, XtNcallback, progress_cancel_callback, NULL); } /* Callbacks for the "in progress" pop-up. */ /* In-progress pop-up popped up. */ static void progress_popup_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtVaSetValues(from_file, XtNlabel, xftc.receive_flag? xftc.host_filename: xftc.local_filename, NULL); XtVaSetValues(to_file, XtNlabel, xftc.receive_flag? xftc.local_filename: xftc.host_filename, NULL); switch (ft_state) { case FT_AWAIT_ACK: XtUnmapWidget(ft_status); XtUnmapWidget(aborting); XtMapWidget(waiting); break; case FT_RUNNING: XtUnmapWidget(waiting); XtUnmapWidget(aborting); XtMapWidget(ft_status); break; case FT_ABORT_WAIT: case FT_ABORT_SENT: XtUnmapWidget(waiting); XtUnmapWidget(ft_status); XtMapWidget(aborting); break; default: break; } } /* In-progress "cancel" button. */ static void progress_cancel_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (ft_do_cancel()) { /* Waiting for the host to acknowledge our cancellation. */ XtUnmapWidget(waiting); XtUnmapWidget(ft_status); XtMapWidget(aborting); } } /* "Overwrite existing?" pop-up. */ /* Pop up the "overwrite" pop-up. */ static void popup_overwrite(void) { /* Initialize it. */ if (overwrite_shell == NULL) { overwrite_popup_init(); } /* Pop it up. */ popup_popup(overwrite_shell, XtGrabExclusive); } /* Initialize the "overwrite" pop-up. */ static void overwrite_popup_init(void) { Widget overwrite_pop, overwrite_name, okay_button, cancel_button; String overwrite_string, label, lf; Dimension d; /* Create the shell. */ overwrite_shell = XtVaCreatePopupShell( "ftOverwritePopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(overwrite_shell, XtNpopupCallback, place_popup, (XtPointer)CenterP); XtAddCallback(overwrite_shell, XtNpopdownCallback, overwrite_popdown, NULL); /* Create a form structure to contain the other stuff */ overwrite_pop = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, overwrite_shell, NULL); /* Create the widgets. */ overwrite_name = XtVaCreateManagedWidget( "overwriteName", labelWidgetClass, overwrite_pop, XtNvertDistance, MARGIN, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNresizable, True, NULL); XtVaGetValues(overwrite_name, XtNlabel, &overwrite_string, NULL); XtVaGetValues(local_file, XtNstring, &lf, NULL); label = xs_buffer(overwrite_string, lf); XtVaSetValues(overwrite_name, XtNlabel, label, NULL); XtFree(label); XtVaGetValues(overwrite_name, XtNwidth, &d, NULL); if ((Dimension)(d + 20) < 400) { d = 400; } else { d += 20; } XtVaSetValues(overwrite_name, XtNwidth, d, NULL); XtVaGetValues(overwrite_name, XtNheight, &d, NULL); XtVaSetValues(overwrite_name, XtNheight, d + 20, NULL); okay_button = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, overwrite_pop, XtNfromVert, overwrite_name, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, NULL); XtAddCallback(okay_button, XtNcallback, overwrite_okay_callback, NULL); cancel_button = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, overwrite_pop, XtNfromVert, overwrite_name, XtNvertDistance, FAR_VGAP, XtNfromHoriz, okay_button, XtNhorizDistance, BUTTON_GAP, NULL); XtAddCallback(cancel_button, XtNcallback, overwrite_cancel_callback, NULL); } /* Overwrite "okay" button. */ static void overwrite_okay_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(overwrite_shell); xftc.allow_overwrite = true; if (ft_start()) { XtPopdown(ft_shell); popup_progress(); } } /* Overwrite "cancel" button. */ static void overwrite_cancel_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(overwrite_shell); } /* Overwrite pop-up popped down. */ static void overwrite_popdown(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtDestroyWidget(overwrite_shell); overwrite_shell = NULL; } /* Entry points called from the common FT logic. */ /* Pop down the transfer-in-progress pop-up. */ void ft_gui_progress_popdown(void) { XtPopdown(progress_shell); } /* Massage a file transfer error message so it will fit in the pop-up. */ #define MAX_MSGLEN 50 void ft_gui_errmsg_prepare(char *msg) { if (strlen(msg) > MAX_MSGLEN && strchr(msg, '\n') == NULL) { char *s = msg + MAX_MSGLEN; while (s > msg && *s != ' ') { s--; } if (s > msg) { *s = '\n'; /* yikes! */ } } } /* Clear out the progress display. */ void ft_gui_clear_progress(void) { } /* Pop up a successful completion message. */ void ft_gui_complete_popup(const char *msg) { if (!ftc->is_action) { popup_an_info("%s", msg); } } /* Update the bytes-transferred count on the progress pop-up. */ void ft_gui_update_length(size_t length) { char *s; s = xs_buffer(status_string, (unsigned long)length); XtVaSetValues(ft_status, XtNlabel, s, NULL); XtFree(s); } /* Replace the 'waiting' pop-up with the 'in-progress' pop-up. */ void ft_gui_running(size_t length) { XtUnmapWidget(waiting); ft_gui_update_length(length); XtMapWidget(ft_status); } /* Process a protocol-generated abort. */ void ft_gui_aborting(void) { XtUnmapWidget(waiting); XtUnmapWidget(ft_status); XtMapWidget(aborting); } /* Check for interactive mode. */ ft_gui_interact_t ft_gui_interact(ft_conf_t *p) { return FGI_NOP; } /* Display an "Awaiting start of transfer" message. */ void ft_gui_awaiting(void) { if (ftc->is_action) { popup_progress(); XtVaSetValues(from_file, XtNlabel, ftc->receive_flag? ftc->host_filename: ftc->local_filename, NULL); XtVaSetValues(to_file, XtNlabel, ftc->receive_flag? ftc->local_filename: ftc->host_filename, NULL); } } suite3270-3.6/x3270/ft.inc0000664000076500007650000001355013221577163013067 0ustar pdmpdmXX_SH(File Transfer) The XX_FB(Transfer) XX_action implements XX_FB(IND$FILE) file transfer. This XX_action requires that the XX_FB(IND$FILE) program be installed on the XX_SM(IBM) host, and that the 3270 cursor be located in a field that will accept a XX_SM(TSO) or XX_SM(VM/CMS) command. XX_LP ifelse(XX_PRODUCT,x3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`The XX_FB(Transfer) XX_action can be entered at the command prompt with no parameters, which will cause it to prompt interactively for the file names and options. It can also be invoked with parameters to define the entire transfer. ')dnl XX_LP Because of the complexity and number of options for file transfer, the parameters to the XX_FB(Transfer) XX_action take the unique form of XX_FI(option)=XX_FI(value), and can appear in any order. Note that if the XX_FI(value) contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are: XX_LP XX_TS(4,l c l l.) XX_TR(XX_TD(Option) XX_TD(Required?) XX_TD(Default) XX_TD(Other Values)) XX_T_() XX_TR(XX_TD(Direction) XX_TD(No) XX_TD(receive) XX_TD(send)) XX_TR(XX_TD(HostFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(LocalFile) XX_TD(Yes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Host) XX_TD(No) XX_TD(tso) `XX_TD(`vm, cics')') XX_TR(XX_TD(Mode) XX_TD(No) XX_TD(ascii) XX_TD(binary)) XX_TR(XX_TD(Cr) XX_TD(No) XX_TD(remove) `XX_TD(`add, keep')') XX_TR(XX_TD(Remap) XX_TD(No) XX_TD(yes) XX_TD(no)) XX_TR(XX_TD(Exist) XX_TD(No) XX_TD(keep) `XX_TD(`replace, append')') XX_TR(XX_TD(Recfm) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`fixed, variable, undefined')') XX_TR(XX_TD(Lrecl) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Blksize) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Allocation) XX_TD(No) XX_TD(XX_NBSP) `XX_TD(`tracks, cylinders, avblock')') XX_TR(XX_TD(PrimarySpace) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(SecondarySpace) XX_TD(No) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(Avblock) XX_TD(Sometimes) XX_TD(XX_NBSP) XX_TD(XX_NBSP)) XX_TR(XX_TD(BufferSize) XX_TD(No) XX_TD(4096) XX_TD(XX_NBSP)) XX_TE() XX_LP The option details are as follows. XX_TPS()dnl XX_TP(XX_FB(Direction)) XX_FB(send) to send a file to the host, XX_FB(receive) to receive a file from the host. XX_TP(XX_FB(HostFile)) The name of the file on the host. XX_TP(XX_FB(LocalFile)) The name of the file on the local workstation. XX_TP(XX_FB(Host)) The type of host (which dictates the form of the XX_FB(IND$FILE) command): XX_FB(tso) (the default), XX_FB(vm) or XX_FB(cics). XX_TP(XX_FB(Mode)) Use XX_FB(ascii) (the default) for a text file, which will be translated between XX_SM(EBCDIC) and XX_SM(ASCII) as necessary. Use XX_FB(binary) for non-text files. XX_TP(XX_FB(Cr)) Controls how XX_FB(Newline) characters are handled when transferring XX_FB(Mode=ascii) files. XX_FB(remove) (the default) strips XX_FB(Newline) characters in local files before transferring them to the host. XX_FB(add) adds XX_FB(Newline) characters to each host file record before transferring it to the local workstation. XX_FB(keep) preserves XX_FB(Newline) characters when transferring a local file to the host. XX_TP(XX_FB(Remap)) Controls text translation for XX_FB(Mode=ascii) files. The value XX_FB(yes) (the default) causes XX_PRODUCT to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's XX_SM(EBCDIC) code page. The value XX_FB(no) causes XX_PRODUCT to pass the text to or from the host as-is, leaving all translation to the XX_FB(IND$FILE) program on the host. XX_TP(XX_FB(Exist)) Controls what happens when the destination file already exists. XX_FB(keep) (the default) preserves the file, causing the XX_FB(Transfer) XX_action to fail. XX_FB(replace) overwrites the destination file with the source file. XX_FB(append) appends the source file to the destination file. XX_TP(XX_FB(Recfm)) Controls the record format of files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_FB(fixed) creates a file with fixed-length records. XX_FB(variable) creates a file with variable-length records. XX_FB(undefined) creates a file with undefined-length records (XX_SM(TSO) hosts only). The XX_FB(Lrecl) option controls the record length or maximum record length for XX_FB(Recfm=fixed) and XX_FB(Recfm=variable) files, respectively. XX_TP(XX_FB(Lrecl)) Specifies the record length (or maximum record length) for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Blksize)) Specifies the block size for files created on the host. (XX_SM(TSO) and XX_SM(VM) hosts only.) XX_TP(XX_FB(Allocation)) Specifies the units for the XX_FB(PrimarySpace) and XX_FB(SecondarySpace) options: XX_FB(tracks), XX_FB(cylinders) or XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(PrimarySpace)) Primary allocation for a file. The units are given by the XX_FB(Allocation) option. Required when the XX_FB(Allocation) is specified as something other than XX_FB(default). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(SecondarySpace)) Secondary allocation for a file. The units are given by the XX_FB(Allocation) option. (XX_SM(TSO) hosts only.) XX_TP(XX_FB(Avblock)) Average block size, required when XX_FB(Allocation) specifies XX_FB(avblock). (XX_SM(TSO) hosts only.) XX_TP(XX_FB(BufferSize)) Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them. ifelse(XX_PLATFORM,windows,`XX_TP(XX_FB(WindowsCodePage)) Overrides the workstation code page used for XX_SM(ASCII) file transfers. By default, the system XX_SM(ANSI) code page is used. ')dnl XX_TPE()dnl XX_LP There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the XX_FB(Transfer) keywords, but with XX_FB(ft) prepended. E.g., the default for the XX_FB(Mode) keyword is the XX_FB(XX_PRODUCT.ftMode) resource. suite3270-3.6/x3270/host_gui.c0000664000076500007650000000463713221577164013757 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * host_gui.c * GUI-specific functions called from the host connect/disconnect * logic. */ #include "globals.h" #include "appres.h" #include "host_gui.h" #include "xio.h" #include "xpopups.h" bool host_gui_connect(void) { if (appres.once) { /* Exit when the error pop-up pops down. */ exiting = true; return true; } else { return false; } } void host_gui_connect_initial(void) { if (appres.interactive.reconnect && error_popup_visible()) { popdown_an_error(); } } bool host_gui_disconnect(void) { if (appres.once) { if (error_popup_visible()) { /* If there is an error pop-up, exit when it pops down. */ exiting = true; } else { /* Exit now. */ x3270_exit(0); return true; } return true; } else { return false; } } void host_gui_connected(void) { if (appres.interactive.reconnect && error_popup_visible()) { popdown_an_error(); } } suite3270-3.6/x3270/hostname.inc0000664000076500007650000000600213221577163014266 0ustar pdmpdmThe full syntax for XX_FI(host) is: XX_RS([XX_FI(prefix):]...[XX_FI(LUname)@]XX_FI(hostname)[:XX_FI(port)][=XX_FI(accept)]) ifelse(XX_PRODUCT,wc3270,,`XX_LP Prepending a XX_FB(P:) onto XX_FI(hostname) causes the connection to go through the XX_FI(telnet-passthru) service rather than directly to the host. See XX_LINK(#Passthru,XX_SM(PASSTHRU)) below. ')dnl XX_LP Prepending an XX_FB(S:) onto XX_FI(hostname) removes the "extended data stream" option reported to the host. See XX_LINK(#tn,XX_FB(XX_DASHED(tn))) below for further information. XX_LP Prepending an XX_FB(N:) onto XX_FI(hostname) turns off TN3270E support for the session. XX_LP Prepending an XX_FB(L:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if XX_FB(XX_PRODUCT) was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the XX_FB(L:) prefix should not be used. XX_LP Prepending a XX_FB(Y:) onto XX_FI(hostname) causes XX_FB(XX_PRODUCT) to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options. XX_LP Prepending an XX_FB(A:) onto XX_FI(hostname) is equivalent to setting the XX_FB(XX_DASHED(nvt)) option; it forces an NVT-mode session instead of a 3270-mode session. XX_LP A specific Logical Unit (LU) name to use may be specified by prepending it to the XX_FI(hostname) with an XX_DQUOTED(XX_FB(@)). Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.) XX_LP The XX_FI(hostname) may optionally be placed inside square-bracket characters XX_DQUOTED(XX_FB([)) and XX_DQUOTED(XX_FB(])). This will prevent any colon XX_DQUOTED(XX_FB(:)) characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames. ifelse(XX_PRODUCT,wc3270,,XX_PRODUCT,ws3270,,`XX_LP On systems that support the XX_FI(forkpty) library call, the XX_FI(hostname) may be replaced with XX_FB(XX_DASHED(e)) and a command string. This will cause XX_FB(XX_PRODUCT) to connect to a local child process, such as a shell. ')dnl XX_LP The port to connect to defaults to XX_FB(telnet). This can be overridden with the XX_FB(XX_DASHED(port)) option, or by appending a XX_FI(port) to the XX_FI(hostname) with a colon XX_DQUOTED(XX_FB(:)). (For compatability with previous versions of XX_FB(XX_PRODUCT) and with XX_FI(tn3270)(1), the XX_FI(port) may also be specified as a second, separate argument.) XX_LP An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (XX_DQUOTED(XX_FB(=))). The accept name can also be specified with the XX_FB(XX_DASHED(accepthostname)) option. suite3270-3.6/x3270/html/Attributes.html0000664000076500007650000001371513221577164015747 0ustar pdmpdm x3270 Character Attributes

    x3270 Character Attributes

    This table translates the hexadecimal codes displayed by the debug font (3270d) into 3270 field attributes.

    n
    Intensity
    Selectable
    Type
    Modified
    C0
    normal
     
     
     
    C1
    normal
    sel
     
     
    C2
    high
    sel
     
     
    C3
    zero
     
     
     
    C4
    normal
     
    protected
     
    C5
    normal
    sel
    protected
     
    C6
    high
    sel
    protected
     
    C7
    zero
     
    protected
     
    C8
    normal
     
    numeric
     
    C9
    normal
    sel
    numeric
     
    CA
    high
    sel
    numeric
     
    CB
    zero
     
    numeric
     
    CC
    normal
     
    auto-skip
     
    CD
    normal
    sel
    auto-skip
     
    CE
    high
    sel
    auto-skip
     
    CF
    zero
     
    auto-skip
     
    E0
    normal
     
     
    mod
    E1
    normal
    sel
     
    mod
    E2
    high
    sel
     
    mod
    E3
    zero
     
     
    mod
    E4
    normal
     
    protected
    mod
    E5
    normal
    sel
    protected
    mod
    E6
    high
    sel
    protected
    mod
    E7
    zero
     
    protected
    mod
    E8
    normal
     
    numeric
    mod
    E9
    normal
    sel
    numeric
    mod
    EA
    high
    sel
    numeric
    mod
    EB
    zero
     
    numeric
    mod
    EC
    normal
     
    auto-skip
    mod
    ED
    normal
    sel
    auto-skip
    mod
    EE
    high
    sel
    auto-skip
    mod
    EF
    zero
     
    auto-skip
    mod
    suite3270-3.6/x3270/html/Brackets.html0000664000076500007650000001046313221577164015354 0ustar pdmpdm Square Bracket Characters

    Square Bracket Characters

    The Problem

    Most IBM 3270 emulators have some degree of difficulty with the square-bracket characters, [ and ]. The problem is that there is not a consistent definition of what EBCDIC codes represent them. Hosts may define the square bracket characters as X'BA' and X'BB' (as defined in the IBM Character Set Reference as standard EBCDIC characters), or as X'AD' and X'BD' (which is what the IBM C compilers recognize). In addition, some (but not all) hosts display these characters with a Graphics Escape (GE) sequence. When the host and/or x3270 are misconfigured, the square-bracket characters may be displayed as  and , or Ý and ¨.

    Host Configuration

    If you are using ISPF, you may simply need to use the correct terminal translation table. According to the IBM's ISPF Planning and Customizing (SC28-1298), Section 3.11, the correct translation table for displaying square bracket characters is called 3278A.

    In VM/CMS, the commands terminal apl on and set apl on cause the X'AD', X'BD', X'BA' and X'BB' characters to be displayed with a Graphics Escape (GE) prefix. With terminal apl off and set apl off in effect, they are displayed without the GE prefix.

    x3270 Facilities

    x3270 has two facilities to deal with this situation: character sets and keymaps. By selecting the correct character set and keymap, you can set up x3270 to generate and display the proper codes for the square-bracket characters.
    -charset bracket is the default mode, and is used with hosts that use X'AD' and X'BD' for the square-bracket characters. It can be used if the host displays these characters with or without a GE sequence.
    -charset us is for use with hosts that use X'BA' and X'BB' for the square-bracket characters, and do not display these characters with a GE sequence.
    -apl (an abbreviation for -charset apl, -keymap apl) is for use with hosts running APL, which use GE X'AD' and GE X'BD' to represent and display the APL2 square-bracket characters.
    Here is a table which summarizes the combinations of characters generated and displayed in the various modes.
     
     
    keyboard generates
    graphic displayed for EBCDIC codes
    x3270 Mode
    [ key
    ] key
    X'AD'
    X'BD'
    X'BA'
    X'BB'
    GE X'BA'
    GE X'BB'
    GE X'AD'
    GE X'BD'
    -charset bracket (default) X'AD'
    X'BD'
    [
    ]
    Ý
    ¨
    [
    ]
    -charset us
    X'BA'
    X'BB'
    Ý
    ¨
    [
    ]
    -apl
    GE X'AD'
    GE X'BD'
    suite3270-3.6/x3270/html/Bugs.html0000664000076500007650000000120413221577164014507 0ustar pdmpdm Known Bugs in x3270 3.3

    Known Bugs in x3270 3.3.2

    • 'Flipped' mode (for right-to-left languages) is disabled.
    • pr3287 does not support DBCS.
    • File transfer does not support DBCS.
    If you discover any other problems in x3270, please contact Paul Mattes. suite3270-3.6/x3270/html/Charset.html0000664000076500007650000004537113221577164015215 0ustar pdmpdm x3270 Character Set

    x3270 Character Set

    x3270 can use any constant-spaced X11 font, but in order to display special characters on the status line, it uses a family of special fonts with nonstandard ordering.

    The character set ordering was originally based on the character generator ROM for a particular IBM terminal, but has since been modified to include all of the graphics in later versions of the U.S. EBCDIC and ISO 8859-1 Latin-1 character sets.

    The column definitions are:

    3270 CG
    The index in the 3270 character set, and if the graphic is not in the Latin-1 character set, its name.
    EBCDIC
    The Code Page 037 (U.S.-International) EBCDIC code that is displayed using that graphic. If preceded by "GE", the graphic is generated by preceding the EBCDIC code by a Graphic Escape order.
    Unicode
    The Unicode code and symbol name that is equivalent to that CG index. If an ISO 10646-1 X11 font is used rather than a 3270 font, this is the character that x3270 will display for the EBCDIC code listed to the left.
    All numbers are in hexadecimal.

    Note that CG indices 0x0c0-0x0cf and 0x0e0-0x0ef correspond to field attribute bytes; they normally display as blanks and do not have names. GC indices 0x200-0x21f correspond to the DEC line-drawing characters.

    3270 CG                 EBCDIC  Unicode
    
    000 null                00      U+0020   space 
    001                     41      U+00e7   nobreakspace 
    002 euro                --      U+20ac € eurosign
    006 eightones           ff      U+25cf ● solidcircle
    007                     ca      U+00ad ­ hyphen
    008                     6e      U+003e > greater
    009                     4c      U+003c < less
    00a                     ba      U+005b [ bracketleft
    00b                     bb      U+005d ] bracketright
    00c                     5d      U+0029 ) parenright
    00d                     4d      U+0028 ( parenleft
    00e                     d0      U+007d } braceright
    00f                     c0      U+007b { braceleft
    
    3270 CG                 EBCDIC  Unicode
    
    010                     40      U+0020 space
    011                     7e      U+003d = equal
    012                     7d      U+0027 ' apostrophe
    013                     7f      U+0022 " quotedbl
    014                     61      U+002f / slash
    015                     e0      U+005c \ backslash
    016                     4f      U+007c | bar
    017                     6a      U+00a6 ¦ brokenbar
    018                     6f      U+003f ? question
    019                     5a      U+0021 ! exclam
    01a                     5b      U+0024 $ dollar
    01b                     4a      U+00a2 ¢ cent
    01c                     b1      U+00a3 £ sterling
    01d                     b2      U+00a5 ¥ yen
    01e                     b6      U+00b6 ¶ paragraph
    01f                     9f      U+00a4 ¤ currency
    
    3270 CG                 EBCDIC  Unicode
    
    020                     f0      U+0030 0
    021                     f1      U+0031 1
    022                     f2      U+0032 2
    023                     f3      U+0033 3
    024                     f4      U+0034 4
    025                     f5      U+0035 5
    026                     f6      U+0036 6
    027                     f7      U+0037 7
    028                     f8      U+0038 8
    029                     f9      U+0039 9
    02a                     59      U+00df ß ssharp
    02b                     b5      U+00a7 § section
    02c                     7b      U+0023 # numbersign
    02d                     7c      U+0040 @ at
    02e                     6c      U+0025 % percent
    02f                     6d      U+005f _ underscore
    
    3270 CG                 EBCDIC  Unicode
    
    030                     50      U+0026 & ampersand
    031                     60      U+002d - minus
    032                     4b      U+002e . period
    033                     6b      U+002c , comma
    034                     7a      U+003a : colon
    035                     4e      U+002b + plus
    036                     5f      U+00ac ¬ notsign
    037                     bc      U+00af ¯ macron
    038                     90      U+00b0 ° degree
    039                     b3      U+00b7 · periodcentered
    03a                     b0      U+005e ^ asciicircum
    03b                     a1      U+007e ~ asciitilde
    03c                     bd      U+00a8 ¨ diaeresis
    03d                     79      U+0060 ` grave
    03e                     be      U+00b4 ´ acute
    03f                     9d      U+00b8 ¸ cedilla
    
    3270 CG                 EBCDIC  Unicode
    
    040                     44      U+00e0 à agrave
    041                     54      U+00e8 è egrave
    042                     58      U+00ec ì igrave
    043                     cd      U+00f2 ò ograve
    044                     dd      U+00f9 ù ugrave
    045                     46      U+00e3 ã atilde
    046                     cf      U+00f5 õ otilde
    047                     df      U+00ff ÿ ydiaeresis
    048                     ad      U+00dd Ý Yacute
    049                     8d      U+00fd ý yacute
    04a                     51      U+00e9 é eacute
    04b                     b7      U+00bc ¼ onequarter
    04c                     b8      U+00bd ½ onehalf
    04d                     b9      U+00be ¾ threequarters
    04e                     dc      U+00fc ü udiaeresis
    04f                     48      U+00e7 ç ccedilla
    
    3270 CG                 EBCDIC  Unicode
    
    050                     43      U+00e4 ä adiaeresis
    051                     53      U+00eb ë ediaeresis
    052                     57      U+00ef ï idiaeresis
    053                     cc      U+00f6 ö odiaeresis
    054                     a0      U+00b5 µ mu
    055                     42      U+00e2 â acircumflex
    056                     52      U+00ea ê ecircumflex
    057                     56      U+00ee î icircumflex
    058                     cb      U+00f4 ô ocircumflex
    059                     db      U+00fb û ucircumflex
    05a                     45      U+00e1 á aacute
    05b                     bf      U+00d7 × multiply
    05c                     55      U+00ed í iacute
    05d                     ce      U+00f3 ó oacute
    05e                     de      U+00fa ú uacute
    05f                     49      U+00f1 ñ ntilde
    
    3270 CG                 EBCDIC  Unicode
    
    060                     64      U+00c0 À Agrave
    061                     74      U+00c8 È Egrave
    062                     78      U+00cc Ì Igrave
    063                     ed      U+00d2 Ò Ograve
    064                     fd      U+00d9 Ù Ugrave
    065                     66      U+00c3 Ã Atilde
    066                     ef      U+00d5 Õ Otilde
    067                     da      U+00b9 ¹ onesuperior
    068                     ea      U+00b2 ² twosuperior
    069                     fa      U+00b3 ³ threesuperior
    06a                     9a      U+00aa ª ordfeminine
    06b                     9b      U+00ba º masculine
    06c                     8a      U+00ab « guillemotleft
    06d                     8b      U+00bb » guillemotright
    06e                     aa      U+00a1 ¡ exclamdown
    06f                     ab      U+00bf ¿ questiondown
    
    3270 CG                 EBCDIC  Unicode
    
    070                     63      U+00c4 Ä Adiaeresis
    071                     73      U+00cb Ë Ediaeresis
    072                     77      U+00cf Ï Idiaeresis
    073                     ec      U+00d6 Ö Odiaeresis
    074                     fc      U+00dc Ü Udiaeresis
    075                     62      U+00c2 Â Acircumflex
    076                     72      U+00ca Ê Ecircumflex
    077                     76      U+00ce Î Icircumflex
    078                     eb      U+00d4 Ô Ocircumflex
    079                     fb      U+00db Û Ucircumflex
    07a                     65      U+00c1 Á Aacute
    07b                     71      U+00c9 É Eacute
    07c                     75      U+00cd Í Iacute
    07d                     ee      U+00d3 Ó Oacute
    07e                     fe      U+00da Ú Uacute
    07f                     69      U+00d1 Ñ Ntilde
    
    3270 CG                 EBCDIC  Unicode
    
    080                     81      U+0061 a
    081                     82      U+0062 b
    082                     83      U+0063 c
    083                     84      U+0064 d
    084                     85      U+0065 e
    085                     86      U+0066 f
    086                     87      U+0067 g
    087                     88      U+0068 h
    088                     89      U+0069 i
    089                     91      U+006a j
    08a                     92      U+006b k
    08b                     93      U+006c l
    08c                     94      U+006d m
    08d                     95      U+006e n
    08e                     96      U+006f o
    08f                     97      U+0070 p
    
    3270 CG                 EBCDIC  Unicode
    
    090                     98      U+0071 q
    091                     99      U+0072 r
    092                     a2      U+0073 s
    093                     a3      U+0074 t
    094                     a4      U+0075 u
    095                     a5      U+0076 v
    096                     a6      U+0077 w
    097                     a7      U+0078 x
    098                     a8      U+0079 y
    099                     a9      U+007a z
    09a                     9c      U+00e6 ae
    09b                     70      U+00f8 ø oslash
    09c                     47      U+00e5 å aring
    09d                     e1      U+00f7 ÷ division
    09e fm                  1e      U+003b ; semicolon
    09f dup                 1c      U+002a * asterisk
    
    3270 CG                 EBCDIC  Unicode
    
    0a0                     c1      U+0041 A
    0a1                     c2      U+0042 B
    0a2                     c3      U+0043 C
    0a3                     c4      U+0044 D
    0a4                     c5      U+0045 E
    0a5                     c6      U+0046 F
    0a6                     c7      U+0047 G
    0a7                     c8      U+0048 H
    0a8                     c9      U+0049 I
    0a9                     d1      U+004a J
    0aa                     d2      U+004b K
    0ab                     d3      U+004c L
    0ac                     d4      U+004d M
    0ad                     d5      U+004e N
    0ae                     d6      U+004f O
    0af                     d7      U+0050 P
    
    3270 CG                 EBCDIC  Unicode
    
    0b0                     d8      U+0051 Q
    0b1                     d9      U+0052 R
    0b2                     e2      U+0053 S
    0b3                     e3      U+0054 T
    0b4                     e4      U+0055 U
    0b5                     e5      U+0056 V
    0b6                     e6      U+0057 W
    0b7                     e7      U+0058 X
    0b8                     e8      U+0059 Y
    0b9                     e9      U+005a Z
    0ba                     9e      U+00c6 Æ AE
    0bb                     80      U+00d8 Ø Ooblique
    0bc                     67      U+00c5 Å Aring
    0bd                     68      U+00c7 Ç Ccedilla
    0be                     5e      U+003b ; semicolon
    0bf                     5c      U+002a * asterisk
    
    3270 CG                 EBCDIC  Unicode
    
    0d0                     b4      U+00a9 © copyright
    0d1                     af      U+00ae ® registered
    0d2 boxA
    0d3 insert
    0d4 boxB
    0d5 box6
    0d6                     8f      U+00b1 ± plusminus
    0d7                     ac      U+00d0 Ð ETH
    0d8 rightarrow
    0d9                     ae      U+00de Þ THORN
    0da upshift
    0db human
    0dc underB
    0dd downshift
    0de boxquestion
    0df boxsolid		3f	U+25a0 ■
    
    3270 CG                 EBCDIC  Unicode
    
    0f0 badcommhi
    0f1 commhi
    0f2 commjag
    0f3 commlo
    0f4 clockleft
    0f5 clockright
    0d6 lock
    0f7                     8c      U+00f0 ð eth
    0f8 leftarrow
    0f9                     8e      U+00fe þ thorn
    0fa keyleft
    0fb keyright
    0fc box4
    0fd underA
    0fe magcard
    0ff boxhuman
    
    3270 CG                 EBCDIC  Unicode
    
    101 apl_Aunderbar       GE 41
    107 apl_upcarettilde    GE ca   U+2372 ⍲
    10a apl_del             GE ba	U+2207 ∇
    10b apl_delta           GE bb	U+2206 ∆
    10e apl_braceright      GE d0	U+007d } braceright
    10f apl_braceleft       GE c0	U+007b { braceleft
    
    3270 CG                 EBCDIC  Unicode
    
    110 apl_space           GE 40	U+0020 space
    115 apl_equiv           GE e0	U+2261 ≡
    11c apl_epsilon         GE b1	U+03b5 ε
    11d apl_iota            GE b2	U+03b9 ι
    11e apl_multiply        GE b6	U+00d7 × multiply
    11f apl_leftarrow       GE 9f	U+2190 ←
    
    3270 CG                 EBCDIC  Unicode
    
    120 apl_super0          GE f0	U+2070 ⁰
    121 apl_super1          GE f1	U+00b9 ¹ onesuperior
    122 apl_super2          GE f2	U+00b2 ² twosuperior
    123 apl_super3          GE f3	U+00b3 ³ threesuperior
    124 apl_super4          GE f4	U+2074 ⁴
    125 apl_super5          GE f5	U+2075 ⁵
    126 apl_super6          GE f6	U+2076 ⁶
    127 apl_super7          GE f7	U+2077 ⁷
    128 apl_super8          GE f8	U+2078 ⁸
    129 apl_super9          GE f9	U+2079 ⁹
    12a apl_Runderbar       GE 59
    
    3270 CG                 EBCDIC  Unicode
    
    137 apl_uptack          GE bc	U+22a4 ⊤
    138 apl_quad            GE 90	U+2395 ⎕
    139 apl_rho             GE b3	U+03c1 ρ
    13a apl_alpha           GE b0	U+03b1 α
    13b apl_degree          GE a1	U+00b0 ° degree
    13c apl_bracketright    GE bd	U+005d ] bracketright
    13e apl_notequal        GE be	U+2260 ≠
    13f apl_circle          GE 9d	U+25cb ○
    
    3270 CG                 EBCDIC  Unicode
    
    140 apl_Dunderbar       GE 44
    141 apl_Munderbar       GE 54
    142 apl_Qunderbar       GE 58
    143 apl_circlestile     GE cd	U+233d ⌽
    144 apl_deltastile      GE dd	U+234b ⍋
    145 apl_Funderbar       GE 46
    146 apl_circleslope     GE cf	U+2349 ⍉
    147 apl_upshoejot       GE df	U+235d ⍝
    148 apl_bracketleft     GE ad	U+005b [ bracketleft
    149 apl_upstile         GE 8d	U+2308 ⌈
    14a apl_Junderbar       GE 51
    14b apl_slope           GE b7	U+005c \ backslash
    14c apl_divide          GE b8	U+00f7 ÷ division
    14e apl_delstile        GE dc	U+2352 ⍒
    14f apl_Hunderbar       GE 48
    
    3270 CG                 EBCDIC  Unicode
    
    150 apl_Cunderbar       GE 43
    151 apl_Lunderbar       GE 53
    152 apl_Punderbar       GE 57
    153 apl_squad           GE cc	U+2337 ⌷
    154 apl_overbar         GE a0	U+203e ‾
    155 apl_Bunderbar       GE 42
    156 apl_Kunderbar       GE 52
    157 apl_Ounderbar       GE 56
    158 apl_downcarettilde  GE cb	U+2371 ⍱
    159 apl_quotedot        GE db	U+0021 ! exclam
    15a apl_Eunderbar       GE 45
    15b apl_stile           GE bf	U+2502 │
    15c apl_Nunderbar       GE 55
    15d apl_quadslope       GE ce	U+2342 ⍂
    15e apl_quadquote       GE de	U+235e ⍞
    15f apl_Iunderbar       GE 49
    
    3270 CG                 EBCDIC  Unicode
    
    160 apl_Uunderbar       GE 64
    161 apl_iotaunderbar    GE 74	U+2378 ⍸
    162 apl_downcaret       GE 78	U+2228 ∨
    163 apl_circlebar       GE ed	U+2296 ⊖
    164 apl_circlestar      GE fd	U+235f ⍟
    165 apl_Wunderbar       GE 66
    166 apl_uptackjot       GE ef	U+2355 ⍕
    167 apl_downtackup      GE da	U+2336 ⌶
    168 apl_slashbar        GE ea	U+233f ⌿
    16a apl_rightshoe       GE 9a	U+2283 ⊃
    16b apl_leftshoe        GE 9b	U+2282 ⊂
    16c apl_uparrow         GE 8a	U+2191 ↑
    16d apl_downarrow       GE 8b	U+2193 ↓
    16e apl_upshoe          GE aa	U+22c2 ⋂
    16f apl_downshoe        GE ab	U+22c3 ⋃
    
    3270 CG                 EBCDIC  Unicode
    
    170 apl_Tunderbar       GE 63
    171 apl_quadjot         GE 73	U+233b ⌻
    172 apl_righttack       GE 77	U+22a3 ⊣
    173 apl_diaeresisdot    GE ec	U+2235 ∵
    174 apl_deltaunderbar   GE fc	U+2359 ⍙
    175 apl_Sunderbar       GE 62
    176 apl_diaeresis       GE 72	U+00a8 ¨ diaeresis
    177 apl_lefttack        GE 76	U+22a2 ⊢
    178 apl_slopebar        GE eb	U+2340 ⍀
    179 apl_deltilde        GE fb	U+236b ⍫
    17a apl_Vunderbar       GE 65
    17b apl_upcaret         GE 71	U+22c0 ⋀
    17c apl_epsilonunderbar GE 75	U+2377 ⍷
    17d apl_quaddivide      GE ee	U+2339 ⌹
    17e apl_downtackjot     GE fe	U+234e ⍎
    17f apl_Zunderbar       GE 69
    
    3270 CG                 EBCDIC  Unicode
    
    180 apl_2vertical       GE 81	(none?)
    181 apl_2horizontal     GE 82	(none?)
    182 apl_leftvbar        GE 83	U+23b8 ⎸
    183 apl_rightvbar       GE 84	U+23b9 ⎹
    184 apl_midvbar         GE 85	U+23a5 ⎥
    189 apl_leftsolid       GE 91	U+258c ▌
    18a apl_rightsolid      GE 92	U+2590 ▐
    18b apl_topsolid        GE 93	U+2580 ▀
    18c apl_bottomsolid     GE 94	U+2584 ▄
    18d apl_solid           GE 95	U+25a0 ■
    
    3270 CG                 EBCDIC  Unicode
    
    192 apl_midhbar         GE a2	U+2500 ─
    193 apl_solidcircle     GE a3	U+2022 •
    194 apl_subn            GE a4	(none)
    19a apl_splat           GE 9c	U+00a4 ¤ currency
    19b apl_diamond         GE 70	U+25c6 ◆
    19c apl_Gunderbar       GE 47
    19d apl_sub1            GE e1	U+2081 ₁
    
    3270 CG                 EBCDIC  Unicode
    
    1a0 apl_superlparen     GE c1	U+207d ⁽
    1a1 apl_plus2           GE c2	U+002b + plus
    1a2 apl_solidbox        GE c3	U+220e ∎
    1a3 apl_lowerleft       GE c4	U+2514 └
    1a4 apl_upperleft       GE c5	U+250c ┌
    1a5 apl_leftjoin        GE c6	U+251c ├
    1a6 apl_bottomjoin      GE c7	U+2534 ┴
    1a7 apl_section         GE c8	U+00a7 § section
    1a9 apl_superrparen     GE d1	U+207e ⁾
    1aa apl_minus2          GE d2	U+002d - minus
    1ab apl_intersect       GE d3	U+253c ┼
    1ac apl_lowerright      GE d4	U+2518 ┘
    1ad apl_upperright      GE d5	U+2510 ┐
    1ae apl_rightjoin       GE d6	U+2524 ┤
    1af apl_topjoin         GE d7	U+252c ┬
    
    3270 CG                 EBCDIC  Unicode
    
    1b0 apl_paragraph       GE d8	U+00b6 ¶ paragraph
    1b2 apl_sub2            GE e2	U+2082 ₂
    1b3 apl_sub3            GE e3	U+2083 ₃
    1b4 apl_dieresisjot     GE e4	U+2364 ⍤                (Sharp) 
    1b5 apl_dieresiscircle  GE e5	U+2365 ⍥                (Sharp) 
    1b6 apl_commabar        GE e6	U+236a ⍪                (Sharp) 
    1b7 apl_euro            GE e7	U+20ac €                (Sharp) 
    1ba apl_plusminus       GE 9e	U+00b1 ± plusminus
    1bb apl_tilde           GE 80	U+007e ~ asciitilde
    1bc apl_Xunderbar       GE 67
    1bd apl_Yunderbar       GE 68
    
    3270 CG                 EBCDIC  Unicode
    
    1d0 apl_omega           GE b4	U+03c9 ω
    1d1 apl_jot             GE af	U+2218 ∘
    1d6 apl_rightarrow      GE 8f	U+2192 →
    1d7 apl_downtack        GE ac	U+22a5 ⊥
    1d9 apl_notless         GE ae	U+2265 ≥
    
    3270 CG                 EBCDIC  Unicode
    
    1f7 apl_notgreater      GE 8c	U+2264 ≤
    1f9 apl_downstile       GE 8e	U+230a ⌊
    
    suite3270-3.6/x3270/html/del.jpg0000664000076500007650000000120013221577164014163 0ustar pdmpdmÿØÿàJFIFÿþHCREATOR: XV Version 3.10a Rev: 12/29/94 Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÀ ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?õÿx†ó¾ºÖ¬ô¯í?²áæ€LcapÌFÎÞ ÎPÇ<`×°Ö|O©éÖ×öz6‡%­ÔI4/ý¯0ÜŒSƒk‘GZÐðέy­èâþòÊ ]òȰˆ.Lé,jÅV@Å*ø,¤ •9çRx!º·–Þâ(æ‚T)$r(eu#x Ž1^Oá ÝJÏF¾øm=ô­XÞ›猲ËžËæ Á›aòË*c!¬yõˆ †ÖÞ+{x£†$qÆ¡U à8ÅIXðøcKƒÅ·>'Ž ºÅ¢ÚHã€P6r@êÇ 9á sŠÿÙsuite3270-3.6/x3270/html/delta.jpg0000664000076500007650000000115713221577164014523 0ustar pdmpdmÿØÿàJFIFÿþHCREATOR: XV Version 3.10a Rev: 12/29/94 Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÀ ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?÷úãí|oöŸ‰SødÚì±û#5µó«qq~ú8ÎH“ha0U£{v—¯êSiº[5ŽMB᎔rU¦~°%—|rö®â€º„ô}L[¹ï<+p—@«7›u0F^2ã.îTç ‘†5è–Öúžmg'™kuM í#r0N# ޵¥¤éºÍºÛêš}¥ô áÖ;¨VU ‚23‚F}Íeÿ àÿú4?üCÿÄÖÅ…ž™g…¤–±çd0F#EÉ$áG$“ø×ÿÙsuite3270-3.6/x3270/html/documentation-faq-body.html0000664000076500007650000003037013221577163020165 0ustar pdmpdm

    x3270, c3270, wc3270, s3270, tcl3270 and pr3287 Frequently Asked Questions

    If you have a problem building, installing, or running one of the programs in the x3270 suite, please browse through this file first.

    General Questions

    wc3270 includes mkshort.exe. Isn't that some sort of keylogger?

    The program called mkshort.exe that is installed with wc3270 is not spyware -- it's a little utility program that is used to create the desktop shortcuts when wc3270 is installed. Unfortunately, it has the same name as a very bad program.

    You can safely remove mkshort.exe from the wc3270 installation directory; it is not needed once wc3270 is installed.

    mkshort.exe will be removed (or at least renamed) in a future release of wc3270.

    How do I change the keyboard mapping?

    Look at the x3270 Keymap document, the c3270 Keymap document or the wc3270 Keymap document.

    Why can't I map the Alt, Ctrl or Shift keys in c3270?

    That's because c3270 runs on dumb terminals, not on graphics displays.

    c3270 can only respond to keys that generate input on a TTY device, and it can only respond differently to combinations of keys that generate different input on a TTY device.

    Most dumb terminals -- and that includes the Linux console -- do not generate any TTY input at all when the Alt, Ctrl or Shift keys are pressed. They generate input only when another key is pressed in combination with one of those keys. In addition, there is nothing in the input that indicates that the Alt or Shift key was pressed in combination with a key. The presence of the Ctrl key can be inferred by the ASCII code that is generated (the Ctrl key subtracts 0x20 from the ASCII value of the key without Ctrl).

    Furthermore, most terminals generate exactly the same TTY input for a given function key (F1..F12), whether or not Shift, Ctrl or Alt are pressed. This is complicated by the fact that the curses library, which is what c3270 uses to do its I/O, does not even provide a way to convey such an event to c3270 -- there is a "Function Key 1" event, but no "Shifted Function Key 1" event and no "Alt Function Key 1" event.

    Is there a Windows version?

    Yes!

    First, there is wc3270, the native Windows console version of c3270.

    Second, x3270 and c3270 compile and run under Cygwin, the free Unix emulator for Windows. (In fact, they are standard packages with more recent versions of Cygwin). You can get Cygwin here.

    If disk space is a concern, you can run c3270 with a minimal set of Cygwin DLLs and one text file -- there is no need to install all of Cygwin.

    Note that there is not a native Win32 port of x3270, nor are there concrete plans for one.

    Why are the [ and ] characters displayed wrong?

    Look at the Brackets document.

    Fatal Errors From 'make'

    Make reports: Fatal error: Don't know how to make target `FontObj(3270)'.

    This generally means that you are running X11R4, rather than X11R5 or X11R6. x3270 does not run under X11R4.

    Other Problems

    x3270 Isn't Using the 3270 Font

    One of the trickier areas; x3270 uses its own fonts to replicate a life-like IBM 3270. This is not fatal, however; x3270 can use any fixed-width X font. If it can't find its own font, it defaults to "fixed".

    The simplest problem to fix is that you haven't told your X server that there are new fonts it can use. This is corrected with:

        xset fp rehash
    
    If this doesn't help, it is possible that your X server font path doesn't include the directory that the 3270 fonts were installed in. Run the command "xset q". The output will include an entry like:
        Font Path:
          /usr/lib/X11/fonts/misc/,/usr/lib/X11/fonts/Speedo/,/usr/lib/X11/fonts/75dpi/,/usr/lib/X11/fonts/100dpi/
    
    x3270's fonts are usually installed in /usr/local/fonts. If this (or some variation on it) does not appear in the "xset q" output, you can try:
        xset fp+ /usr/local/fonts/
        xset fp rehash
    

    x3270 isn't paying any attention to my keymap definition.

    There are two likely causes for this problem: either x3270 isn't seeing your keymap definition, or there is something wrong with the definition itself.

    You can tell exactly which keymap and keymap modifiers x3270 is using with the "About x3270" option on the "Options" menu. There is an entry labeled "Keyboard map:" which lists the keymap(s) in effect. If yours is missing, there are a number of possible causes:

    • There is a hierarchy of places that x3270 looks for the keymap list, and the one you are assuming may not be the one it finds. In the following list, earlier objects override those below:
      • The -keymap switch on the command line.
      • The definition of "x3270.keymap" in your .Xdefaults file.
      • The KEYMAP environment variable.
      • The KEYBD environment variable.
    • You may have modified your .Xdefaults file, but not yet re-read the database. You can either log off of X and start over, or you can run the command:
      	xrdb $HOME/.Xdefaults
      
    • Beware that there are some subtle interactions between .Xdefaults and cpp on your system. On a sun4 for example, cpp defines the symbol "sun" as "1", so a keymap definition for "sun-k4" becomes "1-k4".
    • A keymap definition is in two parts, the name of the keymap and the definition of the keymap. The "x3270.keymap" resource controls the name of the keymap; then for each keymap type "x" there must be an additional resourced named "x3270.keymap.x". If this definition is missing, x3270 will not recognize the keymap.
    • One other cause of missed keymaps is the symbol "sun" defined by the C preprocessor. If you have an entry in your .Xdefaults file that looks like:
      	x3270.keymap: sun-k5
      
      then use xrdb to read in the file, the symbol "sun" may be defined as "1" as the file is read. This turns the above into:
      	x3270.keymap: 1-k5
      
      causing much confusion.

      The fix is to add the following line to the top of your .Xdefaults:

      	#undef sun
      
    If your keymap appears in the list, but doesn't seem to have any effect, the causes are probably more subtle. Keymap definitions (X translation tables) are an object of study in themselves; the O'Reilly books (volume 4 in particular) are your best guide here, along with a thorough reading of the "Resources" document.

    The "Alt" key doesn't work.

    If the "A" appears on the status line when you press the Alt key, but none of the key mappings that use Alt seem to work (i.e., the APL keys), perhaps your X server isn't configured with Alt as a modifier. Try the following xmodmap command:
    	xmodmap -e 'add Mod2 = Alt_L'
    
    If this fixes the problem, you can add it to your .xinitrc file, so it takes effect every time your start X.

    x3270 is misbehaving on a certain application.

    If x3270 produces a different display or interaction than a real 3270 or some other emulator, it is entirely possible that x3270 is at fault. What you can do to help debug it is to capture a trace of the session. The easiest way to do this is:
        x3270 -trace
    
    x3270 will create a trace file in /tmp, which will contain a dump of all of the data that x3270 sent or received, along with its interpretation. x3270 will also pop up a window to view the file while it is being created; the title of that window is the full pathname of the trace file. If you are familiar with the 3270 Data Stream protocol, you may be able to figure out the problem yourself; otherwise, after suitable editing to remove passwords and proprietary information, you may send it in (see below).

    I can't get Num Lock to work on my Sun keyboard.

    If you are using an X server based directly on the MIT distribution (the NumLock light does not turn on when you press the NumLock key), then you are pretty much stuck; your server does not support NumLock. (However, you can get the keypad to produce numbers by holding down the Shift key.)

    There is no termcap entry for "IBM-3278-xxx"

    If you log into a non-IBM host with x3270 your TERM variable will be set to "IBM-327x", which is not especially useful for running programs like vi.

    One solution is to set your TERM variable to "xterm" after you log in, and to set the number of lines and columns to match the current x3270 model number (this is done through the "stty" command or with environment variables, depending on your system).

    A second solution is to create termcap entries for the 3270 terminal types. Here are some sample entries:

        I2|IBM-3278-2|x3270 Emulating 3278-2:li#24:tc=xterm:
        I3|IBM-3278-3|x3270 Emulating 3278-3:li#32:tc=xterm:
        I4|IBM-3278-4|x3270 Emulating 3278-4:li#43:tc=xterm:
        I5|IBM-3278-5|x3270 Emulating 3278-5:li#27:co#127:tc=xterm:
    

    My screen isn't being drawn properly

    There is a bug in certain versions of the Linux Mach32 X server, which causes the x3270 screen to be drawn incompletely. The screen image can be restored by iconifying and un-iconifying the window.

    x3270 can be modified to work around this problem. An unfortunate side-effect is that it will no longer be able to display APL characters, or line-drawing characters with any of the 3270 fonts.

    To rebuild x3270 to work around this bug, edit the Imakefile and add a line at the top:

        EXTRA_DEFINES = -DBROKEN_MACH32
    
    Then rebuild the makefile, the module "screen.o", and x3270:
        rm screen.o
        xmkmf
        make depend
        make
    

    The PF12 Key Doesn't Work on KDE

    KDE reserves the F12 key for "Mouse Emulation", so x3270 cannot use this key. To allow x3270 to use F12, pull up the KDE Control Center, look under "Look & Feel", and under that, "Key Bindings". Remove the binding for F12.

    Getting Help

    If you are still having a problem with x3270, feel free to send e-mail to Paul Mattes No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. You can also ask to be added to the x3270 mailing list, where you can find out about new releases and bug fixes.

    When you send a question about x3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of x3270 you are using, including all patches, e.g., "3.3.2". This is displayed at the top of the "About x3270" pop-up.
    2. What kind of machine you are running on, e.g., "Sun SPARC-10".
    3. What operating system you are running, and what version, e.g., "SunOS 4.1.3_U1" or "Irix 5.2". The "uname -a" command will usually provide this information.
    4. What version of X Windows you are running, and where it came from, e.g., "X11R6 built from the MIT distribution", or "Sun OpenWindows 3.0 as delivered with the machine".
    Complaints, suggestions, requests for enhancements, and porting experiences are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) in the public domain. suite3270-3.6/x3270/html/documentation-relnotes-body.html0000664000076500007650000032705413221577443021262 0ustar pdmpdm

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/x3270/html/FAQ.html0000664000076500007650000003066413221600611014212 0ustar pdmpdm x3270 Frequently Asked Questions

    x3270, c3270, wc3270, s3270, tcl3270 and pr3287 Frequently Asked Questions

    If you have a problem building, installing, or running one of the programs in the x3270 suite, please browse through this file first.

    General Questions

    wc3270 includes mkshort.exe. Isn't that some sort of keylogger?

    The program called mkshort.exe that is installed with wc3270 is not spyware -- it's a little utility program that is used to create the desktop shortcuts when wc3270 is installed. Unfortunately, it has the same name as a very bad program.

    You can safely remove mkshort.exe from the wc3270 installation directory; it is not needed once wc3270 is installed.

    mkshort.exe will be removed (or at least renamed) in a future release of wc3270.

    How do I change the keyboard mapping?

    Look at the x3270 Keymap document, the c3270 Keymap document or the wc3270 Keymap document.

    Why can't I map the Alt, Ctrl or Shift keys in c3270?

    That's because c3270 runs on dumb terminals, not on graphics displays.

    c3270 can only respond to keys that generate input on a TTY device, and it can only respond differently to combinations of keys that generate different input on a TTY device.

    Most dumb terminals -- and that includes the Linux console -- do not generate any TTY input at all when the Alt, Ctrl or Shift keys are pressed. They generate input only when another key is pressed in combination with one of those keys. In addition, there is nothing in the input that indicates that the Alt or Shift key was pressed in combination with a key. The presence of the Ctrl key can be inferred by the ASCII code that is generated (the Ctrl key subtracts 0x20 from the ASCII value of the key without Ctrl).

    Furthermore, most terminals generate exactly the same TTY input for a given function key (F1..F12), whether or not Shift, Ctrl or Alt are pressed. This is complicated by the fact that the curses library, which is what c3270 uses to do its I/O, does not even provide a way to convey such an event to c3270 -- there is a "Function Key 1" event, but no "Shifted Function Key 1" event and no "Alt Function Key 1" event.

    Is there a Windows version?

    Yes!

    First, there is wc3270, the native Windows console version of c3270.

    Second, x3270 and c3270 compile and run under Cygwin, the free Unix emulator for Windows. (In fact, they are standard packages with more recent versions of Cygwin). You can get Cygwin here.

    If disk space is a concern, you can run c3270 with a minimal set of Cygwin DLLs and one text file -- there is no need to install all of Cygwin.

    Note that there is not a native Win32 port of x3270, nor are there concrete plans for one.

    Why are the [ and ] characters displayed wrong?

    Look at the Brackets document.

    Fatal Errors From 'make'

    Make reports: Fatal error: Don't know how to make target `FontObj(3270)'.

    This generally means that you are running X11R4, rather than X11R5 or X11R6. x3270 does not run under X11R4.

    Other Problems

    x3270 Isn't Using the 3270 Font

    One of the trickier areas; x3270 uses its own fonts to replicate a life-like IBM 3270. This is not fatal, however; x3270 can use any fixed-width X font. If it can't find its own font, it defaults to "fixed".

    The simplest problem to fix is that you haven't told your X server that there are new fonts it can use. This is corrected with:

        xset fp rehash
    
    If this doesn't help, it is possible that your X server font path doesn't include the directory that the 3270 fonts were installed in. Run the command "xset q". The output will include an entry like:
        Font Path:
          /usr/lib/X11/fonts/misc/,/usr/lib/X11/fonts/Speedo/,/usr/lib/X11/fonts/75dpi/,/usr/lib/X11/fonts/100dpi/
    
    x3270's fonts are usually installed in /usr/local/fonts. If this (or some variation on it) does not appear in the "xset q" output, you can try:
        xset fp+ /usr/local/fonts/
        xset fp rehash
    

    x3270 isn't paying any attention to my keymap definition.

    There are two likely causes for this problem: either x3270 isn't seeing your keymap definition, or there is something wrong with the definition itself.

    You can tell exactly which keymap and keymap modifiers x3270 is using with the "About x3270" option on the "Options" menu. There is an entry labeled "Keyboard map:" which lists the keymap(s) in effect. If yours is missing, there are a number of possible causes:

    • There is a hierarchy of places that x3270 looks for the keymap list, and the one you are assuming may not be the one it finds. In the following list, earlier objects override those below:
      • The -keymap switch on the command line.
      • The definition of "x3270.keymap" in your .Xdefaults file.
      • The KEYMAP environment variable.
      • The KEYBD environment variable.
    • You may have modified your .Xdefaults file, but not yet re-read the database. You can either log off of X and start over, or you can run the command:
      	xrdb $HOME/.Xdefaults
      
    • Beware that there are some subtle interactions between .Xdefaults and cpp on your system. On a sun4 for example, cpp defines the symbol "sun" as "1", so a keymap definition for "sun-k4" becomes "1-k4".
    • A keymap definition is in two parts, the name of the keymap and the definition of the keymap. The "x3270.keymap" resource controls the name of the keymap; then for each keymap type "x" there must be an additional resourced named "x3270.keymap.x". If this definition is missing, x3270 will not recognize the keymap.
    • One other cause of missed keymaps is the symbol "sun" defined by the C preprocessor. If you have an entry in your .Xdefaults file that looks like:
      	x3270.keymap: sun-k5
      
      then use xrdb to read in the file, the symbol "sun" may be defined as "1" as the file is read. This turns the above into:
      	x3270.keymap: 1-k5
      
      causing much confusion.

      The fix is to add the following line to the top of your .Xdefaults:

      	#undef sun
      
    If your keymap appears in the list, but doesn't seem to have any effect, the causes are probably more subtle. Keymap definitions (X translation tables) are an object of study in themselves; the O'Reilly books (volume 4 in particular) are your best guide here, along with a thorough reading of the "Resources" document.

    The "Alt" key doesn't work.

    If the "A" appears on the status line when you press the Alt key, but none of the key mappings that use Alt seem to work (i.e., the APL keys), perhaps your X server isn't configured with Alt as a modifier. Try the following xmodmap command:
    	xmodmap -e 'add Mod2 = Alt_L'
    
    If this fixes the problem, you can add it to your .xinitrc file, so it takes effect every time your start X.

    x3270 is misbehaving on a certain application.

    If x3270 produces a different display or interaction than a real 3270 or some other emulator, it is entirely possible that x3270 is at fault. What you can do to help debug it is to capture a trace of the session. The easiest way to do this is:
        x3270 -trace
    
    x3270 will create a trace file in /tmp, which will contain a dump of all of the data that x3270 sent or received, along with its interpretation. x3270 will also pop up a window to view the file while it is being created; the title of that window is the full pathname of the trace file. If you are familiar with the 3270 Data Stream protocol, you may be able to figure out the problem yourself; otherwise, after suitable editing to remove passwords and proprietary information, you may send it in (see below).

    I can't get Num Lock to work on my Sun keyboard.

    If you are using an X server based directly on the MIT distribution (the NumLock light does not turn on when you press the NumLock key), then you are pretty much stuck; your server does not support NumLock. (However, you can get the keypad to produce numbers by holding down the Shift key.)

    There is no termcap entry for "IBM-3278-xxx"

    If you log into a non-IBM host with x3270 your TERM variable will be set to "IBM-327x", which is not especially useful for running programs like vi.

    One solution is to set your TERM variable to "xterm" after you log in, and to set the number of lines and columns to match the current x3270 model number (this is done through the "stty" command or with environment variables, depending on your system).

    A second solution is to create termcap entries for the 3270 terminal types. Here are some sample entries:

        I2|IBM-3278-2|x3270 Emulating 3278-2:li#24:tc=xterm:
        I3|IBM-3278-3|x3270 Emulating 3278-3:li#32:tc=xterm:
        I4|IBM-3278-4|x3270 Emulating 3278-4:li#43:tc=xterm:
        I5|IBM-3278-5|x3270 Emulating 3278-5:li#27:co#127:tc=xterm:
    

    My screen isn't being drawn properly

    There is a bug in certain versions of the Linux Mach32 X server, which causes the x3270 screen to be drawn incompletely. The screen image can be restored by iconifying and un-iconifying the window.

    x3270 can be modified to work around this problem. An unfortunate side-effect is that it will no longer be able to display APL characters, or line-drawing characters with any of the 3270 fonts.

    To rebuild x3270 to work around this bug, edit the Imakefile and add a line at the top:

        EXTRA_DEFINES = -DBROKEN_MACH32
    
    Then rebuild the makefile, the module "screen.o", and x3270:
        rm screen.o
        xmkmf
        make depend
        make
    

    The PF12 Key Doesn't Work on KDE

    KDE reserves the F12 key for "Mouse Emulation", so x3270 cannot use this key. To allow x3270 to use F12, pull up the KDE Control Center, look under "Look & Feel", and under that, "Key Bindings". Remove the binding for F12.

    Getting Help

    If you are still having a problem with x3270, feel free to send e-mail to Paul Mattes No guarantees are made about responses to particular problems, but a patches are usually forthcoming in a few days. You can also ask to be added to the x3270 mailing list, where you can find out about new releases and bug fixes.

    When you send a question about x3270, please include the following information. It makes it much easier to narrow down the problem.

    1. The version of x3270 you are using, including all patches, e.g., "3.3.2". This is displayed at the top of the "About x3270" pop-up.
    2. What kind of machine you are running on, e.g., "Sun SPARC-10".
    3. What operating system you are running, and what version, e.g., "SunOS 4.1.3_U1" or "Irix 5.2". The "uname -a" command will usually provide this information.
    4. What version of X Windows you are running, and where it came from, e.g., "X11R6 built from the MIT distribution", or "Sun OpenWindows 3.0 as delivered with the machine".
    Complaints, suggestions, requests for enhancements, and porting experiences are also welcome. Code changes for bug fixes and enhancements are also welcome, provided that you don't mind your code being placed (often anonymously) in the public domain. suite3270-3.6/x3270/html/ibm_hosts.html0000664000076500007650000000761013221600611015565 0ustar pdmpdm ibm_hosts Manual Page

    ibm_hosts Manual Page

    Contents

    Name
    Synopsis
    Description
    Example
    Files
    See Also

    Name

    ibm_hosts - host database for x3270 and c3270

    Synopsis

    /usr/lib/X11/x3270/ibm_hosts

    Description

    The ibm_hosts file contains information regarding IBM hosts on the network. An IBM host is a host which can communicate with a 3270 terminal emulator such as x3270 or c3270. Each line defines a name in the following format (optional fields are shown in brackets):

    name type [opt:]...[luname@]hostname[:port] [actions]

    Items are separated by any number of blanks and/or TAB characters. A line beginning with # is taken as a comment (note that # anywhere else on a line does not indicate a comment).

    The name field is a mnemonic used to identify the host.

    The type field is a keyword that indicates the type of entry. The value primary means that the name will be included in host-selection menus that may be displayed by a 3270 emulator. The value alias means that the name will not be included in menus, but will still be accepted as valid input when a host name is required.

    The hostname field is the Internet hostname or dot-notation Internet address of the host.

    The hostname can include `s:' or `p:' prefixes, e.g., s:finicky (see the x3270(1) or c3270(1) man page sfor details). It can also include an LU name, separated by an `@' character, e.g., oddlu@bluehost. Finally, it can include a non-default port number, appended to the hostname with a colon `:' character, e.g., bluehost:97. (For compatability with earlier versions of x3270, the port can also be separated by a slash `/' character.)

    The optional actions field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., PF(1), it is unmodified; otherwise it is taken as the parameter to the String() action. The actions are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option.

    Example

    Given the following ibm_hosts file:

    mvs primary mvs-host
    tso alias mvs-host
    mvs2 primary mvs-host:4012
    vm primary vtam Tab() String(3) Enter()
    A 3270 emulator will display four names (mvs, mvs2, afhost and vm) on its hosts menu. The names mvs and tso will cause connections to the host mvs-host. The name mvs2 will also cause a connection to mvs-host, but to port 4012 rather than the emulator's default port (usually 23). The name vm will cause the 3270 emulator to connect to the host vtam (presumably some sort of host-selection front-end), enter the string `3' on the second data-entry field on the screen, and send the Enter AID sequence.

    Files

    /usr/lib/X11/x3270/ibm_hosts

    See Also

    x3270(1), c3270(1)
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/x3270/html/Intro.html0000664000076500007650000000344013221577164014706 0ustar pdmpdm x3270 Introduction

    x3270 Introduction

    x3270 is an IBM 3270 terminal emulator for X windows. It can be used to communicate with any IBM host that supports 3270-style connections over TELNET. It can also communicate with hosts that use line-by-line ASCII mode to do initial login negotiation before switching to full-screen 3270 mode.

    It can use its own special fonts to fully emulate the special symbols displayed on a 3278 or 3279, or any constant-width X font.

    x3270 is a full-featured X client. It participates in common X protocols, such as cut-and-paste and the WM_DELETE_WINDOW and WM_SAVE_YOURSELF messages. It is highly configurable and supports a wide range of keyboards. A pop-up keypad is available for selecting common 3270 function keys.

    x3270 emulates one of four models of an IBM 3278 or 3279 terminal. The difference between the various models is the screen size. The emulation is not quite complete; x3270 understands extended field orders but does not implement some of the extended attributes (outlining, extended validation, etc.). x3270 supports color displays in one of two ways: in 3278 mode by displaying text with different attributes in different colors, or in 3279 mode by implementing the full color 3270 protocols. It does not support 3179G bit-mapped graphics (GDDM).

    x3270 supports the APL character set and several international character sets. Many APL and international symbols are entered from the keyboard using the "Compose" key and combinations of other keys. suite3270-3.6/x3270/html/Keymap.html0000775000076500007650000001606113221577164015047 0ustar pdmpdm Creating a Custom x3270 Keymap

    How to Create a Custom x3270 Keymap

    It Might Already be Defined

    First, you might want to make sure that the action you want isn't already defined in the default keymap. The default keymap, documented on the x3270 manual page, defines common actions using the Meta key. For example, the Reset action, which unlocks the keyboard, is defined as Meta-R.

    You Might Just Need the Alt Keymap

    If your keyboard does not have a Meta key, it probably has an Alt key. For such keyboards, there is an alternate version of the default keymap, called alt; it defines the same actions using the Alt key instead.  You can also specify the alt keymap at start-up with the command:
    x3270 -keymap alt
    You can also select the alt keymap at runtime with the Options->Change Keymap... menu option; type alt in the pop-up window.

    Defining a Simple Keymap in .x3270pro

    If the action you want isn't defined in the default keymap or the alt keymap, then you need to create a custom keymap.  The easiest way to do this is as follows. Using your favorite editor, create a file called .x3270pro in your home directory.  In that file, put the following:
    ! Use the 'mine' keymap, defined below
    x3270.keymap: mine
    ! Definition of the 'mine' keymap
    x3270.keymap.mine: #override \
        <Key>Prior: PF(7)\n\
        <Key>Next: PF(8)
    The first entry (x3270.keymap) tells x3270 to use the keymap named mine.  The second entry (x3270.keymap.mine) is the definition of the mine keymap itself.

    Now, run x3270, and do not specify a -keymap option.  The Page Up key will now emulate the 3270 PF7 key, and the Page Down key will emulate the 3270 PF8 key.  (If you do not have a Page Up or Page Down key, or if these keys do not generate the X11 Prior and Next keysyms, this will not work, but for most PC-based systems, it will.)

    Rules for Keymap Definitions

    You may now edit the keymap to create your own custom definition. The full set of rules for keymaps (which are actually X11 Translation Tables) takes a couple of chapters in a book -- I would suggest two O'Reilly's books (Volume 4M: X Toolkit Intrinsics Programming Manual, and Volume 5: X Toolkit Intrinsics Reference Manual) -- but here are the basics:
    • The first line is always:
      • x3270.keymap.name: #override \
      where name is replaced by the name of the keymap you want to define. (Note the backslash, which must be the last character on the line).
    • The body (middle) lines always have the format:
      • modifier <Key> keysym : Action(args)\n\
      where:
        modifier is an optional keyboard modifier such as Shift or Ctrl
        keysym is an X11 keysym: a symbolic name for a key, such as semicolon (the ';' key) or BackSpace (the Backspace key)
        Action is an x3270 action such as Enter or PF
        args are the optional action arguments, such as a number to specify which PF key to transmit.
      Note that each body line must end with the three characters '\n\'.
    • The last line is the same as the body lines, but must not have the '\n\' at the end:
      • modifier <Key> keysym : Action(args)
    • More-specific definitions must come before less-specific definitions.  For example, the definition for Shift<Key>Backspace must come before the definition for <Key>BackSpace (which also 'matches' the BackSpace key with the Shift key pressed).

    How to Find the Keysyms

    To find out which keysym is being generated for any given key on your keyboard, start x3270, but do not connect to a host.  Then select the File->Trace Keyboard and Mouse Events menu option, and press the No File button on the pop-up.

    An xterm window will appear.  In that window, several lines of text will appear for each key you press.  Each entry will begin with the text for the left-hand side of a keymap entry that will match the key you pressed.  You can cut and paste the text into your keymap definition.

    How to Find the Actions

    These are documented on the x3270 manual page.

    How to Debug Your Keymap

    There are two x3270 options to aid with keymap debugging.  The File->Trace Keyboard and Mouse Events menu option pops up an xterm window which traces each keyboard and mouse event that x3270 processes.  The information traced includes the keymap (and line within the keymap) that matched the event, the x3270 action that was run in response, and if for some reason the action did not work, why it did not work.

    The Options->Display Current Keymap menu option pops up a window which displays the current keymap. This pop-up tells you exactly which keymap entries are active, and can be sorted by keymap name, event, or action name.  Often times it will point out that x3270 isn't using the keymap you thought it was, or that some of your keymap entries are interfering with one another (such as the more-specific rule described above).

    Note that one of the commonest problems in configuring x3270 is figuring out where resources are being defined. Keymaps are defined using resources, so this problem can complicate keymap definitions.  X11 resources can be defined in a number of different places:

    • In your X server, by reading them in with the xrdb command
    • In the file .Xdefaults in your home directory
    • In the file .Xdefaults-hostname in your home directory
    • In the file /usr/X11R6/lib/X11/app-defaults/X3270 (this is disabled by default, but x3270 can be built to consult this file)
    • In the definitions compiled into x3270 from the file X3270.xad
    • In the file .x3270pro in your home directory
    Note that of the above list, .x3270pro is guaranteed to be consulted last, and its definitions override anything that appears in any of the other places.  This is why the example in this document uses .x3270pro. suite3270-3.6/x3270/html/license-body.html0000664000076500007650000001130113221577163016162 0ustar pdmpdm

    Licensing Information

    Here is the official copyright notice for x3270, c3270, wc3270, s3270, tcl3270 and pr3287. It is a standard 3-element BSD license.

    Copyright © 1993-CYEAR, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    The 3270-20 font is derived from an NCD font, so it carries an additional notice (an MIT license):

    Copyright © 1989-1991 Network Computing Devices, Inc.
    NCD is a registered trademark of Network Computing Devices, Inc.

    Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of NCD may not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. NCD makes no representations about the suitability of this software for any purpose. It is provided ``as is'' without express or implied warranty.

    NCD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NCD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

    The ComplexMenu sources are derived from the MIT X11R5 Athena SimpleMenu widget, and carry an additional notice (another MIT license):

    Copyright © 1989 Massachusetts Institute of Technology

    Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of M.I.T. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. M.I.T. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

    M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

    suite3270-3.6/x3270/html/Lineage.html0000664000076500007650000001155313221600611015143 0ustar pdmpdm x3270 Licensing

    Licensing Information

    Here is the official copyright notice for x3270, c3270, wc3270, s3270, tcl3270 and pr3287. It is a standard 3-element BSD license.

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    The 3270-20 font is derived from an NCD font, so it carries an additional notice (an MIT license):

    Copyright © 1989-1991 Network Computing Devices, Inc.
    NCD is a registered trademark of Network Computing Devices, Inc.

    Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of NCD may not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. NCD makes no representations about the suitability of this software for any purpose. It is provided ``as is'' without express or implied warranty.

    NCD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NCD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

    The ComplexMenu sources are derived from the MIT X11R5 Athena SimpleMenu widget, and carry an additional notice (another MIT license):

    Copyright © 1989 Massachusetts Institute of Technology

    Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of M.I.T. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. M.I.T. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

    M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

    suite3270-3.6/x3270/html.m40000664000076500007650000000642213221577163013171 0ustar pdmpdmdnl Copyright (c) 2000-2013, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces html output changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl changecom()dnl define(XX_TH)dnl define(XX_XL,`translit($1,` ()/',-)')dnl define(XX_XR,`$1
    ')dnl define(XX_SH,`dnl divert(1)dnl XX_XR($1) divert(2)dnl

    $1

    ')dnl define(XX_SM,$1)dnl define(XX_LP,

    )dnl define(XX_IP,

    )dnl define(XX_BR,
    )dnl define(XX_RS,

    $1
    )dnl define(XX_TS,)dnl define(XX_TR,$1)dnl define(XX_TD,)dnl define(XX_TDH,)dnl define(XX_T_)dnl define(XX_TC,
    $1
    )dnl define(XX_TE,
    $1$1
    )dnl define(XX_TPS,
    )dnl define(XX_TPE,
    )dnl define(XX_TP,
    $1
    )dnl define(XX_PP,

    )dnl define(XX_DASH,`-')dnl define(XX_DASHED,`-'$1)dnl define(XX_FI,$1)dnl define(XX_FB,$1)dnl define(XX_NBSP, )dnl define(XX_LT,<)dnl define(XX_BS,\)dnl define(XX_TARGET,)dnl define(XX_LINK,$2)dnl define(XX_COPY,` © ')dnl define(XX_BACKSLASH,``\''$1)dnl define(XX_NOT,¬)dnl define(XX_HO,$1)dnl define(XX_HY,$1$2)dnl dnl Stream 1 has the table of contents, stream 2 the body, stream 3 the tail divert(1)dnl XX_PAGENAME Manual Page

    XX_PAGENAME Manual Page

    Contents

    divert(3)dnl
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified XX_DATE.
    divert(2)dnl
    dnl suite3270-3.6/x3270/html/README.html0000664000076500007650000000506113221577164014551 0ustar pdmpdm x3270 3.5 General Release

    x3270 3.5 General Release

    x3270 is an IBM 3278/3279 terminal emulator for X11.

    Documentation is in the html directory. The files are:

    Intro
    What x3270 is
    Lineage
    Where x3270 came from (copyright stuff)
    Build
    How to build and install x3270
    FAQ
    Frequently Asked Questions (what to do when something goes wrong)
    Attributes
    A translation table for 3270 field attributes
    Resources
    A complete list of x3270 resources (configuration items)
    Charset
    An explanation of x3270's use of fonts and character sets
    Keymap
    How to create a custom x3270 keymap
    Brackets
    How to get [ and ] to display correctly
    ReleaseNotes
    What's new in this release
    SSL
    How to use x3270 with the Secure Sockets Layer (SSL)
    Bugs
    What's broken in this release
    Wishlist
    What isn't in this release

    There is also a hypertext version of the x3270 man page, and of the man pages for x3270if, x3270-script and ibm_hosts.

    Please read Build before going ahead and building the program. Also, if you have a problem, scan through FAQ; there are lots of interesting answers there.

    Updates to x3270, as well as the current status of development and bugs, are available from the x3270 webpage.

    Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit.

    There is also an x3270 mailing list, which receives news about new releases. You can subscribe to this list here. suite3270-3.6/x3270/html/ReleaseNotes.html0000664000076500007650000032733313221600611016176 0ustar pdmpdm x3270 Release Notes

    Caveats and Known Issues for x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    Linux

    • Unity's Terminal app will intercept a number of keys (such as F1) that c3270 needs for 3270 operations. The easiest way to prevent this is to create a profile for c3270, with Shortcuts disabled (from the taskbar, select Preferences from the Terminal menu, then go to the Shortcuts tab and un-check Enable shortcuts). You can also disable or remap individual shortcuts if you find the others useful.

    Windows

    • Under Windows 10, the console windows that wc3270 runs in will intercept mouse clicks and certain control keys needed by wc3270 for correct operation. To prevent this, you must explicitly disable several console window options for each wc3270 window. Click on the terminal icon in the upper left of the wc3270 window and select Properties. Select the Options tab, and look for the Edit section. Uncheck Quick Edit Mode and Enable Ctrl key Shortcuts.

    MacOS

    • When running c3270 in a Terminal window, the Backspace key performs the Delete() action (deleting the character under the cursor) instead of the BackSpace() action (deleting the character to the left of the cursor). This is corrected through Terminal's Preferences dialog. Under the Advanced tab, select Delete sends Control-H.

    Changes in x3270, c3270, wc3270, s3270, ws3270, tcl3270, pr3287 and wpr3287 3.6

    3.6 is the current development line for the x3270 suite.

    Changes in version 3.6ga3, 29. December 2017

    • [all] Rename the tls resource to startTls, which makes its meaning much clearer.
    • [wc3270, ws3270] The x3270if command was not flushing its output correctly. (Thanks to Kalman Reti for the fix.)
    • [wc3270, ws3270] PrintText() would sometimes include junk in the output, if called more than once. This is now fixed.

    Changes in version 3.6beta2, 3. December 2017

    • [wc3270] Added a (hackish) fix for the Windows 10 "Ctrl key shortcuts" feature that interferes with Ctrl-C, Ctrl-V and F11.
    • [all] Added support for periodically sending a TELNET NOP to the host, controlled by a new nopSeconds resource.
    • [all] Added support for some missing xterm escape sequences.
    • [all] Made the NVT-mode F1 through F4 keys compatible with xterm, rather than VT100.
    • [c3270, wc3270] Turn off the cursor when scrolled back.
    • [all] Fixed TELNET NEW-ENVIRONMENT behavior to be more compatible with IBM iSeries hosts.

    Changes in version 3.6alpha1, 8. March 2017

    • [all] Fixed the unlockDelay resource, which was inadvertently ignored (effectively aways on) for several releases. The value is now false for s3270, ws3270 and tcl3270, and true elsewhere.
    • [x3270, c3270, wc3270] Display the host certificate when the lock icon (x3270) or lock field in the OIA (c3270/wc3270) is clicked.
    • [all] An accept name can now be appended to the hostname using =, e.g., L:myhost.com=myparticularhost.com.
    • The -disable-ssl configure option now applies to Windows.
    • [all Windows] Windows cross-compilers are now tested by the configure script. If they are not found, they will be excluded from the build.
    • [x3270] Fixed pop-up window and keypad placement issues on the Unity desktop, and some crashes related to window movement.
    • [all] Re-enabled the A: host modifier to indicate an NVT-mode host (equivalent to the -nvt command-line option or nvtMode resource).
    • [x3270, c3270, wc3270] Added host certificate display to the x3270 Connection Status dialog and the c3270/wc3270 Show(Status) action.
    • [all Unix] Removed explicit support for self-signed host certificates (the -selfsignedok option and selfSignedOk resource). This is because the implementation assumed that being self-signed was the only verification error, while there could be many. To allow self-signed certificates, disable verification.
    • [all] Added support for the Y: host modifier to disable host certificate checking.
    • [all Unix] Removed support for the IP: form of accepting a name in a host certificate.
    • [all Unix] Changed the configure script option to specify the location of the OpenSSL installation from --with-ssl= to with-openssl=.
    • [all Unix] Switched MacOS to use Secure Transport instead of OpenSSL. OpenSSL can still be selected during build with the --disable-stransport option to the configure script.
    • [all] Switched to verifying host certficates by default. This can be disabled by using the -noverifycert opton or by setting the verifyHostCert resource to false.
    • [all Windows] Removed SSL configurations from the Visual Studio project.
    • [all Windows] Switched Windows SSL/TLS from OpenSSL to the native Windows Schannel APIs. This allows secure connections without the need to install a separate set of DLLs.

    Changes in version 3.5ga12, 10. September 2017

    • [all Windows] Removed some items from the Windows installer that interfered with installing as SYSTEM.

    Changes in version 3.5ga11, 26. June 2017

    • [all] Fixed an issue where the web server would reject requests containing fields with 1-character-long values.
    • [all] Improved error reporting for certain cases of SSL/TLS tunnel set-up failure.

    Changes in version 3.5ga10, 16. January 2017

    • [all] Upgraded Windows to OpenSSL 1.1 and added OpenSSL 1.1 support for other platforms where available.
    • [s3270, ws3270] Restored oerrLock as the default.
    • [all] Fixed the CloseScript action.

    Changes in version 3.5ga9, 26. December 2016

    • [c3270, wc3270] Fixed display of default attributes in NVT mode.
    • [all] Corrected Hebrew and Greek character set defintions.
    • [all] Corrected echoing of multi-byte characters in NVT line mode.
    • [wc3270] Allow the -utf8 option to force the Windows code page to UTF-8.
    • [wc3270] Use the built-in UTF-8 encoder/decoder when in UTF-8 mode to allow NVT-mode UTF-8 output to be displayed correctly.
    • [all] Fixed the missing letter 'Z' in the simplified-chinese (cp935) host code page.
    • [x3270>] Fixed the configure script to find X11 headers and libraries correctly.
    • [all] Allow Wait(n,Second) to work when disconnected.
    • [x3270>] Fixed an issue with missed timeouts.

    Changes in version 3.5ga8, 9. May 2016

    • [x3270] Fixed the toggle names saved with the File->Save Changed Options menu option and when processing the WM_SAVE_YOURSELF message.
    • [x3270] Explicitly test for X11, Xt, Xmu and Xaw header files and libraries in the configure script.
    • [x3270] Put the dryrun script in the object directory.
    • [wc3270] Allow Windows VKey codes to be specified in wc3270 keymaps in hexadecimal with the syntax VKEY-0xnn. This allows unknown VKeys to be specified. The same syntax is used in traces.
    • [x3270] Fixed an issue where parameters beyond the second were ignored in many keymap actions.
    • [all] Fixed an issue with the Abort action called from scripts.
    • [all Windows] Always find root_certs.txt in the same directory as the executable, if not installed.
    • [all] Validate the parameters to the Transfer() action better.
    • [pr3287] Fix the configure script so it properly detects missing OpenSSL header files, even if the OpenSSL library is present.
    • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.

    Changes in version 3.5beta7, 8. March 2016

    • [wc3270] Fixed a crash in the Session Wizard.

    Changes in version 3.5beta6, 25. February 2016

    • [wc3270, ws3270] Fixed a problem that broke SSL.
    • [all] Added swedish and swedish-euro as aliases for host code pages 278 and 1143 respectively.
    • [all] Changed the keyboard unlock behavior when a BIND-IMAGE is received from the host. Prior to release 3.3.14, the keyboard would not be unlocked on a new host connection until a Write was received. In 3.3.14, this was changed so that the keyboard would be unlocked as soon as a BIND-IMAGE was received, and in release 3.4, a new host option (B:) was added to revert to the old behavior. In this release, the old behavior (waiting for a Write) is the default again. A new resource, bindUnock is added to enable the new behavior (unlocking as soon as the BIND-IMAGE is received) when set to true. The B: host option is still supported, as a no-op.

    Changes in version 3.5beta5, 15. February 2016

    • [wc3270] Added crosshair cursor and cursor type to the Session Wizard.
    • [all] Added a -connectimeout option and a connectTimeout resource to specify a shorter timeout for the host connection to complete.
    • [all Windows] Simplified the installer, removing the option of doing a per-user install.
    • [all Windows] Got rid of the wc3270 Application Data directory. The root certificates file is now in the installation directory. ws3270 and wpr3287 trace files now go into the current directory by default. Session files and keymaps are now stored in the My Documents\wc3270 folder. When wc3270 is installed, an Upgrade Wizard will automatically copy existing session files and keymaps to the new location. (The old files will be preserved, but ignored.)
    • [all] Made the EraseEOF, Insert, ToggleInsert, Home, FieldEnd and EraseInput actions clear the insert overflow condition.

    Changes in version 3.5alpha4, 15. January 2016

    • [s3270, ws3270] Added a -minversion option and minVersion resource to specify a minimum required version. If the emulator is running an earlier version, it will abort.
    • [all] Object files (but not yet documentation) are now built in a separate obj directory with machine-specific subdirectories. Both 32- and 64-bit Windows binaries are always built.
    • [all Windows] 64-bit executables are now installed on 64-bit Windows systems. Note that upgrades from 32-bit to 64-bit wc3270 require uninstalling the 32-bit version first. The installer offers to do this automatically. Note also that downgrading from a 64-bit version to an older 32-bit version, without first manually uninstalling the 64-bit version, will cause a mess: duplicate versions of wc3270 will be listed in Add or Remove Programs, and uninstalling one of them will half uninstall the other.
      There are also now 32-bit and 64-bit versions of the no-install ZIP file.
    • [all Windows] OpenSSL 64-bit now builds cleanly on Visual Studio.
    • [all Windows] Fixed a heap corruption crash when the OpenSSL libraries are found (even if a secure connections is not in use).
    • [x3270] Dropped support for xmkmf and imake. x3270 builds and installs only using autoconf paths now.

    Changes in version 3.5alpha3, 11. January 2016

    • [wc3270] Added SelectLeft, SelectRight, SelectUp and SelectDown actions to extend the selection area with shifted cursor keys. Remapped NextWord and PreviousWord to Ctrl<Key>RIGHT and Ctrl<Key>LEFT respectively.
    • [wc3270] Added a selection indicator to the window title.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] Fixed Visual Studio 2013 build issues.

    Changes in version 3.5alpha2, 1. January 2016

    • [all] The timeout for Wait can now be specified as a floating-point number to wait for fractions of a second.
    • [x3270] Improved resize logic. Window maximize now does something sensible. Added a Snap Window Size menu option.
    • [wc3270] Added support for the altCursor toggle, which if set, changes wc3270 to use an underscore cursor instead of a block cursor.
    • [s3270] Fixed an x3270if build problem when libiconv is needed, plus a build issue that crept in with Makefile.in rationalization.
    • [all] Added the scriptPortOnce resource and the -scriptportoncde command-line option to allow only one scripting connection, after which the emulator will exit.
    • [all] Removed arbitrary restrictions on the length of script command lines and on the number of arguments per command.
    • [all] Allow scripts to issue multiple commands per line.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.
    • [x3270, c3270, wc3270] Added support for a crosshairColor resource to allow the color of the crosshair cursor to be changed. The value is a host color name or index.

    Changes in version 3.5alpha1, 10. July 2015

    • [x3270] Changed the crosshair cursor to a thin purple line, instead of a reverse-video bar. Extended it into the alternate screen area (if in primary mode) and into the OIA.
    • [c3270, wc3270] Added support for a crosshair cursor, using the crosshair toggle.
    • [all] Added missing attributes to the ReadBuffer action's output (background color and input ocntrol) and combined multiple SA orders in the same buffer location into a single SA order.
    • [all Windows] Added support for compiling 64-bit Windows executables in Visual Studio. Switched from VS 2010 to VS 2013. Removed the old nmake makefiles (use msbuild now for command-line builds).
    • [all Windows] Switched to the mingw-w64 compiler on Linux and Cygwin. Made the necessary changes to allow compiling 64-bit Windows executables on Linux. To build for 64-bit, set the variable WIN64. 32-bit is still the default.

    Changes in version 3.4ga11, Nn. Month 2016

  • [all] Limit DFT buffer size to 32767. 32768 causes the host to send 0-byte buffers.
  • [all] Allow VS2010 builds with spaces in pathnames.
  • Changes in version 3.4ga10, 1. January 2016

    • [all] Changed scripts to use /usr/bin/env.
    • [all] Suspend the idle command while a file transfer is in progress.

    Changes in version 3.4ga9, 23. October 2015

    • [c3270, wc3270] Fixed binary file transfer bug.
    • [x3270] Fixed missing 'Not Connected' message when disconnecting from a host.
    • [all] Fixed trace display of incoming IPv6 connections and the parsing of the x3270 -scriptport option.
    • [tcl3270] Added tcl3270 support for Tcl 8.6.
    • [all] Renamed $INSTALL variable in the top-level configure script (bugs:15).

    Changes in version 3.4ga8, 18. September 2015

    • [x3270] Fixed a crash in the Configure Idle Command pop-up.
    • [x3270] Fixed an issue with overwriting local files in file transfers.
    • [s3270] Fixed an x3270if build problem when libiconv is needed.
    • [all] Fixed a problem with truncating the list of LUs when connecting to a host.
    • [all] Fixed a crash when too many parameters are passed to an action in a macro or script.

    Changes in version 3.4ga7, 28. August 2015

    • Fixed a number of warnings found by the MacOS C compiler, which turned out to be real issues.
    • [all] Synchronize the ReadBuffer action with the Wait(Output) action, just like Ascii and Ebcdic.

    Changes in version 3.4ga6, 10. August 2015

    • [all] Fixed an NVT-mode emulation problem.

    Changes in version 3.4ga5, 10. July 2015

    • [all] Fixed a synchronization issue with scripts and file transfers.
    • [c3270, wc3270] Fixed a crash when the Transfer action was called from a script.
    • [x3270] Fixed a crash when visible control characters are turned on in 3278 mode.
    • [pr3287] Changed the pr3287 Makefile to use $INSTALL_DATA (bugs:#13).
    • [All Unix] Added -D_DEFAULT_SOURCE wherever a Makefile used -D_BSD_SOURCE, to get rid of compiler warnings with newer versions of glibc (bugs:#12).

    Changes in version 3.4ga4, 16. June 2015

    • [x3270, c3270, wc3270] Corrected the OIA display of save-to-printer pages.
    • [c3270, wc3270] Made the help for file-transfer reflect the current defaults. Added help for Keymap.
    • [wc3270] Fixed the pager at the wc3270> prompt. Now it adapts to the size of the console window correctly.

    Changes in version 3.4beta3, 28. May 2015

    • [pr3287, wpr3287] Fixed a problem with printer session start-up when both a specific printer LU and an SSL tunnel (L:) are specified.

    Changes in version 3.4alpha2, 15. May 2015

    • [c3270, wc3270] Added a Keymap action to add or remove temporary keymaps. The semantics are the same as the x3270 action of the same name.
    • [all] Made the parameter to ResumeScript optional, and relaxed the restrictions on when PauseScript can be used, so it can now be used from macros and command files read with the Source action.

    Changes in version 3.4alpha1, 28. April 2015

    • [c3270, wc3270] Allow the DFT buffer size to be changed in the c3270/wc3270 file transfer dialog.
    • [c3270, wc3270] Allow file transfers to be interrupted with Ctrl-C.
    • [x3270] Fixed an issue where the terminal type would not be reported to the host as IBM-DYNAMIC if the screen was put into oversize mode via a menu selection (it was correct if oversize came from a resource). Also made sure that the 'About->Configuration' display of the terminal type is always correct.
    • [all] Added resources to define the default values for each of the IND$FILE file transfer parameters. The resources have the same names as the Transfer action keywords, with ft prepended. E.g., the Mode default is controlled by the ftMode resource. For consistency, deprecated dftBufferSize and ftCodePage in favor of ftBufferSize and ftWindowsCodePage (the old resources are still available).
    • [all] Added missing functionality to specify the size for avblock TSO file allocations in IND$FILE file transfers.
    • [x3270] Added an aplCircledAlpha resource to allow x3270 to properly display APL underscored uppercase letters with the APL385 font, by translating them to the (nonstandard) Unicode circled-alphabetic range U+24B6 to U+25CF.
    • [x3270, c3270, wc3270] Overhauled visible control characters so that field attributes are completely decoded. Field attributes are now in underlined yellow in x3270. Added visible control character support to c3270 (also underlined yellow) and wc3270 (reverse-video yellow), with a menu option.
    • [all] Overhauled the build structure. Now there are libraries for common functions.
    • [wc3270] Mapped Alt-left-click onto a lightpen select operation. Added a lightPenPrimary resource to switch this, so that an unmodified left-click is a lightpen select and Alt-left-click is a cursor move or copy/paste highlight.
    • [all] Added a B: prefix option to hostnames to disable the automatic keyboard unlock when a BIND-IMAGE is received.
    • [all] Added an -nvt option and an nvtMode resource to force NVT mode as soon as a session is connected. This overrides the usual behavior of locking the keyboard and waiting for the host to send NVT-mode data or negotiate 3270 mode before unlocking. This option also changes the default terminal type to xterm.
    • [c3270] Added a mapping from the Escape key to the Escape() action (breaking to the c3270> prompt).
    • [x3270] Added a maxRecent resource to control the maximum size of the recent host list in the Connect menu.
    • [wc3270] Added right-click and Enter to Copy, and right-click to Paste, and Enter to Copy, like Quick Edit mode.
    • [wc3270] Added a nodialog option to PrintText to suppress with Windows print dialog.
    • [wc3270] Added font auto-sizing to GDI screen printing.
    • [wc3270] Added Paste with Left Margin menu.
    • [all] Allow the -scriptport option to specify an address to listen on.
    • [all] Added webserver support. The -httpd option starts a webserver listening on the specified port. The webserver supports a REST API and some basic HTML objects.
    • [all] Removed configurability of tracing, NVT mode, TN3270E support, scripting, menus file transfer, the x3270 pop-up keypad and printer sessions (they're always enabled now).
    • [x3270, wc3270] Added an overlayPaste toggle. When set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the marginedPaste toggle.
    • [x3270] Changed the selection logic so that a rectangular selection (the default for 3270 mode) never ends with a newline character.

    Changes in version 3.3.15ga8, 24. December 2014

    • [x3270, wc3270] Improved paste behavior. Patch courtesy of Máximo Castañeda.
    • [all] Added append and replace keywords to the PrintText action to control how existing files are handled.
    • [all] Made Wait(Output) work in NVT mode.
    • [x3270] Fixed security holes in the Print Window Bitmap menu item and the PrintWindow action.
    • [wc3270] Fixed multiple GDI printing problems: captions mis-centered, page overflow with multiple screens per page, "save screens to printer" not working at all.

    Changes in version 3.3.15ga7, 14. December 2014

    • [wc3270] Fixed some typos in the Session Wizard.
    • [wc3270] Fixed several issues with Notepad editing of miscellaneous resources in the Session Wizard.
    • [wc3270] Allow the printTextOrientation resource to be specified.
    • [x3270] Fixed dialog boxes lost behind the file transfer dialog.
    • [all] Fixed a crash in the Query action.

    Changes in version 3.3.15ga6, 28. November 2014

    • [wc3270, ws3270] Fixed a bug with the Transfer action ignoring the BufferSize parameter.

    Changes in version 3.3.15ga5, 14. October 2014

    • [all] Allow file transfers to be started when the screen is unformatted and includes space characters.
    • [all] Corrected the documentation for the menuBar resource.
    • [wc3270] Allow the keyword none to be given to the Session Wizard editing menu.

    Changes in version 3.3.15ga4, 3. October 2014

    • [all] Fixed a problem with -scriptport connections never being accepted again after a socket error.

    Changes in version 3.3.15beta3, 19. September 2014

    • [pr3287] Added an -mpp option to set a non-default Maximum Presentation Position (the maximum line length for unformatted Write commands).
    • [all] Corrected the BINARY and NOCRLF options passed to the CICS version of IND$FILE.
    • [all] Added a --disable-ipv6 option to the ./configure script to allow IPv6 support to be explicitly disabled.

    Changes in version 3.3.15beta2, 12. August 2014

    • [all] Changed the IND$FILE command to all-uppercase, to make certain hosts happier (found by Máximo Castañeda).
    • [wc3270] Fixed a Cygwin Makefile problem (found by Máximo Castañeda).
    • [all] Fixed some zOS/USS build issues (found by Kevin Morris).

    Changes in version 3.3.15alpha1, 17. July 2014

    • [all] Added a newEnviron resource. If set to true (the default), the emulator will respond to the TELNET NEW-ENVIRON option. If set to false, it will not.
    • [wc3270] Fixed a problem where editing an all-users session would result in copying the session to the current user's AppData directory, and re-creating the shortcut would point it to the wrong entry.
    • [wc3270] Added Session Wizard options to copy a session, rename a session, and create a shortcut for a session.
    • [all] Fixed several issues with TN3270E options negotiation (thank you to Máximo Castañeda for pointing these out).
    • [wc3270] Changed the default directory for trace files from the wc3270 AppData directory to the current user's desktop. Also fixed a number of documentation issues in this area.
    • [all] Added a tls resource. If set to false, TLS negotiations from the host will be rejected.
    • [wc3270] Added menu options to start up HTML help and the Session Wizard.
    • [c3270] If there is room, added a line (a row of underscored blanks) between the 3270 display and the OIA.
    • [wc3270] Changed the menu bar to reverse video.
    • [wc3270] Added a Cut action, mapped to Ctrl-x. It is the same as Copy, but it also erases the copied text (in modifiable fields) when it finishes.
    • [wc3270, ws3270] Added support for a separate Windows code page for IND$FILE ASCII file translations, via the ftCodePage resource and the WindowsCodePage= parameter to the Transfer action.
    • [all] Produce a better error message when the host disconnects because the emulator does not support SSL.
    • [wc3270] Added a Session Wizard option to turn on tracing at start-up.
    • [wc3270] Extended the Session Wizard to present a menu of existing sessions to choose from, to permit a session to be deleted, and to edit the free-form settings in the session file with Notepad.
    • [wc3270] Added automatic resizing of the console window to match the model number and oversize.
    • [all] Removed Windows 98 support.
    • [wc3270] Added Esc as an alias for ESCAPE in keymaps.
    • [all] List out the toggle names when a -set or -clear doesn't find a match.
    • [wc3270] Added support for GDI (direct) printers to the PrintText() and ScreenTrace() actions using the new gdi keyword option. Added resources to control GDI printing: printTextOrientation, printTextHorizontalMargin and printTextVerticalMargin.

    Changes in version 3.3.14ga11, 3. May 2014

    • [pr3287, wpr3287] Changed the -xtable option so that the translations are considered transparent data (they are not considered when checking for line wrap or when skipping ASA carriage control characters).

    Changes in version 3.3.14ga10, 27. April 2014

    • [x3270] Restored the ability to use the special 3270 fonts with code page 1047.
    • [pr3287, wpr3287] Backed out the previous change to ignore NULLs (they really are supposed to be considered blanks in unformatted Write commands). Replaced it with a new -skipcc option to ignore ASA carriage control characters at the beginning of each line; it only applies to unformatted Write commands.

    Changes in version 3.3.14ga9, 13. April 2014

    • [pr3287, wpr3287] Fixed a problem with misinterpreting NULL (X'00') characters in unformatted mode as spaces, when they should be ignored. This caused printer output to be shifted and sometimes wrapped.
    • [wc3270] Corrected the Copy() action so the space after a word selected with a double mouse click is not copied to the clipboard.
    • [all 3270] Fixed a crash when disabling tracing after opening the trace file fails.

    Changes in version 3.3.14beta8, 31. March 2014

    • [all 3270] Changed the keyboard to unlock when a BIND-IMAGE is received. This matches the behavior of PCOMM and is consistent with some comments found on IBM webpages. The net result is that the keyboard will be unlocked (and scripts may be allowed to proceed) earlier than with previous versions of the emulators. This is good for talking to hosts that don't send an initial Write command (as can happen with CICS); previously this Write was the only trigger for unlocking the keyboard at connect or BIND time. But it is bad if a script implicitly depended on the old behavior. Scripts confused by this change may need to add a Wait(InputField) to cover these cases.
    • [all 3270] Got rid of the E status for keyboard lock in the scripting prompt. The status is now L (locked) or U (unlocked).
    • [all 3270] Added decoding of UNBIND reasons to traces.
    • [all 3270] Increased the number of situations where keyboard input can result in typeahead instead of drops.

    Changes in version 3.3.14ga7, 8. March 2014

    • [c3270, wc3270] Corrected a problem where the trace on command at the c3270> prompt resulted in tracing to a file named on.
    • [c3270, wc3270] Reversed the order of keymaps. User-specified keymaps appear first, with later-specified ones before earlier-specified ones, so the override relationships are more obvious. On Windows, this also resolves the rules for ambiguous keymaps -- the first match wins, given the new ordering rules.
    • [wc3270] Fixed a problem with printable virtual key events being interpreted incorrectly, even though they were traced correctly, for example, Ctrl-Shift-3.
    • [wc3270] Fixed a problem with the RightCtrl modifier in a keymap being interpreted as Ctrl.
    • [wc3270Fixed some man pages that accidentally ended up as html.

    Changes in version 3.3.14ga6, 23. January 2014

    • [all] Fixed a problem with displaying text in NVT mode when the host does no TELNET negotiation.
    • [all] Deprecated the dsTrace and eventTrace resources (and associated toggles and x3270 menu options) and replaced them with a new single trace resource and toggle. The old resources and toggles are still available, but are effectively aliases for the new single setting.

    Changes in version 3.3.14alpha5, 30. December 2013

    • [c3270, wc3270] Added screen scrolling (saving previous screen contents, to be displayed interactively), controlled by the new Scroll action. Scroll(Backward) (mapped onto PageUp) goes back one screen; Scroll(Forward) (mapped onto PageDown) goes ahead one screen. The Reset action cancels scrolling. The -sl command-line option or scrollLines resource changes the number of lines saved for scrolling from the default of 4096.
    • [x3270] Turned the scrollbar on by default. Mapped the PageUp and PageDown keys to the (new) Scroll action, to scroll up or down one screen, respectively. Modified the Reset action to cancel any screen scrolling.
    • [all Windows] Got everything to build under MSVC again, using either the command line or MS Visual Studio. A Visual Studio solution file is now included in the source tarball. Windows targets also cross-compile again with the latest Cygwin MinGW.

    Changes in version 3.3.14alpha4, 21. December 2013

    • [all] Added a printTextScreensPerPage resource to control how many screens of text are displayed per page when tracing screens to the printer.
    • [all] Corrected screen tracing to the printer so it observes the printer.name and printer.command resources.

    Changes in version 3.3.14alpha3, 16. December 2013

    • [all, wc3270] Fixed problem with message display during file transfers initiated by scripts.
    • [all] Fixed a problem reading files with the Source action, when the file does not end with a CR or NL.

    Changes in version 3.3.14alpha2, 4. November 2013

    • [all] Added support for CICS IND$FILE file transfers.

    Changes in version 3.3.14alpha1, 30. October 2013

    • [all] Allow file transfers to start when the screen is unformatted.
    • [all] Fixed a problem with the initial data stream trace snapshot when the screen is unformatted.
    • A wrapper function was put around the Windows snprintf function, to ensure that it always NUL-terminates strings. The lack of such a wrapper could lead to string overflows in some situations.
    • [wc3270] Added the ability to install wc3270 for all users or just for the current user (the old behavior was just the current user). Also extended the installer to allow selective installation of various pieces. The Session Wizard can now create and edit session files and desktop shortcuts for either all users or the current user, and keymaps can be located in either the all-users or current user's AppData directory. Trace files are always left in the current user's AppData directory.
    • [wc3270] wc3270 Session files are now editable from the Windows context menu (right-clicking from explorer).
    • [wc3270] Windows 98 is no longer supported by the wc3270 installer. This is because the installer tool used by wc3270 (Inno Setup) no longer supports Windows 98, not because of any inherent limitation in wc3270. The no-setup .ZIP file can still be used to install wc3270 on Windows 98 by hand. A simple Windows 98-specific installer may be added at some point in the future.
    • [wc3270] Added native select/copy to wc3270. Just highlight with the mouse and press Ctrl-C. The Clear action is still available via Alt-C.

    Changes in version 3.3.13ga7, 11. September 2013

    • [wc3270] Fixed a hang when the wc3270 window was closed on XP.
    • [all] Fixed connect() failures on MacOS.

    Changes in version 3.3.13ga6, 8. September 2013

    • [all] Corrected a problem with the display of non-display fields (incorrectly observing the colors and graphic rendition).
    • [wpr3287] Added the -tracedir option, just like pr3287.
    • [pr3287, wpr3287] Added tracing of the -xtable translation table.
    • [pr3287, wpr3287] Added tracing of the data stream sent to the printer.
    • [pr3287, wpr3287] Use the same unique trace file name convention as the other emulators.
    • [pr3287, wpr3287] Added a -crthru option to pass CR orders through to the printer in unformatted 3270 mode, instead of interpreting them.

    Changes in version 3.3.13beta5, 4. September 2013

    • [wc3270] Added logic to the Session Wizard to automatically correct old-format UNC printer names, and also fixed some minor bugs in it.
    • [all] Corrected the CGCSGID for code page 1145 (spanish-euro).
    • [all] Second try at getting pr3287/wpr3287 shut down and re-launched correctly.

    Changes in version 3.3.13beta4, 23. August 2013

    • [all] Corrected the start/stop of pr3287/wpr3287 printer sessions, so that a new one is not started until the previous one has completely exited.

    Changes in version 3.3.13beta3, 6. August 2013

    • [pr3287, wpr3287] Made sure trace files get flushed for each entry.

    Changes in version 3.3.13alpha2, 30. July 2013

    • [all] Fixed a crash when connecting to certain hosts using an SSL tunnel.
    • [all except x3270] Fixed a parsing problem for session files and -xrm options that resulted in doubled backslash characters.
    • [all] Fixed a crash in the Wait(n,seconds) action.
    • [wc3270] Made sure that the wpr3287 process is stopped when the wc3270 window is closed.
    • [wc3270] Fixed new issues created by the previous Windows 8 process creation fix.

    Changes in version 3.3.13alpha1, 11. July 2013

    • [wc3270] Fixed some issues with starting Wordpad and wpr3287 on Windows 8.
    • [x3270] Combined the various text screen save/print options into a single menu option, which brings up a dialog box that allows snapshots, continuous saving, save to text, HTML or RichText or directly to the printer.
    • [c3270, wc3270] Added the ability to save a stream of screens to the printer via a menu option or the new Printer option to the ScreenTrace action.
    • [x3270] Added a -secure to simplify invoking secure mode.
    • [c3270, wc3270] Allow -noprompt mode without a host specified on the command line.
    • [pr3287, wpr3287] Added custom translation tables via the -xtable option.
    • [pr3287, wpr3287] Made -emflush the default. Added a -noemflush to specify the old behavior.
    • [all] Corrected a problem with interpreting the SuppressMap resource. (Courtesy of Marcin Cieślak.)
    • [wc3270] Corrected the working directory for auto-shortcut mode.
    • [all] Added the -accepthostname command-line option and acceptHostname resource to allow accepting specific names and IP addresses in host certificates, or any name.
    • [all] Turned off variable substitution for all actions under certain circumstances, such as inside macros. It mostly just caused confusion.
    • [all] Added two pseudo-variables for filename substitutions: ${TIMESTAMP} becomes a microsecond-resolution timestamp and ${UNIQUE} guarantees that the filename is unique. Changed the default trace file names to use ${UNIQUE}.
    • [all] Added a number of keywords to the Query action.
    • [all] Made the Open (Connect) and Close (Disconnect) aliases available everywhere.
    • [s3270, ws3270] Enabled the idle command (the idleCommand, idleCommandEnabled and idleTimeout resources).
    • [all] Added support for code page 803 (hebrew-old).
    • [s3270, ws3270] Added a -utf8 command-line option and a utf8 resource to force local I/O to be encoded as UTF-8.
    • [all] Added a -loginmacro command-line option, and made the existing loginMacro resource work on x3270.
    • [wc3270] Made screen printing via PrintText (Alt-P) asynchronous, so wc3270 can continue processing keyboard events and host output while the screen print is being prepared.
    • [s3270, ws3270, tcl3270] Made 3279 (color) mode the default.
    • [all] Added output to scripts to the event trace file.
    • [wc3270, ws3270] Now there is a single wc3270 .exe file and a single ws3270 .exe file; they each find the OpenSSL DLLs automatically if they are installed.

    Changes in version 3.3.12ga13, 2. May 2013

    • [c3270, wc3270] Fixed a start-up crash when the tracing is enabled and the menu bar is disabled.
    • [all] Added support for the LF (X'25') format control order.
    • [All] Fixed a number of buffer overflow crashes.

    Changes in version 3.3.12ga12, 1. March 2013

    • [All] Added logic to verify the name in the host certificate.
    • [All] Pass all SSL-related parameters to the pr3287 session.
    • [x3270] On the Connect menu, made the recent host list a pull-right sub-menu, if there is an ibm_hosts file in use.
    • [x3270] The -trace option now implies event tracing as well.
    • [x3270] Spaces are now allowed in the file transfer dialog local file name.
    • [all] Corrected issues when invalid Unicode characters are encountered during a file transfer.
    • [x3270, wc3270] Corrected a crash when tracing without a file, when the monitor window was closed.
    • [ws3270] Corrected the behavior of stdin processing, so ws3270 is not blocked trying to read stdin most of the time. Also fixed an issue where the scripting prompt would start with E when the keyboard was in inhibit mode.
    • [wc3270] Removed a duplicated rule in Msc/Makefile.
    • [all] Changed the CGCSGID for cp930 (Japanese) 0x080b012c (2059, 300) to 0x0172012c (370, 300).
    • [wc3270, c3270] Corrected the behavior of the Menu option in the Session Wizard and the menuBar resource, neither of which worked correctly.

    Changes in version 3.3.12ga11, 23. July 2012

    • [all] Corrected a problem with not sending the TELNET TERMINAL TYPE when the TELNET NEW ENVIRONMENT option had been negotiated.
    • [x3270, c3270] Corrected issues with manual page warnings.

    Changes in version 3.3.12ga10, 8. July 2012

    • [all] Turned off automatic SSL host certificate verification and added a verifyHostCert resource and -verifycert option to enable it.
    • [wc3270] Improved behavior when SSL negotiation fails.
    • [x3270, c3270, wc3270] Changed the 'secure' icon to green when SSL/TLS is active and the host is verified, and yellow when SSL/TLS is active but the host certificate is unverified.
    • [c3270] Added a defaultFgBg resource and -defaultfgbg option to use the terminal's default foreground and background colors in place of the curses colors white and black respectively -- if the ncurses library, terminal and termcap/terminfo entry support default color. It is automatically set for gnome-terminal.

    Changes in version 3.3.12beta9, 13. February 2012

    • [all] Added a selfSignedOk resource to allow SSL authentication with hosts that use self-signed certificates.

    Changes in version 3.3.12ga7, 24. August 2011

    • [wc3270] Improved the Keymap and Build documentation.
    • [wc3270] Added catf.exe to the no-install zip file.
    • [wc3270] Added BackSpace as an alias for the BACK key.
    • [all] Corrected a buffer overflow problem when starting tracing with large screen sizes.
    • [wc3270] Corrected an installation issue with the root certificates file.
    • [wc3270] Changed the OpenSSL documentation to refer to the Lite version of the OpenSSL DLL.
    • [All but wc3270 and x3270] Made the hostname resource work as-documented: if it is defined, then the emulator will connect to that host at start-up.
    • [c3270] Added a key sequence for screen printing (Ctrl-a, p).

    Changes in version 3.3.12beta6, 4. January 2011

    • [all] Added support for the TELNET NEW-ENVIRON sub-negotiation, used to specify the Workstation ID to iSeries hosts, as specified by RFC 4777.
    • [c3270, wc3270] Corrected a problem with mouse clicks on the top two lines on the screen.
    • [all] Included SSL documentation.

    Changes in version 3.3.12a4, 8. December 2010

    • [wc3270] Restored the SSL option in the Session Wizard.

    Changes in version 3.3.12a3, 2. December 2010

    • [All] Completed the options and resources needed for complete OpenSSL support.

    Changes in version 3.3.12a2, 25. November 2010

    • [pr3287, wpr3287] Added a -ffeoj option to output a formfeed at the end of each print job.

    Changes in version 3.3.11ga6, 19. September 2010

    • [wc3270] Fixed an issue with non-ASCII text in the Info command.
    • [wc3270] Removed junk characters from the top line of model 5 screens.
    • [pr3287, wpr3287] Corrected an issue with missing newlines at the end of each formatted 3270 stream Write command.
    • [pr3287, wpr3287] Modified the -trnpre and -trnpost options to open the files for each print job, so they can be changed between print jobs.

    Changes in version 3.3.11beta5, 30. July 2010

    • [all 3270] Improved tracing. Trace entries now include time stamps. Trace file limits operate much more simply. A trace file name can start with ">>" to have the data appended to the file.
    • [all 3270] Allow -scriptport TCP ports to be re-used quickly.

    Changes in version 3.3.11beta4, 25. July 2010

    • [wc3270] Corrected a problem where mouse input would be ignored after screen printing (Alt-P) or use of the Execute() action.
    • [wc3270] Added a bellMode resource to allow precise control of what wc3270 does in response to ALARM WCCs and BELL characters.
    • [c3270] Fixed a problem with hangs when a connection fails on recent versions of Cygwin.
    • [x3270, c3270, wc3270] Added a new token to the printer.assocCommandLine and printer.luCommandLine resources: %O% will be substituted with the value of the new printer.options resource. This allows extra options such as -emflush to be passed easily to pr3287 and wpr3287 sessions without having to redefine the rather ugly printer.assocCommandLine and printer.luCommandLine resources.
    • [pr3287] Fixed a build issue on platforms that use the iconv library, such as Macs.
    • [all] Added a bindLimit resource (default true) to control whether the screen dimensions specified by the host in a BIND image will be obeyed.
    • [wc3270] Fixed the cursor position toggle to turn off correctly.
    • [c3270 and wc3270] Added a menu option to toggle underscore mode.
    • [c3270] Fixed underscore mode to only affect underlined fields.

    Changes in version 3.3.11beta3, 7. July 2010

    • [pr3287 and wpr3287] Added the -emflush option, to flush pending printer output when an EM order is received in unformatted 3270 mode. This helps preserve multi-page output from hosts that to not clear the 3270 buffer between pages.

    Changes in version 3.3.11beta2, 6. May 2010

    • [c3270, wc3270] Added a menu bar and pop-up keypad, usually controlled by the mouse or by the new Menu and Keypad actions.
    • [c3270, wc3270] Implemented the showTiming toggle, to display the time taken for the host to process an AID in the OIA.
    • [wc3270] Overhauled auto-shortcut mode, so that no shortcut is needed to run a wc3270 session file.

    Changes in version 3.3.10ga5, 6. May 2010

    • [c3270] Corrected a screen refresh problem when first connected.
    • [wc3270] Include the font size and oversize dimensions in the automatically-generated shortcuts.
    • [c3270] Allow the 'c3270.printer.command' resource.
    • [x3270] Fixed a problem with temporary keymaps being cleared when connecting to or disconnecting from a host.
    • [x3270, c3270] Corrected some APL characters that were not displayed correctly with Unicode fonts.
    • [all] Corrected operation on EBCDIC-based hosts.
    • [all] Corrected the behavior of hostname prefixes such as L:, which were "sticky", i.e., once set they would be set for all future connections.
    • [all] Corrected the reported CGCSGID for code page 1147 (french-euro).
    • [all except x3270] Disabled the Query Reply report for background color support, which confused some older versions of GDDM. This report can be explicitly enabled by setting the qrBgColor resource to true.
    • [all] In oversize mode, changed the terminal type to IBM-DYNAMIC.

    Changes in version 3.3.10ga4, 2. October 2009

    • [all x3270] Improved the File Transfer summary display.
    • [all x3270] Removed the keyboard lock when processing an Enter AID in SSCP-LU mode.
    • [x3270] Fixed a build problem when DBCS support is disabled.
    • [c3270] Made the special keymap key names (e.g., PRINT) case-insensitive.
    • [c3270] Fixed a problem with keyboard input in ISO 8859 locales.
    • [x3270] Increased the maximum number of fonts scanned to 50000.

    Changes in version 3.3.10ga3, 15. September 2009

    • [x3270] Fixed some bugs in the xmkmf-free build.

    Changes in version 3.3.10alpha2, 10. September 2009

    • [c3270] Added the ability to move the 3270 cursor with the mouse, if the terminal supports it. Add a Mouse resource, which can be set to False to disable it.
    • [all 3270] Added a Translate keyword to the Transfer action's parameters and an additional question to the interactive c3270/wc3270 Transfer dialog, to allow the automatic remapping of text (usually done to get the most accurate translation) to be disabled.
    • Restored the pop-up window that displays trace files.

    Changes in version 3.3.10alpha1, 3. September 2009

    • [3270] Allow the program to be built without xmkmf.
    • [all 3270] Fixed the mapping of EBCDIC X'FF' to U+009F in ASCII-mode file transfers.
    • [all 3270] Fixed a crash in CUT-mode binary file sends, and corrected the local fopen() flags when receiving a binary file.
    • [x3270] Added the APL up- and down-arrow characters (↑ and ↓) to the 12-point fonts (thanks to Paul Scott for the fix).
    • [all 3270] Script comments are now allowed (any input line beginning with # or !).
    • [wc3270] Added support for the Enhanced keymap modifier (EnhancedReturn is the keypad Enter key. Also added Enter, PageUp and PageDown as aliases for the Windows keys RETURN, PRIOR and NEXT.
    • [wc3270] Added oversize, font size and background color support to the Session Wizard.
    • [x3270] Fixed a problem with ignored -set and -clear options.
    • [c3270 and wc3270] Added support for the -oversize auto option, which allows the emulator to use the entire area of the terminal or console window it is running in.
    • [x3270] Removed the huge delay at start-up.
    • [x3270, c3270, s3270 and wc3270] Added support for TCP-socket-based scripting via the -scriptport option. For wc3270, this is the first time that scripting has been available.
    • [all 3270 except x3270] Added support for the screenTraceFile resource.
    • [all 3270] Fixed a file descriptor leak with the -socket option.
    • [all 3270] Fixed a crash with the Toggle action and undefined toggles.
    • [wc3270] Implemented no-install mode (allowing wc3270 to run without installing the software) and auto-shortcut mode (where wc3270 automatically creates a temporary shortcut file to match a session file and runs it).
    • [all 3270] When a hostname resolves to multiple addresses, try each until one works.
    • [all 3270] Corrected an issue where the keyboard would lock on the first screen when connecting to hosts like Hercules.
    • [wc3270] Added mappings of the Page Up and Page Down keys to PF(7) and PF(8) respectively.
    • [wc3270, ws3270] Removed the .dll files from the distribution.
    • [c3270] Corrected an issue with cursor and function keys not being recognized if they are the first key pressed.
    • [all 3270] BIND image screen sizing is now observed.
    • [pr3287 and wpr3287] Corrected the -charset documentation on the manual page.
    • [all 3270] Resurrected flipped-screen mode via the Flip and ToggleReverse actions.
    • [all 3270] Added a Seconds form to the Wait action, allowing a script or macro to delay itself an arbitrary length of time.
    • [wc3270] Modified the PrintText action so that Wordpad is started minimized.

    Changes in version 3.3.9ga11, 25. March 2009

    • [x3270 and c3270] Re-enable the ibm_hosts file (it was accidentally being ignored).
    • [all but wc3270] Don't crash when there is no iconv translation for the locale codeset.
    • [all but x3270] Fixed a build failure in glue.c when DBCS was disabled.
    • [wc3270] Corrected the default keymap so that the uppercase versions of the Alt mapping also work.
    • [wc3270] Corrected the documentation of the printTextFont and printTextSize resources.
    • [c3270] Corrected a number of errors in parsing CursesColorForxxx resources.
    • [c3270] Added support for -rv, which puts c3270 into black-on-white mode.
    • [c3270] Added support for 16-color terminals, with the -color8 option overriding this and forcing 8-color support only. On a 16-color terminal, -allbold is no longer the default.
    • [c3270, wc3270, s3270 and tcl3270] Ensured that command-line parameters override session files.
    • [c3270] Made session files replace profiles, rather than just overriding any common definitions. This is more intuitive and consistent with x3270.

    Changes in version 3.3.9ga11, 27. February 2009

    Common Changes

    • Improved hostname parsing. Now backslashes can be used to quote any character, and square brackets can be used to quote any element (LU name, host name, or port).
    • Fixed a number of compiler warnings from newer versions of gcc and a number of small memory leaks.
    • Overhauled the host code pages and CGCSGIDs for DBCS. Added sbcsCgcsgid and dbcsCgcsgid resources to override the compiled-in values.
    • Added a caption text option to the PrintText action, which will place the specified caption above the screen image. Within the text, the string %T% is interpolated to a timestamp.
    • Improved the state dump when tracing starts to include NVT and SSCP-LU state and the SNA BIND image.
    • Updated the copyright and licensing notices (now a standard BSD license).
    • Added support for carriage-return (0x0d) characters in the String action, which imply the Newline action.
    • Changed the Attn action so that it sends an IAC BREAK in TN3270 mode, and locks the keyboard in TN3270E mode when the session is not SNA bound.
    • Added Traditional Chinese (host code page 937) support.
    • Extended the String action's \e and \x sequences to accept 4-digit hex values, thus allowing EBCDIC DBCS input and arbitrary Unicode input. Also added \u as an alias for \x.

    Changes to x3270

    • Fixed a crash when pasting an empty selection.
    • Made the Query Reply response for x3270 identical to the other tools.
    • Included fonts for Traditional Chinese.

    Changes to x3270 and c3270

    • Removed the nested copy of pr3287. from the source. pr3287 must now be built separately from its own package.

    Changes to wc3270

    • Corrected a problem with color mapping in the OIA.
    • Changed the New Session Wizard to the Session Wizard and gave it the ability to edit existing session files and re-create missing session files. Note that this ability is limited to session files created with 3.3.9beta10 or later.
    • Added a wc3270.printer.codepage resource to set the Windows code page for the associated pr3287 printer session.
    • Simplified the operation of the New Session Wizard, so it asks fewer questions.
    • Added a pager to interactive mode.
    • Made the PrintText font and point size configurable via the printTextFont and printTextSize resources.
    • Changed the default 'blue' color for created shortcuts to a somewhat lighter shade, to make it more readable.
    • Changed the Session Wizard to specify the code page and proper font when creating shortcuts for DBCS sessions. This should allow DBCS to work on Windows 2000 and Vista.
    • Included ws3270 in the wc3270 release.

    Changes to c3270 and wc3270

    • Added feedback for the progress of file transfers.
    • Implemented the Info action, which writes a message to the OIA (the line below the display).
    • Added a no-prompt mode, via the -noprompt command-line option and the noPrompt resource .
    • Added automatic reconnect, via the -reconnect command-line option and the reconnect resource.

    Changes to ws3270 (formerly available as a pre-release)

    • Fixed a bug which resulted in all command timings being displayed as '-'.
    • Added the -localcp option and localCP resource to change the Windows code page used for local workstation I/O.
    • Added DBCS support and support for building using Microsoft tools.

    Changes to pr3287 and wpr3287

    • Fixed a serious character-mapping bug.
    • Added DBCS support.

    Changes to specific versions

    • [c3270, s3270, s3270, ws3270 and x3270] Added support for session files.
    • [All except wc3270 and ws3270] Extended the rtf option of the PrintText to non-Windows platforms.
    • [All except x3270] Fixed a number of issues with -xrm option processing and keymap display when backslash sequences were used.

    Changes in version 3.3.8p2, 13 December 2008

    • [wc3270] Corrected the handling of 8-bit and DBCS characters in the PrintText action.
    • [tcl3270] Extended configure to find the Tcl library version automatically.
    • [wc3270] Corrected a problem which caused mouse clicks not to be recognized (not moving the cursor) if NumLock was set.
    • [all] Corrected the configure script to recognize a separately-installed iconv library even if the iconv() function is defined in libc.
    • [wc3270] Restored the bell sound, and added a visualBell resource to disable it.

    Changes in version 3.3.8p1, 20 October 2008

    • [wc3270] Restored the Ctrl-] mapping for the Escape action, which had been inadvertently removed.
    • [wc3270] wc3270 now starts successfully on Windows Vista.
    • [c3270] On platforms that require the iconv library, c3270 once again recognizes ncurses names in keymaps.
    • [x3270] The module keysym2ucs.c now builds on FreeBSD.
    • [x3270] Selections now work properly on platforms that do not support XA_UTF8_STRING.

    Changes in version 3.3.8, 11 October 2008

    Version 3.3.8 includes a significant internal change, using Unicode for all translations between the host and the local workstation. This change should be transparent, but users who depended on certain behaviors of the old implementation may see unexpected differences.

    Common Changes

    • Many more EBCDIC characters, such as Graphics Escape line-drawing and APL characters, are now properly displayed (even without special 3270 fonts), traced, cut/pasted with other applications, and returned by scripting actions like Ascii.
    • With two exceptions, the locale's encoding is now observed consistently when reading keymaps, generating trace files, etc. The exceptions are:
      • tcl3270 always uses UTF-8, per the internal Tcl convention.
      • Because Cygwin doesn't really support locales, the Windows ANSI code page is used as the local encoding instead.
      • Stateful encodings such as ISO 2022 are untested and very likely do not work.
    • The ICU library is no longer used, and ICU .cnv files are no longer included with the code.
    • Translation to/from the local encoding requires one of two facilities: Either libc must support __STDC_ISO_10646__ (wchar_ts are defined to be Unicode values, as on Linux and Windows), or there must be an iconv library that can translate between UTF-8 and all local encodings.
    • DBCS support is enabled by default, except on Windows. It can be explicitly disabled in the configure script to reduce the size of the executable (removing several large translation tables).
    • The -v/--verbose option has been added to display build and copyright information.
    • The Thai host code page has changed from 838 to 1160.

    Changes Common to the 3270 Terminal Emulators

    • The Key action now accepts Unicode arguments in the form U+nnnn, removing possible ambiguity from translating from the
    • Added a Source action to read script commands from a file.
    • Added a 10 second timeout to the start of the Transfer action.
    • Added an unlockDelayMs resource to change the number of milliseconds of delay before actually unlocking the keyboard after the host requests it. The default is 350; use 0 to disable the delay altogether.
    • IND$FILE file transfer now transfers DBCS text files properly.

    Changes Common to 3287 Printer Emulators

    • Added direct support for all x3270 host character sets via the -charset option.
    • Added -trnpre and -trnpost options to specify files containing transparent data to send to the printer before and after each print job, respectively.

    Product-Specific Changes

    • [x3270] Commands entered into the Print Screen Text dialog are now saved by the Save Changed Options in File option.
    • [x3270] Fixed some bad interactions between the pop-up keypad and the GNOME window manager.
    • [x3270] The Euro fonts have been folded into the standard fonts.
    • [x3270] The font menu is now arranged hierarchically by foundry and family.
    • [c3270] Added an underscore toggle to allow underlined fields to be displayed even on consoles with no native underlining support, by substituting underscore '_' characters for blanks and nulls in underlined fields.
    • [c3270] Overhauled Meta and Alt key support. Removed support for the archaic Meta modifier in keymaps (it was an alias for setting bit 0x80 in each key). Replaced it with an Alt modifier, which matches the ESC sequence sent for the Alt key by many terminals, and which can be combined with full 8-bit input characters.
    • [c3270] Changed the interpretation of keymaps so that keys and symbols are matched in Unicode. That is, keymap text is converted from the current locale's encoding to Unicode before matching, and input character codes are converted to Unicode before matching. This eliminates the difficulty in creating keymaps and interpreting traces in non-Latin-1 locales -- needing to translate from the accidental interpretation of 8-bit values as Latin-1 when they are not -- but with the side-effect of rendering some carefully-crafted existing keymaps invalid. Keymaps can also be written using Unicode U+nnnn notation.
    • [c3270] Changed the metaEscape resource so that auto means on, instead of using the terminfo km resource.
    • [c3270] Added an acs resource to control the use of curses ACS codes. If c3270.acs is set to true (the default), c3270 will use curses ACS codes for line-drawing characters. If set to false, it will display line-drawing characters with Unicode.
    • [wc3270] Added an underscore toggle to control how underlined and blinking fields are displayed. If it is set (the default), underlined fields are displayed by substituting underscore (_) characters for blanks and nulls, and blinking fields actually blink. If it is clear, underlined and blinking fields are displayed with highlighted backgrounds, which is compatible with previous versions of wc3270.
    • [wc3270] Left-clicking with the mouse will now move the cursor to that location.
    • [wc3270] The PrintText action now works, and is mapped by default to the sequence Alt <Key>p. The printer.name resource defines the default printer to use.
    • [wc3270] The PrintText action can now be used to produce a RichText snapshot of the screen contents, via the rtf keyword.
    • [wc3270] The program longer attempts to set the console code page, which was error-prone and unnecessary.
    • [wc3270] The idle command feature now works, controlled by the idleCommand, idleCommandEnabled and idleTimeout resources.
    • [wc3270] The program no longer attempts to set the console code page, which could lead to hangs on Vista.
    • [wc3270] The installation now creates a program group item to explore the wc3270 Application Data directory.
    • [wc3270] Corrected a problem with console color overrides, which prevented reverse-video mode (white background) from working properly. For now, the recommended method for enabling reverse video mode is to add these lines to your session file:
            wc3270.consoleColorForHostColor0: 15
            wc3270.consoleColorForHostColor7: 0
    • [wc3270] wc3270 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.
    • [tcl3270] Added a commandTimeout resource to force any Tcl3270 command to time out after the specified number of seconds. (Thanks to Mark Young.)
    • [tcl3270] Fixed a per-command memory leak. (Thanks to Mark Young.)
    • [wpr3287] Added a -printercp option to specify a particular code page for printer output.
    • [wpr3287] wpr3287 now builds with the Microsoft tools. The file Msc/Makefile is a makefile for nmake.

    Changes in x3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in x3270 3.3.7p7, 4. July 2008

    • Bug Fixes:
      • Corrected input of 8-bit characters when x3270 is run in a UTF-8 locale.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.
    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.

    Changes in x3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed an issue with Idle commands, which would cause x3270 to exit with a Not Found error as soon as the idle command fired.

    Changes in x3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed the annoying delay when x3270 starts with an error pop-up.
      • Shortened the manpage so that it displays on non-groff platforms. The full text is still available in the HTML version.
      • Plugged a number of memory leaks.
      • x3270 will now compile on platforms that do not support IPv6, such as Cygwin.
      • x3270 will no longer crash or spin when the -script option is used.
      • Shifted function keys should work again (they map to PF13-PF24).
      • The screen can now be resized larger, as well as smaller.
      • Removed the dependency on <bitmaps/gray>, which required installing an obscure X11 development package on some platforms.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added a SelectAll action, mapped to Ctrl-A.

    Changes in c3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.
      • Allowed c3270 to build under SLES 10's unusual ncurses configuration.

    Changes in c3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in c3270 3.3.7p4, 29. February 2008

    • Bug Fixes:
      • Fixed c3270's configure script again, so it will build on systems without the ncurses library.
      • Enabled idle command functionality, which had been accidentally disabled.

    Changes in c3270 3.3.7p1, 28. December 2007

    • Bug Fixes:
      • c3270's configure script would not detect missing ncurses header files, and c3270 would not build if ncursesw was not installed.

    Changes in c3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • c3270 will now display characters such as the notsign ¬ properly in terminal windows in UTF-8 locales. Note that this display support requires an ncurses or curses library that supports wide characters.
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, script interactions, screen snapshots, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.
      • Added display of the host code page and locale codeset to the show status command.
      • Added support for changing the color mappings. The curses color for a given host color can be specified with the resource c3270.cursesColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a curses color number (0 through 7).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        c3270.cursesColorForDefault
        c3270.cursesColorForIntensified
        c3270.cursesColorForProtected
        c3270.cursesColorForProtectedIntensified
               
        The value for each of these is a curses color number (0 through 7).

    Changes in wc3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed idle command support.

    Changes in wc3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Fixed a problem with transferring binary files, where 0x0d characters might be accidentally added to or removed from the data.
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in wc3270 3.3.7p5, 11. April 2008

    • Bug Fixes:
      • After installation is complete, get rid of mkshort.exe, which shares its name (but not its functionality) with a computer surveillance application.
      • Corrected several issues with key event processing and the default keymap.

    Changes in wc3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Changed the New Session Wizard to create the Application Data directory, so wc3270 can be run by any user, not just the one that installed it.
      • Changed the default window title from the pathname of the session to just the session name.

    Changes in wc3270 3.3.7p2, 15. January 2008

    • Bug Fixes:
      • Fixed an embarrassing problem that kept wpr3287 from starting.

    Changes in wc3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • Fixed line-drawing characters.
      • Enabled IPv6 support for Windows XP and later.
      • Set the input code page correctly, so that keyboard input works correctly when there is a mismatch between the default Windows code page and the code page implied by the wc3270 character set option.
    • New Features:
      • Added limited support for Windows 98. wc3270 will install and run on Windows 98, but internationalization support is limited -- the only supported host code page is 37, and the only supported Windows code page is 437. This is expected to improve in the future.
      • Added a wc3270.highlightUnderline resource to control highlighting of underlined and blinking text. (Set to false to disable background highlighting.)
      • Moved session files, keymaps and trace files to the Application Data directory. (wc3270 will still look in its installation directory for session files and keymaps, after first searching the Application Data directory.) This makes wc3270 a better Windows citizen in general, and a better Vista citizen in particular.
      • Added support for changing the color mappings. The console color for a given host color can be specified with the resource wc3270.consoleColorForHostColorn, where n is a host color number (0 through 15), and the value of the resource is a console color number (0 through 15).
        In addition, the field-attribute-based colors used when the host does not specify a particular color can be changed via the following resources:
        wc3270.hostColorForDefault
        wc3270.hostColorForIntensified
        wc3270.hostColorForProtected
        wc3270.hostColorForProtectedIntensified
               
        The value for each of these is a host color number; the actual color displayed is defined by the corresponding wc3270.consoleColorForHostColorn resource.
      • Added a new cp1153 character set. It implements host code page 1153 and uses Windows code page 1250, used primarily in Central Europe.
      • Added display of the Windows code page to the character set screen in the New Session Wizard.
      • Added display of the host and Windows code pages to the show status command.

    Changes in s3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in s3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in s3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer(Ascii) actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

        NOTE: If you were were previously running s3270 in a UTF-8 locale, this is an incompatible change. To ensure the previous behavior, set your locale to C before starting s3270.

    Changes in tcl3270 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Corrected the buffer addressing mode logic for oversize screens.

    Changes in tcl3270 3.3.7p7, 4. July 2008

    • New Features:
      • Added \eXX support to the String() action, which allows an EBCDIC code to be entered.
    • Bug Fixes:
      • Corrected a bug which sometimes left the local file open after a failed file transfer.

    Changes in tcl3270 3.3.7p3, 22. February 2008

    • Bug Fixes:
      • Fixed a problem with non-ASCII characters returned by the Ascii command.
      • Fixed a problem with the Connect command, which resulted in subsequent actions not blocking properly.

    Changes in tcl3270 3.3.7, 25. December 2007

    • Bug Fixes:
      • (none)
    • New Features:
      • Added UTF-8 support. If the current locale specifies UTF-8 encoding, then all text output (trace data, screen snapshots, the Ascii and ReadBuffer actions, etc.) will be UTF-8 encoded, and all text input (arguments to the Key and String actions, etc.) must be UTF-8 encoded. In addition, the NVT-mode xterm/VT100 emulator will expect UTF-8.

    Changes in pr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in pr3287 3.3.7, 25. December 2007

    • Enhancements:
      • Added proxy support via the -proxy option.

    Changes in wpr3287 3.3.7p8, 28. August 2008

    • Bug Fixes:
      • Fixed the interpretation of SCS CR characters.<\li>

    Changes in wpr3287 3.3.7, 25. December 2007

    (none)

    Changes in x3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Fixed the highlighted attribute for individual regions of the screen (versus the highlighted field attribute); it had been accidentally disabled.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Pseudo-Color mode is no more. This was the mode that x3270 used when a 3278 model was specified, or if the m3279 resource were set to False. Pseudo-Color assigned colors to regions of the screen based on intensity and light-pen selectability, and did not support 3279 colors. Now turning off color or selecting a 3278 results in something that looks like a 3278 (i.e., it's green). To resurrect Pseudo-Color mode, set the following resources:
          x3270.inputColor: orange
          x3270.boldColor: cyan

    Changes in c3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Got local process (-e) support to work again.
      • Fixed -mono -allbold mode.
      • c3270 now paints the entire screen, not just the areas it intends to use, so there are no uninitialized regions.
    • New Features:
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for the 3270 background color attribute.
      • Added more mappings to the 3270 default keymap (IC -> ToggleInsert, Ctrl<Key>U -> DeleteField, etc.).
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.
      • Like x3270 and wc3270, -model 3278 now specifies a green-screen 3278 (if the terminal supports color), and like x3270, -mono specifies that any color capabilities reported by the terminal should be ignored.

    Changes in wc3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • Restored line-drawing character support.
      • Restored background color support in NVT mode.
      • Corrected some screen rendering issues.
      • Fixed screen trace (-set screenTrace).
      • Removed the -mono option and mono resource.
    • New Features:
      • Added the Spanish character set, CP 284.
      • Added proxy support via the -proxy option or the proxy resource.
      • Added support for setting the window title, either automatically, or via the -title option or wc3270.title resource.
      • Added gray background highlighting of underlined and blinking text. Windows consoles don't support these attributes, but at least they can be distinguished from other text now.
      • Added background color support in 3270 mode.
      • Added a window to monitor trace output.
      • Greatly improved key event tracing.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in s3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in tcl3270 3.3.6, 23. June 2007

    • Bug Fixes:
      • The code now builds with ICU 3.6.
      • Removed the -mono option and mono resource.
    • New Features:
      • Added proxy support via the -proxy option or the proxy resource.
      • Modified Blank Fill mode to treat trailing underscore characters ('_') like blanks when checking for input overflow.

    Changes in wc3270 3.3.5p9, 10. June 2007

    • Bug Fixes:
      • The shortcut cursor size property is now obeyed.
      • The -model 3278 option now works correctly.
    • New Features:
      • Added secure connection status to the status line and the show status command.
      • Reverse video is now supported.
      • Added support for IBM Code Page 1047 (-charset cp1047).
      • Added a keymap tutorial to the documentation.

    Changes in wc3270 3.3.5p8, 29. April 2007

    • Bug Fixes:
      • Fixed a hang when wpr3287 exits unexpectedly.
      • Improved behavior when input comes from multiple sources, such as when pasting text.
      • Greatly improved screen update speed.
    • New Features:
      • Added wpr3287 support back to the wizard. It was in the GUI version, but was never in the text version.
      • Integrated new back-end printer support in wpr3287, including a new wc3270.printer.name resource.
      • Added a Paste() action, mapped to Ctrl-V, to do multi-line paste properly.
      • Added a .wc3270km suffix to keymap files.
      • Added keymap support to the wizard.
      • Added interactive prompting to the Transfer() action.

    Changes in wpr3287 3.3.5p8, 29. April 2007

    • New Features:
      • Added direct support for Windows printers, instead of relying on the DOS PRINT command. This included changing the -command option to a -printer option, to specify the Windows printer to use as a back end.

    Changes in x3270 3.3.5p6, 7. April 2007

    • Bug Fixes:
      • x3270 will now build with ICU 3.6.
      • A long-standing screen update bug is finally fixed.
      • The unused x3270hist.pl script is no longer installed.

    Changes in c3270 3.3.5p4, 7. April 2007

    • Bug Fixes:
      • c3270 can now be built without File Transfer support.
      • The unused x3270hist.pl script is no longer installed.

    Changes in wc3270 3.3.5p3, 2. March 2007

    • Bug Fixes:
      • Reverted the wc3270 New Session Wizard to the non-GUI version, because the GUI version, built with Microsoft Visual C++ 2005 Express Edition, had too many dependencies (latest service pack, .NET framework) on the target machine.

    Changes in wc3270 3.3.5p2, 16. February 2007

    • Bug Fixes:
      • Ensured that the desktop shortcuts specify Lucida Console, so non-ASCII-7 characters are displayed properly.
    • New Features:
      • Added a file association for the .wc3270 suffix.
      • Replaced the console version of the New Session Wizard with a proper GUI version.

    Changes in wc3270 3.3.5p1, 6. February 2007

    • Bug Fixes:
      • Added the working directory to the desktop links created by the setup program.
    • New Features:
      • Added printer session (wpr3287) support.

    Changes in x3270 3.3.5, 1. February 2007

    • Bug Fixes:
      • Fixed a crash when the user's home directory or the ~/.x3270connect file wasn't writable.
      • Fixed some endcases when pasting text that wraps lines and a field skip is encountered.
      • Fixed the handling of SI characters in cut/pasted text.
      • Allow the use of ICU version 3.0 or greater.
      • Fixed a scripting hang when the host disconnects during Wait(output)).
      • Turned the unlockDelay option back on by default.
      • Fixed a problem where unlockDelay could result in the keyboard never unlocking, if the host unlocked the keyboard often enough.
      • Added a workaround for very old snprintf() implementations.
      • Fixed a problem with DBCS input corrupting existing DBCS subfields.
      • Fixed a problem with the Wait action in the expect glue. (Thanks to Jason Howk for the fix.)
      • Enlarged the input buffer in x3270if. (Thanks to Igor Klingen for the fix.)
      • Fixed a SIGCHLD handler issue on AIX.
      • Fixed a problem with CR/LF translation on ASCII file transfers.
    • New Features:
      • Added a -socket option to x3270, s3270 and c3270 to allow a script to connect to a Unix-domain socket to control the emulator, and added a -p option to x3270if to connect to the socket.
      • Added optional support for plugins, with a first plugin to implement command history on VM/CMS and TSO hosts.
      • Allow arbitrary color names (#rrggbb) to be used in color schemes.
      • Added support for hierarchical macro menus.
      • Added an XkSelector resource to allow transparent support of non-English keyboards.
      • Added preliminary support the 16-bit display fonts and the Persian character set.
      • Added Title and WindowState actions to allow the x3270 window title and icon state to bw changed respectively.

    Changes in x3270 3.3.4, 10. April 2005

    • Bug Fixes:
      • The code once again builds on Cygwin and other systems not supporting IPv6.
      • The -xrm option works again in x3270.
      • The -name X Toolkit option works with x3270, though not yet with app-defaults files.
      • Removed spurious 'no child' error messages from pr3287 on some systems.
      • Removed unintended blank-line suppression from the output of PrintText html string.
      • Restored some missing keymap definitions (rlx, ow) and some missing lines from other keymap definitions (apl).
      • Restored the automatic keyboard unlock delay when processing a macro or string. This allows macros and strings with embedded AID sequences to work with hosts that unlock the keyboard before they finish processing a command. Scripts are presumed to be able to figure out when the host is finished, or can set the unlockDelay resource to true get the delay all the time.
      • Fixed an apparent hang (actually just extreme slowness) when the host sends a message larger than 4 Kbytes on an SSL tunnel.
      • Removed spurious 'Wait timed out' errors in the Wait action.
    • New Features:
      • Added a newer, more flexible version of Don Russell's RPQNAMES support.
      • Added support for IPv6.
      • Added an oldclick keymap to restore the pre-3.3 mouse click behavior.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta2, 1. February 2005

    • Bug Fixes:
      • Reduced the Resident Set Size (RSS) of x3270 from about 40 MBytes to less than 4 MBytes. This was a bug in how compiled-in app-defaults files were generated.
      • Got separate app-defaults files (configure --enable-app-defaults) to work again.
      • Fixed a crash when a login macro is used in NVT mode or when the host un-negotiates TN3270E mode.
      • Fixed the titles of the Copyright and Configuration pop-ups.
      • Temporarily disabled the RPQNAMES Query Reply. It was causing IBM QMF to crash. It can be re-enabled by adding #define X3270_RPQNAMES 1 to conf.h. Hopefully a proper fix can be found shortly.
    • New Features:

    Changes in x3270, c3270, s3270 and tcl3270 3.3.3beta1, 31. December 2004

    • Bug Fixes:
      • The Transfer() action did not work at all -- it generated (null) as the name of the IND$FILE command. Also improved its behavior when invoked from a script or macro in x3270 and c3270.
      • Corrected the definition of the hebrew (code page 424) character set, removing undefined characters.
      • Corrected the display character set for the brazilian (code page 275) character set.
      • Corrected the character set definition logic so that undefined ASCII codes are truly undefined in NVT mode.
      • Corrected the ibm_hosts file (the hostsFile resource or the -hostsfile option). Variable and tilde substitution are now performed on the value, and if a non-default value is specified and the file does not exist, an error pop-up is generated.
      • Added a pause to make sure that c3270 start-up error messages will be seen.
      • Got the c3270 default field colors right, and made all-bold mode actually make all the fields bold.
      • Fixed the default primary/alternate screen size (it was alternate, it's supposed to be primary).
      • Fixed c3270 color support with ncurses and 80/132 screen-size switching. Sometimes only one of the screen sizes had color.
      • Fixed a memory leak in pr3287 when the -reconnect option is used. (Thanks to Marcelo Lemos for the fix.)
      • Fixed the output of NVT-mode ANSI line-drawing characters in the Ascii() scripting action. These were formerly all output as blanks; now they are output in the same was as x3270 3.2.
      • Fixed the display of NVT-mode ANSI line-drawing characters when x3270 is using a 3270 font.
      • Fixed the display of DBCS blanks, which sometimes displayed as 'undefined' characters.
      • Fixed DBCS character display with fonts whose maximum bounds are larger than their reported line-spacing bounds.
      • Fixed make depend.
      • Fixed x3270_glue.expect, which got confused when there was a whitespace-delimited double-quote in the emulator output.
      • Fixed crashes when the entire File or Options menus were suppressed.
      • Fixed a scripting hang when an UNBIND command arrived while an AID was pending.
      • Fixed a problem with the incomplete processing of a NULLing Program Tab order, which could leave formatting artifacts on the screen.
      • Removed <subchar1> clauses in two of the .ucm files that prevents later versions of ICU's makeconv from accepting them, and removed DOS carriage-return characters from the CP837 .ucm file.
      • Corrected some DFT-mode file upload problems: corrected the data length, and corrected an empty-buffer problem when the file size was an even multiple of the buffer size.
      • Corrected a DBCS conversion problem with ICU 3.0.
      • Added variable buffer-size support to DFT file transfers.
      • Corrected a line-drawing character bug in c3270.
      • Fixed a buffer overflow problem in the ReadBuffer action.
      • Fixed garbage characters generated for APL data by the Ascii and ReadBuffer actions.
      • Allow 0 timeouts in Wait actions.
    • New Features:
      • Added command-line options to the pr3287 trace file.
      • Added support for dead keys (acute, grave, circumflex, tilde, diaeresis) to the x3270 default keymap, and improved the Latin-1 compose map. (Thanks to Marcelo Lemos for the change.)
      • Added new actions for improved mouse interactions, and made them the default. Button 1 now moves the cursor, without the Shift key.
      • Added support for DBCS in pr3287, but only when started from an x3270 or c3270 session.
      • Added Don Russell's RPQNAMES support.
      • Removed Minolta-copyrighted 5250 code, because of licensing problems.
      • Added an aidWait toggle to allow AID script actions (Clear, Enter, PA and PF) to complete immediately without waiting for the host to unlock the keyboard, and a Wait(Unlock) action action to block a script until the keyboard is unlocked, regardless of the state of the new toggle.
      • Removed the old scripting hack that delayed actually unlocking the keyboard for 50ms after the host indicates that it should be unlocked. Added an unlockDelay resource, which can be set to true to turn the delay hack back on.
      • Added a dftBufferSize resource to set the default DFT buffer size.
      • Added an x3270 Save Screen Text menu option to save the screen image in a file, optionally in HTML.
      • Added options to the PrintText action to save to a file, to save HTML, and to return the text as script data.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.2, 1. December 2003

    • Bug Fixes:
      • Corrected an x3270 screen-redraw crash when using fixedSize and xim.
      • Corrected a problem in x3270_glue.expect, which caused Tcl syntax errors if a string began with a dash. Thanks to David Taylor for the fix.
      • Fixed a problem with x3270 DBCS input when using a single DBCS/SBCS character set.
      • Made DBCS encoding recognition automatic wherever possible, leaving the -km option for cases when x3270 can't figure it out from the locale.
      • Made c3270's configure more robust when it can't find one or the other of libncurses or ncurses.h.
      • Got automatic pr3287 start-up (-printerlu) working again in c3270.
      • Fixed an s3270 crash which made s3270 3.3.1alpha10 pretty much useless.
    • New Features:
      • Added support for Cyrillic keysyms to the x3270 Default() action.
      • Added an 'unlocked' icon for unencrypted connections, if x3270 is built with SSL/TLS support.
      • Error messages are now written to the trace file.
      • The response to the TELNET TIMING MARK option has been changed to make it compatible with the majority of TELNET clients. The response to DO TIMING MARK is now WONT TIMING MARK. To restore the previous behavior (responding with WILL TIMING MARK, originally derived from the BSD TELNET client), set the resource x3270.bsdTm to true.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha10, 29. August 2003

    • Bug Fixes:
      • Made nondisplay fields invisible to the Ascii() action.
      • Corrected start-field values at the beginning of data stream traces and in the 3270 Read Buffer response.
      • Corrected a tight loop in the macro error cancellation logic.
      • Corrected a crash when connecting to a host and there is no menu bar visible.
      • Corrected x3270 crashes in monochrome mode (-mono) and pseudo-color mode (-model 3278).
    • New Features:
      • Added a ReadBuffer() action to dump the entire contents of the 3270 buffer, including field attributes and extended attributes.
      • Added support for suppress resources for each menu item. If set to True, that menu item will not appear.
      • Added a suppressActions resource, a list of the names of actions to disable. This is primarily for controlled environments where the user does not have access to the x3270 command line, but can edit keymap definitions.
      • Added a Setverbose function to x3270_glue.expect to allow verbosity to be changed on the fly. (Courtesy of David Taylor.)
      • Added the ability to define resources in an environment variable, $X3270RDB. The environment variable overrides values set in the profile file, but is overridden by command-line options.
      • Added a fixedSize resource to force the x3270 main window to a particular size. fixedSize has the form widthxheight, in pixels. The 3270 display will float in the center of the window, if need be.
      • Added a new x3270 keypad position (x3270.keypad): insideRight. This positions the keypad on top of the upper right-hand corner of the x3270 window, just under the keypad button on the menu bar.

    Changes in pr3287 3.3.1alpha10, 10. August 2003

    • Enhancements:
      • Added support for the -tracedir option, to specify a directory to store trace files in.
      • Added support the the -eojtimeout option, to automatically flush any pending print job after a specified period of inactivity.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha9, 24. July 2003

    • Bug Fixes:
      • DBCS character set names are displayed in the x3270 Options->Font menu only when DBCS support is built into x3270.
      • Removed the concept of 'per-host' resources. Use profiles for this.
      • Fixed idle commands. They were pretty much hopeless in 3.3.1alpha8 and 3.2.20.
      • Fixed a Unicode conversion crash.
      • Fixed a bug in processing the Modify Field order, which would cause the character set attribute for the field to be accidentally reset to the default.
    • New Features:
      • x3270 user-specified lists (character sets, hosts, fonts, color schemes) can now be organized into sub-lists. The name Bob>Fred>Tony specifies that there is a sub-list called Bob, which contains a sub-list Fred, which contains the item Tony.
      • The TELNET START-TLS option is now supported.

    Changes in pr3287 3.3.1alpha9, 30. July 2003

    • Bug Fixes:
      • Ignore SIGINT in the print job process, so that killing an interactive pr3287 with ^C won't cause buffered data to be lost.
      • Fixed a problem with losing a byte of data after an SHF order.
      • Fixed the SCS HT order, which was completely broken.
    • Enhancements:
      • Added support for SIGUSR1 to flush the print job.
      • Added support for the TELNET START-TLS option.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1alpha8, 15. April 2003

    • Bug Fixes:
      • Builds cleanly on Linux with -Wall -ansi -pedantic.
      • Builds without OpenSSL libraries being present.
      • Correctly records Field Attributes in the initial screen snapshot in a Data Stream Trace file.
      • Auto-Skip fields work properly.
      • "Dead" positions in DBCS fields are handled correctly.
      • Invalid host DBCS characters are handled better and are displayed in the Data Stream Trace file.
      • The Erase action now works properly with DBCS characters.
      • The x3270 Visible Control Characters toggle now works properly.
      • The EBCDIC notsign '¬' can now be entered in c3270 with Ctrl-A, ^ (it formerly caused an error message).
    • New Features:
      • The Erase action is now the default for the BackSpace key in x3270.
      • Ctrl-A, a is now mapped onto the Attn action in the c3270 default 3270 keymap.
      • Four more Japanese host code pages have been added: 930, 939, 1390 and 1399. This uses new support for combined SBCS/DBCS code pages.

    Changes in x3270, c3270, s3270 and tcl3270 3.3.1, 14. February 2003

    • Bug Fixes:
      • (Same as x3270 3.2.20)
    • New Features:
      • DBCS support for Simplified Chinese and Japanese, including x3270 integration with XIM.
      • Tunneled SSL support added (entire Telnet session inside of an SSL tunnel). Uses the OpenSSL library. Toggled with an 'L:' prefix on the hostname.
      • A Visible Control Characters toggle replaces x3270's 3270d Debug Font.
      • About x3270 pop-up split into three smaller pieces.
    suite3270-3.6/x3270/html/Resources.html0000664000076500007650000033461113221600611015554 0ustar pdmpdm x3270 Resources

    x3270 Resources

    Resources are used to configure x3270. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into x3270.
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The x3270 app-defaults file (only if x3270 is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
    • If a session file foo.x3270 is specified on the command line, its contents are applied. Otherwise, if the x3270 profile (~/.x3270pro) exists, it is read and its contents are applied. These definitions override resource values defined by X11 methods and compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example x3270.bsdTm can be set by the following command-line option:
         -xrm "x3270.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file (app-defaults file, profile or session file) has the following syntax.
    • Each definition consists of:
          x3270.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          x3270.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        

    Alphabetical Resource List

    Name: x3270.acceptHostname
    Type: String
    Command Line: -accepthostname
    Description:

    Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.)

    Name: x3270.activeIcon
    Type: Boolean
    Default: false
    Command Line: -activeicon
    Description:

    When true, x3270's icon becomes a live miniature of the screen display.

    Name: x3270.aidWait
    Type: Boolean
    Default: false
    Command Line: -set aidWait , -clear aidWait
    Description:

    When true, x3270 will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll x3270's status until it shows that the keyboard is no longer unlocked.

    Name: x3270.allowResize
    Type: Boolean
    Default: true
    Description:

    When true, the x3270 window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it.

    Name: x3270.altCursor
    Type: Boolean
    Default: false
    Command Line: -set altCursor , -clear altCursor
    Option: Options -> Toggles -> Underline Cursor
    Option: Options -> Toggles -> Block Cursor
    Description:

    When true, this causes x3270 to use the alternate (underscore) cursor. When false, it will use a block cursor.

    Name: x3270.aplCircledAlpha
    Type: Boolean
    Default: false
    Description:

    When set to true, allows x3270 to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with x3270.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point.

    Name: x3270.aplMode
    Type: Boolean
    Default: false
    Command Line: -apl
    Description:

    Enables x3270 APL mode. APL mode appends apl to the list of names in x3270.keymap (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets x3270.composeMap to apl (allowing Compose key sequences to construct complex APL symbols), and sets x3270.charset to apl (allowing the display of APL symbols using several of the 3270 fonts).

    Name: x3270.background
    Type: String
    Default: white
    Command Line: -bg , -rv
    Description:

    The background color for menus, buttons, and on monochrome X11 displays, the emulator window.

    Name: x3270.bellVolume
    Type: Integer
    Description:

    Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by x3270.visualBell, which if true, will replace the bell with a flash of the screen.

    Name: x3270.bindLimit
    Type: Boolean
    Default: true
    Description:

    When true, x3270 will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not.

    Name: x3270.bindUnlock
    Type: Boolean
    Default: false
    Description:

    When true, x3270 will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing x3270 to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op.

    Name: x3270.blankFill
    Type: Boolean
    Default: false
    Command Line: -set blankFill , -clear blankFill
    Option: Options -> Toggles -> Blank Fill
    Description:

    When true, in 3270 mode x3270 will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals.

    Name: x3270.boldColor
    Type: String
    Default: green
    Description:

    This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of x3270 implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of x3270, select 3278 emulation with x3270.model, set x3270.inputColor to orange and set x3270.boldColor to cyan.

    Name: x3270.bsdTm
    Type: Boolean
    Default: false
    Description:

    Defines x3270's response to the TELNET DO TIMING MARK option. When set to false, x3270 will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, x3270 will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of x3270. In either case, x3270 will never respond to a DONT TIMING MARK option.

    Name: x3270.caDir
    Type: String
    Command Line: -cadir
    Description:

    Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: x3270.caFile
    Type: String
    Command Line: -cafile
    Description:

    Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only)

    Name: x3270.certFile
    Type: String
    Command Line: -certfile
    Description:

    Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by x3270.certFileType. The private key for the certificate is specified by x3270.keyFile. If x3270.chainFile is specified, it overrides x3270.certFile.

    On the Mac, the file must be in PKCS12 format.

    Name: x3270.certFileType
    Type: String
    Default: pem
    Command Line: -certfiletype
    Description:

    Gives the type of the certificate file specified by x3270.certFile. The value can be pem or asn1. (OpenSSL only)

    Name: x3270.chainFile
    Type: String
    Command Line: -chainfile
    Description:

    Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by x3270.keyFile. If x3270.chainFile is specified, it overrides x3270.certFile. (OpenSSL only)

    Name: x3270.charClass
    Type: String
    Description:

    Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name.

    Name: x3270.charset
    Type: String
    Default: bracket
    Command Line: -charset
    Option: Options -> Character Set
    Description:

    This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by x3270, use the -v command-line option.

    Name: x3270.clientCert
    Type: String
    Command Line: -clientcert
    Description:

    Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only)

    Name: x3270.color8
    Type: Boolean
    Default: false
    Description:

    If true, x3270 will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported.

    Name: x3270.colorBackground
    Type: String
    Default: black
    Description:

    The background color for the emulator window. This resource is used only on color X11 displays when x3270.model specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by x3270.colorScheme.

    Name: x3270.colorScheme
    Type: String
    Default: default
    Option: Options -> Color Scheme
    Description:

    Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when x3270.model specifies a 3279 display. x3270.colorScheme is just the name of the color scheme. The actual color scheme definition for color scheme foo is x3270.colorScheme.foo.

    Name: x3270.colorScheme.foo
    Type: String
    Description:

    An individual color scheme definition. I.e., to define color scheme foo, a resource named x3270.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer.

    Name: x3270.composeMap
    Type: String
    Default: latin1
    Description:

    Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource x3270.composeMap.foo.

    Name: x3270.composeMap.foo
    Type: String
    Description:

    An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive.

    Name: x3270.confDir
    Type: String
    Default: /usr/local/etc/x3270
    Description:

    Defines the x3270 configuration directory, where x3270 will search for the ibm_hosts file by default. (See x3270.hostsFile.)

    Name: x3270.connectFileName
    Type: String
    Default: ~/.x3270connect
    Description:

    Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of x3270 that run under the same username.

    Name: x3270.connectTimeout
    Type: Integer
    Command Line: -connecttimeout
    Description:

    Specifies a timeout, in seconds, that x3270 will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that x3270 will wait for the lesser of the two times (the specified timeout and the system-defined timeout).

    Name: x3270.crosshair
    Type: Boolean
    Default: false
    Command Line: -set crosshair , -clear crosshair
    Option: Options -> Toggles -> Crosshair Cursor
    Description:

    When true, causes x3270 to display a crosshair over the cursor: lines extending with height and width of the screen.

    Name: x3270.crosshairColor
    Type: String
    Default: purple
    Description:

    Defines the color used for the crosshair cursor (see x3270.crosshair). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15

    Name: x3270.cursorBlink
    Type: Boolean
    Default: false
    Command Line: -set cursorBlink , -clear cursorBlink
    Option: Options -> Toggles -> Blinking Cursor
    Description:

    When true, causes x3270 to use a blinking cursor.

    Name: x3270.cursorColor
    Type: String
    Default: red
    Description:

    On color X11 displays, this is the color of the text cursor. This resource is used only if x3270.useCursorColor is true.

    Name: x3270.cursorPos
    Type: Boolean
    Default: true
    Command Line: -set cursorPos , -clear cursorPos
    Option: Options -> Toggles -> Track Cursor
    Description:

    When true, causes x3270 to display the cursor location in the OIA (the status line).

    Name: x3270.dbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use x3270.sbcsCgcsgid for the single-byte (SBCS) character set.

    Name: x3270.debugTracing
    Type: Boolean
    Default: true
    Description:

    If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed.

    Name: x3270.dftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Deprecated resource -- replaced by x3270.ftBufferSize

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: x3270.devName
    Type: String
    Command Line: -devname
    Description:

    Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: x3270.disconnectClear
    Type: Boolean
    Default: false
    Description:

    If true, x3270 will clear the screen when a host disconnects.

    Name: x3270.doConfirms
    Type: Boolean
    Default: true
    Description:

    When true, x3270 will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed.

    Name: x3270.dsTrace
    Type: Boolean
    Default: false
    Command Line: -trace , -set dsTrace , -clear dsTrace
    Description:

    Deprecated resource -- replaced by x3270.trace

    When true, x3270 writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. The command run in the window is defined by x3270.traceCommand. The directory where the file is written is defined by x3270.traceDir. If x3270.traceFile is defined, it gives the entire pathname and x3270.traceDir is ignored.

    Name: x3270.emulatorFont
    Type: String
    Default: 3270
    Command Line: -efont
    Option: Options -> Font
    Description:

    The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (x3270.charset). However, the special OIA (status line) symbols are only available with the 3270 fonts.

    Name: x3270.eof
    Type: String
    Default: ^D
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when x3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    Name: x3270.erase
    Type: String
    Default: ^?
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (x3270 gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause x3270 to discard the last character on the input line.

    When connected in character-at-a-time mode (x3270 sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action.

    Name: x3270.eventTrace
    Type: Boolean
    Default: false
    Command Line: -set eventTrace , -clear eventTrace
    Description:

    Deprecated resource -- replaced by x3270.trace

    When true, x3270 traces information about keyboard and mouse events into a file. The default file name is x3trc.pid. It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. The command run in the window is defined by x3270.traceCommand. The directory where the file is written is defined by x3270.traceDir. If x3270.traceFile is defined, it gives the entire pathname and x3270.traceDir is ignored.

    Name: x3270.extended
    Type: Boolean
    Default: false
    Command Line: -extended
    Description:

    Deprecated resource -- replaced by x3270.model syntax

    Indicates support for the 3270 Extended Data Stream.

    Name: x3270.fixedSize
    Type: String
    Description:

    Specifies a fixed size for the x3270 display window. If set, x3270 will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary.

    Name: x3270.foreground
    Type: String
    Default: black
    Command Line: -fg , -rv
    Description:

    The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display.

    Name: x3270.ftAllocation
    Type: String
    Default: default
    Description:

    Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock.

    Name: x3270.ftAvblock
    Type: Integer
    Description:

    Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers.

    Name: x3270.ftBlksize
    Type: Integer
    Description:

    Defines the default block size for files sent to TSO hosts by IND$FILE file transfers.

    Name: x3270.ftBufferSize
    Type: Integer
    Default: 4096
    Description:

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action.

    Name: x3270.ftCr
    Type: String
    Default: auto
    Description:

    Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done.

    Name: x3270.ftDirection
    Type: String
    Default: receive
    Description:

    Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation).

    Name: x3270.ftExist
    Type: String
    Default: keep
    Description:

    Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file.

    Name: x3270.ftHost
    Type: String
    Default: tso
    Description:

    Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics.

    Name: x3270.ftHostFile
    Type: String
    Description:

    Defines the default host file name for IND$FILE file transfers.

    Name: x3270.ftLocalFile
    Type: String
    Description:

    Defines the default local file name for IND$FILE file transfers.

    Name: x3270.ftLrecl
    Type: Integer
    Description:

    Defines the default logical record length for files sent to the host via IND$FILE.

    Name: x3270.ftMode
    Type: String
    Default: ascii
    Description:

    Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation).

    Name: x3270.ftPrimarySpace
    Type: Integer
    Description:

    Defines the default primary space allocation for files sent to TSO hosts via IND$FILE.

    Name: x3270.ftRecfm
    Type: String
    Default: default
    Description:

    Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format.

    Name: x3270.ftRemap
    Type: String
    Default: yes
    Description:

    Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by x3270 to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37.

    Name: x3270.ftSecondarySpace
    Type: Integer
    Description:

    Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE.

    Name: x3270.highlightBold
    Type: Boolean
    Default: false
    Description:

    If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font.

    Name: x3270.hostname
    Type: String
    Description:

    Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over x3270.hostname.

    The most common use of x3270.hostname is in session files, where a file is used to pass all of the options to establish a x3270 session.

    Name: x3270.hostsFile
    Type: String
    Default: /usr/local/etc/x3270/ibm_hosts
    Description:

    The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by x3270.confDir.

    Name: x3270.httpd
    Type: String
    Command Line: -httpd
    Description:

    Defines the TCP port and optional address to listen on for HTTP connections. (x3270 implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: x3270.iconFont
    Type: String
    Default: nil2
    Description:

    The font used to paint the text inside the active icon (see x3270.activeIcon). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image.

    Name: x3270.iconLabelFont
    Type: String
    Default: 8x13
    Description:

    When x3270.activeIcon and x3270.labelIcon are true, this is the name of the font used to paint the icon label.

    Name: x3270.icrnl
    Type: Boolean
    Default: true
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines.

    Name: x3270.idleCommand
    Type: String
    Description:

    When x3270.idleCommand is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The x3270.idleCommand can be an arbitrary sequence of x3270 actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). x3270.idleCommandEnabled must be true in order for the x3270.idleCommand to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) x3270.idleTimeout specifies the inactivity interval.

    Name: x3270.idleCommandEnabled
    Type: Boolean
    Default: false
    Description:

    Controls whether x3270.idleCommand has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.)

    Name: x3270.idleTimeout
    Type: String
    Default: ~7m
    Description:

    The timeout value for x3270.idleCommand. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified.

    Name: x3270.inlcr
    Type: Boolean
    Default: false
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns.

    Name: x3270.inputColor
    Type: String
    Default: green
    Description:

    This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of x3270 implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of x3270, select 3278 emulation with x3270.model, set x3270.inputColor to orange and set x3270.boldColor to cyan.

    If the resource x3270.modifiedSel is true, modified fields are also displayed using x3270.inputColor.

    Name: x3270.inputMethod
    Type: String
    Command Line: -im
    Description:

    Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale.

    Name: x3270.intr
    Type: String
    Default: ^C
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host.

    Name: x3270.invertKeypadShift
    Type: Boolean
    Default: false
    Description:

    When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed.

    Name: x3270.keyFile
    Type: String
    Command Line: -keyfile
    Description:

    Gives the name of a file containg the private key for the certificate specified by x3270.certFile or x3270.chainFile. The default file type is PEM; it can be overridden by x3270.keyFileType. If the private key is encrypted, the password is specified by x3270.keyPasswd. (OpenSSL only)

    Name: x3270.keyFileType
    Type: String
    Default: pem
    Command Line: -keyfileType
    Description:

    Gives the type of the private key file specified by x3270.keyFile. The value can be pem or asn1. (OpenSSL only)

    Name: x3270.keyHeight
    Type: Integer
    Default: 24
    Description:

    Defines the height of the keys on the pop-up keypad.

    Name: x3270.keymap
    Type: String
    Command Line: -keymap
    Description:

    The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a x3270.keymap value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270.

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six.

    If no x3270.keymap is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. x3270.keymap is only the name; the keymap definition for name foo is the resource x3270.keymap.foo.

    Name: x3270.keymap.foo
    Type: String
    Description:

    The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax.

    Name: x3270.keypad
    Type: String
    Default: right
    Description:

    This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main x3270 window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main x3270 window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar

    Name: x3270.keypad.keyHeight
    Type: Integer
    Default: 24
    Description:

    The height in pixels of all of the buttons on the keypad.

    Name: x3270.keyPasswd
    Type: String
    Command Line: -keypasswd
    Description:

    On OpenSSL, gives the password for the private key file specified by x3270.keyFile, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the x3270.certfile certifiate file.

    Name: x3270.keyWidth
    Type: Integer
    Default: 48
    Description:

    The width in pixels of the lower tier of buttons on a horizontal keypad.

    Name: x3270.keypad.largeKeyWidth
    Type: Integer
    Default: 56
    Description:

    The width in pixels of the lower tier of buttons on a vertical keypad.

    Name: x3270.keypad.paWidth
    Type: Integer
    Default: 36
    Description:

    The width in pixels of PA and cursor keys on the keypad.

    Name: x3270.keypad.pfWidth
    Type: Integer
    Default: 32
    Description:

    The width in pixels of PF keys on the keypad.

    Name: x3270.keypadBackground
    Type: String
    Default: grey70
    Description:

    On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap.

    Name: x3270.keypadOn
    Type: Boolean
    Default: false
    Description:

    If true, the keypad will automatically appear when x3270 is started.

    Name: x3270.kill
    Type: String
    Default: ^U
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when x3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when x3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action.

    Name: x3270.labelIcon
    Type: Boolean
    Default: false
    Description:

    When x3270.activeIcon is true, the twm window manager will not put a label on x3270's icon. Setting x3270.labelIcon to true causes x3270 to supply its own label for the icon.

    The icon label is drawn using the font specified by x3270.iconLabelFont.

    Name: x3270.largeKeyWidth
    Type: Integer
    Default: 56
    Description:

    Defines the width of the "large" keys in the lower section of the pop-up keypad.

    Name: x3270.lineWrap
    Type: Boolean
    Default: true
    Command Line: -set lineWrap , -clear lineWrap
    Option: Options -> Toggles -> Wraparound
    Description:

    This setting is used only in NVT mode. When true, x3270 will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence.

    Name: x3270.loginMacro
    Type: String
    Command Line: -loginmacro
    Description:

    Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a x3270.hostsFile is in use and a matching entry is found, the login macro from that entry will be used in preference to the x3270.loginMacro.

    Name: x3270.lnext
    Type: String
    Default: ^V
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when x3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered.

    Name: x3270.lockedCursor
    Type: String
    Default: X_cursor
    Description:

    The name of the mouse cursor displayed with x3270 is not connected to a host.

    Name: x3270.m3279
    Type: Boolean
    Default: true
    Command Line: -color
    Description:

    Deprecated resource -- replaced by x3270.model syntax

    Indicates support for color (a 3279 terminal).

    Name: x3270.macros
    Type: String
    Description:

    Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    x3270.macros defines a set of macros for all hosts. To specify a set of macros for host foo, use x3270.macros.foo.

    Name: x3270.macros.foo
    Type: String
    Description:

    Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of x3270.macros. See x3270.macros for details on its syntax.

    Name: x3270.marginedPaste
    Type: Boolean
    Default: false
    Command Line: -set marginedPaste , -clear marginedPaste
    Option: Options -> Toggles -> Paste With Left Margin
    Description:

    When true, x3270 will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon.

    Name: x3270.maxRecent
    Type: Integer
    Default: 5
    Description:

    The maximum number of entries in the Connect menu's recent host list.

    Name: x3270.menuBar
    Type: Boolean
    Default: true
    Description:

    If false, the menu bar will not be displayed at the top of the x3270 main window. The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons.

    Name: x3270.model
    Type: String
    Default: 3279-4-E
    Command Line: -model
    Option: Options -> Screen Size
    Description:

    The terminal model that x3270 is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays.
      3279 specifies a color 3270 display. This is the default for color X11 displays.
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is 4.
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.

    Name: x3270.modifiedSel
    Type: Boolean
    Default: false
    Description:

    When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by x3270.inputColor. In 3279 mode, this is the color whose index is defined by x3270.modifiedSelColor. When x3270.modifiedSel is false, modified fields are displayed in the same colors as unmodified fields.

    Name: x3270.modifiedSelColor
    Type: Integer
    Default: 10
    Description:

    In 3279 mode, when x3270.modifiedSel is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See x3270.colorSchemes for the host color index definitions.)

    Name: x3270.mono
    Type: Boolean
    Default: false
    Command Line: -mono
    Description:

    If true, x3270 will operate as if it were running on a monochrome X11 display.

    Name: x3270.monoCase
    Type: Boolean
    Default: false
    Command Line: -set monoCase , -clear monoCase
    Option: Options -> Toggles -> Monocase
    Description:

    When true, causes x3270 to run in uppercase-only mode.

    Name: x3270.newEnviron
    Type: Boolean
    Default: true
    Description:

    If true, x3270 will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not.

    Name: x3270.noOther
    Type: Boolean
    Default: false
    Description:

    If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus.

    Name: x3270.normalCursor
    Type: String
    Default: top_left_arrow
    Description:

    Defines the mouse cursor that x3270 uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked.

    Name: x3270.nopSeconds
    Type: Integer
    Description:

    If nonzero, x3270 will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity.

    Name: x3270.normalColor
    Type: String
    Default: green
    Description:

    On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color.

    Name: x3270.numericLock
    Type: Boolean
    Default: false
    Description:

    When true, causes x3270 to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute.

    Name: x3270.nvtMode
    Type: Boolean
    Default: false
    Command Line: -nvt
    Description:

    When true, causes x3270 to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname.

    Name: x3270.onlcr
    Type: Boolean
    Default: true
    Description:

    Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences.

    Name: x3270.oerrLock
    Type: Boolean
    Default: true
    Description:

    If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message.

    Name: x3270.once
    Type: Boolean
    Default: false
    Command Line: -once
    Description:

    When true, x3270 will exit as soon as a host disconnects. The default is false if no hostname is specified on the command line or in a session file, true otherwise.

    Name: x3270.overlayPaste
    Type: Boolean
    Default: false
    Command Line: -set overlayPaste , -clear overlayPaste
    Option: Options -> Toggles -> Overlay Paste
    Description:

    When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause x3270 to act as if the x3270.marginedPaste toggle were also set.

    Name: x3270.oversize
    Type: String
    Command Line: -oversize
    Description:

    Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. It is used only if the x3270.model includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with x3270 in this mode.

    Name: x3270.paWidth
    Type: Integer
    Default: 36
    Description:

    Defines the width of the PA keys in the lower section of the pop-up keypad.

    Name: x3270.pfWidth
    Type: Integer
    Default: 32
    Description:

    Defines the width of the PF keys on the pop-up keypad.

    Name: x3270.port
    Type: String
    Default: telnet
    Command Line: -port
    Description:

    The name of the default TCP port for x3270 to connect to. This can be either a symbolic name from /etc/services, or an integer.

    Name: x3270.proxy
    Type: String
    Command Line: -proxy
    Description:

    Defines a proxy server that x3270 will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the x3270 manual page.

    Name: x3270.preeditType
    Type: String
    Default: OverTheSpot+1
    Command Line: -pt
    Description:

    The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2.

    Name: x3270.printerLu
    Type: String
    Command Line: -printerlu
    Description:

    If a value is set, x3270 will automatically start a pr3287 printer session when a host connection is established. If the value is ".", the pr3287 session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session.

    Name: x3270.printer.assocCommandLine
    Type: String
    Default: pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H%
    Description:

    Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use x3270.printer.options.

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when x3270.printerLU is "."). Within the string, the following substitutions are made:

    • %C% is replaced with the x3270.printer.command
    • %H% is replaced with the current host name
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of x3270.printer.options
    • %P% is replaced with the current session's proxy option (x3270.proxy)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options

    Name: x3270.printer.command
    Type: String
    Default: lpr
    Description:

    The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in x3270.printer.assocCommandLine and x3270.printer.luCommandLine resources.

    Name: x3270.printer.luCommandLine
    Type: String
    Default: pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H%
    Description:

    Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use x3270.printer.options.

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

    • %C% is replaced with x3270.printer.command
    • %H% is replaced with the current host name
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of x3270.printer.options
    • %P% is replaced with current session's proxy option (x3270.proxy)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options

    Name: x3270.printer.options
    Type: String
    Description:

    Defines extra parameters to substutute for the %O% token in the printer command line.

    Name: x3270.printTextCommand
    Type: String
    Default: lpr
    Description:

    The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear.

    Name: x3270.printTextScreensPerPage
    Type: Integer
    Default: 1
    Description:

    The number of screens to display on a page when tracing screens to the printer.

    Name: x3270.printWindowCommand
    Type: String
    Default: xwd -id %d | xpr | lpr
    Description:

    The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear.

    Name: x3270.quit
    Type: String
    Default: ^\
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when x3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host.

    Name: x3270.reconnect
    Type: Boolean
    Default: false
    Description:

    When true, x3270 will automatically reconnect to a host after it disconnects.

    Name: x3270.rectangleSelect
    Type: Boolean
    Default: false
    Command Line: -set rectangleSelect , -clear rectangleSelect
    Option: Options -> Toggles -> Select by Rectangles
    Description:

    When true, x3270 will always select rectangular areas of the screen. When false, x3270 will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm.

    Name: x3270.rprnt
    Type: String
    Default: ^R
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when x3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed.

    Name: x3270.saveLines
    Type: Integer
    Default: 4096
    Command Line: -sl
    Description:

    The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved.

    Name: x3270.sbcsCgcsgid
    Type: String
    Description:

    Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use x3270.dbcsCgcsgid for the double-byte (DBCS) character set.

    Name: x3270.schemeList
    Type: String
    Description:

    Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme.

    Name: x3270.screenTrace
    Type: Boolean
    Default: false
    Command Line: -set screenTrace , -clear screenTrace
    Option: File -> Save Screen(s) in File
    Description:

    When true, x3270 will save an ASCII version of the screen image in a file every time it changes. The file name defaults to x3scr.pid. The directory where the file is written is defined by x3270.traceDir. If x3270.screenTraceFile is defined, it defines the file name and x3270.traceDir is ignored.

    Name: x3270.screenTraceFile
    Type: String
    Description:

    If defined, gives the name of the file that screen traces will be written into.

    Name: x3270.scripted
    Type: Boolean
    Default: false
    Command Line: -script
    Description:

    When true, x3270 will read commands from standard input. The rules for these commands are documented in the x3270-script manual page.

    Name: x3270.scriptPort
    Type: Integer
    Command Line: -scriptport
    Description:

    If defined, x3270 will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1.

    Name: x3270.scriptPortOnce
    Type: Boolean
    Default: false
    Command Line: -scriptportonce
    Description:

    If defined, x3270 will accept only one script connection. When that connection is broken, it will exit.

    Name: x3270.scrollBar
    Type: Boolean
    Default: false
    Command Line: -sb , +sb , -set scrollBar , -clear scrollBar
    Description:

    When true, x3270 will display a scroll bar to the right of the emulator window.

    Name: x3270.secure
    Type: Boolean
    Default: false
    Description:

    When true, x3270 will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and x3270.disconnectClear is true. See x3270.noOther and x3270.suppressActions for additional security options.

    Name: x3270.selectBackground
    Type: String
    Default: dimGrey
    Description:

    On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video.

    Name: x3270.showTiming
    Type: Boolean
    Default: false
    Command Line: -set showTiming , -clear showTiming
    Option: Options -> Toggles -> Show Timing
    Description:

    When true, x3270 will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent.

    Name: x3270.socket
    Type: Boolean
    Default: false
    Command Line: -socket
    Description:

    When true, x3270 will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket.

    Name: x3270.startTls
    Type: Boolean
    Default: true
    Description:

    If true, x3270 will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them.

    Name: x3270.*suppress
    Type: Boolean
    Description:

    When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress

    Name: x3270.suppressActions
    Type: String
    Description:

    A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options.

    Name: x3270.suppressFontMenu
    Type: Boolean
    Default: false
    Description:

    If true, the Options -> Font menu will not be displayed.

    Name: x3270.suppressHost
    Type: Boolean
    Default: false
    Description:

    If true, x3270 will omit the hostname from the File -> About x3270 -> Connection Status pop-up.

    Name: x3270.termName
    Type: String
    Command Line: -tn
    Description:

    An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of x3270.model.

    Name: x3270.title
    Type: String
    Command Line: -title
    Description:

    Sets the title for the x3270 window, overriding the default of constructing the name from the host that is connected to.

    Name: x3270.trace
    Type: Boolean
    Default: false
    Command Line: -trace , -set trace , -clear trace
    Option: File -> Trace Data and Events
    Description:

    When true, x3270 writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to x3trc.pid. It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. The command run in the window is defined by x3270.traceCommand. The directory where the file is written is defined by x3270.traceDir. If x3270.traceFile is defined, it gives the entire pathname and x3270.traceDir is ignored.

    Name: x3270.traceCommand
    Type: String
    Default: tail -f
    Description:

    Defines the command that runs in the trace window.

    Name: x3270.traceDir
    Type: String
    Default: /tmp
    Description:

    Defines the directory that trace files are written into.

    Name: x3270.traceFile
    Type: String
    Command Line: -tracefile
    Description:

    If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created.

    Name: x3270.traceFileSize
    Type: String
    Command Line: -tracefilesize
    Description:

    If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started.

    Name: x3270.traceMonitor
    Type: Boolean
    Default: true
    Description:

    When true, x3270 will create a window to monitor data stream and event traces. When false, no monitor window will be created (and the value of none for x3270.traceFile will be considered invalid).

    Name: x3270.unlockDelay
    Type: Boolean
    Default: true
    Description:

    When x3270 sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, x3270 implements a hack to briefly delay actually unlocking the keyboard. When x3270.unlockDelay is true (the default), the keyboard unlock will be delayed for x3270.unlockDelayMs milliseconds. Setting it to false removes this delay.

    Name: x3270.unlockDelayMs
    Type: Integer
    Default: 350
    Description:

    Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and x3270 actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros.

    Name: x3270.useCursorColor
    Type: Boolean
    Default: false
    Description:

    If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by x3270.cursorColor.

    Name: x3270.user
    Type: String
    Command Line: -user
    Description:

    Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777).

    Name: x3270.verifyHostCert
    Type: Boolean
    Default: true
    Command Line: -noverifycert , -verifycert
    Description:

    If true (the default), x3270 will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, x3270 will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking.

    Name: x3270.visibleControl
    Type: Boolean
    Default: false
    Command Line: -set visibleControl , -clear visibleControl
    Option: Options -> Toggles -> Visible Control Characters
    Description:

    If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, displayed with underlines, are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, displayed in yellow with underlines, are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified

    Name: x3270.visualBell
    Type: Boolean
    Default: false
    Description:

    When true, x3270 will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell.

    Name: x3270.visualSelect
    Type: Boolean
    Default: false
    Description:

    This resource controls how x3270 displays light pen selectable fields that do not have a color explicitly set by the host. When true, x3270 will display these fields using the color defined by x3270.visualSelectColor. When false, x3270 will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode.

    Name: x3270.visualSelectColor
    Type: Integer
    Default: 6
    Description:

    The host color index of the color to use to display light pen selectable fields. This resource is used only if x3270.visualSelect is true. The default is 6 (yellow).

    Name: x3270.waitCursor
    Type: String
    Default: watch
    Description:

    The name of the mouse cursor displayed when x3270 is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>.

    Name: x3270.werase
    Type: String
    Default: ^W
    Description:

    This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when x3270 gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when x3270 sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action.

    Index of All Resources

    acceptHostname activeIcon aidWait allowResize
    altCursor aplCircledAlpha aplMode background
    bellVolume bindLimit bindUnlock blankFill
    boldColor bsdTm caDir caFile
    certFile certFileType chainFile charClass
    charset clientCert color8 colorBackground
    colorScheme colorScheme.foo composeMap composeMap.foo
    confDir connectFileName connectTimeout crosshair
    crosshairColor cursorBlink cursorColor cursorPos
    dbcsCgcsgid debugTracing dftBufferSize devName
    disconnectClear doConfirms dsTrace emulatorFont
    eof erase eventTrace extended
    fixedSize foreground ftAllocation ftAvblock
    ftBlksize ftBufferSize ftCr ftDirection
    ftExist ftHost ftHostFile ftLocalFile
    ftLrecl ftMode ftPrimarySpace ftRecfm
    ftRemap ftSecondarySpace highlightBold hostname
    hostsFile httpd iconFont iconLabelFont
    icrnl idleCommand idleCommandEnabled idleTimeout
    inlcr inputColor inputMethod intr
    invertKeypadShift keyFile keyFileType keyHeight
    keymap keymap.foo keypad keypad.keyHeight
    keyPasswd keyWidth keypad.largeKeyWidth keypad.paWidth
    keypad.pfWidth keypadBackground keypadOn kill
    labelIcon largeKeyWidth lineWrap loginMacro
    lnext lockedCursor m3279 macros
    macros.foo marginedPaste maxRecent menuBar
    model modifiedSel modifiedSelColor mono
    monoCase newEnviron noOther normalCursor
    nopSeconds normalColor numericLock nvtMode
    onlcr oerrLock once overlayPaste
    oversize paWidth pfWidth port
    proxy preeditType printerLu printer.assocCommandLine
    printer.command printer.luCommandLine printer.options printTextCommand
    printTextScreensPerPage printWindowCommand quit reconnect
    rectangleSelect rprnt saveLines sbcsCgcsgid
    schemeList screenTrace screenTraceFile scripted
    scriptPort scriptPortOnce scrollBar secure
    selectBackground showTiming socket startTls
    *suppress suppressActions suppressFontMenu suppressHost
    termName title trace traceCommand
    traceDir traceFile traceFileSize traceMonitor
    unlockDelay unlockDelayMs useCursorColor user
    verifyHostCert visibleControl visualBell visualSelect
    visualSelectColor waitCursor werase

    Basic Configuration Resources

    charset connectTimeout hostname keymap
    model port proxy printerLu

    Appearance Resources

    activeIcon altCursor aplCircledAlpha background
    boldColor colorBackground colorScheme colorScheme.foo
    crosshair crosshairColor cursorBlink cursorColor
    cursorPos emulatorFont fixedSize foreground
    highlightBold iconFont iconLabelFont inputColor
    keyHeight keypad keypad.keyHeight keyWidth
    keypad.largeKeyWidth keypad.paWidth keypad.pfWidth keypadBackground
    keypadOn labelIcon largeKeyWidth lockedCursor
    menuBar modifiedSel modifiedSelColor normalCursor
    normalColor paWidth pfWidth selectBackground
    showTiming title useCursorColor visualSelect
    visualSelectColor waitCursor

    NVT-Mode Resources

    eof erase icrnl inlcr
    intr kill lineWrap lnext
    onlcr quit rprnt werase

    Protocol Resources

    bindLimit bindUnlock bsdTm color8
    dbcsCgcsgid dftBufferSize devName ftBufferSize
    sbcsCgcsgid termName user

    Terminal Interaction Resources

    blankFill ftAllocation ftAvblock ftBlksize
    ftCr ftDirection ftExist ftHost
    ftHostFile ftLocalFile ftLrecl ftMode
    ftPrimarySpace ftRecfm ftRemap ftSecondarySpace
    idleCommand idleCommandEnabled idleTimeout marginedPaste
    maxRecent nopSeconds numericLock nvtMode
    oerrLock overlayPaste rectangleSelect visualBell

    Security Resources

    acceptHostname caDir caFile certFile
    certFileType chainFile clientCert debugTracing
    keyFile keyFileType keyPasswd noOther
    secure startTls *suppress suppressActions
    verifyHostCert

    Tracing Resources

    debugTracing dsTrace eventTrace screenTrace
    screenTraceFile trace traceDir traceFile
    traceFileSize traceMonitor

    Other Resources

    aidWait allowResize aplMode bellVolume
    charClass composeMap composeMap.foo confDir
    connectFileName disconnectClear doConfirms hostsFile
    httpd inputMethod invertKeypadShift keymap.foo
    loginMacro macros macros.foo mono
    monoCase newEnviron once oversize
    preeditType printer.assocCommandLine printer.command printer.luCommandLine
    printer.options printTextCommand printTextScreensPerPage printWindowCommand
    reconnect saveLines schemeList scripted
    scriptPort scriptPortOnce scrollBar socket
    suppressFontMenu suppressHost traceCommand unlockDelay
    unlockDelayMs visibleControl

    Deprecated Resources

    extended m3279

    x3270 version 3.6ga4 Fri Dec 29 21:01:29 CST 2017 suite3270-3.6/x3270/html/SSL.html0000664000076500007650000002103713221600611014236 0ustar pdmpdm x3270 and TLS

    x3270 and TLS

    x3270 supports secure communication via the Transport Layer Security protocol (TLS), formerly called the Secure Sockets Layer (SSL). (The text below refers to x3270, but the descriptions apply to all of the members of the suite.)

    A secure connection can be negotiated immediately by specifying the L: prefix on the hostname (e.g., L:foo.whatever.net), or can be negotiated later via the TELNET STARTTLS option, which is initiated by the host after the connection has been established.

    TLS on Unix (except MacOS)

    On Unix (except for MacOS), x3270 TLS support uses the OpenSSL library. Much of the information below is common to many OpenSSL clients and more extensive documentation is available on the Web.

    A Note on PEM Format

    PEM (Privacy Enhanced Mail) is a text file format used for TLS certificates and private keys. It is easily recognized by headers like the following:

      -----BEGIN CERTIFICATE-----

    A certificate is the text between (and including) the BEGIN CERTIFICATE and END CERTIFICATE headers. A private key is the text between (and including) the BEGIN RSA PRIVATE KEY and END RSA PRIVATE KEY headers. A PEM-format file can contain multiple certificates and keys.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying the Server's Root Certificate

    If your host's certificate was not signed by a well-known certificate authority (CA), you can configure x3270 to accept it by specifying an alternate set of root certificate(s).

    The -cafile option (or the caFile resource) can be used to specify a file containing one or more server root certificates. This file must be in PEM format.

    If there are a large number of certificates, the -cadir option (or the caDir resource) can be used to specify a directory containing root certificates. This directory contains files that use the naming convention of hash.seq, where hash is the hash of the certificate value and seq is a sequence number (since multiple certificates could have the same hash) starting with 0.

    If your host uses a self-signed certificate, x3270 will not normally allow TLS authentication with it. To allow authentication with self-signed certificates, set the selfSignedOk resource to true.

    Updating the Root Certificate Database

    To avoid having to specify a root certificate for each invocation of x3270, one or more certificates can be added to the OpenSSL root certificate database. On Unix, this procedure is (unfortunately) an operating-system- and release- specific procedure. However, the OpenSSL root certificate database is common to all OpenSSL applications on your workstation, so instructions on updating it should be easily found on the web.

    Specifying a Certificate for the Client (the Emulator)

    If you have been issued a certificate and a private key to allow your client (the emulator) to be authenticated by your host, there are several options that allow this to be specified to x3270.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. By default, this file is in PEM format, but it can also be in ASN1 format, which is specified by setting the -certfiletype option (or the certFileType resource) to the value asn1.

    The -chainfile option (or the chainFile resource) defines a PEM-format file containing both the client certificate and any intermediate certificates that were used to sign it. If a chain file is specified, it is used instead of the certificate file.

    Specifying the Private Key for the Client Certificate

    The file containing the private key for the client certificate can be specified by the -keyfile option or the keyFile resource. This file is in PEM format by default, but can be in ASN1 format, by specifying the -keyfiletype option or the keyFileType resource with the value asn1.

    If no explicit key file is specified, the default is to find the private key in the chain file or the client certificate file (whichever was specified).

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, self-signed certificates are not allowed. To allow self-signed host certificates, set the selfSignedOk resource to true or specify the -selfsignedok option.

    Also, when host certificates are verified, the name in the host's certificate is checked. This check can be controlled by the acceptHostname resource or the -accepthostname option. The value can be any, which disables hostname checking, or a specific hostname to use for comparison. (The form DNS:hostname is also available for backwards-compatibility.)

    TLS on MacOS

    On MacOS, x3270 uses Secure Transport for TLS.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the keychain.

    The -certfile option (or the certFile resource) defines a file containing the client certificate. The file must be in PKCS12 format.

    Specifying a Password for the Client Certificate File

    If the private key is encrypted, then a password must be specified. x3270 and c3270 will prompt for a password interactively. For the other emulators, the password is given with the -keypasswd option or the keyPasswd resource. (These also work with x3270 and c3270.) The password can have one of two formats. The format file:filename specifies a file containing the password. The format string:string specifies the password as a string in the option or resource directly.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare.

    TLS on Windows

    wc3270, ws3270 and wpr3287 use the native Windows Schannel APIs for TLS. This means that the emulators' TLS support is limited by the functionality supported by the underlying OS, but it benefits from OS fixes and updates over time without any need to update the app.

    Options and Resources

    TLS is controlled by a number of different command-line options and resources.

    Specifying a Certificate for the Client (the Emulator)

    The -clientcert option (or the clientCert resource) gives the name of a client certificate to be used. This certificate must be installed in the Personal certificate store.

    Controlling Host Certificate Verification

    By default, host certificates are always verified. To disable host certificate verification, set the verifyHostCert resource to false or specify the -noverifycert option.

    When host certificates are verified, the name in the host's certificate is compared to the name used to establish the connection. The acceptHostname resource or the -accepthostname option can be used to specify a different name to compare. suite3270-3.6/x3270/html/Wishlist.html0000664000076500007650000000155613221577164015427 0ustar pdmpdm The x3270 Wish List

    The x3270 Wish List

    Here is a list of some of the more interesting suggestions and requests made for x3270. You may also take this as a list of functions that are definitely not in this version of x3270.

    There is no guarantee that anyone is actively working on these, but feel free to yourself...

    • Support for the rest of the extended attributes: field outlining, extended validation, etc.
    • Support for GDDM bit-mapped graphics.
    • Data-entry assists like local columnar tabs, automatic line wrap, etc.
    suite3270-3.6/x3270/html/x3270.jpg0000664000076500007650000000744213221577164014220 0ustar pdmpdmÿØÿàJFIFÿþJ CREATOR: XV Version 3.10a Rev: 12/29/94 Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÀ ddÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?ð<®ÆÃc8ùq×ñ«ú&‹¨øX‡KÒí¾Ó}>ï.-ê™Ú¥,@è ëÚºñðSâsÿö@è>ÛoÏþD¦Ÿ‚¿€Ü<=û}·ÿ㔣à§Ä,|=œvûm¿ùð[âLJrN0~Ûøý/ü)Oˆ@Œx Óí¿?ù‘~ üCØðÿÈÝÓ-ùÿÇè?>!mÚ<;Èê~ÛoÏþD¥o‚ßFTø,ÝÛ`ÿâëÖô]KÚ´úV­oö{Øvù±oWÆT0åI QlnÊœ…êØþ•ièº6£â-V'J·ûMýÎï.-ê™Ú¥,@è ëÚ¾ÚÑ´K J·Ót¨|‹wm‹s7V,ybOROZKÝjÆÇTÓô¹®1¨yŸe‹c~óË]ÏÈ<‘žÕŸ§ø×ÃÚœš9±¿ó¶üï±&Eó|œùWåÆÞÆ{f?ÆþÔŽö=CzjþwØ?s óü¬ùWåÛƒ÷±žÙ¬kæóþýþ6û{ß}·ñ*ò¿´ögÛ÷>^=·b¯x_Äö6k7‰?µu Síd¼û Aö)˜¿ÈhãœgÍhéþ5ðö¨Ú9±Ô<ÏíŸ;ì?¹yþN|Ϊ6íÁûØÏlÒiÞ4ðîª4_±j`Ö<ÿ°&Açy9ó:¨ÛŒ½ŒöÍhhšÍ‡ˆt›}SJºóìfÝåËå²ïÃ<0`‚:V—ÄC·ÍáN5³åýœ~ïæù×wúÏ—înëüëæCãŸjÜø³Á¿ÛZäŸñó¨jImçc…ýÜkµpWޏÏS^}^…ðW‹zq?hÁÎ3û‰+êvïR±Òå¸ÒôÿíKÕÇ—eç,oÌùÛ…À%½ñŽõâŸòäøH»ÿnŸð”y—ØþÍo7o|Òq«ðü$]ÿ·OøJ<ËìfÇ·›·¾iä/È?ðwþÝ?á(ò?/±ý›ÞnÞù¤ãWàøH»ÿnŸð”y—ØþÍo7o|ÒÿÈ_á :ïýºÂQä~_cû6=¼Ý½óIƯÀð wþÝ?á(ò?/±ý›ÞnÞù¥9ÕÔ®?á m{£gìŸð“ù—ØþÍo7o|Õí[¿¶Ö!Ôô›í›ÝWw—&Å·ÿ„›ÊR§†³û0Ïaæã¾kÜkàEzÁA‹ºÆûFïÄ•ôÏ,¥àûË/ì?íå—fl~×ö_7)ÿYü8Æï}¸ï^GƯÉ?ð wþÝ?á(ò?/±ý›ÞnÞù¥ÿ¿Â@ußûtÿ„£Èü¾Çöl{y»{æ“_’á ïýºÂQä~_cû6=¼Ý½óKÿ!~ÿ„€ë¿öéÿ G‘ù}ìØöóv÷Í'¿$ÿÂ@5ßûtÿ„£Èü¾Çöl{y»{æ—þBüÿ ×íÓþ#òûÙ±íæíïš\ _åaý»ý»ÿn¿ð“ù—ØþÍo7o|Òaµ†Æ?á!]w©ÿOøIüËìfÇ·›·¾kßëàEzÁ\ÂÞÐÇý|sëû‰+é¿X OÂ7ֿؿۂO/wÚ¾ÍæâE?ë?‡Ýï·ëȾm^Fþ'ë®ãlñëÿ 7‘ïÇØþÍo7o|ÖýÿƒÏÇÝÿY·ž´íGÁ>!•µƒy¦mù¾OÛÿÒ#¶ÿ„‡òú7ú/Ùøû¿ë6óÖ‹ÿx‚_ít½³þÙó<Ÿ¶·›¿ü$8Ç—Ñ¿Ñ|Ž:¬Ç=k7ZÑõ ]bm#U¶þÙÔ5]¾|;ÖßþO)C/̧Ÿg<æã¾kÜ«àEzÁeâÞ„1ÿ?úþâJúwƶ?Ú~¿³]ûo—;í_fó°êÖñ·Ýï·ëÌt]oQ´ÕàÕt«í›Ý[w—.Å·ÿ„›ÊR§†³û0Èè<ÜwÍh_êÁ_Ûƒ®gè¶>G›7Ù<ßì øqò¸-uç³0àŸ/>•¿â_‡^ÿ„BÖÊÓÂÛÙ[ÿ³ôÿí-óæÈ Ÿ¼-õo›=01šÀÒŽiáhþ+oìíÃìßiÐ1$ßÙ{ä,¿éüÓy­¶N Ù½*ÿ€|%¨iZ«Ü[øwþ+!µØ}µoÿ´~V ûÂI‹Ë'w{~JÀÖ¾ø3WÕ®<3á}ì÷Öû´5/´ÌÿÙÛ”Iî¤p%óeùOËÔ×A.§øûâ/Š´Ÿ[}¾ÃDû'ö|[Ú/#·tœÆT¶âŠ~bqŽ1YöÄ><øI£ê¿ñ<2yßoÑÿwmý£‰ÊÇûá·Êòöù~öܵìð¢½࢓ñ_E+óßï?儘¯ªµÍOñ“.“ªÛ}¦Æ|y©æ2gk©¨ y€ÿ„‡Â~. í rû¨ýÜ_ð’lñ[O³£{y¸õ«Ú/‹tý3KµÓ<#áï>Ê]ÿðŽ/ÛY´0Å®¹f/,–ÿX~oáíX7‘ø7YÒ4í.ÃÂ?Ú–)æÿÂ-ö”Ðhe·]òpbòÈ'÷§æÇËÖ´?µü=yàöð®á¯í÷þ@Vßn’í=’y—3 Ðùl ùÈÝ—ŠÏÐãðf“¬Ãªø?Â_i¿Ÿwü#²hÌŸÚ;T­ÏdEå‚ßëÍ—µt6~0Ó“VÔõohm»×ü¯ìÉ~ØÑÿkù ¶^q”7˜ øã5›âm[ÃÞ¶÷QûÙ#ûL'—1gä>îGµx…z—¯ØxsFñ%µÏ‰°o¯~Ëök¿°µÖÍŒåþ@9ãïgµuÃÇêíøÓ·Õ¿áÏé¶øÿœÿÂîúøE?ûSãðð?ìTÿìiùÏü.ï¡ÿ„Sÿ±¥>?ññ¿þÅOþÆøÿœÿÂîúøE?ûSãðð?ìTÿìiWÇÀ6æøÛ¹{øEqÿ²×;ãOü?¸ñmöºöŸð—iyºó'°û—§\~ó^ƒnÏzàüMãoxÀ[ {RûZÛnò?q{wcwÜQŸº:úW<êÜOZmQEQEQEÿÙsuite3270-3.6/x3270/html/x3270-man.html0000664000076500007650000025404013221600611015133 0ustar pdmpdm x3270 Manual Page

    x3270 Manual Page

    Contents

    Name
    Synopsis
    Description
    Options
    Fonts
    Character Sets
    Character Classes
    Keypad
    Hosts Database
    Color Schemes
    NVT Mode
    Menus
    Status Line
    Icons
    Keymaps
    The PrintText Action
    Macros and Scripts
    Composite Characters
    APL Support
    XIM Support
    Screen Printing
    Bugs
    Passthru
    Proxy
    Files
    Environment Variables
    See Also
    Copyrights
    Version

    Name

    x3270 - IBM host access tool

    Synopsis

    x3270 [options] [host]
    x3270 [options] session-file.x3270

    Description

    x3270 opens a telnet connection to an IBM host in an X window. It implements RFCs 2355 (TN3270E), 1576 (TN3270) and 1646 (LU name selection), and supports IND$FILE file transfer. The window created by x3270 can use its own font for displaying characters, so it is a fairly accurate representation of an IBM 3278 or 3279. It is similar to tn3270(1) except that it is X-based, not curses-based. The full syntax for host is:
    [prefix:]...[LUname@]hostname[:port][=accept]

    Prepending a P: onto hostname causes the connection to go through the telnet-passthru service rather than directly to the host. See PASSTHRU below.

    Prepending an S: onto hostname removes the "extended data stream" option reported to the host. See -tn below for further information.

    Prepending an N: onto hostname turns off TN3270E support for the session.

    Prepending an L: onto hostname causes x3270 to first create an SSL/TLS tunnel to the host, and then create a TN3270 session inside the tunnel. (This function is supported only if x3270 was built with SSL/TLS support). Note that TLS-encrypted sessions using the TELNET START-TLS option are negotiated with the host automatically; for these sessions the L: prefix should not be used.

    Prepending a Y: onto hostname causes x3270 to skip validation of host SSL/TLS certificates. This overrides any other configuration or command-line options.

    Prepending an A: onto hostname is equivalent to setting the -nvt option; it forces an NVT-mode session instead of a 3270-mode session.

    A specific Logical Unit (LU) name to use may be specified by prepending it to the hostname with an `@'. Multiple LU names to try can be separated by commas. An empty LU can be placed in the list with an extra comma. (Note that the LU name is used for different purposes by different kinds of hosts. For example, CICS uses the LU name as the Terminal ID.)

    The hostname may optionally be placed inside square-bracket characters `[' and `]'. This will prevent any colon `:' characters in the hostname from being interpreted as indicating option prefixes or port numbers. This allows numeric IPv6 addresses to be used as hostnames.

    On systems that support the forkpty library call, the hostname may be replaced with -e and a command string. This will cause x3270 to connect to a local child process, such as a shell.

    The port to connect to defaults to telnet. This can be overridden with the -port option, or by appending a port to the hostname with a colon `:'. (For compatability with previous versions of x3270 and with tn3270(1), the port may also be specified as a second, separate argument.)

    An optional accept name (a hostname to accept in the host's SSL/TLS certificate) may be specified by appending it to the hostname with an equals sign (`='). The accept name can also be specified with the -accepthostname option.

    Options

    x3270 is a toolkit based program, so it understands standard Xt options and resources. It also understands the following options:
    -accepthostname name
    Specifies a particular hostname to accept when validating the name presented in the server SSL certificate, instead of comparing to the name used to make the connection.
    -activeicon
    Specifies that the icon should be a miniature version of the screen image. See ICONS below.
    -apl
    Sets up APL mode. This is actually an abbreviation for several options. See APL SUPPORT below.
    -cadir directory
    Specifies a directory containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -cafile filename
    Specifies a PEM-format file containing CA (root) certificates to use when verifying a certificate provided by the host. (OpenSSL only)
    -cc range:value[,...]
    Sets character classes. See CHARACTER CLASSES, below.
    -certfile filename
    Specifies a file containing a client certificate to provide to the host. The default file type is PEM.
    -clientcert name
    Specifies the name of a client certificate to provide to the host. (MacOS only)
    -certfiletype type
    Specifies the type of the certificate file specified by -certfile. Type can be pem or asn1. (OpenSSL only)
    -chainfile filename
    Specifies a certificate chain file in PEM format, containing a certificate to provide to the host, as well as one or more intermediate certificates and the CA certificate used to sign that certificate. If -chainfile is specified, it overrides -certfile. (OpenSSL only)
    -charset name
    Specifies an EBCDIC host character set. See CHARACTER SETS below.
    -clear toggle
    Sets the initial value of toggle to false. The list of toggle names is under MENUS below.
    -connecttimeout seconds
    Specifies the time that x3270 will wait for a host connection to complete.
    -devname name
    Specifies a device name (workstation ID) for RFC 4777 support.
    -efont name
    Specifies a font for the emulator window. See FONTS below.
    -hostsfile file
    Uses file as the hosts file, which allows aliases for host names and scripts to be executed at login. See ibm_hosts(1) for details.
    -httpd [addr:]port
    Specifies a port and optional address to listen on for HTTP connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4080 to specify the IPv6 loopback address and TCP port 4080.

    Note that this option is mutually-exclusive with the -scriptport option .

    -iconname name
    Specifies an alternate title for the program icon.
    -iconx x
    Specifies the initial x coordinate for the program icon.
    -icony y
    Specifies the initial y coordinate for the program icon.
    -im method
    Specifies the name of the input method to use for multi-byte input. (Supported only when x3270 is compiled with DBCS support.)
    -keyfile filename
    Specifies a file containing the private key for the certificate file (specified via -certfile or -chainfile). The default file type is PEM. (OpenSSL only)
    -keyfiletype type
    Specifies the type of the private key file specified by -keyfile. Type can be pem or asn1. (OpenSSL only)
    -keypasswd type:value
    Specifies the password for the private key file (OpenSSL) or client certificate file (MacOS), if it is encrypted. The argument can be file:filename, specifying that the password is in a file, or string:string, specifying the password on the command-line directly. If the private key file is encrypted and no -keypasswd option is given, the password will be prompted for interactively.
    -keymap name
    Specifies a keymap name and optional modifiers. See KEYMAPS below.
    -keypad
    Turns on the keypad as soon as x3270 starts.
    -km name
    Specifies the local encoding method for multi-byte text. name is an encoding name recognized by the ICU library. (Supported only when x3270 is compiled with DBCS support, and necessary only when x3270 cannot figure it out from the locale.)
    -loginmacro Action(arg...) ...
    Specifies a macro to run at login time.
    -model name
    The model of 3270 display to be emulated. The model name is in two parts, either of which may be omitted:

    The first part is the base model, which is either 3278 or 3279. 3278 specifies a monochrome (green on black) 3270 display; 3279 specifies a color 3270 display.

    The second part is the model number, which specifies the number of rows and columns. Model 4 is the default.

    Model Number
    Columns
    Rows
    2
    80
    24
    3
    80
    32
    4
    80
    43
    5
    132
    27

    Note: Technically, there is no such 3270 display as a 3279-4 or 3279-5, but most hosts seem to work with them anyway.

    The default model for a color X display is 3279-4. For a monochrome X display, it is 3278-4.

    -mono
    Forces x3270 to believe it is running on a monochrome X display.
    -noverifycert
    For SSL/TLS connections, do not verify the host certificate.
    -nvt
    Start in NVT mode instead of waiting for the host to send data, and make the default terminal type xterm.
    -once
    Causes x3270 to exit after a host disconnects. This option has effect only if a hostname is specified on the command line.
    -oversize colsxrows
    Makes the screen larger than the default for the chosen model number. This option has effect only in combination with extended data stream support (controlled by the "x3270.extended" resource), and only if the host supports the Query Reply structured field. The number of columns multiplied by the number of rows must not exceed 16383 (3fff hex), the limit of 14-bit 3270 buffer addressing.
    -port n
    Specifies a different TCP port to connect to. n can be a name from /etc/services like telnet, or a number. This option changes the default port number used for all connections. (The positional parameter affects only the initial connection.)
    -printerlu luname
    Causes x3270 to automatically start a pr3287 printer session. If luname is ".", then the printer session will be associated with the interactive terminal session (this requires that the host support TN3270E). Otherwise, the value is used as the explicit LU name to associate with the printer session.
    -proxy type:host[:port]
    Causes x3270 to connect via the specified proxy, instead of using a direct connection. The host can be an IP address or hostname. The optional port can be a number or a service name. For a list of supported proxy types, see PROXY below.
    -pt type
    Specifies the preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. The default value is OverTheSpot+1. (Supported only when x3270 is compiled with DBCS support.)
    -reconnect
    Causes x3270 to automatically reconnect to the host if it ever disconnects. This option has effect only if a hostname is specified on the command line.
    -sb
    Turns on the scrollbar.
    +sb
    Turns the scrollbar off.
    -scheme name
    Specifes a color scheme to use in 3279 mode. This option has effect only in combination with 3279 emulation. See COLOR SCHEMES below.
    -script
    Causes x3270 to read commands from standard input, with the results written to standard output. The protocol for these commands is documented in x3270-script(1).
    -sl n
    Specifies that n lines should be saved for scrolling back. The default is 4096.
    -scriptport [addr:]port
    Specifies a port and optional address to listen on for scripting connections. Addr can be specified as `*' to indicate 0.0.0.0; the default is 127.0.0.1. IPv6 numeric addresses must be specified inside of square brackets, e.g., [::1]:4081 to specify the IPv6 loopback address and TCP port 4081.

    Note that this option is mutually-exclusive with the -httpd option .

    -scriptportonce
    Allows x3270 to accept only one script connection. When that connection is broken, x3270 will exit.
    -secure
    Disables run-time features that could compromise system security (user-specified file names and commands, etc.).
    -set toggle
    Sets the initial value of toggle to true. The list of toggle names is under MENUS below.
    -socket
    Causes the emulator to create a Unix-domain socket when it starts, for use by script processes to send commands to the emulator. The socket is named /tmp/x3sck.pid. The -p option of x3270if causes it to use this socket, instead of pipes specified by environment variables.
    -tn name
    Specifies the terminal name to be transmitted over the telnet connection. The default name is IBM-model_name-E, for example, IBM-3279-4-E for a color X display, or IBM-3278-4-E for a monochrome X display.

    Some hosts are confused by the -E suffix on the terminal name, and will ignore the extra screen area on models 3, 4 and 5. Prepending an s: on the hostname, or setting the "x3270.extended" resource to "false", removes the -E from the terminal name when connecting to such hosts.

    The name can also be specified with the "x3270.termName" resource.

    -trace
    Turns on data stream tracing at startup. Unlike turning it on from a menu option, there is no pop-up to confirm the file name, which defaults to /tmp/x3trc.
    -tracefile file
    Specifies a file to save data stream and event traces into. If the name starts with `>>', data will be appended to the file. If the value stdout is given, then traces will be written to standard output. If the value none is given, then traces will be piped directly to the monitor window, and no file will be created.
    -tracefilesize size
    Places a limit on the size of a trace file. If this option is not specified, or is specified as 0 or none, the trace file size will be unlimited. The minimum size is 64 Kbytes. The value of size can have a K or M suffix, indicating kilobytes or megabytes respectively. When the trace file reaches the size limit, it will be renamed with a `-' appended and a new file started.
    -user name
    Specifies the user name for RFC 4777 support.
    -v
    Display the version and build options for x3270 and exit.
    -verifycert
    For SSL/TLS connections, verify the host certificate, and do not allow the connection to complete unless it can be validated. (This is the default setting.) This option is overridden by a y: prepended to the hostname when connecting.

    After reading resource definitions from the X server and any standandard X11 resource definition files ($HOME/.Xdefaults, etc.), x3270 will read definitions from the file $HOME/.x3270pro. This file contains local customizations and is also used to save changed options by the Save Changed Options in File menu option.

    Note that -xrm options override any definitions in the .x3270pro file.

    Fonts

    x3270 does not use the "*font" resource for its main window. Instead, it uses a custom 14-point font called 3270, which is a close approximation of a real 3270 display and allows x3270 to display the ISO 8859-1 (Latin-1) character set and special status-line symbols. A more compact font, 3270-12, is also supported, as are the various sized fonts 3270gt8, 3270gt12, 3270gt16, 3270-20, 3270gt24, and 3270gt32. The fonts 3270h and 3270gr are also included to allow display of Hebrew and Greek text, respectively.

    The font may be specified with the -efont option or the "x3270.emulatorFont" resource.

    x3270 can also use any X11 font that implements the display character set required by the host EBCDIC character set.

    An additional font, 3270d, is supplied. This font is identical to the default 3270 font, except that it has bitmaps defined for field attribute characters. This means that field attributes, which are normally displayed as blanks, are now visible on the screen. The characters displayed are hexadecimal codes, which can be translated using a document provided with the x3270 sources.

    The font can be changed at any time through a menu option. It can also be implicitly changed by changing the size of the x3270 window with the mouse: if the window is made larger, x3270 will try to change to a larger font, and vice-versa.

    Character Sets

    The -charset option or the "x3270.charset" resource controls the EBCDIC host character set used by x3270. Available sets include:

    Charset Name
    Host Code Page
    Display Character Sets
    apl
    037
    3270cg-1a
    belgian
    500
    3270cg-1a 3270cg-1 iso8859-1
    belgian-euro
    1148
    3270cg-15a 3270cg-15 iso8859-15
    bracket
    037
    3270cg-1a 3270cg-1 iso8859-1
    brazilian
    275
    3270cg-1a 3270cg-1 iso8859-1
    chinese-gb18030
    1388
    3270cg-1a iso8859-1 + iso10646-1
    cp1047
    1047
    3270cg-1a 3270cg-1 iso8859-1
    cp870
    870
    3270cg-1a 3270cg-1 iso8859-2
    finnish
    278
    3270cg-1a 3270cg-1 iso8859-1
    finnish-euro
    1143
    3270cg-15a 3270cg-15 iso8859-15
    french
    297
    3270cg-1a 3270cg-1 iso8859-1
    french-euro
    1147
    3270cg-15a 3270cg-15 iso8859-15
    german
    273
    3270cg-1a 3270cg-1 iso8859-1
    german-euro
    1141
    3270cg-15a 3270cg-15 iso8859-15
    greek
    423
    3270cg-7 iso8859-7
    hebrew
    424
    3270cg-8 iso8859-8
    icelandic
    871
    3270cg-1a 3270cg-1 iso8859-1
    icelandic-euro
    1149
    3270cg-15a 3270cg-15 iso8859-15
    italian
    280
    3270cg-1a 3270cg-1 iso8859-1
    italian-euro
    1144
    3270cg-15a 3270cg-15 iso8859-15
    japanese-kana
    930
    jisx0201.1976-0 + jisx0208.1983-0
    japanese-latin
    939
    jisx0201.1976-0 + jisx0208.1983-0
    norwegian
    277
    3270cg-1a 3270cg-1 iso8859-1
    norwegian-euro
    1142
    3270cg-15a 3270cg-15 iso8859-15
    russian
    880
    koi8-r
    simplified-chinese
    935
    3270cg-1a iso8859-1 + gb2312.1980-0
    slovenian
    870
    iso8859-2
    spanish
    284
    3270cg-1a 3270cg-1 iso8859-1
    spanish-euro
    1145
    3270cg-15a 3270cg-15 iso8859-15
    swedish
    278
    3270cg-1a 3270cg-1 iso8859-1
    swedish-euro
    1143
    3270cg-15a 3270cg-15 iso8859-15
    thai
    1160
    iso8859-11 tis620.2529-0
    traditional-chinese
    937
    3270cg-1a iso8859-1 + Big5-0
    turkish
    1026
    iso8859-9
    uk
    285
    3270cg-1a 3270cg-1 iso8859-1
    uk-euro
    1146
    3270cg-15a 3270cg-15 iso8859-15
    us-euro
    1140
    3270cg-15a 3270cg-15 iso8859-15
    us-intl
    037
    3270cg-1a 3270cg-1 iso8859-1

    The default character set is bracket, which is useful for common U.S. IBM hosts which use EBCDIC codes AD and BD for the `[' and `]' characters, respectively.

    Note that any of the host code pages listed above can be specified by adding cp to the host code page, e.g., cp037 for host code page 037. Also note that the code pages available for a given version of x3270 are displayed by the -v command-line option.

    Most 3270 fonts implement the 3270cg-1 display character set, which is a reordered version of the ISO 8859-1 character set. Some implement the 3270cg-1a display character set, which is a superset of 3270cg-1 that includes APL2 characters. 3270h and 3270gr implement special character sets for Hebrew and Greek, respectively.

    You can also specify national-language translations for your keyboard; see KEYMAPS below.

    Character Classes

    x3270 supports character classes (groupings of characters chosen with a double mouse click) in the same manner as xterm(1). The "x3270.charClass" resource or the -cc option can be used to alter the character class table. The default table is the same as xterm's; It groups letters together, and puts most punctuation characters in individual classes. To put all non-whitespace characters together in the same class (and duplicate the behavior of some early versions of x3270, use the following value:

    33-127:48,161-255:48

    See xterm(1) for further syntax details.

    Keypad

    A keypad may optionally be displayed, with a mouse-clickable button for each 3270 function key (these functions are also available from the keyboard). The keypad can be turned on and off by clicking on the "keypad" button in the upper-right-hand corner of the window. The "x3270.keypad" resource controls where it is displayed. Options are:

    left in a separate window, to the left of the screen
    right in a separate window, to the right of the screen
    bottom in a separate window, below the screen
    integral in the same window as the screen, below it

    The default is right.

    If the "x3270.keypadOn" resource is set to true, the keypad will be displayed at startup.

    Hosts Database

    x3270 uses the ibm_hosts database to construct a pull-down menu of hosts to connect to. It also allows host name aliases to be defined, as well as specifying macros to be executed when a connection is first made. See ibm_hosts(5) for details.

    You may specify a different ibm_hosts database with the "x3270.hostsFile" resource.

    Color Schemes

    When emulating a 3279 display, the X colors used to draw the display are selected by two resources: the "x3270.colorScheme" resource, which gives the name of the color scheme to use, and the individual "x3270.colorScheme.xxx" resources, which give the actual definitions. The color scheme resources are documented in the Resources file with the x3270 source.

    The color scheme may also be changed while x3270 is running with a selection from the Options menu.

    NVT Mode

    Some hosts use an ASCII front-end to do initial login negotiation, then later switch to 3270 mode. x3270 will emulate an ANSI X3.64 terminal until the host places it in 3270 mode (telnet BINARY and SEND EOR modes, or TN3270E mode negotiation). The emulation is fairly complete; however, it is not intended to make x3270 a replacement for xterm(1).

    If the host later negotiates to stop functioning in 3270 mode, x3270 will return to NVT emulation.

    In NVT mode, x3270 supports both character-at-a-time mode and line mode operation. You may select the mode with a menu option. When in line mode, the special characters and operational characteristics are defined by resources:

    Mode/Character Resource Default
    Translate CR to NL x3270.icrnl true
    Translate NL to CR x3270.inlcr false
    Erase previous character x3270.erase ^?
    Erase entire line x3270.kill ^U
    Erase previous word x3270.werase ^W
    Redisplay line x3270.rprnt ^R
    Ignore special meaning of next character x3270.lnext ^V
    Interrupt x3270.intr ^C
    Quit x3270.quit ^\
    End of file x3270.eof ^D

    Separate keymaps can be defined for use only when x3270 is in 3270 mode or NVT mode. See KEYMAPS for details.

    Menus

    x3270 has a menu bar with three pull-down menus (File, Options, and Connect) and a button to turn the keypad on and off. The pull-down menus are also available as pop-up menus by using the "Ctrl" key and the left, middle and right mouse buttons, respectively.

    The menu bar can be turned off by setting the "x3270.menuBar" resource to false.

    Many sections of the File and Options menus are toggles, options that may be either on or off. The entries under the File menu are as follows:

    File Transfer
    Initiates transferring a file between the IBM host and the local workstation, using the IND$FILE protocol. A pop-up menu allows specifying the file names and other attributes of the transfer.
    The IND$FILE program must be installed on the IBM host, and the 3270 cursor must be located in a field that will accept a TSO or VM/CMS command.
    Printer Session
    Starts or stops a printer session.
    Trace Data and Events
    If set, network traffic (both a hexadecimal representation and its interpretation) is logged to the file /tmp/x3trc.pid, and a window is popped up to monitor the data. The file name is confirmed with a pop-up; the default directory name for the trace file can be changed with the "x3270.traceDir" resource. Keyboard and mouse events are also traced. This is useful for creating and debugging custom keymaps, macros and scripts. For example, it will tell you precisely what action was taken in response to pressing a particular key. If the key is not mapped, it will tell you the keysym name and keycode so you can add it to a custom keymap.
    Save Screen Contents
    Allows the contents of the screen to be saved. A dialog allows selection between continuous saving (a new image added each time the screen changes) or just a snapshot. It also allows switching beteen saving to a file and writing directly to the printer. If the screens are saved to a file, the dialog allows a choice between text, HTML or RichText output. By default, the file name is /tmp/x3scr.pid.type in /tmp. The default directory name can be changed with the "x3270.traceDir" resource. The dialog also allows the default print command (lpr) to be changed.
    Print Window Bitmap
    Uses the xwd and xpr commands to print a copy of the graphical screen contents.
    Save Changed Options in File
    Saves into a file the values of all options that have been changed since x3270 was started. A pop-up allows the file name to be changed; the default file is .x3270pro in the user's home directory. If the file already exists, it is appended to. x3270 will read the contents of this file the next time it starts up. The options settings in the file override any resources defined with xrdb or in the user's .Xdefaults file; command-line switches override the file. A different options file can be specified by the X3270PRO environment variable. If the environment variable NOX3270PRO is set, no options file will be read.
    Execute an Action
    Allows an action name and parameters to be entered from the keyboard. This allows experimentation with actions without having to edit keymaps and repeatedly restart x3270.
    Toggles
    The toggles under the Options menu are as follows:
    Monocase
    If set, x3270 operates in uppercase-only mode.
    Blinking Cursor
    If set, the cursor blinks once per second.
    Blank Fill
    If set, x3270 behaves in some un-3270-like ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying `lock-up' that often occurs when inserting into an field with (apparent) space at the end.
    Show Timing
    If set, the time taken by the host to process an AID is displayed on the status line.
    Track Cursor
    If set, the cursor position is displayed on the status line.
    Scrollbar
    If set, the scrollbar appears.
    Wraparound
    If set, the NVT terminal emulator automatically assumes a NEWLINE character when it reaches the end of a line.
    Paste with Left Margin
    If set, puts restrictions on how pasted text is placed on the screen. The position of the cursor at the time the paste operation is begun is used as a left margin. No pasted text will fill any area of the screen to the left of that position. This option is useful for pasting into certain IBM editors that use the left side of the screen for control information.
    Overlay Paste
    If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the Paste with Left Margin toggle.
    Select by Rectangles
    If set, x3270 will always select rectangular areas of the screen. Otherwise, x3270 selects by rectangles when in 3270 mode, but in NVT mode it selects continuous regions of the screen like xterm(1).
    Crosshair Cursor
    If set, x3270 will display a crosshair over the cursor: lines extending the full width and height of the screen, centered over the cursor position. This makes locating the cursor on the screen much easier.
    Visible Control Chars
    If set, x3270 will display control characters as special underscored symbols instead of blanks. Field attribute characters are displayed in underscored yellow. Other control characters are displayed according to their field colors and attributes.

    Symbol Meaning
    Period NUL (X'00')
    < SO (Start of DBCS subfield)
    > SI (End of DBCS subfield)
    0-9 A-V Field attribute
    The mappings for field attribute characters are included in the x3270 Resource documentation for the visibleControl resource.

    The names of the toggles for use with the -set and -clear options are as follows:

    Menu Option Name
    Monocase monoCase
    Blinking Cursor cursorBlink
    Blank Fill blankFill
    Show Timing showTiming
    Track Cursor cursorPos
    Trace Data and Events trace
    Save Screen(s) in File screenTrace
    Scrollbar scrollBar
    Wraparound lineWrap
    Paste with Left Margin marginedPaste
    Select by Rectangles rectangleSelect
    Crosshair Cursor crosshair
    Visible Control Chars visibleControl

    In addition, the toggle altCursor can be used to select the cursor type. If set, an underline cursor will be used. If clear, the normal block cursor will be used. The toggle aidWait can also be used to change how actions that send an AID to the host behave: when clear, they no longer block until the host unlocks the keyboard.

    These names also represent resources that can be set in your .Xdefaults or .x3270pro file. For example, if you always want to have the scrollbar off, you can add the following to your .Xdefaults or .x3270pro:

    x3270.scrollBar: false

    These names are also used as the first parameter to the Toggle action.

    Status Line

    The x3270 status line contains a variety of information. From left to right, the fields are:
    comm status
    The first symbol is always a 4. If x3270 is in TN3270E mode, the second symbol is a B; otherwise it is an A. If x3270 is disconnected, the third symbol is a question mark. Otherwise, if x3270 is in SSCP-LU mode, the third symbol is an S. Otherwise it is blank.
    keyboard lock
    If the keyboard is locked, an "X" symbol and a message field indicate the reason for the keyboard lock.
    shift
    Three characters indicate the keyboard modifier status. "M" indicates the Meta key, "A" the Alt key, and an up-arrow or "^" indicates the Shift key.
    compose
    The letter "C" indicates that a composite character is in progress. If another symbol follows the "C", it is the first character of the composite.
    typeahead
    The letter "T" indicates that one or more keystrokes are in the typeahead buffer.
    temporary keymap
    The letter "K" indicates that a temporary keymap is in effect.
    reverse
    The letter "R" indicates that the keyboard is in reverse field entry mode.
    insert mode
    A thick caret "^" or the letter "I" indicates that the keyboard is in insert mode.
    printer session
    The letter "P" indicates that a pr3287 session is active.
    script
    The letter "S" indicates that a script is active.
    LU name
    The LU name associated with the session, if there is one.
    timing
    A clock symbol and a time in seconds indicate the time it took to process the last AID or the time to connect to a host. This display is optional.
    cursor position
    The cursor row and column are optionally displayed, zero padded and separated by a "/". Location 001/001 is at the upper left, which is different from the row and columns parameters used with various actions, where the upper left corner is row 0, column 0.

    Icons

    If the -activeicon option is given (or the "x3270.activeIcon" resource is set to true), x3270 will attempt to make its icon a miniature version of the current screen image. This function is highly dependent on your window manager:
    mwm
    The size of the icon is limited by the "Mwm.iconImageMaximum" resource, which defaults to 50x50. The image will be clipped at the bottom and right. The icon cannot accept keyboard input.
    olwm
    The full screen image of all 3270 models can be displayed on the icon. However, the icon cannot be resized, so if the model is later changed with an x3270 menu option, the icon image will be corrupted. The icon cannot accept keyboard input.
    twm and tvtwm
    The full screen image of all 3270 models can be displayed on the icon, and the icon can be resized. The icon can accept keyboard input.

    However, twm does not put labels on application-supplied icon windows. You can have x3270 add its own label to the icon by setting the "x3270.labelIcon" resource to true. The default font for icon labels is 8x13; you may change it with the "x3270.iconLabelFont" resource.

    Keymaps

    The type of keyboard may be specified with the -keymap switch or using either the KEYMAP or KEYBD environment variables. The types of supported keyboards include sun_k3, sun_k4, sun_k5, hp-k1, hp-pc and ncd.

    The keymap may also be specified as a comma-separated list of names. Later definitions override earlier ones. This is used to specify both a primary keyboard type and a set of modifiers. The modifiers defined include:

    ow
    (OpenWindows) Swaps the middle and right mouse button definitions, so the middle button performs the "Extend" function and the right-hand button performs the "Paste" function. Also changes the cut and paste actions to use the OpenWindows CLIPBOARD.
    apl
    Allows entry of APL characters (see APL SUPPORT below).
    finnish7
    Replaces the bracket, brace and bar keys with common Finnish characters.
    norwegian7
    Replaces the bracket, brace and bar keys with common Norwegian characters.

    A temporary keymap can also be specified while x3270 is running with the Keymap action. When the action Keymap(n) is executed, temporary keymap n is added to or deleted from the current keymap. Multiple temporary keymaps can be active simultaneously. The action Keymap(None) restores the original keymap. Note: When Keymap() is specified as part of a list of multiple actions in a keymap, it must be the last action in the list.

    The temporary keymap hebrew is provided to allow entry of Hebrew characters.

    The X Toolkit translation mechanism is used to provide keyboard emulation. It maps events into actions. The best documentation can be found with X toolkit documents, but the following should suffice for simple customization.

    An Xt event consists of (at least) four fields. The first is called a modifier. It may be any combination of Meta, Shift and Ctrl. If it is prefaced by !, it means those modifiers only. The second field is the specific event, in x3270 usually just <Key>. The third field is the detail field, which gives the actual key. The name of the key may be determined using the xev program or with the "Trace X Events" menu option. The last field is the action, which is the internal emulator function. A complete list of actions may be found later in the manual.

    There are three levels of translation tables in x3270. The first is a defined by the resource x3270.keymap.base. It defines alphabetic, numeric, function keys, and such basic functions as Enter and Delete. It allows a minimal useful functionality. It is generally compiled in x3270, but can be overridden.

    The second level is a keyboard specific table, which is selected by the x3270.keymap resource, and defined by the x3270.keymap.name resource (where name is the value of the x3270.keymap resource). This keymap defines actions for such things as keypad keys, and keys unique to certain keyboards. Several predefined keymaps are included with x3270.

    The third level is a user customizable table which may be used to augment or override key definitions. This keymap is defined by the x3270.keymap.name.user resource.

    In addition, keymaps may be defined for use in 3270 mode or NVT mode only. These keymaps use the suffixes .3270 and .nvt in their names, respectively. If a keymap x3270.keymap.name.mode is defined, it will augment the keymap x3270.keymap.name when x3270 is in the given mode. If a keymap x3270.keymap.name.user.mode is defined, it will augment the keymap x3270.keymap.name.user when x3270 is in the given mode.

    The default translation table x3270.keymap.base is:
    <Key>Multi_key Compose()
    Shift<Key>Left KybdSelect(Left,PRIMARY)
    <Key>Left Left()
    Meta<Key>Right NextWord()
    Shift<Key>Right KybdSelect(Right,PRIMARY)
    <Key>Right Right()
    Shift<Key>Up KybdSelect(Up,PRIMARY)
    <Key>Up Up()
    Shift<Key>Down KybdSelect(Down,PRIMARY)
    <Key>Down Down()
    Ctrl<Btn1Down> HandleMenu(quitMenu)
    Ctrl<Btn2Down> HandleMenu(optionsMenu)
    Ctrl<Btn3Down> HandleMenu(hostMenu)
    Shift<Btn1Down> MoveCursor()
    <Btn1Down> select-start()
    <Btn1Motion> select-extend()
    <Btn2Down> ignore()
    <Btn2Motion> ignore()
    <Btn2Up> insert-selection(PRIMARY)
    <Btn3Down> start-extend()
    <Btn3Motion> select-extend()
    <BtnUp> select-end(PRIMARY)
    Meta<Key>F1 PF(13)
    Shift<Key>F1 PF(13)
    Meta<Key>F2 PF(14)
    Shift<Key>F2 PF(14)
    Meta<Key>F3 PF(15)
    Shift<Key>F3 PF(15)
    Meta<Key>F4 PF(16)
    Shift<Key>F4 PF(16)
    Meta<Key>F5 PF(17)
    Shift<Key>F5 PF(17)
    Meta<Key>F6 PF(18)
    Shift<Key>F6 PF(18)
    Meta<Key>F7 PF(19)
    Shift<Key>F7 PF(19)
    Meta<Key>F8 PF(20)
    Shift<Key>F8 PF(20)
    Meta<Key>F9 PF(21)
    Shift<Key>F9 PF(21)
    Meta<Key>F10 PF(22)
    Shift<Key>F10 PF(22)
    Meta<Key>F11 PF(23)
    Shift<Key>F11 PF(23)
    Meta<Key>F12 PF(24)
    Shift<Key>F12 PF(24)
    <Key>F1 PF(1)
    <Key>F2 PF(2)
    <Key>F3 PF(3)
    <Key>F4 PF(4)
    <Key>F5 PF(5)
    <Key>F6 PF(6)
    <Key>F7 PF(7)
    <Key>F8 PF(8)
    <Key>F9 PF(9)
    <Key>F10 PF(10)
    <Key>F11 PF(11)
    <Key>F12 PF(12)
    Alt<Key>q Quit()
    <Key>Prior Scroll(Backward)
    <Key>Next Scroll(Forward)
    :<Key> Default()

    The default 3270-mode table x3270.keymap.base.3270 adds the following definitions:
    Shift<Key>Return Newline()
    <Key>Return Enter()
    <Key>Linefeed Newline()
    Shift<Key>Tab BackTab()
    <Key>Tab Tab()
    <Key>Home Home()
    Meta<Key>Left PreviousWord()
    Meta<Key>Right NextWord()
    <Key>Insert Insert()
    <Key>Delete Delete()
    <Key>BackSpace BackSpace()
    Ctrl Shift<Btn1Down> MouseSelect()
    Shift<Btn1Down> MoveCursor()
    Meta<Key>1 PA(1)
    Meta<Key>2 PA(2)
    Meta<Key>3 PA(3)
    Ctrl<Key>a SelectAll(PRIMARY)
    Meta<Key>a Attn()
    Meta<Key>b PrintWindow()
    Ctrl<Key>c set-select(CLIPBOARD)
    Meta<Key>c Clear()
    Meta<Key>d Delete()
    Meta<Key>e EraseEOF()
    Meta<Key>f Flip()
    Meta<Key>h Home()
    Meta<Key>i Insert()
    Meta<Key>l Redraw()
    Meta<Key>p PrintText()
    Meta<Key>r Reset()
    Meta<Key>u Unselect()
    Ctrl<Key>u DeleteField()
    Ctrl<Key>v insert-selection(CLIPBOARD)
    Meta<Key>v ToggleReverse()
    Ctrl<Key>w DeleteWord()
    Ctrl<Key>x Cut(CLIPBOARD)

    Meta is the diamond shaped key on a sun_k4, "Alt" on an NCD, "Extend Char" on an HP. The following xmodmap command must be used on the NCD to allow use the the "Alt" key:

    xmodmap -e "keysym Alt_L = Meta_L"

    The left mouse button may be used to make a selection. Clicking once unselects the current selection. Clicking twice selects the word under the mouse cursor. Clicking three times selects the line under the mouse cursor. Clicking and dragging selects a rectangular area of the display.

    The middle mouse button may be used to paste a selection.

    The right mouse button may also be used for selections, selecting the rectangular area between the current position and where the left button was last pressed.

    On color X displays, the "x3270.selectBackground" resource is used to distinguish the selected text from the rest of the screen. On monochrome X displays, selected text is in reverse video. (It can be distinguished from a block cursor because the block cursor covers slightly less than an entire character position on the screen.)

    The left mouse button, when pressed with the "Shift" key held down, moves the 3270 cursor to the where the mouse cursor is pointing.

    This is the complete list of keymap-callable actions. Other actions are defined for use by scripts and are documented in x3270-script(1); still others are defined for internal use by x3270 and are not documented here. Note that when an action with no parameters is used in a keymap, the parentheses and empty argument list are still required. )

    Actions marked with an asterisk (*) may block, sending data to the host and possibly waiting for a response.

    *Attn attention key
    AltCursor switch between block and underscore cursor
    BackSpace move cursor left (or send ASCII BS)
    BackTab tab to start of previous input field
    CircumNot input "^" in NVT mode, or "¬" in 3270 mode
    *Clear clear screen
    Compose next two keys form a special symbol
    *Connect(host) connect to host
    *CursorSelect Cursor Select AID
    Cut copy highlighted area to clipboard and erase
    Default enter key literally
    Delete delete character under cursor (or send ASCII DEL)
    DeleteField delete the entire field
    DeleteWord delete the current or previous word
    *Disconnect disconnect from host
    Down move cursor down
    Dup duplicate field
    *Enter Enter AID (or send ASCII CR)
    Erase erase previous character (or send ASCII BS)
    EraseEOF erase to end of current field
    EraseInput erase all input fields
    Execute(cmd) execute a command in a shell
    FieldEnd move cursor to end of field
    FieldMark mark field
    HandleMenu(name) pop up a menu
    HexString(hex_digits) insert control-character string
    Home move cursor to first input field
    Insert set insert mode
    *Interrupt send TELNET IP to host
    Key(keysym) insert key keysym
    Key(0xxx) insert key with character code xx
    Keymap(keymap) toggle alternate keymap (or remove with None)
    KybdSelect(direction [,atom...]) Extend selection by one row or column
    Left move cursor left
    Left2 move cursor left 2 positions
    *Macro(macro) run a macro
    MonoCase toggle uppercase-only mode
    MoveCursor move cursor to mouse position
    MoveCursor(row, col) move cursor to zero-origin (row,col)
    *MoveCursorSelect move cursor to mouse position, light pen selection
    Newline move cursor to first field on next line (or send ASCII LF)
    NextWord move cursor to next word
    *PA(n) Program Attention AID (n from 1 to 3)
    *PF(n) Program Function AID (n from 1 to 24)
    PreviousWord move cursor to previous word
    Printer(Start[,lu]|Stop) start or stop printer session
    PrintText(command) print screen text on printer
    PrintWindow(command) print screen image (bitmap) on printer
    Quit exit x3270
    *Reconnect reconnect to previous host
    Redraw redraw window
    Reset reset locked keyboard
    Right move cursor right
    Right2 move cursor right 2 positions
    *Script(command[,arg...]) run a script
    Scroll(Forward|Backward) scroll screen
    SelectAll(atom) select entire screen
    SetFont(font) change emulator font
    *String(string) insert string (simple macro facility)
    Tab move cursor to next input field
    Toggle(option[,set|clear]) toggle an option
    ToggleInsert toggle insert mode
    ToggleReverse toggle reverse-input mode
    *Transfer(option=value...') file transfer
    Unselect release selection
    Up move cursor up
    (the following are similar to xterm)
    ignore do nothing
    insert-selection([atom[,atom...]]) paste selection
    move-select a combination of MoveCursor and select-start
    select-end(atom[,atom...]]) complete selection and assign to atom(s)
    select-extend move the end of a selection
    select-start mark the beginning of a selection
    set-select(atom[,atom...]]) assign existing selection to atom(s)
    start-extend begin marking the end of a selection

    Note that certain parameters to x3270 actions (such as the names of files and keymaps) are subject to substitutions:

    The character ~ at the beginning of a string is replaced with the user's home directory. A ~ character followed by a username is replaced with that user's home directory.

    Environment variables are substituted using the Unix shell convention of $name or ${name}.

    Two special pseudo-environment variables are supported. ${TIMESTAMP} is replaced with a microsecond-resolution timestamp; ${UNIQUE} is replaced with a string guaranteed to make a unique filename (the process ID optionally followed by a dash and a string of digits). ${UNIQUE} is used to form trace file names.

    The PrintText Action

    The PrintText produces screen snapshots in a number of different forms. The default form wth no arguments sends a copy of the screen to the default printer. A single argument is the command to use to print, e.g., lpr.

    Multiple arguments can include keywords to control the output of PrintText:

    file filename
    Save the output in a file.
    html
    Save the output as HTML. This option implies file.
    rtf
    Save the output as RichText. This option implies file. The font defaults to Courier New and the point size defaults to 8. These can be overridden by the printTextFont and printTextSize resources, respectively.
    string
    Return the output as a string. This can only be used from scripts.
    modi
    Render modified fields in italics.
    caption text
    Add the specified text as a caption above the output. Within text, the special sequence %T% will be replaced with a timestamp.
    secure
    Disables the pop-up dialog.
    command command
    Directs the output to a command. This allows one or more of the other keywords to be specified, while still sending the output to the printer.

    Macros and Scripts

    There are several types of macros and script functions available.
    The String Action
    The simplest method for macros is provided via the String action. The arguments to String are one or more double-quoted strings which are inserted directly as if typed. The C backslash conventions are honored as follows. (Entries marked * mean that after sending the AID code to the host, x3270 will wait for the host to unlock the keyboard before further processing the string.)
    \b Left
    \exxxx EBCDIC character in hex
    \f Clear*
    \n Enter*
    \pan PA(n)*
    \pfnn PF(nn)*
    \r Newline
    \t Tab
    \T BackTab
    \uxxxx Unicode character in hex
    \xxxxx Unicode character in hex

    Note that the numeric values for the \e, \u and \x sequences can be abbreviated to 2 digits. Note also that EBCDIC codes greater than 255 and some Unicode character codes represent DBCS characters, which will work only if x3270 is built with DBCS support and the host allows DBCS input in the current field.

    An example keymap entry would be:

    Meta<Key>p: String("probs clearrdr\n")

    Note: The strings are in ASCII and converted to EBCDIC, so beware of inserting control codes. Also, a backslash before a p may need to be doubled so it will not be removed when a resource file is read.

    There is also an alternate form of the String action, HexString, which is used to enter non-printing data. The argument to HexString is a string of hexadecimal digits, two per character. A leading 0x or 0X is optional. In 3270 mode, the hexadecimal data represent EBCDIC characters, which are entered into the current field. In NVT mode, the hexadecimal data represent ASCII characters, which are sent directly to the host.

    The Script Action
    This action causes x3270 to start a child process which can execute x3270 actions. Standard input and output from the child process are piped back to x3270. The Script action is fully documented in x3270-script(1).
    The macros Resource
    An alternate method of defining macros is the "x3270.macros" resource. This resource is similar to a keymap, but instead of defining keyboard mappings, it associates a list of X actions with a name. These names are displayed on a Macros menu that appears when x3270 is connected to a host. Selecting one of the names on the menu executes the X actions associated with it. Typically the actions are String calls, but any action may be specified. Here is a sample macros resource definition, which would result in a four-entry Macros menu:
    x3270.macros: \
    log off: String("logout\n")\n\
    vtam: String("dial vtam\n")\n\
    pa1: PA(1)\n\
    alt printer: PrintText("lpr -Plw2")

    You can also define a different set of macros for each host. If there is a resource named `x3270.macros.somehost', it defines the macros menu for when x3270 is connected to somehost.

    The -script Option
    This facility allows x3270 to operate under the complete control of a script. x3270 accepts actions from standard input, and prints results on standard output. The -script option is fully documented in x3270-script(1).

    Composite Characters

    x3270 allows the direct entry of accented letters and special symbols. Pressing and releasing the "Compose" key, followed by two other keys, causes entry of the symbol combining those two keys. For example, "Compose" followed by the "C" key and the "," (comma) key, enters the "C-cedilla" symbol. A C on the status line indicates a pending composite character.

    The mappings between these pairs of ordinary keys and the symbols they represent is controlled by the "x3270.composeMap" resource; it gives the name of the map to use. The maps themselves are named "x3270.composeMap.name". The default is "latin1", which gives mappings for most of the symbols in the ISO 8859-1 Latin-1 character set that are not in the 7-bit ASCII character set.

    Note: The default keymap defines the "Multi_key" keysym as the "Compose" key. If your keyboard lacks such a key, you may set up your own "Compose" key with a keymap that maps some other keysym onto the Compose action.

    APL Support

    x3270 supports the full APL2 character set and the entry of APL characters from the keyboard.

    APL characters are supported only in the special 3270 font.

    Keyboard entry of APL characters is supported through the apl keymap modifier. This modifier defines the "Alt" key as an APL shift key, with a typical APL keyboard layout, e.g., "Alt" pressed with the A key results in the APL "alpha" symbol. Overstruck characters such as "quad-quote" are not defined as single keystrokes; instead they are entered as composites (see COMPOSITE CHARACTERS above). A special composite map, apl, is provided for this purpose.

    Note: Some keyboards do not define the "Alt" key as a modifier, so keymaps that use the "Alt" key will not function. On a Sun for example, this can be remedied with the command:

    xmodmap -e "add mod2 = Alt_L"

    For convenience, an -apl option is defined, which is an abbreviation for the following resource definitions:

    x3270.keymap: your_keymap_name,apl
    x3270.charset: apl
    x3270.composeMap: apl

    There are a number of APL characters that are similar in appearance to non-APL characters. In particular, the APL "stile", "slope," "tilde" and "quotedot" characters are similar to the EBCDIC "bar", "backslash," "tilde" and "exclaim" characters. The APL characters are entered with the "Alt" key, and have slightly different appearances.

    The complete list of special APL keysyms is as follows. Entries marked with an asterisk (*) represent simple aliases for standard EBCDIC characters. Entries marked with an (S) represent Sharp APL charatcers.

    APL Symbol Hex x3270 apl_ Keysym x3270 Key x3270 Composed Keys
    A underbar 41 Aunderbar Alt-A A + underbar
    alpha B0 alpha Alt-a  
    B underbar 42 Bunderbar Alt-B B + underbar
    bar 60* bar -  
    brace left C0 braceleft Alt-{  
    brace right D0 braceright Alt-}  
    C underbar 43 Cunderbar Alt-C C + underbar
    circle 9D circle Alt-o  
    circle bar ED circlebar   circle + bar
    circle slope CF circleslope   circle + slope
    circle star FD circlestar   circle + star
    circle stile CD circlestile   circle + stile
    colon 7A* colon :  
    comma 6B* comma ,  
    comma bar (S) E5 commabar   comma + bar
    D underbar 44 Dunderbar Alt-D D + underbar
    del BA del Alt-g  
    del stile DC delstile   del + stile
    del tilde FB deltilde   del + tilde
    delta BB delta Alt-h  
    delta stile DD deltastile   delta + stile
    delta underbar FC deltaunderbar   delta + underbar
    diamond 70 diamond   up caret + down caret
    dieresis 72 dieresis Alt-1  
    dieresis circle (S) E5 dieresiscircle   dieresis + circle
    dieresis dot EC dieresisdot   dieresis + dot
    dieresis jot (S) E4 dieresisjot   dieresis + jot
    divide B8 divide Alt-+  
    dot 4B* dot .  
    down arrow 8B downarrow Alt-u  
    down caret 78 downcaret Alt-9  
    down caret tilde CB downcarettilde   down caret + tilde
    down shoe AB downshoe Alt-v  
    down stile 8E downstile Alt-d  
    down tack AC downtack Alt-b  
    down tack jot FE downtackjot   down tack + jot
    down tack up tack DA downtackuptack   down tack + up tack
    E underbar 45 Eunderbar Alt-E E + underbar
    epsilon B1 epsilon Alt-e  
    epsilon underbar 75 epsilonunderbar   epsilon + underbar
    equal 7E* equal "="  
    equal underbar E1 equalunderbar   equal + underbar
    euro (S) E7 euro   C + =
    F underbar 46 Funderbar Alt-F F + underbar
    G underbar 47 Gunderbar Alt-G G + underbar
    greater 6E* greater >  
    H underbar 48 Hunderbar Alt-H H + underbar
    I underbar 49 Iunderbar Alt-I I + underbar
    iota B2 iota Alt-i  
    iota underbar 74 iotaunderbar   iota + underbar
    J underbar 51 Junderbar Alt-J J + underbar
    jot AF jot alt-j  
    K underbar 52 Kunderbar Alt-K K + underbar
    L underbar 53 Lunderbar Alt-L L + underbar
    left arrow 9F leftarrow Alt-[  
    left bracket AD leftbracket [  
    left paren 4D* leftparen (  
    left shoe 9B leftshoe Alt-z  
    less 4C* less <  
    M underbar 54 Munderbar Alt-M M + underbar
    N underbar 55 Nunderbar Alt-N N + underbar
    not equal BE notequal Alt-8 equal + slash
    not greater 8C notgreater Alt-4 less + equal
    not less AE notless Alt-6 greater + equal
    O underbar 56 Ounderbar Alt-O O + underbar
    omega B4 omega Alt-w  
    overbar A0 overbar Alt-2  
    P underbar 57 Punderbar Alt-P P + underbar
    plus 4E* plus +  
    Q underbar 58 Qunderbar Alt-Q Q + underbar
    quad 90 quad Alt-l  
    quad divide EE quaddivide   quad + divide
    quad jot 73 quadjot   quad + jot
    quad quote DE quadquote   quad + quote
    quad slope CE quadslope   quad + slope
    query 6F* query ?  
    quote 7D* quote '  
    quote dot DB quotedot   quote + dot
    R underbar 59 Runderbar Alt-R R + underbar
    rho B3 rho Alt-r  
    right arrow 8F rightarrow Alt-]  
    right bracket BD rightbracket ]  
    right paren 5D* rightparen )  
    right shoe 9A rightshoe Alt-x  
    S underbar 62 Sunderbar Alt-S S + underbar
    semicolon 5E* semicolon ;  
    slash 61* slash /  
    slash bar EA slashbar   slash + bar
    slope B7 slope Alt-\  
    slope bar EB slopebar   slope + bar
    squad CC squad   quad + quad
    star 5C* star *  
    stile BF stile Alt-|  
    T underbar 63 Tunderbar Alt-T T + underbar
    tilde 80 tilde Alt-~  
    times B6 times Alt-=  
    U underbar 64 Uunderbar Alt-U U + underbar
    underbar 6D* underbar "_"  
    up arrow 8A uparrow Alt-y  
    up caret 71 upcaret Alt-0  
    up caret tilde CA upcarettilde   up caret + tilde
    up shoe AA upshoe Alt-c  
    up shoe jot DF upshoejot   up shoe + jot
    up stile 8D upstile Alt-s  
    up tack BC uptack Alt-n  
    up tack jot EF uptackjot   up tack + jot
    V underbar 65 Vunderbar Alt-V V + underbar
    W underbar 66 Wunderbar Alt-W W + underbar
    X underbar 67 Xunderbar Alt-X X + underbar
    Y underbar 68 Yunderbar Alt-Y Y + underbar
    Z underbar 69 Zunderbar Alt-Z Z + underbar

    XIM Support

    When compiled with DBCS support, x3270 supports multi-byte input methods via the XIM protocol.

    The input method is selected by the XMODIFIERS environment variable or the -im command-line option.

    The preedit type is specified by the -pt command-line option, with a default of OverTheSpot+1.

    Screen Printing

    Screen printing is handled through options on the File menu or by the PrintText and PrintWindow actions. Each results in a pop-up to confirm the print command.

    The PrintText action (usually assigned to the key <Meta>p) sends the current screen image to the printer as ASCII characters. The default command used to print the data is controlled by the "x3270.printTextCommand" resource; the default is lpr. You may also use a keymap definition to pass a print command the PrintText action itself. The command receives the screen text as its standard input. For example, the following keymap will save the screen text in a file:

    Meta<Key>f: PrintText("cat >screen.image")

    Note: HardPrint is an alias for PrintText.

    The PrintWindow action (usually assigned to the key <Meta>b) sends the current screen image to the printer as a bitmap. The default command used to print the data is controlled by the "x3270.printWindowCommand" resource; the default is

    xwd -id %d | xpr | lpr.

    You may also use a keymap definition to pass a print command to the PrintWindow action itself. If the command contains the text "%d", the window ID of x3270 will be substituted before it is run. For example, the following keymap will pop up a duplicate of the current screen image:

    Meta<Key>g: PrintWindow("xwd -id %d | xwud &")

    If the command for PrintWindow or PrintText begins with an "@" character, the initial pop-up menu to confirm the print command is not displayed and the command cannot be edited.

    Bugs

    Cursor highlighting will not work with if you use the NoTitleFocus option in your .twmrc file.

    Passthru

    x3270 supports the Sun telnet-passthru service provided by the in.telnet-gw server. This allows outbound telnet connections through a firewall machine. When a p: is prepended to a hostname, x3270 acts much like the itelnet(1) command. It contacts the machine named internet-gateway at the port defined in /etc/services as telnet-passthru (which defaults to 3514). It then passes the requested hostname and port to the in.telnet-gw server.

    Proxy

    The -proxy option or the x3270.proxy resource causes x3270 to use a proxy server to connect to the host. The syntax of the option or resource is:
    type:host[:port]
    The supported values for type are:
    Proxy Type
    Protocol
    Default Port
    http
    RFC 2817 HTTP tunnel (squid)
    3128
    passthru
    Sun in.telnet-gw
    none
    socks4
    SOCKS version 4
    1080
    socks5
    SOCKS version 5 (RFC 1928)
    1080
    telnet
    No protocol (just send connect host port)
    none

    The special types socks4a and socks5d can also be used to force the proxy server to do the hostname resolution for the SOCKS protocol.

    Files

    /usr/lib/X11/x3270/ibm_hosts
    $HOME/.x3270pro

    Environment Variables

    3270PRO Path of profile file, containing resource definitions. Merged after the system resource database, but before X3270RDB. Defaults to $HOME/.x3270pro.
    NOX3270PRO If set, do not read the profile.
    X3270RDB Additional resource definitions, merged after the profile file but before the command-line options.
    KEYMAP Keymap name.
    KEYBD Keymap name.

    See Also

    pr3287(1), s3270(1), x3270-script(1), c3270(1), tcl3270(1), telnet(1), tn3270(1), ibm_hosts(5)
    X Toolkit Intrinsics
    Data Stream Programmer's Reference, IBM GA23-0059
    Character Set Reference, IBM GA27-3831
    RFC 1576, TN3270 Current Practices
    RFC 1646, TN3270 Extensions for LUname and Printer Selection
    RFC 2355, TN3270 Enhancements

    Copyrights

    Copyright © 1993-2017, Paul Mattes.
    Copyright © 2004-2005, Don Russell.
    Copyright © 2004, Dick Altenbern.
    Copyright © 1990, Jeff Sparkes.
    Copyright © 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    *
    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    *
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    *
    Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Version

    x3270 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/x3270/html/x3270-script.html0000664000076500007650000010016313221600611015660 0ustar pdmpdm x3270-script Manual Page

    x3270-script Manual Page

    Contents

    Name
    Synopsis
    Description
    Status Format
    Differences
    Basic Programming Strategies
    Script-Specific Actions
    File Transfer
    See Also
    Version

    Name

    Scripting Facilities for x3270, c3270 and s3270

    Synopsis

    x3270 -script [ x3270-options ]
    x3270 -socket [ x3270-options ]
    x3270 -scriptport port [ x3270-options ]
    c3270 -socket [ c3270-options ]
    c3270 -scriptport port [ s3270-options ]
    s3270 [ s3270-options ]
    Script ( command [ ,arg... ] )

    Description

    The x3270 scripting facilities allow the interactive 3270 emulators x3270 and c3270 to be operated under the control of another program, and forms the basis for the script-only emulator s3270.

    There are four basic scripting methods. The first is the peer script facility, invoked by the x3270 -script switch, and the default mode for s3270. This runs the emulator as a child of another process. Typically this would be a script using expect(1), perl(1), or the co-process facility of the Korn Shell ksh(1). In this mode, the emulator process looks for commands on its standard input, and places the responses on standard output.

    The second method is the child script facility, invoked by the emulator's Script action. This runs a script as a child process of the emulator. The child has access to pipes connected to the emulator; the emulator looks for commands on one pipe, and places the responses on the other. The file descriptor of the pipe for commands to the emulator is passed in the environment variable X3270INPUT (e.g., the text string "7" if the file descriptor is 7); the file descriptor of the pipe for responses from the emulator is passed in the environment variable X3270OUTPUT.

    The third method uses a TCP socket. The -scrpiptport command-line option causes the emulator to bind a socket to the specified port (on the IPv4 loopback address, 127.0.0.1). The emulator accepts TCP connections on that port. Multiple commands and responses can be sent over each connection.

    The fourth method uses a Unix-domain socket. The -socket command-line option causes the emulator to create a Unix-domain stream socket named /tmp/x3sck.pid. The emulator accepts connections to that socket. Multiple commands and responses can be sent over each connection.

    It is possible to nest the methods. For example, a peer or TCP socket script can invoke the Script action. The calling script will be resumed when the nested script completes.

    Commands are emulator actions; the syntax is the same as for the right-hand side of an x3270 or c3270 keymap. Unlike translation tables, action names are case-insensitive, can be uniquely abbreviated, and the parentheses may be omitted if there are no parameters. Any input line that begins with # or ! is treaded as a comment and will be ignored.

    Any emulator action may be specified. Several specific actions have been defined for use by scripts, and the behavior of certain other actions (and of the emulators in general) is different when an action is initiated by a script.

    Some actions generate output; some may delay completion until the certain external events occur, such as the host unlocking the keyboard. The completion of every command is marked by a two-line message. The first line is the current status of the emulator, documented below. If the command is successful, the second line is the string "ok"; otherwise it is the string "error".

    Status Format

    The status message consists of 12 blank-separated fields:
    1 Keyboard State
    If the keyboard is unlocked, the letter U. If the keyboard is locked waiting for a response from the host, or if not connected to a host, the letter L. If the keyboard is locked because of an operator error (field overflow, protected field, etc.), the letter E.
    2 Screen Formatting
    If the screen is formatted, the letter F. If unformatted or in NVT mode, the letter U.
    3 Field Protection
    If the field containing the cursor is protected, the letter P. If unprotected or unformatted, the letter U.
    4 Connection State
    If connected to a host, the string C(hostname). Otherwise, the letter N.
    5 Emulator Mode
    If connected in 3270 mode, the letter I. If connected in NVT line mode, the letter L. If connected in NVT character mode, the letter C. If connected in unnegotiated mode (no BIND active from the host), the letter P. If not connected, the letter N.
    6 Model Number (2-5)
    7 Number of Rows
    The current number of rows defined on the screen. The host can request that the emulator use a 24x80 screen, so this number may be smaller than the maximum number of rows possible with the current model.
    8 Number of Columns
    The current number of columns defined on the screen, subject to the same difference for rows, above.
    9 Cursor Row
    The current cursor row (zero-origin).
    10 Cursor Column
    The current cursor column (zero-origin).
    11 Window ID
    The X window identifier for the main x3270 window, in hexadecimal preceded by 0x. For s3270 and c3270, this is zero.
    12 Command Execution Time
    The time that it took for the host to respond to the previous commnd, in seconds with milliseconds after the decimal. If the previous command did not require a host response, this is a dash.

    Differences

    When an action is initiated by a script, the emulators behave in several different ways:

    If an error occurs in processing an action, the usual pop-up window does not appear. Instead, the text is written to standard output.

    If end-of-file is detected on standard input, the emulator exits. (A script can exit without killing the emulator by using the CloseScript action, below.) Note that this applies to peer scripts only; end-of-file on the pipe connected to a child script simply causes the pipes to be closed and the Script action to complete.

    The Quit action always causes the emulator to exit. (When called from the keyboard, it will exit only if not connected to a host.)

    Normally, the AID actions (Clear, Enter, PF, and PA) will not complete until the host unlocks the keyboard. If the parameter to a String action includes a code for one these actions, it will also wait for the keyboard to unlock before proceeding.

    The AidWait toggle controls with behavior. When this toggle is set (the default), actions block as described above. When the toggle is clear, AID actions complete immediately. The Wait(Output) action can then be used to delay a script until the host changes something on the screen, and the Wait(Unlock) action can be used to delay a script until the host unlocks the keyboard, regardless of the state of the AidWait toggle.

    Note that the Script action does not complete until end-of-file is detected on the pipe or the CloseScript action is called by the child process. This behavior is not affected by the state of the AidWait toggle.

    Basic Programming Strategies

    3270 session scripting can be more difficult than other kinds of scripting, because it can be hard to tell when the host is finished processing a command. There is a well-defined 3270 Data Stream facility for doing this: The emulator locks the keyboard when it sends the host an AID, and the later host unlocks the keyboard. The emulator supports this facility directly by not allowing an AID action to complete until the keyboard is unlocked. Unfortunately, some hosts and some host applications unlock the keyboard as soon as they begin processing the command, instead of after it is finished. A human operator can see on the screen when the command is finished (e.g., when a READY prompt is displayed), but it can be difficult for a script to do this. For such early-unlock hosts, the only option in a script is to poll the screen until it can determine that the command is complete.

    Another complication is that host I/O and script operation are asynchronous. That is, the host can update the screen at any time, even between actions that are reading the screen contents, so a script can get inconsistent results. Assistance for this problem is provided by the Snap action. The Snap(Save) action saves a snapshot of the screen in a special buffer. Then the script can use Snap variants of the Ascii and Ebcdic actions (Snap(Ascii) and Snap(Ebcdic)) to query the saved buffer -- which the host cannot modify -- to get the data it wants. Finally, Snap(Wait Output) blocks the script until the host modifies the screen, specifically since the last call to Snap(Save). Thus a script can poll the screen efficiently by writing a loop that begins with Snap(Save) and ends with Snap(Wait Output).

    Script-Specific Actions

    The following actions have been defined or modified for use with scripts. (Note that unlike the display on the status line, row and col coordinates used in these actions use [0,0] as their origin at the upper left, not [1,1]).
    AnsiText
    Outputs whatever data that has been output by the host in NVT mode since the last time that AnsiText was called. The data is preceded by the string "data: ", and has had all control characters expanded into C backslash sequences.

    This is a convenient way to capture NVT mode output in a synchronous manner without trying to decode the screen contents.

    Ascii(row,col,rows,cols)
    Ascii(row,col,length)
    Ascii(length)
    Ascii
    Outputs an ASCII text representation of the screen contents. Each line is preceded by the string "data: ", and there are no control characters.

    If four parameters are given, a rectangular region of the screen is output. (Note that the row and column are zero-origin.)

    If three parameters are given, length characters are output, starting at the specified zero-origin row and column.

    If only the length parameter is given, that many characters are output, starting at the cursor position.

    If no parameters are given, the entire screen is output.

    The EBCDIC-to-ASCII translation and output character set depend on the both the emulator character set (the -charset option) and the locale. UTF-8 and certain DBCS locales may result in multi-byte expansions of EBCDIC characters that translate to ASCII codes greater than 0x7f.

    AsciiField
    Outputs an ASCII text representation of the field containing the cursor. The text is preceded by the string "data: ".
    Connect(hostname)
    Connects to a host. The command does not return until the emulator is successfully connected in the proper mode, or the connection fails.
    CloseScript(status)
    Causes the emulator to stop reading commands from the script. This is useful to allow a peer script to exit, with the emulator proceeding interactively. (Without this command, the emulator would exit when it detected end-of-file on standard input.) If the script was invoked by the Script action, the optional status is used as the return status of Script; if nonzero, Script will complete with an error, and if this script was invoked as part of login through the ibm_hosts file, the connection will be broken.
    ContinueScript([param])
    Allows a script that is waiting in a PauseScript action, below, to continue. The optional param string is output by the PauseScript action.
    Disconnect
    Disconnects from the host.
    Ebcdic(row,col,rows,cols)
    Ebcdic(row,col,length)
    Ebcdic(length)
    Ebcdic
    The same function as Ascii above, except that rather than generating ASCII text, each character is output as a 2-digit or 4-digit hexadecimal EBCDIC code.
    EbcdicField
    The same function as AsciiField above, except that it generates hexadecimal EBCDIC codes.
    Info(message)
    In x3270, pops up an informational message. In c3270 and wc3270, writes an informational message to the OIA (the line below the display). Not defined for s3270 or tcl3270.
    Expect(text[,timeout])
    Pauses the script until the specified text appears in the data stream from the host, or the specified timeout (in seconds) expires. If no timeout is specified, the default is 30 seconds. Text can contain standard C-language escape (backslash) sequences. No wild-card characters or pattern anchor characters are understood. Expect is valid only in NVT mode.
    MoveCursor(row,col)
    Moves the cursor to the specified zero-origin coordinates.
    PauseScript
    Stops a script until the ContinueScript action, above, is executed. This allows a script to wait for user input and continue. Outputs the single parameter to ContinueScript, if one is given.
    PrintText([command,]filter)
    Pipes an ASCII representation of the current screen image through the named filter, e.g., lpr.
    PrintText([html,][append,][replace,]file,filename)
    Saves the current screen contents in a file. With the html option, saves it as HTML, otherwise saves it as plain ASCII. The append option (the default) causes the data to be appended to the file if it already exists. The replace option causes the file to be overwritten instead.
    PrintText(html,string)
    Returns the current screen contents as HTML.
    Query(keyword)
    Returns state information. Keywords are:

    Keyword Output
    BindPluName BIND PLU returned by the host
    ConnectionState TN3270/TN3270E mode and submode
    CodePage Host code page
    Cursor Cursor position (row col)
    Formatted 3270 format state (formatted or unformatted)
    Host Host name and port
    LocalEncoding Local character encoding
    LuName Host name LU name
    Model 3270 model name (IBM-327x-n)
    ScreenCurSize Current screen size (rows cols)
    ScreenMaxSize Maximum screen size (rows cols)
    Ssl SSL state (secure or not-secure) and host validation state (host-verified or host-unverified)

    Without a keyword, Query returns each of the defined attributes, one per line, labeled by its name.

    ReadBuffer(Ascii)
    Dumps the contents of the screen buffer, one line at a time. Positions inside data fields are generally output as 2-digit hexadecimal codes in the current display character set. If the current locale specifies UTF-8 (or certain DBCS character sets), some positions may be output as multi-byte strings (4-, 6- or 8-digit codes). DBCS characters take two positions in the screen buffer; the first location is output as a multi-byte string in the current locale codeset, and the second location is output as a dash. Start-of-field characters (each of which takes up a display position) are output as SF(aa=nn[,...]), where aa is a field attribute type and nn is its value.

    Attribute
    Values
    c0 basic 3270
    20 protected
    10 numeric
    04 detectable
    08 intensified
    0c non-display
    01 modified
    41 highlighting
    f1 blink
    f2 reverse
    f4 underscore
    f8 intensify
    42 foreground
    f0 neutral black
    f1 blue
    f2 red
    f3 pink
    f4 green
    f5 turquoise
    f6 yellow
    f7 neutral white
    f8 black
    f9 deep blue
    fa orange
    fb purple
    fc pale green
    fd pale turquoise
    fe grey
    ff white
    43 character set
    f0 default
    f1 APL
    f8 DBCS

    Extended attributes (which do not take up display positions) are output as SA(aa=nn), with aa and nn having the same definitions as above (though the basic 3270 attribute will never appear as an extended attribute).

    In addition, NULL characters in the screen buffer are reported as ASCII character 00 instead of 20, even though they should be displayed as blanks.

    ReadBuffer(Ebcdic)
    Equivalent to ReadBuffer(Ascii), but with the data fields output as hexadecimal EBCDIC codes instead. Additionally, if a buffer position has the Graphic Escape attribute, it is displayed as GE(xx).
    Script(path[,arg...])
    Runs a child script, passing it optional command-line arguments. path must specify an executable (binary) program: the emulator will create a new process and execute it. If you simply want the emulator to read commands from a file, use the Source action.
    Snap
    Equivalent to Snap(Save) (see below).
    Snap(Ascii,...)
    Performs the Ascii action on the saved screen image.
    Snap(Cols)
    Returns the number of columns in the saved screen image.
    Snap(Ebcdic,...)
    Performs the Ebcdic action on the saved screen image.
    Snap(ReadBuffer)
    Performs the ReadBuffer action on the saved screen image.
    Snap(Rows)
    Returns the number of rows in the saved screen image.
    Snap(Save)
    Saves a copy of the screen image and status in a temporary buffer. This copy can be queried with other Snap actions to allow a script to examine a consistent screen image, even when the host may be changing the image (or even the screen dimensions) dynamically.
    Snap(Status)
    Returns the status line from when the screen was last saved.
    Snap(Wait[,timeout],Output)
    Pauses the script until the host sends further output, then updates the snap buffer with the new screen contents. Used when the host unlocks the keyboard (allowing the script to proceed after an Enter, PF or PA action), but has not finished updating the screen. This action is usually invoked in a loop that uses the Snap(Ascii) or Snap(Ebcdic) action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Snap action. The default is to wait indefinitely.

    Source(file)
    Read and execute commands from file. Any output from those commands will become the output from Source. If any of the commands fails, the Source command will not abort; it will continue reading commands until EOF.
    Title(text)
    Changes the x3270 window title to text.
    Transfer(keyword=value,...)
    Invokes IND$FILE file transfer. See FILE TRANSFER below.
    Wait([timeout,] 3270Mode)
    Used when communicating with a host that switches between NVT mode and 3270 mode. Pauses the script or macro until the host negotiates 3270 mode, then waits for a formatted screen as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(3270) is equivalent to Wait(3270Mode)

    Wait([timeout,] Disconnect)
    Pauses the script until the host disconnects. Often used to after sending a logoff command to a VM/CMS host, to ensure that the session is not unintentionally set to disconnected state.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] InputField)
    A useful utility for use at the beginning of scripts and after the Connect action. In 3270 mode, waits until the screen is formatted, and the host has positioned the cursor on a modifiable field. In NVT mode, waits until the host sends at least one byte of data.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait is equivalent to Wait(InputField).

    Wait([timeout,] NVTMode)
    Used when communicating with a host that switches between 3270 mode and NVT mode. Pauses the script or macro until the host negotiates NVT mode, then waits for a byte from the host as above.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    For backwards compatibility, Wait(ansi) is equivalent to Wait(NVTMode).

    Wait([timeout,] Output)
    Pauses the script until the host sends further output. Often needed when the host unlocks the keyboard (allowing the script to proceed after a Clear, Enter, PF or PA action), but has not finished updating the screen. Also used in non-blocking AID mode (see DIFFERENCES for details). This action is usually invoked in a loop that uses the Ascii or Ebcdic action to scan the screen for some pattern that indicates that the host has fully processed the last command.

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait([timeout,] Unlock)
    Pauses the script until the host unlocks the keyboard. This is useful when operating in non-blocking AID mode (toggle AidWait clear), to wait for a host command to complete. See DIFFERENCES for details).

    The optional timeout parameter specifies a number of seconds to wait before failing the Wait action. The default is to wait indefinitely.

    Wait(timeout, Seconds)
    Delays the script timeout seconds. Unlike the other forms of Wait, the timeout is not optional.
    WindowState(mode)
    If mode is Iconic, changes the x3270 window into an icon. If mode is Normal, changes the x3270 window from an icon to a normal window.

    File Transfer

    The Transfer action implements IND$FILE file transfer. This action requires that the IND$FILE program be installed on the IBM host, and that the 3270 cursor be located in a field that will accept a TSO or VM/CMS command.

    Because of the complexity and number of options for file transfer, the parameters to the Transfer action take the unique form of option=value, and can appear in any order. Note that if the value contains spaces (such as a VM/CMS file name), then the entire parameter must be quoted, e.g., "HostFile=xxx foo a". The options are:

    Option Required? Default Other Values
    Direction No receive send
    HostFile Yes    
    LocalFile Yes    
    Host No tso vm, cics
    Mode No ascii binary
    Cr No remove add, keep
    Remap No yes no
    Exist No keep replace, append
    Recfm No   fixed, variable, undefined
    Lrecl No    
    Blksize No    
    Allocation No   tracks, cylinders, avblock
    PrimarySpace Sometimes    
    SecondarySpace No    
    Avblock Sometimes    
    BufferSize No 4096  

    The option details are as follows.

    Direction
    send to send a file to the host, receive to receive a file from the host.
    HostFile
    The name of the file on the host.
    LocalFile
    The name of the file on the local workstation.
    Host
    The type of host (which dictates the form of the IND$FILE command): tso (the default), vm or cics.
    Mode
    Use ascii (the default) for a text file, which will be translated between EBCDIC and ASCII as necessary. Use binary for non-text files.
    Cr
    Controls how Newline characters are handled when transferring Mode=ascii files. remove (the default) strips Newline characters in local files before transferring them to the host. add adds Newline characters to each host file record before transferring it to the local workstation. keep preserves Newline characters when transferring a local file to the host.
    Remap
    Controls text translation for Mode=ascii files. The value yes (the default) causes x3270 to remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page. The value no causes x3270 to pass the text to or from the host as-is, leaving all translation to the IND$FILE program on the host.
    Exist
    Controls what happens when the destination file already exists. keep (the default) preserves the file, causing the Transfer action to fail. replace overwrites the destination file with the source file. append appends the source file to the destination file.
    Recfm
    Controls the record format of files created on the host. (TSO and VM hosts only.) fixed creates a file with fixed-length records. variable creates a file with variable-length records. undefined creates a file with undefined-length records (TSO hosts only). The Lrecl option controls the record length or maximum record length for Recfm=fixed and Recfm=variable files, respectively.
    Lrecl
    Specifies the record length (or maximum record length) for files created on the host. (TSO and VM hosts only.)
    Blksize
    Specifies the block size for files created on the host. (TSO and VM hosts only.)
    Allocation
    Specifies the units for the PrimarySpace and SecondarySpace options: tracks, cylinders or avblock. (TSO hosts only.)
    PrimarySpace
    Primary allocation for a file. The units are given by the Allocation option. Required when the Allocation is specified as something other than default. (TSO hosts only.)
    SecondarySpace
    Secondary allocation for a file. The units are given by the Allocation option. (TSO hosts only.)
    Avblock
    Average block size, required when Allocation specifies avblock. (TSO hosts only.)
    BufferSize
    Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.

    There are also resources that control the default values for each of the file transfer parameters. These resources have the same names as the Transfer keywords, but with ft prepended. E.g., the default for the Mode keyword is the x3270.ftMode resource.

    See Also

    expect(1)
    perl(1)
    ksh(1)
    x3270(1)
    x3270if(1)
    c3270(1)
    s3270(1)

    Version

    Version 3.6ga4
    This HTML document and the accompanying troff document were generated with a set of write-only m4 macros and the powerful vi editor.
    Last modified 29 December 2017.
    suite3270-3.6/x3270/html/x3270.xbm0000664000076500007650000000434413221577164014224 0ustar pdmpdm#define x3270_width 50 #define x3270_height 50 static unsigned char x3270_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xaf, 0xfe, 0xff, 0xe7, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xfa, 0xff, 0xff, 0xbf, 0x0f, 0x00, 0x78, 0xed, 0x62, 0x0c, 0x73, 0x0f, 0x00, 0xf8, 0x5a, 0xdf, 0x7b, 0xad, 0x0f, 0x00, 0x78, 0xb5, 0xe7, 0xbc, 0x6d, 0x0f, 0x00, 0xf8, 0x5a, 0x5f, 0xdf, 0xed, 0x0f, 0x00, 0x78, 0xed, 0x62, 0xd8, 0x73, 0x0f, 0x00, 0xf8, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x43, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x10, 0x44, 0x44, 0x44, 0x84, 0x42, 0x00, 0x08, 0x11, 0x11, 0x11, 0x41, 0x42, 0x00, 0x84, 0x88, 0x88, 0x88, 0x48, 0x42, 0x00, 0x24, 0x22, 0x22, 0x22, 0x22, 0xfe, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; suite3270-3.6/x3270/Husk.c0000664000076500007650000001251013221577164013035 0ustar pdmpdm/* * Copyright (c) 1996-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Husk.c - Husk composite widget * A "Husk" (a nearly useless shell) is a trivial container widget, a * subclass of the Athena Composite widget with a no-op geometry manager * that allows children to move and resize themselves at will. */ #include "globals.h" #include #include #include #include #include "HuskP.h" static void ClassInitialize(void); static void Initialize(Widget, Widget, ArgList, Cardinal *); static void Realize(register Widget, Mask *, XSetWindowAttributes *); static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *, XtWidgetGeometry *); static void ChangeManaged(Widget); static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *, XtWidgetGeometry *); HuskClassRec huskClassRec = { { /* core_class fields */ /* superclass */ (WidgetClass) & compositeClassRec, /* class_name */ "Husk", /* widget_size */ sizeof(HuskRec), /* class_initialize */ ClassInitialize, /* class_part_init */ NULL, /* class_inited */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ NULL, /* num_actions */ 0, /* resources */ NULL, /* num_resources */ 0, /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ NULL, /* expose */ NULL, /* set_values */ SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ NULL, /* query_geometry */ QueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL }, { /* composite_class fields */ /* geometry_manager */ GeometryManager, /* change_managed */ ChangeManaged, /* insert_child */ XtInheritInsertChild, /* delete_child */ XtInheritDeleteChild, /* extension */ NULL }, { /* Husk class fields */ /* empty */ 0, } }; WidgetClass huskWidgetClass = (WidgetClass)&huskClassRec; static XtGeometryResult QueryGeometry(Widget widget _is_unused, XtWidgetGeometry *constraint _is_unused, XtWidgetGeometry *preferred _is_unused) { return XtGeometryYes; } static XtGeometryResult GeometryManager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply _is_unused) { /* Always succeed. */ if (!(request->request_mode & XtCWQueryOnly)) { if (request->request_mode & CWX) w->core.x = request->x; if (request->request_mode & CWY) w->core.y = request->y; if (request->request_mode & CWWidth) w->core.width = request->width; if (request->request_mode & CWHeight) w->core.height = request->height; if (request->request_mode & CWBorderWidth) w->core.border_width = request->border_width; } return XtGeometryYes; } static void ChangeManaged(Widget w _is_unused) { } static void ClassInitialize(void) { XawInitializeWidgetSet(); } static void Initialize(Widget request _is_unused, Widget new _is_unused, ArgList args _is_unused, Cardinal *num_args _is_unused) { } static void Realize(register Widget w, Mask *valueMask, XSetWindowAttributes *attributes) { attributes->bit_gravity = NorthWestGravity; *valueMask |= CWBitGravity; XtCreateWindow(w, (unsigned)InputOutput, (Visual *)CopyFromParent, *valueMask, attributes); } static Boolean SetValues(Widget current _is_unused, Widget request _is_unused, Widget new _is_unused, ArgList args _is_unused, Cardinal *num_args _is_unused) { return False; } suite3270-3.6/x3270/Husk.h0000664000076500007650000000427213221577164013050 0ustar pdmpdm/* * Copyright (c) 1996-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Husk.h * Husk Widget (subclass of CompositeClass) */ /* Parameters: Name Class RepType Default Value ---- ----- ------- ------------- background Background Pixel XtDefaultBackground border BorderColor Pixel XtDefaultForeground borderWidth BorderWidth Dimension 1 destroyCallback Callback Pointer NULL height Height Dimension 0 mappedWhenManaged MappedWhenManaged Boolean True width Width Dimension 0 x Position Position 0 y Position Position 0 */ /* Class record constants */ extern WidgetClass huskWidgetClass; typedef struct _HuskClassRec *HuskWidgetClass; typedef struct _HuskRec *HuskWidget; suite3270-3.6/x3270/HuskP.h0000664000076500007650000000423313221577164013165 0ustar pdmpdm/* * Copyright (c) 1996-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * HuskP.h * Private definitions for Husk widget */ /* Husk Widget Private Data */ #include "Husk.h" #include /* New fields for the Husk widget class record */ typedef struct {int empty;} HuskClassPart; /* Full class record declaration */ typedef struct _HuskClassRec { CoreClassPart core_class; CompositeClassPart composite_class; HuskClassPart husk_class; } HuskClassRec; extern HuskClassRec huskClassRec; /* New fields for the Husk widget record */ typedef struct {int empty;} HuskPart; /* Full instance record declaration */ typedef struct _HuskRec { CorePart core; CompositePart composite; HuskPart husk; } HuskRec; suite3270-3.6/x3270/ibm_hosts0000664000076500007650000000205213221577163013670 0ustar pdmpdm# Sample x3270 ibm_hosts file. # # The format of each entry is: # # name type [prefix]hostname[:port] [actions] # # where # # name is a name you wish to give to the host. This name # can be used on the x3270 command line, and is the # name that will appear on the x3270 "Connect" menu. # # type is one of two keywords. The value "primary" means # the entry will appear on the "Connect" menu. The # value "alias" means it will not. # # hostname is the hostname or Internet address of the host to # to connect to. It can be preceded by a prefix such # as "s:" or "p:" or an LU name (see the x3270 man # page), and it can be followed by a "/" or ":" and a # port number to indicate a TCP port other than the # x3270 default (usually "telnet"). # # actions is an x3270 action or actions to execute once the # connection is made and a data-entry field is defined. # If the text looks like x3270 actions, e.g., PF(1), # it is unmodified; otherwise the text is used as a # parameter to the String() action. # #localhost primary 127.0.0.1 suite3270-3.6/x3270/ibm_hosts.man0000664000076500007650000000571113221600611014430 0ustar pdmpdm'\" t .TH IBM_HOSTS 5 "29 December 2017" .SH "NAME" ibm_hosts \- host database for x3270 and c3270 .SH "SYNOPSIS" /usr/lib/X11/x3270/ibm_hosts .SH "DESCRIPTION" The \fBibm_hosts\fP file contains information regarding IBM hosts on the network. An \fIIBM host\fP is a host which can communicate with a 3270 terminal emulator such as \fBx3270\fP or \fBc3270\fP. Each line defines a name in the following format (optional fields are shown in brackets): .LP \fIname\fP \fItype\fP [\fIopt\fP:]...[\fIluname\fP@]\fIhostname\fP[:\fIport\fP] [\fIactions\fP] .LP Items are separated by any number of blanks and/or TAB characters. A line beginning with # is taken as a comment (note that # anywhere else on a line does \fInot\fP indicate a comment). .LP The \fIname\fP field is a mnemonic used to identify the host. .LP The \fItype\fP field is a keyword that indicates the type of entry. The value \fBprimary\fP means that the \fIname\fP will be included in host-selection menus that may be displayed by a 3270 emulator. The value \fBalias\fP means that the \fIname\fP will not be included in menus, but will still be accepted as valid input when a host name is required. .LP The \fIhostname\fP field is the Internet hostname or dot-notation Internet address of the host. .LP The \fIhostname\fP can include `s:' or `p:' prefixes, e.g., \fBs:finicky\fP (see the \fIx3270\fP(1) or \fIc3270\fP(1) man page sfor details). It can also include an LU name, separated by an `@' character, e.g., \fBoddlu@bluehost\fP. Finally, it can include a non-default \fIport\fP number, appended to the \fIhostname\fP with a colon `:' character, e.g., \fBbluehost:97\fP. (For compatability with earlier versions of \fIx3270\fP, the \fIport\fP can also be separated by a slash `/' character.) .LP The optional \fIactions\fP field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., \fBPF(1)\fP, it is unmodified; otherwise it is taken as the parameter to the \fBString()\fP action. The \fIactions\fP are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. .SH "EXAMPLE" Given the following \fBibm_hosts\fP file: .LP .RS mvs primary mvs-host .br tso alias mvs-host .br mvs2 primary mvs-host:4012 .br vm primary vtam Tab() String(3) Enter() .RE A 3270 emulator will display four names (\fBmvs\fP, \fBmvs2\fP, \fBafhost\fP and \fBvm\fP) on its hosts menu. The names \fBmvs\fP and \fBtso\fP will cause connections to the host \fBmvs-host\fP. The name \fBmvs2\fP will also cause a connection to \fBmvs-host\fP, but to port 4012 rather than the emulator's default port (usually 23). The name \fBvm\fP will cause the 3270 emulator to connect to the host \fBvtam\fP (presumably some sort of host-selection front-end), enter the string `3' on the second data-entry field on the screen, and send the Enter \s-1AID\s+1 sequence. .SH "FILES" /usr/lib/X11/x3270/ibm_hosts .SH "SEE ALSO" x3270(1), c3270(1) suite3270-3.6/x3270/ibm_hosts.man.m40000664000076500007650000001122513221577163014763 0ustar pdmpdmdnl Copyright (c) 1994-2009, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XX_TH(IBM_HOSTS,5,XX_DATE) XX_SH(Name) ibm_hosts XX_DASHED() host database for x3270 and c3270 XX_SH(Synopsis) /usr/lib/X11/x3270/ibm_hosts XX_SH(Description) The XX_FB(ibm_hosts) file contains information regarding IBM hosts on the network. An XX_FI(IBM host) is a host which can communicate with a 3270 terminal emulator such as XX_FB(x3270) or XX_FB(c3270). Each line defines a name in the following format (optional fields are shown in brackets): XX_LP XX_FI(name) XX_FI(type) [XX_FI(opt):]...[XX_FI(luname)@]XX_FI(hostname)[:XX_FI(port)] [XX_FI(actions)] XX_LP Items are separated by any number of blanks and/or TAB characters. A line beginning with `#' is taken as a comment (note that `#' anywhere else on a line does XX_FI(not) indicate a comment). XX_LP The XX_FI(name) field is a mnemonic used to identify the host. XX_LP The XX_FI(type) field is a keyword that indicates the type of entry. The value XX_FB(primary) means that the XX_FI(name) will be included in host-selection menus that may be displayed by a 3270 emulator. The value XX_FB(alias) means that the XX_FI(name) will not be included in menus, but will still be accepted as valid input when a host name is required. XX_LP The XX_FI(hostname) field is the Internet hostname or dot-notation Internet address of the host. XX_LP The XX_FI(hostname) can `include' ``s:'' or ``p:'' prefixes, e.g., XX_FB(s:finicky) (see the XX_LINK(x3270-man.html,XX_FI(x3270)(1)) or XX_LINK(c3270-man.html,XX_FI(c3270)(1)) man page sfor details). It can also include an LU name, separated by an ``@'' character, e.g., XX_FB(oddlu@bluehost). Finally, it can include a non-default XX_FI(port) number, appended to the XX_FI(hostname) with a colon ``:'' character, e.g., XX_FB(bluehost:97). (For compatability with earlier versions of XX_FI(x3270), the XX_FI(port) can also be separated by a slash ``/'' character.) XX_LP The optional XX_FI(actions) field specifies actions to be taken once the connection is made and a data-entry field is defined. If the text looks like an action, e.g., XX_FB(PF(1)), it is unmodified; otherwise it is taken as the parameter to the XX_FB(String()) action. The XX_FI(actions) are not intended for entering usernames and passwords; rather they provide an automated way of specifying a front-end menu option. XX_SH(Example) Given the following XX_FB(ibm_hosts) file: XX_LP XX_RS(`mvs primary mvs-host XX_BR tso alias mvs-host XX_BR mvs2 primary mvs-host:4012 XX_BR vm primary vtam Tab() String(3) Enter() ') A 3270 emulator will display four names (XX_FB(mvs), XX_FB(mvs2), XX_FB(afhost) and XX_FB(vm)) on its hosts menu. The names XX_FB(mvs) and XX_FB(tso) will cause connections to the host XX_FB(mvs-host). The name XX_FB(mvs2) will also cause a connection to XX_FB(mvs-host), but to port 4012 rather than the emulator's default port (usually 23). The name XX_FB(vm) will cause the 3270 emulator to connect to the host XX_FB(vtam) (presumably some sort of host-selection front-end), enter the string ``3'' on the second data-entry field on the screen, and send the Enter XX_SM(AID) sequence. XX_SH(Files) /usr/lib/X11/x3270/ibm_hosts XX_SH(See Also) XX_LINK(x3270-man.html,x3270(1)), XX_LINK(c3270-man.html,c3270(1)) suite3270-3.6/x3270/idle_gui.c0000664000076500007650000003426613221577164013720 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2014-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * idle_gui.c * This module handles the idle command GUI. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include #include #include #include #include #include #include "appres.h" #include "dialog.h" #include "idle.h" #include "idle_gui.h" #include "objects.h" #include "popups.h" #include "xmenubar.h" #include "xpopups.h" /* Macros. */ #define FILE_WIDTH 300 /* width of file name widgets */ #define MARGIN 3 /* distance from margins to widgets */ #define CLOSE_VGAP 0 /* distance between paired toggles */ #define FAR_VGAP 10 /* distance between single toggles and groups */ #define BUTTON_GAP 5 /* horizontal distance between buttons */ /* Globals. */ /* Statics. */ static enum idle_enum s_disabled = IDLE_DISABLED; static enum idle_enum s_session = IDLE_SESSION; static enum idle_enum s_perm = IDLE_PERM; static char hms = 'm'; static bool fuzz = false; static char s_hours = 'h'; static char s_minutes = 'm'; static char s_seconds = 's'; static Widget idle_dialog, idle_shell, command_value, timeout_value; static Widget enable_toggle, enable_perm_toggle, disable_toggle; static Widget hours_toggle, minutes_toggle, seconds_toggle, fuzz_toggle; static sr_t *idle_sr = NULL; static void idle_cancel(Widget w, XtPointer client_data, XtPointer call_data); static void idle_popup_callback(Widget w, XtPointer client_data, XtPointer call_data); static void idle_popup_init(void); static bool idle_start(void); static void okay_callback(Widget w, XtPointer call_parms, XtPointer call_data); static void toggle_enable(Widget w, XtPointer client_data, XtPointer call_data); static void mark_toggle(Widget w, Pixmap p); static void toggle_hms(Widget w, XtPointer client_data, XtPointer call_data); static void toggle_fuzz(Widget w, XtPointer client_data, XtPointer call_data); /* "Idle Command" dialog. */ /* * Pop up the "Idle" menu. * Called back from the "Configure Idle Command" option on the Options menu. */ void popup_idle(void) { char *its; char *s; /* Initialize it. */ if (idle_shell == NULL) { idle_popup_init(); } /* * Split the idle_timeout_string (the raw resource value) into fuzz, * a number, and h/m/s. */ its = NewString(idle_timeout_string); if (its != NULL) { if (*its == '~') { fuzz = true; its++; } else { fuzz = false; } s = its; while (isdigit((unsigned char)*s)) { s++; } switch (*s) { case 'h': case 'H': hms = 'h'; break; case 'm': case 'M': hms = 'm'; break; case 's': case 'S': hms = 's'; break; default: break; } *s = '\0'; } /* Set the resource values. */ dialog_set(&idle_sr, idle_dialog); XtVaSetValues(command_value, XtNstring, idle_command, NULL); XtVaSetValues(timeout_value, XtNstring, its, NULL); mark_toggle(enable_toggle, (idle_user_enabled == IDLE_SESSION)? diamond : no_diamond); mark_toggle(enable_perm_toggle, (idle_user_enabled == IDLE_PERM)? diamond : no_diamond); mark_toggle(disable_toggle, (idle_user_enabled == IDLE_DISABLED)? diamond : no_diamond); mark_toggle(hours_toggle, (hms == 'h') ? diamond : no_diamond); mark_toggle(minutes_toggle, (hms == 'm') ? diamond : no_diamond); mark_toggle(seconds_toggle, (hms == 's') ? diamond : no_diamond); mark_toggle(fuzz_toggle, fuzz ? dot : no_dot); /* Pop it up. */ popup_popup(idle_shell, XtGrabNone); } /* Initialize the idle pop-up. */ static void idle_popup_init(void) { Widget w; Widget cancel_button; Widget command_label, timeout_label; Widget okay_button; /* Prime the dialog functions. */ dialog_set(&idle_sr, idle_dialog); /* Create the menu shell. */ idle_shell = XtVaCreatePopupShell( "idlePopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(idle_shell, XtNpopupCallback, place_popup, (XtPointer)CenterP); XtAddCallback(idle_shell, XtNpopupCallback, idle_popup_callback, NULL); /* Create the form within the shell. */ idle_dialog = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, idle_shell, NULL); /* Create the file name widgets. */ command_label = XtVaCreateManagedWidget( "command", labelWidgetClass, idle_dialog, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); command_value = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, idle_dialog, XtNeditType, XawtextEdit, XtNwidth, FILE_WIDTH, XtNvertDistance, FAR_VGAP, XtNfromHoriz, command_label, XtNhorizDistance, 0, NULL); dialog_match_dimension(command_label, command_value, XtNheight); w = XawTextGetSource(command_value); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_command); } dialog_register_sensitivity(command_value, NULL, False, NULL, False, NULL, False); timeout_label = XtVaCreateManagedWidget( "timeout", labelWidgetClass, idle_dialog, XtNfromVert, command_label, XtNvertDistance, 3, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); timeout_value = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, idle_dialog, XtNeditType, XawtextEdit, XtNwidth, FILE_WIDTH, XtNdisplayCaret, False, XtNfromVert, command_label, XtNvertDistance, 3, XtNfromHoriz, timeout_label, XtNhorizDistance, 0, NULL); dialog_match_dimension(timeout_label, timeout_value, XtNheight); dialog_match_dimension(command_label, timeout_label, XtNwidth); w = XawTextGetSource(timeout_value); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_numeric); } dialog_register_sensitivity(timeout_value, NULL, False, NULL, False, NULL, False); /* Create the hour/minute/seconds radio buttons. */ hours_toggle = XtVaCreateManagedWidget( "hours", commandWidgetClass, idle_dialog, XtNfromVert, timeout_value, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNsensitive, True, NULL); dialog_apply_bitmap(hours_toggle, no_diamond); XtAddCallback(hours_toggle, XtNcallback, toggle_hms, (XtPointer)&s_hours); minutes_toggle = XtVaCreateManagedWidget( "minutes", commandWidgetClass, idle_dialog, XtNfromVert, timeout_value, XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, hours_toggle, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNsensitive, True, NULL); dialog_apply_bitmap(minutes_toggle, diamond); XtAddCallback(minutes_toggle, XtNcallback, toggle_hms, (XtPointer)&s_minutes); seconds_toggle = XtVaCreateManagedWidget( "seconds", commandWidgetClass, idle_dialog, XtNfromVert, timeout_value, XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, minutes_toggle, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNsensitive, True, NULL); dialog_apply_bitmap(seconds_toggle, no_diamond); XtAddCallback(seconds_toggle, XtNcallback, toggle_hms, (XtPointer)&s_seconds); /* Create the fuzz toggle. */ fuzz_toggle = XtVaCreateManagedWidget( "fuzz", commandWidgetClass, idle_dialog, XtNfromVert, hours_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNsensitive, True, NULL); dialog_apply_bitmap(fuzz_toggle, no_dot); XtAddCallback(fuzz_toggle, XtNcallback, toggle_fuzz, NULL); /* Create enable/disable toggles. */ enable_toggle = XtVaCreateManagedWidget( "enable", commandWidgetClass, idle_dialog, XtNfromVert, fuzz_toggle, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(enable_toggle, (idle_user_enabled == IDLE_SESSION)? diamond: no_diamond); XtAddCallback(enable_toggle, XtNcallback, toggle_enable, (XtPointer)&s_session); enable_perm_toggle = XtVaCreateManagedWidget( "enablePerm", commandWidgetClass, idle_dialog, XtNfromVert, enable_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(enable_perm_toggle, (idle_user_enabled == IDLE_PERM)? diamond: no_diamond); XtAddCallback(enable_perm_toggle, XtNcallback, toggle_enable, (XtPointer)&s_perm); disable_toggle = XtVaCreateManagedWidget( "disable", commandWidgetClass, idle_dialog, XtNfromVert, enable_perm_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, NULL); dialog_apply_bitmap(disable_toggle, (idle_user_enabled == IDLE_DISABLED)? diamond: no_diamond); XtAddCallback(disable_toggle, XtNcallback, toggle_enable, (XtPointer)&s_disabled); /* Set up the buttons at the bottom. */ okay_button = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, idle_dialog, XtNfromVert, disable_toggle, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, NULL); XtAddCallback(okay_button, XtNcallback, okay_callback, NULL); cancel_button = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, idle_dialog, XtNfromVert, disable_toggle, XtNvertDistance, FAR_VGAP, XtNfromHoriz, okay_button, XtNhorizDistance, BUTTON_GAP, NULL); XtAddCallback(cancel_button, XtNcallback, idle_cancel, 0); } /* Callbacks for all the idle widgets. */ /* Idle pop-up popping up. */ static void idle_popup_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* Set the focus to the command widget. */ PA_dialog_focus_xaction(command_value, NULL, NULL, NULL); } /* Cancel button pushed. */ static void idle_cancel(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(idle_shell); } /* OK button pushed. */ static void okay_callback(Widget w _is_unused, XtPointer call_parms _is_unused, XtPointer call_data _is_unused) { if (idle_start()) { idle_changed = true; XtPopdown(idle_shell); } } /* Mark a toggle. */ static void mark_toggle(Widget w, Pixmap p) { XtVaSetValues(w, XtNleftBitmap, p, NULL); } /* Hour/minute/second options. */ static void toggle_hms(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag */ hms = *(char *)client_data; /* Change the widget states. */ mark_toggle(hours_toggle, (hms == 'h') ? diamond : no_diamond); mark_toggle(minutes_toggle, (hms == 'm') ? diamond : no_diamond); mark_toggle(seconds_toggle, (hms == 's') ? diamond : no_diamond); } /* Fuzz option. */ static void toggle_fuzz(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag */ fuzz = !fuzz; /* Change the widget state. */ mark_toggle(fuzz_toggle, fuzz ? dot : no_dot); } /* Enable/disable options. */ static void toggle_enable(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag */ idle_user_enabled = *(enum idle_enum *)client_data; /* Change the widget states. */ mark_toggle(enable_toggle, (idle_user_enabled == IDLE_SESSION)? diamond: no_diamond); mark_toggle(enable_perm_toggle, (idle_user_enabled == IDLE_PERM)? diamond: no_diamond); mark_toggle(disable_toggle, (idle_user_enabled == IDLE_DISABLED)? diamond: no_diamond); } /* * Called when the user presses the OK button on the idle command dialog. * Returns true for success, false otherwise. */ static bool idle_start(void) { char *cmd, *tmo, *its; /* Update the globals, so the dialog has the same values next time. */ XtVaGetValues(command_value, XtNstring, &cmd, NULL); Replace(idle_command, NewString(cmd)); XtVaGetValues(timeout_value, XtNstring, &tmo, NULL); its = Malloc(strlen(tmo) + 3); (void) sprintf(its, "%s%s%c", fuzz? "~": "", tmo, hms); Replace(idle_timeout_string, its); /* See if they've turned it off. */ if (!idle_user_enabled) { /* If they're turned it off, cancel the timer. */ cancel_idle_timer(); return true; } /* They've turned it on, and possibly reconfigured it. */ /* Validate the timeout. It should work, yes? */ if (!process_idle_timeout_value(its)) { return false; } /* Seems okay. Reset to the new interval and command. */ if (IN_3270) { reset_idle_timer(); } return true; } suite3270-3.6/x3270/idle_gui.h0000664000076500007650000000314513221577164013715 0ustar pdmpdm/* * Copyright (c) 2002-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * idle_gui.h * Global declarations for idle_gui.c. */ void popup_idle(void); suite3270-3.6/x3270/keymap.c0000664000076500007650000007357313221577164013431 0ustar pdmpdm/* * Copyright (c) 1996-2010, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * keymap.c * This module handles keymaps. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include #include #include #include #include #include "appres.h" #include "objects.h" #include "resources.h" #include "host.h" #include "keymap.h" #include "kybd.h" #include "popups.h" #include "screen.h" #include "status.h" #include "utils.h" #include "xactions.h" #include "xkeypad.h" #include "xmenubar.h" #include "xscreen.h" #include "xstatus.h" #include "xpopups.h" #define PA_ENDL " " PA_END "()" #define Res3270 "3270" bool keymap_changed = false; struct trans_list *trans_list = NULL; static struct trans_list **last_trans = &trans_list; static struct trans_list *tkm_last; struct trans_list *temp_keymaps; /* temporary keymap list */ char *keymap_trace = NULL; static char *last_keymap = NULL; static bool last_nvt = false; static bool last_3270 = false; static void setup_keymaps(const char *km, bool do_popup); static void add_keymap(const char *name, bool do_popup); static void add_trans(const char *name, char *translations, char *pathname, bool is_from_server); static char *get_file_keymap(const char *name, char **pathp); static void keymap_3270_mode(bool); /* Undocumented Xt function to convert translations to text. */ extern String _XtPrintXlations(Widget w, XtTranslations xlations, Widget accelWidget, bool includeRHS); static enum { SORT_EVENT, SORT_KEYMAP, SORT_ACTION } sort = SORT_KEYMAP; static bool km_isup = false; static bool km_exists = false; static Widget km_shell, sort_event, sort_keymap, sort_byaction, text; static char km_file[128]; static void create_text(void); static void km_up(Widget w, XtPointer client_data, XtPointer call_data); static void km_down(Widget w, XtPointer client_data, XtPointer call_data); static void km_done(Widget w, XtPointer client_data, XtPointer call_data); static void do_sort_byaction(Widget w, XtPointer client_data, XtPointer call_data); static void do_sort_keymap(Widget w, XtPointer client_data, XtPointer call_data); static void do_sort_event(Widget w, XtPointer client_data, XtPointer call_data); static void format_xlations(String s, FILE *f); static int action_cmp(char *s1, char *s2); static int keymap_cmp(char *k1, int l1, char *k2, int l2); static int event_cmp(char *e1, char *e2); static bool is_temp(char *k); static char *pathname(char *k); static bool from_server(char *k); static void km_regen(void); char *current_keymap = NULL; /** * Keymap module registration. */ void keymap_register(void) { register_schange(ST_3270_MODE, keymap_3270_mode); register_schange(ST_CONNECT, keymap_3270_mode); } /* Keymap initialization. */ void keymap_init(const char *km, bool interactive) { static bool initted = false; if (km == NULL && (km = (char *)getenv("KEYMAP")) == NULL && (km = (char *)getenv("KEYBD")) == NULL) { km = "@server"; } setup_keymaps(km, interactive); if (!initted) { initted = true; last_nvt = IN_NVT; last_3270 = IN_3270; } else { struct trans_list *t; XtTranslations trans; screen_set_keymap(); keypad_set_keymap(); /* Re-apply any temporary keymaps. */ for (t = temp_keymaps; t != NULL; t = t->next) { trans = lookup_tt(t->name, NULL); screen_set_temp_keymap(trans); keypad_set_temp_keymap(trans); } } km_regen(); /* Save the name(s) of the last keymap, so we can switch modes later. */ if (km != last_keymap) { Replace(last_keymap, km? NewString(km): NULL); } } /* * 3270/NVT mode change. */ static void keymap_3270_mode(bool ignored _is_unused) { if (last_nvt != IN_NVT || last_3270 != IN_3270) { last_nvt = IN_NVT; last_3270 = IN_3270; /* Switch between 3270 and NVT keymaps. */ keymap_init(last_keymap, false); } } /* * Set up a user keymap. */ static void setup_keymaps(const char *km, bool do_popup) { char *bkm; bool saw_apl_keymod = false; struct trans_list *t; struct trans_list *next; /* Make sure it starts with "base". */ if (km == NULL) bkm = XtNewString("base"); else bkm = xs_buffer("base,%s", km); if (do_popup) keymap_changed = true; /* Clear out any existing translations. */ Replace(current_keymap, NULL); for (t = trans_list; t != NULL; t = next) { next = t->next; Free(t->name); Free(t->pathname); Free(t); } trans_list = NULL; last_trans = &trans_list; /* Build up the new list. */ if (bkm != NULL) { char *ns = XtNewString(bkm); char *n0 = ns; char *comma; do { comma = strchr(ns, ','); if (comma) *comma = '\0'; if (!strcmp(ns, Apl)) saw_apl_keymod = true; add_keymap(ns, do_popup); if (comma) ns = comma + 1; else ns = NULL; } while (ns); XtFree(n0); } if (appres.apl_mode && !saw_apl_keymod) add_keymap(Apl, do_popup); XtFree(bkm); } /* * Get a keymap from a file. */ static char * get_file_keymap(const char *name, char **pathp) { char *path; XrmDatabase dd = NULL; char *resname; XrmValue value; char *type; char *r = NULL; *pathp = NULL; /* Look for a global keymap file. */ if (dd == NULL) { path = xs_buffer("%s/keymap.%s", appres.conf_dir, name); dd = XrmGetFileDatabase(path); if (dd != NULL) *pathp = path; else { XtFree(path); return NULL; } } /* Look up the resource in that file. */ resname = xs_buffer("%s.%s.%s", XtName(toplevel), ResKeymap, name); if ((XrmGetResource(dd, resname, 0, &type, &value) == True) && *value.addr) { r = XtNewString(value.addr); } else { *pathp = NULL; } XtFree(resname); XrmDestroyDatabase(dd); return r; } /* * Add to the list of user-specified keymap translations, finding both the * system and user versions of a keymap. */ static void add_keymap(const char *name, bool do_popup) { char *translations, *translations_nvt, *translations_3270; char *buf, *buf_nvt, *buf_3270; int any = 0; char *path, *path_nvt, *path_3270; bool is_from_server = false; if (strcmp(name, "base")) { if (current_keymap == NULL) current_keymap = XtNewString(name); else { Replace(current_keymap, xs_buffer("%s,%s", current_keymap, name)); } } /* Translate '@server' to a vendor-specific keymap. */ if (!strcmp(name, "@server")) { struct sk { struct sk *next; char *vendor; char *keymap; }; static struct sk *sk_list = NULL; struct sk *sk; if (sk_list == NULL) { char *s, *vendor, *keymap; s = get_resource("serverKeymapList"); if (s == NULL) return; s = XtNewString(s); while (split_dresource(&s, &vendor, &keymap) == 1) { sk = (struct sk *)XtMalloc(sizeof(struct sk)); sk->vendor = vendor; sk->keymap = keymap; sk->next = sk_list; sk_list = sk; } } for (sk = sk_list; sk != NULL; sk = sk->next) { if (!strcmp(sk->vendor, ServerVendor(display))) { name = sk->keymap; is_from_server = true; break; } } if (sk == NULL) return; } /* Try for a file first, then resources. */ translations = get_file_keymap(name, &path); buf_nvt = xs_buffer("%s.%s", name, ResNvt); translations_nvt = get_file_keymap(buf_nvt, &path_nvt); buf_3270 = xs_buffer("%s.%s", name, Res3270); translations_3270 = get_file_keymap(buf_3270, &path_3270); if (translations != NULL || translations_nvt != NULL || translations_3270 != NULL) { any++; if (translations != NULL) add_trans(name, translations, path, is_from_server); if (IN_NVT && translations_nvt != NULL) { add_trans(buf_nvt, translations_nvt, path_nvt, is_from_server); } if (IN_3270 && translations_3270 != NULL) add_trans(buf_3270, translations_3270, path_3270, is_from_server); XtFree(translations); XtFree(translations_nvt); XtFree(translations_3270); XtFree(buf_nvt); XtFree(buf_3270); } else { XtFree(buf_nvt); XtFree(buf_3270); /* Shared keymap. */ buf = xs_buffer("%s.%s", ResKeymap, name); translations = get_resource(buf); buf_nvt = xs_buffer("%s.%s.%s", ResKeymap, name, ResNvt); translations_nvt = get_resource(buf_nvt); buf_3270 = xs_buffer("%s.%s.%s", ResKeymap, name, Res3270); translations_3270 = get_resource(buf_3270); if (translations != NULL || translations_nvt != NULL || translations_3270) any++; if (translations != NULL) add_trans(name, translations, NULL, is_from_server); if (IN_NVT && translations_nvt != NULL) { add_trans(buf_nvt + strlen(ResKeymap) + 1, translations_nvt, NULL, is_from_server); } if (IN_3270 && translations_3270 != NULL) add_trans(buf_3270 + strlen(ResKeymap) + 1, translations_3270, NULL, is_from_server); XtFree(buf); XtFree(buf_nvt); XtFree(buf_3270); /* User keymap */ buf = xs_buffer("%s.%s.%s", ResKeymap, name, ResUser); translations = get_resource(buf); buf_nvt = xs_buffer("%s.%s.%s.%s", ResKeymap, name, ResNvt, ResUser); translations_nvt = get_resource(buf_nvt); buf_3270 = xs_buffer("%s.%s.%s.%s", ResKeymap, name, Res3270, ResUser); translations_3270 = get_resource(buf_3270); if (translations != NULL || translations_nvt != NULL || translations_3270 != NULL) any++; if (IN_NVT && translations_nvt != NULL) { add_trans(buf_nvt + strlen(ResKeymap) + 1, translations_nvt, NULL, is_from_server); } if (IN_3270 && translations_3270 != NULL) add_trans(buf_3270 + strlen(ResKeymap) + 1, translations_3270, NULL, is_from_server); if (translations != NULL) add_trans(buf, translations, NULL, is_from_server); XtFree(buf); XtFree(buf_nvt); XtFree(buf_3270); } if (!any) { if (do_popup) popup_an_error("Cannot find %s \"%s\"", ResKeymap, name); else xs_warning("Cannot find %s \"%s\"", ResKeymap, name); } } /* * Add a single keymap name and translation to the translation list. */ static void add_trans(const char *name, char *translations, char *path_name, bool is_from_server) { struct trans_list *t; t = (struct trans_list *)XtMalloc(sizeof(*t)); t->name = XtNewString(name); t->pathname = path_name; t->is_temp = false; t->from_server = is_from_server; (void) lookup_tt(name, translations); t->next = NULL; *last_trans = t; last_trans = &t->next; } /* * Translation table expansion. */ /* Find the first unquoted newline an an action list. */ static char * unquoted_newline(char *s) { bool bs = false; enum { UQ_BASE, UQ_PLIST, UQ_Q } state = UQ_BASE; char c; for ( ; (c = *s); s++) { if (bs) { bs = false; continue; } else if (c == '\\') { bs = true; continue; } switch (state) { case UQ_BASE: if (c == '(') state = UQ_PLIST; else if (c == '\n') return s; break; case UQ_PLIST: if (c == ')') state = UQ_BASE; else if (c == '"') state = UQ_Q; break; case UQ_Q: if (c == '"') state = UQ_PLIST; break; } } return NULL; } /* Expand a translation table with keymap tracing calls. */ static char * expand_table(const char *name, char *table) { char *cm, *t0, *t, *s; int nlines = 1; if (table == NULL) return NULL; /* Roughly count the number of lines in the table. */ cm = table; while ((cm = strchr(cm, '\n')) != NULL) { nlines++; cm++; } /* Allocate a new buffer. */ t = t0 = (char *)XtMalloc(2 + strlen(table) + nlines * (strlen(" " PA_KEYMAP_TRACE "(,nnnn) ") + strlen(name) + strlen(PA_ENDL))); *t = '\0'; /* Expand the table into it. */ s = table; nlines = 0; while (*s) { /* Skip empty lines. */ while (*s == ' ' || *s == '\t') s++; if (*s == '\n') { *t++ = '\n'; *t = '\0'; s++; continue; } /* Find the '>' from the event name, and copy up through it. */ cm = strchr(s, '>'); if (cm == NULL) { while ((*t++ = *s++)) ; break; } while (s <= cm) *t++ = *s++; /* Find the ':' following, and copy up throught that. */ cm = strchr(s, ':'); if (cm == NULL) { while ((*t++ = *s++)) ; break; } nlines++; while (s <= cm) *t++ = *s++; /* Insert a PA-KeymapTrace call. */ (void) sprintf(t, " " PA_KEYMAP_TRACE "(%s,%d) ", name, nlines); t = strchr(t, '\0'); /* * Copy to the next unquoted newline and append a PA-End call. */ cm = unquoted_newline(s); if (cm == NULL) { while ((*t = *s)) { t++; s++; } } else { while (s < cm) *t++ = *s++; } (void) strcpy(t, PA_ENDL); t += strlen(PA_ENDL); if (cm == NULL) break; else *t++ = *s++; } *t = '\0'; return t0; } /* * Trace a keymap. * * This function leaves a value in the global "keymap_trace", which is used * by the xaction_debug function when subsequent actions are called. */ void PA_KeymapTrace_xaction(Widget w _is_unused, XEvent *event _is_unused, String *params, Cardinal *num_params) { if (!toggled(TRACING) || *num_params != 2) { return; } Replace(keymap_trace, XtMalloc(strlen(params[0]) + 1 + strlen(params[1]) + 1)); (void) sprintf(keymap_trace, "%s:%s", params[0], params[1]); } /* * End a keymap trace. * * This function clears the value in the global "keymap_trace". */ void PA_End_xaction(Widget w _is_unused, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { Replace(keymap_trace, NULL); } /* * Translation table cache. */ XtTranslations lookup_tt(const char *name, char *table) { struct tt_cache { char *name; XtTranslations trans; struct tt_cache *next; }; static struct tt_cache *tt_cache = NULL; struct tt_cache *t; char *xtable; /* Look for an old one. */ for (t = tt_cache; t != NULL; t = t->next) if (!strcmp(name, t->name)) return t->trans; /* Allocate and translate a new one. */ t = (struct tt_cache *)XtMalloc(sizeof(*t)); t->name = XtNewString(name); xtable = expand_table(name, table); t->trans = XtParseTranslationTable(xtable); Free(xtable); t->next = tt_cache; tt_cache = t; return t->trans; } /* * Set or clear a temporary keymap. * * If the parameter is NULL, removes all keymaps. * Otherwise, toggles the keymap by that name. * * Returns true if the action was successful, false otherwise. * */ bool temporary_keymap(const char *k) { char *km; XtTranslations trans; struct trans_list *t, *prev; char *path = NULL; if (k == NULL) { struct trans_list *next; /* Delete all temporary keymaps. */ for (t = temp_keymaps; t != NULL; t = next) { Free(t->name); Free(t->pathname); next = t->next; Free(t); } tkm_last = temp_keymaps = NULL; screen_set_temp_keymap(NULL); keypad_set_temp_keymap(NULL); status_kmap(false); km_regen(); return true; } /* Check for deleting one keymap. */ for (prev = NULL, t = temp_keymaps; t != NULL; prev = t, t = t->next) { if (!strcmp(k, t->name)) { break; } } if (t != NULL) { /* Delete the keymap from the list. */ if (prev != NULL) { prev->next = t->next; } else { temp_keymaps = t->next; } if (tkm_last == t) { tkm_last = prev; } Free(t->name); Free(t); /* Rebuild the translation tables from the remaining ones. */ screen_set_temp_keymap(NULL); keypad_set_temp_keymap(NULL); for (t = temp_keymaps; t != NULL; t = t->next) { trans = lookup_tt(t->name, NULL); screen_set_temp_keymap(trans); keypad_set_temp_keymap(trans); } /* Update the status line. */ if (temp_keymaps == NULL) { status_kmap(false); } km_regen(); return true; } /* Add a keymap. */ /* Try a file first. */ km = get_file_keymap(k, &path); if (km == NULL) { /* Then try a resource. */ km = get_fresource("%s.%s", ResKeymap, k); if (km == NULL) { return false; } } /* Update the translation tables. */ trans = lookup_tt(k, km); screen_set_temp_keymap(trans); keypad_set_temp_keymap(trans); /* Add it to the list. */ t = (struct trans_list *)XtMalloc(sizeof(*t)); t->name = XtNewString(k); t->pathname = path; t->is_temp = true; t->from_server = false; t->next = NULL; if (tkm_last != NULL) { tkm_last->next = t; } else { temp_keymaps = t; } tkm_last = t; /* Update the status line. */ status_kmap(true); km_regen(); /* Success. */ return true; } /* Create and pop up the current keymap pop-up. */ void do_keymap_display(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { Widget form, label, done; /* If it's already up, do nothing. */ if (km_isup) return; if (km_exists) { popup_popup(km_shell, XtGrabNone); return; } /* Create the popup. */ km_shell = XtVaCreatePopupShell( "kmPopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(km_shell, XtNpopupCallback, place_popup, (XtPointer) CenterP); XtAddCallback(km_shell, XtNpopupCallback, km_up, NULL); XtAddCallback(km_shell, XtNpopdownCallback, km_down, NULL); /* Create a form in the popup. */ form = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, km_shell, NULL); /* Create the title. */ label = XtVaCreateManagedWidget("label", labelWidgetClass, form, XtNborderWidth, 0, NULL); /* Create the options. */ sort_event = XtVaCreateManagedWidget("sortEventOption", commandWidgetClass, form, XtNborderWidth, 0, XtNfromVert, label, XtNleftBitmap, sort == SORT_EVENT ? diamond : no_diamond, NULL); XtAddCallback(sort_event, XtNcallback, do_sort_event, NULL); sort_keymap = XtVaCreateManagedWidget("sortKeymapOption", commandWidgetClass, form, XtNborderWidth, 0, XtNfromVert, sort_event, XtNleftBitmap, sort == SORT_KEYMAP ? diamond : no_diamond, NULL); XtAddCallback(sort_keymap, XtNcallback, do_sort_keymap, NULL); sort_byaction = XtVaCreateManagedWidget("sortActionOption", commandWidgetClass, form, XtNborderWidth, 0, XtNfromVert, sort_keymap, XtNleftBitmap, sort == SORT_ACTION ? diamond : no_diamond, NULL); XtAddCallback(sort_byaction, XtNcallback, do_sort_byaction, NULL); /* Create a text widget attached to the file. */ text = XtVaCreateManagedWidget( "text", asciiTextWidgetClass, form, XtNfromVert, sort_byaction, XtNscrollHorizontal, XawtextScrollAlways, XtNscrollVertical, XawtextScrollAlways, XtNdisplayCaret, False, NULL); create_text(); /* Create the Done button. */ done = XtVaCreateManagedWidget(ObjConfirmButton, commandWidgetClass, form, XtNfromVert, text, NULL); XtAddCallback(done, XtNcallback, km_done, NULL); /* Pop it up. */ km_exists = true; popup_popup(km_shell, XtGrabNone); } /* Called when x3270 is exiting. */ static void remove_keymap_file(bool ignored _is_unused) { (void) unlink(km_file); } /* Format the keymap into a text source. */ static void create_text(void) { String s; FILE *f; static Widget source = NULL; /* Ready a file. */ (void) snprintf(km_file, sizeof(km_file), "/tmp/km.%u", (unsigned)getpid()); f = fopen(km_file, "w"); if (f == NULL) { popup_an_errno(errno, "temporary file open"); return; } s = _XtPrintXlations(*screen, (*screen)->core.tm.translations, NULL, True); format_xlations(s, f); XtFree(s); fclose(f); if (source != NULL) { XtVaSetValues(source, XtNstring, km_file, NULL); } else { source = XtVaCreateWidget( "source", asciiSrcObjectClass, text, XtNtype, XawAsciiFile, XtNstring, km_file, XtNeditType, XawtextRead, NULL); XawTextSetSource(text, source, (XawTextPosition)0); register_schange(ST_EXITING, remove_keymap_file); } } /* Refresh the keymap display, if it's up. */ static void km_regen(void) { if (km_exists) create_text(); } /* Popup callback. */ static void km_up(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { km_isup = true; } /* Popdown callback. */ static void km_down(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { km_isup = false; } /* Done button callback. Pop down the widget. */ static void km_done(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(km_shell); } /* "Sort-by-event" button callback. */ static void do_sort_event(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (sort != SORT_EVENT) { sort = SORT_EVENT; XtVaSetValues(sort_byaction, XtNleftBitmap, no_diamond, NULL); XtVaSetValues(sort_keymap, XtNleftBitmap, no_diamond, NULL); XtVaSetValues(sort_event, XtNleftBitmap, diamond, NULL); create_text(); } } /* "Sort-by-keymap" button callback. */ static void do_sort_keymap(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (sort != SORT_KEYMAP) { sort = SORT_KEYMAP; XtVaSetValues(sort_byaction, XtNleftBitmap, no_diamond, NULL); XtVaSetValues(sort_keymap, XtNleftBitmap, diamond, NULL); XtVaSetValues(sort_event, XtNleftBitmap, no_diamond, NULL); create_text(); } } /* "Sort-by-action" button callback. */ static void do_sort_byaction(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (sort != SORT_ACTION) { sort = SORT_ACTION; XtVaSetValues(sort_byaction, XtNleftBitmap, diamond, NULL); XtVaSetValues(sort_keymap, XtNleftBitmap, no_diamond, NULL); XtVaSetValues(sort_event, XtNleftBitmap, no_diamond, NULL); create_text(); } } #define DASHES \ "-------------------------- ---------------- ------------------------------------" /* * Format translations for display. * * The data from _XtPrintXlations looks like this: * []event:[PA-KeymapTrace("keymap","line")][action...] * with the delightful complication that embedded quotes are not quoted. * * What we want to do is to: * remove all lines without PA-KeymapTrace * remove the leading space * sort by actions list * reformat as: * action... event (keymap:line) */ static void format_xlations(String s, FILE *f) { char *t; char *t_next; struct xl { struct xl *next; char *actions; char *event; char *keymap; int km_line; char *full_keymap; } *xl_list = NULL, *x, *xs, *xlp, *xn; char *km_last; int line_last = 0; /* Construct the list. */ for (t = s; t != NULL; t = t_next) { char *k, *a, *kk; int nq; static char cmps[] = ": " PA_KEYMAP_TRACE "("; /* Find the end of this rule and terminate this line. */ t_next = strstr(t, PA_ENDL "\n"); if (t_next != NULL) { t_next += strlen(PA_ENDL); *t_next++ = '\0'; } /* Remove the leading space. */ while (*t == ' ') t++; /* Use only traced events. */ k = strstr(t, cmps); if (k == NULL) continue; *k = '\0'; k += strlen(cmps); /* Find the rest of the actions. */ a = strchr(k, ')'); if (a == NULL) continue; while (*(++a) == ' ') ; if (!*a) continue; /* Remove the trailing PA-End call. */ if (strlen(a) >= strlen(PA_ENDL) && !strcmp(a + strlen(a) - strlen(PA_ENDL), PA_ENDL)) a[strlen(a) - strlen(PA_ENDL)] = '\0'; /* Allocate the new element. */ x = (struct xl *)XtCalloc(sizeof(struct xl), 1); x->actions = XtNewString(a); x->event = XtNewString(t); x->keymap = kk = (char *)XtMalloc(a - k + 1); x->km_line = 0; x->full_keymap = (char *)XtMalloc(a - k + 1); nq = 0; while (*k != ')') { if (*k == '"') { nq++; } else if (nq == 1) { *kk++ = *k; } else if (nq == 3) { x->km_line = atoi(k); break; } k++; } *kk = '\0'; (void) sprintf(x->full_keymap, "%s:%d", x->keymap, x->km_line); /* Find where it should be inserted. */ for (xs = xl_list, xlp = NULL; xs != NULL; xlp = xs, xs = xs->next) { int halt = 0; switch (sort) { case SORT_EVENT: halt = (event_cmp(xs->event, x->event) > 0); break; case SORT_KEYMAP: halt = (keymap_cmp(xs->keymap, xs->km_line, x->keymap, x->km_line) > 0); break; case SORT_ACTION: halt = (action_cmp(xs->actions, a) > 0); break; } if (halt) break; } /* Insert it. */ if (xlp != NULL) { x->next = xlp->next; xlp->next = x; } else { x->next = xl_list; xl_list = x; } } /* Walk it. */ if (sort != SORT_KEYMAP) (void) fprintf(f, "%-26s %-16s %s\n%s\n", get_message("kmEvent"), get_message("kmKeymapLine"), get_message("kmActions"), DASHES); km_last = NULL; for (xs = xl_list; xs != NULL; xs = xs->next) { switch (sort) { case SORT_EVENT: if (km_last != NULL) { char *l; l = strchr(xs->event, '<'); if (l != NULL) { if (strcmp(km_last, l)) (void) fprintf(f, "\n"); km_last = l; } } else km_last = strchr(xs->event, '<'); break; case SORT_KEYMAP: if (km_last == NULL || strcmp(xs->keymap, km_last)) { char *p; (void) fprintf(f, "%s%s '%s'%s", km_last == NULL ? "" : "\n", get_message(is_temp(xs->keymap) ? "kmTemporaryKeymap" : "kmKeymap"), xs->keymap, from_server(xs->keymap) ? get_message("kmFromServer") : ""); if ((p = pathname(xs->keymap)) != NULL) (void) fprintf(f, ", %s %s", get_message("kmFile"), p); else (void) fprintf(f, ", %s %s.%s.%s", get_message("kmResource"), programname, ResKeymap, xs->keymap); (void) fprintf(f, "\n%-26s %-16s %s\n%s\n", get_message("kmEvent"), get_message("kmKeymapLine"), get_message("kmActions"), DASHES); km_last = xs->keymap; line_last = 0; } while (xs->km_line != ++line_last) { (void) fprintf(f, "%-26s %s:%d\n", get_message("kmOverridden"), xs->keymap, line_last); } break; case SORT_ACTION: break; } (void) fprintf(f, "%-26s %-16s ", xs->event, xs->full_keymap); (void) fcatv(f, xs->actions); (void) fputc('\n', f); } /* Free it. */ for (xs = xl_list; xs != NULL; xs = xn) { xn = xs->next; Free(xs->actions); Free(xs->event); Free(xs->keymap); Free(xs->full_keymap); Free(xs); } } /* * Comparison function for actions. Basically, a strcmp() that handles "PF" * and "PA" specially. */ #define PA "PA(" #define PF "PF(" static int action_cmp(char *s1, char *s2) { if ((!strncmp(s1, PA, 3) && !strncmp(s2, PA, 3)) || (!strncmp(s1, PF, 3) && !strncmp(s2, PF, 3))) return atoi(s1 + 4) - atoi(s2 + 4); else return strcmp(s1, s2); } /* Return a keymap's index in the lists. */ static int km_index(char *n) { struct trans_list *t; int ix = 0; for (t = trans_list; t != NULL; t = t->next) { if (!strcmp(t->name, n)) return ix; ix++; } for (t = temp_keymaps; t != NULL; t = t->next) { if (!strcmp(t->name, n)) return ix; ix++; } return ix; } /* Return whether or not a keymap is temporary. */ static bool is_temp(char *k) { struct trans_list *t; for (t = trans_list; t != NULL; t = t->next) { if (!strcmp(t->name, k)) return t->is_temp; } for (t = temp_keymaps; t != NULL; t = t->next) { if (!strcmp(t->name, k)) return t->is_temp; } return false; } /* Return the pathname associated with a keymap. */ static char * pathname(char *k) { struct trans_list *t; for (t = trans_list; t != NULL; t = t->next) { if (!strcmp(t->name, k)) return t->pathname; } for (t = temp_keymaps; t != NULL; t = t->next) { if (!strcmp(t->name, k)) return t->pathname; } return NULL; } /* Return whether or not a keymap was translated from "@server". */ static bool from_server(char *k) { struct trans_list *t; for (t = trans_list; t != NULL; t = t->next) { if (!strcmp(t->name, k)) return t->from_server; } for (t = temp_keymaps; t != NULL; t = t->next) { if (!strcmp(t->name, k)) return t->from_server; } return false; } /* * Comparison function for keymaps. */ static int keymap_cmp(char *k1, int l1, char *k2, int l2) { /* If the keymaps are the same, do a numerical comparison. */ if (!strcmp(k1, k2)) return l1 - l2; /* The keymaps are different. Order them according to trans_list. */ return km_index(k1) - km_index(k2); } /* * strcmp() that handles Fnn numercally. */ static int Fnn_strcmp(char *s1, char *s2) { static char kp[] = "F"; # define KPL (sizeof(kp) - 1) if (strncmp(s1, kp, KPL) || !isdigit((unsigned char)s1[KPL]) || strncmp(s2, kp, KPL) || !isdigit((unsigned char)s2[KPL])) return strcmp(s1, s2); return atoi(s1 + KPL) - atoi(s2 + KPL); } /* * Comparison function for events. */ static int event_cmp(char *e1, char *e2) { char *l1, *l2; int r; /* If either has a syntax problem, do a straight string compare. */ if ((l1 = strchr(e1, '<')) == NULL || (l2 = strchr(e2, '<')) == NULL) return strcmp(e1, e2); /* * If the events are different, sort on the event only. Otherwise, * sort on the modifier(s). */ r = Fnn_strcmp(l1, l2); if (r) return r; else return strcmp(e1, e2); } suite3270-3.6/x3270/keymap.h0000664000076500007650000000460413221577164013423 0ustar pdmpdm/* * Copyright (c) 1996-2009, 2013, 2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * keymap.h * Global declarations for keymap.c. */ #define PA_KEYMAP_TRACE PA_PFX "KeymapTrace" #define PA_END PA_PFX "End" /* translation lists */ struct trans_list { char *name; char *pathname; bool is_temp; bool from_server; struct trans_list *next; }; extern struct trans_list *trans_list; extern char *current_keymap; extern bool keymap_changed; extern char *keymap_trace; extern struct trans_list *temp_keymaps; void do_keymap_display(Widget w, XtPointer userdata, XtPointer calldata); void keymap_init(const char *km, bool interactive); XtTranslations lookup_tt(const char *name, char *table); void PA_End_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params); void PA_KeymapTrace_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params); bool temporary_keymap(const char *k); void keymap_register(); suite3270-3.6/x3270/keypad.bm0000664000076500007650000001526113221577164013562 0ustar pdmpdm#define btab_width 42 #define btab_height 20 static unsigned char btab_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xff, 0xff, 0x03, 0x00, 0x00, 0xe4, 0xff, 0xff, 0x03, 0x00, 0x00, 0xe4, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc4, 0xff, 0xff, 0x03, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define del_width 42 #define del_height 20 static unsigned char del_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x40, 0x17, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define down_width 30 #define down_height 20 static unsigned char down_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define home_width 30 #define home_height 20 static unsigned char home_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0xfc, 0x01, 0x00, 0x40, 0xfc, 0x00, 0x00, 0x40, 0x7c, 0x00, 0x00, 0x40, 0xfc, 0x00, 0x00, 0x40, 0xfc, 0x01, 0x00, 0x40, 0xec, 0x03, 0x00, 0x40, 0xc4, 0x07, 0x00, 0x40, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define ins_width 42 #define ins_height 20 static unsigned char ins_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define left_width 30 #define left_height 20 static unsigned char left_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define right_width 30 #define right_height 20 static unsigned char right_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define tab_width 42 #define tab_height 20 static unsigned char tab_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x02, 0x00, 0x00, 0xfc, 0xff, 0x7f, 0x02, 0x00, 0x00, 0xfc, 0xff, 0x7f, 0x02, 0x00, 0x00, 0xfc, 0xff, 0x3f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define up_width 30 #define up_height 20 static unsigned char up_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define newline_width 30 #define newline_height 20 static unsigned char newline_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x41, 0x78, 0x00, 0x00, 0x61, 0x78, 0x00, 0x00, 0x71, 0x7c, 0x00, 0x00, 0xf9, 0x7f, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xf9, 0x0f, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; suite3270-3.6/x3270/keypad.c0000664000076500007650000005427513221577164013416 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2014-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * keypad.c * This module handles the keypad with buttons for each of the * 3270 function keys. */ #include "globals.h" #include "xglobals.h" #include #include #include #include "appres.h" #include "resources.h" #include "actions.h" #include "kybd.h" #include "popups.h" #include "utils.h" #include "xappres.h" #include "xkeypad.h" #include "xmenubar.h" #include "xscreen.h" #include "xpopups.h" #include "keypad.bm" enum kp_placement kp_placement; #define NUM_ROWS 4 #define NUM_VROWS 15 #define BORDER 1 #define TOP_MARGIN 6 #define BOTTOM_MARGIN 6 #define SPACING 2 #define FAT_SPACING 3 #define VGAP 4 #define HGAP 4 #define SIDE_MARGIN 4 #define HORIZ_WIDTH \ (SIDE_MARGIN + \ 12*(pf_width+2*BORDER) + \ 11*SPACING + \ HGAP + \ 3*(pa_width+2*BORDER) + \ 2*SPACING + \ SIDE_MARGIN) #define VERT_WIDTH \ (SIDE_MARGIN + \ 3*(pa_width+2*BORDER) + \ 2*SPACING + \ SIDE_MARGIN) /* * Table of 3278 key labels and actions */ struct button_list { const char *label; const char *name; const char *bits; int width; int height; const char *action_name; const char *parm; }; bool keypad_changed = false; static char Lg[] = "large"; static char Bm[] = "bm"; static char Sm[] = "small"; static struct button_list pf_list[] = { { "PF13", Lg, NULL, 0, 0, "PF", "13" }, { "PF14", Lg, NULL, 0, 0, "PF", "14" }, { "PF15", Lg, NULL, 0, 0, "PF", "15" }, { "PF16", Lg, NULL, 0, 0, "PF", "16" }, { "PF17", Lg, NULL, 0, 0, "PF", "17" }, { "PF18", Lg, NULL, 0, 0, "PF", "18" }, { "PF19", Lg, NULL, 0, 0, "PF", "19" }, { "PF20", Lg, NULL, 0, 0, "PF", "20" }, { "PF21", Lg, NULL, 0, 0, "PF", "21" }, { "PF22", Lg, NULL, 0, 0, "PF", "22" }, { "PF23", Lg, NULL, 0, 0, "PF", "23" }, { "PF24", Lg, NULL, 0, 0, "PF", "24" }, { "PF1", Lg, NULL, 0, 0, "PF", "1" }, { "PF2", Lg, NULL, 0, 0, "PF", "2" }, { "PF3", Lg, NULL, 0, 0, "PF", "3" }, { "PF4", Lg, NULL, 0, 0, "PF", "4" }, { "PF5", Lg, NULL, 0, 0, "PF", "5" }, { "PF6", Lg, NULL, 0, 0, "PF", "6" }, { "PF7", Lg, NULL, 0, 0, "PF", "7" }, { "PF8", Lg, NULL, 0, 0, "PF", "8" }, { "PF9", Lg, NULL, 0, 0, "PF", "9" }, { "PF10", Lg, NULL, 0, 0, "PF", "10" }, { "PF11", Lg, NULL, 0, 0, "PF", "11" }, { "PF12", Lg, NULL, 0, 0, "PF", "12" } }; #define PF_SZ (sizeof(pf_list)/sizeof(pf_list[0])) static struct button_list pad_list[] = { { "PA1", Lg, NULL, 0, 0, "PA", "1" }, { "PA2", Lg, NULL, 0, 0, "PA", "2" }, { "PA3", Lg, NULL, 0, 0, "PA", "3" }, { 0, 0, 0, 0 }, { "Up" , Bm, (char *)up_bits, up_width, up_height, "Up", NULL }, { 0, 0, 0, 0 }, { "Left", Bm, (char *)left_bits, left_width, left_height, "Left", NULL }, { "Home", Bm, (char *)home_bits, home_width, home_height, "Home", NULL }, { "Right", Bm, (char *)right_bits, right_width, right_height, "Right", NULL }, { 0, 0, 0, 0 }, { "Down", Bm, (char *)down_bits, down_width, down_height, "Down", NULL }, { 0, 0, 0, 0 }, }; #define PAD_SZ (sizeof(pad_list)/sizeof(pad_list[0])) static struct button_list lower_list[] = { { "Clear", Sm, NULL, 0, 0, "Clear", NULL }, { "Reset", Sm, NULL, 0, 0, "Reset", NULL }, { "Ins", Bm, (char *)ins_bits, ins_width, ins_height, "Insert", NULL }, { "Del", Bm, (char *)del_bits, del_width, del_height, "Delete", NULL }, { "Erase\nEOF", Sm, NULL, 0, 0, "EraseEOF", NULL }, { "Erase\nInput", Sm, NULL, 0, 0, "EraseInput",NULL }, { "Dup", Sm, NULL, 0, 0, "Dup", NULL }, { "Field\nMark", Sm, NULL, 0, 0, "FieldMark",NULL }, { "Sys\nReq", Sm, NULL, 0, 0, "SysReq", NULL }, { "Cursor\nSelect", Sm, NULL, 0, 0, "CursorSelect",NULL }, { "Attn", Sm, NULL, 0, 0, "Attn", NULL }, { "Compose", Sm, NULL, 0, 0, "Compose", NULL }, { "Btab", Bm, (char *)btab_bits, btab_width, btab_height, "BackTab", NULL }, { "Tab", Bm, (char *)tab_bits, tab_width, tab_height, "Tab", NULL }, { "Newline", Bm, (char *)newline_bits, newline_width, newline_height, "Newline", NULL }, { "Enter", Sm, NULL, 0, 0, "Enter", NULL } }; #define LOWER_SZ (sizeof(lower_list)/sizeof(lower_list[0])) static struct button_list vpf_list[] = { { "PF1", Lg, NULL, 0, 0, "PF", "1" }, { "PF2", Lg, NULL, 0, 0, "PF", "2" }, { "PF3", Lg, NULL, 0, 0, "PF", "3" }, { "PF4", Lg, NULL, 0, 0, "PF", "4" }, { "PF5", Lg, NULL, 0, 0, "PF", "5" }, { "PF6", Lg, NULL, 0, 0, "PF", "6" }, { "PF7", Lg, NULL, 0, 0, "PF", "7" }, { "PF8", Lg, NULL, 0, 0, "PF", "8" }, { "PF9", Lg, NULL, 0, 0, "PF", "9" }, { "PF10", Lg, NULL, 0, 0, "PF", "10" }, { "PF11", Lg, NULL, 0, 0, "PF", "11" }, { "PF12", Lg, NULL, 0, 0, "PF", "12" }, }; #define VPF_SZ (sizeof(vpf_list)/sizeof(vpf_list[0])) static struct button_list vspf_list[] = { { "PF13", Lg, NULL, 0, 0, "PF", "13" }, { "PF14", Lg, NULL, 0, 0, "PF", "14" }, { "PF15", Lg, NULL, 0, 0, "PF", "15" }, { "PF16", Lg, NULL, 0, 0, "PF", "16" }, { "PF17", Lg, NULL, 0, 0, "PF", "17" }, { "PF18", Lg, NULL, 0, 0, "PF", "18" }, { "PF19", Lg, NULL, 0, 0, "PF", "19" }, { "PF20", Lg, NULL, 0, 0, "PF", "20" }, { "PF21", Lg, NULL, 0, 0, "PF", "21" }, { "PF22", Lg, NULL, 0, 0, "PF", "22" }, { "PF23", Lg, NULL, 0, 0, "PF", "23" }, { "PF24", Lg, NULL, 0, 0, "PF", "24" }, }; static Widget vpf_w[2][VPF_SZ]; static struct button_list vpad_list[] = { { 0, 0, 0 }, { "Up" , Bm, (char *)up_bits, up_width, up_height, "Up", NULL }, { 0, 0, 0 }, { "Left" , Bm, (char *)left_bits, left_width, left_height, "Left", NULL }, { "Home", Bm, (char *)home_bits, home_width, home_height, "Home", NULL }, { "Right" , Bm, (char *)right_bits, right_width, right_height, "Right", NULL }, { "Ins", Bm, (char *)ins_bits, ins_width, ins_height, "Insert", NULL }, { "Down" , Bm, (char *)down_bits, down_width, down_height, "Down", NULL }, { "Del", Bm, (char *)del_bits, del_width, del_height, "Delete", NULL }, { "PA1", Lg, NULL, 0, 0, "PA", "1" }, { "PA2", Lg, NULL, 0, 0, "PA", "2" }, { "PA3", Lg, NULL, 0, 0, "PA", "3" }, }; #define VPAD_SZ (sizeof(vpad_list)/sizeof(vpad_list[0])) static struct button_list vfn_list[] = { { "Btab", Bm, (char *)btab_bits, btab_width, btab_height, "BackTab", NULL }, { "Tab", Bm, (char *)tab_bits, tab_width, tab_height, "Tab", NULL }, { "Clear", Sm, NULL, 0, 0, "Clear", NULL }, { "Reset", Sm, NULL, 0, 0, "Reset", NULL }, { "Erase\nEOF", Sm, NULL, 0, 0, "EraseEOF", NULL }, { "Erase\nInput", Sm, NULL, 0, 0, "EraseInput",NULL }, { "Dup", Sm, NULL, 0, 0, "Dup", NULL }, { "Field\nMark", Sm, NULL, 0, 0, "FieldMark",NULL }, { "Sys\nReq", Sm, NULL, 0, 0, "SysReq", NULL }, { "Cursor\nSelect", Sm, NULL, 0, 0, "CursorSelect",NULL }, { "Attn", Sm, NULL, 0, 0, "Attn", NULL }, { "Compose", Sm, NULL, 0, 0, "Compose", NULL }, { "Newline", Bm, (char *)newline_bits, newline_width, newline_height, "Newline", NULL }, { "Enter", Sm, NULL, 0, 0, "Enter", NULL }, }; #define VFN_SZ (sizeof(vfn_list)/sizeof(vfn_list[0])) static Dimension pf_width; static Dimension key_height; static Dimension pa_width; static Dimension key_width; static Dimension large_key_width; static Widget keypad_container = (Widget) NULL; static Widget key_pad = NULL; static XtTranslations keypad_t00 = (XtTranslations) NULL; static XtTranslations keypad_t0 = (XtTranslations) NULL; static XtTranslations saved_xt = (XtTranslations) NULL; /* Initialize the keypad placement from the keypad resource. */ void keypad_placement_init(void) { if (!strcmp(xappres.keypad, KpLeft)) { kp_placement = kp_left; } else if (!strcmp(xappres.keypad, KpRight)) { kp_placement = kp_right; } else if (!strcmp(xappres.keypad, KpBottom)) { kp_placement = kp_bottom; } else if (!strcmp(xappres.keypad, KpIntegral)) { kp_placement = kp_integral; } else if (!strcmp(xappres.keypad, KpInsideRight)) { kp_placement = kp_inside_right; } else { xs_error("Unknown value for %s", ResKeypad); } } /* * Callback for keypad buttons. Simply calls the function pointed to by the * client data. */ static void callfn(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { struct button_list *keyd = (struct button_list *) client_data; run_action(keyd->action_name, IA_KEYPAD, keyd->parm, NULL); } /* * Create a button. */ static Widget make_a_button(Widget container, Position x, Position y, Dimension w, Dimension h, struct button_list *keyd) { Widget command; Pixmap pixmap; if (!keyd->label) return (Widget) 0; command = XtVaCreateManagedWidget( keyd->name, commandWidgetClass, container, XtNx, x, XtNy, y, XtNwidth, w, XtNheight, h, XtNresize, False, NULL); XtAddCallback(command, XtNcallback, callfn, (XtPointer)keyd); if (keyd->bits) { pixmap = XCreateBitmapFromData(display, root_window, keyd->bits, keyd->width, keyd->height); XtVaSetValues(command, XtNbitmap, pixmap, NULL); } else XtVaSetValues(command, XtNlabel, keyd->label, NULL); return command; } /* * Create the keys for a horizontal keypad */ static void keypad_keys_horiz(Widget container) { unsigned i; Position row, col; Position x0, y0; /* PF Keys */ row = col = 0; x0 = SIDE_MARGIN; y0 = TOP_MARGIN; for (i = 0; i < PF_SZ; i++) { (void) make_a_button(container, (Position)(x0 + (col*(pf_width+2*BORDER+SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), pf_width, key_height, &pf_list[i]); if (++col >= 12) { col = 0; row++; } } /* Keypad */ row = col = 0; x0 = SIDE_MARGIN + 12*(pf_width+2*BORDER+SPACING) + HGAP; y0 = TOP_MARGIN; for (i = 0; i < PAD_SZ; i++) { (void) make_a_button(container, (Position)(x0 + (col*(pa_width+2*BORDER+SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), pa_width, key_height, &pad_list[i]); if (++col >= 3) { col = 0; if (++row == 1) y0 += VGAP; } } /* Bottom */ row = col = 0; x0 = SIDE_MARGIN; y0 = TOP_MARGIN + 2*(key_height+2*BORDER+SPACING) + VGAP; for (i = 0; i < LOWER_SZ; i++) { (void) make_a_button(container, (Position)(x0 + (col*(key_width+2*BORDER+FAT_SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), key_width, key_height, &lower_list[i]); if (++row >= 2) { ++col; row = 0; } } } static bool vert_keypad = false; static Widget spf_container; /* * Create the keys for a vertical keypad. */ static void keypad_keys_vert(Widget container) { unsigned i; Position row, col; Position x0, y0; Widget c1, c2; vert_keypad = true; /* Container for shifted PF keys */ spf_container = XtVaCreateManagedWidget( "shift", compositeWidgetClass, container, XtNmappedWhenManaged, False, XtNborderWidth, 0, XtNwidth, VERT_WIDTH, XtNheight, TOP_MARGIN+4*(key_height+2*BORDER)+3*SPACING, NULL); if (appres.interactive.mono) { XtVaSetValues(spf_container, XtNbackgroundPixmap, gray, NULL); } else { XtVaSetValues(spf_container, XtNbackground, keypadbg_pixel, NULL); } /* PF keys */ if (xappres.invert_kpshift) { c1 = spf_container; c2 = container; } else { c1 = container; c2 = spf_container; } row = col = 0; x0 = SIDE_MARGIN; y0 = TOP_MARGIN; for (i = 0; i < VPF_SZ; i++) { vpf_w[0][i] = make_a_button(c1, (Position)(x0 + (col*(pa_width+2*BORDER+SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), pa_width, key_height, &vpf_list[i]); vpf_w[1][i] = make_a_button(c2, (Position)(x0 + (col*(pa_width+2*BORDER+SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), pa_width, key_height, &vspf_list[i]); if (++col >= 3) { col = 0; row++; } } /* Cursor and PA keys */ for (i = 0; i < VPAD_SZ; i++) { (void) make_a_button(container, (Position)(x0 + (col*(pa_width+2*BORDER+SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), pa_width, key_height, &vpad_list[i]); if (++col >= 3) { col = 0; row++; } } /* Other keys */ for (i = 0; i < VFN_SZ; i++) { (void) make_a_button(container, (Position)(x0 + (col*(large_key_width+2*BORDER+SPACING))), (Position)(y0 + (row*(key_height+2*BORDER+SPACING))), large_key_width, key_height, &vfn_list[i]); if (++col >= 2) { col = 0; row++; } } } static Dimension get_keypad_dimension(const char *name) { char *d; long v; if ((d = get_fresource("%s.%s", ResKeypad, name)) == NULL) xs_error("Cannot find %s resource", ResKeypad); if ((v = strtol(d, (char **)0, 0)) <= 0) xs_error("Illegal %s resource", ResKeypad); return (Dimension)v; } static void init_keypad_dimensions(void) { static bool done = false; if (done) return; key_height = get_keypad_dimension(ResKeyHeight); key_width = get_keypad_dimension(ResKeyWidth); pf_width = get_keypad_dimension(ResPfWidth); pa_width = get_keypad_dimension(ResPaWidth); large_key_width = get_keypad_dimension(ResLargeKeyWidth); done = true; } Dimension min_keypad_width(void) { init_keypad_dimensions(); return HORIZ_WIDTH; } Dimension keypad_qheight(void) { init_keypad_dimensions(); return TOP_MARGIN + (NUM_ROWS*(key_height+2*BORDER)) + (NUM_ROWS-1)*SPACING + VGAP + BOTTOM_MARGIN; } /* * Create a keypad. */ Widget keypad_init(Widget container, Dimension voffset, Dimension screen_width, bool floating, bool vert) { Dimension height; Dimension width = screen_width; Dimension hoffset; init_keypad_dimensions(); /* Figure out what dimensions to use */ if (vert) width = VERT_WIDTH; else width = HORIZ_WIDTH; if (vert) height = TOP_MARGIN + (NUM_VROWS*(key_height+2*BORDER)) + (NUM_VROWS-1)*SPACING + BOTTOM_MARGIN; else height = keypad_qheight(); /* Create a container */ if (screen_width > width) hoffset = ((screen_width - width) / (unsigned) 2) & ~1; else hoffset = 0; if (voffset & 1) voffset++; if (key_pad == NULL) { key_pad = XtVaCreateManagedWidget( "keyPad", compositeWidgetClass, container, XtNx, hoffset, XtNy, voffset, XtNborderWidth, (Dimension) (floating ? 1 : 0), XtNwidth, width, XtNheight, height, NULL); if (appres.interactive.mono) XtVaSetValues(key_pad, XtNbackgroundPixmap, gray, NULL); else XtVaSetValues(key_pad, XtNbackground, keypadbg_pixel, NULL); /* Create the keys */ if (vert) keypad_keys_vert(key_pad); else keypad_keys_horiz(key_pad); } else { XtVaSetValues(key_pad, XtNx, hoffset, XtNy, voffset, NULL); } return key_pad; } /* * Swap PF1-12 and PF13-24 on the vertical popup keypad, by mapping or * unmapping the window containing the shifted keys. */ void keypad_shift(void) { if (!vert_keypad || (spf_container == NULL) || !XtIsRealized(spf_container)) return; if (shifted) XtMapWidget(spf_container); else XtUnmapWidget(spf_container); } /* * Keypad popup */ Widget keypad_shell = NULL; bool keypad_popped = false; static bool TrueD = true; static bool *TrueP = &TrueD; static bool FalseD = false; static bool *FalseP = &FalseD; static enum placement *pp; /* * Called when the main screen is first exposed, to pop up the keypad the * first time */ void keypad_first_up(void) { if (!xappres.keypad_on || kp_placement == kp_integral) { return; } keypad_popup_init(); popup_popup(keypad_shell, XtGrabNone); } /* Called when the keypad popup pops up or down */ static void keypad_updown(Widget w _is_unused, XtPointer client_data, XtPointer call_data) { xappres.keypad_on = keypad_popped = *(bool *)client_data; if (!keypad_popped) { XtDestroyWidget(keypad_shell); keypad_shell = NULL; keypad_container = NULL; key_pad = NULL; spf_container = NULL; } if (xappres.keypad_on) { place_popup(w, (XtPointer)pp, call_data); } menubar_keypad_changed(); } /* Create the pop-up keypad */ void keypad_popup_init(void) { Widget w; Dimension height, width, border; bool vert = false; if (keypad_shell != NULL) return; switch (kp_placement) { case kp_left: vert = true; pp = LeftP; break; case kp_right: vert = true; pp = RightP; break; case kp_bottom: vert = false; pp = BottomP; break; case kp_integral: /* can't happen */ return; case kp_inside_right: vert = true; pp = InsideRightP; break; } /* Create a popup shell */ keypad_shell = XtVaCreatePopupShell( "keypadPopup", transientShellWidgetClass, toplevel, NULL); /*XtAddCallback(keypad_shell, XtNpopupCallback, place_popup, (XtPointer)pp);*/ XtAddCallback(keypad_shell, XtNpopupCallback, keypad_updown, (XtPointer) TrueP); XtAddCallback(keypad_shell, XtNpopdownCallback, keypad_updown, (XtPointer) FalseP); /* Create a keypad in the popup */ keypad_container = XtVaCreateManagedWidget( "container", compositeWidgetClass, keypad_shell, XtNborderWidth, 0, XtNheight, 10, XtNwidth, 10, NULL); w = keypad_init(keypad_container, 0, 0, true, vert); /* Fix the window size */ XtVaGetValues(w, XtNheight, &height, XtNwidth, &width, XtNborderWidth, &border, NULL); height += 2*border; width += 2*border; XtVaSetValues(keypad_container, XtNheight, height, XtNwidth, width, NULL); XtVaSetValues(keypad_shell, XtNheight, height, XtNwidth, width, XtNbaseHeight, height, XtNbaseWidth, width, XtNminHeight, height, XtNminWidth, width, XtNmaxHeight, height, XtNmaxWidth, width, NULL); /* Make keystrokes in the popup apply to the main window */ save_00translations(keypad_container, &keypad_t00); set_translations(keypad_container, NULL, &keypad_t0); if (saved_xt != (XtTranslations) NULL) { XtOverrideTranslations(keypad_container, saved_xt); saved_xt = (XtTranslations) NULL; } } /* Set a temporary keymap. */ void keypad_set_temp_keymap(XtTranslations trans) { if (keypad_container != (Widget) NULL) { if (trans == NULL) { trans = keypad_t0; XtUninstallTranslations(keypad_container); } XtOverrideTranslations(keypad_container, trans); saved_xt = (XtTranslations) NULL; } else saved_xt = trans; } /* Change the baseleve keymap. */ void keypad_set_keymap(void) { if (keypad_container == NULL) return; XtUninstallTranslations(keypad_container); set_translations(keypad_container, &keypad_t00, &keypad_t0); } /* Move the keypad. */ void keypad_move(void) { if (!keypad_popped) return; move_popup(keypad_shell, pp, NULL); } void keypad_popdown(bool *was_up) { if (keypad_popped) { *was_up = true; XtPopdown(keypad_shell); } else *was_up = false; } void keypad_popup(void) { #if 0 if (keypad_shell != NULL) { XtPopup(keypad_shell, XtGrabNone); } #endif xappres.keypad_on = True; keypad_first_up(); } void ikeypad_destroy(void) { if (key_pad != NULL) { XtDestroyWidget(key_pad); key_pad = NULL; } } suite3270-3.6/x3270/keysym2ucs.c0000664000076500007650000020246413221577164014252 0ustar pdmpdm/* $XFree86$ * This module converts keysym values into the corresponding ISO 10646 * (UCS, Unicode) values. * * The array keysymtab[] contains pairs of X11 keysym values for graphical * characters and the corresponding Unicode value. The function * keysym2ucs() maps a keysym onto a Unicode value using a binary search, * therefore keysymtab[] must remain SORTED by keysym value. * * The keysym -> UTF-8 conversion will hopefully one day be provided * by Xlib via XmbLookupString() and should ideally not have to be * done in X applications. But we are not there yet. * * We allow to represent any UCS character in the range U-00000000 to * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. * This admittedly does not cover the entire 31-bit space of UCS, but * it does cover all of the characters up to U-10FFFF, which can be * represented by UTF-16, and more, and it is very unlikely that higher * UCS codes will ever be assigned by ISO. So to get Unicode character * U+ABCD you can directly use keysym 0x0100abcd. * * NOTE: The comments in the table below contain the actual character * encoded in UTF-8, so for viewing and editing best use an editor in * UTF-8 mode. * * Author: Markus G. Kuhn , * University of Cambridge, April 2001 * * Special thanks to Richard Verhoeven for preparing * an initial draft of the mapping table. * * This software is in the public domain. Share and enjoy! * * AUTOMATICALLY GENERATED FILE, DO NOT EDIT !!! (unicode/convmap.pl) */ #include "keysym2ucs.h" struct codepair { unsigned short keysym; unsigned short ucs; } keysymtab[] = { { 0x01a1, 0x0104 }, /* Aogonek Ä„ LATIN CAPITAL LETTER A WITH OGONEK */ { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ { 0x01a3, 0x0141 }, /* Lstroke Å LATIN CAPITAL LETTER L WITH STROKE */ { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ { 0x01a6, 0x015a }, /* Sacute Åš LATIN CAPITAL LETTER S WITH ACUTE */ { 0x01a9, 0x0160 }, /* Scaron Å  LATIN CAPITAL LETTER S WITH CARON */ { 0x01aa, 0x015e }, /* Scedilla Åž LATIN CAPITAL LETTER S WITH CEDILLA */ { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ { 0x01af, 0x017b }, /* Zabovedot Å» LATIN CAPITAL LETTER Z WITH DOT ABOVE */ { 0x01b1, 0x0105 }, /* aogonek Ä… LATIN SMALL LETTER A WITH OGONEK */ { 0x01b2, 0x02db }, /* ogonek Ë› OGONEK */ { 0x01b3, 0x0142 }, /* lstroke Å‚ LATIN SMALL LETTER L WITH STROKE */ { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ { 0x01b6, 0x015b }, /* sacute Å› LATIN SMALL LETTER S WITH ACUTE */ { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ { 0x01b9, 0x0161 }, /* scaron Å¡ LATIN SMALL LETTER S WITH CARON */ { 0x01ba, 0x015f }, /* scedilla ÅŸ LATIN SMALL LETTER S WITH CEDILLA */ { 0x01bb, 0x0165 }, /* tcaron Å¥ LATIN SMALL LETTER T WITH CARON */ { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ { 0x01bd, 0x02dd }, /* doubleacute Ë DOUBLE ACUTE ACCENT */ { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ { 0x01c0, 0x0154 }, /* Racute Å” LATIN CAPITAL LETTER R WITH ACUTE */ { 0x01c3, 0x0102 }, /* Abreve Ä‚ LATIN CAPITAL LETTER A WITH BREVE */ { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ { 0x01c8, 0x010c }, /* Ccaron ÄŒ LATIN CAPITAL LETTER C WITH CARON */ { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ { 0x01cc, 0x011a }, /* Ecaron Äš LATIN CAPITAL LETTER E WITH CARON */ { 0x01cf, 0x010e }, /* Dcaron ÄŽ LATIN CAPITAL LETTER D WITH CARON */ { 0x01d0, 0x0110 }, /* Dstroke Ä LATIN CAPITAL LETTER D WITH STROKE */ { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ { 0x01d5, 0x0150 }, /* Odoubleacute Å LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ { 0x01d9, 0x016e }, /* Uring Å® LATIN CAPITAL LETTER U WITH RING ABOVE */ { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ { 0x01de, 0x0162 }, /* Tcedilla Å¢ LATIN CAPITAL LETTER T WITH CEDILLA */ { 0x01e0, 0x0155 }, /* racute Å• LATIN SMALL LETTER R WITH ACUTE */ { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ { 0x01e8, 0x010d }, /* ccaron Ä LATIN SMALL LETTER C WITH CARON */ { 0x01ea, 0x0119 }, /* eogonek Ä™ LATIN SMALL LETTER E WITH OGONEK */ { 0x01ec, 0x011b }, /* ecaron Ä› LATIN SMALL LETTER E WITH CARON */ { 0x01ef, 0x010f }, /* dcaron Ä LATIN SMALL LETTER D WITH CARON */ { 0x01f0, 0x0111 }, /* dstroke Ä‘ LATIN SMALL LETTER D WITH STROKE */ { 0x01f1, 0x0144 }, /* nacute Å„ LATIN SMALL LETTER N WITH ACUTE */ { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ { 0x01f5, 0x0151 }, /* odoubleacute Å‘ LATIN SMALL LETTER O WITH DOUBLE ACUTE */ { 0x01f8, 0x0159 }, /* rcaron Å™ LATIN SMALL LETTER R WITH CARON */ { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ { 0x01fe, 0x0163 }, /* tcedilla Å£ LATIN SMALL LETTER T WITH CEDILLA */ { 0x01ff, 0x02d9 }, /* abovedot Ë™ DOT ABOVE */ { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ { 0x02ab, 0x011e }, /* Gbreve Äž LATIN CAPITAL LETTER G WITH BREVE */ { 0x02ac, 0x0134 }, /* Jcircumflex Ä´ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ { 0x02b6, 0x0125 }, /* hcircumflex Ä¥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ { 0x02bb, 0x011f }, /* gbreve ÄŸ LATIN SMALL LETTER G WITH BREVE */ { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ { 0x02c5, 0x010a }, /* Cabovedot ÄŠ LATIN CAPITAL LETTER C WITH DOT ABOVE */ { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ { 0x02d5, 0x0120 }, /* Gabovedot Ä  LATIN CAPITAL LETTER G WITH DOT ABOVE */ { 0x02d8, 0x011c }, /* Gcircumflex Äœ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ { 0x02de, 0x015c }, /* Scircumflex Åœ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ { 0x02e5, 0x010b }, /* cabovedot Ä‹ LATIN SMALL LETTER C WITH DOT ABOVE */ { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ { 0x02f5, 0x0121 }, /* gabovedot Ä¡ LATIN SMALL LETTER G WITH DOT ABOVE */ { 0x02f8, 0x011d }, /* gcircumflex Ä LATIN SMALL LETTER G WITH CIRCUMFLEX */ { 0x02fd, 0x016d }, /* ubreve Å­ LATIN SMALL LETTER U WITH BREVE */ { 0x02fe, 0x015d }, /* scircumflex Å LATIN SMALL LETTER S WITH CIRCUMFLEX */ { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ { 0x03a3, 0x0156 }, /* Rcedilla Å– LATIN CAPITAL LETTER R WITH CEDILLA */ { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ { 0x03a6, 0x013b }, /* Lcedilla Ä» LATIN CAPITAL LETTER L WITH CEDILLA */ { 0x03aa, 0x0112 }, /* Emacron Ä’ LATIN CAPITAL LETTER E WITH MACRON */ { 0x03ab, 0x0122 }, /* Gcedilla Ä¢ LATIN CAPITAL LETTER G WITH CEDILLA */ { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ { 0x03b3, 0x0157 }, /* rcedilla Å— LATIN SMALL LETTER R WITH CEDILLA */ { 0x03b5, 0x0129 }, /* itilde Ä© LATIN SMALL LETTER I WITH TILDE */ { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ { 0x03ba, 0x0113 }, /* emacron Ä“ LATIN SMALL LETTER E WITH MACRON */ { 0x03bb, 0x0123 }, /* gcedilla Ä£ LATIN SMALL LETTER G WITH CEDILLA */ { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ { 0x03bd, 0x014a }, /* ENG ÅŠ LATIN CAPITAL LETTER ENG */ { 0x03bf, 0x014b }, /* eng Å‹ LATIN SMALL LETTER ENG */ { 0x03c0, 0x0100 }, /* Amacron Ä€ LATIN CAPITAL LETTER A WITH MACRON */ { 0x03c7, 0x012e }, /* Iogonek Ä® LATIN CAPITAL LETTER I WITH OGONEK */ { 0x03cc, 0x0116 }, /* Eabovedot Ä– LATIN CAPITAL LETTER E WITH DOT ABOVE */ { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ { 0x03d1, 0x0145 }, /* Ncedilla Å… LATIN CAPITAL LETTER N WITH CEDILLA */ { 0x03d2, 0x014c }, /* Omacron ÅŒ LATIN CAPITAL LETTER O WITH MACRON */ { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ { 0x03e0, 0x0101 }, /* amacron Ä LATIN SMALL LETTER A WITH MACRON */ { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ { 0x03ec, 0x0117 }, /* eabovedot Ä— LATIN SMALL LETTER E WITH DOT ABOVE */ { 0x03ef, 0x012b }, /* imacron Ä« LATIN SMALL LETTER I WITH MACRON */ { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ { 0x03f2, 0x014d }, /* omacron Å LATIN SMALL LETTER O WITH MACRON */ { 0x03f3, 0x0137 }, /* kcedilla Ä· LATIN SMALL LETTER K WITH CEDILLA */ { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ { 0x03fd, 0x0169 }, /* utilde Å© LATIN SMALL LETTER U WITH TILDE */ { 0x03fe, 0x016b }, /* umacron Å« LATIN SMALL LETTER U WITH MACRON */ { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ { 0x04a3, 0x300d }, /* kana_closingbracket 〠RIGHT CORNER BRACKET */ { 0x04a4, 0x3001 }, /* kana_comma 〠IDEOGRAPHIC COMMA */ { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ { 0x04a7, 0x30a1 }, /* kana_a ã‚¡ KATAKANA LETTER SMALL A */ { 0x04a8, 0x30a3 }, /* kana_i ã‚£ KATAKANA LETTER SMALL I */ { 0x04a9, 0x30a5 }, /* kana_u ã‚¥ KATAKANA LETTER SMALL U */ { 0x04aa, 0x30a7 }, /* kana_e ã‚§ KATAKANA LETTER SMALL E */ { 0x04ab, 0x30a9 }, /* kana_o ã‚© KATAKANA LETTER SMALL O */ { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ { 0x04b1, 0x30a2 }, /* kana_A ã‚¢ KATAKANA LETTER A */ { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ { 0x04b6, 0x30ab }, /* kana_KA ã‚« KATAKANA LETTER KA */ { 0x04b7, 0x30ad }, /* kana_KI ã‚­ KATAKANA LETTER KI */ { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ { 0x04bc, 0x30b7 }, /* kana_SHI ã‚· KATAKANA LETTER SI */ { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ { 0x04be, 0x30bb }, /* kana_SE ã‚» KATAKANA LETTER SE */ { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ { 0x04c0, 0x30bf }, /* kana_TA ã‚¿ KATAKANA LETTER TA */ { 0x04c1, 0x30c1 }, /* kana_CHI ムKATAKANA LETTER TI */ { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ { 0x04c8, 0x30cd }, /* kana_NE ムKATAKANA LETTER NE */ { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ { 0x04ca, 0x30cf }, /* kana_HA ムKATAKANA LETTER HA */ { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ { 0x04de, 0x309b }, /* voicedsound ã‚› KATAKANA-HIRAGANA VOICED SOUND MARK */ { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ { 0x05ac, 0x060c }, /* Arabic_comma ØŒ ARABIC COMMA */ { 0x05bb, 0x061b }, /* Arabic_semicolon Ø› ARABIC SEMICOLON */ { 0x05bf, 0x061f }, /* Arabic_question_mark ØŸ ARABIC QUESTION MARK */ { 0x05c1, 0x0621 }, /* Arabic_hamza Ø¡ ARABIC LETTER HAMZA */ { 0x05c2, 0x0622 }, /* Arabic_maddaonalef Ø¢ ARABIC LETTER ALEF WITH MADDA ABOVE */ { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef Ø£ ARABIC LETTER ALEF WITH HAMZA ABOVE */ { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef Ø¥ ARABIC LETTER ALEF WITH HAMZA BELOW */ { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta Ø© ARABIC LETTER TEH MARBUTA */ { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ { 0x05cb, 0x062b }, /* Arabic_theh Ø« ARABIC LETTER THEH */ { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ { 0x05cd, 0x062d }, /* Arabic_hah Ø­ ARABIC LETTER HAH */ { 0x05ce, 0x062e }, /* Arabic_khah Ø® ARABIC LETTER KHAH */ { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ { 0x05d4, 0x0634 }, /* Arabic_sheen Ø´ ARABIC LETTER SHEEN */ { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ { 0x05d7, 0x0637 }, /* Arabic_tah Ø· ARABIC LETTER TAH */ { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ { 0x05e0, 0x0640 }, /* Arabic_tatweel Ù€ ARABIC TATWEEL */ { 0x05e1, 0x0641 }, /* Arabic_feh Ù ARABIC LETTER FEH */ { 0x05e2, 0x0642 }, /* Arabic_qaf Ù‚ ARABIC LETTER QAF */ { 0x05e3, 0x0643 }, /* Arabic_kaf Ùƒ ARABIC LETTER KAF */ { 0x05e4, 0x0644 }, /* Arabic_lam Ù„ ARABIC LETTER LAM */ { 0x05e5, 0x0645 }, /* Arabic_meem Ù… ARABIC LETTER MEEM */ { 0x05e6, 0x0646 }, /* Arabic_noon Ù† ARABIC LETTER NOON */ { 0x05e7, 0x0647 }, /* Arabic_ha Ù‡ ARABIC LETTER HEH */ { 0x05e8, 0x0648 }, /* Arabic_waw Ùˆ ARABIC LETTER WAW */ { 0x05e9, 0x0649 }, /* Arabic_alefmaksura Ù‰ ARABIC LETTER ALEF MAKSURA */ { 0x05ea, 0x064a }, /* Arabic_yeh ÙŠ ARABIC LETTER YEH */ { 0x05eb, 0x064b }, /* Arabic_fathatan Ù‹ ARABIC FATHATAN */ { 0x05ec, 0x064c }, /* Arabic_dammatan ÙŒ ARABIC DAMMATAN */ { 0x05ed, 0x064d }, /* Arabic_kasratan Ù ARABIC KASRATAN */ { 0x05ee, 0x064e }, /* Arabic_fatha ÙŽ ARABIC FATHA */ { 0x05ef, 0x064f }, /* Arabic_damma Ù ARABIC DAMMA */ { 0x05f0, 0x0650 }, /* Arabic_kasra Ù ARABIC KASRA */ { 0x05f1, 0x0651 }, /* Arabic_shadda Ù‘ ARABIC SHADDA */ { 0x05f2, 0x0652 }, /* Arabic_sukun Ù’ ARABIC SUKUN */ { 0x06a1, 0x0452 }, /* Serbian_dje Ñ’ CYRILLIC SMALL LETTER DJE */ { 0x06a2, 0x0453 }, /* Macedonia_gje Ñ“ CYRILLIC SMALL LETTER GJE */ { 0x06a3, 0x0451 }, /* Cyrillic_io Ñ‘ CYRILLIC SMALL LETTER IO */ { 0x06a4, 0x0454 }, /* Ukrainian_ie Ñ” CYRILLIC SMALL LETTER UKRAINIAN IE */ { 0x06a5, 0x0455 }, /* Macedonia_dse Ñ• CYRILLIC SMALL LETTER DZE */ { 0x06a6, 0x0456 }, /* Ukrainian_i Ñ– CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ { 0x06a7, 0x0457 }, /* Ukrainian_yi Ñ— CYRILLIC SMALL LETTER YI */ { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ { 0x06a9, 0x0459 }, /* Cyrillic_lje Ñ™ CYRILLIC SMALL LETTER LJE */ { 0x06aa, 0x045a }, /* Cyrillic_nje Ñš CYRILLIC SMALL LETTER NJE */ { 0x06ab, 0x045b }, /* Serbian_tshe Ñ› CYRILLIC SMALL LETTER TSHE */ { 0x06ac, 0x045c }, /* Macedonia_kje Ñœ CYRILLIC SMALL LETTER KJE */ { 0x06ae, 0x045e }, /* Byelorussian_shortu Ñž CYRILLIC SMALL LETTER SHORT U */ { 0x06af, 0x045f }, /* Cyrillic_dzhe ÑŸ CYRILLIC SMALL LETTER DZHE */ { 0x06b0, 0x2116 }, /* numerosign â„– NUMERO SIGN */ { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ { 0x06b3, 0x0401 }, /* Cyrillic_IO Ð CYRILLIC CAPITAL LETTER IO */ { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ { 0x06b5, 0x0405 }, /* Macedonia_DSE Ð… CYRILLIC CAPITAL LETTER DZE */ { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ { 0x06bc, 0x040c }, /* Macedonia_KJE ÐŒ CYRILLIC CAPITAL LETTER KJE */ { 0x06be, 0x040e }, /* Byelorussian_SHORTU ÐŽ CYRILLIC CAPITAL LETTER SHORT U */ { 0x06bf, 0x040f }, /* Cyrillic_DZHE Ð CYRILLIC CAPITAL LETTER DZHE */ { 0x06c0, 0x044e }, /* Cyrillic_yu ÑŽ CYRILLIC SMALL LETTER YU */ { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ { 0x06c6, 0x0444 }, /* Cyrillic_ef Ñ„ CYRILLIC SMALL LETTER EF */ { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ { 0x06c8, 0x0445 }, /* Cyrillic_ha Ñ… CYRILLIC SMALL LETTER HA */ { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ { 0x06d1, 0x044f }, /* Cyrillic_ya Ñ CYRILLIC SMALL LETTER YA */ { 0x06d2, 0x0440 }, /* Cyrillic_er Ñ€ CYRILLIC SMALL LETTER ER */ { 0x06d3, 0x0441 }, /* Cyrillic_es Ñ CYRILLIC SMALL LETTER ES */ { 0x06d4, 0x0442 }, /* Cyrillic_te Ñ‚ CYRILLIC SMALL LETTER TE */ { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ { 0x06d8, 0x044c }, /* Cyrillic_softsign ÑŒ CYRILLIC SMALL LETTER SOFT SIGN */ { 0x06d9, 0x044b }, /* Cyrillic_yeru Ñ‹ CYRILLIC SMALL LETTER YERU */ { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ { 0x06dc, 0x044d }, /* Cyrillic_e Ñ CYRILLIC SMALL LETTER E */ { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ { 0x06df, 0x044a }, /* Cyrillic_hardsign ÑŠ CYRILLIC SMALL LETTER HARD SIGN */ { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ { 0x06e1, 0x0410 }, /* Cyrillic_A Ð CYRILLIC CAPITAL LETTER A */ { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ { 0x06e8, 0x0425 }, /* Cyrillic_HA Ð¥ CYRILLIC CAPITAL LETTER HA */ { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ { 0x06ee, 0x041d }, /* Cyrillic_EN Ð CYRILLIC CAPITAL LETTER EN */ { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ { 0x06f7, 0x0412 }, /* Cyrillic_VE Ð’ CYRILLIC CAPITAL LETTER VE */ { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ { 0x07a5, 0x03aa }, /* Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ { 0x07a7, 0x038c }, /* Greek_OMICRONaccent ÎŒ GREEK CAPITAL LETTER OMICRON WITH TONOS */ { 0x07a8, 0x038e }, /* Greek_UPSILONaccent ÎŽ GREEK CAPITAL LETTER UPSILON WITH TONOS */ { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Î GREEK CAPITAL LETTER OMEGA WITH TONOS */ { 0x07ae, 0x0385 }, /* Greek_accentdieresis Î… GREEK DIALYTIKA TONOS */ { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ { 0x07b5, 0x03ca }, /* Greek_iotadieresis ÏŠ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis Î GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ { 0x07b7, 0x03cc }, /* Greek_omicronaccent ÏŒ GREEK SMALL LETTER OMICRON WITH TONOS */ { 0x07b8, 0x03cd }, /* Greek_upsilonaccent Ï GREEK SMALL LETTER UPSILON WITH TONOS */ { 0x07b9, 0x03cb }, /* Greek_upsilondieresis Ï‹ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ { 0x07bb, 0x03ce }, /* Greek_omegaaccent ÏŽ GREEK SMALL LETTER OMEGA WITH TONOS */ { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ { 0x07c2, 0x0392 }, /* Greek_BETA Î’ GREEK CAPITAL LETTER BETA */ { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ { 0x07cd, 0x039d }, /* Greek_NU Î GREEK CAPITAL LETTER NU */ { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ { 0x07d5, 0x03a5 }, /* Greek_UPSILON Î¥ GREEK CAPITAL LETTER UPSILON */ { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ { 0x07f0, 0x03c0 }, /* Greek_pi Ï€ GREEK SMALL LETTER PI */ { 0x07f1, 0x03c1 }, /* Greek_rho Ï GREEK SMALL LETTER RHO */ { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma Ï‚ GREEK SMALL LETTER FINAL SIGMA */ { 0x07f4, 0x03c4 }, /* Greek_tau Ï„ GREEK SMALL LETTER TAU */ { 0x07f5, 0x03c5 }, /* Greek_upsilon Ï… GREEK SMALL LETTER UPSILON */ { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ { 0x08a1, 0x23b7 }, /* leftradical ⎷ ??? */ { 0x08a2, 0x250c }, /* topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ { 0x08a3, 0x2500 }, /* horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */ { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ { 0x08a7, 0x23a1 }, /* topleftsqbracket ⎡ ??? */ { 0x08a8, 0x23a3 }, /* botleftsqbracket ⎣ ??? */ { 0x08a9, 0x23a4 }, /* toprightsqbracket ⎤ ??? */ { 0x08aa, 0x23a6 }, /* botrightsqbracket ⎦ ??? */ { 0x08ab, 0x239b }, /* topleftparens ⎛ ??? */ { 0x08ac, 0x239d }, /* botleftparens ⎠??? */ { 0x08ad, 0x239e }, /* toprightparens ⎞ ??? */ { 0x08ae, 0x23a0 }, /* botrightparens ⎠ ??? */ { 0x08af, 0x23a8 }, /* leftmiddlecurlybrace ⎨ ??? */ { 0x08b0, 0x23ac }, /* rightmiddlecurlybrace ⎬ ??? */ /* 0x08b1 topleftsummation ? ??? */ /* 0x08b2 botleftsummation ? ??? */ /* 0x08b3 topvertsummationconnector ? ??? */ /* 0x08b4 botvertsummationconnector ? ??? */ /* 0x08b5 toprightsummation ? ??? */ /* 0x08b6 botrightsummation ? ??? */ /* 0x08b7 rightmiddlesummation ? ??? */ { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ { 0x08c1, 0x221d }, /* variation ∠PROPORTIONAL TO */ { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ { 0x08c8, 0x223c }, /* approximate ∼ TILDE OPERATOR */ { 0x08c9, 0x2243 }, /* similarequal ≃ ASYMPTOTICALLY EQUAL TO */ { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ { 0x08dd, 0x222a }, /* union ∪ UNION */ { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ { 0x08f6, 0x0192 }, /* function Æ’ LATIN SMALL LETTER F WITH HOOK */ { 0x08fb, 0x2190 }, /* leftarrow ↠LEFTWARDS ARROW */ { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ /* 0x09df blank ? ??? */ { 0x09e0, 0x25c6 }, /* soliddiamond â—† BLACK DIAMOND */ { 0x09e1, 0x2592 }, /* checkerboard â–’ MEDIUM SHADE */ { 0x09e2, 0x2409 }, /* ht ≠SYMBOL FOR HORIZONTAL TABULATION */ { 0x09e3, 0x240c }, /* ff ⌠SYMBOL FOR FORM FEED */ { 0x09e4, 0x240d }, /* cr â SYMBOL FOR CARRIAGE RETURN */ { 0x09e5, 0x240a }, /* lf ⊠SYMBOL FOR LINE FEED */ { 0x09e8, 0x2424 }, /* nl ⤠SYMBOL FOR NEWLINE */ { 0x09e9, 0x240b }, /* vt â‹ SYMBOL FOR VERTICAL TABULATION */ { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ { 0x09eb, 0x2510 }, /* uprightcorner â” BOX DRAWINGS LIGHT DOWN AND LEFT */ { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ { 0x09ed, 0x2514 }, /* lowleftcorner â”” BOX DRAWINGS LIGHT UP AND RIGHT */ { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ { 0x09ef, 0x23ba }, /* horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */ { 0x09f0, 0x23bb }, /* horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */ { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ { 0x09f2, 0x23bc }, /* horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */ { 0x09f3, 0x23bd }, /* horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */ { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ { 0x09f6, 0x2534 }, /* bott â”´ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ { 0x0aaa, 0x2013 }, /* endash – EN DASH */ /* 0x0aac signifblank ? ??? */ { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ { 0x0aaf, 0x2025 }, /* doubbaselinedot ‥ TWO DOT LEADER */ { 0x0ab0, 0x2153 }, /* onethird â…“ VULGAR FRACTION ONE THIRD */ { 0x0ab1, 0x2154 }, /* twothirds â…” VULGAR FRACTION TWO THIRDS */ { 0x0ab2, 0x2155 }, /* onefifth â…• VULGAR FRACTION ONE FIFTH */ { 0x0ab3, 0x2156 }, /* twofifths â…– VULGAR FRACTION TWO FIFTHS */ { 0x0ab4, 0x2157 }, /* threefifths â…— VULGAR FRACTION THREE FIFTHS */ { 0x0ab5, 0x2158 }, /* fourfifths â…˜ VULGAR FRACTION FOUR FIFTHS */ { 0x0ab6, 0x2159 }, /* onesixth â…™ VULGAR FRACTION ONE SIXTH */ { 0x0ab7, 0x215a }, /* fivesixths â…š VULGAR FRACTION FIVE SIXTHS */ { 0x0ab8, 0x2105 }, /* careof â„… CARE OF */ { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ /* 0x0abd decimalpoint ? ??? */ { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ /* 0x0abf marker ? ??? */ { 0x0ac3, 0x215b }, /* oneeighth â…› VULGAR FRACTION ONE EIGHTH */ { 0x0ac4, 0x215c }, /* threeeighths â…œ VULGAR FRACTION THREE EIGHTHS */ { 0x0ac5, 0x215d }, /* fiveeighths â… VULGAR FRACTION FIVE EIGHTHS */ { 0x0ac6, 0x215e }, /* seveneighths â…ž VULGAR FRACTION SEVEN EIGHTHS */ { 0x0ac9, 0x2122 }, /* trademark â„¢ TRADE MARK SIGN */ { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ /* 0x0acb trademarkincircle ? ??? */ { 0x0acc, 0x25c1 }, /* leftopentriangle â— WHITE LEFT-POINTING TRIANGLE */ { 0x0acd, 0x25b7 }, /* rightopentriangle â–· WHITE RIGHT-POINTING TRIANGLE */ { 0x0ace, 0x25cb }, /* emopencircle â—‹ WHITE CIRCLE */ { 0x0acf, 0x25af }, /* emopenrectangle â–¯ WHITE VERTICAL RECTANGLE */ { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ { 0x0ad3, 0x201d }, /* rightdoublequotemark †RIGHT DOUBLE QUOTATION MARK */ { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ { 0x0ad9, 0x271d }, /* latincross ✠LATIN CROSS */ /* 0x0ada hexagram ? ??? */ { 0x0adb, 0x25ac }, /* filledrectbullet â–¬ BLACK RECTANGLE */ { 0x0adc, 0x25c0 }, /* filledlefttribullet â—€ BLACK LEFT-POINTING TRIANGLE */ { 0x0add, 0x25b6 }, /* filledrighttribullet â–¶ BLACK RIGHT-POINTING TRIANGLE */ { 0x0ade, 0x25cf }, /* emfilledcircle â— BLACK CIRCLE */ { 0x0adf, 0x25ae }, /* emfilledrect â–® BLACK VERTICAL RECTANGLE */ { 0x0ae0, 0x25e6 }, /* enopencircbullet â—¦ WHITE BULLET */ { 0x0ae1, 0x25ab }, /* enopensquarebullet â–« WHITE SMALL SQUARE */ { 0x0ae2, 0x25ad }, /* openrectbullet â–­ WHITE RECTANGLE */ { 0x0ae3, 0x25b3 }, /* opentribulletup â–³ WHITE UP-POINTING TRIANGLE */ { 0x0ae4, 0x25bd }, /* opentribulletdown â–½ WHITE DOWN-POINTING TRIANGLE */ { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ { 0x0ae7, 0x25aa }, /* enfilledsqbullet â–ª BLACK SMALL SQUARE */ { 0x0ae8, 0x25b2 }, /* filledtribulletup â–² BLACK UP-POINTING TRIANGLE */ { 0x0ae9, 0x25bc }, /* filledtribulletdown â–¼ BLACK DOWN-POINTING TRIANGLE */ { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ { 0x0af1, 0x2020 }, /* dagger † DAGGER */ { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ { 0x0af6, 0x266d }, /* musicalflat â™­ MUSIC FLAT SIGN */ { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ { 0x0afb, 0x2117 }, /* phonographcopyright â„— SOUND RECORDING COPYRIGHT */ { 0x0afc, 0x2038 }, /* caret ‸ CARET */ { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ /* 0x0aff cursor ? ??? */ { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ { 0x0bc2, 0x22a5 }, /* downtack ⊥ UP TACK */ { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD */ { 0x0bce, 0x22a4 }, /* uptack ⊤ DOWN TACK */ { 0x0bcf, 0x25cb }, /* circle â—‹ WHITE CIRCLE */ { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ { 0x0bdc, 0x22a2 }, /* lefttack ⊢ RIGHT TACK */ { 0x0bfc, 0x22a3 }, /* righttack ⊣ LEFT TACK */ { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ { 0x0ce0, 0x05d0 }, /* hebrew_aleph × HEBREW LETTER ALEF */ { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ { 0x0ce2, 0x05d2 }, /* hebrew_gimel ×’ HEBREW LETTER GIMEL */ { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ { 0x0ce4, 0x05d4 }, /* hebrew_he ×” HEBREW LETTER HE */ { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ { 0x0ce6, 0x05d6 }, /* hebrew_zain ×– HEBREW LETTER ZAYIN */ { 0x0ce7, 0x05d7 }, /* hebrew_chet ×— HEBREW LETTER HET */ { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ { 0x0ce9, 0x05d9 }, /* hebrew_yod ×™ HEBREW LETTER YOD */ { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ { 0x0ceb, 0x05db }, /* hebrew_kaph ×› HEBREW LETTER KAF */ { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ { 0x0ced, 0x05dd }, /* hebrew_finalmem × HEBREW LETTER FINAL MEM */ { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ { 0x0cf0, 0x05e0 }, /* hebrew_nun ×  HEBREW LETTER NUN */ { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ { 0x0cf2, 0x05e2 }, /* hebrew_ayin ×¢ HEBREW LETTER AYIN */ { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ×£ HEBREW LETTER FINAL PE */ { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ×¥ HEBREW LETTER FINAL TSADI */ { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ { 0x0cf7, 0x05e7 }, /* hebrew_qoph ×§ HEBREW LETTER QOF */ { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ { 0x0da1, 0x0e01 }, /* Thai_kokai ภTHAI CHARACTER KO KAI */ { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ { 0x0dad, 0x0e0d }, /* Thai_yoying ภTHAI CHARACTER YO YING */ { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ { 0x0daf, 0x0e0f }, /* Thai_topatak ภTHAI CHARACTER TO PATAK */ { 0x0db0, 0x0e10 }, /* Thai_thothan ภTHAI CHARACTER THO THAN */ { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ { 0x0dbd, 0x0e1d }, /* Thai_fofa ภTHAI CHARACTER FO FA */ { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ /* 0x0dde Thai_maihanakat_maitho ? ??? */ { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ { 0x0de1, 0x0e41 }, /* Thai_saraae ๠THAI CHARACTER SARA AE */ { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ { 0x0ded, 0x0e4d }, /* Thai_nikhahit ๠THAI CHARACTER NIKHAHIT */ { 0x0df0, 0x0e50 }, /* Thai_leksun ๠THAI DIGIT ZERO */ { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ { 0x0ea4, 0x3134 }, /* Hangul_Nieun ã„´ HANGUL LETTER NIEUN */ { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ã„¶ HANGUL LETTER NIEUN-HIEUH */ { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ã„· HANGUL LETTER TIKEUT */ { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ { 0x0eab, 0x313b }, /* Hangul_RieulMieum ã„» HANGUL LETTER RIEUL-MIEUM */ { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ã„¿ HANGUL LETTER RIEUL-PHIEUPH */ { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ã…€ HANGUL LETTER RIEUL-HIEUH */ { 0x0eb1, 0x3141 }, /* Hangul_Mieum ã… HANGUL LETTER MIEUM */ { 0x0eb2, 0x3142 }, /* Hangul_Pieub ã…‚ HANGUL LETTER PIEUP */ { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ã…ƒ HANGUL LETTER SSANGPIEUP */ { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ã…„ HANGUL LETTER PIEUP-SIOS */ { 0x0eb5, 0x3145 }, /* Hangul_Sios ã…… HANGUL LETTER SIOS */ { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ã…† HANGUL LETTER SSANGSIOS */ { 0x0eb7, 0x3147 }, /* Hangul_Ieung ã…‡ HANGUL LETTER IEUNG */ { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ã…ˆ HANGUL LETTER CIEUC */ { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ã…‰ HANGUL LETTER SSANGCIEUC */ { 0x0eba, 0x314a }, /* Hangul_Cieuc ã…Š HANGUL LETTER CHIEUCH */ { 0x0ebb, 0x314b }, /* Hangul_Khieuq ã…‹ HANGUL LETTER KHIEUKH */ { 0x0ebc, 0x314c }, /* Hangul_Tieut ã…Œ HANGUL LETTER THIEUTH */ { 0x0ebd, 0x314d }, /* Hangul_Phieuf ã… HANGUL LETTER PHIEUPH */ { 0x0ebe, 0x314e }, /* Hangul_Hieuh ã…Ž HANGUL LETTER HIEUH */ { 0x0ebf, 0x314f }, /* Hangul_A ã… HANGUL LETTER A */ { 0x0ec0, 0x3150 }, /* Hangul_AE ã… HANGUL LETTER AE */ { 0x0ec1, 0x3151 }, /* Hangul_YA ã…‘ HANGUL LETTER YA */ { 0x0ec2, 0x3152 }, /* Hangul_YAE ã…’ HANGUL LETTER YAE */ { 0x0ec3, 0x3153 }, /* Hangul_EO ã…“ HANGUL LETTER EO */ { 0x0ec4, 0x3154 }, /* Hangul_E ã…” HANGUL LETTER E */ { 0x0ec5, 0x3155 }, /* Hangul_YEO ã…• HANGUL LETTER YEO */ { 0x0ec6, 0x3156 }, /* Hangul_YE ã…– HANGUL LETTER YE */ { 0x0ec7, 0x3157 }, /* Hangul_O ã…— HANGUL LETTER O */ { 0x0ec8, 0x3158 }, /* Hangul_WA ã…˜ HANGUL LETTER WA */ { 0x0ec9, 0x3159 }, /* Hangul_WAE ã…™ HANGUL LETTER WAE */ { 0x0eca, 0x315a }, /* Hangul_OE ã…š HANGUL LETTER OE */ { 0x0ecb, 0x315b }, /* Hangul_YO ã…› HANGUL LETTER YO */ { 0x0ecc, 0x315c }, /* Hangul_U ã…œ HANGUL LETTER U */ { 0x0ecd, 0x315d }, /* Hangul_WEO ã… HANGUL LETTER WEO */ { 0x0ece, 0x315e }, /* Hangul_WE ã…ž HANGUL LETTER WE */ { 0x0ecf, 0x315f }, /* Hangul_WI ã…Ÿ HANGUL LETTER WI */ { 0x0ed0, 0x3160 }, /* Hangul_YU ã…  HANGUL LETTER YU */ { 0x0ed1, 0x3161 }, /* Hangul_EU ã…¡ HANGUL LETTER EU */ { 0x0ed2, 0x3162 }, /* Hangul_YI ã…¢ HANGUL LETTER YI */ { 0x0ed3, 0x3163 }, /* Hangul_I ã…£ HANGUL LETTER I */ { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇠHANGUL JONGSEONG PHIEUPH */ { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ã…­ HANGUL LETTER RIEUL-YEORINHIEUH */ { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ã…± HANGUL LETTER KAPYEOUNMIEUM */ { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ã…¸ HANGUL LETTER KAPYEOUNPIEUP */ { 0x0ef2, 0x317f }, /* Hangul_PanSios ã…¿ HANGUL LETTER PANSIOS */ { 0x0ef3, 0x3181 }, /* Hangul_KkogjiDalrinIeung ㆠHANGUL LETTER YESIEUNG */ { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆠHANGUL LETTER ARAEA */ { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ { 0x0eff, 0x20a9 }, /* Korean_Won â‚© WON SIGN */ { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ { 0x13bc, 0x0152 }, /* OE Å’ LATIN CAPITAL LIGATURE OE */ { 0x13bd, 0x0153 }, /* oe Å“ LATIN SMALL LIGATURE OE */ { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ }; long keysym2ucs(KeySym keysym) { int min = 0; int max = sizeof(keysymtab) / sizeof(struct codepair) - 1; int mid; /* first check for Latin-1 characters (1:1 mapping) */ if ((keysym >= 0x0020 && keysym <= 0x007e) || (keysym >= 0x00a0 && keysym <= 0x00ff)) return keysym; /* also check for directly encoded 24-bit UCS characters */ if ((keysym & 0xff000000) == 0x01000000) return keysym & 0x00ffffff; /* binary search in table */ while (max >= min) { mid = (min + max) / 2; if (keysymtab[mid].keysym < keysym) { min = mid + 1; } else if (keysymtab[mid].keysym > keysym) { max = mid - 1; } else { /* found it */ return keysymtab[mid].ucs; } } /* no matching Unicode value found */ return -1; } suite3270-3.6/x3270/keysym2ucs.h0000664000076500007650000000023713221577164014251 0ustar pdmpdm/* * This module converts keysym values into the corresponding ISO 10646-1 * (UCS, Unicode) values. */ #include long keysym2ucs(KeySym keysym); suite3270-3.6/x3270/ky.bm0000664000076500007650000000100313221577164012715 0ustar pdmpdm#define ky_width 39 #define ky_height 14 static unsigned char ky_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xf3, 0x3f, 0xaa, 0xaa, 0xaa, 0x92, 0x24, 0xfe, 0xff, 0xff, 0xf3, 0x3f, 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x80, 0x04, 0xfe, 0xff, 0x7f, 0xf0, 0x3f, 0x92, 0x24, 0x49, 0x90, 0x24, 0xfe, 0xff, 0xff, 0xf3, 0x3f, 0x92, 0x24, 0x49, 0x82, 0x04, 0xfe, 0xff, 0xff, 0x83, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00}; suite3270-3.6/x3270/LICENSE0000664000076500007650000001033713221577164012771 0ustar pdmpdmCopyright (c) 1993-2016, Paul Mattes. Copyright (c) 2004-2005, Don Russell. Copyright (c) 2004, Dick Altenbern. Copyright (c) 1990, Jeff Sparkes. Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA 30332. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Paul Mattes, Don Russell, Dick Altenbern, Jeff Sparkes, GTRC nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES, DICK ALTENBERN AND GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, DON RUSSELL, DICK ALTENBERN, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The 3270-20 font is derived from an NCD font, so it carries an additional notice: Copyright 1989-1991 Network Computing Devices, Inc. NCD is a registered trademark of Network Computing Devices, Inc. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of NCD may not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. NCD makes no representations about the suitability of this software for any purpose. It is provided ``as is'' without express or implied warranty. NCD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NCD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. The ComplexMenu sources are derived from the MIT X11R5 Athena SimpleMenu widget, and carry an additional notice: Copyright 1989 Massachusetts Institute of Technology Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of M.I.T. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. M.I.T. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. suite3270-3.6/x3270/localdefs.h0000664000076500007650000000347513221577164014076 0ustar pdmpdm/* * Copyright (c) 2000-2009, 2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * localdefs.h * Local definitions for x3270. * * This file contains definitions for environment-specific * facilities, such as memory allocation, I/O registration, * and timers. */ /* We use X11 data types all over. */ #include /* Identify ourselves. */ #define X3270_DISPLAY 1 suite3270-3.6/x3270/locked.bm0000664000076500007650000000041213221577164013536 0ustar pdmpdm#define locked_width 16 #define locked_height 14 static unsigned char locked_bits[] = { 0xf8, 0x00, 0x04, 0x01, 0x72, 0x02, 0x8a, 0x02, 0x8a, 0x02, 0x8a, 0x02, 0xff, 0x07, 0x55, 0x05, 0xab, 0x06, 0x55, 0x05, 0xab, 0x06, 0xff, 0x07, 0x01, 0x04, 0xff, 0x07}; suite3270-3.6/x3270/m4man0000775000076500007650000000342013221577163012720 0ustar pdmpdm#!/usr/bin/env bash # generate a man page or html man page from m4 source function usage() { echo >&2 "usage: $0 -t html|man -p product -n name [-o outfile] source" exit 1 } while [ $# -gt 0 ] do case $1 in -t) shift case $1 in html|man) type=$1 shift ;; *) usage esac ;; -p) shift product=$1 shift ;; -n) shift name=$1 shift ;; -o) shift outfile=$1 shift ;; -*) usage ;; *) if [ -n "$source" ] then usage fi source=$1 shift esac done if [ -z "$type" -o -z "$product" -o -z "$name" -o -z "$source" ] then usage fi . ./version.txt date=`date "+%d %B %Y"` # platform case $product in x3270|x3270|c3270|s3270|tcl3270|pr3287) platform=unix c3270=c3270 s3270=s3270 pr3287=pr3287 x3270=x3270 ;; wc3270|ws3270|wpr3287) platform=windows c3270=wc3270 s3270=ws3270 pr3287=wpr3287 x3270=wc3270 ;; *) echo >&2 "Unknown product: $1" exit 1 esac # mode case $product in c3270|wc3270) mode=console ;; s3270|ws3270) mode=script ;; *) mode=$product ;; esac # interactive case $product in x3270|c3270|wc3270) interactive=yes ;; *) interactive=no ;; esac # set up output file, and make sure it will be deleted if [ -n "$outfile" ] then tf=/tmp/m4man$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM fi /usr/bin/m4 -DXX_PRODUCT=$product -DXX_PAGENAME=$name \ -DXX_PLATFORM=$platform -DXX_MODE=$mode -DXX_INTERACTIVE=$interactive \ -DXX_C3270=$c3270 -DXX_S3270=$s3270 -DXX_PR3287=$pr3287 -DXX_X3270=$x3270 \ -DXX_DATE="$date" -DXX_VERSION_NUMBER=$version -DXX_CYEAR=$cyear \ $type.m4 $source | if [ -n "$outfile" ] then cat >$tf else cat fi rc=$? if [ -n "$outfile" -a $rc -eq 0 ] then mv $tf $outfile fi exit $rc suite3270-3.6/x3270/Makefile.aux0000664000076500007650000000717313221577164014224 0ustar pdmpdm# Copyright (c) 1995-2015, 2017 Paul Mattes. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Paul Mattes nor his contributors may be used # to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN # NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Auxiliary makefile for x3270 PRODUCT = x3270 all: @echo "Must pick a specific make target." DOCS = $(PRODUCT).man html/$(PRODUCT)-man.html html/FAQ.html \ html/Lineage.html html/ReleaseNotes.html html/Resources.html \ html/SSL.html html/ibm_hosts.html html/x3270-script.html \ ibm_hosts.man x3270-script.man # Rule for building the source tarball: run autoconf and build the # documentation. src.tgz: prepare $(DOCS) Makefile.aux # Rule for preparing a freshly-pulled working copy: run autoconf. prepare: configure $(PRODUCT).man configure: configure.in autoconf MANDEP = man.m4 html.m4 m4man Makefile.aux version.txt MKMAN = ./m4man -t man -p $(PRODUCT) MKHTML = ./m4man -t html -p $(PRODUCT) MANSRC = x3270.man.m4 menus.inc apl.inc xkeymaps.inc hostname.inc # Rule for building the documentation. man: $(DOCS) # Rules for building man pages and derived HTML documentation. $(PRODUCT).man: $(MANSRC) $(MANDEP) $(MKMAN) -n x3270 -o $@ x3270.man.m4 html/$(PRODUCT)-man.html: $(MANSRC) $(MANDEP) $(MKHTML) -n x3270 -o $@ x3270.man.m4 ibm_hosts.man: ibm_hosts.man.m4 man.m4 $(MANDEP) $(MKMAN) -n ibm_hosts -o $@ ibm_hosts.man.m4 html/ibm_hosts.html: ibm_hosts.man.m4 ft.inc $(MANDEP) $(MKHTML) -n ibm_hosts -o $@ ibm_hosts.man.m4 x3270-script.man: x3270-script.man.m4 ft.inc $(MANDEP) $(MKMAN) -n x3270-script -o $@ x3270-script.man.m4 html/x3270-script.html: x3270-script.man.m4 ft.inc $(MANDEP) $(MKHTML) -n x3270-script -o $@ x3270-script.man.m4 html/FAQ.html: mkstand.bash html/documentation-faq-body.html ./mkstand.bash '$(PRODUCT) Frequently Asked Questions' html/documentation-faq-body.html $@ html/Lineage.html: mkstand.bash html/license-body.html ./mkstand.bash '$(PRODUCT) Licensing' html/license-body.html $@ html/ReleaseNotes.html: html/documentation-relnotes-body.html mkstand.bash ./mkstand.bash "$(PRODUCT) Release Notes" html/documentation-relnotes-body.html $@ html/Resources.html: resource-body make-resource-doc.pl version.txt ./make-resource-doc.pl -o $@ $(PRODUCT) $(XVERSION) $(CC) $(CFLAGS) -c -o $@ $(XVERSION) $(RM) $(XVERSION) FALLBACKS = fb-x3270 fb-printSession fb-common fb-composeMap fb-messages fallbacks.c: mkfb $(FALLBACKS) $(RM) $@ ./mkfb -o $@ $(filter-out mkfb,$^) mkfb: mkfb.c $(CC) $(CFLAGS) -o $@ $(filter %.c,$^) x3270: $(OBJS1) $(DEP3270) $(DEP3270I) $(DEP32XX) $(DEP3270STUBS) $(CC) -o $@ $(OBJS1) $(LDFLAGS) $(LD3270) $(LD3270I) $(LD32XX) $(LD3270STUBS) $(LIBS) %.pcf.gz: %.bdf bdftopcf $< | gzip >$@ dryrun: dryrun.in /bin/cp $< $@ man:: x3270.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi man:: x3270-script.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi man:: ibm_hosts.man if [ ! -f $(notdir $^) ]; then /bin/cp $< $(notdir $^); fi install:: x3270 [ -d $(DESTDIR)$(BINDIR) ] || \ mkdir -p $(DESTDIR)$(BINDIR) $(INSTALL_PROGRAM) x3270 $(DESTDIR)$(BINDIR)/x3270 install:: ibm_hosts [ -d $(DESTDIR)$(LIBX3270DIR) ] || \ mkdir -p $(DESTDIR)$(LIBX3270DIR) [ -r $(DESTDIR)$(LIBX3270DIR)/ibm_hosts ] || \ $(INSTALL_DATA) $< $(DESTDIR)$(LIBX3270DIR)/ibm_hosts install:: [ -d $(DESTDIR)$(CIFONTDIR) ] || \ mkdir -p $(DESTDIR)$(CIFONTDIR) @for i in $(FONTS); \ do (set -x; $(INSTALL_DATA) $$i $(DESTDIR)$(CIFONTDIR)/$$i); \ done -chmod u+w $(DESTDIR)$(CIFONTDIR) $(DESTDIR)$(CIFONTDIR)/fonts.dir mkfontdir $(DESTDIR)$(CIFONTDIR) chmod u=rwx,go=rx $(DESTDIR)$(CIFONTDIR) chmod a=r $(DESTDIR)$(CIFONTDIR)/fonts.dir install.man: man [ -d $(DESTDIR)$(MANDIR)/man1 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man1 [ -d $(DESTDIR)$(MANDIR)/man5 ] || \ mkdir -p $(DESTDIR)$(MANDIR)/man5 $(INSTALL_DATA) x3270.man $(DESTDIR)$(MANDIR)/man1/x3270.1 $(INSTALL_DATA) x3270-script.man $(DESTDIR)$(MANDIR)/man1/x3270-script.1 $(INSTALL_DATA) ibm_hosts.man $(DESTDIR)$(MANDIR)/man5/ibm_hosts.5 clean: $(RM) *.o *pcf.gz mkfb fallbacks.c clobber: clean $(RM) x3270 *.d *.man dryrun # Include auto-generated dependencies. -include $(OBJS:.o=.d) mkfb.d suite3270-3.6/x3270/make-resource-doc.pl0000775000076500007650000001752213221577163015633 0ustar pdmpdm#!/usr/bin/env perl use strict; my $outfile; if ($ARGV[0] eq "-o") { die "Missing filename after -o.\n" unless ($#ARGV >= 1); shift; $outfile = $ARGV[0]; shift; } die "Must specify product.\n" unless ($#ARGV >= 0); my $product = $ARGV[0]; # Figure out the version name. my $version; open VERSION, ") { chomp; if (/^version="(.*)"/) { $version=$1 } } close VERSION; # Sort out the product, and %approd. my %approd; $approd{'a'} = 1; if ($product eq "x3270") { $approd{'u'} = 1; } elsif ($product eq "c3270") { $approd{'C'} = 1; $approd{'u'} = 1; } elsif ($product eq "s3270") { $approd{'S'} = 1; $approd{'u'} = 1; } elsif ($product eq "tcl3270") { $approd{'u'} = 1; } elsif ($product eq "wc3270") { $approd{'C'} = 1; $approd{'w'} = 1; } elsif ($product eq "ws3270") { $approd{'S'} = 1; $approd{'w'} = 1; } else { die "Unknown product '$product'.\n"; } my $prefix = $product; $prefix =~ s/3270//; $approd{$prefix} = 1; # Dump out %approd. #foreach my $k (keys %approd) { # print STDERR "$k: $approd{$k}\n" #} my %types = ( i => 'Integer', b => 'Boolean', s => 'String' ); # Set up output file. my $out; my $tmpfile; if ($outfile) { $tmpfile = "/tmp/mkr" . $$; unlink $tmpfile; open TMPFILE, ">", $tmpfile or die "Can't open $tmpfile.\n"; $out = *TMPFILE; } else { $out = *STDOUT; } # From here on out, unlink the tempfile if we bail. END { unlink $tmpfile if ($tmpfile); } # Unlink the tempfile if we get a termination signal. sub sighandler { unlink $tmpfile if ($tmpfile); exit(0); } $SIG{'INT'} = \&sighandler; $SIG{'QUIT'} = \&sighandler; $SIG{'HUP'} = \&sighandler; $SIG{'TERM'} = \&sighandler; # Remove HTML attributes from a resource name. sub nix { my $txt = shift(@_); $txt =~ s/<\/?[\w.]+>//g; return $txt; } # The indices. my @index; # overall index my @c_index; # configuration index my @a_index; # appearance index my @n_index; # NVT-mode index my @p_index; # protocol index my @i_index; # interaction index my @s_index; # security index my @t_index; # tracing index my @o_index; # other index my @d_index; # deprecated index my @indices = ( \@c_index, \@a_index, \@n_index, \@p_index, \@i_index, \@s_index, \@t_index, \@o_index, \@d_index ); my @index_name = ( "Basic Configuration", "Appearance", "NVT-Mode", "Protocol", "Terminal Interaction", "Security", "Tracing", "Other", "Deprecated" ); # The elements of an entry. my $name; my @names; my $applies; my $type; my $default; my @switch; my @option; my $description; my $groups; sub dump { if ($name && $applies) { # The minimum set of required attributes are type and description. die "$name missing type\n" if (!$type); die "$name missing description\n" if (!$description); foreach my $n (@names) { # Add this name to the general index. push @index, $n; # Add this name to the specified indices... if (defined($groups)) { foreach (split /\s+/, $groups) { if ($_ eq "c") { push @c_index, $n; } elsif ($_ eq "a") { push @a_index, $n; } elsif ($_ eq "n") { push @n_index, $n; } elsif ($_ eq "p") { push @p_index, $n; } elsif ($_ eq "i") { push @i_index, $n; } elsif ($_ eq "s") { push @s_index, $n; } elsif ($_ eq "t") { push @t_index, $n; } elsif ($_ eq "d") { push @d_index, $n; } else { die "Unknown group '$_'\n"; } } } else { # ... or to the 'other' index. push @o_index, $n; } my $tgt = nix($n); print $out "\nName: $product.$n
    \n"; } print $out "Type: $type
    \n"; if ($default) { print $out "Default: $default
    \n"; } if (@switch) { my $comma; print $out "Command Line:"; foreach my $s (@switch) { print $out "$comma $s\n"; $comma = ","; } print $out "
    \n"; } if ($product eq "x3270") { foreach my $o (@option) { print $out "Option: $o
    \n"; } } $description =~ s/%p%/$product/g; while ($description =~ /%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $description =~ s/%-[\w.<>\/*]+%/$product.$full<\/a>/; } #$description =~ s/%-([\w.]+)%/$product.\1<\/tt><\/a>/g; print $out "Description:
    \n"; print $out "

    $description

    \n"; } undef $name; undef @names; undef $applies; undef $type; undef $default; undef @switch; undef @option; undef $description; undef $groups; } print $out <<"EOS"; $product Resources

    $product Resources

    EOS my $on = 1; my $in_desc; my $in_intro; my @ifstack; while () { chomp; # Skip blank lines. next if (/^\s*$/); # Handle if/endif. if (/^if\s+(.*)/) { push @ifstack, $on; my $desc_applies; foreach (split /\s+/, $1) { $desc_applies = 1 if ($approd{$_}); } $on = $desc_applies if ($ifstack[$#ifstack]); next; } elsif (/^else/) { die "dangling else\n" if ($#ifstack < 0); $on = !$on if ($ifstack[$#ifstack]); next; } elsif (/^endif/) { die "dangling endif\n" if ($#ifstack < 0); $on = pop(@ifstack); next; } next unless $on; # Handle desc. if ($in_desc) { if (/^\./) { undef $in_desc; } else { $description .= $_ . "\n"; } next; } # Handle intro. if (/^intro/) { $in_intro = 1; next; } elsif ($in_intro) { if (/^\./) { undef $in_intro; print $out "

    Alphabetical Resource List

    \n"; } else { s/%p%/$product/g; while (/%-([\w.<>\/*]+)%/) { my $full = $1; my $clean = nix($1); $clean =~ s/<\/?i>//g; $_ =~ s/%-[\w.<>\/*]+%/
    $product.$full<\/a>/; } print $out "$_\n"; } next; } # Handle normal keywords. if (/name\s(.*)/) { &dump; @names = split /\s+/, $1; $name = $names[0]; next; } if (/applies\s(.*)/) { undef $applies; foreach (split /\s+/, $1) { $applies = 1 if ($approd{$_}); } next; } if (/groups\s(.*)/) { $groups = $1; next; } if (/type\s([^\s]*)/) { $type = $types{$1}; next; } if (/default\s(.*)/) { $default = $1; next; } if (/switch\s(.*)/) { push @switch, $1; next; } if (/option\s(.*)/) { push @option, $1; next; } if (/^desc/) { $in_desc = 1; next; } last if (/^EOF$/); die "Unknown keyword '$_'.\n"; } &dump; print $out <Index of All Resources EOT my $ix = 0; foreach my $i (@index) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; my $q = 0; foreach my $j (@indices) { my @arr = @$j; if ($#arr >= 0) { print $out "

    $index_name[$q] Resources

    \n"; print $out "\n"; my $ix = 0; foreach my $i (@arr) { if (!($ix % 4)) { if ($ix) { print $out " \n"; } print $out ""; } my $clean = nix($i); print $out " "; $ix++; } print $out " \n
    $i
    \n"; } $q = $q + 1; } print $out "

    $product version $version ", `date`, "\n"; print $out "\n"; # Wrap up the outfile. if ($outfile) { close TMPFILE; system("mv $tmpfile $outfile") == 0 or die "Can't rename $tmpfile to $outfile.\n"; } suite3270-3.6/x3270/man.m40000664000076500007650000000513013221577163012773 0ustar pdmpdmdnl Copyright (c) 2000-2012, Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl Man page macros in m4, produces output for nroff -man changecom()dnl changequote(<,>)dnl define(XX_POSESSIVE,$1's)dnl define(XX_DQUOTED,``$1'')dnl changequote(`,')dnl define(XX_SH,.SH `"translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)"')dnl define(XX_TH,.TH $1 $2 "$3")dnl define(XX_SM,\s-1$1\s+1)dnl define(XX_LP,.LP)dnl define(XX_IP,.IP)dnl define(XX_BR,.br)dnl define(XX_RS,.RS $1 .RE)dnl define(XX_TS,.TS $2)dnl define(XX_TR,$1)dnl define(XX_TD,T{ .na .nh $1 T})dnl define(XX_TDH,T{ .na .nh .in +2 .ti -2 $1 T})dnl define(XX_T_,_)dnl define(XX_TC,$1)dnl define(XX_TE,.TE)dnl define(XX_TPS)dnl define(XX_TP,.TP $1)dnl define(XX_TPE)dnl define(XX_PP,.PP)dnl define(XX_RI2,.RI $1 $2)dnl define(XX_DASH,\-)dnl define(XX_DASHED,\-$1)dnl define(XX_FI,\fI$1\fP)dnl define(XX_FB,\fB$1\fP)dnl define(XX_NBSP,`\ ')dnl define(XX_LT,<)dnl define(XX_BS,\e)dnl define(XX_TARGET)dnl define(XX_LINK,$2)dnl define(XX_COPY,` ')dnl define(XX_NOT,notsign)dnl define(XX_BACKSLASH,\\$1)dnl define(XX_HO)dnl define(XX_HY,$1\%$2)dnl dnl Make sure it gets run through tbl first. '\" t suite3270-3.6/x3270/menubar.c0000664000076500007650000016617513221577164013575 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * menubar.c * This module handles the menu bar. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include "Husk.h" #include "CmplxMenu.h" #include "CmeBSB.h" #include "CmeLine.h" #include "appres.h" #include "objects.h" #include "resources.h" #include "actions.h" #include "about.h" #include "charset.h" #include "ft_private.h" #include "ft_gui.h" #include "host.h" #include "idle_gui.h" #include "keymap.h" #include "kybd.h" #include "macros.h" #include "menubar.h" #include "popups.h" #include "print_screen.h" #include "print_window.h" #include "pr3287_session.h" #include "printer_gui.h" #include "stmenu.h" #include "telnet.h" #include "toggles.h" #include "utils.h" #include "xaa.h" #include "xappres.h" #include "xactions.h" #include "xkeypad.h" #include "xio.h" #include "xmenubar.h" #include "xpopups.h" #include "xsave.h" #include "xscreen.h" #define MACROS_MENU "macrosMenu" /* Menu widgets associated with toggles. */ toggle_widget_t toggle_widget[N_TOGGLES]; static struct scheme { char *label; char **parents; char *scheme; struct scheme *next; } *schemes, *last_scheme; static int scheme_count; static Widget *scheme_widgets; static Widget file_menu; static Widget options_menu; static Widget fonts_option; static Pixel fm_background = 0; static Dimension fm_borderWidth; static Pixel fm_borderColor; static Dimension fm_leftMargin; static Dimension fm_rightMargin; static bool snap_enabled = true; static bool keypad_sensitive = true; static struct charset { char **parents; char *label; char *charset; struct charset *next; } *charsets, *last_charset; static int charset_count; static Widget *charset_widgets; static void scheme_init(void); static void charsets_init(void); static void options_menu_init(bool regen, Position x, Position y); static void keypad_button_init(Position x, Position y); static void ssl_icon_init(Position x, Position y); static void connect_menu_init(bool regen, Position x, Position y); static void macros_menu_init(bool regen, Position x, Position y); static void file_menu_init(bool regen, Dimension x, Dimension y); static void Bye(Widget w, XtPointer client_data, XtPointer call_data); static void menubar_in3270(bool in3270); static void menubar_linemode(bool in_linemode); static void menubar_connect(bool ignored); static void menubar_printer(bool printer_on); static void menubar_remodel(bool ignored _is_unused); static void menubar_charset(bool ignored _is_unused); static void screensave_option(Widget w, XtPointer client_data, XtPointer call_data); #define NO_BANG(s) (((s)[0] == '!')? (s) + 1: (s)) #include "dot.bm" #include "no_dot.bm" #include "arrow.bm" #include "diamond.bm" #include "no_diamond.bm" #include "ky.bm" #include "locked.bm" #include "unlocked.bm" #include "null.bm" /* * Menu Bar */ static Widget menu_parent; static bool menubar_buttons; static Widget disconnect_button; static Widget exit_button; static Widget exit_menu; static Widget macros_button; static Widget ft_button; static Widget printer_button; static Widget assoc_button; static Widget lu_button; static Widget printer_off_button; static Widget connect_button; static Widget locked_icon; static Widget unlocked_icon; static Widget unverified_icon; static Widget keypad_button; static Widget linemode_button; static Widget charmode_button; static Widget models_option; static Widget model_2_button; static Widget model_3_button; static Widget model_4_button; static Widget model_5_button; static Widget oversize_button; static Widget extended_button; static Widget m3278_button; static Widget m3279_button; static Widget keypad_option_button; static Widget scheme_button; static Widget connect_menu; static Widget script_abort_button; static Widget idle_button; static Widget snap_button; static Pixmap arrow; Pixmap dot; Pixmap no_dot; Pixmap diamond; Pixmap no_diamond; Pixmap null; static int n_bye; static bool toggle_init(Widget, int, const char *, const char *, bool *); #define TOP_MARGIN 3 #define BOTTOM_MARGIN 3 #define LEFT_MARGIN 3 #define KEY_HEIGHT 18 #define KEY_WIDTH 70 #define BORDER 1 #define SPACING 3 #define BUTTON_X(n) (LEFT_MARGIN + (n)*(KEY_WIDTH+2*BORDER+SPACING)) #define MENU_BORDER 2 #define KY_WIDTH (ky_width + 8) #define MENU_MIN_WIDTH (LEFT_MARGIN + 3*(KEY_WIDTH+2*BORDER+SPACING) + \ LEFT_MARGIN + KY_WIDTH + 2*BORDER + SPACING + \ 2*MENU_BORDER) /* Menu hierarchy structure. */ struct menu_hier { Widget menu_shell; /* complexMenu widget */ char *name; /* my name (root name is NULL) */ struct menu_hier *parent; /* parent menu */ struct menu_hier *child; /* child menu */ struct menu_hier *sibling; /* sibling menu */ }; /* * Add an entry to a menu hierarchy. * Adds intermediate nodes as need, and returns the menu shell widget to * add the leaf entry to. */ static Widget add_menu_hier(struct menu_hier *root, char **parents, ArgList args, Cardinal num_args) { struct menu_hier *h = root; static int menu_num = 0; /* Search for a parent match, creating levels as needed. */ while (parents && *parents) { struct menu_hier *child, *last_child = NULL; if (h->name != NULL && !strcmp(h->name, *parents)) break; last_child = h->child; for (child = h->child; child != NULL; child = child->sibling) { if (!strcmp(child->name, *parents)) break; last_child = child; } if (child != NULL) h = child; else { struct menu_hier *new_child; char namebuf[64]; char *menu_name; char *m; int i; Arg my_arglist[2]; ArgList merged_args; new_child = (struct menu_hier *)XtCalloc(1, sizeof(struct menu_hier)); new_child->name = *parents; new_child->parent = h; if (last_child != NULL) last_child->sibling = new_child; else h->child = new_child; h = new_child; /* * Create a menu for the children of this new * intermediate node. */ sprintf(namebuf, "csMenu%d", menu_num++); for (i = 0, m = namebuf + strlen(namebuf); (*parents)[i] && ((size_t)(m - namebuf) < sizeof(namebuf)); i++) { if (isalnum((unsigned char)(*parents)[i])) { *m++ = (*parents)[i]; } } *m = '\0'; menu_name = XtNewString(namebuf); h->menu_shell = XtVaCreatePopupShell( menu_name, complexMenuWidgetClass, h->parent->menu_shell, NULL); /* * Add this item to its parent's menu, as a pullright. */ XtSetArg(my_arglist[0], XtNrightBitmap, arrow); XtSetArg(my_arglist[1], XtNmenuName, menu_name); merged_args = XtMergeArgLists(my_arglist, 2, args, num_args); (void) XtCreateManagedWidget( h->name, cmeBSBObjectClass, h->parent->menu_shell, merged_args, 2 + num_args); XtFree((XtPointer)merged_args); } /* Go on to the next level. */ parents++; } /* Add here. */ return h->menu_shell; } static void free_menu_hier(struct menu_hier *root) { if (root->sibling) free_menu_hier(root->sibling); if (root->child) free_menu_hier(root->child); XtFree((char *)root); } /* * Compute the potential height of the menu bar. */ Dimension menubar_qheight(Dimension container_width) { if (!appres.interactive.menubar || (container_width < (unsigned) MENU_MIN_WIDTH)) { return 0; } else { return TOP_MARGIN + KEY_HEIGHT+2*BORDER + BOTTOM_MARGIN + 2*MENU_BORDER; } } /* * Initialize the menu bar. */ void menubar_init(Widget container, Dimension overall_width, Dimension current_width) { static Widget menu_bar; static bool ever = false; bool mb_old; Dimension height; if (!ever) { scheme_init(); charsets_init(); XtRegisterGrabAction(HandleMenu_xaction, True, (ButtonPressMask|ButtonReleaseMask), GrabModeAsync, GrabModeAsync); /* Create bitmaps. */ dot = XCreateBitmapFromData(display, root_window, (char *) dot_bits, dot_width, dot_height); no_dot = XCreateBitmapFromData(display, root_window, (char *) no_dot_bits, no_dot_width, no_dot_height); arrow = XCreateBitmapFromData(display, root_window, (char *) arrow_bits, arrow_width, arrow_height); diamond = XCreateBitmapFromData(display, root_window, (char *) diamond_bits, diamond_width, diamond_height); no_diamond = XCreateBitmapFromData(display, root_window, (char *) no_diamond_bits, no_diamond_width, no_diamond_height); null = XCreateBitmapFromData(display, root_window, (char *) null_bits, null_width, null_height); ever = true; } height = menubar_qheight(current_width); mb_old = menubar_buttons; menubar_buttons = (height != 0); if (menubar_buttons) { if (menu_bar == NULL) { /* Create the menu bar. */ menu_bar = XtVaCreateManagedWidget( "menuBarContainer", huskWidgetClass, container, XtNborderWidth, MENU_BORDER, XtNwidth, overall_width - 2*MENU_BORDER, XtNheight, height - 2*MENU_BORDER, NULL); } else { /* Resize and map the menu bar. */ XtVaSetValues(menu_bar, XtNborderWidth, MENU_BORDER, XtNwidth, overall_width - 2*MENU_BORDER, NULL); XtMapWidget(menu_bar); } menu_parent = menu_bar; } else if (menu_bar != NULL) { /* Hide the menu bar. */ XtUnmapWidget(menu_bar); menu_parent = container; } else menu_parent = container; /* "File..." menu */ file_menu_init(mb_old != menubar_buttons, LEFT_MARGIN, TOP_MARGIN); /* "Options..." menu */ options_menu_init(mb_old != menubar_buttons, BUTTON_X(file_menu != NULL), TOP_MARGIN); /* "Connect..." menu */ if (!appres.interactive.reconnect) connect_menu_init(mb_old != menubar_buttons, BUTTON_X((file_menu != NULL) + (options_menu != NULL)), TOP_MARGIN); /* "Macros..." menu */ macros_menu_init(mb_old != menubar_buttons, BUTTON_X((file_menu != NULL) + (options_menu != NULL)), TOP_MARGIN); /* SSL icon */ ssl_icon_init( (Position) (current_width - LEFT_MARGIN - (ky_width+8) - 4*BORDER - 2*MENU_BORDER - (locked_width+8)), TOP_MARGIN); /* Keypad button */ keypad_button_init( (Position) (current_width - LEFT_MARGIN - (ky_width+8) - 2*BORDER - 2*MENU_BORDER), TOP_MARGIN); } /* * External entry points */ /* * Called when connected to or disconnected from a host. */ static void menubar_connect(bool ignored _is_unused) { /* Set the disconnect button sensitivity. */ if (disconnect_button != NULL) { XtVaSetValues(disconnect_button, XtNsensitive, PCONNECTED, NULL); } /* Set up the exit button, either with a pullright or a callback. */ if (exit_button != NULL) { if (PCONNECTED) { /* Remove the immediate callback. */ if (n_bye) { XtRemoveCallback(exit_button, XtNcallback, Bye, NULL); n_bye--; } /* Set pullright for extra confirmation. */ XtVaSetValues(exit_button, XtNrightBitmap, arrow, XtNmenuName, "exitMenu", NULL); } else { /* Install the immediate callback. */ if (!n_bye) { XtAddCallback(exit_button, XtNcallback, Bye, NULL); n_bye++; } /* Remove the pullright. */ XtVaSetValues(exit_button, XtNrightBitmap, NULL, XtNmenuName, NULL, NULL); } } /* Set up the connect menu. */ if (!appres.interactive.reconnect && connect_menu != NULL) { if (PCONNECTED && connect_button != NULL) { XtUnmapWidget(connect_button); } else { connect_menu_init(true, BUTTON_X((file_menu != NULL) + (options_menu != NULL)), TOP_MARGIN); if (menubar_buttons) { XtMapWidget(connect_button); } } } /* Set up the macros menu. */ macros_menu_init(true, BUTTON_X((file_menu != NULL) + (options_menu != NULL)), TOP_MARGIN); /* Set up the various option buttons. */ if (ft_button != NULL) { XtVaSetValues(ft_button, XtNsensitive, IN_3270, NULL); } if (printer_button != NULL) { XtVaSetValues(printer_button, XtNsensitive, IN_3270, NULL); } if (assoc_button != NULL) { XtVaSetValues(assoc_button, XtNsensitive, !pr3287_session_running() && IN_3270 && IN_TN3270E, NULL); } if (lu_button != NULL) { XtVaSetValues(lu_button, XtNsensitive, !pr3287_session_running() && IN_3270, NULL); } if (linemode_button != NULL) { XtVaSetValues(linemode_button, XtNsensitive, IN_NVT, NULL); } if (charmode_button != NULL) { XtVaSetValues(charmode_button, XtNsensitive, IN_NVT, NULL); } if (toggle_widget[LINE_WRAP].w[0] != NULL) { XtVaSetValues(toggle_widget[LINE_WRAP].w[0], XtNsensitive, IN_NVT, NULL); } if (toggle_widget[RECTANGLE_SELECT].w[0] != NULL) { XtVaSetValues(toggle_widget[RECTANGLE_SELECT].w[0], XtNsensitive, IN_NVT, NULL); } if (models_option != NULL) { XtVaSetValues(models_option, XtNsensitive, !PCONNECTED, NULL); } if (extended_button != NULL) { XtVaSetValues(extended_button, XtNsensitive, !PCONNECTED, NULL); } if (m3278_button != NULL) { XtVaSetValues(m3278_button, XtNsensitive, !PCONNECTED, NULL); } if (m3279_button != NULL) { XtVaSetValues(m3279_button, XtNsensitive, !PCONNECTED, NULL); } if (locked_icon != NULL) { if (CONNECTED) { if (net_secure_connection()) { XtUnmapWidget(unlocked_icon); if (net_secure_unverified()) { XtMapWidget(unverified_icon); } else { XtMapWidget(locked_icon); } } else { XtUnmapWidget(locked_icon); XtUnmapWidget(unverified_icon); XtMapWidget(unlocked_icon); } } else { XtUnmapWidget(locked_icon); XtUnmapWidget(unverified_icon); XtUnmapWidget(unlocked_icon); } } } /* Called when the printer starts or stops. */ static void menubar_printer(bool printer_on) { if (assoc_button != NULL) XtVaSetValues(assoc_button, XtNsensitive, !printer_on && IN_3270 && IN_TN3270E, NULL); if (lu_button != NULL) XtVaSetValues(lu_button, XtNsensitive, !printer_on && IN_3270, NULL); if (printer_off_button != NULL) XtVaSetValues(printer_off_button, XtNsensitive, printer_on, NULL); } void menubar_keypad_changed(void) { if (keypad_option_button != NULL) { XtVaSetValues(keypad_option_button, XtNleftBitmap, xappres.keypad_on || keypad_popped ? dot : None, NULL); } } /* Called when we switch between NVT and 3270 modes. */ static void menubar_in3270(bool in3270) { if (ft_button != NULL) { XtVaSetValues(ft_button, XtNsensitive, IN_3270, NULL); } if (printer_button != NULL) { XtVaSetValues(printer_button, XtNsensitive, IN_3270, NULL); } if (assoc_button != NULL) { XtVaSetValues(assoc_button, XtNsensitive, !pr3287_session_running() && IN_3270 && IN_TN3270E, NULL); } if (lu_button != NULL) { XtVaSetValues(lu_button, XtNsensitive, !pr3287_session_running() && IN_3270, NULL); } if (linemode_button != NULL) { XtVaSetValues(linemode_button, XtNsensitive, !in3270, XtNleftBitmap, in3270? no_diamond: (linemode? diamond: no_diamond), NULL); } if (charmode_button != NULL) { XtVaSetValues(charmode_button, XtNsensitive, !in3270, XtNleftBitmap, in3270? no_diamond: (linemode? no_diamond: diamond), NULL); } if (toggle_widget[LINE_WRAP].w[0] != NULL) { XtVaSetValues(toggle_widget[LINE_WRAP].w[0], XtNsensitive, !in3270, NULL); } if (toggle_widget[RECTANGLE_SELECT].w[0] != NULL) { XtVaSetValues(toggle_widget[RECTANGLE_SELECT].w[0], XtNsensitive, !in3270, NULL); } if (idle_button != NULL) { XtVaSetValues(idle_button, XtNsensitive, in3270, NULL); } } /* Called when we switch between NVT line and character modes. */ static void menubar_linemode(bool in_linemode) { if (linemode_button != NULL) XtVaSetValues(linemode_button, XtNleftBitmap, in_linemode ? diamond : no_diamond, NULL); if (charmode_button != NULL) XtVaSetValues(charmode_button, XtNleftBitmap, in_linemode ? no_diamond : diamond, NULL); } /* Called to change the sensitivity of the "Abort Script" button. */ void menubar_as_set(bool sensitive) { if (script_abort_button != NULL) XtVaSetValues(script_abort_button, XtNsensitive, sensitive, NULL); } /* * "File..." menu */ static Widget save_shell = (Widget) NULL; /* Called from "Exit x3270" button on "File..." menu */ static void Bye(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { x3270_exit(0); } /* Called from the "Disconnect" button on the "File..." menu */ static void disconnect(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { host_disconnect(false); } /* Called from the "Abort Script" button on the "File..." menu */ static void script_abort_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { abort_script(); } /* "About x3270" popups */ static void show_about_copyright(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { popup_about_copyright(); } static void show_about_config(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { popup_about_config(); } static void show_about_status(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { popup_about_status(); } /* Called from the "Save" button on the save options dialog */ static void save_button_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *s; s = XawDialogGetValueString((Widget)client_data); if (!s || !*s) { return; } if (save_options(s)) { XtPopdown(save_shell); } } /* Called from the "Save Options in File" button on the "File..." menu */ static void do_save_options(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (save_shell == NULL) { save_shell = create_form_popup("SaveOptions", save_button_callback, NULL, FORM_NO_WHITE); } XtVaSetValues(XtNameToWidget(save_shell, ObjDialog), XtNvalue, profile_name, NULL); popup_popup(save_shell, XtGrabExclusive); } /* Callback for printer session options. */ static void do_printer(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { if (client_data == NULL) { pr3287_session_start(NULL); } else if (!strcmp(client_data, "lu")) { printer_lu_dialog(); } else { pr3287_session_stop(); } } /* Figure out if a Widget is suppressed. */ static bool item_suppressed(Widget parent, const char *name) { char *suppress; suppress = get_fresource("%s.%s.%s", XtName(parent), name, ResSuppress); #if defined(DEBUG_SUPPRESS) /*[*/ printf("suppress: %s.%s.%s -> %s\n", XtName(parent), name, ResSuppress, suppress? suppress: "(null)"); #endif /*]*/ return suppress != NULL && !strncasecmp(suppress, "True", strlen(suppress)); } /* * Create a dividing line, if *spaced isn't true. */ static void cond_space(Widget menu, bool *spaced) { if (spaced != NULL && !*spaced) { (void) XtVaCreateManagedWidget( "space", cmeLineObjectClass, menu, NULL); *spaced = true; } } /* * Add a menu item to a menu, but only if it is not suppressed. */ static Widget add_menu_itemv(char *name, Widget menu, XtCallbackProc callback, XtPointer arg, bool *spaced, ...) { if (!item_suppressed(menu, name)) { Widget w; static Arg *args = NULL; Cardinal num_args = 0; static Cardinal max_num_args = 0; va_list a; String argname; XtArgVal value; cond_space(menu, spaced); va_start(a, spaced); while ((argname = va_arg(a, String)) != NULL) { value = va_arg(a, XtArgVal); while (num_args >= max_num_args) { max_num_args++; args = (Arg *)Realloc(args, max_num_args * sizeof(Arg)); } XtSetArg(args[num_args], argname, value); num_args++; } va_end(a); w = XtCreateManagedWidget(name, cmeBSBObjectClass, menu, args, num_args); XtAddCallback(w, XtNcallback, callback, arg); return w; } else return NULL; } static void popup_ft(Widget w _is_unused, XtPointer call_parms _is_unused, XtPointer call_data _is_unused) { ft_gui_popup_ft(); } static void file_menu_init(bool regen, Dimension x, Dimension y) { Widget w; bool spaced = false; bool any = false; if (regen && (file_menu != NULL)) { XtDestroyWidget(file_menu); file_menu = NULL; } if (file_menu != NULL) { return; } file_menu = XtVaCreatePopupShell( "fileMenu", complexMenuWidgetClass, menu_parent, menubar_buttons? XtNlabel: NULL, NULL, NULL); if (!menubar_buttons) { (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, file_menu, NULL); } /* About x3270... */ if (!item_suppressed(file_menu, "aboutOption")) { bool any_about = false; w = XtVaCreatePopupShell( "aboutMenu", complexMenuWidgetClass, file_menu, NULL); any_about |= add_menu_itemv("aboutCopyright", w, show_about_copyright, NULL, NULL, NULL) != NULL; any_about |= add_menu_itemv("aboutConfig", w, show_about_config, NULL, NULL, NULL) != NULL; any_about |= add_menu_itemv("aboutStatus", w, show_about_status, NULL, NULL, NULL) != NULL; if (any_about) { (void) XtVaCreateManagedWidget( "aboutOption", cmeBSBObjectClass, file_menu, XtNrightBitmap, arrow, XtNmenuName, "aboutMenu", NULL); any = true; } else { XtDestroyWidget(w); } } /* File Transfer */ if (!appres.secure) { spaced = false; ft_button = add_menu_itemv("ftOption", file_menu, popup_ft, NULL, &spaced, XtNsensitive, IN_3270, NULL); any |= (ft_button != NULL); } /* Printer start/stop */ if (!item_suppressed(file_menu, "printerOption")) { w = XtVaCreatePopupShell( "printerMenu", complexMenuWidgetClass, menu_parent, NULL); assoc_button = add_menu_itemv("assocButton", w, do_printer, NULL, NULL, XtNsensitive, IN_3270 && IN_TN3270E, NULL); lu_button = add_menu_itemv("luButton", w, do_printer, "lu", NULL, NULL); printer_off_button = add_menu_itemv("printerOffButton", w, do_printer, "off", NULL, XtNsensitive, pr3287_session_running(), NULL); if (assoc_button != NULL || lu_button != NULL || printer_off_button != NULL) { (void) XtCreateManagedWidget( "space", cmeLineObjectClass, file_menu, NULL, 0); printer_button = XtVaCreateManagedWidget( "printerOption", cmeBSBObjectClass, file_menu, XtNsensitive, IN_3270, XtNrightBitmap, arrow, XtNmenuName, "printerMenu", NULL); any = true; } else { XtDestroyWidget(w); } } /* Trace Data Stream Trace X Events Save Screen(s) in File */ spaced = false; if (appres.debug_tracing) { any |= toggle_init(file_menu, TRACING, "traceOption", NULL, &spaced); } if (!appres.secure) { w = add_menu_itemv("screenTraceOption", file_menu, screensave_option, NULL, &spaced, NULL); if (w != NULL) { any = true; toggle_widget[SCREEN_TRACE].w[0] = w; XtVaSetValues(w, XtNleftBitmap, toggled(SCREEN_TRACE)? dot: None, NULL); } } /* Print Window Bitmap */ spaced = false; w = add_menu_itemv("printWindowOption", file_menu, print_window_option, NULL, &spaced, NULL); any |= (w != NULL); if (!appres.secure) { /* Save Options */ spaced = false; w = add_menu_itemv("saveOption", file_menu, do_save_options, NULL, &spaced, NULL); any |= (w != NULL); /* Execute an action */ spaced = false; w = add_menu_itemv("executeActionOption", file_menu, execute_action_option, NULL, &spaced, NULL); any |= (w != NULL); } /* Abort script */ spaced = false; script_abort_button = add_menu_itemv("abortScriptOption", file_menu, script_abort_callback, NULL, &spaced, XtNsensitive, sms_active(), NULL); any |= (script_abort_button != NULL); /* Disconnect */ spaced = false; disconnect_button = add_menu_itemv("disconnectOption", file_menu, disconnect, NULL, &spaced, XtNsensitive, PCONNECTED, NULL); any |= (disconnect_button != NULL); /* Exit x3270 */ if (exit_menu != NULL) { XtDestroyWidget(exit_menu); } exit_menu = XtVaCreatePopupShell( "exitMenu", complexMenuWidgetClass, menu_parent, NULL); /* exitReallyOption cannot be disabled */ w = XtVaCreateManagedWidget( "exitReallyOption", cmeBSBObjectClass, exit_menu, NULL); XtAddCallback(w, XtNcallback, Bye, NULL); exit_button = add_menu_itemv("exitOption", file_menu, Bye, NULL, &spaced, NULL); if (exit_button != NULL) { n_bye = 1; any = true; } /* File... */ if (any) { if (menubar_buttons) { w = XtVaCreateManagedWidget( "fileMenuButton", menuButtonWidgetClass, menu_parent, XtNx, x, XtNy, y, XtNwidth, KEY_WIDTH, XtNheight, KEY_HEIGHT, XtNmenuName, "fileMenu", NULL); } } else { XtDestroyWidget(file_menu); file_menu = NULL; } } /* * "Connect..." menu */ static Widget connect_shell = NULL; /* Called from each button on the "Connect..." menu */ static void host_connect_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { (void) host_connect(client_data); } /* Called from the lone "Connect" button on the connect dialog */ static void connect_button_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *s; s = XawDialogGetValueString((Widget)client_data); if (!s || !*s) { return; } if (host_connect(s)) { XtPopdown(connect_shell); } } /* Called from the "Other..." button on the "Connect..." menu */ static void do_connect_popup(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (connect_shell == NULL) connect_shell = create_form_popup("Connect", connect_button_callback, NULL, FORM_NO_CC); popup_popup(connect_shell, XtGrabExclusive); } /* * Initialize the "Connect..." menu */ static void connect_menu_init(bool regen, Position x, Position y) { Widget w; int n_hosts = 0; bool any_hosts = false; struct host *h; bool need_line = false; int n_primary = 0; int n_recent = 0; static struct menu_hier *root = NULL; Widget recent_menu = NULL; if (regen && (connect_menu != NULL)) { XtDestroyWidget(connect_menu); connect_menu = NULL; if (connect_button != NULL) { XtDestroyWidget(connect_button); connect_button = NULL; } free_menu_hier(root); root = NULL; } if (connect_menu != NULL) return; /* Create the menu */ root = (struct menu_hier *)XtCalloc(1, sizeof(struct menu_hier)); root->menu_shell = connect_menu = XtVaCreatePopupShell( "hostMenu", complexMenuWidgetClass, menu_parent, menubar_buttons ? XtNlabel : NULL, NULL, NULL); if (!menubar_buttons) need_line = true; /* Walk the host list from the file to produce the host menu */ for (h = hosts; h; h = h->next) { switch (h->entry_type) { case ALIAS: continue; case PRIMARY: n_primary++; break; case RECENT: n_recent++; if (n_recent == 1 && n_primary) { recent_menu = XtVaCreatePopupShell( "recentMenu", complexMenuWidgetClass, connect_menu, NULL); } break; } if ((need_line && !any_hosts) || (n_primary > 0 && n_recent == 1)) { (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, connect_menu, NULL); } any_hosts = true; w = XtVaCreateManagedWidget( h->name, cmeBSBObjectClass, (h->entry_type == PRIMARY || recent_menu == NULL)? add_menu_hier(root, h->parents, NULL, 0): recent_menu, NULL); XtAddCallback(w, XtNcallback, host_connect_callback, XtNewString(h->name)); n_hosts++; } if (recent_menu) (void) XtVaCreateManagedWidget( "recentOption", cmeBSBObjectClass, connect_menu, XtNrightBitmap, arrow, XtNmenuName, "recentMenu", NULL); if (any_hosts) need_line = true; /* Add an "Other..." button at the bottom */ if (!any_hosts || !xappres.no_other) { if (need_line) (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, connect_menu, NULL); w = XtVaCreateManagedWidget( "otherHostOption", cmeBSBObjectClass, connect_menu, NULL); XtAddCallback(w, XtNcallback, do_connect_popup, NULL); } /* Add the "Connect..." button itself to the menu_parent. */ if (menubar_buttons) { if (n_hosts) { /* Connect button pops up a menu. */ connect_button = XtVaCreateManagedWidget( "connectMenuButton", menuButtonWidgetClass, menu_parent, XtNx, x, XtNy, y, XtNwidth, KEY_WIDTH, XtNheight, KEY_HEIGHT, XtNmenuName, "hostMenu", XtNmappedWhenManaged, !PCONNECTED, NULL); } else { /* Connect button pops up a dialog. */ connect_button = XtVaCreateManagedWidget( "connectMenuButton", commandWidgetClass, menu_parent, XtNx, x, XtNy, y, XtNwidth, KEY_WIDTH, XtNheight, KEY_HEIGHT, XtNmappedWhenManaged, !PCONNECTED, NULL); XtAddCallback(connect_button, XtNcallback, do_connect_popup, NULL); } } } /* * Callback for macros */ static void do_macro(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { macro_command((struct macro_def *)client_data); } /* * Initialize the "Macros..." menu */ static void macros_menu_init(bool regen, Position x, Position y) { static Widget macros_menu; Widget w; struct macro_def *m; bool any = false; static struct menu_hier *root = NULL; if (regen && (macros_menu != NULL)) { XtDestroyWidget(macros_menu); macros_menu = NULL; if (macros_button != NULL) { XtDestroyWidget(macros_button); macros_button = NULL; } } if (regen && root != NULL) { free_menu_hier(root); root = NULL; } if (macros_menu != NULL || !PCONNECTED) return; /* Walk the list */ macros_init(); /* possibly different for each host */ root = (struct menu_hier *)XtCalloc(1, sizeof(struct menu_hier)); for (m = macro_defs; m; m = m->next) { if (!any) { /* Create the menu */ root->menu_shell = macros_menu = XtVaCreatePopupShell( MACROS_MENU, complexMenuWidgetClass, menu_parent, menubar_buttons ? XtNlabel : NULL, NULL, NULL); if (!menubar_buttons) (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, macros_menu, NULL); } w = XtVaCreateManagedWidget( m->name, cmeBSBObjectClass, add_menu_hier(root, m->parents, NULL, 0), NULL); XtAddCallback(w, XtNcallback, do_macro, (XtPointer)m); any = true; } /* Add the "Macros..." button itself to the menu_parent */ if (any && menubar_buttons) macros_button = XtVaCreateManagedWidget( "macrosMenuButton", menuButtonWidgetClass, menu_parent, XtNx, x, XtNy, y, XtNwidth, KEY_WIDTH, XtNheight, KEY_HEIGHT, XtNmenuName, MACROS_MENU, NULL); } /* Called to toggle the keypad */ static void toggle_keypad(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { switch (kp_placement) { case kp_integral: xappres.keypad_on = !xappres.keypad_on; screen_showikeypad(xappres.keypad_on); break; case kp_left: case kp_right: case kp_bottom: case kp_inside_right: keypad_popup_init(); if (keypad_popped) { XtPopdown(keypad_shell); } else { popup_popup(keypad_shell, XtGrabNone); } break; } menubar_keypad_changed(); keypad_changed = true; } static void keypad_button_init(Position x, Position y) { if (!menubar_buttons) return; if (keypad_button == NULL) { Pixmap pixmap; pixmap = XCreateBitmapFromData(display, root_window, (char *) ky_bits, ky_width, ky_height); keypad_button = XtVaCreateManagedWidget( "keypadButton", commandWidgetClass, menu_parent, XtNbitmap, pixmap, XtNx, x, XtNy, y, XtNwidth, ky_width+8, XtNheight, KEY_HEIGHT, XtNsensitive, keypad_sensitive, NULL); XtAddCallback(keypad_button, XtNcallback, toggle_keypad, NULL); } else { XtVaSetValues(keypad_button, XtNx, x, NULL); } } static void ssl_icon_init(Position x, Position y) { if (!menubar_buttons) return; if (locked_icon == NULL) { Pixmap pixmap; pixmap = XCreateBitmapFromData(display, root_window, (char *) locked_bits, locked_width, locked_height); locked_icon = XtVaCreateManagedWidget( "lockedIcon", commandWidgetClass, menu_parent, XtNbitmap, pixmap, XtNx, x, XtNy, y, XtNwidth, locked_width+8, XtNheight, KEY_HEIGHT, XtNmappedWhenManaged, CONNECTED && net_secure_connection() && !net_secure_unverified(), NULL); XtAddCallback(locked_icon, XtNcallback, show_about_status, NULL); unverified_icon = XtVaCreateManagedWidget( "unverifiedIcon", commandWidgetClass, menu_parent, XtNbitmap, pixmap, XtNx, x, XtNy, y, XtNwidth, locked_width+8, XtNheight, KEY_HEIGHT, XtNmappedWhenManaged, CONNECTED && net_secure_connection() && net_secure_unverified(), NULL); XtAddCallback(unverified_icon, XtNcallback, show_about_status, NULL); pixmap = XCreateBitmapFromData(display, root_window, (char *) unlocked_bits, unlocked_width, unlocked_height); unlocked_icon = XtVaCreateManagedWidget( "unlockedIcon", commandWidgetClass, menu_parent, XtNbitmap, pixmap, XtNx, x, XtNy, y, XtNwidth, unlocked_width+8, XtNheight, KEY_HEIGHT, XtNmappedWhenManaged, CONNECTED && !net_secure_connection(), NULL); XtAddCallback(unlocked_icon, XtNcallback, show_about_status, NULL); } else { XtVaSetValues(locked_icon, XtNx, x, NULL); XtVaSetValues(unlocked_icon, XtNx, x, NULL); } } void menubar_resize(Dimension width) { ssl_icon_init( (Position) (width - LEFT_MARGIN - (ky_width+8) - 4*BORDER - 2*MENU_BORDER - (locked_width+8)), TOP_MARGIN); keypad_button_init( (Position) (width - LEFT_MARGIN - (ky_width+8) - 2*BORDER), TOP_MARGIN); } /* * "Options..." menu */ static void toggle_callback(Widget w, XtPointer userdata, XtPointer calldata _is_unused) { toggle_widget_t *wx = (toggle_widget_t *)userdata; toggle_index_t ix = wx - toggle_widget; /* * If this is a two-button radio group, rather than a simple toggle, * there is nothing to do if they are clicking on the current value. * * toggle_widget[ix][0] is the "toggle true" button; toggle_widget[ix][1] * is "toggle false". */ if (wx->w[1] != NULL && w == wx->w[!toggled(ix)]) { return; } do_menu_toggle(ix); } static Widget oversize_shell = NULL; /* Called from the "Change" button on the oversize dialog */ static void oversize_button_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *s; int ovc, ovr; char junk; s = XawDialogGetValueString((Widget)client_data); if (!s || !*s) return; if (sscanf(s, "%dx%d%c", &ovc, &ovr, &junk) == 2) { XtPopdown(oversize_shell); screen_change_model(model_num, ovc, ovr); } else popup_an_error("Illegal size: %s", s); } /* Called from the "Oversize..." button on the "Models..." menu */ static void do_oversize_popup(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (oversize_shell == NULL) oversize_shell = create_form_popup("Oversize", oversize_button_callback, NULL, FORM_NO_WHITE); popup_popup(oversize_shell, XtGrabExclusive); } /* Init a toggle, menu-wise */ static bool toggle_init(Widget menu, int ix, const char *name1, const char *name2, bool *spaced) { toggle_widget_t *wx = &toggle_widget[ix]; if (!item_suppressed(menu, name1) && (name2 == NULL || !item_suppressed(menu, name2))) { if (spaced != NULL) { cond_space(menu, spaced); } wx->w[0] = XtVaCreateManagedWidget( name1, cmeBSBObjectClass, menu, XtNleftBitmap, toggled(ix)? (name2? diamond: dot): (name2? no_diamond: None), NULL); XtAddCallback(wx->w[0], XtNcallback, toggle_callback, (XtPointer)wx); if (name2 != NULL) { wx->w[1] = XtVaCreateManagedWidget( name2, cmeBSBObjectClass, menu, XtNleftBitmap, toggled(ix)? no_diamond: diamond, NULL); XtAddCallback(wx->w[1], XtNcallback, toggle_callback, (XtPointer)wx); } else { wx->w[1] = NULL; } return true; } else { return false; } } static Widget *font_widgets = NULL; static Widget other_font; static Widget font_shell = NULL; static void do_newfont(Widget w _is_unused, XtPointer userdata, XtPointer calldata _is_unused) { screen_newfont((char *)userdata, true, false); } /* Called from the "Select Font" button on the font dialog */ static void font_button_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { char *s; s = XawDialogGetValueString((Widget)client_data); if (!s || !*s) { return; } XtPopdown(font_shell); do_newfont(w, s, NULL); } static void do_otherfont(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { if (font_shell == NULL) { font_shell = create_form_popup("Font", font_button_callback, NULL, FORM_NO_CC); } popup_popup(font_shell, XtGrabExclusive); } /* Initialze the color scheme list. */ static void scheme_init(void) { char *cm; char *label; char *scheme; struct scheme *s; cm = get_resource(ResSchemeList); if (cm == NULL) return; cm = XtNewString(cm); scheme_count = 0; while (split_dresource(&cm, &label, &scheme) == 1) { s = (struct scheme *)XtMalloc(sizeof(struct scheme)); if (!split_hier(label, &s->label, &s->parents)) { XtFree((XtPointer)s); continue; } s->label = label; s->scheme = scheme; s->next = NULL; if (last_scheme != NULL) last_scheme->next = s; else schemes = s; last_scheme = s; scheme_count++; } } static void do_newscheme(Widget w _is_unused, XtPointer userdata, XtPointer calldata _is_unused) { screen_newscheme((char *)userdata); } /* Initialze the character set list. */ static void charsets_init(void) { char *cm; char *label; char *charset; struct charset *s; cm = get_resource(ResCharsetList); if (cm == NULL) return; cm = XtNewString(cm); charset_count = 0; while (split_dresource(&cm, &label, &charset) == 1) { s = (struct charset *)XtMalloc(sizeof(struct charset)); if (!split_hier(label, &s->label, &s->parents)) { XtFree((XtPointer)s); continue; } s->charset = charset; s->next = NULL; if (last_charset != NULL) last_charset->next = s; else charsets = s; last_charset = s; charset_count++; } } static void do_newcharset(Widget w _is_unused, XtPointer userdata, XtPointer calldata _is_unused) { struct charset *s; int i; /* Change the character set. */ screen_newcharset((char *)userdata); /* Update the menu. */ for (i = 0, s = charsets; i < charset_count; i++, s = s->next) XtVaSetValues(charset_widgets[i], XtNleftBitmap, (strcmp(get_charset_name(), s->charset)) ? no_diamond : diamond, NULL); } static Widget keymap_shell = NULL; /* Called from the "Set Keymap" button on the keymap dialog */ static void keymap_button_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *s; s = XawDialogGetValueString((Widget)client_data); if (s != NULL && !*s) s = NULL; XtPopdown(keymap_shell); keymap_init(s, true); } /* Callback from the "Keymap" menu option */ static void do_keymap(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { if (keymap_shell == NULL) keymap_shell = create_form_popup("Keymap", keymap_button_callback, NULL, FORM_NO_WHITE); popup_popup(keymap_shell, XtGrabExclusive); } /* Callback from the "Idle Command" menu option */ static void do_idle_command(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { popup_idle(); } /* Callback from the "Snap" menu option */ static void do_snap(Widget w _is_unused, XtPointer userdata _is_unused, XtPointer calldata _is_unused) { screen_snap_size(); } /* Called to change telnet modes */ static void linemode_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { net_linemode(); } static void charmode_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { net_charmode(); } /* Called to change models */ static void change_model_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { int m; m = atoi(client_data); switch (model_num) { case 2: if (model_2_button != NULL) XtVaSetValues(model_2_button, XtNleftBitmap, no_diamond, NULL); break; case 3: if (model_3_button != NULL) XtVaSetValues(model_3_button, XtNleftBitmap, no_diamond, NULL); break; case 4: if (model_4_button != NULL) XtVaSetValues(model_4_button, XtNleftBitmap, no_diamond, NULL); break; case 5: if (model_5_button != NULL) XtVaSetValues(model_5_button, XtNleftBitmap, no_diamond, NULL); break; } XtVaSetValues(w, XtNleftBitmap, diamond, NULL); screen_change_model(m, 0, 0); } /* Called to when model changes outside our control */ static void menubar_remodel(bool ignored _is_unused) { if (model_2_button != NULL) XtVaSetValues(model_2_button, XtNleftBitmap, (model_num == 2)? diamond: no_diamond, NULL); if (model_2_button != NULL) XtVaSetValues(model_3_button, XtNleftBitmap, (model_num == 3)? diamond: no_diamond, NULL); if (model_2_button != NULL) XtVaSetValues(model_4_button, XtNleftBitmap, (model_num == 4)? diamond: no_diamond, NULL); if (model_2_button != NULL) XtVaSetValues(model_5_button, XtNleftBitmap, (model_num == 5)? diamond: no_diamond, NULL); } /* Compare a font name to the current emulator font name. */ static bool is_efont(const char *font_name) { return !strcmp(NO_BANG(font_name), NO_BANG(efontname)) || !strcmp(NO_BANG(font_name), NO_BANG(full_efontname)); } /* Create, or re-create the font menu. */ static void create_font_menu(bool regen, bool even_if_unknown) { Widget t; struct font_list *f; int ix; int count; static struct menu_hier *root = NULL; if (root != NULL) { XtDestroyWidget(root->menu_shell); free_menu_hier(root); root = NULL; } Free(font_widgets); root = (struct menu_hier *)XtCalloc(1, sizeof(struct menu_hier)); root->menu_shell = t = XtVaCreatePopupShell( "fontsMenu", complexMenuWidgetClass, menu_parent, XtNborderWidth, fm_borderWidth, XtNborderColor, fm_borderColor, XtNbackground, fm_background, NULL); count = font_count; if (font_count) font_widgets = (Widget *)XtCalloc(count, sizeof(Widget)); else font_widgets = NULL; for (f = font_list, ix = 0; f; f = f->next, ix++) { Arg args[3]; XtSetArg(args[0], XtNleftMargin, fm_leftMargin); XtSetArg(args[1], XtNrightMargin, fm_rightMargin); XtSetArg(args[2], XtNbackground, fm_background); font_widgets[ix] = XtVaCreateManagedWidget( f->label, cmeBSBObjectClass, add_menu_hier(root, f->parents, args, 3), XtNleftBitmap, is_efont(f->font)? diamond: no_diamond, XtNleftMargin, fm_leftMargin, XtNrightMargin, fm_rightMargin, XtNbackground, fm_background, NULL); XtAddCallback(font_widgets[ix], XtNcallback, do_newfont, XtNewString(f->font)); } if (!xappres.no_other) { other_font = XtVaCreateManagedWidget( "otherFontOption", cmeBSBObjectClass, t, NULL); XtAddCallback(other_font, XtNcallback, do_otherfont, NULL); } XtVaSetValues(fonts_option, XtNmenuName, "fontsMenu", NULL); } /* Called when the character set changes. */ static void menubar_charset(bool ignored _is_unused) { if (!xappres.suppress_font_menu) { create_font_menu(false, false); } } /* Called to change emulation modes */ static void toggle_extended(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { appres.extended = !appres.extended; if (extended_button != NULL) XtVaSetValues(extended_button, XtNleftBitmap, appres.extended? dot: (Pixmap)NULL, NULL); if (oversize_button != NULL) XtVaSetValues(oversize_button, XtNsensitive, appres.extended, NULL); if (!appres.extended) screen_change_model(model_num, 0, 0); screen_extended(appres.extended); } static void toggle_m3279(Widget w, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { if (w == m3278_button) appres.m3279 = false; else if (w == m3279_button) appres.m3279 = true; else return; XtVaSetValues(m3278_button, XtNleftBitmap, appres.m3279 ? no_diamond : diamond, NULL); XtVaSetValues(m3279_button, XtNleftBitmap, appres.m3279 ? diamond : no_diamond, NULL); #if defined(RESTRICT_3279) /*[*/ if (model_4_button != NULL) XtVaSetValues(model_4_button, XtNsensitive, !appres.m3279, NULL); if (model_5_button != NULL) XtVaSetValues(model_5_button, XtNsensitive, !appres.m3279, NULL); if (model_num == 4 || model_num == 5) screen_change_model(3, 0, 0); #endif /*]*/ if (scheme_button != NULL) XtVaSetValues(scheme_button, XtNsensitive, appres.m3279, NULL); screen_m3279(appres.m3279); } static void options_menu_init(bool regen, Position x, Position y) { Widget t; struct font_list *f; struct scheme *s; int ix; static Widget options_menu_button = NULL; Widget dummy_font_menu, dummy_font_element; static struct menu_hier *scheme_root = NULL; static struct menu_hier *charset_root = NULL; bool spaced = false; bool any = false; Widget w; if (regen && (options_menu != NULL)) { XtDestroyWidget(options_menu); options_menu = NULL; if (options_menu_button != NULL) { XtDestroyWidget(options_menu_button); options_menu_button = NULL; } } if (options_menu != NULL) { if (font_widgets != NULL) { /* Set the current font. */ for (f = font_list, ix = 0; f; f = f->next, ix++) { XtVaSetValues(font_widgets[ix], XtNleftBitmap, is_efont(f->font)? diamond: no_diamond, NULL); } } /* Set the current color scheme. */ s = schemes; for (ix = 0, s = schemes; ix < scheme_count; ix++, s = s->next) { XtVaSetValues(scheme_widgets[ix], XtNleftBitmap, !strcmp(xappres.color_scheme, s->scheme)? diamond: no_diamond, NULL); } return; } /* Create the shell */ options_menu = XtVaCreatePopupShell( "optionsMenu", complexMenuWidgetClass, menu_parent, menubar_buttons ? XtNlabel : NULL, NULL, NULL); if (!menubar_buttons) { (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, options_menu, NULL); } /* Create the "toggles" pullright */ if (!item_suppressed(options_menu, "togglesOption")) { t = XtVaCreatePopupShell( "togglesMenu", complexMenuWidgetClass, menu_parent, NULL); if (!menubar_buttons) { keypad_option_button = add_menu_itemv("keypadOption", t, toggle_keypad, NULL, NULL, XtNleftBitmap, (xappres.keypad_on || keypad_popped)? dot: None, NULL); if (keypad_option_button != NULL) { spaced = false; } else { spaced = true; } } toggle_init(t, MONOCASE, "monocaseOption", NULL, &spaced); toggle_init(t, CURSOR_BLINK, "cursorBlinkOption", NULL, &spaced); toggle_init(t, BLANK_FILL, "blankFillOption", NULL, &spaced); toggle_init(t, SHOW_TIMING, "showTimingOption", NULL, &spaced); toggle_init(t, CURSOR_POS, "cursorPosOption", NULL, &spaced); toggle_init(t, SCROLL_BAR, "scrollBarOption", NULL, &spaced); toggle_init(t, LINE_WRAP, "lineWrapOption", NULL, &spaced); toggle_init(t, MARGINED_PASTE, "marginedPasteOption", NULL, &spaced); toggle_init(t, OVERLAY_PASTE, "overlayPasteOption", NULL, &spaced); toggle_init(t, RECTANGLE_SELECT, "rectangleSelectOption", NULL, &spaced); toggle_init(t, CROSSHAIR, "crosshairOption", NULL, &spaced); toggle_init(t, VISIBLE_CONTROL, "visibleControlOption", NULL, &spaced); spaced = false; toggle_init(t, ALT_CURSOR, "underlineCursorOption", "blockCursorOption", &spaced); spaced = false; linemode_button = add_menu_itemv("lineModeOption", t, linemode_callback, NULL, &spaced, XtNleftBitmap, linemode? diamond: no_diamond, XtNsensitive, IN_NVT, NULL); charmode_button = add_menu_itemv("characterModeOption", t, charmode_callback, NULL, &spaced, XtNleftBitmap, linemode? no_diamond: diamond, XtNsensitive, IN_NVT, NULL); if (!appres.interactive.mono) { spaced = false; m3278_button = add_menu_itemv( "m3278Option", t, toggle_m3279, NULL, &spaced, XtNleftBitmap, appres.m3279? no_diamond: diamond, XtNsensitive, !PCONNECTED, NULL); m3279_button = add_menu_itemv("m3279Option", t, toggle_m3279, NULL, &spaced, XtNleftBitmap, appres.m3279? diamond: no_diamond, XtNsensitive, !PCONNECTED, NULL); } spaced = false; extended_button = add_menu_itemv("extendedDsOption", t, toggle_extended, NULL, &spaced, XtNleftBitmap, appres.extended? dot: (Pixmap)NULL, XtNsensitive, !PCONNECTED, NULL); if (keypad_option_button != NULL || toggle_widget[MONOCASE].w[0] != NULL || toggle_widget[CURSOR_BLINK].w[0] != NULL || toggle_widget[BLANK_FILL].w[0] != NULL || toggle_widget[SHOW_TIMING].w[0] != NULL || toggle_widget[CURSOR_POS].w[0] != NULL || toggle_widget[SCROLL_BAR].w[0] != NULL || toggle_widget[LINE_WRAP].w[0] != NULL || toggle_widget[MARGINED_PASTE].w[0] != NULL || toggle_widget[RECTANGLE_SELECT].w[0] != NULL || toggle_widget[CROSSHAIR].w[0] != NULL || toggle_widget[VISIBLE_CONTROL].w[0] != NULL || toggle_widget[ALT_CURSOR].w[0] != NULL || linemode_button != NULL || charmode_button != NULL || m3278_button != NULL || m3279_button != NULL) { (void) XtVaCreateManagedWidget( "togglesOption", cmeBSBObjectClass, options_menu, XtNrightBitmap, arrow, XtNmenuName, "togglesMenu", NULL); any = true; } else { XtDestroyWidget(t); } } if (!xappres.suppress_font_menu && !item_suppressed(options_menu, "fontsOption")) { /* Create the "fonts" pullright */ /* * Create a dummy menu with the well-known name, so we can get * the values of background, borderWidth, borderColor and * leftMargin from its resources. */ dummy_font_menu = XtVaCreatePopupShell( "fontsMenu", complexMenuWidgetClass, menu_parent, NULL); dummy_font_element = XtVaCreateManagedWidget( "entry", cmeBSBObjectClass, dummy_font_menu, XtNleftBitmap, no_diamond, NULL); XtRealizeWidget(dummy_font_menu); XtVaGetValues(dummy_font_menu, XtNborderWidth, &fm_borderWidth, XtNborderColor, &fm_borderColor, XtNbackground, &fm_background, NULL); XtVaGetValues(dummy_font_element, XtNleftMargin, &fm_leftMargin, XtNrightMargin, &fm_rightMargin, NULL); XtDestroyWidget(dummy_font_menu); (void) XtVaCreateManagedWidget( "space", cmeLineObjectClass, options_menu, NULL); fonts_option = XtVaCreateManagedWidget( "fontsOption", cmeBSBObjectClass, options_menu, XtNrightBitmap, arrow, NULL); create_font_menu(regen, true); any = true; } /* Create the "Snap" option. */ if (!item_suppressed(options_menu, "snapOption")) { spaced = false; snap_button = add_menu_itemv("snapOption", options_menu, do_snap, NULL, &spaced, XtNsensitive, snap_enabled, NULL); any |= (snap_button != NULL); } /* Create the "models" pullright */ if (!item_suppressed(options_menu, "modelsOption")) { t = XtVaCreatePopupShell( "modelsMenu", complexMenuWidgetClass, menu_parent, NULL); model_2_button = add_menu_itemv("model2Option", t, change_model_callback, NewString("2"), NULL, XtNleftBitmap, (model_num == 2)? diamond: no_diamond, NULL); model_3_button = add_menu_itemv("model3Option", t, change_model_callback, NewString("3"), NULL, XtNleftBitmap, (model_num == 3)? diamond: no_diamond, NULL); model_4_button = add_menu_itemv("model4Option", t, change_model_callback, NewString("4"), NULL, XtNleftBitmap, (model_num == 4)? diamond: no_diamond, #if defined(RESTRICT_3279) /*[*/ XtNsensitive, !appres.m3279, #endif /*]*/ NULL); model_5_button = add_menu_itemv("model5Option", t, change_model_callback, NewString("5"), NULL, XtNleftBitmap, (model_num == 5)? diamond: no_diamond, #if defined(RESTRICT_3279) /*[*/ XtNsensitive, !appres.m3279, #endif /*]*/ NULL); oversize_button = add_menu_itemv("oversizeOption", t, do_oversize_popup, NULL, NULL, XtNsensitive, appres.extended, NULL); if (model_2_button != NULL || model_3_button != NULL || model_4_button != NULL || model_5_button != NULL || oversize_button != NULL) { (void) XtVaCreateManagedWidget( "space", cmeLineObjectClass, options_menu, NULL); models_option = XtVaCreateManagedWidget( "modelsOption", cmeBSBObjectClass, options_menu, XtNrightBitmap, arrow, XtNmenuName, "modelsMenu", XtNsensitive, !PCONNECTED, NULL); any = true; } else { XtDestroyWidget(t); } } /* Create the "colors" pullright */ if (scheme_count && !item_suppressed(options_menu, "colorsOption")) { scheme_widgets = (Widget *)XtCalloc(scheme_count, sizeof(Widget)); if (scheme_root != NULL) { free_menu_hier(scheme_root); } scheme_root = (struct menu_hier *)XtCalloc(1, sizeof(struct menu_hier)); scheme_root->menu_shell = XtVaCreatePopupShell( "colorsMenu", complexMenuWidgetClass, menu_parent, NULL); s = schemes; for (ix = 0, s = schemes; ix < scheme_count; ix++, s = s->next) { scheme_widgets[ix] = XtVaCreateManagedWidget( s->label, cmeBSBObjectClass, add_menu_hier(scheme_root, s->parents, NULL, 0), XtNleftBitmap, !strcmp(xappres.color_scheme, s->scheme)? diamond: no_diamond, NULL); XtAddCallback(scheme_widgets[ix], XtNcallback, do_newscheme, s->scheme); } (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, options_menu, NULL); scheme_button = XtVaCreateManagedWidget( "colorsOption", cmeBSBObjectClass, options_menu, XtNrightBitmap, arrow, XtNmenuName, "colorsMenu", XtNsensitive, appres.m3279, NULL); any = true; } /* Create the "character set" pullright */ if (charset_count && !item_suppressed(options_menu, "charsetOption")) { struct charset *cs; if (charset_root != NULL) { free_menu_hier(charset_root); } charset_root = (struct menu_hier *)XtCalloc(1, sizeof(struct menu_hier)); charset_root->menu_shell = XtVaCreatePopupShell( "charsetMenu", complexMenuWidgetClass, menu_parent, NULL); charset_widgets = (Widget *)XtCalloc(charset_count, sizeof(Widget)); for (ix = 0, cs = charsets; ix < charset_count; ix++, cs = cs->next) { t = add_menu_hier(charset_root, cs->parents, NULL, 0); charset_widgets[ix] = XtVaCreateManagedWidget( cs->label, cmeBSBObjectClass, t, XtNleftBitmap, (strcmp(get_charset_name(), cs->charset))? no_diamond: diamond, NULL); XtAddCallback(charset_widgets[ix], XtNcallback, do_newcharset, cs->charset); } (void) XtVaCreateManagedWidget("space", cmeLineObjectClass, options_menu, NULL); (void) XtVaCreateManagedWidget( "charsetOption", cmeBSBObjectClass, options_menu, XtNrightBitmap, arrow, XtNmenuName, "charsetMenu", NULL); any = true; } /* Create the "keymap" option */ if (!xappres.no_other) { spaced = false; w = add_menu_itemv("keymapOption", options_menu, do_keymap, NULL, &spaced, NULL); any |= (w != NULL); } /* Create the "display keymap" option */ spaced = false; w = add_menu_itemv("keymapDisplayOption", options_menu, do_keymap_display, NULL, &spaced, NULL); any |= (w != NULL); /* Create the "Idle Command" option */ if (!appres.secure) { spaced = false; idle_button = add_menu_itemv("idleCommandOption", options_menu, do_idle_command, NULL, &spaced, XtNsensitive, IN_3270, NULL); any |= (idle_button != NULL); } if (any) { if (menubar_buttons) { options_menu_button = XtVaCreateManagedWidget( "optionsMenuButton", menuButtonWidgetClass, menu_parent, XtNx, x, XtNy, y, XtNwidth, KEY_WIDTH, XtNheight, KEY_HEIGHT, XtNmenuName, "optionsMenu", NULL); keypad_option_button = NULL; } } else { XtDestroyWidget(options_menu); options_menu = NULL; } } /* * Change a menu checkmark */ void menubar_retoggle(toggle_index_t ix) { if (toggle_widget[ix].w[0] != NULL) { XtVaSetValues(toggle_widget[ix].w[0], XtNleftBitmap, toggled(ix)? (toggle_widget[ix].w[1]? diamond: dot): None, NULL); } if (toggle_widget[ix].w[1] != NULL) { XtVaSetValues(toggle_widget[ix].w[1], XtNleftBitmap, toggled(ix)? no_diamond: diamond, NULL); } } /** * Enable or disable the Snap option. */ void menubar_snap_enable(bool enable) { snap_enabled = enable; if (snap_button != NULL) { XtVaSetValues(snap_button, XtNsensitive, enable, NULL); } } /** * Enable or disable the keypad button. * * @param[in] sensitive true if enabled */ void menubar_keypad_sensitive(bool sensitive) { keypad_sensitive = sensitive; if (keypad_button) { XtVaSetValues(keypad_button, XtNsensitive, sensitive, NULL); } } void HandleMenu_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { String p; xaction_debug(HandleMenu_xaction, event, params, num_params); if (xcheck_usage(HandleMenu_xaction, *num_params, 1, 2) < 0) { return; } if (!CONNECTED || *num_params == 1) { p = params[0]; } else { p = params[1]; } if (!XtNameToWidget(menu_parent, p)) { #if 0 if (strcmp(p, MACROS_MENU)) { popup_an_error("%s: cannot find menu %s", action_name(HandleMenu_xaction), p); } #endif return; } XtCallActionProc(menu_parent, "XawPositionComplexMenu", event, &p, 1); XtCallActionProc(menu_parent, "MenuPopup", event, &p, 1); } static void screensave_option(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { stmenu_popup(STMP_AS_IS); } /** * Menu module registration. */ void menubar_register(void) { /* Register interest in state transtions. */ register_schange(ST_3270_MODE, menubar_in3270); register_schange(ST_LINE_MODE, menubar_linemode); register_schange(ST_HALF_CONNECT, menubar_connect); register_schange(ST_CONNECT, menubar_connect); register_schange(ST_PRINTER, menubar_printer); register_schange(ST_REMODEL, menubar_remodel); register_schange(ST_CHARSET, menubar_charset); } suite3270-3.6/x3270/menus.inc0000664000076500007650000001737613221577164013620 0ustar pdmpdmXX_SH(Menus) XX_FB(x3270) has a menu bar with three pull-down menus (File, Options, and Connect) and a button to turn the keypad on and off. The pull-down menus are also available as pop-up menus by using the "Ctrl" key and the left, middle and right mouse buttons, respectively. XX_PP The menu bar can be turned off by setting the "x3270.menuBar" resource to XX_FB(false.) XX_PP Many sections of the File and Options menus are toggles, options that may be either on or off. The entries under the File menu are as follows: XX_TPS()dnl XX_TP(XX_FB(File Transfer)) Initiates transferring a file between the IBM host and the local workstation, using the XX_FB(IND$FILE) protocol. A pop-up menu allows specifying the file names and other attributes of the transfer. XX_BR() The IND$FILE program must be installed on the IBM host, and the 3270 cursor must be located in a field that will accept a TSO or VM/CMS command. XX_TP(XX_FB(Printer Session)) Starts or stops a printer session. XX_TP(XX_FB(Trace Data and Events)) If set, network traffic (both a hexadecimal representation and its interpretation) is logged to the file XX_FB(/tmp/x3trc.)`'XX_FI(pid), and a window is popped up to monitor the data. The file name is confirmed with a pop-up; the default directory name for the trace file can be changed with the "x3270.traceDir" resource. Keyboard and mouse events are also traced. This is useful for creating and debugging custom keymaps, macros and scripts. For example, it will tell you precisely what action was taken in response to pressing a particular key. If the key is not mapped, it will tell you the keysym name and keycode so you can add it to a custom keymap. XX_TP(XX_FB(Save Screen Contents)) Allows the contents of the screen to be saved. A dialog allows selection between continuous saving (a new image added each time the screen changes) or just a snapshot. It also allows switching beteen saving to a file and writing directly to the printer. If the screens are saved to a file, the dialog allows a choice between text, HTML or RichText output. By default, the file name is XX_FB(/tmp/x3scr.)`'XX_FI(pid)XX_FB(.)`'XX_FI(type) in /tmp. The default directory name can be changed with the "x3270.traceDir" resource. The dialog also allows the default print command (XX_FB(lpr)) to be changed. XX_TP(XX_FB(Print Window Bitmap)) Uses the XX_FB(xwd) and XX_FB(xpr) commands to print a copy of the graphical screen contents. XX_TP(XX_FB(Save Changed Options in File)) Saves into a file the values of all options that have been changed since XX_FB(x3270) was started. A pop-up allows the file name to be changed; the default file is XX_FB(.x3270pro) in the XX_POSESSIVE(user) home directory. If the file already exists, it is appended to. XX_FB(x3270) will read the contents of this file the next time it starts up. The options settings in the file override any resources defined with XX_FB(xrdb) or in the XX_POSESSIVE(user) XX_FB(.Xdefaults) file; command-line switches override the file. A different options file can be specified by the XX_FB(X3270PRO) environment variable. If the environment variable XX_FB(NOX3270PRO) is set, no options file will be read. XX_TP(XX_FB(Execute an Action)) Allows an action name and parameters to be entered from the keyboard. This allows experimentation with actions without having to edit keymaps and repeatedly restart XX_FB(x3270). XX_TP(XX_FB(Toggles)) The toggles under the Options menu are as follows: XX_TPS()dnl XX_TP(XX_FB(Monocase)) If set, XX_FB(x3270) operates in uppercase-only mode. XX_TP(XX_FB(Blinking Cursor)) If set, the cursor blinks once per second. XX_TP(XX_FB(Blank Fill)) If set, XX_FB(x3270) behaves in some un-3270-like ways. First, when a character is typed into a field, all nulls in the field to the left of that character are changed to blanks. This eliminates a common 3270 data-entry surprise. Second, in insert mode, trailing blanks in a field are treated like nulls, eliminating the annoying XX_DQUOTED(lock-up) that often occurs when inserting into an field with (apparent) space at the end. XX_TP(XX_FB(Show Timing)) If set, the time taken by the host to process an XX_SM(AID) is displayed on the status line. XX_TP(XX_FB(Track Cursor)) If set, the cursor position is displayed on the status line. XX_TP(XX_FB(Scrollbar)) If set, the scrollbar appears. XX_TP(XX_FB(Wraparound)) If set, the XX_SM(NVT) terminal emulator automatically assumes a XX_SM(NEWLINE) character when it reaches the end of a line. XX_TP(XX_FB(Paste with Left Margin)) If set, puts restrictions on how pasted text is placed on the screen. The position of the cursor at the time the `paste' operation is begun is used as a left margin. No pasted text will fill any area of the screen to the left of that position. This option is useful for pasting into certain XX_SM(IBM) editors that use the left side of the screen for control information. XX_TP(XX_FB(Overlay Paste)) If set, pasting over a protected field will simply increment the cursor position instead of locking the keyboard. This allows forms to be copied and pasted with the protected fields included. Setting this toggle also implicitly sets the XX_FB(Paste with Left Margin) toggle. XX_TP(XX_FB(Select by Rectangles)) If set, XX_FB(x3270) will always select rectangular areas of the screen. Otherwise, XX_FB(x3270) selects by rectangles when in 3270 mode, but in XX_SM(NVT) mode it selects continuous regions of the screen like XX_FI(xterm)(1). XX_TP(XX_FB(Crosshair Cursor)) If set, XX_FB(x3270) will display a crosshair over the cursor: lines extending the full width and height of the screen, centered over the cursor position. This makes locating the cursor on the screen much easier. XX_TP(XX_FB(Visible Control Chars)) If set, XX_FB(x3270) will display control characters as special underscored symbols instead of blanks. Field attribute characters are displayed in underscored yellow. Other control characters are displayed according to their field colors and attributes. XX_LP XX_TS(2,c l.) XX_TR(XX_TD(Symbol) XX_TD(Meaning)) XX_TR(XX_TD(Period) XX_TD(NUL (X'00'))) XX_TR(XX_TD(<) XX_TD(SO (Start of DBCS subfield))) XX_TR(XX_TD(>) XX_TD(SI (End of DBCS subfield))) XX_TR(XX_TD(0-9 A-V) XX_TD(Field attribute)) XX_TE() The mappings for field attribute characters are included in the XX_FB(x3270) Resource documentation for the XX_FB(visibleControl) resource. XX_TPE()dnl XX_TPE()dnl XX_LP The names of the toggles for use with the XX_FB(XX_DASHED(set)) and XX_FB(XX_DASHED(clear)) options are as follows: XX_LP XX_TS(2,center; l l .) XX_TR(XX_TD(Menu Option) XX_TD(Name)) XX_T_() XX_TR(XX_TD(Monocase) XX_TD(monoCase)) XX_TR(XX_TD(Blinking Cursor) XX_TD(cursorBlink)) XX_TR(XX_TD(Blank Fill) XX_TD(blankFill)) XX_TR(XX_TD(Show Timing) XX_TD(showTiming)) XX_TR(XX_TD(Track Cursor) XX_TD(cursorPos)) XX_TR(XX_TD(Trace Data and Events) XX_TD(trace)) XX_TR(XX_TD(Save Screen(s) in File) XX_TD(screenTrace)) XX_TR(XX_TD(Scrollbar) XX_TD(scrollBar)) XX_TR(XX_TD(Wraparound) XX_TD(lineWrap)) XX_TR(XX_TD(Paste with Left Margin) XX_TD(marginedPaste)) XX_TR(XX_TD(Select by Rectangles) XX_TD(rectangleSelect)) XX_TR(XX_TD(Crosshair Cursor) XX_TD(crosshair)) XX_TR(XX_TD(Visible Control Chars) XX_TD(visibleControl)) XX_TE() XX_LP In addition, the toggle XX_FB(altCursor) can be used to select the cursor type. If set, an underline cursor will be used. If clear, the normal block cursor will be used. The toggle XX_FB(aidWait) can also be used to change how actions that send an AID to the host behave: when clear, they no longer block until the host unlocks the keyboard. XX_LP These names also represent resources that can be set in your .Xdefaults or .x3270pro file. For example, if you always want to have the scrollbar off, you can add the following to your .Xdefaults or .x3270pro: XX_BR XX_RS(XX_PRODUCT.scrollBar: false) XX_BR XX_LP These names are also used as the first parameter to the XX_FB(Toggle) action. suite3270-3.6/x3270/mkstand.bash0000775000076500007650000000100313221577163014254 0ustar pdmpdm#!/usr/bin/env bash # Make a standalone webpage from an xxx-body webpage. # mkstand 'title' infile outfile if [ $# -ne 3 ] then echo >&2 "usage: $0 'title' infile outfile" exit 1 fi . ./version.txt tf=/tmp/mkstand$$ rm -f $tf trap "rm -f $tf" exit trap "exit" INT QUIT HUP TERM (cat < $1 EOF sed "s/CYEAR/$cyear/g" $2 cat < EOF ) >$tf mv $tf $3 suite3270-3.6/x3270/mkversion.sh0000775000076500007650000000466413221577163014345 0ustar pdmpdm#!/usr/bin/env sh # Copyright (c) 1995-2009, 2014-2015 Paul Mattes. # Copyright (c) 2005, Don Russell. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the names of Paul Mattes, Don Russell nor their contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY PAUL MATTES AND DON RUSSELL "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES OR DON RUSSELL # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # Create version.c from version.txt # mkversion [program [path-to-version.txt]] #set -x # Ensure that 'date' emits 7-bit U.S. ASCII. LANG=C LC_ALL=C export LANG LC_ALL set -e . ${2-./version.txt} builddate=`date` sccsdate=`date +%Y/%m/%d` user=${LOGNAME-$USER} # Create an all numeric timestamp for rpqnames. # rpq.c will return this string of numbers in bcd format # It is OK to change the length (+ or -), but use # decimal (0-9) digits only. Length must be even number of digits. rpq_timestamp=`date +%Y%m%d%H%M%S` app=${1-x3270} cat < #include "appres.h" #include "nvt_gui.h" #include "screen.h" #include "xscreen.h" /** * X11 version of the xterm text escape * * @param[in] opcode Operation to perform * @param[in] text Associated text */ void xterm_text_gui(int code, const char *text) { switch (code) { case 0: /* icon name and window title */ XtVaSetValues(toplevel, XtNiconName, text, NULL); XtVaSetValues(toplevel, XtNtitle, text, NULL); break; case 1: /* icon name */ XtVaSetValues(toplevel, XtNiconName, text, NULL); break; case 2: /* window_title */ XtVaSetValues(toplevel, XtNtitle, text, NULL); break; case 50: /* font */ screen_newfont(text, False, False); break; default: break; } } suite3270-3.6/x3270/objects.h0000664000076500007650000000346313221577164013570 0ustar pdmpdm/* * Copyright (c) 1995-2009, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * objects.h * x3270 object names. */ #define ObjConfirmButton "confirmButton" #define ObjConfirm2Button "confirm2Button" #define ObjCancelButton "cancelButton" #define ObjDialog "dialog" #define ObjSmallLabel "smallLabel" #define ObjNameLabel "nameLabel" #define ObjDataLabel "dataLabel" suite3270-3.6/x3270/popups.c0000664000076500007650000007726413221577164013472 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * popups.c * This module handles pop-up dialogs: errors, host names, * font names, information. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include #include #include "objects.h" #include "appres.h" #include "actions.h" #include "host.h" #include "macros.h" #include "popups.h" /* must come before child_popups.h */ #include "child_popups.h" #include "screen.h" #include "trace.h" #include "utils.h" #include "xio.h" #include "xmenubar.h" #include "xpopups.h" #include "xscreen.h" typedef enum { WMT_ROOT, /* No windows added by wmgr */ WMT_SIMPLE, /* One window added by wmgr */ WMT_TRANS, /* Two windows added by wmgr */ WMT_UNKNOWN /* Three or more window added -- mystery */ } wm_type_t; static enum form_type forms[] = { FORM_NO_WHITE, FORM_NO_CC, FORM_AS_IS }; static Dimension wm_width, wm_height; /* * General popup support */ /* Find the parent of a window */ static Window parent_of(Window w) { Window root, parent, *wchildren; unsigned int nchildren; XQueryTree(display, w, &root, &parent, &wchildren, &nchildren); XFree((char *)wchildren); return parent; } static Window root_of(Window w) { Window root, parent, *wchildren; unsigned int nchildren; XQueryTree(display, w, &root, &parent, &wchildren, &nchildren); XFree((char *)wchildren); return root; } /* * Find the base window (the one with the wmgr decorations) and the virtual * root, so we can pop up a window relative to them. */ void toplevel_geometry(Position *x, Position *y, Dimension *width, Dimension *height) { Window tlw = XtWindow(toplevel); Window win; Window parent; int nw; struct { Window w; XWindowAttributes wa; } ancestor[10]; XWindowAttributes wa, *base_wa, *root_wa; /* * Trace the family tree of toplevel. */ for (win = tlw, nw = 0; ; win = parent) { parent = parent_of(win); ancestor[nw].w = parent; XGetWindowAttributes(display, parent, &ancestor[nw].wa); ++nw; if (parent == root_window) { break; } } /* * Figure out if they're running a virtual desktop, by seeing if * the 1st child of root is bigger than it is. If so, pretend that * the virtual desktop is the root. */ if (nw > 1 && (ancestor[nw-2].wa.width > ancestor[nw-1].wa.width || ancestor[nw-2].wa.height > ancestor[nw-1].wa.height)) { --nw; } root_wa = &ancestor[nw-1].wa; /* * Now identify the base window as the window below the root * window. */ if (nw >= 2) { base_wa = &ancestor[nw-2].wa; } else { XGetWindowAttributes(display, tlw, &wa); base_wa = &wa; } *x = base_wa->x + root_wa->x; *y = base_wa->y + root_wa->y; *width = base_wa->width + 2*base_wa->border_width; *height = base_wa->height + 2*base_wa->border_width; } /* Figure out the window manager type. */ wm_type_t get_wm_type(Window w) { Window root = root_of(w); if (parent_of(w) == root) { return WMT_ROOT; } if (parent_of(parent_of(w)) == root) { return WMT_SIMPLE; } if (parent_of(parent_of(parent_of(w))) == root) { return WMT_TRANS; } #if defined(POPUP_DEBUG) /*[*/ printf("Unknown window manager type -- three or more windows added\n"); #endif /*]*/ return WMT_UNKNOWN; } /* Pop up a popup shell */ void popup_popup(Widget shell, XtGrabKind grab) { XtPopup(shell, grab); XSetWMProtocols(display, XtWindow(shell), &a_delete_me, 1); } static enum placement CenterD = Center; enum placement *CenterP = &CenterD; static enum placement BottomD = Bottom; enum placement *BottomP = &BottomD; static enum placement LeftD = Left; enum placement *LeftP = &LeftD; static enum placement RightD = Right; enum placement *RightP = &RightD; static enum placement InsideRightD = InsideRight; enum placement *InsideRightP = &InsideRightD; typedef struct { Widget w; Position x, y; enum placement p; } want_t; static void popup_move_again(XtPointer closure, XtIntervalId *id _is_unused) { want_t *wx = (want_t *)closure; Position x, y; XtVaGetValues(wx->w, XtNx, &x, XtNy, &y, NULL); #if defined(POPUP_DEBUG) /*[*/ printf("popup_move_again: want x=%d got x=%d, want y=%d, got y=%d\n", wx->x, x, wx->y, y); #endif /*]*/ if (x != wx->x || y != wx->y) { Position tl_x, tl_y; Dimension tl_width, tl_height; Dimension popup_width; /* * The position has been shifted down and to the right by * the Window Manager. The amound of the shift is the width * of the Window Manager decorations. We can use these to * figure out the correct location of the pop-up. */ wm_width = x - wx->x; wm_height = y - wx->y; #if defined(POPUP_DEBUG) /*[*/ printf("popup_move_again: wm width=%u height=%u\n", wm_width, wm_height); #endif /*]*/ XtVaGetValues(toplevel, XtNx, &tl_x, XtNy, &tl_y, XtNwidth, &tl_width, XtNheight, &tl_height, NULL); switch (wx->p) { case Bottom: x = tl_x - wm_width; y = tl_y + tl_height + wm_width; break; case Left: XtVaGetValues(wx->w, XtNwidth, &popup_width, NULL); x = tl_x - (3 * wm_width) - popup_width; y = tl_y - wm_height; break; case Right: x = tl_x + wm_width + tl_width; y = tl_y - wm_height; break; case InsideRight: XtVaGetValues(wx->w, XtNwidth, &popup_width, NULL); x = tl_x - (2 * wm_width) + tl_width - popup_width; y = tl_y + menubar_qheight(tl_width); break; default: return; } #if defined(POPUP_DEBUG) /*[*/ printf("popup_move_again: re-setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(wx->w, XtNx, x, XtNy, y, NULL); } XtFree((XtPointer)wx); } /* Place a newly popped-up shell */ void place_popup(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { wm_type_t wm_type; Dimension width, height; Position x = 0, y = 0; Position xnew, ynew; Dimension win_width, win_height; Dimension popup_width, popup_height; enum placement p = *(enum placement *)client_data; XWindowAttributes twa, pwa; want_t *wx = NULL; /* Get and fix the popup's dimensions */ XtRealizeWidget(w); XtVaGetValues(w, XtNwidth, &width, XtNheight, &height, NULL); XtVaSetValues(w, XtNheight, height, XtNwidth, width, XtNbaseHeight, height, XtNbaseWidth, width, XtNminHeight, height, XtNminWidth, width, XtNmaxHeight, height, XtNmaxWidth, width, NULL); XtVaGetValues(toplevel, XtNx, &x, XtNy, &y, XtNwidth, &win_width, XtNheight, &win_height, NULL); if (x < 0 || y < 0) { return; } wm_type = get_wm_type(XtWindow(w)); #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: toplevel x=%d y=%d width=%u height=%u\n", x, y, win_width, win_height); #endif /*]*/ switch (wm_type) { case WMT_ROOT: #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: parent is root\n"); #endif /*]*/ break; default: case WMT_SIMPLE: XGetWindowAttributes(display, parent_of(XtWindow(toplevel)), &twa); break; case WMT_TRANS: XGetWindowAttributes(display, parent_of(XtWindow(toplevel)), &pwa); break; } switch (p) { case Center: XtVaGetValues(w, XtNwidth, &popup_width, XtNheight, &popup_height, NULL); #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: Center: popup width=%u height=%u\n", popup_width, popup_height); #endif /*]*/ xnew = x + (win_width-popup_width) / (unsigned) 2; if (xnew < 0) { xnew = 0; } ynew = y + (win_height-popup_height) / (unsigned) 2; if (ynew < 0) { ynew = 0; } #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: Center: setting x=%d y=%d\n", xnew, ynew); #endif /*]*/ XtVaSetValues(w, XtNx, xnew, XtNy, ynew, NULL); break; case Bottom: switch (wm_type) { case WMT_ROOT: XtVaSetValues(w, XtNx, x, XtNy, y, NULL); /* Measure what the window manager does. */ wx = (want_t *)XtMalloc(sizeof(want_t)); wx->w = w; wx->x = x; wx->y = y; wx->p = p; XtAppAddTimeOut(appcontext, 250, popup_move_again, (XtPointer)wx); break; default: case WMT_SIMPLE: /* Do it precisely. */ x = twa.x; y = twa.y + twa.height; #if defined(POPUP_DEBUG) /*[*/ printf("setting x %d y %d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; } break; case Left: switch (wm_type) { case WMT_ROOT: XtVaSetValues(w, XtNx, x, XtNy, y, NULL); wx = (want_t *)XtMalloc(sizeof(want_t)); wx->w = w; wx->x = x; wx->y = y; wx->p = p; XtAppAddTimeOut(appcontext, 250, popup_move_again, (XtPointer)wx); break; default: case WMT_SIMPLE: XtVaGetValues(w, XtNwidth, &popup_width, NULL); x = twa.x - popup_width - (twa.width - main_width); y = twa.y; #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; case WMT_TRANS: XtVaGetValues(w, XtNwidth, &popup_width, NULL); x = x - popup_width - (2 * pwa.x); y = y - pwa.y; #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; } break; case Right: switch (wm_type) { case WMT_ROOT: XtVaSetValues(w, XtNx, x, XtNy, y, NULL); wx = (want_t *)XtMalloc(sizeof(want_t)); wx->w = w; wx->x = x; wx->y = y; wx->p = p; XtAppAddTimeOut(appcontext, 250, popup_move_again, (XtPointer)wx); break; default: case WMT_SIMPLE: x = twa.x + twa.width; y = twa.y; #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; case WMT_TRANS: x = x + win_width + (2 * pwa.x); y = y - pwa.y; #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; } break; case InsideRight: switch (wm_type) { case WMT_ROOT: XtVaSetValues(w, XtNx, x, XtNy, y, NULL); wx = (want_t *)XtMalloc(sizeof(want_t)); wx->w = w; wx->x = x; wx->y = y; wx->p = p; XtAppAddTimeOut(appcontext, 250, popup_move_again, (XtPointer)wx); break; default: case WMT_SIMPLE: XtVaGetValues(w, XtNwidth, &popup_width, NULL); x = twa.x + win_width - popup_width; y = twa.y + menubar_qheight(win_width) + (y - twa.y); #if defined(POPUP_DEBUG) /*[*/ printf("place_popup: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); } break; } } #if defined(POPUP_DEBUG) /*[*/ static void dump_windows(char *what, Widget w) { Position x = 0, y = 0; Dimension win_width, win_height; XtVaGetValues(w, XtNx, &x, XtNy, &y, XtNwidth, &win_width, XtNheight, &win_height, NULL); printf("%s [abs] x=%d y=%d width=%u height=%u\n", what, x, y, win_width, win_height); { Window win = XtWindow(w); int i = 0; while (win != root_of(XtWindow(w))) { XWindowAttributes wx; XGetWindowAttributes(display, win, &wx); printf("%s [rel] #%d x=%d y=%d width=%u height=%u\n", what, i, wx.x, wx.y, wx.width, wx.height); win = parent_of(win); i++; } } } #endif /*]*/ /* * Most window managers put one window behind each window they control: * An inserted window is the size of the app window plus the decorations. Its * coordinates are absolute (it is on the root window). * The app window is offset by the dimensions of the decorations. * * Unity puts two windows behind each window it controls: * A transparent resize window is the size of the app window, plus the * decorations, plus (if the window is resizable) a 10-pixel resize area. Its * coordinates are absolute (it is on the root window). * A second window is offset by the size of the decorations and optional * resize area. It is the same size as the app window. * The app window has no offset. (This is a signature of Unity, as is * $XDG_CURRENT_DESKTOP == Unity.) * * On non-Unity, the correct y coordinate for a Right-side pop-up window is * the absolute y coordinate of the toplevel window. On Unity, the toplevel * window is resizable, while the pop-up is not, so the window manager shifts * them over different amounts. So the correct y coordinate for a Right-side * pop-up window is the absolute y coordinate of the toplevel window, plus the * 10-pixel resize thickness, which can be inferred from the x offset of the * parent of the toplevel window. */ /* Move an existing popped-up shell */ void move_popup(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { wm_type_t wm_type = get_wm_type(XtWindow(w)); Position x = 0, y = 0; Position xnew, ynew; Dimension win_width, win_height; Dimension popup_width, popup_height; enum placement p = *(enum placement *)client_data; XWindowAttributes twa; /* toplevel parent window attributes */ XWindowAttributes pwa; /* popup parent */ #if defined(POPUP_DEBUG) /*[*/ printf("\n"); dump_windows("popup", w); dump_windows("toplevel", toplevel); #endif /*]*/ XtVaGetValues(toplevel, XtNx, &x, XtNy, &y, XtNwidth, &win_width, XtNheight, &win_height, NULL); switch (wm_type) { case WMT_ROOT: /* Fake the parent window attributes. */ #if defined(POPUP_DEBUG) /*[*/ printf("move_popup: parent is root\n"); #endif /*]*/ twa.x = x - wm_width; twa.y = y - wm_height; twa.width = win_width + (2 * wm_width); twa.height = win_height + wm_height + wm_width; break; default: case WMT_SIMPLE: XGetWindowAttributes(display, parent_of(XtWindow(toplevel)), &twa); break; case WMT_TRANS: XGetWindowAttributes(display, parent_of(XtWindow(w)), &pwa); break; } switch (p) { case Center: XtVaGetValues(w, XtNwidth, &popup_width, XtNheight, &popup_height, NULL); xnew = x + (win_width-popup_width) / (unsigned) 2; if (xnew < 0) { xnew = 0; } ynew = y + (win_height-popup_height) / (unsigned) 2; if (ynew < 0) { ynew = 0; } #if defined(POPUP_DEBUG) /*[*/ printf("move_popup: Center: setting x=%d y=%d\n", xnew, ynew); #endif /*]*/ XtVaSetValues(w, XtNx, xnew, XtNy, ynew, NULL); break; case Bottom: if (wm_type == WMT_TRANS) { /* x is unchanged */ y = y + win_height; } else { x = twa.x; y = twa.y + twa.height; } #if defined(POPUP_DEBUG) /*[*/ printf("move_popup: Bottom: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; case Left: XtVaGetValues(w, XtNwidth, &popup_width, NULL); if (wm_type == WMT_TRANS) { x = x - popup_width - (2 * pwa.x); y = y - pwa.y; } else { x = twa.x - popup_width - (twa.width - main_width); y = twa.y; } #if defined(POPUP_DEBUG) /*[*/ printf("move_popup: Left: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; case Right: if (wm_type == WMT_TRANS) { x = x + win_width + (2 * pwa.x); y = y - pwa.y; } else { x = twa.x + twa.width; y = twa.y; } #if defined(POPUP_DEBUG) /*[*/ printf("move_popup: Right: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; case InsideRight: XtVaGetValues(w, XtNwidth, &popup_width, NULL); if (wm_type == WMT_TRANS) { x = x + win_width - popup_width; y = y - pwa.y + menubar_qheight(win_width) + (pwa.y); } else { x = twa.x + win_width - popup_width; y = twa.y + menubar_qheight(win_width) + (y - twa.y); } #if defined(POPUP_DEBUG) /*[*/ printf("move_popup: InsideRight: setting x=%d y=%d\n", x, y); #endif /*]*/ XtVaSetValues(w, XtNx, x, XtNy, y, NULL); break; } } /* Action called when "Return" is pressed in data entry popup */ void PA_confirm_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { Widget w2; /* Find the Confirm or Okay button */ w2 = XtNameToWidget(XtParent(w), ObjConfirmButton); if (w2 == NULL) { w2 = XtNameToWidget(XtParent(w), ObjConfirmButton); } if (w2 == NULL) { w2 = XtNameToWidget(w, ObjConfirmButton); } if (w2 == NULL) { xs_warning("confirm: cannot find %s", ObjConfirmButton); return; } /* Call its "notify" event */ XtCallActionProc(w2, "set", event, params, *num_params); XtCallActionProc(w2, "notify", event, params, *num_params); XtCallActionProc(w2, "unset", event, params, *num_params); } /* Callback for "Cancel" button in data entry popup */ static void cancel_button_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { XtPopdown((Widget) client_data); } /* * Callback for text source changes. Ensures that the dialog text does not * contain white space -- especially newlines. */ static void popup_dialog_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { static bool called_back = false; XawTextBlock b, nullb; /* firstPos, length, ptr, format */ XawTextPosition pos = 0; int front_len = 0; int end_len = 0; int end_pos = 0; int i; enum { FRONT, MIDDLE, END } place = FRONT; enum form_type *ftp = (enum form_type *)client_data; if (*ftp == FORM_AS_IS) { return; } if (called_back) { return; } else { called_back = true; } nullb.firstPos = 0; nullb.length = 0; nullb.ptr = NULL; /* * Scan the text for whitespace. Leading whitespace is deleted; * embedded whitespace causes the rest of the text to be deleted. */ while (1) { XawTextSourceRead(w, pos, &b, 1024); if (b.length <= 0) { break; } nullb.format = b.format; if (place == END) { end_len += b.length; continue; } for (i = 0; i < b.length; i++) { char c; c = *(b.ptr + i); if (isspace((unsigned char)c) && (*ftp != FORM_NO_CC || c != ' ')) { if (place == FRONT) { front_len++; continue; } else { end_pos = b.firstPos + i; end_len = b.length - i; place = END; break; } } else { place = MIDDLE; } } pos += b.length; if (b.length < 1024) { break; } } if (front_len) { XawTextSourceReplace(w, 0, front_len, &nullb); } if (end_len) { XawTextSourceReplace(w, end_pos - front_len, end_pos - front_len + end_len, &nullb); } called_back = false; } /* Create a simple data entry popup */ Widget create_form_popup(const char *name, XtCallbackProc callback, XtCallbackProc callback2, enum form_type form_type) { char *widgetname; Widget shell; Widget dialog; Widget w; /* Create the popup shell */ widgetname = xs_buffer("%sPopup", name); if (isupper((unsigned char)widgetname[0])) { widgetname[0] = tolower((unsigned char)widgetname[0]); } shell = XtVaCreatePopupShell( widgetname, transientShellWidgetClass, toplevel, NULL); XtFree(widgetname); XtAddCallback(shell, XtNpopupCallback, place_popup, (XtPointer)CenterP); /* Create a dialog in the popup */ dialog = XtVaCreateManagedWidget( ObjDialog, dialogWidgetClass, shell, XtNvalue, "", NULL); XtVaSetValues(XtNameToWidget(dialog, XtNlabel), NULL); /* Add "Confirm" and "Cancel" buttons to the dialog */ w = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, dialog, NULL); XtAddCallback(w, XtNcallback, callback, (XtPointer)dialog); if (callback2) { w = XtVaCreateManagedWidget( ObjConfirm2Button, commandWidgetClass, dialog, NULL); XtAddCallback(w, XtNcallback, callback2, (XtPointer)dialog); } w = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, dialog, NULL); XtAddCallback(w, XtNcallback, cancel_button_callback, (XtPointer)shell); if (form_type == FORM_AS_IS) { return shell; } /* Modify the translations for the objects in the dialog */ w = XtNameToWidget(dialog, XtNvalue); if (w == NULL) { xs_warning("Cannot find \"%s\" in dialog", XtNvalue); } /* Set a callback for text modifications */ w = XawTextGetSource(w); if (w == NULL) { XtWarning("Cannot find text source in dialog"); } else { XtAddCallback(w, XtNcallback, popup_dialog_callback, &forms[(int)form_type]); } return shell; } /* * Read-only popups. */ struct rsm { struct rsm *next; char *text; }; struct rop { const char *name; /* resource name */ XtGrabKind grab; /* grab kind */ bool is_error; /* is it? */ bool overwrites; /* does it? */ const char *itext; /* initial text */ Widget shell; /* pop-up shell */ Widget form; /* dialog form */ Widget cancel_button; /* cancel button */ abort_callback_t *cancel_callback; /* callback for cancel button */ bool visible; /* visibility flag */ bool moving; /* move in progress */ struct rsm *rsms; /* stored messages */ void (*popdown_callback)(void); /* popdown_callback */ }; static struct rop error_popup = { "errorPopup", XtGrabExclusive, true, false, "first line\nsecond line\nthird line", NULL, NULL, NULL, NULL, false, false, NULL }; static struct rop info_popup = { "infoPopup", XtGrabNonexclusive, false, false, "first line\nsecond line\nthird line", NULL, NULL, NULL, NULL, false, false, NULL }; static struct rop printer_error_popup = { "printerErrorPopup", XtGrabExclusive, true, true, "first line\nsecond line\nthird line\nfourth line", NULL, NULL, NULL, NULL, false, false, NULL }; static struct rop printer_info_popup = { "printerInfoPopup", XtGrabNonexclusive, false, true, "first line\nsecond line\nthird line\nfourth line", NULL, NULL, NULL, NULL, false, false, NULL }; static struct rop child_error_popup = { "childErrorPopup", XtGrabNonexclusive, true, true, "first line\nsecond line\nthird line\nfourth line", NULL, NULL, NULL, NULL, false, false, NULL }; static struct rop child_info_popup = { "childInfoPopup", XtGrabNonexclusive, false, true, "first line\nsecond line\nthird line\nfourth line", NULL, NULL, NULL, NULL, false, false, NULL }; /* Called when OK is pressed in a read-only popup */ static void rop_ok(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { struct rop *rop = (struct rop *)client_data; struct rsm *r; if ((r = rop->rsms) != NULL) { XtVaSetValues(rop->form, XtNlabel, r->text, NULL); rop->rsms = r->next; Free(r->text); Free(r); } else { XtPopdown(rop->shell); } } /* Called when Cancel is pressed in a read-only popup */ static void rop_cancel(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { struct rop *rop = (struct rop *)client_data; XtPopdown(rop->shell); if (rop->cancel_callback != NULL) { (*rop->cancel_callback)(); } } static void delayed_repop(XtPointer closure, XtIntervalId *id _is_unused) { struct rop *rop = (struct rop *)closure; rop->moving = false; XtPopup(rop->shell, rop->grab); } /* Called when a read-only popup is closed */ static void rop_popdown(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { struct rop *rop = (struct rop *)client_data; void (*callback)(void); if (rop->moving) { XtAppAddTimeOut(appcontext, 250, delayed_repop, (XtPointer)rop); return; } rop->visible = false; if (exiting && rop->is_error) { x3270_exit(1); } callback = rop->popdown_callback; rop->popdown_callback = NULL; if (callback) { (*callback)(); } } /* Initialize a read-only pop-up. */ static void rop_init(struct rop *rop) { Widget w; struct rsm *r; if (rop->shell != NULL) { return; } rop->shell = XtVaCreatePopupShell( rop->name, transientShellWidgetClass, toplevel, NULL); XtAddCallback(rop->shell, XtNpopupCallback, place_popup, (XtPointer)CenterP); XtAddCallback(rop->shell, XtNpopdownCallback, rop_popdown, rop); /* Create a dialog in the popup */ rop->form = XtVaCreateManagedWidget( ObjDialog, dialogWidgetClass, rop->shell, NULL); XtVaSetValues(XtNameToWidget(rop->form, XtNlabel), XtNlabel, rop->itext, NULL); /* Add "OK" button to the dialog */ w = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, rop->form, NULL); XtAddCallback(w, XtNcallback, rop_ok, rop); /* Add an unmapped "Cancel" button to the dialog */ rop->cancel_button = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, rop->form, XtNright, w, XtNmappedWhenManaged, False, NULL); XtAddCallback(rop->cancel_button, XtNcallback, rop_cancel, rop); /* Force it into existence so it sizes itself with 4-line text */ XtRealizeWidget(rop->shell); /* If there's a pending message, pop it up now. */ if ((r = rop->rsms) != NULL) { if (rop->is_error) { popup_an_error("%s", r->text); } else { popup_an_info("%s", r->text); } rop->rsms = r->next; Free(r->text); Free(r); } } /* Pop up a dialog. Common logic for all forms. */ static void popup_rop(struct rop *rop, abort_callback_t *a, const char *fmt, va_list args) { char *buf; buf = xs_vbuffer(fmt, args); if (!rop->shell || (rop->visible && !rop->overwrites)) { struct rsm *r, **s; r = (struct rsm *)Malloc(sizeof(struct rsm)); r->text = buf; r->next = NULL; for (s = &rop->rsms; *s != NULL; s = &(*s)->next) { } *s = r; return; } /* Put the error in the trace file. */ if (rop->is_error) { vtrace("Error: %s\n", buf); } if (rop->is_error && sms_redirect()) { sms_error(buf); Free(buf); return; } XtVaSetValues(rop->form, XtNlabel, buf, NULL); Free(buf); if (a != NULL) XtMapWidget(rop->cancel_button); else XtUnmapWidget(rop->cancel_button); rop->cancel_callback = a; if (!rop->visible) { if (rop->is_error) { ring_bell(); } rop->visible = true; popup_popup(rop->shell, rop->grab); } } static void error_exit(void) { x3270_exit(0); } /* Pop up an error dialog. */ void popup_an_error(const char *fmt, ...) { va_list args; va_start(args, fmt); popup_rop(&error_popup, appres.interactive.reconnect? error_exit: NULL, fmt, args); va_end(args); } /* Pop down an error dialog. */ void popdown_an_error(void) { if (error_popup.visible) { XtPopdown(error_popup.shell); } } /* Pop up an error dialog, based on an error number. */ void popup_an_errno(int errn, const char *fmt, ...) { va_list args; char *s; va_start(args, fmt); s = xs_vbuffer(fmt, args); va_end(args); if (errn > 0) { popup_an_error("%s:\n%s", s, strerror(errn)); } else { popup_an_error("%s", s); } Free(s); } /* Pop up an info dialog. */ void popup_an_info(const char *fmt, ...) { va_list args; va_start(args, fmt); popup_rop(&info_popup, NULL, fmt, args); va_end(args); } /* Add a callback to the error popup. */ void add_error_popdown_callback(void (*callback)(void)) { error_popup.popdown_callback = callback; } /* * Produce a result of some sort. If there is a script running, return it * as the value; otherwise, pop it up as an info. */ void action_output(const char *fmt, ...) { va_list args; va_start(args, fmt); if (sms_redirect()) { char *s; s = xs_vbuffer(fmt, args); sms_info("%s", s); Free(s); } else { popup_rop(&info_popup, NULL, fmt, args); } va_end(args); } /* Callback for x3270 exit. Dumps any undisplayed error messages to stderr. */ static void dump_errmsgs(bool b _is_unused) { while (error_popup.rsms != NULL) { fprintf(stderr, "Error: %s\n", error_popup.rsms->text); error_popup.rsms = error_popup.rsms->next; } while (info_popup.rsms != NULL) { fprintf(stderr, "%s\n", info_popup.rsms->text); info_popup.rsms = info_popup.rsms->next; } } /* Initialization. */ void error_init(void) { } void error_popup_init(void) { rop_init(&error_popup); } void info_popup_init(void) { rop_init(&info_popup); } void printer_popup_init(void) { if (printer_error_popup.shell != NULL) { return; } rop_init(&printer_error_popup); rop_init(&printer_info_popup); } void child_popup_init(void) { if (child_error_popup.shell != NULL) { return; } rop_init(&child_error_popup); rop_init(&child_info_popup); } /* Query. */ bool error_popup_visible(void) { return error_popup.visible; } /* * Printer pop-up. * Allows both error and info popups, and a cancel button. * is_err If true, this is an error pop-up. If false, this is an info * pop-up. * a If non-NULL, the Cancel button is enabled, and this is the * callback function for it. If NULL, there will be no Cancel * button. * fmt... printf()-like format and arguments. */ void popup_printer_output(bool is_err, abort_callback_t *a, const char *fmt, ...) { va_list args; va_start(args, fmt); popup_rop(is_err? &printer_error_popup: &printer_info_popup, a, fmt, args); va_end(args); } /* * Child output pop-up. * Allows both error and info popups, and a cancel button. * is_err If true, this is an error pop-up. If false, this is an info * pop-up. * a If non-NULL, the Cancel button is enabled, and this is the * callback function for it. If NULL, there will be no Cancel * button. * fmt... printf()-like format and arguments. */ void popup_child_output(bool is_err, abort_callback_t *a, const char *fmt, ...) { va_list args; va_start(args, fmt); popup_rop(is_err? &child_error_popup: &child_info_popup, a, fmt, args); va_end(args); } /* * Script actions */ bool Info_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Info", ia, argc, argv); if (check_argc("Info", argc, 1, 1) < 0) { return false; } popup_an_info("%s", argv[0]); return true; } /* * Move the popups that need moving. */ void popups_move(void) { static struct rop *rops[] = { &error_popup, &info_popup, &printer_error_popup, &printer_info_popup, &child_error_popup, &child_info_popup, NULL }; int i; for (i = 0; rops[i] != NULL; i++) { if (rops[i]->visible) { rops[i]->moving = true; XtPopdown(rops[i]->shell); } } } /** * Pop-ups module registration. */ void popups_register(void) { static action_table_t popup_actions[] = { { "Info", Info_action } }; /* Register actions. */ register_actions(popup_actions, array_count(popup_actions)); /* Register for status change notifications. */ register_schange(ST_EXITING, dump_errmsgs); } suite3270-3.6/x3270/printer_gui.c0000664000076500007650000000466513221577164014466 0ustar pdmpdm/* * Copyright (c) 2000-2010, 2013-2014 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * printer_gui.c * GUI for 3287 printer session support */ #include "globals.h" #include #include #include "popups.h" #include "pr3287_session.h" #include "printer_gui.h" #include "xpopups.h" static Widget lu_shell = NULL; /* Callback for "OK" button on printer specific-LU popup */ static void lu_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { char *lu; if (w) { lu = XawDialogGetValueString((Widget)client_data); if (lu == NULL || *lu == '\0') { popup_an_error("Must supply an LU"); return; } else { XtPopdown(lu_shell); } } else { lu = (char *)client_data; } pr3287_session_start(lu); } /* Pop up the LU dialog box. */ void printer_lu_dialog(void) { if (lu_shell == NULL) { lu_shell = create_form_popup("printerLu", lu_callback, NULL, FORM_NO_WHITE); } popup_popup(lu_shell, XtGrabExclusive); } suite3270-3.6/x3270/printer_gui.h0000664000076500007650000000317313221577164014464 0ustar pdmpdm/* * Copyright (c) 2000-2010, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * printer_gui.h * Header file for GUI for printer session support */ void printer_lu_dialog(void); suite3270-3.6/x3270/print_gui.c0000664000076500007650000000471213221577164014130 0ustar pdmpdm/* * Copyright (c) 1994-2015, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_gui.c * x3270-specific functions for the PrintText action. */ #include "globals.h" #include "print_gui.h" #include "stmenu.h" /* Typedefs */ /* Globals */ /* Statics */ /** * GUI for the PrintText action. * * @param[in] use_file true if the output is a file, false if the output is * going to a printer * * @return true if a confirmation dialog was popped up, false if the guts of * the action should be run now. */ bool print_text_gui(bool use_file) { if (ia_cause == IA_COMMAND || ia_cause == IA_MACRO || ia_cause == IA_SCRIPT) { /* Invoked by a script. Run the guts now. */ return false; } else { /* Invoked from a keymap -- pop up the confirmation dialog. */ /* XXX: What about the globals referenced by stmenu_popup? * file_flag * stm_ptype * continuously_flag */ if (use_file) { stmenu_popup(STMP_TEXT); } else { stmenu_popup(STMP_PRINTER); } return true; } } suite3270-3.6/x3270/print_window.c0000664000076500007650000001437113221577164014655 0ustar pdmpdm/* * Copyright (c) 1994-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_window.c * "Print Window Bitmap" support. */ #include "globals.h" #include "xglobals.h" #include #include #include "appres.h" #include "objects.h" #include "resources.h" #include "actions.h" #include "popups.h" #include "print_window.h" #include "trace.h" #include "utils.h" #include "varbuf.h" #include "xpopups.h" /* Typedefs */ /* Globals */ /* Statics */ static Widget print_window_shell = NULL; static char *print_window_command = NULL; /* * Printing the window bitmap is a rather convoluted process: * The PrintWindow action calls PrintWindow_action(), or a menu option calls * print_window_option(). * print_window_option() pops up the dialog. * The OK button on the dialog triggers print_window_callback. * print_window_callback pops down the dialog, then schedules a timeout * 1 second away. * When the timeout expires, it triggers snap_it(), which finally calls * xwd. * The timeout indirection is necessary because xwd prints the actual contents * of the window, including any pop-up dialog in front of it. We pop down the * dialog, but then it is up to the server and Xt to send us the appropriate * expose events to repaint our window. Hopefully, one second is enough to do * that. */ /* Termination procedure for window print. */ static void print_window_done(int status) { if (status) { popup_an_error("Print program exited with status %d.", (status & 0xff00) >> 8); } else if (appres.interactive.do_confirms) { popup_an_info("Bitmap printed."); } } /* Timeout callback for window print. */ static void snap_it(XtPointer closure _is_unused, XtIntervalId *id _is_unused) { if (!print_window_command) { return; } vtrace("PrintWindow: Running '%s'\n", print_window_command); XSync(display, 0); print_window_done(system(print_window_command)); } /* * Expand the window print command. * * The token used to substitute the window ID is "%d", which is a historical * artifact of the original, amazingly insecure implementation. */ static char * expand_print_window_command(const char *command) { const char *s; varbuf_t r; # define WINDOW "%d" # define WINDOW_SIZE (sizeof(WINDOW) - 1) vb_init(&r); s = command; while (*s) { if (!strncasecmp(s, WINDOW, WINDOW_SIZE)) { vb_appendf(&r, "%ld", (unsigned long)XtWindow(toplevel)); s += WINDOW_SIZE; } else { vb_append(&r, s, 1); s++; } } return vb_consume(&r); } /* Callback for "OK" button on print window popup. */ static void print_window_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *cmd; cmd = XawDialogGetValueString((Widget)client_data); XtPopdown(print_window_shell); if (cmd) { /* Expand the command. */ Replace(print_window_command, expand_print_window_command(cmd)); /* In 1 second, snap the window. */ (void) XtAppAddTimeOut(appcontext, 1000, snap_it, 0); } } /* Print the contents of the screen as a bitmap. */ static bool PrintWindow_action(ia_t ia, unsigned argc, const char **argv) { const char *command; bool secure = appres.secure; action_debug("PrintWindow", ia, argc, argv); /* Figure out what the command is. */ command = get_resource(ResPrintWindowCommand); if (argc > 0) { command = argv[0]; } if (argc > 1) { popup_an_error("PrintWindow: extra arguments ignored"); } if (command == NULL || !*command) { popup_an_error("PrintWindow: no %s defined", ResPrintWindowCommand); return false; } /* Check for secure mode. */ if (command[0] == '@') { secure = true; if (!*++command) { popup_an_error("PrintWindow: Invalid %s", ResPrintWindowCommand); return false; } } if (secure) { char *xcommand = expand_print_window_command(command); vtrace("PrintWindow: Running '%s'\n", xcommand); print_window_done(system(xcommand)); XtFree(xcommand); return true; } /* Pop up the dialog. */ if (print_window_shell == NULL) { print_window_shell = create_form_popup("printWindow", print_window_callback, NULL, FORM_AS_IS); } XtVaSetValues(XtNameToWidget(print_window_shell, ObjDialog), XtNvalue, command, NULL); popup_popup(print_window_shell, XtGrabExclusive); return true; } /* Callback for menu Print Window option. */ void print_window_option(Widget w, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { (void) PrintWindow_action(IA_KEYMAP, 0, NULL); } /** * Window printing module registration. */ void print_window_register(void) { static action_table_t print_window_actions[] = { { "PrintWindow", PrintWindow_action, ACTION_KE } }; /* Register the actions. */ register_actions(print_window_actions, array_count(print_window_actions)); } suite3270-3.6/x3270/print_window.h0000664000076500007650000000331013221577164014651 0ustar pdmpdm/* * Copyright (c) 1995-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * print_window.h * Global declarations for print_window.c. */ void print_window_option(Widget w, XtPointer client_data, XtPointer call_data); void print_window_register(void); suite3270-3.6/x3270/qcpp-defs.sh0000775000076500007650000000044513221577163014203 0ustar pdmpdm#!/usr/bin/env sh # Scan conf.h to find all of the '#define X3270_xxx' statements, and translate # them to '-DX3270_xxx' options for use by qcpp. # This should just be inline in the Makefile, but so far I haven't found a # way to do that. grep '^#define X3270_' conf.h | awk '{print "-D" $2}' suite3270-3.6/x3270/README0000664000076500007650000000276013221577164012645 0ustar pdmpdmx3270 3.3 General Release x3270 is an IBM 3278/3279 terminal emulator for X11. Documentation is in the html directory. The files are: Intro What x3270 is Lineage Where x3270 came from (copyright stuff) Build How to build and install x3270 FAQ Frequently Asked Questions (what to do when something goes wrong) Attributes A translation table for 3270 field attributes Resources Voluminous documentation of all the X resources used by x3270 Charset An explanation of x3270's use of fonts and character sets Keymap How to create a custom x3270 keymap Brackets How to get [ and ] to display correctly New What's new in this release Bugs What's broken in this release Wishlist What isn't in this release There is also a hypertext version of the x3270 man page, and of the man pages for x3270if, x3270-script and ibm_hosts. Please read Build before going ahead and building the program. Also, if you have a problem, scan through FAQ; there are lots of interesting answers there. Updates to x3270, as well as the current status of development and bugs, are available from the x3270 Web Page, http://x3270.sourceforge.net/. Feel free to send comments, criticism, suggestions, complaints, etc., to Paul Mattes, Paul.Mattes@usa.net. Requests will be addressed as time and resources permit. There is also an x3270 mailing list, which receives news about new releases. You can subscribe to this list at https://lists.sourceforge.net/lists/listinfo/x3270-announce. suite3270-3.6/x3270/README.dbcs0000664000076500007650000000320113221577164013546 0ustar pdmpdmHow to Run x3270 in DBCS Mode ----------------------------- DBCS is an attribute of your locale and the host character set you select. Your locale is defined by the LC_CTYPE or LC_ALL environment variable, and determines the character set and encoding for interactions with the Input Method, as well as other workstation I/O (cut/paste, screen printing, scripting). The x3270 host character set may be selected from the command line, or from the Options->Character set menu option. For example, Simplified Chinese is selected via the option '-charset simplified-chinese'. In order to get multi-byte input, you must run an X Input Method (e.g., xcin, kinput2). The input method name can be automatically derived from the locale, or can be specified by the XMODIFIERS environment variable or by the '-im' command-line option. The preedit type used by the input method can be specified by the '-pt' option, which takes the values 'Root' or 'OverTheSpot'. The vertical offset of the preedit window for 'OverTheSpot' can be modified by adding a suffix to 'OverTheSpot', e.g., '-pt OverTheSpot+2' will cause the preedit window to appear two lines below the cursor. The default preedit type is 'OverTheSpot+1'. Languages and Code Pages Supported ---------------------------------- Charset Name Code Pages X11 Charsets ------------------ ------------------------ ------------------------- simplified-chinese 836 (SBCS), 837 (DBCS) gb2312.1980-0, iso10646-1 japanese 1027 (SBCS), 300 (DBCS) jisx201.1976-0+jisx0208.1983-0, iso10646-1 Known Limitations ----------------- - Flipped mode does not work, and is disabled. suite3270-3.6/x3270/resource-body0000664000076500007650000031354113221577163014473 0ustar pdmpdmintro Resources are used to configure %p%. Resources are named items with string, integer or Boolean values.

    Resource definitions come from the following sources:

    • Default values are compiled into %p%.
    • if x
    • Standard X11 methods can be used to override the compiled-in defaults. These methods include:
      • The %p% app-defaults file (only if %p% is built with app-defaults support). This can be a locale-specific or generic app-defaults file located in the user's home directory or in the system X11 directory.
      • Definitions set by the xrdb command.
      • The ~/.Xdefaults file.
      endif
    • If a session file foo.%p% is specified on the command line, its contents are applied. if x c Otherwise, if the %p% profile (~/.%p%pro) exists, it is read and its contents are applied. endif These definitions override resource values defined by if x X11 methods and endif compiled-in defaults.
    • Command-line options override all other resource definitions. If more than one command-line option sets a resource, the last one is used.
    Many resources have their own command-line switches, which are listed below. Those that do not can still be set from the command-line via the -xrm command-line option. For example %-bsdTm% can be set by the following command-line option:
         -xrm "%p%.bsdTm: true"
     
    Note that -xrm is supported on all of the 3270 emulators, not just on x3270.

    Resource File Syntax

    A resource file if x (app-defaults file, profile or session file) else if c (profile or session file) else (session file) endif endif has the following syntax.
    • Each definition consists of:
          %p%.resource-name: value
        
    • Comment lines begin with !.
    • Line continuation is indicated by a backshash (\) character at the end of a line.
    • if x C
    • Multi-line resources, such as keymap definitions, are split with newline characters, e.g.:
          %p%.keymap.foo: \
            <Key>a: String("bob") \n\
            <Key>b: String("fred") \n\
            <Key>c: String("joe")
        
    • endif
    . name acceptHostname applies a type s groups s switch -accepthostname description Defines a specific name to accept when validating the name presented in the server's SSL/TLS certificate, instead of using the name used to make the connection. (The form DNS:name is also accepted for backwards compatibility.) . name acs applies c type b default true desc When true, %p% will use the curses Alternative Character Set (ACS) to display box-drawing characters. When false, %p% will use Unicode box-drawing characters. . name activeIcon applies x groups a type b default false switch -activeicon description When true, %p%'s icon becomes a live miniature of the screen display. . name aidWait applies x c s tcl type b default false switch -set aidWait switch -clear aidWait desc When true, %p% will not block a script after executing an AID action (Enter, Clear, PF or PA). It is then script's responsibility to poll %p%'s status until it shows that the keyboard is no longer unlocked. . name allBold applies c groups a type s default auto switch -allbold desc When true, %p% will display all text in bold. This is needed for terminals like Linux consoles and xterms that display non-bold text in unreadably-dim colors. When false, text will be displayed in normal or bold, depending on the host-specified highlighting attribute.

    When set to auto, it will be assumed true for 3279 emulation, and false for 3278 emulation. . name allowResize applies x type b default true description When true, the %p% window can be resized by the mouse (actually, by the window manager). When false, the window can only be resized from menu options. The purpose of disabling mouse resizing is to allow a window bigger than will fit on the screen, which some window managers (e.g., mwm) will not allow if permitted to resize it. . name altCursor applies x wc groups a type b default false switch -set altCursor switch -clear altCursor option Options -> Toggles -> Underline Cursor option Options -> Toggles -> Block Cursor description When true, this causes %p% to use the alternate (underscore) cursor. When false, it will use a block cursor. . name altScreen applies c type s switch -altscreen desc Defines a character string that will be output to switch the terminal from 80-column mode to 132-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-defScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name aplCircledAlpha applies x groups a type b default false description When set to true, allows %p% to work properly with special APL fonts like the APL385 font. APL385 maps the APL underscored alphabetic characters, which have no Unicode equivalent, to the DBCS circled alphabetic characters in the range U+24B6 to U+25CF. Otherwise, the only way to display these characters is with one of the special 3270 fonts included with %p%.

    Because this mapping is non-standard, this setting affects only the display. The Ascii action will always output underscored alphabetics as blanks, and copy-and-paste operations will also represent them this way, though this may change to use the Unicode Combining Low Line character U+0332 at some point. . name aplMode applies x type b default false switch -apl desc Enables %p% APL mode. APL mode appends apl to the list of names in %-keymap% (causing the Alt key plus many alphanumeric keys to produce basic APL symbols), sets %-composeMap% to apl (allowing Compose key sequences to construct complex APL symbols), and sets %-charset% to apl (allowing the display of APL symbols using several of the 3270 fonts). . name asciiBoxDraw applies C type b default false desc When true, this causes box-drawing characters (the Unicode 2500 block) to be drawn with ASCII-art characters (+, - and |). This allows a readable representation of these characters on the screen when using fonts that do not include them or have them with the wrong width. . name autoShortcut applies wc type b default false switch -S switch +S desc When true, %p% will run in auto-shortcut mode. In auto-shortcut mode, %p% automatically creates a desktop shortcut (.lnk file) in %TEMP% that is compatible with its session file, then starts it. This ensures that the console window's screen size, character set, font, etc. will be correct.

    Auto-shortcut mode requires the use of a session file; the session file must have been created by the Session Wizard (release 3.3.9 or later) and must not have been modified incorrectly. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include setting autoShortcut to true.

    The +S command-line switch turns off auto-shortcut mode. All desktop shortcuts created by the Session Wizard release 3.3.10 or later include this switch.

    Auto-shortcut mode does not work on Windows 9x. . name background applies x groups a type s default white switch -bg switch -rv description The background color for menus, buttons, and on monochrome X11 displays, the emulator window. . name bellMode applies wc type s groups i description Controls how %p% responds to an ALARM WCC or BELL character. The value of beepFlash causes both the Windows console to beep and the %p% window to flash; this is the default behavior. The values of beep and flash cause just the beep and just the window flash respectively. The value none causes ALARM WCCs and BELL characters to be ignored.

    If this resource is defined, it overrides %-visualBell%. . name bellVolume applies x type i default 0 description Controls the volume used when ringing the terminal bell. The value ranges from -100 (silent) through 0 (normal) to +100 (loud). Not all X11 servers can vary the bell volume, other than turning it on and off. This resource can be overridden by %-visualBell%, which if true, will replace the bell with a flash of the screen. . name bindLimit applies a groups p type b default true description When true, %p% will restrict its screen dimensions to those specified in the BIND image sent by the host. If false, it will not. . name bindUnlock applies a type b groups p default false description When true, %p% will unlock the keyboard as soon as the host sends a BIND image. Otherwise, it will wait until the host sends a Write command.

    Note that in some previous releases, unlocking as soon as the BIND image was recevied was the default, and this behavior could be overridden (forcing %p% to wait for the Write) by the B: option on the hostname. Since waiting for the Write is now the default, B: is still supported as a no-op. . name blankFill applies a groups i type b default false option Options -> Toggles -> Blank Fill switch -set blankFill switch -clear blankFill description When true, in 3270 mode %p% will automatically convert trailing blanks in a field to NULLs in order to insert a character, and will automatically convert leading NULLs to blanks so that input data is not squeezed to the left. This works around some of the quirkier behavior of real 3270 terminals. . name boldColor applies x groups a default green type s description This resource defines the X11 color used to display intensified text in 3278 mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan. . name bsdTm applies a groups p type b default false description Defines %p%'s response to the TELNET DO TIMING MARK option. When set to false, %p% will respond to DO TIMING MARK with WONT TIMING MARK, which is consistent with most modern TELNET clients. When true, %p% will respond with WILL TIMING MARK, which is consistent with the old BSD telnet command and with previous versions of %p%. In either case, %p% will never respond to a DONT TIMING MARK option. . name caDir applies u type s groups s switch -cadir description Defines a directory containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name caFile applies u type s groups s switch -cafile description Defines a PEM-format file containing CA (root) certificates, used to validate a certificate presented by the host during SSL/TLS negotiation. The default is determined by the OpenSSL library on your workstation. (OpenSSL only) . name cbreak applies c type b default false switch -cbreak desc If true, %p% will set up the terminal in cbreak mode instead of the default raw mode. Cbreak mode enables flow-control processing in the TTY driver, and may be required for certain terminals that use flow control to avoid dropping characters. . name certFile applies u groups s type s switch -certfile desc Gives the name of a client certificate file, provided to the host during SSL/TLS negotiation.

    With OpenSSL, the default file format is PEM; it can be overridden by %-certFileType%. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%.

    On the Mac, the file must be in PKCS12 format. . name certFileType applies u groups s type s default pem switch -certfiletype desc Gives the type of the certificate file specified by %-certFile%. The value can be pem or asn1. (OpenSSL only) . name chainFile applies u groups s type s switch -chainfile desc Gives the name of a certificate chain file to provided to the host during SSL/TLS negotiation. The file contains a PEM-format certificate, optionally followed by any intermediate certificates used to sign it, and the CA (root) certificate. The private key for the certificate is specified by %-keyFile%. If %-chainFile% is specified, it overrides %-certFile%. (OpenSSL only) . name charClass applies x type s desc Defines groups of characters that should be treated the same when doing cut and paste of words. Identical in use to the xterm resource of the same name. . name charset applies a groups c type s default bracket switch -charset option Options -> Character Set description This defines the host EBCDIC character set, that is, what glyph (image) is displayed for each EBCDIC code sent by the host, and what EBCDIC code is sent to the host for each character typed on the keyboard. This is more correctly referred to as the host code page.

    To display the character sets supported by %p%, use the -v command-line option. if wc

    Note that %p% DBCS support is limited. On Windows XP, Windows East Asian language support must be installed. On Windows Vista and later, the Windows System Locale must be set to a matching language. endif . name clientCert applies w groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. The certificate is searched for in the Personal store. . name clientCert applies u groups s type s switch -clientcert desc Gives the name of a client certificate, provided during SSL/TLS negotiation. (Mac only) . name color8 applies a groups p type b default false description If true, %p% will respond to a Query(Color) with a list of 8 supported colors. If false, it will send a list of 16 colors. The 8-color setting is required for some hosts which abort a session if 16 colors are reported. if c

    This setting will also cause %p% to assume that the terminal supports no more than 8 colors, and will use only the 8 basic curses colors to draw the screen. endif . name colorBackground applies x groups a type s default black description The background color for the emulator window. This resource is used only on color X11 displays when %-model% specifies 3278 mode. On monochrome X11 displays, the background color is white, unless -rv (reverse video) is selected on the command line; in 3279 mode, the screen background is determined by %-colorScheme%. . name colorScheme applies x groups a type s default default option Options -> Color Scheme description Defines the colors used to paint the emulator window in 3279 (full-color) mode. This resource is used only when %-model% specifies a 3279 display. %-colorScheme% is just the name of the color scheme. The actual color scheme definition for color scheme foo is %-colorScheme.foo%. . name colorScheme.foo applies x groups a type s description An individual color scheme definition. I.e., to define color scheme foo, a resource named %p%.colorScheme.foo must be defined.

    Each resource is a whitespace-separated list of 23 items:

    1. X11 color for host color 0 NeutralBlack (also used for NVT color 0)
    2. X11 color for host color 1 Blue (also used for NVT color 4)
    3. X11 color for host color 2 Red (also used for NVT color 1)
    4. X11 color for host color 3 Pink (also used for NVT color 5)
    5. X11 color for host color 4 Green (also used for NVT color 2)
    6. X11 color for host color 5 Turquoise
    7. X11 color for host color 6 Yellow (also used for NVT color 3)
    8. X11 color for host color 7 NeutralWhite
    9. X11 color for host color 8 Black
    10. X11 color for host color 9 DeepBlue
    11. X11 color for host color 10 Orange
    12. X11 color for host color 11 Purple
    13. X11 color for host color 12 PaleGreen
    14. X11 color for host color 13 PaleTurquoise (also used for NVT color 6)
    15. X11 color for host color 14 Grey
    16. X11 color for host color 15 white (also used for NVT color 7)
    17. X11 color to use if one of 0..15 cannot be allocated (white or black)
    18. X11 color to use as the default screen background
    19. X11 color to use as the select background
    20. Host color (0..15) for unprotected, unhighlighted fields
    21. Host color (0..15) for unprotected, highlighted fields
    22. Host color (0..15) for protected, unhighlighted fields
    23. Host color (0..15) for protected, highlighted fields

    Note: Host color 0 (NeutralBlack) means black on a display screen (a white-on-black device) and white on a printer (a black-on-white device). Host color 7 (NeutralWhite) means white on a display screen and black on a printer. . name commandTimeout applies tcl type i description Defines the number of seconds to wait for a command to complete before failing it with a timeout error. . name composeMap applies x C type s default latin1 description Gives the name of the map used to define the pairs of characters that form composite characters with the Compose key. The definition of compose map foo is the resource %-composeMap.foo%. . name composeMap.foo applies x C type s description An individual compose map definition. Each line in the resource is of the form:

             keysym1 + keysym2 = keysym3
    

    meaning "when the Compose key is pressed, followed by keysym1 and keysym2 (in either order), interpret it as keysym3." The definitions are case-sensitive. . name confDir applies a type s if u default /usr/local/etc/x3270 else default . endif desc Defines the %p% configuration directory, where %p% will search for the ibm_hosts file by default. (See %-hostsFile%.) if w

    The default is to search the directory where %p% was started, which usually its installation directory. endif . name connectFileName applies x type s default ~/.x3270connect description Gives the name of the file to store the recently-connected host list in. If given the value none, no file will be read or written. Note that by default, this file is shared among all instances of %p% that run under the same username. . name connectTimeout applies a type i groups c switch -connecttimeout description Specifies a timeout, in seconds, that %p% will wait for a host connection to complete. If this is not set, the timeout will be determined by the operating system. Note that %p% will wait for the lesser of the two times (the specified timeout and the system-defined timeout). . name consoleColorForHostColor0 consoleColorForHostColorNeutralBlack consoleColorForHostColor1 consoleColorForHostColorBlue consoleColorForHostColor2 consoleColorForHostColorRed consoleColorForHostColor3 consoleColorForHostColorPink consoleColorForHostColor4 consoleColorForHostColorGreen consoleColorForHostColor5 consoleColorForHostColorTurquoise consoleColorForHostColor6 consoleColorForHostColorYellow consoleColorForHostColor7 consoleColorForHostColorNeutralWhite consoleColorForHostColor8 consoleColorForHostColorBlack consoleColorForHostColor9 consoleColorForHostColorDeepBlue consoleColorForHostColor10 consoleColorForHostColorOrange consoleColorForHostColor12 consoleColorForHostColorPurple consoleColorForHostColor13 consoleColorForHostColorPaleGreen consoleColorForHostColor14 consoleColorForHostColorPaleTurquoise consoleColorForHostColor15 consoleColorForHostColorGrey consoleColorForHostColor16 consoleColorForHostColorWhite applies wc groups a type i desc Defines what console color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the console color to use when the host specifies green, which is host color 4, either the resource %p%.consoleColorForHostColorGreen or the resource %p%.consoleColorForHostColor4 can be used.

    The default definitions are as follows.
    Host Color Index Host Color Name Default Console Color
    0 NeutralBlack 0
    1 Blue 9
    2 Red 12
    3 Pink 13
    4 Green 10
    5 Turquoise 11
    6 Yellow 14
    7 NeutralWhite 15
    8 Black 0
    9 DeepBlue 1
    10 Orange 12
    11 Purple 5
    12 PaleGreen 2
    13 PaleTurquoise 3
    14 Grey 7
    15 White 15

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    The value of the resource is a console color index (0 through 15). Console colors are defined as follows:
    Index Sample
    0 [sample]
    1 [sample]
    2 [sample]
    3 [sample]
    4 [sample]
    5 [sample]
    6 [sample]
    7 [sample]
    8 [sample]
    9 [sample]
    10 [sample]
    11 [sample]
    12 [sample]
    13 [sample]
    14 [sample]
    15 [sample]

    The color samples above are the default values used by the %p% Session Wizard when it creates a desktop shortcut. The RGB values for any of the console colors can be changed later using the Colors tab on the Properties dialog of the shortcut.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to console colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to console colors can be with %p%.consoleColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Console Color
    0 (black) 0 (Black) 0
    1 (red) 2 (Red) 12
    2 (green) 4 (Green) 10
    3 (yellow) 6 (Yellow) 14
    4 (blue) 1 (Blue) 9
    5 (magenta) 3 (Pink) 13
    6 (turquoise) 6 (Turquoise) 14
    7 (white) 7 (NeutralWhite) 15

    For example, to change the display from white-on-black to black-on-white, define the following resources:

         %p%.consoleColorForHostColorNeutralBlack: 15
         %p%.consoleColorForHostColorNeutralWhite: 0
        
    . name crosshair applies x C groups a type b default false option Options -> Toggles -> Crosshair Cursor switch -set crosshair switch -clear crosshair description When true, causes %p% to display a crosshair over the cursor: lines extending with height and width of the screen. . name crosshairColor applies x C groups a type s default purple description Defines the color used for the crosshair cursor (see %-crosshair%). The value is a host color name or numeric host color index:
    Host Color Name Host Color Index
    NeutralBlack 0
    Blue 1
    Red 2
    Pink 3
    Green 4
    Turquoise 5
    Yellow 6
    NeutralWhite 7
    Black 8
    DeepBlue 9
    Orange 10
    Purple 11
    PaleGreen 12
    PaleTurquoise 13
    Grey 14
    White 15
    . name cursesColorForDefault cursesColorForIntensified cursesColorForProtected cursesColorForProtectedIntensified applies c groups a type s desc Defines the default color to use to render text based on its attributes, when the host does not specify a particular color.

    The value of the resource can be either a curses color index or curses color name. These are are defined as follows:
    Curses Color Index Curses Color Name
    0 black
    1 red
    2 green
    3 yellow
    4 blue
    5 magenta
    6 cyan
    7 white
    8 no name -- displays as grey
    9 no name -- displays as bright red
    10 no name -- displays as bright green
    11 no name -- displays as bright yellow
    12 no name -- displays as bright blue
    13 no name -- displays as bright magenta
    14 no name -- displays as bright cyan
    15 no name -- displays as bright white

    The default values are:
    %p% Resource Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    cursesColorForDefault green 10 (bright green)
    cursesColorForIntensified red red
    cursesColorForProtected blue 12 (bright blue)
    cursesColorForProtectedIntensified white 15 (bright white)
    . name cursesColorForHostColor0 cursesColorForHostColorNeutralBlack cursesColorForHostColor1 cursesColorForHostColorBlue cursesColorForHostColor2 cursesColorForHostColorRed cursesColorForHostColor3 cursesColorForHostColorPink cursesColorForHostColor4 cursesColorForHostColorGreen cursesColorForHostColor5 cursesColorForHostColorTurquoise cursesColorForHostColor6 cursesColorForHostColorYellow cursesColorForHostColor7 cursesColorForHostColorNeutralWhite cursesColorForHostColor8 cursesColorForHostColorBlack cursesColorForHostColor9 cursesColorForHostColorDeepBlue cursesColorForHostColor10 cursesColorForHostColorOrange cursesColorForHostColor12 cursesColorForHostColorPurple cursesColorForHostColor13 cursesColorForHostColorPaleGreen cursesColorForHostColor14 cursesColorForHostColorPaleTurquoise cursesColorForHostColor15 cursesColorForHostColorGrey cursesColorForHostColor16 cursesColorForHostColorWhite applies c groups a type s desc Defines what curses color to use to render a particular host color. Host colors can be specified by name or number. That is, to define the curses color to use when the host specifies green, which is host color 4, either the resource %p%.cursesColorForHostColorGreen or the resource %p%.cursesColorForHostColor4 can be defined.

    The default definitions are as follows. Note that on an 8-color terminal, %p% only displays 8 host colors.
    Host Color Index Host Color Name Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 NeutralBlack black black
    1 Blue blue 12 (bright blue)
    2 Red red red
    3 Pink red 13 (bright magenta)
    4 Green green 10 (bright green)
    5 Turquoise cyan 14 (bright cyan)
    6 Yellow yellow 11 (bright yellow)
    7 NeutralWhite white 15 (bright white)
    8 Black - black
    9 DeepBlue - blue
    10 Orange - 9 (bright red)
    11 Purple - magenta
    12 PaleGreen - green
    13 PaleTurquoise - cyan
    14 Grey - white
    15 White - 15 (bright white)

    Note that "neutral black" means black on a display device and white on a printing device, and "neutral white" means white on a display device and black on a printing device.

    In NVT mode, %p% maps the ANSI-standard colors 0 through 7 to host colors, and from host colors to curses colors. The mapping from ANSI colors to host colors cannot be changed, but the mapping from host colors to curses colors can be with %p%.cursesColorForHostColor* resources. The mappings and defaults are as follows:
    NVT ANSI Color Mapped Host Color (not configurable) Default Curses Color (8-color terminal) Default Curses Color (16-color terminal)
    0 (black) 0 (Black) black black
    1 (red) 2 (Red) red red
    2 (green) 4 (Green) green 10 (bright green)
    3 (yellow) 6 (Yellow) yellow 11 (bright yellow)
    4 (blue) 1 (Blue) blue 12 (bright blue)
    5 (magenta) 3 (Pink) red 13 (bright magenta)
    6 (turquoise) 13 (PaleTurquioise) cyan cyan
    7 (white) 15 (White) white 15 (bright white)

    See %-cursesColorForDefault% for the definitions of curses colors. . name cursesKeypad applies c type b default false desc When true, %p% will set up the terminal in curses keypad mode. . name cursorBlink applies x groups a type b default false option Options -> Toggles -> Blinking Cursor switch -set cursorBlink switch -clear cursorBlink description When true, causes %p% to use a blinking cursor. . name cursorColor applies x groups a type s default red description On color X11 displays, this is the color of the text cursor. This resource is used only if %-useCursorColor% is true. . name cursorPos applies x C groups a type b default true switch -set cursorPos switch -clear cursorPos option Options -> Toggles -> Track Cursor description When true, causes %p% to display the cursor location in the OIA (the status line). . name dbcsCgcsgid applies a groups p type s description Overrides the compiled-in value of the CGCSGID for the current host character set, which will be reported to the host in response to a Query(Character Sets). The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the double-byte (DBCS) character set. Use %-sbcsCgcsgid% for the single-byte (SBCS) character set. . name debugTracing applies x groups t s type b default true description If true, options are available on the File menu to trace the 3270 data stream and X11 events. If false, these options are not displayed. . name defaultFgBg applies c type b groups a default false switch -defaultfgbg description If true, %p% will use the terminal's default foreground color instead of specifying the curses color white, and it will use the terminal's default background color instead of specifying the curses color black. This is helpful in two cases: for emulators such as gnome-terminal whose usual representation of a black background is a murky gray, and for emulators configured with a black foreground and a white background, so that %p%'s screen will appear the same way.

    defaultFgBg will be set to true automatically if the environment variable COLORTERM is set to gnome-terminal.

    Note that this resource and option are available only if %p% has been compiled with a version of ncurses that supports default foreground and background colors, and if the terminal and its associated termcap/terminfo entry also support it (it is usually implemented as ANSI color 9). . name defScreen applies c type s switch -defscreen desc Defines a character string that will be output to switch the terminal from 132-column mode to 80-column mode. Within the string, the sequence \E is translated to the ASCII ESC character (0x1b).

    When %-model% is 5, and this and %-altScreen% are defined, %p% will automatically change the terminal size when the host switches between the default (24x80) screen and the alternate (27x132) screen. . name dftBufferSize applies a groups p type i default 4096 description Deprecated resource -- replaced by %-ftBufferSize%

    Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name devName applies a type s switch -devname groups p description Specifies the device name (workstation ID) sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name disconnectClear applies x type b default false description If true, %p% will clear the screen when a host disconnects. . name doConfirms applies x type b default true description When true, %p% will display a pop-up to report successful completion of certain operations, such as screen printing. When false, these pop-ups are not displayed. . name dsTrace applies a groups t type b default false switch -trace switch -set dsTrace switch -clear dsTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% writes a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name emulatorFont type s applies x groups a default 3270 switch -efont option Options -> Font description The font used for the emulator window. By default it is 3270, a 14-pixel clone of a real 3278 display font. Other 3270-specific fonts are available in 8-, 12-, 16-, 24- and 32-pixel sizes. Any standard X11 constant-spaced font can also be used, provided that it implements a display character set compatible with the host code page (%-charset%). However, the special OIA (status line) symbols are only available with the 3270 fonts. . name eof type s applies a groups n default ^D description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current line of input to be forwarded to the host without a trailing CR/LF sequence.

    . name erase type s applies a groups n default ^? description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (%p% gathers a line of input before forwarding it ot the host), entering this character at the keyboard will cause %p% to discard the last character on the input line.

    When connected in character-at-a-time mode (%p% sends each keystroke to the host as it is entered), this is the character that will be sent to the host by the Erase action. . name eventTrace groups t type b applies a default false switch -set eventTrace switch -clear eventTrace description Deprecated resource -- replaced by %-trace%

    When true, %p% traces information about keyboard and mouse events into a file. The default file name is if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name extended type b applies a default false groups d switch -extended description Deprecated resource -- replaced by %-model% syntax

    Indicates support for the 3270 Extended Data Stream. . name fixedSize type s applies x groups a description Specifies a fixed size for the %p% display window. If set, %p% will not allow its window to be resized by the window manager. The syntax is widthxheight. The 3270 display screen will float in the center of the window if necessary. . name foreground type s applies x groups a default black switch -fg switch -rv description The foreground color for menus, buttons, and on monochrome X11 displays, the emulator display. . name ftAllocation type s applies a groups i default default description Defines the default allocation type for files sent to TSO hosts by IND$FILE file transfers. Possible values are default, which lets the host decide the allocation type, or tracks, cylinders, or avblock. . name ftAvblock type i applies a groups i description Defines the default AVBOCK (average block) allocation size for files sent to TSO hosts by IND$FILE file transfers. . name ftBlksize type i applies a groups i description Defines the default block size for files sent to TSO hosts by IND$FILE file transfers. . name ftBufferSize applies a groups p type i default 4096 description Specifies the default buffer size for DFT IND$FILE file transfers. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCodePage type i applies w groups i description Deprecated resource -- replaced by %-ftWindowsCodePage%

    The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name ftCr type s applies a groups i default auto description Defines the default action for line separators (carriage returns and line feeds) in ASCII files during IND$FILE file transfers. The value can be auto, which will add them when files are received from the host and remove them when they are sent to the host, add (same as auto), remove (same as auto), or keep, meaning no special processing is done. . name ftDirection type s applies a groups i default receive description Defines the default IND$FILE file transfer direction, from the perspective of the workstation. The value can be either send (send file from workstation to host) or receive (receive file from host to workstation). . name ftExist type s applies a groups i default keep description Defines the default behavior for IND$FILE file transfers when the destination file already exists. The value keep means that the transfer will be if x aborted (or if invoked interactively, the user will be prompted to confirm the file is to be overwritten), else aborted, endif replace means that the file will be overwritten unconditionally, and append means that the new file will be appended to the old file. . name ftHost type s applies a groups i default tso description Defines the default host type for IND$FILE file transfers. The value can be vm, tso or cics. . name ftHostFile type s applies a groups i description Defines the default host file name for IND$FILE file transfers. . name ftLocalFile type s applies a groups i description Defines the default local file name for IND$FILE file transfers. . name ftLrecl type i applies a groups i description Defines the default logical record length for files sent to the host via IND$FILE. . name ftMode type s applies a groups i default ascii description Defines the default mode for IND$FILE file transfers: ascii (text, with translation between the workstation's code page and EBCDIC), or binary (no translation). . name ftPrimarySpace type i applies a groups i description Defines the default primary space allocation for files sent to TSO hosts via IND$FILE. . name ftRecfm type s applies a groups i default default description Defines the default record format for files sent to the host using IND$FILE. Possibe values are default, fixed, variable, and undefined. The default value of 'default' lets IND$FILE choose an appropriate format. . name ftRemap type s applies a groups i default yes description Defines the default mapping behavior for ASCII files transferred with IND$FILE. When set to yes, ASCII files are translated by %p% to produce as accurate a mapping as possible between the workstation's code page and the host's EBCDIC code page. When set to no, only the fixed translation built into the IND$FILE application is run, which (roughly) maps ISO 8859-1 to host code page 37. . name ftSecondarySpace type i applies a groups i description Defines the default secondary space allocation for files sent to TSO hosts via IND$FILE. . name ftWindowsCodePage type i applies w groups i description The Windows code page to use for translating between EBCDIC and ASCII in IND$FILE file transfers. The default is to use the system ANSI code page. This value can be overridden in the File Transfer dialog and by a parameter to the Transfer action. . name highlightBold type b applies x groups a default false description If true, highlighted fields will be displayed in bold. If false, highlighted fields will be displayed in the normal font. . name hostColorForDefault hostColorForIntensified hostColorForProtected hostColorForProtectedIntensified applies wc groups a type s desc Defines the default color to use to render text with a particular attribute, when the host does not specify a particular color.

    The value of the resource is a host color name or color index. See %-consoleColorForHostColor0% for the definitions of host colors.

    The default values are:
    %p% Resource Default Host Color
    hostColorForDefault Green
    hostColorForIntensified Red
    hostColorForProtected Blue
    hostColorForProtectedIntensified NeutralWhite
    . name hostname type s applies a groups c desc Gives the name of the host to connect to. The name can include the usual options (prefixes to specify special connection options, LU names, and port). A hostname specified on the command line takes precedence over %-hostname%.

    The most common use of %-hostname% is in session files, where a file is used to pass all of the options to establish a %p% session. . name hostsFile type s applies x default /usr/local/etc/x3270/ibm_hosts description The pathname of a file listing the host names that appear on the File -> Connect menu. The file can also be used to create hostname aliases and to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. The default pathname is actually ibm_hosts in the directory defined by %-confDir%. . name hostsFile type s applies C S tcl if u default /usr/local/etc/x3270/ibm_hosts else default ibm_hosts endif description The pathname of a file containing hostname aliases. The file can also be used to define a set of actions to perform when connecting to a host.

    The format of the file is explained on the ibm_hosts manual page. if u The default pathname is actually ibm_hosts in the directory defined by %-confDir%. endif . name httpd type s applies C S x switch -httpd description Defines the TCP port and optional address to listen on for HTTP connections. (%p% implements a simple REST API and a set of HTML objects for access by scripts.) The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4080. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name iconFont type s applies x groups a default nil2 description The font used to paint the text inside the active icon (see %-activeIcon%). The default of nil2 is a one-by-two pixel font that produces a "greeked" picture of the screen image. . name iconLabelFont type s applies x groups a default 8x13 description When %-activeIcon% and %-labelIcon% are true, this is the name of the font used to paint the icon label. . name icrnl type b applies a groups n default true description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input carriage returns are mapped to newlines. . name idleCommand applies x C S groups i type s description When %-idleCommand% is defined, it specifies a command to execute after a period of keyboard inactivity (no AID keys pressed). The %-idleCommand% can be an arbitrary sequence of %p% actions, but it should include an action which generates an AID (Enter, Clear, PF or PA). %-idleCommandEnabled% must be true in order for the %-idleCommand% to take effect. (This is so an idle command can be defined, but needs to be enabled explicitly at some point after login.) %-idleTimeout% specifies the inactivity interval. . name idleCommandEnabled applies x C S groups i type b default false description Controls whether %-idleCommand% has effect as soon as a host session is established. (This is so an idle command can be defined, but needs to be explicitly enabled at some point after login.) . name idleTimeout applies x C S groups i type s default ~7m description The timeout value for %-idleCommand%. If the value ends in h, it specifies hours; if it ends in m it specifies minutes; if it ends in s or does not have an alphanumeric suffix, it specifies seconds.

    If the value begins with a tilde ~, the time will be randomly varied +/-10% from the value specified. . name inlcr applies a groups n type b default false description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. It controls whether input newlines are mapped to carriage returns. . name inputColor applies x groups a type s default green description This resource defines the color used to display light-pen selectable text in 3278 (monochrome) emulation mode.

    Previous versions of %p% implemented something called pseudo-color mode, where a monochrome (3278) terminal was emulated with various colors assigned to different kinds of fields. To emulate pseudo-color mode with the current version of %p%, select 3278 emulation with %-model%, set %-inputColor% to orange and set %-boldColor% to cyan.

    If the resource %-modifiedSel% is true, modified fields are also displayed using %-inputColor%. . name inputMethod applies x type s switch -im description Specifies the name of the multi-byte input method. The default is specified by the XMODIFIERS environment variable, if set, or will be constructed by Xlib based on the current locale. . name intr applies a groups n type s default ^C description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When this character is typed on the keyboard, the TELNET IP (Interrupt Process) sequence is sent to the host. . name invertKeypadShift applies x type b default false description When true, causes the PF1-PF12 and PF13-PF24 keys on the pop-up keypad to be swapped. Normally, the low-numbered keys appear; when Shift, Alt, Ctrl or Meta is pressed, the high-numbered keys appear. With this resource true, that is reversed. . name keyFile applies u groups s type s switch -keyfile desc Gives the name of a file containg the private key for the certificate specified by %-certFile% or %-chainFile%. The default file type is PEM; it can be overridden by %-keyFileType%. If the private key is encrypted, the password is specified by %-keyPasswd%. (OpenSSL only) . name keyFileType applies u groups s type s default pem switch -keyfileType desc Gives the type of the private key file specified by %-keyFile%. The value can be pem or asn1. (OpenSSL only) . name keyHeight applies x groups a type i default 24 desc Defines the height of the keys on the pop-up keypad. . name keymap applies x C groups c type s switch -keymap description The name of the keyboard map to use. It can be a single keymap name or a comma-separated list of keymaps, which will be applied in order.

    Each keymap can optionally be defined in three separate parts: a common keymap, which is applied at all times, an NVT-mode keymap, which is applied only in NVT mode, and a 3270-mode keymap, which is only applied in 3270 mode. The NVT-mode keymap has the same name as the common keymap, with the suffix .nvt appended. The 3270-mode keymap has the suffix .3270 appended. Thus specifying a %-keymap% value of foo implies the use of three different keymaps (if found): foo, foo.nvt and foo.3270. if x

    After that, the string .user is appended to the keymap name and three more keymaps are searched for: foo.user, foo.user.nvt and foo.user.3270, for a total of six. endif

    if x If no %-keymap% is defined, the environment variables $KEYMAP and $KEYBD are checked, in that order, for the name. %-keymap% is only the name; the keymap definition for name foo is the resource %-keymap.foo%. endif if C %-keymap% is only the name; the actual keymap for name foo can be defined either by the resource %-keymap.foo%, or by a keymap file. if c The keymap file is not searched for in any particular location, nor does it have a special suffix, so %-keymap% can specify the full pathname of the keymap file. else Keymap files are located in the wc3270 documents directory (usually My Documents\wc3270) and have the suffix .wc3270km. endif endif . name keymap.foo applies x C type s description The definition of keymap foo. Please refer to the How To Create a Custom Keymap document for a full description of the syntax. . name keypad applies x groups a type s default right description. This controls the position of the pop-up keypad. It can have one of five values:

    • left, a pop-up window positioned to the left of the main %p% window
    • right, a pop-up window positioned to the right of the main x3270 window
    • bottom, a pop-up window positioned below the main %p% window
    • integral, making the keypad an extension of the bottom of the main window itself
    • insideRight, placing the keypad over the upper-right corner of the emulator window, just below the keypad button on the menu bar
    . name keypad.keyHeight applies x groups a type i default 24 description The height in pixels of all of the buttons on the keypad. . name keyPasswd applies u groups s type s switch -keypasswd desc On OpenSSL, gives the password for the private key file specified by %-keyFile%, if it is encrypted. The value can take one of two forms. file:filename specifies that the password is in a file. string:string gives the password value in the resource itself.

    On the Mac, this gives the password for the %-certfile% certifiate file. . name keyWidth applies x groups a type i default 48 description The width in pixels of the lower tier of buttons on a horizontal keypad. . name keypad.largeKeyWidth applies x groups a type i default 56 description The width in pixels of the lower tier of buttons on a vertical keypad. . name keypad.paWidth applies x groups a type i default 36 description The width in pixels of PA and cursor keys on the keypad. . name keypad.pfWidth applies x groups a type i default 32 description The width in pixels of PF keys on the keypad. . name keypadBackground applies x groups a type s default grey70 description On color X11 displays, this is the color of the empty area behind the buttons on the main window and keypad window. On monochrome X11 displays, these areas are filled with a 50% grey bitmap. . name keypadOn applies x type b groups a default false description If true, the keypad will automatically appear when %p% is started. . name kill applies a groups n type s default ^U description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be erased.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteField action. . name labelIcon applies x groups a type b default false description When %-activeIcon% is true, the twm window manager will not put a label on %p%'s icon. Setting %-labelIcon% to true causes %p% to supply its own label for the icon.

    The icon label is drawn using the font specified by %-iconLabelFont%. . name largeKeyWidth applies x groups a type i default 56 desc Defines the width of the "large" keys in the lower section of the pop-up keypad. . name lightPenPrimary applies wc groups i type b default false description Controls how a left mouse button works with the Alt key. When set to the default of false, clicking the left mouse button without a modifier will move the cursor or highlight an area for copy and paste. Clicking the left mouse button with Alt pressed will cause a lightpen select operation at the screen location where the mouse cursor is (it will not move the 3270 cursor).

    When set to true, these are reversed. The left mouse button without a modifier will do a lightpen select; with Alt it will move the cursor or select for copy and paste. . name lineWrap applies a groups n type b default true switch -set lineWrap switch -clear lineWrap option Options -> Toggles -> Wraparound description This setting is used only in NVT mode. When true, %p% will automatically insert a CR/LF sequence when output reaches the end of a line. When false, output will pile up at the end of each line until the host sends a CR/LF sequence. . name loginMacro applies a type s switch -loginmacro desc Defines a sequence of commands to run as soon as a host connection is established. Usually these would be commands used to navigate through login screens, such String, Tab and Enter.

    If a %-hostsFile% is in use and a matching entry is found, the login macro from that entry will be used in preference to the %-loginMacro%. . name lnext applies a groups n type s default ^V description This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name.

    When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard removes any special meaning from the next character entered. . name localCp applies ws type i desc Forces %p% to use the specified codepage in place of the system ANSI codepage. This codepage is used when interpreting keymap files and when generating trace files. . name lockedCursor applies x groups a type s default X_cursor description The name of the mouse cursor displayed with %p% is not connected to a host. . name m3279 applies a type b default true groups d switch -color description Deprecated resource -- replaced by %-model% syntax

    Indicates support for color (a 3279 terminal). . name macros applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to a host. The syntax is similar to a keymap (an X11 translation table), except that rather than a keysym name, the left-hand side is a name that will appear on the menu. A list of actions can be specified on the right-hand side.

    %-macros% defines a set of macros for all hosts. To specify a set of macros for host foo, use %-macros.foo%. . name macros.foo applies x type s description Defines a set of macros assigned to the Macros menu that appears when connected to host foo. It overrides the contents of %-macros%. See %-macros% for details on its syntax. . name marginedPaste applies x wc groups i type b default false switch -set marginedPaste switch -clear marginedPaste option Options -> Toggles -> Paste With Left Margin description When true, %p% will use the current cursor position as a left margin for pasted data: no pasted data will be input into an area to the left of the current cursor positon. . name maxRecent applies x groups i type i default 5 description The maximum number of entries in the Connect menu's recent host list. . name menuBar applies x wc groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% main window. if x The three pull-down menus are still available, however, by pressing Ctrl and each of the mouse buttons. endif . name menuBar applies c groups a type b default true description If false, the menu bar will not be displayed at the top of the %p% display, even if the terminal supports a mouse. . name metaEscape applies c type b default true desc When true, %p% will assume that pressing a key while holding down the Alt key will cause the terminal to transmit the ASCII ESC character (0x1b) before the key. Thus %p% will interpret ESC-x as Alt-x.

    When false, ESC is treated like any other input character. . name minVersion applies S type s switch -minversion description Defines a minimum required version for %p%. If the version of %p% is less than the specified version, it will abort.

    The format of a version is major.minortypeiteration, for example, 3.4ga5 or 3.5alpha2. The version can also be under-specified, such as 3.4 or 3, where the missing parts default to 0. The value of type is ignored, so 3.4ga5 and 3.4foo5 are considered equal. . name model applies a groups c type s default 3279-4-E switch -model option Options -> Screen Size description The terminal model that %p% is emulating. The model is in three parts, separated by dashes; each part is optional.

    • 3278 or 3279
      3278 specifies a monochrome (green) 3270 display. if x If used on a color X11 display, it will cause all fields to be drawn in green. 3278 is the default for monochrome X11 displays. endif
      3279 specifies a color 3270 display. if x This is the default for color X11 displays. endif
    • 2, 3, 4 or 5
      The model number, which determines the size of the screen.
      Model 2 has 24 rows and 80 columns.
      Model 3 has 32 rows and 80 columns.
      Model 4 has 43 rows and 80 columns.
      Model 5 has 27 rows and 132 columns.
      The default is if C the largest model that will fit on the console or terminal emulator window where %p% is running. Displaying the OIA (status line) requires one more row than what is listed above. else 4. endif
    • E
      An optional suffix which indicates support for the 3270 Extended Data Stream (color, extended attributes, Query Reply). 3279 implies E.
    . name modifiedSel applies x groups a type b default false description When true, modified fields are displayed in a different color than other modifiable fields. In 3278 mode, this color is the "input" (light pen selectable) color, defined by %-inputColor%. In 3279 mode, this is the color whose index is defined by %-modifiedSelColor%. When %-modifiedSel% is false, modified fields are displayed in the same colors as unmodified fields. . name modifiedSelColor applies x groups a type i default 10 description In 3279 mode, when %-modifiedSel% is true, this is index of the host color used to display modified fields. The default value of 10 corresponds to "orange". (See %-colorSchemes% for the host color index definitions.) . name mono applies x c type b default false switch -mono description if x If true, %p% will operate as if it were running on a monochrome X11 display. else If true, %p% will emulate a 3278, and will not use any of the terminal's color attributes. endif . name monoCase applies a type b default false switch -set monoCase switch -clear monoCase option Options -> Toggles -> Monocase description When true, causes %p% to run in uppercase-only mode. . name mouse applies c groups i type b default true description If true, enables %p% to accept mouse-control events on terminals and emulators that support them. This allows a left mouse click to move the cursor. On terminals like xterm and gnome-terminal, this means that the usual mouse selection actions must be performed with the Shift key pressed. If false, mouse-control events will not be enabled. . name newEnviron applies a type b default true description If true, %p% will respond to the TELNET NEW-ENVIRONMENT option. If false, it will not. . name noOther applies x groups s type b default false description If true, the "Other" options are disabled for selecting fonts and connecting to hosts, limiting users to the options provided on the menus. . name noPrompt applies C groups s type b default false desc If true, the interactive %p%> prompt will be disabled. In particular, this means that when %p% is not connected to a host, a keymap or an external script is the only way to start a new host connection. . name normalCursor applies x type s groups a default top_left_arrow desc Defines the mouse cursor that %p% uses when it is connected to a host, not waiting for the host to complete a command, and the keyboard is not locked. . name nopSeconds applies a type i groups i default 0 desc If nonzero, %p% will send a TELNET NOP to the host every n seconds. This can be used to keep host sessions running that would otherwise be terminated due to inactivity. . name normalColor applies x groups a type s default green desc On color X11 displays in 3278 mode, this is the color of normal-intensity text. On monochrome X11 displays, normal text uses the foreground color. . name numericLock applies a groups i type b default false desc When true, causes %p% to lock the keyboard when non-numeric data is entered into fields with the Numeric attribute. . name nvtMode applies a groups i type b default false switch -nvt desc When true, causes %p% to start immediately in NVT mode and allow keyboard input immediately, instead of waiting for the host to send data or negotiate 3270 mode. It also causes the default terminal type to be xterm.

    NVT mode can also be selected per session by prepending an A: onto the hostname. . name onlcr applies a groups n type b default true desc Used only in NVT line-at-a-time mode; similar to the stty parameter of the same name. It controls whether output newlines are mapped to CR/LF sequences. . name oerrLock applies a groups i type b default true desc If true, operator errors (typing into protected fields, insert overflow, etc.) will cause the keyboard to lock with an error message in the OIA (status line). If false, these errors will simply cause the terminal bell will ring, without any keyboard lock or message. . name once applies a type b default false switch -once desc When true, %p% will exit as soon as a host disconnects. The default is false if no hostname is specified on the command if x C line or in a session file, else line, endif true otherwise. . name overlayPaste applies wc x groups i type b default false switch -set overlayPaste switch -clear overlayPaste option Options -> Toggles -> Overlay Paste desc When true, the Paste action will overlay protected fields, instead of locking the keyboard and stopping. This means that when the cursor is on a protected field, a displayable character read from the paste buffer will simply cause the cursor to advance to the right; the actual character is ignored. This allows regions of the screen that include protected fields to be copied and pasted back into a formatted screens that include the same protected fields (i.e., a form).

    Note: Setting overlayPaste to true will cause %p% to act as if the %-marginedPaste% toggle were also set. . name oversize applies a type s switch -oversize desc Sets the screen dimensions to be larger than the default for the chosen model. Its value is a string in the format colsxrows. if C It can also be the string auto, which will cause %p% to use the entire screen area of the endif if c terminal. endif if wc console window it is running in. endif It is used only if the %-model% includes the "-E" (extended data stream) suffix, and only if the specified dimensions are larger than the model number defaults. Also, only hosts that support the Query Reply structured field will function properly with %p% in this mode. . name paWidth applies x groups a type i default 36 desc Defines the width of the PA keys in the lower section of the pop-up keypad. . name pfWidth applies x groups a type i default 32 desc Defines the width of the PF keys on the pop-up keypad. . name port applies a groups c type s default telnet switch -port desc The name of the default TCP port for %p% to connect to. This can be either a symbolic name from /etc/services, or an integer. . name proxy applies a groups c type s switch -proxy desc Defines a proxy server that %p% will use to connect to hosts. The value is of the form type:server[:port], where options for type are described on the %p% manual page. . name preeditType applies x type s default OverTheSpot+1 switch -pt desc The preedit type for the multi-byte input method. Valid values are OverTheSpot, OffTheSpot, Root and OnTheSpot. The value for OverTheSpot can include an optional suffix, a signed number indicating the vertical distance in rows of the preedit window from the cursor position, e.g. OverTheSpot+1 or OverTheSpot-2. . name printerLu type s applies x C groups c switch -printerlu desc If a value is set, %p% will automatically start a if u pr3287 else wpr3287 endif printer session when a host connection is established. If the value is ".", the if u pr3287 else wpr3287 endif session will be associated with the interactive terminal session (this requires that the host supports TN3270E). Otherwise, the value is taken as the LU name to associate with the printer session. . name printer.assocCommandLine applies x C type s if x c default pr3287 -assoc %L% -command %C% %R% %P% %V% %S% %O% %H% else default wpr3287.exe -assoc %L% -command %R% %P% %V% %S% %I% %O% %H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with the current TN3270E session LU (when %-printerLU% is "."). Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with the %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the current session's LU
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with the current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.codepage applies wc type i desc The codepage used by the printer associated with wpr3287 printer sessions. The default is to use the system's ANSI codepage. . name printer.command applies x c type s default lpr desc The name of the command supplied to the "-command" option of the pr3287 program to print each job. This is the text which is substituted for %C in %-printer.assocCommandLine% and %-printer.luCommandLine% resources. . name printer.luCommandLine applies x C type s if x c default pr3287 -command %C% %R% %P% %V% %S% %O% %L%@%H% else default wpr3287.exe %R% %P% %V% %S% %I% %O% %L%@%H% endif desc Note: This resource is for debug purposes only. To add optional parameters to the wc3270 command line, use %-printer.options.%

    The shell command to use to start a printer session, when associated with a specific LU. Within the string, the following substitutions are made:

      if x c
    • %C% is replaced with %-printer.command%
    • endif
    • %H% is replaced with the current host name
    • if wc
    • %I% is replaced with an option to pass %-printer.codepage%
    • endif
    • %L% is replaced with the LU value entered into the dialog box
    • %O% is replaced with the value of %-printer.options%
    • %P% is replaced with current session's proxy option (%-proxy%)
    • %R% is replaced with an option to pass the current character set
    • %S% is replaced with an option to pass the port of the sync socket
    • %V% is replaced with SSL-related options
    . name printer.name applies wc type s desc Defines the name of the printer used for wpr3287 sessions and by the PrintText action. The default is to use the system's default printer. . name printer.options applies x C type s desc Defines extra parameters to substutute for the %O% token in the printer command line. . name printTextCommand applies x c type s default lpr desc The shell command used by the PrintText action. An ASCII image of the 3270 display becomes the standard input to this command. if x If the first character of the command is '@', the usual pop-up windows before and after the text is printed will not appear. endif . name printTextFont applies wc type s default Courier New desc The font used by the PrintText action. . name printTextHorizontalMargin applies wc type i default 0.5 desc The left- and right-hand margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printTextOrientation applies wc type i desc The page orientation used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is either portrait or landscape. The default is to use whatever the printer's default is. . name printTextScreensPerPage applies wc c x type i default 1 desc The number of screens to display on a page when tracing screens to the printer. . name printTextSize applies wc type i default auto (GDI), 8 (WordPad) desc The font size used by the PrintText action. When using GDI printing, the default is to select the largest font that will fit across the page. When using WordPad for printing, the default is 8 points. . name printTextVerticalMargin applies wc type i default 0.5 desc The top and bottom margins used by the PrintText action when printing in GDI mode. (It is not used when printing via WordPad.) The value is in inches by default, but can be suffixed with mm or cm to specify SI units. . name printWindowCommand applies x type s default xwd -id %d | xpr | lpr desc The shell command used by the PrintWindow action. The X11 window identifier of the main x3270 window is substituted for any %d in the command. If the first character of the command is '@', the usual pop-up windows before and after the window is printed will not appear. . name qrBgColor applies C s tcl type b default false desc When true, %p% will report in the QueryReply(color) that it supports background color; when false, it will not. It is disabled by default because certain versions of GDDM are confused by this report and will crash. . name quit applies a groups n type s default ^\ desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the TELNET BREAK sequence to be sent to the host. . name reconnect applies x C type b default false desc When true, %p% will automatically reconnect to a host after it disconnects. . name rectangleSelect applies x groups i type b default false switch -set rectangleSelect switch -clear rectangleSelect option Options -> Toggles -> Select by Rectangles desc When true, %p% will always select rectangular areas of the screen. When false, %p% will select rectangular areas in 3270 mode, but in NVT mode it will select continuous areas of the screen like xterm. . name reverseVideo applies c type b groups a default false option -rv desc When true, %p% will use a white background instead of a black one. . name rprnt applies a groups n type s default ^R desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard causes the current input line to be redisplayed. . name saveLines applies x C type i default 4096 switch -sl desc The number of display lines to save for the scroll bar. Note that the scroll bar operates on full screens of data, so the value divided by the number of rows on the screen gives you the number of screens that will be saved. . name sbcsCgcsgid applies a groups p type s desc Overrides the compiled-in value of the CGCSGID for the current host character set. The value is an integer, which can be prefixed with '0x' to be in hexadecimal. The upper 16 bits are the GCSGID (character set) and the lower 16 bits are the CPGID (code page). This value applies only to the single-byte (SBCS) character set. Use %-dbcsCgcsgid% for the double-byte (DBCS) character set. . name schemeList applies x type s desc Lists the options on the Color Scheme menu. Can contain '>' characters to indicate a menu hierarchy. The format of the list is one entry per line, each line containing the menu label, a colon and the name of the color scheme. . name screenTrace applies a groups t type b default false switch -set screenTrace switch -clear screenTrace option File -> Save Screen(s) in File desc When true, %p% will save an ASCII version of the screen image in a file every time it changes. The file name defaults to if u x3scr.pid. else x3scr.pid.txt. endif The directory where the file is written is defined by %-traceDir%. If %-screenTraceFile% is defined, it defines the file name and %-traceDir% is ignored. if w file name. endif . name screenTraceFile applies a groups t type s desc If defined, gives the name of the file that screen traces will be written into. . name scripted applies x type b default false switch -script desc When true, %p% will read commands from standard input. The rules for these commands are documented in the x3270-script manual page. . name scriptPort applies a type i switch -scriptport desc If defined, %p% will accept script connections on the specified local TCP port. The rules for the commands passed over these connections are documented in the x3270-script manual page. The syntax of this resource is [address:]port, where address is an IPv4 or IPv6 address such as 127.0.0.1 or 0.0.0.0, and port is a TCP port such as 4081. The address can also be specified as * to indicate 0.0.0.0. A numeric IPv6 address must be enclosed in square brackets, e.g., [1234:5678::3], to avoid ambiguity between the colons inside the address and the colon separating the address from the port. If no address is specified, it defaults to 127.0.0.1. . name scriptPortOnce applies a type b default false switch -scriptportonce desc If defined, %p% will accept only one script connection. When that connection is broken, it will exit. . name scrollBar applies x type b default false switch -sb switch +sb switch -set scrollBar switch -clear scrollBar desc When true, %p% will display a scroll bar to the right of the emulator window. . name secure applies x groups s type b default false desc When true, %p% will prevent users from executing arbitrary commands from within the program. In particular, the File -> Execute an Action menu option is disabled, as are the pop-ups which allow editing the commands for File -> Print Screen Text and File -> Print Window Bitmap, and %-disconnectClear% is true. See %-noOther% and %-suppressActions% for additional security options. . name selectBackground applies x groups a type s default dimGrey desc On color X11 displays, this is the background color used for selected text (text highlighted with the mouse for cut and paste). On monochrome X11 displays, selected text is in reverse video. . name showTiming applies x groups a type b default false switch -set showTiming switch -clear showTiming option Options -> Toggles -> Show Timing desc When true, %p% will display on the OIA (status line) the time that the host takes to unlock the keyboard after an AID is sent. . name socket applies u type b default false switch -socket desc When true, %p% will create a Unix-domain socket than can be used by an external script to control the session. The name of the socket is /tmp/x3sck.pid. The -p option of the x3270if command can be used to connect to this socket. . name startTls applies a type b groups s default true description If true, %p% will accept the TELNET STARTTLS negotiation from the host. If false, it will reject them. . name *suppress applies x groups s type b desc When true, suppresses a menu item. For example, setting x3270*executeActionOption.suppress to true will remove the Execute an Action option on the File menu. The names of the menu items are:
       aboutMenu.aboutConfig.suppress
       aboutMenu.aboutCopyright.suppress
       aboutMenu.aboutStatus.suppress
       fileMenu.abortScriptOption.suppress
       fileMenu.aboutOption.suppress
       fileMenu.disconnectOption.suppress
       fileMenu.executeActionOption.suppress
       fileMenu.exitOption.suppress
       fileMenu.ftOption.suppress
       fileMenu.printerOption.suppress
       fileMenu.printWindowOption.suppress
       fileMenu.saveOption.suppress
       fileMenu.screenTraceOption.suppress
       fileMenu.traceOption.suppress
       modelsMenu.model2Option.suppress
       modelsMenu.model3Option.suppress
       modelsMenu.model4Option.suppress
       modelsMenu.model5Option.suppress
       modelsMenu.oversizeOption.suppress
       optionsMenu.charsetOption.suppress
       optionsMenu.colorsOption.suppress
       optionsMenu.fontsOption.suppress
       optionsMenu.idleCommandOption.suppress
       optionsMenu.keymapDisplayOption.suppress
       optionsMenu.keymapOption.suppress
       optionsMenu.modelsOption.suppress
       optionsMenu.togglesOption.suppress
       printerMenu.assocButton.suppress
       printerMenu.luButton.suppress
       printerMenu.printerOffButton.suppress
       togglesMenu.blankFillOption.suppress
       togglesMenu.blockCursorOption.suppress
       togglesMenu.characterModeOption.suppress
       togglesMenu.crosshairOption.suppress
       togglesMenu.cursorBlinkOption.suppress
       togglesMenu.cursorPosOption.suppress
       togglesMenu.extendedDsOption.suppress
       togglesMenu.lineModeOption.suppress
       togglesMenu.lineWrapOption.suppress
       togglesMenu.m3278Option.suppress
       togglesMenu.m3279Option.suppress
       togglesMenu.marginedPasteOption.suppress
       togglesMenu.monocaseOption.suppress
       togglesMenu.overlayPasteOption.suppress
       togglesMenu.rectangleSelectOption.suppress
       togglesMenu.scrollBarOption.suppress
       togglesMenu.showTimingOption.suppress
       togglesMenu.underlineCursorOption.suppress
       togglesMenu.visibleControlOption.suppress . name suppressActions applies a groups s type s desc A list of whitespace-separated action names, with or without parentheses, which are to be ignored. The actions will be completely inaccessible, whether by keymaps, scripts, macros or the Execute an Action menu option. This resource is intended to be used as a security precaution for users who can define their own keymaps, but who do not have access to resource definitions or command-line options. . name suppressFontMenu applies x type b default false desc If true, the Options -> Font menu will not be displayed. . name suppressHost applies x type b default false desc If true, %p% will omit the hostname from the File -> About %p% -> Connection Status pop-up. . name termName applies a groups p type s switch -tn desc An alternate name to be sent in response to the host's TELNET DO OPTION TERMINAL-NAME request. The default is IBM-, followed by the value of %-model%. . name title applies x wc groups a type s switch -title desc Sets the title for the %p% window, overriding the default of constructing the name from the host that is connected to. . name trace applies a groups t type b default false switch -trace switch -set trace switch -clear trace option File -> Trace Data and Events description When true, %p% writes information about events and actions, as well as a hexadecimal representation of all network traffic (and its interpretation) into a file, which defaults to if u x3trc.pid. else x3trc.process-id.txt. endif if x wc It also pops up a window to watch the file as it is created, with the pathname of the file as the window title. endif if x The command run in the window is defined by %-traceCommand%. endif The directory where the file is written is defined by %-traceDir%. If %-traceFile% is defined, it gives the entire pathname and %-traceDir% is ignored. . name traceCommand applies x type s default tail -f desc Defines the command that runs in the trace window. . name traceDir applies a groups t type s if u default /tmp endif if wc default current user's Desktop endif if ws default current directory endif desc Defines the directory that trace files are written into. . name traceFile applies a groups t type s switch -tracefile desc If defined, gives the name of the file that data stream and event traces will be written into. If it begins with ">>", data will be appended to the file. if x If given the value stdout, traces will be written to standard output. If given the value none, then the traces will be piped directory to the monitor window, and no file will be created. endif . name traceFileSize applies a groups t type s switch -tracefilesize desc If defined, gives a limit on the size of the file that data stream and event traces will be written into. If not defined, or defined as 0, there will be no limit on the size of the file. The value is a number, followed by an optional suffix. If the suffix is K (e.g., 128K), the value will be multiplied by 1024. If the suffix is M, the value will be multiplied by (1024*1024). The size limit enforced at operation boundaries, not per byte, so the actual file may grow slightly larger. When the file size exceeds the limit, the trace file will be renamed with a "-" appended and a new file started. . name traceMonitor applies x wc groups t type b default true desc When true, %p% will create a window to monitor data stream and event traces. When false, no monitor window will be if x created (and the value of none for %-traceFile% will be considered invalid). else created. endif . name typeahead applies w C type b default true desc When true, %p% will store keystrokes in a buffer when the keyboard is locked. When false, these keystrokes will be dropped. . name underscore applies C groups a type b if c default false else default true endif switch -set underscore switch -clear underscore desc When true, %p% will display fields with the underlined attribute in a special way: blank characters will be translated to underscore (_) characters. This is needed if c on terminals that else to overcome the fact that Windows consoles endif are unable to display real underlined text. . name unlockDelay applies x c wc type b default true desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% implements a hack to briefly delay actually unlocking the keyboard. When %-unlockDelay% is true (the default), the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. Setting it to false removes this delay. . name unlockDelay applies s ws tcl type b default false desc When %p% sends the host an AID (the Enter, Clear, PF or PA actions), it locks the keyboard until the host sends a reply to unlock it. Some hosts unlock the keyboard before they are actually finished processing the command, which can cause scripts to malfunction subtly. To avoid this, %p% can implement a hack to briefly delay actually unlocking the keyboard. When set to false (the default), there is no delay. When set to true, the keyboard unlock will be delayed for %-unlockDelayMs% milliseconds. . name unlockDelayMs applies a type i default 350 desc Overrides the default value for the unlock delay (the delay between the host unlocking the keyboard and %p% actually performing the unlock). The value is in milliseconds; use 0 to turn off the delay completely, including for macros. . name useCursorColor applies x groups a type b default false desc If false, the cursor will be drawn using the same color as the text behind it. If true, on color X11 displays the cursor will be drawn with the color specified by %-cursorColor%. . name user applies a type s switch -user groups p description Specifies the user name sent in response to a TELNET NEW-ENVIRON sub-negotiation request, used by iSeries hosts (RFC 4777). . name utf8 applies S type b switch -utf8 description Forces local I/O to use UTF-8 encoding, regardless of the local codepage. . name verifyHostCert applies a type b groups s switch -noverifycert switch -verifycert default true description If true (the default), %p% will verify SSL/TLS host certificates, and not allow an SSL/TLS connection to complete unless the host certificate can be validated. If false, %p% will not verify SSL/TLS host certificates.

    This resource is overridden by a y: prepended to the hostname when connecting, which disables certificate checking. . name visibleControl applies x C type b default false switch -set visibleControl switch -clear visibleControl option Options -> Toggles -> Visible Control Characters desc If true, certain control characters, which are normally displayed as blanks, are displayed on the screen.

    EBCDIC control characters, if x c displayed with underlines, endif are as follows:
    Character Meaning
    . NUL (X'00')
    < The SO character (begins a DBCS subfield)
    > The SI character (ends a DBCS subfield)

    3270 field attributes, if x c displayed in yellow with underlines, endif if wc displayed in reverse-video yellow, endif are decoded as follows:

    Character Protected Numeric Display Selectable Modified
    0 - - normal - -
    1 - - normal - modified
    2 - - normal selectable -
    3 - - normal selectable modified
    4 - - intensified selectable -
    5 - - intensified selectable modified
    6 - - nondisplay - -
    7 - - nondisplay - modified
    8 - numeric normal - -
    9 - numeric normal - modified
    A - numeric normal selectable -
    B - numeric normal selectable modified
    C - numeric intensified selectable -
    D - numeric intensified selectable modified
    E - numeric nondisplay - -
    F - numeric nondisplay - modified
    G protected - normal - -
    H protected - normal - modified
    I protected - normal selectable -
    J protected - normal selectable modified
    K protected - intensified selectable -
    L protected - intensified selectable modified
    M protected - nondisplay - -
    N protected - nondisplay - modified
    O protected numeric normal - -
    P protected numeric normal - modified
    Q protected numeric normal selectable -
    R protected numeric normal selectable modified
    S protected numeric intensified selectable -
    T protected numeric intensified selectable modified
    U protected numeric nondisplay - -
    V protected numeric nondisplay - modified
    . name visualBell applies x groups i type b default false desc When true, %p% will flash the screen in response to an ALARM WCC or BELL character, rather than ringing the terminal's bell. . name visualBell applies wc groups i type b default false desc Deprecated resource -- replaced by %-bellMode%

    When true, %p% will just flash the screen in response to an ALARM WCC or BELL character, rather than beeping the Windows console. When false, %p% will beep the console and flash the screen.

    Note that this resource is overridden by %-bellMode%. %-bellMode% is the preferred method of controlling the console bell behavior. . name visualSelect applies x groups a type b default false desc This resource controls how %p% displays light pen selectable fields that do not have a color explicitly set by the host. When true, %p% will display these fields using the color defined by %-visualSelectColor%. When false, %p% will display these fields based on their highlighting attribute. This attribute is used only in 3279 mode. . name visualSelectColor applies x groups a type i default 6 desc The host color index of the color to use to display light pen selectable fields. This resource is used only if %-visualSelect% is true. The default is 6 (yellow). . name waitCursor applies x groups a type s default watch desc The name of the mouse cursor displayed when %p% is connected to a host, but is unable to process keyboard input. Cursor names are in the file <X11/cursorfont.h>. . name werase applies a groups n type s default ^W desc This setting is used only in NVT mode, and is similar in function to the stty parameter of the same name. When connected in line-at-a-time mode (when %p% gathers a line of input before forwarding it to the host), entering this character at the keyboard erases the last word of input.

    When connected in character-at-a-time mode (when %p% sends each keystroke to the host), this is the ASCII character that is sent to the host by the DeleteWord action. . EOF suite3270-3.6/x3270/resources.c0000664000076500007650000004657513221577164014157 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR * GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * resources.c * Resource definitions for x3270. */ #include "globals.h" #include "appres.h" #include "resources.h" #include "xappres.h" #include #include "resourcesc.h" #define offset(field) XtOffset(AppResptr, field) XtResource resources[] = { { ResSaveLines, ClsSaveLines, XtRInt, sizeof(int), offset(interactive.save_lines), XtRString, "4096" }, { ResUnlockDelayMs, ClsUnlockDelayMs, XtRInt, sizeof(int), offset(unlock_delay_ms), XtRString, "350" }, { ResScriptPort, ClsScriptPort, XtRString, sizeof(String), offset(script_port), XtRString, 0 }, { ResHttpd, ClsHttpd, XtRString, sizeof(String), offset(httpd_port), XtRString, 0 }, { ResLoginMacro, ClsLoginMacro, XtRString, sizeof(String), offset(login_macro), XtRString, 0 }, { ResOversize, ClsOversize, XtRString, sizeof(char *), offset(oversize), XtRString, 0 }, { ResConfDir, ClsConfDir, XtRString, sizeof(char *), offset(conf_dir), XtRString, LIBX3270DIR }, { ResModel, ClsModel, XtRString, sizeof(char *), offset(model), XtRString, #if defined(RESTRICT_3279) /*[*/ "3279-3-E" #else /*][*/ "3279-4-E" #endif /*]*/ }, { ResKeymap, ClsKeymap, XtRString, sizeof(char *), offset(interactive.key_map), XtRString, 0 }, { ResComposeMap, ClsComposeMap, XtRString, sizeof(char *), offset(interactive.compose_map), XtRString, "latin1" }, { ResHostsFile, ClsHostsFile, XtRString, sizeof(char *), offset(hostsfile), XtRString, 0 }, { ResPort, ClsPort, XtRString, sizeof(char *), offset(port), XtRString, "telnet" }, { ResCharset, ClsCharset, XtRString, sizeof(char *), offset(charset), XtRString, "bracket" }, { ResSbcsCgcsgid, ClsSbcsCgcsgid, XtRString, sizeof(char *), offset(sbcs_cgcsgid), XtRString, 0 }, { ResTermName, ClsTermName, XtRString, sizeof(char *), offset(termname), XtRString, 0 }, { ResDevName, ClsDevName, XtRString, sizeof(char *), offset(devname), XtRString, 0 }, { ResUser, ClsUser, XtRString, sizeof(char *), offset(user), XtRString, 0 }, { ResMacros, ClsMacros, XtRString, sizeof(char *), offset(macros), XtRString, 0 }, { ResTraceDir, ClsTraceDir, XtRString, sizeof(char *), offset(trace_dir), XtRString, "/tmp" }, { ResTraceFile, ClsTraceFile, XtRString, sizeof(char *), offset(trace_file), XtRString, 0 }, { ResTraceFileSize, ClsTraceFileSize, XtRString, sizeof(char *), offset(trace_file_size), XtRString, 0 }, { ResScreenTraceFile, ClsScreenTraceFile, XtRString, sizeof(char *), offset(screentrace_file), XtRString, 0 }, { ResConnectFileName, ClsConnectFileName, XtRString, sizeof(String), offset(connectfile_name), XtRString, "~/.x3270connect" }, { ResIdleCommand, ClsIdleCommand, XtRString, sizeof(String), offset(idle_command), XtRString, 0 }, { ResIdleTimeout, ClsIdleTimeout, XtRString, sizeof(String), offset(idle_timeout), XtRString, 0 }, { ResProxy, ClsProxy, XtRString, sizeof(String), offset(proxy), XtRString, 0 }, { ResHostname, ClsHostname, XtRString, sizeof(String), offset(hostname), XtRString, 0 }, { ResMaxRecent, ClsMaxRecent, XtRInt, sizeof(int), offset(max_recent), XtRString, "5" }, { ResSuppressActions, ClsSuppressActions, XtRString, sizeof(String), offset(suppress_actions), XtRString, 0 }, { ResCrosshairColor, ClsCrosshairColor, XtRString, sizeof(String), offset(interactive.crosshair_color), XtRString, "purple" }, { ResConnectTimeout, ClsConnectTimeout, XtRInt, sizeof(int), offset(connect_timeout), XtRString, "0" }, { ResNopSeconds, ClsNopSeconds, XtRInt, sizeof(int), offset(nop_seconds), XtRString, "0" }, { ResErase, ClsErase, XtRString, sizeof(char *), offset(linemode.erase), XtRString, "^?" }, { ResKill, ClsKill, XtRString, sizeof(char *), offset(linemode.kill), XtRString, "^U" }, { ResWerase, ClsWerase, XtRString, sizeof(char *), offset(linemode.werase), XtRString, "^W" }, { ResRprnt, ClsRprnt, XtRString, sizeof(char *), offset(linemode.rprnt), XtRString, "^R" }, { ResLnext, ClsLnext, XtRString, sizeof(char *), offset(linemode.lnext), XtRString, "^V" }, { ResIntr, ClsIntr, XtRString, sizeof(char *), offset(linemode.intr), XtRString, "^C" }, { ResQuit, ClsQuit, XtRString, sizeof(char *), offset(linemode.quit), XtRString, "^\\" }, { ResEof, ClsEof, XtRString, sizeof(char *), offset(linemode.eof), XtRString, "^D" }, { ResPrinterLu, ClsPrinterLu, XtRString, sizeof(char *), offset(interactive.printer_lu), XtRString, 0 }, { ResDbcsCgcsgid, ClsDbcsCgcsgid, XtRString, sizeof(char *), offset(dbcs_cgcsgid), XtRString, 0 }, { ResAcceptHostname, ClsAcceptHostname, XtRString, sizeof(char *), offset(ssl.accept_hostname), XtRString, 0 }, { ResCaDir, ClsCaDir, XtRString, sizeof(char *), offset(ssl.ca_dir), XtRString, 0 }, { ResCaFile, ClsCaFile, XtRString, sizeof(char *), offset(ssl.ca_file), XtRString, 0 }, { ResCertFile, ClsCertFile, XtRString, sizeof(char *), offset(ssl.cert_file), XtRString, 0 }, { ResCertFileType, ClsCertFileType, XtRString, sizeof(char *), offset(ssl.cert_file_type), XtRString, 0 }, { ResChainFile, ClsChainFile, XtRString, sizeof(char *), offset(ssl.chain_file), XtRString, 0 }, { ResKeyFile, ClsKeyFile, XtRString, sizeof(char *), offset(ssl.key_file), XtRString, 0 }, { ResKeyFileType, ClsKeyFileType, XtRString, sizeof(char *), offset(ssl.key_file_type), XtRString, 0 }, { ResKeyPasswd, ClsKeyPasswd, XtRString, sizeof(char *), offset(ssl.key_passwd), XtRString, 0 }, { ResDftBufferSize, ClsDftBufferSize, XtRInt, sizeof(int), offset(ft.dft_buffer_size_bc), XtRString, 0 }, /* deprecated */ { ResFtAllocation, ClsFtAllocation, XtRString, sizeof(char *), offset(ft.allocation), XtRString, 0 }, { ResFtAvblock, ClsFtAvblock, XtRInt, sizeof(int), offset(ft.avblock), XtRString, "0" }, { ResFtBlksize, ClsFtBlksize, XtRInt, sizeof(int), offset(ft.blksize), XtRString, "0" }, { ResFtBufferSize, ClsFtBufferSize, XtRInt, sizeof(int), offset(ft.dft_buffer_size), XtRString, 0 }, { ResFtCr, ClsFtCr, XtRString, sizeof(char *), offset(ft.cr), XtRString, 0 }, { ResFtDirection, ClsFtDirection, XtRString, sizeof(char *), offset(ft.direction), XtRString, 0 }, { ResFtExist, ClsFtExist, XtRString, sizeof(char *), offset(ft.exist), XtRString, 0 }, { ResFtHost, ClsFtHost, XtRString, sizeof(char *), offset(ft.host), XtRString, 0 }, { ResFtHostFile, ClsFtHostFile, XtRString, sizeof(char *), offset(ft.host_file), XtRString, 0 }, { ResFtLocalFile, ClsFtLocalFile, XtRString, sizeof(char *), offset(ft.local_file), XtRString, 0 }, { ResFtLrecl, ClsFtLrecl, XtRInt, sizeof(int), offset(ft.lrecl), XtRString, "0" }, { ResFtMode, ClsFtMode, XtRString, sizeof(char *), offset(ft.mode), XtRString, 0 }, { ResFtPrimarySpace, ClsFtPrimarySpace, XtRInt, sizeof(int), offset(ft.primary_space), XtRString, "0" }, { ResFtRecfm, ClsFtRecfm, XtRString, sizeof(char *), offset(ft.recfm), XtRString, 0 }, { ResFtRemap, ClsFtRemap, XtRString, sizeof(char *), offset(ft.remap), XtRString, 0 }, { ResFtSecondarySpace, ClsFtSecondarySpace, XtRInt, sizeof(int), offset(ft.secondary_space), XtRString, "0" }, }; #undef offset Cardinal num_resources = XtNumber(resources); #define offset(field) XtOffset(xappresptr_t, field) #define boffset(field) XtOffset(xappresptr_t, bools.field) #define btoffset(index) boffset(toggle[index]) XtResource xresources[] = { { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(foreground), XtRString, "XtDefaultForeground" }, { XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel), offset(background), XtRString, "XtDefaultBackground" }, { ResNormalCursor, ClsNormalCursor, XtRCursor, sizeof(Cursor), offset(normal_mcursor), XtRString, "top_left_arrow" }, { ResWaitCursor, ClsWaitCursor, XtRCursor, sizeof(Cursor), offset(wait_mcursor), XtRString, "watch" }, { ResLockedCursor, ClsLockedCursor, XtRCursor, sizeof(Cursor), offset(locked_mcursor), XtRString, "X_cursor" }, { ResColorBackground, ClsColorBackground, XtRString, sizeof(String), offset(colorbg_name), XtRString, "black" }, { ResSelectBackground, ClsSelectBackground, XtRString, sizeof(String), offset(selbg_name), XtRString, "dim gray" }, { ResNormalColor, ClsNormalColor, XtRString, sizeof(String), offset(normal_name), XtRString, "green" }, { ResInputColor, ClsInputColor, XtRString, sizeof(String), offset(select_name), XtRString, "green" }, { ResBoldColor, ClsBoldColor, XtRString, sizeof(String), offset(bold_name), XtRString, "green" }, { ResCursorColor, ClsCursorColor, XtRString, sizeof(String), offset(cursor_color_name), XtRString, "red" }, { ResKeypad, ClsKeypad, XtRString, sizeof(String), offset(keypad), XtRString, KpRight }, { ResKeypadOn, ClsKeypadOn, XtRBoolean, sizeof(Boolean), offset(keypad_on), XtRString, ResFalse }, { ResAplCircledAlpha, ClsAplCircledAlpha, XtRBoolean, sizeof(Boolean), offset(apl_circled_alpha), XtRString, ResFalse }, { ResInvertKeypadShift, ClsInvertKeypadShift, XtRBoolean, sizeof(Boolean), offset(invert_kpshift), XtRString, ResFalse }, { ResActiveIcon, ClsActiveIcon, XtRBoolean, sizeof(Boolean), offset(active_icon), XtRString, ResFalse }, { ResLabelIcon, ClsLabelIcon, XtRBoolean, sizeof(Boolean), offset(label_icon), XtRString, ResFalse }, { ResKeypadBackground, ClsKeypadBackground, XtRString, sizeof(String), offset(keypadbg_name), XtRString, "grey70" }, { ResEmulatorFont, ClsEmulatorFont, XtRString, sizeof(char *), offset(efontname), XtRString, 0 }, { ResUseCursorColor, ClsUseCursorColor, XtRBoolean, sizeof(Boolean), offset(use_cursor_color), XtRString, ResFalse }, { ResVisualSelect, ClsVisualSelect, XtRBoolean, sizeof(Boolean), offset(visual_select), XtRString, ResFalse }, { ResSuppressHost, ClsSuppressHost, XtRBoolean, sizeof(Boolean), offset(suppress_host), XtRString, ResFalse }, { ResSuppressFontMenu, ClsSuppressFontMenu, XtRBoolean, sizeof(Boolean), offset(suppress_font_menu), XtRString, ResFalse }, { ResAllowResize, ClsAllowResize, XtRBoolean, sizeof(Boolean), offset(allow_resize), XtRString, ResTrue }, { ResNoOther, ClsNoOther, XtRBoolean, sizeof(Boolean), offset(no_other), XtRString, ResFalse }, { ResBellVolume, ClsBellVolume, XtRInt, sizeof(int), offset(bell_volume), XtRString, "0" }, { ResCharClass, ClsCharClass, XtRString, sizeof(char *), offset(char_class), XtRString, 0 }, { ResModifiedSelColor, ClsModifiedSelColor, XtRInt, sizeof(int), offset(modified_sel_color), XtRString, "10" }, { ResVisualSelectColor, ClsVisualSelectColor, XtRInt, sizeof(int), offset(visual_select_color), XtRString, "6" }, { ResIconFont, ClsIconFont, XtRString, sizeof(char *), offset(icon_font), XtRString, "nil2" }, { ResIconLabelFont, ClsIconLabelFont, XtRString, sizeof(char *), offset(icon_label_font), XtRString, "8x13" }, { ResFixedSize, ClsFixedSize, XtRString, sizeof(char *), offset(fixed_size), XtRString, 0 }, { ResColorScheme, ClsColorScheme, XtRString, sizeof(String), offset(color_scheme), XtRString, "default" }, { ResInputMethod, ClsInputMethod, XtRString, sizeof(char *), offset(input_method), XtRString, 0 }, { ResPreeditType, ClsPreeditType, XtRString, sizeof(char *), offset(preedit_type), XtRString, PT_OVER_THE_SPOT "+1" }, #if defined(USE_APP_DEFAULTS) /*[*/ { ResAdVersion, ClsAdVersion, XtRString, sizeof(char *), offset(ad_version), XtRString, 0 }, #endif /*]*/ { ResMono, ClsMono, XtRBoolean, sizeof(Boolean), boffset(interactive.mono), XtRString, ResFalse }, { ResExtended, ClsExtended, XtRBoolean, sizeof(Boolean), boffset(extended), XtRString, ResTrue }, { ResM3279, ClsM3279, XtRBoolean, sizeof(Boolean), boffset(m3279), XtRString, ResTrue }, { ResMenuBar, ClsMenuBar, XtRBoolean, sizeof(Boolean), boffset(interactive.menubar), XtRString, ResTrue }, { ResVisualBell, ClsVisualBell, XtRBoolean, sizeof(Boolean), boffset(interactive.visual_bell), XtRString, ResFalse }, { ResAplMode, ClsAplMode, XtRBoolean, sizeof(Boolean), boffset(apl_mode), XtRString, ResFalse }, { ResOnce, ClsOnce, XtRBoolean, sizeof(Boolean), boffset(once), XtRString, ResFalse }, { ResScripted, ClsScripted, XtRBoolean, sizeof(Boolean), boffset(scripted), XtRString, ResFalse }, { ResModifiedSel, ClsModifiedSel, XtRBoolean, sizeof(Boolean), boffset(modified_sel), XtRString, ResFalse }, { ResUnlockDelay, ClsUnlockDelay, XtRBoolean, sizeof(Boolean), boffset(unlock_delay), XtRString, ResTrue }, { ResBindLimit, ClsBindLimit, XtRBoolean, sizeof(Boolean), boffset(bind_limit), XtRString, ResTrue }, { ResBindUnlock, ClsBindUnlock, XtRBoolean, sizeof(Boolean), boffset(bind_unlock), XtRString, ResFalse }, { ResNewEnviron, ClsNewEnviron, XtRBoolean, sizeof(Boolean), boffset(new_environ), XtRString, ResTrue }, { ResSocket, ClsSocket, XtRBoolean, sizeof(Boolean), boffset(socket), XtRString, ResFalse }, { ResReconnect, ClsReconnect, XtRBoolean, sizeof(Boolean), boffset(interactive.reconnect), XtRString, ResFalse }, { ResDoConfirms, ClsDoConfirms, XtRBoolean, sizeof(Boolean), boffset(interactive.do_confirms), XtRString, ResTrue }, { ResNumericLock, ClsNumericLock, XtRBoolean, sizeof(Boolean), boffset(numeric_lock), XtRString, ResFalse }, { ResSecure, ClsSecure, XtRBoolean, sizeof(Boolean), boffset(secure), XtRString, ResFalse }, { ResOerrLock, ClsOerrLock, XtRBoolean, sizeof(Boolean), boffset(oerr_lock), XtRString, ResTrue }, { ResTypeahead, ClsTypeahead, XtRBoolean, sizeof(Boolean), boffset(typeahead), XtRString, ResTrue }, { ResDebugTracing, ClsDebugTracing, XtRBoolean, sizeof(Boolean), boffset(debug_tracing), XtRString, ResTrue }, { ResDisconnectClear, ClsDisconnectClear, XtRBoolean, sizeof(Boolean), boffset(disconnect_clear), XtRString, ResFalse }, { ResHighlightBold, ClsHighlightBold, XtRBoolean, sizeof(Boolean), boffset(highlight_bold), XtRString, ResFalse }, { ResColor8, ClsColor8, XtRBoolean, sizeof(Boolean), boffset(color8), XtRString, ResFalse }, { ResBsdTm, ClsBsdTm, XtRBoolean, sizeof(Boolean), boffset(bsd_tm), XtRString, ResFalse }, { ResTraceMonitor, ClsTraceMonitor, XtRBoolean, sizeof(Boolean), boffset(trace_monitor), XtRString, ResTrue }, { ResIdleCommandEnabled, ClsIdleCommandEnabled, XtRBoolean, sizeof(Boolean), boffset(idle_command_enabled), XtRString, ResFalse }, { ResNvtMode, ClsNvtMode, XtRBoolean, sizeof(Boolean), boffset(nvt_mode), XtRString, ResFalse }, { ResScriptPortOnce, ClsScriptPortOnce, XtRBoolean, sizeof(Boolean), boffset(script_port_once), XtRString, ResFalse }, { ResMonoCase, ClsMonoCase, XtRBoolean, sizeof(Boolean), btoffset(MONOCASE), XtRString, ResFalse }, { ResAltCursor, ClsAltCursor, XtRBoolean, sizeof(Boolean), btoffset(ALT_CURSOR), XtRString, ResFalse }, { ResCursorBlink, ClsCursorBlink, XtRBoolean, sizeof(Boolean), btoffset(CURSOR_BLINK), XtRString, ResFalse }, { ResShowTiming, ClsShowTiming, XtRBoolean, sizeof(Boolean), btoffset(SHOW_TIMING), XtRString, ResFalse }, { ResCursorPos, ClsCursorPos, XtRBoolean, sizeof(Boolean), btoffset(CURSOR_POS), XtRString, ResTrue }, { ResTrace, ClsTrace, XtRBoolean, sizeof(Boolean), btoffset(TRACING), XtRString, ResFalse }, { ResDsTrace, ClsDsTrace, XtRBoolean, sizeof(Boolean), boffset(dsTrace_bc), XtRString, ResFalse }, { ResEventTrace, ClsEventTrace, XtRBoolean, sizeof(Boolean), boffset(eventTrace_bc), XtRString, ResFalse }, { ResScrollBar, ClsScrollBar, XtRBoolean, sizeof(Boolean), btoffset(SCROLL_BAR), XtRString, ResTrue }, { ResLineWrap, ClsLineWrap, XtRBoolean, sizeof(Boolean), btoffset(LINE_WRAP), XtRString, ResTrue }, { ResBlankFill, ClsBlankFill, XtRBoolean, sizeof(Boolean), btoffset(BLANK_FILL), XtRString, ResFalse }, { ResScreenTrace, ClsScreenTrace, XtRBoolean, sizeof(Boolean), btoffset(SCREEN_TRACE), XtRString, ResFalse }, { ResMarginedPaste, ClsMarginedPaste, XtRBoolean, sizeof(Boolean), btoffset(MARGINED_PASTE), XtRString, ResFalse }, { ResRectangleSelect, ClsRectangleSelect, XtRBoolean, sizeof(Boolean), btoffset(RECTANGLE_SELECT), XtRString, ResFalse }, { ResCrosshair, ClsCrosshair, XtRBoolean, sizeof(Boolean), btoffset(CROSSHAIR), XtRString, ResFalse }, { ResVisibleControl, ClsVisibleControl, XtRBoolean, sizeof(Boolean), btoffset(VISIBLE_CONTROL), XtRString, ResFalse }, { ResAidWait, ClsAidWait, XtRBoolean, sizeof(Boolean), btoffset(AID_WAIT), XtRString, ResTrue }, { ResOverlayPaste, ClsOverlayPaste, XtRBoolean, sizeof(Boolean), btoffset(OVERLAY_PASTE), XtRString, ResFalse }, { ResIcrnl, ClsIcrnl, XtRBoolean, sizeof(Boolean), boffset(linemode.icrnl), XtRString, ResTrue }, { ResInlcr, ClsInlcr, XtRBoolean, sizeof(Boolean), boffset(linemode.inlcr), XtRString, ResFalse }, { ResOnlcr, ClsOnlcr, XtRBoolean, sizeof(Boolean), boffset(linemode.onlcr), XtRString, ResTrue }, { ResStartTls, ClsStartTls, XtRBoolean, sizeof(Boolean), boffset(ssl.starttls), XtRString, ResTrue }, { ResVerifyHostCert, ClsVerifyHostCert, XtRBoolean, sizeof(Boolean), boffset(ssl.verify_host_cert), XtRString, ResTrue }, }; Cardinal num_xresources = XtNumber(xresources); suite3270-3.6/x3270/resourcesc.h0000664000076500007650000000360413221577164014311 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2015 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR * GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * resourcesc.h * Public definitions for resources.c */ extern XtResource resources[]; extern Cardinal num_resources; extern XtResource xresources[]; extern Cardinal num_xresources; suite3270-3.6/x3270/resources.inc0000664000076500007650000003113613221577163014470 0ustar pdmpdmdnl Copyright (c) 2000-2009, 2014-2016 Paul Mattes. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are met: dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the names of Paul Mattes nor the names of his contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO dnl EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ifelse(XX_PRODUCT,c3270,`XX_SH(Screen Size Switching) When running as a 3270 Model 5, XX_FB(c3270) can take advantage of terminals that can switch between 80 and 132 column modes. XX_LP Because the curses library does not support mode switching, the escape sequences and resulting screen dimensions must be specified explicitly to XX_FB(c3270). These are specified with the XX_FB(XX_DASHED(altscreen)) and XX_FB(XX_DASHED(defscreen)) command-line options, or the XX_FB(altScreen) and XX_FB(defScreen) resources. XX_FB(XX_DASHED(altscreen)) or XX_FB(altScreen) defines the alternate (132-column) mode; XX_FB(XX_DASHED(defscreen)) or XX_FB(defScreen) defines the default (80-column) mode. XX_LP The syntax for the options and resources is XX_FI(rows)`'XX_FB(x)`'XX_FI(cols)`'XX_FB(=)`'XX_FI(init_string), where XX_FI(rows) and XX_FI(cols) give the screen dimensions, and XX_FI(init_string) is the escape sequence to transmit to the terminal to enter that mode. For XX_FB(defscreen), the minimum dimensions are 24 rows and 80 columns. For XX_FB(altscreen), the minimum dimensions are 27 rows and 132 columns. Within XX_FI(init_string), the usual escape sequences are supported (XX_BACKSLASH(E) for escape, XX_BACKSLASH(r), XX_BACKSLASH(b), etc.). For example, the init string for a 132-column xterm is: XX_IP XX_BACKSLASH(E)[?40h`'XX_BACKSLASH(E)[?3h XX_LP Note: When XX_FB(defscreen) and XX_FB(altscreen) are specified, the model number is always set to 5. ')dnl XX_SH(Resources) Certain XX_FB(XX_PRODUCT) options can be configured via resources. Resources are defined ifelse(XX_PRODUCT,c3270,`in the file XX_FB(.c3270pro) in the XX_POSESSIVE(user) home directory, and ')dnl ifelse(XX_PRODUCT,wc3270,`in the session file, or ')dnl by XX_FB(XX_DASHED(xrm)) options. The definitions are similar to X11 resources, and use a similar syntax. The resources available in XX_FB(XX_PRODUCT) are: XX_LP XX_TS(4, l l l l.) XX_TR(XX_TD(Resource) XX_TD(Default) XX_TD(Option) XX_TD(Purpose)) XX_T_() ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(allBold) XX_TD(Auto) XX_TD(XX_DASHED(allbold)) XX_TD(Display all characters bold)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(altScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(altscreen)) XX_TD(132-col screen definition)) ')dnl XX_TR(XX_TD(blankFill) XX_TD(False) XX_TD(XX_DASHED(set) blankFill) XX_TD(Blank Fill mode)) XX_TR(XX_TD(charset) XX_TD(bracket) XX_TD(XX_DASHED(charset)) XX_TD(XX_SM(EBCDIC) character set)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(composeMap) XX_TD(latin1) XX_TD(XX_NBSP) XX_TD(Name of composed-character map)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(consoleColorForHostColor`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForHostColor)`'XX_FI(n)) XX_TD(XX_LINK(#rn4,`(note 6)')) XX_TD(XX_NBSP) XX_TD(Color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForDefault)) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForIntensified)) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtected)) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(XX_HY(cursesColor,ForProtectedIntensified)) XX_TD(white) XX_TD(XX_NBSP) XX_TD(Default color mapping)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(cursesKeymap) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Set curses keymap option)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(defScreen) XX_TD(XX_NBSP) XX_TD(XX_DASHED(defscreen)) XX_TD(80-col screen definition)) ')dnl XX_TR(XX_TD(dbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override DBCS CGCSGID)) XX_TR(XX_TD(dsTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Data stream tracing)) XX_TR(XX_TD(eof) XX_TD(^D) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode XX_SM(EOF) character)) XX_TR(XX_TD(erase) XX_TD(^H) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode erase character)) XX_TR(XX_TD(extended) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Use 3270 extended data stream)) XX_TR(XX_TD(eventTrace) XX_TD(False) XX_TD(XX_DASHED(trace)) XX_TD(Event tracing)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForDefault) XX_TD(green) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForIntensified) XX_TD(red) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtected) XX_TD(blue) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(hostColorForProtectedIntensified) XX_TD(neutralWhite) XX_TD(XX_NBSP) XX_TD(Default color mapping))')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(hostsFile) XX_TD(XX_NBSP) XX_TD(XX_DASHED(hostsfile)) XX_TD(Host alias/macro file)) ')dnl XX_TR(XX_TD(icrnl) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(CR) to XX_SM(NL) on XX_SM(NVT)-mode input)) XX_TR(XX_TD(inlcr) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Map XX_SM(NL) to XX_SM(CR) in XX_SM(NVT)-mode input)) XX_TR(XX_TD(intr) XX_TD(^C) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode interrupt character)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(keymap) XX_TD(XX_NBSP) XX_TD(XX_DASHED(keymap)) XX_TD(Keyboard map name)) XX_TR(XX_TD(keymap.XX_FI(foo)) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Definition of keymap XX_FI(foo))) ')dnl XX_TR(XX_TD(kill) XX_TD(^U) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode kill character)) XX_TR(XX_TD(lineWrap) XX_TD(False) XX_TD(XX_DASHED(set) lineWrap) XX_TD(XX_SM(NVT) line wrap mode)) XX_TR(XX_TD(lnext) XX_TD(^V) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode lnext character)) ifelse(XX_PRODUCT,ws3270,`XX_TR(XX_TD(localCp) XX_TD((system ANSI code page)) XX_TD(XX_DASHED(localcp)) XX_TD(Windows code page for local I/O)) ')dnl XX_TR(XX_TD(m3279) XX_TD(XX_LINK(#rn1,`(note 1)')) XX_TD(XX_DASHED(model)) XX_TD(3279 (color) emulation)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(metaEscape) XX_TD(Auto) XX_TD(XX_NBSP) XX_TD(Interpret ESC-x as Meta-x)) ')dnl ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(marginedPaste) XX_TD(False) XX_TD(XX_DASHED(set) marginedPaste) XX_TD(Keep left margin when pasting)) ')dnl ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(mono) XX_TD(XX_LINK(#rn5, `(note 5)')) XX_TD(XX_DASHED(mono)) XX_TD(Ignore terminal color capabilities)) ')dnl XX_TR(XX_TD(monoCase) XX_TD(False) XX_TD(XX_DASHED(set) monoCase) XX_TD(Mono-case mode)) ifelse(XX_MODE,console,`XX_TR(XX_TD(noPrompt) XX_TD(False) XX_TD(XX_DASHED(noprompt)) XX_TD(Disable command-prompt mode)) ')dnl XX_TR(XX_TD(numericLock) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Lock keyboard for numeric field error)) XX_TR(XX_TD(oerrLock) XX_TD(ifelse(XX_PRODUCT,c3270,True,False)) XX_TD(XX_NBSP) XX_TD(Lock keyboard for input error)) ifelse(XX_PRODUCT,c3270,,XX_PRODUCT,s3270,,XX_PRODUCT,tcl3270,,`XX_TR(XX_TD(overlayPaste) XX_TD(False) XX_TD(XX_DASHED(set) overlayPaste) XX_TD(Overlay protected fields when pasting)) ')dnl XX_TR(XX_TD(oversize) XX_TD(XX_NBSP) XX_TD(XX_DASHED(oversize)) XX_TD(Oversize screen dimensions)) XX_TR(XX_TD(port) XX_TD(telnet) XX_TD(XX_DASHED(port)) XX_TD(Non-default TCP port)) ifelse(XX_MODE,console,`XX_TR(XX_TD(printer.*) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) XX_TR(XX_TD(printerLu) XX_TD(XX_LINK(#rn4,`(note 4)')) XX_TD(XX_NBSP) XX_TD(Printer session config)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(printTextFont) XX_TD(Courier New) XX_TD(XX_NBSP) XX_TD(PrintText font name)) XX_TR(XX_TD(printTextSize) XX_TD(8) XX_TD(XX_NBSP) XX_TD(PrintText font size)) ')dnl XX_TR(XX_TD(quit) XX_TD(^XX_BS) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode quit character)) ifelse(XX_MODE,console,`XX_TR(XX_TD(reconnect) XX_TD(False) XX_TD(XX_DASHED(reconnect)) XX_TD(Automatically reconnect to host)) ')dnl XX_TR(XX_TD(rprnt) XX_TD(^R) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode reprint character)) XX_TR(XX_TD(sbcsCgcsgid) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Override SBCS CGCSGID)) XX_TR(XX_TD(secure) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable "dangerous" options)) XX_TR(XX_TD(termName) XX_TD(XX_LINK(#rn2,`(note 2)')) XX_TD(XX_DASHED(tn)) XX_TD(XX_SM(TELNET) terminal type string)) ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(title) XX_TD(XX_NBSP) XX_TD(XX_NBSP) XX_TD(Console window title)) ')dnl ifelse(XX_PLATFORM,windows,,`XX_TR(XX_TD(traceDir) XX_TD(/tmp) XX_TD(XX_NBSP) XX_TD(Directory for trace files)) ')dnl XX_TR(XX_TD(traceFile) XX_TD(XX_LINK(#rn3,`(note 3)')) XX_TD(XX_DASHED(tracefile)) XX_TD(File for trace output)) ifelse(XX_PRODUCT,c3270,`XX_TR(XX_TD(typeahead) XX_TD(True) XX_TD(XX_NBSP) XX_TD(Allow typeahead)) ')dnl ifelse(XX_PRODUCT,wc3270,`XX_TR(XX_TD(visualBell) XX_TD(False) XX_TD(XX_NBSP) XX_TD(Disable bell sound)) ')dnl XX_TR(XX_TD(werase) XX_TD(^W) XX_TD(XX_NBSP) XX_TD(XX_SM(NVT)-mode word-erase character)) XX_TE() XX_LP XX_RS(`XX_TARGET(rn1)XX_FI(Note 1): XX_FB(m3279) defaults to ifelse(XX_PRODUCT,c3270,`XX_FB(True) if the terminal supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,wc3270,`XX_FB(True). It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', XX_PRODUCT,x3270,`XX_FB(True) if the display supports color, XX_FB(False) otherwise. It can be forced to XX_FB(False) with the proper XX_FB(XX_DASHED(model)) option.', `XX_FB(False). It can be forced to XX_FB(True) with the proper XX_FB(XX_DASHED(model)) option.') XX_LP XX_TARGET(rn2)XX_FI(Note 2): The default terminal type string is constructed from the model number, color emulation, and extended data stream modes. E.g., a model 2 with color emulation and the extended data stream option would be sent as XX_FB(IBM-3279-2-E). Note also that when XX_SM(TN3270E) mode is used, the terminal type is always sent as 3278, but this does not affect color capabilities. XX_LP XX_TARGET(rn3)XX_FI(Note 3): The default trace file is ifelse(XX_PRODUCT,wc3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) on the current XX_POSESSIVE(user) desktop',XX_PRODUCT,ws3270,`XX_FB(x3trc.)`'XX_FI(pid)`'XX_FB(.txt) in the current directory',`XX_FB(x3trc.)`'XX_FI(pid) in the directory specified by the XX_FB(traceDir) resource'). ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn4)XX_FI(Note 4): See XX_LINK(#Printer-Support,XX_SM(PRINTER SUPPORT)) for details.')' ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn5)XX_FI(Note 5): XX_FB(mono) defaults to XX_FB(false) if the terminal supports at least 8 colors and to XX_FB(true) otherwise.') ifelse(XX_PRODUCT,wc3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default console color mappings for host colors 0 through 15 are: 0, 9, 12, 13, 10, 11, 14, 15, 0, 1, 12, 5, 2, 3, 7, and 15.' ')dnl ifelse(XX_PRODUCT,c3270,`XX_LP XX_TARGET(rn6)`XX_FI(Note 6): The default curses color mappings for host colors 0 through 15 are: black, blue, red, magenta, green, cyan, yellow, white, black, blue, yellow, blue, green, cyan, black and white.' ')) XX_LP ifelse(XX_PRODUCT,c3270,`In XX_FB(.c3270pro), lines are continued with a backslash character. XX_LP XX_FB(XX_DASHED(xrm)) options override definitions found in XX_FB(.c3270pro). ')dnl If more than one XX_FB(XX_DASHED(xrm)) option is given for the same resource, the last one on the command line is used. suite3270-3.6/x3270/save.c0000664000076500007650000004723513221577164013075 0ustar pdmpdm/* * Copyright (c) 1994-2009, 2013-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * save.c * Implements the response to the WM_SAVE_YOURSELF message and * x3270 profiles. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include "appres.h" #include "resources.h" #include "charset.h" #if !defined(USE_APP_DEFAULTS) /*[*/ # include "fallbacks.h" #endif /*]*/ #include "idle.h" #include "keymap.h" #include "lazya.h" #include "popups.h" #include "save.h" #include "screen.h" #include "toggles.h" #include "utils.h" #include "xappres.h" #include "xkeypad.h" #include "xsave.h" #include "xscreen.h" /* Support for WM_SAVE_YOURSELF. */ char *command_string = NULL; static char *cmd; static int cmd_len; #define NWORDS 1024 static char **tmp_cmd; static int tcs; static Status x_get_window_attributes(Window w, XWindowAttributes *wa); /* Search for an option in the tmp_cmd array. */ static int cmd_srch(const char *s) { int i; for (i = 1; i < tcs; i++) if (tmp_cmd[i] && !strcmp(tmp_cmd[i], s)) return i; return 0; } /* Replace an options in the tmp_cmd array. */ static void cmd_replace(int ix, const char *s) { XtFree(tmp_cmd[ix]); tmp_cmd[ix] = XtNewString(s); } /* Append an option to the tmp_cmd array. */ static void cmd_append(const char *s) { tmp_cmd[tcs++] = XtNewString(s); tmp_cmd[tcs] = (char *) NULL; } /* Delete an option from the tmp_cmd array. */ static void cmd_delete(int ix) { XtFree(tmp_cmd[ix]); tmp_cmd[ix] = (char *) NULL; } /* Save the screen geometry. */ static void save_xy(void) { char *tbuf; Window window, frame, child; XWindowAttributes wa; int x, y; int ix; window = XtWindow(toplevel); if (!x_get_window_attributes(window, &wa)) return; (void) XTranslateCoordinates(display, window, wa.root, -wa.border_width, -wa.border_width, &x, &y, &child); frame = XtWindow(toplevel); while (true) { Window root, parent; Window *wchildren; unsigned int nchildren; int status = XQueryTree(display, frame, &root, &parent, &wchildren, &nchildren); if (status && wchildren) { XFree((char *)wchildren); } if (parent == root || !parent || !status) { break; } frame = parent; } if (frame != window) { if (!x_get_window_attributes(frame, &wa)) { return; } x = wa.x; y = wa.y; } tbuf = lazyaf("+%d+%d", x, y); if ((ix = cmd_srch("-geometry"))) { cmd_replace(ix + 1, tbuf); } else { cmd_append("-geometry"); cmd_append(tbuf); } } /* Save the icon information: state, label, geometry. */ static void save_icon(void) { unsigned char *data; int iconX, iconY; char *tbuf; int ix; unsigned long nitems; { Atom actual_type; int actual_format; unsigned long leftover; if (XGetWindowProperty(display, XtWindow(toplevel), a_state, 0L, 2L, False, a_state, &actual_type, &actual_format, &nitems, &leftover, &data) != Success) { return; } if (actual_type != a_state || actual_format != 32 || nitems < 1) { return; } } ix = cmd_srch("-iconic"); if (*(unsigned long *)data == IconicState) { if (!ix) { cmd_append("-iconic"); } } else { if (ix) { cmd_delete(ix); } } if (nitems < 2) { return; } { Window icon_window; XWindowAttributes wa; Window child; icon_window = *(Window *)(data + sizeof(unsigned long)); if (icon_window == None) { return; } if (!x_get_window_attributes(icon_window, &wa)) { return; } (void) XTranslateCoordinates(display, icon_window, wa.root, -wa.border_width, -wa.border_width, &iconX, &iconY, &child); if (!iconX && !iconY) { return; } } tbuf = lazyaf("%d", iconX); ix = cmd_srch(OptIconX); if (ix) { cmd_replace(ix + 1, tbuf); } else { cmd_append(OptIconX); cmd_append(tbuf); } tbuf = lazyaf("%d", iconY); ix = cmd_srch(OptIconY); if (ix) { cmd_replace(ix + 1, tbuf); } else { cmd_append(OptIconY); cmd_append(tbuf); } return; } /* Save the keymap information. */ static void save_keymap(void) { /* Note: keymap propogation is deliberately disabled, because it may vary from workstation to workstation. The recommended way of specifying keymaps is through your .Xdefaults or the KEYMAP or KEYBD environment variables, which can be easily set in your .login or .profile to machine-specific values; the -keymap switch is really for debugging or testing keymaps. I'm sure I'll regret this. */ #if defined(notdef) /*[*/ if (current_keymap) { add_string(v, OptKeymap); add_string(v, current_keymap); } #endif /*]*/ } /* Save the model name. */ static void save_model(void) { int ix; if (!model_changed) return; if ((ix = cmd_srch(OptModel)) && strcmp(tmp_cmd[ix], model_name)) cmd_replace(ix + 1, model_name); else { cmd_append(OptModel); cmd_append(model_name); } } /* Save the emulator font. */ static void save_efont(void) { int ix; if (!efont_changed) return; if ((ix = cmd_srch(OptEmulatorFont)) && strcmp(tmp_cmd[ix], efontname)) cmd_replace(ix + 1, efontname); else { cmd_append(OptEmulatorFont); cmd_append(efontname); } } /* Save the keypad state. */ static void save_keypad(void) { int ix; ix = cmd_srch(OptKeypadOn); if (xappres.keypad_on || keypad_popped) { if (!ix) { cmd_append(OptKeypadOn); } } else { if (ix) { cmd_delete(ix); } } } /* Save the scrollbar state. */ static void save_scrollbar(void) { int i_on, i_off; if (!scrollbar_changed) return; i_on = cmd_srch(OptScrollBar); i_off = cmd_srch(OptNoScrollBar); if (toggled(SCROLL_BAR)) { if (!i_on) { if (i_off) cmd_replace(i_off, OptScrollBar); else cmd_append(OptScrollBar); } } else { if (!i_off) { if (i_on) cmd_replace(i_on, OptNoScrollBar); else cmd_append(OptNoScrollBar); } } } /* Save the name of the host we are connected to. */ static void save_host(void) { char *space; if (!CONNECTED) return; space = strchr(full_current_host, ' '); if (space == (char *) NULL) cmd_append(full_current_host); else { char *tmp = XtNewString(full_current_host); char *port; space = strchr(tmp, ' '); *space = '\0'; cmd_append(tmp); port = space + 1; while (*port == ' ') port++; if (*port) cmd_append(port); XtFree(tmp); } } /* Save the settings of each of the toggles. */ static void save_toggles(void) { toggle_index_t i; int j; int ix; for (i = 0; i < N_TOGGLES; i++) { toggle_index_t tix = toggle_names[i].index; if (!toggle_changed(tix)) { continue; } /* * Find the last "-set" or "-clear" for this toggle. * If there is a preferred alias, delete them instead. */ ix = 0; for (j = 1; j < tcs; j++) { if (tmp_cmd[j] && (!strcmp(tmp_cmd[j], OptSet) || !strcmp(tmp_cmd[j], OptClear)) && tmp_cmd[j+1] && !strcmp(tmp_cmd[j+1], toggle_names[i].name)) { if (toggle_names[i].is_alias) { cmd_delete(j); cmd_delete(j + 1); } else { ix = j; } } } /* Handle aliased switches. */ switch (tix) { case SCROLL_BAR: continue; /* +sb/-sb done separately */ case TRACING: ix = cmd_srch(OptTrace); if (toggled(TRACING)) { if (!ix) { cmd_append(OptTrace); } } else { if (ix) { cmd_delete(ix); } } continue; default: break; } /* If need be, switch "-set" with "-clear", or append one. */ if (toggled(tix)) { if (ix && strcmp(tmp_cmd[ix], OptSet)) { cmd_replace(ix, OptSet); } else if (!ix) { cmd_append(OptSet); cmd_append(toggle_names[i].name); } } else { if (ix && strcmp(tmp_cmd[ix], OptClear)) { cmd_replace(ix, OptClear); } else if (!ix) { cmd_append(OptClear); cmd_append(toggle_names[i].name); } } } } /* Remove a positional parameter from the command line. */ static void remove_positional(char *s) { char *c; c = cmd + cmd_len - 2; /* last byte of last arg */ while (*c && c >= cmd) { c--; } if (strcmp(s, c + 1)) { XtError("Command-line switches must precede positional arguments"); } cmd_len = c - cmd; } /* Save a copy of he XA_WM_COMMAND poperty. */ void save_init(int argc, char *hostname, char *port) { Atom actual_type; int actual_format; unsigned long nitems; unsigned long bytes_after; /* * Fetch the initial value of the XA_COMMAND property and store * it in 'cmd'. */ XGetWindowProperty(display, XtWindow(toplevel), XA_WM_COMMAND, 0L, 1000000L, False, XA_STRING, &actual_type, &actual_format, &nitems, &bytes_after, (unsigned char **)&cmd); if (nitems == 0) XtError("Could not get initial XA_COMMAND property"); cmd_len = nitems * (actual_format / 8); /* * Now locate the hostname and port positional arguments, and * remove them. If they aren't the last two components of the * command line, abort. */ switch (argc) { case 3: remove_positional(port); /* fall through */ case 2: remove_positional(hostname); break; } } /* Handle a WM_SAVE_YOURSELF ICCM. */ void save_yourself(void) { int i; char *c, *c2; int len; Replace(command_string, NULL); /* Copy the original command line into tmp_cmd. */ tmp_cmd = (char **) XtMalloc(sizeof(char *) * NWORDS); tcs = 0; i = 0; c = cmd; while (i < cmd_len) { c = cmd + i; tmp_cmd[tcs++] = XtNewString(c); i += strlen(c); i++; } tmp_cmd[tcs] = (char *) NULL; /* Replace the first element with the program name. */ cmd_replace(0, programname); /* Save options. */ save_xy(); save_icon(); save_keymap(); save_model(); save_efont(); save_keypad(); save_scrollbar(); save_toggles(); save_host(); /* Copy what's left into contiguous memory. */ len = 0; for (i = 0; i < tcs; i++) if (tmp_cmd[i]) len += strlen(tmp_cmd[i]) + 1; c = XtMalloc(len); c[0] = '\0'; c2 = c; for (i = 0; i < tcs; i++) if (tmp_cmd[i]) { (void) strcpy(c2, tmp_cmd[i]); c2 += strlen(c2) + 1; XtFree(tmp_cmd[i]); } Free(tmp_cmd); /* Change the property. */ XChangeProperty(display, XtWindow(toplevel), XA_WM_COMMAND, XA_STRING, 8, PropModeReplace, (unsigned char *)c, len); /* Save a readable copy of the command string for posterity. */ command_string = c; while (((c2 = strchr(c, '\0')) != NULL) && (c2 - command_string < len-1)) { *c2 = ' '; c = c2 + 1; } } /* Support for x3270 profiles. */ #define PROFILE_ENV "X3270PRO" #define NO_PROFILE_ENV "NOX3270PRO" #define RDB_ENV "X3270RDB" #define DEFAULT_PROFILE "~/.x3270pro" char *profile_name = NULL; static char *xcmd; static int xargc; static char **xargv; typedef struct scs { struct scs *next; char *name; } scs_t; scs_t *cc_list = NULL; void charset_list_changed(char *charset) { scs_t *c; for (c = cc_list; c != NULL; c = c->next) { if (!strcasecmp(c->name, charset)) return; } c = (scs_t *)Malloc(sizeof(scs_t)); c->name = NewString(charset); c->next = cc_list; cc_list = c; } /* Save one option in the file. */ static void save_opt(FILE *f, const char *full_name, const char *opt_name, const char *res_name, const char *value) { (void) fprintf(f, "! %s ", full_name); if (opt_name != NULL) (void) fprintf(f, " (%s)", opt_name); (void) fprintf(f, "\n%s.%s: %s\n", XtName(toplevel), res_name, value); } /* Save the current options settings in a profile. */ bool save_options(char *n) { FILE *f; bool exists = false; char *ct; toggle_index_t i; time_t clk; char *buf; bool any_toggles = false; if (n == NULL || *n == '\0') { return false; } /* Open the file. */ n = do_subst(n, DS_VARS | DS_TILDE); f = fopen(n, "r"); if (f != NULL) { (void) fclose(f); exists = true; } f = fopen(n, "a"); if (f == NULL) { popup_an_errno(errno, "Cannot open %s", n); XtFree(n); return false; } /* Save the name. */ Replace(profile_name, n); /* Print the header. */ clk = time((time_t *)0); ct = ctime(&clk); if (ct[strlen(ct)-1] == '\n') { ct[strlen(ct)-1] = '\0'; } if (exists) { (void) fprintf(f, "! File updated %s by %s\n", ct, build); } else { (void) fprintf(f, "! x3270 profile\n\ ! File created %s by %s\n\ ! This file overrides xrdb and .Xdefaults.\n\ ! To skip reading this file, set %s in the environment.\n\ !\n", ct, build, NO_PROFILE_ENV); } /* Save most of the toggles. */ for (i = 0; toggle_names[i].name; i++) { toggle_index_t tix = toggle_names[i].index; if (toggle_names[i].is_alias || !toggle_changed(tix)) { continue; } if (!any_toggles) { (void) fprintf(f, "! toggles (%s, %s)\n", OptSet, OptClear); any_toggles = true; } (void) fprintf(f, "%s.%s: %s\n", XtName(toplevel), toggle_names[i].name, toggled(tix)? ResTrue: ResFalse); } /* Save the keypad state. */ if (keypad_changed) { save_opt(f, "keypad state", OptKeypadOn, ResKeypadOn, (xappres.keypad_on || keypad_popped)? ResTrue: ResFalse); } /* Save other menu-changeable options. */ if (efont_changed) { save_opt(f, "emulator font", OptEmulatorFont, ResEmulatorFont, efontname); } if (model_changed) { buf = xs_buffer("%d", model_num); save_opt(f, "model", OptModel, ResModel, buf); Free(buf); } if (oversize_changed) { buf = xs_buffer("%dx%d", ov_cols, ov_rows); save_opt(f, "oversize", OptOversize, ResOversize, buf); Free(buf); } if (scheme_changed && xappres.color_scheme != NULL) { save_opt(f, "color scheme", OptColorScheme, ResColorScheme, xappres.color_scheme); } if (keymap_changed && current_keymap != NULL) { save_opt(f, "keymap", OptKeymap, ResKeymap, current_keymap); } if (charset_changed) { save_opt(f, "charset", OptCharset, ResCharset, get_charset_name()); } if (idle_changed) { save_opt(f, "idle command", NULL, ResIdleCommand, idle_command); save_opt(f, "idle timeout", NULL, ResIdleTimeout, idle_timeout_string); save_opt(f, "idle enabled", NULL, ResIdleCommandEnabled, (idle_user_enabled == IDLE_PERM)? "True": "False"); } /* Done. */ (void) fclose(f); return true; } /* Save a copy of the command-line options. */ void save_args(int argc, char *argv[]) { int i; int len = 0; for (i = 0; i < argc; i++) len += strlen(argv[i]) + 1; xcmd = XtMalloc(len + 1); xargv = (char **)XtMalloc((argc + 1) * sizeof(char *)); len = 0; for (i = 0; i < argc; i++) { xargv[i] = xcmd + len; (void) strcpy(xcmd + len, argv[i]); len += strlen(argv[i]) + 1; } xargv[i] = NULL; *(xcmd + len) = '\0'; xargc = argc; } #if !defined(USE_APP_DEFAULTS) /*[*/ #define DEF_NAME "x3270" #define NLEN (sizeof(DEF_NAME) - 1) #define DOT_NAME DEF_NAME "." #define STAR_NAME DEF_NAME "*" /* Substitute an alternate name in the fallback resource definitions. */ static char * subst_name(unsigned char *fallbacks) { char *tlname; char *s, *t; bool eol = true; int nname = 0; size_t nlen; int flen; char *new_fallbacks; /* If the name is the same, do nothing. */ if (!strcmp((tlname = XtName(toplevel)), DEF_NAME)) return (char *)fallbacks; /* Count the number of instances of "x3270" in the fallbacks. */ s = (char *)fallbacks; while (*s) { if (eol && (!strncmp(s, DOT_NAME, NLEN + 1) || !strncmp(s, STAR_NAME, NLEN + 1))) { nname++; s += NLEN; eol = false; } else if (*s == '\n') eol = true; else eol = false; s++; } if (!nname) return (char *)fallbacks; /* Allocate a buffer to do the substitution into. */ if ((nlen = strlen(tlname)) > NLEN) flen = strlen((char *)fallbacks) + ((nlen - NLEN) * nname) + 1; else flen = strlen((char *)fallbacks) - ((NLEN - nlen) * nname) + 1; new_fallbacks = Malloc(flen); /* Substitute. */ s = (char *)fallbacks; t = new_fallbacks; while (*s) { if (eol && (!strncmp(s, DOT_NAME, NLEN + 1) || !strncmp(s, STAR_NAME, NLEN + 1))) { strcpy(t, tlname); t += nlen; s += NLEN; eol = false; } else if (*s == '\n') eol = true; else eol = false; *t++ = *s++; } *t = '\0'; return new_fallbacks; } #endif /*]*/ /* Merge in the options settings from a profile. */ void merge_profile(XrmDatabase *d, char *session, bool mono) { const char *fname; char *env_resources; XrmDatabase dd; #if !defined(USE_APP_DEFAULTS) /*[*/ /* Start with the fallbacks. */ dd = XrmGetStringDatabase(subst_name(common_fallbacks)); if (dd == NULL) { XtError("Can't parse common fallbacks"); } XrmMergeDatabases(dd, d); dd = XrmGetStringDatabase(subst_name(mono? mono_fallbacks: color_fallbacks)); if (dd == NULL) { XtError("Can't parse mono/color fallbacks"); } XrmMergeDatabases(dd, d); #endif /*]*/ if (session == NULL && getenv(NO_PROFILE_ENV) != NULL) { profile_name = do_subst(DEFAULT_PROFILE, DS_VARS | DS_TILDE); } else { /* Open the file. */ if (session != NULL) fname = session; else fname = getenv(PROFILE_ENV); if (fname == NULL || *fname == '\0') fname = DEFAULT_PROFILE; profile_name = do_subst(fname, DS_VARS | DS_TILDE); /* Create a resource database from the file. */ dd = XrmGetFileDatabase(profile_name); if (dd != NULL) { /* Merge in the profile options. */ XrmMergeDatabases(dd, d); } else if (session != NULL) { Error("Session file not found"); } } /* See if there are any environment resources. */ env_resources = getenv(RDB_ENV); if (env_resources != NULL) { dd = XrmGetStringDatabase(env_resources); if (dd != NULL) { XrmMergeDatabases(dd, d); } } /* Merge the saved command-line options back on top of those. */ dd = NULL; XrmParseCommand(&dd, options, num_options, programname, &xargc, xargv); XrmMergeDatabases(dd, d); /* Free the saved command-line options. */ XtFree(xcmd); xcmd = NULL; Replace(xargv, NULL); } bool read_resource_file(const char *filename, bool fatal) { XrmDatabase dd, rdb; dd = XrmGetFileDatabase(filename); if (dd == NULL) { return false; } rdb = XtDatabase(display); XrmMergeDatabases(dd, &rdb); return true; } /* * Safe routine for querying window attributes */ static int dummy_error_handler(Display *d _is_unused, XErrorEvent *e _is_unused) { return 0; } static Status x_get_window_attributes(Window w, XWindowAttributes *wa) { XErrorHandler old_handler; Status s; old_handler = XSetErrorHandler(dummy_error_handler); s = XGetWindowAttributes(display, w, wa); if (!s) (void) fprintf(stderr, "Error: querying bad window 0x%lx\n", w); (void) XSetErrorHandler(old_handler); return s; } suite3270-3.6/x3270/screen.c0000664000076500007650000044571613221577164013424 0ustar pdmpdm/* * Copyright (c) 1993-2016 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor their * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR * GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * screen.c * This module handles the X display. It has been extensively * optimized to minimize X drawing operations. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include #include #include #include #include "Husk.h" #include #include #include #include #include #include "3270ds.h" #include "appres.h" #include "screen.h" #include "ctlr.h" #include "cg.h" #include "resources.h" #include "toggles.h" #include "actions.h" #include "charset.h" #include "ctlrc.h" #include "display8.h" #include "display_charsets.h" #include "display_charsets_dbcs.h" #include "host.h" #include "keymap.h" #include "kybd.h" #include "lazya.h" #include "nvt.h" #include "popups.h" #include "save.h" #include "screen.h" #include "scroll.h" #include "see.h" #include "status.h" #include "tables.h" #include "telnet.h" #include "trace.h" #include "unicodec.h" #include "unicode_dbcs.h" #include "utils.h" #include "xactions.h" #include "xappres.h" #include "xio.h" #include "xkeypad.h" #include "xmenubar.h" #include "xsave.h" #include "xscreen.h" #include "xscroll.h" #include "xstatus.h" #include "xpopups.h" #include "xtables.h" #if defined(HAVE_SYS_SELECT_H) /*[*/ #include /* fd_set declaration */ #endif /*]*/ #include "x3270.bm" #include "wait.bm" #define SCROLLBAR_WIDTH 15 #define NO_BANG(s) (((s)[0] == '!')? (s)+1: (s)) #if !defined(NBBY) /*[*/ #define NBBY 8 #endif /*]*/ #define BPW (NBBY * sizeof(unsigned long)) #define MAX_FONTS 50000 #define SELECTED(baddr) (selected[(baddr)/8] & (1 << ((baddr)%8))) #define SET_SELECT(baddr) (selected[(baddr)/8] |= (1 << ((baddr)%8))) /* Globals */ Dimension main_width; /* desired toplevel width */ bool scrollbar_changed = false; bool model_changed = false; bool efont_changed = false; bool oversize_changed = false; bool scheme_changed = false; Pixel keypadbg_pixel; bool flipped = false; Pixmap x3270_icon; bool shifted = false; struct font_list *font_list = (struct font_list *) NULL; int font_count = 0; char *efontname; char *efont_charset; char *efont_charset_dbcs; bool efont_matches = true; char *full_efontname; char *full_efontname_dbcs; bool visible_control = false; unsigned fixed_width, fixed_height; bool user_resize_allowed = true; int hhalo = HHALO, vhalo = VHALO; #define gray_width 2 #define gray_height 2 static char gray_bits[] = { 0x01, 0x02 }; /* Statics */ static unsigned char *selected; /* selection bitmap */ static bool allow_resize; static Dimension main_height; /* desired toplevel width */ static union sp *temp_image; /* temporary for X display */ static Pixel colorbg_pixel; static bool crosshair_enabled = true; static bool cursor_displayed = false; static bool cursor_enabled = true; static bool cursor_blink_pending = false; static XtIntervalId cursor_blink_id; static int field_colors[4]; static bool in_focus = false; static bool line_changed = false; static bool cursor_changed = false; static bool iconic = false; static bool maximized = false; static Widget container; static Widget scrollbar; static Dimension menubar_height; static Dimension container_width; static Dimension cwidth_nkp; /* container width, without integral keypad */ static Dimension container_height; static Dimension scrollbar_width; static char *aicon_text = NULL; static XFontStruct *ailabel_font; static Dimension aicon_label_height = 0; static GC ailabel_gc; static Pixel cpx[16]; static bool cpx_done[16]; static Pixel normal_pixel; static Pixel select_pixel; static Pixel bold_pixel; static Pixel selbg_pixel; static Pixel cursor_pixel; static bool text_blinking_on = true; static bool text_blinkers_exist = false; static bool text_blink_scheduled = false; static XtIntervalId text_blink_id; static XtTranslations screen_t00 = NULL; static XtTranslations screen_t0 = NULL; static XtTranslations container_t00 = NULL; static XtTranslations container_t0 = NULL; static XChar2b *rt_buf = (XChar2b *) NULL; static char *color_name[16] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static bool configure_ticking = false; static XtIntervalId configure_id; static bool highlight_bold = false; static Pixmap inv_icon; static Pixmap wait_icon; static Pixmap inv_wait_icon; static bool icon_inverted = false; static Widget icon_shell; static struct font_list *font_last = (struct font_list *) NULL; static struct { Font font; XFontStruct *font_struct; bool unicode; int char_height; int char_width; int ascent; int descent; int xtra_width; int d16_ix; } dbcs_font; static void xim_init(void); XIM im; XIC ic; bool xim_error = false; char *locale_name = NULL; int ovs_offset = 1; typedef struct { XIMStyle style; char *description; } im_style_t; static XIMStyle style; char ic_focus; static void send_spot_loc(void); /* Globals for undoing reconfigurations. */ static enum { REDO_NONE, REDO_FONT, REDO_MODEL, REDO_KEYPAD, REDO_SCROLLBAR, REDO_RESIZE } screen_redo = REDO_NONE; static char *redo_old_font = NULL; static int redo_old_model; static int redo_old_ov_cols; static int redo_old_ov_rows; static unsigned char blank_map[32]; #define BKM_SET(n) blank_map[(n)/8] |= 1 << ((n)%8) #define BKM_ISSET(n) ((blank_map[(n)/8] & (1 << ((n)%8))) != 0) enum fallback_color { FB_WHITE, FB_BLACK }; static enum fallback_color ibm_fb = FB_WHITE; static char *default_display_charset = "3270cg-1a,3270cg-1,iso8859-1"; static char *required_display_charsets; static int crosshair_color = HOST_COLOR_PURPLE; #define CROSSABLE (toggled(CROSSHAIR) && IN_3270 && \ cursor_enabled && crosshair_enabled && in_focus) #define CROSSED(b) ((BA_TO_COL(b) == cursor_col) || \ (BA_TO_ROW(b) == cursor_row)) #define CROSS_COLOR (appres.m3279? (GC_NONDEFAULT | crosshair_color) : FA_INT_NORM_NSEL) /* * The screen state structure. This structure is swapped whenever we switch * between normal and active-iconic states. */ #define NGCS 16 struct sstate { Widget widget; /* the widget */ Window window; /* the window */ union sp *image; /* what's on the X display */ int cursor_daddr; /* displayed cursor address */ bool xh_alt; /* crosshair was drawn in alt area */ bool exposed_yet; /* have we been exposed yet? */ bool overstrike; /* are we overstriking? */ Dimension screen_width; /* screen dimensions in pixels */ Dimension screen_height; GC gc[NGCS * 2], /* standard, inverted GCs */ selgc[NGCS], /* color selected text GCs */ mcgc, /* monochrome block cursor GC */ ucgc, /* unique-cursor-color cursor GC */ invucgc, /* inverse ucgc */ clrselgc; /* selected clearing GC */ int char_height; int char_width; Font fid; XFontStruct *font; int ascent; int descent; int xtra_width; bool standard_font; bool extended_3270font; bool font_8bit; bool font_16bit; bool funky_font; bool obscured; bool copied; int d8_ix; unsigned long odd_width[256 / BPW]; unsigned long odd_lbearing[256 / BPW]; XChar2b *hx_text; int nhx_text; }; static struct sstate nss; static struct sstate iss; static struct sstate *ss = &nss; #define INIT_ODD(odd) (void) memset(odd, '\0', sizeof(odd)) #define SET_ODD(odd, n) (odd)[(n) / BPW] |= 1 << ((n) % BPW) #define IS_ODD(odd, n) ((odd)[(n) / BPW] & 1 << ((n) % BPW)) #define DEFAULT_CHAR(f) (((f)->default_char >= (f)->min_char_or_byte2 && \ (f)->default_char <= (f)->max_char_or_byte2)? \ (f)->default_char: 32) #define WHICH_CHAR(f, n) (((n) < (f)->min_char_or_byte2 || \ (n) > (f)->max_char_or_byte2)? \ DEFAULT_CHAR(f) : (n)) #define PER_CHAR(f, n) ((f)->per_char[WHICH_CHAR(f, n) - (f)->min_char_or_byte2]) /* Globals based on nss, used mostly by status and select routines. */ Widget *screen = &nss.widget; Window *screen_window = &nss.window; int *char_width = &nss.char_width; int *char_height = &nss.char_height; int *ascent = &nss.ascent; int *descent = &nss.descent; bool *standard_font = &nss.standard_font; bool *font_8bit = &nss.font_8bit; bool *font_16bit = &nss.font_16bit; bool *extended_3270font = &nss.extended_3270font; bool *funky_font = &nss.funky_font; int *xtra_width = &nss.xtra_width; Font *fid = &nss.fid; Dimension *screen_height = &nss.screen_height; /* Mouse-cursor state */ enum mcursor_state { LOCKED, NORMAL, WAIT }; static enum mcursor_state mcursor_state = LOCKED; static enum mcursor_state icon_cstate = NORMAL; /* Dumb font cache. */ typedef struct dfc { struct dfc *next; char *name; char *weight; int points; char *spacing; char *charset; bool good; } dfc_t; static void aicon_init(void); static void aicon_reinit(unsigned cmask); static void screen_focus(bool in); static void make_gc_set(struct sstate *s, int i, Pixel fg, Pixel bg); static void make_gcs(struct sstate *s); static void put_cursor(int baddr, bool on); static void resync_display(union sp *buffer, int first, int last); static void draw_fields(union sp *buffer, int first, int last); static void render_text(union sp *buffer, int baddr, int len, bool block_cursor, union sp *attrs); static void cursor_pos(void); static void cursor_on(const char *why); static void schedule_cursor_blink(void); static void schedule_text_blink(void); static void inflate_screen(void); static int fa_color(unsigned char fa); static bool cursor_off(const char *why); static void draw_aicon_label(void); static void set_mcursor(void); static void scrollbar_init(bool is_reset); static void init_rsfonts(char *charset_name); static void allocate_pixels(void); static int fl_baddr(int baddr); static GC get_gc(struct sstate *s, int color); static GC get_selgc(struct sstate *s, int color); static void default_color_scheme(void); static bool xfer_color_scheme(char *cs, bool do_popup); static void set_font_globals(XFontStruct *f, const char *ef, const char *fef, Font ff, bool is_dbcs); static void screen_connect(bool ignored); static void configure_stable(XtPointer closure, XtIntervalId *id); static void cancel_blink(void); static void render_blanks(int baddr, int height, union sp *buffer); static void resync_text(int baddr, int len, union sp *buffer); static void screen_reinit(unsigned cmask); static void aicon_font_init(void); static void aicon_size(Dimension *iw, Dimension *ih); static void invert_icon(bool inverted); static char *lff_single(const char *name, const char *reqd_display_charset, bool is_dbcs); static char *load_fixed_font(const char *names, const char *reqd_charsets); static void lock_icon(enum mcursor_state state); static char *expand_cslist(const char *s); static void hollow_cursor(int baddr); static void xlate_dbcs(unsigned char, unsigned char, XChar2b *); static void dfc_init(void); static const char *dfc_search_family(const char *charset, dfc_t **dfc, void **cookie); static bool dfc_search_name(const char *name); static action_t SetFont_action; static action_t Title_action; static action_t WindowState_action; static XChar2b apl_to_udisplay(int d8_ix, unsigned char c); static XChar2b apl_to_ldisplay(unsigned char c); /* Resize font list. */ struct rsfont { struct rsfont *next; char *name; int width; int height; int descent; int total_width; /* transient */ int total_height; /* transient */ int area; /* transient */ }; static struct rsfont *rsfonts; #define BASE_MASK 0x0f /* mask for 16 actual colors */ #define INVERT_MASK 0x10 /* toggle for inverted colors */ #define GC_NONDEFAULT 0x20 /* distinguishes "color 0" from zeroed memory */ #define COLOR_MASK (GC_NONDEFAULT | BASE_MASK) #define INVERT_COLOR(c) ((c) ^ INVERT_MASK) #define NO_INVERT(c) ((c) & ~INVERT_MASK) #define DEFAULT_PIXEL (appres.m3279 ? HOST_COLOR_BLUE : FA_INT_NORM_NSEL) #define PIXEL_INDEX(c) ((c) & BASE_MASK) /* * Save 00 event translations. */ void save_00translations(Widget w, XtTranslations *t00) { *t00 = w->core.tm.translations; } /* * Define our event translations */ void set_translations(Widget w, XtTranslations *t00, XtTranslations *t0) { struct trans_list *t; if (t00 != NULL) XtOverrideTranslations(w, *t00); for (t = trans_list; t != NULL; t = t->next) XtOverrideTranslations(w, lookup_tt(t->name, NULL)); *t0 = w->core.tm.translations; } /* * Add or clear a temporary keymap. */ void screen_set_temp_keymap(XtTranslations trans) { if (trans != NULL) { XtOverrideTranslations(nss.widget, trans); XtOverrideTranslations(container, trans); } else { XtUninstallTranslations(nss.widget); XtOverrideTranslations(nss.widget, screen_t0); XtUninstallTranslations(container); XtOverrideTranslations(container, container_t0); } } /* * Change the baselevel keymap. */ void screen_set_keymap(void) { XtUninstallTranslations(nss.widget); set_translations(nss.widget, &screen_t00, &screen_t0); XtUninstallTranslations(container); set_translations(container, &container_t00, &container_t0); } /* * Crosshair color init. */ static void crosshair_color_init(void) { int c = decode_host_color(appres.interactive.crosshair_color); if (c >= 0) { crosshair_color = c; } else { xs_warning("Invalid %s: %s", ResCrosshairColor, appres.interactive.crosshair_color); crosshair_color = HOST_COLOR_PURPLE; } } /* * Screen pre-initialization (before charset init). */ void screen_preinit(void) { dfc_init(); } /* * Clear fixed_width and fixed_height. */ static void clear_fixed(void) { if (!maximized && user_resize_allowed && (fixed_width || fixed_height)) { vtrace("clearing fixed_width and fixed_height\n"); fixed_width = 0; fixed_height = 0; } } /* * Initialize the screen. */ void screen_init(void) { int i; visible_control = toggled(VISIBLE_CONTROL); /* Parse the fixed window size, if there is any. */ if (xappres.fixed_size) { char c; if (sscanf(xappres.fixed_size, "%ux%u%c", &fixed_width, &fixed_height, &c) != 2 || !fixed_width || !fixed_height) { popup_an_error("Invalid fixed size"); clear_fixed(); } else { /* Success. Don't allow user resize operations. */ user_resize_allowed = false; } } menubar_snap_enable(user_resize_allowed); /* Initialize ss. */ nss.cursor_daddr = 0; nss.xh_alt = false; nss.exposed_yet = false; /* Initialize "gray" bitmap. */ if (appres.interactive.mono) { gray = XCreatePixmapFromBitmapData(display, root_window, (char *)gray_bits, gray_width, gray_height, xappres.foreground, xappres.background, screen_depth); } /* Initialize the blank map. */ (void) memset((char *)blank_map, '\0', sizeof(blank_map)); for (i = 0; i < 256; i++) { if (ebc2asc0[i] == 0x20 || ebc2asc0[i] == 0xa0) { BKM_SET(i); } } /* Initialize the emulated 3270 controller hardware. */ ctlr_init(ALL_CHANGE); /* Initialize the actve icon. */ aicon_init(); /* Initialize the status line. */ status_init(); /* Initialize the placement of the pop-up keypad. */ keypad_placement_init(); /* Initialize the crosshair color. */ crosshair_color_init(); /* Now call the "reinitialize" function to set everything else up. */ screen_reinit(ALL_CHANGE); } /* * Re-initialize the screen. */ static void screen_reinit(unsigned cmask) { Dimension cwidth_curr; /* Allocate colors. */ if (cmask & COLOR_CHANGE) { if (appres.m3279) { default_color_scheme(); (void) xfer_color_scheme(xappres.color_scheme, false); } allocate_pixels(); /* * In color mode, set highlight_bold from the resource. * In monochrome, set it unconditionally. */ if (appres.m3279) { highlight_bold = appres.highlight_bold; } else { highlight_bold = true; } } /* Define graphics contexts. */ if (cmask & (FONT_CHANGE | COLOR_CHANGE)) { make_gcs(&nss); } /* Undo the horizonal crosshair buffers. */ if (cmask & FONT_CHANGE) { if (nss.hx_text != NULL) { Replace(nss.hx_text, NULL); nss.nhx_text = 0; } } /* Reinitialize the controller. */ ctlr_reinit(cmask); /* Allocate buffers. */ if (cmask & MODEL_CHANGE) { /* Selection bitmap */ Replace(selected, (unsigned char *)XtCalloc(sizeof(unsigned char), (maxROWS * maxCOLS + 7) / 8)); /* X display image */ Replace(nss.image, (union sp *)XtCalloc(sizeof(union sp), maxROWS * maxCOLS)); Replace(temp_image, (union sp *)XtCalloc(sizeof(union sp), maxROWS*maxCOLS)); /* render_text buffers */ Replace(rt_buf, (XChar2b *)XtMalloc(maxCOLS * sizeof(XChar2b))); } else { (void) memset((char *) nss.image, 0, sizeof(union sp) * maxROWS * maxCOLS); } /* Compute SBCS/DBCS size differences. */ if ((cmask & FONT_CHANGE) && dbcs) { int wdiff, adiff, ddiff; char *xs; int xx; #if defined(_ST) /*[*/ printf("nss ascent %d descent %d\n" "dbcs ascent %d descent %d\n", nss.ascent, nss.descent, dbcs_font.ascent, dbcs_font.descent); #endif /*]*/ /* Compute width difference. */ wdiff = (2 * nss.char_width) - dbcs_font.char_width; if (wdiff > 0) { /* SBCS font is too wide */ dbcs_font.xtra_width = wdiff; #if defined(_ST) /*[*/ printf("SBCS wider %d\n", wdiff); #endif /*]*/ } else if (wdiff < 0) { /* SBCS font is too narrow */ if (wdiff % 2) { nss.xtra_width = (-wdiff)/2 + 1; dbcs_font.xtra_width = 1; #if defined(_ST) /*[*/ printf("SBCS odd\n"); #endif /*]*/ } else { nss.xtra_width = (-wdiff)/2; } #if defined(_ST) /*[*/ printf("DBCS wider %d\n", -wdiff); #endif /*]*/ } else { dbcs_font.xtra_width = nss.xtra_width = 0; #if defined(_ST) /*[*/ printf("Width matches.\n"); #endif /*]*/ } /* Add some extra on top of that. */ if ((xs = getenv("X3270_XWIDTH")) != NULL) { xx = atoi(xs); if (xx && xx < 10) { nss.xtra_width += xx; dbcs_font.xtra_width += 2*xx; } } nss.char_width += nss.xtra_width; dbcs_font.char_width += dbcs_font.xtra_width; /* * Compute height difference, doing ascent and descent * separately. */ adiff = nss.ascent - dbcs_font.ascent; if (adiff > 0) { #if defined(_ST) /*[*/ printf("SBCS higher by %d\n", adiff); #endif /*]*/ dbcs_font.ascent += adiff; dbcs_font.char_height += adiff; } else if (adiff < 0) { #if defined(_ST) /*[*/ printf("DBCS higher by %d\n", -adiff); #endif /*]*/ nss.ascent += -adiff; nss.char_height += -adiff; } else { #if defined(_ST) /*[*/ printf("Ascent matches\n"); #endif /*]*/ } ddiff = nss.descent - dbcs_font.descent; if (ddiff > 0) { #if defined(_ST) /*[*/ printf("SBCS lower by %d\n", ddiff); #endif /*]*/ dbcs_font.descent += ddiff; dbcs_font.char_height += ddiff; } else if (ddiff < 0) { #if defined(_ST) /*[*/ printf("DBCS lower by %d\n", -ddiff); #endif /*]*/ nss.descent += -ddiff; nss.char_height += -ddiff; } else { #if defined(_ST) /*[*/ printf("Descent matches\n"); #endif /*]*/ } /* Add a constant to the height. */ if ((xs = getenv("X3270_XHEIGHT")) != NULL) { xx = atoi(xs); if (xx && xx < 10) { dbcs_font.descent += xx; nss.descent += xx; nss.char_height += xx; } } } /* Set up a container for the menubar, screen and keypad */ if (toggled(SCROLL_BAR)) { scrollbar_width = SCROLLBAR_WIDTH; } else { scrollbar_width = 0; } if (cmask & (FONT_CHANGE | MODEL_CHANGE | SCROLL_CHANGE)) { Dimension sw; bool h_clip = false; if (fixed_width) { Dimension w, h; /* Compute the horizontal halo. */ w = SCREEN_WIDTH(ss->char_width, 0)+2 + scrollbar_width; if (w > fixed_width) { vtrace("Screen is too wide for fixed width, will clip\n"); hhalo = HHALO; h_clip = true; } else { /* Set the horizontal halo to center the screen. */ hhalo = (fixed_width - w) / 2; } /* Compute the vertical halo. */ h = menubar_qheight(fixed_width) + SCREEN_HEIGHT(ss->char_height, ss->descent, 0)+2; if (kp_placement == kp_integral && xappres.keypad_on) { /* * If the integral keypad is on, the fixed height includes it. */ h += keypad_qheight(); } if (h > fixed_height) { vtrace("Screen is too tall for fixed height, will clip\n"); vhalo = VHALO; } else { /* * Center the screen, sort of. * '3' is a magic number here -- the vertical halo is used once * above the screen and twice below. That should change. */ vhalo = (fixed_height - h) / 3; } } else { vhalo = VHALO; hhalo = HHALO; } /* Increase the horizontal halo to hold the integral keypad. */ sw = SCREEN_WIDTH(ss->char_width, hhalo)+2 + scrollbar_width; if (!h_clip && (!fixed_width || (min_keypad_width() < fixed_width)) && user_resize_allowed && kp_placement == kp_integral && xappres.keypad_on && min_keypad_width() > sw) { hhalo = (min_keypad_width() - (SCREEN_WIDTH(ss->char_width, 0)+2 + scrollbar_width)) / 2; } nss.screen_width = SCREEN_WIDTH(ss->char_width, hhalo); nss.screen_height = SCREEN_HEIGHT(ss->char_height, ss->descent, vhalo); } if (fixed_width) { container_width = fixed_width; } else { container_width = nss.screen_width+2 + scrollbar_width; } cwidth_nkp = container_width; if (container == NULL) { container = XtVaCreateManagedWidget( "container", huskWidgetClass, toplevel, XtNborderWidth, 0, XtNwidth, container_width, XtNheight, 10, /* XXX -- a temporary lie to make Xt happy */ NULL); save_00translations(container, &container_t00); set_translations(container, NULL, &container_t0); if (appres.interactive.mono) { XtVaSetValues(container, XtNbackgroundPixmap, gray, NULL); } else { XtVaSetValues(container, XtNbackground, keypadbg_pixel, NULL); } } /* Initialize the menu bar and integral keypad */ cwidth_curr = xappres.keypad_on? container_width: cwidth_nkp; menubar_height = menubar_qheight(cwidth_curr); menubar_init(container, container_width, cwidth_curr); if (fixed_height) { container_height = fixed_height; } else { container_height = menubar_height + nss.screen_height+2; if (kp_placement == kp_integral && xappres.keypad_on) { container_height += keypad_qheight(); } } if (kp_placement == kp_integral) { if (xappres.keypad_on) { (void) keypad_init(container, menubar_height + nss.screen_height+2, container_width, false, false); } else { ikeypad_destroy(); } } /* Create screen and set container dimensions */ inflate_screen(); /* Create scrollbar */ scrollbar_init((cmask & MODEL_CHANGE) != 0); XtRealizeWidget(toplevel); nss.window = XtWindow(nss.widget); set_mcursor(); /* Reinitialize the active icon. */ aicon_reinit(cmask); /* Reinitialize the status line. */ status_reinit(cmask); /* Initialize the input method. */ if ((cmask & CHARSET_CHANGE) && dbcs) { xim_init(); } cursor_changed = true; line_changed = true; /* Redraw the screen. */ xaction_internal(PA_Expose_xaction, IA_REDRAW, NULL, NULL); /* * We're all done processing the user's request, so allow normal resizing * again. */ clear_fixed(); } static void set_toplevel_sizes(const char *why) { Dimension tw, th; tw = container_width; th = container_height; if (fixed_width) { if (!maximized) { XtVaSetValues(toplevel, XtNwidth, fixed_width, XtNheight, fixed_height, NULL); vtrace("set_toplevel_sizes(%s), fixed: %dx%d\n", why, fixed_width, fixed_height); if (!user_resize_allowed) { XtVaSetValues(toplevel, XtNbaseWidth, fixed_width, XtNbaseHeight, fixed_height, XtNminWidth, fixed_width, XtNminHeight, fixed_height, XtNmaxWidth, fixed_width, XtNmaxHeight, fixed_height, NULL); } XtVaSetValues(container, XtNwidth, fixed_width, XtNheight, fixed_height, NULL); } main_width = fixed_width; main_height = fixed_height; } else { if (!maximized) { XtVaSetValues(toplevel, XtNwidth, tw, XtNheight, th, NULL); vtrace("set_toplevel_sizes(%s), not fixed: %hux%hu\n", why, tw, th); if (!allow_resize) { XtVaSetValues(toplevel, XtNbaseWidth, tw, XtNbaseHeight, th, XtNminWidth, tw, XtNminHeight, th, XtNmaxWidth, tw, XtNmaxHeight, th, NULL); } XtVaSetValues(container, XtNwidth, container_width, XtNheight, container_height, NULL); } main_width = tw; main_height = th; } /* * Start a timer ticking, in case the window manager doesn't approve * of the change. */ if (configure_ticking) { XtRemoveTimeOut(configure_id); } configure_id = XtAppAddTimeOut(appcontext, 500, configure_stable, 0); configure_ticking = true; keypad_move(); { static bool first = true; if (first) { first = false; } else { popups_move(); } } } static void inflate_screen(void) { /* Create the screen window */ if (nss.widget == NULL) { nss.widget = XtVaCreateManagedWidget( "screen", widgetClass, container, XtNwidth, nss.screen_width, XtNheight, nss.screen_height, XtNx, 0, XtNy, menubar_height, XtNbackground, appres.interactive.mono? xappres.background: colorbg_pixel, NULL); save_00translations(nss.widget, &screen_t00); set_translations(nss.widget, NULL, &screen_t0); } else { XtVaSetValues(nss.widget, XtNwidth, nss.screen_width, XtNheight, nss.screen_height, XtNx, 0, XtNy, menubar_height, XtNbackground, appres.interactive.mono? xappres.background: colorbg_pixel, NULL); } /* Set the container and toplevel dimensions */ XtVaSetValues(container, XtNwidth, container_width, XtNheight, container_height, NULL); set_toplevel_sizes("inflate_screen"); } /* Scrollbar support. */ void screen_set_thumb(float top, float shown) { if (toggled(SCROLL_BAR)) { XawScrollbarSetThumb(scrollbar, top, shown); } } static void screen_scroll_proc(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer position) { scroll_proc((long)position, (int)nss.screen_height); } static void screen_jump_proc(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer percent_ptr) { jump_proc(*(float *)percent_ptr); } /* Create, move, or reset the scrollbar. */ static void scrollbar_init(bool is_reset) { if (!scrollbar_width) { if (scrollbar != NULL) { XtUnmapWidget(scrollbar); } } else { if (scrollbar == NULL) { scrollbar = XtVaCreateManagedWidget( "scrollbar", scrollbarWidgetClass, container, XtNx, nss.screen_width+1, XtNy, menubar_height, XtNwidth, scrollbar_width-1, XtNheight, nss.screen_height, XtNbackground, appres.interactive.mono? xappres.background: keypadbg_pixel, NULL); XtAddCallback(scrollbar, XtNscrollProc, screen_scroll_proc, NULL); XtAddCallback(scrollbar, XtNjumpProc, screen_jump_proc, NULL); } else { XtVaSetValues(scrollbar, XtNx, nss.screen_width+1, XtNy, menubar_height, XtNwidth, scrollbar_width-1, XtNheight, nss.screen_height, XtNbackground, appres.interactive.mono? xappres.background: keypadbg_pixel, NULL); XtMapWidget(scrollbar); } XawScrollbarSetThumb(scrollbar, 0.0, 1.0); } /* * If the screen dimensions have changed, reallocate the scroll * save area. */ if (is_reset || !scroll_initted) { scroll_buf_init(); } else { rethumb(); } } /* Turn the scrollbar on or off */ static void toggle_scrollBar(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { scrollbar_changed = true; if (toggled(SCROLL_BAR)) { scrollbar_width = SCROLLBAR_WIDTH; screen_redo = REDO_SCROLLBAR; } else { scroll_to_bottom(); scrollbar_width = 0; } screen_reinit(SCROLL_CHANGE); if (toggled(SCROLL_BAR)) { rethumb(); } } /* * Called when a host connects, disconnects or changes NVT/3270 modes. */ static void screen_connect(bool ignored _is_unused) { if (ea_buf == NULL) { return; /* too soon */ } if (CONNECTED) { /* * Clear the screen. * If we're in NVT mode, go to the maximum screen dimensions, * otherwise go to the default 24x80 for 3270 or SSCP mode. */ ctlr_erase((IN_NVT || IN_SSCP)? true: false); if (IN_3270) { scroll_round(); } cursor_on("connect"); schedule_cursor_blink(); } else { if (appres.disconnect_clear) { ctlr_erase(true); } (void) cursor_off("connect"); } if (toggled(CROSSHAIR)) { screen_changed = true; first_changed = 0; last_changed = ROWS*COLS; screen_disp(false); } mcursor_normal(); } /* * Mouse cursor changes */ static void set_mcursor(void) { switch (mcursor_state) { case LOCKED: XDefineCursor(display, nss.window, xappres.locked_mcursor); break; case NORMAL: XDefineCursor(display, nss.window, xappres.normal_mcursor); break; case WAIT: XDefineCursor(display, nss.window, xappres.wait_mcursor); break; } lock_icon(mcursor_state); } void mcursor_normal(void) { if (CONNECTED) { mcursor_state = NORMAL; } else if (HALF_CONNECTED) { mcursor_state = WAIT; } else { mcursor_state = LOCKED; } set_mcursor(); } void mcursor_waiting(void) { mcursor_state = WAIT; set_mcursor(); } void mcursor_locked(void) { mcursor_state = LOCKED; set_mcursor(); } /* * Called from the keypad button to expose or hide the integral keypad. */ void screen_showikeypad(bool on) { if (on) { screen_redo = REDO_KEYPAD; } inflate_screen(); /* redundant now? */ screen_reinit(FONT_CHANGE); } /* * The host just wrote a blinking character; make sure it blinks */ void blink_start(void) { text_blinkers_exist = true; if (!text_blink_scheduled) { /* Start in "on" state and start first iteration */ text_blinking_on = true; schedule_text_blink(); } } /* * Restore blanked blinking text */ static void text_blink_it(XtPointer closure _is_unused, XtIntervalId *id _is_unused) { /* Flip the state. */ text_blinking_on = !text_blinking_on; /* Force a screen redraw. */ ctlr_changed(0, ROWS*COLS); /* If there is still blinking text, schedule the next iteration */ if (text_blinkers_exist) { schedule_text_blink(); } else { text_blink_scheduled = false; } } /* * Schedule an event to restore blanked blinking text */ static void schedule_text_blink(void) { text_blink_scheduled = true; text_blink_id = XtAppAddTimeOut(appcontext, 500, text_blink_it, 0); } /* * Fill in an XChar2b from an APL character. */ static void apl_display_char(XChar2b *text, unsigned char apl) { if (ss->extended_3270font) { text->byte1 = 1; text->byte2 = ebc2cg0[apl]; } else { if (ss->font_16bit) { *text = apl_to_udisplay(ss->d8_ix, apl); } else { *text = apl_to_ldisplay(apl); } } } /* * Return the vertical crosshair character for the current font. */ XChar2b screen_vcrosshair(void) { XChar2b v; apl_display_char(&v, 0xbf); return v; } /* * Return a GC for drawing the crosshair. */ GC screen_crosshair_gc(void) { return screen_gc(CROSS_COLOR); } /* Draw the line at the top of the OIA. */ static void draw_oia_line(void) { XDrawLine(display, ss->window, get_gc(ss, GC_NONDEFAULT | DEFAULT_PIXEL), 0, nss.screen_height - nss.char_height - 3, ssCOL_TO_X(maxCOLS)+hhalo, nss.screen_height - nss.char_height - 3); } /* * Draw or erase the crosshair in the margin between the primary and alternate * screens. */ static void crosshair_margin(bool draw, const char *why) { int column; int hhalo_chars = 0, vhalo_chars = 0; #ifdef CROSSHAIR_DEBUG /*[*/ vtrace("crosshair_margin(%s, %s) cursor=%d", why, draw? "draw": "undraw", draw? cursor_addr: ss->cursor_daddr); #endif /*]*/ /* Compute the number of halo characters. */ if (hhalo > HHALO) { hhalo_chars = (hhalo + (ss->char_width - 1)) / ss->char_width; } if (vhalo > VHALO) { vhalo_chars = (vhalo + (ss->char_height - 1)) / ss->char_height; } if (draw) { int nhx; XTextItem16 text1; int i; ss->xh_alt = false; /* Compute the cursor column. */ column = BA_TO_COL(cursor_addr); if (flipped) { column = (cCOLS - 1) - column; } /* Set up an array of characters for drawing horizonal lines. */ nhx = maxCOLS - cCOLS; if (hhalo_chars > nhx) { nhx = hhalo_chars; } if (nhx > 0 && (ss->hx_text == NULL || ss->nhx_text < nhx)) { ss->nhx_text = nhx; Replace(ss->hx_text, (XChar2b *)Malloc(nhx * sizeof(XChar2b))); for (i = 0; i < nhx; i++) { apl_display_char(&ss->hx_text[i], 0xa2); } } /* To the right. */ if (maxCOLS > cCOLS) { text1.chars = ss->hx_text; text1.nchars = maxCOLS - cCOLS; text1.delta = 0; text1.font = ss->fid; XDrawText16(display, ss->window, get_gc(ss, CROSS_COLOR), ssCOL_TO_X(cCOLS), ssROW_TO_Y(BA_TO_ROW(cursor_addr)), &text1, 1); /* Remember we need to erase later. */ ss->xh_alt = true; } /* Down the bottom. */ if (maxROWS > ROWS) { XChar2b text; apl_display_char(&text, 0xbf); text1.chars = &text; text1.nchars = 1; text1.delta = 0; text1.font = ss->fid; for (i = ROWS; i < maxROWS; i++) { XDrawText16(display, ss->window, get_gc(ss, CROSS_COLOR), ssCOL_TO_X(column), ssROW_TO_Y(i), &text1, 1); } /* Remember we need to erase later. */ ss->xh_alt = true; } /* Inside the vertical halo. */ if (vhalo_chars) { XChar2b text; apl_display_char(&text, 0xbf); text1.chars = &text; text1.nchars = 1; text1.delta = 0; text1.font = ss->fid; for (i = -vhalo_chars; i < 0; i++) { XDrawText16(display, ss->window, get_gc(ss, CROSS_COLOR), ssCOL_TO_X(column), ssROW_TO_Y(i), &text1, 1); } for (i = maxROWS; i < maxROWS + (2 * vhalo_chars); i++) { XDrawText16(display, ss->window, get_gc(ss, CROSS_COLOR), ssCOL_TO_X(column), ssROW_TO_Y(i), &text1, 1); } } /* In the horizontal halo. */ if (hhalo_chars) { text1.chars = ss->hx_text; text1.nchars = hhalo_chars; text1.delta = 0; text1.font = ss->fid; XDrawText16(display, ss->window, get_gc(ss, CROSS_COLOR), ssCOL_TO_X(-hhalo_chars), ssROW_TO_Y(BA_TO_ROW(cursor_addr)), &text1, 1); XDrawText16(display, ss->window, get_gc(ss, CROSS_COLOR), ssCOL_TO_X(maxCOLS), ssROW_TO_Y(BA_TO_ROW(cursor_addr)), &text1, 1); } #ifdef CROSSHAIR_DEBUG /*[*/ vtrace(" -> %s\n", ss->xh_alt? "draw": "nop"); #endif /*]*/ goto fix_status; } /* Erasing. */ /* Compute the column. */ column = BA_TO_COL(ss->cursor_daddr); if (flipped) { column = (COLS - 1) - column; } if (vhalo_chars) { /* Vertical halo. */ XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(column), /* x */ ssROW_TO_Y(-vhalo_chars) - ss->ascent, /* y */ ss->char_width + 1, /* width */ ss->char_height * vhalo_chars /* height */); XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(column), /* x */ ssROW_TO_Y(maxROWS) - ss->ascent, /* y */ ss->char_width + 1, /* width */ ss->char_height * (2 * vhalo_chars) /* height */); } if (hhalo_chars) { /* Horizontal halo. */ XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(-hhalo_chars), ssROW_TO_Y(BA_TO_ROW(ss->cursor_daddr)) - ss->ascent, (ss->char_width * hhalo_chars) + 1, ss->char_height); XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(maxCOLS), ssROW_TO_Y(BA_TO_ROW(ss->cursor_daddr)) - ss->ascent, (ss->char_width * hhalo_chars) + 1, ss->char_height); } if (!ss->xh_alt) { #ifdef CROSSHAIR_DEBUG /*[*/ vtrace(" -> nop\n"); #endif /*]*/ goto fix_status; } #ifdef CROSSHAIR_DEBUG /*[*/ vtrace(" -> erase\n"); #endif /*]*/ /* To the right. */ if (maxCOLS > defCOLS) { XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(defCOLS), ssROW_TO_Y(BA_TO_ROW(ss->cursor_daddr)) - ss->ascent, (ss->char_width * (maxCOLS - defCOLS)) + 1, ss->char_height); } /* Down the bottom. */ if (maxROWS > defROWS) { XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(column), ssROW_TO_Y(defROWS) - ss->ascent, ss->char_width + 1, ss->char_height * (maxROWS - defROWS)); } ss->xh_alt = false; fix_status: status_touch(); /* could be more efficient */ status_disp(); draw_oia_line(); } /* * Make the (displayed) cursor disappear. Returns a bool indiciating if * the cursor was on before the call. */ static bool cursor_off(const char *why) { if (cursor_displayed) { cursor_displayed = false; put_cursor(ss->cursor_daddr, false); /* * Erase the crosshair in the empty region between the primary * and alternate screens. */ if (toggled(CROSSHAIR)) { crosshair_margin(false, why); status_crosshair_off(); } return true; } else { return false; } } /* * Blink the cursor */ static void cursor_blink_it(XtPointer closure _is_unused, XtIntervalId *id _is_unused) { cursor_blink_pending = false; if (!CONNECTED || !toggled(CURSOR_BLINK)) { return; } if (cursor_displayed) { if (in_focus) { (void) cursor_off("blink"); } } else { cursor_on("blink"); } schedule_cursor_blink(); } /* * Schedule a cursor blink */ static void schedule_cursor_blink(void) { if (!toggled(CURSOR_BLINK) || cursor_blink_pending) { return; } cursor_blink_pending = true; cursor_blink_id = XtAppAddTimeOut(appcontext, 500, cursor_blink_it, 0); } /* * Cancel a cursor blink */ static void cancel_blink(void) { if (cursor_blink_pending) { XtRemoveTimeOut(cursor_blink_id); cursor_blink_pending = false; } } /* * Toggle cursor blinking (called from menu) */ static void toggle_cursorBlink(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { if (!CONNECTED) { return; } if (toggled(CURSOR_BLINK)) { schedule_cursor_blink(); } else { cursor_on("toggleBlink"); } } /* * Make the cursor visible at its (possibly new) location. */ static void cursor_on(const char *why) { if (cursor_enabled && !cursor_displayed) { cursor_displayed = true; put_cursor(cursor_addr, true); ss->cursor_daddr = cursor_addr; cursor_changed = false; /* * Draw in the crosshair in the empty region between the primary * and alternate screens. */ if (in_focus && toggled(CROSSHAIR)) { int column; crosshair_margin(true, why); column = cursor_addr % COLS; if (flipped) { column = (COLS - 1) - column; } status_crosshair(column); } } } /* * Toggle the cursor (block/underline). */ static void toggle_altCursor(toggle_index_t ix, enum toggle_type tt _is_unused) { bool was_on; /* do_toggle already changed the value; temporarily change it back */ toggle_toggle(ix); was_on = cursor_off("toggleAlt"); /* Now change it back again */ toggle_toggle(ix); if (was_on) { cursor_on("toggleAlt"); } } /* * Move the cursor to the specified buffer address. */ void cursor_move(int baddr) { cursor_addr = baddr; cursor_pos(); } /* * Display the cursor position on the status line */ static void cursor_pos(void) { if (!toggled(CURSOR_POS) || !CONNECTED) { return; } status_cursor_pos(cursor_addr); } /* * Toggle the display of the cursor position */ static void toggle_cursorPos(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { if (toggled(CURSOR_POS)) { cursor_pos(); } else { status_uncursor_pos(); } } /* * Enable or disable cursor display (used by scroll logic) */ void enable_cursor(bool on) { if ((cursor_enabled = on) && CONNECTED) { cursor_on("enable"); cursor_changed = true; } else { (void) cursor_off("enable"); } } /* * Toggle the crosshair cursor. */ static void toggle_crosshair(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { bool turning_off = false; if (!toggled(CROSSHAIR)) { /* * Turning it off. Turn it on momemtarily while we turn off the cursor, * so it gets erased. */ turning_off = true; toggle_toggle(CROSSHAIR); } /* * Flip the cursor, which will undraw or draw the crosshair in the margins. * * Don't forget to turn the toggle back off, if we temporarily turned it * on above. */ if (cursor_off("toggleCrosshair")) { if (turning_off) { toggle_toggle(CROSSHAIR); } cursor_on("toggleCrosshair"); } else { if (turning_off) { toggle_toggle(CROSSHAIR); } } /* Refresh the screen. */ screen_changed = true; first_changed = 0; last_changed = ROWS*COLS; screen_disp(false); } /* * Toggle visible control characters. */ static void toggle_visible_control(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { visible_control = toggled(VISIBLE_CONTROL); screen_changed = true; first_changed = 0; last_changed = ROWS*COLS; screen_disp(false); } /* * Redraw the screen. */ static void do_redraw(Widget w, XEvent *event, String *params _is_unused, Cardinal *num_params _is_unused) { int x, y, width, height; int startcol, ncols; int startrow, endrow, row; int i; int c0; if (w == nss.widget) { keypad_first_up(); if (xappres.active_icon && iconic) { ss = &nss; iconic = false; } } else if (xappres.active_icon && w == iss.widget) { if (xappres.active_icon && !iconic) { ss = &iss; iconic = true; } } else if (event) { return; } /* Only redraw as necessary for an expose event */ if (event && event->type == Expose) { ss->exposed_yet = true; x = event->xexpose.x; y = event->xexpose.y; width = event->xexpose.width; height = event->xexpose.height; startrow = ssY_TO_ROW(y); if (startrow < 0) { startrow = 0; } if (startrow > 0) { startrow--; } endrow = ssY_TO_ROW(y+height); endrow = endrow >= maxROWS ? maxROWS : endrow + 1; startcol = ssX_TO_COL(x); if (startcol < 0) { startcol = 0; } if (startcol > 0) { startcol--; } if (startcol >= maxCOLS) { goto no_draw; } ncols = (width / ss->char_width) + 2; if (startcol + ncols > maxCOLS) { ncols = maxCOLS - startcol; } while ((ROWCOL_TO_BA(startrow, startcol) % maxCOLS) + ncols > maxCOLS) { ncols--; } for (row = startrow; row < endrow; row++) { (void) memset((char *) &ss->image[ROWCOL_TO_BA(row, startcol)], 0, ncols * sizeof(union sp)); if (visible_control) { c0 = ROWCOL_TO_BA(row, startcol); for (i = 0; i < ncols; i++) { ss->image[c0 + i].bits.cc = EBC_space; } } } no_draw: ; } else { XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), 0, 0, ss->screen_width, ss->screen_height); (void) memset((char *) ss->image, 0, (maxROWS*maxCOLS) * sizeof(union sp)); if (visible_control) { for (i = 0; i < maxROWS*maxCOLS; i++) { ss->image[i].bits.cc = EBC_space; } } ss->copied = false; } ctlr_changed(0, ROWS*COLS); cursor_changed = true; if (!xappres.active_icon || !iconic) { line_changed = true; status_touch(); } } /* * Explicitly redraw the screen (invoked from the keyboard). */ void Redraw_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { xaction_debug(Redraw_xaction, event, params, num_params); do_redraw(w, event, params, num_params); } /* * Implicitly redraw the screen (triggered by Expose events). */ void PA_Expose_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_Expose_xaction, event, params, num_params); #endif /*]*/ do_redraw(w, event, params, num_params); } /* * Redraw the changed parts of the screen. */ void screen_disp(bool erasing) { /* No point in doing anything if we aren't visible yet. */ if (!ss->exposed_yet) { return; } /* * We don't set "cursor_changed" when the host moves the cursor, * 'cause he might just move it back later. Set it here if the cursor * has moved since the last call to screen_disp. */ if (cursor_addr != ss->cursor_daddr) { cursor_changed = true; } /* If the cursor has moved, tell the input method. */ if (cursor_changed && ic != NULL && style == (XIMPreeditPosition|XIMStatusNothing)) { #if defined(_ST) /*[*/ printf("spot_loc%s\n", rcba(cursor_addr)); #endif /*]*/ send_spot_loc(); } /* * If only the cursor has changed (and not the screen image), draw it. */ if (cursor_changed && !screen_changed) { if (cursor_off("disp")) { cursor_on("disp"); } if (toggled(CROSSHAIR)) { screen_changed = true; /* repaint crosshair */ } } /* * Redraw the parts of the screen that need refreshing, and redraw the * cursor if necessary. */ if (screen_changed) { bool was_on = false; /* Draw the new screen image into "temp_image" */ if (screen_changed) { if (erasing) { crosshair_enabled = false; } draw_fields(temp_image, first_changed, last_changed); if (erasing) { crosshair_enabled = true; } } /* Set "cursor_changed" if the text under it has changed. */ if (ss->image[fl_baddr(cursor_addr)].word != temp_image[fl_baddr(cursor_addr)].word) { cursor_changed = true; } /* Undraw the cursor, if necessary. */ if (cursor_changed) { was_on = cursor_off("cursorChanged"); } /* Intelligently update the X display with the new text. */ resync_display(temp_image, first_changed, last_changed); /* Redraw the cursor. */ if (was_on) { cursor_on("cursorChanged"); } screen_changed = false; first_changed = -1; last_changed = -1; } if (!xappres.active_icon || !iconic) { /* Refresh the status line. */ status_disp(); /* Refresh the line across the bottom of the screen. */ if (line_changed) { draw_oia_line(); line_changed = false; } } draw_aicon_label(); } /* * Render a blank rectangle on the X display. */ static void render_blanks(int baddr, int height, union sp *buffer) { int x, y; #if defined(_ST) /*[*/ (void) printf("render_blanks(baddr=%s, height=%d)\n", rcba(baddr), height); #endif /*]*/ x = ssCOL_TO_X(BA_TO_COL(baddr)); y = ssROW_TO_Y(BA_TO_ROW(baddr)); XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), x, y - ss->ascent, (ss->char_width * COLS) + 1, (ss->char_height * height)); (void) memmove(&ss->image[baddr], &buffer[baddr], COLS * height *sizeof(union sp)); } /* * Check if a region of the screen is effectively empty: all blanks or nulls * with no extended highlighting attributes and not selected. * * Works _only_ with non-debug fonts. */ static bool empty_space(register union sp *buffer, int len) { int i; for (i = 0; i < len; i++, buffer++) { if (buffer->bits.gr || buffer->bits.sel || (buffer->bits.fg & INVERT_MASK) || (buffer->bits.cs != CS_BASE) || !BKM_ISSET(buffer->bits.cc)) { return false; } } return true; } /* * Reconcile the differences between a region of 'buffer' (what we want on * the X display) and ss->image[] (what is on the X display now). The region * must not span lines. */ static void resync_text(int baddr, int len, union sp *buffer) { static bool ever = false; static unsigned long cmask = 0L; static unsigned long gmask = 0L; #if defined(_ST) /*[*/ (void) printf("resync_text(baddr=%s, len=%d)\n", rcba(baddr), len); #endif /*]*/ /* * If the region begins on the right half of a DBCS character, back * up one. */ if (baddr % COLS) { enum dbcs_state d; d = ctlr_dbcs_state(baddr); if (IS_RIGHT(d)) { baddr--; len++; } } if (!ever) { union sp b; /* Create masks for the "important" fields in an sp. */ b.word = 0L; b.bits.fg = COLOR_MASK | INVERT_MASK; b.bits.sel = 1; b.bits.gr = GR_UNDERLINE | GR_INTENSIFY; cmask = b.word; b.word = 0L; b.bits.fg = INVERT_MASK; b.bits.sel = 1; b.bits.gr = 0xf; gmask = b.word; ever = true; } if (!visible_control && len > 1 && empty_space(&buffer[baddr], len)) { int x, y; x = ssCOL_TO_X(BA_TO_COL(baddr)); y = ssROW_TO_Y(BA_TO_ROW(baddr)); /* All empty, fill a rectangle */ #if defined(_ST) /*[*/ (void) printf("FillRectangle(baddr=%s, len=%d)\n", rcba(baddr), len); #endif /*]*/ XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), x, y - ss->ascent, (ss->char_width * len) + 1, ss->char_height); } else { unsigned long attrs, attrs2; bool has_gr, has_gr2; bool empty, empty2; union sp ra; int i; int i0 = 0; ra = buffer[baddr]; /* Note the characteristics of the beginning of the region. */ attrs = buffer[baddr].word & cmask; has_gr = (buffer[baddr].word & gmask) != 0; empty = !has_gr && BKM_ISSET(buffer[baddr].bits.cc); for (i = 0; i < len; i++) { /* Note the characteristics of this character. */ attrs2 = buffer[baddr+i].word & cmask; has_gr2 = (buffer[baddr+i].word & gmask) != 0; empty2 = !has_gr2 && BKM_ISSET(buffer[baddr+i].bits.cc); /* If this character has exactly the same attributes as the current region, simply add it, noting that the region might now not be empty. */ if (attrs2 == attrs) { if (!empty2) { empty = 0; } continue; } /* If this character is empty, and the current region has no GR attributes, pretend it matches. */ if (empty2 && !has_gr) { continue; } /* If the current region is empty, this character isn't empty, and this character has no GR attributes, change the current region's attributes to this character's attributes and add it. */ if (empty && !empty2 && !has_gr2) { attrs = attrs2; has_gr = has_gr2; empty = empty2; ra = buffer[baddr+i]; continue; } /* Dump the region and start a new one with this character. */ #if defined(_ST) /*[*/ printf("%s:%d: rt%s\n", __FUNCTION__, __LINE__, rcba(baddr+i0)); #endif /*]*/ render_text(&buffer[baddr+i0], baddr+i0, i - i0, false, &ra); attrs = attrs2; has_gr = has_gr2; empty = empty2; i0 = i; ra = buffer[baddr+i]; } /* Dump the remainder of the region. */ #if defined(_ST) /*[*/ printf("%s:%d: rt%s\n", __FUNCTION__, __LINE__, rcba(baddr+i0)); #endif /*]*/ render_text(&buffer[baddr+i0], baddr+i0, len - i0, false, &ra); } /* The X display is now correct; update ss->image[]. */ (void) memmove(&ss->image[baddr], &buffer[baddr], len*sizeof(union sp)); } /* * Get a font index for an EBCDIC character. * Returns a blank if there is no mapping. * * Note that the EBCDIC character can be 16 bits (DBCS), and the output might * be 16 bits as well. */ static unsigned short font_index(ebc_t ebc, int d8_ix, bool upper) { ucs4_t ucs4; int d; ucs4 = ebcdic_base_to_unicode(ebc, EUO_BLANK_UNDEF | EUO_UPRIV); if (upper && ucs4 < 0x80 && islower(ucs4)) { ucs4 = toupper(ucs4); } d = display8_lookup(d8_ix, ucs4); if (d < 0) { d = display8_lookup(d8_ix, ' '); } return d; } /* * Attempt to map an APL character to a DEC line-drawing character in the * first 32 bytes of an old 8-bit X11 font. */ static int apl_to_linedraw(ebc_t c) { switch (c) { case 0xaf: /* degree */ return 0x7; case 0xd4: /* LR corner */ return 0xb; case 0xd5: /* UR corner */ return 0xc; case 0xc5: /* UL corner */ return 0xd; case 0xc4: /* LL corner */ return 0xe; case 0xd3: /* plus */ return 0xf; case 0xa2: /* middle horizontal */ return 0x12; case 0xc6: /* left tee */ return 0x15; case 0xd6: /* right tee */ return 0x16; case 0xc7: /* bottom tee */ return 0x17; case 0xd7: /* top tee */ return 0x18; case 0xbf: /* stile */ case 0x85: /* vertical line */ return 0x19; case 0x8c: /* less or equal */ return 0x1a; case 0xae: /* greater or equal */ return 0x1b; case 0xbe: /* not equal */ return 0x1d; case 0xa3: /* bullet */ return 0x1f; case 0xad: return '['; case 0xbd: return ']'; default: return -1; } } /* Map an APL character to the current display character set. */ static XChar2b apl_to_udisplay(int d8_ix, unsigned char c) { XChar2b x; int u = -1; int d = 0; /* Look it up. */ u = apl_to_unicode(c, EUO_NONE | xappres.apl_circled_alpha? EUO_APL_CIRCLED: 0); if (u != -1) { d = display8_lookup(d8_ix, u); } /* Default to a space. */ if (d == 0) { d = display8_lookup(d8_ix, ' '); } /* Return it. */ x.byte1 = (d >> 8) & 0xff; x.byte2 = d & 0xff; return x; } /* Map an APL character to the old first-32 8-bit X11 display character set. */ static XChar2b apl_to_ldisplay(unsigned char c) { XChar2b x; int u = -1; /* Look it up, defaulting to a space. */ u = apl_to_linedraw(c); if (u == -1) { u = ' '; } /* Return it. */ x.byte1 = 0; x.byte2 = u; return x; } /* Map a line-drawing character to the current display character set. */ static XChar2b linedraw_to_udisplay(int d8_ix, unsigned char c) { XChar2b x; int u = -1; int d = 0; /* Look it up. */ u = linedraw_to_unicode(c); if (u != -1) { d = display8_lookup(d8_ix, u); } /* Default to a space. */ if (d == 0) { d = display8_lookup(d8_ix, ' '); } /* Return it. */ x.byte1 = (d >> 8) & 0xff; x.byte2 = d & 0xff; return x; } /* * Render text onto the X display. The region must not span lines. */ static void render_text(union sp *buffer, int baddr, int len, bool block_cursor, union sp *attrs) { int color; int x, y; GC dgc = (GC)None; /* drawing text */ GC cleargc = (GC)None; /* clearing under undersized characters */ int sel = attrs->bits.sel; register int i, j; bool one_at_a_time = false; int d8_ix = ss->d8_ix; XTextItem16 text[64]; /* fixed size is a hack */ int n_texts = -1; bool in_dbcs = false; int clear_len = 0; int n_sbcs = 0; int n_dbcs = 0; #if defined(_ST) /*[*/ (void) printf("render_text(baddr=%s, len=%d)\n", rcba(baddr), len); #endif /*]*/ /* * If the region starts with the right-hand side of a DBCS, back off * one column. */ switch (ctlr_dbcs_state(baddr)) { case DBCS_RIGHT: /* * Lots of assumptions -- the buffer really does go back one byte, * and baddr is greater than zero. */ #if defined(_ST) /*[*/ (void) printf("render_text: backing off\n"); #endif /*]*/ buffer--; baddr--; len++; break; default: break; } for (i = 0, j = 0; i < len; i++) { if (buffer[i].bits.cs != CS_DBCS || !dbcs || iconic) { if (n_texts < 0 || in_dbcs) { /* Switch from nothing or DBCS, to SBCS. */ #if defined(_ST) /*[*/ fprintf(stderr, "SBCS starts at %s\n", rcba(baddr + i)); #endif /*]*/ in_dbcs = false; n_texts++; text[n_texts].chars = &rt_buf[j]; text[n_texts].nchars = 0; text[n_texts].delta = 0; text[n_texts].font = ss->fid; n_sbcs++; } /* In SBCS. */ clear_len += ss->char_width; } else { if (n_texts < 0 || !in_dbcs) { /* Switch from nothing or SBCS, to DBCS. */ #if defined(_ST) /*[*/ fprintf(stderr, "DBCS starts at %s\n", rcba(baddr + i)); #endif /*]*/ in_dbcs = true; n_texts++; text[n_texts].chars = &rt_buf[j]; text[n_texts].nchars = 0; text[n_texts].delta = 0; text[n_texts].font = dbcs_font.font; n_dbcs++; } /* In DBCS. */ clear_len += 2 * ss->char_width; } switch (buffer[i].bits.cs) { case CS_BASE: /* latin-1 */ rt_buf[j].byte1 = 0; if (toggled(MONOCASE)) { rt_buf[j].byte2 = font_index(buffer[i].bits.cc, d8_ix, true); } else { if (visible_control) { if (buffer[i].bits.cc == EBC_so) { rt_buf[j].byte1 = 0; rt_buf[j].byte2 = font_index(EBC_less, d8_ix, false); } else if (buffer[i].bits.cc == EBC_si) { rt_buf[j].byte1 = 0; rt_buf[j].byte2 = font_index(EBC_greater, d8_ix, false); } else { unsigned short c = font_index(buffer[i].bits.cc, d8_ix, false); rt_buf[j].byte1 = (c >> 8) & 0xff; rt_buf[j].byte2 = c & 0xff; } } else { unsigned short c = font_index(buffer[i].bits.cc, d8_ix, false); rt_buf[j].byte1 = (c >> 8) & 0xff; rt_buf[j].byte2 = c & 0xff; } } j++; break; case CS_APL: /* GE (apl) */ case CS_BASE | CS_GE: if (ss->extended_3270font) { rt_buf[j].byte1 = 1; rt_buf[j].byte2 = ebc2cg0[buffer[i].bits.cc]; } else { if (ss->font_16bit) { rt_buf[j] = apl_to_udisplay(d8_ix, buffer[i].bits.cc); } else { rt_buf[j] = apl_to_ldisplay(buffer[i].bits.cc); } } j++; break; case CS_LINEDRAW: /* DEC line drawing */ if (ss->standard_font) { if (ss->font_16bit) { rt_buf[j] = linedraw_to_udisplay(d8_ix, buffer[i].bits.cc); } else { /* Assume the first 32 characters are line-drawing. */ rt_buf[j].byte1 = 0; rt_buf[j].byte2 = buffer[i].bits.cc; } } else { if (ss->extended_3270font) { rt_buf[j].byte1 = 2; rt_buf[j].byte2 = buffer[i].bits.cc; } else { rt_buf[j].byte1 = 0; rt_buf[j].byte2 = 0; } } j++; break; case CS_DBCS: /* DBCS */ if (dbcs) { xlate_dbcs(buffer[i].bits.cc, buffer[i+1].bits.cc, &rt_buf[j]); /* Skip the next byte as well. */ i++; } else { rt_buf[j].byte1 = 0; rt_buf[j].byte2 = font_index(EBC_space, d8_ix, false); } j++; break; } text[n_texts].nchars++; } n_texts++; /* Check for one-at-a-time mode. */ if (ss->funky_font) { for (i = 0; i < len; i++) { if (!rt_buf[i].byte1 && (IS_ODD(ss->odd_width, rt_buf[i].byte2) || IS_ODD(ss->odd_lbearing, rt_buf[i].byte2))) { one_at_a_time = true; break; } } } x = ssCOL_TO_X(BA_TO_COL(baddr)); y = ssROW_TO_Y(BA_TO_ROW(baddr)); color = attrs->bits.fg; /* Select the GCs. */ if (sel && !block_cursor) { /* Selected, but not a block cursor. */ if (!appres.interactive.mono) { /* Color: Use the special select GCs. */ dgc = get_selgc(ss, color); cleargc = ss->clrselgc; } else { /* Mono: Invert the color. */ dgc = get_gc(ss, INVERT_COLOR(color)); cleargc = get_gc(ss, color); } } else if (block_cursor && !(appres.interactive.mono && sel)) { /* Block cursor, but neither mono nor selected. */ if (xappres.use_cursor_color) { /* Use the specific-color inverted GC. */ dgc = ss->invucgc; cleargc = ss->ucgc; } else { /* Just invert the specified color. */ dgc = get_gc(ss, INVERT_COLOR(color)); cleargc = get_gc(ss, color); } } else { /* Ordinary text, or a selected block cursor. */ dgc = get_gc(ss, color); cleargc = get_gc(ss, INVERT_COLOR(color)); } /* Draw the text */ XFillRectangle(display, ss->window, cleargc, x, y - ss->ascent, clear_len, ss->char_height); #if defined(_ST) /*[*/ { int k, l; for (k = 0; k < n_texts; k++) { printf("text[%d]: %d chars, %s:", k, text[k].nchars, (text[k].font == dbcs_font.font)? "dbcs": "sbcs"); for (l = 0; l < text[k].nchars; l++) { printf(" %02x%02x", text[k].chars[l].byte1, text[k].chars[l].byte2); } printf("\n"); } } #endif /*]*/ if (one_at_a_time || (n_sbcs && ss->xtra_width) || (n_dbcs && dbcs_font.xtra_width)) { int i, j; int xn = x; XTextItem16 text1; /* XXX: do overstrike */ for (i = 0; i < n_texts; i++) { if (one_at_a_time || text[i].font == ss->fid) { if (one_at_a_time || ss->xtra_width) { for (j = 0; j < text[i].nchars; j++) { text1.chars = &text[i].chars[j]; text1.nchars = 1; text1.delta = 0; text1.font = ss->fid; XDrawText16(display, ss->window, dgc, xn, y, &text1, 1); xn += ss->char_width; } } else { XDrawText16(display, ss->window, dgc, xn, y, &text[i], 1); xn += ss->char_width * text[i].nchars; } } else { if (dbcs_font.xtra_width) { for (j = 0; j < text[i].nchars; j++) { text1.chars = &text[i].chars[j]; text1.nchars = 1; text1.delta = 0; text1.font = dbcs_font.font; XDrawText16(display, ss->window, dgc, xn, y, &text1, 1); xn += dbcs_font.char_width; } } else { XDrawText16(display, ss->window, dgc, xn, y, &text[i], 1); xn += dbcs_font.char_width * text[i].nchars; } } } } else { XDrawText16(display, ss->window, dgc, x, y, text, n_texts); if (ss->overstrike && ((attrs->bits.gr & GR_INTENSIFY) || ((appres.interactive.mono || (!appres.m3279 && highlight_bold)) && ((color & BASE_MASK) == FA_INT_HIGH_SEL)))) { XDrawText16(display, ss->window, dgc, x+1, y, text, n_texts); } } if (attrs->bits.gr & GR_UNDERLINE) { XDrawLine(display, ss->window, dgc, x, y - ss->ascent + ss->char_height - 1, x + clear_len, y - ss->ascent + ss->char_height - 1); } } bool screen_obscured(void) { return ss->obscured; } /* * Scroll the screen image one row. * * This is the optimized path from ctlr_scroll(); it assumes that ea_buf[] has * already been modified and that the screen can be brought into sync by * hammering ss->image and the bitmap. */ void screen_scroll(void) { bool was_on; if (!ss->exposed_yet) { return; } was_on = cursor_off("scroll"); (void) memmove(&ss->image[0], &ss->image[COLS], (ROWS - 1) * COLS * sizeof(union sp)); (void) memmove(&temp_image[0], &temp_image[COLS], (ROWS - 1) * COLS * sizeof(union sp)); (void) memset((char *)&ss->image[(ROWS - 1) * COLS], 0, COLS * sizeof(union sp)); (void) memset((char *)&temp_image[(ROWS - 1) * COLS], 0, COLS * sizeof(union sp)); XCopyArea(display, ss->window, ss->window, get_gc(ss, 0), ssCOL_TO_X(0), ssROW_TO_Y(1) - ss->ascent, ss->char_width * COLS, ss->char_height * (ROWS - 1), ssCOL_TO_X(0), ssROW_TO_Y(0) - ss->ascent); ss->copied = true; XFillRectangle(display, ss->window, get_gc(ss, INVERT_COLOR(0)), ssCOL_TO_X(0), ssROW_TO_Y(ROWS - 1) - ss->ascent, (ss->char_width * COLS) + 1, ss->char_height); if (was_on) { cursor_on("scroll"); } } /* * Toggle mono-/dual-case mode. */ static void toggle_monocase(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { (void) memset((char *)ss->image, 0, (ROWS*COLS) * sizeof(union sp)); ctlr_changed(0, ROWS*COLS); } /** * Toggle timing display. */ static void toggle_showTiming(toggle_index_t ix _is_unused, enum toggle_type tt _is_unused) { if (!toggled(SHOW_TIMING)) { status_untiming(); } } /* * Toggle screen flip */ void screen_flip(void) { /* Flip mode is broken in the DBCS version. */ if (!dbcs) { flipped = !flipped; xaction_internal(PA_Expose_xaction, IA_REDRAW, NULL, NULL); } } /* * Return a visible control character for a field attribute. */ static unsigned char visible_ebcdic(unsigned char fa) { static unsigned char varr[32] = { EBC_0, EBC_1, EBC_2, EBC_3, EBC_4, EBC_5, EBC_6, EBC_7, EBC_8, EBC_9, EBC_A, EBC_B, EBC_C, EBC_D, EBC_E, EBC_F, EBC_G, EBC_H, EBC_I, EBC_J, EBC_K, EBC_L, EBC_M, EBC_N, EBC_O, EBC_P, EBC_Q, EBC_R, EBC_S, EBC_T, EBC_U, EBC_V }; unsigned ix; /* * This code knows that: * FA_PROTECT is 0b100000, and we map it to 0b010000 * FA_NUMERIC is 0b010000, and we map it to 0b001000 * FA_INTENSITY is 0b001100, and we map it to 0b000110 * FA_MODIFY is 0b000001, and we copy to 0b000001 */ ix = ((fa & (FA_PROTECT | FA_NUMERIC | FA_INTENSITY)) >> 1) | (fa & FA_MODIFY); return varr[ix]; } /* * Map a row and column to a crosshair character. */ static unsigned char map_crosshair(int baddr) { if (baddr == cursor_addr) { /* Cross. */ return 0xd3; } else if (baddr / cCOLS == cursor_addr / cCOLS) { /* Horizontal. */ return 0xa2; } else { /* Vertical. */ return 0xbf; } } /* * "Draw" ea_buf into a buffer */ static void draw_fields(union sp *buffer, int first, int last) { int baddr = 0; int faddr; unsigned char fa; struct ea *field_ea; struct ea *sbp = ea_buf; int field_color; int zero; bool any_blink = false; int crossable = CROSSABLE; enum dbcs_state d; int cursor_col = 0, cursor_row = 0; /* Set up cursor_col/cursor_row. */ if (crossable) { cursor_col = BA_TO_COL(cursor_addr); cursor_row = BA_TO_ROW(cursor_addr); } /* If there is any blinking text, override the suggested boundaries. */ if (text_blinkers_exist) { first = -1; last = -1; } /* Adjust pointers to start of region. */ if (first > 0) { baddr += first; sbp += first; buffer += first; } faddr = find_field_attribute(baddr); fa = ea_buf[faddr].fa; field_ea = fa2ea(faddr); /* Adjust end of region. */ if (last == -1 || last >= ROWS*COLS) { last = 0; } zero = FA_IS_ZERO(fa); if (field_ea->fg && (!appres.modified_sel || !FA_IS_MODIFIED(fa))) { field_color = field_ea->fg & COLOR_MASK; } else { field_color = fa_color(fa); } do { unsigned char c = sbp->cc; union sp b; bool reverse = false; bool is_selected = false; b.word = 0; /* clear out all fields */ if (ea_buf[baddr].fa) { fa = ea_buf[baddr].fa; field_ea = sbp; zero = FA_IS_ZERO(fa); if (field_ea->fg && (!appres.modified_sel || !FA_IS_MODIFIED(fa))) { field_color = field_ea->fg & COLOR_MASK; } else { field_color = fa_color(fa); } if (visible_control) { b.bits.cc = visible_ebcdic(fa); b.bits.gr = GR_UNDERLINE; b.bits.fg = appres.m3279? (GC_NONDEFAULT | HOST_COLOR_YELLOW): FA_INT_HIGH_SEL; } else if (CROSSABLE && CROSSED(baddr)) { b.bits.cs = CS_APL; b.bits.cc = map_crosshair(baddr); b.bits.fg = CROSS_COLOR; b.bits.gr = 0; } } else { unsigned short gr; int e_color; bool is_vc = false; /* Find the right graphic rendition. */ if (zero) { gr = 0; } else { gr = sbp->gr; if (!gr) { gr = field_ea->gr; } if (gr & GR_BLINK) { any_blink = true; } if (highlight_bold && FA_IS_HIGH(fa)) { gr |= GR_INTENSIFY; } } /* Find the right color. */ if (zero) { e_color = fa_color(FA_INT_HIGH_SEL); } else { if (sbp->fg) { e_color = sbp->fg & COLOR_MASK; } else if (appres.interactive.mono && (gr & GR_INTENSIFY)) { e_color = fa_color(FA_INT_HIGH_SEL); } else { e_color = field_color; } if (gr & GR_REVERSE) { e_color = INVERT_COLOR(e_color); reverse = true; } } if (!appres.interactive.mono) { b.bits.fg = e_color; } /* Find the right character and character set. */ d = ctlr_dbcs_state(baddr); if (zero) { if (visible_control) { b.bits.cc = EBC_space; } else if (CROSSABLE && CROSSED(baddr)) { b.bits.cs = CS_APL; b.bits.cc = map_crosshair(baddr); b.bits.fg = CROSS_COLOR; b.bits.gr = 0; } } else if (((!visible_control || c != EBC_null) && (c != EBC_space || d != DBCS_NONE)) || (gr & (GR_REVERSE | GR_UNDERLINE)) || visible_control) { b.bits.fg = e_color; /* * Replace blanked-out blinking text with * spaces. */ if (!text_blinking_on && (gr & GR_BLINK)) { if (!CROSSABLE || !CROSSED(baddr)) { b.bits.cc = EBC_space; } else { b.bits.cs = CS_APL; b.bits.cc = map_crosshair(baddr); b.bits.fg = CROSS_COLOR; b.bits.gr = 0; } } else { if (visible_control && c == EBC_null) { b.bits.cc = EBC_period; is_vc = true; } else if (visible_control && (c == EBC_so || c == EBC_si)) { b.bits.cc = (c == EBC_so)? EBC_less: EBC_greater; is_vc = true; } else { b.bits.cc = c; } if (sbp->cs) { b.bits.cs = sbp->cs; } else { b.bits.cs = field_ea->cs; } if (b.bits.cs & CS_GE) { b.bits.cs = CS_APL; } else if ((b.bits.cs & CS_MASK) != CS_DBCS || d != DBCS_NONE) { b.bits.cs &= CS_MASK; } else { b.bits.cs = CS_BASE; } } } /* otherwise, EBC_null */ if (visible_control) { if (is_vc) { b.bits.gr = GR_UNDERLINE; } } else { b.bits.gr = gr & (GR_UNDERLINE | GR_INTENSIFY); } /* Check for SI/SO. */ if (d == DBCS_LEFT || d == DBCS_RIGHT) { b.bits.cs = CS_DBCS; } /* Check for blanks. */ if (CROSSABLE && CROSSED(baddr) && b.bits.cs == CS_BASE && BKM_ISSET(b.bits.cc)) { b.bits.cs = CS_APL; b.bits.cc = map_crosshair(baddr); b.bits.fg = CROSS_COLOR; b.bits.gr = 0; } } /* * Compute selection state. * * DBCS characters always act as a unit, with the state * determined by the selection status and crosshair * intersection of either half. * - If either half is selected, both are considered selected. * - If either half lies in the crosshair, neither is * considered selected. */ is_selected = (SELECTED(baddr) != 0); switch (ctlr_dbcs_state(baddr)) { case DBCS_NONE: case DBCS_DEAD: case DBCS_LEFT_WRAP: case DBCS_RIGHT_WRAP: break; case DBCS_LEFT: case DBCS_SI: if ((baddr % COLS) != (COLS - 1) && SELECTED(baddr + 1)) { is_selected = true; } break; case DBCS_RIGHT: case DBCS_SB: /* XXX */ if ((baddr % COLS) && SELECTED(baddr - 1)) { is_selected = true; } break; } if (crossable && !reverse) { switch (ctlr_dbcs_state(baddr)) { case DBCS_NONE: case DBCS_DEAD: case DBCS_LEFT_WRAP: case DBCS_RIGHT_WRAP: break; case DBCS_LEFT: case DBCS_SI: break; case DBCS_RIGHT: case DBCS_SB: /* XXX */ break; } } /* * XOR the crosshair cursor with selections. */ if (is_selected) { b.bits.sel = 1; } if (!flipped) { *buffer++ = b; } else { *(buffer + fl_baddr(baddr)) = b; } sbp++; INC_BA(baddr); } while (baddr != last); /* Cancel blink timeouts if none were seen this pass. */ if (!any_blink) { text_blinkers_exist = false; } } /* * Resync the X display with the contents of 'buffer' */ static void resync_display(union sp *buffer, int first, int last) { int i, j; int b = 0; int i0 = -1; bool ccheck; int fca = fl_baddr(cursor_addr); int first_row, last_row; # define SPREAD 10 if (first < 0) { first_row = 0; last_row = ROWS; } else { first_row = first / COLS; b = first_row * COLS; last_row = (last + (COLS-1)) / COLS; } for (i = first_row; i < last_row; b += COLS, i++) { int d0 = -1; int s0 = -1; /* Has the line changed? */ if (!memcmp((char *) &ss->image[b], (char *) &buffer[b], COLS*sizeof(union sp))) { if (i0 >= 0) { render_blanks(i0 * COLS, i - i0, buffer); i0 = -1; } continue; } /* Is the new value empty? */ if (!visible_control && !(fca >= b && fca < (b+COLS)) && empty_space(&buffer[b], COLS)) { if (i0 < 0) { i0 = i; } continue; } /* Yes, it changed, and it isn't blank. Dump any pending blank lines. */ if (i0 >= 0) { render_blanks(i0 * COLS, i - i0, buffer); i0 = -1; } /* New text. Scan it. */ ccheck = cursor_displayed && fca >= b && fca < (b+COLS); for (j = 0; j < COLS; j++) { if (ccheck && b+j == fca) { /* Don't repaint over the cursor. */ /* Dump any pending "different" characters. */ if (d0 >= 0) { resync_text(b+d0, j-d0, buffer); } /* Start over. */ d0 = -1; s0 = -1; continue; } if (ss->image[b+j].word == buffer[b+j].word) { /* Character is the same. */ if (d0 >= 0) { /* Something is pending... */ if (s0 < 0) { /* Start of "same" area */ s0 = j; } else { /* nth matching character */ if (j - s0 > SPREAD) { /* too many */ resync_text(b+d0, s0-d0, buffer); d0 = -1; s0 = -1; } } } } else { /* Character is different. */ /* Forget intermediate matches. */ s0 = -1; if (d0 < 0) { /* Mark the start. */ d0 = j; } } } /* Dump any pending "different" characters. */ if (d0 >= 0) { resync_text(b+d0, COLS-d0, buffer); } } if (i0 >= 0) { render_blanks(i0 * COLS, last_row - i0, buffer); } } /* * Support code for cursor redraw. */ /* * Calculate a flipped baddr. */ static int fl_baddr(int baddr) { if (!flipped) { return baddr; } return ((baddr / COLS) * COLS) + (COLS - (baddr % COLS) - 1); } /* * Return the proper foreground color for a character position. */ static int char_color(int baddr) { int faddr; unsigned char fa; int color; faddr = find_field_attribute(baddr); fa = ea_buf[faddr].fa; /* * For non-display fields, we ignore gr and fg. */ if (FA_IS_ZERO(fa)) { color = fa_color(fa); if (appres.interactive.mono && SELECTED(baddr)) { color = INVERT_COLOR(color); } return color; } /* * Find the color of the character or the field. */ if (ea_buf[baddr].fg) { color = ea_buf[baddr].fg & COLOR_MASK; } else if (fa2ea(faddr)->fg && (!appres.modified_sel || !FA_IS_MODIFIED(fa))) { color = fa2ea(faddr)->fg & COLOR_MASK; } else { color = fa_color(fa); } /* * Now apply reverse video. * * One bit of strangeness: * If the buffer is a field attribute and we aren't using the * debug font, it's displayed as a blank; don't invert. */ if (!((ea_buf[baddr].fa && !visible_control)) && ((ea_buf[baddr].gr & GR_REVERSE) || (fa2ea(faddr)->gr & GR_REVERSE))) { color = INVERT_COLOR(color); } /* * In monochrome, apply selection status as well. */ if (appres.interactive.mono && SELECTED(baddr)) { color = INVERT_COLOR(color); } return color; } /* * Select a GC for drawing a hollow or underscore cursor. */ static GC cursor_gc(int baddr) { /* * If they say use a particular color, use it. */ if (xappres.use_cursor_color) { return ss->ucgc; } else { return get_gc(ss, char_color(baddr)); } } /* * Redraw one character. * If 'invert' is true, invert the foreground and background colors. */ static void redraw_char(int baddr, bool invert) { enum dbcs_state d; union sp buffer[2]; int faddr; unsigned char fa; int gr; int blank_it = 0; int baddr2; int len = 1; int cursor_col = BA_TO_COL(cursor_addr); int cursor_row = BA_TO_ROW(cursor_addr); /* * Figure out the DBCS state of this position. If it's the right-hand * side of a DBCS character, repaint the left side instead. */ switch ((d = ctlr_dbcs_state(baddr))) { case DBCS_LEFT: case DBCS_SI: len = 2; break; case DBCS_RIGHT: len = 2; DEC_BA(baddr); break; default: break; } if (!invert) { int flb = fl_baddr(baddr); /* * Put back what belongs there. * Note that the cursor may have been covering a DBCS character * that is no longer DBCS, so if we're not at the right margin, * we should redraw two positions. */ #if defined(_ST) /*[*/ printf("%s:%d: rt%s\n", __FUNCTION__, __LINE__, rcba(flb)); #endif /*]*/ if (dbcs && ((baddr % COLS) != (COLS - 1)) && len == 1) { len = 2; } render_text(&ss->image[flb], flb, len, false, &ss->image[flb]); return; } baddr2 = baddr; INC_BA(baddr2); /* * Fabricate the right thing. * ss->image isn't going to help, because it may contain shortcuts * for faster display, so we have to construct a buffer to use. */ buffer[0].word = 0L; buffer[0].bits.cc = ea_buf[baddr].cc; buffer[0].bits.cs = ea_buf[baddr].cs; if (buffer[0].bits.cs & CS_GE) { buffer[0].bits.cs = CS_APL; } else { buffer[0].bits.cs &= CS_MASK; } faddr = find_field_attribute(baddr); if (d == DBCS_LEFT || d == DBCS_RIGHT) { buffer[0].bits.cs = CS_DBCS; } fa = ea_buf[faddr].fa; if (FA_IS_ZERO(fa)) { gr = 0; } else { gr = ea_buf[baddr].gr; if (!gr) { gr = fa2ea(faddr)->gr; } } if (ea_buf[baddr].fa) { if (!visible_control) { blank_it = 1; } } else if (FA_IS_ZERO(fa)) { blank_it = 1; } else if (text_blinkers_exist && !text_blinking_on) { if (gr & GR_BLINK) { blank_it = 1; } } if (buffer[0].bits.cs == CS_BASE && BKM_ISSET(buffer[0].bits.cc)) { blank_it = true; } if (blank_it) { if (CROSSABLE && CROSSED(baddr)) { buffer[0].bits.cs = CS_APL; buffer[0].bits.cc = map_crosshair(baddr); buffer[0].bits.fg = CROSS_COLOR; buffer[0].bits.gr = 0; } else { buffer[0].bits.cc = EBC_space; buffer[0].bits.cs = 0; } } buffer[0].bits.fg = char_color(baddr); buffer[0].bits.gr |= (gr & GR_INTENSIFY); if (len == 2) { buffer[1].word = buffer[0].word; if (!blank_it) { buffer[1].bits.cc = ea_buf[baddr2].cc; } } render_text(buffer, fl_baddr(baddr), len, true, buffer); } /* * Draw a hollow cursor. */ static void hollow_cursor(int baddr) { Dimension cwidth; enum dbcs_state d; d = ctlr_dbcs_state(baddr); switch (d) { case DBCS_RIGHT: DEC_BA(baddr); /* fall through... */ case DBCS_LEFT: case DBCS_SI: cwidth = (2 * ss->char_width) - 1; break; default: cwidth = ss->char_width - 1; break; } XDrawRectangle(display, ss->window, cursor_gc(baddr), ssCOL_TO_X(BA_TO_COL(fl_baddr(baddr))), ssROW_TO_Y(BA_TO_ROW(baddr)) - ss->ascent + (appres.interactive.mono ? 1 : 0), cwidth, ss->char_height - (appres.interactive.mono ? 2 : 1)); } /* * Draw an underscore cursor. */ static void underscore_cursor(int baddr) { Dimension cwidth; enum dbcs_state d; d = ctlr_dbcs_state(baddr); switch (d) { case DBCS_RIGHT: DEC_BA(baddr); /* fall through... */ case DBCS_LEFT: case DBCS_SI: cwidth = (2 * ss->char_width) - 1; break; default: cwidth = ss->char_width - 1; break; } XDrawRectangle(display, ss->window, cursor_gc(baddr), ssCOL_TO_X(BA_TO_COL(fl_baddr(baddr))), ssROW_TO_Y(BA_TO_ROW(baddr)) - ss->ascent + ss->char_height - 2, cwidth, 1); } /* * Invert a square over a character. */ static void small_inv_cursor(int baddr) { /* XXX: DBCS? */ XFillRectangle(display, ss->window, ss->mcgc, ssCOL_TO_X(BA_TO_COL(fl_baddr(baddr))), ssROW_TO_Y(BA_TO_ROW(baddr)) - ss->ascent + 1, ss->char_width, (ss->char_height > 2) ? (ss->char_height - 2) : 1); } /* * Draw or remove the cursor. */ static void put_cursor(int baddr, bool on) { /* * If the cursor is being turned off, simply redraw the text under it. */ if (!on) { redraw_char(baddr, false); return; } /* * If underscore cursor, redraw the character and draw the underscore. */ if (toggled(ALT_CURSOR)) { redraw_char(baddr, false); underscore_cursor(baddr); return; } /* * On, and not an underscore. * * If out of focus, either draw an empty box in its place (if block * cursor) or redraw the underscore (if underscore). */ if (!in_focus) { hollow_cursor(baddr); return; } /* * If monochrome, invert a small square over the characters. */ if (appres.interactive.mono) { small_inv_cursor(baddr); return; } /* * Color: redraw the character in reverse video. */ redraw_char(baddr, true); } /* Allocate a named color. */ static bool alloc_color(char *name, enum fallback_color fb_color, Pixel *pixel) { XColor cell, db; Screen *s; s = XtScreen(toplevel); if (name[0] == '#') { unsigned long rgb; char *endptr; rgb = strtoul(name + 1, &endptr, 16); if (endptr != name + 1 && !*endptr && !(rgb & ~0xffffff)) { (void) memset(&db, '\0', sizeof(db)); db.red = (rgb >> 16) & 0xff; db.red |= (db.red << 8); db.green = (rgb >> 8) & 0xff; db.green |= (db.green << 8); db.blue = rgb & 0xff; db.blue |= (db.blue << 8); if (XAllocColor(display, XDefaultColormapOfScreen(s), &db) != 0) { *pixel = db.pixel; return true; } } } else { if (XAllocNamedColor(display, XDefaultColormapOfScreen(s), name, &cell, &db) != 0) { *pixel = db.pixel; return true; } } switch (fb_color) { case FB_WHITE: *pixel = XWhitePixelOfScreen(s); break; case FB_BLACK: *pixel = XBlackPixelOfScreen(s); break; } return false; } /* Spell out a fallback color. */ static const char * fb_name(enum fallback_color fb_color) { switch (fb_color) { case FB_WHITE: return "white"; case FB_BLACK: return "black"; } return "chartreuse"; /* to keep Gcc -Wall happy */ } /* Allocate color pixels. */ static void allocate_pixels(void) { if (appres.interactive.mono) { return; } /* Allocate constant elements. */ if (!alloc_color(xappres.colorbg_name, FB_BLACK, &colorbg_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for screen " "background, using \"black\"", xappres.colorbg_name); } if (!alloc_color(xappres.selbg_name, FB_BLACK, &selbg_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for select " "background, using \"black\"", xappres.selbg_name); } if (!alloc_color(xappres.keypadbg_name, FB_WHITE, &keypadbg_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for keypad " "background, using \"white\"", xappres.keypadbg_name); } if (xappres.use_cursor_color && !alloc_color(xappres.cursor_color_name, FB_WHITE, &cursor_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for cursor color, " "using \"white\"", xappres.cursor_color_name); } /* Allocate pseudocolors. */ if (!appres.m3279) { if (!alloc_color(xappres.normal_name, FB_WHITE, &normal_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for text, " "using \"white\"", xappres.normal_name); } if (!alloc_color(xappres.select_name, FB_WHITE, &select_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for selectable " "text, using \"white\"", xappres.select_name); } if (!alloc_color(xappres.bold_name, FB_WHITE, &bold_pixel)) { popup_an_error("Cannot allocate colormap \"%s\" for bold text, " "using \"white\"", xappres.bold_name); } } } /* Deallocate pixels. */ static void destroy_pixels(void) { int i; /* * It would make sense to deallocate many of the pixels here, but * the only available call (XFreeColors) would deallocate cells * that may be in use by other Xt widgets. Occh. */ for (i = 0; i < 16; i++) { cpx_done[i] = false; } } /* * Create graphics contexts. */ static void make_gcs(struct sstate *s) { XGCValues xgcv; if (appres.m3279) { int i; for (i = 0; i < NGCS; i++) { if (s->gc[i] != (GC)None) { XtReleaseGC(toplevel, s->gc[i]); s->gc[i] = (GC)None; } if (s->gc[i + NGCS] != (GC)None) { XtReleaseGC(toplevel, s->gc[i + NGCS]); s->gc[i + NGCS] = (GC)None; } if (s->selgc[i] != (GC)None) { XtReleaseGC(toplevel, s->selgc[i]); s->selgc[i] = (GC)None; } } } else { if (!appres.interactive.mono) { make_gc_set(s, FA_INT_NORM_NSEL, normal_pixel, colorbg_pixel); make_gc_set(s, FA_INT_NORM_SEL, select_pixel, colorbg_pixel); make_gc_set(s, FA_INT_HIGH_SEL, bold_pixel, colorbg_pixel); } else { make_gc_set(s, FA_INT_NORM_NSEL, xappres.foreground, xappres.background); make_gc_set(s, FA_INT_NORM_SEL, xappres.foreground, xappres.background); make_gc_set(s, FA_INT_HIGH_SEL, xappres.foreground, xappres.background); } } if (s->clrselgc != (GC)None) { XtReleaseGC(toplevel, s->clrselgc); s->clrselgc = (GC)None; } xgcv.foreground = selbg_pixel; s->clrselgc = XtGetGC(toplevel, GCForeground, &xgcv); /* Create monochrome block cursor GC. */ if (appres.interactive.mono && s->mcgc == (GC)None) { if (screen_depth > 1) { xgcv.function = GXinvert; } else { xgcv.function = GXxor; } xgcv.foreground = 1L; s->mcgc = XtGetGC(toplevel, GCForeground|GCFunction, &xgcv); } /* Create explicit cursor color cursor GCs. */ if (xappres.use_cursor_color) { if (s->ucgc != (GC)None) { XtReleaseGC(toplevel, s->ucgc); s->ucgc = (GC)None; } xgcv.foreground = cursor_pixel; s->ucgc = XtGetGC(toplevel, GCForeground, &xgcv); if (s->invucgc != (GC)None) { XtReleaseGC(toplevel, s->invucgc); s->invucgc = (GC)None; } xgcv.foreground = colorbg_pixel; xgcv.background = cursor_pixel; xgcv.font = s->fid; s->invucgc = XtGetGC(toplevel, GCForeground|GCBackground|GCFont, &xgcv); } /* Set the flag for overstriking bold. */ s->overstrike = (s->char_width > 1); } /* Set up a default color scheme. */ static void default_color_scheme(void) { static int default_attrib_colors[4] = { GC_NONDEFAULT | HOST_COLOR_GREEN, /* default */ GC_NONDEFAULT | HOST_COLOR_RED, /* intensified */ GC_NONDEFAULT | HOST_COLOR_BLUE, /* protected */ GC_NONDEFAULT | HOST_COLOR_WHITE /* protected, intensified */ }; int i; ibm_fb = FB_WHITE; for (i = 0; i < 16; i++) { XtFree(color_name[i]); color_name[i] = XtNewString("white"); } for (i = 0; i < 4; i++) { field_colors[i] = default_attrib_colors[i]; } } /* Transfer the colorScheme resource into arrays. */ static bool xfer_color_scheme(char *cs, bool do_popup) { int i; char *scheme_name = NULL; char *s0 = NULL, *scheme = NULL; char *tk; char *tmp_color_name[16]; enum fallback_color tmp_ibm_fb = FB_WHITE; char *tmp_colorbg_name = NULL; char *tmp_selbg_name = NULL; int tmp_field_colors[4]; if (cs == NULL) { goto failure; } scheme_name = xs_buffer("%s.%s", ResColorScheme, cs); s0 = get_resource(scheme_name); if (s0 == NULL) { if (do_popup) { popup_an_error("Can't find resource %s", scheme_name); } else { xs_warning("Can't find resource %s", scheme_name); } goto failure; } scheme = s0 = XtNewString(s0); for (i = 0; (tk = strtok(scheme, " \t\n")) != NULL; i++) { scheme = NULL; if (i > 22) { popup_an_error("Ignoring excess data in %s resource", scheme_name); break; } switch (i) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: /* IBM color name */ tmp_color_name[i] = tk; break; case 16: /* default for IBM colors */ if (!strcmp(tk, "white")) { tmp_ibm_fb = FB_WHITE; } else if (!strcmp(tk, "black")) { tmp_ibm_fb = FB_BLACK; } else { if (do_popup) { popup_an_error("Invalid default color"); } else { xs_warning("Invalid default color"); } goto failure; } break; case 17: /* screen background */ tmp_colorbg_name = tk; break; case 18: /* select background */ tmp_selbg_name = tk; break; case 19: case 20: case 21: case 22: /* attribute colors */ tmp_field_colors[i-19] = atoi(tk); if (tmp_field_colors[i-19] < 0 || tmp_field_colors[i-19] > 0x0f) { if (do_popup) { popup_an_error("Invalid %s resource, ignoring", scheme_name); } else { xs_warning("Invalid %s resource, ignoring", scheme_name); } goto failure; } tmp_field_colors[i-19] |= GC_NONDEFAULT; } } if (i < 23) { if (do_popup) { popup_an_error("Insufficient data in %s resource", scheme_name); } else { xs_warning("Insufficient data in %s resource", scheme_name); } goto failure; } /* Success: transfer to live variables. */ for (i = 0; i < 16; i++) { XtFree(color_name[i]); color_name[i] = XtNewString(tmp_color_name[i]); } ibm_fb = tmp_ibm_fb; xappres.colorbg_name = XtNewString(tmp_colorbg_name); xappres.selbg_name = XtNewString(tmp_selbg_name); for (i = 0; i < 4; i++) { field_colors[i] = tmp_field_colors[i]; } /* Clean up and exit. */ XtFree(scheme_name); XtFree(s0); return true; failure: XtFree(scheme_name); XtFree(s0); return false; } /* Look up a GC, allocating it if necessary. */ static GC get_gc(struct sstate *s, int color) { int pixel_index; XGCValues xgcv; GC r; static bool in_gc_error = false; if (color & GC_NONDEFAULT) { color &= ~GC_NONDEFAULT; } else { color = (color & INVERT_MASK) | DEFAULT_PIXEL; } if ((r = s->gc[color]) != (GC)None) { return r; } /* Allocate the pixel. */ pixel_index = PIXEL_INDEX(color); if (!cpx_done[pixel_index]) { if (!alloc_color(color_name[pixel_index], ibm_fb, &cpx[pixel_index])) { if (!in_gc_error) { in_gc_error = true; popup_an_error("Cannot allocate colormap \"%s\" for 3279 " "color %d (%s), using \"%s\"", color_name[pixel_index], pixel_index, see_color((unsigned char)(pixel_index + 0xf0)), fb_name(ibm_fb)); in_gc_error = false; } } cpx_done[pixel_index] = true; } /* Allocate the GC. */ xgcv.font = s->fid; if (!(color & INVERT_MASK)) { xgcv.foreground = cpx[pixel_index]; xgcv.background = colorbg_pixel; } else { xgcv.foreground = colorbg_pixel; xgcv.background = cpx[pixel_index]; } if (s == &nss && pixel_index == DEFAULT_PIXEL) { xgcv.graphics_exposures = true; r = XtGetGC(toplevel, GCForeground|GCBackground|GCFont|GCGraphicsExposures, &xgcv); } else { r = XtGetGC(toplevel, GCForeground|GCBackground|GCFont, &xgcv); } return s->gc[color] = r; } /* Look up a selection GC, allocating it if necessary. */ static GC get_selgc(struct sstate *s, int color) { XGCValues xgcv; GC r; if (color & GC_NONDEFAULT) { color = PIXEL_INDEX(color); } else { color = DEFAULT_PIXEL; } if ((r = s->selgc[color]) != (GC)None) { return r; } /* Allocate the pixel. */ if (!cpx_done[color]) { if (!alloc_color(color_name[color], FB_WHITE, &cpx[color])) { popup_an_error("Cannot allocate colormap \"%s\" for 3279 color " "%d (%s), using \"white\"", color_name[color], color, see_color((unsigned char)(color + 0xf0))); } cpx_done[color] = true; } /* Allocate the GC. */ xgcv.font = s->fid; xgcv.foreground = cpx[color]; xgcv.background = selbg_pixel; return s->selgc[color] = XtGetGC(toplevel, GCForeground|GCBackground|GCFont, &xgcv); } /* External entry points for GC allocation. */ GC screen_gc(int color) { return get_gc(ss, color | GC_NONDEFAULT); } GC screen_invgc(int color) { return get_gc(ss, INVERT_COLOR(color | GC_NONDEFAULT)); } /* * Preallocate a set of graphics contexts for a given color. * * This logic is used only in pseudo-color mode. In full color mode, * GCs are allocated dynamically by get_gc(). */ static void make_gc_set(struct sstate *s, int i, Pixel fg, Pixel bg) { XGCValues xgcv; if (s->gc[i] != (GC)None) { XtReleaseGC(toplevel, s->gc[i]); } xgcv.foreground = fg; xgcv.background = bg; xgcv.graphics_exposures = true; xgcv.font = s->fid; if (s == &nss && !i) { s->gc[i] = XtGetGC(toplevel, GCForeground|GCBackground|GCFont|GCGraphicsExposures, &xgcv); } else { s->gc[i] = XtGetGC(toplevel, GCForeground|GCBackground|GCFont, &xgcv); } if (s->gc[NGCS + i] != (GC)None) { XtReleaseGC(toplevel, s->gc[NGCS + i]); } xgcv.foreground = bg; xgcv.background = fg; s->gc[NGCS + i] = XtGetGC(toplevel, GCForeground|GCBackground|GCFont, &xgcv); if (!appres.interactive.mono) { if (s->selgc[i] != (GC)None) { XtReleaseGC(toplevel, s->selgc[i]); } xgcv.foreground = fg; xgcv.background = selbg_pixel; s->selgc[i] = XtGetGC(toplevel, GCForeground|GCBackground|GCFont, &xgcv); } } /* * Convert an attribute to a color index. */ static int fa_color(unsigned char fa) { # define DEFCOLOR_MAP(f) \ ((((f) & FA_PROTECT) >> 4) | (((f) & FA_INT_HIGH_SEL) >> 3)) if (appres.m3279) { /* * Color indices are the low-order 4 bits of a 3279 color * identifier (0 through 15) */ if (appres.modified_sel && FA_IS_MODIFIED(fa)) { return GC_NONDEFAULT | (xappres.modified_sel_color & 0xf); } else if (xappres.visual_select && FA_IS_SELECTABLE(fa) && !FA_IS_INTENSE(fa)) { return GC_NONDEFAULT | (xappres.visual_select_color & 0xf); } else { return field_colors[DEFCOLOR_MAP(fa)]; } } else { /* * Color indices are the intensity bits (0 through 2) */ if (FA_IS_ZERO(fa) || (appres.modified_sel && FA_IS_MODIFIED(fa))) { return GC_NONDEFAULT | FA_INT_NORM_SEL; } else { return GC_NONDEFAULT | (fa & 0x0c); } } } /* * Event handlers for toplevel FocusIn, FocusOut, KeymapNotify and * PropertyChanged events. */ static bool toplevel_focused = false; static bool keypad_entered = false; void PA_Focus_xaction(Widget w _is_unused, XEvent *event, String *params _is_unused, Cardinal *num_params _is_unused) { XFocusChangeEvent *fe = (XFocusChangeEvent *)event; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_Focus_xaction, event, params, num_params); #endif /*]*/ switch (fe->type) { case FocusIn: if (fe->detail != NotifyPointer) { toplevel_focused = true; screen_focus(true); } break; case FocusOut: toplevel_focused = false; if (!toplevel_focused && !keypad_entered) { screen_focus(false); } break; } } void PA_EnterLeave_xaction(Widget w _is_unused, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { XCrossingEvent *ce = (XCrossingEvent *)event; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_EnterLeave_xaction, event, params, num_params); #endif /*]*/ switch (ce->type) { case EnterNotify: keypad_entered = true; screen_focus(true); break; case LeaveNotify: keypad_entered = false; if (!toplevel_focused && !keypad_entered) { screen_focus(false); } break; } } void PA_KeymapNotify_xaction(Widget w _is_unused, XEvent *event, String *params _is_unused, Cardinal *num_params _is_unused) { XKeymapEvent *k = (XKeymapEvent *)event; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_KeymapNotify_xaction, event, params, num_params); #endif /*]*/ shift_event(state_from_keymap(k->key_vector)); } static void query_window_state(void) { Atom actual_type; int actual_format; unsigned long nitems; unsigned long leftover; unsigned char *data = NULL; static bool was_up = false; bool maximized_horz = false; bool maximized_vert = false; bool was_iconic = iconic; bool was_maximized = maximized; /* Get WM_STATE to see if we're iconified. */ if (XGetWindowProperty(display, XtWindow(toplevel), a_state, 0L, (long)BUFSIZ, false, AnyPropertyType, &actual_type, &actual_format, &nitems, &leftover, &data) == Success) { if (actual_type == a_state && actual_format == 32) { if (*(unsigned long *)data == IconicState) { iconic = true; keypad_popdown(&was_up); } else { iconic = false; invert_icon(false); keypad_first_up(); if (was_up) { keypad_popup(); was_up = false; } } } XFree(data); } if (iconic != was_iconic) { vtrace("%s\n", iconic? "Iconified": "Not iconified"); } /* Get _NET_WM_STATE to see if we're maximized. */ data = NULL; if (XGetWindowProperty(display, XtWindow(toplevel), a_net_wm_state, 0L, (long)BUFSIZ, false, AnyPropertyType, &actual_type, &actual_format, &nitems, &leftover, &data) == Success) { if (actual_type == a_atom && actual_format == 32) { unsigned long item; Atom *prop = (Atom *)data; for (item = 0; item < nitems; item++) { if (prop[item] == a_net_wm_state_maximized_horz) { maximized_horz = true; } if (prop[item] == a_net_wm_state_maximized_vert) { maximized_vert = true; } } } XFree(data); maximized = (maximized_horz && maximized_vert); } if (maximized != was_maximized) { vtrace("%s\n", maximized? "Maximized": "Not maximized"); menubar_snap_enable(!maximized); /* * If the integral keypad is on when we are maximized, then it is okay * to toggle it on and off. Otherwise, no. */ menubar_keypad_sensitive(!maximized || kp_placement != kp_integral || xappres.keypad_on); } } void PA_StateChanged_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_StateChanged_xaction, event, params, num_params); #endif /*]*/ query_window_state(); } /* * Handle Shift events (KeyPress and KeyRelease events, or KeymapNotify events * that occur when the mouse enters the window). */ void shift_event(int event_state) { static int old_state; bool shifted_now = (event_state & (ShiftKeyDown | MetaKeyDown | AltKeyDown)) != 0; if (event_state != old_state) { old_state = event_state; status_shift_mode(event_state); if (shifted != shifted_now) { shifted = shifted_now; keypad_shift(); } } } /* * Handle the mouse entering and leaving the window. */ static void screen_focus(bool in) { /* * Update the input context focus. */ if (ic != NULL) { if (in) { XSetICFocus(ic); } else { XUnsetICFocus(ic); } } /* * Cancel any pending cursor blink. If we just came into focus and * have a blinking cursor, we will start a fresh blink cycle below, so * the filled-in cursor is visible for a full turn. */ cancel_blink(); /* * If the cursor is disabled, simply change internal state. */ if (!CONNECTED) { in_focus = in; return; } /* * Change the appearance of the cursor. Make it hollow out or fill in * instantly, even if it was blinked off originally. */ (void) cursor_off("focus"); in_focus = in; cursor_on("focus"); /* * Slight kludge: If the crosshair cursor is enabled, redraw the whole * screen, to draw or erase it. */ if (toggled(CROSSHAIR)) { screen_changed = true; first_changed = 0; last_changed = ROWS*COLS; screen_disp(false); } /* * If we just came into focus and we're supposed to have a blinking * cursor, schedule a blink. */ if (in_focus && toggled(CURSOR_BLINK)) { schedule_cursor_blink(); } } /* * Change fonts. */ static bool SetFont_action(ia_t ia, unsigned argc, const char **argv) { action_debug("SetFont", ia, argc, argv); if (check_argc("SetFont", argc, 1, 1) < 0) { return false; } screen_newfont(argv[0], true, false); return true; } /* * Split an emulatorFontList resource entry, which looks like: * [menu-name:] [#noauto] [#resize] font-name * Modifies the input string. */ static void split_font_list_entry(char *entry, char **menu_name, bool *noauto, bool *resize, char **font_name) { char *colon; char *s; bool any = false; if (menu_name != NULL) { *menu_name = NULL; } if (noauto != NULL) { *noauto = false; } if (resize != NULL) { *resize = false; } colon = strchr(entry, ':'); if (colon != NULL) { if (menu_name != NULL) { *menu_name = entry; } *colon = '\0'; s = colon + 1; } else { s = entry; } do { any = false; while (isspace((unsigned char)*s)) { s++; } if (!strncmp(s, "#noauto", 7) && (!s[7] || isspace((unsigned char)s[7]))) { if (noauto != NULL) { *noauto = true; } s += 7; any = true; } else if (!strncmp(s, "#resize", 7) && (!s[7] || isspace((unsigned char)s[7]))) { if (resize != NULL) { *resize = true; } s += 7; any = true; } } while (any); *font_name = s; } /* * Load a font with a display character set required by a charset. * Returns true for success, false for failure. * If it succeeds, the caller is responsible for calling: * screen_reinit(FONT_CHANGE) */ bool screen_new_display_charsets(const char *realname, const char *csnames) { char *rl; char *s0, *s; char *fontname = NULL; char *lff; bool font_found = false; const char *display_charsets; const char *dbcs_display_charsets; /* Handle the default. */ if (realname == NULL) { /* Handle the default. */ display_charsets = default_display_charset; } else { /* Look up the display character set(s). */ display_charsets = lookup_display_charset(realname); assert(display_charsets != NULL); dbcs_display_charsets = lookup_display_charset_dbcs(realname); if (dbcs_display_charsets != NULL) { display_charsets = lazyaf("%s+%s", display_charsets, dbcs_display_charsets); } } /* * If the emulator fonts already implement those charsets, we're done. */ if (efont_charset != NULL && !strcmp(display_charsets, efont_charset)) { goto done; } /* * If the user chose an emulator font, but we haven't tried it yet, * see if it implements the right charset. */ if (efontname == NULL && xappres.efontname != NULL) { lff = load_fixed_font(xappres.efontname, display_charsets); if (lff != NULL) { if (strcmp(xappres.efontname, "3270")) { popup_an_error("%s", lff); } Free(lff); } else { fontname = xappres.efontname; } } /* * Otherwise, try to get a font from the resize lists. */ if (fontname == NULL) { rl = get_fresource("%s.%s", ResEmulatorFontList, display_charsets); if (rl != NULL) { s0 = s = NewString(rl); while (!font_found && split_lresource(&s, &fontname) == 1) { bool noauto = false; char *fn = NULL; split_font_list_entry(fontname, NULL, &noauto, NULL, &fn); if (noauto || !*fn) { continue; } lff = load_fixed_font(fn, display_charsets); if (lff != NULL) { Free(lff); } else { font_found = true; } } Free(s0); } if (!font_found && (!strcasecmp(display_charsets, default_display_charset) || !strcasecmp(display_charsets, "iso8859-1"))) { /* Try "fixed". */ if ((lff = load_fixed_font("!fixed", display_charsets)) == NULL) { font_found = true; } else { /* Fatal. */ xs_error("%s", lff); Free(lff); /*NOTREACHED*/ return false; } } if (!font_found) { char *cs_dup; char *cs; char *buf; char *lasts = NULL; if (strchr(display_charsets, '+') != NULL) { /* * Despite what the code below appears to be * able to do, we don't know how to search for a * DBCS font. Bail here. */ return false; } buf = cs_dup = NewString(display_charsets); while (!font_found && (cs = strtok_r(buf, ",", &lasts)) != NULL) { char *part1 = NULL, *part2 = NULL; int n_parts = 1; buf = NULL; n_parts = split_dbcs_resource(cs, '+', &part1, &part2); if (n_parts == 1 && !strncasecmp(cs, "3270cg", 6)) { free(part1); continue; } lff = load_fixed_font(NULL, cs); if (lff != NULL) { Free(lff); } else { font_found = true; } if (part1 != NULL) { Free(part1); } if (part2 != NULL) { Free(part2); } } Free(cs_dup); } if (!font_found) { char *xs = expand_cslist(display_charsets); popup_an_error("No %s fonts found", xs); Free(xs); return false; } } allow_resize = xappres.allow_resize; done: /* Set the appropriate global. */ Replace(required_display_charsets, display_charsets? NewString(display_charsets): NULL); init_rsfonts(required_display_charsets); return true; } void screen_newfont(const char *fontnames, bool do_popup, bool is_cs) { char *old_font; char *lff; /* Do nothing, successfully. */ if (!is_cs && efontname && !strcmp(fontnames, efontname)) { return; } /* Save the old font before trying the new one. */ old_font = XtNewString(efontname); /* Try the new one. */ if ((lff = load_fixed_font(fontnames, required_display_charsets)) != NULL) { if (do_popup) { popup_an_error("%s", lff); } Free(lff); XtFree(old_font); return; } /* Store the old name away, in case we have to go back to it. */ Replace(redo_old_font, old_font); screen_redo = REDO_FONT; screen_reinit(FONT_CHANGE); efont_changed = true; } /* * Expand a character set list into English. */ static char * expand_cslist(const char *s) { int commas = 0; const char *t; char *comma; char *r; /* Count the commas. */ for (t = s; (comma = strchr(t, ',')) != NULL; t = comma + 1) { commas++; } /* If there aren't any, there isn't any work to do. */ if (!commas) { return NewString(s); } /* Allocate enough space for "a, b, c or d". */ r = Malloc(strlen(s) + (commas * 2) + 2 + 1); *r = '\0'; /* Copy and expand. */ for (t = s; (comma = strchr(t, ',')) != NULL; t = comma + 1) { int wl = comma - t; if (*r) { (void) strcat(r, ", "); } (void) strncat(r, t, wl); } return strcat(strcat(r, " or "), t); } /* * Load and query a font. * Returns NULL (okay) or an error message. */ static char * load_fixed_font(const char *names, const char *reqd_display_charsets) { int num_names = 1, num_cs = 1; char *name1 = NULL, *name2 = NULL; char *charset1 = NULL, *charset2 = NULL; char *r; #if defined(DEBUG_FONTPICK) /*[*/ fprintf(stderr, "load_fixed_font(%s, %s)\n", names? names: "(wild)", reqd_display_charsets); #endif /*]*/ /* Split out the names and character sets. */ if (names) { num_names = split_dbcs_resource(names, '+', &name1, &name2); } num_cs = split_dbcs_resource(reqd_display_charsets, '+', &charset1, &charset2); if (!names) { num_names = num_cs; } if (num_names == 1 && num_cs >= 2) { Free(name1); Free(name2); Free(charset1); Free(charset2); return NewString("Must specify two font names (SBCS+DBCS)"); } if (num_names == 2 && num_cs < 2) { Free(name2); name2 = NULL; } /* If there's a DBCS font, load that first. */ if (name2 != NULL) { /* Load the second font. */ r = lff_single(name2, charset2, true); if (r != NULL) { Free(name1); Free(charset1); return r; } } else { dbcs_font.font_struct = NULL; dbcs_font.font = None; dbcs = false; } /* Load the SBCS font. */ r = lff_single(name1, charset1, false); /* Free the split-out names and return the final result. */ Free(name1); Free(name2); Free(charset1); Free(charset2); return r; } static bool charset_in_reqd(const char *charset, const char *reqd) { char *r = NewString(reqd); char *str = r; char *tok; bool rv = false; while ((tok = strtok(str, ",")) != NULL) { str = NULL; if (!strcasecmp(charset, tok)) { rv = true; break; } } Free(r); return rv; } /* * Load and query one font. * Returns NULL (okay) or an error message. */ static char * lff_single(const char *name, const char *reqd_display_charset, bool is_dbcs) { XFontStruct *g; const char *best = NULL; #if defined(DEBUG_FONTPICK) /*[*/ fprintf(stderr, "lff_single: name %s, cs %s, %s\n", name? name: "(wild)", reqd_display_charset, is_dbcs? "dbcs": "sbcs"); #endif /*]*/ if (name && *name == '!') { name++; } if (name) { char **names; int count; XFontStruct *f; unsigned long svalue; char *family_name, *font_encoding, *fe, *charset; if (!dfc_search_name(name)) { return xs_buffer("Font %s\nnot found", name); } /* Check the character set */ names = XListFontsWithInfo(display, name, 1, &count, &f); if (names == NULL) { return xs_buffer("Font %s\nnot found", name); } if (XGetFontProperty(f, a_registry, &svalue)) { family_name = XGetAtomName(display, svalue); } else { XFreeFontInfo(names, f, count); return xs_buffer("Font %s\nhas no registry property", name); } if (XGetFontProperty(f, a_encoding, &svalue)) { font_encoding = XGetAtomName(display, svalue); } else { XFreeFontInfo(names, f, count); return xs_buffer("Font %s\nhas no encoding property", name); } if (font_encoding[0] == '-') { fe = font_encoding + 1; } else { fe = font_encoding; } XFreeFontInfo(names, f, count); charset = xs_buffer("%s-%s", family_name, fe); Free(family_name); Free(font_encoding); if (!charset_in_reqd(charset, reqd_display_charset)) { char *r = xs_buffer("Font %s\nimplements %s, not %s\n", name, charset, reqd_display_charset); Free(charset); return r; } Free(charset); best = name; } else { void *cookie; dfc_t *d; int best_pixel_size = 0; char *best_weight = NULL; cookie = NULL; while (dfc_search_family(reqd_display_charset, &d, &cookie)) { if (best == NULL || (labs(d->points - 14) < labs(best_pixel_size - 14)) || (best_weight == NULL || (!strcasecmp(best_weight, "bold") && strcasecmp(d->weight, "bold")))) { best = d->name; best_weight = d->weight; best_pixel_size = d->points; } } if (best == NULL) { return xs_buffer("No %s fonts found", reqd_display_charset); } } g = XLoadQueryFont(display, best); set_font_globals(g, /*name*/best, best, g->fid, is_dbcs); return NULL; } /* * Figure out what sort of registry and encoding we want. */ char * display_charset(void) { return (required_display_charsets != NULL)? required_display_charsets: default_display_charset; } /* * Set globals based on font name and info */ static void set_font_globals(XFontStruct *f, const char *ef, const char *fef, Font ff, bool is_dbcs) { unsigned long svalue; unsigned i; char *family_name = NULL; char *font_encoding = NULL; char *fe = NULL; char *font_charset = NULL; if (XGetFontProperty(f, a_registry, &svalue)) { family_name = XGetAtomName(display, svalue); } if (family_name == NULL) { Error("Cannot get font family_name"); } if (XGetFontProperty(f, a_encoding, &svalue)) { font_encoding = XGetAtomName(display, svalue); } if (font_encoding == NULL) { Error("Cannot get font encoding"); } if (font_encoding[0] == '-') { fe = font_encoding + 1; } else { fe = font_encoding; } font_charset = xs_buffer("%s-%s", family_name, fe); Free(family_name); Free(font_encoding); if (is_dbcs) { /* Hack. */ dbcs_font.font_struct = f; dbcs_font.font = f->fid; dbcs_font.unicode = !strcasecmp(family_name, "iso10646"); dbcs_font.ascent = f->max_bounds.ascent; dbcs_font.descent = f->max_bounds.descent; dbcs_font.char_width = fCHAR_WIDTH(f); dbcs_font.char_height = dbcs_font.ascent + dbcs_font.descent; dbcs_font.d16_ix = display16_init(font_charset); dbcs = true; Replace(full_efontname_dbcs, XtNewString(fef)); Replace(efont_charset_dbcs, font_charset); return; } Replace(efontname, XtNewString(ef)); Replace(full_efontname, XtNewString(fef)); Replace(efont_charset, font_charset); /* Set the dimensions. */ nss.char_width = fCHAR_WIDTH(f); nss.char_height = fCHAR_HEIGHT(f); nss.fid = ff; if (nss.font != NULL) { XFreeFontInfo(NULL, nss.font, 1); } nss.font = f; nss.ascent = f->ascent; nss.descent = f->descent; /* Figure out if this is a 3270 font, or a standard X font. */ if (XGetFontProperty(f, XA_FAMILY_NAME, &svalue)) { nss.standard_font = (Atom) svalue != a_3270; } else if (!strncmp(efontname, "3270", 4)) { nss.standard_font = false; } else { nss.standard_font = true; } /* Set other globals. */ if (nss.standard_font) { nss.extended_3270font = false; nss.font_8bit = efont_matches; nss.font_16bit = (f->max_byte1 > 0); nss.d8_ix = display8_init(nss.font_8bit? font_charset: "ascii-7"); } else { #if defined(BROKEN_MACH32) nss.extended_3270font = false; #else nss.extended_3270font = f->max_byte1 > 0 || f->max_char_or_byte2 > 255; #endif nss.font_8bit = false; nss.font_16bit = false; nss.d8_ix = display8_init(font_charset); } /* See if this font has any unusually-shaped characters. */ INIT_ODD(nss.odd_width); INIT_ODD(nss.odd_lbearing); nss.funky_font = false; if (!nss.extended_3270font && f->per_char != NULL) { for (i = 0; i < 256; i++) { if (PER_CHAR(f, i).width == 0 && (PER_CHAR(f, i).rbearing | PER_CHAR(f, i).lbearing | PER_CHAR(f, i).ascent | PER_CHAR(f, i).descent) == 0) { /* Missing character. */ continue; } if (PER_CHAR(f, i).width != f->max_bounds.width) { SET_ODD(nss.odd_width, i); nss.funky_font = true; } if (PER_CHAR(f, i).lbearing < 0) { SET_ODD(nss.odd_lbearing, i); nss.funky_font = true; } } } /* * If we've changed the rules for resizing, let the window manager * know. */ if (container != NULL) { vtrace("set_font_globals(%s)\n", ef); } } /* * Font initialization. */ void font_init(void) { } /* * Change models. */ void screen_change_model(int mn, int ovc, int ovr) { if (CONNECTED || (model_num == mn && ovc == ov_cols && ovr == ov_rows)) { return; } redo_old_model = model_num; redo_old_ov_cols = ov_cols; redo_old_ov_rows = ov_rows; screen_redo = REDO_MODEL; model_changed = true; if (ov_cols != ovc || ov_rows != ovr) { oversize_changed = true; } set_rows_cols(mn, ovc, ovr); st_changed(ST_REMODEL, true); screen_reinit(MODEL_CHANGE); /* Redo the terminal type. */ net_set_default_termtype(); } /* * Change emulation modes. */ void screen_extended(bool extended _is_unused) { set_rows_cols(model_num, ov_cols, ov_rows); model_changed = true; } void screen_m3279(bool m3279 _is_unused) { destroy_pixels(); screen_reinit(COLOR_CHANGE); set_rows_cols(model_num, ov_cols, ov_rows); model_changed = true; } /* * Change color schemes. Alas, this is destructive if it fails. */ void screen_newscheme(char *s) { bool xferred; if (!appres.m3279) { return; } destroy_pixels(); xferred = xfer_color_scheme(s, true); if (xferred) { xappres.color_scheme = s; } screen_reinit(COLOR_CHANGE); scheme_changed = true; } /* * Change character sets. */ void screen_newcharset(char *csname) { char *old_charset = NewString(get_charset_name()); switch (charset_init(csname)) { case CS_OKAY: /* Success. */ Free(old_charset); st_changed(ST_CHARSET, true); screen_reinit(CHARSET_CHANGE | FONT_CHANGE); charset_changed = true; break; case CS_NOTFOUND: Free(old_charset); popup_an_error("Cannot find definition of host character set \"%s\"", csname); break; case CS_BAD: Free(old_charset); popup_an_error("Invalid charset definition for \"%s\"", csname); break; case CS_PREREQ: Free(old_charset); popup_an_error("No fonts for host character set \"%s\"", csname); break; case CS_ILLEGAL: /* Error already popped up. */ Free(old_charset); break; } } /* * Visual or not-so-visual bell */ void ring_bell(void) { static XGCValues xgcv; static GC bgc; static int initted; struct timeval tv; /* Ring the real display's bell. */ if (!appres.interactive.visual_bell) { XBell(display, xappres.bell_volume); } /* If we're iconic, invert the icon and return. */ if (!xappres.active_icon) { query_window_state(); if (iconic) { invert_icon(true); return; } } if (!appres.interactive.visual_bell || !ss->exposed_yet) { return; } /* Do a screen flash. */ if (!initted) { xgcv.function = GXinvert; bgc = XtGetGC(toplevel, GCFunction, &xgcv); initted = 1; } screen_disp(false); XFillRectangle(display, ss->window, bgc, 0, 0, ss->screen_width, ss->screen_height); XSync(display, 0); tv.tv_sec = 0; tv.tv_usec = 125000; (void) select(0, NULL, NULL, NULL, &tv); XFillRectangle(display, ss->window, bgc, 0, 0, ss->screen_width, ss->screen_height); XSync(display, 0); } /* * Window deletion */ void PA_WMProtocols_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { XClientMessageEvent *cme = (XClientMessageEvent *)event; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_WMProtocols_xaction, event, params, num_params); #endif /*]*/ if ((Atom)cme->data.l[0] == a_delete_me) { if (w == toplevel) { x3270_exit(0); } else { XtPopdown(w); } } else if ((Atom)cme->data.l[0] == a_save_yourself && w == toplevel) { save_yourself(); } } /* Initialize the icon. */ void icon_init(void) { x3270_icon = XCreateBitmapFromData(display, root_window, (char *)x3270_bits, x3270_width, x3270_height); if (xappres.active_icon) { Dimension iw, ih; aicon_font_init(); aicon_size(&iw, &ih); icon_shell = XtVaAppCreateShell( "x3270icon", "X3270", overrideShellWidgetClass, display, XtNwidth, iw, XtNheight, ih, XtNmappedWhenManaged, False, NULL); XtRealizeWidget(icon_shell); XtVaSetValues(toplevel, XtNiconWindow, XtWindow(icon_shell), NULL); if (xappres.active_icon) { XtVaSetValues(icon_shell, XtNbackground, appres.interactive.mono? xappres.background: colorbg_pixel, NULL); } } else { unsigned i; for (i = 0; i < sizeof(x3270_bits); i++) { x3270_bits[i] = ~x3270_bits[i]; } inv_icon = XCreateBitmapFromData(display, root_window, (char *)x3270_bits, x3270_width, x3270_height); wait_icon = XCreateBitmapFromData(display, root_window, (char *)wait_bits, wait_width, wait_height); for (i = 0; i < sizeof(wait_bits); i++) { wait_bits[i] = ~wait_bits[i]; } inv_wait_icon = XCreateBitmapFromData(display, root_window, (char *)wait_bits, wait_width, wait_height); XtVaSetValues(toplevel, XtNiconPixmap, x3270_icon, XtNiconMask, x3270_icon, NULL); } } /* * Initialize the active icon font information. */ static void aicon_font_init(void) { XFontStruct *f; Font ff; char **matches; int count; if (!xappres.active_icon) { xappres.label_icon = False; return; } matches = XListFontsWithInfo(display, xappres.icon_font, 1, &count, &f); if (matches == NULL) { popup_an_error("No font %s \"%s\"\nactiveIcon will not work", ResIconFont, xappres.icon_font); xappres.active_icon = False; return; } ff = XLoadFont(display, matches[0]); iss.char_width = fCHAR_WIDTH(f); iss.char_height = fCHAR_HEIGHT(f); iss.fid = ff; iss.font = f; iss.ascent = f->ascent; iss.overstrike = false; iss.standard_font = true; iss.extended_3270font = false; iss.font_8bit = false; iss.obscured = true; iss.d8_ix = display8_init("ascii-7"); if (xappres.label_icon) { matches = XListFontsWithInfo(display, xappres.icon_label_font, 1, &count, &ailabel_font); if (matches == NULL) { popup_an_error("Cannot load %s \"%s\" font\nlabelIcon will not " "work", ResIconLabelFont, xappres.icon_label_font); xappres.label_icon = False; return; } ailabel_font->fid = XLoadFont(display, matches[0]); aicon_label_height = fCHAR_HEIGHT(ailabel_font) + 2; } INIT_ODD(iss.odd_width); INIT_ODD(iss.odd_lbearing); iss.funky_font = false; } /* * Determine the current size of the active icon. */ static void aicon_size(Dimension *iw, Dimension *ih) { XIconSize *is; int count; *iw = maxCOLS*iss.char_width + 2*VHALO; *ih = maxROWS*iss.char_height + 2*HHALO + aicon_label_height; if (XGetIconSizes(display, root_window, &is, &count)) { if (*iw > (unsigned) is[0].max_width) { *iw = is[0].max_width; } if (*ih > (unsigned) is[0].max_height) { *ih = is[0].max_height; } } } /* * Initialize the active icon. Assumes that aicon_font_init has already been * called. */ static void aicon_init(void) { if (!xappres.active_icon) { return; } iss.widget = icon_shell; iss.window = XtWindow(iss.widget); iss.cursor_daddr = 0; iss.exposed_yet = false; if (xappres.label_icon) { XGCValues xgcv; xgcv.font = ailabel_font->fid; xgcv.foreground = xappres.foreground; xgcv.background = xappres.background; ailabel_gc = XtGetGC(toplevel, GCFont|GCForeground|GCBackground, &xgcv); } } /* * Reinitialize the active icon. */ static void aicon_reinit(unsigned cmask) { if (!xappres.active_icon) { return; } if (cmask & (FONT_CHANGE | COLOR_CHANGE)) { make_gcs(&iss); } if (cmask & MODEL_CHANGE) { aicon_size(&iss.screen_width, &iss.screen_height); Replace(iss.image, (union sp *)XtMalloc(sizeof(union sp) * maxROWS * maxCOLS)); XtVaSetValues(iss.widget, XtNwidth, iss.screen_width, XtNheight, iss.screen_height, NULL); } if (cmask & (MODEL_CHANGE | FONT_CHANGE | COLOR_CHANGE)) { (void)memset((char *)iss.image, 0, sizeof(union sp) * maxROWS * maxCOLS); } } /* Draw the aicon label */ static void draw_aicon_label(void) { int len; Position x; if (!xappres.label_icon || !iconic) { return; } XFillRectangle(display, iss.window, get_gc(&iss, INVERT_COLOR(0)), 0, iss.screen_height - aicon_label_height, iss.screen_width, aicon_label_height); len = strlen(aicon_text); x = ((int)iss.screen_width - XTextWidth(ailabel_font, aicon_text, len)) / 2; if (x < 0) { x = 2; } XDrawImageString(display, iss.window, ailabel_gc, x, iss.screen_height - aicon_label_height + ailabel_font->ascent, aicon_text, len); } /* Set the aicon label */ void set_aicon_label(char *l) { Replace(aicon_text, XtNewString(l)); draw_aicon_label(); } /* Change the bitmap icon. */ static void flip_icon(bool inverted, enum mcursor_state mstate) { Pixmap p = x3270_icon; if (mstate == LOCKED) { mstate = NORMAL; } if (xappres.active_icon || (inverted == icon_inverted && mstate == icon_cstate)) { return; } switch (mstate) { case WAIT: if (inverted) { p = inv_wait_icon; } else { p = wait_icon; } break; case LOCKED: case NORMAL: if (inverted) { p = inv_icon; } else { p = x3270_icon; } break; } XtVaSetValues(toplevel, XtNiconPixmap, p, XtNiconMask, p, NULL); icon_inverted = inverted; icon_cstate = mstate; } /* * Invert the icon. */ static void invert_icon(bool inverted) { flip_icon(inverted, icon_cstate); } /* * Change to the lock icon. */ static void lock_icon(enum mcursor_state state) { flip_icon(icon_inverted, state); } /* Check the font menu for an existing name. */ static bool font_in_menu(const char *font) { struct font_list *g; for (g = font_list; g != NULL; g = g->next) { if (!strcasecmp(NO_BANG(font), NO_BANG(g->font))) { return true; } } return false; } /* Add a font to the font menu. */ static bool add_font_to_menu(char *label, const char *font) { struct font_list *f; label = NewString(label); f = (struct font_list *)XtMalloc(sizeof(*f)); if (!split_hier(label, &f->label, &f->parents)) { Free((XtPointer)f); return false; } f->font = NewString(font); f->next = NULL; f->mlabel = label; if (font_list) { font_last->next = f; } else { font_list = f; } font_last = f; font_count++; return true; } /* * Resize font list parser. */ static void init_rsfonts(char *charset_name) { char *ms; struct rsfont *r; struct font_list *f; char *dupcsn, *csn, *buf; char *lasts = NULL; XFontStruct *fs; char *hier_name; /* Clear the old lists. */ while (rsfonts != NULL) { r = rsfonts->next; Free(rsfonts); rsfonts = r; } while (font_list != NULL) { f = font_list->next; if (font_list->parents) { Free(font_list->parents); } Free(font_list->mlabel); Free(font_list->font); Free(font_list); font_list = f; } font_last = NULL; font_count = 0; /* If there's no character set, we're done. */ if (charset_name == NULL) { return; } /* Get the emulatorFontList resource. */ ms = get_fresource("%s.%s", ResEmulatorFontList, charset_name); if (ms != NULL) { char *ns; char *line; char *label; char *font; bool resize; char **matches; int count; ns = ms = NewString(ms); while (split_lresource(&ms, &line) == 1) { /* Figure out what it's about. */ split_font_list_entry(line, &label, NULL, &resize, &font); if (!*font) { continue; } /* Search for duplicates. */ if (font_in_menu(font)) { continue; } /* Add it to the font_list (menu). */ if (!add_font_to_menu((label != NULL)? label: NO_BANG(font), font)) { continue; } /* Add it to the resize menu, if possible. */ if (!resize) { continue; } matches = XListFontsWithInfo(display, NO_BANG(font), 1, &count, &fs); if (matches == NULL) { continue; } r = (struct rsfont *)XtMalloc(sizeof(*r)); r->name = XtNewString(font); r->width = fCHAR_WIDTH(fs); r->height = fCHAR_HEIGHT(fs); r->descent = fs->max_bounds.descent; XFreeFontInfo(matches, fs, count); r->next = rsfonts; rsfonts = r; } free(ns); } /* * In DBCS mode, if we've found at least one appropriate font from the * list, we're done. */ if (dbcs) { return; } /* Add 'fixed' to the menu, so there's at least one alternative. */ (void) add_font_to_menu("fixed", "!fixed"); /* Expand out wild-cards based on the display character set names. */ buf = dupcsn = NewString(charset_name); while ((csn = strtok_r(buf, ",", &lasts)) != NULL) { void *cookie; const char *name; buf = NULL; if (!strncasecmp(csn, "3270cg", 6)) { continue; } cookie = NULL; while ((name = dfc_search_family(csn, NULL, &cookie)) != NULL) { if (!font_in_menu(name)) { char *dash1 = NULL, *dash2 = NULL; if (name[0] == '-') { dash1 = strchr(name + 1, '-'); if (dash1 != NULL) { dash2 = strchr(dash1 + 1, '-'); } } if (dash2 != NULL) { hier_name = xs_buffer("%s>%.*s>%s", csn, (int)(dash2 - name - 1), name + 1, dash2 + 1); } else hier_name = xs_buffer("%s>%s", csn, name); (void) add_font_to_menu(hier_name, name); Free(hier_name); } } } Free(dupcsn); } /* * Handle ConfigureNotify events. */ static struct { bool ticking; Dimension width, height; Position x, y; XtIntervalId id; } cn = { false, 0, 0, 0, 0, 0 }; static Position main_x = 0, main_y = 0; /* * Timeout routine called 0.5 sec after x3270 sets new screen dimensions. * We assume that if this happens, the window manager is happy with our new * size. */ static void configure_stable(XtPointer closure _is_unused, XtIntervalId *id _is_unused) { vtrace("Reconfigure timer expired\n"); configure_ticking = false; if (!cn.ticking) { screen_redo = REDO_NONE; } } /* Perform a resize operation. */ static void do_resize(void) { struct rsfont *r; struct rsfont *best = (struct rsfont *) NULL; /* What we're doing now is irreversible. */ screen_redo = REDO_RESIZE; if (rsfonts == NULL || !allow_resize) { /* Illegal or impossible. */ if (rsfonts == NULL) { vtrace(" no fonts available for resize\n"); } else { vtrace(" resize prohibited by resource\n"); } return; } /* * Recompute the resulting screen area for each font, based on the * current keypad, model, and scrollbar settings, and snapped to the * minimum size. */ for (r = rsfonts; r != (struct rsfont *) NULL; r = r->next) { Dimension cw, ch; /* container_width, container_height */ Dimension mkw; cw = SCREEN_WIDTH(r->width, HHALO)+2 + scrollbar_width; mkw = min_keypad_width(); if (kp_placement == kp_integral && xappres.keypad_on && cw < mkw) { cw = mkw; } ch = SCREEN_HEIGHT(r->height, r->descent, VHALO)+2 + menubar_qheight(cw); if (kp_placement == kp_integral && xappres.keypad_on) { ch += keypad_qheight(); } r->total_width = cw; r->total_height = ch; r->area = cw * ch; } /* * Find the font with the largest area that fits within the requested * dimensions. */ for (r = rsfonts; r != (struct rsfont *) NULL; r = r->next) { if (r->total_width <= cn.width && r->total_height <= cn.height && (best == NULL || r->area > best->area)) { best = r; } } /* * If the screen got smaller, but none of the fonts is small enough, * switch to the smallest. */ if (!best && cn.width <= main_width && cn.height <= main_height) { for (r = rsfonts; r != (struct rsfont *) NULL; r = r->next) { if (best == NULL || r->area < best->area) { best = r; } } } if (!best || (efontname && !strcmp(best->name, efontname))) { /* Accept the change and float inside the new size. */ vtrace(" no better font available\n"); vtrace("setting fixed_width and fixed_height\n"); fixed_width = cn.width; fixed_height = cn.height; screen_reinit(FONT_CHANGE); clear_fixed(); } else { /* Change fonts. */ vtrace(" switching to font '%s', snap size %dx%d\n", best->name, best->total_width, best->total_height); vtrace("setting fixed_width and fixed_height\n"); fixed_width = cn.width; fixed_height = cn.height; screen_newfont(best->name, false, false); /* screen_newfont() sets screen_redo to REDO_FONT. */ screen_redo = REDO_RESIZE; } } static void revert_screen(void) { const char *revert = NULL; /* * If we took a ConfigureNotify as new screen dimensions, ignore that now. */ clear_fixed(); /* If there's a reconfiguration pending, try to undo it. */ switch (screen_redo) { case REDO_FONT: revert = "font"; screen_newfont(redo_old_font, false, false); break; case REDO_MODEL: revert = "model number"; screen_change_model(redo_old_model, redo_old_ov_cols, redo_old_ov_rows); break; case REDO_KEYPAD: revert = "keypad configuration"; xappres.keypad_on = False; screen_showikeypad(xappres.keypad_on); break; case REDO_SCROLLBAR: revert = "scrollbar configuration"; if (toggled(SCROLL_BAR)) { toggle_toggle(SCROLL_BAR); toggle_scrollBar(SCROLL_BAR, TT_INTERACTIVE); } break; case REDO_RESIZE: screen_redo = REDO_NONE; /* fall through... */ case REDO_NONE: /* Initial configuration, or user-generated resize. */ do_resize(); return; default: break; } /* Tell the user what we did. */ if (revert != NULL) { popup_an_error("Main window does not fit on the X display\n" "Reverting to previous %s", revert); } screen_redo = REDO_NONE; } /* * Timeout routine called 0.5 sec after x3270 receives the last ConfigureNotify * message. This is for window managers that use 'continuous' move or resize * actions, so we don't do anything until they stop sending us events. */ static void stream_end(XtPointer closure _is_unused, XtIntervalId *id _is_unused) { bool needs_moving = false; vtrace("Stream timer expired %hux%hu+%hd+%hd\n", cn.width, cn.height, cn.x, cn.y); /* Not ticking any more. */ cn.ticking = false; /* Save the new coordinates in globals for next time. */ if (cn.x != main_x || cn.y != main_y) { main_x = cn.x; main_y = cn.y; needs_moving = true; } /* * If the dimensions are correct, do nothing, forget about any * reconfig we may need to revert, and get out. */ if (cn.width == main_width && cn.height == main_height) { vtrace(" width and height match, done\n"); screen_redo = REDO_NONE; clear_fixed(); goto done; } /* The desired dimensions are different. Revert the screen. */ if (cn.width >= main_width && cn.height >= main_height) { vtrace(" bigger\n"); } else { vtrace(" smaller\n"); } revert_screen(); done: if (needs_moving && !iconic) { keypad_move(); popups_move(); } } void PA_ConfigureNotify_xaction(Widget w _is_unused, XEvent *event, String *params _is_unused, Cardinal *num_params _is_unused) { XConfigureEvent *re = (XConfigureEvent *) event; Position xx, yy; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_ConfigureNotify_xaction, event, params, num_params); #endif /*]*/ /* * Get the new window coordinates. If the configure event reports it * as (0,0), ask for it explicitly. */ if (re->x || re->y) { xx = re->x; yy = re->y; } else { XtVaGetValues(toplevel, XtNx, &xx, XtNy, &yy, NULL); } vtrace("ConfigureNotify %dx%d+%hd+%hd\n", re->width, re->height, xx, yy); /* Save the latest values. */ cn.x = xx; cn.y = yy; cn.width = re->width; cn.height = re->height; /* See if we're maximized. */ query_window_state(); if (user_resize_allowed) { /* Take the current dimensions as fixed. */ vtrace("setting fixed_width and fixed_height\n"); fixed_width = cn.width; fixed_height = cn.height; } /* Set the stream timer for 0.5 sec from now. */ if (cn.ticking) { XtRemoveTimeOut(cn.id); } cn.id = XtAppAddTimeOut(appcontext, 500, stream_end, 0); cn.ticking = true; } /* * Process a VisibilityNotify event, setting the 'visibile' flag in nss. * This will switch the behavior of screen scrolling. */ void PA_VisibilityNotify_xaction(Widget w _is_unused, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { XVisibilityEvent *e; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_VisibilityNotify_xaction, event, params, num_params); #endif /*]*/ e = (XVisibilityEvent *)event; nss.obscured = (e->state != VisibilityUnobscured); } /* * Process a GraphicsExpose event, refreshing the screen if we have done * one or more failed XCopyArea calls. */ void PA_GraphicsExpose_xaction(Widget w _is_unused, XEvent *event _is_unused, String *params _is_unused, Cardinal *num_params _is_unused) { int i; #if defined(INTERNAL_ACTION_DEBUG) /*[*/ xaction_debug(PA_GraphicsExpose_xaction, event, params, num_params); #endif /*]*/ if (nss.copied) { /* * Force a screen redraw. */ (void) memset((char *) ss->image, 0, (maxROWS*maxCOLS) * sizeof(union sp)); if (visible_control) { for (i = 0; i < maxROWS*maxCOLS; i++) { ss->image[i].bits.cc = EBC_space; } } ctlr_changed(0, ROWS*COLS); cursor_changed = true; nss.copied = false; } } /* Display size functions. */ unsigned display_width(void) { return XDisplayWidth(display, default_screen); } unsigned display_widthMM(void) { return XDisplayWidthMM(display, default_screen); } unsigned display_height(void) { return XDisplayHeight(display, default_screen); } unsigned display_heightMM(void) { return XDisplayHeightMM(display, default_screen); } /* Translate an EBCDIC DBCS character to a display character. */ static void xlate_dbcs(unsigned char c0, unsigned char c1, XChar2b *r) { unsigned long u; int d; /* Translate NULLs to spaces. */ if (c0 == EBC_null && c1 == EBC_null) { c0 = EBC_space; c1 = EBC_space; } /* Then handle special cases. */ if ((c0 < 0x41 && (c0 != EBC_space && c1 != EBC_space)) || c0 == 0xff) { /* Junk. */ r->byte1 = 0; r->byte2 = 0; } u = ebcdic_dbcs_to_unicode((c0 << 8) | c1, EUO_BLANK_UNDEF); d = display16_lookup(dbcs_font.d16_ix, u); if (d >= 0) { r->byte1 = (d >> 8) & 0xff; r->byte2 = d & 0xff; } else { r->byte1 = 0; r->byte2 = 0; } #if defined(_ST) /*[*/ printf("EBC %02x%02x -> X11 font %02x%02x\n", c0, c1, r->byte1, r->byte2); #endif /*]*/ } static void destroy_callback_func(XIM current_ic, XPointer client_data, XPointer call_data) { ic = NULL; im = NULL; ic_focus = 0; #if defined(_ST) /*[*/ printf("destroy_callback_func\n"); #endif /*]*/ } #define OTS_LEN (sizeof(PT_OVER_THE_SPOT) - 1) static void im_callback(Display *display, XPointer client_data, XPointer call_data) { XIMStyles *xim_styles = NULL; XIMCallback destroy; int i, j; XVaNestedList preedit_attr = NULL; XPoint spot; XRectangle local_win_rect; static im_style_t im_styles[] = { { XIMPreeditNothing | XIMStatusNothing, PT_ROOT }, { XIMPreeditPosition | XIMStatusNothing, PT_OVER_THE_SPOT }, { XIMPreeditArea | XIMStatusArea, PT_OFF_THE_SPOT }, { XIMPreeditCallbacks| XIMStatusCallbacks, PT_ON_THE_SPOT }, { (XIMStyle)0, NULL } }; char *im_style = (xappres.preedit_type != NULL)? strip_whitespace(xappres.preedit_type): PT_OVER_THE_SPOT; char c; #if defined(_ST) /*[*/ printf("im_callback\n"); #endif /*]*/ if (!strcasecmp(im_style, "None")) { return; } /* Parse the offset value for OverTheSpot. */ if (!strncasecmp(im_style, PT_OVER_THE_SPOT, OTS_LEN) && ((c = im_style[OTS_LEN]) == '+' || c == '-')) { ovs_offset = atoi(im_style + OTS_LEN); im_style = NewString(im_style); im_style[OTS_LEN] = '\0'; } /* Open connection to IM server. */ if ((im = XOpenIM(display, NULL, NULL, NULL)) == NULL) { popup_an_error("XOpenIM failed\nXIM-based input disabled"); goto error_return; } destroy.callback = (XIMProc)destroy_callback_func; destroy.client_data = NULL; XSetIMValues(im, XNDestroyCallback, &destroy, NULL); /* Detect the input style supported by XIM server. */ if (XGetIMValues(im, XNQueryInputStyle, &xim_styles, NULL) != NULL || xim_styles == NULL) { popup_an_error("Input method doesn't support any styles\n" "XIM-based input disabled"); goto error_return; } for (i = 0; i < xim_styles->count_styles; i++) { for (j = 0; im_styles[j].description != NULL; j++) { if (im_styles[j].style == xim_styles->supported_styles[i]) { #if defined(_ST) /*[*/ printf("XIM server supports input_style %s\n", im_styles[j].description); #endif /*]*/ break; } } #if defined(_ST) /*[*/ if (im_styles[j].description == NULL) { printf("XIM server supports unknown input style %x\n", (unsigned)(xim_styles->supported_styles[i])); } #endif /*]*/ } /* Set my preferred style. */ for (j = 0; im_styles[j].description != NULL; j++) { if (!strcasecmp(im_styles[j].description, im_style)) { style = im_styles[j].style; break; } } if (im_styles[j].description == NULL) { popup_an_error("Input style '%s' not supported\n" "XIM-based input disabled", im_style); goto error_return; } if (style == (XIMPreeditPosition | XIMStatusNothing)) { char *fsname; XFontSet fontset; char **charset_list; int charset_count; char *def_string; fsname = xs_buffer("-*-%s,-*-iso8859-1", efont_charset_dbcs); for (;;) { #if defined(_ST) /*[*/ printf("trying fsname: %s\n", fsname); #endif /*]*/ fontset = XCreateFontSet(display, fsname, &charset_list, &charset_count, &def_string); if (charset_count || fontset == NULL) { if (charset_count > 0) { int i; for (i = 0; i < charset_count; i++) { #if defined(_ST) /*[*/ printf("missing: %s\n", charset_list[0]); #endif /*]*/ fsname = xs_buffer("%s,-*-%s", fsname, charset_list[i]); } continue; } popup_an_error("Cannot create fontset '%s' " "for input context\n" "XIM-based input disabled", fsname); goto error_return; } else { break; } } spot.x = 0; spot.y = ovs_offset * nss.char_height; local_win_rect.x = 1; local_win_rect.y = 1; local_win_rect.width = main_width; local_win_rect.height = main_height; preedit_attr = XVaCreateNestedList(0, XNArea, &local_win_rect, XNSpotLocation, &spot, XNFontSet, fontset, NULL); } /* Create IC. */ ic = XCreateIC(im, XNInputStyle, style, XNClientWindow, nss.window, XNFocusWindow, nss.window, (preedit_attr) ? XNPreeditAttributes : NULL, preedit_attr, NULL); if (ic == NULL) { popup_an_error("Cannot create input context\n" "XIM-based input disabled"); goto error_return; } return; error_return: if (im != NULL) { XCloseIM(im); im = NULL; xim_error = true; } } static void cleanup_xim(bool b _is_unused) { if (ic != NULL) { XDestroyIC(ic); } if (im != NULL) { XCloseIM(im); } } static void xim_init(void) { char *buf = ""; static bool xim_initted = false; char *s; if (!dbcs || xim_initted) { return; } xim_initted = true; s = setlocale(LC_CTYPE, ""); if (s != NULL) { s = NewString(s); } Replace(locale_name, s); if (s == NULL) { popup_an_error("setlocale(LC_CTYPE) failed\nXIM-based input disabled"); xim_error = true; return; } if (xappres.input_method != NULL) { buf = lazyaf("@im=%s", xappres.input_method); } if (XSetLocaleModifiers(buf) == NULL) { popup_an_error("XSetLocaleModifiers failed\nXIM-based input disabled"); xim_error = true; } else if (XRegisterIMInstantiateCallback(display, NULL, NULL, NULL, im_callback, NULL) != true) { popup_an_error("XRegisterIMInstantiateCallback failed\n" "XIM-based input disabled"); xim_error = true; } register_schange(ST_EXITING, cleanup_xim); return; } static void send_spot_loc(void) { XPoint spot; XVaNestedList preedit_attr; spot.x = (cursor_addr % COLS) * nss.char_width + hhalo; spot.y = ((cursor_addr / COLS) + ovs_offset) * nss.char_height + vhalo; preedit_attr = XVaCreateNestedList(0, XNSpotLocation, &spot, NULL); XSetICValues(ic, XNPreeditAttributes, preedit_attr, NULL); XFree(preedit_attr); } /* Change the window title. */ static bool Title_action(ia_t ia, unsigned argc, const char **argv) { action_debug("Title", ia, argc, argv); if (check_argc("Title", argc, 1, 1) < 0) { return false; } user_title = NewString(argv[0]); XtVaSetValues(toplevel, XtNtitle, user_title, NULL); return true; } /* Change the window state. */ static bool WindowState_action(ia_t ia, unsigned argc, const char **argv) { int state; action_debug("WindowState", ia, argc, argv); if (check_argc("WindowState", argc, 1, 1) < 0) { return false; } if (!strcasecmp(argv[0], "Iconic")) { state = true; } else if (!strcasecmp(argv[0], "Normal")) { state = false; } else { popup_an_error("WindowState argument must be Iconic or Normal"); return false; } XtVaSetValues(toplevel, XtNiconic, state, NULL); return true; } static dfc_t *dfc = NULL, *dfc_last = NULL; /* Split a font name into parts. */ static int split_name(const char *name, char res[15][256]) { int ns; const char *dash; const char *s; ns = 0; s = name; while (ns < 14 && ((dash = strchr(s, '-')) != NULL)) { int nc = dash - s; if (nc >= 256) { nc = 255; } strncpy(res[ns], s, nc); res[ns][nc] = '\0'; ns++; s = dash + 1; } if (*s) { int nc = strlen(s); if (nc >= 256) { nc = 255; } strncpy(res[ns], s, nc); res[ns][nc] = '\0'; ns++; } return ns; } /* Initialize the dumb font cache. */ static void dfc_init(void) { char **namelist; int count; int i; dfc_t *d, *e; char nl_arr[15][256]; dfc_t *c_first = NULL; dfc_t *c_last = NULL; dfc_t *m_first = NULL; dfc_t *m_last = NULL; /* Get all of the font names. */ namelist = XListFonts(display, "*", MAX_FONTS, &count); if (namelist == NULL) { Error("No fonts"); } for (i = 0; i < count; i++) { /* Pick apart the font names. */ int nf = split_name(namelist[i], nl_arr); int good = true; if ((nf == 1 && strncmp(nl_arr[0], "3270", 4)) || (nf != 15) || (strcasecmp(nl_arr[4], "r") || !strcmp(nl_arr[7], "0") || !strcmp(nl_arr[8], "0") || (strcasecmp(nl_arr[11], "c") && strcasecmp(nl_arr[11], "m")) || !strcmp(nl_arr[12], "0"))) { good = false; } /* Make sure it isn't a dup. */ for (e = dfc; e != NULL; e = e->next) { if (!strcasecmp(namelist[i], e->name)) { break; } } if (e != NULL) { continue; } /* Append this entry to the cache. */ d = (dfc_t *)Malloc(sizeof(dfc_t)); d->next = NULL; d->name = NewString(namelist[i]); d->weight = NewString(nl_arr[3]); d->points = atoi(nl_arr[7]); d->spacing = NewString(nl_arr[11]); d->charset = xs_buffer("%s-%s", nl_arr[13], nl_arr[14]); d->good = good; if (!d->spacing[0] || !strcasecmp(d->spacing, "c")) { if (c_last) { c_last->next = d; } else { c_first = d; } c_last = d; } else { if (m_last) { m_last->next = d; } else { m_first = d; } m_last = d; } } if (c_first != NULL) { c_last->next = m_first; dfc = c_first; if (m_last != NULL) { dfc_last = m_last; } else { dfc_last = c_last; } } else { dfc = m_first; dfc_last = m_last; } } /* Search iteratively for fonts whose names specify a given character set. */ static const char * dfc_search_family(const char *charset, dfc_t **dp, void **cookie) { dfc_t *d; if (*cookie == NULL) { d = dfc; } else { d = ((dfc_t *)*cookie)->next; if (d == NULL) { if (dp) { *dp = NULL; } *cookie = NULL; return NULL; } } while (d != NULL) { if (d->good && !strcasecmp(charset, d->charset)) { if (dp) { *dp = d; } *cookie = d; return d->name; } d = d->next; } *cookie = NULL; return NULL; } /* Search for a font by name. */ static bool dfc_search_name(const char *name) { dfc_t *d; for (d = dfc; d != NULL; d = d->next) { if (!strcasecmp(name, d->name)) { return true; } } return false; } /* Return the window for the screen. */ unsigned long screen_window_number(void) { return XtWindow(toplevel); } /** * External interface to the SELECTED macro. * * @param[in] baddr Buffer address. * * @return true if cell is selected */ bool screen_selected(int baddr) { return SELECTED(baddr) != 0; } /** * External interface to the SET_SELECT macro. * * @param[in] baddr Buffer address. */ void screen_set_select(int baddr) { SET_SELECT(baddr); } /** * Unselect everything. */ void screen_unselect_all(void) { (void) memset((char *)selected, 0, (ROWS*COLS + 7) / 8); } /** * Does this display support background color? (No.) * * @return true if supported, false if not. */ bool screen_has_bg_color(void) { return false; } /** * Snap the screen to the current size. */ void screen_snap_size(void) { if (!user_resize_allowed) { return; } clear_fixed(); screen_reinit(FONT_CHANGE); } /** * Screen module registration. */ void screen_register(void) { static toggle_register_t toggles[] = { { MONOCASE, toggle_monocase, 0 }, { ALT_CURSOR, toggle_altCursor, 0 }, { CURSOR_BLINK, toggle_cursorBlink, 0 }, { SHOW_TIMING, toggle_showTiming, 0 }, { CURSOR_POS, toggle_cursorPos, 0 }, { CROSSHAIR, toggle_crosshair, 0 }, { VISIBLE_CONTROL, toggle_visible_control, 0 }, { SCROLL_BAR, toggle_scrollBar, 0 }, { MARGINED_PASTE, NULL, 0 }, { OVERLAY_PASTE, NULL, 0 } }; static action_table_t screen_actions[] = { { "SetFont", SetFont_action, ACTION_KE }, { "Title", Title_action, ACTION_KE }, { "WindowState", WindowState_action, ACTION_KE } }; /* Register our toggles. */ register_toggles(toggles, array_count(toggles)); /* Register our actions. */ register_actions(screen_actions, array_count(screen_actions)); /* Register state change callbacks. */ register_schange(ST_HALF_CONNECT, screen_connect); register_schange(ST_CONNECT, screen_connect); register_schange(ST_3270_MODE, screen_connect); } suite3270-3.6/x3270/select.c0000664000076500007650000012106113221577164013404 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2014-2016 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Portions of this code were taken from xterm/button.c: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital Equipment * Corporation not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* * select.c * This module handles selections. */ #include "globals.h" #include "xglobals.h" #include #include #include #include "3270ds.h" #include "appres.h" #include "ctlr.h" #include "resources.h" #include "toggles.h" #include "charset.h" #include "ctlrc.h" #include "kybd.h" #include "popups.h" #include "screen.h" #include "selectc.h" #include "tables.h" #include "unicodec.h" #include "utf8.h" #include "utils.h" #include "xactions.h" #include "xscreen.h" #define Max(x, y) (((x) > (y))? (x): (y)) #define Min(x, y) (((x) < (y))? (x): (y)) /* * Mouse side. */ /* A button click establishes the boundaries of the 'fixed' area. */ static int f_start = 0; /* 'fixed' area */ static int f_end = 0; /* Mouse motion moves the boundaries of the 'varying' area. */ static int v_start = 0; /* 'varying' area */ static int v_end = 0; static unsigned long down_time = 0; static unsigned long down1_time = 0; static Dimension down1_x, down1_y; static unsigned long up_time = 0; static int saw_motion = 0; static int num_clicks = 0; static void grab_sel(int start, int end, bool really, Time t); #define NS 5 static Atom want_sel[NS]; static struct { /* owned selections */ Atom atom; /* atom */ char *buffer; /* buffer contents (UTF-8) */ } own_sel[NS]; static bool cursor_moved = false; static int saved_cursor_addr; static void own_sels(Time t); static int n_owned = -1; static bool any_selected = false; #define CLICK_INTERVAL 300 #define event_x(event) event->xbutton.x #define event_y(event) event->xbutton.y #define event_time(event) event->xbutton.time #define BOUNDED_XY(event, x, y) { \ x = X_TO_COL(event_x(event)); \ if (x < 0) \ x = 0; \ if (x >= COLS) \ x = COLS - 1; \ if (flipped) \ x = (COLS - x) - 1; \ y = Y_TO_ROW(event_y(event) - *descent); \ if (y <= 0) \ y = 0; \ if (y >= ROWS) \ y = ROWS - 1; \ } static int char_class[256] = { /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ 32, 1, 1, 1, 1, 1, 1, 1, 1, 32, 1, 1, 1, 1, 1, 1, /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* sp ! " # $ % & ' ( ) * + , - . / */ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 58, 59, 60, 61, 62, 63, /* @ A B C D E F G H I J K L M N O */ 64, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* P Q R S T U V W X Y Z [ \ ] ^ _ */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 91, 92, 93, 94, 48, /* ` a b c d e f g h i j k l m n o */ 96, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* p q r s t u v w x y z { | } ~ del */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,123,124,125,126, 1, /* ---,---,---,---,---,---,---,---,---,---,---,---,---,---,---,--- */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ---,---,---,---,---,---,---,---,---,---,---,---,---,---,---,--- */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* nob exc cen ste cur yen bro sec dia cop ord gui not hyp reg mac */ 32,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, /* deg plu two thr acu mu par per ce one mas gui one one thr que */ 176,177,178,179,180,181,182,183,184,185,186,178,188,189,190,191, /* Agr Aac Aci Ati Adi Ari AE Cce Egr Eac Eci Edi Igr Iac Ici Idi */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* ETH Nti Ogr Oac Oci Oti Odi mul Oob Ugr Uac Uci Udi Yac THO ssh */ 48, 48, 48, 48, 48, 48, 48,215, 48, 48, 48, 48, 48, 48, 48, 48, /* agr aac aci ati adi ari ae cce egr eac eci edi igr iac ici idi */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* eth nti ogr oac oci oti odi div osl ugr uac uci udi yac tho ydi */ 48, 48, 48, 48, 48, 48, 48,247, 48, 48, 48, 48, 48, 48, 48, 48 }; /* Parse a charClass string: [low-]high:value[,...] */ void reclass(char *s) { int n; int low, high, value; int i; char c; n = -1; low = -1; high = -1; for (;;) { c = *s++; if (isdigit((unsigned char)c)) { if (n == -1) n = 0; n = (n * 10) + (c - '0'); if (n > 255) goto fail; } else if (c == '-') { if (n == -1 || low != -1) goto fail; low = n; n = -1; } else if (c == ':') { if (n == -1) goto fail; high = n; n = -1; } else if (c == ',' || c == '\0') { if (n == -1) goto fail; value = n; n = -1; if (high == -1) goto fail; if (low == -1) low = high; if (high < low) goto fail; for (i = low; i <= high; i++) char_class[i] = value; low = -1; high = -1; if (c == '\0') return; } else goto fail; } fail: popup_an_error("Error in %s string", ResCharClass); } static void select_word(int baddr, Time t) { unsigned char fa = get_field_attribute(baddr); unsigned char ch; int class; /* Find the initial character class */ if (FA_IS_ZERO(fa)) ch = EBC_space; else ch = ea_buf[baddr].cc; class = char_class[ebc2asc0[ch]]; /* Find the beginning */ for (f_start = baddr; f_start % COLS; f_start--) { fa = get_field_attribute(f_start); if (FA_IS_ZERO(fa)) ch = EBC_space; else ch = ea_buf[f_start].cc; if (char_class[ebc2asc0[ch]] != class) { f_start++; break; } } /* Find the end */ for (f_end = baddr; (f_end+1) % COLS; f_end++) { fa = get_field_attribute(f_end); if (FA_IS_ZERO(fa)) ch = EBC_space; else ch = ea_buf[f_end].cc; if (char_class[ebc2asc0[ch]] != class) { f_end--; break; } } v_start = f_start; v_end = f_end; grab_sel(f_start, f_end, true, t); } static void select_line(int baddr, Time t) { f_start = baddr - (baddr % COLS); f_end = f_start + COLS - 1; v_start = f_start; v_end = f_end; grab_sel(f_start, f_end, true, t); } /* * Start a new selection. * Usually bound to . */ void select_start_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; xaction_debug(select_start_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(select_start_xaction)); return; } if (w != *screen) { return; } BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); f_start = f_end = v_start = v_end = baddr; down1_time = down_time = event_time(event); down1_x = event_x(event); down1_y = event_y(event); if (down_time - up_time > CLICK_INTERVAL) { num_clicks = 0; /* Commit any previous cursor move. */ cursor_moved = false; } if (num_clicks == 0) { unselect(0, ROWS*COLS); } } /* * Alternate form of select_start, which combines cursor motion with selection. * Usually bound to in a user-specified keymap. */ void move_select_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; xaction_debug(move_select_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(move_select_xaction)); return; } if (w != *screen) { return; } BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); f_start = f_end = v_start = v_end = baddr; down1_time = down_time = event_time(event); down1_x = event_x(event); down1_y = event_y(event); if (down_time - up_time > CLICK_INTERVAL) { num_clicks = 0; /* Commit any previous cursor move. */ cursor_moved = false; } if (num_clicks == 0) { if (any_selected) { unselect(0, ROWS*COLS); } else { cursor_moved = true; saved_cursor_addr = cursor_addr; cursor_move(baddr); } } } /* * Begin extending the current selection. * Usually bound to . */ void start_extend_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; bool continuous = (!ever_3270 && !toggled(RECTANGLE_SELECT)); xaction_debug(start_extend_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(start_extend_xaction)); return; } if (w != *screen) { return; } down1_time = 0L; BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); if (continuous) { /* Think linearly. */ if (baddr < f_start) { v_start = baddr; } else if (baddr > f_end) { v_end = baddr; } else if (baddr - f_start > f_end - baddr) { v_end = baddr; } else { v_start = baddr; } } else { /* Think rectangularly. */ int nrow = baddr / COLS; int ncol = baddr % COLS; int vrow_ul = v_start / COLS; int vrow_lr = v_end / COLS; int vcol_ul = Min(v_start % COLS, v_end % COLS); int vcol_lr = Max(v_start % COLS, v_end % COLS); /* Set up the row. */ if (nrow <= vrow_ul) { vrow_ul = nrow; } else if (nrow >= vrow_lr) { vrow_lr = nrow; } else if (nrow - vrow_ul > vrow_lr - nrow) { vrow_lr = nrow; } else { vrow_ul = nrow; } /* Set up the column. */ if (ncol <= vcol_ul) { vcol_ul = ncol; } else if (ncol >= vcol_lr) { vcol_lr = ncol; } else if (ncol - vcol_ul > vcol_lr - ncol) { vcol_lr = ncol; } else { vcol_ul = ncol; } v_start = (vrow_ul * COLS) + vcol_ul; v_end = (vrow_lr * COLS) + vcol_lr; } grab_sel(v_start, v_end, true, event_time(event)); saw_motion = 1; num_clicks = 0; } /* * Continuously extend the current selection. * Usually bound to and . */ void select_extend_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; xaction_debug(select_extend_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(select_extend_xaction)); return; } if (w != *screen) { return; } /* Ignore initial drag events if are too near. */ if (down1_time != 0L && abs((int) event_x(event) - (int) down1_x) < *char_width && abs((int) event_y(event) - (int) down1_y) < *char_height) { return; } else { down1_time = 0L; } /* If we moved the 3270 cursor on the first click, put it back. */ if (cursor_moved) { cursor_move(saved_cursor_addr); cursor_moved = false; } BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); /* * If baddr falls outside if the v range, open up the v range. In * addition, if we are extending one end of the v range, make sure the * other end at least covers the f range. */ if (baddr <= v_start) { v_start = baddr; v_end = f_end; } if (baddr >= v_end) { v_end = baddr; v_start = f_start; } /* * If baddr falls within the v range, narrow up the nearer end of the * v range. */ if (baddr > v_start && baddr < v_end) { if (baddr - v_start < v_end - baddr) { v_start = baddr; } else { v_end = baddr; } } num_clicks = 0; saw_motion = 1; grab_sel(v_start, v_end, false, event_time(event)); } /* * End the selection. * Usually bound to . */ void select_end_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { Cardinal i; int x, y; xaction_debug(select_end_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(select_end_xaction)); return; } if (w != *screen) { return; } if (n_owned == -1) { for (i = 0; i < NS; i++) { own_sel[i].atom = None; } n_owned = 0; } for (i = 0; i < NS; i++) { if (i < *num_params) { want_sel[i] = XInternAtom(display, params[i], false); } else { want_sel[i] = None; } } if (*num_params == 0) { want_sel[0] = XA_PRIMARY; } BOUNDED_XY(event, x, y); up_time = event_time(event); if (up_time - down_time > CLICK_INTERVAL) { num_clicks = 0; } if (++num_clicks > 3) { num_clicks = 1; } switch (num_clicks) { case 1: if (saw_motion) { f_start = v_start; f_end = v_end; grab_sel(f_start, f_end, true, event_time(event)); } break; case 2: /* * If we moved the 3270 cursor on the first click, put it back. */ if (cursor_moved) { cursor_move(saved_cursor_addr); cursor_moved = false; } select_word(f_start, event_time(event)); break; case 3: select_line(f_start, event_time(event)); break; } saw_motion = 0; } /* * New-style selection actions. * * These actions work a bit more intuitively in 3270 mode than the historic * ones. * SelectDown is usually bound to Btn1Down. * SelectMotion is usually bound to Btn1Motion. * SelectUp is usually bound to Btn1Up. * * SelectDown deselects on the first click, and remembers the screen position. * * SelectMotion extends the selection from the location remembered by * SelectDown to the current location. * * SelectUp moves the cursor on the first click. On clicks two and three, it * selects a word or line. On click four, it deselects and resets the click * counter to one. */ void SelectDown_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; xaction_debug(SelectDown_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(SelectDown_xaction)); return; } if (w != *screen) { return; } BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); if (event_time(event) - down_time > CLICK_INTERVAL) { num_clicks = 0; } down_time = event_time(event); if (num_clicks == 0) { f_start = f_end = v_start = v_end = baddr; down1_time = down_time; if (any_selected) { unselect(0, ROWS*COLS); } } } void SelectMotion_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; xaction_debug(SelectMotion_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(SelectMotion_xaction)); return; } if (w != *screen) { return; } /* Ignore initial drag events if are too near. */ if (down1_time != 0L && abs((int) event_x(event) - (int) down1_x) < *char_width && abs((int) event_y(event) - (int) down1_y) < *char_height) { return; } else { down1_time = 0L; } BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); /* * If baddr falls outside if the v range, open up the v range. In * addition, if we are extending one end of the v range, make sure the * other end at least covers the f range. */ if (baddr <= v_start) { v_start = baddr; v_end = f_end; } if (baddr >= v_end) { v_end = baddr; v_start = f_start; } /* * If baddr falls within the v range, narrow up the nearer end of the * v range. */ if (baddr > v_start && baddr < v_end) { if (baddr - v_start < v_end - baddr) { v_start = baddr; } else { v_end = baddr; } } num_clicks = 0; saw_motion = 1; grab_sel(v_start, v_end, false, event_time(event)); } void SelectUp_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { int x, y; int baddr; Cardinal i; xaction_debug(SelectUp_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(SelectUp_xaction)); return; } if (w != *screen) { return; } if (n_owned == -1) { for (i = 0; i < NS; i++) { own_sel[i].atom = None; } n_owned = 0; } for (i = 0; i < NS; i++) { if (i < *num_params) { want_sel[i] = XInternAtom(display, params[i], false); } else { want_sel[i] = None; } } if (*num_params == 0) { want_sel[0] = XA_PRIMARY; } BOUNDED_XY(event, x, y); baddr = ROWCOL_TO_BA(y, x); if (event_time(event) - up_time > CLICK_INTERVAL) { #if defined(DEBUG_CLICKS) /*[*/ printf("too long, reset\n"); #endif /*]*/ num_clicks = 0; } up_time = event_time(event); if (++num_clicks > 3) { #if defined(DEBUG_CLICKS) /*[*/ printf("wrap\n"); #endif /*]*/ num_clicks = 1; } #if defined(DEBUG_CLICKS) /*[*/ printf("%d clicks\n", num_clicks); #endif /*]*/ switch (num_clicks) { case 1: /* * If we saw motion, then take the selection. * Otherwise, if we're in 3270 mode, move the cursor. */ if (saw_motion) { f_start = v_start; f_end = v_end; grab_sel(f_start, f_end, true, event_time(event)); } else if (IN_3270) { cursor_move(baddr); } break; case 2: /* * If we moved the 3270 cursor on the first click, put it back. */ select_word(f_start, event_time(event)); break; case 3: select_line(f_start, event_time(event)); break; } saw_motion = 0; } static void set_select(XEvent *event, String *params, Cardinal *num_params) { Cardinal i; if (!any_selected) { return; } if (n_owned == -1) { for (i = 0; i < NS; i++) { own_sel[i].atom = None; } n_owned = 0; } for (i = 0; i < NS; i++) if (i < *num_params) { want_sel[i] = XInternAtom(display, params[i], false); } else { want_sel[i] = None; } if (*num_params == 0) { want_sel[0] = XA_PRIMARY; } own_sels(event_time(event)); } /* * Set the selection. * Usually bound to the Copy key. */ void set_select_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { xaction_debug(set_select_xaction, event, params, num_params); set_select(event, params, num_params); } /* * Translate the mouse position to a buffer address. */ int mouse_baddr(Widget w, XEvent *event) { int x, y; if (w != *screen) { return 0; } BOUNDED_XY(event, x, y); return ROWCOL_TO_BA(y, x); } /* * Cut action. */ #define ULS sizeof(unsigned long) #define ULBS (ULS * 8) void Cut_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { int baddr; int ba2; unsigned char fa = get_field_attribute(0); unsigned long *target; xaction_debug(Cut_xaction, event, params, num_params); if (!any_selected) { return; } set_select(event, params, num_params); target = (unsigned long *)XtCalloc(ULS, ((ROWS*COLS)+(ULBS-1)) / ULBS); /* Identify the positions to empty. */ for (baddr = 0; baddr < ROWS*COLS; baddr++) { if (ea_buf[baddr].fa) { fa = ea_buf[baddr].fa; } else if ((IN_NVT || !FA_IS_PROTECTED(fa)) && screen_selected(baddr)) { target[baddr/ULBS] |= 1L << (baddr%ULBS); } } /* Erase them. */ for (baddr = 0; baddr < ROWS*COLS; baddr++) { if ((target[baddr/ULBS] & (1L << (baddr%ULBS))) && ea_buf[baddr].cc != EBC_so && ea_buf[baddr].cc != EBC_si) { switch (ctlr_dbcs_state(baddr)) { case DBCS_NONE: case DBCS_SB: ctlr_add(baddr, EBC_space, ea_buf[baddr].cs); break; case DBCS_LEFT: ctlr_add(baddr, EBC_space, ea_buf[baddr].cs); ba2 = baddr; INC_BA(ba2); ctlr_add(ba2, EBC_space, ea_buf[baddr].cs); break; case DBCS_RIGHT: ba2 = baddr; DEC_BA(ba2); ctlr_add(ba2, EBC_space, ea_buf[baddr].cs); ctlr_add(baddr, EBC_space, ea_buf[baddr].cs); break; default: break; } mdt_set(baddr); } } Free(target); } /* * KybdSelect action. Extends the selection area in the indicated direction. */ void KybdSelect_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { enum { UP, DOWN, LEFT, RIGHT } direction; int x_start, x_end; Cardinal i; xaction_debug(KybdSelect_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(select_start_xaction)); return; } if (w != *screen) { return; } if (*num_params < 1) { popup_an_error("%s requires one argument", action_name(KybdSelect_xaction)); return; } if (!strcasecmp(params[0], "Up")) { direction = UP; } else if (!strcasecmp(params[0], "Down")) { direction = DOWN; } else if (!strcasecmp(params[0], "Left")) { direction = LEFT; } else if (!strcasecmp(params[0], "Right")) { direction = RIGHT; } else { popup_an_error("%s first argument must be Up, Down, Left, or " "Right", action_name(KybdSelect_xaction)); return; } if (!any_selected) { x_start = x_end = cursor_addr; } else { if (f_start < f_end) { x_start = f_start; x_end = f_end; } else { x_start = f_end; x_end = f_start; } } switch (direction) { case UP: if (!(x_start / COLS)) { return; } x_start -= COLS; break; case DOWN: if ((x_end / COLS) == ROWS - 1) { return; } x_end += COLS; break; case LEFT: if (!(x_start % COLS)) { return; } x_start--; break; case RIGHT: if ((x_end % COLS) == COLS - 1) { return; } x_end++; break; } /* Figure out the atoms they want. */ if (n_owned == -1) { for (i = 0; i < NS; i++) { own_sel[i].atom = None; } n_owned = 0; } for (i = 1; i < NS; i++) { if (i < *num_params) { want_sel[i] = XInternAtom(display, params[i], false); } else { want_sel[i] = None; } } if (*num_params == 1) { want_sel[0] = XA_PRIMARY; } /* Grab the selection. */ f_start = v_start = x_start; f_end = v_end = x_end; grab_sel(f_start, f_end, true, event_time(event)); } /* * unselect action. Removes a selection. */ void Unselect_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { xaction_debug(Unselect_xaction, event, params, num_params); /* It's just cosmetic. */ unselect(0, ROWS*COLS); } void SelectAll_xaction(Widget w _is_unused, XEvent *event, String *params, Cardinal *num_params) { Cardinal i; xaction_debug(SelectUp_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s can only be used as a keymap action", action_name(SelectAll_xaction)); return; } if (w != *screen) { return; } if (n_owned == -1) { for (i = 0; i < NS; i++) { own_sel[i].atom = None; } n_owned = 0; } for (i = 0; i < NS; i++) { if (i < *num_params) { want_sel[i] = XInternAtom(display, params[i], false); } else { want_sel[i] = None; } } if (*num_params == 0) { want_sel[0] = XA_PRIMARY; } grab_sel(0, (ROWS * COLS) - 1, true, event_time(event)); } /* * Screen side. */ static char *select_buf = NULL; static char *sb_ptr = NULL; static int sb_size = 0; #define SB_CHUNK 1024 static Time sel_time; static void init_select_buf(void) { if (select_buf == NULL) select_buf = XtMalloc(sb_size = SB_CHUNK); sb_ptr = select_buf; } static void store_sel(char c) { if (sb_ptr - select_buf >= sb_size) { sb_size += SB_CHUNK; select_buf = XtRealloc(select_buf, sb_size); sb_ptr = select_buf + sb_size - SB_CHUNK; } *(sb_ptr++) = c; } /* * Convert the UTF-8 string to an ICCCM-defined STRING (ISO 8859-1 printable * plus tab and newline). * * Returns the length of the stored string. */ static unsigned long store_icccm_string(XtPointer value, const char *buf) { char *dst = (char *)value; unsigned long len = 0; bool skip = false; while (*buf) { int nw; ucs4_t ucs; if (*buf == '\033') { /* Funky GE sequence. Skip it. */ *dst++ = ' '; len++; buf++; skip = true; continue; } nw = utf8_to_unicode(buf, strlen(buf), &ucs); if (nw <= 0) return len; if (skip) { skip = false; continue; } if (ucs == '\n' || (ucs >= 0x20 && ucs <= 0x7f) || (ucs >= 0xa0 && ucs <= 0xff)) { *dst++ = ucs & 0xff; len++; } buf += nw; } return len; } static Boolean convert_sel(Widget w, Atom *selection, Atom *target, Atom *type, XtPointer *value, unsigned long *length, int *format) { int i; /* Find the right selection. */ for (i = 0; i < NS; i++) if (own_sel[i].atom == *selection) break; if (i >= NS) /* not my selection */ return False; if (*target == XA_TARGETS(display)) { Atom* targetP; Atom* std_targets; unsigned long std_length; XmuConvertStandardSelection(w, sel_time, selection, target, type, (caddr_t*) &std_targets, &std_length, format); #if defined(XA_UTF8_STRING) /*[*/ *length = std_length + 6; #else /*][*/ *length = std_length + 5; #endif /*]*/ *value = (XtPointer) XtMalloc(sizeof(Atom) * (*length)); targetP = *(Atom**)value; *targetP++ = XA_STRING; *targetP++ = XA_TEXT(display); *targetP++ = XA_COMPOUND_TEXT(display); #if defined(XA_UTF8_STRING) /*[*/ *targetP++ = XA_UTF8_STRING(display); #endif /*]*/ *targetP++ = XA_LENGTH(display); *targetP++ = XA_LIST_LENGTH(display); (void) memmove(targetP, std_targets, (int) (sizeof(Atom) * std_length)); XtFree((char *) std_targets); *type = XA_ATOM; *format = 32; return True; } if (*target == XA_STRING || *target == XA_TEXT(display) || *target == XA_COMPOUND_TEXT(display) #if defined(XA_UTF8_STRING) /*[*/ || *target == XA_UTF8_STRING(display) #endif /*]*/ ) { if (*target == XA_COMPOUND_TEXT(display) #if defined(XA_UTF8_STRING) /*[*/ || *target == XA_UTF8_STRING(display) #endif /*]*/ ) *type = *target; else *type = XA_STRING; *length = strlen(own_sel[i].buffer); *value = XtMalloc(*length); #if defined(XA_UTF8_STRING) /*[*/ if (*target == XA_UTF8_STRING(display)) (void) memmove(*value, own_sel[i].buffer, (int) *length); else #endif /*]*/ /* * N.B.: We return a STRING for COMPOUND_TEXT. * Someday we may do real ISO 2022, but not today. */ *length = store_icccm_string(*value, own_sel[i].buffer); *format = 8; return True; } if (*target == XA_LIST_LENGTH(display)) { *value = XtMalloc(4); if (sizeof(long) == 4) *(long *)*value = 1; else { long temp = 1; (void) memmove(*value, ((char*) &temp) + sizeof(long) - 4, 4); } *type = XA_INTEGER; *length = 1; *format = 32; return True; } if (*target == XA_LENGTH(display)) { *value = XtMalloc(4); if (sizeof(long) == 4) *(long*)*value = strlen(own_sel[i].buffer); else { long temp = strlen(own_sel[i].buffer); (void) memmove(*value, ((char *) &temp) + sizeof(long) - 4, 4); } *type = XA_INTEGER; *length = 1; *format = 32; return True; } if (XmuConvertStandardSelection(w, sel_time, selection, target, type, (caddr_t *)value, length, format)) return True; /* else */ #if 0 printf("Unknown conversion request: %s to %s\n", XGetAtomName(display, *selection), XGetAtomName(display, *target)); #endif return False; } static void lose_sel(Widget w _is_unused, Atom *selection) { int i; for (i = 0; i < NS; i++) if (own_sel[i].atom != None && own_sel[i].atom == *selection) { own_sel[i].atom = None; XtFree(own_sel[i].buffer); own_sel[i].buffer = NULL; n_owned--; break; } if (!n_owned) unselect(0, ROWS*COLS); } /* * Somewhat convoluted logic to return an ASCII character for a given screen * position. * * The character has to be found indirectly from ea_buf and the field * attirbutes, so that zero-intensity fields become blanks. */ static bool osc_valid = false; static void osc_start(void) { osc_valid = false; } /* * Return a 'selection' version of a given character on the screen. * Returns a printable ASCII character, or 0 if the character is a NULL and * shouldn't be included in the selection. */ static void onscreen_char(int baddr, unsigned char *r, int *rlen) { static int osc_baddr; static unsigned char fa; ucs4_t uc; int baddr2; *rlen = 1; /* If we aren't moving forward, all bets are off. */ if (osc_valid && baddr < osc_baddr) osc_valid = false; if (osc_valid) { /* * Search for a new field attribute between the address we * want and the last address we searched. If we found a new * field attribute, save the address for next time. */ (void) get_bounded_field_attribute(baddr, osc_baddr, &fa); osc_baddr = baddr; } else { /* * Find the attribute the old way. */ fa = get_field_attribute(baddr); osc_baddr = baddr; osc_valid = true; } /* If it isn't visible, then make it a blank. */ if (FA_IS_ZERO(fa)) { *r = ' '; return; } /* Handle DBCS. */ switch (ctlr_dbcs_state(baddr)) { case DBCS_LEFT: baddr2 = baddr; INC_BA(baddr2); uc = ebcdic_to_unicode((ea_buf[baddr].cc << 8) | ea_buf[baddr2].cc, CS_BASE, EUO_NONE); *rlen = unicode_to_utf8(uc, (char *)r); return; case DBCS_RIGHT: /* Returned the entire character when the left half was read. */ *rlen = 0; return; case DBCS_SI: /* Suppress SI's altogether. They'll expand back on paste. */ *rlen = 0; return; case DBCS_SB: /* Treat SB's as normal SBCS characters. */ break; default: break; } switch (ea_buf[baddr].cs) { case CS_BASE: default: switch (ea_buf[baddr].cc) { case EBC_so: /* * Suppress SO's altogether. They'll expand back on * paste. */ *rlen = 0; return; case EBC_null: *r = 0; return; default: /* * Note that we use the 'for_display' flavor of * ebcdic_base_to_unicode here, so DUP and FM are * translated to special private-use Unicode values. * These will (hopefully) be ignored by other * applications, but translated back to DUP and FM if * pasted back into x3270. */ uc = ebcdic_base_to_unicode(ea_buf[baddr].cc, EUO_BLANK_UNDEF | EUO_UPRIV); *rlen = unicode_to_utf8(uc, (char *)r); if (*rlen < 0) *rlen = 0; return; } case CS_GE: switch (ea_buf[baddr].cc) { case EBC_null: *r = 0; return; case EBC_Yacute: *r = '['; return; case EBC_diaeresis: *r = ']'; return; default: /* Translate APL to Unicode. */ uc = apl_to_unicode(ea_buf[baddr].cc, EUO_NONE); if (uc == (ucs4_t)-1 || (appres.apl_mode && (uc < 0x100))) { /* * No translation, or we're in APL mode and the * GE character maps back onto a non-GE * character. Use private-use characters. */ uc = UPRIV_GE_00 + ea_buf[baddr].cc; } *rlen = unicode_to_utf8(uc, (char *)r); if (*rlen < 0) *rlen = 0; return; } case CS_LINEDRAW: /* vt100 line-drawing character */ *r = ea_buf[baddr].cc + 0x5f; return; } } /* * Attempt to own the selections in want_sel[]. */ static void own_sels(Time t) { int i, j; /* * Try to grab any new selections we may want. */ for (i = 0; i < NS; i++) { bool already_own = false; if (want_sel[i] == None) continue; /* Check if we already own it. */ for (j = 0; j < NS; j++) if (own_sel[j].atom == want_sel[i]) { already_own = true; break; } /* Find the slot for it. */ if (!already_own) { for (j = 0; j < NS; j++) if (own_sel[j].atom == None) break; if (j >= NS) continue; } if (XtOwnSelection(*screen, want_sel[i], t, convert_sel, lose_sel, NULL)) { if (!already_own) { n_owned++; own_sel[j].atom = want_sel[i]; } Replace(own_sel[j].buffer, XtMalloc(strlen(select_buf) + 1)); (void) memmove(own_sel[j].buffer, select_buf, strlen(select_buf) + 1); } else { XtWarning("Could not get selection"); if (own_sel[j].atom != None) { XtFree(own_sel[j].buffer); own_sel[j].buffer = NULL; own_sel[j].atom = None; n_owned--; } } } if (!n_owned) unselect(0, ROWS*COLS); sel_time = t; } /* * Copy the selected area on the screen into a buffer and attempt to * own the selections in want_sel[]. */ #define VISUAL_LEFT(d) ((IS_LEFT(d)) || ((d) == DBCS_SI)) static void grab_sel(int start, int end, bool really, Time t) { int i, j; int start_row, end_row; int nulls = 0; unsigned char osc[16]; int len; unselect(0, ROWS*COLS); if (start > end) { int exch = end; end = start; start = exch; } start_row = start / COLS; end_row = end / COLS; init_select_buf(); /* prime the store_sel() routine */ osc_start(); /* prime the onscreen_char() routine */ if (!ever_3270 && !toggled(RECTANGLE_SELECT)) { /* Continuous selections */ if (IS_RIGHT(ctlr_dbcs_state(start))) DEC_BA(start); if (VISUAL_LEFT(ctlr_dbcs_state(end))) INC_BA(end); for (i = start; i <= end; i++) { screen_set_select(i); if (really) { if (i != start && !(i % COLS)) { nulls = 0; store_sel('\n'); } onscreen_char(i, osc, &len); for (j = 0; j < len; j++) { if (osc[j]) { while (nulls) { store_sel(' '); nulls--; } store_sel((char)osc[j]); } else nulls++; } } } /* Check for newline extension on the last line. */ if ((end % COLS) != (COLS - 1)) { bool all_blank = true; for (i = end; i < end + (COLS - (end % COLS)); i++) { onscreen_char(i, osc, &len); for (j = 0; j < len; j++) { if (osc[j]) { all_blank = false; break; } } } if (all_blank) { for (i = end; i < end + (COLS - (end % COLS)); i++) { screen_set_select(i); } if (really) store_sel('\n'); } } } else { /* Rectangular selections */ if (start_row == end_row) { if (IS_RIGHT(ctlr_dbcs_state(start))) DEC_BA(start); if (VISUAL_LEFT(ctlr_dbcs_state(end))) INC_BA(end); for (i = start; i <= end; i++) { screen_set_select(i); if (really) { onscreen_char(i, osc, &len); for (j = 0; j < len; j++) { if (osc[j]) { while (nulls) { store_sel(' '); nulls--; } store_sel((char)osc[j]); } else nulls++; } } } } else { int row, col; int start_col = start % COLS; int end_col = end % COLS; if (start_col > end_col) { int exch = end_col; end_col = start_col; start_col = exch; } for (row = start_row; row <= end_row; row++) { int sc = start_col; int ec = end_col; if (sc && IS_RIGHT(ctlr_dbcs_state(row*COLS + sc))) sc = sc - 1; if (ec < COLS-1 && VISUAL_LEFT(ctlr_dbcs_state(row*COLS + ec))) ec = ec + 1; for (col = sc; col <= ec; col++) { screen_set_select(row*COLS + col); if (really) { onscreen_char(row*COLS + col, osc, &len); for (j = 0; j < len; j++) { if (osc[j]) { while (nulls) { store_sel(' '); nulls--; } store_sel((char)osc[j]); } else nulls++; } } } nulls = 0; if (really && row < end_row) { store_sel('\n'); } } } } /* Terminate the result. */ if (really) store_sel('\0'); any_selected = true; ctlr_changed(0, ROWS*COLS); if (really) own_sels(t); } /* * Check if any character in a given region is selected. */ bool area_is_selected(int baddr, int len) { int i; for (i = 0; i < len; i++) { if (screen_selected(baddr+i)) { return true; } } return false; } /* * Unhighlight the region of selected text -- but don't give up the selection. */ void unselect(int baddr _is_unused, int len _is_unused) { if (any_selected) { screen_unselect_all(); ctlr_changed(0, ROWS*COLS); any_selected = false; } } /* Selection insertion. */ #define NP 5 static Atom paste_atom[NP]; static int n_pasting = 0; static int pix = 0; static Time paste_time; #if defined(XA_UTF8_STRING) /*[*/ static bool paste_utf8; #endif /*]*/ static void paste_callback(Widget w, XtPointer client_data _is_unused, Atom *selection _is_unused, Atom *type _is_unused, XtPointer value, unsigned long *length, int *format _is_unused) { char *s, *t; unsigned long s_len, t_len; char *ei_buf; int ei_len; if ((value == NULL) || (*length == 0)) { XtFree(value); /* Try the next one. */ #if defined(XA_UTF8_STRING) /*[*/ if (paste_utf8) { paste_utf8 = false; XtGetSelectionValue(w, paste_atom[(pix - 1)], XA_STRING, paste_callback, NULL, paste_time); } else #endif /*]*/ if (n_pasting > pix) { #if defined(XA_UTF8_STRING) /*[*/ paste_utf8 = true; #endif /*]*/ XtGetSelectionValue(w, paste_atom[pix++], #if defined(XA_UTF8_STRING) /*[*/ XA_UTF8_STRING(display), #else /*][*/ XA_STRING, #endif /*]*/ paste_callback, NULL, paste_time); } return; } /* Convert the selection to local multibyte. */ t_len = 2 * *length; t = ei_buf = Malloc(t_len); s_len = *length; s = (char *)value; ei_len = 0; while (s_len) { ucs4_t uc; int nm; #if defined(XA_UTF8_STRING) /*[*/ if (paste_utf8) { int nu; nu = utf8_to_unicode(s, s_len, &uc); if (nu <= 0) { break; } s += nu; s_len -= nu; } else #endif /*]*/ { /* ISO 8859-1. */ uc = *s & 0xff; s++; s_len--; } nm = unicode_to_multibyte(uc, t, t_len); if (nm > 0) { nm--; } t += nm; t_len -= nm; ei_len += nm; } (void) emulate_input(ei_buf, ei_len, true); XtFree(ei_buf); XtFree(value); n_pasting = 0; } void insert_selection_xaction(Widget w, XEvent *event, String *params, Cardinal *num_params) { Cardinal i; Atom a; XButtonEvent *be = (XButtonEvent *)event; xaction_debug(insert_selection_xaction, event, params, num_params); if (event == NULL) { popup_an_error("%s must be called from a keymap\n", action_name(insert_selection_xaction)); return; } n_pasting = 0; for (i = 0; i < *num_params; i++) { a = XInternAtom(display, params[i], true); if (a == None) { popup_an_error("%s: No atom for selection", action_name(insert_selection_xaction)); continue; } if (n_pasting < NP) { paste_atom[n_pasting++] = a; } } pix = 0; #if defined(XA_UTF8_STRING) /*[*/ paste_utf8 = true; #endif /*]*/ if (n_pasting > pix) { paste_time = be->time; XtGetSelectionValue(w, paste_atom[pix++], #if defined(XA_UTF8_STRING) /*[*/ XA_UTF8_STRING(display), #else /*][*/ XA_STRING, #endif /*]*/ paste_callback, NULL, paste_time); } } /** * Select module registration. */ void select_register(void) { static toggle_register_t toggles[] = { { RECTANGLE_SELECT, NULL, 0 } }; register_toggles(toggles, array_count(toggles)); } suite3270-3.6/x3270/ssl_passwd_gui.c0000664000076500007650000000713013221577164015153 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 2004, Don Russell. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, * GA 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Don Russell, Jeff Sparkes, GTRC * nor their contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, DON RUSSELL, JEFF SPARKES AND * GTRC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, * DON RUSSELL, JEFF SPARKES OR GTRC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ssl_passwd_gui.c * SSL certificate password dialog for x3270. */ #include "globals.h" #include #include #include "appres.h" #include "host.h" #include "objects.h" #include "popups.h" #include "sio.h" #include "ssl_passwd_gui.h" #include "telnet.h" #include "telnet_private.h" #include "xglobals.h" #include "xpopups.h" /* Statics. */ static char *ssl_password; static Widget password_shell = NULL; /* Callback for "OK" button on the password popup. */ static void password_callback(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *password; password = XawDialogGetValueString((Widget)client_data); ssl_password = NewString(password); XtPopdown(password_shell); net_password_continue(ssl_password); } /* The password dialog was popped down. */ static void password_popdown(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* If there's no password (they cancelled), don't pop up again. */ if (ssl_password == NULL) { /* We might want to do something more sophisticated here. */ host_disconnect(true); } } /* Pop up the password dialog. */ static void popup_password(void) { if (password_shell == NULL) { password_shell = create_form_popup("Password", password_callback, NULL, FORM_AS_IS); XtAddCallback(password_shell, XtNpopdownCallback, password_popdown, NULL); } XtVaSetValues(XtNameToWidget(password_shell, ObjDialog), XtNvalue, "", NULL); Replace(ssl_password, NULL); popup_popup(password_shell, XtGrabExclusive); } /* * Password callback. */ ssl_passwd_ret_t ssl_passwd_gui_callback(char *buf, int size, bool again) { /* Pop up the dialog. */ popup_password(); if (again) { popup_an_error("Password is incorrect."); } return SP_PENDING; } suite3270-3.6/x3270/status.c0000664000076500007650000007433613221577164013464 0ustar pdmpdm/* * Copyright (c) 1993-2009, 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Paul Mattes nor his contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * status.c * This module handles the 3270 status line. */ #include "globals.h" #include "xglobals.h" #include #include #include "3270ds.h" #include "appres.h" #include "cg.h" #include "kybd.h" #include "host.h" #include "screen.h" #include "status.h" #include "tables.h" #include "trace.h" /* temp */ #include "utils.h" #include "xscreen.h" #include "xtables.h" static XChar2b *status_2b; static unsigned char *status_1b; static XChar2b *display_2b; static bool *sxcursor_want; static bool *sxcursor_have; static bool status_changed = false; static struct status_line { bool changed; int start, len, color; XChar2b *s2b; unsigned char *s1b; XChar2b *d2b; } *status_line; static int offsets[] = { 0, /* connection status */ 8, /* wait, locked */ 39, /* shift, insert, timing, cursor position */ -1 }; #define SSZ ((sizeof(offsets)/sizeof(offsets[0])) - 1) #define CTLR_REGION 0 #define WAIT_REGION 1 #define MISC_REGION 2 static int colors[SSZ] = { FA_INT_NORM_NSEL, FA_INT_HIGH_SEL, FA_INT_NORM_NSEL }; static int colors3279[SSZ] = { HOST_COLOR_BLUE, HOST_COLOR_WHITE, HOST_COLOR_BLUE }; #define CM (60 * 10) /* csec per minute */ /* * The status line is laid out thusly (M is maxCOLS): * * 0 "4" in a square * 1 "A" underlined * 2 solid box if connected, "?" in a box if not * 3..7 empty * 8... message area * M-41 Meta indication ("M" or blank) * M-40 Alt indication ("A" or blank) * M-39 Shift indication (Special symbol/"^" or blank) * M-38..M-37 empty * M-36 Compose indication ("C" or blank) * M-35 Compose first character * M-34 empty * M-33 Typeahead indication ("T" or blank) * M-32 Screentrace count * M-31 Alternate keymap indication ("K" or blank) * M-30 Reverse input mode indication ("R" or blank) * M-29 Insert mode indication (Special symbol/"I" or blank) * M-28 Printer indication ("P" or blank) * M-27 Script indication ("S" or blank) * M-26..M-16 empty * M-15..M-9 command timing (Clock symbol and m:ss, or blank) * M-7..M cursor position (rrr/ccc or blank) */ /* Positions */ #define LBOX 0 /* left-hand box */ #define CNCT 1 /* connection between */ #define RBOX 2 /* right-hand box */ #define M0 8 /* message area */ #define SHIFT (maxCOLS-39) /* shift indication */ #define COMPOSE (maxCOLS-36) /* compose characters */ #define TYPEAHD (maxCOLS-33) /* typeahead */ #define SCRNTRC (maxCOLS-32) /* screentrace */ #define KMAP (maxCOLS-31) /* alt keymap in effect */ #define REVERSE (maxCOLS-30) /* reverse input mode in effect */ #define INSERT (maxCOLS-29) /* insert mode */ #define PSESS (maxCOLS-28) /* printer session */ #define SCRIPT (maxCOLS-27) /* script in progress */ #define LU (maxCOLS-25) /* LU name */ #define LUCNT 8 #define T0 (maxCOLS-15) /* timings */ #define TCNT 7 #define C0 (maxCOLS-7) /* cursor position */ #define CCNT 7 #define STATUS_Y (*screen_height - *descent) static unsigned char nullblank; static Position status_y; /* Status line contents (high-level) */ static void do_disconnected(void); static void do_resolving(void); static void do_connecting(void); static void do_nonspecific(void); static void do_inhibit(void); static void do_blank(void); static void do_twait(void); static void do_syswait(void); static void do_protected(void); static void do_numeric(void); static void do_overflow(void); static void do_dbcs(void); static void do_scrolled(void); static void do_minus(void); static bool oia_undera = true; static bool oia_boxsolid = false; static int oia_shift = 0; static bool oia_typeahead = false; static int oia_screentrace = -1; static bool oia_compose = false; static unsigned char oia_compose_char = 0; static enum keytype oia_compose_keytype = KT_STD; static enum msg { DISCONNECTED, /* X Not Connected */ XRESOLVING, /* X Resolving */ CONNECTING, /* X Connecting */ NONSPECIFIC, /* X */ INHIBIT, /* X Inhibit */ BLANK, /* (blank) */ TWAIT, /* X Wait */ SYSWAIT, /* X SYSTEM */ PROTECTED, /* X Protected */ NUMERIC, /* X Numeric */ OVERFLOW, /* X Overflow */ DBCS, /* X DBCS */ SCROLLED, /* X Scrolled */ MINUS, /* X -f */ N_MSGS } oia_msg = DISCONNECTED, saved_msg; static char oia_lu[LUCNT+1]; static bool msg_is_saved = false; static int n_scrolled = 0; static void (*msg_proc[N_MSGS])(void) = { do_disconnected, do_resolving, do_connecting, do_nonspecific, do_inhibit, do_blank, do_twait, do_syswait, do_protected, do_numeric, do_overflow, do_dbcs, do_scrolled, do_minus }; static int msg_color[N_MSGS] = { FA_INT_HIGH_SEL, FA_INT_NORM_NSEL, FA_INT_NORM_NSEL, FA_INT_NORM_NSEL, FA_INT_NORM_NSEL, FA_INT_NORM_NSEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL, FA_INT_NORM_SEL }; static int msg_color3279[N_MSGS] = { HOST_COLOR_WHITE, HOST_COLOR_WHITE, HOST_COLOR_WHITE, HOST_COLOR_WHITE, HOST_COLOR_BLUE, HOST_COLOR_WHITE, HOST_COLOR_WHITE, HOST_COLOR_RED, HOST_COLOR_RED, HOST_COLOR_RED, HOST_COLOR_RED, HOST_COLOR_WHITE, HOST_COLOR_RED, HOST_COLOR_RED }; static bool oia_insert = false; static bool oia_reverse = false; static bool oia_kmap = false; static bool oia_script = false; static bool oia_printer = false; static char *oia_cursor = (char *) 0; static char *oia_timing = (char *) 0; static unsigned char disc_pfx[] = { CG_lock, CG_space, CG_badcommhi, CG_commjag, CG_commlo, CG_space }; static unsigned char *disc_msg; static int disc_len = sizeof(disc_pfx); static unsigned char rslv_pfx[] = { CG_lock, CG_space, CG_commhi, CG_commjag, CG_commlo, CG_space }; static unsigned char *rslv_msg; static int rslv_len = sizeof(rslv_pfx); static unsigned char cnct_pfx[] = { CG_lock, CG_space, CG_commhi, CG_commjag, CG_commlo, CG_space }; static unsigned char *cnct_msg; static int cnct_len = sizeof(cnct_pfx); static unsigned char *a_not_connected; static unsigned char *a_resolving; static unsigned char *a_connecting; static unsigned char *a_inhibit; static unsigned char *a_twait; static unsigned char *a_syswait; static unsigned char *a_protected; static unsigned char *a_numeric; static unsigned char *a_overflow; static unsigned char *a_dbcs; static unsigned char *a_scrolled; static unsigned char *a_minus; static unsigned char *make_amsg(const char *key); static unsigned char *make_emsg(unsigned char prefix[], const char *key, int *len); static void status_render(int region); static void do_ctlr(void); static void do_msg(enum msg t); static void paint_msg(enum msg t); static void do_insert(bool on); static void do_reverse(bool on); static void do_kmap(bool on); static void do_script(bool on); static void do_printer(bool on); static void do_shift(int state); static void do_typeahead(int state); static void do_screentrace(int state); static void do_compose(bool on, unsigned char c, enum keytype keytype); static void do_lu(const char *lu); static void do_timing(char *buf); static void do_cursor(char *buf); static void status_connect(bool connected); static void status_3270_mode(bool connected); static void status_resolving(bool ignored); static void status_half_connect(bool ignored); static void status_printer(bool on); /** * Status line module registration. */ void status_register(void) { register_schange(ST_RESOLVING, status_resolving); register_schange(ST_HALF_CONNECT, status_half_connect); register_schange(ST_CONNECT, status_connect); register_schange(ST_3270_MODE, status_3270_mode); register_schange(ST_PRINTER, status_printer); } /* Initialize the status line */ void status_init(void) { a_not_connected = make_amsg("statusNotConnected"); disc_msg = make_emsg(disc_pfx, "statusNotConnected", &disc_len); a_resolving = make_amsg("statusResolving"); rslv_msg = make_emsg(rslv_pfx, "statusResolving", &rslv_len); a_connecting = make_amsg("statusConnecting"); cnct_msg = make_emsg(cnct_pfx, "statusConnecting", &cnct_len); a_inhibit = make_amsg("statusInhibit"); a_twait = make_amsg("statusTwait"); a_syswait = make_amsg("statusSyswait"); a_protected = make_amsg("statusProtected"); a_numeric = make_amsg("statusNumeric"); a_overflow = make_amsg("statusOverflow"); a_dbcs = make_amsg("statusDbcs"); a_scrolled = make_amsg("statusScrolled"); a_minus = make_amsg("statusMinus"); } /* Reinitialize the status line */ void status_reinit(unsigned cmask) { unsigned i; if (cmask & FONT_CHANGE) nullblank = *standard_font ? ' ' : CG_space; if (cmask & (FONT_CHANGE | MODEL_CHANGE | SCROLL_CHANGE)) { status_y = STATUS_Y; if (!*descent) ++status_y; } if (cmask & MODEL_CHANGE) { Replace(status_line, (struct status_line *)XtCalloc(sizeof(struct status_line), SSZ)); Replace(status_2b, (XChar2b *)XtCalloc(sizeof(XChar2b), maxCOLS)); Replace(status_1b, (unsigned char *)XtCalloc(sizeof(unsigned char), maxCOLS)); Replace(display_2b, (XChar2b *)XtCalloc(sizeof(XChar2b), maxCOLS)); Replace(sxcursor_want, (bool *)XtCalloc(sizeof(bool), maxCOLS)); Replace(sxcursor_have, (bool *)XtCalloc(sizeof(bool), maxCOLS)); offsets[SSZ] = maxCOLS; if (appres.interactive.mono) colors[1] = FA_INT_NORM_NSEL; for (i = 0; i < SSZ; i++) { status_line[i].start = offsets[i]; status_line[i].len = offsets[i+1] - offsets[i]; status_line[i].s2b = status_2b + offsets[i]; status_line[i].s1b = status_1b + offsets[i]; status_line[i].d2b = display_2b + offsets[i]; } } else (void) memset(display_2b, 0, maxCOLS * sizeof(XChar2b)); if (cmask & (COLOR_CHANGE | MODEL_CHANGE)) { for (i = 0; i < SSZ; i++) { status_line[i].color = appres.m3279 ? colors3279[i] : colors[i]; } } for (i = 0; i < SSZ; i++) status_line[i].changed = true; status_changed = true; /* * Always redraw all the fields; it's easier than keeping track of * what may have changed and why. */ do_ctlr(); paint_msg(oia_msg); do_insert(oia_insert); do_reverse(oia_reverse); do_kmap(oia_kmap); do_script(oia_script); do_printer(oia_printer); do_shift(oia_shift); do_typeahead(oia_typeahead); do_screentrace(oia_screentrace); do_compose(oia_compose, oia_compose_char, oia_compose_keytype); do_lu(oia_lu); do_cursor(oia_cursor); do_timing(oia_timing); } /* Check for a space. */ static bool status_space(int col) { return (*standard_font && (status_1b[col] == ' ' || status_1b[col] == 0)) || (!*standard_font && (status_1b[col] == CG_space || status_1b[col] == CG_null)); } /* Render the status line onto the screen */ void status_disp(void) { unsigned i; int col; if (!status_changed) { return; } for (i = 0; i < SSZ; i++) { if (status_line[i].changed) { status_render(i); (void) memmove(status_line[i].d2b, status_line[i].s2b, status_line[i].len * sizeof(XChar2b)); status_line[i].changed = false; } } /* Draw or undraw the crosshair. */ for (col = 0; col < maxCOLS; col++) { if (sxcursor_want[col]) { if (status_space(col)) { XTextItem16 text1; XChar2b text = screen_vcrosshair(); text1.chars = &text; text1.nchars = 1; text1.delta = 0; text1.font = *fid; XDrawText16(display, *screen_window, screen_crosshair_gc(), COL_TO_X(col), status_y, &text1, 1); sxcursor_have[col] = true; } } else if (sxcursor_have[col]) { XFillRectangle(display, *screen_window, screen_invgc(0), COL_TO_X(col), status_y - *ascent, *char_width, *char_height); sxcursor_have[col] = false; } } status_changed = false; } /* Mark the entire status line as changed */ void status_touch(void) { unsigned i; for (i = 0; i < SSZ; i++) { status_line[i].changed = true; (void) memset(status_line[i].d2b, 0, status_line[i].len * sizeof(XChar2b)); } status_changed = true; } /* Connected or disconnected */ static void status_connect(bool connected) { if (connected) { oia_boxsolid = IN_3270 && !IN_SSCP; do_ctlr(); if (kybdlock & KL_AWAITING_FIRST) do_msg(NONSPECIFIC); else do_msg(BLANK); status_untiming(); } else { oia_boxsolid = false; do_ctlr(); do_msg(DISCONNECTED); status_uncursor_pos(); } } /* Changed 3270 mode */ static void status_3270_mode(bool connected) { oia_boxsolid = IN_3270 && !IN_SSCP; do_ctlr(); status_untiming(); } /* Resolving */ static void status_resolving(bool ignored _is_unused) { oia_boxsolid = false; do_ctlr(); do_msg(XRESOLVING); status_untiming(); status_uncursor_pos(); } /* Half connected */ static void status_half_connect(bool ignored _is_unused) { oia_boxsolid = false; do_ctlr(); do_msg(CONNECTING); status_untiming(); status_uncursor_pos(); } /* Toggle printer session mode */ static void status_printer(bool on) { do_printer(oia_printer = on); } /* Lock the keyboard (twait) */ void status_twait(void) { oia_undera = false; do_ctlr(); do_msg(TWAIT); } /* Done with controller confirmation */ void status_ctlr_done(void) { oia_undera = true; do_ctlr(); } /* Lock the keyboard (X SYSTEM) */ void status_syswait(void) { do_msg(SYSWAIT); } /* Lock the keyboard (operator error) */ void status_oerr(int error_type) { switch (error_type) { case KL_OERR_PROTECTED: do_msg(PROTECTED); break; case KL_OERR_NUMERIC: do_msg(NUMERIC); break; case KL_OERR_OVERFLOW: do_msg(OVERFLOW); break; case KL_OERR_DBCS: do_msg(DBCS); break; } } /* Lock the keyboard (X Scrolled) */ void status_scrolled(int n) { if (n != 0) { if (!msg_is_saved) { saved_msg = oia_msg; msg_is_saved = true; } n_scrolled = n; paint_msg(SCROLLED); } else { if (msg_is_saved) { msg_is_saved = false; paint_msg(saved_msg); } } } /* Lock the keyboard (X -f) */ void status_minus(void) { do_msg(MINUS); } /* Unlock the keyboard */ void status_reset(void) { if (!CONNECTED) do_msg(DISCONNECTED); else if (kybdlock & KL_ENTER_INHIBIT) do_msg(INHIBIT); else if (kybdlock & KL_DEFERRED_UNLOCK) do_msg(NONSPECIFIC); else do_msg(BLANK); } /* Toggle insert mode */ void status_insert_mode(bool on) { do_insert(oia_insert = on); } /* Toggle reverse mode */ void status_reverse_mode(bool on) { do_reverse(oia_reverse = on); } /* Toggle kmap mode */ void status_kmap(bool on) { do_kmap(oia_kmap = on); } /* Toggle script mode */ void status_script(bool on) { do_script(oia_script = on); } /* Toggle shift mode */ void status_shift_mode(int state) { do_shift(oia_shift = state); } /* Toggle typeahead */ void status_typeahead(bool on) { do_typeahead(oia_typeahead = on); } /* Change screentrace */ void status_screentrace(int n) { do_screentrace(oia_screentrace = n); } /* Set compose character */ void status_compose(bool on, unsigned char c, enum keytype keytype) { oia_compose = on; oia_compose_char = c; oia_compose_keytype = keytype; do_compose(on, c, keytype); } /* Set LU name */ void status_lu(const char *lu) { if (lu != NULL) { (void) strncpy(oia_lu, lu, LUCNT); oia_lu[LUCNT] = '\0'; } else (void) memset(oia_lu, '\0', sizeof(oia_lu)); do_lu(oia_lu); } /* Display timing */ void status_timing(struct timeval *t0, struct timeval *t1) { static char no_time[] = ":??.?"; static char buf[TCNT+1]; if (t1->tv_sec - t0->tv_sec > (99*60)) { do_timing(oia_timing = no_time); } else { unsigned long cs; /* centiseconds */ cs = (t1->tv_sec - t0->tv_sec) * 10 + (t1->tv_usec - t0->tv_usec + 50000) / 100000; if (cs < CM) (void) snprintf(buf, sizeof(buf), ":%02ld.%ld", cs / 10, cs % 10); else (void) snprintf(buf, sizeof(buf), "%02ld:%02ld", cs / CM, (cs % CM) / 10); do_timing(oia_timing = buf); } } /* Erase timing indication */ void status_untiming(void) { do_timing(oia_timing = (char *) 0); } /* Update cursor position */ void status_cursor_pos(int ca) { static char buf[CCNT+1]; (void) snprintf(buf, sizeof(buf), "%03d/%03d", ca/COLS + 1, ca%COLS + 1); do_cursor(oia_cursor = buf); } /* Erase cursor position */ void status_uncursor_pos(void) { do_cursor(oia_cursor = (char *) 0); } /* Internal routines */ /* Set the changed status for a particular status-line column. */ static void set_status_changed(int col) { unsigned i; status_changed = true; for (i = 0; i < SSZ; i++) { if (col >= status_line[i].start && col < status_line[i].start + status_line[i].len) { status_line[i].changed = true; break; } } } /* Update the status line by displaying "symbol" at column "col". */ static void status_add(int col, unsigned char symbol, enum keytype keytype) { XChar2b n2b; /* Store the text. */ n2b.byte1 = (keytype == KT_STD) ? 0 : 1; n2b.byte2 = symbol; if (status_2b[col].byte1 == n2b.byte1 && status_2b[col].byte2 == n2b.byte2) { return; } status_2b[col] = n2b; status_1b[col] = symbol; /* Update change status. */ set_status_changed(col); } /** * Draw the crosshair cursor. * * @param[in] column Column where the cursor should be */ void status_crosshair(int column) { sxcursor_want[column] = true; set_status_changed(column); } /** * Turn off the crosshair cursor, wherever it is. */ void status_crosshair_off(void) { int i; for (i = 0; i < maxCOLS; i++) { if (sxcursor_want[i]) { sxcursor_want[i] = false; set_status_changed(i); } } } /* * Render a region of the status line onto the display, the idea being to * minimize the number of redundant X drawing operations performed. * * What isn't optimized is what happens when "ABC" becomes "XBZ" -- should we * redundantly draw over B or not? Right now we don't. */ static void status_render(int region) { int i; struct status_line *sl = &status_line[region]; int nd = 0; int i0 = -1; XTextItem16 text1; /* The status region may change colors; don't be so clever */ if (region == WAIT_REGION) { XFillRectangle(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start), status_y - *ascent, *char_width * sl->len, *char_height); text1.chars = sl->s2b; text1.nchars = sl->len; text1.delta = 0; text1.font = *fid; XDrawText16(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start), status_y, &text1, 1); } else { for (i = 0; i < sl->len; i++) { if (*funky_font || *xtra_width) { if (!sl->s1b[i]) { continue; } XFillRectangle(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start + i), status_y - *ascent, *char_width, *char_height); text1.chars = sl->s2b + i; text1.nchars = 1; text1.delta = 0; text1.font = *fid; XDrawText16(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + i), status_y, &text1, 1); continue; } if (sl->s2b[i].byte1 == sl->d2b[i].byte1 && sl->s2b[i].byte2 == sl->d2b[i].byte2) { if (nd) { XFillRectangle(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start + i0), status_y - *ascent, *char_width * nd, *char_height); text1.chars = sl->s2b + i0; text1.nchars = nd; text1.delta = 0; text1.font = *fid; XDrawText16(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + i0), status_y, &text1, 1); nd = 0; i0 = -1; } } else { if (!nd++) { i0 = i; } } } if (nd) { XFillRectangle(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start + i0), status_y - *ascent, *char_width * nd, *char_height); text1.chars = sl->s2b + i0; text1.nchars = nd; text1.delta = 0; text1.font = *fid; XDrawText16(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + i0), status_y, &text1, 1); } } /* Leftmost region has unusual attributes */ if (*standard_font && region == CTLR_REGION) { XFillRectangle(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start), status_y - *ascent, *char_width * 3, *char_height); XFillRectangle(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + LBOX), status_y - *ascent, *char_width, *char_height); XFillRectangle(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + RBOX), status_y - *ascent, *char_width, *char_height); text1.chars = sl->s2b + LBOX; text1.nchars = 1; text1.delta = 0; text1.font = *fid; XDrawText16(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start + LBOX), status_y, &text1, 1); XDrawRectangle(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + CNCT), status_y - *ascent + *char_height - 1, *char_width - 1, 0); text1.chars = sl->s2b + CNCT; XDrawText16(display, *screen_window, screen_gc(sl->color), COL_TO_X(sl->start + CNCT), status_y, &text1, 1); text1.chars = sl->s2b + RBOX; XDrawText16(display, *screen_window, screen_invgc(sl->color), COL_TO_X(sl->start + RBOX), status_y, &text1, 1); } } /* Write into the message area of the status line */ static void status_msg_set(unsigned const char *msg, int len) { register int i; for (i = 0; i < status_line[WAIT_REGION].len; i++) { status_add(M0+i, len ? msg[i] : nullblank, KT_STD); if (len) len--; } } /* Controller status */ static void do_ctlr(void) { if (*standard_font) { status_add(LBOX, '4', KT_STD); if (oia_undera) { status_add(CNCT, (IN_E ? 'B' : 'A'), KT_STD); } else { status_add(CNCT, ' ', KT_STD); } if (IN_NVT) { status_add(RBOX, 'N', KT_STD); } else if (oia_boxsolid) { status_add(RBOX, ' ', KT_STD); } else if (IN_SSCP) { status_add(RBOX, 'S', KT_STD); } else { status_add(RBOX, '?', KT_STD); } } else { status_add(LBOX, CG_box4, KT_STD); if (oia_undera) { status_add(CNCT, (IN_E ? CG_underB : CG_underA), KT_STD); } else { status_add(CNCT, CG_space, KT_STD); } if (IN_NVT) { status_add(RBOX, CG_N, KT_STD); } else if (oia_boxsolid) { status_add(RBOX, CG_boxsolid, KT_STD); } else if (IN_SSCP) { status_add(RBOX, CG_boxhuman, KT_STD); } else { status_add(RBOX, CG_boxquestion, KT_STD); } } } /* Message area */ /* Change the state of the message area, or if scrolled, the saved message */ static void do_msg(enum msg t) { if (msg_is_saved) { saved_msg = t; return; } paint_msg(t); } /* Paint the message area. */ static void paint_msg(enum msg t) { oia_msg = t; (*msg_proc[(int)t])(); if (!appres.interactive.mono) status_line[WAIT_REGION].color = appres.m3279 ? msg_color3279[(int)t] : msg_color[(int)t]; } static void do_blank(void) { status_msg_set((unsigned char *) 0, 0); } static void do_disconnected(void) { if (*standard_font) status_msg_set(a_not_connected, strlen((char *)a_not_connected)); else status_msg_set(disc_msg, disc_len); } static void do_resolving(void) { if (*standard_font) status_msg_set(a_resolving, strlen((char *)a_resolving)); else status_msg_set(rslv_msg, rslv_len); } static void do_connecting(void) { if (*standard_font) status_msg_set(a_connecting, strlen((char *)a_connecting)); else status_msg_set(cnct_msg, cnct_len); } static void do_nonspecific(void) { static unsigned char nonspecific[] = { CG_lock }; if (*standard_font) status_msg_set((unsigned const char *)"X", 1); else status_msg_set(nonspecific, sizeof(nonspecific)); } static void do_inhibit(void) { static unsigned char inhibit[] = { CG_lock, CG_space, CG_I, CG_n, CG_h, CG_i, CG_b, CG_i, CG_t }; if (*standard_font) status_msg_set(a_inhibit, strlen((char *)a_inhibit)); else status_msg_set(inhibit, sizeof(inhibit)); } static void do_twait(void) { static unsigned char twait[] = { CG_lock, CG_space, CG_clockleft, CG_clockright }; if (*standard_font) status_msg_set(a_twait, strlen((char *)a_twait)); else status_msg_set(twait, sizeof(twait)); } static void do_syswait(void) { static unsigned char syswait[] = { CG_lock, CG_space, CG_S, CG_Y, CG_S, CG_T, CG_E, CG_M }; if (*standard_font) status_msg_set(a_syswait, strlen((char *)a_syswait)); else status_msg_set(syswait, sizeof(syswait)); } static void do_protected(void) { static unsigned char protected[] = { CG_lock, CG_space, CG_leftarrow, CG_human, CG_rightarrow }; if (*standard_font) status_msg_set(a_protected, strlen((char *)a_protected)); else status_msg_set(protected, sizeof(protected)); } static void do_numeric(void) { static unsigned char numeric[] = { CG_lock, CG_space, CG_human, CG_N, CG_U, CG_M }; if (*standard_font) status_msg_set(a_numeric, strlen((char *)a_numeric)); else status_msg_set(numeric, sizeof(numeric)); } static void do_overflow(void) { static unsigned char overflow[] = { CG_lock, CG_space, CG_human, CG_greater }; if (*standard_font) status_msg_set(a_overflow, strlen((char *)a_overflow)); else status_msg_set(overflow, sizeof(overflow)); } static void do_dbcs(void) { static unsigned char dbcs[] = { CG_lock, CG_space, CG_less, CG_S, CG_greater }; if (*standard_font) status_msg_set(a_dbcs, strlen((char *)a_dbcs)); else status_msg_set(dbcs, sizeof(dbcs)); } static void do_scrolled(void) { static unsigned char scrolled[] = { CG_lock, CG_space, CG_S, CG_c, CG_r, CG_o, CG_l, CG_l, CG_e, CG_d, CG_space, CG_space, CG_space, CG_space, CG_space }; static unsigned char spaces[] = { CG_space, CG_space, CG_space, CG_space }; if (*standard_font) { char *t; t = XtMalloc(strlen((char *)a_scrolled) + 4); (void) sprintf(t, "%s %d", (char *)a_scrolled, n_scrolled); status_msg_set((unsigned char *)t, strlen(t)); XtFree(t); } else { char nnn[5]; int i; (void) sprintf(nnn, "%d", n_scrolled); (void) memcpy((char *)&scrolled[11], (char *)spaces, sizeof(spaces)); for (i = 0; nnn[i]; i++) scrolled[11 + i] = asc2cg0[(int)nnn[i]]; status_msg_set(scrolled, sizeof(scrolled)); } } static void do_minus(void) { static unsigned char minus[] = { CG_lock, CG_space, CG_minus, CG_f }; if (*standard_font) status_msg_set(a_minus, strlen((char *)a_minus)); else status_msg_set(minus, sizeof(minus)); } /* Insert, reverse, kmap, script, shift, compose */ static void do_insert(bool on) { status_add(INSERT, on ? (*standard_font ? 'I' : CG_insert) : nullblank, KT_STD); } static void do_reverse(bool on) { status_add(REVERSE, on ? (*standard_font ? 'R' : CG_R) : nullblank, KT_STD); } static void do_kmap(bool on) { status_add(KMAP, on ? (*standard_font ? 'K' : CG_K) : nullblank, KT_STD); } static void do_script(bool on) { status_add(SCRIPT, on ? (*standard_font ? 'S' : CG_S) : nullblank, KT_STD); } static void do_printer(bool on) { status_add(PSESS, on ? (*standard_font ? 'P' : CG_P) : nullblank, KT_STD); } static void do_shift(int state) { status_add(SHIFT-2, (state & MetaKeyDown) ? (*standard_font ? 'M' : CG_M) : nullblank, KT_STD); status_add(SHIFT-1, (state & AltKeyDown) ? (*standard_font ? 'A' : CG_A) : nullblank, KT_STD); status_add(SHIFT, (state & ShiftKeyDown) ? (*standard_font ? '^' : CG_upshift) : nullblank, KT_STD); } static void do_typeahead(int state) { status_add(TYPEAHD, state ? (*standard_font ? 'T' : CG_T) : nullblank, KT_STD); } static void do_screentrace(int n) { unsigned char c; if (n < 0) { c = *standard_font? ' ': CG_space; } else if (n < 9) { c = *standard_font? ('1' + n): (CG_1 + n); } else { c = *standard_font? '+': CG_plus; } status_add(SCRNTRC, c, KT_STD); } static void do_compose(bool on, unsigned char c, enum keytype keytype) { if (on) { status_add(COMPOSE, (unsigned char)(*standard_font ? 'C' : CG_C), KT_STD); status_add(COMPOSE+1, c ? (*standard_font ? c : asc2cg0[c]) : nullblank, keytype); } else { status_add(COMPOSE, nullblank, KT_STD); status_add(COMPOSE+1, nullblank, KT_STD); } } static void do_lu(const char *lu) { int i; for (i = 0; i < LUCNT; i++) { status_add(LU+i, lu[i]? (*standard_font? lu[i]: asc2cg0[(int)lu[i]]): nullblank, KT_STD); } } /* Timing */ static void do_timing(char *buf) { register int i; if (buf) { if (*standard_font) { status_add(T0, nullblank, KT_STD); status_add(T0+1, nullblank, KT_STD); } else { status_add(T0, CG_clockleft, KT_STD); status_add(T0+1, CG_clockright, KT_STD); } for (i = 0; i < (int) strlen(buf); i++) status_add(T0+2+i, *standard_font ? buf[i] : asc2cg0[(unsigned char) buf[i]], KT_STD); } else for (i = 0; i < TCNT; i++) status_add(T0+i, nullblank, KT_STD); } /* Cursor position */ static void do_cursor(char *buf) { register int i; if (buf) for (i = 0; i < (int) strlen(buf); i++) status_add(C0+i, *standard_font ? buf[i] : asc2cg0[(unsigned char) buf[i]], KT_STD); else for (i = 0; i < CCNT; i++) status_add(C0+i, nullblank, KT_STD); } /* Prepare status messages */ static unsigned char * make_amsg(const char *key) { return (unsigned char *)xs_buffer("X %s", get_message(key)); } static unsigned char * make_emsg(unsigned char prefix[], const char *key, int *len) { const char *text = get_message(key); unsigned char *buf = (unsigned char *)XtMalloc(*len + strlen(text)); (void) memmove(buf, prefix, *len); while (*text) buf[(*len)++] = asc2cg0[(int)*text++]; return buf; } suite3270-3.6/x3270/stmenu.c0000664000076500007650000003350413221577164013444 0ustar pdmpdm/* * Copyright (c) 2013-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor his contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * stmenu.c * Pop-up window to initiate screen tracing. */ #include "globals.h" #include "xglobals.h" #include #include #include #include #include #include #include #include #include #include #include "appres.h" #include "objects.h" #include "resources.h" #include "dialog.h" #include "popups.h" #include "print_screen.h" #include "stmenu.h" #include "toggles.h" #include "trace.h" #include "xmenubar.h" #include "xpopups.h" #define CLOSE_VGAP 0 #define FAR_VGAP 10 #define FAR_HGAP 65 #define MARGIN 3 #define FILE_WIDTH 300 #define BUTTON_GAP 5 static Widget stmenu_shell = NULL; static Widget stmenu_form; static bool continuously_flag = true; /* save continuously */ static Widget continuously_toggle = NULL; static Widget once_toggle = NULL; static bool file_flag = true; /* save in file */ static Widget file_toggle = NULL; static Widget printer_toggle = NULL; static ptype_t stm_ptype = P_TEXT; /* save as text/html/rtf */ static Widget text_toggle = NULL; static Widget html_toggle = NULL; static Widget rtf_toggle = NULL; static Widget filename_label = NULL; static Widget filename = NULL; static Widget print_command_label = NULL; static Widget print_command = NULL; static ptype_t s_text = P_TEXT; static ptype_t s_html = P_HTML; static ptype_t s_rtf = P_RTF; /* Called when OK is pressed in the screentrace popup. */ static void screentrace_ok(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { String name; if (file_flag) XtVaGetValues(filename, XtNstring, &name, NULL); else XtVaGetValues(print_command, XtNstring, &name, NULL); trace_set_screentrace_file(file_flag? TSS_FILE: TSS_PRINTER, file_flag? stm_ptype: P_TEXT, name); do_toggle(SCREEN_TRACE); if (!continuously_flag && toggled(SCREEN_TRACE)) do_toggle(SCREEN_TRACE); XtPopdown(stmenu_shell); } /* Called when Cancel is pressed in the screentrace popup. */ static void screentrace_cancel(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { XtPopdown(stmenu_shell); } /* Screentrace pop-up popping up. */ static void stmenu_popup_callback(Widget w _is_unused, XtPointer client_data _is_unused, XtPointer call_data _is_unused) { /* Set the focus to the file or printer text widget. */ XawTextDisplayCaret(filename, file_flag); XawTextDisplayCaret(print_command, !file_flag); XtSetKeyboardFocus(stmenu_form, file_flag? filename: print_command); } /* Continuously/Once toggle callback. */ static void toggle_continuously(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag. */ continuously_flag = *(bool *)client_data; /* Change the widget states. */ dialog_mark_toggle(continuously_toggle, continuously_flag? diamond: no_diamond); dialog_mark_toggle(once_toggle, continuously_flag? no_diamond: diamond); } /* File/Printer toggle callback. */ static void toggle_file(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { /* Toggle the flag. */ file_flag = *(bool *)client_data; /* Change the widget states. */ dialog_mark_toggle(file_toggle, file_flag? diamond: no_diamond); dialog_mark_toggle(printer_toggle, file_flag? no_diamond: diamond); XtVaSetValues(filename_label, XtNsensitive, file_flag, NULL); XtVaSetValues(filename, XtNsensitive, file_flag, NULL); XtVaSetValues(text_toggle, XtNsensitive, file_flag, NULL); XtVaSetValues(html_toggle, XtNsensitive, file_flag, NULL); XtVaSetValues(rtf_toggle, XtNsensitive, file_flag, NULL); XtVaSetValues(print_command_label, XtNsensitive, !file_flag, NULL); XtVaSetValues(print_command, XtNsensitive, !file_flag, NULL); XawTextDisplayCaret(filename, file_flag); XawTextDisplayCaret(print_command, !file_flag); XtSetKeyboardFocus(stmenu_form, file_flag? filename: print_command); } /* Text/HTML toggle callback. */ static void toggle_ptype(Widget w _is_unused, XtPointer client_data, XtPointer call_data _is_unused) { char *d; XawTextBlock b; String name; XtVaGetValues(filename, XtNstring, &name, NULL); /* Toggle the flag. */ stm_ptype = *(bool *)client_data; /* Change the widget states. */ dialog_mark_toggle(text_toggle, (stm_ptype == P_TEXT)? diamond: no_diamond); dialog_mark_toggle(html_toggle, (stm_ptype == P_HTML)? diamond: no_diamond); dialog_mark_toggle(rtf_toggle, (stm_ptype == P_RTF)? diamond: no_diamond); d = screentrace_default_file(stm_ptype); b.firstPos = 0; b.length = strlen(d); b.ptr = d; b.format = XawFmt8Bit; XawTextReplace(filename, 0, strlen(name), &b); XawTextSetInsertionPoint(filename, strlen(d)); XtFree(d); } /* * Initialize the screentrace (Save Screens) pop-up. * * The pop-up consists of: * A pair of radio buttons for Continuously/Once * A pair of radio buttons for File/Printer * A pair of radio buttons for Text/HTML * A label for "File Name" or "Print Command" * A text box to fill in the above * An OK button * An Abort button * * The radio buttons work like radio buttons. * When File/Printer is toggled, the label for the text box flips, and the * text box contents switch to the last value used for that type (or an * appropriate default). */ void init_screentrace_popup(void) { Widget w = NULL; Widget confirm_button, cancel_button; char *d; XawTextBlock b; /* Create the popup. */ stmenu_shell = XtVaCreatePopupShell( "screenTracePopup", transientShellWidgetClass, toplevel, NULL); XtAddCallback(stmenu_shell, XtNpopupCallback, place_popup, (XtPointer) CenterP); XtAddCallback(stmenu_shell, XtNpopupCallback, stmenu_popup_callback, NULL); /* Create a form in the popup. */ stmenu_form = XtVaCreateManagedWidget( ObjDialog, formWidgetClass, stmenu_shell, NULL); /* Create the Continuously/Once radio buttons. */ continuously_toggle = XtVaCreateManagedWidget( "continuously", commandWidgetClass, stmenu_form, XtNvertDistance, MARGIN, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNjustify, XtJustifyLeft, NULL); dialog_apply_bitmap(continuously_toggle, continuously_flag? diamond: no_diamond); XtAddCallback(continuously_toggle, XtNcallback, toggle_continuously, (XtPointer)&s_true); once_toggle = XtVaCreateManagedWidget( "once", commandWidgetClass, stmenu_form, XtNfromVert, continuously_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNjustify, XtJustifyLeft, NULL); dialog_apply_bitmap(once_toggle, continuously_flag? no_diamond: diamond); XtAddCallback(once_toggle, XtNcallback, toggle_continuously, (XtPointer)&s_false); dialog_match_dimension(continuously_toggle, once_toggle, XtNwidth); /* Create the File radio button. */ file_toggle = XtVaCreateManagedWidget( "file", commandWidgetClass, stmenu_form, XtNfromVert, once_toggle, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, XtNborderWidth, 0, XtNjustify, XtJustifyLeft, NULL); dialog_apply_bitmap(file_toggle, file_flag? diamond: no_diamond); XtAddCallback(file_toggle, XtNcallback, toggle_file, (XtPointer)&s_true); /* Create the file name label and text widgets. */ filename_label = XtVaCreateManagedWidget( "fileName", labelWidgetClass, stmenu_form, XtNfromVert, file_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, FAR_HGAP, XtNborderWidth, 0, XtNjustify, XtJustifyLeft, XtNsensitive, file_flag, NULL); filename = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, stmenu_form, XtNeditType, XawtextEdit, XtNwidth, FILE_WIDTH, XtNfromVert, file_toggle, XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, filename_label, XtNhorizDistance, 0, XtNsensitive, file_flag, NULL); dialog_match_dimension(filename_label, filename, XtNheight); w = XawTextGetSource(filename); if (w == NULL) XtWarning("Cannot find text source in dialog"); else XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_unixfile); d = screentrace_default_file(stm_ptype); b.firstPos = 0; b.length = strlen(d); b.ptr = d; b.format = XawFmt8Bit; XawTextReplace(filename, 0, 0, &b); XawTextSetInsertionPoint(filename, strlen(d)); XtFree(d); /* Create the Text/HTML/RTF radio buttons. */ text_toggle = XtVaCreateManagedWidget( "text", commandWidgetClass, stmenu_form, XtNfromVert, filename_label, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, FAR_HGAP, XtNborderWidth, 0, XtNsensitive, file_flag, NULL); dialog_apply_bitmap(text_toggle, (stm_ptype == P_TEXT)? diamond: no_diamond); XtAddCallback(text_toggle, XtNcallback, toggle_ptype, (XtPointer)&s_text); html_toggle = XtVaCreateManagedWidget( "html", commandWidgetClass, stmenu_form, XtNfromVert, text_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, FAR_HGAP, XtNborderWidth, 0, XtNsensitive, file_flag, NULL); dialog_apply_bitmap(html_toggle, (stm_ptype == P_HTML)? diamond: no_diamond); XtAddCallback(html_toggle, XtNcallback, toggle_ptype, (XtPointer)&s_html); rtf_toggle = XtVaCreateManagedWidget( "rtf", commandWidgetClass, stmenu_form, XtNfromVert, html_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, FAR_HGAP, XtNborderWidth, 0, XtNsensitive, file_flag, NULL); dialog_apply_bitmap(rtf_toggle, (stm_ptype == P_RTF)? diamond: no_diamond); XtAddCallback(rtf_toggle, XtNcallback, toggle_ptype, (XtPointer)&s_rtf); /* Create the printer toggle. */ printer_toggle = XtVaCreateManagedWidget( "printer", commandWidgetClass, stmenu_form, XtNhorizDistance, MARGIN, XtNfromVert, rtf_toggle, XtNvertDistance, FAR_VGAP, XtNborderWidth, 0, XtNjustify, XtJustifyLeft, NULL); dialog_apply_bitmap(printer_toggle, file_flag? no_diamond: diamond); XtAddCallback(printer_toggle, XtNcallback, toggle_file, (XtPointer)&s_false); /* Create the print command label and text widgets. */ print_command_label = XtVaCreateManagedWidget( "printCommand", labelWidgetClass, stmenu_form, XtNfromVert, printer_toggle, XtNvertDistance, CLOSE_VGAP, XtNhorizDistance, FAR_HGAP, XtNborderWidth, 0, XtNjustify, XtJustifyLeft, XtNsensitive, !file_flag, NULL); print_command = XtVaCreateManagedWidget( "value", asciiTextWidgetClass, stmenu_form, XtNeditType, XawtextEdit, XtNwidth, FILE_WIDTH, XtNfromVert, printer_toggle, XtNvertDistance, CLOSE_VGAP, XtNfromHoriz, print_command_label, XtNhorizDistance, 0, XtNsensitive, !file_flag, NULL); dialog_match_dimension(print_command_label, print_command, XtNheight); dialog_match_dimension(filename_label, print_command_label, XtNwidth); w = XawTextGetSource(print_command); if (w == NULL) XtWarning("Cannot find text source in dialog"); else XtAddCallback(w, XtNcallback, dialog_text_callback, (XtPointer)&t_command); d = screentrace_default_printer(); b.firstPos = 0; b.length = strlen(d); b.ptr = d; b.format = XawFmt8Bit; XawTextReplace(print_command, 0, 0, &b); XawTextSetInsertionPoint(print_command, strlen(d)); XtFree(d); /* Create the buttons. */ confirm_button = XtVaCreateManagedWidget( ObjConfirmButton, commandWidgetClass, stmenu_form, XtNfromVert, print_command_label, XtNvertDistance, FAR_VGAP, XtNhorizDistance, MARGIN, NULL); XtAddCallback(confirm_button, XtNcallback, screentrace_ok, NULL); cancel_button = XtVaCreateManagedWidget( ObjCancelButton, commandWidgetClass, stmenu_form, XtNfromVert, print_command_label, XtNvertDistance, FAR_VGAP, XtNfromHoriz, confirm_button, XtNhorizDistance, BUTTON_GAP, NULL); XtAddCallback(cancel_button, XtNcallback, screentrace_cancel, NULL); } /* * Pop up the Screen Trace menu. * Called from the "Save Screen Contents" option on the File menu. */ void stmenu_popup(stmp_t stmp) { /* If the toggle is set, clear it. */ if (toggled(SCREEN_TRACE)) { do_toggle(SCREEN_TRACE); return; } /* Initialize it. */ if (stmenu_shell == NULL) init_screentrace_popup(); switch (stmp) { case STMP_AS_IS: break; case STMP_TEXT: /* Force a text file. */ if (!file_flag) toggle_file(NULL, &s_true, NULL); if (stm_ptype != P_TEXT) toggle_ptype(NULL, &s_text, NULL); if (continuously_flag) toggle_continuously(NULL, &s_false, NULL); break; case STMP_PRINTER: /* Force a printer. */ if (file_flag) toggle_file(NULL, &s_false, NULL); if (continuously_flag) toggle_continuously(NULL, &s_false, NULL); break; } /* Pop it up. */ popup_popup(stmenu_shell, XtGrabExclusive); } suite3270-3.6/x3270/stmenu.h0000664000076500007650000000342113221577164013444 0ustar pdmpdm/* * Copyright (c) 2013-2015, Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor his contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * stmenu.h * Pop-up window to initiate screen tracing. */ typedef enum { STMP_AS_IS, /* pop up using current or default state */ STMP_TEXT, /* force to a text file */ STMP_PRINTER /* force to use the printer */ } stmp_t; void stmenu_popup(stmp_t stmp); suite3270-3.6/x3270/trace_gui.c0000664000076500007650000000720713221577164014074 0ustar pdmpdm/* * Copyright (c) 1993-2015 Paul Mattes. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL PAUL MATTES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * trace_gui.c * GUI for 3270 data stream tracing. * */ #include "globals.h" #include #include #include #include "appres.h" #include "resources.h" #include "objects.h" #include "popups.h" #include "toggles.h" #include "trace.h" #include "trace_gui.h" #include "xmenubar.h" #include "xpopups.h" /* Statics */ static Widget trace_shell = NULL; /* Pop up an info about a bogus trace file maximum size. */ void trace_gui_bad_size(const char *default_value) { popup_an_info("Invalid %s '%s', assuming %s", ResTraceFileSize, appres.trace_file_size, default_value); } /* Callback for "Trace" button on trace popup. */ static void tracefile_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { char *tfn = NULL; if (w) { tfn = XawDialogGetValueString((Widget)client_data); } else { tfn = (char *)client_data; } tracefile_ok(tfn); if (w) { XtPopdown(trace_shell); } } /* Callback for "No File" button on trace popup. */ static void no_tracefile_callback(Widget w, XtPointer client_data, XtPointer call_data _is_unused) { tracefile_ok(""); XtPopdown(trace_shell); } /* * Tracing has been started. Pop up the dialog, if appropriate. * Returns true for dialog up, false to go ahead and start tracing. */ bool trace_gui_on(int reason, enum toggle_type tt, const char *tracefile) { if (tt == TT_INITIAL || tt == TT_ACTION) { /* Start tracing now. */ return false; } if (trace_shell == NULL) { trace_shell = create_form_popup("trace", tracefile_callback, appres.trace_monitor? no_tracefile_callback: NULL, FORM_NO_WHITE); XtVaSetValues(XtNameToWidget(trace_shell, ObjDialog), XtNvalue, tracefile, NULL); } popup_popup(trace_shell, XtGrabExclusive); /* Pop-up is up and will start tracing when it completes. */ return true; } /* Change the menu option for tracing when the toggle is changed. */ void trace_gui_toggle(void) { if (toggle_widget[SCREEN_TRACE].w[0] != NULL) { XtVaSetValues(toggle_widget[SCREEN_TRACE].w[0], XtNleftBitmap, toggled(SCREEN_TRACE)? dot: None, NULL); } } suite3270-3.6/x3270/unlocked.bm0000664000076500007650000000042013221577164014100 0ustar pdmpdm#define unlocked_width 16 #define unlocked_height 14 static unsigned char unlocked_bits[] = { 0x00, 0x3e, 0x00, 0x41, 0x80, 0x9c, 0x80, 0xa2, 0x80, 0xa2, 0x80, 0xe2, 0xff, 0x07, 0x55, 0x05, 0xab, 0x06, 0x55, 0x05, 0xab, 0x06, 0xff, 0x07, 0x01, 0x04, 0xff, 0x07}; suite3270-3.6/x3270/version.txt0000775000076500007650000000006013221577443014205 0ustar pdmpdmversion="3.6ga4" adversion="3.3.4" cyear="2017" suite3270-3.6/x3270/wait.bm0000664000076500007650000000434113221577164013246 0ustar pdmpdm#define wait_width 50 #define wait_height 50 static unsigned char wait_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xaf, 0xfe, 0xff, 0xe7, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xaa, 0x02, 0xa0, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0xf5, 0x4f, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xf2, 0xaf, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0xf1, 0x4f, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xf8, 0x9f, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x0c, 0x31, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0x06, 0x61, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x02, 0x41, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0x82, 0xc3, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x82, 0xc3, 0x54, 0x0f, 0x00, 0xf8, 0xfa, 0x42, 0x40, 0xbf, 0x0f, 0x00, 0x78, 0xed, 0x26, 0x60, 0x73, 0x0f, 0x00, 0xf8, 0x5a, 0x0c, 0x30, 0xad, 0x0f, 0x00, 0x78, 0xb5, 0xf9, 0x9f, 0x6d, 0x0f, 0x00, 0xf8, 0x5a, 0xf3, 0xcf, 0xed, 0x0f, 0x00, 0x78, 0xed, 0xf0, 0xcf, 0x73, 0x0f, 0x00, 0xf8, 0xfa, 0xf7, 0xef, 0xff, 0x0f, 0x00, 0xf8, 0x55, 0x05, 0x40, 0xd5, 0x0f, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x43, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x10, 0x44, 0x44, 0x44, 0x84, 0x42, 0x00, 0x08, 0x11, 0x11, 0x11, 0x41, 0x42, 0x00, 0x84, 0x88, 0x88, 0x88, 0x48, 0x42, 0x00, 0x24, 0x22, 0x22, 0x22, 0x22, 0xfe, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; suite3270-3.6/x3270/x3270.bm0000664000076500007650000000434413221577164013070 0ustar pdmpdm#define x3270_width 50 #define x3270_height 50 static unsigned char x3270_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xaf, 0xfe, 0xff, 0xe7, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, 0x0f, 0x00, 0x78, 0x55, 0x55, 0x55, 0x55, 0x0f, 0x00, 0xf8, 0xfa, 0xff, 0xff, 0xbf, 0x0f, 0x00, 0x78, 0xed, 0x62, 0x0c, 0x73, 0x0f, 0x00, 0xf8, 0x5a, 0xdf, 0x7b, 0xad, 0x0f, 0x00, 0x78, 0xb5, 0xe7, 0xbc, 0x6d, 0x0f, 0x00, 0xf8, 0x5a, 0x5f, 0xdf, 0xed, 0x0f, 0x00, 0x78, 0xed, 0x62, 0xd8, 0x73, 0x0f, 0x00, 0xf8, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xf8, 0x55, 0x55, 0x55, 0xd5, 0x0f, 0x00, 0xf8, 0xab, 0xaa, 0xaa, 0xea, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0x06, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x43, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x10, 0x44, 0x44, 0x44, 0x84, 0x42, 0x00, 0x08, 0x11, 0x11, 0x11, 0x41, 0x42, 0x00, 0x84, 0x88, 0x88, 0x88, 0x48, 0x42, 0x00, 0x24, 0x22, 0x22, 0x22, 0x22, 0xfe, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; suite3270-3.6/x3270/x3270.c0000664000076500007650000010246613221577164012720 0ustar pdmpdm/* * Copyright (c) 1993-2017 Paul Mattes. * Copyright (c) 1990, Jeff Sparkes. * Copyright (c) 1989, Georgia Tech Research Corporation (GTRC), Atlanta, GA * 30332. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the names of Paul Mattes, Jeff Sparkes, GTRC nor the names of * their contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY PAUL MATTES, JEFF SPARKES AND GTRC "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PAUL MATTES, JEFF SPARKES OR GTRC BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * x3270.c * A 3270 Terminal Emulator for X11 * Main proceudre. */ #include "globals.h" #include #include #include #include #include #include #include #include "appres.h" #include "3270ds.h" #include "resources.h" #include "actions.h" #include "bind-opt.h" #include "charset.h" #include "ctlrc.h" #include "ft.h" #include "host.h" #include "httpd-core.h" #include "httpd-nodes.h" #include "httpd-io.h" #include "idle.h" #include "keymap.h" #include "kybd.h" #include "macros.h" #include "nvt.h" #include "popups.h" #include "pr3287_session.h" #include "print_screen.h" #include "print_window.h" #include "product.h" #include "resourcesc.h" #include "screen.h" #include "selectc.h" #include "sio.h" #include "status.h" #include "telnet.h" #include "toggles.h" #include "trace.h" #include "utils.h" #include "xactions.h" #include "xappres.h" #include "xio.h" #include "xkybd.h" #include "xmenubar.h" #include "xpopups.h" #include "xsave.h" #include "xscreen.h" #include "xscroll.h" #include "xselectc.h" #include "xstatus.h" /* Globals */ const char *programname; Display *display; int default_screen; Window root_window; int screen_depth; Widget toplevel; XtAppContext appcontext; Atom a_delete_me, a_save_yourself, a_3270, a_registry, a_encoding, a_state, a_net_wm_state, a_net_wm_state_maximized_horz, a_net_wm_state_maximized_vert, a_atom; char full_model_name[13] = "IBM-"; char *model_name = &full_model_name[4]; Pixmap gray; XrmDatabase rdb; AppRes appres; xappres_t xappres; int children = 0; bool exiting = false; char *user_title = NULL; /* Statics */ static void peek_at_xevent(XEvent *); static XtErrorMsgHandler old_emh; static void trap_colormaps(String, String, String, String, String *, Cardinal *); static bool colormap_failure = false; #if defined(LOCAL_PROCESS) /*[*/ static void parse_local_process(int *argcp, char **argv, char **cmds); #endif /*]*/ static int parse_model_number(char *m); static void parse_set_clear(int *, char **); static void label_init(void); static void sigchld_handler(int); static char *user_icon_name = NULL; static void copy_xres_to_res_bool(void); XrmOptionDescRec base_options[]= { { OptActiveIcon, DotActiveIcon, XrmoptionNoArg, ResTrue }, { OptAplMode, DotAplMode, XrmoptionNoArg, ResTrue }, { OptAcceptHostname,DotAcceptHostname,XrmoptionSepArg, NULL }, { OptCaDir, DotCaDir, XrmoptionSepArg, NULL }, { OptCaFile, DotCaFile, XrmoptionSepArg, NULL }, { OptCertFile, DotCertFile, XrmoptionSepArg, NULL }, { OptCertFileType, DotCertFileType,XrmoptionSepArg, NULL }, { OptChainFile, DotChainFile, XrmoptionSepArg, NULL }, { OptCharClass, DotCharClass, XrmoptionSepArg, NULL }, { OptCharset, DotCharset, XrmoptionSepArg, NULL }, { OptClear, ".xxx", XrmoptionSkipArg, NULL }, { OptClientCert, DotClientCert, XrmoptionSepArg, NULL }, { OptColorScheme, DotColorScheme, XrmoptionSepArg, NULL }, { OptConnectTimeout,DotConnectTimeout,XrmoptionSepArg, NULL }, { OptDevName, DotDevName, XrmoptionSepArg, NULL }, { OptTrace, DotTrace, XrmoptionNoArg, ResTrue }, { OptEmulatorFont, DotEmulatorFont,XrmoptionSepArg, NULL }, { OptExtended, DotExtended, XrmoptionNoArg, ResTrue }, { OptHostsFile, DotHostsFile, XrmoptionSepArg, NULL }, { OptHttpd, DotHttpd, XrmoptionSepArg, NULL }, { OptIconName, ".iconName", XrmoptionSepArg, NULL }, { OptIconX, ".iconX", XrmoptionSepArg, NULL }, { OptIconY, ".iconY", XrmoptionSepArg, NULL }, { OptKeyFile, DotKeyFile, XrmoptionSepArg, NULL }, { OptKeyFileType, DotKeyFileType, XrmoptionSepArg, NULL }, { OptKeymap, DotKeymap, XrmoptionSepArg, NULL }, { OptKeypadOn, DotKeypadOn, XrmoptionNoArg, ResTrue }, { OptKeyPasswd, DotKeyPasswd, XrmoptionSepArg, NULL }, { OptLoginMacro, DotLoginMacro, XrmoptionSepArg, NULL }, { OptM3279, DotM3279, XrmoptionNoArg, ResTrue }, { OptModel, DotModel, XrmoptionSepArg, NULL }, { OptMono, DotMono, XrmoptionNoArg, ResTrue }, { OptNoScrollBar, DotScrollBar, XrmoptionNoArg, ResFalse }, { OptNoVerifyHostCert,DotVerifyHostCert,XrmoptionNoArg, ResFalse }, { OptNvtMode, DotNvtMode, XrmoptionNoArg, ResTrue }, { OptOnce, DotOnce, XrmoptionNoArg, ResTrue }, { OptOversize, DotOversize, XrmoptionSepArg, NULL }, { OptPort, DotPort, XrmoptionSepArg, NULL }, { OptPrinterLu, DotPrinterLu, XrmoptionSepArg, NULL }, { OptProxy, DotProxy, XrmoptionSepArg, NULL }, { OptReconnect, DotReconnect, XrmoptionNoArg, ResTrue }, { OptSaveLines, DotSaveLines, XrmoptionSepArg, NULL }, { OptScripted, DotScripted, XrmoptionNoArg, ResTrue }, { OptScrollBar, DotScrollBar, XrmoptionNoArg, ResTrue }, { OptSecure, DotSecure, XrmoptionNoArg, ResTrue }, { OptSet, ".xxx", XrmoptionSkipArg, NULL }, { OptSocket, DotSocket, XrmoptionNoArg, ResTrue }, { OptScriptPort, DotScriptPort, XrmoptionSepArg, NULL }, { OptScriptPortOnce,DotScriptPortOnce,XrmoptionNoArg, ResTrue }, { OptTermName, DotTermName, XrmoptionSepArg, NULL }, { OptTraceFile, DotTraceFile, XrmoptionSepArg, NULL }, { OptTraceFileSize, DotTraceFileSize,XrmoptionSepArg, NULL }, { OptInputMethod, DotInputMethod, XrmoptionSepArg, NULL }, { OptPreeditType, DotPreeditType, XrmoptionSepArg, NULL }, { OptUser, DotUser, XrmoptionSepArg, NULL }, { OptV, DotV, XrmoptionNoArg, ResTrue }, { OptVerifyHostCert,DotVerifyHostCert,XrmoptionNoArg, ResTrue }, { OptVersion, DotV, XrmoptionNoArg, ResTrue }, { "-xrm", NULL, XrmoptionResArg, NULL } }; int num_base_options = XtNumber(base_options); XrmOptionDescRec *options; int num_options; static struct option_help { char *opt; char *args; char *help; unsigned ssl_flag; } option_help[] = { { OptAcceptHostname, "[DNS:]", "Host name to accept from server certificate", SSL_OPT_ACCEPT_HOSTNAME }, { OptActiveIcon, NULL, "Make icon a miniature of the display" }, { OptAplMode, NULL, "Turn on APL mode" }, { OptCaDir, "", "SSL/TLS CA certificate database directory", SSL_OPT_CA_DIR }, { OptCaFile, "", "SSL/TLS CA certificate file", SSL_OPT_CA_FILE }, { OptCertFile, "", "SSL/TLS certificate file", SSL_OPT_CERT_FILE }, { OptCertFileType, "pem|asn1", "SSL/TLS certificate file type", SSL_OPT_CERT_FILE_TYPE }, { OptChainFile, "", "SSL/TLS certificate chain file", SSL_OPT_CHAIN_FILE }, { OptCharClass, "", "Define characters for word boundaries" }, { OptCharset, "", "Use host EBCDIC character set (code page) " }, { OptClear, "", "Turn on " }, { OptClientCert, "", "SSL/TLS client certificate name", SSL_OPT_CLIENT_CERT }, { OptColorScheme, "", "Use color scheme " }, { OptConnectTimeout, "", "Timeout for host connect requests" }, { OptDevName, "", "Device name (workstation ID)" }, { OptEmulatorFont, "", "Font for emulator window" }, { OptExtended, NULL, "Extended 3270 data stream (deprecated)" }, { OptHttpd, "[:]", "TCP port to listen on for http requests" }, { OptHostsFile, "", "Pathname of ibm_hosts file" }, { OptIconName, "", "Title for icon" }, { OptIconX, "", "X position for icon" }, { OptIconY, "", "Y position for icon" }, { OptKeyFile, "", "Get SSL/TLS private key from ", SSL_OPT_KEY_FILE }, { OptKeyFileType, "pem|asn1", "SSL/TLS private key file type", SSL_OPT_KEY_FILE_TYPE }, { OptKeymap, "[,...]", "Keyboard map name(s)" }, { OptKeypadOn, NULL, "Turn on pop-up keypad at start-up" }, { OptKeyPasswd, "file:|string:", "SSL/TLS private key password", SSL_OPT_KEY_PASSWD }, { OptLoginMacro, "Action([arg[,...]]) [...]", "Macro to run at login" }, { OptM3279, NULL, "3279 emulation (deprecated)" }, { OptModel, "[327{8,9}-]", "Emulate a 3278 or 3279 model " }, { OptMono, NULL, "Do not use color" }, { OptNoScrollBar, NULL, "Disable scroll bar" }, { OptNoVerifyHostCert, NULL, "Do not verify SSL/TLS host certificate", SSL_OPT_VERIFY_HOST_CERT }, { OptNvtMode, NULL, "Begin in NVT mode" }, { OptOnce, NULL, "Exit as soon as the host disconnects" }, { OptOversize, "x", "Larger screen dimensions" }, { OptPort, "", "Default TELNET port" }, { OptPrinterLu, "", "Automatically start a pr3287 printer session to " }, { OptProxy, ":[:]", "Secify proxy type and server" }, { OptReconnect, NULL, "Reconnect to host as soon as it disconnects" }, { OptSaveLines, "", "Number of lines to save for scroll bar" }, { OptScripted, NULL, "Accept commands on standard input" }, { OptScrollBar, NULL, "Turn on scroll bar" }, { OptSet, "", "Turn on " }, { OptSocket, NULL, "Create socket for script control" }, { OptScriptPort, "", "Listen on TCP port for script connections" }, { OptScriptPortOnce, NULL, "Accept one script connection, then exit" }, { OptSecure, NULL, "Set secure mode" }, { OptTermName, "", "Send as TELNET terminal name" }, { OptTrace, NULL, "Enable tracing" }, { OptTraceFile, "", "Write traces to " }, { OptTraceFileSize, "[KM]", "Limit trace file to bytes" }, { OptInputMethod, "", "Multi-byte input method" }, { OptPreeditType, "